Wiktionary
miwiktionary
https://mi.wiktionary.org/wiki/Hau_K%C4%81inga
MediaWiki 1.47.0-wmf.10
case-sensitive
Media
Special
Talk
User
User talk
Wiktionary
Wiktionary talk
File
File talk
MediaWiki
MediaWiki talk
Template
Template talk
Help
Help talk
Category
Category talk
TimedText
TimedText talk
Module
Module talk
Event
Event talk
Category:Reo Afrikaans
14
3013
17457
17310
2026-07-13T08:55:47Z
Hiyuune
6766
done
17457
wikitext
text/x-wiki
{{auto cat|Āwherika ki te Tonga|Namīpia}}
sy88j7zh24ronin5yv9jd95u121dd1n
Module:string utilities
828
5878
17410
17241
2026-07-13T08:26:38Z
Hiyuune
6766
17410
Scribunto
text/plain
local export = {}
local function_module = "Module:fun"
local load_module = "Module:load"
local memoize_module = "Module:memoize"
local string_char_module = "Module:string/char"
local string_charset_escape_module = "Module:string/charsetEscape"
local mw = mw
local string = string
local table = table
local ustring = mw.ustring
local byte = string.byte
local char = string.char
local concat = table.concat
local find = string.find
local format = string.format
local gmatch = string.gmatch
local gsub = string.gsub
local insert = table.insert
local len = string.len
local lower = string.lower
local match = string.match
local next = next
local require = require
local reverse = string.reverse
local select = select
local sort = table.sort
local sub = string.sub
local tonumber = tonumber
local tostring = tostring
local type = type
local ucodepoint = ustring.codepoint
local ufind = ustring.find
local ugcodepoint = ustring.gcodepoint
local ugmatch = ustring.gmatch
local ugsub = ustring.gsub
local ulower = ustring.lower
local umatch = ustring.match
local unpack = unpack or table.unpack -- Lua 5.2 compatibility
local upper = string.upper
local usub = ustring.sub
local uupper = ustring.upper
local memoize = require(memoize_module)
-- Defined below.
local codepoint
local explode_utf8
local format_fun
local get_charset
local gsplit
local pattern_escape
local pattern_simplifier
local replacement_escape
local title_case
local trim
local ucfirst
local ulen
--[==[
Loaders for functions in other modules, which overwrite themselves with the target function when called. This ensures
modules are only loaded when needed, retains the speed/convenience of locally-declared pre-loaded functions, and has no
overhead after the first call, since the target functions are called directly in any subsequent calls.
]==]
local function charset_escape(...)
charset_escape = require(string_charset_escape_module)
return charset_escape(...)
end
local function is_callable(...)
is_callable = require(function_module).is_callable
return is_callable(...)
end
local function load_data(...)
load_data = require(load_module).load_data
return load_data(...)
end
local function u(...)
u = require(string_char_module)
return u(...)
end
local function prepare_iter(str, pattern, str_lib, plain)
local callable = is_callable(pattern)
if str_lib or plain then
return pattern, #str, string, callable
elseif not callable then
local simple = pattern_simplifier(pattern)
if simple then
return simple, #str, string, false
end
end
return pattern, ulen(str), ustring, callable
end
--[==[
Returns {nil} if the input value is the empty string, or otherwise the same value.
If the input is a string and `do_trim` is set, the input value will be trimmed before returning; if the trimmed value is
the empty string, returns {nil}.
If `quote_delimiters` is set, then any outer pair of quotation marks ({' '} or {" "}) surrounding the rest of the input
string will be stripped, if present. The string will not be trimmed again, converted to {nil}, or have further quotation
marks stripped, as it exists as a way to embed spaces or the empty string in an input. Genuine quotation marks may also
be embedded this way (e.g. {"''foo''"} returns {"'foo'"}).
]==]
function export.is_not_empty(str, do_trim, quote_delimiters)
if str == "" then
return nil
elseif not (str and type(str) == "string") then
return str
elseif do_trim then
str = trim(str)
if str == "" then
return nil
end
end
return quote_delimiters and gsub(str, "^(['\"])(.*)%1$", "%2") or str
end
--[==[
Explodes a string into an array of UTF-8 characters. '''Warning''': this function assumes that the input is valid UTF-8
in order to optimize speed and memory use. Passing in an input containing non-UTF-8 byte sequences could result in
unexpected behaviour.
]==]
function export.explode_utf8(str)
local text, i = {}, 0
for ch in gmatch(str, ".[\128-\191]*") do
i = i + 1
text[i] = ch
end
return text
end
explode_utf8 = export.explode_utf8
--[==[
Returns {true} if `str` is a valid UTF-8 string. This is true if, for each character, all of the following are true:
* It has the expected number of bytes, which is determined by value of the leading byte: 1-byte characters are `0x00` to
`0x7F`, 2-byte characters start with `0xC2` to `0xDF`, 3-byte characters start with `0xE0` to `0xEF`, and 4-byte
characters start with `0xF0` to `0xF4`.
* The leading byte must not fall outside of the above ranges.
* The trailing byte(s) (if any), must be between `0x80` to `0xBF`.
* The character's codepoint must be between U+0000 (`0x00`) and U+10FFFF (`0xF4 0x8F 0xBF 0xBF`).
* The character cannot have an overlong encoding: for each byte length, the lowest theoretical encoding is equivalent to
U+0000 (e.g. `0xE0 0x80 0x80`, the lowest theoretical 3-byte encoding, is exactly equivalent to U+0000). Encodings
that use more than the minimum number of bytes are not considered valid, meaning that the first valid 3-byte
character is `0xE0 0xA0 0x80` (U+0800), and the first valid 4-byte character is `0xF0 0x90 0x80 0x80` (U+10000).
Formally, 2-byte characters have leading bytes ranging from `0xC0` to `0xDF` (rather than `0xC2` to `0xDF`), but
`0xC0 0x80` to `0xC1 0xBF` are overlong encodings, so it is simpler to say that the 2-byte range begins at `0xC2`.
If `allow_surrogates` is set, surrogates (U+D800 to U+DFFF) will be treated as valid UTF-8. Surrogates are used in
UTF-16, which encodes codepoints U+0000 to U+FFFF with 2 bytes, and codepoints from U+10000 upwards using a pair of
surrogates, which are taken together as a 4-byte unit. Since surrogates have no use in UTF-8, as it encodes higher
codepoints in a different way, they are not considered valid in UTF-8 text. However, there are limited circumstances
where they may be necessary: for instance, JSON escapes characters using the format `\u0000`, which must contain exactly
4 hexadecimal digits; under the scheme, codepoints above U+FFFF must be escaped as the equivalent pair of surrogates,
even though the text itself must be encoded in UTF-8 (e.g. U+10000 becomes `\uD800\uDC00`).
]==]
function export.isutf8(str, allow_surrogates)
for ch in gmatch(str, "[\128-\255][\128-\191]*") do
if #ch > 4 then
return false
end
local b1, b2, b3, b4 = byte(ch, 1, 4)
if not (b2 and b2 >= 0x80 and b2 <= 0xBF) then
return false -- 1-byte is always invalid, as gmatch excludes 0x00 to 0x7F
elseif not b3 then -- 2-byte
if not (b1 >= 0xC2 and b1 <= 0xDF) then -- b1 == 0xC0 or b1 == 0xC1 is overlong
return false
end
elseif not (b3 >= 0x80 and b3 <= 0xBF) then -- trailing byte
return false
elseif not b4 then -- 3-byte
if b1 > 0xEF then
return false
elseif b2 < 0xA0 then
if b1 < 0xE1 then -- b1 == 0xE0 and b2 < 0xA0 is overlong
return false
end
elseif b1 < 0xE0 or (b1 == 0xED and not allow_surrogates) then -- b1 == 0xED and b2 >= 0xA0 is a surrogate
return false
end
elseif not (b4 >= 0x80 and b4 <= 0xBF) then -- 4-byte
return false
elseif b2 < 0x90 then
if not (b1 >= 0xF1 and b1 <= 0xF4) then -- b1 == 0xF0 and b2 < 0x90 is overlong
return false
end
elseif not (b1 >= 0xF0 and b1 <= 0xF3) then -- b1 == 0xF4 and b2 >= 0x90 is too high
return false
end
end
return true
end
do
local charset_chars = {
["\0"] = "%z", ["%"] = "%%", ["-"] = "%-", ["]"] = "%]", ["^"] = "%^"
}
charset_chars.__index = charset_chars
local chars = setmetatable({
["$"] = "%$", ["("] = "%(", [")"] = "%)", ["*"] = "%*", ["+"] = "%+",
["."] = "%.", ["?"] = "%?", ["["] = "%["
}, charset_chars)
--[==[
Escapes the magic characters used in a [[mw:Extension:Scribunto/Lua reference manual#Patterns|pattern]] (Lua's
version of regular expressions): {$%()*+-.?[]^}, and converts the null character to {%z}. For example,
{"^$()%.[]*+-?\0"} becomes {"%^%$%(%)%%%.%[%]%*%+%-%?%z"}. This is necessary when constructing a pattern involving
arbitrary text (e.g. from user input).
]==]
function export.pattern_escape(str)
return (gsub(str, "[%z$%%()*+%-.?[%]^]", chars))
end
pattern_escape = export.pattern_escape
--[==[
Escapes only {%}, which is the only magic character used in replacement
[[mw:Extension:Scribunto/Lua reference manual#Patterns|patterns]] with string.gsub and mw.ustring.gsub.
]==]
function export.replacement_escape(str)
return (gsub(str, "%%", "%%%%"))
end
replacement_escape = export.replacement_escape
local function case_insensitive_char(ch)
local upper_ch = uupper(ch)
if upper_ch == ch then
ch = ulower(ch)
if ch == upper_ch then
return chars[ch] or ch
end
end
return "[" .. (charset_chars[upper_ch] or upper_ch) .. (charset_chars[ch] or ch) .. "]"
end
local function iterate(str, str_len, text, n, start, _gsub, _sub, loc1, loc2)
if not (loc1 and start <= str_len) then
-- Add final chunk and return.
n = n + 1
text[n] = _gsub(_sub(str, start), ".", chars)
return
elseif loc2 < loc1 then
if _sub == sub then
local b = byte(str, loc1)
if b and b >= 128 then
loc1 = loc1 + (b < 224 and 1 or b < 240 and 2 or 3)
end
end
n = n + 1
text[n] = _gsub(_sub(str, start, loc1), ".", chars)
start = loc1 + 1
if start > str_len then
return
end
else
-- Add chunk up to the current match.
n = n + 1
text[n] = _gsub(_sub(str, start, loc1 - 1), ".", chars)
-- Add current match.
n = n + 1
text[n] = _gsub(_sub(str, loc1, loc2), ".", case_insensitive_char)
start = loc2 + 1
end
return n, start
end
--[==[
Escapes the magic characters used in a [[mw:Extension:Scribunto/Lua reference manual#Patterns|pattern]], and makes
all characters case-insensitive. An optional pattern or find function (see {split}) may be supplied as the second
argument, the third argument (`str_lib`) forces use of the string library, while the fourth argument (`plain`) turns
any pattern matching facilities off in the optional pattern supplied.
]==]
function export.case_insensitive_pattern(str, pattern_or_func, str_lib, plain)
if pattern_or_func == nil then
return (gsub(str, str_lib and "[^\128-\255]" or ".[\128-\191]*", case_insensitive_char))
end
local text, n, start, str_len, _string, callable = {}, 0, 1
pattern_or_func, str_len, _string, callable = prepare_iter(str, pattern_or_func, str_lib, plain)
local _find, _gsub, _sub = _string.find, _string.gsub, _string.sub
if callable then
repeat
n, start = iterate(str, str_len, text, n, start, _gsub, _sub, pattern_or_func(str, start))
until not start
-- Special case if the pattern is anchored to the start: "^" always
-- anchors to the start position, not the start of the string, so get
-- around this by only attempting one match with the pattern, then match
-- the end of the string.
elseif byte(pattern_or_func) == 0x5E then -- ^
n, start = iterate(str, str_len, text, n, start, _gsub, _sub, _find(str, pattern_or_func, start, plain))
if start ~= nil then
iterate(str, str_len, text, n, start, _gsub, _sub, _find(str, "$", start, plain))
end
else
repeat
n, start = iterate(str, str_len, text, n, start, _gsub, _sub, _find(str, pattern_or_func, start, plain))
until not start
end
return concat(text)
end
end
do
local character_classes
local function get_character_classes()
character_classes, get_character_classes = {
[0x41] = true, [0x61] = true, -- Aa
[0x43] = true, [0x63] = true, -- Cc
[0x44] = true, [0x64] = true, -- Dd
[0x4C] = true, [0x6C] = true, -- Ll
[0x50] = true, [0x70] = true, -- Pp
[0x53] = true, [0x73] = true, -- Ss
[0x55] = true, [0x75] = true, -- Uu
[0x57] = true, [0x77] = true, -- Ww
[0x58] = true, [0x78] = true, -- Xx
[0x5A] = true, -- z dealt with separately.
}, nil
return character_classes
end
local function check_sets_equal(set1, set2)
local k2
for k1, v1 in next, set1 do
local v2 = set2[k1]
if v1 ~= v2 and (v2 == nil or not check_sets_equal(v1, v2)) then
return false
end
k2 = next(set2, k2)
end
return next(set2, k2) == nil
end
local function check_sets(bytes)
local key, set1, set = next(bytes)
if set1 == true then
return true
elseif not check_sets(set1) then
return false
end
while true do
key, set = next(bytes, key)
if not key then
return true
elseif not check_sets_equal(set, set1) then
return false
end
end
end
local function make_charset(range)
if #range == 1 then
return char(range[1])
end
sort(range)
local compressed, n, start = {}, 0, range[1]
for i = 1, #range do
local this, nxt = range[i], range[i + 1]
if nxt ~= this + 1 then
n = n + 1
compressed[n] = this == start and char(this) or
char(start) .. "-" .. char(this)
start = nxt
end
end
return "[" .. concat(compressed) .. "]"
end
local function parse_1_byte_charset(pattern, pos)
local ch
while true do
pos, ch = match(pattern, "()([%%%]\192-\255])", pos)
if ch == "%" then
local nxt = byte(pattern, pos + 1)
if not nxt or nxt >= 128 or (character_classes or get_character_classes())[nxt] then -- acdlpsuwxACDLPSUWXZ, but not z
return false
end
pos = pos + 2
elseif ch == "]" then
pos = pos + 1
return pos
else
return false
end
end
end
--[==[
Parses `pattern`, a ustring library pattern, and attempts to convert it into a string library pattern. If conversion
isn't possible, returns false.
]==]
function pattern_simplifier(pattern)
if type(pattern) == "number" then
return tostring(pattern)
end
local pos, capture_groups, start, n, output, ch, nxt_pos = 1, 0, 1, 0
while true do
-- FIXME: use "()([%%(.[\128-\255])[\128-\191]?[\128-\191]?[\128-\191]?()" and ensure non-UTF8 always fails.
pos, ch, nxt_pos = match(pattern, "()([%%(.[\192-\255])[\128-\191]*()", pos)
if not ch then
break
end
local nxt = byte(pattern, nxt_pos)
if ch == "%" then
if nxt == 0x62 then -- b
local nxt2, nxt3 = byte(pattern, pos + 2, pos + 3)
if not (nxt2 and nxt2 < 128 and nxt3 and nxt3 < 128) then
return false
end
pos = pos + 4
elseif nxt == 0x66 then -- f
nxt_pos = nxt_pos + 2
local nxt2, nxt3 = byte(pattern, nxt_pos - 1, nxt_pos)
-- Only possible to convert a positive %f charset which is
-- all ASCII, so use parse_1_byte_charset.
if not (nxt2 == 0x5B and nxt3 and nxt3 ~= 0x5E and nxt3 < 128) then -- [^
return false
elseif nxt3 == 0x5D then -- Initial ] is non-magic.
nxt_pos = nxt_pos + 1
end
pos = parse_1_byte_charset(pattern, nxt_pos)
if not pos then
return false
end
elseif nxt == 0x5A then -- Z
nxt = byte(pattern, nxt_pos + 1)
if nxt == 0x2A or nxt == 0x2D then -- *-
pos = pos + 3
else
if output == nil then
output = {}
end
local ins = sub(pattern, start, pos - 1) .. "[\1-\127\192-\255]"
n = n + 1
if nxt == 0x2B then -- +
output[n] = ins .. "%Z*"
pos = pos + 3
elseif nxt == 0x3F then -- ?
output[n] = ins .. "?[\128-\191]*"
pos = pos + 3
else
output[n] = ins .. "[\128-\191]*"
pos = pos + 2
end
start = pos
end
elseif not nxt or (character_classes or get_character_classes())[nxt] then -- acdlpsuwxACDLPSUWX, but not Zz
return false
-- Skip the next character if it's ASCII. Otherwise, we will
-- still need to do length checks.
else
pos = pos + (nxt < 128 and 2 or 1)
end
elseif ch == "(" then
if nxt == 0x29 or capture_groups == 32 then -- )
return false
end
capture_groups = capture_groups + 1
pos = pos + 1
elseif ch == "." then
if nxt == 0x2A or nxt == 0x2D then -- *-
pos = pos + 2
else
if output == nil then
output = {}
end
local ins = sub(pattern, start, pos - 1) .. "[^\128-\191]"
n = n + 1
if nxt == 0x2B then -- +
output[n] = ins .. ".*"
pos = pos + 2
elseif nxt == 0x3F then -- ?
output[n] = ins .. "?[\128-\191]*"
pos = pos + 2
else
output[n] = ins .. "[\128-\191]*"
pos = pos + 1
end
start = pos
end
elseif ch == "[" then
-- Fail negative charsets. TODO: 1-byte charsets should be safe.
if nxt == 0x5E then -- ^
return false
-- If the first character is "%", ch_len is determined by the
-- next one instead.
elseif nxt == 0x25 then -- %
nxt = byte(pattern, nxt_pos + 1)
elseif nxt == 0x5D then -- Initial ] is non-magic.
nxt_pos = nxt_pos + 1
end
if not nxt then
return false
end
local ch_len = nxt < 128 and 1 or nxt < 224 and 2 or nxt < 240 and 3 or 4
if ch_len == 1 then -- Single-byte charset.
pos = parse_1_byte_charset(pattern, nxt_pos)
if not pos then
return false
end
else -- Multibyte charset.
-- TODO: 1-byte chars should be safe to mix with multibyte chars. CONFIRM THIS FIRST.
local charset_pos, bytes = pos
pos = pos + 1
while true do -- TODO: non-ASCII charset ranges.
pos, ch, nxt_pos = match(pattern, "^()([^\128-\191])[\128-\191]*()", pos)
-- If escaped, get the next character. No need to
-- distinguish magic characters or character classes,
-- as they'll all fail for having the wrong length
-- anyway.
if ch == "%" then
pos, ch, nxt_pos = match(pattern, "^()([^\128-\191])[\128-\191]*()", nxt_pos)
elseif ch == "]" then
pos = nxt_pos
break
end
if not (ch and nxt_pos - pos == ch_len) then
return false
elseif bytes == nil then
bytes = {}
end
local bytes, last = bytes, nxt_pos - 1
for i = pos, last - 1 do
local b = byte(pattern, i)
local bytes_b = bytes[b]
if bytes_b == nil then
bytes_b = {}
bytes[b] = bytes_b
end
bytes[b], bytes = bytes_b, bytes_b
end
bytes[byte(pattern, last)] = true
pos = nxt_pos
end
if not pos then
return false
end
nxt = byte(pattern, pos)
if (
(nxt == 0x2A or nxt == 0x2D or nxt == 0x3F) or -- *-?
(nxt == 0x2B and ch_len > 2) or -- +
not check_sets(bytes)
) then
return false
end
local ranges, b, key, next_byte = {}, 0
repeat
key, next_byte = next(bytes)
local range, n = {key}, 1
-- Loop starts on the second iteration.
for key in next, bytes, key do
n = n + 1
range[n] = key
end
b = b + 1
ranges[b] = range
bytes = next_byte
until next_byte == true
if nxt == 0x2B then -- +
local range1, range2 = ranges[1], ranges[2]
ranges[1], ranges[3] = make_charset(range1), make_charset(range2)
local n = #range2
for i = 1, #range1 do
n = n + 1
range2[n] = range1[i]
end
ranges[2] = make_charset(range2) .. "*"
pos = pos + 1
else
for i = 1, #ranges do
ranges[i] = make_charset(ranges[i])
end
end
if output == nil then
output = {}
end
nxt = byte(pattern, pos)
n = n + 1
output[n] = sub(pattern, start, charset_pos - 1) .. concat(ranges) ..
((nxt == 0x2A or nxt == 0x2B or nxt == 0x2D or nxt == 0x3F) and "%" or "") -- following *+-? now have to be escaped
start = pos
end
elseif not nxt then
break
elseif nxt == 0x2B then -- +
if nxt_pos - pos ~= 2 then
return false
elseif output == nil then
output = {}
end
pos, nxt_pos = pos + 1, nxt_pos + 1
nxt = byte(pattern, nxt_pos)
local ch2 = sub(pattern, pos, pos)
n = n + 1
output[n] = sub(pattern, start, pos - 1) .. "[" .. ch .. ch2 .. "]*" .. ch2 ..
((nxt == 0x2A or nxt == 0x2B or nxt == 0x2D or nxt == 0x3F) and "%" or "") -- following *+-? now have to be escaped
pos, start = nxt_pos, nxt_pos
elseif nxt == 0x2A or nxt == 0x2D or nxt == 0x3F then -- *-?
return false
else
pos = nxt_pos
end
end
if start == 1 then
return pattern
end
return concat(output) .. sub(pattern, start)
end
pattern_simplifier = memoize(pattern_simplifier, true)
export.pattern_simplifier = pattern_simplifier
end
--[==[
Parses `charset`, the interior of a string or ustring library character set, and normalizes it into a string or ustring
library pattern (e.g. {"abcd-g"} becomes {"[abcd-g]"}, and {"[]"} becomes {"[[%]]"}).
The negative (`^`), range (`-`) and literal (`%`) magic characters work as normal, and character classes may be used
(e.g. `%d` and `%w`), but opening and closing square brackets are sanitized so that they behave like ordinary
characters.
]==]
function get_charset(charset)
if type(charset) == "number" then
return tostring(charset)
end
local pos, start, n, output = 1, 1, 0
if byte(charset) == 0x5E then -- ^
pos = pos + 1
end
-- FIXME: "]" is non-magic if it's the first character in a charset.
local nxt_pos, nxt
while true do
local new_pos, ch = match(charset, "()([%%%-%]])", pos)
if not ch then
break
-- Skip percent escapes. Ranges can't start with them, either.
elseif ch == "%" then
pos = new_pos + 2
else
-- If `ch` is a hyphen, get the character before iff it's at or ahead of `pos`.
if ch == "-" and new_pos > pos then
pos, nxt_pos, nxt = new_pos - 1, new_pos, ch
ch = sub(charset, pos, pos)
else
pos, nxt_pos = new_pos, new_pos + 1
nxt = sub(charset, nxt_pos, nxt_pos)
end
-- Range.
if nxt == "-" then
if output == nil then
output = {}
end
n = n + 1
output[n] = sub(charset, start, pos - 1)
nxt_pos = nxt_pos + 1
nxt = sub(charset, nxt_pos, nxt_pos)
-- Ranges fail if they end with a percent escape, so escape the hyphen to avoid undefined behaviour.
if nxt == "" or nxt == "%" then
n = n + 1
output[n] = (ch == "]" and "%]" or ch) .. "%-"
start = nxt_pos
nxt_pos = nxt_pos + 2
-- Since ranges can't contain "%]", since it's escaped, range inputs like "]-z" or "a-]" must be
-- adjusted to the character before or after, plus "%]" (e.g. "%]^-z" or "a-\\%]"). The escaped "%]" is
-- omitted if the range would be empty (i.e. if the first byte is greater than the second).
else
n = n + 1
output[n] = (ch == "]" and (byte(nxt) >= 0x5D and "%]^" or "^") or ch) .. "-" ..
(nxt == "]" and (byte(ch) <= 0x5D and "\\%]" or "\\") or nxt)
nxt_pos = nxt_pos + 1
start = nxt_pos
end
elseif ch == "-" or ch == "]" then
if output == nil then
output = {}
end
n = n + 1
output[n] = sub(charset, start, pos - 1) .. "%" .. ch
start = nxt_pos
end
pos = nxt_pos
end
end
if start == 1 then
return "[" .. charset .. "]"
end
return "[" .. concat(output) .. sub(charset, start) .. "]"
end
get_charset = memoize(get_charset, true)
export.get_charset = get_charset
function export.len(str)
return type(str) == "number" and len(str) or
#str - #gsub(str, "[^\128-\191]+", "")
end
ulen = export.len
function export.sub(str, i, j)
str, i = type(str) == "number" and tostring(str) or str, i or 1
if i < 0 or j and j < 0 then
return usub(str, i, j)
elseif j and i > j or i > #str then
return ""
end
local n, new_i = 0
for loc1, loc2 in gmatch(str, "()[^\128-\191]+()[\128-\191]*") do
n = n + loc2 - loc1
if not new_i and n >= i then
new_i = loc2 - (n - i) - 1
if not j then
return sub(str, new_i)
end
end
if j and n > j then
return sub(str, new_i, loc2 - (n - j) - 1)
end
end
return new_i and sub(str, new_i) or ""
end
do
local function _find(str, loc1, loc2, ...)
if loc1 and not match(str, "^()[^\128-\255]*$") then
-- Use raw values of loc1 and loc2 to get loc1 and the length of the match.
loc1, loc2 = ulen(sub(str, 1, loc1)), ulen(sub(str, loc1, loc2))
-- Offset length with loc1 to get loc2.
loc2 = loc1 + loc2 - 1
end
return loc1, loc2, ...
end
--[==[A version of find which uses string.find when possible, but otherwise uses mw.ustring.find.]==]
function export.find(str, pattern, init, plain)
init = init or 1
if init ~= 1 and not match(str, "^()[^\128-\255]*$") then
return ufind(str, pattern, init, plain)
elseif plain then
return _find(str, find(str, pattern, init, true))
end
local simple = pattern_simplifier(pattern)
if simple then
return _find(str, find(str, simple, init))
end
return ufind(str, pattern, init)
end
end
--[==[A version of match which uses string.match when possible, but otherwise uses mw.ustring.match.]==]
function export.match(str, pattern, init)
init = init or 1
if init ~= 1 and not match(str, "^()[^\128-\255]*$") then
return umatch(str, pattern, init)
end
local simple = pattern_simplifier(pattern)
if simple then
return match(str, simple, init)
end
return umatch(str, pattern, init)
end
--[==[A version of gmatch which uses string.gmatch when possible, but otherwise uses mw.ustring.gmatch.]==]
function export.gmatch(str, pattern)
local simple = pattern_simplifier(pattern)
if simple then
return gmatch(str, simple)
end
return ugmatch(str, pattern)
end
--[==[A version of gsub which uses string.gsub when possible, but otherwise uses mw.ustring.gsub.]==]
function export.gsub(str, pattern, repl, n)
local simple = pattern_simplifier(pattern)
if simple then
return gsub(str, simple, repl, n)
end
return ugsub(str, pattern, repl, n)
end
--[==[
Like gsub, but pattern-matching facilities are turned off, so `pattern` and `repl` (if a string) are treated as literal.
]==]
function export.plain_gsub(str, pattern, repl, n)
return gsub(str, pattern_escape(pattern), type(repl) == "string" and replacement_escape(repl) or repl, n)
end
--[==[
Reverses a UTF-8 string; equivalent to string.reverse.
]==]
function export.reverse(str)
return reverse((gsub(str, "[\192-\255][\128-\191]*", reverse)))
end
function export.char(...) -- To be moved to [[Module:string/char]].
return u(...)
end
do
local function utf8_err(func_name)
error(format("bad argument #1 to '%s' (string is not UTF-8)", func_name), 4)
end
local function get_codepoint(func_name, b1, b2, b3, b4)
if b1 <= 0x7F then
return b1, 1
elseif not (b2 and b2 >= 0x80 and b2 <= 0xBF) then
utf8_err(func_name)
elseif b1 <= 0xDF then
local cp = 0x40 * b1 + b2 - 0x3080
return cp >= 0x80 and cp or utf8_err(func_name), 2
elseif not (b3 and b3 >= 0x80 and b3 <= 0xBF) then
utf8_err(func_name)
elseif b1 <= 0xEF then
local cp = 0x1000 * b1 + 0x40 * b2 + b3 - 0xE2080
return cp >= 0x800 and cp or utf8_err(func_name), 3
elseif not (b4 and b4 >= 0x80 and b4 <= 0xBF) then
utf8_err(func_name)
end
local cp = 0x40000 * b1 + 0x1000 * b2 + 0x40 * b3 + b4 - 0x3C82080
return cp >= 0x10000 and cp <= 0x10FFFF and cp or utf8_err(func_name), 4
end
function export.codepoint(str, i, j)
if str == "" then
return -- return nothing
elseif type(str) == "number" then
return byte(str, i, j)
end
i, j = i or 1, j == -1 and #str or i or 1
if i == 1 and j == 1 then
return (get_codepoint("codepoint", byte(str, 1, 4)))
elseif i < 0 or j < 0 then
return ucodepoint(str, i, j) -- FIXME
end
local n, nb, ret, nr = 0, 1, {}, 0
while n < j do
n = n + 1
if n < i then
local b = byte(str, nb)
nb = nb + (b < 128 and 1 or b < 224 and 2 or b < 240 and 3 or 4)
else
local b1, b2, b3, b4 = byte(str, nb, nb + 3)
if not b1 then
break
end
nr = nr + 1
local add
ret[nr], add = get_codepoint("codepoint", b1, b2, b3, b4)
nb = nb + add
end
end
return unpack(ret)
end
codepoint = export.codepoint
function export.gcodepoint(str, i, j)
i, j = i or 1, j ~= -1 and j or nil
if i < 0 or j and j < 0 then
return ugcodepoint(str, i, j) -- FIXME
end
local n, nb = 1, 1
while n < i do
local b = byte(str, nb)
if not b then
break
end
nb = nb + (b < 128 and 1 or b < 224 and 2 or b < 240 and 3 or 4)
n = n + 1
end
return function()
if j and n > j then
return nil
end
n = n + 1
local b1, b2, b3, b4 = byte(str, nb, nb + 3)
if not b1 then
return nil
end
local ret, add = get_codepoint("gcodepoint", b1, b2, b3, b4)
nb = nb + add
return ret
end
end
end
do
local _ulower = ulower
--[==[A version of lower which uses string.lower when possible, but otherwise uses mw.ustring.lower.]==]
function export.lower(str)
return (match(str, "^()[^\128-\255]*$") and lower or _ulower)(str)
end
end
do
local _uupper = uupper
--[==[A version of upper which uses string.upper when possible, but otherwise uses mw.ustring.upper.]==]
function export.upper(str)
return (match(str, "^()[^\128-\255]*$") and upper or _uupper)(str)
end
end
do
local function add_captures(t, n, ...)
if ... == nil then
return
end
-- Insert any captures from the splitting pattern.
local offset, capture = n - 1, ...
while capture do
n = n + 1
t[n] = capture
capture = select(n - offset, ...)
end
return n
end
--[==[
Reimplementation of mw.text.split() that includes any capturing groups in the splitting pattern. This works like
Python's re.split() function, except that it has Lua's behavior when the split pattern is empty (i.e. advancing by
one character at a time; Python returns the whole remainder of the string). When possible, it will use the string
library, but otherwise uses the ustring library. There are two optional parameters: `str_lib` forces use of the
string library, while `plain` turns any pattern matching facilities off, treating `pattern` as literal.
In addition, `pattern` may be a custom find function (or callable table), which takes the input string and start
index as its two arguments, and must return the start and end index of the match, plus any optional captures, or nil
if there are no further matches. By default, the start index will be calculated using the ustring library, unless
`str_lib` or `plain` is set.
]==]
function export.split(str, pattern_or_func, str_lib, plain)
local iter, t, n = gsplit(str, pattern_or_func, str_lib, plain), {}, 0
repeat
n = add_captures(t, n, iter())
until n == nil
return t
end
export.capturing_split = export.split -- To be removed.
end
--[==[
Returns an iterator function, which iterates over the substrings returned by {split}. The first value returned is the
string up the splitting pattern, with any capture groups being returned as additional values on that iteration.
]==]
function export.gsplit(str, pattern_or_func, str_lib, plain)
local start, final, str_len, _string, callable = 1
pattern_or_func, str_len, _string, callable = prepare_iter(str, pattern_or_func, str_lib, plain)
local _find, _sub = _string.find, _string.sub
local function iter(loc1, loc2, ...)
-- If no match, or there is but we're past the end of the string
-- (which happens when the match is the empty string), then return
-- the final chunk.
if not loc1 then
final = true
return _sub(str, start)
end
-- Special case: If we match the empty string, then eat the
-- next character; this avoids an infinite loop, and makes
-- splitting by the empty string work the way mw.text.gsplit() does
-- (including non-adjacent empty string matches with %f). If we
-- reach the end of the string this way, set `final` to true, so we
-- don't get stuck matching the empty string at the end.
local chunk
if loc2 < loc1 then
-- If using the string library, we need to make sure we advance
-- by one UTF-8 character.
if _sub == sub then
local b = byte(str, loc1)
if b and b >= 128 then
loc1 = loc1 + (b < 224 and 1 or b < 240 and 2 or 3)
end
end
chunk = _sub(str, start, loc1)
if loc1 >= str_len then
final = true
else
start = loc1 + 1
end
-- Eat chunk up to the current match.
else
chunk = _sub(str, start, loc1 - 1)
start = loc2 + 1
end
return chunk, ...
end
if callable then
return function()
if not final then
return iter(pattern_or_func(str, start))
end
end
-- Special case if the pattern is anchored to the start: "^" always
-- anchors to the start position, not the start of the string, so get
-- around this by only attempting one match with the pattern, then match
-- the end of the string.
elseif byte(pattern_or_func) == 0x5E then -- ^
local returned
return function()
if not returned then
returned = true
return iter(_find(str, pattern_or_func, start, plain))
elseif not final then
return iter(_find(str, "$", start, plain))
end
end
end
return function()
if not final then
return iter(_find(str, pattern_or_func, start, plain))
end
end
end
gsplit = export.gsplit
function export.count(str, pattern, plain)
if plain then
return select(2, gsub(str, pattern_escape(pattern), ""))
end
local simple = pattern_simplifier(pattern)
if simple then
return select(2, gsub(str, pattern, ""))
end
return select(2, ugsub(str, pattern, ""))
end
function export.trim(str, charset, str_lib, plain)
if charset == nil then
-- "^.*%S" is the fastest trim algorithm except when strings only consist of characters to be trimmed, which are
-- very slow due to catastrophic backtracking. gsub with "^%s*" gets around this by trimming such strings to ""
-- first.
return match(gsub(str, "^%s*", ""), "^.*%S") or ""
elseif charset == "" then
return str
end
charset = plain and ("[" .. charset_escape(charset) .. "]") or get_charset(charset)
-- The pattern uses a non-greedy quantifier instead of the algorithm used for %s, because negative character sets
-- are non-trivial to compute (e.g. "[^^-z]" becomes "[%^_-z]"). Plus, if the ustring library has to be used, there
-- would be two callbacks into PHP, which is slower.
local pattern = "^" .. charset .. "*(.-)" .. charset .. "*$"
if not str_lib then
local simple = pattern_simplifier(pattern)
if not simple then
return umatch(str, pattern)
end
pattern = simple
end
return match(str, pattern)
end
trim = export.trim
do
local entities
local function get_entities()
entities, get_entities = load_data("Module:data/entities"), nil
return entities
end
local function decode_entity(hash, x, code)
if hash == "" then
return (entities or get_entities())[x .. code]
end
local cp
if x == "" then
cp = match(code, "^()%d+$") and tonumber(code)
else
cp = match(code, "^()%x+$") and tonumber(code, 16)
end
return cp and (cp <= 0xD7FF or cp >= 0xE000 and cp <= 0x10FFFF) and u(cp) or nil
end
-- Non-ASCII characters aren't valid in proper HTML named entities, but MediaWiki uses them in some custom aliases
-- which have also been included in [[Module:data/entities]].
function export.decode_entities(str)
local amp = find(str, "&", nil, true)
return amp and find(str, ";", amp, true) and gsub(str, "&(#?)([xX]?)([%w\128-\255]+);", decode_entity) or str
end
end
do
local entities
local function get_entities()
-- Memoized HTML entities (taken from mw.text.lua).
entities, get_entities = {
["\""] = """,
["&"] = "&",
["'"] = "'",
["<"] = "<",
[">"] = ">",
["\194\160"] = " ",
}, nil
return entities
end
local function encode_entity(ch)
local entity = (entities or get_entities())[ch]
if entity == nil then
local cp = codepoint(ch)
-- U+D800 to U+DFFF are surrogates, so can't be encoded as entities.
entity = cp and (cp <= 0xD7FF or cp >= 0xE000) and format("&#%d;", cp) or false
entities[ch] = entity
end
return entity or nil
end
function export.encode_entities(str, charset, str_lib, plain)
if charset == nil then
return (gsub(str, "[\"&'<>\194]\160?", entities or get_entities()))
elseif charset == "" then
return str
end
local pattern = plain and ("[" .. charset_escape(charset) .. "]") or charset == "." and charset or get_charset(charset)
if not str_lib then
local simple = pattern_simplifier(pattern)
if not simple then
return (ugsub(str, pattern, encode_entity))
end
pattern = simple
end
return (gsub(str, pattern, encode_entity))
end
end
do
local function decode_path(code)
return char(tonumber(code, 16))
end
local function decode(lead, trail)
if lead == "+" or lead == "_" then
return " " .. trail
elseif #trail == 2 then
return decode_path(trail)
end
return lead .. trail
end
function export.decode_uri(str, enctype)
enctype = enctype and upper(enctype) or "QUERY"
if enctype == "PATH" then
return find(str, "%", nil, true) and gsub(str, "%%(%x%x)", decode_path) or str
elseif enctype == "QUERY" then
return (find(str, "%", nil, true) or find(str, "+", nil, true)) and gsub(str, "([%%%+])(%x?%x?)", decode) or str
elseif enctype == "WIKI" then
return (find(str, "%", nil, true) or find(str, "_", nil, true)) and gsub(str, "([%%_])(%x?%x?)", decode) or str
end
error("bad argument #2 to 'decode_uri' (expected QUERY, PATH, or WIKI)", 2)
end
end
do
local function _remove_comments(str, pre)
local head = find(str, "<!--", nil, true)
if not head then
return str
end
local ret, n = {sub(str, 1, head - 1)}, 1
while true do
local loc = find(str, "-->", head + 4, true)
if not loc then
return pre and concat(ret) or
concat(ret) .. sub(str, head)
end
head = loc + 3
loc = find(str, "<!--", head, true)
if not loc then
return concat(ret) .. sub(str, head)
end
n = n + 1
ret[n] = sub(str, head, loc - 1)
head = loc
end
end
--[==[
Removes any HTML comments from the input text. `stage` can be one of three options:
* {"PRE"} (default) applies the method used by MediaWiki's preprocessor: all
{{code|html|<nowiki><!-- ... --></nowiki>}} pairs are removed, as well as any text after an unclosed
{{code|html|<nowiki><!--</nowiki>}}. This is generally suitable when parsing raw template or
[[mw:Parser extension tags|parser extension tag]] code. (Note, however, that the actual method used by the
preprocessor is considerably more complex and differs under certain conditions (e.g. comments inside nowiki tags);
if full accuracy is absolutely necessary, use [[Module:template parser]] instead).
* {"POST"} applies the method used to generate the final page output once all templates have been expanded: it loops
over the text, removing any {{code|html|<nowiki><!-- ... --></nowiki>}} pairs until no more are found (e.g.
{{code|html|<nowiki><!-<!-- ... -->- ... --></nowiki>}} would be fully removed), but any unclosed
{{code|html|<nowiki><!--</nowiki>}} is ignored. This is suitable for handling links embedded in template inputs,
where the {"PRE"} method will have already been applied by the native parser.
* {"BOTH"} applies {"PRE"} then {"POST"}.
]==]
function export.remove_comments(str, stage)
if not stage or stage == "PRE" then
return _remove_comments(str, true)
end
local processed = stage == "POST" and _remove_comments(str) or
stage == "BOTH" and _remove_comments(str, true) or
error("bad argument #2 to 'remove_comments' (expected PRE, POST, or BOTH)", 2)
while processed ~= str do
str = processed
processed = _remove_comments(str)
end
return str
end
end
do
local byte_escapes
local function get_byte_escapes()
byte_escapes, get_byte_escapes = load_data("Module:string utilities/data").byte_escapes, nil
return byte_escapes
end
local function escape_byte(b)
return (byte_escapes or get_byte_escapes())[b] or format("\\%03d", byte(b))
end
function export.escape_bytes(str)
return (gsub(str, ".", escape_byte))
end
end
function export.format_fun(str, fun)
return (gsub(str, "{(\\?)((\\?)[^{}]*)}", function(p1, name, p2)
if #p1 + #p2 == 1 then
return name == "op" and "{" or
name == "cl" and "}" or
error(mw.getCurrentFrame():getTitle() .. " format: unrecognized escape sequence '{\\" .. name .. "}'")
elseif fun(name) and type(fun(name)) ~= "string" then
error(mw.getCurrentFrame():getTitle() .. " format: \"" .. name .. "\" is a " .. type(fun(name)) .. ", not a string")
end
return fun(name) or error(mw.getCurrentFrame():getTitle() .. " format: \"" .. name .. "\" not found in table")
end))
end
format_fun = export.format_fun
--[==[
This function, unlike {string.format} and {mw.ustring.format}, takes just two parameters, a format string and a table,
and replaces all instances of { {param_name} } in the format string with the table's entry for {param_name}. The opening
and closing brace characters can be escaped with { {\op} } and { {\cl} }, respectively. A table entry beginning with a
slash can be escaped by doubling the initial slash.
====Examples====
* {string_utilities.format("{foo} fish, {bar} fish, {baz} fish, {quux} fish", {["foo"]="one", ["bar"]="two", ["baz"]="red", ["quux"]="blue"}) }
*: produces: {"one fish, two fish, red fish, blue fish"}
* {string_utilities.format("The set {\\op}1, 2, 3{\\cl} contains {\\\\hello} elements.", {["\\hello"]="three"})}
*: produces: {"The set {1, 2, 3} contains three elements."}
*:* Note that the single and double backslashes should be entered as double and quadruple backslashes when quoted in a literal string.
]==]
function export.format(str, tbl)
return format_fun(str, function(key)
return tbl[key]
end)
end
do
local function do_uclcfirst(str, case_func)
-- Re-case the first letter.
local first, remainder = match(str, "^(.[\128-\191]*)(.*)")
return first and (case_func(first) .. remainder) or ""
end
local function uclcfirst(str, case_func)
-- Strip off any HTML tags at the beginning. This currently does not handle comments or <ref>...</ref>
-- correctly; it's intended for text wrapped in <span> or the like, as happens when passing text through
-- [[Module:links]].
local html_at_beginning = nil
if str:match("^<") then
while true do
local html_tag, rest = str:match("^(<.->)(.*)$")
if not html_tag then
break
end
if not html_at_beginning then
html_at_beginning = {}
end
insert(html_at_beginning, html_tag)
str = rest
end
end
-- If there's a link at the beginning, re-case the first letter of the
-- link text. This pattern matches both piped and unpiped links.
-- If the link is not piped, the second capture (linktext) will be empty.
local link, linktext, remainder = match(str, "^%[%[([^|%]]+)%|?(.-)%]%](.*)$")
local retval
if link then
retval = "[[" .. link .. "|" .. do_uclcfirst(linktext ~= "" and linktext or link, case_func) .. "]]" .. remainder
else
retval = do_uclcfirst(str, case_func)
end
if html_at_beginning then
retval = concat(html_at_beginning) .. retval
end
return retval
end
--[==[
Uppercase the first character of the input string, correctly handling one-part and two-part links, optionally
surrounded by HTML tags such as `<nowiki><span>...</span></nowiki>`, possibly nested. Intended to correctly
uppercase the first character of text that may include links that have been passed through `full_link()` in
[[Module:links]] or a similar function.
]==]
function export.ucfirst(str)
return uclcfirst(str, uupper)
end
ucfirst = export.ucfirst
--[==[
Lowercase the first character of the input string, correctly handling one-part and two-part links, optionally
surrounded by HTML tags such as `<nowiki><span>...</span></nowiki>`, possibly nested. Intended to correctly
lowercase the first character of text that may include links that have been passed through `full_link()` in
[[Module:links]] or a similar function.
]==]
function export.lcfirst(str)
return uclcfirst(str, ulower)
end
--[==[Capitalizes each word of the input string. WARNING: May be broken in the presence of multiword links.]==]
function export.capitalize(str)
-- Capitalize multi-word that is separated by spaces
-- by uppercasing the first letter of each part.
return (ugsub(str, "%w+", ucfirst))
end
local function do_title_case(first, remainder)
first = uupper(first)
return remainder == "" and first or (first .. ulower(remainder))
end
--[==[
Capitalizes each word of the input string, with any further letters in each word being converted to lowercase.
]==]
function export.title_case(str)
return str == "" and "" or ugsub(str, "(%w)(%w*)", do_title_case)
end
title_case = export.title_case
--[==[
Converts the input string to {{w|Camel case|CamelCase}}. Any non-word characters are treated as breaks between
words. If `lower_first` is set, then the first character of the string will be lowercase (e.g. camelCase).
]==]
function export.camel_case(str, lower_first)
str = ugsub(str, "%W*(%w*)", title_case)
return lower_first and do_uclcfirst(str, ulower) or str
end
end
do
local function do_snake_case(nonword, word)
return nonword == "" and word or "_" .. word
end
--[==[
Converts the input string to {{w|Snake case|snake_case}}. Any non-word characters are treated as breaks between
words.
]==]
function export.snake_case(str)
return (ugsub(str, "(%W*)(%w*)", do_snake_case))
end
end
return export
ndjfpg4lokleft04xzto19wigx7fczh
Module:languages
828
5900
17394
17343
2026-07-13T08:14:36Z
Hiyuune
6766
17394
Scribunto
text/plain
--[=[
This module implements fetching of language-specific information and processing text in a given language.
There are two types of languages: full languages and etymology-only languages. The essential difference is that only
full languages appear in L2 headings in vocabulary entries, and hence categories like [[:Category:French nouns]] exist
only for full languages. Etymology-only languages have either a full language or another etymology-only language as
their parent (in the parent-child inheritance sense), and for etymology-only languages with another etymology-only
language as their parent, a full language can always be derived by following the parent links upwards. For example,
"Canadian French", code 'fr-CA', is an etymology-only language whose parent is the full language "French", code 'fr'.
An example of an etymology-only language with another etymology-only parent is "Northumbrian Old English", code
'ang-nor', which has "Anglian Old English", code 'ang-ang' as its parent; this is an etymology-only language whose
parent is "Old English", code "ang", which is a full language. (This is because Northumbrian Old English is considered
a variety of Anglian Old English.) Sometimes the parent is the "Undetermined" language, code 'und'; this is the case,
for example, for "substrate" languages such as "Pre-Greek", code 'qsb-grc', and "the BMAC substrate", code 'qsb-bma'.
It is important to distinguish language ''parents'' from language ''ancestors''. The parent-child relationship is one
of containment, i.e. if X is a child of Y, X is considered a variety of Y. On the other hand, the ancestor-descendant
relationship is one of descent in time. For example, "Classical Latin", code 'la-cla', and "Late Latin", code 'la-lat',
are both etymology-only languages with "Latin", code 'la', as their parents, because both of the former are varieties
of Latin. However, Late Latin does *NOT* have Classical Latin as its parent because Late Latin is *not* a variety of
Classical Latin; rather, it is a descendant. There is in fact a separate 'ancestors' field that is used to express the
ancestor-descendant relationship, and Late Latin's ancestor is given as Classical Latin. It is also important to note
that sometimes an etymology-only language is actually the conceptual ancestor of its parent language. This happens,
for example, with "Old Italian" (code 'roa-oit'), which is an etymology-only variant of full language "Italian" (code
'it'), and with "Old Latin" (code 'itc-ola'), which is an etymology-only variant of Latin. In both cases, the full
language has the etymology-only variant listed as an ancestor. This allows a Latin term to inherit from Old Latin
using the {{tl|inh}} template (where in this template, "inheritance" refers to ancestral inheritance, i.e. inheritance
in time, rather than in the parent-child sense); likewise for Italian and Old Italian.
Full languages come in three subtypes:
* {regular}: This indicates a full language that is attested according to [[WT:CFI]] and therefore permitted in the
main namespace. There may also be reconstructed terms for the language, which are placed in the
{Reconstruction} namespace and must be prefixed with * to indicate a reconstruction. Most full languages
are natural (not constructed) languages, but a few constructed languages (e.g. Esperanto and Volapük,
among others) are also allowed in the mainspace and considered regular languages.
* {reconstructed}: This language is not attested according to [[WT:CFI]], and therefore is allowed only in the
{Reconstruction} namespace. All terms in this language are reconstructed, and must be prefixed with
*. Languages such as Proto-Indo-European and Proto-Germanic are in this category.
* {appendix-constructed}: This language is attested but does not meet the additional requirements set out for
constructed languages ([[WT:CFI#Constructed languages]]). Its entries must therefore be in
the Appendix namespace, but they are not reconstructed and therefore should not have *
prefixed in links. Most constructed languages are of this subtype.
Both full languages and etymology-only languages have a {Language} object associated with them, which is fetched using
the {getByCode} function in [[Module:languages]] to convert a language code to a {Language} object. Depending on the
options supplied to this function, etymology-only languages may or may not be accepted, and family codes may be
accepted (returning a {Family} object as described in [[Module:families]]). There are also separate {getByCanonicalName}
functions in [[Module:languages]] and [[Module:etymology languages]] to convert a language's canonical name to a
{Language} object (depending on whether the canonical name refers to a full or etymology-only language).
Textual strings belonging to a given language come in several different ''text variants'':
# The ''input text'' is what the user supplies in wikitext, in the parameters to {{tl|m}}, {{tl|l}}, {{tl|ux}},
{{tl|t}}, {{tl|lang}} and the like.
# The ''display text'' is the text in the form as it will be displayed to the user. This can include accent marks that
are stripped to form the entry text (see below), as well as embedded bracketed links that are variously processed
further. The display text is generated from the input text by applying language-specific transformations; for most
languages, there will be no such transformations. Examples of transformations are bad-character replacements for
certain languages (e.g. replacing 'l' or '1' to [[palochka]] in certain languages in Cyrillic); and for Thai and
Khmer, converting space-separated words to bracketed words and resolving respelling substitutions such as [กรีน/กฺรีน],
which indicate how to transliterate given words.
# The ''entry text'' is the text in the form used to generate a link to a Wiktionary entry. This is usually generated
from the display text by stripping certain sorts of diacritics on a per-language basis, and sometimes doing other
transformations. The concept of ''entry text'' only really makes sense for text that does not contain embedded links,
meaning that display text containing embedded links will need to have the links individually processed to get
per-link entry text in order to generate the resolved display text (see below).
# The ''resolved display text'' is the result of resolving embedded links in the display text (e.g. converting them to
two-part links where the first part has entry-text transformations applied, and adding appropriate language-specific
fragments) and adding appropriate language and script tagging. This text can be passed directly to MediaWiki for
display.
# The ''source translit text'' is the text as supplied to the language-specific {transliterate()} method. The form of
the source translit text may need to be language-specific, e.g Thai and Khmer will need the full unprocessed input
text, whereas other languages may need to work off the display text. [FIXME: It's still unclear to me how embedded
bracketed links are handled in the existing code.] In general, embedded links need to be removed (i.e. converted to
their "bare display" form by taking the right part of two-part links and removing double brackets), but when this
happens is unclear to me [FIXME]. Some languages have a chop-up-and-paste-together scheme that sends parts of the
text through the transliterate mechanism, and for others (those listed with "cont" in {substition} in
[[Module:languages/data]]) they receive the full input text, but preprocessed in certain ways. (The wisdom of this is
still unclear to me.)
# The ''transliterated text'' (or ''transliteration'') is the result of transliterating the source translit text.
Unlike for all the other text variants except the transcribed text, it is always in the Latin script.
# The ''transcribed text'' (or ''transcription'') is the result of transcribing the source translit text, where
"transcription" here means a close approximation to the phonetic form of the language in languages (e.g. Akkadian,
Sumerian, Ancient Egyptian, maybe Tibetan) that have a wide difference between the written letters and spoken form.
Unlike for all the other text variants other than the transliterated text, it is always in the Latin script.
Currently, the transcribed text is always supplied manually be the user; there is no such thing as a
{lua|transcribe()} method on language objects.
# The ''sort key'' is the text used in sort keys for determining the placing of pages in categories they belong to. The
sort key is generated from the pagename or a specified ''sort base'' by lowercasing, doing language-specific
transformations and then uppercasing the result. If the sort base is supplied and is generated from input text, it
needs to be converted to display text, have embedded links removed (i.e. resolving them to their right side if they
are two-part links) and have entry text transformations applied.
# There are other text variants that occur in usexes (specifically, there are normalized variants of several of the
above text variants), but we can skip them for now.
The following methods exist on {Language} objects to convert between different text variants:
# {makeDisplayText}: This converts input text to display text.
# {lua|makeEntryName}: This converts input or display text to entry text. [FIXME: This needs some rethinking. In
particular, {lua|makeEntryName} is sometimes called on display text (in some paths inside of [[Module:links]]) and
sometimes called on input text (in other paths inside of [[Module:links]], and usually from other modules). We need
to make sure we don't try to convert input text to display text twice, but at the same time we need to support
calling it directly on input text since so many modules do this. This means we need to add a parameter indicating
whether the passed-in text is input or display text; if that former, we call {lua|makeDisplayText} ourselves.]
# {lua|transliterate}: This appears to convert input text with embedded brackets removed into a transliteration.
[FIXME: This needs some rethinking. In particular, it calls {lua|processDisplayText} on its input, which won't work
for Thai and Khmer, so we may need language-specific flags indicating whether to pass the input text directly to the
language transliterate method. In addition, I'm not sure how embedded links are handled in the existing translit code;
a lot of callers remove the links themselves before calling {lua|transliterate()}, which I assume is wrong.]
# {lua|makeSortKey}: This converts entry text (?) to a sort key. [FIXME: Clarify this.]
]=]
local export = {}
local debug_track_module = "Module:debug/track"
local etymology_languages_data_module = "Module:etymology languages/data"
local families_module = "Module:families"
local json_module = "Module:JSON"
local language_like_module = "Module:language-like"
local languages_data_module = "Module:languages/data"
local languages_data_patterns_module = "Module:languages/data/patterns"
local links_data_module = "Module:links/data"
local load_module = "Module:load"
local scripts_module = "Module:scripts"
local scripts_data_module = "Module:scripts/data"
local string_encode_entities_module = "Module:string/encode entities"
local string_pattern_escape_module = "Module:string/patternEscape"
local string_replacement_escape_module = "Module:string/replacementEscape"
local string_utilities_module = "Module:string utilities"
local table_module = "Module:table"
local utilities_module = "Module:utilities"
local wikimedia_languages_module = "Module:wikimedia languages"
local mw = mw
local string = string
local table = table
local char = string.char
local concat = table.concat
local find = string.find
local floor = math.floor
local get_by_code -- Defined below.
local get_data_module_name -- Defined below.
local get_extra_data_module_name -- Defined below.
local getmetatable = getmetatable
local gmatch = string.gmatch
local gsub = string.gsub
local insert = table.insert
local ipairs = ipairs
local is_known_language_tag = mw.language.isKnownLanguageTag
local make_object -- Defined below.
local match = string.match
local next = next
local pairs = pairs
local remove = table.remove
local require = require
local select = select
local setmetatable = setmetatable
local sub = string.sub
local type = type
local unstrip = mw.text.unstrip
-- Loaded as needed by findBestScript.
local Hans_chars
local Hant_chars
local function check_object(...)
check_object = require(utilities_module).check_object
return check_object(...)
end
local function debug_track(...)
debug_track = require(debug_track_module)
return debug_track(...)
end
local function decode_entities(...)
decode_entities = require(string_utilities_module).decode_entities
return decode_entities(...)
end
local function decode_uri(...)
decode_uri = require(string_utilities_module).decode_uri
return decode_uri(...)
end
local function deep_copy(...)
deep_copy = require(table_module).deepCopy
return deep_copy(...)
end
local function encode_entities(...)
encode_entities = require(string_encode_entities_module)
return encode_entities(...)
end
local function get_script(...)
get_script = require(scripts_module).getByCode
return get_script(...)
end
local function find_best_script_without_lang(...)
find_best_script_without_lang = require(scripts_module).findBestScriptWithoutLang
return find_best_script_without_lang(...)
end
local function get_family(...)
get_family = require(families_module).getByCode
return get_family(...)
end
local function get_plaintext(...)
get_plaintext = require(utilities_module).get_plaintext
return get_plaintext(...)
end
local function get_wikimedia_lang(...)
get_wikimedia_lang = require(wikimedia_languages_module).getByCode
return get_wikimedia_lang(...)
end
local function keys_to_list(...)
keys_to_list = require(table_module).keysToList
return keys_to_list(...)
end
local function list_to_set(...)
list_to_set = require(table_module).listToSet
return list_to_set(...)
end
local function load_data(...)
load_data = require(load_module).load_data
return load_data(...)
end
local function make_family_object(...)
make_family_object = require(families_module).makeObject
return make_family_object(...)
end
local function pattern_escape(...)
pattern_escape = require(string_pattern_escape_module)
return pattern_escape(...)
end
local function remove_duplicates(...)
remove_duplicates = require(table_module).removeDuplicates
return remove_duplicates(...)
end
local function replacement_escape(...)
replacement_escape = require(string_replacement_escape_module)
return replacement_escape(...)
end
local function safe_require(...)
safe_require = require(load_module).safe_require
return safe_require(...)
end
local function shallow_copy(...)
shallow_copy = require(table_module).shallowCopy
return shallow_copy(...)
end
local function split(...)
split = require(string_utilities_module).split
return split(...)
end
local function to_json(...)
to_json = require(json_module).toJSON
return to_json(...)
end
local function u(...)
u = require(string_utilities_module).char
return u(...)
end
local function ugsub(...)
ugsub = require(string_utilities_module).gsub
return ugsub(...)
end
local function ulen(...)
ulen = require(string_utilities_module).len
return ulen(...)
end
local function ulower(...)
ulower = require(string_utilities_module).lower
return ulower(...)
end
local function umatch(...)
umatch = require(string_utilities_module).match
return umatch(...)
end
local function uupper(...)
uupper = require(string_utilities_module).upper
return uupper(...)
end
local function track(page)
debug_track("languages/" .. page)
return true
end
local function normalize_code(code)
return load_data(languages_data_module).aliases[code] or code
end
local function check_inputs(self, check, default, ...)
local n = select("#", ...)
if n == 0 then
return false
end
local ret = check(self, (...))
if ret ~= nil then
return ret
elseif n > 1 then
local inputs = {...}
for i = 2, n do
ret = check(self, inputs[i])
if ret ~= nil then
return ret
end
end
end
return default
end
local function make_link(self, target, display)
local prefix, main
if self:getFamilyCode() == "qfa-sub" then
prefix, main = display:match("^(the )(.*)")
if not prefix then
prefix, main = display:match("^(a )(.*)")
end
end
return (prefix or "") .. "[[" .. target .. "|" .. (main or display) .. "]]"
end
-- Convert risky characters to HTML entities, which minimizes interference once returned (e.g. for "sms:a", "<!-- -->" etc.).
local function escape_risky_characters(text)
-- Spacing characters in isolation generally need to be escaped in order to be properly processed by the MediaWiki software.
if umatch(text, "^%s*$") then
return encode_entities(text, text)
end
return encode_entities(text, "!#%&*+/:;<=>?@[\\]_{|}")
end
-- Temporarily convert various formatting characters to PUA to prevent them from being disrupted by the substitution process.
local function doTempSubstitutions(text, subbedChars, keepCarets, noTrim)
-- Clone so that we don't insert any extra patterns into the table in package.loaded. For some reason, using require seems to keep memory use down; probably because the table is always cloned.
local patterns = shallow_copy(require(languages_data_patterns_module))
if keepCarets then
insert(patterns, "((\\+)%^)")
insert(patterns, "((%^))")
end
-- Ensure any whitespace at the beginning and end is temp substituted, to prevent it from being accidentally trimmed. We only want to trim any final spaces added during the substitution process (e.g. by a module), which means we only do this during the first round of temp substitutions.
if not noTrim then
insert(patterns, "^([\128-\191\244]*(%s+))")
insert(patterns, "((%s+)[\128-\191\244]*)$")
end
-- Pre-substitution, of "[[" and "]]", which makes pattern matching more accurate.
text = gsub(text, "%f[%[]%[%[", "\1")
:gsub("%f[%]]%]%]", "\2")
local i = #subbedChars
for _, pattern in ipairs(patterns) do
-- Patterns ending in \0 stand are for things like "[[" or "]]"), so the inserted PUA are treated as breaks between terms by modules that scrape info from pages.
local term_divider
pattern = gsub(pattern, "%z$", function(divider)
term_divider = divider == "\0"
return ""
end)
text = gsub(text, pattern, function(...)
local m = {...}
local m1New = m[1]
for k = 2, #m do
local n = i + k - 1
subbedChars[n] = m[k]
local byte2 = floor(n / 4096) % 64 + (term_divider and 128 or 136)
local byte3 = floor(n / 64) % 64 + 128
local byte4 = n % 64 + 128
m1New = gsub(m1New, pattern_escape(m[k]), "\244" .. char(byte2) .. char(byte3) .. char(byte4), 1)
end
i = i + #m - 1
return m1New
end)
end
text = gsub(text, "\1", "%[%[")
:gsub("\2", "%]%]")
return text, subbedChars
end
-- Reinsert any formatting that was temporarily substituted.
local function undoTempSubstitutions(text, subbedChars)
for i = 1, #subbedChars do
local byte2 = floor(i / 4096) % 64 + 128
local byte3 = floor(i / 64) % 64 + 128
local byte4 = i % 64 + 128
text = gsub(text, "\244[" .. char(byte2) .. char(byte2+8) .. "]" .. char(byte3) .. char(byte4), replacement_escape(subbedChars[i]))
end
text = gsub(text, "\1", "%[%[")
:gsub("\2", "%]%]")
return text
end
-- Check if the raw text is an unsupported title, and if so return that. Otherwise, remove HTML entities. We do the pre-conversion to avoid loading the unsupported title list unnecessarily.
local function checkNoEntities(self, text)
local textNoEnc = decode_entities(text)
if textNoEnc ~= text and load_data(links_data_module).unsupported_titles[text] then
return text
else
return textNoEnc
end
end
-- If no script object is provided (or if it's invalid or None), get one.
local function checkScript(text, self, sc)
if not check_object("script", true, sc) or sc:getCode() == "None" then
return self:findBestScript(text)
end
return sc
end
local function normalize(text, sc)
text = sc:fixDiscouragedSequences(text)
return sc:toFixedNFD(text)
end
local function doSubstitutions(self, text, sc, substitution_data, function_name, recursed)
local fail, cats = nil, {}
-- If there are language-specific substitutes given in the data module, use those.
if type(substitution_data) == "table" then
-- If a script is specified, run this function with the script-specific data before continuing.
local sc_code = sc:getCode()
if substitution_data[sc_code] then
text, fail, cats = doSubstitutions(self, text, sc, substitution_data[sc_code], function_name, true)
-- Hant, Hans and Hani are usually treated the same, so add a special case to avoid having to specify each one separately.
elseif sc_code:match("^Han") and substitution_data.Hani then
text, fail, cats = doSubstitutions(self, text, sc, substitution_data.Hani, function_name, true)
-- Substitution data with key 1 in the outer table may be given as a fallback.
elseif substitution_data[1] then
text, fail, cats = doSubstitutions(self, text, sc, substitution_data[1], function_name, true)
end
-- Iterate over all strings in the "from" subtable, and gsub with the corresponding string in "to". We work with the NFD decomposed forms, as this simplifies many substitutions.
if substitution_data.from then
for i, from in ipairs(substitution_data.from) do
-- Normalize each loop, to ensure multi-stage substitutions work correctly.
text = sc:toFixedNFD(text)
text = ugsub(text, sc:toFixedNFD(from), substitution_data.to[i] or "")
end
end
if substitution_data.remove_diacritics then
text = sc:toFixedNFD(text)
-- Convert exceptions to PUA.
local remove_exceptions, substitutes = substitution_data.remove_exceptions
if remove_exceptions then
substitutes = {}
local i = 0
for _, exception in ipairs(remove_exceptions) do
exception = sc:toFixedNFD(exception)
text = ugsub(text, exception, function(m)
i = i + 1
local subst = u(0x80000 + i)
substitutes[subst] = m
return subst
end)
end
end
-- Strip diacritics.
text = ugsub(text, "[" .. substitution_data.remove_diacritics .. "]", "")
-- Convert exceptions back.
if remove_exceptions then
text = text:gsub("\242[\128-\191]*", substitutes)
end
end
elseif type(substitution_data) == "string" then
-- If there is a dedicated function module, use that.
local module = safe_require("Module:" .. substitution_data)
if module then
-- TODO: translit functions should take objects, not codes.
-- TODO: translit functions should be called with form NFD.
if function_name == "tr" then
text, fail, cats = module[function_name](text, self._code, sc:getCode())
else
text, fail, cats = module[function_name](sc:toFixedNFD(text), self, sc)
end
-- TODO: get rid of the `fail` and `cats` return values.
if fail ~= nil then
track("fail")
track("fail/" .. self._code)
end
if cats ~= nil then
track("cats")
track("cats/" .. self._code)
end
else
error("Substitution data '" .. substitution_data .. "' does not match an existing module.")
end
end
-- Don't normalize to NFC if this is the inner loop or if a module returned nil.
if recursed or not text then
return text, fail, cats
end
-- Fix any discouraged sequences created during the substitution process, and normalize into the final form.
return sc:toFixedNFC(sc:fixDiscouragedSequences(text)), fail, cats
end
-- Split the text into sections, based on the presence of temporarily substituted formatting characters, then iterate over each one to apply substitutions. This avoids putting PUA characters through language-specific modules, which may be unequipped for them.
local function iterateSectionSubstitutions(self, text, sc, subbedChars, keepCarets, substitution_data, function_name)
local fail, cats, sections = nil, {}
-- See [[Module:languages/data]].
if not find(text, "\244") or (load_data(languages_data_module).substitution[self._code] == "cont") then
sections = {text}
else
sections = split(text, "\244[\128-\143][\128-\191]*", true)
end
for _, section in ipairs(sections) do
-- Don't bother processing empty strings or whitespace (which may also not be handled well by dedicated modules).
if gsub(section, "%s+", "") ~= "" then
local sub, sub_fail, sub_cats = doSubstitutions(self, section, sc, substitution_data, function_name)
-- Second round of temporary substitutions, in case any formatting was added by the main substitution process. However, don't do this if the section contains formatting already (as it would have had to have been escaped to reach this stage, and therefore should be given as raw text).
if sub and subbedChars then
local noSub
for _, pattern in ipairs(require(languages_data_patterns_module)) do
if match(section, pattern .. "%z?") then
noSub = true
end
end
if not noSub then
sub, subbedChars = doTempSubstitutions(sub, subbedChars, keepCarets, true)
end
end
if (not sub) or sub_fail then
text = sub
fail = sub_fail
cats = sub_cats or {}
break
end
text = sub and gsub(text, pattern_escape(section), replacement_escape(sub), 1) or text
if type(sub_cats) == "table" then
for _, cat in ipairs(sub_cats) do
insert(cats, cat)
end
end
end
end
-- Trim, unless there are only spacing characters, while ignoring any final formatting characters.
text = text and text:gsub("^([\128-\191\244]*)%s+(%S)", "%1%2")
:gsub("(%S)%s+([\128-\191\244]*)$", "%1%2")
-- Remove duplicate categories.
if #cats > 1 then
cats = remove_duplicates(cats)
end
return text, fail, cats, subbedChars
end
-- Process carets (and any escapes). Default to simple removal, if no pattern/replacement is given.
local function processCarets(text, pattern, repl)
local rep
repeat
text, rep = gsub(text, "\\\\(\\*^)", "\3%1")
until rep == 0
return text:gsub("\\^", "\4")
:gsub(pattern or "%^", repl or "")
:gsub("\3", "\\")
:gsub("\4", "^")
end
-- Remove carets if they are used to capitalize parts of transliterations (unless they have been escaped).
local function removeCarets(text, sc)
if not sc:hasCapitalization() and sc:isTransliterated() and text:find("^", 1, true) then
return processCarets(text)
else
return text
end
end
local Language = {}
--[==[Returns the language code of the language. Example: {{code|lua|"fr"}} for French.]==]
function Language:getCode()
return self._code
end
--[==[Returns the canonical name of the language. This is the name used to represent that language on Wiktionary, and is guaranteed to be unique to that language alone. Example: {{code|lua|"French"}} for French.]==]
function Language:getCanonicalName()
local name = self._name
if name == nil then
name = self._data[1]
self._name = name
end
return name
end
--[==[
Return the display form of the language. The display form of a language, family or script is the form it takes when
appearing as the <code><var>source</var></code> in categories such as <code>English terms derived from
<var>source</var></code> or <code>English given names from <var>source</var></code>, and is also the displayed text
in {makeCategoryLink()} links. For full and etymology-only languages, this is the same as the canonical name, but
for families, it reads <code>"<var>name</var> languages"</code> (e.g. {"Indo-Iranian languages"}), and for scripts,
it reads <code>"<var>name</var> script"</code> (e.g. {"Arabic script"}).
]==]
function Language:getDisplayForm()
local form = self._displayForm
if form == nil then
form = self:getCanonicalName()
-- Add article and " substrate" to substrates that lack them.
if self:getFamilyCode() == "qfa-sub" then
if not (sub(form, 1, 4) == "the " or sub(form, 1, 2) == "a ") then
form = "a " .. form
end
if not match(form, " [Ss]ubstrate") then
form = form .. " substrate"
end
end
self._displayForm = form
end
return form
end
--[==[Returns the value which should be used in the HTML lang= attribute for tagged text in the language.]==]
function Language:getHTMLAttribute(sc, region)
local code = self._code
if not find(code, "-", 1, true) then
return code .. "-" .. sc:getCode() .. (region and "-" .. region or "")
end
local parent = self:getParent()
region = region or match(code, "%f[%u][%u-]+%f[%U]")
if parent then
return parent:getHTMLAttribute(sc, region)
end
-- TODO: ISO family codes can also be used.
return "mis-" .. sc:getCode() .. (region and "-" .. region or "")
end
--[==[Returns a table of the aliases that the language is known by, excluding the canonical name. Aliases are synonyms for the language in question. The names are not guaranteed to be unique, in that sometimes more than one language is known by the same name. Example: {{code|lua|{"High German", "New High German", "Deutsch"} }} for [[:Category:German language|German]].]==]
function Language:getAliases()
self:loadInExtraData()
return require(language_like_module).getAliases(self)
end
--[==[
Return a table of the known subvarieties of a given language, excluding subvarieties that have been given
explicit etymology-only language codes. The names are not guaranteed to be unique, in that sometimes a given name
refers to a subvariety of more than one language. Example: {{code|lua|{"Southern Aymara", "Central Aymara"} }} for
[[:Category:Aymara language|Aymara]]. Note that the returned value can have nested tables in it, when a subvariety
goes by more than one name. Example: {{code|lua|{"North Azerbaijani", "South Azerbaijani", {"Afshar", "Afshari",
"Afshar Azerbaijani", "Afchar"}, {"Qashqa'i", "Qashqai", "Kashkay"}, "Sonqor"} }} for
[[:Category:Azerbaijani language|Azerbaijani]]. Here, for example, Afshar, Afshari, Afshar Azerbaijani and Afchar
all refer to the same subvariety, whose preferred name is Afshar (the one listed first). To avoid a return value
with nested tables in it, specify a non-{{code|lua|nil}} value for the <code>flatten</code> parameter; in that case,
the return value would be {{code|lua|{"North Azerbaijani", "South Azerbaijani", "Afshar", "Afshari",
"Afshar Azerbaijani", "Afchar", "Qashqa'i", "Qashqai", "Kashkay", "Sonqor"} }}.
]==]
function Language:getVarieties(flatten)
self:loadInExtraData()
return require(language_like_module).getVarieties(self, flatten)
end
--[==[Returns a table of the "other names" that the language is known by, which are listed in the <code>otherNames</code> field. It should be noted that the <code>otherNames</code> field itself is deprecated, and entries listed there should eventually be moved to either <code>aliases</code> or <code>varieties</code>.]==]
function Language:getOtherNames() -- To be eventually removed, once there are no more uses of the `otherNames` field.
self:loadInExtraData()
return require(language_like_module).getOtherNames(self)
end
--[==[
Return a combined table of the canonical name, aliases, varieties and other names of a given language.]==]
function Language:getAllNames()
self:loadInExtraData()
return require(language_like_module).getAllNames(self)
end
--[==[Returns a table of types as a lookup table (with the types as keys).
The possible types are
* {language}: This is a language, either full or etymology-only.
* {full}: This is a "full" (not etymology-only) language, i.e. the union of {regular}, {reconstructed} and
{appendix-constructed}. Note that the types {full} and {etymology-only} also exist for families, so if you
want to check specifically for a full language and you have an object that might be a family, you should
use {{lua|hasType("language", "full")}} and not simply {{lua|hasType("full")}}.
* {etymology-only}: This is an etymology-only (not full) language, whose parent is another etymology-only
language or a full language. Note that the types {full} and {etymology-only} also exist for
families, so if you want to check specifically for an etymology-only language and you have an
object that might be a family, you should use {{lua|hasType("language", "etymology-only")}}
and not simply {{lua|hasType("etymology-only")}}.
* {regular}: This indicates a full language that is attested according to [[WT:CFI]] and therefore permitted
in the main namespace. There may also be reconstructed terms for the language, which are placed in
the {Reconstruction} namespace and must be prefixed with * to indicate a reconstruction. Most full
languages are natural (not constructed) languages, but a few constructed languages (e.g. Esperanto
and Volapük, among others) are also allowed in the mainspace and considered regular languages.
* {reconstructed}: This language is not attested according to [[WT:CFI]], and therefore is allowed only in the
{Reconstruction} namespace. All terms in this language are reconstructed, and must be prefixed
with *. Languages such as Proto-Indo-European and Proto-Germanic are in this category.
* {appendix-constructed}: This language is attested but does not meet the additional requirements set out for
constructed languages ([[WT:CFI#Constructed languages]]). Its entries must therefore
be in the Appendix namespace, but they are not reconstructed and therefore should
not have * prefixed in links.
]==]
function Language:getTypes()
local types = self._types
if types == nil then
types = {language = true}
if self:getFullCode() == self._code then
types.full = true
else
types["etymology-only"] = true
end
for t in gmatch(self._data.type, "[^,]+") do
types[t] = true
end
self._types = types
end
return types
end
--[==[Given a list of types as strings, returns true if the language has all of them.]==]
function Language:hasType(...)
Language.hasType = require(language_like_module).hasType
return self:hasType(...)
end
--[==[Returns a table containing <code>WikimediaLanguage</code> objects (see [[Module:wikimedia languages]]), which represent languages and their codes as they are used in Wikimedia projects for interwiki linking and such. More than one object may be returned, as a single Wiktionary language may correspond to multiple Wikimedia languages. For example, Wiktionary's single code <code>sh</code> (Serbo-Croatian) maps to four Wikimedia codes: <code>sh</code> (Serbo-Croatian), <code>bs</code> (Bosnian), <code>hr</code> (Croatian) and <code>sr</code> (Serbian).
The code for the Wikimedia language is retrieved from the <code>wikimedia_codes</code> property in the data modules. If that property is not present, the code of the current language is used. If none of the available codes is actually a valid Wikimedia code, an empty table is returned.]==]
function Language:getWikimediaLanguages()
local wm_langs = self._wikimediaLanguageObjects
if wm_langs == nil then
local codes = self:getWikimediaLanguageCodes()
wm_langs = {}
for i = 1, #codes do
wm_langs[i] = get_wikimedia_lang(codes[i])
end
self._wikimediaLanguageObjects = wm_langs
end
return wm_langs
end
function Language:getWikimediaLanguageCodes()
local wm_langs = self._wikimediaLanguageCodes
if wm_langs == nil then
wm_langs = self._data.wikimedia_codes
if wm_langs then
wm_langs = split(wm_langs, ",", true, true)
else
local code = self._code
if is_known_language_tag(code) then
wm_langs = {code}
else
-- Inherit, but only if no codes are specified in the data *and*
-- the language code isn't a valid Wikimedia language code.
local parent = self:getParent()
wm_langs = parent and parent:getWikimediaLanguageCodes() or {}
end
end
self._wikimediaLanguageCodes = wm_langs
end
return wm_langs
end
--[==[
Returns the name of the Wikipedia article for the language. `project` specifies the language and project to retrieve
the article from, defaulting to {"enwiki"} for the English Wikipedia. Normally if specified it should be the project
code for a specific-language Wikipedia e.g. "zhwiki" for the Chinese Wikipedia, but it can be any project, including
non-Wikipedia ones. If the project is the English Wikipedia and the property {wikipedia_article} is present in the data
module it will be used first. In all other cases, a sitelink will be generated from {:getWikidataItem} (if set). The
resulting value (or lack of value) is cached so that subsequent calls are fast. If no value could be determined, and
`noCategoryFallback` is {false}, {:getCategoryName} is used as fallback; otherwise, {nil} is returned. Note that if
`noCategoryFallback` is {nil} or omitted, it defaults to {false} if the project is the English Wikipedia, otherwise
to {true}. In other words, under normal circumstances, if the English Wikipedia article couldn't be retrieved, the
return value will fall back to a link to the language's category, but this won't normally happen for any other project.
]==]
function Language:getWikipediaArticle(noCategoryFallback, project)
Language.getWikipediaArticle = require(language_like_module).getWikipediaArticle
return self:getWikipediaArticle(noCategoryFallback, project)
end
function Language:makeWikipediaLink()
return make_link(self, "w:" .. self:getWikipediaArticle(), self:getCanonicalName())
end
--[==[Returns the name of the Wikimedia Commons category page for the language.]==]
function Language:getCommonsCategory()
Language.getCommonsCategory = require(language_like_module).getCommonsCategory
return self:getCommonsCategory()
end
--[==[Returns the Wikidata item id for the language or <code>nil</code>. This corresponds to the the second field in the data modules.]==]
function Language:getWikidataItem()
Language.getWikidataItem = require(language_like_module).getWikidataItem
return self:getWikidataItem()
end
--[==[Returns a table of <code>Script</code> objects for all scripts that the language is written in. See [[Module:scripts]].]==]
function Language:getScripts()
local scripts = self._scriptObjects
if scripts == nil then
local codes = self:getScriptCodes()
if codes[1] == "All" then
scripts = load_data(scripts_data_module)
else
scripts = {}
for i = 1, #codes do
scripts[i] = get_script(codes[i])
end
end
self._scriptObjects = scripts
end
return scripts
end
--[==[Returns the table of script codes in the language's data file.]==]
function Language:getScriptCodes()
local scripts = self._scriptCodes
if scripts == nil then
scripts = self._data[4]
if scripts then
local codes, n = {}, 0
for code in gmatch(scripts, "[^,]+") do
n = n + 1
-- Special handling of "Hants", which represents "Hani", "Hant" and "Hans" collectively.
if code == "Hants" then
codes[n] = "Hani"
codes[n + 1] = "Hant"
codes[n + 2] = "Hans"
n = n + 2
else
codes[n] = code
end
end
scripts = codes
else
scripts = {"None"}
end
self._scriptCodes = scripts
end
return scripts
end
--[==[Given some text, this function iterates through the scripts of a given language and tries to find the script that best matches the text. It returns a {{code|lua|Script}} object representing the script. If no match is found at all, it returns the {{code|lua|None}} script object.]==]
function Language:findBestScript(text, forceDetect)
if not text or text == "" or text == "-" then
return get_script("None")
end
-- Differs from table returned by getScriptCodes, as Hants is not normalized into its constituents.
local codes = self._bestScriptCodes
if codes == nil then
codes = self._data[4]
codes = codes and split(codes, ",", true, true) or {"None"}
self._bestScriptCodes = codes
end
local first_sc = codes[1]
if first_sc == "All" then
return find_best_script_without_lang(text)
end
local codes_len = #codes
if not (forceDetect or first_sc == "Hants" or codes_len > 1) then
first_sc = get_script(first_sc)
local charset = first_sc.characters
return charset and umatch(text, "[" .. charset .. "]") and first_sc or get_script("None")
end
-- Remove all formatting characters.
text = get_plaintext(text)
-- Remove all spaces and any ASCII punctuation. Some non-ASCII punctuation is script-specific, so can't be removed.
text = ugsub(text, "[%s!\"#%%&'()*,%-./:;?@[\\%]_{}]+", "")
if #text == 0 then
return get_script("None")
end
-- Try to match every script against the text,
-- and return the one with the most matching characters.
local bestcount, bestscript, length = 0
for i = 1, codes_len do
local sc = codes[i]
-- Special case for "Hants", which is a special code that represents whichever of "Hant" or "Hans" best matches, or "Hani" if they match equally. This avoids having to list all three. In addition, "Hants" will be treated as the best match if there is at least one matching character, under the assumption that a Han script is desirable in terms that contain a mix of Han and other scripts (not counting those which use Jpan or Kore).
if sc == "Hants" then
local Hani = get_script("Hani")
if not Hant_chars then
Hant_chars = load_data("Module:zh/data/ts")
Hans_chars = load_data("Module:zh/data/st")
end
local t, s, found = 0, 0
-- This is faster than using mw.ustring.gmatch directly.
for ch in gmatch(ugsub(text, "[" .. Hani.characters .. "]", "\255%0"), "\255(.[\128-\191]*)") do
found = true
if Hant_chars[ch] then
t = t + 1
if Hans_chars[ch] then
s = s + 1
end
elseif Hans_chars[ch] then
s = s + 1
else
t, s = t + 1, s + 1
end
end
if found then
if t == s then
return Hani
end
return get_script(t > s and "Hant" or "Hans")
end
else
sc = get_script(sc)
if not length then
length = ulen(text)
end
-- Count characters by removing everything in the script's charset and comparing to the original length.
local charset = sc.characters
local count = charset and length - ulen(ugsub(text, "[" .. charset .. "]+", "")) or 0
if count >= length then
return sc
elseif count > bestcount then
bestcount = count
bestscript = sc
end
end
end
-- Return best matching script, or otherwise None.
return bestscript or get_script("None")
end
--[==[Returns a <code>Family</code> object for the language family that the language belongs to. See [[Module:families]].]==]
function Language:getFamily()
local family = self._familyObject
if family == nil then
family = self:getFamilyCode()
-- If the value is nil, it's cached as false.
family = family and get_family(family) or false
self._familyObject = family
end
return family or nil
end
--[==[Returns the family code in the language's data file.]==]
function Language:getFamilyCode()
local family = self._familyCode
if family == nil then
-- If the value is nil, it's cached as false.
family = self._data[3] or false
self._familyCode = family
end
return family or nil
end
function Language:getFamilyName()
local family = self._familyName
if family == nil then
family = self:getFamily()
-- If the value is nil, it's cached as false.
family = family and family:getCanonicalName() or false
self._familyName = family
end
return family or nil
end
do
local function check_family(self, family)
if type(family) == "table" then
family = family:getCode()
end
if self:getFamilyCode() == family then
return true
end
local self_family = self:getFamily()
if self_family:inFamily(family) then
return true
-- If the family isn't a real family (e.g. creoles) check any ancestors.
elseif self_family:inFamily("qfa-not") then
local ancestors = self:getAncestors()
for _, ancestor in ipairs(ancestors) do
if ancestor:inFamily(family) then
return true
end
end
end
end
--[==[Check whether the language belongs to `family` (which can be a family code or object). A list of objects can be given in place of `family`; in that case, return true if the language belongs to any of the specified families. Note that some languages (in particular, certain creoles) can have multiple immediate ancestors potentially belonging to different families; in that case, return true if the language belongs to any of the specified families.]==]
function Language:inFamily(...)
if self:getFamilyCode() == nil then
return false
end
return check_inputs(self, check_family, false, ...)
end
end
function Language:getParent()
local parent = self._parentObject
if parent == nil then
parent = self:getParentCode()
-- If the value is nil, it's cached as false.
parent = parent and get_by_code(parent, nil, true, true) or false
self._parentObject = parent
end
return parent or nil
end
function Language:getParentCode()
local parent = self._parentCode
if parent == nil then
-- If the value is nil, it's cached as false.
parent = self._data.parent or false
self._parentCode = parent
end
return parent or nil
end
function Language:getParentName()
local parent = self._parentName
if parent == nil then
parent = self:getParent()
-- If the value is nil, it's cached as false.
parent = parent and parent:getCanonicalName() or false
self._parentName = parent
end
return parent or nil
end
function Language:getParentChain()
local chain = self._parentChain
if chain == nil then
chain = {}
local parent, n = self:getParent(), 0
while parent do
n = n + 1
chain[n] = parent
parent = parent:getParent()
end
self._parentChain = chain
end
return chain
end
do
local function check_lang(self, lang)
for _, parent in ipairs(self:getParentChain()) do
if (type(lang) == "string" and lang or lang:getCode()) == parent:getCode() then
return true
end
end
end
function Language:hasParent(...)
return check_inputs(self, check_lang, false, ...)
end
end
--[==[
If the language is etymology-only, this iterates through parents until a full language or family is found, and the
corresponding object is returned. If the language is a full language, then it simply returns itself.
]==]
function Language:getFull()
local full = self._fullObject
if full == nil then
full = self:getFullCode()
full = full == self._code and self or get_by_code(full)
self._fullObject = full
end
return full
end
--[==[
If the language is an etymology-only language, this iterates through parents until a full language or family is
found, and the corresponding code is returned. If the language is a full language, then it simply returns the
language code.
]==]
function Language:getFullCode()
return self._fullCode or self._code
end
--[==[
If the language is an etymology-only language, this iterates through parents until a full language or family is
found, and the corresponding canonical name is returned. If the language is a full language, then it simply returns
the canonical name of the language.
]==]
function Language:getFullName()
local full = self._fullName
if full == nil then
full = self:getFull():getCanonicalName()
self._fullName = full
end
return full
end
--[==[Returns a table of <code class="nf">Language</code> objects for all languages that this language is directly descended from. Generally this is only a single language, but creoles, pidgins and mixed languages can have multiple ancestors.]==]
function Language:getAncestors()
local ancestors = self._ancestorObjects
if ancestors == nil then
ancestors = {}
local ancestor_codes = self:getAncestorCodes()
if #ancestor_codes > 0 then
for _, ancestor in ipairs(ancestor_codes) do
insert(ancestors, get_by_code(ancestor, nil, true))
end
else
local fam = self:getFamily()
local protoLang = fam and fam:getProtoLanguage() or nil
-- For the cases where the current language is the proto-language
-- of its family, or an etymology-only language that is ancestral to that
-- proto-language, we need to step up a level higher right from the
-- start.
if protoLang and (
protoLang:getCode() == self._code or
(self:hasType("etymology-only") and protoLang:hasAncestor(self))
) then
fam = fam:getFamily()
protoLang = fam and fam:getProtoLanguage() or nil
end
while not protoLang and not (not fam or fam:getCode() == "qfa-not") do
fam = fam:getFamily()
protoLang = fam and fam:getProtoLanguage() or nil
end
insert(ancestors, protoLang)
end
self._ancestorObjects = ancestors
end
return ancestors
end
do
-- Avoid a language being its own ancestor via class inheritance. We only need to check for this if the language has inherited an ancestor table from its parent, because we never want to drop ancestors that have been explicitly set in the data.
-- Recursively iterate over ancestors until we either find self or run out. If self is found, return true.
local function check_ancestor(self, lang)
local codes = lang:getAncestorCodes()
if not codes then
return nil
end
for i = 1, #codes do
local code = codes[i]
if code == self._code then
return true
end
local anc = get_by_code(code, nil, true)
if check_ancestor(self, anc) then
return true
end
end
end
--[==[Returns a table of <code class="nf">Language</code> codes for all languages that this language is directly descended from. Generally this is only a single language, but creoles, pidgins and mixed languages can have multiple ancestors.]==]
function Language:getAncestorCodes()
if self._ancestorCodes then
return self._ancestorCodes
end
local data = self._data
local codes = data.ancestors
if codes == nil then
codes = {}
self._ancestorCodes = codes
return codes
end
codes = split(codes, ",", true, true)
self._ancestorCodes = codes
-- If there are no codes or the ancestors weren't inherited data, there's nothing left to check.
if #codes == 0 or self:getData(false, "raw").ancestors ~= nil then
return codes
end
local i, code = 1
while i <= #codes do
code = codes[i]
if check_ancestor(self, self) then
remove(codes, i)
else
i = i + 1
end
end
return codes
end
end
--[==[Given a list of language objects or codes, returns true if at least one of them is an ancestor. This includes any etymology-only children of that ancestor. If the language's ancestor(s) are etymology-only languages, it will also return true for those language parent(s) (e.g. if Vulgar Latin is the ancestor, it will also return true for its parent, Latin). However, a parent is excluded from this if the ancestor is also ancestral to that parent (e.g. if Classical Persian is the ancestor, Persian would return false, because Classical Persian is also ancestral to Persian).]==]
function Language:hasAncestor(...)
local function iterateOverAncestorTree(node, func, parent_check)
local ancestors = node:getAncestors()
local ancestorsParents = {}
for _, ancestor in ipairs(ancestors) do
local ret = func(ancestor) or iterateOverAncestorTree(ancestor, func, parent_check)
if ret then
return ret
end
end
-- Check the parents of any ancestors. We don't do this if checking the parents of the other language, so that we exclude any etymology-only children of those parents that are not directly related (e.g. if the ancestor is Vulgar Latin and we are checking New Latin, we want it to return false because they are on different ancestral branches. As such, if we're already checking the parent of New Latin (Latin) we don't want to compare it to the parent of the ancestor (Latin), as this would be a false positive; it should be one or the other).
if not parent_check then
return nil
end
for _, ancestor in ipairs(ancestors) do
local ancestorParents = ancestor:getParentChain()
for _, ancestorParent in ipairs(ancestorParents) do
if ancestorParent:getCode() == self._code or ancestorParent:hasAncestor(ancestor) then
break
else
insert(ancestorsParents, ancestorParent)
end
end
end
for _, ancestorParent in ipairs(ancestorsParents) do
local ret = func(ancestorParent)
if ret then
return ret
end
end
end
local function do_iteration(otherlang, parent_check)
-- otherlang can't be self
if (type(otherlang) == "string" and otherlang or otherlang:getCode()) == self._code then
return false
end
repeat
if iterateOverAncestorTree(
self,
function(ancestor)
return ancestor:getCode() == (type(otherlang) == "string" and otherlang or otherlang:getCode())
end,
parent_check
) then
return true
elseif type(otherlang) == "string" then
otherlang = get_by_code(otherlang, nil, true)
end
otherlang = otherlang:getParent()
parent_check = false
until not otherlang
end
local parent_check = true
for _, otherlang in ipairs{...} do
local ret = do_iteration(otherlang, parent_check)
if ret then
return true
end
end
return false
end
do
local function construct_node(lang, memo)
local branch, ancestors = {lang = lang:getCode()}
memo[lang:getCode()] = branch
for _, ancestor in ipairs(lang:getAncestors()) do
if ancestors == nil then
ancestors = {}
end
insert(ancestors, memo[ancestor:getCode()] or construct_node(ancestor, memo))
end
branch.ancestors = ancestors
return branch
end
function Language:getAncestorChain()
local chain = self._ancestorChain
if chain == nil then
chain = construct_node(self, {})
self._ancestorChain = chain
end
return chain
end
end
function Language:getAncestorChainOld()
local chain = self._ancestorChain
if chain == nil then
chain = {}
local step = self
while true do
local ancestors = step:getAncestors()
step = #ancestors == 1 and ancestors[1] or nil
if not step then
break
end
insert(chain, step)
end
self._ancestorChain = chain
end
return chain
end
local function fetch_descendants(self, fmt)
local descendants, family = {}, self:getFamily()
-- Iterate over all three datasets.
for _, data in ipairs{
require("Module:languages/code to canonical name"),
require("Module:etymology languages/code to canonical name"),
require("Module:families/code to canonical name"),
} do
for code in pairs(data) do
local lang = get_by_code(code, nil, true, true)
-- Test for a descendant. Earlier tests weed out most candidates, while the more intensive tests are only used sparingly.
if (
code ~= self._code and -- Not self.
lang:inFamily(family) and -- In the same family.
(
family:getProtoLanguageCode() == self._code or -- Self is the protolanguage.
self:hasDescendant(lang) or -- Full hasDescendant check.
(lang:getFullCode() == self._code and not self:hasAncestor(lang)) -- Etymology-only child which isn't an ancestor.
)
) then
if fmt == "object" then
insert(descendants, lang)
elseif fmt == "code" then
insert(descendants, code)
elseif fmt == "name" then
insert(descendants, lang:getCanonicalName())
end
end
end
end
return descendants
end
function Language:getDescendants()
local descendants = self._descendantObjects
if descendants == nil then
descendants = fetch_descendants(self, "object")
self._descendantObjects = descendants
end
return descendants
end
function Language:getDescendantCodes()
local descendants = self._descendantCodes
if descendants == nil then
descendants = fetch_descendants(self, "code")
self._descendantCodes = descendants
end
return descendants
end
function Language:getDescendantNames()
local descendants = self._descendantNames
if descendants == nil then
descendants = fetch_descendants(self, "name")
self._descendantNames = descendants
end
return descendants
end
do
local function check_lang(self, lang)
if type(lang) == "string" then
lang = get_by_code(lang, nil, true)
end
if lang:hasAncestor(self) then
return true
end
end
function Language:hasDescendant(...)
return check_inputs(self, check_lang, false, ...)
end
end
local function fetch_children(self, fmt)
local m_etym_data = require(etymology_languages_data_module)
local self_code, children = self._code, {}
for code, lang in pairs(m_etym_data) do
local _lang = lang
repeat
local parent = _lang.parent
if parent == self_code then
if fmt == "object" then
insert(children, get_by_code(code, nil, true))
elseif fmt == "code" then
insert(children, code)
elseif fmt == "name" then
insert(children, lang[1])
end
break
end
_lang = m_etym_data[parent]
until not _lang
end
return children
end
function Language:getChildren()
local children = self._childObjects
if children == nil then
children = fetch_children(self, "object")
self._childObjects = children
end
return children
end
function Language:getChildrenCodes()
local children = self._childCodes
if children == nil then
children = fetch_children(self, "code")
self._childCodes = children
end
return children
end
function Language:getChildrenNames()
local children = self._childNames
if children == nil then
children = fetch_children(self, "name")
self._childNames = children
end
return children
end
function Language:hasChild(...)
local lang = ...
if not lang then
return false
elseif type(lang) == "string" then
lang = get_by_code(lang, nil, true)
end
if lang:hasParent(self) then
return true
end
return self:hasChild(select(2, ...))
end
--[==[Returns the name of the main category of that language. Example: {{code|lua|"French language"}} for French, whose category is at [[:Category:French language]]. Unless optional argument <code>nocap</code> is given, the language name at the beginning of the returned value will be capitalized. This capitalization is correct for category names, but not if the language name is lowercase and the returned value of this function is used in the middle of a sentence.]==]
function Language:getCategoryName(nocap)
local name = self._categoryName
if name == nil then
name = self:getCanonicalName()
-- If a substrate, omit any leading article.
if self:getFamilyCode() == "qfa-sub" then
name = name:gsub("^ ", ""):gsub("^ ", "")
end
-- Only add " language" if a full language.
if self:hasType("full") then
-- Unless the canonical name already ends with "language", "lect" or their derivatives, add " language".
if not (match(name, "[Rr]eo$") or match(name, "[Ll]ect$")) then
name = "Reo" .. name
end
end
self._categoryName = name
end
if nocap then
return name
end
return mw.getContentLanguage():ucfirst(name)
end
--[==[Creates a link to the category; the link text is the canonical name.]==]
function Language:makeCategoryLink()
return make_link(self, ":Category:" .. self:getCategoryName(), self:getDisplayForm())
end
function Language:getStandardCharacters(sc)
local standard_chars = self._data.standardChars
if type(standard_chars) ~= "table" then
return standard_chars
elseif sc and type(sc) ~= "string" then
check_object("script", nil, sc)
sc = sc:getCode()
end
if (not sc) or sc == "None" then
local scripts = {}
for _, script in pairs(standard_chars) do
insert(scripts, script)
end
return concat(scripts)
end
if standard_chars[sc] then
return standard_chars[sc] .. (standard_chars[1] or "")
end
end
--[==[Make the entry name (i.e. the correct page name).]==]
function Language:makeEntryName(text, sc)
if (not text) or text == "" then
return text, nil, {}
end
-- Set `unsupported` as true if certain conditions are met.
local unsupported
-- Check if there's an unsupported character. \239\191\189 is the replacement character U+FFFD, which can't be typed directly here due to an abuse filter. Unix-style dot-slash notation is also unsupported, as it is used for relative paths in links, as are 3 or more consecutive tildes.
-- Note: match is faster with magic characters/charsets; find is faster with plaintext.
if (
match(text, "[#<>%[%]_{|}]") or
find(text, "\239\191\189") or
match(text, "%f[^%z/]%.%.?%f[%z/]") or
find(text, "~~~")
) then
unsupported = true
-- If it looks like an interwiki link.
elseif find(text, ":") then
local prefix = gsub(text, "^:*(.-):.*", ulower)
if (
load_data("Module:data/namespaces")[prefix] or
load_data("Module:data/interwikis")[prefix]
) then
unsupported = true
end
end
-- Check if the text is a listed unsupported title.
local unsupportedTitles = load_data(links_data_module).unsupported_titles
if unsupportedTitles[text] then
return "Unsupported titles/" .. unsupportedTitles[text], nil, {}
end
sc = checkScript(text, self, sc)
local fail, cats
text = normalize(text, sc)
text, fail, cats = iterateSectionSubstitutions(self, text, sc, nil, nil, self._data.entry_name, "makeEntryName")
text = umatch(text, "^[¿¡]?(.-[^%s%p].-)%s*[؟?!;՛՜ ՞ ՟?!︖︕।॥။၊་།]?$") or text
-- Escape unsupported characters so they can be used in titles. ` is used as a delimiter for this, so a raw use of it in an unsupported title is also escaped here to prevent interference; this is only done with unsupported titles, though, so inclusion won't in itself mean a title is treated as unsupported (which is why it's excluded from the earlier test).
if unsupported then
local unsupported_characters = load_data(links_data_module).unsupported_characters
text = text:gsub("[#<>%[%]_`{|}\239]\191?\189?", unsupported_characters)
:gsub("%f[^%z/]%.%.?%f[%z/]", function(m)
return gsub(m, "%.", "`period`")
end)
:gsub("~~~+", function(m)
return gsub(m, "~", "`tilde`")
end)
text = "Unsupported titles/" .. text
end
return text, fail, cats
end
--[==[Generates alternative forms using a specified method, and returns them as a table. If no method is specified, returns a table containing only the input term.]==]
function Language:generateForms(text, sc)
local generate_forms = self._data.generate_forms
if generate_forms == nil then
return {text}
end
sc = checkScript(text, self, sc)
return require("Module:" .. self._data.generate_forms).generateForms(text, self, sc)
end
--[==[Creates a sort key for the given entry name, following the rules appropriate for the language. This removes diacritical marks from the entry name if they are not considered significant for sorting, and may perform some other changes. Any initial hyphen is also removed, and anything parentheses is removed as well.
The <code>sort_key</code> setting for each language in the data modules defines the replacements made by this function, or it gives the name of the module that takes the entry name and returns a sortkey.]==]
function Language:makeSortKey(text, sc)
if (not text) or text == "" then
return text, nil, {}
end
if match(text, "<[^<>]+>") then
track("track HTML tag")
end
-- Remove directional characters, soft hyphens, strip markers and HTML tags.
text = ugsub(text, "[\194\173\226\128\170-\226\128\174\226\129\166-\226\129\169]", "")
text = gsub(unstrip(text), "<[^<>]+>", "")
text = decode_uri(text, "PATH")
text = checkNoEntities(self, text)
-- Remove initial hyphens and * unless the term only consists of spacing + punctuation characters.
text = ugsub(text, "^([-]*)[-־ـ᠊*]+([-]*)(.*[^%s%p].*)", "%1%2%3")
sc = checkScript(text, self, sc)
text = normalize(text, sc)
text = removeCarets(text, sc)
-- For languages with dotted dotless i, ensure that "İ" is sorted as "i", and "I" is sorted as "ı".
if self:hasDottedDotlessI() then
text = gsub(text, "I\204\135", "i") -- decomposed "İ"
:gsub("I", "ı")
text = sc:toFixedNFD(text)
end
-- Convert to lowercase, make the sortkey, then convert to uppercase. Where the language has dotted dotless i, it is usually not necessary to convert "i" to "İ" and "ı" to "I" first, because "I" will always be interpreted as conventional "I" (not dotless "İ") by any sorting algorithms, which will have been taken into account by the sortkey substitutions themselves. However, if no sortkey substitutions have been specified, then conversion is necessary so as to prevent "i" and "ı" both being sorted as "I".
-- An exception is made for scripts that (sometimes) sort by scraping page content, as that means they are sensitive to changes in capitalization (as it changes the target page).
local fail, cats
if not sc:sortByScraping() then
text = ulower(text)
end
local sort_key = self._data.sort_key
text, fail, cats = iterateSectionSubstitutions(self, text, sc, nil, nil, sort_key, "makeSortKey")
if not sc:sortByScraping() then
if self:hasDottedDotlessI() and not sort_key then
text = gsub(gsub(text, "ı", "I"), "i", "İ")
text = sc:toFixedNFC(text)
end
text = uupper(text)
end
-- Remove parentheses, as long as they are either preceded or followed by something.
text = gsub(text, "(.)[()]+", "%1")
:gsub("[()]+(.)", "%1")
text = escape_risky_characters(text)
return text, fail, cats
end
--[==[Create the form used as as a basis for display text and transliteration.]==]
local function processDisplayText(text, self, sc, keepCarets, keepPrefixes)
local subbedChars = {}
text, subbedChars = doTempSubstitutions(text, subbedChars, keepCarets)
text = decode_uri(text, "PATH")
text = checkNoEntities(self, text)
sc = checkScript(text, self, sc)
local fail, cats
text = normalize(text, sc)
text, fail, cats, subbedChars = iterateSectionSubstitutions(self, text, sc, subbedChars, keepCarets, self._data.display_text, "makeDisplayText")
text = removeCarets(text, sc)
-- Remove any interwiki link prefixes (unless they have been escaped or this has been disabled).
if find(text, ":") and not keepPrefixes then
local rep
repeat
text, rep = gsub(text, "\\\\(\\*:)", "\3%1")
until rep == 0
text = gsub(text, "\\:", "\4")
while true do
local prefix = gsub(text, "^(.-):.+", function(m1)
return gsub(m1, "\244[\128-\191]*", "")
end)
-- Check if the prefix is an interwiki, though ignore capitalised Wiktionary:, which is a namespace.
if not prefix or prefix == text or prefix == "Wiktionary"
or not (load_data("Module:data/interwikis")[ulower(prefix)] or prefix == "") then
break
end
text = gsub(text, "^(.-):(.*)", function(m1, m2)
local ret = {}
for subbedChar in gmatch(m1, "\244[\128-\191]*") do
insert(ret, subbedChar)
end
return concat(ret) .. m2
end)
end
text = gsub(text, "\3", "\\")
:gsub("\4", ":")
end
return text, fail, cats, subbedChars
end
--[==[Make the display text (i.e. what is displayed on the page).]==]
function Language:makeDisplayText(text, sc, keepPrefixes)
if (not text) or text == "" then
return text, nil, {}
end
local fail, cats, subbedChars
text, fail, cats, subbedChars = processDisplayText(text, self, sc, nil, keepPrefixes)
text = escape_risky_characters(text)
return undoTempSubstitutions(text, subbedChars), fail, cats
end
--[==[Transliterates the text from the given script into the Latin script (see [[Wiktionary:Transliteration and romanization]]). The language must have the <code>translit</code> property for this to work; if it is not present, {{code|lua|nil}} is returned.
Returns three values:
# The transliteration.
# A boolean which indicates whether the transliteration failed for an unexpected reason. If {{code|lua|false}}, then the transliteration either succeeded, or the module is returning nothing in a controlled way (e.g. the input was {{code|lua|"-"}}). Generally, this means that no maintenance action is required. If {{code|lua|true}}, then the transliteration is {{code|lua|nil}} because either the input or output was defective in some way (e.g. [[Module:ar-translit]] will not transliterate non-vocalised inputs, and this module will fail partially-completed transliterations in all languages). Note that this value can be manually set by the transliteration module, so make sure to cross-check to ensure it is accurate.
# A table of categories selected by the transliteration module, which should be in the format expected by {{code|lua|format_categories}} in [[Module:utilities]].
The <code>sc</code> parameter is handled by the transliteration module, and how it is handled is specific to that module. Some transliteration modules may tolerate {{code|lua|nil}} as the script, others require it to be one of the possible scripts that the module can transliterate, and will show an error if it's not one of them. For this reason, the <code>sc</code> parameter should always be provided when writing non-language-specific code.
The <code>module_override</code> parameter is used to override the default module that is used to provide the transliteration. This is useful in cases where you need to demonstrate a particular module in use, but there is no default module yet, or you want to demonstrate an alternative version of a transliteration module before making it official. It should not be used in real modules or templates, only for testing. All uses of this parameter are tracked by [[Wiktionary:Tracking/languages/module_override]].
'''Known bugs''':
* This function assumes {tr(s1) .. tr(s2) == tr(s1 .. s2)}. When this assertion fails, wikitext markups like <nowiki>'''</nowiki> can cause wrong transliterations.
* HTML entities like <code>&apos;</code>, often used to escape wikitext markups, do not work.]==]
function Language:transliterate(text, sc, module_override)
-- If there is no text, or the language doesn't have transliteration data and there's no override, return nil.
if not (self._data.translit or module_override) then
return nil, false, {}
elseif (not text) or text == "" or text == "-" then
return text, false, {}
end
-- If the script is not transliteratable (and no override is given), return nil.
sc = checkScript(text, self, sc)
if not (sc:isTransliterated() or module_override) then
-- temporary tracking to see if/when this gets triggered
track("non-transliterable")
track("non-transliterable/" .. self._code)
track("non-transliterable/" .. sc:getCode())
track("non-transliterable/" .. sc:getCode() .. "/" .. self._code)
return nil, true, {}
end
-- Remove any strip markers.
text = unstrip(text)
-- Do not process the formatting into PUA characters for certain languages.
local processed = load_data(languages_data_module).substitution[self._code] ~= "none"
-- Get the display text with the keepCarets flag set.
local fail, cats, subbedChars
if processed then
text, fail, cats, subbedChars = processDisplayText(text, self, sc, true)
end
-- Transliterate (using the module override if applicable).
text, fail, cats, subbedChars = iterateSectionSubstitutions(self, text, sc, subbedChars, true, module_override or self._data.translit, "tr")
if not text then
return nil, true, cats
end
-- Incomplete transliterations return nil.
local charset = sc.characters
if charset and umatch(text, "[" .. charset .. "]") then
-- Remove any characters in Latin, which includes Latin characters also included in other scripts (as these are false positives), as well as any PUA substitutions. Anything remaining should only be script code "None" (e.g. numerals).
local check_text = ugsub(text, "[" .. get_script("Latn").characters .. "-]+", "")
-- Set none_is_last_resort_only flag, so that any non-None chars will cause a script other than "None" to be returned.
if find_best_script_without_lang(check_text, true):getCode() ~= "None" then
return nil, true, cats
end
end
if processed then
text = escape_risky_characters(text)
text = undoTempSubstitutions(text, subbedChars)
end
-- If the script does not use capitalization, then capitalize any letters of the transliteration which are immediately preceded by a caret (and remove the caret).
if text and not sc:hasCapitalization() and text:find("^", 1, true) then
text = processCarets(text, "%^([\128-\191\244]*%*?)([^\128-\191\244][\128-\191]*)", function(m1, m2)
return m1 .. uupper(m2)
end)
end
-- Track module overrides.
if module_override ~= nil then
track("module_override")
end
fail = text == nil and (not not fail) or false
return text, fail, cats
end
do
local function handle_language_spec(self, spec, sc)
local ret = self["_" .. spec]
if ret == nil then
ret = self._data[spec]
if type(ret) == "string" then
ret = list_to_set(split(ret, ",", true, true))
end
self["_" .. spec] = ret
end
if type(ret) == "table" then
ret = ret[sc:getCode()]
end
return not not ret
end
function Language:overrideManualTranslit(sc)
return handle_language_spec(self, "override_translit", sc)
end
function Language:link_tr(sc)
return handle_language_spec(self, "link_tr", sc)
end
end
--[==[Returns {{code|lua|true}} if the language has a transliteration module, or {{code|lua|false}} if it doesn't.]==]
function Language:hasTranslit()
return not not self._data.translit
end
--[==[Returns {{code|lua|true}} if the language uses the letters I/ı and İ/i, or {{code|lua|false}} if it doesn't.]==]
function Language:hasDottedDotlessI()
return not not self._data.dotted_dotless_i
end
function Language:toJSON(opts)
local entry_name, entry_name_patterns, entry_name_remove_diacritics = self._data.entry_name
if entry_name then
if entry_name.from then
entry_name_patterns = {}
for i, from in ipairs(entry_name.from) do
insert(entry_name_patterns, {from = from, to = entry_name.to[i] or ""})
end
end
entry_name_remove_diacritics = entry_name.remove_diacritics
end
-- mainCode should only end up non-nil if dontCanonicalizeAliases is passed to make_object().
local ret = {
ancestors = self:getAncestorCodes(),
canonicalName = self:getCanonicalName(),
categoryName = self:getCategoryName("nocap"),
code = self._code,
mainCode = self._mainCode,
parent = self:getParentCode(),
full = self:getFullCode(),
entryNamePatterns = entry_name_patterns,
entryNameRemoveDiacritics = entry_name_remove_diacritics,
family = self:getFamilyCode(),
aliases = self:getAliases(),
varieties = self:getVarieties(),
otherNames = self:getOtherNames(),
scripts = self:getScriptCodes(),
type = keys_to_list(self:getTypes()),
wikimediaLanguages = self:getWikimediaLanguageCodes(),
wikidataItem = self:getWikidataItem(),
wikipediaArticle = self:getWikipediaArticle(true),
}
-- Use `deep_copy` when returning a table, so that there are no editing restrictions imposed by `mw.loadData`.
return opts and opts.lua_table and deep_copy(ret) or to_json(ret, opts)
end
function export.getDataModuleName(code)
local letter = match(code, "^(%l)%l%l?$")
return "Module:" .. (
letter == nil and "languages/data/exceptional" or
#code == 2 and "languages/data/2" or
"languages/data/3/" .. letter
)
end
get_data_module_name = export.getDataModuleName
function export.getExtraDataModuleName(code)
return get_data_module_name(code) .. "/extra"
end
get_extra_data_module_name = export.getExtraDataModuleName
do
local function make_stack(data)
local key_types = {
[2] = "unique",
aliases = "unique",
otherNames = "unique",
type = "append",
varieties = "unique",
wikipedia_article = "unique",
wikimedia_codes = "unique"
}
local function __index(self, k)
local stack, key_type = getmetatable(self), key_types[k]
-- Data that isn't inherited from the parent.
if key_type == "unique" then
local v = stack[stack[make_stack]][k]
if v == nil then
local layer = stack[0]
if layer then -- Could be false if there's no extra data.
v = layer[k]
end
end
return v
-- Data that is appended by each generation.
elseif key_type == "append" then
local parts, offset, n = {}, 0, stack[make_stack]
for i = 1, n do
local part = stack[i][k]
if part == nil then
offset = offset + 1
else
parts[i - offset] = part
end
end
return offset ~= n and concat(parts, ",") or nil
end
local n = stack[make_stack]
while true do
local layer = stack[n]
if not layer then -- Could be false if there's no extra data.
return nil
end
local v = layer[k]
if v ~= nil then
return v
end
n = n - 1
end
end
local function __newindex()
error("table is read-only")
end
local function __pairs(self)
-- Iterate down the stack, caching keys to avoid duplicate returns.
local stack, seen = getmetatable(self), {}
local n = stack[make_stack]
local iter, state, k, v = pairs(stack[n])
return function()
repeat
repeat
k = iter(state, k)
if k == nil then
n = n - 1
local layer = stack[n]
if not layer then -- Could be false if there's no extra data.
return nil
end
iter, state, k = pairs(layer)
end
until not (k == nil or seen[k])
-- Get the value via a lookup, as the one returned by the
-- iterator will be the raw value from the current layer,
-- which may not be the one __index will return for that
-- key. Also memoize the key in `seen` (even if the lookup
-- returns nil) so that it doesn't get looked up again.
-- TODO: store values in `self`, avoiding the need to create
-- the `seen` table. The iterator will need to iterate over
-- `self` with `next` first to find these on future loops.
v, seen[k] = self[k], true
until v ~= nil
return k, v
end
end
local __ipairs = require(table_module).indexIpairs
function make_stack(data)
local stack = {
data,
[make_stack] = 1, -- stores the length and acts as a sentinel to confirm a given metatable is a stack.
__index = __index,
__newindex = __newindex,
__pairs = __pairs,
__ipairs = __ipairs,
}
stack.__metatable = stack
return setmetatable({}, stack), stack
end
return make_stack(data)
end
local function get_stack(data)
local stack = getmetatable(data)
return stack and type(stack) == "table" and stack[make_stack] and stack or nil
end
--[==[
<span style="color: #BA0000">This function is not for use in entries or other content pages.</span>
Returns a blob of data about the language. The format of this blob is undocumented, and perhaps unstable; it's intended for things like the module's own unit-tests, which are "close friends" with the module and will be kept up-to-date as the format changes. If `extra` is set, any extra data in the relevant `/extra` module will be included. (Note that it will be included anyway if it has already been loaded into the language object.) If `raw` is set, then the returned data will not contain any data inherited from parent objects.
-- Do NOT use these methods!
-- All uses should be pre-approved on the talk page!
]==]
function Language:getData(extra, raw)
if extra then
self:loadInExtraData()
end
local data = self._data
-- If raw is not set, just return the data.
if not raw then
return data
end
local stack = get_stack(data)
-- If there isn't a stack or its length is 1, return the data. Extra data (if any) will be included, as it's stored at key 0 and doesn't affect the reported length.
if stack == nil then
return data
end
local n = stack[make_stack]
if n == 1 then
return data
end
local extra = stack[0]
-- If there isn't any extra data, return the top layer of the stack.
if extra == nil then
return stack[n]
end
-- If there is, return a new stack which has the top layer at key 1 and the extra data at key 0.
data, stack = make_stack(stack[n])
stack[0] = extra
return data
end
function Language:loadInExtraData()
-- Only full languages have extra data.
if not self:hasType("language", "full") then
return
end
local data = self._data
-- If there's no stack, create one.
local stack = get_stack(self._data)
if stack == nil then
data, stack = make_stack(data)
-- If already loaded, return.
elseif stack[0] ~= nil then
return
end
self._data = data
-- Load extra data from the relevant module and add it to the stack at key 0, so that the __index and __pairs metamethods will pick it up, since they iterate down the stack until they run out of layers.
local code = self._code
local modulename = get_extra_data_module_name(code)
-- No data cached as false.
stack[0] = modulename and load_data(modulename)[code] or false
end
--[==[Returns the name of the module containing the language's data. Currently, this is always [[Module:scripts/data]].]==]
function Language:getDataModuleName()
local name = self._dataModuleName
if name == nil then
name = self:hasType("etymology-only") and etymology_languages_data_module or
get_data_module_name(self._mainCode or self._code)
self._dataModuleName = name
end
return name
end
--[==[Returns the name of the module containing the language's data. Currently, this is always [[Module:scripts/data]].]==]
function Language:getExtraDataModuleName()
local name = self._extraDataModuleName
if name == nil then
name = not self:hasType("etymology-only") and get_extra_data_module_name(self._mainCode or self._code) or false
self._extraDataModuleName = name
end
return name or nil
end
function export.makeObject(code, data, dontCanonicalizeAliases)
local data_type = type(data)
if data_type ~= "table" then
error(("bad argument #2 to 'makeObject' (table expected, got %s)"):format(data_type))
end
-- Convert any aliases.
local input_code = code
code = normalize_code(code)
input_code = dontCanonicalizeAliases and input_code or code
local parent
if data.parent then
parent = get_by_code(data.parent, nil, true, true)
else
parent = Language
end
parent.__index = parent
local lang = {_code = input_code}
-- This can only happen if dontCanonicalizeAliases is passed to make_object().
if code ~= input_code then
lang._mainCode = code
end
local parent_data = parent._data
if parent_data == nil then
-- Full code is the same as the code.
lang._fullCode = parent._code or code
else
-- Copy full code.
lang._fullCode = parent._fullCode
local stack = get_stack(parent_data)
if stack == nil then
parent_data, stack = make_stack(parent_data)
end
-- Insert the input data as the new top layer of the stack.
local n = stack[make_stack] + 1
data, stack[n], stack[make_stack] = parent_data, data, n
end
lang._data = data
return setmetatable(lang, parent)
end
make_object = export.makeObject
end
--[==[Finds the language whose code matches the one provided. If it exists, it returns a <code class="nf">Language</code> object representing the language. Otherwise, it returns {{code|lua|nil}}, unless <code class="n">paramForError</code> is given, in which case an error is generated. If <code class="n">paramForError</code> is {{code|lua|true}}, a generic error message mentioning the bad code is generated; otherwise <code class="n">paramForError</code> should be a string or number specifying the parameter that the code came from, and this parameter will be mentioned in the error message along with the bad code. If <code class="n">allowEtymLang</code> is specified, etymology-only language codes are allowed and looked up along with normal language codes. If <code class="n">allowFamily</code> is specified, language family codes are allowed and looked up along with normal language codes.]==]
function export.getByCode(code, paramForError, allowEtymLang, allowFamily)
-- Track uses of paramForError, ultimately so it can be removed, as error-handling should be done by [[Module:parameters]], not here.
if paramForError ~= nil then
track("paramForError")
end
if type(code) ~= "string" then
local typ
if not code then
typ = "nil"
elseif check_object("language", true, code) then
typ = "a language object"
elseif check_object("family", true, code) then
typ = "a family object"
else
typ = "a " .. type(code)
end
error("The function getByCode expects a string as its first argument, but received " .. typ .. ".")
end
local m_data = load_data(languages_data_module)
if m_data.aliases[code] or m_data.track[code] then
track(code)
end
local norm_code = normalize_code(code)
-- Get the data, checking for etymology-only languages if allowEtymLang is set.
local data = load_data(get_data_module_name(norm_code))[norm_code] or
allowEtymLang and load_data(etymology_languages_data_module)[norm_code]
-- If no data was found and allowFamily is set, check the family data. If the main family data was found, make the object with [[Module:families]] instead, as family objects have different methods. However, if it's an etymology-only family, use make_object in this module (which handles object inheritance), and the family-specific methods will be inherited from the parent object.
if data == nil and allowFamily then
data = load_data("Module:families/data")[norm_code]
if data ~= nil then
if data.parent == nil then
return make_family_object(norm_code, data)
elseif not allowEtymLang then
data = nil
end
end
end
local retval = code and data and make_object(code, data)
if not retval and paramForError then
require("Module:languages/errorGetBy").code(code, paramForError, allowEtymLang, allowFamily)
end
return retval
end
get_by_code = export.getByCode
--[==[Finds the language whose canonical name (the name used to represent that language on Wiktionary) or other name matches the one provided. If it exists, it returns a <code class="nf">Language</code> object representing the language. Otherwise, it returns {{code|lua|nil}}, unless <code class="n">paramForError</code> is given, in which case an error is generated. If <code class="n">allowEtymLang</code> is specified, etymology-only language codes are allowed and looked up along with normal language codes. If <code class="n">allowFamily</code> is specified, language family codes are allowed and looked up along with normal language codes.
The canonical name of languages should always be unique (it is an error for two languages on Wiktionary to share the same canonical name), so this is guaranteed to give at most one result.
This function is powered by [[Module:languages/canonical names]], which contains a pre-generated mapping of full-language canonical names to codes. It is generated by going through the [[:Category:Language data modules]] for full languages. When <code class="n">allowEtymLang</code> is specified for the above function, [[Module:etymology languages/canonical names]] may also be used, and when <code class="n">allowFamily</code> is specified for the above function, [[Module:families/canonical names]] may also be used.]==]
function export.getByCanonicalName(name, errorIfInvalid, allowEtymLang, allowFamily)
local byName = load_data("Module:languages/canonical names")
local code = byName and byName[name]
if not code and allowEtymLang then
byName = load_data("Module:etymology languages/canonical names")
code = byName and byName[name] or
byName[gsub(name, " [Ss]ubstrate$", "")] or
byName[gsub(name, "^a ", "")] or
byName[gsub(name, "^a ", ""):gsub(" [Ss]ubstrate$", "")] or
-- For etymology families like "ira-pro".
-- FIXME: This is not ideal, as it allows " languages" to be appended to any etymology-only language, too.
byName[match(name, "^(.*) languages$")]
end
if not code and allowFamily then
byName = load_data("Module:families/canonical names")
code = byName[name] or byName[match(name, "^(.*) languages$")]
end
local retval = code and get_by_code(code, errorIfInvalid, allowEtymLang, allowFamily)
if not retval and errorIfInvalid then
require("Module:languages/errorGetBy").canonicalName(name, allowEtymLang, allowFamily)
end
return retval
end
--[==[Used by [[Module:languages/data/2]] (et al.) and [[Module:etymology languages/data]], [[Module:families/data]], [[Module:scripts/data]] and [[Module:writing systems/data]] to finalize the data into the format that is actually returned.]==]
function export.finalizeData(data, main_type, variety)
local fields = {"type"}
if main_type == "language" then
insert(fields, 4) -- script codes
insert(fields, "ancestors")
insert(fields, "link_tr")
insert(fields, "override_translit")
insert(fields, "wikimedia_codes")
elseif main_type == "script" then
insert(fields, 3) -- writing system codes
end -- Families and writing systems have no extra fields to process.
local fields_len = #fields
for _, entity in next, data do
if variety then
-- Move parent from 3 to "parent" and family from "family" to 3. These are different for the sake of convenience, since very few varieties have the family specified, whereas all of them have a parent.
entity.parent, entity[3], entity.family = entity[3], entity.family
-- Give the type "regular" iff not a variety and no other types are assigned.
elseif not (entity.type or entity.parent) then
entity.type = "regular"
end
for i = 1, fields_len do
local key = fields[i]
local field = entity[key]
if field and type(field) == "string" then
entity[key] = gsub(field, "%s*,%s*", ",")
end
end
end
return data
end
--[==[For backwards compatibility only; modules should require the error themselves.]==]
function export.err(lang_code, param, code_desc, template_tag, not_real_lang)
return require("Module:languages/error")(lang_code, param, code_desc, template_tag, not_real_lang)
end
return export
75xk9yo1imdifdldjf0oz87cps9ioxq
17456
17394
2026-07-13T08:55:16Z
Hiyuune
6766
17456
Scribunto
text/plain
--[=[
This module implements fetching of language-specific information and processing text in a given language.
There are two types of languages: full languages and etymology-only languages. The essential difference is that only
full languages appear in L2 headings in vocabulary entries, and hence categories like [[:Category:French nouns]] exist
only for full languages. Etymology-only languages have either a full language or another etymology-only language as
their parent (in the parent-child inheritance sense), and for etymology-only languages with another etymology-only
language as their parent, a full language can always be derived by following the parent links upwards. For example,
"Canadian French", code 'fr-CA', is an etymology-only language whose parent is the full language "French", code 'fr'.
An example of an etymology-only language with another etymology-only parent is "Northumbrian Old English", code
'ang-nor', which has "Anglian Old English", code 'ang-ang' as its parent; this is an etymology-only language whose
parent is "Old English", code "ang", which is a full language. (This is because Northumbrian Old English is considered
a variety of Anglian Old English.) Sometimes the parent is the "Undetermined" language, code 'und'; this is the case,
for example, for "substrate" languages such as "Pre-Greek", code 'qsb-grc', and "the BMAC substrate", code 'qsb-bma'.
It is important to distinguish language ''parents'' from language ''ancestors''. The parent-child relationship is one
of containment, i.e. if X is a child of Y, X is considered a variety of Y. On the other hand, the ancestor-descendant
relationship is one of descent in time. For example, "Classical Latin", code 'la-cla', and "Late Latin", code 'la-lat',
are both etymology-only languages with "Latin", code 'la', as their parents, because both of the former are varieties
of Latin. However, Late Latin does *NOT* have Classical Latin as its parent because Late Latin is *not* a variety of
Classical Latin; rather, it is a descendant. There is in fact a separate 'ancestors' field that is used to express the
ancestor-descendant relationship, and Late Latin's ancestor is given as Classical Latin. It is also important to note
that sometimes an etymology-only language is actually the conceptual ancestor of its parent language. This happens,
for example, with "Old Italian" (code 'roa-oit'), which is an etymology-only variant of full language "Italian" (code
'it'), and with "Old Latin" (code 'itc-ola'), which is an etymology-only variant of Latin. In both cases, the full
language has the etymology-only variant listed as an ancestor. This allows a Latin term to inherit from Old Latin
using the {{tl|inh}} template (where in this template, "inheritance" refers to ancestral inheritance, i.e. inheritance
in time, rather than in the parent-child sense); likewise for Italian and Old Italian.
Full languages come in three subtypes:
* {regular}: This indicates a full language that is attested according to [[WT:CFI]] and therefore permitted in the
main namespace. There may also be reconstructed terms for the language, which are placed in the
{Reconstruction} namespace and must be prefixed with * to indicate a reconstruction. Most full languages
are natural (not constructed) languages, but a few constructed languages (e.g. Esperanto and Volapük,
among others) are also allowed in the mainspace and considered regular languages.
* {reconstructed}: This language is not attested according to [[WT:CFI]], and therefore is allowed only in the
{Reconstruction} namespace. All terms in this language are reconstructed, and must be prefixed with
*. Languages such as Proto-Indo-European and Proto-Germanic are in this category.
* {appendix-constructed}: This language is attested but does not meet the additional requirements set out for
constructed languages ([[WT:CFI#Constructed languages]]). Its entries must therefore be in
the Appendix namespace, but they are not reconstructed and therefore should not have *
prefixed in links. Most constructed languages are of this subtype.
Both full languages and etymology-only languages have a {Language} object associated with them, which is fetched using
the {getByCode} function in [[Module:languages]] to convert a language code to a {Language} object. Depending on the
options supplied to this function, etymology-only languages may or may not be accepted, and family codes may be
accepted (returning a {Family} object as described in [[Module:families]]). There are also separate {getByCanonicalName}
functions in [[Module:languages]] and [[Module:etymology languages]] to convert a language's canonical name to a
{Language} object (depending on whether the canonical name refers to a full or etymology-only language).
Textual strings belonging to a given language come in several different ''text variants'':
# The ''input text'' is what the user supplies in wikitext, in the parameters to {{tl|m}}, {{tl|l}}, {{tl|ux}},
{{tl|t}}, {{tl|lang}} and the like.
# The ''display text'' is the text in the form as it will be displayed to the user. This can include accent marks that
are stripped to form the entry text (see below), as well as embedded bracketed links that are variously processed
further. The display text is generated from the input text by applying language-specific transformations; for most
languages, there will be no such transformations. Examples of transformations are bad-character replacements for
certain languages (e.g. replacing 'l' or '1' to [[palochka]] in certain languages in Cyrillic); and for Thai and
Khmer, converting space-separated words to bracketed words and resolving respelling substitutions such as [กรีน/กฺรีน],
which indicate how to transliterate given words.
# The ''entry text'' is the text in the form used to generate a link to a Wiktionary entry. This is usually generated
from the display text by stripping certain sorts of diacritics on a per-language basis, and sometimes doing other
transformations. The concept of ''entry text'' only really makes sense for text that does not contain embedded links,
meaning that display text containing embedded links will need to have the links individually processed to get
per-link entry text in order to generate the resolved display text (see below).
# The ''resolved display text'' is the result of resolving embedded links in the display text (e.g. converting them to
two-part links where the first part has entry-text transformations applied, and adding appropriate language-specific
fragments) and adding appropriate language and script tagging. This text can be passed directly to MediaWiki for
display.
# The ''source translit text'' is the text as supplied to the language-specific {transliterate()} method. The form of
the source translit text may need to be language-specific, e.g Thai and Khmer will need the full unprocessed input
text, whereas other languages may need to work off the display text. [FIXME: It's still unclear to me how embedded
bracketed links are handled in the existing code.] In general, embedded links need to be removed (i.e. converted to
their "bare display" form by taking the right part of two-part links and removing double brackets), but when this
happens is unclear to me [FIXME]. Some languages have a chop-up-and-paste-together scheme that sends parts of the
text through the transliterate mechanism, and for others (those listed with "cont" in {substition} in
[[Module:languages/data]]) they receive the full input text, but preprocessed in certain ways. (The wisdom of this is
still unclear to me.)
# The ''transliterated text'' (or ''transliteration'') is the result of transliterating the source translit text.
Unlike for all the other text variants except the transcribed text, it is always in the Latin script.
# The ''transcribed text'' (or ''transcription'') is the result of transcribing the source translit text, where
"transcription" here means a close approximation to the phonetic form of the language in languages (e.g. Akkadian,
Sumerian, Ancient Egyptian, maybe Tibetan) that have a wide difference between the written letters and spoken form.
Unlike for all the other text variants other than the transliterated text, it is always in the Latin script.
Currently, the transcribed text is always supplied manually be the user; there is no such thing as a
{lua|transcribe()} method on language objects.
# The ''sort key'' is the text used in sort keys for determining the placing of pages in categories they belong to. The
sort key is generated from the pagename or a specified ''sort base'' by lowercasing, doing language-specific
transformations and then uppercasing the result. If the sort base is supplied and is generated from input text, it
needs to be converted to display text, have embedded links removed (i.e. resolving them to their right side if they
are two-part links) and have entry text transformations applied.
# There are other text variants that occur in usexes (specifically, there are normalized variants of several of the
above text variants), but we can skip them for now.
The following methods exist on {Language} objects to convert between different text variants:
# {makeDisplayText}: This converts input text to display text.
# {lua|makeEntryName}: This converts input or display text to entry text. [FIXME: This needs some rethinking. In
particular, {lua|makeEntryName} is sometimes called on display text (in some paths inside of [[Module:links]]) and
sometimes called on input text (in other paths inside of [[Module:links]], and usually from other modules). We need
to make sure we don't try to convert input text to display text twice, but at the same time we need to support
calling it directly on input text since so many modules do this. This means we need to add a parameter indicating
whether the passed-in text is input or display text; if that former, we call {lua|makeDisplayText} ourselves.]
# {lua|transliterate}: This appears to convert input text with embedded brackets removed into a transliteration.
[FIXME: This needs some rethinking. In particular, it calls {lua|processDisplayText} on its input, which won't work
for Thai and Khmer, so we may need language-specific flags indicating whether to pass the input text directly to the
language transliterate method. In addition, I'm not sure how embedded links are handled in the existing translit code;
a lot of callers remove the links themselves before calling {lua|transliterate()}, which I assume is wrong.]
# {lua|makeSortKey}: This converts entry text (?) to a sort key. [FIXME: Clarify this.]
]=]
local export = {}
local debug_track_module = "Module:debug/track"
local etymology_languages_data_module = "Module:etymology languages/data"
local families_module = "Module:families"
local json_module = "Module:JSON"
local language_like_module = "Module:language-like"
local languages_data_module = "Module:languages/data"
local languages_data_patterns_module = "Module:languages/data/patterns"
local links_data_module = "Module:links/data"
local load_module = "Module:load"
local scripts_module = "Module:scripts"
local scripts_data_module = "Module:scripts/data"
local string_encode_entities_module = "Module:string/encode entities"
local string_pattern_escape_module = "Module:string/patternEscape"
local string_replacement_escape_module = "Module:string/replacementEscape"
local string_utilities_module = "Module:string utilities"
local table_module = "Module:table"
local utilities_module = "Module:utilities"
local wikimedia_languages_module = "Module:wikimedia languages"
local mw = mw
local string = string
local table = table
local char = string.char
local concat = table.concat
local find = string.find
local floor = math.floor
local get_by_code -- Defined below.
local get_data_module_name -- Defined below.
local get_extra_data_module_name -- Defined below.
local getmetatable = getmetatable
local gmatch = string.gmatch
local gsub = string.gsub
local insert = table.insert
local ipairs = ipairs
local is_known_language_tag = mw.language.isKnownLanguageTag
local make_object -- Defined below.
local match = string.match
local next = next
local pairs = pairs
local remove = table.remove
local require = require
local select = select
local setmetatable = setmetatable
local sub = string.sub
local type = type
local unstrip = mw.text.unstrip
-- Loaded as needed by findBestScript.
local Hans_chars
local Hant_chars
local function check_object(...)
check_object = require(utilities_module).check_object
return check_object(...)
end
local function debug_track(...)
debug_track = require(debug_track_module)
return debug_track(...)
end
local function decode_entities(...)
decode_entities = require(string_utilities_module).decode_entities
return decode_entities(...)
end
local function decode_uri(...)
decode_uri = require(string_utilities_module).decode_uri
return decode_uri(...)
end
local function deep_copy(...)
deep_copy = require(table_module).deepCopy
return deep_copy(...)
end
local function encode_entities(...)
encode_entities = require(string_encode_entities_module)
return encode_entities(...)
end
local function get_script(...)
get_script = require(scripts_module).getByCode
return get_script(...)
end
local function find_best_script_without_lang(...)
find_best_script_without_lang = require(scripts_module).findBestScriptWithoutLang
return find_best_script_without_lang(...)
end
local function get_family(...)
get_family = require(families_module).getByCode
return get_family(...)
end
local function get_plaintext(...)
get_plaintext = require(utilities_module).get_plaintext
return get_plaintext(...)
end
local function get_wikimedia_lang(...)
get_wikimedia_lang = require(wikimedia_languages_module).getByCode
return get_wikimedia_lang(...)
end
local function keys_to_list(...)
keys_to_list = require(table_module).keysToList
return keys_to_list(...)
end
local function list_to_set(...)
list_to_set = require(table_module).listToSet
return list_to_set(...)
end
local function load_data(...)
load_data = require(load_module).load_data
return load_data(...)
end
local function make_family_object(...)
make_family_object = require(families_module).makeObject
return make_family_object(...)
end
local function pattern_escape(...)
pattern_escape = require(string_pattern_escape_module)
return pattern_escape(...)
end
local function remove_duplicates(...)
remove_duplicates = require(table_module).removeDuplicates
return remove_duplicates(...)
end
local function replacement_escape(...)
replacement_escape = require(string_replacement_escape_module)
return replacement_escape(...)
end
local function safe_require(...)
safe_require = require(load_module).safe_require
return safe_require(...)
end
local function shallow_copy(...)
shallow_copy = require(table_module).shallowCopy
return shallow_copy(...)
end
local function split(...)
split = require(string_utilities_module).split
return split(...)
end
local function to_json(...)
to_json = require(json_module).toJSON
return to_json(...)
end
local function u(...)
u = require(string_utilities_module).char
return u(...)
end
local function ugsub(...)
ugsub = require(string_utilities_module).gsub
return ugsub(...)
end
local function ulen(...)
ulen = require(string_utilities_module).len
return ulen(...)
end
local function ulower(...)
ulower = require(string_utilities_module).lower
return ulower(...)
end
local function umatch(...)
umatch = require(string_utilities_module).match
return umatch(...)
end
local function uupper(...)
uupper = require(string_utilities_module).upper
return uupper(...)
end
local function track(page)
debug_track("languages/" .. page)
return true
end
local function normalize_code(code)
return load_data(languages_data_module).aliases[code] or code
end
local function check_inputs(self, check, default, ...)
local n = select("#", ...)
if n == 0 then
return false
end
local ret = check(self, (...))
if ret ~= nil then
return ret
elseif n > 1 then
local inputs = {...}
for i = 2, n do
ret = check(self, inputs[i])
if ret ~= nil then
return ret
end
end
end
return default
end
local function make_link(self, target, display)
local prefix, main
if self:getFamilyCode() == "qfa-sub" then
prefix, main = display:match("^(the )(.*)")
if not prefix then
prefix, main = display:match("^(a )(.*)")
end
end
return (prefix or "") .. "[[" .. target .. "|" .. (main or display) .. "]]"
end
-- Convert risky characters to HTML entities, which minimizes interference once returned (e.g. for "sms:a", "<!-- -->" etc.).
local function escape_risky_characters(text)
-- Spacing characters in isolation generally need to be escaped in order to be properly processed by the MediaWiki software.
if umatch(text, "^%s*$") then
return encode_entities(text, text)
end
return encode_entities(text, "!#%&*+/:;<=>?@[\\]_{|}")
end
-- Temporarily convert various formatting characters to PUA to prevent them from being disrupted by the substitution process.
local function doTempSubstitutions(text, subbedChars, keepCarets, noTrim)
-- Clone so that we don't insert any extra patterns into the table in package.loaded. For some reason, using require seems to keep memory use down; probably because the table is always cloned.
local patterns = shallow_copy(require(languages_data_patterns_module))
if keepCarets then
insert(patterns, "((\\+)%^)")
insert(patterns, "((%^))")
end
-- Ensure any whitespace at the beginning and end is temp substituted, to prevent it from being accidentally trimmed. We only want to trim any final spaces added during the substitution process (e.g. by a module), which means we only do this during the first round of temp substitutions.
if not noTrim then
insert(patterns, "^([\128-\191\244]*(%s+))")
insert(patterns, "((%s+)[\128-\191\244]*)$")
end
-- Pre-substitution, of "[[" and "]]", which makes pattern matching more accurate.
text = gsub(text, "%f[%[]%[%[", "\1")
:gsub("%f[%]]%]%]", "\2")
local i = #subbedChars
for _, pattern in ipairs(patterns) do
-- Patterns ending in \0 stand are for things like "[[" or "]]"), so the inserted PUA are treated as breaks between terms by modules that scrape info from pages.
local term_divider
pattern = gsub(pattern, "%z$", function(divider)
term_divider = divider == "\0"
return ""
end)
text = gsub(text, pattern, function(...)
local m = {...}
local m1New = m[1]
for k = 2, #m do
local n = i + k - 1
subbedChars[n] = m[k]
local byte2 = floor(n / 4096) % 64 + (term_divider and 128 or 136)
local byte3 = floor(n / 64) % 64 + 128
local byte4 = n % 64 + 128
m1New = gsub(m1New, pattern_escape(m[k]), "\244" .. char(byte2) .. char(byte3) .. char(byte4), 1)
end
i = i + #m - 1
return m1New
end)
end
text = gsub(text, "\1", "%[%[")
:gsub("\2", "%]%]")
return text, subbedChars
end
-- Reinsert any formatting that was temporarily substituted.
local function undoTempSubstitutions(text, subbedChars)
for i = 1, #subbedChars do
local byte2 = floor(i / 4096) % 64 + 128
local byte3 = floor(i / 64) % 64 + 128
local byte4 = i % 64 + 128
text = gsub(text, "\244[" .. char(byte2) .. char(byte2+8) .. "]" .. char(byte3) .. char(byte4), replacement_escape(subbedChars[i]))
end
text = gsub(text, "\1", "%[%[")
:gsub("\2", "%]%]")
return text
end
-- Check if the raw text is an unsupported title, and if so return that. Otherwise, remove HTML entities. We do the pre-conversion to avoid loading the unsupported title list unnecessarily.
local function checkNoEntities(self, text)
local textNoEnc = decode_entities(text)
if textNoEnc ~= text and load_data(links_data_module).unsupported_titles[text] then
return text
else
return textNoEnc
end
end
-- If no script object is provided (or if it's invalid or None), get one.
local function checkScript(text, self, sc)
if not check_object("script", true, sc) or sc:getCode() == "None" then
return self:findBestScript(text)
end
return sc
end
local function normalize(text, sc)
text = sc:fixDiscouragedSequences(text)
return sc:toFixedNFD(text)
end
local function doSubstitutions(self, text, sc, substitution_data, function_name, recursed)
local fail, cats = nil, {}
-- If there are language-specific substitutes given in the data module, use those.
if type(substitution_data) == "table" then
-- If a script is specified, run this function with the script-specific data before continuing.
local sc_code = sc:getCode()
if substitution_data[sc_code] then
text, fail, cats = doSubstitutions(self, text, sc, substitution_data[sc_code], function_name, true)
-- Hant, Hans and Hani are usually treated the same, so add a special case to avoid having to specify each one separately.
elseif sc_code:match("^Han") and substitution_data.Hani then
text, fail, cats = doSubstitutions(self, text, sc, substitution_data.Hani, function_name, true)
-- Substitution data with key 1 in the outer table may be given as a fallback.
elseif substitution_data[1] then
text, fail, cats = doSubstitutions(self, text, sc, substitution_data[1], function_name, true)
end
-- Iterate over all strings in the "from" subtable, and gsub with the corresponding string in "to". We work with the NFD decomposed forms, as this simplifies many substitutions.
if substitution_data.from then
for i, from in ipairs(substitution_data.from) do
-- Normalize each loop, to ensure multi-stage substitutions work correctly.
text = sc:toFixedNFD(text)
text = ugsub(text, sc:toFixedNFD(from), substitution_data.to[i] or "")
end
end
if substitution_data.remove_diacritics then
text = sc:toFixedNFD(text)
-- Convert exceptions to PUA.
local remove_exceptions, substitutes = substitution_data.remove_exceptions
if remove_exceptions then
substitutes = {}
local i = 0
for _, exception in ipairs(remove_exceptions) do
exception = sc:toFixedNFD(exception)
text = ugsub(text, exception, function(m)
i = i + 1
local subst = u(0x80000 + i)
substitutes[subst] = m
return subst
end)
end
end
-- Strip diacritics.
text = ugsub(text, "[" .. substitution_data.remove_diacritics .. "]", "")
-- Convert exceptions back.
if remove_exceptions then
text = text:gsub("\242[\128-\191]*", substitutes)
end
end
elseif type(substitution_data) == "string" then
-- If there is a dedicated function module, use that.
local module = safe_require("Module:" .. substitution_data)
if module then
-- TODO: translit functions should take objects, not codes.
-- TODO: translit functions should be called with form NFD.
if function_name == "tr" then
text, fail, cats = module[function_name](text, self._code, sc:getCode())
else
text, fail, cats = module[function_name](sc:toFixedNFD(text), self, sc)
end
-- TODO: get rid of the `fail` and `cats` return values.
if fail ~= nil then
track("fail")
track("fail/" .. self._code)
end
if cats ~= nil then
track("cats")
track("cats/" .. self._code)
end
else
error("Substitution data '" .. substitution_data .. "' does not match an existing module.")
end
end
-- Don't normalize to NFC if this is the inner loop or if a module returned nil.
if recursed or not text then
return text, fail, cats
end
-- Fix any discouraged sequences created during the substitution process, and normalize into the final form.
return sc:toFixedNFC(sc:fixDiscouragedSequences(text)), fail, cats
end
-- Split the text into sections, based on the presence of temporarily substituted formatting characters, then iterate over each one to apply substitutions. This avoids putting PUA characters through language-specific modules, which may be unequipped for them.
local function iterateSectionSubstitutions(self, text, sc, subbedChars, keepCarets, substitution_data, function_name)
local fail, cats, sections = nil, {}
-- See [[Module:languages/data]].
if not find(text, "\244") or (load_data(languages_data_module).substitution[self._code] == "cont") then
sections = {text}
else
sections = split(text, "\244[\128-\143][\128-\191]*", true)
end
for _, section in ipairs(sections) do
-- Don't bother processing empty strings or whitespace (which may also not be handled well by dedicated modules).
if gsub(section, "%s+", "") ~= "" then
local sub, sub_fail, sub_cats = doSubstitutions(self, section, sc, substitution_data, function_name)
-- Second round of temporary substitutions, in case any formatting was added by the main substitution process. However, don't do this if the section contains formatting already (as it would have had to have been escaped to reach this stage, and therefore should be given as raw text).
if sub and subbedChars then
local noSub
for _, pattern in ipairs(require(languages_data_patterns_module)) do
if match(section, pattern .. "%z?") then
noSub = true
end
end
if not noSub then
sub, subbedChars = doTempSubstitutions(sub, subbedChars, keepCarets, true)
end
end
if (not sub) or sub_fail then
text = sub
fail = sub_fail
cats = sub_cats or {}
break
end
text = sub and gsub(text, pattern_escape(section), replacement_escape(sub), 1) or text
if type(sub_cats) == "table" then
for _, cat in ipairs(sub_cats) do
insert(cats, cat)
end
end
end
end
-- Trim, unless there are only spacing characters, while ignoring any final formatting characters.
text = text and text:gsub("^([\128-\191\244]*)%s+(%S)", "%1%2")
:gsub("(%S)%s+([\128-\191\244]*)$", "%1%2")
-- Remove duplicate categories.
if #cats > 1 then
cats = remove_duplicates(cats)
end
return text, fail, cats, subbedChars
end
-- Process carets (and any escapes). Default to simple removal, if no pattern/replacement is given.
local function processCarets(text, pattern, repl)
local rep
repeat
text, rep = gsub(text, "\\\\(\\*^)", "\3%1")
until rep == 0
return text:gsub("\\^", "\4")
:gsub(pattern or "%^", repl or "")
:gsub("\3", "\\")
:gsub("\4", "^")
end
-- Remove carets if they are used to capitalize parts of transliterations (unless they have been escaped).
local function removeCarets(text, sc)
if not sc:hasCapitalization() and sc:isTransliterated() and text:find("^", 1, true) then
return processCarets(text)
else
return text
end
end
local Language = {}
--[==[Returns the language code of the language. Example: {{code|lua|"fr"}} for French.]==]
function Language:getCode()
return self._code
end
--[==[Returns the canonical name of the language. This is the name used to represent that language on Wiktionary, and is guaranteed to be unique to that language alone. Example: {{code|lua|"French"}} for French.]==]
function Language:getCanonicalName()
local name = self._name
if name == nil then
name = self._data[1]
self._name = name
end
return name
end
--[==[
Return the display form of the language. The display form of a language, family or script is the form it takes when
appearing as the <code><var>source</var></code> in categories such as <code>English terms derived from
<var>source</var></code> or <code>English given names from <var>source</var></code>, and is also the displayed text
in {makeCategoryLink()} links. For full and etymology-only languages, this is the same as the canonical name, but
for families, it reads <code>"<var>name</var> languages"</code> (e.g. {"Indo-Iranian languages"}), and for scripts,
it reads <code>"<var>name</var> script"</code> (e.g. {"Arabic script"}).
]==]
function Language:getDisplayForm()
local form = self._displayForm
if form == nil then
form = self:getCanonicalName()
-- Add article and " substrate" to substrates that lack them.
if self:getFamilyCode() == "qfa-sub" then
if not (sub(form, 1, 4) == "the " or sub(form, 1, 2) == "a ") then
form = "a " .. form
end
if not match(form, " [Ss]ubstrate") then
form = form .. " substrate"
end
end
self._displayForm = form
end
return form
end
--[==[Returns the value which should be used in the HTML lang= attribute for tagged text in the language.]==]
function Language:getHTMLAttribute(sc, region)
local code = self._code
if not find(code, "-", 1, true) then
return code .. "-" .. sc:getCode() .. (region and "-" .. region or "")
end
local parent = self:getParent()
region = region or match(code, "%f[%u][%u-]+%f[%U]")
if parent then
return parent:getHTMLAttribute(sc, region)
end
-- TODO: ISO family codes can also be used.
return "mis-" .. sc:getCode() .. (region and "-" .. region or "")
end
--[==[Returns a table of the aliases that the language is known by, excluding the canonical name. Aliases are synonyms for the language in question. The names are not guaranteed to be unique, in that sometimes more than one language is known by the same name. Example: {{code|lua|{"High German", "New High German", "Deutsch"} }} for [[:Category:German language|German]].]==]
function Language:getAliases()
self:loadInExtraData()
return require(language_like_module).getAliases(self)
end
--[==[
Return a table of the known subvarieties of a given language, excluding subvarieties that have been given
explicit etymology-only language codes. The names are not guaranteed to be unique, in that sometimes a given name
refers to a subvariety of more than one language. Example: {{code|lua|{"Southern Aymara", "Central Aymara"} }} for
[[:Category:Aymara language|Aymara]]. Note that the returned value can have nested tables in it, when a subvariety
goes by more than one name. Example: {{code|lua|{"North Azerbaijani", "South Azerbaijani", {"Afshar", "Afshari",
"Afshar Azerbaijani", "Afchar"}, {"Qashqa'i", "Qashqai", "Kashkay"}, "Sonqor"} }} for
[[:Category:Azerbaijani language|Azerbaijani]]. Here, for example, Afshar, Afshari, Afshar Azerbaijani and Afchar
all refer to the same subvariety, whose preferred name is Afshar (the one listed first). To avoid a return value
with nested tables in it, specify a non-{{code|lua|nil}} value for the <code>flatten</code> parameter; in that case,
the return value would be {{code|lua|{"North Azerbaijani", "South Azerbaijani", "Afshar", "Afshari",
"Afshar Azerbaijani", "Afchar", "Qashqa'i", "Qashqai", "Kashkay", "Sonqor"} }}.
]==]
function Language:getVarieties(flatten)
self:loadInExtraData()
return require(language_like_module).getVarieties(self, flatten)
end
--[==[Returns a table of the "other names" that the language is known by, which are listed in the <code>otherNames</code> field. It should be noted that the <code>otherNames</code> field itself is deprecated, and entries listed there should eventually be moved to either <code>aliases</code> or <code>varieties</code>.]==]
function Language:getOtherNames() -- To be eventually removed, once there are no more uses of the `otherNames` field.
self:loadInExtraData()
return require(language_like_module).getOtherNames(self)
end
--[==[
Return a combined table of the canonical name, aliases, varieties and other names of a given language.]==]
function Language:getAllNames()
self:loadInExtraData()
return require(language_like_module).getAllNames(self)
end
--[==[Returns a table of types as a lookup table (with the types as keys).
The possible types are
* {language}: This is a language, either full or etymology-only.
* {full}: This is a "full" (not etymology-only) language, i.e. the union of {regular}, {reconstructed} and
{appendix-constructed}. Note that the types {full} and {etymology-only} also exist for families, so if you
want to check specifically for a full language and you have an object that might be a family, you should
use {{lua|hasType("language", "full")}} and not simply {{lua|hasType("full")}}.
* {etymology-only}: This is an etymology-only (not full) language, whose parent is another etymology-only
language or a full language. Note that the types {full} and {etymology-only} also exist for
families, so if you want to check specifically for an etymology-only language and you have an
object that might be a family, you should use {{lua|hasType("language", "etymology-only")}}
and not simply {{lua|hasType("etymology-only")}}.
* {regular}: This indicates a full language that is attested according to [[WT:CFI]] and therefore permitted
in the main namespace. There may also be reconstructed terms for the language, which are placed in
the {Reconstruction} namespace and must be prefixed with * to indicate a reconstruction. Most full
languages are natural (not constructed) languages, but a few constructed languages (e.g. Esperanto
and Volapük, among others) are also allowed in the mainspace and considered regular languages.
* {reconstructed}: This language is not attested according to [[WT:CFI]], and therefore is allowed only in the
{Reconstruction} namespace. All terms in this language are reconstructed, and must be prefixed
with *. Languages such as Proto-Indo-European and Proto-Germanic are in this category.
* {appendix-constructed}: This language is attested but does not meet the additional requirements set out for
constructed languages ([[WT:CFI#Constructed languages]]). Its entries must therefore
be in the Appendix namespace, but they are not reconstructed and therefore should
not have * prefixed in links.
]==]
function Language:getTypes()
local types = self._types
if types == nil then
types = {language = true}
if self:getFullCode() == self._code then
types.full = true
else
types["etymology-only"] = true
end
for t in gmatch(self._data.type, "[^,]+") do
types[t] = true
end
self._types = types
end
return types
end
--[==[Given a list of types as strings, returns true if the language has all of them.]==]
function Language:hasType(...)
Language.hasType = require(language_like_module).hasType
return self:hasType(...)
end
--[==[Returns a table containing <code>WikimediaLanguage</code> objects (see [[Module:wikimedia languages]]), which represent languages and their codes as they are used in Wikimedia projects for interwiki linking and such. More than one object may be returned, as a single Wiktionary language may correspond to multiple Wikimedia languages. For example, Wiktionary's single code <code>sh</code> (Serbo-Croatian) maps to four Wikimedia codes: <code>sh</code> (Serbo-Croatian), <code>bs</code> (Bosnian), <code>hr</code> (Croatian) and <code>sr</code> (Serbian).
The code for the Wikimedia language is retrieved from the <code>wikimedia_codes</code> property in the data modules. If that property is not present, the code of the current language is used. If none of the available codes is actually a valid Wikimedia code, an empty table is returned.]==]
function Language:getWikimediaLanguages()
local wm_langs = self._wikimediaLanguageObjects
if wm_langs == nil then
local codes = self:getWikimediaLanguageCodes()
wm_langs = {}
for i = 1, #codes do
wm_langs[i] = get_wikimedia_lang(codes[i])
end
self._wikimediaLanguageObjects = wm_langs
end
return wm_langs
end
function Language:getWikimediaLanguageCodes()
local wm_langs = self._wikimediaLanguageCodes
if wm_langs == nil then
wm_langs = self._data.wikimedia_codes
if wm_langs then
wm_langs = split(wm_langs, ",", true, true)
else
local code = self._code
if is_known_language_tag(code) then
wm_langs = {code}
else
-- Inherit, but only if no codes are specified in the data *and*
-- the language code isn't a valid Wikimedia language code.
local parent = self:getParent()
wm_langs = parent and parent:getWikimediaLanguageCodes() or {}
end
end
self._wikimediaLanguageCodes = wm_langs
end
return wm_langs
end
--[==[
Returns the name of the Wikipedia article for the language. `project` specifies the language and project to retrieve
the article from, defaulting to {"enwiki"} for the English Wikipedia. Normally if specified it should be the project
code for a specific-language Wikipedia e.g. "zhwiki" for the Chinese Wikipedia, but it can be any project, including
non-Wikipedia ones. If the project is the English Wikipedia and the property {wikipedia_article} is present in the data
module it will be used first. In all other cases, a sitelink will be generated from {:getWikidataItem} (if set). The
resulting value (or lack of value) is cached so that subsequent calls are fast. If no value could be determined, and
`noCategoryFallback` is {false}, {:getCategoryName} is used as fallback; otherwise, {nil} is returned. Note that if
`noCategoryFallback` is {nil} or omitted, it defaults to {false} if the project is the English Wikipedia, otherwise
to {true}. In other words, under normal circumstances, if the English Wikipedia article couldn't be retrieved, the
return value will fall back to a link to the language's category, but this won't normally happen for any other project.
]==]
function Language:getWikipediaArticle(noCategoryFallback, project)
Language.getWikipediaArticle = require(language_like_module).getWikipediaArticle
return self:getWikipediaArticle(noCategoryFallback, project)
end
function Language:makeWikipediaLink()
return make_link(self, "w:" .. self:getWikipediaArticle(), self:getCanonicalName())
end
--[==[Returns the name of the Wikimedia Commons category page for the language.]==]
function Language:getCommonsCategory()
Language.getCommonsCategory = require(language_like_module).getCommonsCategory
return self:getCommonsCategory()
end
--[==[Returns the Wikidata item id for the language or <code>nil</code>. This corresponds to the the second field in the data modules.]==]
function Language:getWikidataItem()
Language.getWikidataItem = require(language_like_module).getWikidataItem
return self:getWikidataItem()
end
--[==[Returns a table of <code>Script</code> objects for all scripts that the language is written in. See [[Module:scripts]].]==]
function Language:getScripts()
local scripts = self._scriptObjects
if scripts == nil then
local codes = self:getScriptCodes()
if codes[1] == "All" then
scripts = load_data(scripts_data_module)
else
scripts = {}
for i = 1, #codes do
scripts[i] = get_script(codes[i])
end
end
self._scriptObjects = scripts
end
return scripts
end
--[==[Returns the table of script codes in the language's data file.]==]
function Language:getScriptCodes()
local scripts = self._scriptCodes
if scripts == nil then
scripts = self._data[4]
if scripts then
local codes, n = {}, 0
for code in gmatch(scripts, "[^,]+") do
n = n + 1
-- Special handling of "Hants", which represents "Hani", "Hant" and "Hans" collectively.
if code == "Hants" then
codes[n] = "Hani"
codes[n + 1] = "Hant"
codes[n + 2] = "Hans"
n = n + 2
else
codes[n] = code
end
end
scripts = codes
else
scripts = {"None"}
end
self._scriptCodes = scripts
end
return scripts
end
--[==[Given some text, this function iterates through the scripts of a given language and tries to find the script that best matches the text. It returns a {{code|lua|Script}} object representing the script. If no match is found at all, it returns the {{code|lua|None}} script object.]==]
function Language:findBestScript(text, forceDetect)
if not text or text == "" or text == "-" then
return get_script("None")
end
-- Differs from table returned by getScriptCodes, as Hants is not normalized into its constituents.
local codes = self._bestScriptCodes
if codes == nil then
codes = self._data[4]
codes = codes and split(codes, ",", true, true) or {"None"}
self._bestScriptCodes = codes
end
local first_sc = codes[1]
if first_sc == "All" then
return find_best_script_without_lang(text)
end
local codes_len = #codes
if not (forceDetect or first_sc == "Hants" or codes_len > 1) then
first_sc = get_script(first_sc)
local charset = first_sc.characters
return charset and umatch(text, "[" .. charset .. "]") and first_sc or get_script("None")
end
-- Remove all formatting characters.
text = get_plaintext(text)
-- Remove all spaces and any ASCII punctuation. Some non-ASCII punctuation is script-specific, so can't be removed.
text = ugsub(text, "[%s!\"#%%&'()*,%-./:;?@[\\%]_{}]+", "")
if #text == 0 then
return get_script("None")
end
-- Try to match every script against the text,
-- and return the one with the most matching characters.
local bestcount, bestscript, length = 0
for i = 1, codes_len do
local sc = codes[i]
-- Special case for "Hants", which is a special code that represents whichever of "Hant" or "Hans" best matches, or "Hani" if they match equally. This avoids having to list all three. In addition, "Hants" will be treated as the best match if there is at least one matching character, under the assumption that a Han script is desirable in terms that contain a mix of Han and other scripts (not counting those which use Jpan or Kore).
if sc == "Hants" then
local Hani = get_script("Hani")
if not Hant_chars then
Hant_chars = load_data("Module:zh/data/ts")
Hans_chars = load_data("Module:zh/data/st")
end
local t, s, found = 0, 0
-- This is faster than using mw.ustring.gmatch directly.
for ch in gmatch(ugsub(text, "[" .. Hani.characters .. "]", "\255%0"), "\255(.[\128-\191]*)") do
found = true
if Hant_chars[ch] then
t = t + 1
if Hans_chars[ch] then
s = s + 1
end
elseif Hans_chars[ch] then
s = s + 1
else
t, s = t + 1, s + 1
end
end
if found then
if t == s then
return Hani
end
return get_script(t > s and "Hant" or "Hans")
end
else
sc = get_script(sc)
if not length then
length = ulen(text)
end
-- Count characters by removing everything in the script's charset and comparing to the original length.
local charset = sc.characters
local count = charset and length - ulen(ugsub(text, "[" .. charset .. "]+", "")) or 0
if count >= length then
return sc
elseif count > bestcount then
bestcount = count
bestscript = sc
end
end
end
-- Return best matching script, or otherwise None.
return bestscript or get_script("None")
end
--[==[Returns a <code>Family</code> object for the language family that the language belongs to. See [[Module:families]].]==]
function Language:getFamily()
local family = self._familyObject
if family == nil then
family = self:getFamilyCode()
-- If the value is nil, it's cached as false.
family = family and get_family(family) or false
self._familyObject = family
end
return family or nil
end
--[==[Returns the family code in the language's data file.]==]
function Language:getFamilyCode()
local family = self._familyCode
if family == nil then
-- If the value is nil, it's cached as false.
family = self._data[3] or false
self._familyCode = family
end
return family or nil
end
function Language:getFamilyName()
local family = self._familyName
if family == nil then
family = self:getFamily()
-- If the value is nil, it's cached as false.
family = family and family:getCanonicalName() or false
self._familyName = family
end
return family or nil
end
do
local function check_family(self, family)
if type(family) == "table" then
family = family:getCode()
end
if self:getFamilyCode() == family then
return true
end
local self_family = self:getFamily()
if self_family:inFamily(family) then
return true
-- If the family isn't a real family (e.g. creoles) check any ancestors.
elseif self_family:inFamily("qfa-not") then
local ancestors = self:getAncestors()
for _, ancestor in ipairs(ancestors) do
if ancestor:inFamily(family) then
return true
end
end
end
end
--[==[Check whether the language belongs to `family` (which can be a family code or object). A list of objects can be given in place of `family`; in that case, return true if the language belongs to any of the specified families. Note that some languages (in particular, certain creoles) can have multiple immediate ancestors potentially belonging to different families; in that case, return true if the language belongs to any of the specified families.]==]
function Language:inFamily(...)
if self:getFamilyCode() == nil then
return false
end
return check_inputs(self, check_family, false, ...)
end
end
function Language:getParent()
local parent = self._parentObject
if parent == nil then
parent = self:getParentCode()
-- If the value is nil, it's cached as false.
parent = parent and get_by_code(parent, nil, true, true) or false
self._parentObject = parent
end
return parent or nil
end
function Language:getParentCode()
local parent = self._parentCode
if parent == nil then
-- If the value is nil, it's cached as false.
parent = self._data.parent or false
self._parentCode = parent
end
return parent or nil
end
function Language:getParentName()
local parent = self._parentName
if parent == nil then
parent = self:getParent()
-- If the value is nil, it's cached as false.
parent = parent and parent:getCanonicalName() or false
self._parentName = parent
end
return parent or nil
end
function Language:getParentChain()
local chain = self._parentChain
if chain == nil then
chain = {}
local parent, n = self:getParent(), 0
while parent do
n = n + 1
chain[n] = parent
parent = parent:getParent()
end
self._parentChain = chain
end
return chain
end
do
local function check_lang(self, lang)
for _, parent in ipairs(self:getParentChain()) do
if (type(lang) == "string" and lang or lang:getCode()) == parent:getCode() then
return true
end
end
end
function Language:hasParent(...)
return check_inputs(self, check_lang, false, ...)
end
end
--[==[
If the language is etymology-only, this iterates through parents until a full language or family is found, and the
corresponding object is returned. If the language is a full language, then it simply returns itself.
]==]
function Language:getFull()
local full = self._fullObject
if full == nil then
full = self:getFullCode()
full = full == self._code and self or get_by_code(full)
self._fullObject = full
end
return full
end
--[==[
If the language is an etymology-only language, this iterates through parents until a full language or family is
found, and the corresponding code is returned. If the language is a full language, then it simply returns the
language code.
]==]
function Language:getFullCode()
return self._fullCode or self._code
end
--[==[
If the language is an etymology-only language, this iterates through parents until a full language or family is
found, and the corresponding canonical name is returned. If the language is a full language, then it simply returns
the canonical name of the language.
]==]
function Language:getFullName()
local full = self._fullName
if full == nil then
full = self:getFull():getCanonicalName()
self._fullName = full
end
return full
end
--[==[Returns a table of <code class="nf">Language</code> objects for all languages that this language is directly descended from. Generally this is only a single language, but creoles, pidgins and mixed languages can have multiple ancestors.]==]
function Language:getAncestors()
local ancestors = self._ancestorObjects
if ancestors == nil then
ancestors = {}
local ancestor_codes = self:getAncestorCodes()
if #ancestor_codes > 0 then
for _, ancestor in ipairs(ancestor_codes) do
insert(ancestors, get_by_code(ancestor, nil, true))
end
else
local fam = self:getFamily()
local protoLang = fam and fam:getProtoLanguage() or nil
-- For the cases where the current language is the proto-language
-- of its family, or an etymology-only language that is ancestral to that
-- proto-language, we need to step up a level higher right from the
-- start.
if protoLang and (
protoLang:getCode() == self._code or
(self:hasType("etymology-only") and protoLang:hasAncestor(self))
) then
fam = fam:getFamily()
protoLang = fam and fam:getProtoLanguage() or nil
end
while not protoLang and not (not fam or fam:getCode() == "qfa-not") do
fam = fam:getFamily()
protoLang = fam and fam:getProtoLanguage() or nil
end
insert(ancestors, protoLang)
end
self._ancestorObjects = ancestors
end
return ancestors
end
do
-- Avoid a language being its own ancestor via class inheritance. We only need to check for this if the language has inherited an ancestor table from its parent, because we never want to drop ancestors that have been explicitly set in the data.
-- Recursively iterate over ancestors until we either find self or run out. If self is found, return true.
local function check_ancestor(self, lang)
local codes = lang:getAncestorCodes()
if not codes then
return nil
end
for i = 1, #codes do
local code = codes[i]
if code == self._code then
return true
end
local anc = get_by_code(code, nil, true)
if check_ancestor(self, anc) then
return true
end
end
end
--[==[Returns a table of <code class="nf">Language</code> codes for all languages that this language is directly descended from. Generally this is only a single language, but creoles, pidgins and mixed languages can have multiple ancestors.]==]
function Language:getAncestorCodes()
if self._ancestorCodes then
return self._ancestorCodes
end
local data = self._data
local codes = data.ancestors
if codes == nil then
codes = {}
self._ancestorCodes = codes
return codes
end
codes = split(codes, ",", true, true)
self._ancestorCodes = codes
-- If there are no codes or the ancestors weren't inherited data, there's nothing left to check.
if #codes == 0 or self:getData(false, "raw").ancestors ~= nil then
return codes
end
local i, code = 1
while i <= #codes do
code = codes[i]
if check_ancestor(self, self) then
remove(codes, i)
else
i = i + 1
end
end
return codes
end
end
--[==[Given a list of language objects or codes, returns true if at least one of them is an ancestor. This includes any etymology-only children of that ancestor. If the language's ancestor(s) are etymology-only languages, it will also return true for those language parent(s) (e.g. if Vulgar Latin is the ancestor, it will also return true for its parent, Latin). However, a parent is excluded from this if the ancestor is also ancestral to that parent (e.g. if Classical Persian is the ancestor, Persian would return false, because Classical Persian is also ancestral to Persian).]==]
function Language:hasAncestor(...)
local function iterateOverAncestorTree(node, func, parent_check)
local ancestors = node:getAncestors()
local ancestorsParents = {}
for _, ancestor in ipairs(ancestors) do
local ret = func(ancestor) or iterateOverAncestorTree(ancestor, func, parent_check)
if ret then
return ret
end
end
-- Check the parents of any ancestors. We don't do this if checking the parents of the other language, so that we exclude any etymology-only children of those parents that are not directly related (e.g. if the ancestor is Vulgar Latin and we are checking New Latin, we want it to return false because they are on different ancestral branches. As such, if we're already checking the parent of New Latin (Latin) we don't want to compare it to the parent of the ancestor (Latin), as this would be a false positive; it should be one or the other).
if not parent_check then
return nil
end
for _, ancestor in ipairs(ancestors) do
local ancestorParents = ancestor:getParentChain()
for _, ancestorParent in ipairs(ancestorParents) do
if ancestorParent:getCode() == self._code or ancestorParent:hasAncestor(ancestor) then
break
else
insert(ancestorsParents, ancestorParent)
end
end
end
for _, ancestorParent in ipairs(ancestorsParents) do
local ret = func(ancestorParent)
if ret then
return ret
end
end
end
local function do_iteration(otherlang, parent_check)
-- otherlang can't be self
if (type(otherlang) == "string" and otherlang or otherlang:getCode()) == self._code then
return false
end
repeat
if iterateOverAncestorTree(
self,
function(ancestor)
return ancestor:getCode() == (type(otherlang) == "string" and otherlang or otherlang:getCode())
end,
parent_check
) then
return true
elseif type(otherlang) == "string" then
otherlang = get_by_code(otherlang, nil, true)
end
otherlang = otherlang:getParent()
parent_check = false
until not otherlang
end
local parent_check = true
for _, otherlang in ipairs{...} do
local ret = do_iteration(otherlang, parent_check)
if ret then
return true
end
end
return false
end
do
local function construct_node(lang, memo)
local branch, ancestors = {lang = lang:getCode()}
memo[lang:getCode()] = branch
for _, ancestor in ipairs(lang:getAncestors()) do
if ancestors == nil then
ancestors = {}
end
insert(ancestors, memo[ancestor:getCode()] or construct_node(ancestor, memo))
end
branch.ancestors = ancestors
return branch
end
function Language:getAncestorChain()
local chain = self._ancestorChain
if chain == nil then
chain = construct_node(self, {})
self._ancestorChain = chain
end
return chain
end
end
function Language:getAncestorChainOld()
local chain = self._ancestorChain
if chain == nil then
chain = {}
local step = self
while true do
local ancestors = step:getAncestors()
step = #ancestors == 1 and ancestors[1] or nil
if not step then
break
end
insert(chain, step)
end
self._ancestorChain = chain
end
return chain
end
local function fetch_descendants(self, fmt)
local descendants, family = {}, self:getFamily()
-- Iterate over all three datasets.
for _, data in ipairs{
require("Module:languages/code to canonical name"),
require("Module:etymology languages/code to canonical name"),
require("Module:families/code to canonical name"),
} do
for code in pairs(data) do
local lang = get_by_code(code, nil, true, true)
-- Test for a descendant. Earlier tests weed out most candidates, while the more intensive tests are only used sparingly.
if (
code ~= self._code and -- Not self.
lang:inFamily(family) and -- In the same family.
(
family:getProtoLanguageCode() == self._code or -- Self is the protolanguage.
self:hasDescendant(lang) or -- Full hasDescendant check.
(lang:getFullCode() == self._code and not self:hasAncestor(lang)) -- Etymology-only child which isn't an ancestor.
)
) then
if fmt == "object" then
insert(descendants, lang)
elseif fmt == "code" then
insert(descendants, code)
elseif fmt == "name" then
insert(descendants, lang:getCanonicalName())
end
end
end
end
return descendants
end
function Language:getDescendants()
local descendants = self._descendantObjects
if descendants == nil then
descendants = fetch_descendants(self, "object")
self._descendantObjects = descendants
end
return descendants
end
function Language:getDescendantCodes()
local descendants = self._descendantCodes
if descendants == nil then
descendants = fetch_descendants(self, "code")
self._descendantCodes = descendants
end
return descendants
end
function Language:getDescendantNames()
local descendants = self._descendantNames
if descendants == nil then
descendants = fetch_descendants(self, "name")
self._descendantNames = descendants
end
return descendants
end
do
local function check_lang(self, lang)
if type(lang) == "string" then
lang = get_by_code(lang, nil, true)
end
if lang:hasAncestor(self) then
return true
end
end
function Language:hasDescendant(...)
return check_inputs(self, check_lang, false, ...)
end
end
local function fetch_children(self, fmt)
local m_etym_data = require(etymology_languages_data_module)
local self_code, children = self._code, {}
for code, lang in pairs(m_etym_data) do
local _lang = lang
repeat
local parent = _lang.parent
if parent == self_code then
if fmt == "object" then
insert(children, get_by_code(code, nil, true))
elseif fmt == "code" then
insert(children, code)
elseif fmt == "name" then
insert(children, lang[1])
end
break
end
_lang = m_etym_data[parent]
until not _lang
end
return children
end
function Language:getChildren()
local children = self._childObjects
if children == nil then
children = fetch_children(self, "object")
self._childObjects = children
end
return children
end
function Language:getChildrenCodes()
local children = self._childCodes
if children == nil then
children = fetch_children(self, "code")
self._childCodes = children
end
return children
end
function Language:getChildrenNames()
local children = self._childNames
if children == nil then
children = fetch_children(self, "name")
self._childNames = children
end
return children
end
function Language:hasChild(...)
local lang = ...
if not lang then
return false
elseif type(lang) == "string" then
lang = get_by_code(lang, nil, true)
end
if lang:hasParent(self) then
return true
end
return self:hasChild(select(2, ...))
end
--[==[Returns the name of the main category of that language. Example: {{code|lua|"French language"}} for French, whose category is at [[:Category:French language]]. Unless optional argument <code>nocap</code> is given, the language name at the beginning of the returned value will be capitalized. This capitalization is correct for category names, but not if the language name is lowercase and the returned value of this function is used in the middle of a sentence.]==]
function Language:getCategoryName(nocap)
local name = self._categoryName
if name == nil then
name = self:getCanonicalName()
-- If a substrate, omit any leading article.
if self:getFamilyCode() == "qfa-sub" then
name = name:gsub("^ ", ""):gsub("^ ", "")
end
-- Only add " language" if a full language.
if self:hasType("full") then
-- Unless the canonical name already ends with "language", "lect" or their derivatives, add " language".
if not (match(name, "[Rr]eo$") or match(name, "[Ll]ect$")) then
name = "Reo " .. name
end
end
self._categoryName = name
end
if nocap then
return name
end
return mw.getContentLanguage():ucfirst(name)
end
--[==[Creates a link to the category; the link text is the canonical name.]==]
function Language:makeCategoryLink()
return make_link(self, ":Category:" .. self:getCategoryName(), self:getDisplayForm())
end
function Language:getStandardCharacters(sc)
local standard_chars = self._data.standardChars
if type(standard_chars) ~= "table" then
return standard_chars
elseif sc and type(sc) ~= "string" then
check_object("script", nil, sc)
sc = sc:getCode()
end
if (not sc) or sc == "None" then
local scripts = {}
for _, script in pairs(standard_chars) do
insert(scripts, script)
end
return concat(scripts)
end
if standard_chars[sc] then
return standard_chars[sc] .. (standard_chars[1] or "")
end
end
--[==[Make the entry name (i.e. the correct page name).]==]
function Language:makeEntryName(text, sc)
if (not text) or text == "" then
return text, nil, {}
end
-- Set `unsupported` as true if certain conditions are met.
local unsupported
-- Check if there's an unsupported character. \239\191\189 is the replacement character U+FFFD, which can't be typed directly here due to an abuse filter. Unix-style dot-slash notation is also unsupported, as it is used for relative paths in links, as are 3 or more consecutive tildes.
-- Note: match is faster with magic characters/charsets; find is faster with plaintext.
if (
match(text, "[#<>%[%]_{|}]") or
find(text, "\239\191\189") or
match(text, "%f[^%z/]%.%.?%f[%z/]") or
find(text, "~~~")
) then
unsupported = true
-- If it looks like an interwiki link.
elseif find(text, ":") then
local prefix = gsub(text, "^:*(.-):.*", ulower)
if (
load_data("Module:data/namespaces")[prefix] or
load_data("Module:data/interwikis")[prefix]
) then
unsupported = true
end
end
-- Check if the text is a listed unsupported title.
local unsupportedTitles = load_data(links_data_module).unsupported_titles
if unsupportedTitles[text] then
return "Unsupported titles/" .. unsupportedTitles[text], nil, {}
end
sc = checkScript(text, self, sc)
local fail, cats
text = normalize(text, sc)
text, fail, cats = iterateSectionSubstitutions(self, text, sc, nil, nil, self._data.entry_name, "makeEntryName")
text = umatch(text, "^[¿¡]?(.-[^%s%p].-)%s*[؟?!;՛՜ ՞ ՟?!︖︕।॥။၊་།]?$") or text
-- Escape unsupported characters so they can be used in titles. ` is used as a delimiter for this, so a raw use of it in an unsupported title is also escaped here to prevent interference; this is only done with unsupported titles, though, so inclusion won't in itself mean a title is treated as unsupported (which is why it's excluded from the earlier test).
if unsupported then
local unsupported_characters = load_data(links_data_module).unsupported_characters
text = text:gsub("[#<>%[%]_`{|}\239]\191?\189?", unsupported_characters)
:gsub("%f[^%z/]%.%.?%f[%z/]", function(m)
return gsub(m, "%.", "`period`")
end)
:gsub("~~~+", function(m)
return gsub(m, "~", "`tilde`")
end)
text = "Unsupported titles/" .. text
end
return text, fail, cats
end
--[==[Generates alternative forms using a specified method, and returns them as a table. If no method is specified, returns a table containing only the input term.]==]
function Language:generateForms(text, sc)
local generate_forms = self._data.generate_forms
if generate_forms == nil then
return {text}
end
sc = checkScript(text, self, sc)
return require("Module:" .. self._data.generate_forms).generateForms(text, self, sc)
end
--[==[Creates a sort key for the given entry name, following the rules appropriate for the language. This removes diacritical marks from the entry name if they are not considered significant for sorting, and may perform some other changes. Any initial hyphen is also removed, and anything parentheses is removed as well.
The <code>sort_key</code> setting for each language in the data modules defines the replacements made by this function, or it gives the name of the module that takes the entry name and returns a sortkey.]==]
function Language:makeSortKey(text, sc)
if (not text) or text == "" then
return text, nil, {}
end
if match(text, "<[^<>]+>") then
track("track HTML tag")
end
-- Remove directional characters, soft hyphens, strip markers and HTML tags.
text = ugsub(text, "[\194\173\226\128\170-\226\128\174\226\129\166-\226\129\169]", "")
text = gsub(unstrip(text), "<[^<>]+>", "")
text = decode_uri(text, "PATH")
text = checkNoEntities(self, text)
-- Remove initial hyphens and * unless the term only consists of spacing + punctuation characters.
text = ugsub(text, "^([-]*)[-־ـ᠊*]+([-]*)(.*[^%s%p].*)", "%1%2%3")
sc = checkScript(text, self, sc)
text = normalize(text, sc)
text = removeCarets(text, sc)
-- For languages with dotted dotless i, ensure that "İ" is sorted as "i", and "I" is sorted as "ı".
if self:hasDottedDotlessI() then
text = gsub(text, "I\204\135", "i") -- decomposed "İ"
:gsub("I", "ı")
text = sc:toFixedNFD(text)
end
-- Convert to lowercase, make the sortkey, then convert to uppercase. Where the language has dotted dotless i, it is usually not necessary to convert "i" to "İ" and "ı" to "I" first, because "I" will always be interpreted as conventional "I" (not dotless "İ") by any sorting algorithms, which will have been taken into account by the sortkey substitutions themselves. However, if no sortkey substitutions have been specified, then conversion is necessary so as to prevent "i" and "ı" both being sorted as "I".
-- An exception is made for scripts that (sometimes) sort by scraping page content, as that means they are sensitive to changes in capitalization (as it changes the target page).
local fail, cats
if not sc:sortByScraping() then
text = ulower(text)
end
local sort_key = self._data.sort_key
text, fail, cats = iterateSectionSubstitutions(self, text, sc, nil, nil, sort_key, "makeSortKey")
if not sc:sortByScraping() then
if self:hasDottedDotlessI() and not sort_key then
text = gsub(gsub(text, "ı", "I"), "i", "İ")
text = sc:toFixedNFC(text)
end
text = uupper(text)
end
-- Remove parentheses, as long as they are either preceded or followed by something.
text = gsub(text, "(.)[()]+", "%1")
:gsub("[()]+(.)", "%1")
text = escape_risky_characters(text)
return text, fail, cats
end
--[==[Create the form used as as a basis for display text and transliteration.]==]
local function processDisplayText(text, self, sc, keepCarets, keepPrefixes)
local subbedChars = {}
text, subbedChars = doTempSubstitutions(text, subbedChars, keepCarets)
text = decode_uri(text, "PATH")
text = checkNoEntities(self, text)
sc = checkScript(text, self, sc)
local fail, cats
text = normalize(text, sc)
text, fail, cats, subbedChars = iterateSectionSubstitutions(self, text, sc, subbedChars, keepCarets, self._data.display_text, "makeDisplayText")
text = removeCarets(text, sc)
-- Remove any interwiki link prefixes (unless they have been escaped or this has been disabled).
if find(text, ":") and not keepPrefixes then
local rep
repeat
text, rep = gsub(text, "\\\\(\\*:)", "\3%1")
until rep == 0
text = gsub(text, "\\:", "\4")
while true do
local prefix = gsub(text, "^(.-):.+", function(m1)
return gsub(m1, "\244[\128-\191]*", "")
end)
-- Check if the prefix is an interwiki, though ignore capitalised Wiktionary:, which is a namespace.
if not prefix or prefix == text or prefix == "Wiktionary"
or not (load_data("Module:data/interwikis")[ulower(prefix)] or prefix == "") then
break
end
text = gsub(text, "^(.-):(.*)", function(m1, m2)
local ret = {}
for subbedChar in gmatch(m1, "\244[\128-\191]*") do
insert(ret, subbedChar)
end
return concat(ret) .. m2
end)
end
text = gsub(text, "\3", "\\")
:gsub("\4", ":")
end
return text, fail, cats, subbedChars
end
--[==[Make the display text (i.e. what is displayed on the page).]==]
function Language:makeDisplayText(text, sc, keepPrefixes)
if (not text) or text == "" then
return text, nil, {}
end
local fail, cats, subbedChars
text, fail, cats, subbedChars = processDisplayText(text, self, sc, nil, keepPrefixes)
text = escape_risky_characters(text)
return undoTempSubstitutions(text, subbedChars), fail, cats
end
--[==[Transliterates the text from the given script into the Latin script (see [[Wiktionary:Transliteration and romanization]]). The language must have the <code>translit</code> property for this to work; if it is not present, {{code|lua|nil}} is returned.
Returns three values:
# The transliteration.
# A boolean which indicates whether the transliteration failed for an unexpected reason. If {{code|lua|false}}, then the transliteration either succeeded, or the module is returning nothing in a controlled way (e.g. the input was {{code|lua|"-"}}). Generally, this means that no maintenance action is required. If {{code|lua|true}}, then the transliteration is {{code|lua|nil}} because either the input or output was defective in some way (e.g. [[Module:ar-translit]] will not transliterate non-vocalised inputs, and this module will fail partially-completed transliterations in all languages). Note that this value can be manually set by the transliteration module, so make sure to cross-check to ensure it is accurate.
# A table of categories selected by the transliteration module, which should be in the format expected by {{code|lua|format_categories}} in [[Module:utilities]].
The <code>sc</code> parameter is handled by the transliteration module, and how it is handled is specific to that module. Some transliteration modules may tolerate {{code|lua|nil}} as the script, others require it to be one of the possible scripts that the module can transliterate, and will show an error if it's not one of them. For this reason, the <code>sc</code> parameter should always be provided when writing non-language-specific code.
The <code>module_override</code> parameter is used to override the default module that is used to provide the transliteration. This is useful in cases where you need to demonstrate a particular module in use, but there is no default module yet, or you want to demonstrate an alternative version of a transliteration module before making it official. It should not be used in real modules or templates, only for testing. All uses of this parameter are tracked by [[Wiktionary:Tracking/languages/module_override]].
'''Known bugs''':
* This function assumes {tr(s1) .. tr(s2) == tr(s1 .. s2)}. When this assertion fails, wikitext markups like <nowiki>'''</nowiki> can cause wrong transliterations.
* HTML entities like <code>&apos;</code>, often used to escape wikitext markups, do not work.]==]
function Language:transliterate(text, sc, module_override)
-- If there is no text, or the language doesn't have transliteration data and there's no override, return nil.
if not (self._data.translit or module_override) then
return nil, false, {}
elseif (not text) or text == "" or text == "-" then
return text, false, {}
end
-- If the script is not transliteratable (and no override is given), return nil.
sc = checkScript(text, self, sc)
if not (sc:isTransliterated() or module_override) then
-- temporary tracking to see if/when this gets triggered
track("non-transliterable")
track("non-transliterable/" .. self._code)
track("non-transliterable/" .. sc:getCode())
track("non-transliterable/" .. sc:getCode() .. "/" .. self._code)
return nil, true, {}
end
-- Remove any strip markers.
text = unstrip(text)
-- Do not process the formatting into PUA characters for certain languages.
local processed = load_data(languages_data_module).substitution[self._code] ~= "none"
-- Get the display text with the keepCarets flag set.
local fail, cats, subbedChars
if processed then
text, fail, cats, subbedChars = processDisplayText(text, self, sc, true)
end
-- Transliterate (using the module override if applicable).
text, fail, cats, subbedChars = iterateSectionSubstitutions(self, text, sc, subbedChars, true, module_override or self._data.translit, "tr")
if not text then
return nil, true, cats
end
-- Incomplete transliterations return nil.
local charset = sc.characters
if charset and umatch(text, "[" .. charset .. "]") then
-- Remove any characters in Latin, which includes Latin characters also included in other scripts (as these are false positives), as well as any PUA substitutions. Anything remaining should only be script code "None" (e.g. numerals).
local check_text = ugsub(text, "[" .. get_script("Latn").characters .. "-]+", "")
-- Set none_is_last_resort_only flag, so that any non-None chars will cause a script other than "None" to be returned.
if find_best_script_without_lang(check_text, true):getCode() ~= "None" then
return nil, true, cats
end
end
if processed then
text = escape_risky_characters(text)
text = undoTempSubstitutions(text, subbedChars)
end
-- If the script does not use capitalization, then capitalize any letters of the transliteration which are immediately preceded by a caret (and remove the caret).
if text and not sc:hasCapitalization() and text:find("^", 1, true) then
text = processCarets(text, "%^([\128-\191\244]*%*?)([^\128-\191\244][\128-\191]*)", function(m1, m2)
return m1 .. uupper(m2)
end)
end
-- Track module overrides.
if module_override ~= nil then
track("module_override")
end
fail = text == nil and (not not fail) or false
return text, fail, cats
end
do
local function handle_language_spec(self, spec, sc)
local ret = self["_" .. spec]
if ret == nil then
ret = self._data[spec]
if type(ret) == "string" then
ret = list_to_set(split(ret, ",", true, true))
end
self["_" .. spec] = ret
end
if type(ret) == "table" then
ret = ret[sc:getCode()]
end
return not not ret
end
function Language:overrideManualTranslit(sc)
return handle_language_spec(self, "override_translit", sc)
end
function Language:link_tr(sc)
return handle_language_spec(self, "link_tr", sc)
end
end
--[==[Returns {{code|lua|true}} if the language has a transliteration module, or {{code|lua|false}} if it doesn't.]==]
function Language:hasTranslit()
return not not self._data.translit
end
--[==[Returns {{code|lua|true}} if the language uses the letters I/ı and İ/i, or {{code|lua|false}} if it doesn't.]==]
function Language:hasDottedDotlessI()
return not not self._data.dotted_dotless_i
end
function Language:toJSON(opts)
local entry_name, entry_name_patterns, entry_name_remove_diacritics = self._data.entry_name
if entry_name then
if entry_name.from then
entry_name_patterns = {}
for i, from in ipairs(entry_name.from) do
insert(entry_name_patterns, {from = from, to = entry_name.to[i] or ""})
end
end
entry_name_remove_diacritics = entry_name.remove_diacritics
end
-- mainCode should only end up non-nil if dontCanonicalizeAliases is passed to make_object().
local ret = {
ancestors = self:getAncestorCodes(),
canonicalName = self:getCanonicalName(),
categoryName = self:getCategoryName("nocap"),
code = self._code,
mainCode = self._mainCode,
parent = self:getParentCode(),
full = self:getFullCode(),
entryNamePatterns = entry_name_patterns,
entryNameRemoveDiacritics = entry_name_remove_diacritics,
family = self:getFamilyCode(),
aliases = self:getAliases(),
varieties = self:getVarieties(),
otherNames = self:getOtherNames(),
scripts = self:getScriptCodes(),
type = keys_to_list(self:getTypes()),
wikimediaLanguages = self:getWikimediaLanguageCodes(),
wikidataItem = self:getWikidataItem(),
wikipediaArticle = self:getWikipediaArticle(true),
}
-- Use `deep_copy` when returning a table, so that there are no editing restrictions imposed by `mw.loadData`.
return opts and opts.lua_table and deep_copy(ret) or to_json(ret, opts)
end
function export.getDataModuleName(code)
local letter = match(code, "^(%l)%l%l?$")
return "Module:" .. (
letter == nil and "languages/data/exceptional" or
#code == 2 and "languages/data/2" or
"languages/data/3/" .. letter
)
end
get_data_module_name = export.getDataModuleName
function export.getExtraDataModuleName(code)
return get_data_module_name(code) .. "/extra"
end
get_extra_data_module_name = export.getExtraDataModuleName
do
local function make_stack(data)
local key_types = {
[2] = "unique",
aliases = "unique",
otherNames = "unique",
type = "append",
varieties = "unique",
wikipedia_article = "unique",
wikimedia_codes = "unique"
}
local function __index(self, k)
local stack, key_type = getmetatable(self), key_types[k]
-- Data that isn't inherited from the parent.
if key_type == "unique" then
local v = stack[stack[make_stack]][k]
if v == nil then
local layer = stack[0]
if layer then -- Could be false if there's no extra data.
v = layer[k]
end
end
return v
-- Data that is appended by each generation.
elseif key_type == "append" then
local parts, offset, n = {}, 0, stack[make_stack]
for i = 1, n do
local part = stack[i][k]
if part == nil then
offset = offset + 1
else
parts[i - offset] = part
end
end
return offset ~= n and concat(parts, ",") or nil
end
local n = stack[make_stack]
while true do
local layer = stack[n]
if not layer then -- Could be false if there's no extra data.
return nil
end
local v = layer[k]
if v ~= nil then
return v
end
n = n - 1
end
end
local function __newindex()
error("table is read-only")
end
local function __pairs(self)
-- Iterate down the stack, caching keys to avoid duplicate returns.
local stack, seen = getmetatable(self), {}
local n = stack[make_stack]
local iter, state, k, v = pairs(stack[n])
return function()
repeat
repeat
k = iter(state, k)
if k == nil then
n = n - 1
local layer = stack[n]
if not layer then -- Could be false if there's no extra data.
return nil
end
iter, state, k = pairs(layer)
end
until not (k == nil or seen[k])
-- Get the value via a lookup, as the one returned by the
-- iterator will be the raw value from the current layer,
-- which may not be the one __index will return for that
-- key. Also memoize the key in `seen` (even if the lookup
-- returns nil) so that it doesn't get looked up again.
-- TODO: store values in `self`, avoiding the need to create
-- the `seen` table. The iterator will need to iterate over
-- `self` with `next` first to find these on future loops.
v, seen[k] = self[k], true
until v ~= nil
return k, v
end
end
local __ipairs = require(table_module).indexIpairs
function make_stack(data)
local stack = {
data,
[make_stack] = 1, -- stores the length and acts as a sentinel to confirm a given metatable is a stack.
__index = __index,
__newindex = __newindex,
__pairs = __pairs,
__ipairs = __ipairs,
}
stack.__metatable = stack
return setmetatable({}, stack), stack
end
return make_stack(data)
end
local function get_stack(data)
local stack = getmetatable(data)
return stack and type(stack) == "table" and stack[make_stack] and stack or nil
end
--[==[
<span style="color: #BA0000">This function is not for use in entries or other content pages.</span>
Returns a blob of data about the language. The format of this blob is undocumented, and perhaps unstable; it's intended for things like the module's own unit-tests, which are "close friends" with the module and will be kept up-to-date as the format changes. If `extra` is set, any extra data in the relevant `/extra` module will be included. (Note that it will be included anyway if it has already been loaded into the language object.) If `raw` is set, then the returned data will not contain any data inherited from parent objects.
-- Do NOT use these methods!
-- All uses should be pre-approved on the talk page!
]==]
function Language:getData(extra, raw)
if extra then
self:loadInExtraData()
end
local data = self._data
-- If raw is not set, just return the data.
if not raw then
return data
end
local stack = get_stack(data)
-- If there isn't a stack or its length is 1, return the data. Extra data (if any) will be included, as it's stored at key 0 and doesn't affect the reported length.
if stack == nil then
return data
end
local n = stack[make_stack]
if n == 1 then
return data
end
local extra = stack[0]
-- If there isn't any extra data, return the top layer of the stack.
if extra == nil then
return stack[n]
end
-- If there is, return a new stack which has the top layer at key 1 and the extra data at key 0.
data, stack = make_stack(stack[n])
stack[0] = extra
return data
end
function Language:loadInExtraData()
-- Only full languages have extra data.
if not self:hasType("language", "full") then
return
end
local data = self._data
-- If there's no stack, create one.
local stack = get_stack(self._data)
if stack == nil then
data, stack = make_stack(data)
-- If already loaded, return.
elseif stack[0] ~= nil then
return
end
self._data = data
-- Load extra data from the relevant module and add it to the stack at key 0, so that the __index and __pairs metamethods will pick it up, since they iterate down the stack until they run out of layers.
local code = self._code
local modulename = get_extra_data_module_name(code)
-- No data cached as false.
stack[0] = modulename and load_data(modulename)[code] or false
end
--[==[Returns the name of the module containing the language's data. Currently, this is always [[Module:scripts/data]].]==]
function Language:getDataModuleName()
local name = self._dataModuleName
if name == nil then
name = self:hasType("etymology-only") and etymology_languages_data_module or
get_data_module_name(self._mainCode or self._code)
self._dataModuleName = name
end
return name
end
--[==[Returns the name of the module containing the language's data. Currently, this is always [[Module:scripts/data]].]==]
function Language:getExtraDataModuleName()
local name = self._extraDataModuleName
if name == nil then
name = not self:hasType("etymology-only") and get_extra_data_module_name(self._mainCode or self._code) or false
self._extraDataModuleName = name
end
return name or nil
end
function export.makeObject(code, data, dontCanonicalizeAliases)
local data_type = type(data)
if data_type ~= "table" then
error(("bad argument #2 to 'makeObject' (table expected, got %s)"):format(data_type))
end
-- Convert any aliases.
local input_code = code
code = normalize_code(code)
input_code = dontCanonicalizeAliases and input_code or code
local parent
if data.parent then
parent = get_by_code(data.parent, nil, true, true)
else
parent = Language
end
parent.__index = parent
local lang = {_code = input_code}
-- This can only happen if dontCanonicalizeAliases is passed to make_object().
if code ~= input_code then
lang._mainCode = code
end
local parent_data = parent._data
if parent_data == nil then
-- Full code is the same as the code.
lang._fullCode = parent._code or code
else
-- Copy full code.
lang._fullCode = parent._fullCode
local stack = get_stack(parent_data)
if stack == nil then
parent_data, stack = make_stack(parent_data)
end
-- Insert the input data as the new top layer of the stack.
local n = stack[make_stack] + 1
data, stack[n], stack[make_stack] = parent_data, data, n
end
lang._data = data
return setmetatable(lang, parent)
end
make_object = export.makeObject
end
--[==[Finds the language whose code matches the one provided. If it exists, it returns a <code class="nf">Language</code> object representing the language. Otherwise, it returns {{code|lua|nil}}, unless <code class="n">paramForError</code> is given, in which case an error is generated. If <code class="n">paramForError</code> is {{code|lua|true}}, a generic error message mentioning the bad code is generated; otherwise <code class="n">paramForError</code> should be a string or number specifying the parameter that the code came from, and this parameter will be mentioned in the error message along with the bad code. If <code class="n">allowEtymLang</code> is specified, etymology-only language codes are allowed and looked up along with normal language codes. If <code class="n">allowFamily</code> is specified, language family codes are allowed and looked up along with normal language codes.]==]
function export.getByCode(code, paramForError, allowEtymLang, allowFamily)
-- Track uses of paramForError, ultimately so it can be removed, as error-handling should be done by [[Module:parameters]], not here.
if paramForError ~= nil then
track("paramForError")
end
if type(code) ~= "string" then
local typ
if not code then
typ = "nil"
elseif check_object("language", true, code) then
typ = "a language object"
elseif check_object("family", true, code) then
typ = "a family object"
else
typ = "a " .. type(code)
end
error("The function getByCode expects a string as its first argument, but received " .. typ .. ".")
end
local m_data = load_data(languages_data_module)
if m_data.aliases[code] or m_data.track[code] then
track(code)
end
local norm_code = normalize_code(code)
-- Get the data, checking for etymology-only languages if allowEtymLang is set.
local data = load_data(get_data_module_name(norm_code))[norm_code] or
allowEtymLang and load_data(etymology_languages_data_module)[norm_code]
-- If no data was found and allowFamily is set, check the family data. If the main family data was found, make the object with [[Module:families]] instead, as family objects have different methods. However, if it's an etymology-only family, use make_object in this module (which handles object inheritance), and the family-specific methods will be inherited from the parent object.
if data == nil and allowFamily then
data = load_data("Module:families/data")[norm_code]
if data ~= nil then
if data.parent == nil then
return make_family_object(norm_code, data)
elseif not allowEtymLang then
data = nil
end
end
end
local retval = code and data and make_object(code, data)
if not retval and paramForError then
require("Module:languages/errorGetBy").code(code, paramForError, allowEtymLang, allowFamily)
end
return retval
end
get_by_code = export.getByCode
--[==[Finds the language whose canonical name (the name used to represent that language on Wiktionary) or other name matches the one provided. If it exists, it returns a <code class="nf">Language</code> object representing the language. Otherwise, it returns {{code|lua|nil}}, unless <code class="n">paramForError</code> is given, in which case an error is generated. If <code class="n">allowEtymLang</code> is specified, etymology-only language codes are allowed and looked up along with normal language codes. If <code class="n">allowFamily</code> is specified, language family codes are allowed and looked up along with normal language codes.
The canonical name of languages should always be unique (it is an error for two languages on Wiktionary to share the same canonical name), so this is guaranteed to give at most one result.
This function is powered by [[Module:languages/canonical names]], which contains a pre-generated mapping of full-language canonical names to codes. It is generated by going through the [[:Category:Language data modules]] for full languages. When <code class="n">allowEtymLang</code> is specified for the above function, [[Module:etymology languages/canonical names]] may also be used, and when <code class="n">allowFamily</code> is specified for the above function, [[Module:families/canonical names]] may also be used.]==]
function export.getByCanonicalName(name, errorIfInvalid, allowEtymLang, allowFamily)
local byName = load_data("Module:languages/canonical names")
local code = byName and byName[name]
if not code and allowEtymLang then
byName = load_data("Module:etymology languages/canonical names")
code = byName and byName[name] or
byName[gsub(name, " [Ss]ubstrate$", "")] or
byName[gsub(name, "^a ", "")] or
byName[gsub(name, "^a ", ""):gsub(" [Ss]ubstrate$", "")] or
-- For etymology families like "ira-pro".
-- FIXME: This is not ideal, as it allows " languages" to be appended to any etymology-only language, too.
byName[match(name, "^(.*) languages$")]
end
if not code and allowFamily then
byName = load_data("Module:families/canonical names")
code = byName[name] or byName[match(name, "^(.*) languages$")]
end
local retval = code and get_by_code(code, errorIfInvalid, allowEtymLang, allowFamily)
if not retval and errorIfInvalid then
require("Module:languages/errorGetBy").canonicalName(name, allowEtymLang, allowFamily)
end
return retval
end
--[==[Used by [[Module:languages/data/2]] (et al.) and [[Module:etymology languages/data]], [[Module:families/data]], [[Module:scripts/data]] and [[Module:writing systems/data]] to finalize the data into the format that is actually returned.]==]
function export.finalizeData(data, main_type, variety)
local fields = {"type"}
if main_type == "language" then
insert(fields, 4) -- script codes
insert(fields, "ancestors")
insert(fields, "link_tr")
insert(fields, "override_translit")
insert(fields, "wikimedia_codes")
elseif main_type == "script" then
insert(fields, 3) -- writing system codes
end -- Families and writing systems have no extra fields to process.
local fields_len = #fields
for _, entity in next, data do
if variety then
-- Move parent from 3 to "parent" and family from "family" to 3. These are different for the sake of convenience, since very few varieties have the family specified, whereas all of them have a parent.
entity.parent, entity[3], entity.family = entity[3], entity.family
-- Give the type "regular" iff not a variety and no other types are assigned.
elseif not (entity.type or entity.parent) then
entity.type = "regular"
end
for i = 1, fields_len do
local key = fields[i]
local field = entity[key]
if field and type(field) == "string" then
entity[key] = gsub(field, "%s*,%s*", ",")
end
end
end
return data
end
--[==[For backwards compatibility only; modules should require the error themselves.]==]
function export.err(lang_code, param, code_desc, template_tag, not_real_lang)
return require("Module:languages/error")(lang_code, param, code_desc, template_tag, not_real_lang)
end
return export
nutqytv8ahytd26v0jsf3or17u2wkj1
Module:category tree/data
828
5908
17395
17319
2026-07-13T08:16:05Z
Hiyuune
6766
17395
Scribunto
text/plain
local labels = {}
local raw_categories = {}
local handlers = {}
local raw_handlers = {}
local subpages = {
-- It should not matter much what order we do the handlers in, but topic handling historically
-- preceded "poscatboiler" handling (i.e. everything else), so keep it that way for the moment.
"languages",
"miscellaneous",
"wiktionary maintenance",
"wiktionary users",
}
-- Import subpages
for _, subpage in ipairs(subpages) do
local datamodule = "Module:category tree/" .. subpage
local retval = require(datamodule)
if retval["LABELS"] then
for label, data in pairs(retval["LABELS"]) do
if labels[label] and not retval["IGNOREDUP"] then
error("Label " .. label .. " defined in both [["
.. datamodule .. "]] and [[" .. labels[label].module .. "]].")
end
data.module = datamodule
labels[label] = data
end
end
if retval["RAW_CATEGORIES"] then
for category, data in pairs(retval["RAW_CATEGORIES"]) do
if raw_categories[category] and not retval["IGNOREDUP"] then
error("Raw category " .. category .. " defined in both [["
.. datamodule .. "]] and [[" .. raw_categories[category].module .. "]].")
end
data.module = datamodule
raw_categories[category] = data
end
end
if retval["HANDLERS"] then
for _, handler in ipairs(retval["HANDLERS"]) do
table.insert(handlers, { module = datamodule, handler = handler })
end
end
if retval["RAW_HANDLERS"] then
for _, handler in ipairs(retval["RAW_HANDLERS"]) do
table.insert(raw_handlers, { module = datamodule, handler = handler })
end
end
end
-- Add child categories to their parents
local function add_children_to_parents(hierarchy, raw)
for key, data in pairs(hierarchy) do
local parents = data.parents
if parents then
if type(parents) ~= "table" then
parents = {parents}
end
if parents.name or parents.module then
parents = {parents}
end
for _, parent in ipairs(parents) do
if type(parent) ~= "table" or not parent.name and not parent.module then
parent = {name = parent}
end
if parent.name and not parent.module and type(parent.name) == "string" and not parent.name:find("^Category:") then
local parent_is_raw
if raw then
parent_is_raw = not parent.is_label
else
parent_is_raw = parent.raw
end
-- Don't do anything if the child is raw and the parent is lang-specific, otherwise e.g.
-- "Lemmas subcategories by language" will be listed as a child of every "LANG lemmas" category.
-- FIXME: We need to rethink this mechanism.
if not raw or parent_is_raw then
local child_hierarchy = parent_is_raw and raw_categories or labels
if child_hierarchy[parent.name] then
local child = {name = key, sort = parent.sort, raw = raw}
if child_hierarchy[parent.name].children then
table.insert(child_hierarchy[parent.name].children, child)
else
child_hierarchy[parent.name].children = {child}
end
end
end
end
end
end
end
end
add_children_to_parents(labels)
add_children_to_parents(raw_categories, true)
return {
LABELS = labels, RAW_CATEGORIES = raw_categories,
HANDLERS = handlers, RAW_HANDLERS = raw_handlers
}
5cposu2ohi51cpo2zekz21qhe5wu1wi
Module:pages
828
5912
17449
17278
2026-07-13T08:51:48Z
Hiyuune
6766
+ function: physical_to_logical_pagename_if_mammoth
17449
Scribunto
text/plain
local export = {}
local string_utilities_module = "Module:string utilities"
local concat = table.concat
local find = string.find
local format = string.format
local getmetatable = getmetatable
local get_current_section -- defined below
local get_namespace_shortcut -- defined below
local get_pagetype -- defined below
local gsub = string.gsub
local insert = table.insert
local is_internal_title -- defined below
local is_title -- defined below
local lower = string.lower
local match = string.match
local new_title = mw.title.new
local require = require
local sub = string.sub
local title_equals = mw.title.equals
local tonumber = tonumber
local type = type
local ufind = mw.ustring.find
local unstrip_nowiki = mw.text.unstripNoWiki
--[==[
Loaders for functions in other modules, which overwrite themselves with the target function when called. This ensures modules are only loaded when needed, retains the speed/convenience of locally-declared pre-loaded functions, and has no overhead after the first call, since the target functions are called directly in any subsequent calls.]==]
local function decode_entities(...)
decode_entities = require(string_utilities_module).decode_entities
return decode_entities(...)
end
local function ulower(...)
ulower = require(string_utilities_module).lower
return ulower(...)
end
local function trim(...)
trim = require(string_utilities_module).trim
return trim(...)
end
--[==[
Loaders for objects, which load data (or some other object) into some variable, which can then be accessed as "foo or get_foo()", where the function get_foo sets the object to "foo" and then returns it. This ensures they are only loaded when needed, and avoids the need to check for the existence of the object each time, since once "foo" has been set, "get_foo" will not be called again.]==]
local current_frame
local function get_current_frame()
current_frame, get_current_frame = mw.getCurrentFrame(), nil
return current_frame
end
local parent_frame
local function get_parent_frame()
parent_frame, get_parent_frame = (current_frame or get_current_frame()):getParent(), nil
return parent_frame
end
local namespace_shortcuts
local function get_namespace_shortcuts()
namespace_shortcuts, get_namespace_shortcuts = {
[4] = "WT",
[10] = "T",
[14] = "CAT",
[100] = "AP",
[110] = "WS",
[118] = "RC",
[828] = "MOD",
}, nil
return namespace_shortcuts
end
do
local transcluded
--[==[
Returns {true} if the current {{tl|#invoke:}} is being transcluded, or {false} if not. If the current {{tl|#invoke:}} is part of a template, for instance, this template will therefore return {true}.
Note that if a template containing an {{tl|#invoke:}} is used on its own page (e.g. to display a demonstration), this function is still able to detect that this is transclusion. This is an improvement over the other method for detecting transclusion, which is to check the parent frame title against the current page title, which fails to detect transclusion in that instance.]==]
function export.is_transcluded()
if transcluded == nil then
transcluded = (parent_frame or get_parent_frame()) and parent_frame:preprocess("<includeonly>1</includeonly>") == "1" or false
end
return transcluded
end
end
do
local preview
--[==[
Returns {true} if the page is currently being viewed in preview, or {false} if not.]==]
function export.is_preview()
if preview == nil then
preview = (current_frame or get_current_frame()):preprocess("{{REVISIONID}}") == ""
end
return preview
end
end
--[==[
Returns {true} if the input is a title object, or {false} if not. This therefore '''includes''' external title objects (i.e. those for pages on other wikis), such as [[w:Example]], unlike `is_internal_title` below.]==]
function export.is_title(val)
if not (val and type(val) == "table") then
return false
end
local mt = getmetatable(val)
-- There's no foolproof method for checking for a title object, but the
-- __eq metamethod should be mw.title.equals unless the object has been
-- seriously messed around with.
return mt and
type(mt) == "table" and
getmetatable(mt) == nil and
mt.__eq == title_equals and
true or false
end
is_title = export.is_title
--[==[
Returns {true} if the input is an internal title object, or {false} if not. An internal title object is a title object for a page on this wiki, such as [[example]]. This therefore '''excludes''' external title objects (i.e. those for pages on other wikis), such as [[w:Example]], unlike `is_title` above.]==]
function export.is_internal_title(title)
-- Note: Mainspace titles starting with "#" should be invalid, but a bug in mw.title.new and mw.title.makeTitle means a title object is returned that has the empty string for prefixedText, so they need to be filtered out.
return is_title(title) and #title.prefixedText > 0 and #title.interwiki == 0
end
is_internal_title = export.is_internal_title
--[==[
Returns {true} if the input string is a valid link target, or {false} if not. This therefore '''includes''' link targets to other wikis, such as [[w:Example]], unlike `is_valid_page_name` below.]==]
function export.is_valid_link_target(target)
local target_type = type(target)
if target_type == "string" then
return is_title(new_title(target))
end
error(format("bad argument #1 to 'is_valid_link_target' (string expected, got %s)", target_type), 2)
end
--[==[
Returns {true} if the input string is a valid page name on this wiki, or {false} if not. This therefore '''excludes''' page names on other wikis, such as [[w:Example]], unlike `is_valid_link_target` above.]==]
function export.is_valid_page_name(name)
local name_type = type(name)
if name_type == "string" then
return is_internal_title(new_title(name))
end
error(format("bad argument #1 to 'is_valid_page_name' (string expected, got %s)", name_type), 2)
end
--[==[
Given a title object, returns a full link target which will always unambiguously link to it.
For instance, the input {"foo"} (for the page [[foo]]) returns {":foo"}, as a leading colon always refers to mainspace, even when other namespaces might be assumed (e.g. when transcluding using `{{ }}` syntax).
If `shortcut` is set, then the returned target will use the namespace shortcut, if any; for example, the title for `Template:foo` would return {"T:foo"} instead of {"Template:foo"}.]==]
function export.get_link_target(title, shortcut)
if not is_title(title) then
error(format("bad argument #1 to 'is_valid_link_target' (title object expected, got %s)", type(title)))
elseif title.interwiki ~= "" then
return title.fullText
elseif shortcut then
local fragment = title.fragment
if fragment == "" then
return get_namespace_shortcut(title) .. ":" .. title.text
end
return get_namespace_shortcut(title) .. ":" .. title.text .. "#" .. fragment
elseif title.namespace == 0 then
return ":" .. title.fullText
end
return title.fullText
end
do
local function find_sandbox(text)
return find(text, "^User:.") or find(lower(text), "sandbox", 1, true)
end
local function get_transclusion_subtypes(title, main_type, documentation, page_suffix)
local text, subtypes = title.text, {main_type}
-- Any template/module with "sandbox" in the title. These are impossible
-- to screen for more accurately, as there's no consistent pattern. Also
-- any user sandboxes in the form (e.g.) "Template:User:...".
local sandbox = find_sandbox(text)
if sandbox then
insert(subtypes, "sandbox")
end
-- Any template/module testcases (which can be labelled and/or followed
-- by further subpages).
local testcase = find(text, "./[Tt]estcases?%f[%L]")
if testcase then
-- Order "testcase" and "sandbox" based on where the patterns occur
-- in the title.
local n = sandbox and sandbox < testcase and 3 or 2
insert(subtypes, n, "testcase")
end
-- Any template/module documentation pages.
if documentation then
insert(subtypes, "documentation")
end
local final = subtypes[#subtypes]
if not (final == main_type and not page_suffix or final == "sandbox") then
insert(subtypes, "page")
end
return concat(subtypes, " ")
end
local function get_snippet_subtypes(title, main_type, documentation)
local ns = title.namespace
return get_transclusion_subtypes(title, (
ns == 2 and "user " or
ns == 8 and match(title.text, "^Gadget-.") and "gadget " or
""
) .. main_type, documentation)
end
--[==[
Returns the page type of the input title object in a format which can be used in running text.]==]
function export.get_pagetype(title)
if not is_internal_title(title) then
error(mw.dumpObject(title.fullText) .. " is not a valid page name.")
end
-- If possibly a documentation page, get the base title and set the
-- `documentation` flag.
local content_model, text, documentation = title.contentModel
if content_model == "wikitext" then
text = title.text
if title.isSubpage and title.subpageText == "documentation" then
local base_title = title.basePageTitle
if base_title then
title, content_model, text, documentation = base_title, base_title.contentModel, base_title.text, true
end
end
end
-- Content models have overriding priority, as they can appear in
-- nonstandard places due to page content model changes.
if content_model == "css" or content_model == "sanitized-css" then
return get_snippet_subtypes(title, "stylesheet", documentation)
elseif content_model == "javascript" then
return get_snippet_subtypes(title, "script", documentation)
elseif content_model == "json" then
return get_snippet_subtypes(title, "JSON data", documentation)
elseif content_model == "MassMessageListContent" then
return get_snippet_subtypes(title, "mass message delivery list", documentation)
-- Modules.
elseif content_model == "Scribunto" then
return get_transclusion_subtypes(title, "module", documentation, false)
elseif content_model == "text" then
return "page" -- ???
-- Otherwise, the content model is "wikitext", so check namespaces.
elseif title.isTalkPage then
return "talk page"
end
local ns = title.namespace
-- Main namespace.
if ns == 0 then
return "entry"
-- Wiktionary:
elseif ns == 4 then
return find_sandbox(title.text) and "sandbox" or "project page"
-- Template:
elseif ns == 10 then
return get_transclusion_subtypes(title, "template", documentation, false)
end
-- Convert the namespace to lowercase, unless it contains a capital
-- letter after the initial letter (e.g. MediaWiki, TimedText). Also
-- normalize any underscores.
local ns_text = gsub(title.nsText, "_", " ")
if ufind(ns_text, "^%U*$", 2) then
ns_text = ulower(ns_text)
end
-- User:
if ns == 2 then
return ns_text .. " " .. (title.isSubpage and "subpage" or "page")
-- Category: and Appendix:
elseif ns == 14 or ns == 100 then
return ns_text
-- Thesaurus: and Reconstruction:
elseif ns == 110 or ns == 118 then
return ns_text .. " entry"
end
return ns_text .. " page"
end
get_pagetype = export.get_pagetype
end
--[==[
Returns {true} if the input title object is for a content page, or {false} if not. A content page is a page that is considered part of the dictionary itself, and excludes pages for discussion, administration, maintenance etc.]==]
function export.is_content_page(title)
if not is_internal_title(title) then
error(mw.dumpObject(title.fullText) .. " is not a valid page name.")
end
local ns = title.namespace
-- (main), Appendix, Thesaurus, Citations, Reconstruction.
return (ns == 0 or ns == 100 or ns == 110 or ns == 114 or ns == 118) and
title.contentModel == "wikitext"
end
--[==[
Returns {true} if the input title object is for a documentation page, or {false} if not.]==]
function export.is_documentation(title)
return match(get_pagetype(title), "%f[%w]documentation%f[%W]") and true or false
end
--[==[
Returns {true} if the input title object is for a sandbox, or {false} if not.
By default, sandbox documentation pages are excluded, but this can be overridden with the `include_documentation` parameter.]==]
function export.is_sandbox(title, include_documentation)
local pagetype = get_pagetype(title)
return match(pagetype, "%f[%w]sandbox%f[%W]") and (
include_documentation or
not match(pagetype, "%f[%w]documentation%f[%W]")
) and true or false
end
--[==[
Returns {true} if the input title object is for a testcase page, or {false} if not.
By default, testcase documentation pages are excluded, but this can be overridden with the `include_documentation` parameter.]==]
function export.is_testcase_page(title, include_documentation)
local pagetype = get_pagetype(title)
return match(pagetype, "%f[%w]testcase%f[%W]") and (
include_documentation or
not match(pagetype, "%f[%w]documentation%f[%W]")
) and true or false
end
--[==[
Returns the namespace shortcut for the input title object, or else the namespace text. For example, a `Template:` title returns {"T"}, a `Module:` title returns {"MOD"}, and a `User:` title returns {"User"}.]==]
function export.get_namespace_shortcut(title)
return (namespace_shortcuts or get_namespace_shortcuts())[title.namespace] or title.nsText
end
get_namespace_shortcut = export.get_namespace_shortcut
do
local function check_level(lvl)
if type(lvl) ~= "number" then
error("Heading levels must be numbers.")
elseif lvl < 1 or lvl > 6 or lvl % 1 ~= 0 then
error("Heading levels must be integers between 1 and 6.")
end
return lvl
end
--[==[
A helper function which iterates over the headings in `text`, which should be the content of a page or (main) section.
Each iteration returns three values: `sec` (the section title), `lvl` (the section level) and `loc` (the index of the section in the given text, from the first equals sign). The section title will be automatically trimmed, and any HTML entities will be resolved.
The optional parameter `a` (which should be an integer between 1 and 6) can be used to ensure that only headings of the specified level are iterated over. If `b` is also given, then they are treated as a range.
The optional parameters `a` and `b` can be used to specify a range, so that only headings with levels in that range are returned.]==]
local function find_headings(text, a, b)
a = a and check_level(a) or nil
b = b and check_level(b) or a or nil
local start, loc, lvl, sec = 1
return function()
repeat
loc, lvl, sec, start = match(text, "()%f[^%z\n](==?=?=?=?=?)([^\n]+)%2[\t ]*%f[%z\n]()", start)
lvl = lvl and #lvl
until not (sec and a) or (lvl >= a and lvl <= b)
return sec and trim(decode_entities(sec)) or nil, lvl, loc
end
end
local function _get_section(content, name, level)
if not (content and name) then
return nil
elseif find(name, "\n", 1, true) then
error("Heading name cannot contain a newline.")
end
level = level and check_level(level) or nil
name = trim(decode_entities(name))
local start
for sec, lvl, loc in find_headings(content, level and 1 or nil, level) do
if start and lvl <= level then
return sub(content, start, loc - 1)
elseif not start and (not level or lvl == level) and sec == name then
start, level = loc, lvl
end
end
return start and sub(content, start)
end
--[==[
A helper function to return the content of a page section.
`content` is raw wikitext, `name` is the requested section, and `level` is an optional parameter that specifies
the required section heading level. If `level` is not supplied, then the first section called `name` is returned.
`name` can either be a string or table of section names. If a table, each name represents a section that has the
next as a subsection. For example, { {"Spanish", "Noun"}} will return the first matching section called "Noun"
under a section called "Spanish". These do not have to be at adjacent levels ("Noun" might be L4, while "Spanish"
is L2). If `level` is given, it refers to the last name in the table (i.e. the name of the section to be returned).
The returned section includes all of its subsections. If no matching section is found, return {nil}.]==]
function export.get_section(content, names, level)
if type(names) ~= "table" then
return _get_section(content, names, level)
end
local i = 1
local name = names[i]
if not name then
error("Must specify at least 1 section.")
end
while true do
local nxt_i = i + 1
local nxt = names[nxt_i]
if nxt == nil then
return _get_section(content, name, level)
end
content = _get_section(content, name)
if content == nil then
return nil
elseif i == 6 then
error("Not possible specify more than 6 sections: headings only go up to level 6.")
end
i = nxt_i
name = names[i]
end
return content
end
end
--[==[
Convert a physical pagename (or the current pagename, if {nil} is passed in) to its logical equivalent, but only if
the physical pagename refers to one of the splits of a mammoth page such as [[a]]. Otherwise this simply returns the
subpage (the part after the last slash in namespace other than the main one, otherwise the same as passed in), unless
`include_base` is specified, in which case the return value will be the whole pagename minus the namespace, including
the base (the part before the final slash).
FIXME: This should be augmented with logic to handle unsupported titles, which is currently in process_page() in
[[Module:headword/page]], so that it is a general physical-to-logical conversion function.
Examples:
* {physical_to_logical_pagename_if_mammoth("a")} → {"a"}
* {physical_to_logical_pagename_if_mammoth("a/languages A to L")} → {"a"} (since [[a]] is marked as a mammoth page in [[Module:links/data]])
* {physical_to_logical_pagename_if_mammoth("50/50")} → {"50/50"} (since [[50/50]] is in the main namespace)
* {physical_to_logical_pagename_if_mammoth("Appendix:Lojban/a")} → "a"
* {physical_to_logical_pagename_if_mammoth("Appendix:Lojban/a", true)} → "Lojban/a"
* {physical_to_logical_pagename_if_mammoth("Reconstruction:Proto-Slavic/a")} → "a"
* {physical_to_logical_pagename_if_mammoth("Reconstruction:Proto-Slavic/a", true)} → "Proto-Slavic/a"
* {physical_to_logical_pagename_if_mammoth("User:Example/sandbox/foo")} → "foo"
* {physical_to_logical_pagename_if_mammoth("User:Example/sandbox/foo", true)} → "Example/sandbox/foo"
]==]
function export.physical_to_logical_pagename_if_mammoth(title, include_base)
if title == nil then
title = mw.title.getCurrentTitle()
elseif not is_title(title) then
title = mw.title.new(title)
end
if title.nsText == "" then
-- Formerly we checked for the specific known subpages of a given mammoth split page, e.g. we would convert
-- [[a/languages M to Z]] to [[a]] assuming that [[a/languages M to Z]] was one of the splits, but not
-- [[a/languages N to Z]]. To simplify this, we just convert anything with the right mammoth split page format
-- on the assumption that it's unlikely we will ever have a legitimate non-mammoth-split pagename of this sort.
local pagename = title.text
local mammoth_root_page = pagename:match("^(.*)/languages [A-Z] to [A-Z]$")
if mammoth_root_page then
pagename = mammoth_root_page
end
return pagename
elseif include_base then
return title.text
else
return title.subpageText
end
end
--[==[
Obsolete name for `physical_to_logical_pagename_if_mammoth`. FIXME: Replace all uses and remove.
]==]
function export.safe_page_name(title)
return export.physical_to_logical_pagename_if_mammoth(title)
end
do
local current_section
--[==[
A function which returns the number of the page section which contains the current {#invoke}.]==]
function export.get_current_section()
if current_section ~= nil then
return current_section
end
local extension_tag = (current_frame or get_current_frame()).extensionTag
-- We determine the section via the heading strip marker count, since they're numbered sequentially, but the only way to do this is to generate a fake heading via frame:preprocess(). The native parser assigns each heading a unique marker, but frame:preprocess() will return copies of older markers if the heading is identical to one further up the page, so the fake heading has to be unique to the page. The best way to do this is to feed it a heading containing a nowiki marker (which we will need later), since those are always unique.
local nowiki_marker = extension_tag(current_frame, "nowiki")
-- Note: heading strip markers have a different syntax to the ones used for tags.
local h = tonumber(match(
current_frame:preprocess("=" .. nowiki_marker .. "="),
"\127'\"`UNIQ%-%-h%-(%d+)%-%-QINU`\"'\127"
))
-- For some reason, [[Special:ExpandTemplates]] doesn't generate a heading strip marker, so if that happens we simply abort early.
if not h then
return 0
end
-- The only way to get the section number is to increment the heading count, so we store the offset in nowiki strip markers which can be retrieved by procedurally unstripping nowiki markers, counting backwards until we find a match.
local n, offset = tonumber(match(
nowiki_marker,
"\127'\"`UNIQ%-%-nowiki%-([%dA-F]+)%-QINU`\"'\127"
), 16)
while not offset and n > 0 do
n = n - 1
offset = match(
unstrip_nowiki(format("\127'\"`UNIQ--nowiki-%08X-QINU`\"'\127", n)),
"^HEADING\1(%d+)" -- Prefix "HEADING\1" prevents collisions.
)
end
offset = offset and (offset + 1) or 0
extension_tag(current_frame, "nowiki", "HEADING\1" .. offset)
current_section = h - offset
return current_section
end
get_current_section = export.get_current_section
end
do
local L2_sections, current_L2
local function get_L2_sections()
L2_sections, get_L2_sections = mw.loadData("Module:headword/data").page.L2_sections, nil
return L2_sections
end
--[==[
A function which returns the name of the L2 language section which contains the current {#invoke}.]==]
function export.get_current_L2()
if current_L2 ~= nil then
return current_L2 or nil -- Return nil if current_L2 is false (i.e. there's no L2).
end
local section = get_current_section()
while section > 0 do
local L2 = (L2_sections or get_L2_sections())[section]
if L2 then
current_L2 = L2
return L2
end
section = section - 1
end
current_L2 = false
return nil
end
end
return export
dflgelqwqn49uq9wx18x5vggpgn6t4j
Module:category tree/languages
828
5929
17441
17342
2026-07-13T08:47:43Z
Hiyuune
6766
17441
Scribunto
text/plain
local new_title = mw.title.new
local ucfirst = require("Module:string utilities").ucfirst
local split = require("Module:string utilities").split
local raw_categories = {}
local raw_handlers = {}
local m_languages = require("Module:languages")
local m_sc_getByCode = require("Module:scripts").getByCode
local m_table = require("Module:table")
local parse_utilities_module = "Module:parse utilities"
local concat = table.concat
local insert = table.insert
local reverse_ipairs = m_table.reverseIpairs
local serial_comma_join = m_table.serialCommaJoin
local size = m_table.size
local sorted_pairs = m_table.sortedPairs
local to_json = require("Module:JSON").toJSON
local Hang = m_sc_getByCode("Hang")
local Hani = m_sc_getByCode("Hani")
local Hira = m_sc_getByCode("Hira")
local Hrkt = m_sc_getByCode("Hrkt")
local Kana = m_sc_getByCode("Kana")
local function track(page)
-- [[Special:WhatLinksHere/Wiktionary:Tracking/category tree/languages/PAGE]]
return require("Module:debug/track")("category tree/languages/" .. page)
end
-- This handles language categories of the form e.g. [[:Category:French language]] and
-- [[:Category:British Sign Language]]; categories like [[:Category:Languages of Indonesia]]; categories like
-- [[:Category:English-based creole or pidgin languages]]; and categories like
-- [[:Category:English-based constructed languages]].
-----------------------------------------------------------------------------
-- --
-- RAW CATEGORIES --
-- --
-----------------------------------------------------------------------------
raw_categories["Reo"] = {
topright = "{{commonscat|Languages}}\n[[File:Languages world map-transparent background.svg|thumb|right|250px|Rough world map of language families]]",
description = "This category contains the categories for every language on Wiktionary.",
additional = "Not all languages that Wiktionary recognises may have a category here yet. There are many that have " ..
"not yet received any attention from editors, mainly because not all Wiktionary users know about every single " ..
"language. See [[Wiktionary:List of languages]] for a full list.",
parents = {
"Whakaraparapa",
},
}
raw_categories["All extinct languages"] = {
description = "This category contains the categories for every [[extinct language]] on Wiktionary.",
additional = "Do not confuse this category with [[:Category:Extinct languages]], which is an umbrella category for the names of extinct languages in specific other languages (e.g. {{m+|de|Langobardisch}} for the ancient [[Lombardic]] language).",
parents = {
"Reo",
},
}
raw_categories["Languages by country"] = {
topright = "{{commonscat|Languages by continent}}",
description = "Categories that group languages by country.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Reo",
},
}
raw_categories["Language isolates"] = {
topright = "{{wikipedia|Language isolate}}\n{{commonscat|Language isolates}}",
description = "Languages with no known relatives.",
parents = {
{name = "Languages by family", sort = "*Isolates"},
{name = "All language families", sort = "Isolates"},
},
}
raw_categories["Languages not sorted into a location category"] = {
description = "Languages which do not specify (in their {{tl|auto cat}} call) the location(s) where they are spoken.",
additional = "This excludes constructed and reconstructed languages; as a result, all languages in this category explicitly specify their location as {{cd|UNKNOWN}}.",
parents = {
{name = "Requests"},
},
hidden = true,
}
-----------------------------------------------------------------------------
-- --
-- RAW HANDLERS --
-- --
-----------------------------------------------------------------------------
-- Given a category (without the "Category:" prefix), look up the page defining the category, find the call to
-- {{auto cat}} (if any), and return a table of its arguments. If the category page doesn't exist or doesn't have
-- an {{auto cat}} invocation, return nil.
--
-- FIXME: Duplicated in [[Module:category tree/lects]].
local function scrape_category_for_auto_cat_args(cat)
local cat_page = mw.title.new("Category:" .. cat)
if cat_page then
local contents = cat_page:getContent()
if contents then
local frame = mw.getCurrentFrame()
for template in require("Module:template parser").find_templates(contents) do
-- The template parser automatically handles redirects and canonicalizes them, so uses of {{autocat}}
-- will also be found.
if template:get_name() == "auto cat" then
return template:get_arguments()
end
end
end
end
return nil
end
local function link_location(location)
local location_no_the = location:match("^the (.*)$")
local bare_location = location_no_the or location
local location_link
local bare_location_parts = split(bare_location, ", ")
for i, part in ipairs(bare_location_parts) do
bare_location_parts[i] = ("[[%s]]"):format(part)
end
location_link = concat(bare_location_parts, ", ")
if location_no_the then
location_link = "the " .. location_link
end
return location_link
end
local function linkbox(lang, setwiki, setwikt, setsister, entryname)
local wiktionarylinks = {}
local canonicalName = lang:getCanonicalName()
local wikimediaLanguages = lang:getWikimediaLanguages()
local wikipediaArticle = setwiki or lang:getWikipediaArticle()
setsister = setsister and ucfirst(setsister) or nil
if setwikt then
track("setwikt")
if setwikt == "-" then
track("setwikt/hyphen")
end
end
if setwikt ~= "-" and wikimediaLanguages and wikimediaLanguages[1] then
for _, wikimedialang in ipairs(wikimediaLanguages) do
local check = new_title(wikimedialang:getCode() .. ":")
if check and check.isExternal then
insert(wiktionarylinks,
(wikimedialang:getCanonicalName() ~= canonicalName and "(''" .. wikimedialang:getCanonicalName() .. "'') " or "") ..
"'''[[:" .. wikimedialang:getCode() .. ":|" .. wikimedialang:getCode() .. ".wiktionary.org]]'''")
end
end
wiktionarylinks = concat(wiktionarylinks, "<br/>")
end
local wikt_plural = wikimediaLanguages[2] and "s" or ""
if #wiktionarylinks == 0 then
wiktionarylinks = "''None.''"
end
if setsister then
track("setsister")
if setsister == "-" then
track("setsister/hyphen")
else
setsister = "Category:" .. setsister
end
else
setsister = lang:getCommonsCategory() or "-"
end
return concat{
[=[<div class="wikitable" style="float: right; clear: right; margin: 0 0 0.5em 1em; width: 300px; padding: 5px;">
<div style="text-align: center; margin-bottom: 10px; margin-top: 5px">''']=], canonicalName, [=[ language links'''</div>
{| style="font-size: 90%"
|-
| style="vertical-align: top; height: 35px; border-bottom: 1px solid lightgray;" | [[File:Wikipedia-logo.png|35px|none|Wikipedia]]
| style="border-bottom: 1px solid lightgray;" | '''English Wikipedia''' has an article on:
<div style="padding: 5px 10px">]=], (setwiki == "-" and "''None.''" or "'''[[w:" .. wikipediaArticle .. "|" .. wikipediaArticle .. "]]'''"), [=[</div>
|-
| style="vertical-align: top; height: 35px; border-bottom: 1px solid lightgray;" | [[File:Wikimedia-logo.svg|35px|none|Wikimedia Commons]]
| style="border-bottom: 1px solid lightgray;" | '''Wikimedia Commons''' has links to ]=], canonicalName, [=[-related content in sister projects:
<div style="padding: 5px 10px">]=], (setsister == "-" and "''None.''" or "'''[[commons:" .. setsister .. "|" .. setsister .. "]]'''"), [=[</div>
|-
| style="vertical-align: top; height: 35px; width: 40px; border-bottom: 1px solid lightgray;" | [[File:Wiktionary-logo-v2.svg|35px|none|Wiktionary]]
|style="border-bottom: 1px solid lightgray;" | '''Wiktionary edition''']=], wikt_plural, [=[ written in ]=], canonicalName, [=[:
<div style="padding: 5px 10px">]=], wiktionarylinks, [=[</div>
|-
| style="vertical-align: top; height: 35px; border-bottom: 1px solid lightgray;" | [[File:Open book nae 02.svg|35px|none|Entry]]
| style="border-bottom: 1px solid lightgray;" | '''Wiktionary entry''' for the language's English name:
<div style="padding: 5px 10px">''']=], require("Module:links").full_link({lang = m_languages.getByCode("en"), term = entryname or canonicalName}), [=['''</div>
|-
| style="vertical-align: top; height: 35px;" | [[File:Crystal kfind.png|35px|none|Considerations]]
|| '''Wiktionary resources''' for editors contributing to ]=], canonicalName, [=[ entries:
<div style="padding: 5px 0">
* '''[[Wiktionary:]=], canonicalName, [=[ entry guidelines]]'''
* '''[[:Category:]=], canonicalName, [=[ reference templates|Reference templates]] ({{PAGESINCAT:]=], canonicalName, [=[ reference templates}})'''
* '''[[Appendix:]=], canonicalName, [=[ bibliography|Bibliography]]'''
|}
</div>]=]
}
end
local function edit_link(title, text)
return '<span class="plainlinks">['
.. tostring(mw.uri.fullUrl(title, { action = "edit" }))
.. ' ' .. text .. ']</span>'
end
-- Should perhaps use wiki syntax.
local function infobox(lang)
local ret = {}
insert(ret, '<table class="wikitable language-category-info"')
local raw_data = lang:getData("extra")
if raw_data then
local replacements = {
[1] = "canonical-name",
[2] = "wikidata-item",
[3] = "family",
[4] = "scripts",
}
local function replacer(letter1, letter2)
return letter1:lower() .. "-" .. letter2:lower()
end
-- For each key in the language data modules, returns a descriptive
-- kebab-case version (containing ASCII lowercase words separated
-- by hyphens).
local function kebab_case(key)
key = replacements[key] or key
key = key:gsub("(%l)(%u)", replacer):gsub("(%l)_(%l)", replacer)
return key
end
local compress = {compress = true}
local function html_attribute_encode(str)
str = to_json(str, compress)
:gsub('"', """)
-- & in attributes is automatically escaped.
-- :gsub("&", "&")
:gsub("<", "<")
:gsub(">", ">")
return str
end
insert(ret, ' data-code="' .. lang:getCode() .. '"')
for k, v in sorted_pairs(raw_data) do
insert(ret, " data-" .. kebab_case(k)
.. '="'
.. html_attribute_encode(v)
.. '"')
end
end
insert(ret, '>\n')
insert(ret, '<tr class="language-category-data">\n<th colspan="2">'
.. edit_link(lang:getDataModuleName(), "Edit language data")
.. "</th>\n</tr>\n")
insert(ret, "<tr>\n<th>Canonical name</th><td>" .. lang:getCanonicalName() .. "</td>\n</tr>\n")
local otherNames = lang:getOtherNames()
if otherNames then
local names = {}
for _, name in ipairs(otherNames) do
insert(names, "<li>" .. name .. "</li>")
end
if #names > 0 then
insert(ret, "<tr>\n<th>Other names</th><td><ul>" .. concat(names, "\n") .. "</ul></td>\n</tr>\n")
end
end
local aliases = lang:getAliases()
if aliases then
local names = {}
for _, name in ipairs(aliases) do
insert(names, "<li>" .. name .. "</li>")
end
if #names > 0 then
insert(ret, "<tr>\n<th>Aliases</th><td><ul>" .. concat(names, "\n") .. "</ul></td>\n</tr>\n")
end
end
local varieties = lang:getVarieties()
if varieties then
local names = {}
for _, name in ipairs(varieties) do
if type(name) == "string" then
insert(names, "<li>" .. name .. "</li>")
else
assert(type(name) == "table")
local first_var
local subvars = {}
for i, var in ipairs(name) do
if i == 1 then
first_var = var
else
insert(subvars, "<li>" .. var .. "</li>")
end
end
if #subvars > 0 then
insert(names, "<li><dl><dt>" .. first_var .. "</dt>\n<dd><ul>" .. concat(subvars, "\n") .. "</ul></dd></dl></li>")
elseif first_var then
insert(names, "<li>" .. first_var .. "</li>")
end
end
end
if #names > 0 then
insert(ret, "<tr>\n<th>Varieties</th><td><ul>" .. concat(names, "\n") .. "</ul></td>\n</tr>\n")
end
end
insert(ret, "<tr>\n<th>[[Wiktionary:Languages|Language code]]</th><td><code>" .. lang:getCode() .. "</code></td>\n</tr>\n")
insert(ret, "<tr>\n<th>[[Wiktionary:Families|Language family]]</th>\n")
local fam = lang:getFamily()
local famCode = fam and fam:getCode()
if not fam then
insert(ret, "<td>unclassified</td>")
elseif famCode == "qfa-iso" then
insert(ret, "<td>[[:Category:Language isolates|language isolate]]</td>")
elseif famCode == "qfa-mix" then
insert(ret, "<td>[[:Category:Mixed languages|mixed language]]</td>")
elseif famCode == "sgn" then
insert(ret, "<td>[[:Category:Sign languages|sign language]]</td>")
elseif famCode == "crp" then
insert(ret, "<td>[[:Category:Creole or pidgin languages|creole or pidgin]]</td>")
elseif famCode == "art" then
insert(ret, "<td>[[:Category:Constructed languages|constructed language]]</td>")
else
insert(ret, "<td>" .. fam:makeCategoryLink() .. "</td>")
end
insert(ret, "\n</tr>\n<tr>\n<th>Ancestors</th>\n<td>")
local ancestors = lang:getAncestors()
if ancestors[2] then
local ancestorList = {}
for i, anc in ipairs(ancestors) do
ancestorList[i] = "<li>" .. anc:makeCategoryLink() .. "</li>"
end
insert(ret, "<ul>\n" .. concat(ancestorList, "\n") .. "</ul>")
else
local ancestorChain = lang:getAncestorChainOld()
if ancestorChain[1] then
local chain = {}
for _, anc in reverse_ipairs(ancestorChain) do
insert(chain, "<li>" .. anc:makeCategoryLink() .. "</li>")
end
insert(ret, "<ul>\n" .. concat(chain, "\n<ul>\n") .. ("</ul>"):rep(#chain))
else
insert(ret, "unknown")
end
end
insert(ret, "</td>\n</tr>\n")
local scripts = lang:getScripts()
if scripts[1] then
local script_text = {}
local function makeScriptLine(sc)
local code = sc:getCode()
local url = tostring(mw.uri.fullUrl('Special:Search', {
search = 'contentmodel:css insource:"' .. code
.. '" insource:/\\.' .. code .. '/',
ns8 = '1'
}))
return sc:makeCategoryLink()
.. ' (<span class="plainlinks" title="Search for stylesheets referencing this script">[' .. url .. ' <code>' .. code .. '</code>]</span>)'
end
local function add_Hrkt(text)
insert(text, "<li>" .. makeScriptLine(Hrkt))
insert(text, "<ul>")
insert(text, "<li>" .. makeScriptLine(Hira) .. "</li>")
insert(text, "<li>" .. makeScriptLine(Kana) .. "</li>")
insert(text, "</ul>")
insert(text, "</li>")
end
for _, sc in ipairs(scripts) do
local text = {}
local code = sc:getCode()
if code == "Hrkt" then
add_Hrkt(text)
else
insert(text, "<li>" .. makeScriptLine(sc))
if code == "Jpan" then
insert(text, "<ul>")
insert(text, "<li>" .. makeScriptLine(Hani) .. "</li>")
add_Hrkt(text)
insert(text, "</ul>")
elseif code == "Kore" then
insert(text, "<ul>")
insert(text, "<li>" .. makeScriptLine(Hang) .. "</li>")
insert(text, "<li>" .. makeScriptLine(Hani) .. "</li>")
insert(text, "</ul>")
end
insert(text, "</li>")
end
insert(script_text, concat(text, "\n"))
end
insert(ret, "<tr>\n<th>[[Wiktionary:Scripts|Scripts]]</th>\n<td><ul>\n" .. concat(script_text, "\n") .. "</ul></td>\n</tr>\n")
else
insert(ret, "<tr>\n<th>[[Wiktionary:Scripts|Scripts]]</th>\n<td>not specified</td>\n</tr>\n")
end
local function add_module_info(raw_data, heading)
if raw_data then
local scripts = lang:getScriptCodes()
local module_info, add = {}, false
if type(raw_data) == "string" then
insert(module_info,
("[[Module:%s]]"):format(raw_data))
add = true
else
local raw_data_type = type(raw_data)
if raw_data_type == "table" and size(scripts) == 1 and type(raw_data[scripts[1]]) == "string" then
insert(module_info,
("[[Module:%s]]"):format(raw_data[scripts[1]]))
add = true
elseif raw_data_type == "table" then
insert(module_info, "<ul>")
for script, data in sorted_pairs(raw_data) do
if type(data) == "string" and m_sc_getByCode(script) then
insert(module_info, ("<li><code>%s</code>: [[Module:%s]]</li>"):format(script, data))
end
end
insert(module_info, "</ul>")
add = size(module_info) > 2
end
end
if add then
insert(ret, [=[
<tr>
<th>]=] .. heading .. [=[</th>
<td>]=] .. concat(module_info) .. [=[</td>
</tr>
]=])
end
end
end
add_module_info(raw_data.generate_forms, "Form-generating<br>module")
add_module_info(raw_data.translit, "[[Wiktionary:Transliteration and romanization|Transliteration<br>module]]")
add_module_info(raw_data.display_text, "Display text<br>module")
add_module_info(raw_data.entry_name, "Entry name<br>module")
add_module_info(raw_data.sort_key, "[[sortkey|Sortkey]]<br>module")
local wikidataItem = lang:getWikidataItem()
if lang:getWikidataItem() and mw.wikibase then
local URL = mw.wikibase.getEntityUrl(wikidataItem)
local link
if URL then
link = '[' .. URL .. ' ' .. wikidataItem .. ']'
else
link = '<span class="error">Invalid Wikidata item: <code>' .. wikidataItem .. '</code></span>'
end
insert(ret, "<tr><th>Wikidata</th><td>" .. link .. "</td></tr>")
end
insert(ret, "</table>")
return concat(ret)
end
local function NavFrame(content, title)
return '<div class="NavFrame"><div class="NavHead">'
.. (title or '{{{title}}}') .. '</div>'
.. '<div class="NavContent" style="text-align: left;">'
.. content
.. '</div></div>'
end
local function get_description_topright_additional(lang, locations, extinct, setwiki, setwikt, setsister, entryname)
local nameWithLanguage = lang:getCategoryName("nocap")
if lang:getCode() == "und" then
local description =
"This is the main category of the '''" .. nameWithLanguage .. "''', represented in Wiktionary by the [[Wiktionary:Languages|code]] '''" .. lang:getCode() .. "'''. " ..
"This language contains terms in historical writing, whose meaning has not yet been determined by scholars."
return description, nil, nil
end
local canonicalName = lang:getCanonicalName()
local topright = linkbox(lang, setwiki, setwikt, setsister, entryname)
local the_prefix
if canonicalName:find(" Language$") then
the_prefix = ""
else
the_prefix = "the "
end
local description = "This is the main category of " .. the_prefix .. "'''" .. nameWithLanguage .. "'''."
local location_links = {}
local prep
local saw_embedded_comma = false
for _, location in ipairs(locations) do
local this_prep
if location == "the world" then
this_prep = "across"
insert(location_links, location)
elseif location ~= "UNKNOWN" then
this_prep = "in"
if location:find(",") then
saw_embedded_comma = true
end
insert(location_links, link_location(location))
end
if this_prep then
if prep and this_prep ~= prep then
error("Can't handle location 'the world' along with another location (clashing prepositions)")
end
prep = this_prep
end
end
local location_desc
if #location_links > 0 then
local location_link_text
if saw_embedded_comma and #location_links >= 3 then
location_link_text = mw.text.listToText(location_links, "; ", "; and ")
else
location_link_text = serial_comma_join(location_links)
end
location_desc = ("It is %s %s %s.\n\n"):format(
extinct and "an [[extinct language]] that was formerly spoken" or "spoken", prep, location_link_text)
elseif extinct then
location_desc = "It is an [[extinct language]].\n\n"
else
location_desc = ""
end
local add = location_desc .. "Information about " .. canonicalName .. ":\n\n" .. infobox(lang)
if lang:hasType("reconstructed") then
add = add .. "\n\n" ..
ucfirst(canonicalName) .. " is a reconstructed language. Its words and roots are not directly attested in any written works, but have been reconstructed through the ''comparative method'', " ..
"which finds regular similarities between languages that cannot be explained by coincidence or word-borrowing, and extrapolates ancient forms from these similarities.\n\n" ..
"According to our [[Wiktionary:Criteria for inclusion|criteria for inclusion]], terms in " .. canonicalName ..
" should '''not''' be present in entries in the main namespace, but may be added to the Reconstruction: namespace."
elseif lang:hasType("appendix-constructed") then
add = add .. "\n\n" ..
ucfirst(canonicalName) .. " is a constructed language that is only in sporadic use. " ..
"According to our [[Wiktionary:Criteria for inclusion|criteria for inclusion]], terms in " .. canonicalName ..
" should '''not''' be present in entries in the main namespace, but may be added to the Appendix: namespace. " ..
"All terms in this language may be available at [[Appendix:" .. ucfirst(canonicalName) .. "]]."
end
local about = new_title("Wiktionary:About " .. canonicalName)
if about.exists then
add = add .. "\n\n" ..
"Please see '''[[Wiktionary:About " .. canonicalName .. "]]''' for information and special considerations for creating " .. nameWithLanguage .. " entries."
end
local ok, tree_of_descendants = pcall(
require("Module:family tree").print_children,
lang:getCode(), {
protolanguage_under_family = true,
must_have_descendants = true
})
if ok then
if tree_of_descendants then
add = add .. NavFrame(
tree_of_descendants,
"Family tree")
else
add = add .. "\n\n" .. ucfirst(lang:getCanonicalName())
.. " has no descendants or varieties listed in Wiktionary's language data modules."
end
else
mw.log("error while generating tree: " .. tostring(tree_of_descendants))
end
return description, topright, add
end
local function get_parents(lang, locations, extinct)
local canonicalName = lang:getCanonicalName()
local sortkey = {sort_base = canonicalName, lang = "mi"}
local ret = {{name = "Reo", sort = sortkey}}
local fam = lang:getFamily()
local famCode = fam and fam:getCode()
-- FIXME: Some of the following categories should be added to this module.
if not fam then
insert(ret, {name = "Category:Unclassified languages", sort = sortkey})
elseif famCode == "qfa-iso" then
insert(ret, {name = "Category:Language isolates", sort = sortkey})
elseif famCode == "qfa-mix" then
insert(ret, {name = "Category:Mixed languages", sort = sortkey})
elseif famCode == "sgn" then
insert(ret, {name = "Category:All sign languages", sort = sortkey})
elseif famCode == "crp" then
insert(ret, {name = "Category:Creole or pidgin languages", sort = sortkey})
for _, anc in ipairs(lang:getAncestors()) do
-- Avoid Haitian Creole being categorised in [[:Category:Haitian Creole-based creole or pidgin languages]], as one of its ancestors is an etymology-only variety of it.
-- Use that ancestor's ancestors instead.
if anc:getFullCode() == lang:getCode() then
for _, anc_extra in ipairs(anc:getAncestors()) do
insert(ret, {name = "Category:" .. ucfirst(anc_extra:getFullName()) .. "-based creole or pidgin languages", sort = sortkey})
end
else
insert(ret, {name = "Category:" .. ucfirst(anc:getFullName()) .. "-based creole or pidgin languages", sort = sortkey})
end
end
elseif famCode == "art" then
if lang:hasType("appendix-constructed") then
insert(ret, {name = "Category:Appendix-only constructed languages", sort = sortkey})
else
insert(ret, {name = "Category:Constructed languages", sort = sortkey})
end
for _, anc in ipairs(lang:getAncestors()) do
if anc:getFullCode() == lang:getCode() then
for _, anc_extra in ipairs(anc:getAncestors()) do
insert(ret, {name = "Category:" .. ucfirst(anc_extra:getFullName()) .. "-based constructed languages", sort = sortkey})
end
else
insert(ret, {name = "Category:" .. ucfirst(anc:getFullName()) .. "-based constructed languages", sort = sortkey})
end
end
else
insert(ret, {name = "Category:" .. fam:getCategoryName(), sort = sortkey})
if lang:hasType("reconstructed") then
insert(ret, {
name = "Category:Reconstructed languages",
sort = {sort_base = canonicalName:gsub("^Proto%-", ""), lang = "en"}
})
end
end
local function add_sc_cat(sc)
insert(ret, {name = "Category:Reo " .. sc:getCategoryName(), sort = sortkey})
end
local function add_Hrkt()
add_sc_cat(Hrkt)
add_sc_cat(Hira)
add_sc_cat(Kana)
end
for _, sc in ipairs(lang:getScripts()) do
if sc:getCode() == "Hrkt" then
add_Hrkt()
else
add_sc_cat(sc)
if sc:getCode() == "Jpan" then
add_sc_cat(Hani)
add_Hrkt()
elseif sc:getCode() == "Kore" then
add_sc_cat(Hang)
add_sc_cat(Hani)
end
end
end
if lang:hasTranslit() then
insert(ret, {name = "Category:Languages with automatic transliteration", sort = sortkey})
end
local function insert_location_language_cat(location)
local cat = "Languages of " .. location
insert(ret, {name = "Category:" .. cat, sort = sortkey})
local auto_cat_args = scrape_category_for_auto_cat_args(cat)
local location_parent = auto_cat_args and auto_cat_args.parent
if location_parent then
local split_parents = require(parse_utilities_module).split_on_comma(location_parent)
for _, parent in ipairs(split_parents) do
parent = parent:match("^(.-):.*$") or parent
insert_location_language_cat(parent)
end
end
end
local saw_location = false
for _, location in ipairs(locations) do
if location ~= "UNKNOWN" then
saw_location = true
insert_location_language_cat(location)
end
end
if extinct then
insert(ret, {name = "Category:All extinct languages", sort = sortkey})
end
if not saw_location and not (lang:hasType("reconstructed") or (fam and fam:getCode() == "art")) then
-- Constructed and reconstructed languages don't need a location specified and often won't have one,
-- so don't put them in this maintenance category.
insert(ret, {name = "Category:Languages not sorted into a location category", sort = sortkey})
end
return ret
end
-- Handle language categories of the form e.g. [[:Category:French language]] and
-- [[:Category:British Sign Language]].
insert(raw_handlers, function(data)
local category = data.category
if not (category:match("[Rr]eo") or category:match("[Ll]ect$")) then
return nil
end
local lang = m_languages.getByCanonicalName(category)
if not lang then
local langname = category:match("^Reo (.*)")
if langname then
lang = m_languages.getByCanonicalName(langname)
end
if not lang then
return nil
end
end
local args = require("Module:parameters").process(data.args, {
[1] = {list = true},
["setwiki"] = true,
["setwikt"] = true,
["setsister"] = true,
["entryname"] = true,
["extinct"] = {type = "boolean"},
})
-- If called from inside, don't require any arguments, as they can't be known
-- in general and aren't needed just to generate the first parent (used for
-- breadcrumbs).
if #args[1] == 0 and not data.called_from_inside then
-- At least one location must be specified unless the language is constructed (e.g. Esperanto) or reconstructed (e.g. Proto-Indo-European).
local fam = lang:getFamily()
if not (lang:hasType("reconstructed") or (fam and fam:getCode() == "art")) then
error("At least one location (param 1=) must be specified for language '" .. lang:getCanonicalName() .. "' (code '" .. lang:getCode() .. "'). " ..
"Use the value UNKNOWN if the language's location is truly unknown.")
end
end
local description, topright, additional = "", "", ""
-- If called from inside the category tree system, it's called when generating
-- parents or children, and we don't need to generate the description or additional
-- text (which is very expensive in terms of memory because it calls [[Module:family tree]],
-- which calls [[Module:languages/data/all]]).
if not data.called_from_inside then
description, topright, additional = get_description_topright_additional(
lang, args[1], args.extinct, args.setwiki, args.setwikt, args.setsister, args.entryname
)
end
return {
canonical_name = lang:getCategoryName(),
description = description,
lang = lang:getCode(),
topright = topright,
additional = additional,
breadcrumb = lang:getCanonicalName(),
parents = get_parents(lang, args[1], args.extinct),
extra_children = get_children(lang),
umbrella = false,
can_be_empty = true,
}, true
end)
-- Handle categories such as [[:Category:Languages of Indonesia]].
insert(raw_handlers, function(data)
local location = data.category:match("^Languages of (.*)$")
if location then
local args = require("Module:parameters").process(data.args, {
["flagfile"] = true,
["commonscat"] = true,
["wp"] = true,
["basename"] = true,
["parent"] = true,
["locationcat"] = true,
["locationlink"] = true,
})
local topright
local basename = args.basename or location:gsub(", .*", "")
if args.flagfile ~= "-" then
local flagfile_arg = args.flagfile or ("Flag of %s.svg"):format(basename)
local files = require(parse_utilities_module).split_on_comma(flagfile_arg)
local topright_parts = {}
for _, file in ipairs(files) do
local flagfile = "File:" .. file
local flagfile_page = new_title(flagfile)
if flagfile_page and flagfile_page.file.exists then
insert(topright_parts, ("[[%s|right|100px|border]]"):format(flagfile))
elseif args.flagfile then
error(("Explicit flagfile '%s' doesn't exist"):format(flagfile))
end
end
topright = concat(topright_parts)
end
if args.wp then
local wp = require("Module:yesno")(args.wp, "+")
if wp == "+" or wp == true then
wp = data.category
end
if wp then
local wp_topright = ("{{wikipedia|%s}}"):format(wp)
if topright then
topright = topright .. wp_topright
else
topright = wp_topright
end
end
end
if args.commonscat then
local commonscat = require("Module:yesno")(args.commonscat, "+")
if commonscat == "+" or commonscat == true then
commonscat = data.category
end
if commonscat then
local commons_topright = ("{{commonscat|%s}}"):format(commonscat)
if topright then
topright = topright .. commons_topright
else
topright = commons_topright
end
end
end
local bare_location = location:match("^the (.*)$") or location
local location_link = args.locationlink or link_location(location)
local bare_basename = basename:match("^the (.*)$") or basename
local parents = {}
if args.parent then
local explicit_parents = require(parse_utilities_module).split_on_comma(args.parent)
for i, parent in ipairs(explicit_parents) do
local actual_parent, sort_key = parent:match("^(.-):(.*)$")
if actual_parent then
parent = actual_parent
sort_key = sort_key:gsub("%+", bare_location)
else
sort_key = " " .. bare_location
end
insert(parents, {name = "Languages of " .. parent, sort = sort_key})
end
else
insert(parents, {name = "Languages by country", sort = {sort_base = bare_location, lang = "en"}})
end
if args.locationcat then
local explicit_location_cats = require(parse_utilities_module).split_on_comma(args.locationcat)
for i, locationcat in ipairs(explicit_location_cats) do
insert(parents, {name = "Category:" .. locationcat, sort = " Languages"})
end
else
local location_cat = ("Category:%s"):format(bare_location)
local location_page = new_title(location_cat)
if location_page and location_page.exists then
insert(parents, {name = location_cat, sort = "Languages"})
end
end
local description = ("Categories for languages of %s (including sublects)."):format(location_link)
return {
topright = topright,
description = description,
parents = parents,
breadcrumb = bare_basename,
additional = "{{{umbrella_msg}}}",
}, true
end
end)
-- Handle categories such as [[:Category:English-based creole or pidgin languages]].
insert(raw_handlers, function(data)
local langname = data.category:match("(.*)%-based creole or pidgin languages$")
if langname then
local lang = m_languages.getByCanonicalName(langname)
if lang then
return {
lang = lang:getCode(),
description = "Languages which developed as a [[creole]] or [[pidgin]] from " .. lang:makeCategoryLink() .. ".",
parents = {{name = "Creole or pidgin languages", sort = {sort_base = "*" .. langname, lang = "en"}}},
breadcrumb = lang:getCanonicalName() .. "-based",
}
end
end
end)
-- Handle categories such as [[:Category:English-based constructed languages]].
insert(raw_handlers, function(data)
local langname = data.category:match("(.*)%-based constructed languages$")
if langname then
local lang = m_languages.getByCanonicalName(langname)
if lang then
return {
lang = lang:getCode(),
description = "Constructed languages which are based on " .. lang:makeCategoryLink() .. ".",
parents = {{name = "Constructed languages", sort = {sort_base = "*" .. langname, lang = "en"}}},
breadcrumb = lang:getCanonicalName() .. "-based",
}
end
end
end)
return {RAW_CATEGORIES = raw_categories, RAW_HANDLERS = raw_handlers}
0ph7sc9rkrp14b8ohz7sdmrqddlv31z
17442
17441
2026-07-13T08:48:20Z
Hiyuune
6766
17442
Scribunto
text/plain
local new_title = mw.title.new
local ucfirst = require("Module:string utilities").ucfirst
local split = require("Module:string utilities").split
local raw_categories = {}
local raw_handlers = {}
local m_languages = require("Module:languages")
local m_sc_getByCode = require("Module:scripts").getByCode
local m_table = require("Module:table")
local parse_utilities_module = "Module:parse utilities"
local concat = table.concat
local insert = table.insert
local reverse_ipairs = m_table.reverseIpairs
local serial_comma_join = m_table.serialCommaJoin
local size = m_table.size
local sorted_pairs = m_table.sortedPairs
local to_json = require("Module:JSON").toJSON
local Hang = m_sc_getByCode("Hang")
local Hani = m_sc_getByCode("Hani")
local Hira = m_sc_getByCode("Hira")
local Hrkt = m_sc_getByCode("Hrkt")
local Kana = m_sc_getByCode("Kana")
local function track(page)
-- [[Special:WhatLinksHere/Wiktionary:Tracking/category tree/languages/PAGE]]
return require("Module:debug/track")("category tree/languages/" .. page)
end
-- This handles language categories of the form e.g. [[:Category:French language]] and
-- [[:Category:British Sign Language]]; categories like [[:Category:Languages of Indonesia]]; categories like
-- [[:Category:English-based creole or pidgin languages]]; and categories like
-- [[:Category:English-based constructed languages]].
-----------------------------------------------------------------------------
-- --
-- RAW CATEGORIES --
-- --
-----------------------------------------------------------------------------
raw_categories["Reo"] = {
topright = "{{commonscat|Languages}}\n[[File:Languages world map-transparent background.svg|thumb|right|250px|Rough world map of language families]]",
description = "This category contains the categories for every language on Wiktionary.",
additional = "Not all languages that Wiktionary recognises may have a category here yet. There are many that have " ..
"not yet received any attention from editors, mainly because not all Wiktionary users know about every single " ..
"language. See [[Wiktionary:List of languages]] for a full list.",
parents = {
"Whakaraparapa",
},
}
raw_categories["All extinct languages"] = {
description = "This category contains the categories for every [[extinct language]] on Wiktionary.",
additional = "Do not confuse this category with [[:Category:Extinct languages]], which is an umbrella category for the names of extinct languages in specific other languages (e.g. {{m+|de|Langobardisch}} for the ancient [[Lombardic]] language).",
parents = {
"Reo",
},
}
raw_categories["Languages by country"] = {
topright = "{{commonscat|Languages by continent}}",
description = "Categories that group languages by country.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Reo",
},
}
raw_categories["Language isolates"] = {
topright = "{{wikipedia|Language isolate}}\n{{commonscat|Language isolates}}",
description = "Languages with no known relatives.",
parents = {
{name = "Languages by family", sort = "*Isolates"},
{name = "All language families", sort = "Isolates"},
},
}
raw_categories["Languages not sorted into a location category"] = {
description = "Languages which do not specify (in their {{tl|auto cat}} call) the location(s) where they are spoken.",
additional = "This excludes constructed and reconstructed languages; as a result, all languages in this category explicitly specify their location as {{cd|UNKNOWN}}.",
parents = {
{name = "Requests"},
},
hidden = true,
}
-----------------------------------------------------------------------------
-- --
-- RAW HANDLERS --
-- --
-----------------------------------------------------------------------------
-- Given a category (without the "Category:" prefix), look up the page defining the category, find the call to
-- {{auto cat}} (if any), and return a table of its arguments. If the category page doesn't exist or doesn't have
-- an {{auto cat}} invocation, return nil.
--
-- FIXME: Duplicated in [[Module:category tree/lects]].
local function scrape_category_for_auto_cat_args(cat)
local cat_page = mw.title.new("Category:" .. cat)
if cat_page then
local contents = cat_page:getContent()
if contents then
local frame = mw.getCurrentFrame()
for template in require("Module:template parser").find_templates(contents) do
-- The template parser automatically handles redirects and canonicalizes them, so uses of {{autocat}}
-- will also be found.
if template:get_name() == "auto cat" then
return template:get_arguments()
end
end
end
end
return nil
end
local function link_location(location)
local location_no_the = location:match("^the (.*)$")
local bare_location = location_no_the or location
local location_link
local bare_location_parts = split(bare_location, ", ")
for i, part in ipairs(bare_location_parts) do
bare_location_parts[i] = ("[[%s]]"):format(part)
end
location_link = concat(bare_location_parts, ", ")
if location_no_the then
location_link = "the " .. location_link
end
return location_link
end
local function linkbox(lang, setwiki, setwikt, setsister, entryname)
local wiktionarylinks = {}
local canonicalName = lang:getCanonicalName()
local wikimediaLanguages = lang:getWikimediaLanguages()
local wikipediaArticle = setwiki or lang:getWikipediaArticle()
setsister = setsister and ucfirst(setsister) or nil
if setwikt then
track("setwikt")
if setwikt == "-" then
track("setwikt/hyphen")
end
end
if setwikt ~= "-" and wikimediaLanguages and wikimediaLanguages[1] then
for _, wikimedialang in ipairs(wikimediaLanguages) do
local check = new_title(wikimedialang:getCode() .. ":")
if check and check.isExternal then
insert(wiktionarylinks,
(wikimedialang:getCanonicalName() ~= canonicalName and "(''" .. wikimedialang:getCanonicalName() .. "'') " or "") ..
"'''[[:" .. wikimedialang:getCode() .. ":|" .. wikimedialang:getCode() .. ".wiktionary.org]]'''")
end
end
wiktionarylinks = concat(wiktionarylinks, "<br/>")
end
local wikt_plural = wikimediaLanguages[2] and "s" or ""
if #wiktionarylinks == 0 then
wiktionarylinks = "''None.''"
end
if setsister then
track("setsister")
if setsister == "-" then
track("setsister/hyphen")
else
setsister = "Category:" .. setsister
end
else
setsister = lang:getCommonsCategory() or "-"
end
return concat{
[=[<div class="wikitable" style="float: right; clear: right; margin: 0 0 0.5em 1em; width: 300px; padding: 5px;">
<div style="text-align: center; margin-bottom: 10px; margin-top: 5px">''']=], canonicalName, [=[ language links'''</div>
{| style="font-size: 90%"
|-
| style="vertical-align: top; height: 35px; border-bottom: 1px solid lightgray;" | [[File:Wikipedia-logo.png|35px|none|Wikipedia]]
| style="border-bottom: 1px solid lightgray;" | '''English Wikipedia''' has an article on:
<div style="padding: 5px 10px">]=], (setwiki == "-" and "''None.''" or "'''[[w:" .. wikipediaArticle .. "|" .. wikipediaArticle .. "]]'''"), [=[</div>
|-
| style="vertical-align: top; height: 35px; border-bottom: 1px solid lightgray;" | [[File:Wikimedia-logo.svg|35px|none|Wikimedia Commons]]
| style="border-bottom: 1px solid lightgray;" | '''Wikimedia Commons''' has links to ]=], canonicalName, [=[-related content in sister projects:
<div style="padding: 5px 10px">]=], (setsister == "-" and "''None.''" or "'''[[commons:" .. setsister .. "|" .. setsister .. "]]'''"), [=[</div>
|-
| style="vertical-align: top; height: 35px; width: 40px; border-bottom: 1px solid lightgray;" | [[File:Wiktionary-logo-v2.svg|35px|none|Wiktionary]]
|style="border-bottom: 1px solid lightgray;" | '''Wiktionary edition''']=], wikt_plural, [=[ written in ]=], canonicalName, [=[:
<div style="padding: 5px 10px">]=], wiktionarylinks, [=[</div>
|-
| style="vertical-align: top; height: 35px; border-bottom: 1px solid lightgray;" | [[File:Open book nae 02.svg|35px|none|Entry]]
| style="border-bottom: 1px solid lightgray;" | '''Wiktionary entry''' for the language's English name:
<div style="padding: 5px 10px">''']=], require("Module:links").full_link({lang = m_languages.getByCode("en"), term = entryname or canonicalName}), [=['''</div>
|-
| style="vertical-align: top; height: 35px;" | [[File:Crystal kfind.png|35px|none|Considerations]]
|| '''Wiktionary resources''' for editors contributing to ]=], canonicalName, [=[ entries:
<div style="padding: 5px 0">
* '''[[Wiktionary:]=], canonicalName, [=[ entry guidelines]]'''
* '''[[:Category:]=], canonicalName, [=[ reference templates|Reference templates]] ({{PAGESINCAT:]=], canonicalName, [=[ reference templates}})'''
* '''[[Appendix:]=], canonicalName, [=[ bibliography|Bibliography]]'''
|}
</div>]=]
}
end
local function edit_link(title, text)
return '<span class="plainlinks">['
.. tostring(mw.uri.fullUrl(title, { action = "edit" }))
.. ' ' .. text .. ']</span>'
end
-- Should perhaps use wiki syntax.
local function infobox(lang)
local ret = {}
insert(ret, '<table class="wikitable language-category-info"')
local raw_data = lang:getData("extra")
if raw_data then
local replacements = {
[1] = "canonical-name",
[2] = "wikidata-item",
[3] = "family",
[4] = "scripts",
}
local function replacer(letter1, letter2)
return letter1:lower() .. "-" .. letter2:lower()
end
-- For each key in the language data modules, returns a descriptive
-- kebab-case version (containing ASCII lowercase words separated
-- by hyphens).
local function kebab_case(key)
key = replacements[key] or key
key = key:gsub("(%l)(%u)", replacer):gsub("(%l)_(%l)", replacer)
return key
end
local compress = {compress = true}
local function html_attribute_encode(str)
str = to_json(str, compress)
:gsub('"', """)
-- & in attributes is automatically escaped.
-- :gsub("&", "&")
:gsub("<", "<")
:gsub(">", ">")
return str
end
insert(ret, ' data-code="' .. lang:getCode() .. '"')
for k, v in sorted_pairs(raw_data) do
insert(ret, " data-" .. kebab_case(k)
.. '="'
.. html_attribute_encode(v)
.. '"')
end
end
insert(ret, '>\n')
insert(ret, '<tr class="language-category-data">\n<th colspan="2">'
.. edit_link(lang:getDataModuleName(), "Edit language data")
.. "</th>\n</tr>\n")
insert(ret, "<tr>\n<th>Canonical name</th><td>" .. lang:getCanonicalName() .. "</td>\n</tr>\n")
local otherNames = lang:getOtherNames()
if otherNames then
local names = {}
for _, name in ipairs(otherNames) do
insert(names, "<li>" .. name .. "</li>")
end
if #names > 0 then
insert(ret, "<tr>\n<th>Other names</th><td><ul>" .. concat(names, "\n") .. "</ul></td>\n</tr>\n")
end
end
local aliases = lang:getAliases()
if aliases then
local names = {}
for _, name in ipairs(aliases) do
insert(names, "<li>" .. name .. "</li>")
end
if #names > 0 then
insert(ret, "<tr>\n<th>Aliases</th><td><ul>" .. concat(names, "\n") .. "</ul></td>\n</tr>\n")
end
end
local varieties = lang:getVarieties()
if varieties then
local names = {}
for _, name in ipairs(varieties) do
if type(name) == "string" then
insert(names, "<li>" .. name .. "</li>")
else
assert(type(name) == "table")
local first_var
local subvars = {}
for i, var in ipairs(name) do
if i == 1 then
first_var = var
else
insert(subvars, "<li>" .. var .. "</li>")
end
end
if #subvars > 0 then
insert(names, "<li><dl><dt>" .. first_var .. "</dt>\n<dd><ul>" .. concat(subvars, "\n") .. "</ul></dd></dl></li>")
elseif first_var then
insert(names, "<li>" .. first_var .. "</li>")
end
end
end
if #names > 0 then
insert(ret, "<tr>\n<th>Varieties</th><td><ul>" .. concat(names, "\n") .. "</ul></td>\n</tr>\n")
end
end
insert(ret, "<tr>\n<th>[[Wiktionary:Languages|Language code]]</th><td><code>" .. lang:getCode() .. "</code></td>\n</tr>\n")
insert(ret, "<tr>\n<th>[[Wiktionary:Families|Language family]]</th>\n")
local fam = lang:getFamily()
local famCode = fam and fam:getCode()
if not fam then
insert(ret, "<td>unclassified</td>")
elseif famCode == "qfa-iso" then
insert(ret, "<td>[[:Category:Language isolates|language isolate]]</td>")
elseif famCode == "qfa-mix" then
insert(ret, "<td>[[:Category:Mixed languages|mixed language]]</td>")
elseif famCode == "sgn" then
insert(ret, "<td>[[:Category:Sign languages|sign language]]</td>")
elseif famCode == "crp" then
insert(ret, "<td>[[:Category:Creole or pidgin languages|creole or pidgin]]</td>")
elseif famCode == "art" then
insert(ret, "<td>[[:Category:Constructed languages|constructed language]]</td>")
else
insert(ret, "<td>" .. fam:makeCategoryLink() .. "</td>")
end
insert(ret, "\n</tr>\n<tr>\n<th>Ancestors</th>\n<td>")
local ancestors = lang:getAncestors()
if ancestors[2] then
local ancestorList = {}
for i, anc in ipairs(ancestors) do
ancestorList[i] = "<li>" .. anc:makeCategoryLink() .. "</li>"
end
insert(ret, "<ul>\n" .. concat(ancestorList, "\n") .. "</ul>")
else
local ancestorChain = lang:getAncestorChainOld()
if ancestorChain[1] then
local chain = {}
for _, anc in reverse_ipairs(ancestorChain) do
insert(chain, "<li>" .. anc:makeCategoryLink() .. "</li>")
end
insert(ret, "<ul>\n" .. concat(chain, "\n<ul>\n") .. ("</ul>"):rep(#chain))
else
insert(ret, "unknown")
end
end
insert(ret, "</td>\n</tr>\n")
local scripts = lang:getScripts()
if scripts[1] then
local script_text = {}
local function makeScriptLine(sc)
local code = sc:getCode()
local url = tostring(mw.uri.fullUrl('Special:Search', {
search = 'contentmodel:css insource:"' .. code
.. '" insource:/\\.' .. code .. '/',
ns8 = '1'
}))
return sc:makeCategoryLink()
.. ' (<span class="plainlinks" title="Search for stylesheets referencing this script">[' .. url .. ' <code>' .. code .. '</code>]</span>)'
end
local function add_Hrkt(text)
insert(text, "<li>" .. makeScriptLine(Hrkt))
insert(text, "<ul>")
insert(text, "<li>" .. makeScriptLine(Hira) .. "</li>")
insert(text, "<li>" .. makeScriptLine(Kana) .. "</li>")
insert(text, "</ul>")
insert(text, "</li>")
end
for _, sc in ipairs(scripts) do
local text = {}
local code = sc:getCode()
if code == "Hrkt" then
add_Hrkt(text)
else
insert(text, "<li>" .. makeScriptLine(sc))
if code == "Jpan" then
insert(text, "<ul>")
insert(text, "<li>" .. makeScriptLine(Hani) .. "</li>")
add_Hrkt(text)
insert(text, "</ul>")
elseif code == "Kore" then
insert(text, "<ul>")
insert(text, "<li>" .. makeScriptLine(Hang) .. "</li>")
insert(text, "<li>" .. makeScriptLine(Hani) .. "</li>")
insert(text, "</ul>")
end
insert(text, "</li>")
end
insert(script_text, concat(text, "\n"))
end
insert(ret, "<tr>\n<th>[[Wiktionary:Scripts|Scripts]]</th>\n<td><ul>\n" .. concat(script_text, "\n") .. "</ul></td>\n</tr>\n")
else
insert(ret, "<tr>\n<th>[[Wiktionary:Scripts|Scripts]]</th>\n<td>not specified</td>\n</tr>\n")
end
local function add_module_info(raw_data, heading)
if raw_data then
local scripts = lang:getScriptCodes()
local module_info, add = {}, false
if type(raw_data) == "string" then
insert(module_info,
("[[Module:%s]]"):format(raw_data))
add = true
else
local raw_data_type = type(raw_data)
if raw_data_type == "table" and size(scripts) == 1 and type(raw_data[scripts[1]]) == "string" then
insert(module_info,
("[[Module:%s]]"):format(raw_data[scripts[1]]))
add = true
elseif raw_data_type == "table" then
insert(module_info, "<ul>")
for script, data in sorted_pairs(raw_data) do
if type(data) == "string" and m_sc_getByCode(script) then
insert(module_info, ("<li><code>%s</code>: [[Module:%s]]</li>"):format(script, data))
end
end
insert(module_info, "</ul>")
add = size(module_info) > 2
end
end
if add then
insert(ret, [=[
<tr>
<th>]=] .. heading .. [=[</th>
<td>]=] .. concat(module_info) .. [=[</td>
</tr>
]=])
end
end
end
add_module_info(raw_data.generate_forms, "Form-generating<br>module")
add_module_info(raw_data.translit, "[[Wiktionary:Transliteration and romanization|Transliteration<br>module]]")
add_module_info(raw_data.display_text, "Display text<br>module")
add_module_info(raw_data.entry_name, "Entry name<br>module")
add_module_info(raw_data.sort_key, "[[sortkey|Sortkey]]<br>module")
local wikidataItem = lang:getWikidataItem()
if lang:getWikidataItem() and mw.wikibase then
local URL = mw.wikibase.getEntityUrl(wikidataItem)
local link
if URL then
link = '[' .. URL .. ' ' .. wikidataItem .. ']'
else
link = '<span class="error">Invalid Wikidata item: <code>' .. wikidataItem .. '</code></span>'
end
insert(ret, "<tr><th>Wikidata</th><td>" .. link .. "</td></tr>")
end
insert(ret, "</table>")
return concat(ret)
end
local function NavFrame(content, title)
return '<div class="NavFrame"><div class="NavHead">'
.. (title or '{{{title}}}') .. '</div>'
.. '<div class="NavContent" style="text-align: left;">'
.. content
.. '</div></div>'
end
local function get_description_topright_additional(lang, locations, extinct, setwiki, setwikt, setsister, entryname)
local nameWithLanguage = lang:getCategoryName("nocap")
if lang:getCode() == "und" then
local description =
"This is the main category of the '''" .. nameWithLanguage .. "''', represented in Wiktionary by the [[Wiktionary:Languages|code]] '''" .. lang:getCode() .. "'''. " ..
"This language contains terms in historical writing, whose meaning has not yet been determined by scholars."
return description, nil, nil
end
local canonicalName = lang:getCanonicalName()
local topright = linkbox(lang, setwiki, setwikt, setsister, entryname)
local the_prefix
if canonicalName:find(" Language$") then
the_prefix = ""
else
the_prefix = "the "
end
local description = "This is the main category of " .. the_prefix .. "'''" .. nameWithLanguage .. "'''."
local location_links = {}
local prep
local saw_embedded_comma = false
for _, location in ipairs(locations) do
local this_prep
if location == "the world" then
this_prep = "across"
insert(location_links, location)
elseif location ~= "UNKNOWN" then
this_prep = "in"
if location:find(",") then
saw_embedded_comma = true
end
insert(location_links, link_location(location))
end
if this_prep then
if prep and this_prep ~= prep then
error("Can't handle location 'the world' along with another location (clashing prepositions)")
end
prep = this_prep
end
end
local location_desc
if #location_links > 0 then
local location_link_text
if saw_embedded_comma and #location_links >= 3 then
location_link_text = mw.text.listToText(location_links, "; ", "; and ")
else
location_link_text = serial_comma_join(location_links)
end
location_desc = ("It is %s %s %s.\n\n"):format(
extinct and "an [[extinct language]] that was formerly spoken" or "spoken", prep, location_link_text)
elseif extinct then
location_desc = "It is an [[extinct language]].\n\n"
else
location_desc = ""
end
local add = location_desc .. "Information about " .. canonicalName .. ":\n\n" .. infobox(lang)
if lang:hasType("reconstructed") then
add = add .. "\n\n" ..
ucfirst(canonicalName) .. " is a reconstructed language. Its words and roots are not directly attested in any written works, but have been reconstructed through the ''comparative method'', " ..
"which finds regular similarities between languages that cannot be explained by coincidence or word-borrowing, and extrapolates ancient forms from these similarities.\n\n" ..
"According to our [[Wiktionary:Criteria for inclusion|criteria for inclusion]], terms in " .. canonicalName ..
" should '''not''' be present in entries in the main namespace, but may be added to the Reconstruction: namespace."
elseif lang:hasType("appendix-constructed") then
add = add .. "\n\n" ..
ucfirst(canonicalName) .. " is a constructed language that is only in sporadic use. " ..
"According to our [[Wiktionary:Criteria for inclusion|criteria for inclusion]], terms in " .. canonicalName ..
" should '''not''' be present in entries in the main namespace, but may be added to the Appendix: namespace. " ..
"All terms in this language may be available at [[Appendix:" .. ucfirst(canonicalName) .. "]]."
end
local about = new_title("Wiktionary:About " .. canonicalName)
if about.exists then
add = add .. "\n\n" ..
"Please see '''[[Wiktionary:About " .. canonicalName .. "]]''' for information and special considerations for creating " .. nameWithLanguage .. " entries."
end
local ok, tree_of_descendants = pcall(
require("Module:family tree").print_children,
lang:getCode(), {
protolanguage_under_family = true,
must_have_descendants = true
})
if ok then
if tree_of_descendants then
add = add .. NavFrame(
tree_of_descendants,
"Family tree")
else
add = add .. "\n\n" .. ucfirst(lang:getCanonicalName())
.. " has no descendants or varieties listed in Wiktionary's language data modules."
end
else
mw.log("error while generating tree: " .. tostring(tree_of_descendants))
end
return description, topright, add
end
local function get_parents(lang, locations, extinct)
local canonicalName = lang:getCanonicalName()
local sortkey = {sort_base = canonicalName, lang = "mi"}
local ret = {{name = "Reo", sort = sortkey}}
local fam = lang:getFamily()
local famCode = fam and fam:getCode()
-- FIXME: Some of the following categories should be added to this module.
if not fam then
insert(ret, {name = "Category:Unclassified languages", sort = sortkey})
elseif famCode == "qfa-iso" then
insert(ret, {name = "Category:Language isolates", sort = sortkey})
elseif famCode == "qfa-mix" then
insert(ret, {name = "Category:Mixed languages", sort = sortkey})
elseif famCode == "sgn" then
insert(ret, {name = "Category:All sign languages", sort = sortkey})
elseif famCode == "crp" then
insert(ret, {name = "Category:Creole or pidgin languages", sort = sortkey})
for _, anc in ipairs(lang:getAncestors()) do
-- Avoid Haitian Creole being categorised in [[:Category:Haitian Creole-based creole or pidgin languages]], as one of its ancestors is an etymology-only variety of it.
-- Use that ancestor's ancestors instead.
if anc:getFullCode() == lang:getCode() then
for _, anc_extra in ipairs(anc:getAncestors()) do
insert(ret, {name = "Category:" .. ucfirst(anc_extra:getFullName()) .. "-based creole or pidgin languages", sort = sortkey})
end
else
insert(ret, {name = "Category:" .. ucfirst(anc:getFullName()) .. "-based creole or pidgin languages", sort = sortkey})
end
end
elseif famCode == "art" then
if lang:hasType("appendix-constructed") then
insert(ret, {name = "Category:Appendix-only constructed languages", sort = sortkey})
else
insert(ret, {name = "Category:Constructed languages", sort = sortkey})
end
for _, anc in ipairs(lang:getAncestors()) do
if anc:getFullCode() == lang:getCode() then
for _, anc_extra in ipairs(anc:getAncestors()) do
insert(ret, {name = "Category:" .. ucfirst(anc_extra:getFullName()) .. "-based constructed languages", sort = sortkey})
end
else
insert(ret, {name = "Category:" .. ucfirst(anc:getFullName()) .. "-based constructed languages", sort = sortkey})
end
end
else
insert(ret, {name = "Category:" .. fam:getCategoryName(), sort = sortkey})
if lang:hasType("reconstructed") then
insert(ret, {
name = "Category:Reconstructed languages",
sort = {sort_base = canonicalName:gsub("^Proto%-", ""), lang = "en"}
})
end
end
local function add_sc_cat(sc)
insert(ret, {name = "Category:Reo " .. sc:getCategoryName(), sort = sortkey})
end
local function add_Hrkt()
add_sc_cat(Hrkt)
add_sc_cat(Hira)
add_sc_cat(Kana)
end
for _, sc in ipairs(lang:getScripts()) do
if sc:getCode() == "Hrkt" then
add_Hrkt()
else
add_sc_cat(sc)
if sc:getCode() == "Jpan" then
add_sc_cat(Hani)
add_Hrkt()
elseif sc:getCode() == "Kore" then
add_sc_cat(Hang)
add_sc_cat(Hani)
end
end
end
if lang:hasTranslit() then
insert(ret, {name = "Category:Languages with automatic transliteration", sort = sortkey})
end
local function insert_location_language_cat(location)
local cat = "Languages of " .. location
insert(ret, {name = "Category:" .. cat, sort = sortkey})
local auto_cat_args = scrape_category_for_auto_cat_args(cat)
local location_parent = auto_cat_args and auto_cat_args.parent
if location_parent then
local split_parents = require(parse_utilities_module).split_on_comma(location_parent)
for _, parent in ipairs(split_parents) do
parent = parent:match("^(.-):.*$") or parent
insert_location_language_cat(parent)
end
end
end
local saw_location = false
for _, location in ipairs(locations) do
if location ~= "UNKNOWN" then
saw_location = true
insert_location_language_cat(location)
end
end
if extinct then
insert(ret, {name = "Category:All extinct languages", sort = sortkey})
end
if not saw_location and not (lang:hasType("reconstructed") or (fam and fam:getCode() == "art")) then
-- Constructed and reconstructed languages don't need a location specified and often won't have one,
-- so don't put them in this maintenance category.
insert(ret, {name = "Category:Languages not sorted into a location category", sort = sortkey})
end
return ret
end
local function get_children()
local ret = {}
-- FIXME: We should work on the children mechanism so it isn't necessary to manually specify these.
--for _, label in ipairs({"appendices", "entry maintenance", "lemmas", "names", "phrases", "rhymes", "symbols", "templates", "terms by etymology", "terms by usage"}) do
-- insert(ret, {name = label, is_label = true})
--end
--insert(ret, {name = "terms derived from {{{langname}}}", is_label = true, lang = false})
--insert(ret, {name = "{{{langcode}}}:All topics", sort = "all topics"})
--insert(ret, {name = "Varieties of {{{langname}}}"})
--insert(ret, {name = "Requests concerning {{{langname}}}"})
--insert(ret, {name = "Rhymes:{{{langname}}}", description = "Lists of {{{langname}}} words by their rhymes."})
--insert(ret, {name = "User {{{langcode}}}", description = "Wiktionary users categorized by fluency levels in {{{langdisp}}}."})
return ret
end
-- Handle language categories of the form e.g. [[:Category:French language]] and
-- [[:Category:British Sign Language]].
insert(raw_handlers, function(data)
local category = data.category
if not (category:match("[Rr]eo") or category:match("[Ll]ect$")) then
return nil
end
local lang = m_languages.getByCanonicalName(category)
if not lang then
local langname = category:match("^Reo (.*)")
if langname then
lang = m_languages.getByCanonicalName(langname)
end
if not lang then
return nil
end
end
local args = require("Module:parameters").process(data.args, {
[1] = {list = true},
["setwiki"] = true,
["setwikt"] = true,
["setsister"] = true,
["entryname"] = true,
["extinct"] = {type = "boolean"},
})
-- If called from inside, don't require any arguments, as they can't be known
-- in general and aren't needed just to generate the first parent (used for
-- breadcrumbs).
if #args[1] == 0 and not data.called_from_inside then
-- At least one location must be specified unless the language is constructed (e.g. Esperanto) or reconstructed (e.g. Proto-Indo-European).
local fam = lang:getFamily()
if not (lang:hasType("reconstructed") or (fam and fam:getCode() == "art")) then
error("At least one location (param 1=) must be specified for language '" .. lang:getCanonicalName() .. "' (code '" .. lang:getCode() .. "'). " ..
"Use the value UNKNOWN if the language's location is truly unknown.")
end
end
local description, topright, additional = "", "", ""
-- If called from inside the category tree system, it's called when generating
-- parents or children, and we don't need to generate the description or additional
-- text (which is very expensive in terms of memory because it calls [[Module:family tree]],
-- which calls [[Module:languages/data/all]]).
if not data.called_from_inside then
description, topright, additional = get_description_topright_additional(
lang, args[1], args.extinct, args.setwiki, args.setwikt, args.setsister, args.entryname
)
end
return {
canonical_name = lang:getCategoryName(),
description = description,
lang = lang:getCode(),
topright = topright,
additional = additional,
breadcrumb = lang:getCanonicalName(),
parents = get_parents(lang, args[1], args.extinct),
extra_children = get_children(lang),
umbrella = false,
can_be_empty = true,
}, true
end)
-- Handle categories such as [[:Category:Languages of Indonesia]].
insert(raw_handlers, function(data)
local location = data.category:match("^Languages of (.*)$")
if location then
local args = require("Module:parameters").process(data.args, {
["flagfile"] = true,
["commonscat"] = true,
["wp"] = true,
["basename"] = true,
["parent"] = true,
["locationcat"] = true,
["locationlink"] = true,
})
local topright
local basename = args.basename or location:gsub(", .*", "")
if args.flagfile ~= "-" then
local flagfile_arg = args.flagfile or ("Flag of %s.svg"):format(basename)
local files = require(parse_utilities_module).split_on_comma(flagfile_arg)
local topright_parts = {}
for _, file in ipairs(files) do
local flagfile = "File:" .. file
local flagfile_page = new_title(flagfile)
if flagfile_page and flagfile_page.file.exists then
insert(topright_parts, ("[[%s|right|100px|border]]"):format(flagfile))
elseif args.flagfile then
error(("Explicit flagfile '%s' doesn't exist"):format(flagfile))
end
end
topright = concat(topright_parts)
end
if args.wp then
local wp = require("Module:yesno")(args.wp, "+")
if wp == "+" or wp == true then
wp = data.category
end
if wp then
local wp_topright = ("{{wikipedia|%s}}"):format(wp)
if topright then
topright = topright .. wp_topright
else
topright = wp_topright
end
end
end
if args.commonscat then
local commonscat = require("Module:yesno")(args.commonscat, "+")
if commonscat == "+" or commonscat == true then
commonscat = data.category
end
if commonscat then
local commons_topright = ("{{commonscat|%s}}"):format(commonscat)
if topright then
topright = topright .. commons_topright
else
topright = commons_topright
end
end
end
local bare_location = location:match("^the (.*)$") or location
local location_link = args.locationlink or link_location(location)
local bare_basename = basename:match("^the (.*)$") or basename
local parents = {}
if args.parent then
local explicit_parents = require(parse_utilities_module).split_on_comma(args.parent)
for i, parent in ipairs(explicit_parents) do
local actual_parent, sort_key = parent:match("^(.-):(.*)$")
if actual_parent then
parent = actual_parent
sort_key = sort_key:gsub("%+", bare_location)
else
sort_key = " " .. bare_location
end
insert(parents, {name = "Languages of " .. parent, sort = sort_key})
end
else
insert(parents, {name = "Languages by country", sort = {sort_base = bare_location, lang = "en"}})
end
if args.locationcat then
local explicit_location_cats = require(parse_utilities_module).split_on_comma(args.locationcat)
for i, locationcat in ipairs(explicit_location_cats) do
insert(parents, {name = "Category:" .. locationcat, sort = " Languages"})
end
else
local location_cat = ("Category:%s"):format(bare_location)
local location_page = new_title(location_cat)
if location_page and location_page.exists then
insert(parents, {name = location_cat, sort = "Languages"})
end
end
local description = ("Categories for languages of %s (including sublects)."):format(location_link)
return {
topright = topright,
description = description,
parents = parents,
breadcrumb = bare_basename,
additional = "{{{umbrella_msg}}}",
}, true
end
end)
-- Handle categories such as [[:Category:English-based creole or pidgin languages]].
insert(raw_handlers, function(data)
local langname = data.category:match("(.*)%-based creole or pidgin languages$")
if langname then
local lang = m_languages.getByCanonicalName(langname)
if lang then
return {
lang = lang:getCode(),
description = "Languages which developed as a [[creole]] or [[pidgin]] from " .. lang:makeCategoryLink() .. ".",
parents = {{name = "Creole or pidgin languages", sort = {sort_base = "*" .. langname, lang = "en"}}},
breadcrumb = lang:getCanonicalName() .. "-based",
}
end
end
end)
-- Handle categories such as [[:Category:English-based constructed languages]].
insert(raw_handlers, function(data)
local langname = data.category:match("(.*)%-based constructed languages$")
if langname then
local lang = m_languages.getByCanonicalName(langname)
if lang then
return {
lang = lang:getCode(),
description = "Constructed languages which are based on " .. lang:makeCategoryLink() .. ".",
parents = {{name = "Constructed languages", sort = {sort_base = "*" .. langname, lang = "en"}}},
breadcrumb = lang:getCanonicalName() .. "-based",
}
end
end
end)
return {RAW_CATEGORIES = raw_categories, RAW_HANDLERS = raw_handlers}
9f0i5jaq1j7omkh2erfeca1ltyz92tf
17453
17442
2026-07-13T08:53:55Z
Hiyuune
6766
17453
Scribunto
text/plain
local new_title = mw.title.new
local ucfirst = require("Module:string utilities").ucfirst
local split = require("Module:string utilities").split
local raw_categories = {}
local raw_handlers = {}
local m_languages = require("Module:languages")
local m_sc_getByCode = require("Module:scripts").getByCode
local m_table = require("Module:table")
local parse_utilities_module = "Module:parse utilities"
local concat = table.concat
local insert = table.insert
local reverse_ipairs = m_table.reverseIpairs
local serial_comma_join = m_table.serialCommaJoin
local size = m_table.size
local sorted_pairs = m_table.sortedPairs
local to_json = require("Module:JSON").toJSON
local Hang = m_sc_getByCode("Hang")
local Hani = m_sc_getByCode("Hani")
local Hira = m_sc_getByCode("Hira")
local Hrkt = m_sc_getByCode("Hrkt")
local Kana = m_sc_getByCode("Kana")
local function track(page)
-- [[Special:WhatLinksHere/Wiktionary:Tracking/category tree/languages/PAGE]]
return require("Module:debug/track")("category tree/languages/" .. page)
end
-- This handles language categories of the form e.g. [[:Category:French language]] and
-- [[:Category:British Sign Language]]; categories like [[:Category:Languages of Indonesia]]; categories like
-- [[:Category:English-based creole or pidgin languages]]; and categories like
-- [[:Category:English-based constructed languages]].
-----------------------------------------------------------------------------
-- --
-- RAW CATEGORIES --
-- --
-----------------------------------------------------------------------------
raw_categories["Reo"] = {
topright = "{{commonscat|Languages}}\n[[File:Languages world map-transparent background.svg|thumb|right|250px|Rough world map of language families]]",
description = "This category contains the categories for every language on Wiktionary.",
additional = "Not all languages that Wiktionary recognises may have a category here yet. There are many that have " ..
"not yet received any attention from editors, mainly because not all Wiktionary users know about every single " ..
"language. See [[Wiktionary:List of languages]] for a full list.",
parents = {
"Whakaraparapa",
},
}
raw_categories["All extinct languages"] = {
description = "This category contains the categories for every [[extinct language]] on Wiktionary.",
additional = "Do not confuse this category with [[:Category:Extinct languages]], which is an umbrella category for the names of extinct languages in specific other languages (e.g. {{m+|de|Langobardisch}} for the ancient [[Lombardic]] language).",
parents = {
"Reo",
},
}
raw_categories["Languages by country"] = {
topright = "{{commonscat|Languages by continent}}",
description = "Categories that group languages by country.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Reo",
},
}
raw_categories["Language isolates"] = {
topright = "{{wikipedia|Language isolate}}\n{{commonscat|Language isolates}}",
description = "Languages with no known relatives.",
parents = {
{name = "Languages by family", sort = "*Isolates"},
{name = "All language families", sort = "Isolates"},
},
}
raw_categories["Languages not sorted into a location category"] = {
description = "Languages which do not specify (in their {{tl|auto cat}} call) the location(s) where they are spoken.",
additional = "This excludes constructed and reconstructed languages; as a result, all languages in this category explicitly specify their location as {{cd|UNKNOWN}}.",
parents = {
{name = "Requests"},
},
hidden = true,
}
-----------------------------------------------------------------------------
-- --
-- RAW HANDLERS --
-- --
-----------------------------------------------------------------------------
-- Given a category (without the "Category:" prefix), look up the page defining the category, find the call to
-- {{auto cat}} (if any), and return a table of its arguments. If the category page doesn't exist or doesn't have
-- an {{auto cat}} invocation, return nil.
--
-- FIXME: Duplicated in [[Module:category tree/lects]].
local function scrape_category_for_auto_cat_args(cat)
local cat_page = mw.title.new("Category:" .. cat)
if cat_page then
local contents = cat_page:getContent()
if contents then
local frame = mw.getCurrentFrame()
for template in require("Module:template parser").find_templates(contents) do
-- The template parser automatically handles redirects and canonicalizes them, so uses of {{autocat}}
-- will also be found.
if template:get_name() == "auto cat" then
return template:get_arguments()
end
end
end
end
return nil
end
local function link_location(location)
local location_no_the = location:match("^the (.*)$")
local bare_location = location_no_the or location
local location_link
local bare_location_parts = split(bare_location, ", ")
for i, part in ipairs(bare_location_parts) do
bare_location_parts[i] = ("[[%s]]"):format(part)
end
location_link = concat(bare_location_parts, ", ")
if location_no_the then
location_link = "the " .. location_link
end
return location_link
end
local function linkbox(lang, setwiki, setwikt, setsister, entryname)
local wiktionarylinks = {}
local canonicalName = lang:getCanonicalName()
local wikimediaLanguages = lang:getWikimediaLanguages()
local wikipediaArticle = setwiki or lang:getWikipediaArticle()
setsister = setsister and ucfirst(setsister) or nil
if setwikt then
track("setwikt")
if setwikt == "-" then
track("setwikt/hyphen")
end
end
if setwikt ~= "-" and wikimediaLanguages and wikimediaLanguages[1] then
for _, wikimedialang in ipairs(wikimediaLanguages) do
local check = new_title(wikimedialang:getCode() .. ":")
if check and check.isExternal then
insert(wiktionarylinks,
(wikimedialang:getCanonicalName() ~= canonicalName and "(''" .. wikimedialang:getCanonicalName() .. "'') " or "") ..
"'''[[:" .. wikimedialang:getCode() .. ":|" .. wikimedialang:getCode() .. ".wiktionary.org]]'''")
end
end
wiktionarylinks = concat(wiktionarylinks, "<br/>")
end
local wikt_plural = wikimediaLanguages[2] and "s" or ""
if #wiktionarylinks == 0 then
wiktionarylinks = "''None.''"
end
if setsister then
track("setsister")
if setsister == "-" then
track("setsister/hyphen")
else
setsister = "Category:" .. setsister
end
else
setsister = lang:getCommonsCategory() or "-"
end
return concat{
[=[<div class="wikitable" style="float: right; clear: right; margin: 0 0 0.5em 1em; width: 300px; padding: 5px;">
<div style="text-align: center; margin-bottom: 10px; margin-top: 5px">''']=], canonicalName, [=[ language links'''</div>
{| style="font-size: 90%"
|-
| style="vertical-align: top; height: 35px; border-bottom: 1px solid lightgray;" | [[File:Wikipedia-logo.png|35px|none|Wikipedia]]
| style="border-bottom: 1px solid lightgray;" | '''English Wikipedia''' has an article on:
<div style="padding: 5px 10px">]=], (setwiki == "-" and "''None.''" or "'''[[w:" .. wikipediaArticle .. "|" .. wikipediaArticle .. "]]'''"), [=[</div>
|-
| style="vertical-align: top; height: 35px; border-bottom: 1px solid lightgray;" | [[File:Wikimedia-logo.svg|35px|none|Wikimedia Commons]]
| style="border-bottom: 1px solid lightgray;" | '''Wikimedia Commons''' has links to ]=], canonicalName, [=[-related content in sister projects:
<div style="padding: 5px 10px">]=], (setsister == "-" and "''None.''" or "'''[[commons:" .. setsister .. "|" .. setsister .. "]]'''"), [=[</div>
|-
| style="vertical-align: top; height: 35px; width: 40px; border-bottom: 1px solid lightgray;" | [[File:Wiktionary-logo-v2.svg|35px|none|Wiktionary]]
|style="border-bottom: 1px solid lightgray;" | '''Wiktionary edition''']=], wikt_plural, [=[ written in ]=], canonicalName, [=[:
<div style="padding: 5px 10px">]=], wiktionarylinks, [=[</div>
|-
| style="vertical-align: top; height: 35px; border-bottom: 1px solid lightgray;" | [[File:Open book nae 02.svg|35px|none|Entry]]
| style="border-bottom: 1px solid lightgray;" | '''Wiktionary entry''' for the language's English name:
<div style="padding: 5px 10px">''']=], require("Module:links").full_link({lang = m_languages.getByCode("en"), term = entryname or canonicalName}), [=['''</div>
|-
| style="vertical-align: top; height: 35px;" | [[File:Crystal kfind.png|35px|none|Considerations]]
|| '''Wiktionary resources''' for editors contributing to ]=], canonicalName, [=[ entries:
<div style="padding: 5px 0">
* '''[[Wiktionary:]=], canonicalName, [=[ entry guidelines]]'''
* '''[[:Category:]=], canonicalName, [=[ reference templates|Reference templates]] ({{PAGESINCAT:]=], canonicalName, [=[ reference templates}})'''
* '''[[Appendix:]=], canonicalName, [=[ bibliography|Bibliography]]'''
|}
</div>]=]
}
end
local function edit_link(title, text)
return '<span class="plainlinks">['
.. tostring(mw.uri.fullUrl(title, { action = "edit" }))
.. ' ' .. text .. ']</span>'
end
-- Should perhaps use wiki syntax.
local function infobox(lang)
local ret = {}
insert(ret, '<table class="wikitable language-category-info"')
local raw_data = lang:getData("extra")
if raw_data then
local replacements = {
[1] = "canonical-name",
[2] = "wikidata-item",
[3] = "family",
[4] = "scripts",
}
local function replacer(letter1, letter2)
return letter1:lower() .. "-" .. letter2:lower()
end
-- For each key in the language data modules, returns a descriptive
-- kebab-case version (containing ASCII lowercase words separated
-- by hyphens).
local function kebab_case(key)
key = replacements[key] or key
key = key:gsub("(%l)(%u)", replacer):gsub("(%l)_(%l)", replacer)
return key
end
local compress = {compress = true}
local function html_attribute_encode(str)
str = to_json(str, compress)
:gsub('"', """)
-- & in attributes is automatically escaped.
-- :gsub("&", "&")
:gsub("<", "<")
:gsub(">", ">")
return str
end
insert(ret, ' data-code="' .. lang:getCode() .. '"')
for k, v in sorted_pairs(raw_data) do
insert(ret, " data-" .. kebab_case(k)
.. '="'
.. html_attribute_encode(v)
.. '"')
end
end
insert(ret, '>\n')
insert(ret, '<tr class="language-category-data">\n<th colspan="2">'
.. edit_link(lang:getDataModuleName(), "Edit language data")
.. "</th>\n</tr>\n")
insert(ret, "<tr>\n<th>Canonical name</th><td>" .. lang:getCanonicalName() .. "</td>\n</tr>\n")
local otherNames = lang:getOtherNames()
if otherNames then
local names = {}
for _, name in ipairs(otherNames) do
insert(names, "<li>" .. name .. "</li>")
end
if #names > 0 then
insert(ret, "<tr>\n<th>Other names</th><td><ul>" .. concat(names, "\n") .. "</ul></td>\n</tr>\n")
end
end
local aliases = lang:getAliases()
if aliases then
local names = {}
for _, name in ipairs(aliases) do
insert(names, "<li>" .. name .. "</li>")
end
if #names > 0 then
insert(ret, "<tr>\n<th>Aliases</th><td><ul>" .. concat(names, "\n") .. "</ul></td>\n</tr>\n")
end
end
local varieties = lang:getVarieties()
if varieties then
local names = {}
for _, name in ipairs(varieties) do
if type(name) == "string" then
insert(names, "<li>" .. name .. "</li>")
else
assert(type(name) == "table")
local first_var
local subvars = {}
for i, var in ipairs(name) do
if i == 1 then
first_var = var
else
insert(subvars, "<li>" .. var .. "</li>")
end
end
if #subvars > 0 then
insert(names, "<li><dl><dt>" .. first_var .. "</dt>\n<dd><ul>" .. concat(subvars, "\n") .. "</ul></dd></dl></li>")
elseif first_var then
insert(names, "<li>" .. first_var .. "</li>")
end
end
end
if #names > 0 then
insert(ret, "<tr>\n<th>Varieties</th><td><ul>" .. concat(names, "\n") .. "</ul></td>\n</tr>\n")
end
end
insert(ret, "<tr>\n<th>[[Wiktionary:Languages|Language code]]</th><td><code>" .. lang:getCode() .. "</code></td>\n</tr>\n")
insert(ret, "<tr>\n<th>[[Wiktionary:Families|Language family]]</th>\n")
local fam = lang:getFamily()
local famCode = fam and fam:getCode()
if not fam then
insert(ret, "<td>unclassified</td>")
elseif famCode == "qfa-iso" then
insert(ret, "<td>[[:Category:Language isolates|language isolate]]</td>")
elseif famCode == "qfa-mix" then
insert(ret, "<td>[[:Category:Mixed languages|mixed language]]</td>")
elseif famCode == "sgn" then
insert(ret, "<td>[[:Category:Sign languages|sign language]]</td>")
elseif famCode == "crp" then
insert(ret, "<td>[[:Category:Creole or pidgin languages|creole or pidgin]]</td>")
elseif famCode == "art" then
insert(ret, "<td>[[:Category:Constructed languages|constructed language]]</td>")
else
insert(ret, "<td>" .. fam:makeCategoryLink() .. "</td>")
end
insert(ret, "\n</tr>\n<tr>\n<th>Ancestors</th>\n<td>")
local ancestors = lang:getAncestors()
if ancestors[2] then
local ancestorList = {}
for i, anc in ipairs(ancestors) do
ancestorList[i] = "<li>" .. anc:makeCategoryLink() .. "</li>"
end
insert(ret, "<ul>\n" .. concat(ancestorList, "\n") .. "</ul>")
else
local ancestorChain = lang:getAncestorChainOld()
if ancestorChain[1] then
local chain = {}
for _, anc in reverse_ipairs(ancestorChain) do
insert(chain, "<li>" .. anc:makeCategoryLink() .. "</li>")
end
insert(ret, "<ul>\n" .. concat(chain, "\n<ul>\n") .. ("</ul>"):rep(#chain))
else
insert(ret, "unknown")
end
end
insert(ret, "</td>\n</tr>\n")
local scripts = lang:getScripts()
if scripts[1] then
local script_text = {}
local function makeScriptLine(sc)
local code = sc:getCode()
local url = tostring(mw.uri.fullUrl('Special:Search', {
search = 'contentmodel:css insource:"' .. code
.. '" insource:/\\.' .. code .. '/',
ns8 = '1'
}))
return sc:makeCategoryLink()
.. ' (<span class="plainlinks" title="Search for stylesheets referencing this script">[' .. url .. ' <code>' .. code .. '</code>]</span>)'
end
local function add_Hrkt(text)
insert(text, "<li>" .. makeScriptLine(Hrkt))
insert(text, "<ul>")
insert(text, "<li>" .. makeScriptLine(Hira) .. "</li>")
insert(text, "<li>" .. makeScriptLine(Kana) .. "</li>")
insert(text, "</ul>")
insert(text, "</li>")
end
for _, sc in ipairs(scripts) do
local text = {}
local code = sc:getCode()
if code == "Hrkt" then
add_Hrkt(text)
else
insert(text, "<li>" .. makeScriptLine(sc))
if code == "Jpan" then
insert(text, "<ul>")
insert(text, "<li>" .. makeScriptLine(Hani) .. "</li>")
add_Hrkt(text)
insert(text, "</ul>")
elseif code == "Kore" then
insert(text, "<ul>")
insert(text, "<li>" .. makeScriptLine(Hang) .. "</li>")
insert(text, "<li>" .. makeScriptLine(Hani) .. "</li>")
insert(text, "</ul>")
end
insert(text, "</li>")
end
insert(script_text, concat(text, "\n"))
end
insert(ret, "<tr>\n<th>[[Wiktionary:Scripts|Scripts]]</th>\n<td><ul>\n" .. concat(script_text, "\n") .. "</ul></td>\n</tr>\n")
else
insert(ret, "<tr>\n<th>[[Wiktionary:Scripts|Scripts]]</th>\n<td>not specified</td>\n</tr>\n")
end
local function add_module_info(raw_data, heading)
if raw_data then
local scripts = lang:getScriptCodes()
local module_info, add = {}, false
if type(raw_data) == "string" then
insert(module_info,
("[[Module:%s]]"):format(raw_data))
add = true
else
local raw_data_type = type(raw_data)
if raw_data_type == "table" and size(scripts) == 1 and type(raw_data[scripts[1]]) == "string" then
insert(module_info,
("[[Module:%s]]"):format(raw_data[scripts[1]]))
add = true
elseif raw_data_type == "table" then
insert(module_info, "<ul>")
for script, data in sorted_pairs(raw_data) do
if type(data) == "string" and m_sc_getByCode(script) then
insert(module_info, ("<li><code>%s</code>: [[Module:%s]]</li>"):format(script, data))
end
end
insert(module_info, "</ul>")
add = size(module_info) > 2
end
end
if add then
insert(ret, [=[
<tr>
<th>]=] .. heading .. [=[</th>
<td>]=] .. concat(module_info) .. [=[</td>
</tr>
]=])
end
end
end
add_module_info(raw_data.generate_forms, "Form-generating<br>module")
add_module_info(raw_data.translit, "[[Wiktionary:Transliteration and romanization|Transliteration<br>module]]")
add_module_info(raw_data.display_text, "Display text<br>module")
add_module_info(raw_data.entry_name, "Entry name<br>module")
add_module_info(raw_data.sort_key, "[[sortkey|Sortkey]]<br>module")
local wikidataItem = lang:getWikidataItem()
if lang:getWikidataItem() and mw.wikibase then
local URL = mw.wikibase.getEntityUrl(wikidataItem)
local link
if URL then
link = '[' .. URL .. ' ' .. wikidataItem .. ']'
else
link = '<span class="error">Invalid Wikidata item: <code>' .. wikidataItem .. '</code></span>'
end
insert(ret, "<tr><th>Wikidata</th><td>" .. link .. "</td></tr>")
end
insert(ret, "</table>")
return concat(ret)
end
local function NavFrame(content, title)
return '<div class="NavFrame"><div class="NavHead">'
.. (title or '{{{title}}}') .. '</div>'
.. '<div class="NavContent" style="text-align: left;">'
.. content
.. '</div></div>'
end
local function get_description_topright_additional(lang, locations, extinct, setwiki, setwikt, setsister, entryname)
local nameWithLanguage = lang:getCategoryName("nocap")
if lang:getCode() == "und" then
local description =
"This is the main category of the '''" .. nameWithLanguage .. "''', represented in Wiktionary by the [[Wiktionary:Languages|code]] '''" .. lang:getCode() .. "'''. " ..
"This language contains terms in historical writing, whose meaning has not yet been determined by scholars."
return description, nil, nil
end
local canonicalName = lang:getCanonicalName()
local topright = linkbox(lang, setwiki, setwikt, setsister, entryname)
local the_prefix
if canonicalName:find(" Language$") then
the_prefix = ""
else
the_prefix = "the "
end
local description = "This is the main category of " .. the_prefix .. "'''" .. nameWithLanguage .. "'''."
local location_links = {}
local prep
local saw_embedded_comma = false
for _, location in ipairs(locations) do
local this_prep
if location == "the world" then
this_prep = "across"
insert(location_links, location)
elseif location ~= "UNKNOWN" then
this_prep = "in"
if location:find(",") then
saw_embedded_comma = true
end
insert(location_links, link_location(location))
end
if this_prep then
if prep and this_prep ~= prep then
error("Can't handle location 'the world' along with another location (clashing prepositions)")
end
prep = this_prep
end
end
local location_desc
if #location_links > 0 then
local location_link_text
if saw_embedded_comma and #location_links >= 3 then
location_link_text = mw.text.listToText(location_links, "; ", "; and ")
else
location_link_text = serial_comma_join(location_links)
end
location_desc = ("It is %s %s %s.\n\n"):format(
extinct and "an [[extinct language]] that was formerly spoken" or "spoken", prep, location_link_text)
elseif extinct then
location_desc = "It is an [[extinct language]].\n\n"
else
location_desc = ""
end
local add = location_desc .. "Information about " .. canonicalName .. ":\n\n" .. infobox(lang)
if lang:hasType("reconstructed") then
add = add .. "\n\n" ..
ucfirst(canonicalName) .. " is a reconstructed language. Its words and roots are not directly attested in any written works, but have been reconstructed through the ''comparative method'', " ..
"which finds regular similarities between languages that cannot be explained by coincidence or word-borrowing, and extrapolates ancient forms from these similarities.\n\n" ..
"According to our [[Wiktionary:Criteria for inclusion|criteria for inclusion]], terms in " .. canonicalName ..
" should '''not''' be present in entries in the main namespace, but may be added to the Reconstruction: namespace."
elseif lang:hasType("appendix-constructed") then
add = add .. "\n\n" ..
ucfirst(canonicalName) .. " is a constructed language that is only in sporadic use. " ..
"According to our [[Wiktionary:Criteria for inclusion|criteria for inclusion]], terms in " .. canonicalName ..
" should '''not''' be present in entries in the main namespace, but may be added to the Appendix: namespace. " ..
"All terms in this language may be available at [[Appendix:" .. ucfirst(canonicalName) .. "]]."
end
local about = new_title("Wiktionary:About " .. canonicalName)
if about.exists then
add = add .. "\n\n" ..
"Please see '''[[Wiktionary:About " .. canonicalName .. "]]''' for information and special considerations for creating " .. nameWithLanguage .. " entries."
end
local ok, tree_of_descendants = pcall(
require("Module:family tree").print_children,
lang:getCode(), {
protolanguage_under_family = true,
must_have_descendants = true
})
if ok then
if tree_of_descendants then
add = add .. NavFrame(
tree_of_descendants,
"Family tree")
else
add = add .. "\n\n" .. ucfirst(lang:getCanonicalName())
.. " has no descendants or varieties listed in Wiktionary's language data modules."
end
else
mw.log("error while generating tree: " .. tostring(tree_of_descendants))
end
return description, topright, add
end
local function get_parents(lang, locations, extinct)
local canonicalName = lang:getCanonicalName()
local sortkey = {sort_base = canonicalName, lang = "mi"}
local ret = {{name = "Reo", sort = sortkey}}
local fam = lang:getFamily()
local famCode = fam and fam:getCode()
-- FIXME: Some of the following categories should be added to this module.
if not fam then
insert(ret, {name = "Category:Unclassified languages", sort = sortkey})
elseif famCode == "qfa-iso" then
insert(ret, {name = "Category:Language isolates", sort = sortkey})
elseif famCode == "qfa-mix" then
insert(ret, {name = "Category:Mixed languages", sort = sortkey})
elseif famCode == "sgn" then
insert(ret, {name = "Category:All sign languages", sort = sortkey})
elseif famCode == "crp" then
insert(ret, {name = "Category:Creole or pidgin languages", sort = sortkey})
for _, anc in ipairs(lang:getAncestors()) do
-- Avoid Haitian Creole being categorised in [[:Category:Haitian Creole-based creole or pidgin languages]], as one of its ancestors is an etymology-only variety of it.
-- Use that ancestor's ancestors instead.
if anc:getFullCode() == lang:getCode() then
for _, anc_extra in ipairs(anc:getAncestors()) do
insert(ret, {name = "Category:" .. ucfirst(anc_extra:getFullName()) .. "-based creole or pidgin languages", sort = sortkey})
end
else
insert(ret, {name = "Category:" .. ucfirst(anc:getFullName()) .. "-based creole or pidgin languages", sort = sortkey})
end
end
elseif famCode == "art" then
if lang:hasType("appendix-constructed") then
insert(ret, {name = "Category:Appendix-only constructed languages", sort = sortkey})
else
insert(ret, {name = "Category:Constructed languages", sort = sortkey})
end
for _, anc in ipairs(lang:getAncestors()) do
if anc:getFullCode() == lang:getCode() then
for _, anc_extra in ipairs(anc:getAncestors()) do
insert(ret, {name = "Category:" .. ucfirst(anc_extra:getFullName()) .. "-based constructed languages", sort = sortkey})
end
else
insert(ret, {name = "Category:" .. ucfirst(anc:getFullName()) .. "-based constructed languages", sort = sortkey})
end
end
else
insert(ret, {name = "Category:" .. fam:getCategoryName(), sort = sortkey})
if lang:hasType("reconstructed") then
insert(ret, {
name = "Category:Reconstructed languages",
sort = {sort_base = canonicalName:gsub("^Proto%-", ""), lang = "en"}
})
end
end
local function add_sc_cat(sc)
insert(ret, {name = "Category:Reo " .. sc:getCategoryName(), sort = sortkey})
end
local function add_Hrkt()
add_sc_cat(Hrkt)
add_sc_cat(Hira)
add_sc_cat(Kana)
end
for _, sc in ipairs(lang:getScripts()) do
if sc:getCode() == "Hrkt" then
add_Hrkt()
else
add_sc_cat(sc)
if sc:getCode() == "Jpan" then
add_sc_cat(Hani)
add_Hrkt()
elseif sc:getCode() == "Kore" then
add_sc_cat(Hang)
add_sc_cat(Hani)
end
end
end
if lang:hasTranslit() then
insert(ret, {name = "Category:Languages with automatic transliteration", sort = sortkey})
end
local function insert_location_language_cat(location)
local cat = "Languages of " .. location
insert(ret, {name = "Category:" .. cat, sort = sortkey})
local auto_cat_args = scrape_category_for_auto_cat_args(cat)
local location_parent = auto_cat_args and auto_cat_args.parent
if location_parent then
local split_parents = require(parse_utilities_module).split_on_comma(location_parent)
for _, parent in ipairs(split_parents) do
parent = parent:match("^(.-):.*$") or parent
insert_location_language_cat(parent)
end
end
end
local saw_location = false
for _, location in ipairs(locations) do
if location ~= "UNKNOWN" then
saw_location = true
insert_location_language_cat(location)
end
end
if extinct then
insert(ret, {name = "Category:All extinct languages", sort = sortkey})
end
if not saw_location and not (lang:hasType("reconstructed") or (fam and fam:getCode() == "art")) then
-- Constructed and reconstructed languages don't need a location specified and often won't have one,
-- so don't put them in this maintenance category.
insert(ret, {name = "Category:Languages not sorted into a location category", sort = sortkey})
end
return ret
end
local function get_children()
local ret = {}
-- FIXME: We should work on the children mechanism so it isn't necessary to manually specify these.
--for _, label in ipairs({"appendices", "entry maintenance", "lemmas", "names", "phrases", "rhymes", "symbols", "templates", "terms by etymology", "terms by usage"}) do
-- insert(ret, {name = label, is_label = true})
--end
--insert(ret, {name = "terms derived from {{{langname}}}", is_label = true, lang = false})
--insert(ret, {name = "{{{langcode}}}:All topics", sort = "all topics"})
--insert(ret, {name = "Varieties of {{{langname}}}"})
--insert(ret, {name = "Requests concerning {{{langname}}}"})
--insert(ret, {name = "Rhymes:{{{langname}}}", description = "Lists of {{{langname}}} words by their rhymes."})
--insert(ret, {name = "User {{{langcode}}}", description = "Wiktionary users categorized by fluency levels in {{{langdisp}}}."})
return ret
end
-- Handle language categories of the form e.g. [[:Category:French language]] and
-- [[:Category:British Sign Language]].
insert(raw_handlers, function(data)
local category = data.category
if not (category:match("[Rr]eo ") or category:match("[Ll]ect$")) then
return nil
end
local lang = m_languages.getByCanonicalName(category)
if not lang then
local langname = category:match("^Reo (.*)")
if langname then
lang = m_languages.getByCanonicalName(langname)
end
if not lang then
return nil
end
end
local args = require("Module:parameters").process(data.args, {
[1] = {list = true},
["setwiki"] = true,
["setwikt"] = true,
["setsister"] = true,
["entryname"] = true,
["extinct"] = {type = "boolean"},
})
-- If called from inside, don't require any arguments, as they can't be known
-- in general and aren't needed just to generate the first parent (used for
-- breadcrumbs).
if #args[1] == 0 and not data.called_from_inside then
-- At least one location must be specified unless the language is constructed (e.g. Esperanto) or reconstructed (e.g. Proto-Indo-European).
local fam = lang:getFamily()
if not (lang:hasType("reconstructed") or (fam and fam:getCode() == "art")) then
error("At least one location (param 1=) must be specified for language '" .. lang:getCanonicalName() .. "' (code '" .. lang:getCode() .. "'). " ..
"Use the value UNKNOWN if the language's location is truly unknown.")
end
end
local description, topright, additional = "", "", ""
-- If called from inside the category tree system, it's called when generating
-- parents or children, and we don't need to generate the description or additional
-- text (which is very expensive in terms of memory because it calls [[Module:family tree]],
-- which calls [[Module:languages/data/all]]).
if not data.called_from_inside then
description, topright, additional = get_description_topright_additional(
lang, args[1], args.extinct, args.setwiki, args.setwikt, args.setsister, args.entryname
)
end
return {
canonical_name = lang:getCategoryName(),
description = description,
lang = lang:getCode(),
topright = topright,
additional = additional,
breadcrumb = lang:getCanonicalName(),
parents = get_parents(lang, args[1], args.extinct),
extra_children = get_children(lang),
umbrella = false,
can_be_empty = true,
}, true
end)
-- Handle categories such as [[:Category:Languages of Indonesia]].
insert(raw_handlers, function(data)
local location = data.category:match("^Languages of (.*)$")
if location then
local args = require("Module:parameters").process(data.args, {
["flagfile"] = true,
["commonscat"] = true,
["wp"] = true,
["basename"] = true,
["parent"] = true,
["locationcat"] = true,
["locationlink"] = true,
})
local topright
local basename = args.basename or location:gsub(", .*", "")
if args.flagfile ~= "-" then
local flagfile_arg = args.flagfile or ("Flag of %s.svg"):format(basename)
local files = require(parse_utilities_module).split_on_comma(flagfile_arg)
local topright_parts = {}
for _, file in ipairs(files) do
local flagfile = "File:" .. file
local flagfile_page = new_title(flagfile)
if flagfile_page and flagfile_page.file.exists then
insert(topright_parts, ("[[%s|right|100px|border]]"):format(flagfile))
elseif args.flagfile then
error(("Explicit flagfile '%s' doesn't exist"):format(flagfile))
end
end
topright = concat(topright_parts)
end
if args.wp then
local wp = require("Module:yesno")(args.wp, "+")
if wp == "+" or wp == true then
wp = data.category
end
if wp then
local wp_topright = ("{{wikipedia|%s}}"):format(wp)
if topright then
topright = topright .. wp_topright
else
topright = wp_topright
end
end
end
if args.commonscat then
local commonscat = require("Module:yesno")(args.commonscat, "+")
if commonscat == "+" or commonscat == true then
commonscat = data.category
end
if commonscat then
local commons_topright = ("{{commonscat|%s}}"):format(commonscat)
if topright then
topright = topright .. commons_topright
else
topright = commons_topright
end
end
end
local bare_location = location:match("^the (.*)$") or location
local location_link = args.locationlink or link_location(location)
local bare_basename = basename:match("^the (.*)$") or basename
local parents = {}
if args.parent then
local explicit_parents = require(parse_utilities_module).split_on_comma(args.parent)
for i, parent in ipairs(explicit_parents) do
local actual_parent, sort_key = parent:match("^(.-):(.*)$")
if actual_parent then
parent = actual_parent
sort_key = sort_key:gsub("%+", bare_location)
else
sort_key = " " .. bare_location
end
insert(parents, {name = "Languages of " .. parent, sort = sort_key})
end
else
insert(parents, {name = "Languages by country", sort = {sort_base = bare_location, lang = "en"}})
end
if args.locationcat then
local explicit_location_cats = require(parse_utilities_module).split_on_comma(args.locationcat)
for i, locationcat in ipairs(explicit_location_cats) do
insert(parents, {name = "Category:" .. locationcat, sort = " Languages"})
end
else
local location_cat = ("Category:%s"):format(bare_location)
local location_page = new_title(location_cat)
if location_page and location_page.exists then
insert(parents, {name = location_cat, sort = "Languages"})
end
end
local description = ("Categories for languages of %s (including sublects)."):format(location_link)
return {
topright = topright,
description = description,
parents = parents,
breadcrumb = bare_basename,
additional = "{{{umbrella_msg}}}",
}, true
end
end)
-- Handle categories such as [[:Category:English-based creole or pidgin languages]].
insert(raw_handlers, function(data)
local langname = data.category:match("(.*)%-based creole or pidgin languages$")
if langname then
local lang = m_languages.getByCanonicalName(langname)
if lang then
return {
lang = lang:getCode(),
description = "Languages which developed as a [[creole]] or [[pidgin]] from " .. lang:makeCategoryLink() .. ".",
parents = {{name = "Creole or pidgin languages", sort = {sort_base = "*" .. langname, lang = "en"}}},
breadcrumb = lang:getCanonicalName() .. "-based",
}
end
end
end)
-- Handle categories such as [[:Category:English-based constructed languages]].
insert(raw_handlers, function(data)
local langname = data.category:match("(.*)%-based constructed languages$")
if langname then
local lang = m_languages.getByCanonicalName(langname)
if lang then
return {
lang = lang:getCode(),
description = "Constructed languages which are based on " .. lang:makeCategoryLink() .. ".",
parents = {{name = "Constructed languages", sort = {sort_base = "*" .. langname, lang = "en"}}},
breadcrumb = lang:getCanonicalName() .. "-based",
}
end
end
end)
return {RAW_CATEGORIES = raw_categories, RAW_HANDLERS = raw_handlers}
cslq4xo9w4lnjx7egeec444bvzdtnbt
17454
17453
2026-07-13T08:54:18Z
Hiyuune
6766
17454
Scribunto
text/plain
local new_title = mw.title.new
local ucfirst = require("Module:string utilities").ucfirst
local split = require("Module:string utilities").split
local raw_categories = {}
local raw_handlers = {}
local m_languages = require("Module:languages")
local m_sc_getByCode = require("Module:scripts").getByCode
local m_table = require("Module:table")
local parse_utilities_module = "Module:parse utilities"
local concat = table.concat
local insert = table.insert
local reverse_ipairs = m_table.reverseIpairs
local serial_comma_join = m_table.serialCommaJoin
local size = m_table.size
local sorted_pairs = m_table.sortedPairs
local to_json = require("Module:JSON").toJSON
local Hang = m_sc_getByCode("Hang")
local Hani = m_sc_getByCode("Hani")
local Hira = m_sc_getByCode("Hira")
local Hrkt = m_sc_getByCode("Hrkt")
local Kana = m_sc_getByCode("Kana")
local function track(page)
-- [[Special:WhatLinksHere/Wiktionary:Tracking/category tree/languages/PAGE]]
return require("Module:debug/track")("category tree/languages/" .. page)
end
-- This handles language categories of the form e.g. [[:Category:French language]] and
-- [[:Category:British Sign Language]]; categories like [[:Category:Languages of Indonesia]]; categories like
-- [[:Category:English-based creole or pidgin languages]]; and categories like
-- [[:Category:English-based constructed languages]].
-----------------------------------------------------------------------------
-- --
-- RAW CATEGORIES --
-- --
-----------------------------------------------------------------------------
raw_categories["Reo"] = {
topright = "{{commonscat|Languages}}\n[[File:Languages world map-transparent background.svg|thumb|right|250px|Rough world map of language families]]",
description = "This category contains the categories for every language on Wiktionary.",
additional = "Not all languages that Wiktionary recognises may have a category here yet. There are many that have " ..
"not yet received any attention from editors, mainly because not all Wiktionary users know about every single " ..
"language. See [[Wiktionary:List of languages]] for a full list.",
parents = {
"Whakaraparapa",
},
}
raw_categories["All extinct languages"] = {
description = "This category contains the categories for every [[extinct language]] on Wiktionary.",
additional = "Do not confuse this category with [[:Category:Extinct languages]], which is an umbrella category for the names of extinct languages in specific other languages (e.g. {{m+|de|Langobardisch}} for the ancient [[Lombardic]] language).",
parents = {
"Reo",
},
}
raw_categories["Languages by country"] = {
topright = "{{commonscat|Languages by continent}}",
description = "Categories that group languages by country.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Reo",
},
}
raw_categories["Language isolates"] = {
topright = "{{wikipedia|Language isolate}}\n{{commonscat|Language isolates}}",
description = "Languages with no known relatives.",
parents = {
{name = "Languages by family", sort = "*Isolates"},
{name = "All language families", sort = "Isolates"},
},
}
raw_categories["Languages not sorted into a location category"] = {
description = "Languages which do not specify (in their {{tl|auto cat}} call) the location(s) where they are spoken.",
additional = "This excludes constructed and reconstructed languages; as a result, all languages in this category explicitly specify their location as {{cd|UNKNOWN}}.",
parents = {
{name = "Requests"},
},
hidden = true,
}
-----------------------------------------------------------------------------
-- --
-- RAW HANDLERS --
-- --
-----------------------------------------------------------------------------
-- Given a category (without the "Category:" prefix), look up the page defining the category, find the call to
-- {{auto cat}} (if any), and return a table of its arguments. If the category page doesn't exist or doesn't have
-- an {{auto cat}} invocation, return nil.
--
-- FIXME: Duplicated in [[Module:category tree/lects]].
local function scrape_category_for_auto_cat_args(cat)
local cat_page = mw.title.new("Category:" .. cat)
if cat_page then
local contents = cat_page:getContent()
if contents then
local frame = mw.getCurrentFrame()
for template in require("Module:template parser").find_templates(contents) do
-- The template parser automatically handles redirects and canonicalizes them, so uses of {{autocat}}
-- will also be found.
if template:get_name() == "auto cat" then
return template:get_arguments()
end
end
end
end
return nil
end
local function link_location(location)
local location_no_the = location:match("^the (.*)$")
local bare_location = location_no_the or location
local location_link
local bare_location_parts = split(bare_location, ", ")
for i, part in ipairs(bare_location_parts) do
bare_location_parts[i] = ("[[%s]]"):format(part)
end
location_link = concat(bare_location_parts, ", ")
if location_no_the then
location_link = "the " .. location_link
end
return location_link
end
local function linkbox(lang, setwiki, setwikt, setsister, entryname)
local wiktionarylinks = {}
local canonicalName = lang:getCanonicalName()
local wikimediaLanguages = lang:getWikimediaLanguages()
local wikipediaArticle = setwiki or lang:getWikipediaArticle()
setsister = setsister and ucfirst(setsister) or nil
if setwikt then
track("setwikt")
if setwikt == "-" then
track("setwikt/hyphen")
end
end
if setwikt ~= "-" and wikimediaLanguages and wikimediaLanguages[1] then
for _, wikimedialang in ipairs(wikimediaLanguages) do
local check = new_title(wikimedialang:getCode() .. ":")
if check and check.isExternal then
insert(wiktionarylinks,
(wikimedialang:getCanonicalName() ~= canonicalName and "(''" .. wikimedialang:getCanonicalName() .. "'') " or "") ..
"'''[[:" .. wikimedialang:getCode() .. ":|" .. wikimedialang:getCode() .. ".wiktionary.org]]'''")
end
end
wiktionarylinks = concat(wiktionarylinks, "<br/>")
end
local wikt_plural = wikimediaLanguages[2] and "s" or ""
if #wiktionarylinks == 0 then
wiktionarylinks = "''None.''"
end
if setsister then
track("setsister")
if setsister == "-" then
track("setsister/hyphen")
else
setsister = "Category:" .. setsister
end
else
setsister = lang:getCommonsCategory() or "-"
end
return concat{
[=[<div class="wikitable" style="float: right; clear: right; margin: 0 0 0.5em 1em; width: 300px; padding: 5px;">
<div style="text-align: center; margin-bottom: 10px; margin-top: 5px">''']=], canonicalName, [=[ language links'''</div>
{| style="font-size: 90%"
|-
| style="vertical-align: top; height: 35px; border-bottom: 1px solid lightgray;" | [[File:Wikipedia-logo.png|35px|none|Wikipedia]]
| style="border-bottom: 1px solid lightgray;" | '''English Wikipedia''' has an article on:
<div style="padding: 5px 10px">]=], (setwiki == "-" and "''None.''" or "'''[[w:" .. wikipediaArticle .. "|" .. wikipediaArticle .. "]]'''"), [=[</div>
|-
| style="vertical-align: top; height: 35px; border-bottom: 1px solid lightgray;" | [[File:Wikimedia-logo.svg|35px|none|Wikimedia Commons]]
| style="border-bottom: 1px solid lightgray;" | '''Wikimedia Commons''' has links to ]=], canonicalName, [=[-related content in sister projects:
<div style="padding: 5px 10px">]=], (setsister == "-" and "''None.''" or "'''[[commons:" .. setsister .. "|" .. setsister .. "]]'''"), [=[</div>
|-
| style="vertical-align: top; height: 35px; width: 40px; border-bottom: 1px solid lightgray;" | [[File:Wiktionary-logo-v2.svg|35px|none|Wiktionary]]
|style="border-bottom: 1px solid lightgray;" | '''Wiktionary edition''']=], wikt_plural, [=[ written in ]=], canonicalName, [=[:
<div style="padding: 5px 10px">]=], wiktionarylinks, [=[</div>
|-
| style="vertical-align: top; height: 35px; border-bottom: 1px solid lightgray;" | [[File:Open book nae 02.svg|35px|none|Entry]]
| style="border-bottom: 1px solid lightgray;" | '''Wiktionary entry''' for the language's English name:
<div style="padding: 5px 10px">''']=], require("Module:links").full_link({lang = m_languages.getByCode("en"), term = entryname or canonicalName}), [=['''</div>
|-
| style="vertical-align: top; height: 35px;" | [[File:Crystal kfind.png|35px|none|Considerations]]
|| '''Wiktionary resources''' for editors contributing to ]=], canonicalName, [=[ entries:
<div style="padding: 5px 0">
* '''[[Wiktionary:]=], canonicalName, [=[ entry guidelines]]'''
* '''[[:Category:]=], canonicalName, [=[ reference templates|Reference templates]] ({{PAGESINCAT:]=], canonicalName, [=[ reference templates}})'''
* '''[[Appendix:]=], canonicalName, [=[ bibliography|Bibliography]]'''
|}
</div>]=]
}
end
local function edit_link(title, text)
return '<span class="plainlinks">['
.. tostring(mw.uri.fullUrl(title, { action = "edit" }))
.. ' ' .. text .. ']</span>'
end
-- Should perhaps use wiki syntax.
local function infobox(lang)
local ret = {}
insert(ret, '<table class="wikitable language-category-info"')
local raw_data = lang:getData("extra")
if raw_data then
local replacements = {
[1] = "canonical-name",
[2] = "wikidata-item",
[3] = "family",
[4] = "scripts",
}
local function replacer(letter1, letter2)
return letter1:lower() .. "-" .. letter2:lower()
end
-- For each key in the language data modules, returns a descriptive
-- kebab-case version (containing ASCII lowercase words separated
-- by hyphens).
local function kebab_case(key)
key = replacements[key] or key
key = key:gsub("(%l)(%u)", replacer):gsub("(%l)_(%l)", replacer)
return key
end
local compress = {compress = true}
local function html_attribute_encode(str)
str = to_json(str, compress)
:gsub('"', """)
-- & in attributes is automatically escaped.
-- :gsub("&", "&")
:gsub("<", "<")
:gsub(">", ">")
return str
end
insert(ret, ' data-code="' .. lang:getCode() .. '"')
for k, v in sorted_pairs(raw_data) do
insert(ret, " data-" .. kebab_case(k)
.. '="'
.. html_attribute_encode(v)
.. '"')
end
end
insert(ret, '>\n')
insert(ret, '<tr class="language-category-data">\n<th colspan="2">'
.. edit_link(lang:getDataModuleName(), "Edit language data")
.. "</th>\n</tr>\n")
insert(ret, "<tr>\n<th>Canonical name</th><td>" .. lang:getCanonicalName() .. "</td>\n</tr>\n")
local otherNames = lang:getOtherNames()
if otherNames then
local names = {}
for _, name in ipairs(otherNames) do
insert(names, "<li>" .. name .. "</li>")
end
if #names > 0 then
insert(ret, "<tr>\n<th>Other names</th><td><ul>" .. concat(names, "\n") .. "</ul></td>\n</tr>\n")
end
end
local aliases = lang:getAliases()
if aliases then
local names = {}
for _, name in ipairs(aliases) do
insert(names, "<li>" .. name .. "</li>")
end
if #names > 0 then
insert(ret, "<tr>\n<th>Aliases</th><td><ul>" .. concat(names, "\n") .. "</ul></td>\n</tr>\n")
end
end
local varieties = lang:getVarieties()
if varieties then
local names = {}
for _, name in ipairs(varieties) do
if type(name) == "string" then
insert(names, "<li>" .. name .. "</li>")
else
assert(type(name) == "table")
local first_var
local subvars = {}
for i, var in ipairs(name) do
if i == 1 then
first_var = var
else
insert(subvars, "<li>" .. var .. "</li>")
end
end
if #subvars > 0 then
insert(names, "<li><dl><dt>" .. first_var .. "</dt>\n<dd><ul>" .. concat(subvars, "\n") .. "</ul></dd></dl></li>")
elseif first_var then
insert(names, "<li>" .. first_var .. "</li>")
end
end
end
if #names > 0 then
insert(ret, "<tr>\n<th>Varieties</th><td><ul>" .. concat(names, "\n") .. "</ul></td>\n</tr>\n")
end
end
insert(ret, "<tr>\n<th>[[Wiktionary:Languages|Language code]]</th><td><code>" .. lang:getCode() .. "</code></td>\n</tr>\n")
insert(ret, "<tr>\n<th>[[Wiktionary:Families|Language family]]</th>\n")
local fam = lang:getFamily()
local famCode = fam and fam:getCode()
if not fam then
insert(ret, "<td>unclassified</td>")
elseif famCode == "qfa-iso" then
insert(ret, "<td>[[:Category:Language isolates|language isolate]]</td>")
elseif famCode == "qfa-mix" then
insert(ret, "<td>[[:Category:Mixed languages|mixed language]]</td>")
elseif famCode == "sgn" then
insert(ret, "<td>[[:Category:Sign languages|sign language]]</td>")
elseif famCode == "crp" then
insert(ret, "<td>[[:Category:Creole or pidgin languages|creole or pidgin]]</td>")
elseif famCode == "art" then
insert(ret, "<td>[[:Category:Constructed languages|constructed language]]</td>")
else
insert(ret, "<td>" .. fam:makeCategoryLink() .. "</td>")
end
insert(ret, "\n</tr>\n<tr>\n<th>Ancestors</th>\n<td>")
local ancestors = lang:getAncestors()
if ancestors[2] then
local ancestorList = {}
for i, anc in ipairs(ancestors) do
ancestorList[i] = "<li>" .. anc:makeCategoryLink() .. "</li>"
end
insert(ret, "<ul>\n" .. concat(ancestorList, "\n") .. "</ul>")
else
local ancestorChain = lang:getAncestorChainOld()
if ancestorChain[1] then
local chain = {}
for _, anc in reverse_ipairs(ancestorChain) do
insert(chain, "<li>" .. anc:makeCategoryLink() .. "</li>")
end
insert(ret, "<ul>\n" .. concat(chain, "\n<ul>\n") .. ("</ul>"):rep(#chain))
else
insert(ret, "unknown")
end
end
insert(ret, "</td>\n</tr>\n")
local scripts = lang:getScripts()
if scripts[1] then
local script_text = {}
local function makeScriptLine(sc)
local code = sc:getCode()
local url = tostring(mw.uri.fullUrl('Special:Search', {
search = 'contentmodel:css insource:"' .. code
.. '" insource:/\\.' .. code .. '/',
ns8 = '1'
}))
return sc:makeCategoryLink()
.. ' (<span class="plainlinks" title="Search for stylesheets referencing this script">[' .. url .. ' <code>' .. code .. '</code>]</span>)'
end
local function add_Hrkt(text)
insert(text, "<li>" .. makeScriptLine(Hrkt))
insert(text, "<ul>")
insert(text, "<li>" .. makeScriptLine(Hira) .. "</li>")
insert(text, "<li>" .. makeScriptLine(Kana) .. "</li>")
insert(text, "</ul>")
insert(text, "</li>")
end
for _, sc in ipairs(scripts) do
local text = {}
local code = sc:getCode()
if code == "Hrkt" then
add_Hrkt(text)
else
insert(text, "<li>" .. makeScriptLine(sc))
if code == "Jpan" then
insert(text, "<ul>")
insert(text, "<li>" .. makeScriptLine(Hani) .. "</li>")
add_Hrkt(text)
insert(text, "</ul>")
elseif code == "Kore" then
insert(text, "<ul>")
insert(text, "<li>" .. makeScriptLine(Hang) .. "</li>")
insert(text, "<li>" .. makeScriptLine(Hani) .. "</li>")
insert(text, "</ul>")
end
insert(text, "</li>")
end
insert(script_text, concat(text, "\n"))
end
insert(ret, "<tr>\n<th>[[Wiktionary:Scripts|Scripts]]</th>\n<td><ul>\n" .. concat(script_text, "\n") .. "</ul></td>\n</tr>\n")
else
insert(ret, "<tr>\n<th>[[Wiktionary:Scripts|Scripts]]</th>\n<td>not specified</td>\n</tr>\n")
end
local function add_module_info(raw_data, heading)
if raw_data then
local scripts = lang:getScriptCodes()
local module_info, add = {}, false
if type(raw_data) == "string" then
insert(module_info,
("[[Module:%s]]"):format(raw_data))
add = true
else
local raw_data_type = type(raw_data)
if raw_data_type == "table" and size(scripts) == 1 and type(raw_data[scripts[1]]) == "string" then
insert(module_info,
("[[Module:%s]]"):format(raw_data[scripts[1]]))
add = true
elseif raw_data_type == "table" then
insert(module_info, "<ul>")
for script, data in sorted_pairs(raw_data) do
if type(data) == "string" and m_sc_getByCode(script) then
insert(module_info, ("<li><code>%s</code>: [[Module:%s]]</li>"):format(script, data))
end
end
insert(module_info, "</ul>")
add = size(module_info) > 2
end
end
if add then
insert(ret, [=[
<tr>
<th>]=] .. heading .. [=[</th>
<td>]=] .. concat(module_info) .. [=[</td>
</tr>
]=])
end
end
end
add_module_info(raw_data.generate_forms, "Form-generating<br>module")
add_module_info(raw_data.translit, "[[Wiktionary:Transliteration and romanization|Transliteration<br>module]]")
add_module_info(raw_data.display_text, "Display text<br>module")
add_module_info(raw_data.entry_name, "Entry name<br>module")
add_module_info(raw_data.sort_key, "[[sortkey|Sortkey]]<br>module")
local wikidataItem = lang:getWikidataItem()
if lang:getWikidataItem() and mw.wikibase then
local URL = mw.wikibase.getEntityUrl(wikidataItem)
local link
if URL then
link = '[' .. URL .. ' ' .. wikidataItem .. ']'
else
link = '<span class="error">Invalid Wikidata item: <code>' .. wikidataItem .. '</code></span>'
end
insert(ret, "<tr><th>Wikidata</th><td>" .. link .. "</td></tr>")
end
insert(ret, "</table>")
return concat(ret)
end
local function NavFrame(content, title)
return '<div class="NavFrame"><div class="NavHead">'
.. (title or '{{{title}}}') .. '</div>'
.. '<div class="NavContent" style="text-align: left;">'
.. content
.. '</div></div>'
end
local function get_description_topright_additional(lang, locations, extinct, setwiki, setwikt, setsister, entryname)
local nameWithLanguage = lang:getCategoryName("nocap")
if lang:getCode() == "und" then
local description =
"This is the main category of the '''" .. nameWithLanguage .. "''', represented in Wiktionary by the [[Wiktionary:Languages|code]] '''" .. lang:getCode() .. "'''. " ..
"This language contains terms in historical writing, whose meaning has not yet been determined by scholars."
return description, nil, nil
end
local canonicalName = lang:getCanonicalName()
local topright = linkbox(lang, setwiki, setwikt, setsister, entryname)
local the_prefix
if canonicalName:find(" Language$") then
the_prefix = ""
else
the_prefix = "the "
end
local description = "This is the main category of " .. the_prefix .. "'''" .. nameWithLanguage .. "'''."
local location_links = {}
local prep
local saw_embedded_comma = false
for _, location in ipairs(locations) do
local this_prep
if location == "the world" then
this_prep = "across"
insert(location_links, location)
elseif location ~= "UNKNOWN" then
this_prep = "in"
if location:find(",") then
saw_embedded_comma = true
end
insert(location_links, link_location(location))
end
if this_prep then
if prep and this_prep ~= prep then
error("Can't handle location 'the world' along with another location (clashing prepositions)")
end
prep = this_prep
end
end
local location_desc
if #location_links > 0 then
local location_link_text
if saw_embedded_comma and #location_links >= 3 then
location_link_text = mw.text.listToText(location_links, "; ", "; and ")
else
location_link_text = serial_comma_join(location_links)
end
location_desc = ("It is %s %s %s.\n\n"):format(
extinct and "an [[extinct language]] that was formerly spoken" or "spoken", prep, location_link_text)
elseif extinct then
location_desc = "It is an [[extinct language]].\n\n"
else
location_desc = ""
end
local add = location_desc .. "Information about " .. canonicalName .. ":\n\n" .. infobox(lang)
if lang:hasType("reconstructed") then
add = add .. "\n\n" ..
ucfirst(canonicalName) .. " is a reconstructed language. Its words and roots are not directly attested in any written works, but have been reconstructed through the ''comparative method'', " ..
"which finds regular similarities between languages that cannot be explained by coincidence or word-borrowing, and extrapolates ancient forms from these similarities.\n\n" ..
"According to our [[Wiktionary:Criteria for inclusion|criteria for inclusion]], terms in " .. canonicalName ..
" should '''not''' be present in entries in the main namespace, but may be added to the Reconstruction: namespace."
elseif lang:hasType("appendix-constructed") then
add = add .. "\n\n" ..
ucfirst(canonicalName) .. " is a constructed language that is only in sporadic use. " ..
"According to our [[Wiktionary:Criteria for inclusion|criteria for inclusion]], terms in " .. canonicalName ..
" should '''not''' be present in entries in the main namespace, but may be added to the Appendix: namespace. " ..
"All terms in this language may be available at [[Appendix:" .. ucfirst(canonicalName) .. "]]."
end
local about = new_title("Wiktionary:About " .. canonicalName)
if about.exists then
add = add .. "\n\n" ..
"Please see '''[[Wiktionary:About " .. canonicalName .. "]]''' for information and special considerations for creating " .. nameWithLanguage .. " entries."
end
local ok, tree_of_descendants = pcall(
require("Module:family tree").print_children,
lang:getCode(), {
protolanguage_under_family = true,
must_have_descendants = true
})
if ok then
if tree_of_descendants then
add = add .. NavFrame(
tree_of_descendants,
"Family tree")
else
add = add .. "\n\n" .. ucfirst(lang:getCanonicalName())
.. " has no descendants or varieties listed in Wiktionary's language data modules."
end
else
mw.log("error while generating tree: " .. tostring(tree_of_descendants))
end
return description, topright, add
end
local function get_parents(lang, locations, extinct)
local canonicalName = lang:getCanonicalName()
local sortkey = {sort_base = canonicalName, lang = "mi"}
local ret = {{name = "Reo", sort = sortkey}}
local fam = lang:getFamily()
local famCode = fam and fam:getCode()
-- FIXME: Some of the following categories should be added to this module.
if not fam then
insert(ret, {name = "Category:Unclassified languages", sort = sortkey})
elseif famCode == "qfa-iso" then
insert(ret, {name = "Category:Language isolates", sort = sortkey})
elseif famCode == "qfa-mix" then
insert(ret, {name = "Category:Mixed languages", sort = sortkey})
elseif famCode == "sgn" then
insert(ret, {name = "Category:All sign languages", sort = sortkey})
elseif famCode == "crp" then
insert(ret, {name = "Category:Creole or pidgin languages", sort = sortkey})
for _, anc in ipairs(lang:getAncestors()) do
-- Avoid Haitian Creole being categorised in [[:Category:Haitian Creole-based creole or pidgin languages]], as one of its ancestors is an etymology-only variety of it.
-- Use that ancestor's ancestors instead.
if anc:getFullCode() == lang:getCode() then
for _, anc_extra in ipairs(anc:getAncestors()) do
insert(ret, {name = "Category:" .. ucfirst(anc_extra:getFullName()) .. "-based creole or pidgin languages", sort = sortkey})
end
else
insert(ret, {name = "Category:" .. ucfirst(anc:getFullName()) .. "-based creole or pidgin languages", sort = sortkey})
end
end
elseif famCode == "art" then
if lang:hasType("appendix-constructed") then
insert(ret, {name = "Category:Appendix-only constructed languages", sort = sortkey})
else
insert(ret, {name = "Category:Constructed languages", sort = sortkey})
end
for _, anc in ipairs(lang:getAncestors()) do
if anc:getFullCode() == lang:getCode() then
for _, anc_extra in ipairs(anc:getAncestors()) do
insert(ret, {name = "Category:" .. ucfirst(anc_extra:getFullName()) .. "-based constructed languages", sort = sortkey})
end
else
insert(ret, {name = "Category:" .. ucfirst(anc:getFullName()) .. "-based constructed languages", sort = sortkey})
end
end
else
insert(ret, {name = "Category:" .. fam:getCategoryName(), sort = sortkey})
if lang:hasType("reconstructed") then
insert(ret, {
name = "Category:Reconstructed languages",
sort = {sort_base = canonicalName:gsub("^Proto%-", ""), lang = "en"}
})
end
end
local function add_sc_cat(sc)
insert(ret, {name = "Category:Reo " .. sc:getCategoryName(), sort = sortkey})
end
local function add_Hrkt()
add_sc_cat(Hrkt)
add_sc_cat(Hira)
add_sc_cat(Kana)
end
for _, sc in ipairs(lang:getScripts()) do
if sc:getCode() == "Hrkt" then
add_Hrkt()
else
add_sc_cat(sc)
if sc:getCode() == "Jpan" then
add_sc_cat(Hani)
add_Hrkt()
elseif sc:getCode() == "Kore" then
add_sc_cat(Hang)
add_sc_cat(Hani)
end
end
end
if lang:hasTranslit() then
insert(ret, {name = "Category:Languages with automatic transliteration", sort = sortkey})
end
local function insert_location_language_cat(location)
local cat = "Languages of " .. location
insert(ret, {name = "Category:" .. cat, sort = sortkey})
local auto_cat_args = scrape_category_for_auto_cat_args(cat)
local location_parent = auto_cat_args and auto_cat_args.parent
if location_parent then
local split_parents = require(parse_utilities_module).split_on_comma(location_parent)
for _, parent in ipairs(split_parents) do
parent = parent:match("^(.-):.*$") or parent
insert_location_language_cat(parent)
end
end
end
local saw_location = false
for _, location in ipairs(locations) do
if location ~= "UNKNOWN" then
saw_location = true
insert_location_language_cat(location)
end
end
if extinct then
insert(ret, {name = "Category:All extinct languages", sort = sortkey})
end
if not saw_location and not (lang:hasType("reconstructed") or (fam and fam:getCode() == "art")) then
-- Constructed and reconstructed languages don't need a location specified and often won't have one,
-- so don't put them in this maintenance category.
insert(ret, {name = "Category:Languages not sorted into a location category", sort = sortkey})
end
return ret
end
local function get_children()
local ret = {}
-- FIXME: We should work on the children mechanism so it isn't necessary to manually specify these.
--for _, label in ipairs({"appendices", "entry maintenance", "lemmas", "names", "phrases", "rhymes", "symbols", "templates", "terms by etymology", "terms by usage"}) do
-- insert(ret, {name = label, is_label = true})
--end
--insert(ret, {name = "terms derived from {{{langname}}}", is_label = true, lang = false})
--insert(ret, {name = "{{{langcode}}}:All topics", sort = "all topics"})
--insert(ret, {name = "Varieties of {{{langname}}}"})
--insert(ret, {name = "Requests concerning {{{langname}}}"})
--insert(ret, {name = "Rhymes:{{{langname}}}", description = "Lists of {{{langname}}} words by their rhymes."})
--insert(ret, {name = "User {{{langcode}}}", description = "Wiktionary users categorized by fluency levels in {{{langdisp}}}."})
return ret
end
-- Handle language categories of the form e.g. [[:Category:French language]] and
-- [[:Category:British Sign Language]].
insert(raw_handlers, function(data)
local category = data.category
if not (category:match("[Rr]eo") or category:match("[Ll]ect$")) then
return nil
end
local lang = m_languages.getByCanonicalName(category)
if not lang then
local langname = category:match("Reo (.*)")
if langname then
lang = m_languages.getByCanonicalName(langname)
end
if not lang then
return nil
end
end
local args = require("Module:parameters").process(data.args, {
[1] = {list = true},
["setwiki"] = true,
["setwikt"] = true,
["setsister"] = true,
["entryname"] = true,
["extinct"] = {type = "boolean"},
})
-- If called from inside, don't require any arguments, as they can't be known
-- in general and aren't needed just to generate the first parent (used for
-- breadcrumbs).
if #args[1] == 0 and not data.called_from_inside then
-- At least one location must be specified unless the language is constructed (e.g. Esperanto) or reconstructed (e.g. Proto-Indo-European).
local fam = lang:getFamily()
if not (lang:hasType("reconstructed") or (fam and fam:getCode() == "art")) then
error("At least one location (param 1=) must be specified for language '" .. lang:getCanonicalName() .. "' (code '" .. lang:getCode() .. "'). " ..
"Use the value UNKNOWN if the language's location is truly unknown.")
end
end
local description, topright, additional = "", "", ""
-- If called from inside the category tree system, it's called when generating
-- parents or children, and we don't need to generate the description or additional
-- text (which is very expensive in terms of memory because it calls [[Module:family tree]],
-- which calls [[Module:languages/data/all]]).
if not data.called_from_inside then
description, topright, additional = get_description_topright_additional(
lang, args[1], args.extinct, args.setwiki, args.setwikt, args.setsister, args.entryname
)
end
return {
canonical_name = lang:getCategoryName(),
description = description,
lang = lang:getCode(),
topright = topright,
additional = additional,
breadcrumb = lang:getCanonicalName(),
parents = get_parents(lang, args[1], args.extinct),
extra_children = get_children(lang),
umbrella = false,
can_be_empty = true,
}, true
end)
-- Handle categories such as [[:Category:Languages of Indonesia]].
insert(raw_handlers, function(data)
local location = data.category:match("^Languages of (.*)$")
if location then
local args = require("Module:parameters").process(data.args, {
["flagfile"] = true,
["commonscat"] = true,
["wp"] = true,
["basename"] = true,
["parent"] = true,
["locationcat"] = true,
["locationlink"] = true,
})
local topright
local basename = args.basename or location:gsub(", .*", "")
if args.flagfile ~= "-" then
local flagfile_arg = args.flagfile or ("Flag of %s.svg"):format(basename)
local files = require(parse_utilities_module).split_on_comma(flagfile_arg)
local topright_parts = {}
for _, file in ipairs(files) do
local flagfile = "File:" .. file
local flagfile_page = new_title(flagfile)
if flagfile_page and flagfile_page.file.exists then
insert(topright_parts, ("[[%s|right|100px|border]]"):format(flagfile))
elseif args.flagfile then
error(("Explicit flagfile '%s' doesn't exist"):format(flagfile))
end
end
topright = concat(topright_parts)
end
if args.wp then
local wp = require("Module:yesno")(args.wp, "+")
if wp == "+" or wp == true then
wp = data.category
end
if wp then
local wp_topright = ("{{wikipedia|%s}}"):format(wp)
if topright then
topright = topright .. wp_topright
else
topright = wp_topright
end
end
end
if args.commonscat then
local commonscat = require("Module:yesno")(args.commonscat, "+")
if commonscat == "+" or commonscat == true then
commonscat = data.category
end
if commonscat then
local commons_topright = ("{{commonscat|%s}}"):format(commonscat)
if topright then
topright = topright .. commons_topright
else
topright = commons_topright
end
end
end
local bare_location = location:match("^the (.*)$") or location
local location_link = args.locationlink or link_location(location)
local bare_basename = basename:match("^the (.*)$") or basename
local parents = {}
if args.parent then
local explicit_parents = require(parse_utilities_module).split_on_comma(args.parent)
for i, parent in ipairs(explicit_parents) do
local actual_parent, sort_key = parent:match("^(.-):(.*)$")
if actual_parent then
parent = actual_parent
sort_key = sort_key:gsub("%+", bare_location)
else
sort_key = " " .. bare_location
end
insert(parents, {name = "Languages of " .. parent, sort = sort_key})
end
else
insert(parents, {name = "Languages by country", sort = {sort_base = bare_location, lang = "en"}})
end
if args.locationcat then
local explicit_location_cats = require(parse_utilities_module).split_on_comma(args.locationcat)
for i, locationcat in ipairs(explicit_location_cats) do
insert(parents, {name = "Category:" .. locationcat, sort = " Languages"})
end
else
local location_cat = ("Category:%s"):format(bare_location)
local location_page = new_title(location_cat)
if location_page and location_page.exists then
insert(parents, {name = location_cat, sort = "Languages"})
end
end
local description = ("Categories for languages of %s (including sublects)."):format(location_link)
return {
topright = topright,
description = description,
parents = parents,
breadcrumb = bare_basename,
additional = "{{{umbrella_msg}}}",
}, true
end
end)
-- Handle categories such as [[:Category:English-based creole or pidgin languages]].
insert(raw_handlers, function(data)
local langname = data.category:match("(.*)%-based creole or pidgin languages$")
if langname then
local lang = m_languages.getByCanonicalName(langname)
if lang then
return {
lang = lang:getCode(),
description = "Languages which developed as a [[creole]] or [[pidgin]] from " .. lang:makeCategoryLink() .. ".",
parents = {{name = "Creole or pidgin languages", sort = {sort_base = "*" .. langname, lang = "en"}}},
breadcrumb = lang:getCanonicalName() .. "-based",
}
end
end
end)
-- Handle categories such as [[:Category:English-based constructed languages]].
insert(raw_handlers, function(data)
local langname = data.category:match("(.*)%-based constructed languages$")
if langname then
local lang = m_languages.getByCanonicalName(langname)
if lang then
return {
lang = lang:getCode(),
description = "Constructed languages which are based on " .. lang:makeCategoryLink() .. ".",
parents = {{name = "Constructed languages", sort = {sort_base = "*" .. langname, lang = "en"}}},
breadcrumb = lang:getCanonicalName() .. "-based",
}
end
end
end)
return {RAW_CATEGORIES = raw_categories, RAW_HANDLERS = raw_handlers}
nofxb9nojorf7mbqt89c9jj568kfqtb
17455
17454
2026-07-13T08:54:42Z
Hiyuune
6766
17455
Scribunto
text/plain
local new_title = mw.title.new
local ucfirst = require("Module:string utilities").ucfirst
local split = require("Module:string utilities").split
local raw_categories = {}
local raw_handlers = {}
local m_languages = require("Module:languages")
local m_sc_getByCode = require("Module:scripts").getByCode
local m_table = require("Module:table")
local parse_utilities_module = "Module:parse utilities"
local concat = table.concat
local insert = table.insert
local reverse_ipairs = m_table.reverseIpairs
local serial_comma_join = m_table.serialCommaJoin
local size = m_table.size
local sorted_pairs = m_table.sortedPairs
local to_json = require("Module:JSON").toJSON
local Hang = m_sc_getByCode("Hang")
local Hani = m_sc_getByCode("Hani")
local Hira = m_sc_getByCode("Hira")
local Hrkt = m_sc_getByCode("Hrkt")
local Kana = m_sc_getByCode("Kana")
local function track(page)
-- [[Special:WhatLinksHere/Wiktionary:Tracking/category tree/languages/PAGE]]
return require("Module:debug/track")("category tree/languages/" .. page)
end
-- This handles language categories of the form e.g. [[:Category:French language]] and
-- [[:Category:British Sign Language]]; categories like [[:Category:Languages of Indonesia]]; categories like
-- [[:Category:English-based creole or pidgin languages]]; and categories like
-- [[:Category:English-based constructed languages]].
-----------------------------------------------------------------------------
-- --
-- RAW CATEGORIES --
-- --
-----------------------------------------------------------------------------
raw_categories["Reo"] = {
topright = "{{commonscat|Languages}}\n[[File:Languages world map-transparent background.svg|thumb|right|250px|Rough world map of language families]]",
description = "This category contains the categories for every language on Wiktionary.",
additional = "Not all languages that Wiktionary recognises may have a category here yet. There are many that have " ..
"not yet received any attention from editors, mainly because not all Wiktionary users know about every single " ..
"language. See [[Wiktionary:List of languages]] for a full list.",
parents = {
"Whakaraparapa",
},
}
raw_categories["All extinct languages"] = {
description = "This category contains the categories for every [[extinct language]] on Wiktionary.",
additional = "Do not confuse this category with [[:Category:Extinct languages]], which is an umbrella category for the names of extinct languages in specific other languages (e.g. {{m+|de|Langobardisch}} for the ancient [[Lombardic]] language).",
parents = {
"Reo",
},
}
raw_categories["Languages by country"] = {
topright = "{{commonscat|Languages by continent}}",
description = "Categories that group languages by country.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Reo",
},
}
raw_categories["Language isolates"] = {
topright = "{{wikipedia|Language isolate}}\n{{commonscat|Language isolates}}",
description = "Languages with no known relatives.",
parents = {
{name = "Languages by family", sort = "*Isolates"},
{name = "All language families", sort = "Isolates"},
},
}
raw_categories["Languages not sorted into a location category"] = {
description = "Languages which do not specify (in their {{tl|auto cat}} call) the location(s) where they are spoken.",
additional = "This excludes constructed and reconstructed languages; as a result, all languages in this category explicitly specify their location as {{cd|UNKNOWN}}.",
parents = {
{name = "Requests"},
},
hidden = true,
}
-----------------------------------------------------------------------------
-- --
-- RAW HANDLERS --
-- --
-----------------------------------------------------------------------------
-- Given a category (without the "Category:" prefix), look up the page defining the category, find the call to
-- {{auto cat}} (if any), and return a table of its arguments. If the category page doesn't exist or doesn't have
-- an {{auto cat}} invocation, return nil.
--
-- FIXME: Duplicated in [[Module:category tree/lects]].
local function scrape_category_for_auto_cat_args(cat)
local cat_page = mw.title.new("Category:" .. cat)
if cat_page then
local contents = cat_page:getContent()
if contents then
local frame = mw.getCurrentFrame()
for template in require("Module:template parser").find_templates(contents) do
-- The template parser automatically handles redirects and canonicalizes them, so uses of {{autocat}}
-- will also be found.
if template:get_name() == "auto cat" then
return template:get_arguments()
end
end
end
end
return nil
end
local function link_location(location)
local location_no_the = location:match("^the (.*)$")
local bare_location = location_no_the or location
local location_link
local bare_location_parts = split(bare_location, ", ")
for i, part in ipairs(bare_location_parts) do
bare_location_parts[i] = ("[[%s]]"):format(part)
end
location_link = concat(bare_location_parts, ", ")
if location_no_the then
location_link = "the " .. location_link
end
return location_link
end
local function linkbox(lang, setwiki, setwikt, setsister, entryname)
local wiktionarylinks = {}
local canonicalName = lang:getCanonicalName()
local wikimediaLanguages = lang:getWikimediaLanguages()
local wikipediaArticle = setwiki or lang:getWikipediaArticle()
setsister = setsister and ucfirst(setsister) or nil
if setwikt then
track("setwikt")
if setwikt == "-" then
track("setwikt/hyphen")
end
end
if setwikt ~= "-" and wikimediaLanguages and wikimediaLanguages[1] then
for _, wikimedialang in ipairs(wikimediaLanguages) do
local check = new_title(wikimedialang:getCode() .. ":")
if check and check.isExternal then
insert(wiktionarylinks,
(wikimedialang:getCanonicalName() ~= canonicalName and "(''" .. wikimedialang:getCanonicalName() .. "'') " or "") ..
"'''[[:" .. wikimedialang:getCode() .. ":|" .. wikimedialang:getCode() .. ".wiktionary.org]]'''")
end
end
wiktionarylinks = concat(wiktionarylinks, "<br/>")
end
local wikt_plural = wikimediaLanguages[2] and "s" or ""
if #wiktionarylinks == 0 then
wiktionarylinks = "''None.''"
end
if setsister then
track("setsister")
if setsister == "-" then
track("setsister/hyphen")
else
setsister = "Category:" .. setsister
end
else
setsister = lang:getCommonsCategory() or "-"
end
return concat{
[=[<div class="wikitable" style="float: right; clear: right; margin: 0 0 0.5em 1em; width: 300px; padding: 5px;">
<div style="text-align: center; margin-bottom: 10px; margin-top: 5px">''']=], canonicalName, [=[ language links'''</div>
{| style="font-size: 90%"
|-
| style="vertical-align: top; height: 35px; border-bottom: 1px solid lightgray;" | [[File:Wikipedia-logo.png|35px|none|Wikipedia]]
| style="border-bottom: 1px solid lightgray;" | '''English Wikipedia''' has an article on:
<div style="padding: 5px 10px">]=], (setwiki == "-" and "''None.''" or "'''[[w:" .. wikipediaArticle .. "|" .. wikipediaArticle .. "]]'''"), [=[</div>
|-
| style="vertical-align: top; height: 35px; border-bottom: 1px solid lightgray;" | [[File:Wikimedia-logo.svg|35px|none|Wikimedia Commons]]
| style="border-bottom: 1px solid lightgray;" | '''Wikimedia Commons''' has links to ]=], canonicalName, [=[-related content in sister projects:
<div style="padding: 5px 10px">]=], (setsister == "-" and "''None.''" or "'''[[commons:" .. setsister .. "|" .. setsister .. "]]'''"), [=[</div>
|-
| style="vertical-align: top; height: 35px; width: 40px; border-bottom: 1px solid lightgray;" | [[File:Wiktionary-logo-v2.svg|35px|none|Wiktionary]]
|style="border-bottom: 1px solid lightgray;" | '''Wiktionary edition''']=], wikt_plural, [=[ written in ]=], canonicalName, [=[:
<div style="padding: 5px 10px">]=], wiktionarylinks, [=[</div>
|-
| style="vertical-align: top; height: 35px; border-bottom: 1px solid lightgray;" | [[File:Open book nae 02.svg|35px|none|Entry]]
| style="border-bottom: 1px solid lightgray;" | '''Wiktionary entry''' for the language's English name:
<div style="padding: 5px 10px">''']=], require("Module:links").full_link({lang = m_languages.getByCode("en"), term = entryname or canonicalName}), [=['''</div>
|-
| style="vertical-align: top; height: 35px;" | [[File:Crystal kfind.png|35px|none|Considerations]]
|| '''Wiktionary resources''' for editors contributing to ]=], canonicalName, [=[ entries:
<div style="padding: 5px 0">
* '''[[Wiktionary:]=], canonicalName, [=[ entry guidelines]]'''
* '''[[:Category:]=], canonicalName, [=[ reference templates|Reference templates]] ({{PAGESINCAT:]=], canonicalName, [=[ reference templates}})'''
* '''[[Appendix:]=], canonicalName, [=[ bibliography|Bibliography]]'''
|}
</div>]=]
}
end
local function edit_link(title, text)
return '<span class="plainlinks">['
.. tostring(mw.uri.fullUrl(title, { action = "edit" }))
.. ' ' .. text .. ']</span>'
end
-- Should perhaps use wiki syntax.
local function infobox(lang)
local ret = {}
insert(ret, '<table class="wikitable language-category-info"')
local raw_data = lang:getData("extra")
if raw_data then
local replacements = {
[1] = "canonical-name",
[2] = "wikidata-item",
[3] = "family",
[4] = "scripts",
}
local function replacer(letter1, letter2)
return letter1:lower() .. "-" .. letter2:lower()
end
-- For each key in the language data modules, returns a descriptive
-- kebab-case version (containing ASCII lowercase words separated
-- by hyphens).
local function kebab_case(key)
key = replacements[key] or key
key = key:gsub("(%l)(%u)", replacer):gsub("(%l)_(%l)", replacer)
return key
end
local compress = {compress = true}
local function html_attribute_encode(str)
str = to_json(str, compress)
:gsub('"', """)
-- & in attributes is automatically escaped.
-- :gsub("&", "&")
:gsub("<", "<")
:gsub(">", ">")
return str
end
insert(ret, ' data-code="' .. lang:getCode() .. '"')
for k, v in sorted_pairs(raw_data) do
insert(ret, " data-" .. kebab_case(k)
.. '="'
.. html_attribute_encode(v)
.. '"')
end
end
insert(ret, '>\n')
insert(ret, '<tr class="language-category-data">\n<th colspan="2">'
.. edit_link(lang:getDataModuleName(), "Edit language data")
.. "</th>\n</tr>\n")
insert(ret, "<tr>\n<th>Canonical name</th><td>" .. lang:getCanonicalName() .. "</td>\n</tr>\n")
local otherNames = lang:getOtherNames()
if otherNames then
local names = {}
for _, name in ipairs(otherNames) do
insert(names, "<li>" .. name .. "</li>")
end
if #names > 0 then
insert(ret, "<tr>\n<th>Other names</th><td><ul>" .. concat(names, "\n") .. "</ul></td>\n</tr>\n")
end
end
local aliases = lang:getAliases()
if aliases then
local names = {}
for _, name in ipairs(aliases) do
insert(names, "<li>" .. name .. "</li>")
end
if #names > 0 then
insert(ret, "<tr>\n<th>Aliases</th><td><ul>" .. concat(names, "\n") .. "</ul></td>\n</tr>\n")
end
end
local varieties = lang:getVarieties()
if varieties then
local names = {}
for _, name in ipairs(varieties) do
if type(name) == "string" then
insert(names, "<li>" .. name .. "</li>")
else
assert(type(name) == "table")
local first_var
local subvars = {}
for i, var in ipairs(name) do
if i == 1 then
first_var = var
else
insert(subvars, "<li>" .. var .. "</li>")
end
end
if #subvars > 0 then
insert(names, "<li><dl><dt>" .. first_var .. "</dt>\n<dd><ul>" .. concat(subvars, "\n") .. "</ul></dd></dl></li>")
elseif first_var then
insert(names, "<li>" .. first_var .. "</li>")
end
end
end
if #names > 0 then
insert(ret, "<tr>\n<th>Varieties</th><td><ul>" .. concat(names, "\n") .. "</ul></td>\n</tr>\n")
end
end
insert(ret, "<tr>\n<th>[[Wiktionary:Languages|Language code]]</th><td><code>" .. lang:getCode() .. "</code></td>\n</tr>\n")
insert(ret, "<tr>\n<th>[[Wiktionary:Families|Language family]]</th>\n")
local fam = lang:getFamily()
local famCode = fam and fam:getCode()
if not fam then
insert(ret, "<td>unclassified</td>")
elseif famCode == "qfa-iso" then
insert(ret, "<td>[[:Category:Language isolates|language isolate]]</td>")
elseif famCode == "qfa-mix" then
insert(ret, "<td>[[:Category:Mixed languages|mixed language]]</td>")
elseif famCode == "sgn" then
insert(ret, "<td>[[:Category:Sign languages|sign language]]</td>")
elseif famCode == "crp" then
insert(ret, "<td>[[:Category:Creole or pidgin languages|creole or pidgin]]</td>")
elseif famCode == "art" then
insert(ret, "<td>[[:Category:Constructed languages|constructed language]]</td>")
else
insert(ret, "<td>" .. fam:makeCategoryLink() .. "</td>")
end
insert(ret, "\n</tr>\n<tr>\n<th>Ancestors</th>\n<td>")
local ancestors = lang:getAncestors()
if ancestors[2] then
local ancestorList = {}
for i, anc in ipairs(ancestors) do
ancestorList[i] = "<li>" .. anc:makeCategoryLink() .. "</li>"
end
insert(ret, "<ul>\n" .. concat(ancestorList, "\n") .. "</ul>")
else
local ancestorChain = lang:getAncestorChainOld()
if ancestorChain[1] then
local chain = {}
for _, anc in reverse_ipairs(ancestorChain) do
insert(chain, "<li>" .. anc:makeCategoryLink() .. "</li>")
end
insert(ret, "<ul>\n" .. concat(chain, "\n<ul>\n") .. ("</ul>"):rep(#chain))
else
insert(ret, "unknown")
end
end
insert(ret, "</td>\n</tr>\n")
local scripts = lang:getScripts()
if scripts[1] then
local script_text = {}
local function makeScriptLine(sc)
local code = sc:getCode()
local url = tostring(mw.uri.fullUrl('Special:Search', {
search = 'contentmodel:css insource:"' .. code
.. '" insource:/\\.' .. code .. '/',
ns8 = '1'
}))
return sc:makeCategoryLink()
.. ' (<span class="plainlinks" title="Search for stylesheets referencing this script">[' .. url .. ' <code>' .. code .. '</code>]</span>)'
end
local function add_Hrkt(text)
insert(text, "<li>" .. makeScriptLine(Hrkt))
insert(text, "<ul>")
insert(text, "<li>" .. makeScriptLine(Hira) .. "</li>")
insert(text, "<li>" .. makeScriptLine(Kana) .. "</li>")
insert(text, "</ul>")
insert(text, "</li>")
end
for _, sc in ipairs(scripts) do
local text = {}
local code = sc:getCode()
if code == "Hrkt" then
add_Hrkt(text)
else
insert(text, "<li>" .. makeScriptLine(sc))
if code == "Jpan" then
insert(text, "<ul>")
insert(text, "<li>" .. makeScriptLine(Hani) .. "</li>")
add_Hrkt(text)
insert(text, "</ul>")
elseif code == "Kore" then
insert(text, "<ul>")
insert(text, "<li>" .. makeScriptLine(Hang) .. "</li>")
insert(text, "<li>" .. makeScriptLine(Hani) .. "</li>")
insert(text, "</ul>")
end
insert(text, "</li>")
end
insert(script_text, concat(text, "\n"))
end
insert(ret, "<tr>\n<th>[[Wiktionary:Scripts|Scripts]]</th>\n<td><ul>\n" .. concat(script_text, "\n") .. "</ul></td>\n</tr>\n")
else
insert(ret, "<tr>\n<th>[[Wiktionary:Scripts|Scripts]]</th>\n<td>not specified</td>\n</tr>\n")
end
local function add_module_info(raw_data, heading)
if raw_data then
local scripts = lang:getScriptCodes()
local module_info, add = {}, false
if type(raw_data) == "string" then
insert(module_info,
("[[Module:%s]]"):format(raw_data))
add = true
else
local raw_data_type = type(raw_data)
if raw_data_type == "table" and size(scripts) == 1 and type(raw_data[scripts[1]]) == "string" then
insert(module_info,
("[[Module:%s]]"):format(raw_data[scripts[1]]))
add = true
elseif raw_data_type == "table" then
insert(module_info, "<ul>")
for script, data in sorted_pairs(raw_data) do
if type(data) == "string" and m_sc_getByCode(script) then
insert(module_info, ("<li><code>%s</code>: [[Module:%s]]</li>"):format(script, data))
end
end
insert(module_info, "</ul>")
add = size(module_info) > 2
end
end
if add then
insert(ret, [=[
<tr>
<th>]=] .. heading .. [=[</th>
<td>]=] .. concat(module_info) .. [=[</td>
</tr>
]=])
end
end
end
add_module_info(raw_data.generate_forms, "Form-generating<br>module")
add_module_info(raw_data.translit, "[[Wiktionary:Transliteration and romanization|Transliteration<br>module]]")
add_module_info(raw_data.display_text, "Display text<br>module")
add_module_info(raw_data.entry_name, "Entry name<br>module")
add_module_info(raw_data.sort_key, "[[sortkey|Sortkey]]<br>module")
local wikidataItem = lang:getWikidataItem()
if lang:getWikidataItem() and mw.wikibase then
local URL = mw.wikibase.getEntityUrl(wikidataItem)
local link
if URL then
link = '[' .. URL .. ' ' .. wikidataItem .. ']'
else
link = '<span class="error">Invalid Wikidata item: <code>' .. wikidataItem .. '</code></span>'
end
insert(ret, "<tr><th>Wikidata</th><td>" .. link .. "</td></tr>")
end
insert(ret, "</table>")
return concat(ret)
end
local function NavFrame(content, title)
return '<div class="NavFrame"><div class="NavHead">'
.. (title or '{{{title}}}') .. '</div>'
.. '<div class="NavContent" style="text-align: left;">'
.. content
.. '</div></div>'
end
local function get_description_topright_additional(lang, locations, extinct, setwiki, setwikt, setsister, entryname)
local nameWithLanguage = lang:getCategoryName("nocap")
if lang:getCode() == "und" then
local description =
"This is the main category of the '''" .. nameWithLanguage .. "''', represented in Wiktionary by the [[Wiktionary:Languages|code]] '''" .. lang:getCode() .. "'''. " ..
"This language contains terms in historical writing, whose meaning has not yet been determined by scholars."
return description, nil, nil
end
local canonicalName = lang:getCanonicalName()
local topright = linkbox(lang, setwiki, setwikt, setsister, entryname)
local the_prefix
if canonicalName:find(" Language$") then
the_prefix = ""
else
the_prefix = "the "
end
local description = "This is the main category of " .. the_prefix .. "'''" .. nameWithLanguage .. "'''."
local location_links = {}
local prep
local saw_embedded_comma = false
for _, location in ipairs(locations) do
local this_prep
if location == "the world" then
this_prep = "across"
insert(location_links, location)
elseif location ~= "UNKNOWN" then
this_prep = "in"
if location:find(",") then
saw_embedded_comma = true
end
insert(location_links, link_location(location))
end
if this_prep then
if prep and this_prep ~= prep then
error("Can't handle location 'the world' along with another location (clashing prepositions)")
end
prep = this_prep
end
end
local location_desc
if #location_links > 0 then
local location_link_text
if saw_embedded_comma and #location_links >= 3 then
location_link_text = mw.text.listToText(location_links, "; ", "; and ")
else
location_link_text = serial_comma_join(location_links)
end
location_desc = ("It is %s %s %s.\n\n"):format(
extinct and "an [[extinct language]] that was formerly spoken" or "spoken", prep, location_link_text)
elseif extinct then
location_desc = "It is an [[extinct language]].\n\n"
else
location_desc = ""
end
local add = location_desc .. "Information about " .. canonicalName .. ":\n\n" .. infobox(lang)
if lang:hasType("reconstructed") then
add = add .. "\n\n" ..
ucfirst(canonicalName) .. " is a reconstructed language. Its words and roots are not directly attested in any written works, but have been reconstructed through the ''comparative method'', " ..
"which finds regular similarities between languages that cannot be explained by coincidence or word-borrowing, and extrapolates ancient forms from these similarities.\n\n" ..
"According to our [[Wiktionary:Criteria for inclusion|criteria for inclusion]], terms in " .. canonicalName ..
" should '''not''' be present in entries in the main namespace, but may be added to the Reconstruction: namespace."
elseif lang:hasType("appendix-constructed") then
add = add .. "\n\n" ..
ucfirst(canonicalName) .. " is a constructed language that is only in sporadic use. " ..
"According to our [[Wiktionary:Criteria for inclusion|criteria for inclusion]], terms in " .. canonicalName ..
" should '''not''' be present in entries in the main namespace, but may be added to the Appendix: namespace. " ..
"All terms in this language may be available at [[Appendix:" .. ucfirst(canonicalName) .. "]]."
end
local about = new_title("Wiktionary:About " .. canonicalName)
if about.exists then
add = add .. "\n\n" ..
"Please see '''[[Wiktionary:About " .. canonicalName .. "]]''' for information and special considerations for creating " .. nameWithLanguage .. " entries."
end
local ok, tree_of_descendants = pcall(
require("Module:family tree").print_children,
lang:getCode(), {
protolanguage_under_family = true,
must_have_descendants = true
})
if ok then
if tree_of_descendants then
add = add .. NavFrame(
tree_of_descendants,
"Family tree")
else
add = add .. "\n\n" .. ucfirst(lang:getCanonicalName())
.. " has no descendants or varieties listed in Wiktionary's language data modules."
end
else
mw.log("error while generating tree: " .. tostring(tree_of_descendants))
end
return description, topright, add
end
local function get_parents(lang, locations, extinct)
local canonicalName = lang:getCanonicalName()
local sortkey = {sort_base = canonicalName, lang = "mi"}
local ret = {{name = "Reo", sort = sortkey}}
local fam = lang:getFamily()
local famCode = fam and fam:getCode()
-- FIXME: Some of the following categories should be added to this module.
if not fam then
insert(ret, {name = "Category:Unclassified languages", sort = sortkey})
elseif famCode == "qfa-iso" then
insert(ret, {name = "Category:Language isolates", sort = sortkey})
elseif famCode == "qfa-mix" then
insert(ret, {name = "Category:Mixed languages", sort = sortkey})
elseif famCode == "sgn" then
insert(ret, {name = "Category:All sign languages", sort = sortkey})
elseif famCode == "crp" then
insert(ret, {name = "Category:Creole or pidgin languages", sort = sortkey})
for _, anc in ipairs(lang:getAncestors()) do
-- Avoid Haitian Creole being categorised in [[:Category:Haitian Creole-based creole or pidgin languages]], as one of its ancestors is an etymology-only variety of it.
-- Use that ancestor's ancestors instead.
if anc:getFullCode() == lang:getCode() then
for _, anc_extra in ipairs(anc:getAncestors()) do
insert(ret, {name = "Category:" .. ucfirst(anc_extra:getFullName()) .. "-based creole or pidgin languages", sort = sortkey})
end
else
insert(ret, {name = "Category:" .. ucfirst(anc:getFullName()) .. "-based creole or pidgin languages", sort = sortkey})
end
end
elseif famCode == "art" then
if lang:hasType("appendix-constructed") then
insert(ret, {name = "Category:Appendix-only constructed languages", sort = sortkey})
else
insert(ret, {name = "Category:Constructed languages", sort = sortkey})
end
for _, anc in ipairs(lang:getAncestors()) do
if anc:getFullCode() == lang:getCode() then
for _, anc_extra in ipairs(anc:getAncestors()) do
insert(ret, {name = "Category:" .. ucfirst(anc_extra:getFullName()) .. "-based constructed languages", sort = sortkey})
end
else
insert(ret, {name = "Category:" .. ucfirst(anc:getFullName()) .. "-based constructed languages", sort = sortkey})
end
end
else
insert(ret, {name = "Category:" .. fam:getCategoryName(), sort = sortkey})
if lang:hasType("reconstructed") then
insert(ret, {
name = "Category:Reconstructed languages",
sort = {sort_base = canonicalName:gsub("^Proto%-", ""), lang = "en"}
})
end
end
local function add_sc_cat(sc)
insert(ret, {name = "Category:Reo " .. sc:getCategoryName(), sort = sortkey})
end
local function add_Hrkt()
add_sc_cat(Hrkt)
add_sc_cat(Hira)
add_sc_cat(Kana)
end
for _, sc in ipairs(lang:getScripts()) do
if sc:getCode() == "Hrkt" then
add_Hrkt()
else
add_sc_cat(sc)
if sc:getCode() == "Jpan" then
add_sc_cat(Hani)
add_Hrkt()
elseif sc:getCode() == "Kore" then
add_sc_cat(Hang)
add_sc_cat(Hani)
end
end
end
if lang:hasTranslit() then
insert(ret, {name = "Category:Languages with automatic transliteration", sort = sortkey})
end
local function insert_location_language_cat(location)
local cat = "Languages of " .. location
insert(ret, {name = "Category:" .. cat, sort = sortkey})
local auto_cat_args = scrape_category_for_auto_cat_args(cat)
local location_parent = auto_cat_args and auto_cat_args.parent
if location_parent then
local split_parents = require(parse_utilities_module).split_on_comma(location_parent)
for _, parent in ipairs(split_parents) do
parent = parent:match("^(.-):.*$") or parent
insert_location_language_cat(parent)
end
end
end
local saw_location = false
for _, location in ipairs(locations) do
if location ~= "UNKNOWN" then
saw_location = true
insert_location_language_cat(location)
end
end
if extinct then
insert(ret, {name = "Category:All extinct languages", sort = sortkey})
end
if not saw_location and not (lang:hasType("reconstructed") or (fam and fam:getCode() == "art")) then
-- Constructed and reconstructed languages don't need a location specified and often won't have one,
-- so don't put them in this maintenance category.
insert(ret, {name = "Category:Languages not sorted into a location category", sort = sortkey})
end
return ret
end
local function get_children()
local ret = {}
-- FIXME: We should work on the children mechanism so it isn't necessary to manually specify these.
--for _, label in ipairs({"appendices", "entry maintenance", "lemmas", "names", "phrases", "rhymes", "symbols", "templates", "terms by etymology", "terms by usage"}) do
-- insert(ret, {name = label, is_label = true})
--end
--insert(ret, {name = "terms derived from {{{langname}}}", is_label = true, lang = false})
--insert(ret, {name = "{{{langcode}}}:All topics", sort = "all topics"})
--insert(ret, {name = "Varieties of {{{langname}}}"})
--insert(ret, {name = "Requests concerning {{{langname}}}"})
--insert(ret, {name = "Rhymes:{{{langname}}}", description = "Lists of {{{langname}}} words by their rhymes."})
--insert(ret, {name = "User {{{langcode}}}", description = "Wiktionary users categorized by fluency levels in {{{langdisp}}}."})
return ret
end
-- Handle language categories of the form e.g. [[:Category:French language]] and
-- [[:Category:British Sign Language]].
insert(raw_handlers, function(data)
local category = data.category
if not (category:match("[Rr]eo") or category:match("[Ll]ect$")) then
return nil
end
local lang = m_languages.getByCanonicalName(category)
if not lang then
local langname = category:match("^Reo (.*)")
if langname then
lang = m_languages.getByCanonicalName(langname)
end
if not lang then
return nil
end
end
local args = require("Module:parameters").process(data.args, {
[1] = {list = true},
["setwiki"] = true,
["setwikt"] = true,
["setsister"] = true,
["entryname"] = true,
["extinct"] = {type = "boolean"},
})
-- If called from inside, don't require any arguments, as they can't be known
-- in general and aren't needed just to generate the first parent (used for
-- breadcrumbs).
if #args[1] == 0 and not data.called_from_inside then
-- At least one location must be specified unless the language is constructed (e.g. Esperanto) or reconstructed (e.g. Proto-Indo-European).
local fam = lang:getFamily()
if not (lang:hasType("reconstructed") or (fam and fam:getCode() == "art")) then
error("At least one location (param 1=) must be specified for language '" .. lang:getCanonicalName() .. "' (code '" .. lang:getCode() .. "'). " ..
"Use the value UNKNOWN if the language's location is truly unknown.")
end
end
local description, topright, additional = "", "", ""
-- If called from inside the category tree system, it's called when generating
-- parents or children, and we don't need to generate the description or additional
-- text (which is very expensive in terms of memory because it calls [[Module:family tree]],
-- which calls [[Module:languages/data/all]]).
if not data.called_from_inside then
description, topright, additional = get_description_topright_additional(
lang, args[1], args.extinct, args.setwiki, args.setwikt, args.setsister, args.entryname
)
end
return {
canonical_name = lang:getCategoryName(),
description = description,
lang = lang:getCode(),
topright = topright,
additional = additional,
breadcrumb = lang:getCanonicalName(),
parents = get_parents(lang, args[1], args.extinct),
extra_children = get_children(lang),
umbrella = false,
can_be_empty = true,
}, true
end)
-- Handle categories such as [[:Category:Languages of Indonesia]].
insert(raw_handlers, function(data)
local location = data.category:match("^Languages of (.*)$")
if location then
local args = require("Module:parameters").process(data.args, {
["flagfile"] = true,
["commonscat"] = true,
["wp"] = true,
["basename"] = true,
["parent"] = true,
["locationcat"] = true,
["locationlink"] = true,
})
local topright
local basename = args.basename or location:gsub(", .*", "")
if args.flagfile ~= "-" then
local flagfile_arg = args.flagfile or ("Flag of %s.svg"):format(basename)
local files = require(parse_utilities_module).split_on_comma(flagfile_arg)
local topright_parts = {}
for _, file in ipairs(files) do
local flagfile = "File:" .. file
local flagfile_page = new_title(flagfile)
if flagfile_page and flagfile_page.file.exists then
insert(topright_parts, ("[[%s|right|100px|border]]"):format(flagfile))
elseif args.flagfile then
error(("Explicit flagfile '%s' doesn't exist"):format(flagfile))
end
end
topright = concat(topright_parts)
end
if args.wp then
local wp = require("Module:yesno")(args.wp, "+")
if wp == "+" or wp == true then
wp = data.category
end
if wp then
local wp_topright = ("{{wikipedia|%s}}"):format(wp)
if topright then
topright = topright .. wp_topright
else
topright = wp_topright
end
end
end
if args.commonscat then
local commonscat = require("Module:yesno")(args.commonscat, "+")
if commonscat == "+" or commonscat == true then
commonscat = data.category
end
if commonscat then
local commons_topright = ("{{commonscat|%s}}"):format(commonscat)
if topright then
topright = topright .. commons_topright
else
topright = commons_topright
end
end
end
local bare_location = location:match("^the (.*)$") or location
local location_link = args.locationlink or link_location(location)
local bare_basename = basename:match("^the (.*)$") or basename
local parents = {}
if args.parent then
local explicit_parents = require(parse_utilities_module).split_on_comma(args.parent)
for i, parent in ipairs(explicit_parents) do
local actual_parent, sort_key = parent:match("^(.-):(.*)$")
if actual_parent then
parent = actual_parent
sort_key = sort_key:gsub("%+", bare_location)
else
sort_key = " " .. bare_location
end
insert(parents, {name = "Languages of " .. parent, sort = sort_key})
end
else
insert(parents, {name = "Languages by country", sort = {sort_base = bare_location, lang = "en"}})
end
if args.locationcat then
local explicit_location_cats = require(parse_utilities_module).split_on_comma(args.locationcat)
for i, locationcat in ipairs(explicit_location_cats) do
insert(parents, {name = "Category:" .. locationcat, sort = " Languages"})
end
else
local location_cat = ("Category:%s"):format(bare_location)
local location_page = new_title(location_cat)
if location_page and location_page.exists then
insert(parents, {name = location_cat, sort = "Languages"})
end
end
local description = ("Categories for languages of %s (including sublects)."):format(location_link)
return {
topright = topright,
description = description,
parents = parents,
breadcrumb = bare_basename,
additional = "{{{umbrella_msg}}}",
}, true
end
end)
-- Handle categories such as [[:Category:English-based creole or pidgin languages]].
insert(raw_handlers, function(data)
local langname = data.category:match("(.*)%-based creole or pidgin languages$")
if langname then
local lang = m_languages.getByCanonicalName(langname)
if lang then
return {
lang = lang:getCode(),
description = "Languages which developed as a [[creole]] or [[pidgin]] from " .. lang:makeCategoryLink() .. ".",
parents = {{name = "Creole or pidgin languages", sort = {sort_base = "*" .. langname, lang = "en"}}},
breadcrumb = lang:getCanonicalName() .. "-based",
}
end
end
end)
-- Handle categories such as [[:Category:English-based constructed languages]].
insert(raw_handlers, function(data)
local langname = data.category:match("(.*)%-based constructed languages$")
if langname then
local lang = m_languages.getByCanonicalName(langname)
if lang then
return {
lang = lang:getCode(),
description = "Constructed languages which are based on " .. lang:makeCategoryLink() .. ".",
parents = {{name = "Constructed languages", sort = {sort_base = "*" .. langname, lang = "en"}}},
breadcrumb = lang:getCanonicalName() .. "-based",
}
end
end
end)
return {RAW_CATEGORIES = raw_categories, RAW_HANDLERS = raw_handlers}
9f0i5jaq1j7omkh2erfeca1ltyz92tf
Module:languages/data/2
828
5960
17396
2026-07-13T08:16:38Z
Hiyuune
6766
+
17396
Scribunto
text/plain
local m_langdata = require("Module:languages/data")
-- Loaded on demand, as it may not be needed (depending on the data).
local function u(...)
u = require("Module:string utilities").char
return u(...)
end
local c = m_langdata.chars
local p = m_langdata.puaChars
local s = m_langdata.shared
-- Ideally, we want to move these into [[Module:languages/data]], but because (a) it's necessary to use require on that module, and (b) they're only used in this data module, it's less memory-efficient to do that at the moment. If it becomes possible to use mw.loadData, then these should be moved there.
s["de-Latn-sortkey"] = {
remove_diacritics = c.grave .. c.acute .. c.circ .. c.diaer .. c.ringabove,
from = {"æ", "œ", "ß"},
to = {"ae", "oe", "ss"}
}
s["de-Latn-standardchars"] = "AaÄäBbCcDdEeFfGgHhIiJjKkLlMmNnOoÖöPpQqRrSsẞßTtUuÜüVvWwXxYyZz"
s["ka-stripdiacritics"] = {remove_diacritics = c.circ}
s["no-sortkey"] = {
remove_diacritics = c.grave .. c.acute .. c.circ .. c.tilde .. c.macron .. c.dacute .. c.caron .. c.cedilla,
remove_exceptions = {"å"},
from = {"æ", "ø", "å"},
to = {"z" .. p[1], "z" .. p[2], "z" .. p[3]}
}
s["no-standardchars"] = "AaBbDdEeFfGgHhIiJjKkLlMmNnOoPpRrSsTtUuVvYyÆæØøÅå" .. c.punc
s["sa-Deva-stripdiacritics"] = { -- Don't use remove_diacritics for accent marks, as १ and ३ should also be removed if (and only if) they carry any.
from = {"ॐ", "[१३]?[" .. c.anudatta .. c.udatta .. c.dsvarita .. c.tsvarita .. "]+"},
to = {"ओँ"},
}
s["tg-stripdiacritics"] = {remove_diacritics = c.grave .. c.acute}
s["tk-stripdiacritics"] = {remove_diacritics = c.macron}
local m = {}
m["aa"] = {
"Afar",
27811,
"cus-eas",
"Latn, Ethi",
strip_diacritics = {
Latn = {remove_diacritics = c.acute},
},
}
m["ab"] = {
"Abkhaz",
5111,
"cau-abz",
"Cyrl, Geor, Latn",
translit = {
Cyrl = "ab-translit",
-- Geor translit in [[Module:scripts/data]]
},
override_translit = true,
display_text = {
Cyrl = s["cau-Cyrl-displaytext"]
},
strip_diacritics = {
Cyrl = {
remove_diacritics = c.acute,
from = {"^а%-"},
to = {"а"},
},
Latn = s["cau-Latn-stripdiacritics"],
},
sort_key = {
Cyrl = {
from = {
"х'ә", -- 3 chars
"гь", "гә", "ӷь", "ҕь", "ӷә", "ҕә", "дә", "ё", "жь", "жә", "ҙә", "ӡә", "ӡ'", "кь", "кә", "қь", "қә", "ҟь", "ҟә", "ҫә", "тә", "ҭә", "ф'", "хь", "хә", "х'", "ҳә", "ць", "цә", "ц'", "ҵә", "ҵ'", "шь", "шә", "џь", -- 2 chars
"ӷ", "ҕ", "ҙ", "ӡ", "қ", "ҟ", "ԥ", "ҧ", "ҫ", "ҭ", "ҳ", "ҵ", "ҷ", "ҽ", "ҿ", "ҩ", "џ", "ә", -- 1 char
"^а",
},
to = {
"х" .. p[4],
"г" .. p[1], "г" .. p[2], "г" .. p[5], "г" .. p[6], "г" .. p[7], "г" .. p[8], "д" .. p[1], "е" .. p[1], "ж" .. p[1], "ж" .. p[2], "з" .. p[2], "з" .. p[4], "з" .. p[5], "к" .. p[1], "к" .. p[2], "к" .. p[4], "к" .. p[5], "к" .. p[7], "к" .. p[8], "с" .. p[2], "т" .. p[1], "т" .. p[3], "ф" .. p[1], "х" .. p[1], "х" .. p[2], "х" .. p[3], "х" .. p[6], "ц" .. p[1], "ц" .. p[2], "ц" .. p[3], "ц" .. p[5], "ц" .. p[6], "ш" .. p[1], "ш" .. p[2], "ы" .. p[3],
"г" .. p[3], "г" .. p[4], "з" .. p[1], "з" .. p[3], "к" .. p[3], "к" .. p[6], "п" .. p[1], "п" .. p[2], "с" .. p[1], "т" .. p[2], "х" .. p[5], "ц" .. p[4], "ч" .. p[1], "ч" .. p[2], "ч" .. p[3], "ы" .. p[1], "ы" .. p[2], "ь" .. p[1],
"",
}
},
},
}
m["ae"] = {
"Avestan",
29572,
"ira-cen",
"Avst, Gujr, Deva",
translit = {
Avst = "Avst-translit"
},
}
m["af"] = {
"Afrikaans",
14196,
"gmw-frk",
"Latn, Arab",
ancestors = "nl",
sort_key = {
Latn = {
remove_diacritics = c.grave .. c.acute .. c.circ .. c.tilde .. c.diaer .. c.ringabove .. c.cedilla .. "'",
from = {"['ʼ]n"},
to = {"n" .. p[1]}
}
},
}
m["ak"] = {
"Akan",
28026,
"alv-ctn",
"Latn",
}
m["am"] = {
"Amharic",
28244,
"sem-eth",
"Ethi",
translit = "Ethi-translit",
}
m["an"] = {
"Aragonese",
8765,
"roa-nar",
"Latn",
}
m["ar"] = {
"Arabic",
13955,
"sem-arb",
"Arab, Hebr, Syrc, Brai, Nbat",
translit = {
Arab = "ar-translit"
},
strip_diacritics = {
Arab = "ar-stripdiacritics",
},
-- Hebr display_text, strip_diacritics, sort_key in [[Module:scripts/data]]
}
m["as"] = {
"Assamese",
29401,
"inc-bas",
"as-Beng",
ancestors = "inc-mas",
translit = "as-translit",
}
m["av"] = {
"Avar",
29561,
"cau-ava",
"Cyrl, Latn, Arab",
ancestors = "oav",
translit = {
Cyrl = "cau-nec-translit",
Arab = "ar-translit",
},
override_translit = true,
display_text = {
Cyrl = s["cau-Cyrl-displaytext"],
},
strip_diacritics = {
Cyrl = s["cau-Cyrl-stripdiacritics"],
Latn = s["cau-Latn-stripdiacritics"],
},
sort_key = {
Cyrl = {
from = {"гъ", "гь", "гӏ", "ё", "кк", "къ", "кь", "кӏ", "лъ", "лӏ", "тӏ", "хх", "хъ", "хь", "хӏ", "цӏ", "чӏ"},
to = {"г" .. p[1], "г" .. p[2], "г" .. p[3], "е" .. p[1], "к" .. p[1], "к" .. p[2], "к" .. p[3], "к" .. p[4], "л" .. p[1], "л" .. p[2], "т" .. p[1], "х" .. p[1], "х" .. p[2], "х" .. p[3], "х" .. p[4], "ц" .. p[1], "ч" .. p[1]}
},
},
}
m["ay"] = {
"Aymara",
4627,
"sai-aym",
"Latn",
}
m["az"] = {
"Azerbaijani",
9292,
"trk-ogz",
"Latn, Cyrl, fa-Arab",
ancestors = "trk-oat",
dotted_dotless_i = true,
strip_diacritics = {
Latn = {
from = {"ʼ"},
to = {"'"},
},
["fa-Arab"] = {
module = "ar-stripdiacritics",
["from"] = {
"ۆ",
"ۇ",
"وْ",
"ڲ",
"ؽ",
},
["to"] = {
"و",
"و",
"و",
"گ",
"ی",
},
},
},
display_text = {
Latn = {
from = {"'"},
to = {"ʼ"}
}
},
sort_key = {
Latn = {
from = {
"i", -- Ensure "i" comes after "ı".
"ç", "ə", "ğ", "x", "ı", "q", "ö", "ş", "ü", "w"
},
to = {
"i" .. p[1],
"c" .. p[1], "e" .. p[1], "g" .. p[1], "h" .. p[1], "i", "k" .. p[1], "o" .. p[1], "s" .. p[1], "u" .. p[1], "z" .. p[1]
}
},
Cyrl = {
from = {"ғ", "ә", "ы", "ј", "ҝ", "ө", "ү", "һ", "ҹ"},
to = {"г" .. p[1], "е" .. p[1], "и" .. p[1], "и" .. p[2], "к" .. p[1], "о" .. p[1], "у" .. p[1], "х" .. p[1], "ч" .. p[1]}
},
},
}
m["ba"] = {
"Bashkir",
13389,
"trk-kbu",
"Cyrl",
translit = "ba-translit",
override_translit = true,
sort_key = {
from = {"ғ", "ҙ", "ё", "ҡ", "ң", "ө", "ҫ", "ү", "һ", "ә"},
to = {"г" .. p[1], "д" .. p[1], "е" .. p[1], "к" .. p[1], "н" .. p[1], "о" .. p[1], "с" .. p[1], "у" .. p[1], "х" .. p[1], "э" .. p[1]}
},
}
m["be"] = {
"Belarusian",
9091,
"zle",
"Cyrl, Latn",
ancestors = "zle-mbe",
translit = {
Cyrl = "be-translit",
},
strip_diacritics = {
Cyrl = {
remove_diacritics = c.grave .. c.acute,
},
Latn = {
remove_diacritics = c.grave .. c.acute,
remove_exceptions = {"Ć", "ć", "Ń", "ń", "Ś", "ś", "Ź", "ź"},
},
},
sort_key = {
Cyrl = {
remove_diacritics = c.grave .. c.acute,
from = {"ґ", "ё", "і", "ў"},
to = {"г" .. p[1], "е" .. p[1], "и" .. p[1], "у" .. p[1]}
},
Latn = {
remove_diacritics = c.grave .. c.acute,
remove_exceptions = {"Ć", "ć", "Ń", "ń", "Ś", "ś", "Ź", "ź"},
from = {"ć", "č", "dz", "dź", "dž", "ch", "ł", "ń", "ś", "š", "ŭ", "ź", "ž"},
to = {"c" .. p[1], "c" .. p[2], "d" .. p[1], "d" .. p[2], "d" .. p[3], "h" .. p[1], "l" .. p[1], "n" .. p[1], "s" .. p[1], "s" .. p[2], "u" .. p[1], "z" .. p[1], "z" .. p[2]}
},
},
standard_chars = {
Cyrl = "АаБбВвГгДдЕеЁёЖжЗзІіЙйКкЛлМмНнОоПпРрСсТтУуЎўФфХхЦцЧчШшЫыЬьЭэЮюЯя",
Latn = "AaBbCcĆćČčDdEeFfGgHhIiJjKkLlŁłMmNnŃńOoPpRrSsŚśŠšTtUuŬŭVvYyZzŹźŽž",
(c.punc:gsub("'", "")) -- Exclude apostrophe.
},
}
m["bg"] = {
"Bulgarian",
7918,
"zls",
"Cyrl",
ancestors = "cu-bgm",
translit = "bg-translit",
strip_diacritics = {
remove_diacritics = c.grave .. c.acute,
remove_exceptions = {"%f[^%z%s]ѝ%f[%z%s]"},
},
sort_key = {
remove_diacritics = c.grave .. c.acute,
remove_exceptions = {"%f[^%z%s]ѝ%f[%z%s]"},
},
standard_chars = "АаБбВвГгДдЕеЖжЗзИиЙйКкЛлМмНнОоПпРрСсТтУуФфХхЦцЧчШшЩщЪъЬьЮюЯя" .. c.punc,
}
m["bh"] = {
"Bihari",
135305,
"inc-eas",
"Deva",
}
m["bi"] = {
"Bislama",
35452,
"crp",
"Latn",
ancestors = "en",
}
m["bm"] = {
"Bambara",
33243,
"dmn-emn",
"Latn, Nkoo",
sort_key = {
Latn = {
from = {"ɛ", "ɲ", "ŋ", "ɔ"},
to = {"e" .. p[1], "n" .. p[1], "n" .. p[2], "o" .. p[1]}
},
},
}
m["bn"] = {
"Bengali",
9610,
"inc-bas",
"Beng, Newa",
ancestors = "inc-mbn",
translit = {
Beng = "bn-translit"
},
}
m["bo"] = {
"Tibetan",
34271,
"sit-tib",
"Tibt", -- sometimes Deva?
ancestors = "xct",
override_translit = true,
-- Tibt translit, display_text, strip_diacritics, sort_key in [[Module:scripts/data]]
}
m["br"] = {
"Breton",
12107,
"cel-brs",
"Latn",
ancestors = "xbm",
sort_key = {
from = {"ch", "c['ʼ’]h"},
to = {"c" .. p[1], "c" .. p[2]}
},
}
m["ca"] = {
"Catalan",
7026,
"roa-ocr",
"Latn",
ancestors = "roa-oca",
sort_key = {remove_diacritics = c.grave .. c.acute .. c.diaer .. c.cedilla .. "·"},
standard_chars = "AaÀàBbCcÇçDdEeÉéÈèFfGgHhIiÍíÏïJjLlMmNnOoÓóÒòPpQqRrSsTtUuÚúÜüVvXxYyZz·" .. c.punc,
}
m["ce"] = {
"Chechen",
33350,
"cau-vay",
"Cyrl, Latn, Arab",
translit = {
Cyrl = "cau-nec-translit",
Arab = "ar-translit",
},
override_translit = true,
display_text = {
Cyrl = s["cau-Cyrl-displaytext"]
},
strip_diacritics = {
Cyrl = s["cau-Cyrl-stripdiacritics"],
Latn = s["cau-Latn-stripdiacritics"],
},
sort_key = {
Cyrl = {
from = {"аь", "гӏ", "ё", "кх", "къ", "кӏ", "оь", "пӏ", "тӏ", "уь", "хь", "хӏ", "цӏ", "чӏ", "юь", "яь"},
to = {"а" .. p[1], "г" .. p[1], "е" .. p[1], "к" .. p[1], "к" .. p[2], "к" .. p[3], "о" .. p[1], "п" .. p[1], "т" .. p[1], "у" .. p[1], "х" .. p[1], "х" .. p[2], "ц" .. p[1], "ч" .. p[1], "ю" .. p[1], "я" .. p[1]}
},
},
}
m["ch"] = {
"Chamorro",
33262,
"poz",
"Latn",
sort_key = {
remove_diacritics = "'",
from = {"å", "ch", "ñ", "ng"},
to = {"a" .. p[1], "c" .. p[1], "n" .. p[1], "n" .. p[2]}
},
}
m["co"] = {
"Corsican",
33111,
"roa-itr",
"Latn",
sort_key = {
from = {"chj", "ghj", "sc", "sg"},
to = {"c" .. p[1], "g" .. p[1], "s" .. p[1], "s" .. p[2]}
},
standard_chars = "AaÀàBbCcDdEeÈèFfGgHhIiÌìÏïJjLlMmNnOoÒòPpQqRrSsTtUuÙùÜüVvZz" .. c.punc,
}
m["cr"] = {
"Cree",
33390,
"alg",
"Latn, Cans",
translit = {
Cans = "cr-translit"
},
}
m["cs"] = {
"Czech",
9056,
"zlw",
"Latn",
ancestors = "cs-ear",
sort_key = {
from = {"á", "č", "ď", "é", "ě", "ch", "í", "ň", "ó", "ř", "š", "ť", "ú", "ů", "ý", "ž"},
to = {"a" .. p[1], "c" .. p[1], "d" .. p[1], "e" .. p[1], "e" .. p[2], "h" .. p[1], "i" .. p[1], "n" .. p[1], "o" .. p[1], "r" .. p[1], "s" .. p[1], "t" .. p[1], "u" .. p[1], "u" .. p[2], "y" .. p[1], "z" .. p[1]}
},
standard_chars = "AaÁáBbCcČčDdĎďEeÉéĚěFfGgHhIiÍíJjKkLlMmNnŇňOoÓóPpRrŘřSsŠšTtŤťUuÚúŮůVvYyÝýZzŽž" .. c.punc,
}
m["cu"] = {
"Old Church Slavonic",
35499,
"zls",
"Cyrs, Glag, Zname",
translit = {
Cyrs = "Cyrs-translit",
Glag = "Glag-translit"
},
-- Cyrs strip_diacritics, sort_key in [[Module:scripts/data]]
}
m["cv"] = {
"Chuvash",
33348,
"trk-ogr",
"Cyrl",
ancestors = "cv-mid",
translit = "cv-translit",
override_translit = true,
sort_key = {
from = {"ӑ", "ё", "ӗ", "ҫ", "ӳ"},
to = {"а" .. p[1], "е" .. p[1], "е" .. p[2], "с" .. p[1], "у" .. p[1]}
},
}
m["cy"] = {
"Welsh",
9309,
"cel-brw",
"Latn",
ancestors = "wlm",
sort_key = {
remove_diacritics = c.grave .. c.acute .. c.circ .. c.diaer .. "'",
from = {"ch", "dd", "ff", "ng", "ll", "ph", "rh", "th"},
to = {"c" .. p[1], "d" .. p[1], "f" .. p[1], "g" .. p[1], "l" .. p[1], "p" .. p[1], "r" .. p[1], "t" .. p[1]}
},
standard_chars = "ÂâAaBbCcDdEeÊêFfGgHhIiÎîLlMmNnOoÔôPpRrSsTtUuÛûWwŴŵYyŶŷ" .. c.punc,
}
m["da"] = {
"Danish",
9035,
"gmq-eas",
"Latn",
ancestors = "gmq-oda",
sort_key = {
remove_diacritics = c.grave .. c.acute .. c.circ .. c.tilde .. c.macron .. c.dacute .. c.caron .. c.cedilla,
remove_exceptions = {"å"},
from = {"æ", "ø", "å"},
to = {"z" .. p[1], "z" .. p[2], "z" .. p[3]}
},
standard_chars = "AaBbDdEeFfGgHhIiJjKkLlMmNnOoPpRrSsTtUuVvYyÆæØøÅå" .. c.punc,
}
m["de"] = {
"German",
188,
"gmw-hgm",
"Latn, Latf, Brai",
ancestors = "de-ear",
sort_key = {
Latn = s["de-Latn-sortkey"],
Latf = s["de-Latn-sortkey"],
},
standard_chars = {
Latn = s["de-Latn-standardchars"],
Latf = s["de-Latn-standardchars"],
Brai = c.braille,
c.punc
}
}
m["dv"] = {
"Dhivehi",
32656,
"inc-ins",
"Thaa, Diak",
translit = {
Thaa = "dv-translit",
Diak = "Diak-translit",
},
ancestors = "dv-old",
override_translit = true,
}
m["dz"] = {
"Dzongkha",
33081,
"sit-tib",
"Tibt",
ancestors = "xct",
override_translit = true,
-- Tibt translit, display_text, strip_diacritics, sort_key in [[Module:scripts/data]]
}
m["ee"] = {
"Ewe",
30005,
"alv-gbe",
"Latn",
sort_key = {
remove_diacritics = c.tilde,
from = {"ɖ", "dz", "ɛ", "ƒ", "gb", "ɣ", "kp", "ny", "ŋ", "ɔ", "ts", "ʋ"},
to = {"d" .. p[1], "d" .. p[2], "e" .. p[1], "f" .. p[1], "g" .. p[1], "g" .. p[2], "k" .. p[1], "n" .. p[1], "n" .. p[2], "o" .. p[1], "t" .. p[1], "v" .. p[1]}
},
}
m["el"] = {
"Greek",
9129,
"grk",
"Grek, Polyt, Brai",
ancestors = "el-kth",
translit = "el-translit",
override_translit = true,
-- Grek and Polyt display_text, strip_diacritics, sort_key in [[Module:scripts/data]]
standard_chars = {
Grek = "΅·ͺ΄ΑαΆάΒβΓγΔδΕεέΈΖζΗηΉήΘθΙιΊίΪϊΐΚκΛλΜμΝνΞξΟοΌόΠπΡρΣσςΤτΥυΎύΫϋΰΦφΧχΨψΩωΏώ",
Brai = c.braille,
c.punc
},
}
m["en"] = {
"English",
1860,
"gmw-ang",
"Latn, Brai, Shaw, Dsrt", -- entries in Shaw or Dsrt might require prior discussion
wikimedia_codes = "en, simple",
ancestors = "en-ear",
sort_key = {
Latn = {
-- Many of these are needed for sorting language names.
remove_diacritics = "'\"%-%.,%s·ʻʼ" .. c.diacritics,
-- These are found in pagenames.
from = {"[ɒæ🅱¢©ᴄðđəǝɜɡħʜıɨłŋɲøɔœꝑꝓꝕßʋ]"},
to = {{
["ɒ"] = "a", ["æ"] = "ae", ["🅱"] = "b", ["¢"] = "c", ["©"] = "c",
["ᴄ"] = "c", ["ð"] = "d", ["đ"] = "d", ["ə"] = "e", ["ǝ"] = "e",
["ɜ"] = "e", ["ɡ"] = "g", ["ħ"] = "h", ["ʜ"] = "h", ["ı"] = "i",
["ɨ"] = "i", ["ł"] = "l", ["ŋ"] = "n", ["ɲ"] = "n", ["ø"] = "o",
["ɔ"] = "o", ["œ"] = "oe", ["ꝑ"] = "p", ["ꝓ"] = "p", ["ꝕ"] = "p",
["ß"] = "ss", ["ʋ"] = "v",
}},
},
},
standard_chars = {
Latn = "AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz",
Brai = c.braille,
c.punc
},
}
m["eo"] = {
"Esperanto",
143,
"art",
"Latn",
sort_key = {
remove_diacritics = c.grave .. c.acute,
from = {"ĉ", "ĝ", "ĥ", "ĵ", "ŝ", "ŭ"},
to = {"c" .. p[1], "g" .. p[1], "h" .. p[1], "j" .. p[1], "s" .. p[1], "u" .. p[1]}
},
standard_chars = "AaBbCcĈĉDdEeFfGgĜĝHhĤĥIiJjĴĵKkLlMmNnOoPpRrSsŜŝTtUuŬŭVvZz" .. c.punc,
}
m["es"] = {
"Spanish",
1321,
"roa-cas",
"Latn, Brai",
ancestors = "es-ear",
sort_key = {
Latn = {
remove_exceptions = {"ñ"},
remove_diacritics = c.grave .. c.acute .. c.circ .. c.tilde .. c.macron .. c.diaer .. c.cedilla,
from = {"ª", "æ", "ñ", "º", "œ"},
to = {"a", "ae", "n" .. p[1], "o", "oe"}
},
},
standard_chars = {
Latn = "AaÁáBbCcDdEeÉéFfGgHhIiÍíJjLlMmNnÑñOoÓóPpQqRrSsTtUuÚúÜüVvXxYyZz",
Brai = c.braille,
c.punc
},
}
m["et"] = {
"Estonian",
9072,
"urj-fin",
"Latn",
sort_key = {
from = {
"š", "ž", "õ", "ä", "ö", "ü", -- 2 chars
"z" -- 1 char
},
to = {
"s" .. p[1], "s" .. p[3], "w" .. p[1], "w" .. p[2], "w" .. p[3], "w" .. p[4],
"s" .. p[2]
}
},
standard_chars = "AaBbDdEeFfGgHhIiJjKkLlMmNnOoPpRrSsTtUuVvÕõÄäÖöÜü" .. c.punc,
}
m["eu"] = {
"Basque",
8752,
"euq",
"Latn",
sort_key = {
from = {"ç", "ñ"},
to = {"c" .. p[1], "n" .. p[1]}
},
standard_chars = "AaBbDdEeFfGgHhIiJjKkLlMmNnÑñOoPpRrSsTtUuXxZz" .. c.punc,
}
m["fa"] = {
"Persian",
9168,
"ira-swi",
"fa-Arab, Hebr",
ancestors = "fa-cls",
strip_diacritics = {
["fa-Arab"] = {
-- character "ۂ" code U+06C2 to "ه" and "هٔ" (U+0647 + U+0654) to "ه"; hamzatu l-waṣli to a regular alif
from = {"هٔ", "ٱ"}, -- character "ۂ" code U+06C2 to "ه"; hamzatu l-waṣli to a regular alif
to = {"ه", "ا"},
remove_diacritics = c.fathatan .. c.dammatan .. c.kasratan .. c.fatha .. c.damma .. c.kasra .. c.shadda .. c.sukun .. c.superalef,
},
},
-- Hebr display_text, strip_diacritics, sort_key in [[Module:scripts/data]]
}
m["ff"] = {
"Fula",
33454,
"alv-fwo",
"Latn, Adlm",
}
m["fi"] = {
"Finnish",
1412,
"urj-fin",
"Latn",
display_text = {
from = {"'"},
to = {"’"}
},
strip_diacritics = { -- used to indicate gemination of the next consonant
remove_diacritics = "ˣ",
from = {"’"},
to = {"'"},
},
sort_key = { -- [[Appendix:Finnish alphabet#Collation]] + "aͤ" and "oͤ" as historical variants of "ä" and "ö".
remove_diacritics = "'’:" .. c.diacritics,
remove_exceptions = {
"a[" .. c.ringabove .. c.diaer .. c.small_e .. "]", -- åäaͤ
"o[" .. c.diaer .. c.tilde .. c.dacute .. c.small_e .. "]", -- öõőoͤ
"u[" .. c.diaer .. c.dacute .. "]" -- üű
},
from = {"æ", "[ðđ]", "ł", "ŋ", "œ", "ß", "þ", "u[" .. c.diaer .. c.dacute .. "]", "å", "aͤ", "o[" .. c.tilde .. c.dacute .. c.small_e .. "]", "ø", "(.)['%-]"},
to = {"ae", "d", "l", "n", "oe", "ss", "th", "y", "z" .. p[1], "ä", "ö", "ö", "%1"}
},
standard_chars = "AaBbDdEeFfGgHhIiJjKkLlMmNnOoPpRrSsTtUuVvYyÄäÖö" .. c.punc,
}
m["fj"] = {
"Fijian",
33295,
"poz-pcc",
"Latn",
}
m["fo"] = {
"Faroese",
25258,
"gmq-ins",
"Latn",
sort_key = {
from = {"á", "ð", "í", "ó", "ú", "ý", "æ", "ø"},
to = {"a" .. p[1], "d" .. p[1], "i" .. p[1], "o" .. p[1], "u" .. p[1], "y" .. p[1], "z" .. p[1], "z" .. p[2]}
},
standard_chars = "AaÁáBbDdÐðEeFfGgHhIiÍíJjKkLlMmNnOoÓóPpRrSsTtUuÚúVvYyÝýÆæØø" .. c.punc,
}
m["fr"] = {
"French",
150,
"roa-oil",
"Latn, Brai",
ancestors = "frm",
sort_key = {
Latn = s["roa-oil-sortkey"]
},
standard_chars = {
Latn = "AaÀàÂâBbCcÇçDdEeÉéÈèÊêËëFfGgHhIiÎîÏïJjLlMmNnOoÔôŒœPpQqRrSsTtUuÙùÛûÜüVvXxYyZz",
Brai = c.braille,
c.punc
},
}
m["fy"] = {
"West Frisian",
27175,
"gmw-fri",
"Latn",
sort_key = {
remove_diacritics = c.grave .. c.acute .. c.circ .. c.diaer,
from = {"y"},
to = {"i"}
},
standard_chars = "AaâäàÆæBbCcDdEeéêëèFfGgHhIiïìYyỳJjKkLlMmNnOoôöòPpRrSsTtUuúûüùVvWwZz" .. c.punc,
}
m["ga"] = {
"Irish",
9142,
"cel-gae",
"Latn, Latg",
ancestors = "mga",
sort_key = {
remove_diacritics = c.acute,
from = {"ḃ", "ċ", "ḋ", "ḟ", "ġ", "ṁ", "ṗ", "ṡ", "ṫ"},
to = {"bh", "ch", "dh", "fh", "gh", "mh", "ph", "sh", "th"}
},
standard_chars = "AaÁáBbCcDdEeÉéFfGgHhIiÍíLlMmNnOoÓóPpRrSsTtUuÚúVv" .. c.punc,
}
m["gd"] = {
"Scottish Gaelic",
9314,
"cel-gae",
"Latn, Latg",
ancestors = "mga",
sort_key = {remove_diacritics = c.grave .. c.acute},
standard_chars = "AaÀàBbCcDdEeÈèFfGgHhIiÌìLlMmNnOoÒòPpRrSsTtUuÙù" .. c.punc,
}
m["gl"] = {
"Galician",
9307,
"roa-gap",
"Latn",
sort_key = {
remove_diacritics = c.acute,
from = {"ñ"},
to = {"n" .. p[1]}
},
standard_chars = "AaÁáBbCcDdEeÉéFfGgHhIiÍíÏïLlMmNnÑñOoÓóPpQqRrSsTtUuÚúÜüVvXxZz" .. c.punc,
}
m["gu"] = {
"Gujarati",
5137,
"inc-wes",
"Arab, Gujr",
ancestors = "inc-mgu",
translit = {
Gujr = "gu-translit",
},
strip_diacritics = {
Arab = {remove_diacritics = c.fathatan .. c.dammatan .. c.kasratan .. c.fatha .. c.damma .. c.kasra .. c.kasra .. c.shadda .. c.sukun},
Gujr = {remove_diacritics = "઼"},
},
}
m["gv"] = {
"Manx",
12175,
"cel-gae",
"Latn",
ancestors = "mga",
sort_key = {remove_diacritics = c.cedilla .. "-"},
standard_chars = "AaBbCcÇçDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwYy" .. c.punc,
}
m["ha"] = {
"Hausa",
56475,
"cdc-wst",
"Latn, Arab",
strip_diacritics = {
Latn = {remove_diacritics = c.grave .. c.acute .. c.circ .. c.tilde .. c.macron}
},
sort_key = {
Latn = {
from = {"ɓ", "b'", "ɗ", "d'", "ƙ", "k'", "sh", "ƴ", "'y"},
to = {"b" .. p[1], "b" .. p[2], "d" .. p[1], "d" .. p[2], "k" .. p[1], "k" .. p[2], "s" .. p[1], "y" .. p[1], "y" .. p[2]}
},
},
}
m["he"] = {
"Hebrew",
9288,
"sem-can",
"Hebr, Phnx, Brai, Samr",
ancestors = "he-med",
-- Hebr display_text, strip_diacritics, sort_key in [[Module:scripts/data]]
-- Samr strip_diacritics, sort_key in [[Module:scripts/data]]
-- Phnx translit in [[Module:scripts/data]] (NOTE: not present before, presumably an accidental omission)
}
m["hi"] = {
"Hindi",
1568,
"inc-hnd",
"Deva, Kthi, Newa",
translit = {
Deva = "hi-translit"
},
standard_chars = {
Deva = "अआइईउऊएऐओऔकखगघङचछजझञटठडढणतथदधनपफबभमयरलवशषसहत्रज्ञक्षक़ख़ग़ज़झ़ड़ढ़फ़काखागाघाङाचाछाजाझाञाटाठाडाढाणाताथादाधानापाफाबाभामायारालावाशाषासाहात्राज्ञाक्षाक़ाख़ाग़ाज़ाझ़ाड़ाढ़ाफ़ाकिखिगिघिङिचिछिजिझिञिटिठिडिढिणितिथिदिधिनिपिफिबिभिमियिरिलिविशिषिसिहित्रिज्ञिक्षिक़िख़िग़िज़िझ़िड़िढ़िफ़िकीखीगीघीङीचीछीजीझीञीटीठीडीढीणीतीथीदीधीनीपीफीबीभीमीयीरीलीवीशीषीसीहीत्रीज्ञीक्षीक़ीख़ीग़ीज़ीझ़ीड़ीढ़ीफ़ीकुखुगुघुङुचुछुजुझुञुटुठुडुढुणुतुथुदुधुनुपुफुबुभुमुयुरुलुवुशुषुसुहुत्रुज्ञुक्षुक़ुख़ुग़ुज़ुझ़ुड़ुढ़ुफ़ुकूखूगूघूङूचूछूजूझूञूटूठूडूढूणूतूथूदूधूनूपूफूबूभूमूयूरूलूवूशूषूसूहूत्रूज्ञूक्षूक़ूख़ूग़ूज़ूझ़ूड़ूढ़ूफ़ूकेखेगेघेङेचेछेजेझेञेटेठेडेढेणेतेथेदेधेनेपेफेबेभेमेयेरेलेवेशेषेसेहेत्रेज्ञेक्षेक़ेख़ेग़ेज़ेझ़ेड़ेढ़ेफ़ेकैखैगैघैङैचैछैजैझैञैटैठैडैढैणैतैथैदैधैनैपैफैबैभैमैयैरैलैवैशैषैसैहैत्रैज्ञैक्षैक़ैख़ैग़ैज़ैझ़ैड़ैढ़ैफ़ैकोखोगोघोङोचोछोजोझोञोटोठोडोढोणोतोथोदोधोनोपोफोबोभोमोयोरोलोवोशोषोसोहोत्रोज्ञोक्षोक़ोख़ोग़ोज़ोझ़ोड़ोढ़ोफ़ोकौखौगौघौङौचौछौजौझौञौटौठौडौढौणौतौथौदौधौनौपौफौबौभौमौयौरौलौवौशौषौसौहौत्रौज्ञौक्षौक़ौख़ौग़ौज़ौझ़ौड़ौढ़ौफ़ौक्ख्ग्घ्ङ्च्छ्ज्झ्ञ्ट्ठ्ड्ढ्ण्त्थ्द्ध्न्प्फ्ब्भ्म्य्र्ल्व्श्ष्स्ह्त्र्ज्ञ्क्ष्क़्ख़्ग़्ज़्झ़्ड़्ढ़्फ़्।॥०१२३४५६७८९॰",
c.punc
},
}
m["ho"] = {
"Hiri Motu",
33617,
"crp",
"Latn",
ancestors = "meu",
}
m["ht"] = {
"Haitian Creole",
33491,
"crp",
"Latn",
ancestors = "ht-sdm",
sort_key = {
from = {
"oun", -- 3 chars
"an", "ch", "è", "en", "ng", "ò", "on", "ou", "ui" -- 2 chars
},
to = {
"o" .. p[4],
"a" .. p[1], "c" .. p[1], "e" .. p[1], "e" .. p[2], "n" .. p[1], "o" .. p[1], "o" .. p[2], "o" .. p[3], "u" .. p[1]
}
},
}
m["hu"] = {
"Hungarian",
9067,
"urj-ugr",
"Latn, Hung",
ancestors = "ohu",
sort_key = {
Latn = {
from = {
"dzs", -- 3 chars
"á", "cs", "dz", "é", "gy", "í", "ly", "ny", "ó", "ö", "ő", "sz", "ty", "ú", "ü", "ű", "zs", -- 2 chars
},
to = {
"d" .. p[2],
"a" .. p[1], "c" .. p[1], "d" .. p[1], "e" .. p[1], "g" .. p[1], "i" .. p[1], "l" .. p[1], "n" .. p[1], "o" .. p[1], "o" .. p[2], "o" .. p[3], "s" .. p[1], "t" .. p[1], "u" .. p[1], "u" .. p[2], "u" .. p[3], "z" .. p[1],
}
},
},
standard_chars = {
Latn = "AaÁáBbCcDdEeÉéFfGgHhIiÍíJjKkLlMmNnOoÓóÖöŐőPpQqRrSsTtUuÚúÜüŰűVvWwXxYyZz",
c.punc
},
}
m["hy"] = {
"Armenian",
8785,
"hyx",
"Armn, Brai",
ancestors = "axm",
-- Armn translit in [[Module:scripts/data]]
override_translit = true,
strip_diacritics = {
Armn = {
remove_diacritics = "՛՜՞՟",
from = {"եւ", "<sup>յ</sup>", "<sup>ի</sup>", "<sup>է</sup>", "յ̵", "ՙ", "՚"},
to = {"և", "յ", "ի", "է", "ֈ", "ʻ", "’"}
},
},
sort_key = {
Armn = {
from = {
"ու", "եւ", -- 2 chars
"և" -- 1 char
},
to = {
"ւ", "եվ",
"եվ"
}
},
},
}
m["hz"] = {
"Herero",
33315,
"bnt-swb",
"Latn",
}
m["ia"] = {
"Interlingua",
35934,
"art",
"Latn",
}
m["id"] = {
"Indonesian",
9240,
"poz-mly",
"Latn",
ancestors = "ms",
standard_chars = "AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz" .. c.punc,
}
m["ie"] = {
"Interlingue",
35850,
"art",
"Latn",
type = "appendix-constructed",
strip_diacritics = {remove_diacritics = c.grave .. c.acute .. c.circ},
}
m["ig"] = {
"Igbo",
33578,
"alv-igb",
"Latn",
strip_diacritics = {remove_diacritics = c.grave .. c.acute .. c.macron},
sort_key = {
from = {"gb", "gh", "gw", "ị", "kp", "kw", "ṅ", "nw", "ny", "ọ", "sh", "ụ"},
to = {"g" .. p[1], "g" .. p[2], "g" .. p[3], "i" .. p[1], "k" .. p[1], "k" .. p[2], "n" .. p[1], "n" .. p[2], "n" .. p[3], "o" .. p[1], "s" .. p[1], "u" .. p[1]}
},
}
m["ii"] = {
"Nuosu",
34235,
"tbq-nlo",
"Yiii",
translit = "ii-translit",
}
m["ik"] = {
"Inupiaq",
27183,
"esx-inu",
"Latn",
sort_key = {
from = {
"ch", "ġ", "dj", "ḷ", "ł̣", "ñ", "ng", "r̂", "sr", "zr", -- 2 chars
"ł", "ŋ", "ʼ" -- 1 char
},
to = {
"c" .. p[1], "g" .. p[1], "h" .. p[1], "l" .. p[1], "l" .. p[3], "n" .. p[1], "n" .. p[2], "r" .. p[1], "s" .. p[1], "z" .. p[1],
"l" .. p[2], "n" .. p[2], "z" .. p[2]
}
},
}
m["io"] = {
"Ido",
35224,
"art",
"Latn",
}
m["is"] = {
"Icelandic",
294,
"gmq-ins",
"Latn",
sort_key = {
from = {"á", "ð", "é", "í", "ó", "ú", "ý", "þ", "æ", "ö"},
to = {"a" .. p[1], "d" .. p[1], "e" .. p[1], "i" .. p[1], "o" .. p[1], "u" .. p[1], "y" .. p[1], "z" .. p[1], "z" .. p[2], "z" .. p[3]}
},
standard_chars = "AaÁáBbDdÐðEeÉéFfGgHhIiÍíJjKkLlMmNnOoÓóPpRrSsTtUuÚúVvXxYyÝýÞþÆæÖö" .. c.punc,
}
m["it"] = {
"Italian",
652,
"roa-itr",
"Latn",
ancestors = "roa-oit",
sort_key = {remove_diacritics = c.grave .. c.acute .. c.circ .. c.diaer .. c.ringabove},
standard_chars = "AaÀàBbCcDdEeÈèÉéFfGgHhIiÌìLlMmNnOoÒòPpQqRrSsTtUuÙùVvZz" .. c.punc,
}
m["iu"] = {
"Inuktitut",
29921,
"esx-inu",
"Cans, Latn",
translit = {
Cans = "cr-translit"
},
override_translit = true,
}
m["ja"] = {
"Japanese",
5287,
"jpx",
"Jpan, Latn, Brai",
ancestors = "ja-ear",
translit = s["jpx-translit"],
link_tr = true,
display_text = s["jpx-displaytext"],
strip_diacritics = s["jpx-stripdiacritics"],
sort_key = s["jpx-sortkey"],
}
m["jv"] = {
"Javanese",
33549,
"poz",
"Latn, Java, Arab",
ancestors = "kaw",
translit = {
Java = "jv-translit"
},
link_tr = true,
strip_diacritics = {
Latn = {remove_diacritics = c.circ} -- Modern jv don't use ê
},
sort_key = {
Latn = {
from = {"å", "dh", "é", "è", "ng", "ny", "th"},
to = {"a" .. p[1], "d" .. p[1], "e" .. p[1], "e" .. p[2], "n" .. p[1], "n" .. p[2], "t" .. p[1]}
},
},
}
m["ka"] = {
"Georgian",
8108,
"ccs-gzn",
"Geor, Geok, Hebr", -- Hebr is used to write Judeo-Georgian
ancestors = "ka-mid",
-- Geor, Geok translit in [[Module:scripts/data]]
override_translit = true,
strip_diacritics = {
Geor = s["ka-stripdiacritics"],
Geok = s["ka-stripdiacritics"],
},
-- Hebr display_text, strip_diacritics, sort_key in [[Module:scripts/data]]
}
m["kg"] = {
"Kongo",
33702,
"bnt-kng",
"Latn",
}
m["ki"] = {
"Kikuyu",
33587,
"bnt-kka",
"Latn",
}
m["kj"] = {
"Kwanyama",
1405077,
"bnt-ova",
"Latn",
}
m["kk"] = {
"Kazakh",
9252,
"trk-kno",
"Cyrl, Latn, kk-Arab",
translit = {
Cyrl = {
from = {
"Ё", "ё", "Й", "й", "Нг", "нг", "Ӯ", "ӯ", -- 2 chars; are "Ӯ" and "ӯ" actually used?
"А", "а", "Ә", "ә", "Б", "б", "В", "в", "Г", "г", "Ғ", "ғ", "Д", "д", "Е", "е", "Ж", "ж", "З", "з", "И", "и", "К", "к", "Қ", "қ", "Л", "л", "М", "м", "Н", "н", "Ң", "ң", "О", "о", "Ө", "ө", "П", "п", "Р", "р", "С", "с", "Т", "т", "У", "у", "Ұ", "ұ", "Ү", "ү", "Ф", "ф", "Х", "х", "Һ", "һ", "Ц", "ц", "Ч", "ч", "Ш", "ш", "Щ", "щ", "Ъ", "ъ", "Ы", "ы", "І", "і", "Ь", "ь", "Э", "э", "Ю", "ю", "Я", "я", -- 1 char
},
to = {
"E", "e", "İ", "i", "Ñ", "ñ", "U", "u",
"A", "a", "Ä", "ä", "B", "b", "V", "v", "G", "g", "Ğ", "ğ", "D", "d", "E", "e", "J", "j", "Z", "z", "İ", "i", "K", "k", "Q", "q", "L", "l", "M", "m", "N", "n", "Ñ", "ñ", "O", "o", "Ö", "ö", "P", "p", "R", "r", "S", "s", "T", "t", "U", "u", "Ū", "ū", "Ü", "ü", "F", "f", "X", "x", "H", "h", "S", "s", "Ç", "ç", "Ş", "ş", "Ş", "ş", "", "", "Y", "y", "I", "ı", "", "", "É", "é", "Ü", "ü", "Ä", "ä",
}
}
},
-- override_translit = true,
sort_key = {
Cyrl = {
from = {"ә", "ғ", "ё", "қ", "ң", "ө", "ұ", "ү", "һ", "і"},
to = {"а" .. p[1], "г" .. p[1], "е" .. p[1], "к" .. p[1], "н" .. p[1], "о" .. p[1], "у" .. p[1], "у" .. p[2], "х" .. p[1], "ы" .. p[1]}
},
},
standard_chars = {
Cyrl = "АаӘәБбВвГгҒғДдЕеЁёЖжЗзИиЙйКкҚқЛлМмНнҢңОоӨөПпРрСсТтУуҰұҮүФфХхҺһЦцЧчШшЩщЪъЫыІіЬьЭэЮюЯя",
c.punc
},
}
m["kl"] = {
"Greenlandic",
25355,
"esx-inu",
"Latn",
sort_key = {
from = {"æ", "ø", "å"},
to = {"z" .. p[1], "z" .. p[2], "z" .. p[3]}
}
}
m["km"] = {
"Khmer",
9205,
"mkh-kmr",
"Khmr",
ancestors = "xhm",
translit = "km-translit", --This might yield unwanted result unless its entry has {{km-IPA}}.
}
m["kn"] = {
"Kannada",
33673,
"dra-kan",
"Knda, Tutg",
ancestors = "dra-mkn",
-- Knda translit in [[Module:scripts/data]]
}
m["ko"] = {
"Korean",
9176,
"qfa-kor",
"Kore, Brai",
ancestors = "ko-ear",
translit = {
Kore = "ko-translit",
},
-- Kore strip_diacritics in [[Module:scripts/data]]
}
m["kr"] = {
"Kanuri",
36094,
"ssa-sah",
"Latn, Arab",
-- the sortkey and strip_diacritics are only for standard Kanuri; when dialectal entries get added, someone will have to work out how the dialects should be represented orthographically
strip_diacritics = {
Latn = {remove_diacritics = c.grave .. c.acute .. c.circ .. c.breve}
},
sort_key = {
Latn = {
from = {"ǝ", "ny", "ɍ", "sh"},
to = {"e" .. p[1], "n" .. p[1], "r" .. p[1], "s" .. p[1]}
},
},
}
m["ks"] = {
"Kashmiri",
33552,
"inc-kas",
"ks-Arab, Deva, Shrd, Latn",
translit = {
["ks-Arab"] = "ks-Arab-translit",
Deva = "ks-Deva-translit",
-- Shrd translit in [[Module:scripts/data]]
},
}
-- "kv" is treated as "koi", "kpv", see [[WT:LT]]
m["kw"] = {
"Cornish",
25289,
"cel-brs",
"Latn",
ancestors = "cnx",
sort_key = {
from = {"ch"},
to = {"c" .. p[1]}
},
}
m["ky"] = {
"Kyrgyz",
9255,
"trk-kkp",
"Cyrl, Latn, Arab",
translit = {
Cyrl = "ky-translit"
},
override_translit = true,
sort_key = {
Cyrl = {
from = {"ё", "ң", "ө", "ү"},
to = {"е" .. p[1], "н" .. p[1], "о" .. p[1], "у" .. p[1]}
},
},
}
m["la"] = {
"Latin",
397,
"itc-laf",
"Latn, Ital",
ancestors = "itc-ola",
-- Ital translit in [[Module:scripts/data]] (NOTE: formerly not present, probably an accidental omission)
display_text = {
Latn = s["itc-Latn-displaytext"]
},
strip_diacritics = {
Latn = s["itc-Latn-stripdiacritics"]
},
sort_key = {
Latn = s["itc-Latn-sortkey"]
},
standard_chars = {
Latn = "AaBbCcDdEeFfGgHhIiLlMmNnOoPpQqRrSsTtUuVvXx",
c.punc
},
}
m["lb"] = {
"Luxembourgish",
9051,
"gmw-hgm",
"Latn, Brai",
ancestors = "gmw-cfr",
sort_key = {
Latn = {
from = {"ä", "ë", "é"},
to = {"z" .. p[1], "z" .. p[2], "z" .. p[3]}
},
},
}
m["lg"] = {
"Luganda",
33368,
"bnt-nyg",
"Latn",
strip_diacritics = {remove_diacritics = c.acute .. c.circ},
sort_key = {
from = {"ŋ"},
to = {"n" .. p[1]}
},
}
m["li"] = {
"Limburgish",
102172,
"gmw-frk",
"Latn",
ancestors = "dum",
}
m["ln"] = {
"Lingala",
36217,
"bnt-bmo",
"Latn",
sort_key = {
remove_diacritics = c.acute .. c.circ .. c.caron,
from = {"ɛ", "gb", "mb", "mp", "nd", "ng", "nk", "ns", "nt", "ny", "nz", "ɔ"},
to = {"e" .. p[1], "g" .. p[1], "m" .. p[1], "m" .. p[2], "n" .. p[1], "n" .. p[2], "n" .. p[3], "n" .. p[4], "n" .. p[5], "n" .. p[6], "n" .. p[7], "o" .. p[1]}
},
}
m["lo"] = {
"Lao",
9211,
"tai-swe",
"Laoo", -- also Tai Noi/Lao Buhan script
translit = "lo-translit",
sort_key = "Laoo-sortkey",
standard_chars = "0-9ກຂຄງຈຊຍດຕຖທນບປຜຝພຟມຢຣລວສຫອຮຯ-ໝ" .. c.punc,
}
m["lt"] = {
"Lithuanian",
9083,
"bat-eas",
"Latn",
ancestors = "olt",
display_text = "lt-common",
strip_diacritics = "lt-common",
sort_key = "lt-common",
standard_chars = "AaĄąBbCcČčDdEeĘęĖėFfGgHhIiĮįYyJjKkLlMmNnOoPpRrSsŠšTtUuŲųŪūVvZzŽž" .. c.punc,
}
m["lu"] = {
"Luba-Katanga",
36157,
"bnt-lub",
"Latn",
}
m["lv"] = {
"Latvian",
9078,
"bat-eas",
"Latn",
strip_diacritics = {
-- This attempts to convert vowels with tone marks to vowels either with or without macrons. Specifically, there should be no macrons if the vowel is part of a diphthong (including resonant diphthongs such pìrksts -> pirksts not #pīrksts). What we do is first convert the vowel + tone mark to a vowel + tilde in a decomposed fashion, then remove the tilde in diphthongs, then convert the remaining vowel + tilde sequences to macroned vowels, then delete any other tilde. We leave already-macroned vowels alone: Both e.g. ar and ār occur before consonants. FIXME: This still might not be sufficient.
from = {"([Ee])" .. c.cedilla, "[" .. c.grave .. c.circ .. c.tilde .."]", "([aAeEiIoOuU])" .. c.tilde .."?([lrnmuiLRNMUI])" .. c.tilde .. "?([^aAeEiIoOuU])", "([aAeEiIoOuU])" .. c.tilde .."?([lrnmuiLRNMUI])" .. c.tilde .."?$", "([iI])" .. c.tilde .. "?([eE])" .. c.tilde .. "?", "([aAeEiIuU])" .. c.tilde, c.tilde},
to = {"%1", c.tilde, "%1%2%3", "%1%2", "%1%2", "%1" .. c.macron}
},
sort_key = {
from = {"ā", "č", "ē", "ģ", "ī", "ķ", "ļ", "ņ", "š", "ū", "ž"},
to = {"a" .. p[1], "c" .. p[1], "e" .. p[1], "g" .. p[1], "i" .. p[1], "k" .. p[1], "l" .. p[1], "n" .. p[1], "s" .. p[1], "u" .. p[1], "z" .. p[1]}
},
standard_chars = "AaĀāBbCcČčDdEeĒēFfGgĢģHhIiĪīJjKkĶķLlĻļMmNnŅņOoPpRrSsŠšTtUuŪūVvZzŽž" .. c.punc,
}
m["mg"] = {
"Malagasy",
7930,
"poz-bre",
"Latn, Arab",
}
m["mh"] = {
"Marshallese",
36280,
"poz-mic",
"Latn",
sort_key = {
from = {"ā", "ļ", "m̧", "ņ", "n̄", "o̧", "ō", "ū"},
to = {"a" .. p[1], "l" .. p[1], "m" .. p[1], "n" .. p[1], "n" .. p[2], "o" .. p[1], "o" .. p[2], "u" .. p[1]}
},
}
m["mi"] = {
"Māori",
36451,
"poz-pep",
"Latn",
sort_key = {
remove_diacritics = c.macron,
from = {"ng", "wh"},
to = {"n" .. p[1], "w" .. p[1]}
},
}
m["mk"] = {
"Macedonian",
9296,
"zls",
"Cyrl, Polyt",
ancestors = "cu",
translit = {
Cyrl = "mk-translit",
-- FIXME: formerly no translit specified for Polyt; unclear if the default [[Module:grc-translit]] is
-- acceptable, so we disable it for now
Polyt = false,
},
strip_diacritics = {
Cyrl = {
remove_diacritics = c.acute,
remove_exceptions = {"Ѓ", "ѓ", "Ќ", "ќ"}
},
},
sort_key = {
Cyrl = {
remove_diacritics = c.grave,
remove_exceptions = {"ѓ", "ќ"},
from = {"ѓ", "ѕ", "ј", "љ", "њ", "ќ", "џ"},
to = {"д" .. p[1], "з" .. p[1], "и" .. p[1], "л" .. p[1], "н" .. p[1], "т" .. p[1], "ч" .. p[1]}
},
},
-- Polyt display_text, strip_diacritics, sort_key in [[Module:scripts/data]]
standard_chars = {
Cyrl = "АаБбВвГгДдЃѓЕеЖжЗзЅѕИиЈјКкЛлЉљМмНнЊњОоПпРрСсТтЌќУуФфХхЦцЧчЏџШш",
c.punc
},
}
m["ml"] = {
"Malayalam",
36236,
"dra-mal",
"Mlym",
override_translit = true,
-- Mlym translit in [[Module:scripts/data]]
}
m["mn"] = {
"Mongolian",
9246,
"xgn-cen",
"Cyrl, Mong, Latn, Brai",
ancestors = "cmg",
translit = {
Cyrl = "mn-translit",
-- Mong translit in [[Module:scripts/data]]
},
override_translit = true,
-- Mong display_text and strip_diacritics in [[Module:scripts/data]]
strip_diacritics = {
Cyrl = {remove_diacritics = c.grave .. c.acute},
},
sort_key = {
Cyrl = {
remove_diacritics = c.grave,
from = {"ё", "ө", "ү"},
to = {"е" .. p[1], "о" .. p[1], "у" .. p[1]}
},
},
standard_chars = {
Cyrl = "АаБбВвГгДдЕеЁёЖжЗзИиЙйЛлМмНнОоӨөРрСсТтУуҮүХхЦцЧчШшЫыЬьЭэЮюЯя—",
Brai = c.braille,
c.punc
},
}
-- "mo" is treated as "ro", see [[WT:LT]]
m["mr"] = {
"Marathi",
1571,
"inc-sou",
"Deva, Modi",
ancestors = "omr",
translit = {
Deva = "mr-translit",
Modi = "mr-Modi-translit",
},
strip_diacritics = {
Deva = {
from = {"च़", "ज़", "झ़"},
to = {"च", "ज", "झ"}
},
},
}
m["ms"] = {
"Malay",
9237,
"poz-mly",
"Latn, ms-Arab",
ancestors = "ms-cla",
standard_chars = {
Latn = "AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz",
c.punc
},
}
m["mt"] = {
"Maltese",
9166,
"sem-arb",
"Latn",
display_text = {
from = {"'"},
to = {"’"}
},
strip_diacritics = {
from = {"’"},
to = {"'"},
},
ancestors = "sqr",
sort_key = {
from = {
"ċ", "ġ", "ż", -- Convert into PUA so that decomposed form does not get caught by the next step.
"([cgz])", -- Ensure "c" comes after "ċ", "g" comes after "ġ" and "z" comes after "ż".
"g" .. p[1] .. "ħ", -- "għ" after initial conversion of "g".
p[3], p[4], "ħ", "ie", p[5] -- Convert "ċ", "ġ", "ħ", "ie", "ż" into final output.
},
to = {
p[3], p[4], p[5],
"%1" .. p[1],
"g" .. p[2],
"c", "g", "h" .. p[1], "i" .. p[1], "z"
}
},
}
m["my"] = {
"Burmese",
9228,
"tbq-brm",
"Mymr",
ancestors = "obr",
translit = "my-translit",
override_translit = true,
sort_key = {
from = {"ျ", "ြ", "ွ", "ှ", "ဿ"},
to = {"္ယ", "္ရ", "္ဝ", "္ဟ", "သ္သ"}
},
}
m["na"] = {
"Nauruan",
13307,
"poz-mic",
"Latn",
}
m["nb"] = {
"Norwegian Bokmål",
25167,
"gmq",
"Latn",
wikimedia_codes = "no",
ancestors = "gmq-mno, da", -- da as an (but not the) ancestor of nb was agreed on - do not change without discussion
sort_key = s["no-sortkey"],
standard_chars = s["no-standardchars"],
}
m["nd"] = {
"Northern Ndebele",
35613,
"bnt-ngu",
"Latn",
strip_diacritics = {remove_diacritics = c.grave .. c.acute .. c.circ .. c.macron .. c.caron},
}
m["ne"] = {
"Nepali",
33823,
"inc-pah",
"Deva, Newa",
translit = {
Deva = "ne-translit"
},
}
m["ng"] = {
"Ndonga",
33900,
"bnt-ova",
"Latn",
}
m["nl"] = {
"Dutch",
7411,
"gmw-frk",
"Latn, Brai",
ancestors = "dum",
sort_key = {
Latn = {remove_diacritics = c.grave .. c.acute .. c.circ .. c.tilde .. c.diaer .. c.ringabove .. c.cedilla .. "'"},
},
standard_chars = {
Latn = "AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZzÄäËëÏïÖöÜü",
Brai = c.braille,
c.punc
},
}
m["nn"] = {
"Norwegian Nynorsk",
25164,
"gmq-wes",
"Latn",
ancestors = "gmq-mno",
strip_diacritics = {
remove_diacritics = c.grave .. c.acute,
},
sort_key = s["no-sortkey"],
standard_chars = s["no-standardchars"],
}
m["no"] = {
"Norwegian",
9043,
"gmq-wes",
"Latn",
ancestors = "gmq-mno",
sort_key = s["no-sortkey"],
standard_chars = s["no-standardchars"],
}
m["nr"] = {
"Southern Ndebele",
36785,
"bnt-ngu",
"Latn",
strip_diacritics = {remove_diacritics = c.grave .. c.acute .. c.circ .. c.macron .. c.caron},
}
m["nv"] = {
"Navajo",
13310,
"apa",
"Latn, Brai",
sort_key = {
remove_diacritics = c.acute .. c.ogonek,
from = {
"chʼ", "tłʼ", "tsʼ", -- 3 chars
"ch", "dl", "dz", "gh", "hw", "kʼ", "kw", "sh", "tł", "ts", "zh", -- 2 chars
"ł", "ʼ" -- 1 char
},
to = {
"c" .. p[2], "t" .. p[2], "t" .. p[4],
"c" .. p[1], "d" .. p[1], "d" .. p[2], "g" .. p[1], "h" .. p[1], "k" .. p[1], "k" .. p[2], "s" .. p[1], "t" .. p[1], "t" .. p[3], "z" .. p[1],
"l" .. p[1], "z" .. p[2]
}
},
}
m["ny"] = {
"Chichewa",
33273,
"bnt-nys",
"Latn",
strip_diacritics = {remove_diacritics = c.acute .. c.circ},
sort_key = {
from = {"ng'"},
to = {"ng"}
},
}
m["oc"] = {
"Occitan",
14185,
"roa-ocr",
"Latn, Hebr",
ancestors = "pro",
sort_key = {
Latn = {
remove_diacritics = c.grave .. c.acute .. c.diaer .. c.cedilla,
from = {"([lns])·h"},
to = {"%1h"}
},
},
-- Hebr display_text, strip_diacritics, sort_key in [[Module:scripts/data]]
}
m["oj"] = {
"Ojibwe",
33875,
"alg",
"Cans, Latn",
sort_key = {
Latn = {
from = {"aa", "ʼ", "ii", "oo", "sh", "zh"},
to = {"a" .. p[1], "h" .. p[1], "i" .. p[1], "o" .. p[1], "s" .. p[1], "z" .. p[1]}
},
},
}
m["om"] = {
"Oromo",
33864,
"cus-eas",
"Latn, Ethi",
}
m["or"] = {
"Odia",
33810,
"inc-eas",
"Orya",
ancestors = "inc-mor",
translit = "or-translit",
}
m["os"] = {
"Ossetian",
33968,
"xsc-sar",
"Cyrl, Geor, Latn",
ancestors = "oos",
translit = {
Cyrl = "os-translit",
-- Geor translit in [[Module:scripts/data]]
},
override_translit = true,
display_text = {
Cyrl = {
from = {"æ"},
to = {"ӕ"}
},
Latn = {
from = {"ӕ"},
to = {"æ"}
},
},
strip_diacritics = {
Cyrl = {
remove_diacritics = c.grave .. c.acute,
from = {"æ"},
to = {"ӕ"}
},
Latn = {
from = {"ӕ"},
to = {"æ"}
},
},
sort_key = {
Cyrl = {
from = {"ӕ", "гъ", "дж", "дз", "ё", "къ", "пъ", "тъ", "хъ", "цъ", "чъ"},
to = {"а" .. p[1], "г" .. p[1], "д" .. p[1], "д" .. p[2], "е" .. p[1], "к" .. p[1], "п" .. p[1], "т" .. p[1], "х" .. p[1], "ц" .. p[1], "ч" .. p[1]}
},
},
}
m["pa"] = {
"Punjabi",
58635,
"inc-pan",
"Guru, pa-Arab",
translit = {
Guru = "Guru-translit",
["pa-Arab"] = "pa-Arab-translit",
},
strip_diacritics = {
["pa-Arab"] = {
remove_diacritics = c.fathatan .. c.dammatan .. c.kasratan .. c.fatha .. c.damma .. c.kasra .. c.shadda .. c.sukun .. c.nunghunna,
from = {"ݨ", "ࣇ"},
to = {"ن", "ل"}
},
},
}
m["pi"] = {
"Pali",
36727,
"inc-mid",
"Latn, Brah, Deva, Beng, Sinh, Mymr, Thai, Lana, Laoo, Khmr, Cakm", --and also Khom
ancestors = "sa",
translit = {
-- Brah translit in [[Module:scripts/data]]
Deva = "sa-translit",
Beng = "pi-translit",
Sinh = "si-translit",
Mymr = "pi-translit",
Thai = "pi-translit",
Lana = "pi-translit",
Laoo = "pi-translit",
Khmr = "pi-translit",
Cakm = "Cakm-translit",
},
strip_diacritics = {
Thai = {
from = {"ึ", u(0xF700), u(0xF70F)}, -- FIXME: Not clear what's going on with the PUA characters here.
to = {"ิํ", "ฐ", "ญ"}
},
Mymr = {
remove_diacritics = c.VS01,
},
},
sort_key = { -- FIXME: This needs to be converted into the current standardized format.
from = {"ā", "ī", "ū", "ḍ", "ḷ", "m[" .. c.dotabove .. c.dotbelow .. "]", "ṅ", "ñ", "ṇ", "ṭ", "ॐ", "([เโ])([ก-ฮ])", "([ເໂ])([ກ-ຮ])", "ᩔ", "ᩕ", "ᩖ", "ᩘ", "([ᨭ-ᨱ])ᩛ", "([ᨷ-ᨾ])ᩛ", "ᩤ", u(0xFE00), u(0x200D)},
to = {"a~", "i~", "u~", "d~", "l~", "m~", "n~", "n~~", "n~~~", "t~", "ओँ", "%2%1", "%2%1", "ᩈ᩠ᩈ", "᩠ᩁ", "᩠ᩃ", "ᨦ᩠", "%1᩠ᨮ", "%1᩠ᨻ", "ᩣ"}
},
}
m["pl"] = {
"Polish",
809,
"zlw-lch",
"Latn",
ancestors = "zlw-mpl",
sort_key = {
from = {"ą", "ć", "ę", "ł", "ń", "ó", "ś", "ź", "ż"},
to = {"a" .. p[1], "c" .. p[1], "e" .. p[1], "l" .. p[1], "n" .. p[1], "o" .. p[1], "s" .. p[1], "z" .. p[1], "z" .. p[2]}
},
standard_chars = "AaĄąBbCcĆćDdEeĘęFfGgHhIiJjKkLlŁłMmNnŃńOoÓóPpRrSsŚśTtUuWwYyZzŹźŻż" .. c.punc,
}
m["ps"] = {
"Pashto",
58680,
"ira-pat",
"ps-Arab",
strip_diacritics = {remove_diacritics = c.fathatan .. c.dammatan .. c.kasratan .. c.fatha .. c.damma .. c.kasra .. c.shadda .. c.sukun .. c.zwarakay .. c.superalef},
}
m["pt"] = {
"Portuguese",
5146,
"roa-gap",
"Latn, Brai",
sort_key = {
Latn = {
remove_diacritics = c.grave .. c.acute .. c.circ .. c.tilde .. c.macron .. c.diaer .. c.cedilla,
from = {"ª", "æ", "º", "œ"},
to = {"a", "ae", "o", "oe"}
},
},
standard_chars = {
Latn = "AaÁáÂâÃãBbCcÇçDdEeÉéÊêFfGgHhIiÍíJjLlMmNnOoÓóÔôÕõPpQqRrSsTtUuÚúVvXxZz",
Brai = c.braille,
c.punc
},
}
m["qu"] = {
"Quechua",
5218,
"qwe",
"Latn",
}
m["rm"] = {
"Romansh",
13199,
"roa-rhe",
ancestors = "rm-old",
"Latn",
sort_key = {remove_diacritics = c.grave .. c.acute .. c.circ .. c.diaer .. c.small_e},
}
m["ro"] = {
"Romanian",
7913,
"roa-eas",
"Latn, Cyrl, Cyrs",
translit = {
Cyrl = "ro-translit"
},
sort_key = {
Latn = {
remove_diacritics = c.grave .. c.acute,
from = {"ă", "â", "î", "ș", "ț"},
to = {"a" .. p[1], "a" .. p[2], "i" .. p[1], "s" .. p[1], "t" .. p[1]}
},
Cyrl = {
from = {"ӂ"},
to = {"ж" .. p[1]}
},
},
-- Cyrs strip_diacritics, sort_key in [[Module:scripts/data]]; presumably not present
standard_chars = {
Latn = "AaĂăÂâBbCcDdEeFfGgHhIiÎîJjLlMmNnOoPpRrSsȘșTtȚțUuVvXxZz",
Cyrl = "АаБбВвГгДдЕеЖжӁӂЗзИиЙйКкЛлМмНнОоПпРрСсТтУуФфХхЦцЧчШшЫыЬьЭэЮюЯя",
c.punc
},
}
m["ru"] = {
"Russian",
7737,
"zle",
"Cyrl, Brai",
ancestors = "zle-mru",
translit = {
Cyrl = "ru-translit"
},
display_text = {
Cyrl = {
from = {"'"},
to = {"’"}
},
},
strip_diacritics = {
Cyrl = {
remove_diacritics = c.grave .. c.acute .. c.diaer,
remove_exceptions = {"Ё", "ё", "Ѣ̈", "ѣ̈", "Я̈", "я̈"},
from = {"’"},
to = {"'"},
},
},
sort_key = {
Cyrl = {
remove_diacritics = c.grave .. c.acute .. c.diaer,
from = {
"і", "ѣ", "ѳ", "ѵ"
},
to = {
"и" .. p[1], "ь" .. p[1], "я" .. p[2], "я" .. p[3]
}
},
},
standard_chars = {
Cyrl = "АаБбВвГгДдЕеЁёЖжЗзИиЙйКкЛлМмНнОоПпРрСсТтУуФфХхЦцЧчШшЩщЪъЫыЬьЭэЮюЯя—",
Brai = c.braille,
(c.punc:gsub("'", "")) -- Exclude apostrophe.
},
}
m["rw"] = {
"Rwanda-Rundi",
3217514,
"bnt-glb",
"Latn",
strip_diacritics = {remove_diacritics = c.acute .. c.circ .. c.macron .. c.caron},
}
m["sa"] = {
"Sanskrit",
11059,
"inc",
"as-Beng, Bali, Beng, Bhks, Brah, Mymr, xwo-Mong, Deva, Gujr, Guru, Gran, Hani, Java, Kthi, Knda, Kawi, Khar, Khmr, Laoo, Mlym, mnc-Mong, Marc, Modi, Mong, Nand, Newa, Orya, Phag, Ranj, Saur, Shrd, Sidd, Sinh, Soyo, Lana, Takr, Taml, Tang, Telu, Thai, Tibt, Tutg, Tirh, Zanb", --and also Khom; script codes sorted by canonical name rather than code for [[MOD:sa-convert]]
translit = {
Beng = "sa-Beng-translit",
["as-Beng"] = "sa-Beng-translit",
-- Brah translit in [[Module:scripts/data]]
Deva = "sa-translit",
Gujr = "sa-Gujr-translit",
Guru = "sa-Guru-translit",
Java = "sa-Java-translit",
Kthi = "sa-Kthi-translit",
Khmr = "pi-translit",
Knda = "sa-Knda-translit",
Lana = "pi-translit",
Laoo = "pi-translit",
Mlym = "sa-Mlym-translit",
Modi = "sa-Modi-translit",
-- Mong, mnc-Mong, xwo-Mong translit in [[Module:scripts/data]]
-- NOTE: Formerly used xal-translit for transliterating xwo-Mong but that only handles Cyrillic; it has
-- code to transliterate xwo-Mong but it's broken so I've replaced it with the default xwo-translit.
Mymr = "pi-translit",
Orya = "sa-Orya-translit",
-- Shrd translit in [[Module:scripts/data]]
-- Sidd translit in [[Module:scripts/data]]
Sinh = "si-translit",
Taml = "sa-Taml-translit",
Telu = "sa-Telu-translit",
Thai = "pi-translit",
-- Tibt translit in [[Module:scripts/data]]
},
-- Mong display_text and strip_diacritics in [[Module:scripts/data]]
-- Tibt display_text, strip_diacritics, sort_key in [[Module:scripts/data]]
strip_diacritics = {
Deva = s["sa-Deva-stripdiacritics"],
Mymr = {
remove_diacritics = c.VS01,
},
Thai = {
from = {"ึ", u(0xF700), u(0xF70F)}, -- FIXME: Not clear what's going on with the PUA characters here.
to = {"ิํ", "ฐ", "ญ"}
},
},
sort_key = {
Deva = s["sa-Deva-stripdiacritics"], -- until we have a proper Sanskrit sorting algorithm.
Lana = { -- Tai Tham
from = {"ᩔ", "ᩕ", "ᩖ", "ᩘ", "([ᨭ-ᨱ])ᩛ", "([ᨷ-ᨾ])ᩛ", "ᩤ"},
to = {"ᩈ᩠ᩈ", "᩠ᩁ", "᩠ᩃ", "ᨦ᩠", "%1᩠ᨮ", "%1᩠ᨻ", "ᩣ"},
},
Laoo = "Laoo-sortkey",
Latn = {
from = {"ā", "ī", "ū", "ḍ", "ḷ", "ḹ", "m[" .. c.dotabove .. c.dotbelow .. "]", "ṅ", "ñ", "ṇ", "ṛ", "ṝ", "ś", "ṣ", "ṭ"},
to = {"a~", "i~", "u~", "d~", "l~", "l~~", "m~", "n~", "n~~", "n~~~", "r~", "r~~", "s~", "s~~", "t~"},
},
Mymr = {
remove_diacritics = c.VS01,
},
Thai = "Thai-sortkey",
-- FIXME: The previous sort key which mixed all scripts removed ZWJ; I don't know which script(s) this was
-- intended for and there are no other languages which remove it in the sort key AFAIK. If it needs to be
-- removed, specify the script(s) it needs to be removed under or add handling for the "all" script that applies
-- regardless of script.
--all = {
-- remove_diacritics = c.ZWJ,
--},
},
}
m["sc"] = {
"Sardinian",
33976,
"roa-sou",
"Latn",
ancestors = "sc-old",
}
m["sd"] = {
"Sindhi",
33997,
"inc-snd",
"sd-Arab, Deva, Sind, Khoj",
translit = {
Sind = "Sind-translit",
["sd-Arab"] = "sd-Arab-translit"
},
strip_diacritics = {
["sd-Arab"] = {
remove_diacritics = c.kashida .. c.fathatan .. c.dammatan .. c.kasratan .. c.fatha .. c.damma .. c.kasra .. c.shadda .. c.sukun .. c.superalef,
from = {"ٱ"},
to = {"ا"}
},
},
}
m["se"] = {
"Northern Sami",
33947,
"smi",
"Latn",
display_text = {
from = {"'"},
to = {"ˈ"}
},
strip_diacritics = {remove_diacritics = c.macron .. c.dotbelow .. "'ˈ"},
sort_key = {
from = {"á", "č", "đ", "ŋ", "š", "ŧ", "ž"},
to = {"a" .. p[1], "c" .. p[1], "d" .. p[1], "n" .. p[1], "s" .. p[1], "t" .. p[1], "z" .. p[1]}
},
standard_chars = "AaÁáBbCcČčDdĐđEeFfGgHhIiJjKkLlMmNnŊŋOoPpRrSsŠšTtŦŧUuVvZzŽž" .. c.punc,
}
m["sg"] = {
"Sango",
33954,
"crp",
"Latn",
ancestors = "ngb",
}
m["sh"] = {
"Serbo-Croatian",
9301,
"zls",
"Latn, Cyrl, Glag, Arab",
ietf_subtag = "hbs", -- ISO 639-3 code, since "sh" is deprecated from ISO 639-1
wikimedia_codes = "sh, bs, hr, sr",
strip_diacritics = {
Latn = {
remove_diacritics = c.grave .. c.acute .. c.tilde .. c.macron .. c.dgrave .. c.invbreve,
remove_exceptions = {"Ć", "ć", "Ś", "ś", "Ź", "ź"}
},
Cyrl = {
remove_diacritics = c.grave .. c.acute .. c.tilde .. c.macron .. c.dgrave .. c.invbreve,
remove_exceptions = {"З́", "з́", "С́", "с́"}
},
},
sort_key = {
Latn = {
remove_diacritics = c.grave .. c.acute .. c.tilde .. c.macron .. c.dgrave .. c.invbreve,
remove_exceptions = {"ć", "ś", "ź"},
from = {"č", "ć", "dž", "đ", "lj", "nj", "š", "ś", "ž", "ź"},
to = {"c" .. p[1], "c" .. p[2], "d" .. p[1], "d" .. p[2], "l" .. p[1], "n" .. p[1], "s" .. p[1], "s" .. p[2], "z" .. p[1], "z" .. p[2]}
},
Cyrl = {
remove_diacritics = c.grave .. c.acute .. c.tilde .. c.macron .. c.dgrave .. c.invbreve,
remove_exceptions = {"з́", "с́"},
from = {"ђ", "з́", "ј", "љ", "њ", "с́", "ћ", "џ"},
to = {"д" .. p[1], "з" .. p[1], "и" .. p[1], "л" .. p[1], "н" .. p[1], "с" .. p[1], "т" .. p[1], "ч" .. p[1]}
},
},
standard_chars = {
Latn = "AaBbCcČčĆćDdĐđEeFfGgHhIiJjKkLlMmNnOoPpRrSsŠšTtUuVvZzŽž",
Cyrl = "АаБбВвГгДдЂђЕеЖжЗзИиЈјКкЛлЉљМмНнЊњОоПпРрСсТтЋћУуФфХхЦцЧчЏџШш",
c.punc
},
}
m["si"] = {
"Sinhalese",
13267,
"inc-ins",
"Sinh",
translit = "si-translit",
override_translit = true,
}
m["sk"] = {
"Slovak",
9058,
"zlw",
"Latn",
ancestors = "zlw-osk",
sort_key = {remove_diacritics = c.acute .. c.circ .. c.diaer .. c.caron},
standard_chars = "AaÁáÄäBbCcČčDdĎďEeÉéFfGgHhIiÍíJjKkLlĹ弾MmNnŇňOoÓóÔôPpRrŔŕSsŠšTtŤťUuÚúVvYyÝýZzŽž" .. c.punc,
}
m["sl"] = {
"Slovene",
9063,
"zls",
"Latn",
strip_diacritics = {
remove_diacritics = c.grave .. c.acute .. c.circ .. c.macron .. c.dgrave .. c.invbreve .. c.dotbelow,
remove_exceptions = {"Ć", "ć", "Ǵ", "ǵ", "Ś", "ś", "Ź", "ź"},
from = {"Ə", "ə", "Ł", "ł"},
to = {"E", "e", "L", "l"},
},
sort_key = {
remove_diacritics = c.grave .. c.acute .. c.circ .. c.tilde .. c.macron .. c.dotabove .. c.ringabove .. c.dgrave .. c.invbreve .. c.dotbelow .. c.ringbelow .. c.ogonek,
remove_exceptions = {"ć", "ǵ", "ś", "ź"},
from = {"ä", "č", "ć", "đ", "ə", "ë", "ǧ", "ǵ", "ï", "ł", "ö", "š", "ś", "ü", "ž", "ź"},
to = {"a" .. p[1], "c" .. p[1], "c" .. p[2], "d" .. p[1], "e", "e" .. p[1], "g" .. p[1], "g" .. p[2], "i" .. p[1], "l", "o" .. p[1], "s" .. p[1], "s" .. p[2], "u" .. p[1], "z" .. p[1], "z" .. p[2]},
},
standard_chars = "AaBbCcČčDdEeFfGgHhIiJjKkLlMmNnOoPpRrSsŠšTtUuVvZzŽž" .. c.punc,
}
m["sm"] = {
"Samoan",
34011,
"poz-pnp",
"Latn",
}
m["sn"] = {
"Shona",
34004,
"bnt-sho",
"Latn",
strip_diacritics = {remove_diacritics = c.acute},
}
m["so"] = {
"Somali",
13275,
"cus-som",
"Latn, Arab, Osma",
strip_diacritics = {
Latn = {remove_diacritics = c.grave .. c.acute .. c.circ}
},
}
m["sq"] = {
"Albanian",
8748,
"sqj",
"Latn, Grek, ota-Arab, Elba, Todr, Vith",
translit = {
Elba = "Elba-translit",
Vith = "Vith-translit",
},
-- Grek display_text, strip_diacritics, sort_key in [[Module:scripts/data]]
strip_diacritics = {
Latn = {
remove_diacritics = c.acute .. c.circ .. c.macron,
from = {'^[ie] (%w)', '^të (%w)'}, to = {'%1', '%1'},
},
},
sort_key = {
Latn = {
remove_diacritics = c.acute .. c.circ .. c.macron .. c.tilde .. c.breve .. c.caron,
from = {'^[ie] (%w)', '^të (%w)', 'ç', 'dh', 'ë', 'gj', 'll', 'nj', 'rr', 'sh', 'th', 'xh', 'zh'},
to = {'%1', '%1', 'c'..p[1], 'd'..p[1], 'e'..p[1], 'g'..p[1], 'l'..p[1], 'n'..p[1], 'r'..p[1], 's'..p[1], 't'..p[1], 'x'..p[1], 'z'..p[1]},
}
-- TODO: Grek if the default sort key is unsuitable
},
standard_chars = {
Latn = "AaBbCcÇçDdEeËëFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvXxYyZz",
c.punc
},
}
m["ss"] = {
"Swazi",
34014,
"bnt-ngu",
"Latn",
strip_diacritics = {remove_diacritics = c.grave .. c.acute .. c.circ .. c.macron .. c.caron},
}
m["st"] = {
"Sotho",
34340,
"bnt-sts",
"Latn",
strip_diacritics = {remove_diacritics = c.grave .. c.acute .. c.circ .. c.macron .. c.caron},
}
m["su"] = {
"Sundanese",
34002,
"poz-msa",
"Latn, Sund, Arab",
ancestors = "osn",
translit = {
Sund = "Sund-translit"
},
}
m["sv"] = {
"Swedish",
9027,
"gmq-eas",
"Latn",
ancestors = "gmq-osw-lat",
sort_key = {
remove_diacritics = c.grave .. c.acute .. c.circ .. c.tilde .. c.macron .. c.dacute .. c.caron .. c.cedilla .. "':",
remove_exceptions = {"å"},
from = {"ø", "æ", "œ", "ß", "å", "aͤ", "oͤ"},
to = {"ö", "ae", "oe", "ss", "z" .. p[1], "ä", "ö"}
},
standard_chars = "AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpRrSsTtUuVvXxYyÅåÄäÖö" .. c.punc,
}
m["sw"] = {
"Swahili",
7838,
"bnt-swh",
"Latn, Arab",
sort_key = {
Latn = {
from = {"ng'"},
to = {"ng" .. p[1]}
},
},
}
m["ta"] = {
"Tamil",
5885,
"dra-tam",
"Taml",
ancestors = "ta-mid",
translit = "ta-translit",
override_translit = true,
}
m["te"] = {
"Telugu",
8097,
"dra-tel",
"Telu",
translit = "te-translit",
override_translit = true,
}
m["tg"] = {
"Tajik",
9260,
"ira-swi",
"Cyrl, fa-Arab, Latn",
ancestors = "fa-cls",
translit = {
Cyrl = "tg-translit"
},
override_translit = true,
strip_diacritics = {
Cyrl = s["tg-stripdiacritics"],
Latn = s["tg-stripdiacritics"],
},
sort_key = {
Cyrl = {
from = {"ғ", "ё", "ӣ", "қ", "ӯ", "ҳ", "ҷ"},
to = {"г" .. p[1], "е" .. p[1], "и" .. p[1], "к" .. p[1], "у" .. p[1], "х" .. p[1], "ч" .. p[1]}
},
},
}
m["th"] = {
"Thai",
9217,
"tai-swe",
"Thai, Khomt, Brai",
translit = {
Thai = "th-translit"
},
sort_key = {
Thai = "Thai-sortkey"
},
}
m["ti"] = {
"Tigrinya",
34124,
"sem-eth",
"Ethi",
translit = "Ethi-translit",
}
m["tk"] = {
"Turkmen",
9267,
"trk-ogz",
"Latn, Cyrl, Arab",
strip_diacritics = {
Latn = s["tk-stripdiacritics"],
Cyrl = s["tk-stripdiacritics"],
},
sort_key = {
Latn = {
from = {"ç", "ä", "ž", "ň", "ö", "ş", "ü", "ý"},
to = {"c" .. p[1], "e" .. p[1], "j" .. p[1], "n" .. p[1], "o" .. p[1], "s" .. p[1], "u" .. p[1], "y" .. p[1]}
},
Cyrl = {
from = {"ё", "җ", "ң", "ө", "ү", "ә"},
to = {"е" .. p[1], "ж" .. p[1], "н" .. p[1], "о" .. p[1], "у" .. p[1], "э" .. p[1]}
},
},
ancestors = "trk-eog",
}
m["tl"] = {
"Tagalog",
34057,
"phi",
"Latn, Tglg",
translit = {
Tglg = "tl-translit"
},
override_translit = true,
strip_diacritics = {
Latn = {remove_diacritics = c.grave .. c.acute .. c.circ}
},
standard_chars = {
Latn = "AaBbKkDdEeGgHhIiLlMmNnOoPpRrSsTtUuWwYy",
c.punc
},
sort_key = {
Latn = "tl-sortkey",
},
}
m["tn"] = {
"Tswana",
34137,
"bnt-sts",
"Latn",
}
m["to"] = {
"Tongan",
34094,
"poz-ton",
"Latn",
strip_diacritics = {remove_diacritics = c.acute},
sort_key = {remove_diacritics = c.macron},
}
m["tr"] = {
"Turkish",
256,
"trk-ogz",
"Latn",
ancestors = "ota",
dotted_dotless_i = true,
sort_key = {
from = {
-- Ignore circumflex, but account for capital Î wrongly becoming ı + circ due to dotted dotless I logic.
"ı" .. c.circ, c.circ,
"i", -- Ensure "i" comes after "ı".
"ç", "ğ", "ı", "ö", "ş", "ü"
},
to = {
"i", "",
"i" .. p[1],
"c" .. p[1], "g" .. p[1], "i", "o" .. p[1], "s" .. p[1], "u" .. p[1]
}
},
standard_chars = "AaÂâBbCcÇçDdEeFfGgĞğHhIıİiÎîJjKkLlMmNnOoÖöPpRrSsŞşTtUuÛûÜüVvYyZz" .. c.punc,
}
m["ts"] = {
"Tsonga",
34327,
"bnt-tsr",
"Latn",
}
m["tt"] = {
"Tatar",
25285,
"trk-kbu",
"Cyrl, Latn, tt-Arab",
translit = {
Cyrl = "tt-translit",
["tt-Arab"] = "tt-translit"
},
--override_translit = true, -- enable override until Module code can detect Russian loans such as [[аэропорт]]
dotted_dotless_i = true,
sort_key = {
Cyrl = {
from = {"ә", "ў", "ғ", "ё", "җ", "қ", "ң", "ө", "ү", "һ"},
to = {"а" .. p[1], "в" .. p[1], "г" .. p[1], "е" .. p[1], "ж" .. p[1], "к" .. p[1], "н" .. p[1], "о" .. p[1], "у" .. p[1], "х" .. p[1]}
},
Latn = {
from = {
"i", -- Ensure "i" comes after "ı".
"ä", "ə", "ç", "ğ", "ı", "ñ", "ŋ", "ö", "ɵ", "ş", "ü"
},
to = {
"i" .. p[1],
"a" .. p[1], "a" .. p[2], "c" .. p[1], "g" .. p[1], "i", "n" .. p[1], "n" .. p[2], "o" .. p[1], "o" .. p[2], "s" .. p[1], "u" .. p[1]
}
},
},
}
-- "tw" is treated as "ak", see [[WT:LT]]
m["ty"] = {
"Tahitian",
34128,
"poz-pep",
"Latn",
}
m["ug"] = {
"Uyghur",
13263,
"trk-kar",
"ug-Arab, Latn, Cyrl",
ancestors = "chg",
translit = {
["ug-Arab"] = "ug-translit",
Cyrl = "ug-translit",
},
override_translit = true,
}
m["uk"] = {
"Ukrainian",
8798,
"zle",
"Cyrl",
ancestors = "zle-muk",
translit = "uk-translit",
strip_diacritics = {remove_diacritics = c.grave .. c.acute},
sort_key = {
remove_diacritics = c.grave .. c.acute,
from = {
"ї", -- 2 chars
"ґ", "є", "і" -- 1 char
},
to = {
"и" .. p[2],
"г" .. p[1], "е" .. p[1], "и" .. p[1]
}
},
standard_chars = "АаБбВвГгДдЕеЄєЖжЗзИиІіЇїЙйКкЛлМмНнОоПпРрСсТтУуФфХхЦцЧчШшЩщЬьЮюЯя" .. c.punc:gsub("'", ""), -- Exclude apostrophe.
}
m["ur"] = {
"Urdu",
1617,
"inc-hnd",
"ur-Arab, Hebr",
translit = {
["ur-Arab"] = "ur-translit"
},
strip_diacritics = {
["ur-Arab"] = {
-- character "ۂ" code U+06C2 to "ه" and "هٔ" (U+0647 + U+0654) to "ه"; hamzatu l-waṣli to a regular alif
from = {"هٔ", "ۂ", "ٱ"},
to = {"ہ", "ہ", "ا"},
remove_diacritics = c.fathatan .. c.dammatan .. c.kasratan .. c.fatha .. c.damma .. c.kasra .. c.shadda .. c.sukun .. c.nunghunna .. c.superalef
},
},
-- Hebr display_text, strip_diacritics, sort_key in [[Module:scripts/data]]
standard_chars = {
["ur-Arab"] = "ایببپتثجچحخدذرزژسشصضطظعغفقکگلࣇڷمنݨوؤہھئٹڈڑآے",
c.punc,
},
}
m["uz"] = {
"Uzbek",
9264,
"trk-kar",
"Latn, Cyrl, fa-Arab",
ancestors = "chg",
translit = {
Cyrl = "uz-translit"
},
sort_key = {
Latn = {
from = {"oʻ", "gʻ", "sh", "ch", "ng"},
to = {"z" .. p[1], "z" .. p[2], "z" .. p[3], "z" .. p[4], "z" .. p[5]}
},
Cyrl = {
from = {"ё", "ў", "қ", "ғ", "ҳ"},
to = {"е" .. p[1], "я" .. p[1], "я" .. p[2], "я" .. p[3], "я" .. p[4]}
},
},
strip_diacritics = {
["fa-Arab"] = "ar-stripdiacritics",
},
}
m["ve"] = {
"Venda",
32704,
"bnt-bso",
"Latn",
}
m["vi"] = {
"Vietnamese",
9199,
"mkh-vie",
"Latn, Hani",
ancestors = "mkh-mvi",
sort_key = {
Latn = "vi-sortkey",
Hani = "Hani-sortkey",
},
}
m["vo"] = {
"Volapük",
36986,
"art",
"Latn",
}
m["wa"] = {
"Walloon",
34219,
"roa-oil",
"Latn",
sort_key = s["roa-oil-sortkey"],
}
m["wo"] = {
"Wolof",
34257,
"alv-fwo",
"Latn, Arab, Gara",
}
m["xh"] = {
"Xhosa",
13218,
"bnt-ngu",
"Latn",
strip_diacritics = {remove_diacritics = c.grave .. c.acute .. c.circ .. c.macron .. c.caron},
}
m["yi"] = {
"Yiddish",
8641,
"gmw-hgm",
"Hebr, Latn",
ancestors = "gmh",
translit = {
Hebr = "yi-translit",
},
-- Hebr display_text, strip_diacritics, sort_key in [[Module:scripts/data]]
}
m["yo"] = {
"Yoruba",
34311,
"alv-yor",
"Latn, Arab",
strip_diacritics = {
Latn = {remove_diacritics = c.grave .. c.acute .. c.macron}
},
sort_key = {
Latn = {
from = {"ẹ", "ɛ", "gb", "ị", "kp", "ọ", "ɔ", "ṣ", "sh", "ụ"},
to = {"e" .. p[1], "e" .. p[1], "g" .. p[1], "i" .. p[1], "k" .. p[1], "o" .. p[1], "o" .. p[1], "s" .. p[1], "s" .. p[1], "u" .. p[1]}
},
},
}
m["za"] = {
"Zhuang",
13216,
"tai",
"Latn, Hani",
sort_key = {
Latn = "za-sortkey",
Hani = "Hani-sortkey",
},
}
m["zh"] = {
"Chinese",
7850,
"zhx",
"Hants, Latn, Bopo, Nshu, Brai",
ancestors = "ltc",
generate_forms = "zh-generateforms",
translit = {
Hani = "zh-translit",
Bopo = "zh-translit",
},
sort_key = {
Hani = "Hani-sortkey"
},
}
m["zu"] = {
"Zulu",
10179,
"bnt-ngu",
"Latn",
strip_diacritics = {remove_diacritics = c.grave .. c.acute .. c.circ .. c.macron .. c.caron},
}
return require("Module:languages").finalizeData(m, "language")
gx8qxn372mvflpjmn7xexq2a14xa89o
Module:families
828
5961
17397
2026-07-13T08:17:09Z
Hiyuune
6766
+
17397
Scribunto
text/plain
local export = {}
local families_by_name_module = "Module:families/canonical names"
local families_data_module = "Module:families/data"
local json_module = "Module:JSON"
local language_like_module = "Module:language-like"
local languages_module = "Module:languages"
local load_module = "Module:load"
local table_module = "Module:table"
local get_by_code -- Defined below.
local gmatch = string.gmatch
local insert = table.insert
local ipairs = ipairs
local make_object -- Defined below.
local pairs = pairs
local require = require
local setmetatable = setmetatable
local type = type
--[==[
Loaders for functions in other modules, which overwrite themselves with the target function when called. This ensures modules are only loaded when needed, retains the speed/convenience of locally-declared pre-loaded functions, and has no overhead after the first call, since the target functions are called directly in any subsequent calls.]==]
local function category_name_has_suffix(...)
category_name_has_suffix = require(language_like_module).categoryNameHasSuffix
return category_name_has_suffix(...)
end
local function category_name_to_code(...)
category_name_to_code = require(language_like_module).categoryNameToCode
return category_name_to_code(...)
end
local function deep_copy(...)
deep_copy = require(table_module).deepCopy
return deep_copy(...)
end
local function get_lang(...)
get_lang = require(languages_module).getByCode
return get_lang(...)
end
local function keys_to_list(...)
keys_to_list = require(table_module).keysToList
return keys_to_list(...)
end
local function load_data(...)
load_data = require(load_module).load_data
return load_data(...)
end
local function make_lang_object(...)
make_lang_object = require(languages_module).makeObject
return make_lang_object(...)
end
local function to_json(...)
to_json = require(json_module).toJSON
return to_json(...)
end
--[==[
Loaders for objects, which load data (or some other object) into some variable, which can then be accessed as "foo or get_foo()", where the function get_foo sets the object to "foo" and then returns it. This ensures they are only loaded when needed, and avoids the need to check for the existence of the object each time, since once "foo" has been set, "get_foo" will not be called again.]==]
local families_by_name
local function get_families_by_name()
families_by_name, get_families_by_name = load_data(families_by_name_module), nil
return families_by_name
end
local families_data
local function get_families_data()
families_data, get_families_data = load_data(families_data_module), nil
return families_data
end
local families_suffixes
local function get_families_suffixes()
families_suffixes, get_families_suffixes = {
"languages",
"lects"
}, nil
return families_suffixes
end
local Family = {}
Family.__index = Family
--[==[
Return the family code of the family, e.g. {"ine"} for the Indo-European languages.
]==]
function Family:getCode()
return self._code
end
--[==[
Return the canonical name of the family. This is the name used to represent that language family on Wiktionary,
and is guaranteed to be unique to that family alone. Example: {"Indo-European"} for the Indo-European languages.
]==]
function Family:getCanonicalName()
local name = self._name
if name == nil then
name = self._data[1]
self._name = name
end
return name
end
--[==[
Return the display form of the family. For families, this is usually the same as the value returned by
{getCategoryName("nocap")}, i.e. it reads <code>"<var>name</var> languages"</code> (e.g.
{"Indo-Iranian languages"}). For full and etymology-only languages, this is the same as the canonical name, and
for scripts, it reads <code>"<var>name</var> script"</code> (e.g. {"Arabic script"}). The displayed text used in
{makeCategoryLink()} is always the same as the display form.
]==]
function Family:getDisplayForm()
local name = self._data[1]
if category_name_has_suffix(name, families_suffixes or get_families_suffixes()) then
name = name .. " languages"
end
return name
end
function Family:getAliases()
Family.getAliases = require(language_like_module).getAliases
return self:getAliases()
end
function Family:getVarieties(flatten)
Family.getVarieties = require(language_like_module).getVarieties
return self:getVarieties(flatten)
end
function Family:getOtherNames()
Family.getOtherNames = require(language_like_module).getOtherNames
return self:getOtherNames()
end
function Family:getAllNames()
Family.getAllNames = require(language_like_module).getAllNames
return self:getAllNames()
end
--[==[Returns a table of types as a lookup table (with the types as keys).
The possible types are
* {family}: This object is a family.
* {full}: This object is a "full" family. This includes all families but a couple of etymology-only
families for Old and Middle Iranian languages.
* {etymology-only}: This object is an etymology-only family, similar to etymology-only languages. There
are currently only two such families, for Old Iranian languages and Middle Iranian
languages (which do not represent proper clades and have no proto-languages, hence
cannot be full families).
]==]
function Family:getTypes()
local types = self._types
if types == nil then
types = {family = true}
if self:getFullCode() == self:getCode() then
types.full = true
else
types["etymology-only"] = true
end
local rawtypes = self._data.type
if rawtypes then
for t in gmatch(rawtypes, "[^,]+") do
types[t] = true
end
end
self._types = types
end
return types
end
--[==[Given a list of types as strings, returns true if the family has all of them.]==]
function Family:hasType(...)
Family.hasType = require(language_like_module).hasType
return self:hasType(...)
end
--[==[Returns a {Family} object for the superfamily that the family belongs to.]==]
function Family:getFamily()
if self._familyObject == nil then
local familyCode = self:getFamilyCode()
if familyCode then
self._familyObject = get_by_code(familyCode)
else
self._familyObject = false
end
end
return self._familyObject or nil
end
--[==[Returns the code of the family's superfamily.]==]
function Family:getFamilyCode()
if not self._familyCode then
self._familyCode = self._data[3]
end
return self._familyCode
end
--[==[Returns the canonical name of the family's superfamily.]==]
function Family:getFamilyName()
if self._familyName == nil then
local family = self:getFamily()
if family then
self._familyName = family:getCanonicalName()
else
self._familyName = false
end
end
return self._familyName or nil
end
--[==[Check whether the family belongs to {superfamily} (which can be a family code or object), and returns a boolean. If more than one is given, returns {true} if the family belongs to any of them. A family is '''not''' considered to belong to itself.]==]
function Family:inFamily(...)
for _, superfamily in ipairs{...} do
if type(superfamily) == "table" then
superfamily = superfamily:getCode()
end
local family, code = self:getFamily()
while family do
code = family:getCode()
if code == superfamily then
return true
end
family = family:getFamily()
-- If family is parent to itself, return false.
if family and family:getCode() == code then
return false
end
end
return false
end
end
function Family:getParent()
if self._parentObject == nil then
local parentCode = self:getParentCode()
if parentCode then
self._parentObject = get_lang(parentCode, nil, true, true)
else
self._parentObject = false
end
end
return self._parentObject or nil
end
function Family:getParentCode()
if not self._parentCode then
self._parentCode = self._data.parent
end
return self._parentCode
end
function Family:getParentName()
if self._parentName == nil then
local parent = self:getParent()
if parent then
self._parentName = parent:getCanonicalName()
else
self._parentName = false
end
end
return self._parentName or nil
end
function Family:getParentChain()
if not self._parentChain then
self._parentChain = {}
local parent = self:getParent()
while parent do
insert(self._parentChain, parent)
parent = parent:getParent()
end
end
return self._parentChain
end
function Family:hasParent(...)
--checkObject("family", nil, ...)
for _, other_family in ipairs{...} do
for _, parent in ipairs(self:getParentChain()) do
if type(other_family) == "string" then
if other_family == parent:getCode() then return true end
else
if other_family:getCode() == parent:getCode() then return true end
end
end
end
return false
end
--[==[
If the family is etymology-only, this iterates through its parents until a full family is found, and the
corresponding object is returned. If the family is a full family, then it simply returns itself.
]==]
function Family:getFull()
if not self._fullObject then
local fullCode = self:getFullCode()
if fullCode ~= self:getCode() then
self._fullObject = get_lang(fullCode, nil, nil, true)
else
self._fullObject = self
end
end
return self._fullObject
end
--[==[
If the family is etymology-only, this iterates through its parents until a full family is found, and the
corresponding code is returned. If the family is a full family, then it simply returns the family code.
]==]
function Family:getFullCode()
return self._fullCode or self:getCode()
end
--[==[
If the family is etymology-only, this iterates through its parents until a full family is found, and the
corresponding canonical name is returned. If the family is a full family, then it simply returns the canonical name
of the family.
]==]
function Family:getFullName()
if self._fullName == nil then
local full = self:getFull()
if full then
self._fullName = full:getCanonicalName()
else
self._fullName = false
end
end
return self._fullName or nil
end
--[==[
Return a {Language} object (see [[Module:languages]]) for the proto-language of this family, if one exists.
Otherwise, return {nil}.
]==]
function Family:getProtoLanguage()
if self._protoLanguageObject == nil then
self._protoLanguageObject = get_lang(self._data.protoLanguage or self:getCode() .. "-pro", nil, true) or false
end
return self._protoLanguageObject or nil
end
function Family:getProtoLanguageCode()
if self._protoLanguageCode == nil then
local protoLanguage = self:getProtoLanguage()
self._protoLanguageCode = protoLanguage and protoLanguage:getCode() or false
end
return self._protoLanguageCode or nil
end
function Family:getProtoLanguageName()
if not self._protoLanguageName then
self._protoLanguageName = self:getProtoLanguage():getCanonicalName()
end
return self._protoLanguageName
end
function Family:hasAncestor(...)
-- Go up the family tree until a protolanguage is found.
local family = self
local protolang = family:getProtoLanguage()
while not protolang do
family = family:getFamily()
protolang = family:getProtoLanguage()
-- Return false if the family is its own family, to avoid an infinite loop.
if family:getFamilyCode() == family:getCode() then
return false
end
end
-- If the protolanguage is not in the family, it must therefore be ancestral to it. Check if it is a match.
for _, otherlang in ipairs{...} do
if (
type(otherlang) == "string" and protolang:getCode() == otherlang or
type(otherlang) == "table" and protolang:getCode() == otherlang:getCode()
) and not protolang:inFamily(self) then
return true
end
end
-- If not, check the protolanguage's ancestry.
return protolang:hasAncestor(...)
end
local function fetch_descendants(self, format)
local languages = require("Module:languages/code to canonical name")
local etymology_languages = require("Module:etymology languages/code to canonical name")
local families = require("Module:families/code to canonical name")
local descendants = {}
-- Iterate over all three datasets.
for _, data in ipairs{languages, etymology_languages, families} do
for code in pairs(data) do
local lang = get_lang(code, nil, true, true)
if lang:inFamily(self) then
if format == "object" then
insert(descendants, lang)
elseif format == "code" then
insert(descendants, code)
elseif format == "name" then
insert(descendants, lang:getCanonicalName())
end
end
end
end
return descendants
end
function Family:getDescendants()
if not self._descendantObjects then
self._descendantObjects = fetch_descendants(self, "object")
end
return self._descendantObjects
end
function Family:getDescendantCodes()
if not self._descendantCodes then
self._descendantCodes = fetch_descendants(self, "code")
end
return self._descendantCodes
end
function Family:getDescendantNames()
if not self._descendantNames then
self._descendantNames = fetch_descendants(self, "name")
end
return self._descendantNames
end
function Family:hasDescendant(...)
for _, lang in ipairs{...} do
if type(lang) == "string" then
lang = get_lang(lang, nil, true)
end
if lang:inFamily(self) then
return true
end
end
return false
end
--[==[
Return the name of the main category of that family. Example: {"Germanic languages"} for the Germanic languages,
whose category is at [[:Category:Germanic languages]].
Unless optional argument `nocap` is given, the family name at the beginning of the returned value will be
capitalized. This capitalization is correct for category names, but not if the family name is lowercase and
the returned value of this function is used in the middle of a sentence. (For example, the pseudo-family with
the code {qfa-mix} has the name {"mixed"}, which should remain lowercase when used as part of the category name
[[:Category:Terms derived from mixed languages]] but should be capitalized in [[:Category:Mixed languages]].)
If you are considering using {getCategoryName("nocap")}, use {getDisplayForm()} instead.
]==]
function Family:getCategoryName(nocap)
local name = self._data.categoryName or self:getDisplayForm()
if not nocap then
name = mw.getContentLanguage():ucfirst(name)
end
return name
end
function Family:makeCategoryLink()
return "[[:Category:" .. self:getCategoryName() .. "|" .. self:getDisplayForm() .. "]]"
end
--[==[Returns the Wikidata item id for the family or <code>nil</code>. This corresponds to the the second field in the data modules.]==]
function Family:getWikidataItem()
Family.getWikidataItem = require(language_like_module).getWikidataItem
return self:getWikidataItem()
end
--[==[
Returns the name of the Wikipedia article for the family. `project` specifies the language and project to retrieve
the article from, defaulting to {"enwiki"} for the English Wikipedia. Normally if specified it should be the project
code for a specific-language Wikipedia e.g. "zhwiki" for the Chinese Wikipedia, but it can be any project, including
non-Wikipedia ones. If the project is the English Wikipedia and the property {wikipedia_article} is present in the data
module it will be used first. In all other cases, a sitelink will be generated from {:getWikidataItem} (if set). The
resulting value (or lack of value) is cached so that subsequent calls are fast. If no value could be determined, and
`noCategoryFallback` is {false}, {:getCategoryName} is used as fallback; otherwise, {nil} is returned. Note that if
`noCategoryFallback` is {nil} or omitted, it defaults to {false} if the project is the English Wikipedia, otherwise
to {true}. In other words, under normal circumstances, if the English Wikipedia article couldn't be retrieved, the
return value will fall back to a link to the family's category, but this won't normally happen for any other project.
]==]
function Family:getWikipediaArticle(noCategoryFallback, project)
Family.getWikipediaArticle = require(language_like_module).getWikipediaArticle
return self:getWikipediaArticle(noCategoryFallback, project)
end
function Family:makeWikipediaLink()
return "[[w:" .. self:getWikipediaArticle() .. "|" .. self:getCanonicalName() .. "]]"
end
--[==[Returns the name of the Wikimedia Commons category page for the family.]==]
function Family:getCommonsCategory()
Family.getCommonsCategory = require(language_like_module).getCommonsCategory
return self:getCommonsCategory()
end
function Family:toJSON(opts)
local ret = {
canonicalName = self:getCanonicalName(),
categoryName = self:getCategoryName("nocap"),
code = self:getCode(),
parent = self:getParentCode(),
full = self:getFullCode(),
family = self:getFamilyCode(),
protoLanguage = self:getProtoLanguageCode(),
aliases = self:getAliases(),
varieties = self:getVarieties(),
otherNames = self:getOtherNames(),
type = keys_to_list(self:getTypes()),
wikidataItem = self:getWikidataItem(),
wikipediaArticle = self:getWikipediaArticle(true),
}
-- Use `deep_copy` when returning a table, so that there are no editing restrictions imposed by `mw.loadData`.
return opts and opts.lua_table and deep_copy(ret) or to_json(ret, opts)
end
function Family:getData()
return self._data
end
function export.makeObject(code, data)
local data_type = type(data)
if data_type ~= "table" then
error(("bad argument #2 to 'makeObject' (table expected, got %s)"):format(data_type))
end
return setmetatable({_data = data, _code = code, _fullCode = code}, Family)
end
make_object = export.makeObject
--[==[
Finds the family whose code matches the one provided. If it exists, it returns a {Family} object representing the
family. Otherwise, it returns {nil}.]==]
function export.getByCode(code)
local data = (families_data or get_families_data())[code]
if data == nil then
return nil
elseif data.parent == nil then
return make_object(code, data)
end
return make_lang_object(code, data)
end
get_by_code = export.getByCode
--[==[
Look for the family whose canonical name (the name used to represent that family on Wiktionary) matches the one
provided. If it exists, it returns a {Family} object representing the family. Otherwise, it returns {nil}. The
canonical name of families should always be unique (it is an error for two families on Wiktionary to share the same
canonical name), so this is guaranteed to give at most one result.]==]
function export.getByCanonicalName(name)
if name == nil then
return nil
end
local code = (families_by_name or get_families_by_name())[name]
if code == nil then
return nil
end
return get_by_code(code)
end
--[==[
Look for the family whose category name (the name used in categories for that family) matches the one provided.
If it exists, it returns a {Family} object representing the family. Otherwise, it returns {nil}. In almost all cases,
the category name for a family is its canonical name plus the word "languages", e.g. "Indo-European" has the category
name "Indo-European languages". Where a canonical name ends with "languages" or "lects", the category name is identical
to the canonical name.]==]
function export.getByCategoryName(name)
if name == nil then
return nil
end
local code = category_name_to_code(
name,
" languages",
families_by_name or get_families_by_name(),
families_suffixes or get_families_suffixes()
)
if code == nil then
return nil
end
return get_by_code(code)
end
return export
lbb6204ki1w17483059izgsyw1n271z
Module:families/data
828
5962
17398
2026-07-13T08:17:49Z
Hiyuune
6766
+
17398
Scribunto
text/plain
--[=[
This module contains definitions for all language family codes on Wiktionary.
]=]--
local m = {}
m["aav"] = {
"Austroasiatic",
33199,
aliases = {"Austro-Asiatic"},
}
m["aav-khs"] = {
"Khasian",
3073734,
"aav",
aliases = {"Khasic"},
}
m["aav-nic"] = {
"Nicobarese",
217380,
"aav",
}
m["aav-pkl"] = {
"Pnar-Khasi-Lyngngam",
nil,
"aav-khs",
}
m["afa"] = {
"Afroasiatic",
25268,
aliases = {"Afro-Asiatic"},
}
m["alg"] = {
"Algonquian",
33392,
"aql",
}
m["alg-abp"] = {
"Abenaki-Penobscot",
197936,
"alg-eas",
}
m["alg-ara"] = {
"Arapahoan",
2153686,
"alg",
}
m["alg-eas"] = {
"Eastern Algonquian",
2257525,
"alg",
}
m["alg-sfk"] = {
"Sac-Fox-Kickapoo",
1440172,
"alg",
}
m["alv"] = {
"Atlantic-Congo",
771124,
"nic",
}
m["alv-aah"] = {
"Ayere-Ahan",
750953,
"alv-von",
}
m["alv-ada"] = {
"Adamawa",
32906,
"alv-sav",
}
m["alv-bag"] = {
"Baga",
2746083,
"alv-mel",
}
m["alv-bak"] = {
"Bak",
1708174,
"alv-sng",
}
m["alv-bam"] = {
"Bambukic",
4853456,
"alv-ada",
aliases = {"Yungur-Jen"},
}
m["alv-bny"] = {
"Banyum",
2892477,
"alv-nyn",
}
m["alv-bua"] = {
"Bua",
4982094,
"alv-mbd",
}
m["alv-bwj"] = {
"Bikwin-Jen",
84542501,
"alv-bam",
}
m["alv-cng"] = {
"Cangin",
1033184,
"alv-fwo",
}
m["alv-ctn"] = {
"Central Tano",
1658486,
"alv-ptn",
aliases = {"Akan"},
}
m["alv-dlt"] = {
"Delta Edoid",
nil,
"alv-edo",
}
m["alv-dur"] = {
"Duru",
5316788,
"alv-lni",
}
m["alv-ede"] = {
"Ede",
35368,
"alv-yor",
}
m["alv-edk"] = {
"Edekiri",
5336735,
"alv-yrd",
}
m["alv-edo"] = {
"Edoid",
1287469,
"alv-von",
}
m["alv-eeo"] = {
"Edo-Esan-Ora",
12630439,
"alv-nce",
}
m["alv-fli"] = {
"Fali",
3450166,
"alv",
}
m["alv-fwo"] = {
"Fula-Wolof",
12631267,
"alv-sng",
}
m["alv-gbe"] = {
"Gbe",
668284,
"alv-von",
}
m["alv-gda"] = {
"Ga-Dangme",
3443338,
"alv-kwa",
}
m["alv-gng"] = {
"Guang",
684009,
"alv-ptn",
}
m["alv-gtm"] = {
"Ghana-Togo Mountain",
493020,
"alv-kwa",
aliases = {"Togo Remnant", "Central Togo"},
}
m["alv-hei"] = {
"Heiban",
108752116,
"alv-the",
}
m["alv-ido"] = {
"Idomoid",
974196,
"alv-von",
}
m["alv-igb"] = {
"Igboid",
1429100,
"alv-von",
}
m["alv-jfe"] = {
"Jola-Felupe",
1708174,
"alv-jol",
aliases = {"Ejamat"},
}
m["alv-jol"] = {
"Jola",
35176,
"alv-bak",
aliases = {"Diola"},
}
m["alv-kim"] = {
"Kim",
6409701,
"alv-mbd",
}
m["alv-kis"] = {
"Kissi",
35696,
"alv-mel",
}
m["alv-krb"] = {
"Karaboro",
4213541,
"alv-snf",
}
m["alv-ktg"] = {
"Ka-Togo",
5972796,
"alv-gtm",
}
m["alv-kul"] = {
"Kulango",
16977424,
"alv-sav",
aliases = {"Kulango-Lorhon", "Kulango-Lorom"},
}
m["alv-kwa"] = {
"Kwa",
33430,
"nic-vco",
}
m["alv-lag"] = {
"Lagoon",
111210042,
"alv-kwa",
}
m["alv-lek"] = {
"Leko",
6520642,
other_names = {"Sambaic"}, -- appears to be an alias in Glottolog
"alv-lni",
}
m["alv-lim"] = {
"Limba",
35825,
"alv",
}
m["alv-lni"] = {
"Leko-Nimbari",
1708170,
"alv-ada",
other_names = {"Central Adamawa"},
aliases = {"Chamba-Mumuye"},
}
m["alv-mbd"] = {
"Mbum-Day",
6799816,
"alv-ada",
}
m["alv-mbm"] = {
"Mbum",
6799814,
"alv-mbd",
}
m["alv-mel"] = {
"Mel",
12122355,
"alv",
}
m["alv-mum"] = {
"Mumuye",
84607009,
"alv-mye",
}
m["alv-mye"] = {
"Mumuye-Yendang",
6935539,
"alv-lni",
}
m["alv-nal"] = {
"Nalu",
nil,
"alv-sng",
}
m["alv-nce"] = {
"North-Central Edoid",
16110869,
"alv-edo",
}
m["alv-ngb"] = {
"Nupe-Gbagyi",
12638649,
"alv-nup",
aliases = {"Nupe-Gbari"},
}
m["alv-ntg"] = {
"Na-Togo",
nil,
"alv-gtm",
}
m["alv-nup"] = {
"Nupoid",
1429143,
"alv-von",
}
m["alv-nwd"] = {
"Northwestern Edoid",
16111012,
"alv-edo",
}
m["alv-nyn"] = {
"Nyun",
nil,
"alv-fwo",
}
m["alv-pap"] = {
"Papel",
7132562,
"alv-bak",
}
m["alv-pph"] = {
"Phla-Pherá",
3849625,
"alv-gbe",
}
m["alv-ptn"] = {
"Potou-Tano",
1475003,
"alv-kwa",
}
m["alv-sav"] = {
"Savanna",
4403672,
"nic-vco",
aliases = {"Savannas"},
}
m["alv-sma"] = {
"Supyire-Mamara",
4446348,
"alv-snf",
aliases = {"Suppire-Mamara"},
}
m["alv-snf"] = {
"Senufo",
33795,
"alv",
aliases = {"Senufic", "Senoufo", "Sénoufo"},
}
m["alv-sng"] = {
"Senegambian",
1708753,
"alv",
}
m["alv-snr"] = {
"Senari",
4416084,
"alv-snf",
}
m["alv-swd"] = {
"Southwestern Edoid",
12633903,
"alv-edo",
}
m["alv-tal"] = {
"Talodi",
12643302,
"alv-the",
}
m["alv-tdj"] = {
"Tagwana-Djimini",
7675362,
"alv-snf",
}
m["alv-ten"] = {
"Tenda",
3217535,
"alv-fwo",
}
m["alv-the"] = {
"Talodi-Heiban",
1521145,
"alv",
}
m["alv-von"] = {
"Volta-Niger",
34177,
"nic-vco",
}
m["alv-wan"] = {
"Wara-Natyoro",
7968830,
"alv-sav",
}
m["alv-wjk"] = {
"Waja-Kam",
nil,
"alv-ada",
}
m["alv-yek"] = {
"Yekhee",
nil,
"alv-nce",
}
m["alv-yor"] = {
"Yoruba",
nil,
"alv-edk",
}
m["alv-yrd"] = {
"Yoruboid",
1789745,
"alv-von",
}
m["alv-yun"] = {
"Yungur",
84601642,
"alv-bam",
aliases = {"Bena-Mboi"},
}
m["apa"] = {
"Apachean",
27758,
"ath",
aliases = {"Southern Athabaskan"},
}
m["aqa"] = {
"Alacalufan",
1288430,
}
m["aql"] = {
"Algic",
721612,
aliases = {"Algonquian-Ritwan", "Algonquian-Wiyot-Yurok"},
}
m["art"] = {
"constructed",
33215,
"qfa-not",
aliases = {"artificial", "planned"},
}
m["ath"] = {
"Athabaskan",
27475,
"xnd",
}
m["ath-nor"] = {
"North Athabaskan",
20738,
"ath",
aliases = {"Northern Athabaskan"},
}
m["ath-pco"] = {
"Pacific Coast Athabaskan",
20654,
"ath",
}
m["auf"] = {
"Arauan",
626772,
aliases = {"Arahuan", "Arauán", "Arawa", "Arawan", "Arawán"},
}
--[=[
Exceptional language and family codes for Australian Aboriginal languages
can use the prefix "aus-", though "aus" is no longer itself a family code.
]=]--
m["aus-arn"] = {
"Arnhem",
2581700,
aliases = {"Gunwinyguan", "Macro-Gunwinyguan"},
}
m["aus-bub"] = {
"Bunuban",
2495148,
aliases = {"Bunaban"},
}
m["aus-cww"] = {
"Central New South Wales",
5061507,
"aus-pam",
}
m["aus-dal"] = {
"Daly",
2478079,
}
m["aus-dyb"] = {
"Dyirbalic",
1850666,
"aus-pam",
}
m["aus-gar"] = {
"Garawan",
5521951,
}
m["aus-gun"] = {
"Gunwinyguan",
2581700,
"aus-arn",
aliases = {"Gunwingguan"},
}
m["aus-jar"] = {
"Jarrakan",
2039423,
}
m["aus-kar"] = {
"Karnic",
4215578,
"aus-pam",
}
m["aus-mir"] = {
"Mirndi",
4294095,
}
m["aus-nga"] = {
"Ngayarda",
16153490,
"aus-psw",
}
m["aus-nyu"] = {
"Nyulnyulan",
2039408,
}
m["aus-pam"] = {
"Pama-Nyungan",
33942,
}
m["aus-pmn"] = {
"Paman",
2640654,
"aus-pam",
}
m["aus-psw"] = {
"Southwest Pama-Nyungan",
2258160,
"aus-pam",
}
m["aus-rnd"] = {
"Arandic",
4784071,
"aus-pam",
}
m["aus-tnk"] = {
"Tangkic",
1823065,
}
m["aus-wdj"] = {
"Iwaidjan",
4196968,
aliases = {"Yiwaidjan"},
}
m["aus-wor"] = {
"Worrorran",
2038619,
}
m["aus-yid"] = {
"Yidinyic",
4205849,
"aus-pam",
}
m["aus-yng"] = {
"Yangmanic",
42727644,
}
m["aus-yol"] = {
"Yolngu",
2511254,
"aus-pam",
aliases = {"Yolŋu", "Yolngu Matha"},
}
m["aus-yuk"] = {
"Yuin-Kuric",
3833021,
"aus-pam",
}
m["awd"] = {
"Arawak",
626753,
aliases = {"Arawakan", "Maipurean", "Maipuran"},
}
m["awd-nwk"] = {
"Nawiki",
nil,
"awd",
aliases = {"Newiki"},
}
m["awd-taa"] = {
"Ta-Arawak",
7672731,
"awd",
aliases = {"Ta-Arawakan", "Ta-Maipurean"},
}
m["azc"] = {
"Uto-Aztecan",
34073,
aliases = {"Uto-Aztekan"},
}
m["azc-cup"] = {
"Cupan",
19866871,
"azc-tak",
}
m["azc-dur"] = {
"Durango Nahuatl",
2386361,
"azc-nah",
aliases = {"Mexicanero"}
}
m["azc-hua"] = {
"Huasteca Nahuatl",
3832950,
"azc-nah",
}
m["azc-nah"] = {
"Nahuan",
11965602,
"azc",
aliases = {"Aztecan"},
}
m["azc-num"] = {
"Numic",
2657541,
"azc",
}
m["azc-pim"] = {
"Piman",
7194600,
"azc",
aliases = {"Tepiman"},
}
m["azc-tak"] = {
"Takic",
1280305,
"azc",
}
m["azc-trc"] = {
"Taracahitic",
4245032,
"azc",
aliases = {"Taracahitan"},
}
m["bad"] = {
"Banda",
806234,
"nic-ubg",
}
m["bad-cnt"] = {
"Central Banda",
3438391,
"bad",
}
m["bai"] = {
"Bamileke",
806005,
"nic-gre",
}
m["bat"] = {
"Baltic",
33136,
"ine-bsl",
}
m["bat-eas"] = {
"East Baltic",
149944,
"bat",
}
m["bat-wes"] = {
"West Baltic",
149946,
"bat",
}
m["ber"] = {
"Berber",
25448,
"afa",
aliases = {"Tamazight"},
}
m["bnt"] = {
"Bantu",
33146,
"nic-bds",
}
m["bnt-baf"] = {
"Bafia",
799784,
"bnt",
}
m["bnt-bbo"] = {
"Bafo-Bonkeng",
nil,
"bnt-saw",
}
m["bnt-bdz"] = {
"Boma-Dzing",
1729203,
"bnt",
}
m["bnt-bek"] = {
"Bekwilic",
nil,
"bnt-ndb",
}
m["bnt-bki"] = {
"Bena-Kinga",
16113307,
"bnt-bne",
}
m["bnt-bmo"] = {
"Bangi-Moi",
nil,
"bnt-bnm",
}
m["bnt-bne"] = {
"Northeast Bantu",
7057832,
"bnt",
}
m["bnt-bnm"] = {
"Bangi-Ntomba",
806477,
"bnt-bte",
}
m["bnt-boa"] = {
"Boan",
4931250,
"bnt",
aliases = {"Buan", "Ababuan"},
}
m["bnt-bot"] = {
"Botatwe",
4948532,
"bnt",
}
m["bnt-bsa"] = {
"Basaa",
809739,
"bnt",
}
m["bnt-bsh"] = {
"Bushoong",
5001551,
"bnt-bte",
}
m["bnt-bso"] = {
"Southern Bantu",
980498,
"bnt",
}
m["bnt-bta"] = {
"Bati-Angba",
4869303,
"bnt-boa",
other_names = {"Late Bomokandian"},
aliases = {"Bwa"},
}
m["bnt-btb"] = {
"Beti",
35118,
"bnt",
}
m["bnt-bte"] = {
"Bangi-Tetela",
4855181,
"bnt",
}
m["bnt-bun"] = {
"Buja-Ngombe",
4986733,
"bnt-mbb",
}
m["bnt-chg"] = {
"Chaga",
33016,
"bnt-cht",
}
m["bnt-cht"] = {
"Chaga-Taita",
nil,
"bnt-bne",
}
m["bnt-clu"] = {
"Chokwe-Luchazi",
3339273,
"bnt",
}
m["bnt-com"] = {
"Comorian",
33077,
"bnt-sab",
}
m["bnt-glb"] = {
"Great Lakes Bantu",
5599420,
"bnt-bne",
}
m["bnt-haj"] = {
"Haya-Jita",
25502360,
"bnt-glb",
}
m["bnt-kak"] = {
"Kako",
nil,
"bnt-pob",
}
m["bnt-kav"] = {
"Kavango",
116544179,
"bnt-ksb",
}
m["bnt-kbi"] = {
"Komo-Bira",
6428591,
"bnt-boa",
}
m["bnt-kel"] = {
"Kele",
1738162,
"bnt-kts",
aliases = {"Sheke"},
}
m["bnt-kil"] = {
"Kilombero",
6408121,
"bnt",
}
m["bnt-kka"] = {
"Kikuyu-Kamba",
16114410,
"bnt-bne",
aliases = {"Thagiicu"},
}
m["bnt-kmb"] = {
"Kimbundu",
16947687,
"bnt",
}
m["bnt-kng"] = {
"Kongo",
6429214,
"bnt",
}
m["bnt-kpw"] = {
"Kpwe",
36428,
"bnt-saw",
}
m["bnt-ksb"] = {
"Kavango-Southwest Bantu",
6379098,
"bnt",
}
m["bnt-kts"] = {
"Kele-Tsogo",
6385577,
"bnt",
}
m["bnt-lbn"] = {
"Luban",
4536504,
"bnt",
}
m["bnt-leb"] = {
"Lebonya",
6511395,
"bnt",
}
m["bnt-lgb"] = {
"Lega-Binja",
6517694,
"bnt",
}
m["bnt-lok"] = {
"Logooli-Kuria",
nil,
"bnt-glb",
}
m["bnt-lub"] = {
"Luba",
nil,
"bnt-lbn",
}
m["bnt-lun"] = {
"Lunda",
6704091,
"bnt",
}
m["bnt-mak"] = {
"Makua",
6740431,
"bnt-bso",
aliases = {"Makhuwa"},
}
m["bnt-mbb"] = {
"Mboshi-Buja",
6799764,
"bnt",
}
m["bnt-mbe"] = {
"Mbole-Enya",
6799728,
"bnt",
}
m["bnt-mbi"] = {
"Mbinga",
nil,
"bnt-rur",
}
m["bnt-mbo"] = {
"Mboshi",
6799763,
"bnt-mbb",
}
m["bnt-mbt"] = {
"Mbete",
1346910,
"bnt-tmb",
aliases = {"Mbere"},
}
m["bnt-mby"] = {
"Mbeya",
nil,
"bnt-ruk",
}
m["bnt-mij"] = {
"Mijikenda",
6845474,
"bnt-sab",
}
m["bnt-mka"] = {
"Makaa",
nil,
"bnt-ndb",
}
m["bnt-mne"] = {
"Manenguba",
31147471,
"bnt",
aliases = {"Mbo", "Ngoe"},
}
m["bnt-mnj"] = {
"Makaa-Njem",
1603899,
"bnt-pob",
}
m["bnt-mon"] = {
"Mongo",
nil,
"bnt-bnm",
}
m["bnt-mra"] = {
"Mbugwe-Rangi",
6799795,
"bnt",
}
m["bnt-msl"] = {
"Masaba-Luhya",
12636428,
"bnt-glb",
}
m["bnt-mwi"] = {
"Mwika",
nil,
"bnt-ruk",
}
m["bnt-ncb"] = {
"Northeast Coast Bantu",
7057848,
"bnt-bne",
}
m["bnt-ndb"] = {
"Ndzem-Bomwali",
nil,
"bnt-mnj",
}
m["bnt-ngn"] = {
"Ngondi-Ngiri",
7022532,
"bnt-mbb",
}
m["bnt-ngu"] = {
"Nguni",
961559,
"bnt-bso",
aliases = {"Ngoni"},
}
m["bnt-nya"] = {
"Nyali",
7070832,
"bnt-leb",
}
m["bnt-nyb"] = {
"Nyanga-Buyi",
7070882,
"bnt",
}
m["bnt-nyg"] = {
"Nyoro-Ganda",
12638666,
"bnt-glb",
}
m["bnt-nys"] = {
"Nyasa",
7070921,
"bnt",
}
m["bnt-nze"] = {
"Nzebi",
1755498,
"bnt-tmb",
aliases = {"Njebi"},
}
m["bnt-ova"] = {
"Ovambo",
36489,
"bnt-swb",
aliases = {"Oshivambo", "Oshiwambo", "Owambo"},
}
m["bnt-par"] = {
"Pare",
nil,
"bnt-ncb",
}
m["bnt-pen"] = {
"Pende",
7162373,
"bnt",
}
m["bnt-pob"] = {
"Pomo-Bomwali",
nil,
"bnt",
}
m["bnt-ruk"] = {
"Rukwa",
7378902,
"bnt",
}
m["bnt-run"] = {
"Rungwe",
nil,
"bnt-ruk",
}
m["bnt-rur"] = {
"Rufiji-Ruvuma",
7377947,
"bnt",
}
m["bnt-ruv"] = {
"Ruvu",
nil,
"bnt-ncb",
}
m["bnt-rvm"] = {
"Ruvuma",
nil,
"bnt-rur",
}
m["bnt-sab"] = {
"Sabaki",
2209395,
"bnt-ncb",
}
m["bnt-saw"] = {
"Sawabantu",
532003,
"bnt",
}
m["bnt-sbi"] = {
"Sabi",
7396071,
"bnt",
}
m["bnt-seu"] = {
"Seuta",
nil,
"bnt-ncb",
}
m["bnt-shh"] = {
"Shi-Havu",
nil,
"bnt-glb",
}
m["bnt-sho"] = {
"Shona",
2904660,
"bnt",
}
m["bnt-sir"] = {
"Sira",
1436372,
"bnt",
aliases = {"Shira-Punu"},
}
m["bnt-ske"] = {
"Soko-Kele",
nil,
"bnt-bte",
}
m["bnt-sna"] = {
"Sena",
nil,
"bnt-nys",
}
m["bnt-sts"] = {
"Sotho-Tswana",
2038386,
"bnt-bso",
}
m["bnt-swb"] = {
"Southwest Bantu",
116543539,
"bnt-ksb",
}
m["bnt-swh"] = {
"Swahili",
nil,
"bnt-sab",
}
m["bnt-tek"] = {
"Teke",
36528,
"bnt-tmb",
}
m["bnt-tet"] = {
"Tetela",
7706059,
"bnt-bte",
}
m["bnt-tkc"] = {
"Central Teke",
36473,
"bnt-tek",
}
m["bnt-tkm"] = {
"Takama",
nil,
"bnt-bne",
}
m["bnt-tmb"] = {
"Teke-Mbede",
7695332,
"bnt",
aliases = {"Teke-Mbere"},
}
m["bnt-tso"] = {
"Tsogo",
2458420,
other_names = {"Okani"}, --appears to be an alias in Glottolog
"bnt-kts",
}
m["bnt-tsr"] = {
"Tswa-Ronga",
12643962,
"bnt-bso",
}
m["bnt-yak"] = {
"Yaka",
8047027,
"bnt",
}
m["bnt-yko"] = {
"Yasa-Kombe",
nil,
"bnt-saw",
}
m["bnt-zbi"] = {
"Zamba-Binza",
nil,
"bnt-bnm",
}
m["btk"] = {
"Batak",
1998595,
"poz-nws",
}
--[=[
Exceptional language and family codes for Central American Indian languages
may use the prefix "cai-", though "cai" is no longer itself a family code.
]=]--
--[=[
Exceptional language and family codes for Caucasian languages can use
the prefix "cau-", though "cau" is no longer itself a family code.
]=]--
m["cau-abz"] = {
"Abkhaz-Abaza",
4663617,
"cau-nwc",
other_names = {"Abkhaz-Tapanta"},
aliases = {"Abazgi"},
}
m["cau-and"] = {
"Andian",
492152,
"cau-ava",
aliases = {"Andic"},
}
m["cau-ava"] = {
"Avaro-Andian",
4055404,
"cau-nec",
aliases = {"Avar-Andian", "Avar-Andi", "Avar-Andic"},
}
m["cau-cir"] = {
"Circassian",
858543,
"cau-nwc",
aliases = {"Cherkess"},
}
m["cau-drg"] = {
"Dargwa",
5222637,
"cau-nec",
other_names = {"Dargin"},
}
m["cau-esm"] = {
"Eastern Samur",
nil,
"cau-sam",
}
m["cau-ets"] = {
"East Tsezian",
121437666,
"cau-tsz",
aliases = {"East Tsezic", "East Didoic"},
}
m["cau-lzg"] = {
"Lezghian",
2144370,
"cau-nec",
aliases = {"Lezgi", "Lezgian", "Lezgic"},
}
m["cau-nkh"] = {
"Nakh",
24441,
"cau-nec",
aliases = {"North-Central Caucasian"},
}
m["cau-nec"] = {
"Northeast Caucasian",
27387,
aliases = {"Dagestanian", "Nakho-Dagestanian", "Caspian"},
}
m["cau-nwc"] = {
"Northwest Caucasian",
33852,
aliases = {"Abkhazo-Adyghean", "Abkhaz-Adyghe", "Pontic"},
}
m["cau-sam"] = {
"Samur",
15229151,
"cau-lzg",
}
m["cau-ssm"] = {
"Southern Samur",
nil,
"cau-sam",
}
m["cau-tsz"] = {
"Tsezian",
1651530,
"cau-nec",
aliases = {"Tsezic", "Didoic"},
}
m["cau-vay"] = {
"Vainakh",
4102486,
"cau-nkh",
aliases = {"Veinakh", "Vaynakh"},
}
m["cau-wsm"] = {
"Western Samur",
nil,
"cau-sam",
}
m["cau-wts"] = {
"West Tsezian",
121437697,
"cau-tsz",
aliases = {"West Tsezic", "West Didoic"},
}
m["cba"] = {
"Chibchan",
520478,
"qfa-mch", -- or none if Macro-Chibchan is considered undemonstrated
}
m["ccs"] = {
"Kartvelian",
34030,
aliases = {"South Caucasian"},
}
m["ccs-gzn"] = {
"Georgian-Zan",
34030,
"ccs",
aliases = {"Karto-Zan"},
}
m["ccs-zan"] = {
"Zan",
2606912,
"ccs-gzn",
aliases = {"Zanuri", "Colchian"},
}
m["cdc"] = {
"Chadic",
33184,
"afa",
}
m["cdc-cbm"] = {
"Central Chadic",
2251547,
"cdc",
aliases = {"Biu-Mandara"},
}
m["cdc-est"] = {
"East Chadic",
2276221,
"cdc",
}
m["cdc-mas"] = {
"Masa",
2136092,
"cdc",
}
m["cdc-wst"] = {
"West Chadic",
2447774,
"cdc",
}
m["cdd"] = {
"Caddoan",
1025090,
}
m["cel"] = {
"Celtic",
25293,
"ine",
}
m["cel-bry"] = {
"Brythonic",
156877,
"cel-ins",
aliases = {"Brittonic"},
}
m["cel-brs"] = {
"Southwestern Brythonic",
2612853,
"cel-bry",
aliases = {"Southwestern Brittonic"},
}
m["cel-brw"] = {
"Western Brythonic",
593069,
"cel-bry",
aliases = {"Western Brittonic"},
}
m["cel-gae"] = {
"Goidelic",
56433,
"cel-ins",
aliases = {"Gaelic"},
protoLanguage = "pgl",
}
m["cel-his"] = {
"Hispano-Celtic",
4204136,
"cel",
}
m["cel-ins"] = {
"Insular Celtic",
214506,
"cel",
}
m["chi"] = {
"Chimakuan",
1073088,
}
m["chm"] = {
"Mari",
973685,
"urj",
}
m["cmc"] = {
"Chamic",
2997506,
"poz-mcm",
}
m["crp"] = {
"creole or pidgin",
19682167,
"qfa-cnt",
}
m["csu"] = {
"Central Sudanic",
190822,
"ssa",
}
m["csu-bba"] = {
"Bongo-Bagirmi",
3505042,
"csu",
}
m["csu-bbk"] = {
"Bongo-Baka",
4941917,
"csu-bba",
}
m["csu-bgr"] = {
"Bagirmi",
4841948,
"csu-bba",
aliases = {"Bagirmic"},
}
m["csu-bkr"] = {
"Birri-Kresh",
nil,
"csu",
}
m["csu-ecs"] = {
"Eastern Central Sudanic",
16911698,
"csu",
aliases = {"East Central Sudanic", "Central Sudanic East", "Lendu-Mangbetu"},
}
m["csu-kab"] = {
"Kaba",
6343715,
"csu-bba",
}
m["csu-lnd"] = {
"Lendu",
6522357,
"csu-ecs",
aliases = {"Lenduic"},
}
m["csu-maa"] = {
"Mangbetu",
6748874,
"csu-ecs",
aliases = {"Mangbetu-Asoa", "Mangbetu-Asua"},
}
m["csu-mle"] = {
"Mangbutu-Lese",
17009406,
"csu-ecs",
aliases = {"Mangbutu-Efe", "Mangbutu", "Membi-Mangbutu-Efe"},
}
m["csu-mma"] = {
"Moru-Madi",
6915156,
"csu-ecs",
}
m["csu-sar"] = {
"Sara",
2036691,
"csu-bba",
}
m["csu-val"] = {
"Vale",
7909520,
"csu-bba",
}
m["cus"] = {
"Cushitic",
33248,
"afa",
}
m["cus-cen"] = {
"Central Cushitic",
56569,
"cus",
}
m["cus-eas"] = {
"East Cushitic",
56568,
"cus",
}
m["cus-hec"] = {
"Highland East Cushitic",
56524,
"cus-eas",
}
m["cus-som"] = {
"Somaloid",
56774,
"cus-eas",
aliases = {"Sam", "Macro-Somali"},
}
m["cus-sou"] = {
"South Cushitic",
56525,
"cus",
}
m["day"] = {
"Land Dayak",
2760613,
"poz",
}
m["del"] = {
"Lenape",
2665761,
"alg-eas",
aliases = {"Delaware"},
}
m["den"] = {
"Slavey",
13272,
"ath-nor",
aliases = {"Slave", "Slavé"},
}
m["dmn"] = {
"Mande",
33681,
"nic",
}
m["dmn-bbu"] = {
"Bisa-Busa",
12627956,
"dmn-mde",
}
m["dmn-emn"] = {
"East Manding",
nil,
"dmn-man",
}
m["dmn-jje"] = {
"Jogo-Jeri",
nil,
"dmn-mjo",
}
m["dmn-man"] = {
"Manding",
35772,
"dmn-mmo",
}
m["dmn-mda"] = {
"Mano-Dan",
nil,
"dmn-mse",
}
m["dmn-mdc"] = {
"Central Mande",
5972907,
"dmn-mdw",
}
m["dmn-mde"] = {
"Eastern Mande",
12633080,
"dmn",
}
m["dmn-mdw"] = {
"Western Mande",
16113831,
"dmn",
}
m["dmn-mjo"] = {
"Manding-Jogo",
12636153,
"dmn-mdc",
}
m["dmn-mmo"] = {
"Manding-Mokole",
nil,
"dmn-mva",
}
m["dmn-mnk"] = {
"Maninka",
36186,
"dmn-emn",
}
m["dmn-mnw"] = {
"Northwestern Mande",
5972910,
"dmn-mdw",
}
m["dmn-mok"] = {
"Mokole",
16935447,
"dmn-mmo",
}
m["dmn-mse"] = {
"Southeastern Mande",
5972912,
"dmn-mde",
}
m["dmn-msw"] = {
"Southwestern Mande",
12633904,
"dmn-mdw",
}
m["dmn-mva"] = {
"Manding-Vai",
nil,
"dmn-mjo",
}
m["dmn-nbe"] = {
"Nwa-Beng",
nil,
"dmn-mse",
}
m["dmn-sam"] = {
"Samo",
36327,
"dmn-bbu",
aliases = {"Samuic"},
}
m["dmn-smg"] = {
"Samogo",
7410000,
"dmn-mnw",
aliases = {"Duun-Seenku"},
}
m["dmn-snb"] = {
"Soninke-Bobo",
16111680,
"dmn-mnw",
}
m["dmn-sya"] = {
"Susu-Yalunka",
nil,
"dmn-mdc",
}
m["dmn-vak"] = {
"Vai-Kono",
nil,
"dmn-mva",
}
m["dmn-wmn"] = {
"West Manding",
nil,
"dmn-man",
}
m["dra"] = {
"Dravidian",
33311,
}
m["dra-cen"] = {
"Central Dravidian",
12628823,
"dra",
}
m["dra-gki"] = {
"Gondi-Kui",
12631610,
"dra-sdt",
}
m["dra-gon"] = {
"Gondi",
55639812,
"dra-gki",
}
m["dra-imd"] = {
"Irula-Muduga",
nil,
"dra-tkn",
}
m["dra-kan"] = {
"Kannadoid",
6363888,
"dra-tkn",
protoLanguage = "dra-okn",
}
m["dra-kki"] = {
"Konda-Kui",
nil,
"dra-gki",
}
m["dra-kml"] = {
"Kurux-Malto",
68002822,
"dra-nor",
}
m["dra-knk"] = {
"Kolami-Naiki",
10547037,
"dra-cen",
}
m["dra-kod"] = {
"Kodagu",
67983106,
"dra-tkd",
}
m["dra-kor"] = {
"Koraga",
33394,
"dra-tlk",
}
m["dra-mal"] = {
"Malayalamoid",
6741581,
"dra-tml",
}
m["dra-mdy"] = {
"Madiya",
27602,
"dra-gon",
}
m["dra-mlo"] = {
"Malto",
nil,
"dra-kml",
}
m["dra-mur"] = {
"Muria",
6938499,
"dra-gon",
}
m["dra-nor"] = {
"North Dravidian",
16110967,
"dra",
}
m["dra-pgd"] = {
"Parji-Gadaba",
10620428,
"dra-cen",
}
m["dra-sdo"] = {
"South Dravidian I",
16112843, -- Wikipedia's "South Dravidian" is South Dravidian I in this scheme.
"dra-sou",
aliases = {"South Dravidian"}, -- This is why I and II are used.
}
m["dra-sdt"] = {
"South Dravidian II",
12633975,
"dra-sou",
aliases = {"South-Central Dravidian"},
}
m["dra-sou"] = {
"South Dravidian",
128886618,
"dra",
aliases = {"Southern Dravidian"},
}
m["dra-tam"] = {
"Tamiloid",
7681417,
"dra-tml",
protoLanguage = "oty",
}
m["dra-tel"] = {
"Teluguic",
nil,
"dra-sdt",
protoLanguage = "dra-ote",
}
m["dra-tkd"] = {
"Tamil-Kodagu",
25494510,
"dra-tkn",
}
m["dra-tkn"] = {
"Tamil-Kannada",
6478506,
"dra-sdo",
}
m["dra-tkt"] = {
"Toda-Kota",
67983857,
"dra-tkd",
}
m["dra-tlk"] = {
"Tulu-Koraga",
nil,
"dra-sdo",
}
m["dra-tml"] = {
"Tamil-Malayalam",
10690507,
"dra-tkd",
}
m["egx"] = {
"Egyptian",
50868,
"afa",
protoLanguage = "egy",
}
m["ero"] = {
"Horpa",
56854,
"sit-wgy",
}
m["esx"] = {
"Eskimo-Aleut",
25946,
}
m["esx-esk"] = {
"Eskimo",
25946,
"esx",
}
m["esx-inu"] = {
"Inuit",
27796,
"esx-esk",
}
m["euq"] = {
"Vasconic",
4669240,
}
m["gba"] = {
"Gbaya",
3099986,
"alv-sav",
}
m["gba-eas"] = {
"Eastern Gbaya",
nil,
"gba",
}
m["gba-sou"] = {
"Southern Gbaya",
nil,
"gba",
}
m["gba-wes"] = {
"Western Gbaya",
nil,
"gba",
}
m["gem"] = {
"Germanic",
21200,
"ine",
}
m["gio"] = {
"Gelao",
56401,
"qfa-kra",
}
m["gme"] = {
"East Germanic",
108662,
"gem",
}
m["gmq"] = {
"North Germanic",
106085,
"gem",
}
m["gmq-eas"] = {
"East Scandinavian",
3090263,
"gmq",
protoLanguage = "non-oen",
}
m["gmq-ins"] = {
"Insular Scandinavian",
nil,
"gmq-wes",
}
m["gmq-wes"] = {
"West Scandinavian",
1792570,
"gmq",
protoLanguage = "non-own",
}
m["gmw"] = {
"West Germanic",
26721,
"gem",
}
m["gmw-afr"] = {
"Anglo-Frisian",
5329170,
"gmw-nsg",
}
m["gmw-ang"] = {
"Anglic",
1346342,
"gmw-afr",
protoLanguage = "ang",
}
m["gmw-fri"] = {
"Frisian",
25325,
"gmw-afr",
protoLanguage = "ofs",
}
m["gmw-frk"] = {
"Low Franconian",
153050,
"gmw",
protoLanguage = "frk",
}
m["gmw-hgm"] = {
"High German",
52040,
"gmw",
protoLanguage = "goh",
}
m["gmw-ian"] = {
"Irish Anglo-Norman",
120719384,
"gmw-ang",
protoLanguage = "enm",
}
m["gmw-lgm"] = {
"Low German",
25433,
"gmw-nsg",
protoLanguage = "osx",
}
m["gmw-nsg"] = {
"North Sea Germanic",
30134,
"gmw",
aliases = {"Ingvaeonic"},
}
m["gn"] = {
"Guarani",
35876,
"tup-gua",
aliases = {"Guaraní"},
}
m["grb"] = {
"Grebo proper",
35257,
"kro-grb",
}
m["grk"] = {
"Hellenic",
2042538,
"ine-grp",
aliases = {"Greek"},
}
m["him"] = {
"Western Pahari",
10939493,
"inc-pah",
aliases = {"Himachali"},
}
m["hmn"] = {
"Hmongic",
3307894,
"hmx",
}
m["hmx"] = {
"Hmong-Mien",
33322,
aliases = {"Miao-Yao"},
}
m["hmx-mie"] = {
"Mienic",
7992695,
"hmx",
}
m["hok"] = {
"Hokan",
33406,
}
m["hyx"] = {
"Armenian",
8785,
"ine",
}
m["iir"] = {
"Indo-Iranian",
33514,
"ine",
}
m["iir-nur"] = {
"Nuristani",
161804,
"iir",
}
m["nur-nor"] = {
"Northern Nuristani",
nil,
"iir-nur",
}
m["nur-sou"] = {
"Southern Nuristani",
nil,
"iir-nur",
}
m["ijo"] = {
"Ijoid",
1325759,
"nic",
other_names = {"Ijaw"}, -- Ijaw may be a subfamily
}
m["inc"] = {
"Indo-Aryan",
33577,
"iir",
aliases = {"Indic"},
}
m["inc-bas"] = {
"Bengali-Assamese",
4179137,
"inc-eas",
aliases = {"Assamese-Bengali", "Gauda-Kamarupa"},
}
m["inc-bhi"] = {
"Bhil",
4901727,
"inc-cen",
}
m["inc-bih"] = {
"Bihari",
135305,
"inc-eas",
}
m["inc-cen"] = {
"Central Indo-Aryan",
10979187,
"inc",
protoLanguage = "inc-asa",
}
m["inc-chi"] = {
"Chitrali",
11732797,
"inc-dar",
}
m["inc-dar"] = {
"Dardic",
161101,
"inc",
protoLanguage = "inc-ash",
}
m["inc-dre"] = {
"Eastern Dardic",
nil,
"inc-dar",
}
m["inc-dng"] = {
"Dangari",
nil,
"inc-shn",
}
m["inc-eas"] = {
"Eastern Indo-Aryan",
12593391,
"inc",
protoLanguage = "inc-aav",
}
m["inc-hal"] = {
"Halbic",
16910593,
"inc-eas",
aliases = {"Halbi"},
}
m["inc-hie"] = {
"Eastern Hindi",
4126648,
"inc-cen",
aliases = {"Purabiyā"},
protoLanguage = "inc-apa",
}
m["inc-hiw"] = {
"Western Hindi",
12600937,
"inc-cen",
protoLanguage = "inc-ohi",
}
m["inc-hnd"] = {
"Hindustani",
11051,
"inc-hiw",
aliases = {"Hindi-Urdu"},
protoLanguage = "hi-mid",
}
m["inc-ins"] = {
"Insular Indo-Aryan",
12179302,
"inc",
protoLanguage = "inc-apa",
}
m["inc-kas"] = {
"Kashmiric",
nil,
"inc-dre",
aliases = {"Kashmiri"},
}
m["inc-koh"] = {
"Kohistani",
13018610,
"inc-dre",
}
m["inc-krd"] = {
"KRDS languages",
6356154,
"inc-eas",
aliases = {"Kamta, Rajbanshi, Deshi and Surjapuri", "KRNB languages", "Kamta, Rajbanshi and Northern Deshi Bangla"},
}
m["inc-kun"] = {
"Kunar",
nil,
"inc-dar",
}
m["inc-mid"] = {
"Middle Indo-Aryan",
3236316,
"inc",
aliases = {"Middle Indic"},
}
m["inc-nwe"] = {
"Northwestern Indo-Aryan",
16111018,
"inc",
protoLanguage = "inc-apa",
}
m["inc-nor"] = {
"Northern Indo-Aryan",
946077,
"inc",
protoLanguage = "inc-aka",
}
m["inc-old"] = {
"Old Indo-Aryan",
118976896,
"inc",
aliases = {"Old Indic"},
}
m["inc-pah"] = {
"Pahari",
946077,
"inc-nor",
aliases = {"Pahadi"},
protoLanguage = "inc-aka",
}
m["inc-pan"] = {
"Punjabic",
2656685,
"inc-nwe",
aliases = {"Greater Punjabic"},
protoLanguage = "inc-opa",
}
m["inc-pas"] = {
"Pashayi",
36670,
"inc-dar",
aliases = {"Pashai"},
}
m["inc-rom"] = {
"Romani",
13201,
"inc-wes",
aliases = {"Romany", "Gypsy", "Gipsy"},
}
m["inc-shn"] = {
"Shinaic",
12646125,
"inc-dre",
}
m["inc-snd"] = {
"Sindhic",
7522212,
"inc-nwe",
protoLanguage = "inc-avr",
}
m["inc-sou"] = {
"Southern Indo-Aryan",
10856062,
"inc",
protoLanguage = "inc-ama",
}
m["inc-tha"] = {
"Tharu",
34035,
"inc-eas",
}
m["inc-wes"] = {
"Western Indo-Aryan",
nil,
"inc",
protoLanguage = "inc-agu",
}
m["ine"] = {
"Indo-European",
19860,
aliases = {"Indo-Germanic"},
}
m["ine-ana"] = {
"Anatolian",
147085,
"ine",
}
m["ine-bsl"] = {
"Balto-Slavic",
147356,
"ine",
}
m["ine-grp"] = {
"Graeco-Phrygian",
nil,
"ine",
}
m["ine-luw"] = {
"Luwic",
115748615,
"ine-ana",
aliases = {"Luvic"},
}
m["ine-toc"] = {
"Tocharian",
37029,
"ine",
aliases = {"Tokharian"},
}
m["ira"] = {
"Iranian",
33527,
"iir",
}
m["ira-csp"] = {
"Caspian",
5049123,
"ira-mpr",
}
m["ira-cen"] = {
"Central Iranian",
nil,
"ira",
}
m["ira-kms"] = {
"Komisenian",
nil,
"ira-mpr",
aliases = {"Semnani"},
}
m["ira-mid"] = {
"Middle Iranian",
6841465,
"ira",
}
m["ira-mny"] = {
"Munji-Yidgha",
nil,
"ira-sym",
aliases = {"Yidgha-Munji"},
}
m["ira-msh"] = {
"Mazanderani-Shahmirzadi",
nil,
"ira-csp",
}
m["ira-nei"] = {
"Northeastern Iranian",
10775567,
"ira",
}
m["ira-nwi"] = {
"Northwestern Iranian",
390576,
"ira-wes",
}
m["ira-old"] = {
"Old Iranian",
23301845,
"ira",
}
m["ira-orp"] = {
"Ormuri-Parachi",
nil,
"ira-sei",
}
m["ira-pat"] = {
"Pathan",
nil,
"ira-sei",
}
m["ira-sbc"] = {
"Sogdo-Bactrian",
nil,
"ira-nei",
}
m["ira-mpr"] = {
"Medo-Parthian",
nil,
"ira-nwi",
aliases = {"Partho-Median"},
}
m["ira-sgi"] = {
"Sanglechi-Ishkashimi",
18711232,
"ira-sei",
}
m["ira-shr"] = {
"Shughni-Roshani",
11732824,
"ira-shy",
}
m["ira-shy"] = {
"Shughni-Yazghulami",
nil,
"ira-sym",
}
m["ira-sgc"] = {
"Sogdic",
nil,
"ira-sbc",
aliases = {"Sogdian"},
}
m["ira-sei"] = {
"Southeastern Iranian",
3833002,
"ira",
}
m["ira-swi"] = {
"Southwestern Iranian",
390424,
"ira-wes",
}
m["ira-sym"] = {
"Shughni-Yazghulami-Munji",
nil,
"ira-sei",
}
m["ira-wes"] = {
"Western Iranian",
129850,
"ira",
}
m["ira-zgr"] = {
"Zaza-Gorani",
167854,
"ira-mpr",
aliases = {"Zaza-Gurani", "Gorani-Zaza"},
}
m["iro"] = {
"Iroquoian",
33623,
}
m["iro-nor"] = {
"North Iroquoian",
nil,
"iro",
}
m["itc"] = {
"Italic",
131848,
"ine",
}
m["itc-laf"] = {
"Latino-Faliscan",
33478,
"itc",
aliases = {"Latinian"},
}
m["itc-sbl"] = {
"Osco-Umbrian",
515194,
"itc",
aliases = {"Sabellic", "Sabellian"},
}
m["jpx"] = {
"Japonic",
33612,
aliases = {"Japanese", "Japanese-Ryukyuan"},
}
m["jpx-nry"] = {
"Northern Ryukyuan",
20862796,
"jpx-ryu",
}
m["jpx-ryu"] = {
"Ryukyuan",
56393,
"jpx",
}
m["jpx-sry"] = {
"Southern Ryukyuan",
18392243,
"jpx-ryu",
}
m["kar"] = {
"Karen",
1364815,
"sit",
}
m["kca"] = {
"Khanty",
33563,
"urj-ugr",
aliases = {"Khantyic", "Khantic"},
}
--[=[
Exceptional language and family codes for Khoisan and Kordofanian languages can use
the prefix "khi-" and "kdo-" respectively, though they are no longer family codes themselves.
]=]--
m["khi-kal"] = {
"Kalahari Khoe",
nil,
"khi-kho",
}
m["khi-khk"] = {
"Khoekhoe",
nil,
"khi-kho",
}
m["khi-kkw"] = {
"Khoe-Kwadi",
60785084,
aliases = {"Kwadi-Khoe"},
}
m["khi-kho"] = {
"Khoe",
2736449,
"khi-kkw",
aliases = {"Central Khoisan"},
}
m["khi-kxa"] = {
"Kx'a",
6450587,
aliases = {"Kxa", "Ju-ǂHoan"},
}
m["khi-tuu"] = {
"Tuu",
631046,
aliases = {"Kwi", "Taa-Kwi", "Southern Khoisan", "Taa-ǃKwi", "Taa-ǃUi", "ǃUi-Taa"},
}
m["kro"] = {
"Kru",
33535,
"nic-vco",
}
m["kro-aiz"] = {
"Aizi",
4699431,
"kro",
}
m["kro-bet"] = {
"Bété",
32956,
"kro-ekr",
}
m["kro-did"] = {
"Dida",
32685,
"kro-ekr",
}
m["kro-ekr"] = {
"Eastern Kru",
5972899,
"kro",
}
m["kro-grb"] = {
"Grebo",
5601537,
"kro-wkr",
}
m["kro-wee"] = {
"Wee",
nil,
"kro-wkr",
}
m["kro-wkr"] = {
"Western Kru",
5972897,
"kro",
}
m["ku"] = {
"Kurdish",
36368,
"ira-nwi",
}
m["kv"] = {
"Komi",
36126, -- "Komi language" in Wikipedia but refers specifically to Komi-Zyrian; no Wikidata item for Komi family
"urj-prm",
}
m["map"] = {
"Austronesian",
49228,
}
m["map-ata"] = {
"Atayalic",
716610,
"map",
}
m["mjg"] = {
"Monguor",
34214,
"xgn-shr",
}
m["mkh"] = {
"Mon-Khmer",
33199,
"aav",
}
m["mkh-asl"] = {
"Aslian",
3111082,
"mkh",
}
m["mkh-ban"] = {
"Bahnaric",
56309,
"mkh",
}
m["mkh-kat"] = {
"Katuic",
56697,
"mkh",
}
m["mkh-khm"] = {
"Khmuic",
1323245,
"mkh",
}
m["mkh-kmr"] = {
"Khmeric",
nil,
"mkh",
}
m["mkh-mnc"] = {
"Monic",
3217497,
"mkh",
}
m["mkh-mng"] = {
"Mangic",
3509556,
"mkh",
}
m["mkh-nbn"] = {
"North Bahnaric",
56309,
"mkh-ban",
}
m["mkh-pal"] = {
"Palaungic",
2391173,
"mkh",
}
m["mkh-pea"] = {
"Pearic",
3073022,
"mkh",
}
m["mkh-pkn"] = {
"Pakanic",
nil,
"mkh-mng",
}
m["mkh-vie"] = {
"Vietic",
2355546,
"mkh",
}
m["mno"] = {
"Manobo",
3217483,
"phi",
}
m["mns"] = {
"Mansi",
33759,
"urj-ugr",
aliases = {"Mansic"},
}
m["mun"] = {
"Munda",
33892,
"aav",
}
m["myn"] = {
"Mayan",
33738,
}
--[=[
Exceptional language and family codes for North American Indian languages
can use the prefix "nai-", though "nai" is no longer itself a family code.
]=]--
m["nai-cat"] = {
"Catawban",
3446638,
"nai-sca",
}
m["nai-chu"] = {
"Chumashan",
1288420,
}
m["nai-ckn"] = {
"Chinookan",
610586,
}
m["nai-coo"] = {
"Coosan",
940278,
}
m["nai-jcq"] = {
"Jicaquean",
12179308,
"hok"
}
m["nai-ker"] = {
"Keresan",
35878,
}
m["nai-klp"] = {
"Kalapuyan",
1569040,
}
m["nai-kta"] = {
"Kiowa-Tanoan",
386288,
}
m["nai-len"] = {
"Lencan",
36189,
aliases = {"Lenca"},
}
m["nai-mdu"] = {
"Maiduan",
33502,
}
m["nai-miz"] = {
"Mixe-Zoquean",
954016,
aliases = {"Mixe-Zoque"},
}
m["nai-min"] = {
"Misumalpan",
281693,
"qfa-mch",
aliases = {"Misuluan", "Misumalpa"},
}
m["nai-mus"] = {
"Muskogean",
902978,
aliases = {"Muskhogean"},
}
m["nai-pak"] = {
"Pakawan",
65085487,
"hok",
}
m["nai-pal"] = {
"Palaihnihan",
1288332,
}
m["nai-plp"] = {
"Plateau Penutian",
2307476,
}
m["nai-pom"] = {
"Pomoan",
2618420,
"hok",
aliases = {"Pomo", "Kulanapan"},
}
m["nai-sca"] = {
"Siouan-Catawban",
34181,
}
m["nai-shp"] = {
"Sahaptian",
114782,
"nai-plp",
}
m["nai-shs"] = {
"Shastan",
2991735,
"hok",
}
m["nai-tot"] = {
"Totozoquean",
7828419,
}
m["nai-ttn"] = {
"Totonacan",
34039,
aliases = {"Totonac-Tepehua", "Totonacan-Tepehuan"},
varieties = {"Totonac"},
}
m["nai-tqn"] = {
"Tequistlatecan",
1568317,
"hok",
aliases = {"Tequistlatec", "Chontal", "Chontalan", "Oaxacan Chontal", "Chontal of Oaxaca"},
}
m["nai-tsi"] = {
"Tsimshianic",
34134,
}
m["nai-utn"] = {
"Utian",
13371763,
"nai-you",
aliases = {"Miwok-Costanoan", "Mutsun"},
}
m["nai-wtq"] = {
"Wintuan",
1294259,
aliases = {"Wintun"},
}
m["nai-xin"] = {
"Xincan",
1546494,
aliases = {"Xinca"},
}
m["nai-ykn"] = {
"Yukian",
2406722,
aliases = {"Yuki-Wappo"},
}
m["nai-you"] = {
"Yok-Utian",
2886186,
}
m["nai-yuc"] = {
"Yuman-Cochimí",
579137,
}
m["ngf"] = {
"Trans-New Guinea",
34018,
}
m["ngf-ais"] = {
"Aisian",
nil,
"ngf-eso",
}
m["ngf-ang"] = {
"Angan",
3217366,
"ngf",
aliases = {"Kratke Range"}, -- Usher
}
m["ngf-ank"] = {
"Angal-Kewa",
12626916, -- exist in dewiki and hrwiki
"ngf-sak",
}
m["ngf-ask"] = {
"Asmat-Kamoro",
3031400,
"ngf",
-- Wikipedia uses Asmat-Kamoro to refer to a narrower group excluding the Sabakor languages (Buruwai and Kamberau,
-- which Glottolog splits into North Kamrau and South Kamrau [sic]), and uses Asmat-Kamrau to refer to what we and
-- Glottolog call Asmat-Kamoro. Glottolog does not recognize the narrower grouping.
aliases = {"Asmat-Kamrau", -- Wikipedia
"Asmat-Kamrau Bay", -- Usher
},
}
m["ngf-asm"] = {
"Asmat",
4807421,
"ngf-ask",
}
m["ngf-ata"] = {
"Ankave-Tainae-Akoye",
nil,
"ngf-ang",
aliases = {"Southwest Kratke Range"}, -- Usher
}
m["ngf-awd"] = {
"Awyu-Dumut", -- [[w:Awyu-Dumut languages]] redirects to [[w:Greater Awyu languages]]
4830163, -- exist in eswiki, hrwiki and ruwiki
"ngf-gaw",
aliases = {"Central Digul River"}, -- Usher
}
m["ngf-awy"] = {
"Awyu",
96372866,
"ngf-awd",
}
m["ngf-bda"] = {
"Becking-Dawi",
nil, -- Q55993716 ([[Category:Becking–Dawi languages]]) exists in enwiki
"ngf-gaw",
aliases = {"Becking and Dawi Rivers"}, -- Usher
}
m["ngf-bin"] = {
"Binanderean",
3217374, -- Wikidata doesn't distinguish Binanderean from Greater Binanderean
"ngf-gbi",
aliases = {"Oro"}, -- Usher (2020)
}
m["ngf-boa"] = {
"Boane",
nil,
"ngf-era",
aliases = {"Boana", -- Glottolog's name
"Wain"}, -- not in Usher; "Wain" often excludes Mungkip, perhaps because it's poorly documented
}
m["ngf-bos"] = {
"Bosavi",
4947122,
"ngf",
aliases = {"Papuan Plateau"}, -- alternative name given by Wikipedia
}
m["ngf-bsi"] = {
"Baruya-Simbari",
nil,
"ngf-ang",
aliases = {"Northwest Kratke Range"}, -- Usher
}
m["ngf-cda"] = {
"Central Dani",
nil,
"ngf-dan",
aliases = {"Dani"}, -- Usher
}
m["ngf-chw"] = {
"Chimbu-Wahgi",
3217383,
"ngf",
aliases = {"Simbu-Western Highlands"}, -- alternative name given by Wikipedia
}
m["ngf-dag"] = {
"Dagan",
5208454,
"ngf", -- not accepted as TNG by Glottolog but accepted by all others
aliases = {"Meneao Range"},
}
m["ngf-dal"] = {
"Dallman",
nil,
"ngf-huo",
aliases = {"Kinalakna-Kumukio", -- Pawley-Hammarström, who exclude Nomu, but they only had a numeral list of that language to work from
"Northeast Huon", -- Usher
},
}
m["ngf-dan"] = {
"Dani",
3217389,
"ngf",
-- Wikipedia renames the Dani languages to the Baliem Valley languages and sometimes (but not consistently)
-- reserves the name Dani (or "Dani proper") for a narrower group excluding Wano and the poorly attested Ngalik
-- languages (Nduga, Silimo, and the Yali dialect cluster, which we, following Ethnologue and Glottolog, split into
-- Anggurk Yali, Ninia Yali and Pass Valley Yali). Glottolog does not recognize the narrower grouping.
aliases = {"Baliem Valley", -- Wikipedia
"Balim Valley", -- Usher
},
}
m["ngf-dum"] = {
"Dumut", -- [[w:Dumut languages]] redirects to [[w:Greater Awyu languages]]
nil,
"ngf-awd",
aliases = {"Wambon"}, -- Usher
}
m["ngf-ehu"] = {
"Eastern Huon", -- Glottolog adds Ono and Sialum, Pawley-Hammarström adds Dedua
10567087,
"ngf-huo",
aliases = {"East Huon"}, -- Usher
}
m["ngf-eku"] = {
"East Kutubuan",
5328752,
"ngf", -- Not in TNG per Glottolog but accepted by all others. Sometimes grouped with Fasu to form a Kutubuan family.
aliases = {"East Kutubu"}, -- Glottolog's name
}
m["ngf-enc"] = {
"Engic",
nil,
"ngf-eng",
aliases = {"Engan", -- Glottolog
"Engan proper", -- Wikipedia
"North Engan", -- alternative name given by Wikipedia
"Trans-Enga", -- Usher
},
}
m["ngf-eng"] = {
"Engan",
3217449,
"ngf",
aliases = {"Enga-Kewa-Huli", -- Glottolog, Pawley-Hammarström
"Enga-Southern Highlands", -- Usher
},
}
m["ngf-era"] = {
"Erap",
nil,
"ngf-fin",
aliases = {"Erap River"}, -- Usher?
}
m["ngf-eso"] = {
"East Sogeram",
nil,
"ngf-sog",
}
m["ngf-est"] = {
"East Strickland",
5329440,
"ngf",
aliases = {"Strickland River"}, -- alternative name given by Wikipedia
}
m["ngf-eva"] = {
"Evapia",
nil,
"ngf-rai",
aliases = {"Evapia River"}, -- Usher
}
m["ngf-fgi"] = {
"Fore-Gimi",
nil,
"ngf-gor",
aliases = {"South Goroka"}, -- Usher
}
m["ngf-fhu"] = {
"Finisterre-Huon",
3217453,
"ngf",
aliases = {"Finisterre Range-Huon Peninsula"}, -- per Usher
}
m["ngf-fin"] = {
"Finisterre",
5450373,
"ngf-fhu",
aliases = {"Finisterre-Saruwaged", -- Glottolog's name
"Finisterre Range"}, -- per Usher
}
m["ngf-gah"] = {
"Gahuku",
nil,
"ngf-gor",
aliases = {"Alekano-Asaro River"}, -- Usher
}
m["ngf-gau"] = {
"Gauwa",
nil,
"ngf-kai",
aliases = {"West Kainantu"}, -- Usher
}
m["ngf-gaw"] = {
"Greater Awyu",
12627424,
"ngf",
aliases = {"Digul River"}, -- used by Usher (2020)
}
m["ngf-gbi"] = {
"Greater Binanderean",
3217374, -- Wikidata doesn't distinguish Binanderean from Greater Binanderean
"ngf", -- not placed in Trans-New Guinea in Usher (2020)
aliases = {"Guhu-Oro"}, -- Guhu-Oro is used in Usher (2020)
}
m["ngf-gko"] = {
"Gaena-Korafe",
11732347, -- considered a single Korafe language by Wikipedia
"ngf-bin",
aliases = {"Gaina-Korafe"}, -- Usher
}
m["ngf-gmo"] = {
"Gusap-Mot",
16110857,
"ngf-fin",
aliases = {"Mot River"}, -- Usher?
}
m["ngf-gor"] = {
"Goroka",
15478597,
"ngf-kgo",
}
m["ngf-gsu"] = {
"Gogodala-Suki",
5577428,
"ngf", -- Possibly in the proposed Papuan Gulf family. Not in TNG per Glottolog but accepted by all others.
aliases = {"Suki-Gogodala", -- Glottolog's name
"Suki-Aramia River", -- Used in Usher (2020)
},
}
m["ngf-gum"] = {
"Gum",
5618008,
"ngf-mab",
}
m["ngf-gvd"] = {
"Grand Valley Dani", -- considered a single language by Wikipedia
5595219,
"ngf-cda",
}
m["ngf-hag"] = {
"Hagen", -- [[w:Hagen languages]] redirects to [[w:Chimbu–Wahgi languages]]
nil,
"ngf-chw",
aliases = {"Melpa-Kaugel River"}, -- Usher
}
m["ngf-han"] = {
"Hanseman",
5651020,
"ngf-mab",
aliases = {"Hansemann Range"}, -- Usher
}
m["ngf-huo"] = {
"Huon",
5946109,
"ngf-fhu",
aliases = {"Huon Peninsula"}, -- per Usher
}
m["ngf-jim"] = {
"Jimi", -- [[w:Jimi languages]] and [[w:Jimi River languages]] redirect to [[w:Chimbu–Wahgi languages]]
nil,
"ngf-chw",
aliases = {"Jimi River"}, -- Usher
}
m["ngf-kab"] = {
"Kabwum",
nil,
"ngf-huo",
aliases = {"Timbe-Selepet-Komba", -- Pawley-Hammarström,
"Northwest Huon", -- Usher
},
}
m["ngf-kai"] = {
"Kainantu", -- Kambaira: under "unclassified Kainantu" (Glottolog), Tairora (Pawley-Hammarström), Gauwa (Usher)
15478590,
"ngf-kgo",
aliases = {"Gadsup-Auyana-Awa-Tairora"}, -- Wurm,
}
m["ngf-kak"] = {
"Kalam-Kobon",
6350303,
"ngf-ksa",
aliases = {"Kalam",
"Kaironk River"}, -- Usher (2020)
}
m["ngf-kau"] = {
"Kaukombar",
nil,
"ngf-nad",
aliases = {"Kaukombaran", -- Glottolog following Z'graggen (1975)
"Kaukombar River"}, -- Usher's term
}
m["ngf-kbm"] = {
"Kosorong-Burum-Mindik",
nil,
"ngf-huo",
aliases = {"Bulum River"}, -- Usher
}
m["ngf-kgo"] = {
"Kainantu-Goroka",
3217463,
"ngf",
aliases = {"Eastern Highlands"}, -- per Usher (2020)
}
m["ngf-khu"] = {
"Kewa-Huli",
nil,
"ngf-eng",
aliases = {"Huli-Southern Highlands"}, -- Usher
}
m["ngf-kma"] = {
"Kâte-Mape",
nil,
"ngf-ehu",
aliases = {"Kate-Mape-Sene", -- Pawley-Hammarström (with Sene),
"Southeast Huon", -- Usher
},
}
m["ngf-kme"] = {
"Kapau-Menya",
nil,
"ngf-ang",
aliases = {"Southeast Kratke Range"}, -- Usher
}
m["ngf-koi"] = {
"Koiarian",
11154240,
"ngf", -- not accepted as TNG by Glottolog but accepted by all others
aliases = {"Koiari-Managalas Plateau"},
}
m["ngf-kok"] = {
"Kokon", -- Usher calls it South Mabuso but includes Gum in it
nil,
"ngf-mab",
}
m["ngf-kow"] = {
"Kowan",
6435004,
"ngf-mad",
aliases = {"Isumrud Strait"}, -- per Usher (2020)
}
m["ngf-ksa"] = {
"Kalam-Southern Adelbert",
nil,
"ngf-mad",
aliases = {"Kalamic-South Adelbert", -- Glottolog
"West Madang"}, -- Usher (2020)
}
m["ngf-kto"] = {
"Kube-Tobo", -- per Glottolog, one language "Kulungtfu-Yuanggeng-Tobo"
1173235, -- code for Tobo-Kube language
"ngf-huo",
aliases = {"Tobo-Kube"},
}
m["ngf-kts"] = {
"Komyandaret-Tsaukambo",
nil,
"ngf-bda",
aliases = {"Becking River"}, -- Usher
}
m["ngf-kum"] = {
"Kumil",
nil,
"ngf-nad",
aliases = {"Kumilan", -- Pawley-Hammarström following Z'graggen (1975)
"Kumil River"}, -- Usher's term
}
m["ngf-kya"] = {
"Kamano-Yagaria",
nil,
"ngf-gor",
aliases = {"Henganofi", -- Usher
"Kamano-Yagaria-Keigana",
},
}
m["ngf-lok"] = {
"Lowland Ok",
nil,
"ngf-okk",
}
m["ngf-mab"] = {
"Mabuso",
6721668,
"ngf-mad",
}
m["ngf-mad"] = {
"Madang",
11217556,
"ngf",
aliases = {"Madang-Adelbert Range"}, -- Z'graggen (1975), corresponding to today's Madang except in lacking Kalam and Gants
}
m["ngf-mek"] = {
"Mek",
6810515,
"ngf",
aliases = {"Goliath"}, -- outdated alternative name given by Wikipedia
}
m["ngf-min"] = {
"Mindjim",
86749913,
"ngf-mad",
aliases = {"Lower Minjim", -- Glottolog, placed in Rai Coast by Glottolog and Pawley-Hammarström; Glottolog's
-- Mindjim has 6 languages, including "Upper Minjim" (Rerau and Sgi Bara)
"Mindjim River", -- Usher
"Minjim", "Minjim River",
},
}
-- Add if Molet is separated from Asaro'o
-- m["ngf-moa"] = {
-- "Molet-Asaro'o",
-- nil,
-- "ngf-war",
-- }
m["ngf-mok"] = {
"Mountain Ok", -- [[w:Mountain Ok languages]] redirects to [[w:Ok languages]]
nil,
"ngf-okk",
}
m["ngf-mom"] = {
"Mombum",
6897077,
"ngf", -- not accepted as TNG by Glottolog but accepted by all others
aliases = {"Mombum-Koneraw", "Komolom", "Muli Strait"}, -- Pawley-Hammarström uses Komolom, Usher uses Muli Strait
}
m["ngf-msu"] = {
"Mian-Suganga", -- considred a single Mian language by Wikipedia
12952846,
"ngf-mok",
aliases = {"Mianic"}, -- Glottolog
}
m["ngf-nad"] = {
"Northern Adelbert", -- not accepted by Pawley-Hammarström
16952821, -- code for Croisilles linkage
"ngf-mad",
aliases = {"Adelbert Range-Isumrud Strait", -- Usher (2020)
"North Adelbert",
"Pihom-Isumrud"}, -- Ross?
}
m["ngf-nbi"] = {
"North Binanderean",
nil,
"ngf-bin",
aliases = {"Suena-Zia"}, -- Usher
}
m["ngf-nde"] = {
"Ndeiram", -- [[w:Ndeiram River languages]] redirects to [[w:Greater Awyu languages]]
nil,
"ngf-awd",
aliases = {"Ndeiram River"}, -- Usher?
}
m["ngf-ngn"] = {
"Ngalik-Nduga", -- [[w:Ngalik languages]] redirects to [[w:Baliem Valley languages]] = Dani languages
nil,
"ngf-dan",
aliases = {"Ngalik"}, -- Usher
}
m["ngf-nso"] = {
"North Sogeram",
nil,
"ngf-sog",
aliases = {"Mum-Sirva", -- Usher
"North Central Sogeram", -- used by those who accept Central Sogeram (= North Sogeram + Apali and Manat)
"North-Central Sogeram", -- rarer than without the dash
"Sikan"}, -- Z’graggen (1975?)
}
m["ngf-num"] = {
"Numugen",
nil,
"ngf-nad",
aliases = {"Numugenan", -- Glottolog following Z'graggen 1975
"Numugen River"}, -- Usher's term
}
m["ngf-nur"] = {
"Nuru", -- Usher excludes Yangulam, Pawley-Hammarström include Jilim and Rerau
nil,
"ngf-rai",
aliases = {"Nuru River"}, -- Usher?
}
m["ngf-nwh"] = {
"Northwest Hanseman", -- Usher
nil,
"ngf-han",
aliases = {"Wamas-Samosa-Murupi-Mosimo"}, -- Glottolog, Greenhill, and Pawley-Hammarström following Z'graggen; the most common name, but very unwieldy
}
m["ngf-oen"] = {
"Outer Engan", -- considered a single Nete language by Wikipedia
6998869,
"ngf-enc",
aliases = {"Nete-Bisorio"}, -- Usher
}
m["ngf-okk"] = {
"Ok",
7081687,
"ngf",
}
m["ngf-omo"] = {
"Omosan", -- not included in (Greater) Northern Adelbert by Glottolog, but a sister
nil,
"ngf-nad",
}
m["ngf-oro"] = {
"Orokaivic",
7103752, -- considered a single Orokaiva language by Wikipedia
"ngf-bin",
aliases = {"Central Oro"}, -- Usher
}
m["ngf-pan"] = {
"Paniai Lakes",
6035631,
"ngf",
aliases = {"Wissel Lakes", "Wissel Lakes-Kemandoga River"}, -- alternative names given by Wikipedia
}
m["ngf-pek"] = {
"Peka",
nil,
"ngf-rai",
aliases = {"Peka River"}, -- Usher?
}
m["ngf-pom"] = {
"Pomoikan",
nil,
"ngf-sad",
}
m["ngf-rai"] = {
"Rai Coast",
7283663,
"ngf-mad",
aliases = {"South Madang"}, -- Usher
}
m["ngf-sab"] = {
"Sabakor", -- [[w:Sabakor languages]] redirects to [[w:Asmat–Kamrau languages]]
nil, -- 55994614 is for [[Category:Kamrau Bay languages]], which exists on enwiki
"ngf-ask",
aliases = {"Kamrau Bay"}, -- Usher
}
m["ngf-sad"] = {
"Southern Adelbert",
12633980,
"ngf-ksa",
aliases = {"South Adelbert", -- Glottolog
"Southern Adelbert Range", -- Z'graggen (1980)
"Sogeram and Tomul Rivers"}, -- Usher (2020)?
}
m["ngf-sak"] = {
"Sau-Angal-Kewa",
nil,
"ngf-khu",
aliases = {"Southern Highlands"}, -- Usher
}
m["ngf-san"] = {
"Sankwep",
nil,
"ngf-huo",
aliases = {"Nabak-Momolili", -- Pawley-Hammarström,
"Southwest Huon", -- Usher
},
}
m["ngf-sbh"] = {
"South Bird's Head",
7566330,
"ngf",
}
m["ngf-sim"] = {
"Simbu",
nil,
"ngf-chw",
}
m["ngf-sog"] = {
"Sogeram",
86750419,
"ngf-sad",
aliases = {"Sogeram River", -- Usher
"Wanang"},
}
m["ngf-sop"] = {
"Sopac",
nil,
"ngf-ehu",
aliases = {"Momare-Migabac", -- Pawley-Hammarström,
"Masaweng River", -- Usher
},
}
m["ngf-taa"] = {
"Tainae-Akoye",
nil,
"ngf-ata",
aliases = {"Akoye-Tainae"}, -- Usher
}
m["ngf-tai"] = {
"Tairora",
nil,
"ngf-kai",
aliases = {"Tairoric", -- Glottolog,
"East Kainantu", -- Usher
},
}
m["ngf-tib"] = {
"Tiboran",
nil,
"ngf-nad",
aliases = {"Nuclear Tibor", -- Glottolog, excluding Wanambre/Mokati
"Tiboran River", -- Usher (2020)
"Tibor", -- Pick (2020) and Glottolog including Wanambre/Mokati
}
}
m["ngf-tna"] = {
"Tangko-Nakai",
nil,
"ngf-okk",
aliases = {"Central Ok"}, -- Usher
}
m["ngf-uru"] = {
"Uruwa",
nil,
"ngf-fin",
aliases = {"Uruwa River"}, -- Usher?
}
m["ngf-usi"] = {
"Utu-Silopi",
nil,
"ngf-han",
aliases = {"Silopi-Utu"}, -- Usher
}
m["ngf-waa"] = {
"Wantoat-Awara", -- not in Usher but Wantoat and Awara form a dialect chain
nil,
"ngf-wan",
aliases = {"Awara-Wantoat"}, -- per Wikipedia
}
m["ngf-wah"] = {
"Wahgi", -- [[w:Wahgi languages]] redirects to [[w:Chimbu–Wahgi languages]]
nil,
"ngf-chw",
aliases = {"Wahgi Valley"}, -- Usher
}
m["ngf-wan"] = {
"Wantoatic",
nil,
"ngf-fin",
aliases = {"Wantoat",
"Wantoat River", -- Usher?
},
}
m["ngf-war"] = {
"Warup",
12645082,
"ngf-fin",
aliases = {"Warup River"}, -- Usher?
}
m["ngf-woj"] = {
"Wojokesic",
nil,
"ngf-ang",
aliases = {"Northeast Kratke Range"}, -- Usher
}
m["ngf-wok"] = {
"West Ok",
nil,
"ngf-okk",
aliases = {"Kwer-Kopkaka-Burumakok"}, -- Glottolog, Pawley-Hammarström
}
m["ngf-wso"] = {
"West Sogeram",
nil,
"ngf-sog",
aliases = {"Mand-Nend", -- Usher
"Atan", -- Wurm following Z'graggen
},
}
m["ngf-yag"] = {
"Yaganon", -- placed in Rai Coast by Glottolog and Pawley-Hammarström
35323986,
"ngf-mad",
aliases = {"Yaganon River"}, -- Usher
}
m["ngf-yal"] = {
"Yali", -- considered a single language by Wikipedia
8047468,
"ngf-ngn",
aliases = {"Ngalik"}, -- Glottolog, Pawley-Hammarström
}
m["ngf-yar"] = {
"Yareban",
16977672,
"ngf", -- not accepted as TNG by Glottolog but accepted by all others
aliases = {"Musa River"},
}
m["ngf-ynu"] = {
"Yau-Nungon",
12953319, -- for the single Yau language in Wikipedia ([[w:Yau language (Trans–New Guinea)]])
"ngf-uru",
}
m["ngf-yup"] = {
"Yupna",
nil,
"ngf-fin",
aliases = {"Yupna River"}, -- Usher?
}
m["nic"] = {
"Niger-Congo",
33838,
aliases = {"Niger-Kordofanian"},
}
m["nic-alu"] = {
"Alumic",
4737355,
"nic-plt",
}
m["nic-bas"] = {
"Basa",
4866154,
"nic-knj",
}
m["nic-bbe"] = {
"Eastern Beboid",
nil,
"nic-beb",
}
m["nic-bco"] = {
"Benue-Congo",
33253,
"nic-vco",
}
m["nic-bcr"] = {
"Bantoid-Cross",
806983,
"nic-bco",
}
m["nic-bdn"] = {
"Northern Bantoid",
nil,
"nic-bod",
aliases = {"North Bantoid"},
}
m["nic-bds"] = {
"Southern Bantoid",
3183152,
"nic-bod",
aliases = {"Wide Bantu", "Bin"},
}
m["nic-beb"] = {
"Beboid",
813549,
"nic-bds",
}
m["nic-ben"] = {
"Bendi",
4887065,
"nic-bcr",
}
m["nic-beo"] = {
"Beromic",
4894642,
"nic-plt",
}
m["nic-bod"] = {
"Bantoid",
806992,
"nic-bcr",
}
m["nic-buk"] = {
"Buli-Koma",
nil,
"nic-ovo",
}
m["nic-bwa"] = {
"Bwa",
12628562,
"nic-gur",
other_names = {"Bwamu", "Bomu"},
}
m["nic-cde"] = {
"Central Delta",
3813191,
"nic-cri",
}
m["nic-cri"] = {
"Cross River",
1141096,
"nic-bcr",
}
m["nic-dag"] = {
"Dagbani",
nil,
"nic-wov",
}
m["nic-dak"] = {
"Dakoid",
1157745,
"nic-bdn",
}
m["nic-dge"] = {
"Escarpment Dogon",
5397128,
"qfa-dgn",
}
m["nic-dgw"] = {
"West Dogon",
nil,
"qfa-dgn",
}
m["nic-eko"] = {
"Ekoid",
1323395,
"nic-bds",
}
m["nic-eov"] = {
"Eastern Oti-Volta",
nil,
"nic-ovo",
aliases = {"Samba"},
}
m["nic-fru"] = {
"Furu",
5509783,
"nic-bds",
}
m["nic-gne"] = {
"Eastern Gurunsi",
12633072,
"nic-gns",
aliases = {"Eastern Grũsi"},
}
m["nic-gnn"] = {
"Northern Gurunsi",
nil,
"nic-gns",
aliases = {"Northern Grũsi"},
}
m["nic-gnw"] = {
"Western Gurunsi",
nil,
"nic-gns",
aliases = {"Western Grũsi"},
}
m["nic-gns"] = {
"Gurunsi",
721007,
"nic-gur",
aliases = {"Grũsi"},
}
m["nic-gre"] = {
"Eastern Grassfields",
5330160,
"nic-grf",
}
m["nic-grf"] = {
"Grassfields",
750932,
"nic-bds",
aliases = {"Grassfields Bantu", "Wide Grassfields"},
}
m["nic-grm"] = {
"Gurma",
30587833,
"nic-ovo",
}
m["nic-grs"] = {
"Southwest Grassfields",
7571285,
"nic-grf",
}
m["nic-gur"] = {
"Gur",
33536,
"alv-sav",
aliases = {"Voltaic"},
}
m["nic-ief"] = {
"Ibibio-Efik",
2743643,
"nic-lcr",
}
m["nic-jer"] = {
"Jera",
nil,
"nic-kne",
}
m["nic-jkn"] = {
"Jukunoid",
1711622,
"nic-pla",
}
m["nic-jrn"] = {
"Jarawan",
1683430,
"nic-mba",
}
m["nic-jrw"] = {
"Jarawa",
35423,
"nic-jrn",
}
m["nic-kam"] = {
"Kambari",
6356294,
"nic-knj",
}
m["nic-ktl"] = {
"Katloid",
nil,
"nic",
}
m["nic-kau"] = {
"Kauru",
nil,
"nic-kne",
}
m["nic-kmk"] = {
"Kamuku",
6359821,
"nic-knj",
}
m["nic-kne"] = {
"East Kainji",
5328687,
"nic-knj",
}
m["nic-knj"] = {
"Kainji",
681495,
"nic-pla",
}
m["nic-knn"] = {
"Northwest Kainji",
7060098,
"nic-knj",
}
m["nic-ktl"] = {
"Katloid",
6377681,
"nic",
aliases = {"Katla", "Katla-Tima"},
}
m["nic-lcr"] = {
"Lower Cross River",
3813193,
"nic-cri",
}
m["nic-mam"] = {
"Mamfe",
2005898,
"nic-bds",
aliases = {"Nyang"},
}
m["nic-mba"] = {
"Mbam",
687826,
"nic-bds",
}
m["nic-mbc"] = {
"Mba",
6799561,
"nic-ubg",
}
m["nic-mbw"] = {
"West Mbam",
nil,
"nic-mba",
}
m["nic-mmb"] = {
"Mambiloid",
1888151,
other_names = {"North Bantoid"}, -- per Wikipedia, North Bantoid is the parent family
"nic-bdn",
}
m["nic-mom"] = {
"Momo",
6897393,
"nic-grf",
}
m["nic-mre"] = {
"Moré",
nil,
"nic-wov",
}
m["nic-ngd"] = {
"Ngbandi",
36439,
"nic-ubg",
}
m["nic-nge"] = {
"Ngemba",
7022271,
"nic-gre",
}
m["nic-ngk"] = {
"Ngbaka",
3217499,
"nic-ubg",
}
m["nic-nin"] = {
"Ninzic",
7039282,
"nic-plt",
}
m["nic-nka"] = {
"Nkambe",
7042520,
"nic-gre",
}
m["nic-nkb"] = {
"Baka",
nil,
"nic-nkw",
}
m["nic-nke"] = {
"Eastern Ngbaka",
nil,
"nic-ngk",
}
m["nic-nkg"] = {
"Gbanziri",
nil,
"nic-nkw",
}
m["nic-nkk"] = {
"Kpala",
nil,
"nic-nkw",
}
m["nic-nkm"] = {
"Mbaka",
nil,
"nic-nkw",
}
m["nic-nkw"] = {
"Western Ngbaka",
nil,
"nic-ngk",
}
m["nic-npd"] = {
"North Plateau Dogon",
nil,
"qfa-dgn",
}
m["nic-nun"] = {
"Nun",
13654297,
"nic-gre",
}
m["nic-nwa"] = {
"Nanga-Walo",
nil,
"qfa-dgn",
}
m["nic-ogo"] = {
"Ogoni",
2350726,
"nic-cri",
aliases = {"Ogonoid"},
}
m["nic-ovo"] = {
"Oti-Volta",
1157178,
"nic-gur",
}
m["nic-pla"] = {
"Platoid",
453244,
"nic-bco",
aliases = {"Central Nigerian"},
}
m["nic-plc"] = {
"Central Plateau",
5061668,
"nic-plt",
}
m["nic-pld"] = {
"Plains Dogon",
nil,
"qfa-dgn",
}
m["nic-ple"] = {
"East Plateau",
5329154,
"nic-plt",
}
m["nic-pls"] = {
"South Plateau",
7568236,
"nic-plt",
aliases = {"Jilic-Eggonic"},
}
m["nic-plt"] = {
"Plateau",
1267471,
"nic-pla",
}
m["nic-ras"] = {
"Rashad",
3401986,
"nic",
}
m["nic-rnc"] = {
"Central Ring",
nil,
"nic-rng",
}
m["nic-rng"] = {
"Ring",
2269051,
"nic-grf",
aliases = {"Ring Road"},
}
m["nic-rnn"] = {
"Northern Ring",
nil,
"nic-rng",
}
m["nic-rnw"] = {
"Western Ring",
nil,
"nic-rng",
}
m["nic-ser"] = {
"Sere",
7453058,
"nic-ubg",
}
m["nic-shi"] = {
"Shiroro",
7498953,
"nic-knj",
aliases = {"Pongu"},
}
m["nic-sis"] = {
"Sisaala",
36532,
"nic-gnw",
}
m["nic-tar"] = {
"Tarokoid",
2394472,
"nic-plt",
}
m["nic-tiv"] = {
"Tivoid",
752377,
"nic-bds",
}
m["nic-tvc"] = {
"Central Tivoid",
nil,
"nic-tiv",
}
m["nic-tvn"] = {
"Northern Tivoid",
nil,
"nic-tiv",
}
m["nic-ubg"] = {
"Ubangian",
33932,
"nic-vco", -- or none
}
m["nic-uce"] = {
"East-West Upper Cross River",
nil,
"nic-ucr",
}
m["nic-ucn"] = {
"North-South Upper Cross River",
nil,
"nic-ucr",
}
m["nic-ucr"] = {
"Upper Cross River",
4108624,
"nic-cri",
aliases = {"Upper Cross"},
}
m["nic-vco"] = {
"Volta-Congo",
37228,
"alv",
}
m["nic-wov"] = {
"Western Oti-Volta",
nil,
"nic-ovo",
aliases = {"Moré-Dagbani"}
}
m["nic-ykb"] = {
"Yukubenic",
16909196,
"nic-plt",
aliases = {"Oohum"},
}
m["nic-ymb"] = {
"Yambasa",
nil,
"nic-mba",
}
m["nic-yon"] = {
"Yom-Nawdm",
nil,
"nic-ovo",
aliases = {"Moré-Dagbani"}
}
m["njo"] = {
"Ao",
28433,
"sit-aao",
aliases = {"Ao Naga"},
}
m["nub"] = {
"Nubian",
1517194,
"sdv-nes",
}
m["nub-hil"] = {
"Hill Nubian",
5762211,
"nub",
aliases = {"Kordofan Nubian"},
}
m["omq"] = {
"Oto-Manguean",
33669,
}
m["omq-cha"] = {
"Chatino",
35111,
"omq-zap",
}
m["omq-chi"] = {
"Chinantecan",
35828,
"omq",
}
m["omq-cui"] = {
"Cuicatec",
616024,
"omq-mix",
}
m["omq-maz"] = {
"Mazatecan",
36230,
"omq",
aliases = {"Mazatec"},
}
m["omq-mix"] = {
"Mixtecan",
21083066,
"omq",
}
m["omq-mxt"] = {
"Mixtec",
36363,
"omq-mix",
}
m["omq-otp"] = {
"Oto-Pamean",
1270220,
"omq",
}
m["omq-pop"] = {
"Popolocan",
5132273,
"omq",
}
m["omq-tri"] = {
"Triqui",
780200,
"omq-mix",
aliases = {"Trique"},
}
m["omq-zap"] = {
"Zapotecan",
8066463,
"omq",
}
m["omq-zpc"] = {
"Zapotec",
13214,
"omq-zap",
}
m["omv"] = {
"Omotic",
33860,
"afa",
}
m["omv-aro"] = {
"Aroid",
3699526,
"omv",
aliases = {"Ari-Banna", "South Omotic", "Somotic"},
}
m["omv-diz"] = {
"Dizoid",
430251,
"omv",
aliases = {"Maji", "Majoid"},
}
m["omv-eom"] = {
"East Ometo",
20527288,
"omv-ome",
}
m["omv-gon"] = {
"Gonga",
4143043,
"omv",
aliases = {"Kefoid"},
}
m["omv-mao"] = {
"Mao",
1351495,
"omv",
}
m["omv-nom"] = {
"North Ometo",
nil,
"omv-ome",
}
m["omv-ome"] = {
"Ometo",
36310,
"omv",
}
m["oto"] = {
"Otomian",
130372545,
"omq-otp",
}
m["oto-otm"] = {
"Otomi",
36355,
"oto",
}
m["paa"] = {
"Papuan",
236425,
"qfa-not",
}
m["paa-aia"] = {
"Aian",
4767739, -- Annaberg languages
"paa-ram",
aliases = {"Middle Ramu", -- Foley (with Rao),
"Annaberg", -- with Rao
"Aram-Aren", -- Usher
},
}
m["paa-alp"] = {
"Alor-Pantar",
3502429,
"paa-tap",
}
m["paa-amu"] = {
"Amto-Musan",
480281,
aliases = {"Samaia River"},
}
m["paa-ani"] = {
"Anim",
55603991,
aliases = {"Fly River"},
}
m["paa-ara"] = {
"Arapesh",
4784223,
"paa-koa",
aliases = {"Arapeshan"}, -- Foley
}
m["paa-arf"] = {
"Arafundi",
4783702,
}
m["paa-ata"] = {
"Ataitan",
4812652,
"paa-ram",
aliases = {"Tangu", -- Foley
"Tanggu", -- alternative name given by Wikipedia
"Moam River", -- Usher
},
}
m["paa-baa"] = {
"Bayono-Awbono",
2424781,
}
m["paa-bai"] = {
"Baining",
748487,
aliases = {"East New Britain"},
}
m["paa-baw"] = {
"Bosngun-Awar",
nil,
"paa-ott",
aliases = {"East Ramu Coast", -- Usher
"Bosman-Awar", -- Wikipedia
},
}
m["paa-bew"] = {
"Bewani", -- [[w:Bewani languages]] redirects to [[w:Border languages (New Guinea)]]; but Croatian Wikipedia has an entry
16113460,
"paa-bor",
aliases = {"Poal River"}, -- Usher
}
m["paa-boa"] = {
"Boazi",
48803717,
"paa-mby",
aliases = {"Lake Murray"}, -- Usher
}
m["paa-bor"] = {
"Border",
1752158,
aliases = {"Upper Tami",
"Tami River-Bewani Range", -- Usher
},
}
m["paa-bul"] = {
"Bulaka River",
4987195,
aliases = {"Yelmek-Maklew", "Jabga"}, -- Yelmek-Maklew in Evans (2018) and Gregor (2021)
}
m["paa-bvi"] = {
"Betaf-Vitou", -- Glottolog
nil,
"paa-tor",
aliases = {"Vitou-Betaf", -- Wikipedia
"Fitou-Tena", -- Usher
"Manirem",
},
}
m["paa-clp"] = {
"Central Lakes Plain", -- [[w:Central Lakes Plain languages]] redirects to [[w:Lakes Plain languages]]
nil, -- Q86780132 is for the corresponding category, which exists in enwiki
"paa-lpl",
aliases = {"East Tariku", -- Glottolog
"Central Lakes Plains", -- Usher
},
}
m["paa-dtu"] = {
"Doso-Turumsa",
16917784,
-- possibly related to East Strickland languages
aliases = {"Soari River"}, -- Usher's name
}
m["paa-ebh"] = {
"East Bird's Head",
338064,
aliases = {"Mantion-Meax", "Mantion-Meyah", -- Mantion-Meax is Wikipedia's term
"Southeast Bird's Head", -- Usher (2020)
},
}
m["paa-eel"] = {
"Eastern Eleman",
nil,
"paa-ele",
aliases = {"East Eleman"},
}
m["paa-egb"] = {
"East Geelvink Bay",
1497678,
aliases = {"Geelvink Bay", "East Cenderawasih"}, -- Geelvink Bay per Glottolog
}
m["paa-eke"] = {
"East Keram",
nil,
"paa-ker",
}
m["paa-ele"] = {
"Eleman",
3034298,
aliases = {"Kerema Bay"},
}
m["paa-elp"] = {
"East Lakes Plain", -- [[w:East Lakes Plain languages]] redirects to [[w:Lakes Plain languages]]; but Croatian Wikipedia has an entry
12633078,
"paa-lpl",
aliases = {"East Lakes Plains"}, -- Usher
}
m["paa-epw"] = {
"Eastern Pauwasi",
16115496,
aliases = {"East Pauwasi"},
}
m["paa-etf"] = {
"Eastern Trans-Fly",
5330530,
aliases = {"Oriomo"}, -- in increasing recent use, probably originating in Evans (2018)
}
m["paa-eti"] = {
"East Timor",
15496066,
"paa-tap",
aliases = {"Oirata-Makasae", -- Wikipedia's name
"Eastern Timor", -- alternative name given by Wikipedia
"Fataluku-Makasai", "Oirata-Makasai", -- alternative names given by Wikidata
},
}
m["paa-fas"] = {
"Fas",
3502658,
aliases = {"Baibai-Fas"}, -- Glottolog's name
}
m["paa-flp"] = {
"Far West Lakes Plain", -- [[w:Wapoga River languages]] redirects to [[w:Lakes Plain languages]]
nil, -- Q86808337 is for the corresponding Wapoga languages category, which exists in enwiki
"paa-lpl",
aliases = {"Rasawa", -- Clouse (1997)
"Wapoga River", -- Usher, including Kehu/Keuw (unclassified by others)
},
}
m["paa-gkw"] = {
"Greater Kwerba",
12635134,
aliases = {"West Foja Range", -- Usher
"Kwerbic", -- Wikipedia
"Kwerba", -- Foley (2018)
},
}
m["paa-gto"] = {
"Galela-Tobelo",
nil,
"paa-nnh",
aliases = {"Mainland North Halmaheran", -- Glottolog
"Mainland North Halmahera", "Northeast Halmahera", -- alternative names
"Northeast Halmaheran", -- Wikipedia, from Verhoeve 1988
},
}
m["paa-hya"] = {
"Heyo-Yahang",
nil,
"paa-mam",
aliases = {"Yahang-Heyo"}, -- Wikipedia's name
}
m["paa-ing"] = {
"Inland Gulf",
6034783,
"paa-ani",
aliases = {"Inland Gulf of Papua"}, -- Glottolog
}
m["paa-isk"] = {
"Inner Sko",
65043889,
"paa-sko",
aliases = {"Skouic", -- Glottolog
"West Vanimo Coast", -- Usher
"Western Skou", -- Wikipedia
"Inner Skou", "Nuclear Skou", -- alternative names given by Wikipedia
},
}
m["paa-iwa"] = {
"Iwam",
15147853,
"paa-sep",
}
m["paa-kae"] = {
"Kamula-Elevala",
130390498,
-- often placed in TNG
aliases = {"Kamula-Elevala River"},
}
m["paa-kan"] = {
"Kanum", -- removed from Tonda by Glottolog
nil,
"paa-ton",
}
m["paa-kay"] = {
"Kayagaric",
7566330,
aliases = {"Kayagar", -- formerly common
"Cook River"}, -- per Usher (2020)
}
m["paa-ker"] = {
"Keram",
48768173,
-- often grouped within or coordinate with the Ramu languages
aliases = {"Keram River"},
}
m["paa-kiw"] = {
"Kiwaian",
338449,
aliases = {"Kiwai"}, -- formerly common, still sees some use
}
m["paa-kko"] = {
"Kaure-Kosare", -- rejected by Pawley-Hammarström but accepted by Glottolog, Foley (2018) and Usher (2020)
48767891,
aliases = {"Nawa River"}, -- Usher's term
}
m["paa-koa"] = {
"Kombio-Arapesh",
16115049,
"paa-trr",
aliases = {"Kombio-Arapeshan", -- Laycock, who includes Wom
"Kombio-Arapesh-Urat", -- Glottolog, including Urat
},
}
m["paa-kol"] = {
"Kolopom",
6427807,
}
m["paa-kom"] = {
"Kombio",
65044238,
"paa-koa",
aliases = {"Kombian", -- Laycock
"Kombio-Yambes", -- Glottolog
},
}
m["paa-kun"] = {
"Kunimaipan",
134973258,
aliases = {"Northwest Wharton Range"}, -- per Usher (2020)
-- often considered a subfamily of Goilalan
}
m["paa-kwa"] = {
"Kwalean",
6450053,
aliases = {"Humene-Uare"},
}
m["paa-kwe"] = {
"Kwerba proper",
12635134,
"paa-gkw",
aliases = {"Kwerba", -- Usher
"Kwerbaic", -- Glottolog
},
}
m["paa-kwo"] = {
"Kwomtari",
2075415,
aliases = {"Kwomtari-Nai"}, -- Senu River is a larger unproven proposal
}
m["paa-lla"] = {
"Loloda-Laba", -- a single language in Glottolog (Loloda-Laba) and Wikipedia (Loloda)
11732388, -- for the Loloda language
"paa-gto",
aliases = {"Loloda"}, -- Wikipedia's name
}
m["paa-lma"] = {
"Left May",
614468,
aliases = {"Arai River"}, -- per Usher (2020)
-- Sometimes in a putative Arai-Samaia family along with Amto-Musan and the Pyu language
}
m["paa-lmu"] = {
"Lepki-Murkim", -- Kembra accepted by Glottolog and Usher; not by Foley (2020) but does not exclude the possibility
-- of a relationship
85776285,
-- independent family per Glottolog, part of South Pauwasi River family (under Pauwasi) per Usher (2020)
aliases = {"Lepki-Murkim-Kembra"}, -- Glottolog
}
m["paa-lpl"] = {
"Lakes Plain",
6478969,
aliases = {"Lakes Plains"},
}
m["paa-lra"] = {
"Lower Ramu",
65089469,
"paa-ram",
aliases = {"Ottilien-Misegian"}, -- alternative name given by Wikipedia
}
m["paa-lse"] = {
"Lower Sepik",
7061700,
aliases = {"Nor-Pondo"},
}
m["paa-mai"] = {
"Mairasi",
6736896,
aliases = {"Mairasic"}, -- per Glottolog
}
m["paa-mal"] = {
"Mailuan",
6735839,
aliases = {"Cloudy Bay"},
}
m["paa-mam"] = {
"Maimai", -- Foley's Maimai is expanded
53679325, -- this is the code for the expanded Maimai with 6 languages, as opposed to the 3 in "Nuclear Maimai"
"paa-trr",
aliases = {"Nuclear Maimai", -- Glottolog's name
"Maimai proper", -- Wikipedia's name
},
}
m["paa-man"] = {
"Manubaran",
6752335,
aliases = {"Mount Brown"},
}
m["paa-mar"] = {
"Marienberg",
1570589,
"paa-trr",
aliases = {"Marienberg Hills"}, -- Usher
}
m["paa-may"] = {
"Maybratic",
4830892, -- the code for the Maybrat language in Wikipedia, which subsumes the two languages of this family
-- putatively included in West Papuan but generally considered an isolated family
aliases = {"Maybrat-Karon"},
}
m["paa-mbi"] = {
"Mbaham-Iha",
85784512,
"qfa-dis", -- Papuan languages; Glottolog groups Karas (Kalamang) with Mbaham-Iha into a (mainland) West Bomberai
-- family and stops there; Wikipedia, following Usher and Schapper (2022), groups Karas, Mbaham-Iha
-- and the large Timor-Alor-Pantar family into a (Greater) West Bomberai family, saying that Karas is no
-- closer to Mbaham-Iha than to Timor-Alor-Pantar.
aliases = {"Mbahaam-Iha", -- used by Wikidata
"Nuclear West Bomberai", -- Glottolog's name
},
}
m["paa-mby"] = {
"Marind-Boazi-Yaqay",
3217484,
"paa-ani",
aliases = {"Marind-Boazi-Yaqai", -- Glottolog
"Marind-Yakhai", -- Usher, without Boazi
"Marind-Yaqai", -- Wikidata
"Marind", -- alternative name given by Wikipedia
"Marind-Arandai", -- alternative name given by Spanish Wikipedia
},
}
m["paa-mmu"] = {
"Mandi-Muniwara",
nil,
"paa-mar",
aliases = {"West Marienberg Hills"}, -- Usher
}
m["paa-mon"] = {
"Monumbo", -- per Glottolog: "No evidence for the Bogia (Monumbo) languages being related to other Torricelli languages was ever presented"
16928417,
aliases = {"Bogia", -- Glottolog
"Bogia Bay", -- Usher (2020)
},
}
m["paa-mri"] = {
"Marindic", -- [[w:Marindic languages]] redirects to [[w:Marind–Yaqai languages]]
nil,
"paa-mby",
aliases = {"Marind"}, -- Usher; a single language
}
m["paa-nam"] = {
"Nambu",
6961418,
"paa-yam",
aliases = {"East Morehead River"}, -- Usher
}
m["paa-nbo"] = {
"North Bougainville",
749496,
}
m["paa-ndu"] = {
"Ndu",
3217498,
"paa-sep", -- Not accepted by Glottolog
aliases = {"Ndu-Nggala"}, -- Usher
}
m["paa-ngk"] = {
"Ngkolmpu", -- considered a single language by Wikipedia
5908646,
"paa-kan",
aliases = {"Ngkantr", -- Glottolog
"Ngkolmpu Kanum", -- Wikipedia
"Ngkontar", -- alternative name given by Wikipedia
"Kanum", -- used by Wikidata
},
}
m["paa-nha"] = {
"North Halmahera",
3217358,
-- possibly in a proposed West Papuan family or an independent family
}
m["paa-nim"] = {
"Nimboran",
12638426,
aliases = {"Nimboranic", -- per Glottolog
"Grime River", -- per Usher (2020)
}
}
m["paa-nnd"] = {
"Nuclear Ndu",
nil,
"paa-ndu",
aliases = {"Ndu", -- Usher, with Boiken/Boikin
"Ndu proper", -- Wikipedia
},
}
m["paa-nnh"] = {
"Northern North Halmahera",
nil,
"paa-nha",
aliases = {"Northern North Halmaheran", -- Glottolog
"Halmahera", -- Usher
"Core Halmaheran", -- Wikipedia
},
}
m["paa-nto"] = {
"Namla-Tofanma",
16918187,
-- independent family per Glottolog and Foley (2018), part of West Pauwasi family (under Pauwasi) per Usher (2020)
}
m["paa-ott"] = {
"Ottilien",
7109477,
"paa-lra",
aliases = {"Ramu Coast", -- Usher
"Watam-Awar-Gamay", -- alternative name given by Wikipedia
},
}
m["paa-pah"] = {
"Pahoturi River",
17049141,
aliases = {"Pahoturi"}, -- per Glottolog
}
m["paa-pal"] = {
"Palei", -- Laycock adds Agi and Nabi/Nambi(-Metan)
65089113,
"paa-wpa",
aliases = {"Nuclear Palai"},
}
m["paa-pia"] = {
"Piawi", -- per Wikipedia, grouped with Arafundi languages to form Upper Yuat, which is a sister to Madang
7190400,
aliases = {"Schraeder Range", -- Usher?
"Waibuk"},
}
m["paa-pio"] = {
"Piore River",
65043152,
"paa-sko",
aliases = {"Barupu Lagoon", -- Glottolog
"Lagoon", -- alternative name given by Wikipedia
},
}
m["paa-por"] = {
"Porapora", -- Foley includes Ambakich (which we, Glottolog, and Usher treat as Keram)
65044258,
"paa-ram",
aliases = {"Agoan", -- Glottolog
"Porapora River", -- Usher
"core Grass", -- alternative name given by Wikipedia
},
}
m["paa-ram"] = {
"Ramu",
3442808,
aliases = {"Ramu River"}, -- per Usher (2020)
}
m["paa-rsa"] = {
"Rasawa-Saponi", -- [[w:Rasawa-Saponi languages]] redirects to [[w:Lakes Plain languages]]
nil, -- Q9859418 is for the coresponding category, which exists in the Piedmontese Wikipedia (?!)
"paa-flp",
aliases = {"Rombak River"}, -- Usher
}
m["paa-rub"] = {
"Ruboni",
6875319,
"paa-lra",
aliases = {"Misegian", -- Wikipedia's name
"Mikarew", -- alternative name given by Wikipedia
"Ruboni Range"}, -- Usher
}
m["paa-saa"] = {
"Samarokena-Airoran",
96417699,
"paa-gkw",
aliases = {"Apauwar Coast"}, -- Usher
}
m["paa-sah"] = {
"Sahu",
nil,
"paa-nnh",
}
m["paa-sbo"] = {
"South Bougainville",
3217380,
}
m["paa-sen"] = {
"Sentani",
17044584,
-- no consensus on higher affiliations, if any
aliases = {"Sentanic", "Demta-Sentani", "Demta-Lake Sentani"}, -- Sentanic per Glottolog, Demta-Sentani per Wikipedia
}
m["paa-sep"] = {
"Sepik",
3508772,
}
m["paa-shi"] = {
"Serra Hills",
65043154,
"paa-sko",
}
m["paa-sko"] = {
"Sko",
953509,
aliases = {"Skou"},
}
m["paa-sng"] = {
"Senagi",
2066550,
}
m["paa-taa"] = {
"Taikat-Awyi", -- [[w:Taikat languages]] redirects to [[w:Border languages (New Guinea)]]; but Croatian Wikipedia has an entry
12643265,
"paa-bor",
aliases = {"Taikat", -- Foley
"Upper Tami River", -- Usher
},
}
m["paa-tam"] = {
"Tamolan",
7681634,
"paa-ram",
aliases = {"Guam River"}, -- Usher
}
m["paa-tap"] = {
"Timor-Alor-Pantar",
16590002,
}
m["paa-teb"] = {
"Teberan",
7692052,
-- Often grouped with Trans-New Guinea, but per Pawley-Hammarström (2018), it has "weaker or disputed claims to membership in TNG".
aliases = {"Dadibi-Folopa"},
}
m["paa-tir"] = {
"Tirio",
7809225,
"paa-ani",
aliases = {"Nuclear Lower Fly", -- Pawley-Hammarström ("Lower Fly" includes Abom)
"Nuclear Tirio", -- Glottolog ("Tirio" includes Abom)
"Lower Fly River", -- Usher (without Abom)
},
}
m["paa-tki"] = {
"Turama-Kikori",
7853680,
aliases = {"Turama-Kikorian", "Rumu-Omati River"},
}
m["paa-ton"] = {
"Tonda",
8581005,
"paa-yam",
aliases = {"West Morehead River"}, -- Usher
}
m["paa-too"] = {
"Tor-Orya",
16590099,
aliases = {"Orya-Tor"},
}
m["paa-tor"] = {
"Tor", -- [[w:Tor languages]] redirects to [[w:Orya–Tor languages]]
nil,
"paa-too",
}
m["paa-trr"] = {
"Torricelli",
1333831,
}
m["paa-tti"] = {
"Ternate-Tidore",
nil,
"paa-nnh",
}
m["paa-wal"] = {
"Walio",
16919872,
-- Often placed in Sepik (e.g. by Laycock and Z'graggen (1975)), but not by Foley (2018), and not accepted by Glottolog.
aliases = {"Walioic", -- Glottolog
"Central Leonhard Schultze River",
},
}
m["paa-wap"] = {
"Wapei", -- Glottolog includes Nabi/Nambi(-Metan) in Wapeic
65089115,
"paa-wpa",
aliases = {"Wapeic"}, -- Glottolog
}
m["paa-war"] = {
"Waris", -- [[w:Waris languages]] redirects to [[w:Border languages (New Guinea)]]; but Croatian Wikipedia has an entry
12645076,
"paa-bor",
aliases = {"Warisic", -- Glottolog
"Bapi River", -- Usher (without Manem or Senggi)
},
}
m["paa-wbh"] = {
"West Bird's Head",
5330530,
-- Kuwani is sometimes included; probably related to North Halmahera languages.
}
m["paa-wel"] = {
"Western Eleman",
nil,
"paa-ele",
aliases = {"West Eleman"},
}
m["paa-wig"] = {
"West Inland Gulf",
nil,
"paa-ing",
aliases = {"West Inland Gulf of Papua"}, -- Glottolog
}
m["paa-wke"] = {
"West Keram",
nil,
"paa-ker",
aliases = {"Koam", "Mongol-Langam", "Ulmapo"}, -- Koam used by Foley, Ulmapo used by Glottolog
}
m["paa-wko"] = {
"Wára-Kómnzo", -- since we split out Kómnzo as a separate language
11732474, -- for the Wara language
"paa-ton",
aliases = {"Anta-Komnzo-Wára-Wérè-Kémä", -- Glottolog's name
"Wára", "Wara", -- Wikipedia
},
}
m["paa-wlp"] = {
"West Lakes Plain", -- [[w:Tariku languages]] redirects to [[w:Lakes Plain languages]]
47007503, -- actually for "Tariku languages", which per Wikipedia covers Fayu, Kirikiri, Iau and Tause
"paa-lpl",
aliases = {"West Tariku", -- Glottolog
"West Lakes Plains"}, -- Usher, with Edopi/Iau
}
m["paa-wpa"] = {
"Wapei-Palei",
65043156,
"paa-trr",
}
m["paa-wpw"] = { -- paa-wpa already used by Wapei-Palei
"Western Pauwasi", -- 2 langs per Glottolog and Pawley-Hammarström; Usher also includes Namla-Tofanma and Usku
85815062,
aliases = {"West Pauwasi", -- Wikipedia, Usher
"Tebi-Towe", "Dubu-Towei"},
}
m["paa-yam"] = {
"Yam",
15062272,
aliases = {"Morehead and Upper Maro River",
"Morehead River", -- Usher
},
}
m["paa-yaq"] = {
"Yaqayic", -- [[w:Yaqai languages]] redirects to [[w:Marind–Yaqai languages]]
nil,
"paa-mby",
aliases = {"Yakhai-Warkay"}, -- Usher
}
m["paa-ysa"] = {
"Yawa-Saweru",
3217545,
aliases = {"Yawa", "Yawan", "Yapen"},
}
m["paa-yua"] = {
"Yuat",
8060096,
}
m["phi"] = {
"Philippine",
947858,
"poz",
}
m["phi-kal"] = {
"Kalamian",
3217466,
"phi",
aliases = {"Calamian"},
}
m["poz"] = {
"Malayo-Polynesian",
143158,
"map",
}
m["poz-aay"] = {
"Admiralty Islands",
2701306,
"poz-oce",
}
m["poz-bnn"] = {
"North Bornean",
1427907,
"poz",
}
m["poz-bre"] = {
"East Barito",
2701314,
"poz",
}
m["poz-brw"] = {
"West Barito",
2761679,
"poz",
}
m["poz-bss"] = {
"Bali-Sasak-Sumbawa",
3396043,
"poz-msa",
}
m["poz-btk"] = {
"Bungku-Tolaki",
3217381,
"poz-clb",
}
m["poz-cet"] = {
"Central-Eastern Malayo-Polynesian",
2269883,
"poz",
}
m["poz-clb"] = {
"Celebic",
1078041,
"poz",
}
m["poz-cln"] = {
"New Caledonian",
3091221,
"poz-ocs",
}
m["poz-cma"] = {
"Central Maluku",
3217479,
"poz-cet",
}
m["poz-hce"] = {
"Halmahera-Cenderawasih",
2526616,
"pqe",
}
m["poz-kal"] = {
"Kaili-Pamona",
3217465,
"poz-clb",
}
m["poz-lgx"] = {
"Lampungic",
49215,
"poz",
}
m["poz-mcm"] = {
"Malayo-Chamic",
nil,
"poz-msa",
}
m["poz-mic"] = {
"Micronesian",
420591,
"poz-occ",
}
m["poz-mly"] = {
"Malayic",
662628,
"poz-mcm",
}
m["poz-msa"] = {
"Malayo-Sumbawan",
1363818,
"poz",
}
m["poz-mun"] = {
"Muna-Buton",
3037924,
"poz-clb",
}
m["poz-nws"] = {
"Northwest Sumatran",
2071308,
"poz",
}
m["poz-occ"] = {
"Central-Eastern Oceanic",
2068435,
"poz-oce",
}
m["poz-oce"] = {
"Oceanic",
324457,
"pqe",
}
m["poz-ocs"] = {
"Southern Oceanic",
3039118,
"poz-occ",
}
m["poz-ocw"] = {
"Western Oceanic",
2701282,
"poz-oce",
}
m["poz-pcc"] = {
"Central Pacific",
3130237,
"poz-occ",
}
m["poz-pep"] = {
"Eastern Polynesian",
390979,
"poz-pnp",
}
m["poz-pnp"] = {
"Nuclear Polynesian",
743851,
"poz-pol",
}
m["poz-pol"] = {
"Polynesian",
390979,
"poz-pcc",
}
m["poz-san"] = {
"Sabahan",
3217517,
"poz-bnn",
}
m["poz-sbj"] = {
"Sama-Bajaw",
2160409,
"poz",
}
m["poz-slb"] = {
"Saluan-Banggai",
3217519,
"poz-clb",
}
m["poz-sls"] = {
"Southeast Solomonic",
3119671,
"poz-occ",
}
m["poz-ssw"] = {
"South Sulawesi",
2778190,
"poz",
}
m["poz-stm"] = {
"St. Matthias",
6484143,
"poz-oce",
aliases = {"St Matthias"},
}
m["poz-swa"] = {
"North Sarawakan",
538569,
"poz-bnn",
}
m["poz-tem"] = {
"Temotu",
3075769,
"poz-oce",
}
m["poz-tim"] = {
"Timoric",
7806987,
"poz-cet",
}
m["poz-ton"] = {
"Tongic",
3397263,
"poz-pol",
}
m["poz-tot"] = {
"Tomini-Tolitoli",
3217541,
"poz-clb",
}
m["poz-vnc"] = {
"Central Vanuatu",
5061988,
"poz-ocs",
}
m["poz-vnn"] = {
"North Vanuatu",
85789650,
"poz-ocs",
}
m["poz-vns"] = {
"South Vanuatu",
3070173,
"poz-ocs",
}
m["poz-wot"] = {
"Wotu-Wolio",
1041317,
"poz-clb",
aliases = {"Island Kaili-Wolio"}, -- Glottolog
}
m["pqe"] = {
"Eastern Malayo-Polynesian",
2269883,
"poz-cet",
}
m["qfa-adc"] = {
"Central Great Andamanese",
nil,
"qfa-adm",
}
m["qfa-adm"] = {
"Great Andamanese",
3515103,
}
m["qfa-adn"] = {
"Northern Great Andamanese",
nil,
"qfa-adm",
}
m["qfa-ads"] = {
"Southern Great Andamanese",
nil,
"qfa-adm",
}
m["qfa-ain"] = {
"Ainuic",
50111972,
aliases = {"Ainu"},
}
m["qfa-bej"] = {
"Be-Jizhao",
nil,
"qfa-bet",
}
m["qfa-bet"] = {
"Be-Tai",
12627719,
"qfa-tak",
aliases = {"Tai-Be", "Daic-Beic", "Beic-Daic"},
}
m["qfa-buy"] = {
"Buyang",
1109927,
"qfa-kra",
}
m["qfa-cka"] = {
"Chukotko-Kamchatkan",
33255,
}
m["qfa-cre"] = {
"creole",
33289,
"crp",
}
m["qfa-ckn"] = {
"Chukotkan",
2606732,
"qfa-cka",
}
m["qfa-cnt"] = {
"contact",
133253514,
"qfa-not",
}
m["qfa-dis"] = {
-- Languages that are not unclassifiable (qfa-unc) but where there is no consensus on classification. Usually
-- this is because the languages are divergent and it's disputed whether they are isolates or distantly related
-- to other languages.
"disputed affiliation",
nil,
"qfa-not",
categoryName = "Languages of disputed affiliation",
}
m["qfa-dgn"] = {
"Dogon",
1234776,
"nic",
}
m["qfa-dny"] = {
"Dene-Yeniseian",
21103,
aliases = {"Dené-Yeniseian"},
}
m["qfa-hur"] = {
"Hurro-Urartian",
1144159,
}
m["qfa-iso"] = {
"isolate",
33648,
"qfa-not",
categoryName = "Language isolates",
}
m["qfa-kad"] = {
"Kadu", -- considered either Nilo-Saharan or independent/none
1720989,
}
m["qfa-kms"] = {
"Kam-Sui",
1023641,
"qfa-tak",
}
m["qfa-kor"] = {
"Koreanic",
11263525,
}
m["qfa-kra"] = {
"Kra",
1022087,
"qfa-tak",
}
m["qfa-lic"] = {
"Hlai",
1023648,
"qfa-tak",
aliases = {"Hlaic"},
}
m["qfa-mch"] = { -- used in both N and S America
"Macro-Chibchan",
3438062,
}
m["qfa-mix"] = {
"mixed",
33694,
"qfa-cnt",
}
m["qfa-not"] = {
"not a family",
nil,
"qfa-not",
}
m["qfa-onb"] = {
"Be",
nil,
"qfa-bej",
aliases = {"Ong-Be", "Beic"},
}
m["qfa-ong"] = {
"Ongan",
2090575,
aliases = {"Angan", "South Andamanese", "Jarawa-Onge"},
}
m["qfa-pid"] = {
"pidgin",
33831,
"crp",
}
m["qfa-sub"] = {
"substrate",
20730913,
"qfa-not",
}
m["qfa-tak"] = {
"Kra-Dai",
34171,
aliases = {"Tai-Kadai", "Kadai"},
}
m["qfa-tyn"] = {
"Tyrsenian",
1344038,
}
m["qfa-unc"] = {
-- This corresponds to languages normally called "unclassified", i.e. there is insufficient data or research to
-- classify them, whereas our [[:Category:Unclassified languages]] is just languages that no Wiktionary editor
-- has classified yet (the family code in the language data is missing).
"unclassifiable",
33956,
"qfa-not",
}
m["qfa-xgs"] = {
"Serbi-Mongolic",
108887939,
}
m["qfa-xgx"] = {
"Para-Mongolic",
107619002,
"qfa-xgs",
}
m["qfa-yen"] = {
"Yeniseian",
27639,
"qfa-dny",
aliases = {"Yeniseic", "Yenisei-Ostyak"},
}
m["qfa-yke"] = {
"Ketic",
nil,
"qfa-yen",
}
m["qfa-yko"] = {
"Kottic",
nil,
"qfa-yen",
}
m["qfa-yrn"] = {
"Arinic",
nil,
"qfa-yen",
}
m["qfa-ypm"] = {
"Pumpokolic",
nil,
"qfa-yen",
}
m["qfa-yuk"] = {
"Yukaghir",
34164,
aliases = {"Yukagir", "Jukagir"},
}
m["qwe"] = {
"Quechuan",
5218,
}
m["raj"] = {
"Rajasthani",
13196,
"inc-wes",
protoLanguage = "inc-ogu",
}
m["roa"] = {
"Romance",
19814,
"itc",
aliases = {"Romanic", "Latin", "Neolatin", "Neo-Latin"},
protoLanguage = "la",
}
m["roa-asl"] = {
"Asturleonese",
35390,
"roa-ibe",
protoLanguage = "roa-ole",
}
m["roa-cas"] = {
"Castilian",
71924,
"roa-ibe",
aliases = {"Castillian", "Castilic", "Castillic"},
protoLanguage = "osp",
}
m["roa-dal"] = {
"Dalmatian Romance",
97646077,
"roa-itd",
}
m["roa-eas"] = {
"Eastern Romance",
147576,
"roa",
}
m["roa-emr"] = {
"Emilian-Romagnol",
242648,
"roa-git",
}
m["roa-gap"] = {
"Galician-Portuguese",
9080204,
"roa-ibe",
aliases = {"Galician Romance", "Galaic-Portuguese"},
protoLanguage = "roa-opt",
}
m["roa-gar"] = {
"Gallo-Romance",
500394,
"roa-wes",
}
m["roa-itd"] = {
"Italo-Dalmatian",
3313381,
"roa-iwr",
aliases = {"Central Romance"}
}
m["roa-itr"] = {
"Italo-Romance",
3356483,
"roa-itd",
}
m["roa-iwr"] = {
"Italo-Western Romance",
112608,
"roa",
aliases = {"Italo-Western"},
}
m["roa-git"] = {
"Gallo-Italic",
516074,
"roa-gar",
aliases = {"Gallo-Italian", "Gallo-Cisalpine", "Cisalpine"},
}
m["roa-grh"] = {
"Gallo-Rhaetian",
97646466,
"roa-gar",
}
m["roa-ibe"] = {
"Ibero-Romance",
749533,
"roa-wes",
aliases = {"Iberian Romance", "West Ibero-Romance", "Western Ibero-Romance", "West Iberian Romance", "Western Iberian Romance"}
}
m["roa-nar"] = {
"Navarro-Aragonese",
133252927,
"roa-ibe",
protoLanguage = "roa-ona",
}
m["roa-oil"] = {
"Oïl",
37351,
"roa-grh",
aliases = {"langues d'oïl", "langue d'oïl", "Cisalpine"},
protoLanguage = "fro",
}
m["roa-ocr"] = {
"Occitano-Romance",
599958,
"roa-gar",
aliases = {"Gallo-Narbonnese", "East Iberian", "Eastern Iberian"},
}
m["roa-rhe"] = {
"Rhaeto-Romance",
515593,
"roa-grh",
aliases = {"langues d'oïl", "langue d'oïl", "Cisalpine"},
}
m["roa-sou"] = {
"Southern Romance",
145345,
"roa",
}
m["roa-wes"] = {
"Western Romance",
2714388,
"roa-iwr",
}
--[=[
Exceptional language and family codes for South American Indian languages
can use the prefix "sai-", though "sai" is no longer itself a family code.
]=]--
m["sai-ara"] = {
"Araucanian",
626630,
}
m["sai-aym"] = {
"Aymaran",
33010,
}
m["sai-bar"] = {
"Barbacoan",
807304,
aliases = {"Barbakoan"},
}
m["sai-bor"] = {
"Boran",
5371776,
}
m["sai-cah"] = {
"Cahuapanan",
1025793,
}
m["sai-car"] = {
"Cariban",
33090,
aliases = {"Carib"},
}
m["sai-cer"] = {
"Cerrado",
98078151,
"sai-jee",
aliases = {"Amazonian Jê"},
}
m["sai-chc"] = {
"Chocoan",
1075616,
aliases = {"Choco", "Chocó"},
}
m["sai-cho"] = {
"Chonan",
33019,
aliases = {"Chon"},
}
m["sai-cje"] = {
"Central Jê",
18010843,
"sai-cer",
aliases = {"Akuwẽ"},
}
m["sai-cpc"] = {
"Chapacuran",
1062626,
}
m["sai-crn"] = {
"Charruan",
3112423,
aliases = {"Charrúan"},
}
m["sai-ctc"] = {
"Catacaoan",
5051139,
}
m["sai-guc"] = {
"Guaicuruan",
1974973,
"sai-mgc",
aliases = {"Guaicurú", "Guaycuruana", "Guaikurú", "Guaycuruano", "Guaykuruan", "Waikurúan"},
}
m["sai-guh"] = {
"Guahiban",
944056,
aliases = {"Guahiboan", "Guajiboan", "Wahivoan"},
}
m["sai-gui"] = {
"Guianan",
nil,
"sai-car",
aliases = {"Guianan Carib", "Guiana Carib"},
}
m["sai-har"] = {
"Harákmbut",
1584402,
"sai-hkt",
aliases = {"Harákmbet"},
}
m["sai-hkt"] = {
"Harákmbut-Katukinan",
17107635,
}
m["sai-hrp"] = {
"Huarpean",
1578336,
aliases = {"Warpean", "Huarpe", "Warpe"},
}
m["sai-jee"] = {
"Jê",
1483594,
"sai-mje",
aliases = {"Gê", "Jean", "Gean", "Jê-Kaingang", "Ye"},
}
m["sai-jir"] = {
"Jirajaran",
3028651,
aliases = {"Hiraháran"},
}
m["sai-jiv"] = {
"Jivaroan",
1393074,
aliases = {"Hívaro", "Jibaro", "Jibaroan", "Jibaroana", "Jívaro"},
}
m["sai-ktk"] = {
"Katukinan",
2636000,
"sai-hkt",
aliases = {"Catuquinan"},
}
m["sai-kui"] = {
"Kuikuroan",
nil,
"sai-car",
aliases = {"Kuikuro", "Nahukwa"},
}
m["sai-map"] = {
"Mapoyan",
61096301,
"sai-ven",
aliases = {"Mapoyo", "Mapoyo-Yabarana", "Mapoyo-Yavarana", "Mapoyo-Yawarana"},
}
m["sai-mas"] = {
"Mascoian",
1906952,
aliases = {"Mascoyan", "Maskoian", "Enlhet-Enenlhet"},
}
m["sai-mgc"] = {
"Mataco-Guaicuru",
255512,
}
m["sai-mje"] = {
"Macro-Jê",
887133,
aliases = {"Macro-Gê"},
}
m["sai-mtc"] = {
"Matacoan",
2447424,
"sai-mgc",
}
m["sai-mur"] = {
"Muran",
33826,
aliases = {"Mura"},
}
m["sai-nad"] = {
"Nadahup",
1856439,
aliases = {"Makú", "Macú", "Vaupés-Japurá"},
}
m["sai-nje"] = {
"Northern Jê",
98078225,
"sai-cer",
aliases = {"Core Jê"},
}
m["sai-nmk"] = {
"Nambikwaran",
15548027,
aliases = {"Nambicuaran", "Nambiquaran", "Nambikuaran"},
}
m["sai-otm"] = {
"Otomacoan",
3217503,
aliases = {"Otomákoan", "Otomakoan"},
}
m["sai-pan"] = {
"Panoan",
1544537,
"sai-pat",
aliases = {"Pano"},
}
m["sai-pat"] = {
"Pano-Tacanan",
2475746,
aliases = {"Pano-Tacana", "Pano-Takana", "Páno-Takána", "Pano-Takánan"},
}
m["sai-pek"] = {
"Pekodian",
107451736,
"sai-car",
aliases = {"South Amazonian Carib", "Southern Cariban", "Pekodi"},
}
m["sai-pem"] = {
"Pemongan",
nil,
"sai-ven",
aliases = {"Pemong", "Pemóng", "Purukoto"},
}
m["sai-pey"] = {
"Peba-Yaguan",
174015,
aliases = {"Peba-Yagua", "Yaguan", "Peban", "Yáwan"},
}
m["sai-prk"] = {
"Parukotoan",
107451482,
"sai-car",
aliases = {"Parukoto"},
}
m["sai-sje"] = {
"Southern Jê",
98078245,
"sai-jee",
}
m["sai-tac"] = {
"Tacanan",
3113762,
"sai-pat",
}
m["sai-tar"] = {
"Taranoan",
105097814,
"sai-gui",
aliases = {"Trio", "Tarano"},
}
m["sai-tin"] = {
"Tiniguan",
2892258,
aliases = {"Tinigua"},
}
m["sai-tuc"] = {
"Tucanoan",
788144,
}
m["sai-tyu"] = {
"Ticuna-Yuri",
4467010,
}
m["sai-ucp"] = {
"Uru-Chipaya",
2475488,
aliases = {"Uru-Chipayan"},
}
m["sai-ven"] = {
"Venezuelan Cariban",
nil,
"sai-car",
aliases = {"Venezuelan Carib", "Venezuelan", "Venezuelano"},
}
m["sai-wic"] = {
"Wichí",
3027047,
}
m["sai-wit"] = {
"Witotoan",
43079317,
aliases = {"Huitotoan", "Uitotoan"},
}
m["sai-ynm"] = {
"Yanomami",
nil,
aliases = {"Yanomam", "Shamatari", "Yamomami", "Yanomaman"},
}
m["sai-yuk"] = {
"Yukpan",
nil,
"sai-car",
aliases = {"Yukpa", "Yukpano", "Yukpa-Japreria"},
}
m["sai-zam"] = {
"Zamucoan",
3048461,
aliases = {"Samúkoan"},
}
m["sai-zap"] = {
"Zaparoan",
33911,
aliases = {"Záparoan", "Saparoan", "Sáparoan", "Záparo", "Zaparoano", "Zaparoana"},
}
m["sal"] = {
"Salish",
33985,
}
m["sdv"] = {
"Eastern Sudanic",
2036148,
"ssa",
}
m["sdv-bri"] = {
"Bari",
nil,
"sdv-nie",
}
m["sdv-daj"] = {
"Daju",
956724,
"sdv",
}
m["sdv-dnu"] = {
"Dinka-Nuer",
nil,
"sdv-niw",
}
m["sdv-eje"] = {
"Eastern Jebel",
3408878,
"sdv",
}
m["sdv-kln"] = {
"Kalenjin",
637228,
"sdv-nis",
}
m["sdv-lma"] = {
"Lotuko-Maa",
nil,
"sdv-nie",
}
m["sdv-lon"] = {
"Northern Luo",
nil,
"sdv-luo",
}
m["sdv-los"] = {
"Southern Luo",
7570103,
"sdv-luo",
}
m["sdv-luo"] = {
"Luo",
nil,
"sdv-niw",
}
m["sdv-nes"] = {
"Northern Eastern Sudanic",
4810496,
"sdv",
aliases = {"Astaboran", "Ek Sudanic"},
}
m["sdv-nie"] = {
"Eastern Nilotic",
153795,
"sdv-nil",
}
m["sdv-nil"] = {
"Nilotic",
513408,
"sdv",
}
m["sdv-nis"] = {
"Southern Nilotic",
1552410,
"sdv-nil",
}
m["sdv-niw"] = {
"Western Nilotic",
3114989,
"sdv-nil",
}
m["sdv-nma"] = {
"Nandi-Markweta",
nil,
"sdv-kln",
}
m["sdv-nyi"] = {
"Nyima",
11688746,
"sdv-nes",
aliases = {"Nyimang"},
}
m["sdv-tmn"] = {
"Taman",
3408873,
"sdv-nes",
aliases = {"Tamaic"},
}
m["sdv-ttu"] = {
"Teso-Turkana",
7705551,
"sdv-nie",
aliases = {"Ateker"},
}
m["sel"] = {
"Selkup",
34008,
"syd",
}
m["sem"] = {
"Semitic",
34049,
"afa",
}
m["sem-ara"] = {
"Aramaic",
28602,
"sem-nwe",
protoLanguage = "arc",
}
m["sem-arb"] = {
"Arabic",
164667,
"sem-cen",
protoLanguage = "ar",
}
m["sem-are"] = {
"Eastern Aramaic",
3410322,
"sem-ara",
}
m["sem-arw"] = {
"Western Aramaic",
3394214,
"sem-ara",
}
m["sem-ase"] = {
"Southeastern Aramaic",
3410322,
"sem-are",
}
m["sem-can"] = {
"Canaanite",
747547,
"sem-nwe",
}
m["sem-cen"] = {
"Central Semitic",
3433228,
"sem-wes",
}
m["sem-cna"] = {
"Central Neo-Aramaic",
3410322,
"sem-are",
}
m["sem-eas"] = {
"East Semitic",
164273,
"sem",
}
m["sem-eth"] = {
"Ethiopian Semitic",
163629,
"sem-wes",
aliases = {"Afro-Semitic", "Ethiopian", "Ethiopic", "Ethiosemitic"},
}
m["sem-nna"] = {
"Northeastern Neo-Aramaic",
2560578,
"sem-are",
}
m["sem-nwe"] = {
"Northwest Semitic",
162996,
"sem-cen",
}
m["sem-osa"] = {
"Old South Arabian",
35025,
"sem-cen",
aliases = {"Epigraphic South Arabian", "Sayhadic"},
}
m["sem-sar"] = {
"Modern South Arabian",
1981908,
"sem-wes",
}
m["sem-wes"] = {
"West Semitic",
124901,
"sem",
}
m["sgn"] = {
"sign",
34228,
"qfa-not",
}
m["sgn-asl"] = {
"American Sign Languages",
nil,
"sgn-fsl",
}
m["sgn-fsl"] = {
"French Sign Languages",
5501921,
"sgn",
}
m["sgn-gsl"] = {
"German Sign Languages",
5551235,
"sgn",
}
m["sgn-jsl"] = {
"Japanese Sign Languages",
11722508,
"sgn",
}
m["sio"] = {
"Siouan",
34181,
"nai-sca",
}
m["sio-dhe"] = {
"Dhegihan",
3217420,
"sio-msv",
}
m["sio-dkt"] = {
"Dakotan",
4154122,
"sio-msv",
}
m["sio-mor"] = {
"Missouri River Siouan",
26807266,
"sio",
}
m["sio-msv"] = {
"Mississippi Valley Siouan",
12637104,
"sio",
}
m["sio-ohv"] = {
"Ohio Valley Siouan",
21070931,
"sio",
}
m["sit"] = {
"Sino-Tibetan",
45961,
aliases = {"Trans-Himalayan"},
}
m["sit-aao"] = {
"Central Naga",
615474,
"sit",
}
m["sit-alm"] = {
"Almora",
nil,
"sit-whm",
}
m["sit-bai"] = {
"Bai",
35103,
"sit-mba",
}
m["sit-bdi"] = {
"Bodish",
1814078,
"sit",
}
m["sit-cln"] = {
"Cai-Long",
107182612,
"sit-mba",
aliases = {"Ta-Li"},
}
m["sit-dhi"] = {
"Dhimalish",
1207648,
"sit",
}
m["sit-ebo"] = {
"East Bodish",
56402,
"sit-bdi",
}
m["sit-egy"] = {
"East rGyalrongic",
832026,
"sit-rgy",
}
m["sit-ers"] = {
"Ersuic",
56335,
"sit",
}
m["sit-gma"] = {
"Greater Magaric",
55612963,
"sit",
}
m["sit-gsi"] = {
"Greater Siangic",
52698851,
"sit",
}
m["sit-hrs"] = {
"Hrusish",
1632501,
"sit",
aliases = {"Southeast Kamengic"},
}
m["sit-jnp"] = {
"Jingphoic",
nil,
"sit-jpl",
aliases = {"Jingpho"},
}
m["sit-jpl"] = {
"Kachin-Luic",
1515454,
"tbq-bkj",
aliases = {"Jingpho-Luish", "Jingpho-Asakian", "Kachinic"},
}
m["sit-kch"] = {
"Konyak-Chang",
nil,
"sit-kon",
}
m["sit-kha"] = {
"Kham",
33305,
"sit-gma",
}
m["sit-khb"] = {
"Kho-Bwa",
6401917,
"sit",
aliases = {"Bugunish", "Kamengic"},
}
m["sit-khw"] = {
"Western Kho-Bwa",
nil,
"sit-khb",
}
m["sit-khc"] = {
"Chug-Lish",
nil,
"sit-khw",
aliases = {"Duhumbi-Khispi"},
}
m["sit-khm"] = {
"Mey-Sartang",
nil,
"sit-khw",
aliases = {"Sartang-Sherdukpen"},
}
m["sit-kic"] = {
"Central Kiranti",
nil,
"sit-kir",
}
m["sit-kie"] = {
"Eastern Kiranti",
nil,
"sit-kir",
}
m["sit-kin"] = {
"Kinnauric",
nil,
"sit-whm",
aliases = {"Kinnauri"},
}
m["sit-kir"] = {
"Kiranti",
922148,
"sit",
}
m["sit-kiw"] = {
"Western Kiranti",
922148,
"sit-kir",
}
m["sit-kon"] = {
"Northern Naga",
774590,
"tbq-bkj",
aliases = {"Konyakian", "Konyak"},
}
m["sit-kyk"] = {
"Kyirong-Kagate",
6450957,
"sit-tib",
}
m["sit-lab"] = {
"Ladakhi-Balti",
6450957,
"sit-tib",
}
m["sit-las"] = {
"Lahuli-Spiti",
6473510,
"sit-tib",
}
m["sit-luu"] = {
"Luish",
55621439,
"sit-jpl",
aliases = {"Asakian", "Sak"},
}
m["sit-mar"] = {
"Maringic",
nil,
"sit-tma",
}
m["sit-mba"] = {
"Macro-Bai",
16963847,
"sit-sba",
aliases = {"Greater Bai"},
}
m["sit-mdz"] = {
"Midzu",
6843504,
"sit",
aliases = {"Geman", "Midzuish", "Miju-Meyor", "Southern Mishmi"},
}
m["sit-mnz"] = {
"Mondzish",
6898839,
"tbq-lob",
aliases = {"Mangish"},
}
m["sit-mru"] = {
"Mruic",
16908870,
"sit",
aliases = {"Mru-Hkongso"},
}
m["sit-nas"] = {
"Naish",
25047956,
"sit-nax",
}
m["sit-nax"] = {
"Naic",
6982999,
"tbq-buq",
aliases = {"Naxish"},
}
m["sit-nba"] = {
"Northern Bai",
122463830,
"sit-bai",
}
m["sit-new"] = {
"Newaric",
55625069,
"sit",
}
m["sit-nng"] = {
"Nungish",
1515482,
"sit",
aliases = {"Nung"},
}
m["sit-qia"] = {
"Qiangic",
1636765,
"tbq-buq",
}
m["sit-rgy"] = {
"Rgyalrongic",
56936,
"sit-qia",
aliases = {"Jiarongic"},
}
m["sit-sba"] = {
"Sino-Bai",
nil,
"sit",
aliases = {"Greater Bai"},
}
m["sit-tam"] = {
"Tamangic",
3309439,
"sit",
aliases = {"West Bodish"},
}
m["sit-tan"] = {
"Tani",
3217538,
"sit",
}
m["sit-tib"] = {
"Tibetic",
1641150,
"sit-bdi",
protoLanguage = "otb",
}
m["sit-tja"] = {
"Tujia",
nil,
"sit",
}
m["sit-tma"] = {
"Tangkhul-Maring",
nil,
"sit",
}
m["sit-tng"] = {
"Tangkhulic",
1516657,
"sit-tma",
aliases = {"Tangkhul"},
}
m["sit-tno"] = {
"Tangsa-Nocte",
nil,
"sit-kon",
}
m["sit-tsk"] = {
"Tshangla",
nil,
"sit",
}
m["sit-wgy"] = {
"West rGyalrongic",
nil,
"sit-rgy"
}
m["sit-whm"] = {
"West Himalayish",
2301695,
"sit",
}
m["sit-zem"] = {
"Zeme",
189291,
"sit",
aliases = {"Zeliangrong", "Zemeic"},
}
m["sla"] = {
"Slavic",
23526,
"ine-bsl",
aliases = {"Slavonic"},
}
m["smi"] = {
"Sami",
56463,
"urj",
aliases = {"Saami", "Samic", "Saamic"},
}
m["son"] = {
"Songhay",
505198,
"ssa",
aliases = {"Songhai"},
}
m["sqj"] = {
"Albanian",
8748,
"ine",
}
m["ssa"] = {
"Nilo-Saharan", -- possibly not a genetic grouping
33705,
}
m["ssa-fur"] = {
"Fur",
2989512,
"ssa",
}
m["ssa-klk"] = {
"Kuliak",
1791476,
"ssa",
aliases = {"Rub"},
}
m["ssa-kom"] = {
"Koman",
1781084,
"ssa",
}
m["ssa-sah"] = {
"Saharan",
1757661,
"ssa",
}
m["syd"] = {
"Samoyedic",
34005,
"urj",
aliases = {"Samoyed", "Samodeic"},
}
m["syd-ene"] = {
"Enets",
29942,
"syd",
}
m["tai"] = {
"Tai",
749720,
"qfa-bet",
aliases = {"Daic"},
}
m["tai-wen"] = {
"Wenma-Southwestern Tai",
nil,
"tai",
}
m["tai-tay"] = {
"Tày",
nil,
"tai-wen",
}
m["tai-sap"] = {
"Sapa-Southwestern Tai",
nil,
"tai-wen",
aliases = {"Sapa-Thai"},
}
m["tai-swe"] = {
"Southwestern Tai",
10889250,
"tai-sap",
}
m["tai-cho"] = {
"Chongzuo Tai",
13216,
"tai",
}
m["tai-cen"] = {
"Central Tai",
5061891,
"tai",
}
m["tai-nor"] = {
"Northern Tai",
7059014,
"tai",
}
m["tbq"] = {
"Tibeto-Burman",
34064,
"sit",
}
m["tbq-anp"] = {
"Angami-Pochuri",
530460,
"sit",
}
m["tbq-axi"] = {
"Axioid",
nil,
"tbq-sel",
}
m["tbq-bdg"] = {
"Bodo-Garo",
4090000,
"tbq-bkj",
}
m["tbq-bis"] = {
"Bisoid",
48844742,
"tbq-slo",
}
m["tbq-bka"] = {
"Bi-Ka",
12627890,
"tbq-slo",
}
m["tbq-bkj"] = {
"Sal",
889900,
"sit",
-- Brahmaputran appears to be Glottolog's term
aliases = {"Bodo-Konyak-Jinghpaw", "Brahmaputran", "Jingpho-Konyak-Bodo"},
}
m["tbq-brm"] = {
"Burmish",
865713,
"tbq-lob",
}
m["tbq-buq"] = {
"Burmo-Qiangic",
16056278,
"sit",
aliases = {"Eastern Tibeto-Burman"},
}
m["tbq-drp"] = {
"Downriver Phula",
7188378,
"tbq-rph",
}
m["tbq-han"] = {
"Hanoid",
17004185,
"tbq-slo",
}
m["tbq-hph"] = {
"Highland Phula",
nil,
"tbq-sel",
}
m["tbq-jin"] = {
"Jino",
6202716,
"tbq-slo",
}
m["tbq-kzh"] = {
"Kazhuoish",
48834669,
"tbq-lol",
}
m["tbq-kuk"] = {
"Kuki-Chin",
832413,
"sit",
aliases = {"Kukish", "South-Central Tibeto-Burman"},
}
m["tbq-lal"] = {
"Lalo",
56548,
"tbq-lso",
}
m["tbq-lho"] = {
"Lahoish",
nil,
"tbq-lol",
}
m["tbq-llo"] = {
"Lipo-Lolopo",
nil,
"tbq-lso",
}
m["tbq-lob"] = {
"Lolo-Burmese",
1635712,
"tbq-buq",
}
m["tbq-lol"] = {
"Loloish",
37035,
"tbq-lob",
aliases = {"Yi", "Ngwi", "Nisoic"},
}
m["tbq-lso"] = {
"Lisoish",
6559055,
"tbq-lol",
}
m["tbq-lwo"] = {
"Lawoish",
48847673,
"tbq-lol",
}
m["tbq-muj"] = {
"Muji",
11221327,
"tbq-hph",
}
m["tbq-nas"] = {
"Nasoid",
nil,
"tbq-nlo",
}
m["tbq-nis"] = {
"Nisu",
56404,
"tbq-nlo",
}
m["tbq-nlo"] = {
"Northern Loloish",
7058676,
"tbq-nso",
}
m["tbq-nso"] = {
"Nisoish",
56990,
"tbq-lol",
}
m["tbq-nus"] = {
"Nusoish",
114245231,
"tbq-lol",
}
m["tbq-phw"] = {
"Phowa",
7187959,
"tbq-hph",
}
m["tbq-rph"] = {
"Riverine Phula",
nil,
"tbq-sel",
}
m["tbq-sel"] = {
"Southeastern Loloish",
16111894,
"tbq-nso",
}
m["tbq-sil"] = {
"Siloid",
60787071,
"tbq-slo",
}
m["tbq-slo"] = {
"Southern Loloish",
5649340,
"tbq-lol",
}
m["tbq-tal"] = {
"Taloid",
48804018,
"tbq-lso",
}
m["tbq-urp"] = {
"Upriver Phula",
7187058,
"tbq-rph",
}
m["trk"] = {
"Turkic",
34090,
}
m["trk-cmn"] = {
"Common Turkic",
1126028,
"trk",
aliases = {"Shaz Turkic", "Shaz-Turkic"},
}
m["trk-kar"] = {
"Karluk",
703173,
"trk-cmn",
aliases = {"Qarluq", "Uyghur-Uzbek", "Southeastern Turkic"},
}
m["trk-kbu"] = {
"Kipchak-Bulgar",
3512539,
"trk-kip",
aliases = {"Uralian", "Uralo-Caspian"},
}
m["trk-kcu"] = {
"Kipchak-Cuman",
4370412,
"trk-kip",
aliases = {"Ponto-Caspian"},
}
m["trk-kip"] = {
"Kipchak",
1339898,
"trk-cmn",
-- Russian Wikipedia article [[w:ru:Западнотюркские_языки]] says "Western Turkic" is used by N.A. Baskakov and includes Oghuz, Kipchak and Karluk.
-- Azerbaijani Wikipedia article [[w:az:Qərbi_türk_dilləri]] clarifies that "Western Turkic" is not a clade.
other_names = {"Western Turkic"},
aliases = {"Kypchak", "Qypchaq", "Northwestern Turkic"},
protoLanguage = "qwm",
}
m["trk-kkp"] = {
"Kyrgyz-Kipchak",
4221189,
"trk-kip",
}
m["trk-kno"] = {
"Kipchak-Nogai",
4326954,
"trk-kip",
aliases = {"Aralo-Caspian"},
}
m["trk-nsb"] = {
"North Siberian Turkic",
4537269,
"trk-sib",
aliases = {"Northern Siberian Turkic"},
}
m["trk-ogr"] = {
"Oghur",
1422731,
"trk",
aliases = {"Lir-Turkic", "r-Turkic"},
}
m["trk-ogz"] = {
"Oghuz",
494600,
"trk-cmn",
aliases = {"Southwestern Turkic"},
}
m["trk-sib"] = {
"Siberian Turkic",
354353,
"trk-cmn",
other_names = {"Northern Turkic"},
-- per [[w:ru:Восточнотюркские_языки]], "Eastern Turkic" is an alias for Siberian Turkic in the work of O.A. Mudrak,
-- but has a different non-clade meaning in the older work of N.A. Baskakov.
aliases = {"Eastern Turkic", "Northeastern Turkic"},
}
m["trk-ssb"] = {
"South Siberian Turkic",
nil,
"trk-sib",
aliases = {"Southern Siberian Turkic"},
}
m["tup"] = {
"Tupian",
34070,
aliases = {"Tupi"},
}
m["tup-gua"] = {
"Tupi-Guarani",
148610,
"tup",
aliases = {"Tupí-Guaraní"},
}
m["tuw"] = {
"Tungusic",
34230,
aliases = {"Manchu-Tungus", "Tungus"},
}
m["tuw-ewe"] = {
"Ewenic",
105889448,
"tuw",
aliases = {"Northern Tungusic"},
}
m["tuw-jrc"] = {
"Jurchenic",
105889432,
"tuw",
aliases = {"Manchuric"},
}
m["tuw-nan"] = {
"Nanaic",
105889264,
"tuw",
}
m["tuw-udg"] = {
"Udegheic",
105889266,
"tuw",
}
m["urj"] = {
"Uralic",
34113,
varieties = {"Finno-Ugric"},
}
m["urj-fin"] = {
"Finnic",
33328,
"urj",
aliases = {"Baltic-Finnic", "Balto-Finnic", "Fennic"},
}
m["urj-mdv"] = {
"Mordvinic",
627313,
"urj",
}
m["urj-prm"] = {
"Permic",
161493,
"urj",
}
m["urj-ugr"] = {
"Ugric",
156631,
"urj",
}
m["wak"] = {
"Wakashan",
60069,
}
m["wen"] = {
"Sorbian",
25442,
"zlw",
aliases = {"Lusatian", "Wendish"},
}
m["xgn"] = {
"Mongolic",
33750,
"qfa-xgs",
aliases = {"Mongolian"},
}
m["xgn-cen"] = {
"Central Mongolic",
28719447,
"xgn",
protoLanguage = "xng-lat",
}
m["xgn-sou"] = {
"Southern Mongolic",
nil,
"xgn",
protoLanguage = "xng-ear",
}
m["xgn-shr"] = {
"Shirongolic",
107539435,
"xgn-sou",
}
m["xme"] = {
"Median",
nil,
"ira-mpr",
protoLanguage = "xme-old",
}
m["xme-ttc"] = {
"Tatic",
nil,
"xme",
}
m["xnd"] = {
"Na-Dene",
26986,
"qfa-dny",
aliases = {"Na-Dené"},
}
m["xsc"] = {
"Scythian",
nil,
"ira-nei",
}
m["xsc-sak"] = {
"Saka",
nil,
"xsc-skw",
aliases = {"Sakan"},
}
m["xsc-sar"] = {
"Sarmatian",
nil,
"xsc",
}
m["xsc-skw"] = {
"Saka-Wakhi",
nil,
"xsc",
}
m["yok"] = {
"Yokuts",
34249,
"nai-you",
aliases = {"Yokutsan", "Mariposan", "Mariposa"},
}
m["ypk"] = {
"Yupik",
27970,
"esx-esk",
aliases = {"Yup'ik", "Yuit"},
}
m["yrk"] = {
"Nenets",
36452,
"syd",
}
m["zhx"] = {
"Sinitic",
33857,
"sit-sba",
aliases = {"Chinese"},
protoLanguage = "och",
}
m["zhx-com"] = {
"Coastal Min",
20667215,
"zhx-min",
}
m["zhx-inm"] = {
"Inland Min",
20667237,
"zhx-min",
}
m["zhx-man"] = {
"Mandarinic",
nil,
"zhx",
protoLanguage = "cmn-ear",
}
m["zhx-min"] = {
"Min",
56504,
"zhx",
}
m["zhx-nan"] = {
"Southern Min",
36495,
"zhx-com",
}
m["zhx-pin"] = {
"Pinghua",
2735715,
"zhx",
protoLanguage = "ltc",
}
m["zhx-yue"] = {
"Yue",
7033959,
"zhx",
protoLanguage = "ltc",
}
m["zle"] = {
"East Slavic",
144713,
"sla",
}
m["zls"] = {
"South Slavic",
146665,
"sla",
}
m["zlw"] = {
"West Slavic",
145852,
"sla",
}
m["zlw-lch"] = {
"Lechitic",
742782,
"zlw",
aliases = {"Lekhitic"},
}
m["zlw-pom"] = {
"Pomeranian",
nil,
"zlw-lch",
}
m["znd"] = {
"Zande",
8066072,
"nic-ubg",
}
return require("Module:languages").finalizeData(m, "family")
3btxhofjv1yzvyhvihh8364k1f3zzw6
Module:language-like
828
5963
17399
2026-07-13T08:18:24Z
Hiyuune
6766
+
17399
Scribunto
text/plain
local export = {}
local string_utilities_module = "Module:string utilities"
local table_module = "Module:table"
-- In a locally installed Docker container containing Wiktionary, Wikibase is typically not installed because it's
-- a real pain to get working properly. In such a case, `mw.wikibase` returns nil. We now have checks in the code
-- below so it does reasonable things in the absence of Wikibase.
local wikibase = mw.wikibase
local category_name_has_suffix -- defined as export.categoryNameHasSuffix below
local get_entity = wikibase and wikibase.getEntity or nil
local get_entity_id_for_title = wikibase and wikibase.getEntityIdForTitle or nil
local gsub = string.gsub
local ipairs = ipairs
local match = string.match
local select = select
local sitelink = wikibase and wikibase.sitelink or nil
local type = type
local umatch = mw.ustring.match
--[==[
Loaders for functions in other modules, which overwrite themselves with the target function when called. This ensures modules are only loaded when needed, retains the speed/convenience of locally-declared pre-loaded functions, and has no overhead after the first call, since the target functions are called directly in any subsequent calls.]==]
local function case_insensitive_pattern(...)
case_insensitive_pattern = require(string_utilities_module).case_insensitive_pattern
return case_insensitive_pattern(...)
end
local function table_flatten(...)
table_flatten = require(table_module).flatten
return table_flatten(...)
end
--[==[
Loaders for objects, which load data (or some other object) into some variable, which can then be accessed as "foo or get_foo()", where the function get_foo sets the object to "foo" and then returns it. This ensures they are only loaded when needed, and avoids the need to check for the existence of the object each time, since once "foo" has been set, "get_foo" will not be called again.]==]
local content_lang
local function get_content_lang()
content_lang, get_content_lang = mw.getContentLanguage(), nil
return content_lang
end
-- Implementation of getAliases() for languages, etymology languages,
-- families, scripts and writing systems.
function export.getAliases(self)
local aliases = self._aliases
if aliases == nil then
aliases = (self._data or self).aliases or {}
self._aliases = aliases
end
return aliases
end
-- Implementation of getVarieties() for languages, etymology languages,
-- families, scripts and writing systems. If `flatten` is passed in,
-- flatten down to a list of strings; otherwise, keep the structure.
function export.getVarieties(self, flatten)
local varieties = self._varieties
if varieties == nil then
varieties = (self._data or self).varieties or {}
self._varieties = varieties
end
if not flatten then
return varieties
end
local flattened_varieties = self._flattened_varieties
if flattened_varieties == nil then
flattened_varieties = table_flatten(varieties)
self._flattened_varieties = flattened_varieties
end
return flattened_varieties
end
-- Implementation of getOtherNames() for languages, etymology languages,
-- families, scripts and writing systems.
function export.getOtherNames(self)
local other_names = self._other_names
if other_names == nil then
other_names = (self._data or self).other_names or {}
self._other_names = other_names
end
return other_names
end
-- Implementation of getAllNames() for languages, etymology languages,
-- families, scripts and writing systems. If `notCanonical` is set,
-- the canonical name will be excluded.
function export.getAllNames(self)
local all_names = self._allNames
if all_names == nil then
all_names = table_flatten{
self:getCanonicalName(),
self:getAliases(),
self:getVarieties(),
self:getOtherNames(),
}
self._allNames = all_names
end
return all_names
end
function export.hasType(self, ...)
local n = select("#", ...)
if n == 0 then
error("Must specify at least one type.")
end
local types = self:getTypes()
if not types[...] then
return false
elseif n == 1 then
return true
end
local args = {...}
for i = 2, n do
if not types[args[i]] then
return false
end
end
return true
end
-- Implementation of template-callable getByCode() function for languages,
-- etymology languages, families and scripts. `item` is the language,
-- family or script in question; `args` is the arguments passed in by the
-- module invocation; `extra_processing`, if specified, is a function of
-- one argument (the requested property) and should return the value to
-- be returned to the caller, or nil if the property isn't recognized.
-- `extra_processing` is called after special-cased properties are handled
-- and before general-purpose processing code that works for all string
-- properties.
function export.templateGetByCode(args, extra_processing)
-- The item that the caller wanted to look up.
local item, itemname, list = args[1], args[2]
if itemname == "getAllNames" then
list = item:getAllNames()
elseif itemname == "getOtherNames" then
list = item:getOtherNames()
elseif itemname == "getAliases" then
list = item:getAliases()
elseif itemname == "getVarieties" then
list = item:getVarieties(true)
end
if list then
local index = args[3]; if index == "" then index = nil end
index = tonumber(index or error("Numeric index of the desired item in the list (parameter 3) has not been specified."))
return list[index] or ""
end
if itemname == "getFamily" and item.getFamily then
return item:getFamily():getCode()
end
if extra_processing then
local retval = extra_processing(itemname)
if retval then
return retval
end
end
if item[itemname] then
local ret = item[itemname](item)
if type(ret) == "string" then
return ret
end
error("The function \"" .. itemname .. "\" did not return a string value.")
end
error("Requested invalid item name \"" .. itemname .. "\".")
end
-- Implementation of getCommonsCategory() for languages, etymology languages,
-- families, scripts and writing systems.
function export.getWikidataItem(self)
local item = self._WikidataItem
if item == nil then
item = (self._data or self)[2]
-- If the value is nil, it's cached as false.
item = item ~= nil and (type(item) == "number" and "Q" .. item or item) or false
self._WikidataItem = item
end
return item or nil
end
do
local function get_wiki_article(self, project)
local article
-- If the project is enwiki, check the language data.
if project == "enwiki" then
article = (self._data or self).wikipedia_article
if article then
return article
end
end
-- Otherwise, check the Wikidata item for a sitelink.
local item = self:getWikidataItem()
article = item and sitelink and sitelink(item, project) or false
if article then
return article
end
-- If there's still no article, try the parent (if any).
local get_parent = self.getParent
if get_parent then
local parent = get_parent(self)
if parent then
return get_wiki_article(parent, project)
end
end
return false
end
-- Implementation of getWikipediaArticle() for languages, etymology languages,
-- families, scripts and writing systems.
function export.getWikipediaArticle(self, noCategoryFallback, project)
if project == nil then
project = "enwiki"
end
local article
if project == "enwiki" then
article = self._wikipedia_article
if article == nil then
article = get_wiki_article(self, project)
self._wikipedia_article = article
end
else
-- If the project isn't enwiki, default to no category fallback, but
-- this can be overridden by specifying the value `false`.
if noCategoryFallback == nil then
noCategoryFallback = true
end
local non_en_wikipedia_articles = self._non_en_wikipedia_articles
if non_en_wikipedia_articles == nil then
non_en_wikipedia_articles = {}
self._non_en_wikipedia_articles = non_en_wikipedia_articles
else
article = non_en_wikipedia_articles[project]
end
if article == nil then
article = get_wiki_article(self, project)
non_en_wikipedia_articles[project] = article
end
end
if article or noCategoryFallback then
return article or nil
end
return (gsub(self:getCategoryName(), "Creole language", "Creole"))
end
end
do
local function get_commons_cat_claim(item)
if item then
local entity = get_entity and get_entity(item) or nil
if entity then
-- P373 is the "Commons category" property.
local claim = entity:getBestStatements("P373")[1]
return claim and ("Category:" .. claim.mainsnak.datavalue.value) or nil
end
end
end
local function get_commons_cat_sitelink(item)
if item then
local commons_sitelink = sitelink and sitelink(item, "commonswiki") or nil
-- Reject any sitelinks that aren't categories.
return commons_sitelink and match(commons_sitelink, "^Category:") and commons_sitelink or nil
end
end
local function get_commons_cat(self)
-- Checks are in decreasing order of likelihood for a useful match.
-- Get the Commons Category claim from the object's item.
local lang_item = self:getWikidataItem()
local category = get_commons_cat_claim(lang_item)
if category then
return category
end
-- Otherwise, try the object's category's item.
local langcat_item = get_entity_id_for_title and get_entity_id_for_title("Category:" .. self:getCategoryName()) or nil
category = get_commons_cat_claim(langcat_item)
if category then
return category
end
-- If there's no P373 claim, there might be a sitelink on the
-- object's category's item.
category = get_commons_cat_sitelink(langcat_item)
if category then
return category
end
-- Otherwise, try for a sitelink on the object's own item.
category = get_commons_cat_sitelink(lang_item)
if category then
return category
end
-- If there's still no category, try the parent (if any).
local get_parent = self.getParent
if get_parent then
local parent = get_parent(self)
if parent then
return get_commons_cat(parent)
end
end
return false
end
-- Implementation of getCommonsCategory() for languages, etymology
-- languages, families, scripts and writing systems.
function export.getCommonsCategory(self)
local category
category = self._commons_category
-- Nil values cached as false.
if category ~= nil then
return category or nil
end
category = get_commons_cat(self)
self._commons_category = category
return category or nil
end
end
function export.categoryNameHasSuffix(name, suffixes)
for _, suffix in ipairs(suffixes) do
if umatch(name, "%f[%w]" .. case_insensitive_pattern(suffix, "^.") .. "$") then
return false
end
end
return true
end
category_name_has_suffix = export.categoryNameHasSuffix
function export.categoryNameToCode(name, suffix, data, suffixes)
local truncated = match(name, "(.*)" .. suffix .. "$")
if truncated and category_name_has_suffix(truncated, suffixes) then
local code = data[truncated] or data[(content_lang or get_content_lang()):lcfirst(truncated)]
if code ~= nil then
return code
end
end
if not category_name_has_suffix(name, suffixes) then
return data[name] or data[(content_lang or get_content_lang()):lcfirst(name)]
end
return nil
end
return export
a3jnrcv48h961dt8eg59fpggk4e1nkk
Module:parameters/track
828
5964
17400
2026-07-13T08:19:38Z
Hiyuune
6766
+
17400
Scribunto
text/plain
local debug_track_module = "Module:debug/track"
local string_gline_module = "Module:string/gline"
local match = string.match
local new_title = mw.title.new
local require = require
local traceback = debug.traceback
local function debug_track(...)
debug_track = require(debug_track_module)
return debug_track(...)
end
local function gline(...)
gline = require(string_gline_module)
return gline(...)
end
local params_title
local function get_params_title()
params_title, get_params_title = new_title("parameters", 828), nil
return params_title
end
return function(page, param_name)
debug_track("parameters/" .. page)
if param_name ~= nil then
debug_track("parameters/" .. page .. "/" .. param_name .. "=")
end
-- Check through the traceback to get the calling module and function.
local mod_title
for line in gline((traceback())) do
local mod, func = match(line, "^\t*(.-):%d+: in function (.*)$")
-- Must match a conventional module, not a tail call, C function, in-
-- built Scribunto file etc. If `mod` matches `mod_title`, it means the
-- module has been seen before, so there is nothing else to check.
if mod and not (mod_title and mod == mod_title.prefixedText) then
mod_title = new_title(mod)
if mod_title and mod_title.namespace == 828 and not (
mod_title == (params_title or get_params_title()) or
mod_title:isSubpageOf(params_title)
) then
mod = mod_title.text
debug_track("parameters/" .. page .. "/" .. mod)
-- traceback() encloses function names in single quotes.
local funcname = match(func, "^'(.*)'$")
if funcname then
debug_track("parameters/" .. page .. "/" .. mod .. "/" .. funcname)
return
end
-- WHen a function is unnamed, line numbers are given after the
-- module name in angle brackets, directly after a separating
-- colon.
local funcline = match(func, "^<.-:(%d+)>$")
if funcline then
debug_track("parameters/" .. page .. "/" .. mod .. ":" .. funcline)
end
return
end
end
end
end
ep6rfkuslbwvncu36j3fa17iqe4seb6
Module:string/gline
828
5965
17401
2026-07-13T08:20:42Z
Hiyuune
6766
+
17401
Scribunto
text/plain
local error = error
local find = string.find
local gmatch = string.gmatch
local match = string.match
local sub = string.sub
--[==[
Iterates over the lines in a string, treating {"\n"}, {"\r"} and {"\r\n"} as new lines.
The optional {skip} parameter determines whether certain lines are skipped:
* {NONE}: none (default).
* {EMPTY}: empty lines: lines with a length of 0, consisting of no characters.
* {BLANK}: blank lines: empty lines and lines which only consist of whitespace characters.]==]
return function(str, skip)
-- Use gmatch() for EMPTY and BLANK, for speed.
if skip == "EMPTY" then
return gmatch(str, "[^\n\r]+")
elseif skip == "BLANK" then
return gmatch(str, "[^\n\r]-%S[^\n\r]*")
elseif not (skip == nil or skip == "NONE") then
error("bad argument #2 to 'string/gline' (expected NONE, EMPTY or BLANK)", 2)
end
local start, linechar, flag = 1
if not find(str, "\n", nil, true) then
if not find(str, "\r", nil, true) then
-- No newlines: return `str` on the first iteration then end.
return function()
if flag then
return
end
flag = true
return str
end
end
linechar = "\r"
elseif find(str, "\r", nil, true) then
-- Newline could be "\n", "\r" or "\r\n" (but not "\n\r").
return function()
if not flag then
local line, nl, pos = match(str, "^([^\n\r]*)([\n\r]\n?)()", start)
if not line then
flag = true
return sub(str, start)
end
-- If `nl` is "\r\n" it should be treated as a single newline,
-- but if it's "\n\n" it needs to be treated as two separate
-- newlines, so set `flag` to 2 to avoid an unnecessary match()
-- call on the next iteration.
if nl == "\n\n" then
flag = 2
end
start = pos
return line
elseif flag == 2 then
flag = nil
return ""
end
end
else
linechar = "\n"
end
-- Newline is either "\n" or "\r", depending on which has been found.
return function()
if flag then
return
end
local pos = find(str, linechar, start, true)
if not pos then
flag = true
return sub(str, start)
end
local line = sub(str, start, pos - 1)
start = pos + 1
return line
end
end
r6wdku3u8kbsa2pnl1f07kxp328mzdt
Module:wikimedia languages
828
5966
17402
2026-07-13T08:21:07Z
Hiyuune
6766
+
17402
Scribunto
text/plain
local export = {}
local languages_module = "Module:languages"
local language_like_module = "Module:language-like"
local load_module = "Module:load"
local wm_languages_data_module = "Module:wikimedia languages/data"
local get_by_code -- Defined below.
local gmatch = string.gmatch
local is_known_language_tag = mw.language.isKnownLanguageTag
local make_object -- Defined below.
local require = require
local setmetatable = setmetatable
local type = type
--[==[
Loaders for functions in other modules, which overwrite themselves with the target function when called. This ensures modules are only loaded when needed, retains the speed/convenience of locally-declared pre-loaded functions, and has no overhead after the first call, since the target functions are called directly in any subsequent calls.]==]
local function get_lang(...)
get_lang = require(languages_module).getByCode
return get_lang(...)
end
local function get_lang_data_module_name(...)
get_lang_data_module_name = require(languages_module).getDataModuleName
return get_lang_data_module_name(...)
end
local function load_data(...)
load_data = require(load_module).load_data
return load_data(...)
end
--[==[
Loaders for objects, which load data (or some other object) into some variable, which can then be accessed as "foo or get_foo()", where the function get_foo sets the object to "foo" and then returns it. This ensures they are only loaded when needed, and avoids the need to check for the existence of the object each time, since once "foo" has been set, "get_foo" will not be called again.]==]
local wm_languages_data
local function get_wm_languages_data()
wm_languages_data, get_wm_languages_data = load_data(wm_languages_data_module), nil
return wm_languages_data
end
local WikimediaLanguage = {}
WikimediaLanguage.__index = WikimediaLanguage
function WikimediaLanguage:getCode()
return self._code
end
function WikimediaLanguage:getCanonicalName()
return self._data[1]
end
--function WikimediaLanguage:getAllNames()
-- return self._data.names
--end
--[==[Returns a table of types as a lookup table (with the types as keys).
Currently, the only possible type is {Wikimedia language}.]==]
function WikimediaLanguage:getTypes()
local types = self._types
if types == nil then
types = {["Wikimedia language"] = true}
local rawtypes = self._data.type
if rawtypes then
for t in gmatch(rawtypes, "[^,]+") do
types[t] = true
end
end
self._types = types
end
return types
end
--[==[Given a list of types as strings, returns true if the Wikimedia language has all of them.]==]
function WikimediaLanguage:hasType(...)
WikimediaLanguage.hasType = require(language_like_module).hasType
return self:hasType(...)
end
function WikimediaLanguage:getWiktionaryLanguage()
local object = self._wiktionaryLanguageObject
if object == nil then
object = get_lang(self._data.wiktionary_code, nil, "allow etym")
self._wiktionaryLanguageObject = object
end
return object
end
-- Do NOT use this method!
-- All uses should be pre-approved on the talk page!
function WikimediaLanguage:getData()
return self._data
end
--[==[Returns the name of the module containing the Wikimedia language's data (if any). Currently, this is always [[Module:wikimedia languages/data]].]==]
function WikimediaLanguage:getDataModuleName()
return wm_languages_data_module
end
function export.makeObject(code, data)
local data_type = type(data)
if data_type ~= "table" then
error(("bad argument #2 to 'makeObject' (table expected, got %s)"):format(data_type))
end
return setmetatable({_data = data, _code = code}, WikimediaLanguage)
end
make_object = export.makeObject
function export.getByCode(code)
-- Only accept codes the software recognises.
if not is_known_language_tag(code) then
return nil
end
local data = (wm_languages_data or get_wm_languages_data())[code]
-- If there is no specific Wikimedia code, then "borrow" the information
-- from the general Wiktionary language code.
local name, wiktionary_code
if data ~= nil then
name, wiktionary_code = data[1], data.wiktionary_code
if not (name == nil or wiktionary_code == nil) then
return make_object(code, data)
end
end
-- Get the associated Wiktionary language, using the wiktionary_code key or
-- else the input code.
if wiktionary_code == nil then
wiktionary_code = code
end
local lang = get_lang(wiktionary_code, nil, "allow etym", "allow family")
if lang ~= nil then
return make_object(code, {
name == nil and lang:getCanonicalName() or name,
wiktionary_code = wiktionary_code,
})
end
-- If there's no Wiktionary language for the relevant code, throw an error.
-- This should never happen.
local msg, arg3
if data == nil then
msg = "code '%s' is a valid Wikimedia language code, but there is no corresponding data in [[%s]], [[%s]] or [[Module:families/data]]"
elseif wiktionary_code ~= code then
msg = "code '%s' is a valid Wikimedia language code and has data in [[%s]], but its 'wiktionary_code' key '%s' is not valid"
arg3 = wiktionary_code
else
msg = "code '%s' is a valid Wikimedia language code and has data in [[%s]], but no corresponding data in [[%s]] or [[Module:families/data]]"
end
error(msg:format(code, wm_languages_data_module, arg3 or get_lang_data_module_name(code)))
end
get_by_code = export.getByCode
function export.getByCodeWithFallback(code)
local object = get_by_code(code)
if object ~= nil then
return object
end
local lang = get_lang(code, nil, "allow etym")
return lang ~= nil and lang:getWikimediaLanguages()[1] or nil
end
return export
ef45ys2do2au63pewsjhq7qzjxsy1nr
Module:wikimedia languages/data
828
5967
17403
2026-07-13T08:21:48Z
Hiyuune
6766
+ eo
17403
Scribunto
text/plain
local m = {}
--[=[
This table maps *FROM* Wikimedia language codes (used in lang-specific Wikipedias and Wiktionaries) into English Wiktionary language codes.
See also the following:
* `interwiki_langs` in [[Module:translations/data]], which maps in the other direction (from English Wiktionary codes to foreign Wiktionaries),
specifically for {{t+}};
* the `wiktprefix` field of the `metadata` variable in [[MediaWiki:Gadget-TranslationAdder-Data.js]], which also maps from English Wiktionary
codes to foreign Wiktionaries for use with the TranslationAdder gadget;
* the `clean` variable in [[MediaWiki:Gadget-TranslationAdder-Data.js]], which maps from user-entered foreign Wiktionary codes or names to
English Wiktionary codes for use with the TranslationAdder gadget;
* the `wikimedia_codes` field of the language data in e.g. [[Module:languages/data/2]], which also maps from English Wiktionary codes to
Wikimedia language codes.
]=]
m["als"] = {
wiktionary_code = "gsw",
}
m["azb"] = {
"South Azerbaijani",
wiktionary_code = "az",
}
m["bat-smg"] = {
wiktionary_code = "sgs",
}
m["be-tarask"] = {
"Taraškievica Belarusian",
wiktionary_code = "be",
}
m["bs"] = {
"Bosnian",
wiktionary_code = "sh",
}
m["bxr"] = {
wiktionary_code = "bua",
}
m["diq"] = {
wiktionary_code = "zza",
}
m["eml"] = {
"Emiliano-Romagnolo",
wiktionary_code = "egl",
}
m["fiu-vro"] = {
wiktionary_code = "vro",
}
m["gn"] = {
"Guarani",
wiktionary_code = "gug",
}
m["gom"] = {
"Goan Konkani",
wiktionary_code = "kok",
}
m["hr"] = {
"Croatian",
wiktionary_code = "sh",
}
m["hu-formal"] = {
"Formal Hungarian",
wiktionary_code = "hu",
}
m["ksh"] = {
wiktionary_code = "gmw-cfr",
}
m["ku"] = {
"Kurdish",
wiktionary_code = "kmr",
}
m["kv"] = {
"Komi",
wiktionary_code = "kpv",
}
m["nrm"] = {
wiktionary_code = "nrf",
}
m["prs"] = {
wiktionary_code = "fa",
}
m["roa-rup"] = {
wiktionary_code = "rup",
}
m["roa-tara"] = {
wiktionary_code = "roa-tar",
}
m["simple"] = {
"Simple English",
wiktionary_code = "en",
}
m["sr"] = {
"Serbian",
wiktionary_code = "sh",
}
m["zh-classical"] = {
wiktionary_code = "ltc",
}
m["zh-min-nan"] = {
"Southern Min",
wiktionary_code = "nan-hbl",
}
m["zh-yue"] = {
wiktionary_code = "yue",
}
return m
lmump47f458boo0u2lfz8extxjktqmm
Module:links
828
5968
17404
2026-07-13T08:22:36Z
Hiyuune
6766
+
17404
Scribunto
text/plain
local export = {}
--[=[
[[Unsupported titles]], pages with high memory usage,
extraction modules and part-of-speech names are listed
at [[Module:links/data]].
Other modules used:
[[Module:script utilities]]
[[Module:scripts]]
[[Module:languages]] and its submodules
[[Module:gender and number]]
[[Module:debug/track]]
]=]
local anchors_module = "Module:anchors"
local debug_track_module = "Module:debug/track"
local form_of_module = "Module:form of"
local gender_and_number_module = "Module:gender and number"
local languages_module = "Module:languages"
local load_module = "Module:load"
local memoize_module = "Module:memoize"
local pages_module = "Module:pages"
local pron_qualifier_module = "Module:pron qualifier"
local scripts_module = "Module:scripts"
local script_utilities_module = "Module:script utilities"
local string_encode_entities_module = "Module:string/encode entities"
local string_utilities_module = "Module:string utilities"
local table_module = "Module:table"
local utilities_module = "Module:utilities"
local concat = table.concat
local find = string.find
local get_current_title = mw.title.getCurrentTitle
local insert = table.insert
local ipairs = ipairs
local match = string.match
local new_title = mw.title.new
local pairs = pairs
local remove = table.remove
local sub = string.sub
local toNFC = mw.ustring.toNFC
local tostring = tostring
local type = type
local unstrip = mw.text.unstrip
local NAMESPACE = get_current_title().nsText
local function anchor_encode(...)
anchor_encode = require(memoize_module)(mw.uri.anchorEncode, true)
return anchor_encode(...)
end
local function debug_track(...)
debug_track = require(debug_track_module)
return debug_track(...)
end
local function decode_entities(...)
decode_entities = require(string_utilities_module).decode_entities
return decode_entities(...)
end
local function decode_uri(...)
decode_uri = require(string_utilities_module).decode_uri
return decode_uri(...)
end
-- Can't yet replace, as the [[Module:string utilities]] version no longer has automatic double-encoding prevention, which requires changes here to account for.
local function encode_entities(...)
encode_entities = require(string_encode_entities_module)
return encode_entities(...)
end
local function extend(...)
extend = require(table_module).extend
return extend(...)
end
local function find_best_script_without_lang(...)
find_best_script_without_lang = require(scripts_module).findBestScriptWithoutLang
return find_best_script_without_lang(...)
end
local function format_categories(...)
format_categories = require(utilities_module).format_categories
return format_categories(...)
end
local function format_genders(...)
format_genders = require(gender_and_number_module).format_genders
return format_genders(...)
end
local function format_qualifiers(...)
format_qualifiers = require(pron_qualifier_module).format_qualifiers
return format_qualifiers(...)
end
local function get_current_L2(...)
get_current_L2 = require(pages_module).get_current_L2
return get_current_L2(...)
end
local function get_lang(...)
get_lang = require(languages_module).getByCode
return get_lang(...)
end
local function get_script(...)
get_script = require(scripts_module).getByCode
return get_script(...)
end
local function language_anchor(...)
language_anchor = require(anchors_module).language_anchor
return language_anchor(...)
end
local function load_data(...)
load_data = require(load_module).load_data
return load_data(...)
end
local function request_script(...)
request_script = require(script_utilities_module).request_script
return request_script(...)
end
local function shallow_copy(...)
shallow_copy = require(table_module).shallowCopy
return shallow_copy(...)
end
local function split(...)
split = require(string_utilities_module).split
return split(...)
end
local function tag_text(...)
tag_text = require(script_utilities_module).tag_text
return tag_text(...)
end
local function tag_translit(...)
tag_translit = require(script_utilities_module).tag_translit
return tag_translit(...)
end
local function trim(...)
trim = require(string_utilities_module).trim
return trim(...)
end
local function u(...)
u = require(string_utilities_module).char
return u(...)
end
local function ulower(...)
ulower = require(string_utilities_module).lower
return ulower(...)
end
local function umatch(...)
umatch = require(string_utilities_module).match
return umatch(...)
end
local m_headword_data
local function get_headword_data()
m_headword_data = load_data("Module:headword/data")
return m_headword_data
end
local function track(page, code)
local tracking_page = "links/" .. page
debug_track(tracking_page)
if code then
debug_track(tracking_page .. "/" .. code)
end
end
local function selective_trim(...)
-- Unconditionally trimmed charset.
local always_trim =
"\194\128-\194\159" .. -- U+0080-009F (C1 control characters)
"\194\173" .. -- U+00AD (soft hyphen)
"\226\128\170-\226\128\174" .. -- U+202A-202E (directionality formatting characters)
"\226\129\166-\226\129\169" -- U+2066-2069 (directionality formatting characters)
-- Standard trimmed charset.
local standard_trim = "%s" .. -- (default whitespace charset)
"\226\128\139-\226\128\141" .. -- U+200B-200D (zero-width spaces)
always_trim
-- If there are non-whitespace characters, trim all characters in `standard_trim`.
-- Otherwise, only trim the characters in `always_trim`.
selective_trim = function(text)
if text == "" then
return text
end
local trimmed = trim(text, standard_trim)
if trimmed ~= "" then
return trimmed
end
return trim(text, always_trim)
end
return selective_trim(...)
end
local function escape(text, str)
local rep
repeat
text, rep = text:gsub("\\\\(\\*" .. str .. ")", "\5%1")
until rep == 0
return (text:gsub("\\" .. str, "\6"))
end
local function unescape(text, str)
return (text
:gsub("\5", "\\")
:gsub("\6", str))
end
-- Remove bold, italics, soft hyphens, strip markers and HTML tags.
local function remove_formatting(str)
str = str
:gsub("('*)'''(.-'*)'''", "%1%2")
:gsub("('*)''(.-'*)''", "%1%2")
:gsub("", "")
return (unstrip(str)
:gsub("<[^<>]+>", ""))
end
--[==[Takes an input and splits on a double slash (taking account of escaping backslashes).]==]
function export.split_on_slashes(text)
if text:find("\\", nil, true) then
track("escaped", "split_on_slashes")
end
text = split(escape(text, "//"), "//", true) or {}
for i, v in ipairs(text) do
text[i] = unescape(v, "//")
if v == "" then
text[i] = false
end
end
return text
end
--[==[Takes a wikilink and outputs the link target and display text. By default, the link target will be returned as a title object, but if `allow_bad_target` is set it will be returned as a string, and no check will be performed as to whether it is a valid link target.]==]
function export.get_wikilink_parts(text, allow_bad_target)
-- TODO: replace `allow_bad_target` with `allow_unsupported`, with support for links to unsupported titles, including escape sequences.
if ( -- Filters out anything but "[[...]]" with no intermediate "[[" or "]]".
not match(text, "^()%[%[") or -- Faster than sub(text, 1, 2) ~= "[[".
find(text, "[[", 3, true) or
find(text, "]]", 3, true) ~= #text - 1
) then
return nil, nil
end
local pipe, title, display = find(text, "|", 3, true)
if pipe then
title, display = sub(text, 3, pipe - 1), sub(text, pipe + 1, -3)
else
title = sub(text, 3, -3)
display = title
end
if allow_bad_target then
return title, display
end
title = new_title(title)
-- No title object means the target is invalid.
if title == nil then
return nil, nil
-- If the link target starts with "#" then mw.title.new returns a broken
-- title object, so grab the current title and give it the correct fragment.
elseif title.prefixedText == "" then
local fragment = title.fragment
if fragment == "" then -- [[#]] isn't valid
return nil, nil
end
title = get_current_title()
title.fragment = fragment
end
return title, display
end
-- Does the work of export.get_fragment, but can be called directly to avoid unnecessary checks for embedded links.
local function get_fragment(text)
text = escape(text, "#")
-- Replace numeric character references with the corresponding character (' → '),
-- as they contain #, which causes the numeric character reference to be
-- misparsed (wa'a → wa'a → pagename wa&, fragment 39;a).
text = decode_entities(text)
local target, fragment = text:match("^(.-)#(.+)$")
target = target or text
target = unescape(target, "#")
fragment = fragment and unescape(fragment, "#")
return target, fragment
end
--[==[Takes a link target and outputs the actual target and the fragment (if any).]==]
function export.get_fragment(text)
if text:find("\\", nil, true) then
track("escaped", "get_fragment")
end
-- If there are no embedded links, process input.
local open = find(text, "[[", nil, true)
if not open then
return get_fragment(text)
end
local close = find(text, "]]", open + 2, true)
if not close then
return get_fragment(text)
-- If there is one, but it's redundant (i.e. encloses everything with no pipe), remove and process.
elseif open == 1 and close == #text - 1 and not find(text, "|", 3, true) then
return get_fragment(sub(text, 3, -3))
end
-- Otherwise, return the input.
return text
end
--[==[
Given a link target as passed to `full_link()`, get the actual page that the target refers to. This removes
bold, italics, strip markets and HTML; calls `makeEntryName()` for the language in question; converts targets
beginning with `*` to the Reconstruction namespace; and converts appendix-constructed languages to the Appendix
namespace. Returns up to three values:
# the actual page to link to, or {nil} to not link to anything;
# how the target should be displayed as, if the user didn't explicitly specify any display text; generally the
same as the original target, but minus any anti-asterisk !!;
# the value `true` if the target had a backslash-escaped * in it (FIXME: explain this more clearly).
]==]
function export.get_link_page_with_auto_display(target, lang, sc, plain)
local orig_target = target
if not target then
return nil
elseif target:find("\\", nil, true) then
track("escaped", "get_link_page")
end
target = remove_formatting(target)
if target:sub(1, 1) == ":" then
track("initial colon")
-- FIXME, the auto_display (second return value) should probably remove the colon
return target:sub(2), orig_target
end
local prefix = target:match("^(.-):")
-- Convert any escaped colons
target = target:gsub("\\:", ":")
if prefix then
-- If this is an a link to another namespace or an interwiki link, ensure there's an initial colon and then
-- return what we have (so that it works as a conventional link, and doesn't do anything weird like add the term
-- to a category.)
prefix = ulower(trim(prefix))
if prefix ~= "" and (
load_data("Module:data/namespaces")[prefix] or
load_data("Module:data/interwikis")[prefix]
) then
return target, orig_target
end
end
-- Check if the term is reconstructed and remove any asterisk. Also check for anti-asterisk (!!).
-- Otherwise, handle the escapes.
local reconstructed, escaped, anti_asterisk
if not plain then
target, reconstructed = target:gsub("^%*(.)", "%1")
if reconstructed == 0 then
target, anti_asterisk = target:gsub("^!!(.)", "%1")
if anti_asterisk == 1 then
-- Remove !! from original. FIXME! We do it this way because the call to remove_formatting() above
-- may cause non-initial !! to be interpreted as anti-asterisks. We should surely move the
-- remove_formatting() call later.
orig_target = orig_target:gsub("^!!", "")
end
end
end
target, escaped = target:gsub("^(\\-)\\%*", "%1*")
if not (sc and sc:getCode() ~= "None") then
sc = lang:findBestScript(target)
end
-- Remove carets if they are used to capitalize parts of transliterations (unless they have been escaped).
if (not sc:hasCapitalization()) and sc:isTransliterated() and target:match("%^") then
target = escape(target, "^")
:gsub("%^", "")
target = unescape(target, "^")
end
-- Get the entry name for the language.
target = lang:makeEntryName(target, sc, reconstructed == 1 or lang:hasType("appendix-constructed"))
-- If the link contains unexpanded template parameters, then don't create a link.
if target:match("{{{.-}}}") then
-- FIXME: Should we return the original target as the default display value (second return value)?
return nil
end
-- Link to appendix for reconstructed terms and terms in appendix-only languages. Plain links interpret *
-- literally, however.
if reconstructed == 1 then
if lang:getFullCode() == "und" then
-- Return the original target as default display value. If we don't do this, we wrongly get
-- [Term?] displayed instead.
return nil, orig_target
end
target = "Reconstruction:" .. lang:getFullName() .. "/" .. target
-- Reconstructed languages and substrates require an initial *.
elseif anti_asterisk ~= 1 and (lang:hasType("reconstructed") or lang:getFamilyCode() == "qfa-sub") then
error(("The specified language %s is unattested, while the term '%s' does not begin with '*' to indicate that it is reconstructed.")
:
format(lang:getCanonicalName(), orig_target))
elseif lang:hasType("appendix-constructed") then
target = "Appendix:" .. lang:getFullName() .. "/" .. target
else
target = target
end
return target, orig_target, escaped > 0
end
function export.get_link_page(target, lang, sc, plain)
local target, auto_display, escaped = export.get_link_page_with_auto_display(target, lang, sc, plain)
return target, escaped
end
-- Make a link from a given link's parts
local function make_link(link, lang, sc, id, isolated, cats, no_alt_ast, plain)
-- Convert percent encoding to plaintext.
link.target = link.target and decode_uri(link.target, "PATH")
link.fragment = link.fragment and decode_uri(link.fragment, "PATH")
-- Find fragments (if one isn't already set).
-- Prevents {{l|en|word#Etymology 2|word}} from linking to [[word#Etymology 2#English]].
-- # can be escaped as \#.
if link.target and link.fragment == nil then
link.target, link.fragment = get_fragment(link.target)
end
-- Process the target
local auto_display, escaped
link.target, auto_display, escaped = export.get_link_page_with_auto_display(link.target, lang, sc, plain)
-- Create a default display form.
-- If the target is "" then it's a link like [[#English]], which refers to the current page.
if auto_display == "" then
auto_display = (m_headword_data or get_headword_data()).pagename
end
-- If the display is the target and the reconstruction * has been escaped, remove the escaping backslash.
if escaped then
auto_display = auto_display:gsub("\\([^\\]*%*)", "%1", 1)
end
-- Process the display form.
if link.display then
local orig_display = link.display
link.display = lang:makeDisplayText(link.display, sc, true)
if cats then
auto_display = lang:makeDisplayText(auto_display, sc)
-- If the alt text is the same as what would have been automatically generated, then the alt parameter is redundant (e.g. {{l|en|foo|foo}}, {{l|en|w:foo|foo}}, but not {{l|en|w:foo|w:foo}}).
-- If they're different, but the alt text could have been entered as the term parameter without it affecting the target page, then the target parameter is redundant (e.g. {{l|ru|фу|фу́}}).
-- If `no_alt_ast` is true, use pcall to catch the error which will be thrown if this is a reconstructed lang and the alt text doesn't have *.
if link.display == auto_display then
insert(cats, lang:getFullName() .. " links with redundant alt parameters")
else
local ok, check
if no_alt_ast then
ok, check = pcall(export.get_link_page, orig_display, lang, sc, plain)
else
ok = true
check = export.get_link_page(orig_display, lang, sc, plain)
end
if ok and link.target == check then
insert(cats, lang:getFullName() .. " links with redundant target parameters")
end
end
end
else
link.display = lang:makeDisplayText(auto_display, sc)
end
if not link.target then
return link.display
end
-- If the target is the same as the current page, there is no sense id
-- and either the language code is "und" or the current L2 is the current
-- language then return a "self-link" like the software does.
if link.target == get_current_title().prefixedText then
local fragment, current_L2 = link.fragment, get_current_L2()
if (
fragment and fragment == current_L2 or
not (id or fragment) and (lang:getFullCode() == "und" or lang:getFullName() == current_L2)
) then
return tostring(mw.html.create("strong")
:addClass("selflink")
:wikitext(link.display))
end
end
-- Add fragment. Do not add a section link to "Undetermined", as such sections do not exist and are invalid.
-- TabbedLanguages handles links without a section by linking to the "last visited" section, but adding
-- "Undetermined" would break that feature. For localized prefixes that make syntax error, please use the
-- format: ["xyz"] = true.
local prefix = link.target:match("^:*([^:]+):")
prefix = prefix and ulower(prefix)
if prefix ~= "category" and not (prefix and load_data("Module:data/interwikis")[prefix]) then
if (link.fragment or link.target:sub(-1) == "#") and not plain then
track("fragment", lang:getFullCode())
if cats then
insert(cats, lang:getFullName() .. " links with manual fragments")
end
end
if not link.fragment then
if id then
link.fragment = lang:getFullCode() == "und" and anchor_encode(id) or language_anchor(lang, id)
elseif lang:getFullCode() ~= "und" and not (link.target:match("^Appendix:") or link.target:match("^Reconstruction:")) then
link.fragment = anchor_encode(lang:getFullName())
end
end
end
-- Put inward-facing square brackets around a link to isolated spacing character(s).
if isolated and #link.display > 0 and not umatch(decode_entities(link.display), "%S") then
link.display = "]" .. link.display .. "["
end
link.target = link.target:gsub("^(:?)(.*)", function(m1, m2)
return m1 .. encode_entities(m2, "#%&+/:<=>@[\\]_{|}")
end)
link.fragment = link.fragment and encode_entities(remove_formatting(link.fragment), "#%&+/:<=>@[\\]_{|}")
return "[[" ..
link.target:gsub("^[^:]", ":%0") .. (link.fragment and "#" .. link.fragment or "") .. "|" .. link.display .. "]]"
end
-- Split a link into its parts
local function parse_link(linktext)
local link = { target = linktext }
local target = link.target
link.target, link.display = target:match("^(..-)|(.+)$")
if not link.target then
link.target = target
link.display = target
end
-- There's no point in processing these, as they aren't real links.
local target_lower = link.target:lower()
for _, false_positive in ipairs({ "category", "cat", "file", "image" }) do
if target_lower:match("^" .. false_positive .. ":") then
return nil
end
end
link.display = decode_entities(link.display)
link.target, link.fragment = get_fragment(link.target)
-- So that make_link does not look for a fragment again.
if not link.fragment then
link.fragment = false
end
return link
end
local function check_params_ignored_when_embedded(alt, lang, id, cats)
if alt then
track("alt-ignored")
if cats then
insert(cats, lang:getFullName() .. " links with ignored alt parameters")
end
end
if id then
track("id-ignored")
if cats then
insert(cats, lang:getFullName() .. " links with ignored id parameters")
end
end
end
-- Find embedded links and ensure they link to the correct section.
local function process_embedded_links(text, alt, lang, sc, id, cats, no_alt_ast, plain)
-- Process the non-linked text.
text = lang:makeDisplayText(text, sc, true)
-- If the text begins with * and another character, then act as if each link begins with *. However, don't do this if the * is contained within a link at the start. E.g. `|*[[foo]]` would set all_reconstructed to true, while `|[[*foo]]` would not.
local all_reconstructed = false
if not plain then
-- anchor_encode removes links etc.
if anchor_encode(text):sub(1, 1) == "*" then
all_reconstructed = true
end
-- Otherwise, handle any escapes.
text = text:gsub("^(\\-)\\%*", "%1*")
end
check_params_ignored_when_embedded(alt, lang, id, cats)
local function process_link(space1, linktext, space2)
local capture = "[[" .. linktext .. "]]"
local link = parse_link(linktext)
-- Return unprocessed false positives untouched (e.g. categories).
if not link then
return capture
end
if all_reconstructed then
if link.target:find("^!!") then
-- Check for anti-asterisk !! at the beginning of a target, indicating that a reconstructed term
-- wants a part of the term to link to a non-reconstructed term, e.g. Old English
-- {{ang-noun|m|head=*[[!!Crist|Cristes]] [[!!mæsseǣfen]]}}.
link.target = link.target:sub(3)
-- Also remove !! from the display, which may have been copied from the target (as in mæsseǣfen in
-- the example above).
link.display = link.display:gsub("^!!", "")
elseif not link.target:match("^%*") then
link.target = "*" .. link.target
end
end
linktext = make_link(link, lang, sc, id, false, nil, no_alt_ast, plain)
:gsub("^%[%[", "\3")
:gsub("%]%]$", "\4")
return space1 .. linktext .. space2
end
-- Use chars 1 and 2 as temporary substitutions, so that we can use charsets. These are converted to chars 3 and 4 by process_link, which means we can convert any remaining chars 1 and 2 back to square brackets (i.e. those not part of a link).
text = text
:gsub("%[%[", "\1")
:gsub("%]%]", "\2")
-- If the script uses ^ to capitalize transliterations, make sure that any carets preceding links are on the inside, so that they get processed with the following text.
if (
text:find("^", nil, true) and
not sc:hasCapitalization() and
sc:isTransliterated()
) then
text = escape(text, "^")
:gsub("%^\1", "\1%^")
text = unescape(text, "^")
end
text = text:gsub("\1(%s*)([^\1\2]-)(%s*)\2", process_link)
-- Remove the extra * at the beginning of a language link if it's immediately followed by a link whose display begins with * too.
if all_reconstructed then
text = text:gsub("^%*\3([^|\1-\4]+)|%*", "\3%1|*")
end
return (text
:gsub("[\1\3]", "[[")
:gsub("[\2\4]", "]]")
)
end
local function simple_link(term, fragment, alt, lang, sc, id, cats, no_alt_ast, srwc)
local plain
if lang == nil then
lang, plain = get_lang("und"), true
end
-- Get the link target and display text. If the term is the empty string, treat the input as a link to the current page.
if term == "" then
term = get_current_title().prefixedText
elseif term then
local new_term, new_alt = export.get_wikilink_parts(term, true)
if new_term then
check_params_ignored_when_embedded(alt, lang, id, cats)
-- [[|foo]] links are treated as plaintext "[[|foo]]".
-- FIXME: Pipes should be handled via a proper escape sequence, as they can occur in unsupported titles.
if new_term == "" then
term, alt = nil, term
else
local title = new_title(new_term)
if title then
local ns = title.namespace
-- File: and Category: links should be returned as-is.
if ns == 6 or ns == 14 then
return term
end
end
term, alt = new_term, new_alt
if cats then
if not (srwc and srwc(term, alt)) then
insert(cats, lang:getFullName() .. " links with redundant wikilinks")
end
end
end
end
end
if alt then
alt = selective_trim(alt)
if alt == "" then
alt = nil
end
end
-- If there's nothing to process, return nil.
if not (term or alt) then
return nil
end
-- If there is no script, get one.
if not sc then
sc = lang:findBestScript(alt or term)
end
-- Embedded wikilinks need to be processed individually.
if term then
local open = find(term, "[[", nil, true)
if open and find(term, "]]", open + 2, true) then
return process_embedded_links(term, alt, lang, sc, id, cats, no_alt_ast, plain)
end
term = selective_trim(term)
end
-- If not, make a link using the parameters.
return make_link({
target = term,
display = alt,
fragment = fragment
}, lang, sc, id, true, cats, no_alt_ast, plain)
end
--[==[Creates a basic link to the given term. It links to the language section (such as <code>==English==</code>), but it does not add language and script wrappers, so any code that uses this function should call the <code class="n">[[Module:script utilities#tag_text|tag_text]]</code> from [[Module:script utilities]] to add such wrappers itself at some point.
The first argument, <code class="n">data</code>, may contain the following items, a subset of the items used in the <code class="n">data</code> argument of <code class="n">full_link</code>. If any other items are included, they are ignored.
{ {
term = entry_to_link_to,
alt = link_text_or_displayed_text,
lang = language_object,
id = sense_id,
} }
; <code class="n">term</code>
: Text to turn into a link. This is generally the name of a page. The text can contain wikilinks already embedded in it. These are processed individually just like a single link would be. The <code class="n">alt</code> argument is ignored in this case.
; <code class="n">alt</code> (''optional'')
: The alternative display for the link, if different from the linked page. If this is {{code|lua|nil}}, the <code class="n">text</code> argument is used instead (much like regular wikilinks). If <code class="n">text</code> contains wikilinks in it, this argument is ignored and has no effect. (Links in which the alt is ignored are tracked with the tracking template {{whatlinkshere|tracking=links/alt-ignored}}.)
; <code class="n">lang</code>
: The [[Module:languages#Language objects|language object]] for the term being linked. If this argument is defined, the function will determine the language's canonical name (see [[Template:language data documentation]]), and point the link or links in the <code class="n">term</code> to the language's section of an entry, or to a language-specific senseid if the <code class="n">id</code> argument is defined.
; <code class="n">id</code> (''optional'')
: Sense id string. If this argument is defined, the link will point to a language-specific sense id ({{ll|en|identifier|id=HTML}}) created by the template {{temp|senseid}}. A sense id consists of the language's canonical name, a hyphen (<code>-</code>), and the string that was supplied as the <code class="n">id</code> argument. This is useful when a term has more than one sense in a language. If the <code class="n">term</code> argument contains wikilinks, this argument is ignored. (Links in which the sense id is ignored are tracked with the tracking template {{whatlinkshere|tracking=links/id-ignored}}.)
The second argument is as follows:
; <code class="n">allow_self_link</code>
: If {{code|lua|true}}, the function will also generate links to the current page. The default ({{code|lua|false}}) will not generate a link but generate a bolded "self link" instead.
The following special options are processed for each link (both simple text and with embedded wikilinks):
* The target page name will be processed to generate the correct entry name. This is done by the [[Module:languages#makeEntryName|makeEntryName]] function in [[Module:languages]], using the <code class="n">entry_name</code> replacements in the language's data file (see [[Template:language data documentation]] for more information). This function is generally used to automatically strip dictionary-only diacritics that are not part of the normal written form of a language.
* If the text starts with <code class="n">*</code>, then the term is considered a reconstructed term, and a link to the Reconstruction: namespace will be created. If the text contains embedded wikilinks, then <code class="n">*</code> is automatically applied to each one individually, while preserving the displayed form of each link as it was given. This allows linking to phrases containing multiple reconstructed terms, while only showing the * once at the beginning.
* If the text starts with <code class="n">:</code>, then the link is treated as "raw" and the above steps are skipped. This can be used in rare cases where the page name begins with <code class="n">*</code> or if diacritics should not be stripped. For example:
** {{temp|l|en|*nix}} links to the nonexistent page [[Reconstruction:English/nix]] (<code class="n">*</code> is interpreted as a reconstruction), but {{temp|l|en|:*nix}} links to [[*nix]].
** {{temp|l|sl|Franche-Comté}} links to the nonexistent page [[Franche-Comte]] (<code>é</code> is converted to <code>e</code> by <code class="n">makeEntryName</code>), but {{temp|l|sl|:Franche-Comté}} links to [[Franche-Comté]].]==]
function export.language_link(data)
if type(data) ~= "table" then
error(
"The first argument to the function language_link must be a table. See Module:links/documentation for more information.")
elseif data.term and data.term:find("\\", nil, true) or data.alt and data.alt:find("\\", nil, true) then
track("escaped", "language_link")
end
-- Categorize links to "und".
local lang, cats = data.lang, data.cats
if cats and lang:getCode() == "und" then
insert(cats, "Undetermined language links")
end
return simple_link(
data.term,
data.fragment,
data.alt,
lang,
data.sc,
data.id,
cats,
data.no_alt_ast,
data.suppress_redundant_wikilink_cat
)
end
function export.plain_link(data)
if type(data) ~= "table" then
error(
"The first argument to the function plain_link must be a table. See Module:links/documentation for more information.")
elseif data.term and data.term:find("\\", nil, true) or data.alt and data.alt:find("\\", nil, true) then
track("escaped", "plain_link")
end
return simple_link(
data.term,
data.fragment,
data.alt,
nil,
data.sc,
data.id,
data.cats,
data.no_alt_ast,
data.suppress_redundant_wikilink_cat
)
end
--[==[Replace any links with links to the correct section, but don't link the whole text if no embedded links are found. Returns the display text form.]==]
function export.embedded_language_links(data)
if type(data) ~= "table" then
error(
"The first argument to the function embedded_language_links must be a table. See Module:links/documentation for more information.")
elseif data.term and data.term:find("\\", nil, true) or data.alt and data.alt:find("\\", nil, true) then
track("escaped", "embedded_language_links")
end
local term, lang, sc = data.term, data.lang, data.sc
-- If we don't have a script, get one.
if not sc then
sc = lang:findBestScript(term)
end
-- Do we have embedded wikilinks? If so, they need to be processed individually.
local open = find(term, "[[", nil, true)
if open and find(term, "]]", open + 2, true) then
return process_embedded_links(term, data.alt, lang, sc, data.id, data.cats, data.no_alt_ast)
end
-- If not, return the display text.
term = selective_trim(term)
-- FIXME: Double-escape any percent-signs, because we don't want to treat non-linked text as having percent-encoded characters. This is a hack: percent-decoding should come out of [[Module:languages]] and only dealt with in this module, as it's specific to links.
term = term:gsub("%%", "%%25")
return lang:makeDisplayText(term, sc, true)
end
function export.mark(text, item_type, face, lang)
local tag = { "", "" }
if item_type == "gloss" then
tag = { '<span class="mention-gloss-double-quote">“</span><span class="mention-gloss">',
'</span><span class="mention-gloss-double-quote">”</span>' }
if type(text) == "string" and text:match("^''[^'].*''$") then
-- Temporary tracking for mention glosses that are entirely italicized or bolded, which is probably
-- wrong. (Note that this will also find bolded mention glosses since they use triple apostrophes.)
track("italicized-mention-gloss", lang and lang:getFullCode() or nil)
end
elseif item_type == "tr" then
if face == "term" then
tag = { '<span lang="' .. lang:getFullCode() .. '" class="tr mention-tr Latn">',
'</span>' }
else
tag = { '<span lang="' .. lang:getFullCode() .. '" class="tr Latn">', '</span>' }
end
elseif item_type == "ts" then
-- \226\129\160 = word joiner (zero-width non-breaking space) U+2060
tag = { '<span class="ts mention-ts Latn">/\226\129\160', '\226\129\160/</span>' }
elseif item_type == "pos" then
tag = { '<span class="ann-pos">', '</span>' }
elseif item_type == "non-gloss" then
tag = { '<span class="ann-non-gloss">', '</span>' }
elseif item_type == "annotations" then
tag = { '<span class="mention-gloss-paren annotation-paren">(</span>',
'<span class="mention-gloss-paren annotation-paren">)</span>' }
elseif item_type == "infl" then
tag = { '<span class="ann-infl">', '</span>' }
end
if type(text) == "string" then
return tag[1] .. text .. tag[2]
else
return ""
end
end
local pos_tags
--[==[Formats the annotations that are displayed with a link created by {{code|lua|full_link}}. Annotations are the extra bits of information that are displayed following the linked term, and include things such as gender, transliteration, gloss and so on.
* The first argument is a table possessing some or all of the following keys:
*:; <code class="n">genders</code>
*:: Table containing a list of gender specifications in the style of [[Module:gender and number]].
*:; <code class="n">tr</code>
*:: Transliteration.
*:; <code class="n">gloss</code>
*:: Gloss that translates the term in the link, or gives some other descriptive information.
*:; <code class="n">pos</code>
*:: Part of speech of the linked term. If the given argument matches one of the aliases in `pos_aliases` in [[Module:headword/data]], or consists of a part of speech or alias followed by `f` (for a non-lemma form), expand it appropriately. Otherwise, just show the given text as it is.
*:; <code class="n">ng</code>
*:: Arbitrary non-gloss descriptive text for the link. This should be used in preference to putting descriptive text in `gloss` or `pos`.
*:; <code class="n">lit</code>
*:: Literal meaning of the term, if the usual meaning is figurative or idiomatic.
*:; <code class="n">infl</code>
*:: Table containing a list of grammar tags in the style of [[Module:form of]] `tagged_inflections`.
*:Any of the above values can be omitted from the <code class="n">info</code> argument. If a completely empty table is given (with no annotations at all), then an empty string is returned.
* The second argument is a string. Valid values are listed in [[Module:script utilities/data]] "data.translit" table.]==]
function export.format_link_annotations(data, face)
local output = {}
-- Interwiki link
if data.interwiki then
insert(output, data.interwiki)
end
-- Genders
if type(data.genders) ~= "table" then
data.genders = { data.genders }
end
if data.genders and #data.genders > 0 then
local genders, gender_cats = format_genders(data.genders, data.lang)
insert(output, " " .. genders)
if gender_cats then
local cats = data.cats
if cats then
extend(cats, gender_cats)
end
end
end
local annotations = {}
-- Transliteration and transcription
if data.tr and data.tr[1] or data.ts and data.ts[1] then
local kind
if face == "term" then
kind = face
else
kind = "default"
end
if data.tr[1] and data.ts[1] then
insert(annotations, tag_translit(data.tr[1], data.lang, kind) .. " " .. export.mark(data.ts[1], "ts"))
elseif data.ts[1] then
insert(annotations, export.mark(data.ts[1], "ts"))
else
insert(annotations, tag_translit(data.tr[1], data.lang, kind))
end
end
-- Gloss/translation
if data.gloss then
insert(annotations, export.mark(data.gloss, "gloss"))
end
-- Part of speech
if data.pos then
-- debug category for pos= containing transcriptions
if data.pos:match("/[^><]-/") then
data.pos = data.pos .. "[[Category:links likely containing transcriptions in pos]]"
end
-- Canonicalize part of speech aliases as well as non-lemma aliases like 'nf' or 'nounf' for "noun form".
pos_tags = pos_tags or (m_headword_data or get_headword_data()).pos_aliases
local pos = pos_tags[data.pos]
if not pos and data.pos:find("f$") then
local pos_form = data.pos:sub(1, -2)
-- We only expand something ending in 'f' if the result is a recognized non-lemma POS.
pos_form = (pos_tags[pos_form] or pos_form) .. " form"
if (m_headword_data or get_headword_data()).nonlemmas[pos_form .. "s"] then
pos = pos_form
end
end
insert(annotations, export.mark(pos or data.pos, "pos"))
end
-- Inflection data
if data.infl then
local m_form_of = require(form_of_module)
-- Split tag sets manually, since tagged_inflections creates a numbered list, and we do not want that.
local infl_outputs = {}
local tag_sets = m_form_of.split_tag_set(data.infl)
for _, tag_set in ipairs(tag_sets) do
table.insert(infl_outputs,
m_form_of.tagged_inflections({ tags = tag_set, lang = data.lang, nocat = true, nolink = true, nowrap = true }))
end
insert(annotations, export.mark(table.concat(infl_outputs, "; "), "infl"))
end
-- Non-gloss text
if data.ng then
insert(annotations, export.mark(data.ng, "non-gloss"))
end
-- Literal/sum-of-parts meaning
if data.lit then
insert(annotations, "literally " .. export.mark(data.lit, "gloss"))
end
-- Provide a hook to insert additional annotations such as nested inflections.
if data.postprocess_annotations then
data.postprocess_annotations {
data = data,
annotations = annotations
}
end
if #annotations > 0 then
insert(output, " " .. export.mark(concat(annotations, ", "), "annotations"))
end
return concat(output)
end
-- Encode certain characters to avoid various delimiter-related issues at various stages. We need to encode < and >
-- because they end up forming part of CSS class names inside of <span ...> and will interfere with finding the end
-- of the HTML tag. I first tried converting them to URL encoding, i.e. %3C and %3E; they then appear in the URL as
-- %253C and %253E, which get mapped back to %3C and %3E when passed to [[Module:accel]]. But mapping them to <
-- and > somehow works magically without any further work; they appear in the URL as < and >, and get passed to
-- [[Module:accel]] as < and >. I have no idea who along the chain of calls is doing the encoding and decoding. If
-- someone knows, please modify this comment appropriately!
local accel_char_map
local function get_accel_char_map()
accel_char_map = {
["%"] = ".",
[" "] = "_",
["_"] = u(0xFFF0),
["<"] = "<",
[">"] = ">",
}
return accel_char_map
end
local function encode_accel_param_chars(param)
return (param:gsub("[% <>_]", accel_char_map or get_accel_char_map()))
end
local function encode_accel_param(prefix, param)
if not param then
return ""
end
if type(param) == "table" then
local filled_params = {}
-- There may be gaps in the sequence, especially for translit params.
local maxindex = 0
for k in pairs(param) do
if type(k) == "number" and k > maxindex then
maxindex = k
end
end
for i = 1, maxindex do
filled_params[i] = param[i] or ""
end
-- [[Module:accel]] splits these up again.
param = concat(filled_params, "*~!")
end
-- This is decoded again by [[WT:ACCEL]].
return prefix .. encode_accel_param_chars(param)
end
local function insert_if_not_blank(list, item)
if item == "" then
return
end
insert(list, item)
end
local function get_class(lang, tr, accel, nowrap)
if not accel and not nowrap then
return ""
end
local classes = {}
if accel then
insert(classes, "form-of lang-" .. lang:getFullCode())
local form = accel.form
if form then
insert(classes, encode_accel_param_chars(form) .. "-form-of")
end
insert_if_not_blank(classes, encode_accel_param("gender-", accel.gender))
insert_if_not_blank(classes, encode_accel_param("pos-", accel.pos))
insert_if_not_blank(classes, encode_accel_param("transliteration-", accel.translit or (tr ~= "-" and tr or nil)))
insert_if_not_blank(classes, encode_accel_param("target-", accel.target))
insert_if_not_blank(classes, encode_accel_param("origin-", accel.lemma))
insert_if_not_blank(classes, encode_accel_param("origin_transliteration-", accel.lemma_translit))
if accel.no_store then
insert(classes, "form-of-nostore")
end
end
if nowrap then
insert(classes, nowrap)
end
return concat(classes, " ")
end
-- Add any left or right regular or accent qualifiers, labels or references to a formatted term. `data` is the object
-- specifying the term, which should optionally contain:
-- * a language object in `lang`; required if any accent qualifiers or labels are given;
-- * left regular qualifiers in `q` (an array of strings or a single string); an empty array or blank string will be
-- ignored;
-- * right regular qualifiers in `qq` (an array of strings or a single string); an empty array or blank string will be
-- ignored;
-- * left accent qualifiers in `a` (an array of strings); an empty array will be ignored;
-- * right accent qualifiers in `aa` (an array of strings); an empty array will be ignored;
-- * left labels in `l` (an array of strings); an empty array will be ignored;
-- * right labels in `ll` (an array of strings); an empty array will be ignored;
-- * references in `refs`, an array either of strings (formatted reference text) or objects containing fields `text`
-- (formatted reference text) and optionally `name` and/or `group`.
-- `formatted` is the formatted version of the term itself.
local function add_qualifiers_and_refs_to_term(data, formatted)
local q = data.q
if type(q) == "string" then
q = { q }
end
local qq = data.qq
if type(qq) == "string" then
qq = { qq }
end
if q and q[1] or qq and qq[1] or data.a and data.a[1] or data.aa and data.aa[1] or data.l and data.l[1] or
data.ll and data.ll[1] or data.refs and data.refs[1] then
formatted = format_qualifiers {
lang = data.lang,
text = formatted,
q = q,
qq = qq,
a = data.a,
aa = data.aa,
l = data.l,
ll = data.ll,
refs = data.refs,
}
end
return formatted
end
--[==[
Creates a full link, with annotations (see `[[#format_link_annotations|format_link_annotations]]`), in the style of {{tl|l}} or {{tl|m}}.
The first argument, `data`, must be a table. It contains the various elements that can be supplied as parameters to {{tl|l}} or {{tl|m}}:
{ {
term = entry_to_link_to,
alt = link_text_or_displayed_text,
lang = language_object,
sc = script_object,
track_sc = boolean,
no_nonstandard_sc_cat = boolean,
fragment = link_fragment,
id = sense_id,
genders = { "gender1", "gender2", ... },
tr = transliteration,
respect_link_tr = boolean,
ts = transcription,
gloss = gloss,
pos = part_of_speech_tag,
ng = non-gloss text,
lit = literal_translation,
infl = { "form_of_grammar_tag1", "form_of_grammar_tag2", ... },
no_alt_ast = boolean,
accel = {accelerated_creation_tags},
interwiki = interwiki,
pretext = "text_at_beginning" or nil,
posttext = "text_at_end" or nil,
q = { "left_qualifier1", "left_qualifier2", ...} or "left_qualifier",
qq = { "right_qualifier1", "right_qualifier2", ...} or "right_qualifier",
l = { "left_label1", "left_label2", ...},
ll = { "right_label1", "right_label2", ...},
a = { "left_accent_qualifier1", "left_accent_qualifier2", ...},
aa = { "right_accent_qualifier1", "right_accent_qualifier2", ...},
refs = { "formatted_ref1", "formatted_ref2", ...} or { {text = "text", name = "name", group = "group"}, ... },
show_qualifiers = boolean,
} }
Any one of the items in the `data` table may be {nil}, but an error will be shown if neither `term` nor `alt` nor `tr`
is present. Thus, calling {full_link{ term = term, lang = lang, sc = sc }}, where `term` is the page to link to (which
may have diacritics that will be stripped and/or embedded bracketed links) and `lang` is a
[[Module:languages#Language objects|language object]] from [[Module:languages]], will give a plain link similar to the
one produced by the template {{tl|l}}, and calling {full_link( { term = term, lang = lang, sc = sc }, "term" )} will
give a link similar to the one produced by the template {{tl|m}}.
The function will:
* Try to determine the script, based on the characters found in the `term` or `alt` argument, if the script was not
given. If a script is given and `track_sc` is {true}, it will check whether the input script is the same as the one
which would have been automatically generated and add the category [[:Category:LANG terms with redundant script codes]]
if yes, or [[:Category:LANG terms with non-redundant manual script codes]] if no. This should be used when the input
script object is directly determined by a template's `sc` parameter.
* Call `[[#language_link|language_link]]` on the `term` or `alt` forms, to remove diacritics in the page name, process
any embedded wikilinks and create links to Reconstruction or Appendix pages when necessary.
* Call `[[Module:script utilities#tag_text]]` to add the appropriate language and script tags to the term and
italicize terms written in the Latin script if necessary. Accelerated creation tags, as used by [[WT:ACCEL]], are
included.
* Generate a transliteration, based on the `alt` or `term` arguments, if the script is not Latin, no transliteration was
provided in `tr` and the combination of the term's language and script support automatic transliteration. The
transliteration itself will be linked if both `.respect_link_tr` is specified and the language of the term has the
`link_tr` property set for the script of the term; but not otherwise.
* Add the annotations (transliteration, gender, gloss, etc.) after the link.
* If `no_alt_ast` is specified, then the `alt` text does not need to contain an asterisk if the language is
reconstructed. This should only be used by modules which really need to allow links to reconstructions that don't
display asterisks (e.g. number boxes).
* If `pretext` or `posttext` is specified, this is text to (respectively) prepend or append to the output, directly
before processing qualifiers, labels and references. This can be used to add arbitrary extra text inside of the
qualifiers, labels and references.
* If `show_qualifiers` is specified or the `show_qualifiers` argument is given, then left and right qualifiers, accent
qualifiers, labels and references will be displayed, otherwise they will be ignored. (This is because a fair amount of
code stores qualifiers, labels and/or references in these fields and displays them itself, rather than expecting
{full_link()} to display them.)]==]
function export.full_link(data, face, allow_self_link, show_qualifiers)
if type(data) ~= "table" then
error("The first argument to the function full_link must be a table. "
.. "See Module:links/documentation for more information.")
elseif data.term and data.term:find("\\", nil, true) or data.alt and data.alt:find("\\", nil, true) then
track("escaped", "full_link")
end
-- Prevent data from being destructively modified.
local data = shallow_copy(data)
-- FIXME: this shouldn't be added to `data`, as that means the input table needs to be cloned.
data.cats = {}
-- Categorize links to "und".
local lang, cats = data.lang, data.cats
if cats and lang:getCode() == "und" then
insert(cats, "Undetermined language links")
end
local terms = { true }
-- Generate multiple forms if applicable.
for _, param in ipairs { "term", "alt" } do
if type(data[param]) == "string" and data[param]:find("//", nil, true) then
data[param] = export.split_on_slashes(data[param])
elseif type(data[param]) == "string" and not (type(data.term) == "string" and data.term:find("//", nil, true)) then
if not data.no_generate_forms then
data[param] = lang:generateForms(data[param])
else
data[param] = { data[param] }
end
else
data[param] = {}
end
end
for _, param in ipairs { "sc", "tr", "ts" } do
data[param] = { data[param] }
end
for _, param in ipairs { "term", "alt", "sc", "tr", "ts" } do
for i in pairs(data[param]) do
terms[i] = true
end
end
-- Create the link
local output = {}
local id, no_alt_ast, srwc, accel, nevercalltr = data.id, data.no_alt_ast, data.suppress_redundant_wikilink_cat,
data.accel, data.never_call_transliteration_module
local link_tr = data.respect_link_tr and lang:link_tr(data.sc[1])
for i in ipairs(terms) do
local link
-- Is there any text to show?
if (data.term[i] or data.alt[i]) then
-- Try to detect the script if it was not provided
local display_term = data.alt[i] or data.term[i]
local best = lang:findBestScript(display_term)
-- no_nonstandard_sc_cat is intended for use in [[Module:interproject]]
if (
not data.no_nonstandard_sc_cat and
best:getCode() == "None" and
find_best_script_without_lang(display_term):getCode() ~= "None"
) then
insert(cats, lang:getFullName() .. " terms in nonstandard scripts")
end
if not data.sc[i] then
data.sc[i] = best
-- Track uses of sc parameter.
elseif data.track_sc then
if data.sc[i]:getCode() == best:getCode() then
insert(cats, lang:getFullName() .. " terms with redundant script codes")
else
insert(cats, lang:getFullName() .. " terms with non-redundant manual script codes")
end
end
-- If using a discouraged character sequence, add to maintenance category
if data.sc[i]:hasNormalizationFixes() == true then
if (data.term[i] and data.sc[i]:fixDiscouragedSequences(toNFC(data.term[i])) ~= toNFC(data.term[i])) or (data.alt[i] and data.sc[i]:fixDiscouragedSequences(toNFC(data.alt[i])) ~= toNFC(data.alt[i])) then
insert(cats, "Pages using discouraged character sequences")
end
end
link = simple_link(
data.term[i],
data.fragment,
data.alt[i],
lang,
data.sc[i],
id,
cats,
no_alt_ast,
srwc
)
end
-- simple_link can return nil, so check if a link has been generated.
if link then
-- Add "nowrap" class to prefixes in order to prevent wrapping after the hyphen
local nowrap
local display_term = data.alt[i] or data.term[i]
if display_term and (display_term:find("^%-") or display_term:find("^־")) then -- Hebrew maqqef -- FIXME, use hyphens from [[Module:affix]]
nowrap = "nowrap"
end
link = tag_text(link, lang, data.sc[i], face, get_class(lang, data.tr[i], accel, nowrap))
else
--[[ No term to show.
Is there at least a transliteration we can work from? ]]
link = request_script(lang, data.sc[i])
-- No link to show, and no transliteration either. Show a term request (unless it's a substrate, as they rarely take terms).
if (link == "" or (not data.tr[i]) or data.tr[i] == "-") and lang:getFamilyCode() ~= "qfa-sub" then
-- If there are multiple terms, break the loop instead.
if i > 1 then
remove(output)
break
elseif NAMESPACE ~= "Template" then
insert(cats, lang:getFullName() .. " term requests")
end
link = "<small>[Term?]</small>"
end
end
insert(output, link)
if i < #terms then insert(output, "<span class=\"Zsym mention\" style=\"font-size:100%;\"> / </span>") end
end
-- When suppress_tr is true, do not show or generate any transliteration
if data.suppress_tr then
data.tr[1] = nil
else
-- TODO: Currently only handles the first transliteration, pending consensus on how to handle multiple translits for multiple forms, as this is not always desirable (e.g. traditional/simplified Chinese).
if data.tr[1] == "" or data.tr[1] == "-" then
data.tr[1] = nil
else
local phonetic_extraction = load_data("Module:links/data").phonetic_extraction
phonetic_extraction = phonetic_extraction[lang:getCode()] or phonetic_extraction[lang:getFullCode()]
if phonetic_extraction then
data.tr[1] = data.tr[1] or
require(phonetic_extraction).getTranslit(export.remove_links(data.alt[1] or data.term[1]))
elseif (data.term[1] or data.alt[1]) and data.sc[1]:isTransliterated() then
-- Track whenever there is manual translit. The categories below like 'terms with redundant transliterations'
-- aren't sufficient because they only work with reference to automatic translit and won't operate at all in
-- languages without any automatic translit, like Persian and Hebrew.
if data.tr[1] then
local full_code = lang:getFullCode()
track("manual-tr", full_code)
end
if not nevercalltr then
-- Try to generate a transliteration.
local text = data.alt[1] or data.term[1]
if not link_tr then
text = export.remove_links(text, true)
end
local automated_tr = lang:transliterate(text, data.sc[1])
if automated_tr then
local manual_tr = data.tr[1]
if manual_tr then
if export.remove_links(manual_tr) == export.remove_links(automated_tr) then
insert(cats, lang:getFullName() .. " terms with redundant transliterations")
else
-- Prevents Arabic root categories from flooding the tracking categories.
if NAMESPACE ~= "Category" then
insert(cats,
lang:getFullName() .. " terms with non-redundant manual transliterations")
end
end
end
if not manual_tr or lang:overrideManualTranslit(data.sc[1]) then
data.tr[1] = automated_tr
end
end
end
end
end
end
-- Link to the transliteration entry for languages that require this
if data.tr[1] and link_tr and not data.tr[1]:match("%[%[(.-)%]%]") then
data.tr[1] = simple_link(
data.tr[1],
nil,
nil,
lang,
get_script("Latn"),
nil,
cats,
no_alt_ast,
srwc
)
elseif data.tr[1] and not link_tr then
-- Remove the pseudo-HTML tags added by remove_links.
data.tr[1] = data.tr[1]:gsub("</?link>", "")
end
if data.tr[1] and not umatch(data.tr[1], "[^%s%p]") then data.tr[1] = nil end
insert(output, export.format_link_annotations(data, face))
if data.pretext then
insert(output, 1, data.pretext)
end
if data.posttext then
insert(output, data.posttext)
end
local categories = cats[1] and format_categories(cats, lang, "-", nil, nil, data.sc) or ""
output = concat(output)
if show_qualifiers or data.show_qualifiers then
output = add_qualifiers_and_refs_to_term(data, output)
end
return output .. categories
end
--[==[Replaces all wikilinks with their displayed text, and removes any categories. This function can be invoked either from a template or from another module.
-- Strips links: deletes category links, the targets of piped links, and any double square brackets involved in links (other than file links, which are untouched). If `tag` is set, then any links removed will be given pseudo-HTML tags, which allow the substitution functions in [[Module:languages]] to properly subdivide the text in order to reduce the chance of substitution failures in modules which scrape pages like [[Module:zh-translit]].
-- FIXME: This is quite hacky. We probably want this to be integrated into [[Module:languages]], but we can't do that until we know that nothing is pushing pipe linked transliterations through it for languages which don't have link_tr set.
* <code><nowiki>[[page|displayed text]]</nowiki></code> → <code><nowiki>displayed text</nowiki></code>
* <code><nowiki>[[page and displayed text]]</nowiki></code> → <code><nowiki>page and displayed text</nowiki></code>
* <code><nowiki>[[Category:English lemmas|WORD]]</nowiki></code> → ''(nothing)'']==]
function export.remove_links(text, tag)
if type(text) == "table" then
text = text.args[1]
end
if not text or text == "" then
return ""
end
text = text
:gsub("%[%[", "\1")
:gsub("%]%]", "\2")
-- Parse internal links for the display text.
text = text:gsub("(\1)([^\1\2]-)(\2)",
function(c1, c2, c3)
-- Don't remove files.
for _, false_positive in ipairs({ "file", "image" }) do
if c2:lower():match("^" .. false_positive .. ":") then return c1 .. c2 .. c3 end
end
-- Remove categories completely.
for _, false_positive in ipairs({ "category", "cat" }) do
if c2:lower():match("^" .. false_positive .. ":") then return "" end
end
-- In piped links, remove all text before the pipe, unless it's the final character (i.e. the pipe trick), in which case just remove the pipe.
c2 = c2:match("^[^|]*|(.+)") or c2:match("([^|]+)|$") or c2
if tag then
return "<link>" .. c2 .. "</link>"
else
return c2
end
end)
text = text
:gsub("\1", "[[")
:gsub("\2", "]]")
return text
end
function export.section_link(link)
if type(link) ~= "string" then
error("The first argument to section_link was a " .. type(link) .. ", but it should be a string.")
elseif link:find("\\", nil, true) then
track("escaped", "section_link")
end
local target, section = get_fragment((link:gsub("_", " ")))
if not section then
error("No \"#\" delineating a section name")
end
return simple_link(
target,
section,
target .. " § " .. section
)
end
return export
go1a5j6fymqq8baizjbz87vusf7r536
Module:table/shallowCopy
828
5969
17405
2026-07-13T08:23:22Z
Hiyuune
6766
+
17405
Scribunto
text/plain
local next = next
local pairs = pairs
local type = type
--[==[
Returns a clone of an object. If the object is a table, the value returned is a new table, but all subtables and functions are shared. Metamethods are respected unless the `raw` flag is set, but the returned table will have no metatable of its own.]==]
return function(orig, raw)
if type(orig) ~= "table" then
return orig
end
local copy, iter, state, init = {}
if raw then
iter, state = next, orig
else
iter, state, init = pairs(orig)
end
for k, v in iter, state, init do
copy[k] = v
end
return copy
end
t51fcj6fuqkknha7dzzm33l4y4ohb22
Module:links/data
828
5970
17406
2026-07-13T08:24:04Z
Hiyuune
6766
+
17406
Scribunto
text/plain
local data = {}
local unpack = unpack or table.unpack -- Lua 5.2 compatibility
local u = require("Module:string utilities").char
data.phonetic_extraction = {
["th"] = "Module:th",
["km"] = "Module:km",
}
data.ignored_prefixes = {
["cat"] = true,
["category"] = true,
["file"] = true,
["image"] = true
}
-- Scheme for using unsupported characters in titles.
data.unsupported_characters = {
["#"] = "`num`",
["%"] = "`percnt`", -- only escaped in percent encoding
["&"] = "`amp`", -- only escaped in HTML entities
["."] = "`period`", -- only escaped in dot-slash notation
["<"] = "`lt`",
[">"] = "`gt`",
["["] = "`lsqb`",
["]"] = "`rsqb`",
["_"] = "`lowbar`",
["`"] = "`grave`", -- used to enclose unsupported characters in the scheme, so a raw use in an unsupported title must be escaped to prevent interference
["{"] = "`lcub`",
["|"] = "`vert`",
["}"] = "`rcub`",
["~"] = "`tilde`", -- only escaped when 3 or more are consecutive
["\239\191\189"] = "`repl`" -- replacement character U+FFFD, which can't be typed directly here due to an abuse filter
}
-- Manually specified unsupported titles. Only put titles here if there is a different reason why they are unsupported, and not just because they contain one of the unsupported characters above.
data.unsupported_titles = {
[" "] = "Space",
["&"] = "`amp`amp;",
["λοπαδοτεμαχοσελαχογαλεοκρανιολειψανοδριμυποτριμματοσιλφιοκαραβομελιτοκατακεχυμενοκιχλεπικοσσυφοφαττοπεριστεραλεκτρυονοπτοκεφαλλιοκιγκλοπελειολαγῳοσιραιοβαφητραγανοπτερύγων"] = "Ancient Greek dish",
["กรุงเทพมหานคร อมรรัตนโกสินทร์ มหินทรายุธยา มหาดิลกภพ นพรัตนราชธานีบูรีรมย์ อุดมราชนิเวศน์มหาสถาน อมรพิมานอวตารสถิต สักกะทัตติยวิษณุกรรมประสิทธิ์"] = "Thai name of Bangkok",
[u(0x1680)] = "Ogham space",
[u(0x3000)] = "Ideographic space"
}
-- Mammoth pages contain only Translingual and English entries, if present. The remaining L2s are placed on subpages.
-- The same subpage titles are used across all mammoth pages for the convenience of bot and script operators.
-- Assuming that most mammoth pages will be Latin-script terms, the subpage groupings are determined by dividing the
-- list of Latin-script languages known to Wiktionary into two (three, ...) roughly equal alphabetic divisions. This is
-- easily done by looking at Petscan's output:
-- https://petscan.wmcloud.org/?sortby=title&language=en&ns%5B14%5D=1&categories=Latin+script+languages&project=wiktionary&doit=
-- This data structure contains types of splits, each of which is a list of names of splits and Lua patterns applied to
-- the decomposed L2 name (with apostrophes and double quotes removed and certain other transformations applied; see
-- get_L2_sort_key() in [[Module:headword/page]]), or "true" for the final catch-all subpage (which includes anything
-- not beginning with a Latin letter after the transformations are applied; this includes e.g. ǃKung but not 'Are'are,
-- which sorts with A, and not Àhàn, which likewise sorts with A). The patterns must be suitable for use with plain
-- string functions, not their mw.ustring equivalents.
data.mammoth_page_subpage_types = {
twos = {
{"languages A to L", "^[A-L]"},
{"languages M to Z", true},
},
threes = {
{"languages A to I", "^[A-I]"},
{"languages J to Q", "^[J-Q]"},
{"languages R to Z", true},
},
CJK = {
{"languages A to C", "^[A-C]"}, -- Translingual and Chinese on one page
{"languages D to Z", true}, -- all the remainder (mostly Japanese, Korean, Vietnamese) on the other
},
}
-- "Mammoth pages" are pages whose entries cannot be housed on a single page because of MediaWiki limits. The key is
-- the page and the value is the subpage type, as defined above in `mammoth_page_subpage_types`.
data.mammoth_pages = {
["a"] = "twos", -- FIXME: change to threes
["mammoth page test"] = "twos", -- required for testing purposes - please leave here
}
return data
q02q3zllkyysivftvjq4h2gli665cgv
Module:languages/data/patterns
828
5971
17407
2026-07-13T08:24:46Z
Hiyuune
6766
+
17407
Scribunto
text/plain
-- Capture patterns used by [[Module:languages]] to prevent formatting from being disrupted while text is being processed.
-- Certain character sequences are substituted beforehand to make pattern matching more straightforward:
-- "\1" = "[["
-- "\2" = "]]"
return {
"((</?link>))\0", -- Special link formatting added by [[Module:links]]
"((<[^<>\1\2]+>))", -- HTML tag
"((\1[Ff][Ii][Ll][Ee]:[^\1\2]+\2))\0", -- File
"((\1[Ii][Mm][Aa][Gg][Ee]:[^\1\2]+\2))\0", -- Image
"((\1[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]:[^\1\2]+\2))\0", -- Category
"((\1[Cc][Aa][Tt]:[^\1\2]+\2))\0", -- Category
"((\1)[^\1\2|]+(\2))\0", -- Bare internal link
"((\1)[^\1\2|]-(|)[^\1\2]-(\2))\0", -- Piped internal link
"((%[https?://[^[%] ]+)[^[%]]*(%]))\0", -- External link
"((\127'\"`UNIQ%-%-%l+%-%x+%-+QINU`\"'\127))", -- Strip marker
"('*(''').-'*('''))", -- Bold
"('*('').-'*(''))" -- Italics
}
0asj561c1s2otij1k07cuhwmbvhewr9
Module:string/encode entities
828
5972
17408
2026-07-13T08:25:18Z
Hiyuune
6766
+
17408
Scribunto
text/plain
-- TO BE REPLACED BY encode_entities in [[Module:string utilities]]. This function decodes on input by default to prevent double-encoding, which the new function does not, so implementations need to take this into account when being converted.
local debug_track_module = "Module:debug/track"
local string_decode_entities_module = "Module:string/decodeEntities"
local string_utilities_module = "Module:string utilities"
local require = require
local function decode_entities(...)
decode_entities = require(string_decode_entities_module)
return decode_entities(...)
end
local function encode_entities(...)
encode_entities = require(string_utilities_module).encode_entities
return encode_entities(...)
end
local function track(...)
track = require(debug_track_module)
return track(...)
end
return function(str, charset, raw)
if not raw then
local decoded = decode_entities(str)
if decoded ~= str then
track("string/encode entities/decoded first")
end
str = decoded
end
return encode_entities(str, charset, nil, true)
end
bvh4hqobw96dy8gcuv3yoq2nlvj06si
Module:string/decodeEntities
828
5973
17409
2026-07-13T08:25:40Z
Hiyuune
6766
+
17409
Scribunto
text/plain
local load_module = "Module:load"
local string_char_module = "Module:string/char"
local find = string.find
local gsub = string.gsub
local match = string.match
local require = require
local tonumber = tonumber
local function u(...)
u = require(string_char_module)
return u(...)
end
local entities
local function get_entities()
entities, get_entities = require(load_module).load_data("Module:data/entities"), nil
return entities
end
local function decode_entity(hash, x, code)
-- "#" isn't included in "[%w\128-\255]", so if no "#" is found then it's a
-- a named entity or a false match.
if hash == "" then
return (entities or get_entities())[x .. code]
end
-- Exclude numbers that don't fit the expected format.
local cp
if x == "" then
cp = match(code, "^()%d+$") and tonumber(code)
else
cp = match(code, "^()%x+$") and tonumber(code, 16)
end
-- Exclude surrogates (U+D800 to U+DFFF) and codepoints that are too high.
return cp and (
cp <= 0xD7FF or
cp >= 0xE000 and cp <= 0x10FFFF
) and u(cp) or nil
end
return function(str)
-- As an optimisation, only do a full search with gsub() if plain searches
-- for "&" and ";" find anything.
local amp = find(str, "&", nil, true)
-- Search for ";" after the point "&" was found.
return amp and find(str, ";", amp + 1, true) and
-- Non-ASCII characters aren't valid in proper HTML named entities, but
-- MediaWiki uses them in some nonstandard aliases (which have also been
-- included in [[Module:data/entities]]), so include them anyway.
gsub(str, "&(#?)([xX]?)([%w\128-\255]+);", decode_entity) or
str
end
1ehplvn1q6ksitguquhvf1khnaq3mxd
Module:string/charsetEscape
828
5974
17411
2026-07-13T08:27:02Z
Hiyuune
6766
Created page with "local gsub = string.gsub local chars local function get_chars() chars, get_chars = { ["\000"] = "%z", ["%"] = "%%", ["-"] = "%-", ["]"] = "%]", ["^"] = "%^", }, nil return chars end --[==[Escapes the magic characters used in pattern character sets: {%-]^}, and converts the null character to {%z}.]==] return function(str) return (gsub(str, "[%z%%%-%]^]", chars or get_chars())) end"
17411
Scribunto
text/plain
local gsub = string.gsub
local chars
local function get_chars()
chars, get_chars = {
["\000"] = "%z", ["%"] = "%%", ["-"] = "%-", ["]"] = "%]", ["^"] = "%^",
}, nil
return chars
end
--[==[Escapes the magic characters used in pattern character sets: {%-]^}, and converts the null character to {%z}.]==]
return function(str)
return (gsub(str, "[%z%%%-%]^]", chars or get_chars()))
end
jrbz2u5ynegbco1b6oqpnqiz7xje0en
Module:script utilities
828
5975
17412
2026-07-13T08:27:54Z
Hiyuune
6766
+
17412
Scribunto
text/plain
local export = {}
local anchors_module = "Module:anchors"
local debug_track_module = "Module:debug/track"
local links_module = "Module:links"
local munge_text_module = "Module:munge text"
local parameters_module = "Module:parameters"
local scripts_module = "Module:scripts"
local string_utilities_module = "Module:string utilities"
local utilities_module = "Module:utilities"
local concat = table.concat
local insert = table.insert
local require = require
local toNFD = mw.ustring.toNFD
local dump = mw.dumpObject
--[==[
Loaders for functions in other modules, which overwrite themselves with the target function when called. This ensures modules are only loaded when needed, retains the speed/convenience of locally-declared pre-loaded functions, and has no overhead after the first call, since the target functions are called directly in any subsequent calls.]==]
local function embedded_language_links(...)
embedded_language_links = require(links_module).embedded_language_links
return embedded_language_links(...)
end
local function find_best_script_without_lang(...)
find_best_script_without_lang = require(scripts_module).findBestScriptWithoutLang
return find_best_script_without_lang(...)
end
local function format_categories(...)
format_categories = require(utilities_module).format_categories
return format_categories(...)
end
local function get_script(...)
get_script = require(scripts_module).getByCode
return get_script(...)
end
local function language_anchor(...)
language_anchor = require(anchors_module).language_anchor
return language_anchor(...)
end
local function munge_text(...)
munge_text = require(munge_text_module)
return munge_text(...)
end
local function process_params(...)
process_params = require(parameters_module).process
return process_params(...)
end
local function track(...)
track = require(debug_track_module)
return track(...)
end
local function u(...)
u = require(string_utilities_module).char
return u(...)
end
local function ugsub(...)
ugsub = require(string_utilities_module).gsub
return ugsub(...)
end
local function umatch(...)
umatch = require(string_utilities_module).match
return umatch(...)
end
--[==[
Loaders for objects, which load data (or some other object) into some variable, which can then be accessed as "foo or get_foo()", where the function get_foo sets the object to "foo" and then returns it. This ensures they are only loaded when needed, and avoids the need to check for the existence of the object each time, since once "foo" has been set, "get_foo" will not be called again.]==]
local m_data
local function get_data()
m_data, get_data = mw.loadData("Module:script utilities/data"), nil
return m_data
end
--[=[
Modules used:
[[Module:script utilities/data]]
[[Module:scripts]]
[[Module:anchors]] (only when IDs present)
[[Module:string utilities]] (only when hyphens in Korean text or spaces in vertical text)
[[Module:languages]]
[[Module:parameters]]
[[Module:utilities]]
[[Module:debug/track]]
]=]
function export.is_Latin_script(sc)
-- Latn, Latf, Latg, pjt-Latn
return sc:getCode():find("Lat") and true or false
end
--[==[{{temp|#invoke:script utilities|lang_t}}
This is used by {{temp|lang}} to wrap portions of text in a language tag. See there for more information.]==]
do
local function get_args(frame)
return process_params(frame:getParent().args, {
[1] = {required = true, type = "language", default = "und"},
[2] = {required = true, allow_empty = true, default = ""},
["sc"] = {type = "script"},
["face"] = true,
["class"] = true,
})
end
function export.lang_t(frame)
local args = get_args(frame)
local lang = args[1]
local sc = args["sc"]
local text = args[2]
local cats = {}
if sc then
-- Track uses of sc parameter.
if sc:getCode() == lang:findBestScript(text):getCode() then
insert(cats, lang:getFullName() .. " terms with redundant script codes")
else
insert(cats, lang:getFullName() .. " terms with non-redundant manual script codes")
end
else
sc = lang:findBestScript(text)
end
text = embedded_language_links{
term = text,
lang = lang,
sc = sc
}
cats = #cats > 0 and format_categories(cats, lang, "-", nil, nil, sc) or ""
local face = args["face"]
local class = args["class"]
return export.tag_text(text, lang, sc, face, class) .. cats
end
end
-- Ustring turns on the codepoint-aware string matching. The basic string function
-- should be used for simple sequences of characters, Ustring function for
-- sets – [].
local function trackPattern(text, pattern, tracking)
if pattern and umatch(text, pattern) then
track("script/" .. tracking)
end
end
local function track_text(text, lang, sc)
if lang and text then
local langCode = lang:getFullCode()
-- [[Special:WhatLinksHere/Wiktionary:Tracking/script/ang/acute]]
if langCode == "ang" then
local decomposed = toNFD(text)
local acute = u(0x301)
trackPattern(decomposed, acute, "ang/acute")
--[=[
[[Special:WhatLinksHere/Wiktionary:Tracking/script/Greek/wrong-phi]]
[[Special:WhatLinksHere/Wiktionary:Tracking/script/Greek/wrong-theta]]
[[Special:WhatLinksHere/Wiktionary:Tracking/script/Greek/wrong-kappa]]
[[Special:WhatLinksHere/Wiktionary:Tracking/script/Greek/wrong-rho]]
ϑ, ϰ, ϱ, ϕ should generally be replaced with θ, κ, ρ, φ.
]=]
elseif langCode == "el" or langCode == "grc" then
trackPattern(text, "ϑ", "Greek/wrong-theta")
trackPattern(text, "ϰ", "Greek/wrong-kappa")
trackPattern(text, "ϱ", "Greek/wrong-rho")
trackPattern(text, "ϕ", "Greek/wrong-phi")
--[=[
[[Special:WhatLinksHere/Wiktionary:Tracking/script/Ancient Greek/spacing-coronis]]
[[Special:WhatLinksHere/Wiktionary:Tracking/script/Ancient Greek/spacing-smooth-breathing]]
[[Special:WhatLinksHere/Wiktionary:Tracking/script/Ancient Greek/wrong-apostrophe]]
When spacing coronis and spacing smooth breathing are used as apostrophes,
they should be replaced with right single quotation marks (’).
]=]
if langCode == "grc" then
trackPattern(text, u(0x1FBD), "Ancient Greek/spacing-coronis")
trackPattern(text, u(0x1FBF), "Ancient Greek/spacing-smooth-breathing")
trackPattern(text, "[" .. u(0x1FBD) .. u(0x1FBF) .. "]", "Ancient Greek/wrong-apostrophe", true)
end
-- [[Special:WhatLinksHere/Wiktionary:Tracking/script/Russian/grave-accent]]
elseif langCode == "ru" then
local decomposed = toNFD(text)
trackPattern(decomposed, u(0x300), "Russian/grave-accent")
-- [[Special:WhatLinksHere/Wiktionary:Tracking/script/Chuvash/latin-homoglyph]]
elseif langCode == "cv" then
trackPattern(text, "[ĂăĔĕÇçŸÿ]", "Chuvash/latin-homoglyph")
-- [[Special:WhatLinksHere/Wiktionary:Tracking/script/Tibetan/trailing-punctuation]]
elseif langCode == "bo" then
trackPattern(text, "[་།]$", "Tibetan/trailing-punctuation")
trackPattern(text, "[་།]%]%]$", "Tibetan/trailing-punctuation")
--[=[
[[Special:WhatLinksHere/Wiktionary:Tracking/script/Thai/broken-ae]]
[[Special:WhatLinksHere/Wiktionary:Tracking/script/Thai/broken-am]]
[[Special:WhatLinksHere/Wiktionary:Tracking/script/Thai/wrong-rue-lue]]
]=]
elseif langCode == "th" then
trackPattern(text, "เ".."เ", "Thai/broken-ae")
trackPattern(text, "ํ[่้๊๋]?า", "Thai/broken-am")
trackPattern(text, "[ฤฦ]า", "Thai/wrong-rue-lue")
--[=[
[[Special:WhatLinksHere/Wiktionary:Tracking/script/Lao/broken-ae]]
[[Special:WhatLinksHere/Wiktionary:Tracking/script/Lao/broken-am]]
[[Special:WhatLinksHere/Wiktionary:Tracking/script/Lao/possible-broken-ho-no]]
[[Special:WhatLinksHere/Wiktionary:Tracking/script/Lao/possible-broken-ho-mo]]
[[Special:WhatLinksHere/Wiktionary:Tracking/script/Lao/possible-broken-ho-lo]]
]=]
elseif langCode == "lo" then
trackPattern(text, "ເ".."ເ", "Lao/broken-ae")
trackPattern(text, "ໍ[່້໊໋]?າ", "Lao/broken-am")
trackPattern(text, "ຫນ", "Lao/possible-broken-ho-no")
trackPattern(text, "ຫມ", "Lao/possible-broken-ho-mo")
trackPattern(text, "ຫລ", "Lao/possible-broken-ho-lo")
--[=[
[[Special:WhatLinksHere/Wiktionary:Tracking/script/Lü/broken-ae]]
[[Special:WhatLinksHere/Wiktionary:Tracking/script/Lü/possible-wrong-sequence]]
]=]
elseif langCode == "khb" then
trackPattern(text, "ᦵ".."ᦵ", "Lü/broken-ae")
trackPattern(text, "[ᦀ-ᦫ][ᦵᦶᦷᦺ]", "Lü/possible-wrong-sequence")
end
end
end
local function Kore_ruby(...)
-- Cache character sets on the first call.
local Hang_chars = get_script("Hang"):getCharacters()
local Hani_chars = get_script("Hani"):getCharacters()
-- Overwrite with the actual function, which is called directly on subsequent calls.
function Kore_ruby(txt)
return (ugsub(txt, "([%-".. Hani_chars .. "]+)%(([%-" .. Hang_chars .. "]+)%)", "<ruby>%1<rp>(</rp><rt>%2</rt><rp>)</rp></ruby>"))
end
return Kore_ruby(...)
end
--[==[Wraps the given text in HTML tags with appropriate CSS classes (see [[WT:CSS]]) for the [[Module:languages#Language objects|language]] and script. This is required for all non-English text on Wiktionary.
The actual tags and CSS classes that are added are determined by the <code>face</code> parameter. It can be one of the following:
; {{code|lua|"term"}}
: The text is wrapped in {{code|html|2=<i class="(sc) mention" lang="(lang)">...</i>}}.
; {{code|lua|"head"}}
: The text is wrapped in {{code|html|2=<strong class="(sc) headword" lang="(lang)">...</strong>}}.
; {{code|lua|"hypothetical"}}
: The text is wrapped in {{code|html|2=<span class="hypothetical-star">*</span><i class="(sc) hypothetical" lang="(lang)">...</i>}}.
; {{code|lua|"bold"}}
: The text is wrapped in {{code|html|2=<b class="(sc)" lang="(lang)">...</b>}}.
; {{code|lua|nil}}
: The text is wrapped in {{code|html|2=<span class="(sc)" lang="(lang)">...</span>}}.
The optional <code>class</code> parameter can be used to specify an additional CSS class to be added to the tag.]==]
function export.tag_text(text, lang, sc, face, class, id)
if not sc then
if lang then
sc = lang:findBestScript(text)
else
sc = find_best_script_without_lang(text)
end
end
track_text(text, lang, sc)
-- Replace space characters with newlines in Mongolian-script text, which is written top-to-bottom.
if sc:getDirection():find("vertical", nil, true) and text:find(" ", nil, true) then
text = munge_text(text, function(txt)
-- having extra parentheses makes sure only the first return value gets through
return (txt:gsub(" +", "<br>"))
end)
end
-- Hack Korean script text to remove hyphens.
-- FIXME: This should be handled in a more general fashion, but needs to
-- be efficient by not doing anything if no hyphens are present, and currently this is the only
-- language needing such processing.
-- 20220221: Also convert 漢字(한자) to ruby, instead of needing [[Template:Ruby]].
if sc:getCode() == "Kore" and text:match("[%-()g]") then
local title, display = require("Module:links").get_wikilink_parts(text, true)
if title ~= nil then -- special case that the text is a single link, do not munge and preserve affix hyphens
if lang and lang:getCode() == "okm" then -- Middle Korean code from [[User:Chom.kwoy]]
-- Comment from [[User:Lunabunn]]:
-- In Middle Korean orthography, syllable formation is phonemic as opposed to morpheme-boundary-based a la
-- modern Korean. As such, for example, if you were to write nam-i, it would be rendered as na.mi so if you
-- then put na-mi to indicate particle boundaries as in modern Korean, the hyphen would be misplaced.
-- Previously, this was alleviated by specialcasing na--mi but [[User:Theknightwho]] made that resolve to -
-- in the Hangul (previously we used to just delete all -s in Hangul processing), so it broke.
-- [[User:Chom.kwoy]] implemented a different solution, which is writing -> instead using however many >s to
-- shift the hyphen by that number of letters in the romanization.
-- By the time we are called, > signs have been converted to > by a call to encode_entities() in
-- make_link() in [[Module:links]] (near the bottom of the function).
-- 'g' in Middle Korean is a special sign to treat the following ㅇ sign as /G/ instead of null.
display = display:gsub(">", ""):gsub("g", "")
end
if display:find("<") then
display = munge_text(display, function(txt)
txt = txt:gsub("(.)%-(%-?)(.)", "%1%2%3")
return Kore_ruby(txt)
end)
else
display = display:gsub("(.)%-(%-?)(.)", "%1%2%3")
display = Kore_ruby(display)
end
text = "[[" .. title .. "|" .. display .. "]]"
else
text = munge_text(text, function(txt)
if lang and lang:getCode() == "okm" then
txt = txt:gsub(">", ""):gsub("g", "")
end
if txt == text then -- special case for the entire text being plain
txt = txt:gsub("(.)%-(%-?)(.)", "%1%2%3")
else
txt = txt:gsub("%-(%-?)", "%1")
end
return Kore_ruby(txt)
end)
end
end
if sc:getCode() == "Image" then
face = nil
end
if face == "hypothetical" then
-- [[Special:WhatLinksHere/Wiktionary:Tracking/script-utilities/face/hypothetical]]
track("script-utilities/face/hypothetical")
end
local data = (m_data or get_data()).faces[face or "plain"]
if data == nil then
error('Invalid script face "' .. face .. '".')
end
local tag = data.tag
local opening_tag = {tag}
if lang and id then
insert(opening_tag, 'id="' .. language_anchor(lang, id) .. '"')
end
local classes = {data.class}
-- if the script code is hyphenated (i.e. language code-script code, add the last component as a class as well)
-- e.g. ota-Arab adds both Arab and ota-Arab as classes
if sc:getCode():find("-", nil, true) then
insert(classes, 1, (ugsub(sc:getCode(), ".+%-", "")))
insert(classes, 2, sc:getCode())
else
insert(classes, 1, sc:getCode())
end
if class and class ~= '' then
insert(classes, class)
end
insert(opening_tag, 'class="' .. concat(classes, ' ') .. '"')
-- FIXME: Is it OK to insert the etymology-only lang code and have it fall back to the first part of the
-- lang code (by chopping off the '-...' part)? It seems the :lang() selector does this; not sure about
-- [lang=...] attributes.
if lang then
insert(opening_tag, 'lang="' .. lang:getFullCode() .. '"')
end
-- Add a script wrapper
return (data.prefix or "") .. "<" .. concat(opening_tag, " ") .. ">" .. text .. "</" .. tag .. ">"
end
--[==[Tags the transliteration for given text {translit} and language {lang}. It will add the language, script subtag (as defined in [https://www.rfc-editor.org/rfc/bcp/bcp47.txt BCP 47 2.2.3]) and [https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/dir dir] (directional) attributes as needed.
The optional <code>kind</code> parameter can be one of the following:
; {{code|lua|"term"}}
: tag transliteration for {{temp|mention}}
; {{code|lua|"usex"}}
: tag transliteration for {{temp|usex}}
; {{code|lua|"head"}}
: tag transliteration for {{temp|head}}
; {{code|lua|"default"}}
: default
The optional <code>attributes</code> parameter is used to specify additional HTML attributes for the tag.]==]
function export.tag_translit(translit, lang, kind, attributes, is_manual)
if type(lang) == "table" then
-- FIXME: Do better support for etym languages; see https://www.rfc-editor.org/rfc/bcp/bcp47.txt
lang = lang.getFullCode and lang:getFullCode()
or error("Second argument to tag_translit should be a language code or language object.")
end
local data = (m_data or get_data()).translit[kind or "default"]
local tag = data.tag
local opening_tag = {tag}
local class = data.class
if lang == "ja" then
insert(opening_tag, 'class="' .. (class and (class .. " ") or "") .. (is_manual and "manual-tr " or "") .. 'tr"')
else
insert(opening_tag, 'lang="' .. lang .. '-Latn"')
insert(opening_tag, 'class="' .. (class and (class .. " ") or "") .. (is_manual and "manual-tr " or "") .. 'tr Latn"')
end
local dir = data.dir
if dir then
insert(opening_tag, 'dir="' .. dir .. '"')
end
if attributes then
track("tag_translit/attributes")
insert(opening_tag, attributes)
end
return "<" .. concat(opening_tag, " ") .. ">" .. translit .. "</" .. tag .. ">"
end
function export.tag_transcription(transcription, lang, kind, attributes)
if type(lang) == "table" then
-- FIXME: Do better support for etym languages; see https://www.rfc-editor.org/rfc/bcp/bcp47.txt
lang = lang.getFullCode and lang:getFullCode()
or error("Second argument to tag_transcription should be a language code or language object.")
end
local data = (m_data or get_data()).transcription[kind or "default"]
local tag = data.tag
local opening_tag = {tag}
local class = data.class
if lang == "ja" then
insert(opening_tag, 'class="' .. (class and (class .. " ") or "") .. 'ts"')
else
insert(opening_tag, 'lang="' .. lang .. '-Latn"')
insert(opening_tag, 'class="' .. (class and (class .. " ") or "") .. 'ts Latn"')
end
local dir = data.dir
if dir then
insert(opening_tag, 'dir="' .. dir .. '"')
end
if attributes then
track("tag_transcription/attributes")
insert(opening_tag, attributes)
end
return "<" .. concat(opening_tag, " ") .. ">" .. transcription .. "</" .. tag .. ">"
end
--[==[Tags {def} as a definition.
The <code>def</code> parameter must be one of the following:
; {{code|lua|"gloss"}}
: The text is wrapped in {{code|html|2=<span class="(mention-gloss">...</span>}}.
; {{code|lua|"non-gloss"}}
: The text is wrapped in {{code|html|2=<span class="use-with-mention">...</span>}}.
The optional <code>attributes</code> parameter is used to specify additional HTML attributes for the tag.]==]
function export.tag_definition(def, kind, attributes)
local data = (m_data or get_data()).definition[kind]
if data == nil then
error("Second argument to tag_definition should specify the kind of definition from the list in [[Module:script utilities/data]].")
end
local tag = data.tag
local opening_tag = {tag}
local class = data.class
if class then
insert(opening_tag, 'class="' .. class .. '"')
end
if attributes then
insert(opening_tag, attributes)
end
return "<" .. concat(opening_tag, " ") .. ">" .. def .. "</" .. tag .. ">"
end
--[==[Generates a request to provide a term in its native script, if it is missing. This is used by the {{temp|rfscript}} template as well as by the functions in [[Module:links]].
The function will add entries to one of the subcategories of [[:Category:Requests for native script by language]], and do several checks on the given language and script. In particular:
* If the script was given, a subcategory named "Requests for (script) script" is added, but only if the language has more than one script. Otherwise, the main "Requests for native script" category is used.
* Nothing is added at all if the language has no scripts other than Latin and its varieties.]==]
function export.request_script(lang, sc, usex, nocat, sort_key)
local scripts = lang.getScripts and lang:getScripts() or error('The language "' .. lang:getCode() .. '" does not have the method getScripts. It may be unwritten.')
-- By default, request for "native" script
local cat_script = "native"
local disp_script = "script"
-- If the script was not specified, and the language has only one script, use that.
if not sc and #scripts == 1 then
sc = scripts[1]
end
-- Is the script known?
if sc and sc:getCode() ~= "None" then
-- If the script is Latin, return nothing.
if export.is_Latin_script(sc) then
return ""
end
if (not scripts[1]) or sc:getCode() ~= scripts[1]:getCode() then
disp_script = sc:getCanonicalName()
end
-- The category needs to be specific to script only if there is chance of ambiguity. This occurs when when the language has multiple scripts (or with codes such as "und").
if (not scripts[1]) or scripts[2] then
cat_script = sc:getCanonicalName()
end
else
-- The script is not known.
-- Does the language have at least one non-Latin script in its list?
local has_nonlatin = false
for _, val in ipairs(scripts) do
if not export.is_Latin_script(val) then
has_nonlatin = true
break
end
end
-- If there are no non-Latin scripts, return nothing.
if not has_nonlatin and lang:getCode() ~= "und" then
return ""
end
end
-- Etymology languages have their own categories, whose parents are the regular language.
return "<small>[" .. disp_script .. " needed]</small>" .. (nocat and "" or
format_categories("Requests for " .. cat_script .. " script " ..
(usex and "in" or "for") .. " " .. lang:getCanonicalName() .. " " ..
(usex == "quote" and "quotations" or usex and "usage examples" or "terms"),
lang, sort_key
)
)
end
--[==[This is used by {{temp|rfscript}}. See there for more information.]==]
function export.template_rfscript(frame)
local boolean = {type = "boolean"}
local args = process_params(frame:getParent().args, {
[1] = {required = true, type = "language", default = "und"},
["sc"] = {type = "script"},
["usex"] = boolean,
["quote"] = boolean,
["nocat"] = boolean,
["sort"] = true,
})
local ret = export.request_script(args[1], args["sc"], args.quote and "quote" or args.usex, args.nocat, args.sort)
if ret == "" then
error("This language is written in the Latin alphabet. It does not need a native script.")
end
return ret
end
function export.checkScript(text, scriptCode, result)
local scriptObject = get_script(scriptCode)
if not scriptObject then
error('The script code "' .. scriptCode .. '" is not recognized.')
end
local originalText = text
-- Remove non-letter characters.
text = ugsub(text, "%A+", "")
-- Remove all characters of the script in question.
text = ugsub(text, "[" .. scriptObject:getCharacters() .. "]+", "")
if text ~= "" then
if type(result) == "string" then
error(result)
else
error('The text "' .. originalText .. '" contains the letters "' .. text .. '" that do not belong to the ' .. scriptObject:getDisplayForm() .. '.', 2)
end
end
end
return export
7960wdva9og3gbbozo010obcpp5re6e
Module:anchors
828
5976
17413
2026-07-13T08:28:17Z
Hiyuune
6766
+
17413
Scribunto
text/plain
local export = {}
local string_utilities_module = "Module:string utilities"
local anchor_encode = mw.uri.anchorEncode
local concat = table.concat
local insert = table.insert
local language_anchor -- Defined below.
local function decode_entities(...)
decode_entities = require(string_utilities_module).decode_entities
return decode_entities(...)
end
local function encode_entities(...)
encode_entities = require(string_utilities_module).encode_entities
return encode_entities(...)
end
-- Returns the anchor text to be used as the fragment of a link to a language section.
function export.language_anchor(lang, id)
return anchor_encode(lang:getFullName() .. ": " .. id)
end
language_anchor = export.language_anchor
-- Normalizes input text (removes formatting etc.), which can then be used as an anchor in an `id=` field.
function export.normalize_anchor(str)
return decode_entities(anchor_encode(str))
end
function export.make_anchors(ids)
local anchors = {}
for i = 1, #ids do
local id = ids[i]
local el = mw.html.create("span")
:addClass("template-anchor")
:attr("id", anchor_encode(id))
:attr("data-id", id)
insert(anchors, tostring(el))
end
return concat(anchors)
end
function export.senseid(lang, id, tag_name)
-- The following tag is opened but never closed, where is it supposed to be closed?
-- with <li> it doesn't matter, as it is closed automatically.
-- with <p> it is a problem
-- Cannot use mw.html here as it always closes tags
return "<" .. tag_name .. " class=\"senseid\" id=\"" .. language_anchor(lang, id) .. "\" data-lang=\"" .. lang:getCode() .. "\" data-id=\"" .. encode_entities(id) .. "\">"
end
function export.etymid(lang, id)
-- Use a <ul> tag to ensure spacing doesn't get messed up.
local el = mw.html.create("ul")
:addClass("etymid")
:attr("id", language_anchor(lang, id))
:attr("data-lang", lang:getCode())
:attr("data-id", id)
return tostring(el)
end
function export.etymonid(lang, id, opts)
opts = opts or {}
-- Use a <ul> tag to ensure spacing doesn't get messed up.
local el = mw.html.create("ul")
:addClass("etymonid")
:attr("data-lang", lang:getCode())
if id then
el:attr("id", language_anchor(lang, id))
el:attr("data-id", id)
end
if opts.no_tree then
el:attr("data-no-tree", "1")
end
if opts.title then
el:attr("data-title", opts.title)
end
if opts.empty_tree then
el:attr("data-empty-tree", "1")
end
if opts.ety_tree_json then
el:attr("data-ety-tree-json", opts.ety_tree_json)
end
return tostring(el)
end
return export
2o0jqln8y0bxvpfhe66eogs2k88qkap
Module:script utilities/data
828
5977
17414
2026-07-13T08:28:58Z
Hiyuune
6766
+
17414
Scribunto
text/plain
local data = {}
local translit = {
["term"] = {
--[=[ can't be done until Kana transliterations are correctly parsed by [[Module:links]]
["tag"] = "i",
]=]
["class"] = "mention-tr",
},
["usex"] = {
["tag"] = "i",
["class"] = "e-transliteration",
},
["head"] = {
["class"] = "headword-tr",
["dir"] = "ltr",
},
["default"] = {},
}
for _, v in next, translit do
if not v.tag then
v.tag = "span"
end
end
data.translit = translit
data.transcription = {
["head"] = {
["tag"] = "span",
["class"] = "headword-ts",
["dir"] = "ltr",
},
["usex"] = {
["tag"] = "span",
["class"] = "e-transcription",
},
["default"] = {},
}
data.definition = {
["gloss"] = {
["tag"] = "span",
["class"] = "mention-gloss",
},
["non-gloss"] = {
["tag"] = "span",
["class"] = "use-with-mention",
},
}
local faces = {
["term"] = {
["tag"] = "i",
["class"] = "mention",
},
["head"] = {
["tag"] = "strong",
["class"] = "headword",
},
["hypothetical"] = {
["prefix"] = '<span class="hypothetical-star">*</span>',
["tag"] = "i",
["class"] = "hypothetical",
},
["bold"] = {
["tag"] = "b",
},
["plain"] = {
["tag"] = "span",
}
}
faces["translation"] = faces["plain"]
data.faces = faces
return data
glatf44lq0ipqkut0sozbs72zba142n
Module:languages/data/2/extra
828
5978
17415
2026-07-13T08:29:56Z
Hiyuune
6766
+
17415
Scribunto
text/plain
local m = {}
m["aa"] = {
aliases = {"Qafar"},
}
m["ab"] = {
aliases = {"Abkhazian", "Abxazo"},
}
m["ae"] = {
aliases = {"Zend", "Old Bactrian"},
}
m["af"] = {
}
m["ak"] = {
varieties = {"Twi-Fante", "Twi", {"Fante", "Fanti"}, "Asante", "Akuapem", "Abron", "Brong", "Wasa"},
}
m["am"] = {
}
m["an"] = {
}
m["ar"] = {
-- FIXME, some of the following are varieties but it's not clear which ones
aliases = {"Standard Arabic", "Literary Arabic", "High Arabic"},
varieties = {"Modern Standard Arabic", "Classical Arabic", "Judeo-Arabic"},
}
m["as"] = {
aliases = {"Asamiya"},
}
m["av"] = {
aliases = {"Avaric"},
}
m["ay"] = {
varieties = {"Southern Aymara", "Central Aymara"},
}
m["az"] = {
aliases = {"Azeri", "Azari", "Azeri Turkic", "Azerbaijani Turkic"},
varieties = {"North Azerbaijani", "South Azerbaijani",
{"Afshar", "Afshari", "Afshar Azerbaijani", "Afchar"},
{"Qashqa'i", "Qashqai", "Kashkay"},
"Sonqor"
},
}
m["ba"] = {
}
m["be"] = {
aliases = {"Belorussian", "Belarusan", "Bielorussian", "Byelorussian", "Belarussian", "White Russian"},
}
m["bg"] = {
}
m["bh"] = {
}
m["bi"] = {
}
m["bm"] = {
aliases = {"Bamanankan"},
}
m["bn"] = {
aliases = {"Bangla"},
}
m["bo"] = {
varieties = {
{"Amdo Tibetan", "Amdo"},
"Dolpo",
{"Khams", "Khams Tibetan"}, "Khamba",
"Gola",
"Humla",
"Limi", {"Lhasa", "Lhasa Tibetan"}, "Lhomi", "Loke", "Lowa",
"Mugom", "Mugu", "Mustang",
"Nubri",
"Panang",
"Shing Saapa",
"Thudam", "Tichurong", "Tseku",
{"Ü", "Dbus"},
"Walungge"}, -- and "Gyalsumdo", "Lower Manang"? "Kyirong"?
}
m["br"] = {
varieties = {{"Gwenedeg", "Vannetais"}, {"Kerneveg", "Cornouaillais"}, {"Leoneg", "Léonard"}, {"Tregerieg", "Trégorrois"}},
}
m["ca"] = {
-- don't list varieties here that are in [[Module:etymology languages/data]]
}
m["ce"] = {
}
m["ch"] = {
aliases = {"Chamoru"},
}
m["co"] = {
aliases = {"Corsu"},
}
m["cr"] = {
}
m["cs"] = {
}
m["cu"] = {
aliases = {"Old Church Slavic"},
}
m["cv"] = {
}
m["cy"] = {
varieties = {"Cofi Welsh", {"Dyfedeg", "Dyfed Welsh", "Demetian"}, {"Gwenhwyseg", "Gwent Welsh", "Gwentian"}, {"Gwyndodeg", "Gwynedd Welsh", "Venedotian"}, {"Powyseg", "Powys Welsh", "Powysian"}, "Patagonian Welsh"},
}
m["da"] = {
}
m["de"] = {
aliases = {"High German", "New High German", "Deutsch"},
varieties = {"Alsatian German", "American German",
"Bavarian German", "Belgian German",
"Central German",
"DDR German",
"East African German",
"German German",
"Hessian German",
"Indiana German",
"Liechtenstein German", "Lorraine German", "Luxembourgish German",
"Namibian German", "Northern German",
"Prussian German",
"Silesia German", "South African German", "Southern German", "South Tyrolean German", "Switzerland German",
"Texan German"},
}
m["dv"] = {
aliases = {"Divehi", "Maldivian"},
varieties = {{"Mahal", "Mahl"}},
}
m["dz"] = {
}
m["ee"] = {
}
m["el"] = {
aliases = {"Modern Greek", "Neo-Hellenic"},
}
m["en"] = {
aliases = {"Modern English", "New English"},
varieties = {"Polari", "Yinglish"},
}
m["eo"] = {
}
m["es"] = {
aliases = {"Castilian"},
varieties = {{"Amazonian Spanish", "Amazonic Spanish"}, "Loreto-Ucayali Spanish"},
}
m["et"] = {
}
m["eu"] = {
aliases = {"Euskara"},
}
m["fa"] = {
aliases = {"Farsi", "New Persian", "Modern Persian"},
varieties = {{"Western Persian", "Iranian Persian"}, {"Eastern Persian", "Dari"}, {"Aimaq", "Aimak", "Aymaq", "Eimak"}},
}
m["ff"] = {
aliases = {"Fulani"},
varieties = {"Adamawa Fulfulde", "Bagirmi Fulfulde", "Borgu Fulfulde", "Central-Eastern Niger Fulfulde", "Fulfulde", "Maasina Fulfulde", "Nigerian Fulfulde", "Pular", "Pulaar", "Western Niger Fulfulde"}, -- Maasina, etc are dialects, subsumed into this code; Pular and Pulaar are distinct
}
m["fi"] = {
aliases = {"Suomi"},
}
m["fj"] = {
}
m["fo"] = {
aliases = {"Faeroese"},
}
m["fr"] = {
aliases = {"Modern French"},
varieties = {"African French", "Algerian French", "Alsatian French", "Antilles French", "Atlantic Canadian French",
"Belgian French",
"Congolese French",
"European French",
"French French",
"Haitian French",
"Ivorian French",
"Lorraine French", "Louisiana French", "Luxembourgish French",
"Malian French", "Marseille French", "Missourian French", "Moroccan French",
"Newfoundland French", "North American French",
"Picard French", "Provençal French",
"Quebec French",
"Réunion French", "Rwandan French",
"Tunisian French",
"West African French"},
}
m["fy"] = {
aliases = {"Western Frisian"},
}
m["ga"] = {
aliases = {"Irish Gaelic", "Gaelic"}, -- calling it simply "Gaelic" is rare in Ireland, but relatively common in the Irish diaspora
varieties = {{"Cois Fharraige Irish", "Cois Fhairrge Irish"}, {"Connacht Irish", "Connaught Irish"}, "Cork Irish", "Donegal Irish", "Galway Irish", "Kerry Irish", "Mayo Irish", "Munster Irish", "Ulster Irish", "Waterford Irish", "West Muskerry Irish"},
}
m["gd"] = {
aliases = {"Gaelic", "Gàidhlig", "Scots Gaelic", "Scottish"},
varieties = {"Argyll Gaelic", "Arran Scottish Gaelic", {"Canadian Gaelic", "Canadian Scottish Gaelic", "Cape Breton Gaelic"}, "East Sutherland Gaelic", {"Galwegian Gaelic", "Gallovidian Gaelic", "Gallowegian Gaelic", "Galloway Gaelic"}, "Hebridean Gaelic", "Highland Gaelic"},
}
m["gl"] = {
}
m["gu"] = {
}
m["gv"] = {
aliases = {"Manx Gaelic"},
varieties = {"Northern Manx", "Southern Manx"},
}
m["ha"] = {
}
m["he"] = {
aliases = {"Ivrit"},
}
m["hi"] = {
other_names = {"Hindavi"},
}
m["ho"] = {
aliases = {"Pidgin Motu", "Police Motu"},
}
m["ht"] = {
aliases = {"Creole", "Haitian", "Kreyòl"},
}
m["hu"] = {
aliases = {"Magyar"},
}
m["hy"] = {
aliases = {"Modern Armenian"},
varieties = {"Eastern Armenian", "Western Armenian"},
}
m["hz"] = {
}
m["ia"] = {
}
m["id"] = {
}
m["ie"] = {
aliases = {"Occidental"},
}
m["ig"] = {
}
m["ii"] = {
aliases = {
"Nosu", "Nuosu Yi", "Nosu Yi", "Sichuan Yi", "Northern Yi", "Liangshan Yi",
},
}
m["ik"] = {
aliases = {"Inupiak", "Iñupiaq", "Inupiatun"},
}
m["io"] = {
}
m["is"] = {
}
m["it"] = {
}
m["iu"] = {
varieties = {
"Aivilimmiut",
{"Eastern Canadian Inuktitut", "Eastern Canadian Inuit"},
{"Inuinnaq", "Inuinnaqtun"},
{"Inuvialuktun", "Inuvialuk", "Western Canadian Inuktitut", "Western Canadian Inuit", "Western Canadian Inuktun"},
"Kivallirmiut",
"Natsilingmiut", "Nunavimmiutit", "Nunatsiavummiut",
{"Siglitun", "Siglit"}},
}
m["ja"] = {
aliases = {"Modern Japanese", "Nipponese", "Nihongo"},
}
m["jv"] = {
}
m["ka"] = {
varieties = {{"Judeo-Georgian", "Kivruli", "Gruzinic"}},
}
m["kg"] = {
aliases = {"Kikongo"},
varieties = {"Koongo", "Laari", "San Salvador Kongo", "Yombe"},
}
m["ki"] = {
aliases = {"Gikuyu", "Gĩkũyũ"},
}
m["kj"] = {
aliases = {"Kuanyama", "Oshikwanyama"},
}
m["kk"] = {
}
m["kl"] = {
aliases = {"Kalaallisut"},
}
m["km"] = {
aliases = {"Cambodian", "Central Khmer", "Modern Khmer"},
}
m["kn"] = {
}
m["ko"] = {
aliases = {"Modern Korean"},
}
m["kr"] = {
varieties = {"Kanembu", "Bilma Kanuri", "Central Kanuri", "Manga Kanuri", "Tumari Kanuri"},
}
m["ks"] = {
aliases = {"Koshur"},
}
-- "kv" is treated as "koi", "kpv", see [[WT:LT]]
m["kw"] = {
}
m["ky"] = {
aliases = {"Kirghiz", "Kirgiz"},
}
m["la"] = {
}
m["lb"] = {
}
m["lg"] = {
aliases = {"Ganda", "Oluganda"},
}
m["li"] = {
aliases = {"Limburgan", "Limburgian", "Limburgic"},
}
m["ln"] = {
aliases = {"Ngala"},
}
m["lo"] = {
aliases = {"Laotian"},
}
m["lt"] = {
}
m["lu"] = {
}
m["lv"] = {
aliases = {"Lettish", "Lett"},
}
m["mg"] = {
varieties = {
{"Antankarana", "Antankarana Malagasy"},
{"Bara Malagasy", "Bara"}, {"Betsimisaraka Malagasy", "Betsimisaraka"}, {"Northern Betsimisaraka Malagasy", "Northern Betsimisaraka"}, {"Southern Betsimisaraka Malagasy", "Southern Betsimisaraka"}, {"Bushi", "Shibushi", "Kibushi"},
{"Masikoro Malagasy", "Masikoro"},
"Plateau Malagasy",
"Sakalava",
{"Tandroy Malagasy", "Tandroy"}, {"Tanosy", "Tanosy Malagasy"}, "Tesaka", {"Tsimihety", "Tsimihety Malagasy"}},
}
m["mh"] = {
}
m["mi"] = {
aliases = {"Maori"},
}
m["mk"] = {
}
m["ml"] = {
}
m["mn"] = {
varieties = {"Khalkha Mongolian"},
}
-- "mo" is treated as "ro", see [[WT:LT]]
m["mr"] = {
}
m["ms"] = {
aliases = {"Malaysian", "Standard Malay"},
}
m["mt"] = {
}
m["my"] = {
aliases = {"Myanmar"},
varieties = {"Mandalay Burmese", "Myeik Burmese", "Palaw Burmese", {"Rangoon Burmese", "Yangon Burmese"}, "Yaw Burmese"},
}
m["na"] = {
aliases = {"Nauru"},
}
m["nb"] = {
aliases = {"Bokmål"},
}
m["nd"] = {
aliases = {"North Ndebele"},
}
m["ne"] = {
aliases = {"Nepalese"},
varieties = {"Palpa"}, -- 3832956, former "plp", retired by ISO as spurious
}
m["ng"] = {
}
m["nl"] = {
varieties = {"Netherlandic", "Flemish"}, -- FIXME, check this
}
m["nn"] = {
aliases = {"New Norwegian", "Nynorsk"},
}
m["no"] = {
}
m["nr"] = {
aliases = {"South Ndebele"},
}
m["nv"] = {
aliases = {"Navaho", "Diné bizaad"},
}
m["ny"] = {
aliases = {"Chicheŵa", "Chinyanja", "Nyanja", "Chewa", "Cicewa", "Cewa", "Cinyanja"},
}
m["oc"] = {
-- don't list varieties here that are in [[Module:etymology languages/data]]
}
m["oj"] = {
aliases = {"Ojibway", "Ojibwa"},
varieties = {{"Chippewa", "Ojibwemowin", "Southwestern Ojibwa"}},
}
m["om"] = {
varieties = {"Orma", "Borana-Arsi-Guji Oromo", "West Central Oromo"},
}
m["or"] = {
aliases = {"Oriya", "Oorya"},
}
m["os"] = {
aliases = {"Ossete", "Ossetic"},
varieties = {"Digor", "Iron"},
}
m["pa"] = {
aliases = {"Panjabi"},
}
m["pi"] = {
}
m["pl"] = {
}
m["ps"] = {
aliases = {"Pashtun", "Pushto", "Pashtu", "Afghani"},
varieties = {"Central Pashto", "Northern Pashto", "Southern Pashto", {"Pukhto", "Pakhto", "Pakkhto"}},
}
m["pt"] = {
aliases = {"Modern Portuguese"},
}
m["qu"] = {
}
m["rm"] = {
aliases = {"Romansch", "Rumantsch", "Romanche"},
-- don't list varieties here that are in [[Module:etymology languages/data]]
varieties = {"Sursilvan-Oberland"}, -- extra variety in Glottolog; main varieties have their own etym codes
}
m["ro"] = {
aliases = {"Daco-Romanian", "Roumanian", "Rumanian"},
}
m["ru"] = {
}
m["rw"] = {
-- don't list varieties here that are in [[Module:etymology languages/data]]
varieties = {{"Ha", "Giha"}, "Hangaza", "Vinza", "Shubi"}, -- Deleted "Subi", which normally refers to a different language
}
m["sa"] = {
}
m["sc"] = {
-- don't list varieties here that are in [[Module:etymology languages/data]]
}
m["sd"] = {
}
m["se"] = {
aliases = {"North Sami", "Northern Saami", "North Saami"},
}
m["sg"] = {
}
m["sh"] = {
aliases = {"BCS", "Croato-Serbian", "Serbocroatian"},
-- don't list varieties here that are in [[Module:etymology languages/data]]
varieties = {"Bosnian", "Croatian", "Montenegrin", "Serbian", "Shtokavian"},
}
m["si"] = {
aliases = {"Singhalese", "Sinhala"},
}
m["sk"] = {
}
m["sl"] = {
aliases = {"Slovenian"},
}
m["sm"] = {
}
m["sn"] = {
}
m["so"] = {
}
m["sq"] = {
-- don't list varieties here that are in [[Module:etymology languages/data]]
}
m["ss"] = {
aliases = {"Swati"},
}
m["st"] = {
aliases = {"Sesotho", "Southern Sesotho", "Southern Sotho"},
}
m["su"] = {
}
m["sv"] = {
}
m["sw"] = {
varieties = {{"Settler Swahili", "KiSetla", "KiSettla", "Setla", "Settla", "Kitchen Swahili"}, {"Kihindi", "Indian Swahili"}, {"KiShamba", "Kishamba", "Field Swahili"}, {"Kibabu", "Asian Swahili"}, {"Kimanga", "Arab Swahili"}, {"Kitvita", "Army Swahili"}},
}
m["ta"] = {
}
m["te"] = {
}
m["tg"] = {
aliases = {"Eastern Persian", "Tadjik", "Tadzhik", "Tajiki", "Tajik Persian", "Tajiki Persian"},
}
m["th"] = {
aliases = {"Central Thai", "Siamese"},
}
m["ti"] = {
aliases = {"Tigrigna"},
}
m["tk"] = {
}
m["tl"] = {
}
m["tn"] = {
aliases = {"Setswana"},
}
m["to"] = {
}
m["tr"] = {
}
m["ts"] = {
aliases = {"Xitsonga"},
}
m["tt"] = {
}
-- "tw" is treated as "ak", see [[WT:LT]]
m["ty"] = {
}
m["ug"] = {
aliases = {"Uigur", "Uighur", "Uygur"},
}
m["uk"] = {
}
m["ur"] = {
}
m["uz"] = {
varieties = {"Northern Uzbek", "Southern Uzbek"},
}
m["ve"] = {
}
m["vi"] = {
aliases = {"Annamese", "Annamite"},
}
m["vo"] = {
}
m["wa"] = {
varieties = {"Liégeois", "Namurois", "Wallo-Picard", "Wallo-Lorrain"},
}
m["wo"] = {
varieties = {"Gambian Wolof"}, -- the subsumed dialect 'wof'
}
m["xh"] = {
}
m["yi"] = {
varieties = {"American Yiddish", "Daytshmerish Yiddish", "Mideastern Yiddish", "Galitzish",
{"Northeastern Yiddish", "Litvish", "Lithuanian Yiddish"},
{"Northwestern Yiddish", "Netherlandic Yiddish"},
{"Polish Yiddish", "Poylish"},
"South African Yiddish",
{"Southeastern Yiddish", "Ukrainian Yiddish", "Ukrainish"},
{"Southwestern Yiddish", "Judeo-Alsatian"},
"Udmurtish"
},
}
m["yo"] = {
}
m["za"] = {
-- FIXME, are all of the following distinct?
varieties = {
"Chongzuo Zhuang",
"Guibei Zhuang", "Guibian Zhuang",
"Central Hongshuihe Zhuang", "Eastern Hongshuihe Zhuang",
"Lianshan Zhuang", "Liujiang Zhuang", "Liuqian Zhuang",
{"Min Zhuang", "Minz Zhuang"},
"Nong Zhuang", -- see zhn
"Qiubei Zhuang",
"Shangsi Zhuang",
{"Dai Zhuang", "Wenma", "Wenma Thu", "Wenma Zhuang"},
"Yang Zhuang",
{"Yongbei Zhuang", "Wuming Zhuang", "Standard Zhuang"},
"Yongnan Zhuang", "Youjiang Zhuang",
"Zuojiang Zhuang"},
}
m["zh"] = {
}
m["zu"] = {
aliases = {"isiZulu"},
}
return m
8dzyaary1ol9c8nzyck3kxai4c2ysq5
Module:table/sortedPairs
828
5979
17416
2026-07-13T08:30:36Z
Hiyuune
6766
Created page with "local table_keys_to_list_module = "Module:table/keysToList" local function keys_to_list(...) keys_to_list = require(table_keys_to_list_module) return keys_to_list(...) end --[==[ Iterates through a table, with the keys sorted using the keysToList function. If there are only numerical keys, `export.sparseIpairs` is probably faster.]==] return function(t, key_sort) local list, i = keys_to_list(t, key_sort), 0 return function() i = i + 1 local k = list[i] if k..."
17416
Scribunto
text/plain
local table_keys_to_list_module = "Module:table/keysToList"
local function keys_to_list(...)
keys_to_list = require(table_keys_to_list_module)
return keys_to_list(...)
end
--[==[
Iterates through a table, with the keys sorted using the keysToList function.
If there are only numerical keys, `export.sparseIpairs` is probably faster.]==]
return function(t, key_sort)
local list, i = keys_to_list(t, key_sort), 0
return function()
i = i + 1
local k = list[i]
if k ~= nil then
return k, t[k]
end
end
end
k9kspqkam96jj5np6nfk0sg15yvnnd3
Module:table/keysToList
828
5980
17417
2026-07-13T08:31:08Z
Hiyuune
6766
+
17417
Scribunto
text/plain
local compare_module = "Module:compare"
local pairs = pairs
local sort = table.sort
local compare
local function get_compare()
compare, get_compare = require(compare_module), nil
return compare
end
--[==[
Returns a list of the keys in a table, sorted using either the default `table.sort` function or a custom `key_sort` function.
If there are only numerical keys, [[Module:table/numKeys]] is probably faster.]==]
return function(t, key_sort)
local list, i = {}, 0
for key in pairs(t) do
i = i + 1
list[i] = key
end
-- Use specified sort function, or otherwise `compare`.
sort(list, key_sort == nil and (compare or get_compare()) or key_sort)
return list
end
db7h2mui4n7duv8tkb39qolcbe3t8rm
Module:compare
828
5981
17418
2026-07-13T08:31:41Z
Hiyuune
6766
+
17418
Scribunto
text/plain
local math_compare_module = "Module:math/compare"
local string_compare_module = "Module:string/compare"
local table_compare_module = "Module:table/compare"
local require = require
local type = type
local types
local function get_types()
types, get_types = {
["nil"] = "\1",
["boolean"] = "\2",
["number"] = "\3",
["string"] = "\4",
}, nil
return types
end
local compare_funcs
local function get_compare_funcs()
compare_funcs = {}
function compare_funcs.boolean(a, b)
return a == true and b == false
end
function compare_funcs.number(...)
local math_compare = require(math_compare_module)
compare_funcs.number = math_compare
return math_compare(...)
end
function compare_funcs.string(...)
local string_compare = require(string_compare_module)
compare_funcs.string = string_compare
return string_compare(...)
end
function compare_funcs.table(...)
local table_compare = require(table_compare_module)
compare_funcs.table = table_compare
return table_compare(...)
end
get_compare_funcs = nil
return compare_funcs
end
--[==[
A general comparison function, which returns {true} if {a} sorts before {b}, or otherwise {false}; it can be used as the sort function with {table.sort}.
This function is roughly equivalent to the {<} operator, but is capable of comparing a mix of types, using the following rules:
* When items of different types are compared, the type-order is {"nil"}, {"boolean"}, {"number"}, {"string"}, then alphabetical order by type name for all other types.
* Numbers are compared with [[Module:math/compare]].
* Strings are compared with [[Module:string/compare]].
* Tables are compared with [[Module:table/compare]].
* Boolean {true} sorts before {false}.
* All other types always return {false}.]==]
return function(a, b)
local type_a, type_b = type(a), type(b)
if type_a == type_b then
local func = (compare_funcs or get_compare_funcs())[type_a]
return func and func(a, b) or false
end
return ((types or get_types())[type_a] or type_a) < (types[type_b] or type_b)
end
fs82yur52kblfpa4j6uwsb5dbcxr7em
Module:math/compare
828
5982
17419
2026-07-13T08:32:02Z
Hiyuune
6766
+
17419
Scribunto
text/plain
local math_module = "Module:math"
local function is_NaN(...)
is_NaN = require(math_module).is_NaN
return is_NaN(...)
end
local function sign(...)
sign = require(math_module).sign
return sign(...)
end
--[==[
A comparison function for numbers, which returns {true} if {a} sorts before {b}, or otherwise {false}; it can be used as the sort function with {table.sort}.
This function is roughly equivalent to the {<} operator, but contains the following special considerations in accordance with the {{w|IEEE 754}} standard:
* {{w|NaN}} is sorted as though it has a larger absolute value than infinity ({-NaN < -Inf}; {+Inf < +NaN}).
* {{w|Signed zero}} is acknowledged, with {-0 < +0}.]==]
return function(a, b)
-- <, > and == canot return true if either `a` or `b` are NaN.
if a < b then
return true
-- Use > then == instead of >=, so that the ±0 check is only done when `a`
-- and `b` are equal.
elseif a > b then
return false
elseif a == b then
-- 1/(+0) is Inf; 1/(-0) is -Inf.
return a == 0 and b == 0 and 1 / a < 1 / b or false
-- One or both must be NaN, and NaN is the only number that returns false
-- to a self-equality check, so if `a` == `a` then `b` is NaN (and vice-
-- versa). -NaN sorts before everything and +NaN after everything, so the
-- sign determines the result.
elseif not is_NaN(a) then -- `b` is NaN
return sign(b) == 1
elseif not is_NaN(b) then -- `a` is NaN
return sign(a) == -1
end
-- If both are NaN, only return true if `a` is -NaN and `b` is +NaN.
return sign(a) < sign(b)
end
632obodjr2zjfbz9zpr3erx1io9vwm4
Module:table/isArray
828
5983
17420
2026-07-13T08:34:07Z
Hiyuune
6766
+
17420
Scribunto
text/plain
local pairs = pairs
--[==[
Returns true if all keys in the table are consecutive integers starting from 1.]==]
return function(t)
-- pairs() is unordered, but can be assumed to return every key in `t`, so
-- if every integer key from 1 to n (the number of keys in `t`) is in use,
-- then all the keys in `t` form an integer range from 1 to n, making `t`
-- a contiguous array.
local i = 0
for _ in pairs(t) do
i = i + 1
if t[i] == nil then
return false
end
end
return true
end
g82iokgqr1uqfaagx0is49bas3cpq0c
Module:languages/data/3/d
828
5984
17421
2026-07-13T08:34:38Z
Hiyuune
6766
+
17421
Scribunto
text/plain
local m_langdata = require("Module:languages/data")
-- Loaded on demand, as it may not be needed (depending on the data).
local function u(...)
u = require("Module:string utilities").char
return u(...)
end
local c = m_langdata.chars
local p = m_langdata.puaChars
local s = m_langdata.shared
local m = {}
m["daa"] = {
"Dangaléat",
942591,
"cdc-est",
"Latn",
}
m["dac"] = {
"Dambi",
12629491,
"poz-ocw",
"Latn",
}
m["dad"] = {
"Marik",
6763404,
"poz-ocw",
"Latn",
}
m["dae"] = {
"Duupa",
35263,
"alv-dur",
"Latn",
}
m["dag"] = {
"Dagbani",
32238,
"nic-dag",
"Latn",
}
m["dah"] = {
"Gwahatike",
5623246,
"ngf-war",
"Latn",
}
m["dai"] = {
"Day",
35163,
"alv-mbd",
"Latn",
}
m["daj"] = {
"Dar Fur Daju",
56370,
"sdv-daj",
"Latn",
}
m["dak"] = {
"Dakota",
530384,
"sio-dkt",
"Latn",
}
m["dal"] = {
"Dahalo",
35143,
"cus",
"Latn",
}
m["dam"] = {
"Damakawa",
1158134,
"nic-knn",
"Latn",
}
m["dao"] = {
"Daai Chin",
860029,
"tbq-kuk",
"Latn",
}
m["daq"] = {
"Dandami Maria",
12952805,
"dra-mdy",
"Deva",
}
m["dar"] = {
"Dargwa",
32332,
"cau-drg",
"Cyrl, Latn, Arab",
translit = {Cyrl = "dar-translit"},
override_translit = true,
display_text = {Cyrl = s["cau-Cyrl-displaytext"]},
strip_diacritics = {
Cyrl = s["cau-Cyrl-stripdiacritics"],
Latn = s["cau-Latn-stripdiacritics"],
},
sort_key = {
Cyrl = {
from = {
"къкъ", "хьхь", -- 4 chars
"гъ", "гь", "гӏ", "ё", "къ", "кь", "кӏ", "пп", "пӏ", "сс", "тт", "тӏ", "хх", "хъ", "хь", "хӏ", "цц", "цӏ", "чч", "чӏ" -- 2 chars
},
to = {
"к" .. p[2], "х" .. p[4],
"г" .. p[1], "г" .. p[2], "г" .. p[3], "е" .. p[1], "к" .. p[1], "к" .. p[3], "к" .. p[4], "п" .. p[1], "п" .. p[2], "с" .. p[1], "т" .. p[1], "т" .. p[2], "х" .. p[1], "х" .. p[2], "х" .. p[3], "х" .. p[5], "ц" .. p[1], "ц" .. p[2], "ч" .. p[1], "ч" .. p[2]
}
},
},
}
m["das"] = {
"Daho-Doo",
3915369,
"kro-wee",
"Latn",
}
m["dau"] = {
"Dar Sila Daju",
7514020,
"sdv-daj",
"Latn",
}
m["dav"] = {
"Taita",
2387274,
"bnt-cht",
"Latn",
}
m["daw"] = {
"Davawenyo",
5228174,
"phi",
"Latn",
}
m["dax"] = {
"Dayi",
10467281,
"aus-yol",
"Latn",
}
m["daz"] = {
"Dao",
5221513,
"ngf-pan",
"Latn",
}
m["dba"] = {
"Bangime",
1982696,
"qfa-iso", -- southern Mali
"Latn",
}
m["dbb"] = {
"Deno",
56275,
"cdc-wst",
"Latn",
}
m["dbd"] = {
"Dadiya",
3914436,
"alv-wjk",
"Latn",
}
m["dbe"] = {
"Dabe",
5207451,
"paa-tor",
"Latn",
}
m["dbf"] = {
"Edopi",
12953516,
"paa-lpl",
"Latn",
}
m["dbg"] = {
"Dogul Dom",
3912880,
"nic-npd",
"Latn",
}
m["dbi"] = {
"Doka",
3913293,
"nic-plc",
"Latn",
}
m["dbj"] = {
"Ida'an",
3041552,
"poz-san",
"Latn",
}
m["dbl"] = {
"Dyirbal",
35465,
"aus-dyb",
"Latn",
}
m["dbm"] = {
"Duguri",
7194057,
"nic-jrw",
"Latn",
}
m["dbn"] = {
"Duriankere",
5316627,
"ngf-sbh",
"Latn",
}
m["dbo"] = {
"Dulbu",
5313310,
"nic-jrn",
"Latn",
}
m["dbp"] = {
"Duwai",
56301,
"cdc-wst",
"Latn",
}
m["dbq"] = {
"Daba",
3913342,
"cdc-cbm",
"Latn",
}
m["dbr"] = {
"Dabarre",
3447286,
"cus-som",
"Latn",
}
m["dbt"] = {
"Ben Tey",
4886561,
"nic-nwa",
"Latn",
}
m["dbu"] = {
"Bondum Dom Dogon",
3912758,
"nic-npd",
"Latn",
}
m["dbv"] = {
"Dungu",
5315230,
"nic-kau",
"Latn",
}
m["dbw"] = {
"Bankan Tey Dogon",
4856243,
"nic-nwa",
"Latn",
}
m["dby"] = {
"Dibiyaso",
5272268,
"qfa-dis", -- Papuan; isolate per Glottolog, unclassified per Pawley and Hammarström (2018), sometimes classified with Bosavi languages
"Latn",
}
m["dcc"] = {
"Deccani",
669431,
"inc-hnd",
"ur-Arab",
ancestors = "ur",
}
m["dcr"] = {
"Negerhollands",
1815830,
"crp",
"Latn",
ancestors = "nl",
}
m["dda"] = {
"Dadi Dadi",
50207890,
"aus-pam",
"Latn",
}
m["ddd"] = {
"Dongotono",
56676,
"sdv-lma",
"Latn",
}
m["dde"] = {
"Doondo",
11003401,
"bnt-kng",
"Latn",
}
m["ddg"] = {
"Fataluku",
35353,
"paa-eti",
"Latn",
}
m["ddi"] = {
"Diodio",
3028668,
"poz-ocw",
"Latn",
}
m["ddj"] = {
"Jaru",
3162806,
"aus-pam",
"Latn",
}
m["ddn"] = {
"Dendi",
35164,
"son",
"Latn",
}
m["ddo"] = {
"Tsez",
34033,
"cau-wts",
"Cyrl",
translit = "ddo-translit",
display_text = {Cyrl = s["cau-Cyrl-displaytext"]},
strip_diacritics = {Cyrl = s["cau-Cyrl-stripdiacritics"]},
}
m["ddr"] = {
"Dhudhuroa",
5269842,
"aus-pam",
"Latn",
}
m["dds"] = {
"Donno So Dogon",
1234776,
"nic-dge",
"Latn",
}
m["ddw"] = {
"Dawera-Daweloor",
5242304,
"poz-tim",
"Latn",
}
m["dec"] = {
"Dagik",
35125,
"alv-tal",
"Latn",
}
m["ded"] = {
"Dedua",
5249850,
"ngf-huo",
"Latn",
}
m["dee"] = {
"Dewoin",
3914892,
"kro-wkr",
"Latn",
}
m["def"] = {
"Dezfuli",
4115412,
"ira-swi",
"Arab",
}
m["deg"] = {
"Degema",
35182,
"alv-dlt",
"Latn",
}
m["deh"] = {
"Dehwari",
5704314,
"ira-swi",
"fa-Arab",
ancestors = "fa",
}
m["dei"] = {
"Demisa",
56380,
"paa-egb",
"Latn",
}
-- "dek" is no longer an ISO code; spurious
m["dem"] = {
"Dem",
5254989,
"qfa-dis", -- Papuan; isolate in Glottolog; unclassified in Palmer (2018); grouped with Amung by Usher, ultimately in TNG
"Latn",
}
m["dep"] = {
"Pidgin Delaware",
1183938,
"crp",
"Latn",
ancestors = "unm",
}
-- deq is not included, see [[WT:LT]]
m["der"] = {
"Deori",
56478,
"tbq-bdg",
"Beng, Latn",
}
m["des"] = {
"Desano",
962392,
"sai-tuc",
"Latn",
}
m["dev"] = {
"Domung",
5291378,
"ngf-yup",
"Latn",
}
m["dez"] = {
"Dengese",
2909984,
"bnt-tet",
"Latn",
}
m["dga"] = {
"Southern Dagaare",
35159,
"nic-mre",
"Latn",
}
m["dgb"] = {
"Bunoge",
4985178,
"nic-dgw",
"Latn",
}
m["dgc"] = {
"Casiguran Dumagat Agta",
5313599,
"phi",
"Latn",
}
m["dgd"] = {
"Dagaari Dioula",
11153465,
"nic-mre",
"Latn",
}
m["dge"] = {
"Degenan",
5251770,
"ngf-war",
"Latn",
}
m["dgg"] = {
"Doga",
3033726,
"poz-ocw",
"Latn",
}
m["dgh"] = {
"Dghwede",
56293,
"cdc-cbm",
"Latn",
}
m["dgi"] = {
"Northern Dagara",
11004218,
"nic-mre",
"Latn",
}
m["dgk"] = {
"Dagba",
12952357,
"csu-sar",
"Latn",
}
m["dgn"] = {
"Dagoman",
10465931,
"aus-yng",
"Latn",
}
m["dgo"] = {
"Hindi Dogri",
nil,
"him",
"Deva, Arab, Takr",
ancestors = "doi",
}
m["dgr"] = {
"Dogrib",
20979,
"ath-nor",
"Latn",
}
m["dgs"] = {
"Dogoso",
35343,
"nic-gur",
}
m["dgt"] = {
"Ntra'ngith",
6983809,
"aus-pam",
"Latn",
}
-- dgu is not a language; see [[w:Dhekaru]]
m["dgw"] = {
"Daungwurrung",
5228050,
"aus-pam",
"Latn",
}
m["dgx"] = {
"Doghoro",
12952392,
"ngf-bin",
"Latn",
}
m["dgz"] = {
"Daga",
5208442,
"ngf-dag",
"Latn",
}
m["dhg"] = {
"Dhangu",
5268960,
"aus-yol",
"Latn",
}
m["dhd"] = {
"Dhundhari",
633359,
"raj",
"Deva",
translit = "hi-translit",
}
m["dhi"] = {
"Dhimal",
35229,
"sit-dhi",
"Deva",
}
m["dhl"] = {
"Dhalandji",
5268787,
"aus-psw",
"Latn",
}
m["dhm"] = {
"Zemba",
3502283,
"bnt-swb",
"Latn",
ancestors = "hz",
}
m["dhn"] = {
"Dhanki",
5268992,
"inc-bhi",
}
m["dho"] = {
"Dhodia",
5269658,
"inc-bhi",
"Deva",
}
m["dhr"] = {
"Tharrgari",
10470289,
"aus-psw",
"Latn",
}
m["dhs"] = {
"Dhaiso",
11001788,
"bnt-kka",
"Latn",
}
m["dhu"] = {
"Dhurga",
1285318,
"aus-yuk",
"Latn",
}
m["dhv"] = {
"Drehu",
3039319,
"poz-cln",
"Latn",
}
m["dhw"] = {
"Danuwar",
3522797,
"inc-bhi",
"Deva",
}
m["dhx"] = {
"Dhungaloo",
16960599,
"aus-pam",
"Latn",
}
m["dia"] = {
"Dia",
3446591,
"paa-wap",
"Latn",
}
m["dib"] = {
"South Central Dinka",
35154,
"sdv-dnu",
"Latn",
ancestors = "din",
}
m["dic"] = {
"Lakota Dida",
11001730,
"kro-did",
"Latn",
}
m["did"] = {
"Didinga",
56365,
"sdv",
"Latn",
}
m["dif"] = {
"Dieri",
25559563,
"aus-kar",
"Latn",
}
m["dig"] = {
"Digo",
3362072,
"bnt-mij",
"Latn",
}
-- "dih" is split into nai-ipa, nai-kum, nai-tip, see [[WT:LT]]
m["dii"] = {
"Dimbong",
35196,
"bnt-baf",
"Latn",
}
m["dij"] = {
"Dai",
5209056,
"poz-tim",
"Latn",
}
m["dik"] = {
"Southwestern Dinka",
36540,
"sdv-dnu",
"Latn",
ancestors = "din",
}
m["dil"] = {
"Dilling",
35152,
"nub-hil",
"Latn",
}
m["dim"] = {
"Dime",
35311,
"omv-aro",
}
m["din"] = {
"Dinka",
56466,
"sdv-dnu",
"Latn",
}
m["dio"] = {
"Dibo",
3914891,
"alv-ngb",
"Latn",
}
m["dip"] = {
"Northeastern Dinka",
36246,
"sdv-dnu",
"Latn",
ancestors = "din",
}
m["dir"] = {
"Dirim",
11130804,
"nic-dak",
"Latn",
}
m["dis"] = {
"Dimasa",
56664,
"tbq-bdg",
"Latn, Beng",
}
m["diu"] = {
"Gciriku",
3780954,
"bnt-kav",
"Latn",
}
m["diw"] = {
"Northwestern Dinka",
36249,
"sdv-dnu",
"Latn",
ancestors = "din",
}
m["dix"] = {
"Dixon Reef",
5284967,
"poz-vnc",
"Latn",
}
m["diy"] = {
"Diuwe",
5283765,
"ngf-asm",
"Latn",
}
m["diz"] = {
"Ding",
35202,
"bnt-bdz",
"Latn",
}
m["dja"] = {
"Djadjawurrung",
5285190,
"aus-pam",
"Latn",
}
m["djb"] = {
"Djinba",
5285351,
"aus-yol",
"Latn",
}
m["djc"] = {
"Dar Daju Daju",
5209890,
"sdv-daj",
"Latn",
}
m["djd"] = {
"Jaminjung",
6147825,
"aus-mir",
"Latn",
}
m["dje"] = {
"Zarma",
36990,
"son",
"Latn, Arab, Brai",
}
m["djf"] = {
"Djangun",
10474818,
"aus-pmn",
"Latn",
}
m["dji"] = {
"Djinang",
5285350,
"aus-yol",
"Latn",
}
m["djj"] = {
"Ndjébbana",
5285274,
"aus-arn",
"Latn",
}
m["djk"] = {
"Aukan",
2659044,
"crp",
"Latn, Afak",
ancestors = "en",
}
m["djl"] = {
"Djiwarli",
2669569,
"aus-psw",
"Latn",
}
m["djm"] = {
"Jamsay",
3913290,
"nic-pld",
"Latn",
}
m["djn"] = {
"Djauan",
13553748,
"aus-gun",
"Latn",
}
m["djo"] = {
"Jangkang",
12952388,
"day",
}
m["djr"] = {
"Djambarrpuyngu",
3915679,
"aus-yol",
"Latn",
}
m["dju"] = {
"Kapriman",
6367199,
"paa-sep",
"Latn",
}
m["djw"] = {
"Djawi",
3913844,
"aus-nyu",
"Latn",
ancestors = "bcj",
}
m["dka"] = {
"Dakpa",
3695189,
"sit-ebo",
"Tibt",
override_translit = true,
-- Tibt translit, display_text, strip_diacritics, sort_key in [[Module:scripts/data]]
}
m["dkk"] = {
"Dakka",
5209962,
"poz-ssw",
"Latn",
}
m["dkr"] = {
"Kuijau",
13580777,
"poz-bnn",
"Latn",
}
m["dks"] = {
"Southeastern Dinka",
36538,
"sdv-dnu",
"Latn",
ancestors = "din",
}
m["dkx"] = {
"Mazagway",
6798209,
"cdc-cbm",
"Latn",
}
m["dlg"] = {
"Dolgan",
32878,
"trk-nsb",
"Cyrl",
sort_key = {
from = {"ё", "һ", "ӈ", "ө", "ү"},
to = {"е" .. p[1], "к" .. p[1], "н" .. p[1], "о" .. p[1], "у" .. p[1]}
},
}
m["dlk"] = {
"Dahalik",
32260,
"sem-eth",
"Ethi",
translit = "Ethi-translit",
}
m["dlm"] = {
"Dalmatian",
35527,
"roa-dal",
"Latn",
}
m["dln"] = {
"Darlong",
5224029,
"tbq-kuk",
"Latn",
}
m["dma"] = {
"Duma",
35319,
"bnt-nze",
"Latn",
}
m["dmb"] = {
"Mombo Dogon",
6897074,
"nic-dgw",
"Latn",
}
m["dmc"] = {
"Gavak",
5277406,
"ngf-nad",
"Latn",
}
m["dmd"] = {
"Madhi Madhi",
6727353,
"aus-pam",
"Latn",
}
m["dme"] = {
"Dugwor",
56313,
"cdc-cbm",
"Latn",
}
m["dmf"] = {
"Medefaidrin",
1519764,
"art",
"Medf",
type = "appendix-constructed",
}
m["dmg"] = {
"Upper Kinabatangan",
16109975,
"poz-san",
"Latn",
}
m["dmk"] = {
"Domaaki",
32900,
"inc-wes",
"Arab",
}
m["dml"] = {
"Dameli",
32288,
"inc-kun",
}
m["dmm"] = {
"Dama (Nigeria)",
5211865,
"alv-mbm",
"Latn",
}
m["dmo"] = {
"Kemezung",
35562,
"nic-bbe",
"Latn",
}
m["dmr"] = {
"East Damar",
5328200,
"poz-cet",
"Latn",
}
m["dms"] = {
"Dampelas",
5212928,
"poz-tot",
"Latn",
}
m["dmu"] = {
"Dubu",
7692059,
"paa-wpw",
"Latn",
}
m["dmv"] = {
"Dumpas",
12953512,
"poz-san",
"Latn",
}
m["dmw"] = {
"Mudburra",
6931573,
"aus-pam",
"Latn",
}
m["dmx"] = {
"Dema",
3553423,
"bnt-sho",
"Latn",
}
m["dmy"] = {
"Demta",
14466283,
"paa-sen",
"Latn",
}
m["dna"] = {
"Upper Grand Valley Dani",
12952361,
"ngf-gvd",
"Latn",
}
m["dnd"] = {
"Daonda",
5221528,
"paa-war",
"Latn",
}
m["dne"] = {
"Ndendeule",
6983725,
"bnt-mbi",
"Latn",
}
m["dng"] = {
"Dungan",
33050,
"zhx-man",
"Cyrl, Latn, Hants",
generate_forms = "zh-generateforms",
translit = {Cyrl = "dng-translit"},
sort_key = {
Cyrl = {
from = {"ё", "ә", "җ", "ң", "ў", "ү"},
to = {"е" .. p[1], "е" .. p[2], "ж" .. p[1], "н" .. p[1], "у" .. p[1], "у" .. p[2]}
},
Hani = "Hani-sortkey",
},
}
m["dni"] = {
"Lower Grand Valley Dani",
12635807,
"ngf-gvd",
"Latn",
}
m["dnj"] = {
"Dan",
1158971,
"dmn-mda",
"Latn",
}
m["dnk"] = {
"Dengka",
5256954,
"poz-tim",
"Latn",
}
m["dnn"] = {
"Dzuun",
10973260,
"dmn-smg",
"Latn",
}
m["dno"] = {
"Ndrulo",
60785094,
"csu-lnd",
}
m["dnr"] = {
"Danaru",
5214932,
"ngf-pek",
"Latn",
}
m["dnt"] = {
"Mid Grand Valley Dani",
12952359,
"ngf-gvd",
"Latn",
}
m["dnu"] = {
"Danau",
5013745,
"mkh-pal",
"Mymr",
}
m["dnv"] = {
"Danu",
5221251,
"tbq-brm",
"Mymr",
ancestors = "obr",
}
m["dnw"] = {
"Western Dani",
7987774,
"ngf-cda",
"Latn",
}
m["dny"] = {
"Dení",
56562,
"auf",
"Latn",
}
m["doa"] = {
"Dom",
5289770,
"ngf-sim",
"Latn",
}
m["dob"] = {
"Dobu",
952133,
"poz-ocw",
"Latn",
}
m["doc"] = {
"Northern Kam",
17195499,
"qfa-tak",
"Latn",
}
m["doe"] = {
"Doe",
5288055,
"bnt-ruv",
"Latn",
}
m["dof"] = {
"Domu",
5291375,
"paa-mal",
"Latn",
}
m["doh"] = {
"Dong",
3438405,
"nic-dak",
"Latn",
}
m["doi"] = {
"Dogri",
32730,
"him",
"Deva, Takr, fa-Arab, Dogr",
translit = {
Deva = "hi-translit",
Dogr = "Dogr-translit",
},
}
m["dok"] = {
"Dondo",
5295571,
"poz-tot",
"Latn",
}
m["dol"] = {
"Doso",
4167202,
"paa-dtu",
"Latn",
}
m["don"] = {
"Doura",
7829037,
"poz-ocw",
"Latn",
}
m["doo"] = {
"Dongo",
35303,
"nic-mbc",
"Latn",
}
m["dop"] = {
"Lukpa",
3258739,
"nic-gne",
"Latn",
}
m["doq"] = {
"Dominican Sign Language",
5290820,
"sgn",
"Latn", -- when documented
}
m["dor"] = {
"Dori'o",
3037084,
"poz-sls",
"Latn",
}
m["dos"] = {
"Dogosé",
3913314,
"nic-gur",
"Latn",
}
m["dot"] = {
"Dass",
3441293,
"cdc-wst",
"Latn",
}
m["dov"] = {
"Toka-Leya",
11001779,
"bnt-bot",
"Latn",
ancestors = "toi",
}
m["dow"] = {
"Doyayo",
35299,
"alv-dur",
"Latn",
}
m["dox"] = {
"Bussa",
35123,
"cus-eas",
"Latn",
}
m["doy"] = {
"Dompo",
35270,
"alv-gng",
"Latn",
}
m["doz"] = {
"Dorze",
56336,
"omv-nom",
"Latn",
}
m["dpp"] = {
"Papar",
7132487,
"poz-san",
"Latn",
}
m["drb"] = {
"Dair",
12952360,
"nub-hil",
"Latn",
}
m["drc"] = {
"Minderico",
6863806,
"roa-gap",
"Latn",
ancestors = "pt",
}
m["drd"] = {
"Darmiya",
5224058,
"sit-alm",
}
m["drg"] = {
"Rungus",
6897407,
"poz-san",
"Latn",
}
m["dri"] = {
"Lela",
3914004,
"nic-knn",
"Latn",
}
m["drl"] = {
"Baagandji",
5223941,
"aus-pam",
"Latn",
}
m["drn"] = {
"West Damar",
3450459,
"poz-tim",
"Latn",
}
m["dro"] = {
"Daro-Matu Melanau",
5224156,
"poz-bnn",
"Latn",
}
m["drq"] = {
"Dura",
3449842,
"sit-gma",
"Deva",
}
m["drs"] = {
"Gedeo",
56622,
"cus-hec",
"Ethi",
}
m["dru"] = {
"Rukai",
49232,
"map",
"Latn",
ancestors = "dru-pro",
}
m["dry"] = {
"Darai",
46995026,
"inc-bhi",
"Deva",
}
m["dsb"] = {
"Lower Sorbian",
13286,
"wen",
"Latn",
sort_key = s["wen-sortkey"],
standard_chars = "AaBbCcČčĆćDdEeĚěFfGgHhIiJjKkŁłLlMmNnŃńOoÓóPpRrŔŕSsŠšŚśTtUuWwYyZzŽžŹź" .. c.punc,
}
m["dse"] = {
"Dutch Sign Language",
2201099,
"sgn",
"Latn", -- when documented
}
m["dsh"] = {
"Daasanach",
56637,
"cus-eas",
"Latn",
}
m["dsi"] = {
"Disa",
3914455,
"csu-bgr",
"Latn",
}
m["dsl"] = {
"Danish Sign Language",
2605298,
"sgn",
"Latn", -- when documented
}
m["dsn"] = {
"Dusner",
5316948,
"poz-hce",
"Latn",
}
m["dso"] = {
"Desiya",
12629755,
"inc-eas",
"Orya",
ancestors = "or",
}
m["dsq"] = {
"Tadaksahak",
36568,
"son",
"Arab, Latn",
}
m["dta"] = {
"Daur",
32430,
"xgn",
"Latn, Hani, Cyrl, Mong",
ancestors = "xng",
-- Mong translit, display_text and strip_diacritics in [[Module:scripts/data]]
sort_key = {Hani = "Hani-sortkey"},
}
m["dtb"] = {
"Labuk-Kinabatangan Kadazan",
5330240,
"poz-san",
"Latn",
}
m["dtd"] = {
"Ditidaht",
13728042,
"wak",
"Latn",
}
m["dth"] = { -- contrast 'rrt'
"Adithinngithigh",
4683034,
"aus-pmn",
"Latn",
}
m["dti"] = {
"Ana Tinga Dogon",
4750346,
"qfa-dgn",
"Latn",
}
m["dtk"] = {
"Tene Kan Dogon",
11018863,
"nic-pld",
"Latn",
}
m["dtm"] = {
"Tomo Kan Dogon",
11137719,
"nic-pld",
"Latn",
}
m["dto"] = {
"Tommo So",
47012992,
"nic-dge",
"Latn",
}
m["dtp"] = {
"Central Dusun",
5317225,
"poz-san",
"Latn",
}
m["dtr"] = {
"Lotud",
6685078,
"poz-san",
"Latn",
}
m["dts"] = {
"Toro So Dogon",
11003311,
"nic-dge",
"Latn",
}
m["dtt"] = {
"Toro Tegu Dogon",
3913924,
"nic-pld",
"Latn",
}
m["dtu"] = {
"Tebul Ure Dogon",
7692089,
"qfa-dgn",
"Latn",
}
m["dty"] = {
"Doteli",
18415595,
"inc-pah",
"Deva",
translit = "ne-translit",
}
m["dua"] = {
"Duala",
33013,
"bnt-saw",
"Latn",
}
m["dub"] = {
"Dubli",
5310792,
"inc-bhi",
}
m["duc"] = {
"Duna",
5314039,
"qfa-dis", -- Papuan; isolate in Glottolog; tentatively grouped with Bogaya into a Duna-Pogaya [sic] family,
-- ultimately in TNG
"Latn",
}
m["due"] = {
"Umiray Dumaget Agta",
7881585,
"phi",
"Latn",
}
m["duf"] = {
"Dumbea",
6983819,
"poz-cln",
"Latn",
}
m["dug"] = {
"Chiduruma",
35614,
"bnt-mij",
"Latn",
}
m["duh"] = {
"Dungra Bhil",
12953513,
"inc-bhi",
"Deva, Gujr",
}
m["dui"] = {
"Dumun",
5314004,
"ngf-yag",
"Latn",
}
m["duk"] = {
"Uyajitaya",
7904085,
"ngf-nur",
"Latn",
}
m["dul"] = {
"Alabat Island Agta",
3399709,
"phi",
"Latn",
}
m["dum"] = {
"Middle Dutch",
178806,
"gmw-frk",
"Latn",
ancestors = "odt",
strip_diacritics = {remove_diacritics = c.circ .. c.macron .. c.diaer},
}
m["dun"] = {
"Dusun Deyah",
2784033,
"poz-bre",
"Latn",
}
m["duo"] = {
"Dupaningan Agta",
5315912,
"phi",
"Latn",
}
m["dup"] = {
"Duano",
3040468,
"poz-mly",
"Latn",
}
m["duq"] = {
"Dusun Malang",
3041711,
"poz-bre",
"Latn",
}
m["dur"] = {
"Dii",
35208,
"alv-dur",
"Latn",
}
m["dus"] = {
"Dumi",
56315,
"sit-kiw",
"Deva",
}
m["duu"] = {
"Drung",
56406,
"sit-nng",
"Latn",
}
m["duv"] = {
"Duvle",
56364,
"paa-lpl",
"Latn",
}
m["duw"] = {
"Dusun Witu",
2381310,
"poz-bre",
"Latn",
}
m["dux"] = {
"Duun",
3914880,
"dmn-smg",
"Latn",
}
m["duy"] = {
"Dicamay Agta",
5272321,
"phi",
"Latn",
}
m["duz"] = {
"Duli",
5313405,
"alv-ada",
"Latn",
}
m["dva"] = {
"Duau",
5310448,
"poz-ocw",
"Latn",
}
m["dwa"] = {
"Diri",
56286,
"cdc-wst",
"Latn",
}
m["dwr"] = {
"Dawro",
12629647,
"omv-nom",
"Ethi, Latn",
}
m["dwu"] = {
"Dhuwal",
3120791,
"aus-yol",
"Latn",
}
m["dww"] = {
"Dawawa",
5242286,
"poz-ocw",
"Latn",
}
m["dwy"] = {
"Dhuwaya",
63348560,
"aus-yol",
"Latn",
}
m["dwz"] = {
"Dewas Rai",
62663667,
"inc-bhi",
}
m["dya"] = {
"Dyan",
35340,
"nic-gur",
"Latn",
}
m["dyb"] = {
"Dyaberdyaber",
5285185,
"aus-nyu",
"Latn",
}
m["dyd"] = {
"Dyugun",
3913785,
"aus-nyu",
"Latn",
}
-- dyg (Villa Viciosa Agta) deleted as extinct and unattested; per Wikipedia: "Villa Viciosa Atta, supposed once spoken
-- in Villaviciosa, Abra, is presumed to be related, but is unattested."
m["dyi"] = {
"Djimini",
35336,
"alv-tdj",
"Latn",
}
m["dym"] = {
"Yanda Dogon",
8048316,
"qfa-dgn",
"Latn",
}
m["dyn"] = {
"Dyangadi",
3913820,
"aus-cww",
"Latn",
}
m["dyo"] = {
"Jola-Fonyi",
3507832,
"alv-jol",
"Latn",
}
m["dyu"] = {
"Dyula",
32706,
"dmn-man",
"Latn",
}
m["dyy"] = {
"Dyaabugay",
2591320,
"aus-yid",
"Latn",
}
m["dza"] = {
"Tunzu",
3915845,
"nic-jer",
"Latn",
}
m["dzg"] = {
"Dazaga",
35244,
"ssa-sah",
"Latn",
}
m["dzl"] = {
"Dzala",
56607,
"sit-ebo",
"Tibt",
override_translit = true,
-- Tibt translit, display_text, strip_diacritics, sort_key in [[Module:scripts/data]]
}
m["dzn"] = {
"Dzando",
5319622,
"bnt-bun",
"Latn",
}
return require("Module:languages").finalizeData(m, "language")
n65t4o1m4kbkc28bw1wn38wd8cty7ir
Module:languages/data/3/o
828
5985
17422
2026-07-13T08:35:01Z
Hiyuune
6766
+
17422
Scribunto
text/plain
local m_langdata = require("Module:languages/data")
-- Loaded on demand, as it may not be needed (depending on the data).
local function u(...)
u = require("Module:string utilities").char
return u(...)
end
local c = m_langdata.chars
local p = m_langdata.puaChars
local s = m_langdata.shared
local m = {}
m["oaa"] = {
"Orok",
33928,
"tuw-nan",
"Cyrl, Latn",
translit = "oaa-translit",
}
m["oac"] = {
"Oroch",
33650,
"tuw-udg",
"Latn, Cyrl",
}
m["oak"] = {
"Noakhali",
107548681,
"inc-bas",
"Beng",
}
m["oav"] = {
"Old Avar",
65455879,
"cau-ava",
"Geor",
-- Geor translit in [[Module:scripts/data]] (NOTE: formerly not present, probably an accidental omission)
}
m["obi"] = {
"Obispeño",
1288385,
"nai-chu",
"Latn",
}
m["obk"] = {
"Southern Bontoc",
63308144,
"phi",
"Latn",
}
m["obl"] = {
"Oblo",
36309,
}
m["obm"] = {
"Moabite",
36385,
"sem-can",
-- Phnx translit in [[Module:scripts/data]]
}
m["obo"] = {
"Obo Manobo",
12953699,
"mno",
"Latn",
}
m["obr"] = {
"Old Burmese",
17006600,
"tbq-brm",
"Mymr, Latn", --and also Pallava
}
m["obt"] = {
"Old Breton",
3558112,
"cel-brs",
"Latn",
}
m["obu"] = {
"Obulom",
3813403,
"nic-cde",
"Latn",
}
m["oca"] = {
"Ocaina",
3182577,
"sai-wit",
"Latn",
}
m["och"] = {
"Old Chinese",
35137,
"zhx",
"Hant",
translit = "zh-translit",
sort_key = "Hani-sortkey",
}
m["ocm"] = {
"Old Cham",
105197086,
"cmc",
"Latn", -- the script in which entries are currently entered in Wiktionary; its native script is not in ISO or Unicode yet
}
m["oco"] = {
"Old Cornish",
48304520,
"cel-brs",
"Latn",
}
m["ocu"] = {
"Tlahuica",
10751739,
"omq",
"Latn",
}
m["oda"] = {
"Odut",
3915388,
"nic-uce",
"Latn",
ancestors = "mfn",
}
m["odk"] = {
"Od",
7077191,
"inc-wes",
"Arab",
}
m["odt"] = {
"Old Dutch",
443089,
"gmw-frk",
"Latn, Runr",
strip_diacritics = {remove_diacritics = c.circ .. c.macron},
}
m["odu"] = {
"Odual",
3813392,
"nic-cde",
"Latn",
}
m["ofo"] = {
"Ofo",
3349758,
"sio-ohv",
}
m["ofs"] = {
"Old Frisian",
35133,
"gmw-fri",
"Latn",
strip_diacritics = {remove_diacritics = c.circ .. c.macron},
sort_key = {
from = {"æ", "ð", "þ"},
to = {"ae", "t" .. p[1], "t" .. p[2]}
},
}
m["ofu"] = {
"Efutop",
35297,
"nic-eko",
"Latn",
}
m["ogb"] = {
"Ogbia",
3813400,
"nic-cde",
"Latn",
}
m["ogc"] = {
"Ogbah",
36291,
"alv-igb",
"Latn",
}
m["oge"] = {
"Old Georgian",
34834,
"ccs-gzn",
"Geor, Geok",
-- Geor, Geok translit in [[Module:scripts/data]]
override_translit = true,
strip_diacritics = {remove_diacritics = c.circ},
}
m["ogg"] = {
"Ogbogolo",
3813405,
"nic-cde",
"Latn",
}
m["ogo"] = {
"Khana",
3914409,
"nic-ogo",
"Latn",
}
m["ogu"] = {
"Ogbronuagum",
3914485,
"nic-cde",
"Latn",
}
m["ohu"] = {
"Old Hungarian",
65455880,
"urj-ugr",
"Latn, Hung",
}
m["oia"] = {
"Oirata",
56738,
"paa-eti",
"Latn",
}
m["oin"] = {
"Inebu One",
12953782,
"paa-trr",
"Latn",
}
m["ojb"] = {
"Northwestern Ojibwa",
7060356,
"alg",
"Latn",
ancestors = "oj",
}
m["ojc"] = {
"Central Ojibwa",
5061548,
"alg",
"Latn",
ancestors = "oj",
}
m["ojg"] = {
"Eastern Ojibwa",
5330342,
"alg",
"Latn",
ancestors = "oj",
}
m["ojp"] = {
"Old Japanese",
5736700,
"jpx",
"Jpan",
display_text = s["jpx-displaytext"],
strip_diacritics = s["jpx-stripdiacritics"],
sort_key = s["jpx-sortkey"],
}
m["ojs"] = {
"Severn Ojibwa",
56494,
"alg",
"Latn",
ancestors = "oj",
}
m["ojv"] = {
"Ontong Java",
7095071,
"poz-pnp",
"Latn",
}
m["ojw"] = {
"Western Ojibwa",
3474222,
"alg",
"Latn",
ancestors = "oj",
}
m["oka"] = {
"Okanagan",
2984602,
"sal",
"Latn",
}
m["okb"] = {
"Okobo",
3813398,
"nic-lcr",
"Latn",
}
m["okd"] = {
"Okodia",
36300,
"ijo",
"Latn",
}
m["oke"] = {
"Okpe (Southwestern Edo)",
268924,
"alv-swd",
"Latn",
}
m["okg"] = {
"Kok-Paponk",
55254102,
"aus-pmn",
"Latn",
}
m["okh"] = {
"Koresh-e Rostam",
6432160,
"xme-ttc",
ancestors = "xme-ttc-cen",
}
m["oki"] = {
"Okiek",
56367,
"sdv-kln",
"Latn",
}
m["okj"] = {
"Oko-Juwoi",
3436832,
"qfa-adc",
}
m["okk"] = {
"Kwamtim One",
19830649,
"paa-trr",
"Latn",
}
m["okl"] = {
"Old Kentish Sign Language",
7084319,
"sgn",
}
m["okm"] = {
"Middle Korean",
715339,
"qfa-kor",
"Kore, Latn",
ancestors = "oko",
translit = "okm-translit",
sort_key = "okm-sortkey",
-- Kore strip_diacritics in [[Module:scripts/data]]
}
m["okn"] = {
"Okinoerabu",
3350036,
"jpx-nry",
"Jpan",
translit = s["jpx-translit"],
display_text = s["jpx-displaytext"],
strip_diacritics = s["jpx-stripdiacritics"],
sort_key = s["jpx-sortkey"],
}
m["oko"] = {
"Old Korean",
715364,
"qfa-kor",
"Kore",
-- Kore strip_diacritics in [[Module:scripts/data]]
}
m["okr"] = {
"Kirike",
11006763,
"ijo",
"Latn",
}
m["oks"] = {
"Oko-Eni-Osayen",
36302,
"alv-von",
"Latn",
}
m["oku"] = {
"Oku",
36289,
"nic-rnc",
"Latn",
}
m["okv"] = {
"Orokaiva",
7103752,
"ngf-oro",
"Latn",
}
m["okx"] = {
"Okpe (Northwestern Edo)",
7082547,
"alv-nwd",
"Latn",
}
m["okz"] = {
"Old Khmer",
9205,
"mkh-kmr",
"Latn, Khmr", --and also Khom, Pallava
}
m["old"] = {
"Mochi",
12952852,
"bnt-chg",
"Latn",
}
m["ole"] = {
"Olekha",
3695204,
"sit",
"Tibt, Latn",
override_translit = true,
-- Tibt translit, display_text, strip_diacritics, sort_key in [[Module:scripts/data]]
}
m["olm"] = {
"Oloma",
3441166,
"alv-nwd",
"Latn",
}
m["olo"] = {
"Livvi",
36584,
"urj-fin",
"Latn",
}
m["olr"] = {
"Olrat",
3351562,
"poz-vnn",
"Latn",
}
m["olt"] = {
"Old Lithuanian",
17417801,
"bat-eas",
"Latn",
display_text = "lt-common",
strip_diacritics = {remove_diacritics = c.grave .. c.acute .. c.tilde},
}
m["olu"] = {
"Kuvale",
6448765,
"bnt-swb",
"Latn",
}
m["oma"] = {
"Omaha-Ponca",
2917968,
"sio-dhe",
"Latn",
}
m["omb"] = {
"Omba",
2841471,
"poz-vnn",
"Latn",
}
m["omc"] = {
"Mochica",
1951641,
"qfa-iso",
"Latn",
}
m["omg"] = {
"Omagua",
33663,
"tup-gua",
"Latn",
}
m["omi"] = {
"Omi",
56795,
"csu-mma",
}
m["omk"] = {
"Omok",
4334657,
"qfa-yuk",
"Cyrl",
translit = "omk-translit",
}
m["oml"] = {
"Ombo",
7089928,
"bnt-tet",
"Latn",
}
m["omn"] = {
"Minoan",
1669994,
"qfa-unc", -- undeciphered
"Lina",
}
m["omo"] = {
"Utarmbung",
7902577,
"ngf-sad",
"Latn",
}
m["omp"] = {
"Old Manipuri",
105953310,
"sit",
"Mtei",
translit = "Mtei-translit",
}
m["omr"] = {
"Old Marathi",
65455881,
"inc-sou",
"Deva, Modi",
translit = {
Deva = "sa-translit",
Modi = "Modi-translit",
},
}
m["omt"] = {
"Omotik",
36313,
"sdv-nis",
}
m["omu"] = {
"Omurano",
1957612,
}
m["omw"] = {
"South Tairora",
20210553,
"ngf-tai",
"Latn",
}
m["omx"] = {
"Old Mon",
111364697,
"mkh-mnc",
"Mymr, Latn", --and also Pallava
}
m["ona"] = {
"Selk'nam",
2721227,
"sai-cho",
"Latn",
}
m["onb"] = {
"Lingao",
7093790,
"qfa-onb",
"Latn",
}
m["one"] = {
"Oneida",
857858,
"iro-nor",
"Latn",
}
m["ong"] = {
"Olo",
592162,
"paa-wap",
"Latn",
}
m["oni"] = {
"Onin",
7093910,
"poz-cet",
"Latn",
}
m["onj"] = {
"Onjob",
7093968,
"ngf-dag",
"Latn",
}
m["onk"] = {
"Kabore One",
12953783,
"paa-trr",
"Latn",
}
m["onn"] = {
"Onobasulu",
7094437,
"ngf-bos",
"Latn",
}
m["ono"] = {
"Onondaga",
1077450,
"iro-nor",
"Latn",
ancestors = "iro-oon",
}
m["onp"] = {
"Sartang",
7424639,
"sit-khm",
"Latn, Deva",
}
m["onr"] = {
"Northern One",
19830648,
"paa-trr",
"Latn",
}
m["ons"] = {
"Ono",
11732548,
"ngf-ehu",
"Latn",
}
--ont (Ontenu) treated as variety of gaj (Gadsup) per [[Wiktionary:Language_treatment_requests#Merge_Ontenu_into_Gadsup]]
m["onu"] = {
"Unua",
3552042,
"poz-vnc",
"Latn",
}
m["onw"] = {
"Old Nubian",
2268,
"nub",
"Copt",
translit = "Copt-translit",
sort_key = "Copt-sortkey",
}
m["onx"] = {
"Pidgin Onin",
12953788,
"crp",
"Latn",
ancestors = "oni",
}
m["ood"] = {
"O'odham",
2393095,
"azc-pim",
"Latn",
}
m["oog"] = {
"Ong",
12953787,
"mkh-kat",
}
m["oon"] = {
"Önge",
2475551,
"qfa-ong",
"Latn",
}
m["oor"] = {
"Oorlams",
2484337,
}
m["opa"] = {
"Okpamheri",
3913331,
"alv-nwd",
"Latn",
}
m["opk"] = {
"Kopkaka",
6431129,
"ngf-wok",
"Latn",
}
m["opm"] = {
"Oksapmin",
1068097,
"ngf", -- per Glottolog, in an Ok-Oksapmin family, under Awyu-Ok, under Asmat-Awyu-Ok, but we don't have these
"Latn",
}
m["opo"] = {
"Opao",
7095585,
"paa-wel",
"Latn",
}
m["opt"] = {
"Opata",
2304583,
"azc-trc",
"Latn",
}
m["opy"] = {
"Ofayé",
3446691,
"sai-mje",
"Latn",
}
m["ora"] = {
"Oroha",
36298,
"poz-sls",
"Latn",
}
m["ore"] = {
"Orejón",
3355834,
"sai-tuc",
"Latn",
}
m["org"] = {
"Oring",
3915308,
"nic-ucn",
"Latn",
}
m["orh"] = {
"Oroqen",
1367309,
"tuw-ewe",
"Latn",
}
m["oro"] = {
"Orokolo",
7103758,
"paa-wel",
"Latn",
}
m["orr"] = {
"Oruma",
36299,
"ijo",
"Latn",
}
m["ort"] = {
"Adivasi Odia",
12953791,
"inc-eas",
"Orya",
ancestors = "or",
}
m["oru"] = {
"Ormuri",
33740,
"ira-orp",
"fa-Arab",
}
m["orv"] = {
"Old East Slavic",
35228,
"zle",
"Cyrs",
translit = {Cyrs = "Cyrs-translit"},
-- Cyrs strip_diacritics, sort_key in [[Module:scripts/data]]
}
m["orw"] = {
"Oro Win",
3450423,
"sai-cpc",
"Latn",
}
m["orx"] = {
"Oro",
3813396,
"nic-lcr",
"Latn",
}
m["orz"] = {
"Ormu",
7103494,
"poz-ocw",
"Latn",
}
m["osa"] = {
"Osage",
2600085,
"sio-dhe",
"Latn, Osge",
}
m["osc"] = {
"Oscan",
36653,
"itc-sbl",
"Ital, Latn, Polyt",
display_text = {
Latn = s["itc-Latn-displaytext"],
},
strip_diacritics = {
Latn = s["itc-Latn-stripdiacritics"],
},
sort_key = {
Latn = s["itc-Latn-sortkey"],
},
-- Ital translit in [[Module:scripts/data]]
-- Polyt translit, display_text, strip_diacritics, sort_key in [[Module:scripts/data]]
}
m["osi"] = {
"Osing",
2701322,
"poz",
"Latn",
}
m["osn"] = {
"Old Sundanese",
56197074,
"poz-msa",
"Latn, Sund, Kawi",
}
m["oso"] = {
"Ososo",
3913398,
"alv-yek",
"Latn",
}
m["osp"] = {
"Old Spanish",
1088025,
"roa-cas",
"Latn",
}
m["ost"] = {
"Osatu",
36243,
"nic-grs",
"Latn",
}
m["osu"] = {
"Southern One",
12953785,
"paa-trr",
"Latn",
}
m["osx"] = {
"Old Saxon",
35219,
"gmw-lgm",
"Latn",
strip_diacritics = {remove_diacritics = c.circ .. c.macron},
}
m["ota"] = {
"Ottoman Turkish",
36730,
"trk-ogz",
"ota-Arab, Armn",
ancestors = "trk-oat",
strip_diacritics = {
["ota-Arab"] = {
remove_diacritics = c.fathatan .. c.dammatan .. c.kasratan .. c.fatha .. c.damma .. c.kasra .. c.shadda .. c.sukun .. c.superalef,
from = {"گ", "ڭ", "ۀ"},
to = {"ك", "ك", "ه"}
},
Armn = {
from = {"՚"},
to = {"’"}
},
},
translit = {Armn = "ota-Armn-translit"},
standard_chars = {
["ota-Arab"] = "آاأبپتثجچحخدذرزژسشصضطظعغفقكلمنوؤهیئةءـ",
c.punc
},
}
m["otb"] = {
"Old Tibetan",
7085214,
"sit-tib",
"Tibt",
override_translit = true,
-- Tibt translit, display_text, strip_diacritics, sort_key in [[Module:scripts/data]]
}
m["otd"] = {
"Ot Danum",
3033781,
"poz-brw",
"Latn",
}
m["ote"] = {
"Mezquital Otomi",
23755711,
"oto-otm",
"Latn",
}
m["oti"] = {
"Oti",
3357881,
}
m["otk"] = {
"Old Turkic",
34988,
"trk-sib",
"Orkh, Sogd",
-- Orkh translit in [[Module:scripts/data]]
}
m["otl"] = {
"Tilapa Otomi",
7802050,
"oto-otm",
"Latn",
}
m["otm"] = {
"Eastern Highland Otomi",
13581718,
"oto-otm",
"Latn",
}
m["otn"] = {
"Tenango Otomi",
25559589,
"oto-otm",
"Latn",
}
m["otq"] = {
"Querétaro Otomi",
23755688,
"oto-otm",
"Latn",
}
m["otr"] = {
"Otoro",
36328,
"alv-hei",
}
m["ots"] = {
"Estado de México Otomi",
7413841,
"oto-otm",
"Latn",
}
m["ott"] = {
"Temoaya Otomi",
7698191,
"oto-otm",
"Latn",
}
m["otu"] = {
"Otuke",
7110049,
"sai-mje",
"Latn",
}
m["otw"] = {
"Ottawa",
133678,
"alg",
"Latn",
ancestors = "oj",
}
m["otx"] = {
"Texcatepec Otomi",
25559590,
"oto-otm",
"Latn",
}
m["oty"] = {
"Old Tamil",
20987452,
"dra-tam",
"Brah",
-- Brah translit in [[Module:scripts/data]]
}
m["otz"] = {
"Ixtenco Otomi",
6101171,
"oto-otm",
"Latn",
}
m["oub"] = {
"Glio-Oubi",
3914977,
"kro-grb",
}
m["oue"] = {
"Oune",
7110521,
"paa-sbo",
"Latn",
}
m["oui"] = {
"Old Uyghur",
428299,
"trk-ssb",
"Ougr, Latn, Hani, Phag, Brah, Mani, Syrc, Orkh, Sogd, Arab, mnc-Mong, Sogo, Tibt",
ancestors = "otk",
translit = {
Ougr = "Ougr-translit",
-- Orkh translit in [[Module:scripts/data]]
-- Mani translit in [[Module:scripts/data]]
-- mnc-Mong translit in [[Module:scripts/data]] (NOTE: Formerly not present; I assume accidentally left out)
-- Brah translit in [[Module:scripts/data]]
},
-- Tibt translit, display_text, strip_diacritics, sort_key in [[Module:scripts/data]]
-- NOTE: Formerly there was only a sort_key for Tibetan. I assume the other three were left out accidentally.
sort_key = {
Hani = "Hani-sortkey",
},
}
m["oum"] = {
"Ouma",
7110494,
"poz-ocw",
"Latn",
}
m["ovd"] = {
"Elfdalian",
254950,
"gmq-eas",
ancestors = "gmq-osw",
"Latn, Runr",
}
m["owi"] = {
"Owiniga",
56454,
"paa-lma",
"Latn",
}
m["owl"] = {
"Old Welsh",
2266723,
"cel-brw",
"Latn",
}
m["oyb"] = {
"Oy",
13593748,
"mkh-ban",
}
m["oyd"] = {
"Oyda",
7116251,
"omv-nom",
"Latn",
}
m["oym"] = {
"Wayampi",
7975842,
"tup-gua",
"Latn",
}
m["oyy"] = {
"Oya'oya",
7116243,
"poz-ocw",
"Latn",
}
m["ozm"] = {
"Koonzime",
35566,
"bnt-ndb",
"Latn",
}
return require("Module:languages").finalizeData(m, "language")
o4fme5na31kfl6hsjv83lay69byr3v7
Module:languages/data/3/f
828
5986
17423
2026-07-13T08:38:13Z
Hiyuune
6766
+
17423
Scribunto
text/plain
local m_langdata = require("Module:languages/data")
-- Loaded on demand, as it may not be needed (depending on the data).
local function u(...)
u = require("Module:string utilities").char
return u(...)
end
local c = m_langdata.chars
local p = m_langdata.puaChars
local s = m_langdata.shared
local m = {}
m["faa"] = {
"Fasu",
3446687,
"qfa-dis", -- Papuan; isolate or in the proposed Kutubuan family
"Latn",
}
m["fab"] = {
"Annobonese",
34992,
"crp",
"Latn",
ancestors = "pt",
}
m["fad"] = {
"Wagi",
7959569,
"ngf-han",
"Latn",
}
m["faf"] = {
"Fagani",
3063759,
"poz-sls",
"Latn",
}
m["fag"] = {
"Finongan",
3450761,
"ngf-era",
"Latn",
}
m["fah"] = {
"Baissa Fali",
3446632,
"nic-bco",
"Latn",
}
m["fai"] = {
"Faiwol",
3501773,
"ngf-mok",
"Latn",
}
m["faj"] = {
"Kursav",
976953,
"ngf-eso",
"Latn",
}
m["fak"] = {
"Fang (Beboid)",
5433811,
"nic-beb",
"Latn",
}
m["fal"] = {
"South Fali",
15637351,
"alv-fli",
"Latn",
}
m["fam"] = {
"Fam",
35290,
"nic-mmb",
"Latn",
}
m["fan"] = {
"Fang (Bantu)",
33484,
"bnt-btb",
"Latn",
}
m["fap"] = {
"Palor",
36318,
"alv-cng",
"Latn",
}
m["far"] = {
"Fataleka",
3067168,
"poz-sls",
"Latn",
}
-- "fat" is treated as "ak", see [[WT:LT]]
m["fau"] = {
"Fayu",
5439113,
"paa-wlp",
"Latn",
}
m["fax"] = {
"Fala",
300402,
"roa-gap",
"Latn",
}
m["fay"] = {
"Southwestern Fars",
5228140,
"ira-swi",
"Arab",
}
m["faz"] = {
"Northwestern Fars",
7060307,
"ira-swi",
}
m["fbl"] = {
"West Miraya Bikol",
18603801,
"phi",
"Latn",
}
m["fcs"] = {
"Quebec Sign Language",
13193,
"sgn",
"Latn", -- when documented
}
m["fer"] = {
"Feroge",
35287,
"nic-ser",
"Latn",
}
m["ffi"] = {
"Foia Foia",
8564176,
"paa-wig",
"Latn",
}
-- "ffm" is treated as "ff", see [[WT:LT]]
m["fgr"] = {
"Fongoro",
3437645,
"csu",
"Latn",
}
m["fia"] = {
"Nobiin",
36503,
"nub",
"Latn, Arab, Copt",
ancestors = "onw",
translit = {
Copt = "Copt-translit",
},
sort_key = {
Copt = "Copt-sortkey",
},
}
m["fie"] = {
"Fyer",
56273,
"cdc-wst",
"Latn",
}
m["fif"] = {
"Faifi",
85760309,
"sem-cen", -- conservatively putting undifferentiated sem-cen, there's debate over if it's OSA or Arabic
"Arab", -- or IPA/Latn; mostly it is unwritten
-- ancestors = "sem-srb", if one accepts the view that like Razihi it is sem-osa
}
-- "fil" is treated as "tl", see [[WT:LT]]
m["fip"] = {
"Fipa",
667747,
"bnt-mwi",
"Latn",
}
m["fir"] = {
"Firan",
3915847,
"nic-plc",
"Latn",
}
m["fit"] = {
"Meänkieli",
13357,
"urj-fin",
"Latn",
ancestors = "fi",
}
m["fiw"] = {
"Fiwaga",
5456292,
"ngf-eku",
"Latn",
}
m["fkk"] = {
"Kirya-Konzel",
6416310,
"cdc-cbm",
"Latn",
}
m["fkv"] = {
"Kven",
165795,
"urj-fin",
"Latn",
ancestors = "fi",
}
m["fla"] = {
"Montana Salish",
3111983,
"sal",
"Latn",
}
m["flh"] = {
"Foau",
5463819,
"paa-elp",
"Latn",
}
m["fli"] = {
"Fali",
56244,
"cdc-cbm",
"Latn",
}
m["fll"] = {
"North Fali",
12952419,
"alv-fli",
"Latn",
}
m["fln"] = {
"Flinders Island",
3915702,
"aus-pmn",
"Latn",
}
m["flr"] = {
"Fuliiru",
7166821,
"bnt-shh",
"Latn",
}
m["fly"] = {
"Tsotsitaal",
12643960,
"crp",
"Latn",
ancestors = "af",
}
m["fmp"] = {
"Fe'fe'",
35276,
"bai",
"Latn",
}
m["fmu"] = {
"Far Western Muria",
42589412,
"dra-mur",
"Deva",
}
m["fng"] = {
"Fanagalo",
35727,
"crp",
"Latn",
ancestors = "zu",
}
m["fni"] = {
"Fania",
317642,
"alv-bua",
"Latn",
}
m["fod"] = {
"Foodo",
5465566,
"alv-gng",
"Latn",
}
m["foi"] = {
"Foi",
5464146,
"ngf-eku",
"Latn",
}
m["fom"] = {
"Foma",
5464911,
"bnt-ske",
"Latn",
ancestors = "khy",
}
m["fon"] = {
"Fon",
33291,
"alv-gbe",
"Latn",
}
m["for"] = {
"Fore",
3077126,
"ngf-fgi",
"Latn",
}
m["fos"] = {
"Siraya",
716604,
"map",
"Latn",
}
m["fpe"] = {
"Pichinglis",
35288,
"crp",
"Latn",
ancestors = "en",
}
m["fqs"] = {
"Fas",
56320,
"paa-fas",
"Latn",
}
-- "frc" is treated as "fr" (or as etymology-only), see [[WT:LT]]
m["frd"] = {
"Fordata",
5468035,
"poz-cet",
"Latn",
}
m["frm"] = {
"Middle French",
1473289,
"roa-oil",
"Latn",
sort_key = s["roa-oil-sortkey"],
}
m["fro"] = {
"Old French",
35222,
"roa-oil",
"Latn, Hebr",
sort_key = {
Latn = s["roa-oil-sortkey"],
},
-- Hebr display_text, strip_diacritics, sort_key in [[Module:scripts/data]]
}
m["frp"] = {
"Franco-Provençal",
15087,
"roa-grh",
"Latn",
ancestors = "frp-old",
sort_key = {
remove_diacritics = c.grave .. c.acute .. c.circ .. c.diaer .. c.cedilla .. "'",
from = {"æ", "œ"},
to = {"ae", "oe"}
},
}
m["frq"] = {
"Forak",
5467173,
"ngf-war",
"Latn",
}
m["frr"] = {
"North Frisian",
28224,
"gmw-fri",
"Latn",
}
-- "frs" is not used, see [[WT:LT]]
m["frt"] = {
"Fortsenal",
2666835,
"poz-vnn",
"Latn",
}
m["fse"] = {
"Finnish Sign Language",
33225,
"sgn",
"Latn", -- when documented
}
m["fsl"] = {
"French Sign Language",
33302,
"sgn-fsl",
"Latn", -- when documented
}
m["fss"] = {
"Finnish-Swedish Sign Language",
5450448,
"sgn",
"Latn", -- when documented
}
-- "fub" is treated as "ff", see [[WT:LT]]
-- "fuc" is treated as "ff", see [[WT:LT]]
m["fud"] = {
"East Futuna",
35334,
"poz-pnp",
"Latn",
}
-- "fue" is treated as "ff", see [[WT:LT]]
-- "fuf" is treated as "ff", see [[WT:LT]]
-- "fuh" is treated as "ff", see [[WT:LT]]
-- "fui" is treated as "ff", see [[WT:LT]]
m["fuj"] = {
"Ko",
35693,
"alv-hei",
"Latn",
}
m["fum"] = {
"Fum",
11011870,
"nic-nka",
"Latn",
}
m["fun"] = {
"Fulniô",
774441,
"qfa-iso",
"Latn",
}
-- "fuq" is treated as "ff", see [[WT:LT]]
m["fur"] = {
"Friulian",
33441,
"roa-rhe",
ancestors = "fur-old",
"Latn",
}
m["fut"] = {
"Futuna-Aniwa",
3064409,
"poz-pnp",
"Latn",
}
m["fuu"] = {
"Furu",
3441160,
"csu-bkr",
"Latn",
}
-- "fuv" is treated as "ff", see [[WT:LT]]
m["fuy"] = {
"Fuyug",
3073472,
"qfa-dis", -- Papuan; isolate per Glottolog and Usher (2020), only tentatively retained in putative Goilalan family
-- within TNG by Ross (2005)
"Latn",
}
m["fvr"] = {
"Fur",
33364,
"ssa-fur",
"Latn",
}
m["fwa"] = {
"Fwâi",
3091331,
"poz-cln",
"Latn",
}
m["fwe"] = {
"Fwe",
5511159,
"bnt-bot",
"Latn",
}
return require("Module:languages").finalizeData(m, "language")
86w2rcjby61acjk04sf0woez7t69z0g
Module:etymology languages/data
828
5987
17424
2026-07-13T08:38:41Z
Hiyuune
6766
+
17424
Scribunto
text/plain
local m_langdata = require("Module:languages/data")
-- Loaded on demand, as it may not be needed (depending on the data).
local function u(...)
u = require("Module:string utilities").char
return u(...)
end
local c = m_langdata.chars
local p = m_langdata.puaChars
local s = m_langdata.shared
local m = {}
----------------------------------------------------------------------------------------------------------------------
-- Afroasiatic varieties --
----------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------
-- Berber varieties --
--------------------------------------------------------------------------------------
m["shi-med"] = {
"Medieval Tashelhit",
34152,
"shi",
}
-- Tuareg lects
m["thv"] = {
"Tamahaq",
56703,
"tmh",
}
m["ttq"] = {
"Tawellemmet",
56390,
"tmh",
}
m["taq"] = {
"Tamasheq",
4670066,
"tmh",
}
m["thz"] = {
"Tayert",
56388,
"tmh",
}
m["thv-ght"] = {
"Ghat",
47012900,
"thv",
}
--------------------------------------------------------------------------------------
-- Cushitic varieties --
--------------------------------------------------------------------------------------
-- Oromo varieties
m["hae"] = {
"Harar Oromo",
5330355,
"om",
aliases = {"Eastern Oromo"},
}
m["gax"] = {
"Borana",
2910610,
"om",
aliases = {"Southern Oromo"},
}
m["orc"] = {
"Orma",
2919128,
"om",
}
m["ssn"] = {
"Waata",
3501553,
"om",
}
--------------------------------------------------------------------------------------
-- Egyptian varieties --
--------------------------------------------------------------------------------------
-----------------------------------------------------
-- Ancient Egyptian varieties --
-----------------------------------------------------
m["egy-old"] = {
"Old Egyptian",
447117,
"egy",
}
m["egy-mid"] = {
"Middle Egyptian",
657330,
"egy",
aliases = {"Classical Egyptian"},
}
m["egy-nmi"] = {
"Neo-Middle Egyptian",
123735278,
"egy",
aliases = {"Égyptien de tradition", "Traditional Egyptian"},
}
m["egy-lat"] = {
"Late Egyptian",
1852329,
"egy",
}
-----------------------------------------------------
-- Coptic varieties --
-----------------------------------------------------
m["cop-akh"] = {
"Akhmimic Coptic",
125176464,
"cop",
aliases = {"Akhmimic"},
}
m["cop-boh"] = {
"Bohairic Coptic",
890733,
"cop",
aliases = {"Bohairic", "Memphitic Coptic", "Memphitic"},
}
m["cop-ggg"] = {
"Coptic Dialect G",
nil,
"cop",
aliases = {"Dialect G", "Mansuric Coptic", "Mansuric"},
}
m["cop-jjj"] = {
"Coptic Dialect J",
nil,
"cop",
}
m["cop-kkk"] = {
"Coptic Dialect K",
nil,
"cop",
}
m["cop-ppp"] = {
"Coptic Dialect P",
nil,
"cop",
aliases = {"Proto-Theban Coptic", "Palaeo-Theban Coptic"},
}
m["cop-fay"] = {
"Fayyumic Coptic",
1399115,
"cop",
aliases = {"Fayyumic", "Faiyumic Coptic", "Faiyumic", "Fayumic Coptic", "Fayumic",
"Bashmuric Coptic", "Bashmuric"},
}
m["cop-her"] = {
"Hermopolitan Coptic",
nil,
"cop",
aliases = {"Hermopolitan", "Coptic Dialect H", "Ashmuninic", "Ashmuninic Coptic"},
}
m["cop-lyc"] = {
"Lycopolitan Coptic",
nil,
"cop",
aliases = {
"Lycopolitan",
"Assiutic Coptic", "Asyutic Coptic", "Assiutic", "Asyutic",
"Lyco-Diospolitan Coptic", "Lyco-Diospolitan",
"Subakhmimic Coptic", "Subakhmimic"
},
}
m["cop-old"] = {
"Old Coptic",
115518040,
"cop",
}
m["cop-oxy"] = {
"Oxyrhynchite Coptic",
nil,
"cop",
aliases = {"Oxyrhynchite", "Mesokemic Coptic", "Mesokemic", "Middle Egyptian Coptic"},
}
m["cop-ply"] = {
"Proto-Lycopolitan Coptic",
nil,
"cop",
aliases = {"Coptic Dialect i", "Proto-Lyco-Diospolitan Coptic"},
}
m["cop-sah"] = {
"Sahidic Coptic",
2645851,
"cop",
aliases = {"Sahidic", "Saidic Coptic", "Saidic", "Thebaic Coptic", "Thebaic"},
}
--------------------------------------------------------------------------------------
-- Semitic varieties --
--------------------------------------------------------------------------------------
-----------------------------------------------------
-- Akkadian varieties --
-----------------------------------------------------
m["akk-old"] = {
"Old Akkadian",
nil,
"akk",
}
m["akk-obb"] = {
"Old Babylonian",
nil,
"akk",
}
m["akk-oas"] = {
"Old Assyrian",
nil,
"akk",
}
m["akk-mbb"] = {
"Middle Babylonian",
nil,
"akk",
}
m["akk-mas"] = {
"Middle Assyrian",
nil,
"akk",
}
m["akk-nbb"] = {
"Neo-Babylonian",
nil,
"akk",
}
m["akk-nas"] = {
"Neo-Assyrian",
nil,
"akk",
}
m["akk-lbb"] = {
"Late Babylonian",
nil,
"akk",
}
m["akk-stb"] = {
"Standard Babylonian",
nil,
"akk",
}
-----------------------------------------------------
-- Arabic varieties --
-----------------------------------------------------
m["jrb"] = {
"Judeo-Arabic",
37733,
"ar",
pseudo_families = "qfa-jew",
}
m["apc-leb"] = {
"Lebanese North Levantine Arabic",
1516642,
"apc",
aliases = {"Lebanese Arabic"},
}
m["apc-sle"] = {
"South Lebanese North Levantine Arabic",
14206590,
"apc",
aliases = {"South Lebanese Arabic"},
}
m["apc-nle"] = {
"North Lebanese North Levantine Arabic",
nil,
"apc",
aliases = {"North Lebanese Arabic"},
}
m["apc-syr"] = {
"Syrian North Levantine Arabic",
2143071,
"apc",
aliases = {"Syrian Arabic"},
}
m["apc-ale"] = {
"Aleppine North Levantine Arabic",
7056921,
"apc-syr",
aliases = {"Aleppo Arabic", "Aleppine Arabic"},
}
m["apc-dam"] = {
"Damascene North Levantine Arabic",
12237466,
"apc-syr",
aliases = {"Damascus Arabic", "Damascene Arabic"},
}
m["acm-khu"] = {
"Khuzestani Arabic",
1040944,
"acm",
}
-----------------------------------------------------
-- Aramaic varieties --
-----------------------------------------------------
m["arc-bib"] = {
"Biblical Aramaic",
843235,
"arc",
family = "sem-are",
}
m["arc-cpa"] = {
"Christian Palestinian Aramaic",
60790119,
"arc",
family = "sem-arw",
aliases = {"Melkite Aramaic", "Palestinian Syriac", "Syropalestinian Aramaic"},
}
m["arc-imp"] = {
"Imperial Aramaic",
7079491,
"arc",
aliases = {"Official Aramaic"},
}
m["arc-hat"] = {
"Hatran Aramaic",
3832926,
"arc",
family = "sem-are",
}
m["arc-jla"] = {
"Jewish Literary Aramaic",
105952842,
"arc",
pseudo_families = "qfa-jew",
}
m["arc-nab"] = {
"Nabataean Aramaic",
36178,
"arc",
}
m["arc-old"] = {
"Old Aramaic",
3398392,
"arc",
}
m["arc-pal"] = {
"Palmyrene Aramaic",
1510113,
"arc",
family = "sem-arw",
}
m["tmr"] = {
"Jewish Babylonian Aramaic",
33407,
"arc",
family = "sem-ase",
pseudo_families = "qfa-jew",
}
m["jpa"] = {
"Jewish Palestinian Aramaic",
948909,
"arc",
family = "sem-arw",
aliases = {"Galilean Aramaic"},
pseudo_families = "qfa-jew",
}
-----------------------------------------------------
-- Hebrew varieties --
-----------------------------------------------------
m["hbo"] = {
"Biblical Hebrew",
1982248,
"he",
aliases = {"Classical Hebrew"},
}
m["he-mis"] = {
"Mishnaic Hebrew",
1649362,
"he",
ancestors = "hbo",
}
m["he-med"] = {
"Medieval Hebrew",
2712572,
"he",
ancestors = "he-mis",
}
m["he-IL"] = {
"Israeli Hebrew",
8141,
"he",
}
----------------------------------------------------------------------------------------------------------------------
-- Ainu varieties --
----------------------------------------------------------------------------------------------------------------------
m["ain-hok"] = {
"Hokkaido Ainu",
20968488,
"ain",
aliases = {"Hokkaidō Ainu"},
}
m["ain-kur"] = {
"Kuril Ainu",
20967012,
"ain",
}
m["ain-sak"] = {
"Sakhalin Ainu",
20747371,
"ain",
}
----------------------------------------------------------------------------------------------------------------------
-- American indigenous varieties --
----------------------------------------------------------------------------------------------------------------------
-----------------------------------------------------
-- Inuit varieties --
-----------------------------------------------------
m["esi"] = {
"North Alaskan Inupiatun",
nil,
"ik"
}
m["esk"] = {
"Northwest Alaskan Inupiatun",
25559714,
"ik"
}
-----------------------------------------------------
-- Iroquoian varieties --
-----------------------------------------------------
m["iro-ohu"] = {
"Old Wendat",
nil,
"wdt",
}
m["iro-omo"] = {
"Old Mohawk",
nil,
"moh",
}
m["iro-oon"] = {
"Old Onondaga",
nil,
"ono",
}
-----------------------------------------------------
-- Tupi-Guarani varieties --
-----------------------------------------------------
-- Old Tupi varieties
m["tpw-lga"] = {
"Língua Geral Amazônica",
18275323,
"tpw",
aliases = {"Língua Geral"},
}
m["tpw-lgp"] = {
"Língua Geral Paulista",
2669239,
"tpw",
}
----------------------------------------------------------------------------------------------------------------------
-- Austroasiatic varieties --
----------------------------------------------------------------------------------------------------------------------
-- Khmer varieties
m["okz-ang"] = {
"Angkorian Old Khmer",
nil,
"okz",
wikipedia_article = "Khmer language#Historical periods",
}
m["okz-pre"] = {
"Pre-Angkorian Old Khmer",
nil,
"okz",
wikipedia_article = "Khmer language#Historical periods",
}
-- Central Nicobarese varieties
m["ncb-cam"] = {
"Camorta",
5026908,
"ncb",
aliases = {"Kamorta"},
}
m["ncb-kat"] = {
"Katchal",
17064263,
"ncb",
aliases = {"Tehnu"},
}
m["ncb-nan"] = {
"Nancowry",
6962504,
"ncb",
aliases = {"Nankwari"},
}
----------------------------------------------------------------------------------------------------------------------
-- Austronesian varieties --
----------------------------------------------------------------------------------------------------------------------
-- Malay and related varieties
m["ms-old"] = { -- this has the ISO code 'omy'
"Old Malay",
nil,
"ms",
}
m["ms-cla"] = {
"Classical Malay",
nil,
"ms",
ancestors = "ms-old",
}
m["pse-bsm"] = {
"Besemah",
nil,
"pse",
}
m["bew-kot"] = {
"Betawi Kota",
nil,
"bew",
aliases = {"Urban Betawi"}, -- in Jakarta
}
-- Philippine varieties
m["xnn"] = {
"Northern Kankanaey",
12953609,
"kne",
aliases = {"Northern Kankanay", "Northern Kankana-ey"},
}
m["tl-old"] = {
"Old Tagalog",
12967437,
"tl",
}
m["tl-cls"] = {
"Classical Tagalog",
nil,
"tl",
}
----------------------------------------------------------------------------------------------------------------------
-- Caucasian varieties --
----------------------------------------------------------------------------------------------------------------------
-- Kartvelian varieties
m["ka-mid"] = {
"Middle Georgian",
nil,
"ka",
ancestors = "oge",
}
----------------------------------------------------------------------------------------------------------------------
-- Dravidian varieties --
----------------------------------------------------------------------------------------------------------------------
m["ta-mid"] = {
"Middle Tamil",
20987434,
"ta",
}
m["kn-hav"] = {
"Havigannada",
24276369,
"kn",
}
m["kn-kun"] = {
"Kundagannada",
6444255,
"kn",
}
----------------------------------------------------------------------------------------------------------------------
-- Indo-European varieties --
----------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------
-- Albanian varieties --
--------------------------------------------------------------------------------------
m["aln"] = {
"Gheg Albanian",
181037,
"sq",
aliases = {"Gheg"},
}
m["aae"] = {
"Arbëresh Albanian",
1075302,
"als",
aliases = {"Arbëreshë", "Arbëresh"},
}
m["aat"] = {
"Arvanitika Albanian",
29347,
"als",
aliases = {"Arvanitika"},
}
m["als"] = {
"Tosk Albanian",
180937,
"sq",
aliases = {"Tosk"},
}
--------------------------------------------------------------------------------------
-- Armenian varieties --
--------------------------------------------------------------------------------------
m["hyw"] = {
"Western Armenian",
180945,
"hy",
}
m["hye"] = {
"Eastern Armenian",
181059,
"hy",
}
--------------------------------------------------------------------------------------
-- Balto-Slavic varieties --
--------------------------------------------------------------------------------------
-------------------------------------------------------------------------
-- Baltic varieties --
-------------------------------------------------------------------------
m["bat-pro"] = {
"Proto-Baltic",
1703347,
"ine-bsl-pro",
}
m["bat-dni"] = {
"Dnieper Baltic",
4163178,
"bat-pro",
family = "bat",
aliases = {"Dniepr Baltic", "Dnieper-Oka Baltic", "Dniepr-Oka Baltic"},
}
m["bat-gol"] = {
"Golyad",
4142855,
"bat-dni",
aliases = {"Eastern Galindian", "East Galindian"},
}
-------------------------------------------------------------------------
-- Slavic varieties --
-------------------------------------------------------------------------
-----------------------------------------------------
-- Bulgarian varieties --
-----------------------------------------------------
m["cu-bgm"] = {
"Middle Bulgarian",
12294897,
"cu",
ancestors = "cu"
}
-----------------------------------------------------
-- Church Slavonic varieties --
-----------------------------------------------------
-- Old Moscow Church Slavonic deleted as it seems not distinct enough from Russian (Synodal) Church Slavonic.
m["zls-chs-ru"] = {
"Russian Church Slavonic",
21662400,
"zls-chs",
aliases = {"Synodal Church Slavonic", "New Moscow Church Slavonic", "Novomoskovsk Church Slavonic"},
}
m["zls-chs-uk"] = {
"Ukrainian Church Slavonic",
12153548,
"zls-chs",
aliases = {"Rusyn Church Slavonic", "Belarusian Church Slavonic"},
}
--[=[
-- Not sure about these yet.
m["zls-chs-bg"] = {
"Bulgarian Church Slavonic",
nil,
"zls-chs",
}
m["zls-chs-cs"] = {
"Czech Church Slavonic",
nil,
"zls-chs",
}
m["zls-chs-hr"] = {
"Croatian Church Slavonic",
nil,
"zls-chs",
}
m["zls-chs-mk"] = {
"Macedonian Church Slavonic",
nil,
"zls-chs",
}
m["zls-chs-ro"] = {
"Romanian Church Slavonic",
nil,
"zls-chs",
}
m["zls-chs-sr"] = {
"Serbian Church Slavonic",
nil,
"zls-chs",
}
]=]
-----------------------------------------------------
-- Czech varieties --
-----------------------------------------------------
m["cs-ear"] = {
"Early Modern Czech",
nil,
"cs",
ancestors = "zlw-ocs"
}
-----------------------------------------------------
-- East Slavic varieties --
-----------------------------------------------------
m["zle-ops"] = {
"Old Pskovian",
4167885,
"zle-ono",
}
m["zle-mru"] = {
"Middle Russian",
35228,
"ru",
"Cyrs",
ancestors = "orv",
translit = "ru-translit",
strip_diacritics = {
Cyrs = {
remove_diacritics = c.grave .. c.acute .. c.diaer,
},
},
}
m["zle-mbe"] = {
"Middle Belarusian",
13211,
"zle-ort",
ancestors = "zle-ort",
}
m["zle-muk"] = {
"Middle Ukrainian",
13211,
"zle-ort",
ancestors = "zle-ort",
}
m["uk-CA"] = {
"Canadian Ukrainian",
4161010,
"uk",
}
m["crp-cpr-kya"] = {
"Kyakhta Chinese Pidgin Russian",
1062960,
"crp-cpr",
}
-----------------------------------------------------
-- Polish varieties --
-----------------------------------------------------
m["zlw-mpl"] = {
"Middle Polish",
402878,
"pl",
ancestors = "zlw-opl",
strip_diacritics = {
remove_diacritics = c.acute,
remove_exceptions = {"Ć", "ć", "Ń", "ń", "Ó", "ó", "Ś", "ś", "Ź", "ź"},
},
}
m["pl-gre"] = {
"Greater Polish",
4106789,
"pl",
}
m["pl-les"] = {
"Lesser Polish",
361709,
"pl",
}
m["pl-mas"] = {
"Masovian Polish",
4274559,
"pl",
}
m["pl-gor"] = {
"Goral",
452889,
"pl",
}
-----------------------------------------------------
-- Serbo-Croatian varieties --
-----------------------------------------------------
m["ckm"] = {
"Chakavian Serbo-Croatian",
337565,
"sh",
aliases = {"Čakavian"},
}
m["kjv"] = {
"Kajkavian Serbo-Croatian",
838165,
"sh",
}
m["sh-tor"] = { -- Linguist code srp-tor
"Torlakian Serbo-Croatian",
1078803,
"sh",
aliases = {"Torlak"},
}
--------------------------------------------------------------------------------------
-- Celtic varieties --
--------------------------------------------------------------------------------------
-----------------------------------------------------
-- Brythonic varieties --
-----------------------------------------------------
m["bry-ear"] = {
"Early Brythonic",
nil,
"cel-bry-pro",
}
m["bry-lat"] = {
"Late Brythonic",
nil,
"cel-bry-pro",
}
-----------------------------------------------------
-- Gaulish varieties --
-----------------------------------------------------
m["xcg"] = {
"Cisalpine Gaulish",
3832927,
"cel-gau",
}
m["xtg"] = {
"Transalpine Gaulish",
29977,
"cel-gau",
}
-----------------------------------------------------
-- Welsh varieties --
-----------------------------------------------------
m["cy-nor"] = {
"North Wales Welsh",
13127692,
"cy",
aliases = {"North Walian Welsh", "Northern Welsh"},
}
m["cy-sou"] = {
"South Wales Welsh",
13127689,
"cy",
aliases = {"South Walian Welsh", "Southern Welsh"},
}
--------------------------------------------------------------------------------------
-- Germanic varieties --
--------------------------------------------------------------------------------------
-- Proto-West Germanic varieties
m["frk"] = {
"Frankish",
10860505,
"gmw-pro",
family = "gmw-frk",
aliases = {"Old Frankish"},
}
m["gem-sue"] = {
"Suevic",
134600275,
"gmw-pro",
aliases = {"Suebian"},
}
m["gmw-afr-pro"] = {
"Proto-Anglo-Frisian",
134603379,
"gmw-nsg-pro",
family = "gmw-afr",
}
m["gmw-nsg-pro"] = {
"Proto-North Sea Germanic",
134603374,
"gmw-pro",
family = "gmw-nsg",
aliases = {"Proto-Ingvaeonic"},
}
-----------------------------------------------------
-- Dutch varieties --
-----------------------------------------------------
m["nl-BE"] = {
"Belgian Dutch",
34147,
"nl",
aliases = {"Flemish", "Flemish Dutch", "Southern Dutch"},
}
-----------------------------------------------------
-- English and Scots varieties --
-----------------------------------------------------
-- English varieties
m["en-AU"] = {
"Australian English",
44679,
"en",
}
m["en-GB"] = {
"British English",
7979,
"en",
}
m["en-GB-SCT"] = {
"Scottish English",
1553250,
"en-GB",
}
m["en-GB-WLS"] = {
"Welsh English",
2363292,
"en-GB",
}
m["en-IM"] = {
"Manx English",
6753295,
"en-GB",
}
m["en-aae"] = {
"Australian Aboriginal English",
783347,
"en-AU",
}
m["en-ear"] = {
"Early Modern English",
1472196,
"en",
ancestors = "enm",
aliases = {"Early New English"},
}
m["en-geo"] = {
"Geordie",
653421,
"en",
ancestors = "enm-nor",
}
m["en-IE"] = { -- FIXME: "IE" doesn't cover Northern Ireland
"Irish English",
665624,
"en",
}
m["en-uls"] = {
"Ulster English",
6840826,
"en-IE",
}
m["en-GB-NIR"] = {
"Northern Irish English",
6840826, -- actually the code for Ulster English
"en-uls",
}
m["en-NNN"] = { -- NA = Namibia; NNN is NATO 3-letter code for North America
"North American English",
7053766,
"en",
ietf_subtag = "en-021" -- 021 = UN M49 code for "Northern America" (i.e. North America wihout Central America or the Caribbean)
}
m["en-US"] = {
"American English",
7976,
"en-NNN",
}
m["en-NZ"] = {
"New Zealand English",
44661,
"en"
}
m["en-ZA"] = {
"South African English",
1156228,
"en"
}
m["en-US-CA"] = {
"California English",
1026812,
"en-US",
}
m["en-CA"] = {
"Canadian English",
44676,
"en-US",
}
m["en-HK"] = {
"Hong Kong English",
1068863,
"en",
}
m["en-IN"] = {
"Indian English",
1348800,
"en",
}
m["pld"] = {
"Polari",
1359130,
"en",
}
-- Scots varieties
m["sco-ins"] = {
"Insular Scots",
16919205,
"sco",
}
m["sco-uls"] = {
"Ulster Scots",
201966,
"sco",
}
m["sco-nor"] = {
"Northern Scots",
16928150,
"sco",
}
m["sco-sou"] = {
"Southern Scots",
7570457,
"sco",
aliases = {"South Scots", "Borders Scots"},
}
-- Middle English varieties
m["enm-esc"] = { -- Part of Middle English until it developed into Middle Scots.
"Early Scots",
5326738,
"enm",
ancestors = "enm-nor",
aliases = {"Old Scots", "Scottish Middle English"},
}
m["enm-emi"] = {
"East Midland Middle English",
134238810,
"enm",
ancestors = "ang-ang", -- Technically ang-mer, but attested Mercian is mostly WM IIRC
}
m["enm-ken"] = {
"Kentish Middle English",
134238532,
"enm",
ancestors = "ang-ken",
}
m["enm-nor"] = {
"Northern Middle English",
134238541,
"enm",
ancestors = "ang-nor",
}
m["enm-sou"] = {
"Southern Middle English",
134238528,
"enm",
ancestors = "ang-wsx",
}
m["enm-wmi"] = {
"West Midland Middle English",
134238824,
"enm",
ancestors = "ang-mer",
}
-- Old English varieties
-- Includes both Mercian and Northumbrian.
m["ang-ang"] = {
"Anglian Old English",
121142917,
"ang",
}
m["ang-ken"] = {
"Kentish Old English",
11687485,
"ang",
}
m["ang-mer"] = {
"Mercian Old English",
602072,
"ang-ang",
}
m["ang-nor"] = {
"Northumbrian Old English",
1798915,
"ang-ang",
}
m["ang-wsx"] = {
"West Saxon Old English",
2658603,
"ang",
}
-----------------------------------------------------
-- High German varieties --
-----------------------------------------------------
-- (modern) German varieties
m["de-AT"] = {
"Austrian German",
306626,
"de",
}
m["de-AT-vie"] = {
"Viennese German",
56474,
"de-AT",
}
m["de-CH"] = {
"Switzerland German",
1366643,
"de",
aliases = {"Schweizer Hochdeutsch", "Swiss Standard German", "Swiss High German"},
}
m["de-bal"] = {
"Baltic German",
15785413,
"de",
}
m["de-ear"] = {
"Early New High German",
1472199,
"de",
ancestors = "gmh",
aliases = {"Early Modern High German"},
}
m["ksh"] = {
"Kölsch",
4624,
"gmw-cfr",
}
m["pfl"] = {
"Palatine German",
23014,
"gmw-rfr",
aliases = {"Pfälzisch", "Pälzisch", "Palatinate German"},
}
m["sli"] = {
"Silesian East Central German",
152965,
"gmw-ecg",
aliases = {"Silesian"},
}
m["sxu"] = {
"Upper Saxon German",
699284,
"gmw-ecg",
}
-- Old High German varieties
m["lng"] = {
"Lombardic",
35972,
"goh",
}
-- Alemannic German varieties
m["gsw-low"] = {
"Low Alemannic German",
503724,
"gsw",
}
m["gsw-FR-als"] = {
"Alsatian Alemannic German",
8786,
"gsw-low",
}
m["gsw-hig"] = {
"High Alemannic German",
503728,
"gsw",
}
m["gsw-hst"] = {
"Highest Alemannic German",
687538,
"gsw",
}
m["wae"] = {
"Walser German",
680517,
"gsw-hst",
}
-----------------------------------------------------
-- Low German varieties --
-----------------------------------------------------
m["nds-de"] = {
"German Low German",
25433,
"nds",
ietf_subtag = "nds-DE", -- should we make this the actual code?
wikimedia_codes = "nds",
}
m["nds-nl"] = {
"Dutch Low Saxon",
516137,
"nds",
ietf_subtag = "nds-NL", -- should we make this the actual code?
wikimedia_codes = "nds-nl",
}
m["act"] = {
"Achterhoeks",
153627,
"nds-nl",
aliases = {"Achterhoek", "Achterhooks"},
}
m["drt"] = {
"Drents",
2736709,
"nds-nl",
aliases = {"Drèents", "Dreins", "Dreints", "Drints"},
}
m["frs"] = {
"East Frisian Low German",
149208,
"nds-de",
aliases = {"East Frisian", "East Frisian Low Saxon"},
}
m["gos"] = {
"Gronings",
508854,
"nds-nl",
aliases = {"Grunnegs", "Grönnegs"},
}
m["nds-lpr"] = {
"Low Prussian",
33982,
"nds-de",
}
m["sdz"] = {
"Sallands",
3436668,
"nds-nl",
aliases = {"Sallaans", "Sallaands"},
}
m["stl"] = {
"Stellingwerfs",
506010,
"nds-nl",
aliases = {"Stellingwarfs"},
}
m["twd"] = {
"Twents",
497363,
"nds-nl",
aliases = {"Tweants"},
}
m["vel"] = {
"Veluws",
2484810,
"nds-nl",
}
m["wep"] = {
"Westphalian",
505655,
"nds-de",
aliases = {"Westfalish", "Westphalien"},
}
-----------------------------------------------------
-- North Frisian varieties --
-----------------------------------------------------
m["frr-ins"] = {
"Insular North Frisian",
110629610,
"frr",
}
m["frr-fam"] = {
"Föhr-Amrum North Frisian",
110629601,
"frr-ins",
}
m["frr-foh"] = {
"Föhr North Frisian",
28185,
"frr-fam",
aliases = {"Föhr Frisian", "Fering",
"Ferring", -- Glottolog
},
varieties = {"Aasdring", "Weesdring"},
}
m["frr-amr"] = {
"Amrum North Frisian",
28192,
"frr-fam",
aliases = {"Amrum Frisian", "Amrum", "Öömrang"},
}
m["frr-hel"] = {
"Heligoland North Frisian",
28086,
"frr-ins",
aliases = {"Heligoland Frisian", "Halunder", "Heligolandic Frisian", "Heligolandic North Frisian",
"Helgoland Frisian", "Helgoland North Frisian", "Helgoland"},
}
m["frr-syl"] = {
"Sylt North Frisian",
28181,
"frr-ins",
aliases = {"Sylt Frisian", "Söl'ring",
"Sölreng", -- Glottolog
},
}
m["frr-mai"] = {
"Mainland North Frisian",
110629626,
"frr",
}
m["frr-hal"] = {
"Halligen North Frisian",
28177,
"frr-mai",
aliases = {"Halligen Frisian", "Halifreesk", "Hallingen Frisian", "Hallingen North Frisian",
"Hallingen", -- Glottolog
},
}
m["frr-moo"] = {
"Mooring North Frisian",
28187,
"frr-mai",
aliases = {"Bökingharde North Frisian", "Bökingharde Frisian", "Böökinghiirder frasch",
"Mooring", "Moring",
},
varieties = {{"East Mooring", "Ostermooring"}, {"West Mooring", "Westermooring"}},
}
m["frr-kar"] = {
"Karrharde North Frisian",
28191,
"frr-mai",
aliases = {"Karrharde Frisian", "Karrharder",
},
}
m["frr-goe"] = {
-- Technically this refers to three adjacent dialects (Northern, Central and Southern), the latter of which went
-- extinct in 1980-1981. As a result, Glottolog speaks of "Norder-Mittelgoesharde", referring to the remaining two.
"Goesharde North Frisian",
28183,
"frr-mai",
aliases = {"Norder-Mittelgoesharde North Frisian", "Norder-Mittelgoesharde Frisian", "Norder-Mittelgoesharde",
"Goesharde Frisian", "Goesharde", "Gooshiirder",
},
}
m["frr-wie"] = {
"Wiedingharde North Frisian",
28171,
"frr-mai",
aliases = {"Wiedingharde Frisian", "Wiedingharde", "Wiringhiirder freesk",
},
}
-----------------------------------------------------
-- Old Norse varieties --
-----------------------------------------------------
m["non-grn"] = {
"Greenlandic Norse",
855236,
"non-own",
}
m["non-oen"] = {
"Old East Norse",
10498031,
"non",
ancestors = "non",
}
m["non-own"] = {
"Old West Norse",
2377483,
"non",
ancestors = "non",
}
-----------------------------------------------------
-- Old Swedish varieties --
-----------------------------------------------------
m["gmq-osw-lat"] = {
"Late Old Swedish",
10723594,
"gmq-osw",
ancestors = "gmq-osw",
}
--------------------------------------------------------------------------------------
-- Greek varieties --
--------------------------------------------------------------------------------------
m["qsb-grc"] = {
"Pre-Greek",
965052,
"und",
family = "qfa-sub",
}
m["grc-aeo"] = {
"Aeolic Greek",
406373,
"grc",
aliases = {"Lesbic Greek", "Lesbian Greek", "Aeolian Greek"},
}
m["grc-arc"] = {
"Arcadian Greek",
nil,
"grc-arp",
}
m["grc-arp"] = {
"Arcadocypriot Greek",
499602,
"grc",
}
m["grc-att"] = {
"Attic Greek",
506588,
"grc",
}
m["grc-boi"] = {
"Boeotian Greek",
406373,
"grc-aeo",
}
m["grc-cyp"] = {
"Cypriot Ancient Greek", -- to distinguish from Cypriot Greek below
nil,
"grc-arp",
}
m["grc-dor"] = {
"Doric Greek",
285494,
"grc",
}
m["grc-ela"] = {
"Elean Greek",
nil,
"grc",
}
m["grc-epi"] = {
"Epic Greek",
990062,
"grc",
aliases = {"Homeric Greek"},
}
m["grc-ion"] = {
"Ionic Greek",
504165,
"grc",
}
m["grc-koi"] = {
"Koine Greek",
107358,
"grc",
ancestors = "grc-att",
aliases = {"Hellenistic Greek"},
}
m["grc-kre"] = {
"Cretan Ancient Greek", -- to distinguish from Cretan Greek below
nil,
"grc-dor",
}
m["grc-opl"] = {
"Opuntian Locrian",
nil,
"grc",
}
m["grc-ozl"] = {
"Ozolian Locrian",
nil,
"grc",
}
m["grc-pam"] = {
"Pamphylian Greek",
2271793,
"grc",
}
m["grc-ths"] = {
"Thessalian Greek",
406373,
"grc-aeo",
}
m["gkm"] = {
"Byzantine Greek",
36387,
"grc",
ancestors = "grc-koi",
aliases = {"Medieval Greek"},
}
m["el-cyp"] = {
"Cypriot Greek",
245899,
"el",
aliases = {"Cypriotic Greek"},
}
m["el-pap"] = {
"Paphian Greek",
nil,
"el",
}
m["el-crt"] = {
"Cretan Greek",
588306,
"el",
}
m["el-kth"] = {
"Katharevousa",
35961,
"el",
"Polyt",
ancestors = "gkm",
aliases = {"Katharevousa Greek"},
-- Polyt display_text, strip_diacritics, sort_key in [[Module:scripts/data]]
}
m["el-kal"] = {
"Kaliarda",
12878658,
"el",
}
--------------------------------------------------------------------------------------
-- Indo-Iranian varieties --
--------------------------------------------------------------------------------------
-------------------------------------------------------------------------
-- Indo-Aryan varieties --
-------------------------------------------------------------------------
-- reconstructed intermediate stages
m["pra-pro"] = {
"Proto-New Indo-Aryan",
nil,
"pra",
}
m["inc-ash-pro"] = {
"Proto-Middle Indo-Aryan",
nil,
"inc-ash",
}
m["inc-mit"] = {
"Mitanni",
1986700,
"inc-pro",
}
m["bra-old"] = {
"Old Braj",
nil,
"bra",
}
-- Apabhramsas
m["inc-aav"] = {
"Avahattha",
nil,
"inc-apa",
aliases = {"Abahattha"},
}
m["inc-asa"] = {
"Sauraseni Apabhramsa",
nil,
"inc-apa",
}
m["inc-agu"] = {
"Gurjara Apabhramsa",
nil,
"inc-apa",
}
m["inc-aka"] = {
"Kasmiri Apabhramsa",
nil,
"inc-apa",
}
m["inc-ama"] = {
"Maharastri Apabhramsa",
nil,
"inc-apa",
}
m["inc-ata"] = {
"Takka Apabhramsa",
nil,
"inc-apa",
}
m["inc-avr"] = {
"Vracada Apabhramsa",
nil,
"inc-apa",
}
-- Assamese varieties
m["as-bkm"] = {
"Barpetia Kamrupi Assamese",
30642960,
"as",
}
m["as-nkm"] = {
"Nalbaria Kamrupi Assamese",
85787678,
"as",
}
m["as-pkm"] = {
"Palasbaria Kamrupi Assamese",
nil,
"as",
}
-- Bengali varieties
m["bn-dvn"] = {
"Dhakaiya Vaṅga Bengali",
48726851,
"bn", -- Eastern Bengali variety
}
m["bn-nvn"] = {
"Noakhailla Vaṅga Bengali",
107548681,
"bn", -- Eastern Bengali variety
}
-- Dhivehi varieties
m["dv-old"] = {
"Old Dhivehi",
117790875,
"dv",
}
m["dv-mul"] = {
"Mulaku Dhivehi",
nil,
"dv",
aliases = {"Mulaku Divehi", "Mulaku Bas"},
}
m["dv-huv"] = {
"Huvadhu Dhivehi",
nil,
"dv",
aliases = {"Huvadhu Divehi", "Huvadhu Bas"},
}
m["dv-add"] = {
"Addu Dhivehi",
nil,
"dv",
aliases = {"Addu Divehi", "Addu Bas"},
}
-- Gujarati varieties
m["gu-kat"] = {
"Kathiyawadi",
nil,
"gu",
aliases = {"Kathiyawadi Gujarati", "Kathiawadi"},
}
m["gu-lda"] = {
"Lisan ud-Dawat Gujarati",
nil,
"gu",
aliases = {"Lisan ud-Dawat", "LDA"},
}
-- Hindi varieties
m["hi-mum"] = {
"Bombay Hindi",
3543151,
"hi",
aliases = {"Mumbai Hindi", "Bambaiyya Hindi"},
}
m["hi-mid"] = {
"Middle Hindi",
nil,
"inc-ohi",
ancestors = "inc-ohi",
}
-- Konkani varieties
m["kok-mid"] = {
"Middle Konkani",
nil,
"kok",
aliases = {"Medieval Konkani"},
}
m["kok-old"] = {
"Old Konkani",
nil,
"kok",
aliases = {"Early Konkani"},
}
-- Prakrits
m["pra-ard"] = {
"Ardhamagadhi Prakrit",
35217,
"pra",
aliases = {"Ardhamagadhi"},
}
m["pra-hel"] = {
"Helu Prakrit",
15080869,
"pra",
aliases = {"Elu", "Elu Prakrit", "Helu"},
}
m["pra-kha"] = {
"Khasa Prakrit",
nil,
"pra",
aliases = {"Khasa"},
}
m["pra-mag"] = {
"Magadhi Prakrit", -- Not to be confused with Magahi (mag)
2652214,
"pra",
aliases = {"Magadhi"},
}
m["pra-mah"] = {
"Maharastri Prakrit",
2586773,
"pra",
aliases = {"Maharashtri Prakrit", "Maharastri", "Maharashtri"},
}
m["pra-pai"] = {
"Paisaci Prakrit",
2995607,
"pra-sau",
aliases = {"Paisaci", "Paisachi"},
ancestors = "pra-sau"
}
m["pra-sau"] = {
"Sauraseni Prakrit",
2452885,
"pra",
aliases = {"Sauraseni", "Shauraseni"},
}
m["pra-ava"] = {
"Avanti",
nil,
"pra",
aliases = {"Avanti Prakrit"},
}
m["pra-pra"] = {
"Pracya",
nil,
"pra",
aliases = {"Pracya Prakrit"},
}
m["pra-bah"] = {
"Bahliki",
nil,
"pra",
aliases = {"Bahliki Prakrit"},
}
m["pra-dak"] = {
"Daksinatya",
nil,
"pra",
aliases = {"Daksinatya Prakrit"},
}
m["pra-sak"] = {
"Sakari",
nil,
"pra",
aliases = {"Sakari Prakrit"},
}
m["pra-can"] = {
"Candali",
nil,
"pra",
aliases = {"Candali Prakrit"},
}
m["pra-sab"] = {
"Sabari",
nil,
"pra",
aliases = {"Sabari Prakrit"},
}
m["pra-abh"] = {
"Abhiri",
nil,
"pra",
aliases = {"Abhiri Prakrit"},
}
m["pra-dra"] = {
"Dramili",
nil,
"pra",
aliases = {"Dramili Prakrit"},
}
m["pra-odr"] = {
"Odri",
nil,
"pra",
aliases = {"Odri Prakrit"},
}
-- Punjabi varieties
m["pnb"] = {
"Western Punjabi",
58635,
"pa",
"pa-Arab",
}
-- Sanskrit varieties
m["vsn"] = {
"Vedic Sanskrit",
36858,
"sa",
}
m["cls"] = {
"Classical Sanskrit",
9333703,
"sa",
}
m["sa-bhs"] = {
"Buddhist Hybrid Sanskrit",
248758,
"sa",
}
m["sa-bra"] = {
"Brahmanic Sanskrit",
139822891,
"vsn",
}
m["sa-epi"] = {
"Epic Sanskrit",
56702805,
"cls",
}
m["sa-neo"] = {
"New Sanskrit",
nil,
"sa",
}
m["sa-rig"] = {
"Rigvedic Sanskrit",
139822680,
"vsn",
}
-- Sinhalese varieties
m["si-med"] = {
"Medieval Sinhalese",
nil,
"si",
aliases = {"Medieval Sinhala"},
}
-------------------------------------------------------------------------
-- Iranian varieties --
-------------------------------------------------------------------------
m["qsb-bma"] = {
"the BMAC substrate",
133187435,
"und",
family = "qfa-sub",
aliases = {"the Bactria-Margiana substrate", "the Bactria-Margiana Archaeological Complex substrate"},
}
-- Historical and current Iranian dialects
m["ae-old"] = {
"Old Avestan",
29572,
"ae",
aliases = {"Gathic Avestan"},
}
m["ae-yng"] = {
"Younger Avestan",
29572,
"ae-old",
aliases = {"Young Avestan"},
}
m["bcc"] = {
"Southern Balochi",
33049,
"bal",
aliases = {"Southern Baluchi"},
}
m["bgp"] = {
"Eastern Balochi",
33049,
"bal",
aliases = {"Eastern Baluchi"},
}
m["bgn"] = {
"Western Balochi",
33049,
"bal",
aliases = {"Western Baluchi"},
}
m["bsg-ban"] = {
"Bandari",
nil,
"bsg",
}
m["bsg-hor"] = {
"Hormozi",
nil,
"bsg",
}
m["bsg-min"] = {
"Minabi",
nil,
"bsg",
}
m["kho-old"] = {
"Old Khotanese",
nil,
"kho",
}
m["kho-lat"] = {
"Late Khotanese",
nil,
"kho-old",
}
m["peo-ear"] = {
"Early Old Persian",
nil,
"peo",
}
m["peo-lat"] = {
"Late Old Persian",
nil,
"peo",
}
m["pal-ear"] = {
"Early Middle Persian",
nil,
"pal",
}
m["pal-lat"] = {
"Late Middle Persian",
nil,
"pal",
ancestors = "pal-ear",
}
m["ps-nwe"] = {
"Northwestern Pashto",
nil,
"ps",
}
m["ps-cgi"] = {
"Central Ghilzay",
nil,
"ps-nwe",
}
m["ps-mah"] = {
"Mahsudi",
nil,
"ps-nwe",
}
m["ps-nea"] = {
"Northeastern Pashto",
nil,
"ps",
}
m["ps-afr"] = {
"Afridi",
nil,
"ps-nea",
}
m["ps-bng"] = {
"Bangash",
nil,
"ps-nea",
}
m["ps-xat"] = {
"Khatak",
nil,
"ps-nea",
}
m["ps-pes"] = {
"Peshawari",
nil,
"ps-nea",
}
m["ps-sea"] = {
"Southeastern Pashto",
nil,
"ps",
}
m["ps-ban"] = {
"Bannu",
nil,
"ps-sea",
}
m["ps-kak"] = {
"Kakari",
nil,
"ps-sea",
}
m["ps-ser"] = {
"Sher",
nil,
"ps-sea",
}
m["ps-waz"] = {
"Waziri",
12274473,
"ps-sea",
}
m["ps-swe"] = {
"Southwestern Pashto",
nil,
"ps",
}
m["ps-kan"] = {
"Kandahari",
nil,
"ps-swe",
}
m["ps-jad"] = {
"Jadrani",
nil,
"ps",
ancestors = "ira-pat-pro"
}
m["xme-azr"] = {
"Old Azari",
nil,
"xme-ott",
aliases = {"Old Azeri", "Azari", "Azeri", "Āḏarī", "Adari", "Adhari"},
}
m["xme-ttc-cen"] = {
"Central Tati",
nil,
"xme-ott",
}
m["xme-ttc-eas"] = {
"Eastern Tati",
nil,
"xme-ott",
}
m["xme-ttc-nor"] = {
"Northern Tati",
nil,
"xme-ott",
}
m["xme-ttc-sou"] = {
"Southern Tati",
nil,
"xme-ott",
}
m["xme-ttc-wes"] = {
"Western Tati",
nil,
"xme-ott",
}
m["xmn"] = {
"Manichaean Middle Persian",
nil,
"pal-lat",
}
m["fa-ear"] = {
"Early New Persian",
127413796,
"fa",
ancestors = "pal-lat",
translit = "fa-cls-translit",
}
m["fa-cls"] = {
"Classical Persian",
9168,
"fa",
ancestors = "fa-ear",
translit = "fa-cls-translit",
}
m["fa-ira"] = {
"Iranian Persian",
3513637,
"fa",
aliases = {"Modern Persian", "Western Persian"},
translit = "fa-ira-translit",
}
m["prs"] = {
"Dari",
178440,
"fa",
aliases = {"Dari Persian", "Central Persian", "Eastern Persian", "Afghan Persian"},
translit = "fa-cls-translit",
}
m["haz"] = {
"Hazaragi",
33398,
"prs",
translit = "fa-cls-translit",
}
m["os-dig"] = {
"Digor Ossetian",
3027861,
"os",
aliases = {"Digoron", "Digor"},
}
m["os-iro"] = {
"Iron Ossetian",
nil,
"os",
aliases = {"Iron"},
}
m["sog-ear"] = {
"Early Sogdian",
nil,
"sog",
}
m["sog-lat"] = {
"Late Sogdian",
nil,
"sog-ear",
}
m["ro-MD"] = {
"Moldovan",
36392,
"ro",
aliases = {"Moldavian"},
}
m["oru-kan"] = {
"Kaniguram",
6363164,
"oru",
}
m["oru-log"] = {
"Logar",
nil,
"oru",
}
m["oos"] = {
"Old Ossetic",
65455882,
"xln",
}
m["oos-ear"] = {
"Early Old Ossetic",
nil,
"oos",
}
m["oos-lat"] = {
"Late Old Ossetic",
nil,
"oos",
}
m["rdb-jir"] = {
"Jirofti",
nil,
"rdb",
}
m["rdb-kah"] = {
"Kahnuji",
nil,
"rdb",
}
-- Southwestern Fars lects
m["fay-bur"] = {
"Burenjani",
nil,
"fay",
}
m["fay-bsh"] = {
"Bushehri",
nil,
"fay",
}
m["fay-dsh"] = {
"Dashtaki",
nil,
"fay",
}
m["fay-dav"] = {
"Davani",
5228140,
"fay",
}
m["fay-eze"] = {
"Emamzada Esmaili",
nil,
"fay",
}
m["fay-gav"] = {
"Gavkoshaki",
nil,
"fay",
}
m["fay-kho"] = {
"Khollari",
nil,
"fay",
}
m["fay-kon"] = {
"Kondazi",
nil,
"fay",
}
m["fay-kzo"] = {
"Old Kazeruni",
nil,
"fay",
}
m["fay-mas"] = {
"Masarami",
nil,
"fay",
}
m["fay-pap"] = {
"Papuni",
nil,
"fay",
}
m["fay-sam"] = {
"Samghani",
nil,
"fay",
}
m["fay-shr"] = {
"Shirazi",
nil,
"fay",
}
m["fay-sho"] = {
"Old Shirazi",
nil,
"fay",
}
m["fay-kar"] = {
"Khargi",
nil,
"fay",
}
m["fay-sor"] = {
"Sorkhi",
nil,
"fay",
}
-- Talysh lects
m["tly-cen"] = {
"Central Talysh",
nil,
"tly",
}
m["tly-asa"] = {
"Asalemi",
nil,
"tly-cen",
}
m["tly-kar"] = {
"Karganrudi",
nil,
"tly-cen",
}
m["tly-tul"] = {
"Tularudi",
nil,
"tly-cen",
}
m["tly-tal"] = {
"Taleshdulabi",
nil,
"tly-cen",
}
m["tly-nor"] = {
"Northern Talysh",
nil,
"tly",
}
m["tly-aze"] = {
"Azerbaijani Talysh",
nil,
"tly-nor",
}
m["tly-anb"] = {
"Anbarani",
nil,
"tly-nor",
}
m["tly-sou"] = {
"Southern Talysh",
nil,
"tly",
}
m["tly-fum"] = {
"Fumani",
nil,
"tly-sou",
}
m["tly-msu"] = {
"Masulei",
nil,
"tly-sou",
}
m["tly-msa"] = {
"Masali",
nil,
"tly-sou",
}
m["tly-san"] = {
"Shandarmani",
nil,
"tly-sou",
}
-- Tafreshi lects
m["xme-amo"] = {
"Amorehi",
nil,
"xme-taf",
}
m["atn"] = {
"Ashtiani",
3436590,
"xme-taf",
}
m["xme-bor"] = {
"Borujerdi",
nil,
"xme-taf",
}
m["xme-ham"] = {
"Hamadani",
6302426,
"xme-taf",
}
m["xme-kah"] = {
"Kahaki",
nil,
"xme-taf",
}
m["vaf"] = {
"Vafsi",
32611,
"xme-taf",
}
-- Kermanic lects
m["kfm"] = {
"Khunsari",
6403030,
"xme-ker",
}
m["xme-mah"] = {
"Mahallati",
nil,
"xme-ker",
}
m["xme-von"] = {
"Vonishuni",
nil,
"xme-ker",
}
m["xme-bdr"] = {
"Badrudi",
nil,
"xme-ker",
}
m["xme-del"] = {
"Delijani",
nil,
"xme-ker",
}
m["xme-kas"] = {
"Kashani",
nil,
"xme-ker",
}
m["xme-kes"] = {
"Kesehi",
nil,
"xme-ker",
}
m["xme-mey"] = {
"Meymehi",
nil,
"xme-ker",
}
m["ntz"] = {
"Natanzi",
6968399,
"xme-ker",
}
m["xme-abz"] = {
"Abuzeydabadi",
nil,
"xme-ker",
}
m["xme-aby"] = {
"Abyanehi",
nil,
"xme-ker",
}
m["xme-far"] = {
"Farizandi",
nil,
"xme-ker",
}
m["xme-jow"] = {
"Jowshaqani",
nil,
"xme-ker",
}
m["xme-nas"] = {
"Nashalji",
nil,
"xme-ker",
}
m["xme-qoh"] = {
"Qohrudi",
nil,
"xme-ker",
}
m["xme-yar"] = {
"Yarandi",
nil,
"xme-ker",
}
m["soj"] = {
"Soi",
7930463,
"xme-ker",
aliases = {"Sohi"},
}
m["xme-tar"] = {
"Tari",
nil,
"xme-ker",
}
m["gzi"] = {
"Gazi",
5529130,
"xme-ker",
}
m["xme-sed"] = {
"Sedehi",
nil,
"xme-ker",
}
m["xme-ard"] = {
"Ardestani",
nil,
"xme-ker",
}
m["xme-zef"] = {
"Zefrehi",
nil,
"xme-ker",
}
m["xme-isf"] = {
"Isfahani",
nil,
"xme-ker",
}
m["xme-kaf"] = {
"Kafroni",
nil,
"xme-ker",
}
m["xme-vrz"] = {
"Varzenehi",
nil,
"xme-ker",
}
m["xme-xur"] = {
"Khuri",
nil,
"xme-ker",
}
m["nyq"] = {
"Nayini",
6983146,
"xme-ker",
}
m["xme-ana"] = {
"Anaraki",
nil,
"xme-ker",
}
m["gbz"] = {
"Zoroastrian Dari",
32389,
"xme-ker",
aliases = {"Behdināni", "Gabri", "Gavrŭni", "Gabrōni"},
}
m["xme-krm"] = {
"Kermani",
nil,
"xme-ker",
}
m["xme-yaz"] = {
"Yazdi",
nil,
"xme-ker",
}
m["xme-bid"] = {
"Bidhandi",
nil,
"xme-ker",
}
m["xme-bij"] = {
"Bijagani",
nil,
"xme-ker",
}
m["xme-cim"] = {
"Chimehi",
nil,
"xme-ker",
}
m["xme-han"] = {
"Hanjani",
nil,
"xme-ker",
}
m["xme-kom"] = {
"Komjani",
nil,
"xme-ker",
}
m["xme-nar"] = {
"Naraqi",
nil,
"xme-ker",
}
m["xme-nus"] = {
"Nushabadi",
nil,
"xme-ker",
}
m["xme-qal"] = {
"Qalhari",
nil,
"xme-ker",
}
m["xme-trh"] = {
"Tarehi",
nil,
"xme-ker",
}
m["xme-val"] = {
"Valujerdi",
nil,
"xme-ker",
}
m["xme-var"] = {
"Varani",
nil,
"xme-ker",
}
m["xme-zor"] = {
"Zori",
nil,
"xme-ker",
}
-- Ramandi lects
m["tks-ebr"] = {
"Ebrahimabadi",
nil,
"tks",
}
m["tks-sag"] = {
"Sagzabadi",
nil,
"tks",
}
m["tks-esf"] = {
"Esfarvarini",
nil,
"tks",
}
m["tks-tak"] = {
"Takestani",
nil,
"tks",
}
m["tks-cal"] = {
"Chali Tati",
nil,
"tks",
aliases = {"Chāli"},
}
m["tks-dan"] = {
"Danesfani",
nil,
"tks",
}
m["tks-xia"] = {
"Khiaraji",
nil,
"tks",
}
m["tks-xoz"] = {
"Khoznini",
nil,
"tks",
}
-- Shughni dialects
m["sgh-bro"] = {
"Bartangi-Oroshori",
nil,
"sgh",
}
m["sgh-bar"] = {
"Bartangi",
nil,
"sgh-bro",
}
m["sgh-oro"] = {
"Oroshori",
nil,
"sgh-bro",
aliases = {"Roshorvi"},
}
m["sgh-rsx"] = {
"Roshani-Khufi",
nil,
"sgh",
}
m["sgh-xuf"] = {
"Khufi",
2562249,
"sgh-rsx",
aliases = {"Xufi", "Xūfī"},
}
m["sgh-ros"] = {
"Roshani",
2597566,
"sgh-rsx",
aliases = {"Rushani", "Rōšāni"},
}
m["sgh-xgb"] = {
"Khughni-Bajui",
nil,
"sgh",
}
m["sgh-xug"] = {
"Khughni",
nil,
"sgh-xgb",
}
m["sgh-baj"] = {
"Bajui",
nil,
"sgh-xgb",
}
-------------------------------------------------------------------------
-- Nuristani varieties --
-------------------------------------------------------------------------
m["bsh-kat"] = {
"Kativiri",
2605045,
"bsh",
aliases = {"Katə́viri"},
}
m["xvi"] = {
"Kamviri",
1193495,
"bsh",
aliases = {"Kamvíri"},
}
m["bsh-mum"] = {
"Mumviri",
nil,
"bsh",
aliases = {"Mumvíri"},
}
--------------------------------------------------------------------------------------
-- Italic varieties --
--------------------------------------------------------------------------------------
-------------------------------------------------------------------------
-- Latin varieties --
-------------------------------------------------------------------------
-- Latin varieties by period
m["itc-ola"] = {
"Old Latin",
12289,
"la",
"Latn, Ital",
translit = {
Ital = "Ital-translit"
},
}
m["itc-lan"] = {
"Lanuvian",
16890829,
"itc-ola",
aliases = {"Lanuvine"},
}
m["itc-pra"] = {
"Praenestine",
16889772,
"itc-ola",
aliases = {"Praenestinian"},
}
m["la-cla"] = {
"Classical Latin",
253854,
"la",
}
m["la-vul"] = {
"Vulgar Latin",
37560,
"la-cla",
}
m["la-afr"] = {
"African Romance",
162064,
"roa-pro",
}
m["la-lat"] = {
"Late Latin",
1503113,
"la",
ancestors = "la-cla",
}
m["la-med"] = {
"Medieval Latin",
1163234,
"la",
ancestors = "la-lat",
}
m["la-eme"] = {
"Early Medieval Latin",
nil,
"la-med",
}
m["la-ecc"] = {
"Ecclesiastical Latin",
1247932,
"la",
aliases = {"Church Latin", "Liturgical Latin"},
ancestors = "la-lat",
}
m["la-ren"] = {
"Renaissance Latin",
499083,
"la",
ancestors = "la-med",
}
m["la-new"] = {
"New Latin",
1248221,
"la",
aliases = {"Modern Latin"},
ancestors = "la-ren",
}
m["la-con"] = {
"Contemporary Latin",
1246397,
"la-new",
}
-------------------------------------------------------------------------
-- Miscellaneous Italic varieties --
-------------------------------------------------------------------------
m["xfa-cap"] = {
"Capenate",
133182969,
"xfa",
}
m["osc-luc"] = {
"Lucanian",
3265025,
"osc",
}
m["osc-sam"] = {
"Samnite",
133184287,
"osc",
}
-------------------------------------------------------------------------
-- Romance varieties --
-------------------------------------------------------------------------
m["roa-pro"] = {
"Proto-Romance",
3408029,
"la-lat",
ancestors = "la-vul",
}
-----------------------------------------------------
-- Catalan varieties --
-----------------------------------------------------
m["ca-val"] = {
"Valencian",
32641,
"ca",
}
-----------------------------------------------------
-- Franco-Provençal varieties --
-----------------------------------------------------
m["frp-old"] = {
"Old Franco-Provençal",
nil,
"frp",
}
-----------------------------------------------------
-- French and derived creole varieties --
-----------------------------------------------------
m["fro-nor"] = {
"Old Northern French",
2044917,
"fro",
aliases = {"Old Norman", "Old Norman French"},
}
m["fro-pic"] = {
"Picard Old French",
nil,
"fro",
}
m["xno"] = {
"Anglo-Norman",
35214,
"fro-nor",
}
m["xno-law"] = {
"Law French",
2044323,
"xno",
}
m["zrp"] = {
"Zarphatic",
36994,
"fro",
aliases = {"Judeo-French"},
pseudo_families = "qfa-jew",
}
m["fr-CA"] = {
"Canadian French",
1450506,
"fr",
}
m["fr-CH"] = {
"Swiss French",
1480152,
"fr",
}
m["fr-aca"] = {
"Acadian French",
415109,
"fr",
}
m["fr-lou"] = {
"Louisiana French",
3083213,
"fr",
}
m["fr-mis"] = {
"Missouri French",
3083210,
"fr",
}
m["frc"] = {
"Cajun French",
880301,
"fr-lou",
}
m["ht-sdm"] = {
"Saint Dominican Creole French",
nil,
"ht",
ancestors = "fr",
}
-- Norman varieties
m["nrf-grn"] = {
"Guernsey Norman",
56428,
"nrf",
aliases = {"Guernsey"},
}
m["nrf-jer"] = {
"Jersey Norman",
56430,
"nrf",
aliases = {"Jersey"},
}
-----------------------------------------------------
-- Gallo-Italic varieties --
-----------------------------------------------------
m["egl-old"] = {
"Old Emilian",
nil,
"egl",
}
m["lij-old"] = {
"Old Ligurian",
nil,
"lij",
aliases = {"Old Genoese"},
}
m["lmo-old"] = {
"Old Lombard",
97165320,
"lmo",
}
m["pms-old"] = {
"Old Piedmontese",
nil,
"pms",
aliases = {"Old Piemontese"},
}
m["vec-old"] = {
"Old Venetan",
nil,
"vec",
aliases = {"Old Venetian"},
}
m["rgn-old"] = {
"Old Romagnol",
nil,
"rgn",
}
-----------------------------------------------------
-- Italo-Romance varieties --
-----------------------------------------------------
-- Italian varieties
m["roa-oit"] = {
"Old Italian",
nil,
"it",
}
m["it-CH"] = {
"Switzerland Italian",
672147,
"it",
}
-- Other Italo-Romance varieties
m["nap-old"] = {
"Old Neapolitan",
nil,
"nap",
}
m["scn-old"] = {
"Old Sicilian",
nil,
"scn",
}
-----------------------------------------------------
-- Occitan varieties --
-----------------------------------------------------
m["oc-auv"] = {
"Auvergnat",
35359,
"oc",
aliases = {"Auvernhat", "Auvergnese"},
}
m["oc-gas"] = {
"Gascon",
35735,
"oc",
}
-- standardized dialect of Gascon
m["oc-ara"] = {
"Aranese",
10196,
"oc-gas",
}
m["oc-lan"] = {
"Languedocien",
942602,
"oc",
aliases = {"Lengadocian"},
}
m["oc-lim"] = {
"Limousin",
427614,
"oc",
}
m["oc-pro"] = {
"Provençal",
241243,
"oc",
aliases = {"Provencal"},
}
m["oc-pro-old"] = {
"Old Provençal",
2779185,
"pro",
}
m["oc-viv"] = {
"Vivaro-Alpine",
1649613,
"oc",
}
m["oc-jud"] = {
"Shuadit",
56472,
"oc",
aliases = {
"Chouhadite", "Chouhadit", "Chouadite", "Chouadit", "Shuhadit",
"Judeo-Occitan", "Judæo-Occitan", "Judaeo-Occitan",
"Judeo-Provençal", "Judæo-Provençal", "Judaeo-Provençal",
"Judeo-Provencal", "Judaeo-Provencal",
"Judeo-Comtadin", "Judæo-Comtadin", "Judaeo-Comtadin",
},
pseudo_families = "qfa-jew",
}
-----------------------------------------------------
-- Portuguese and derived creole varieties --
-----------------------------------------------------
-- Portuguese
m["pt-BR"] = {
"Brazilian Portuguese",
750553,
"pt",
}
m["pt-PT"] = {
"European Portuguese",
922399,
"pt",
}
-- Kabuverdianu (Cape Verde Creole, Cape Verdean Creole)
m["kea-bar"] = {
"Barlavento Kabuverdianu",
2217638,
"kea",
aliases = {"Barlavento", "Barlavento Creole", "Sampadjudu"},
}
m["kea-bvi"] = {
"Boa Vista Kabuverdianu",
16501837,
"kea-bar",
aliases = {"Boa Vista Creole"},
}
m["kea-sal"] = {
"Sal Kabuverdianu",
18707467,
"kea-bar",
aliases = {"Sal Creole"},
}
m["kea-saa"] = {
"Santo Antão Kabuverdianu",
18707472,
"kea-bar",
aliases = {"Santo Antão Creole"},
}
m["kea-sni"] = {
"São Nicolau Kabuverdianu",
18707549,
"kea-bar",
aliases = {"São Nicolau Creole"},
}
m["kea-svi"] = {
"São Vicente Kabuverdianu",
18707550,
"kea-bar",
aliases = {"São Vicente Creole"},
}
m["kea-sot"] = {
"Sotavento Kabuverdianu",
10261559,
"kea",
aliases = {"Sotavento", "Sotavento Creole", "Badiu"},
}
m["kea-bra"] = {
"Brava Kabuverdianu",
18670181,
"kea-sot",
aliases = {"Brava Creole"},
}
m["kea-fog"] = {
"Fogo Kabuverdianu",
18706861,
"kea-sot",
aliases = {"Fogo Creole"},
}
m["kea-mai"] = {
"Maio Kabuverdianu",
18707286,
"kea-sot",
aliases = {"Maio Creole"},
}
m["kea-san"] = {
"Santiago Kabuverdianu",
35117,
"kea-sot",
aliases = {"Santiago Creole"},
}
m["kea-alu"] = {
"ALUPEC Kabuverdianu",
375704,
"kea",
aliases = {"ALUPEC", "Alfabeto Unificado para a Escrita do Cabo-Verdiano"},
}
-----------------------------------------------------
-- Rhaeto-Romance varieties --
-----------------------------------------------------
-- Friulian varieties
m["fur-old"] = {
"Old Friulian",
nil,
"fur",
}
-- Ladin varieties
m["lld-amp"] = {
"Ampezan Ladin",
25617466,
"lld",
aliases = {"Anpezan", "Ampezan", "Ampezzan", "Ampezzano"},
}
m["lld-bad"] = {
"Badiot Ladin",
3706562,
"lld",
aliases = {"Badiot", "Badioto", "Badiotto"},
}
m["lld-cad"] = {
"Cadorino Ladin",
3706570,
"lld",
aliases = {"Cadorino"},
}
m["lld-fas"] = {
"Fascian Ladin",
742627,
"lld",
aliases = {"Fascian", "Fassano"},
}
m["lld-fod"] = {
"Fodom Ladin",
3706605,
"lld",
aliases = {"Fodom", "Livinallese"},
}
m["lld-for"] = {
"Fornes Ladin",
5470374,
"lld",
aliases = {"Fornes"},
}
m["lld-ghe"] = {
"Gherdëina Ladin",
3706597,
"lld",
aliases = {"Gherdëina", "Gardenese", "Val Gardena"},
}
m["lld-non"] = {
"Nones Ladin",
1055027,
"lld",
aliases = {"Nones", "Noneso"},
}
-- Romansh varieties
m["rm-old"] = {
"Old Romansh",
nil,
"rm",
}
m["rm-put"] = {
"Puter Romansh",
688309,
"rm",
aliases = {"Puter", "Putèr", "Upper Engadine", "rm-puter"},
}
m["rm-srm"] = {
"Surmiran Romansh",
690216,
"rm",
aliases = {"Surmiran", "rm-surmiran",
"Surmiran-Albula", -- Glottolog
},
}
m["rm-srs"] = {
"Sursilvan Romansh",
688348,
"rm",
aliases = {"Sursilvan", "rm-sursilv"},
}
m["rm-sut"] = {
"Sutsilvan Romansh",
688272,
"rm",
aliases = {"Sutsilvan", "rm-sutsilv"},
varieties = {"Scharans Sutsilvan"}, -- per Glottolog
}
m["rm-val"] = {
"Vallader Romansh",
690226,
"rm",
aliases = {"Vallader", "Putèr", "Lower Engadine", "rm-vallader"},
}
m["rm-gri"] = {
"Rumantsch Grischun",
688873,
"rm",
aliases = {"rm-rumgr"},
}
-----------------------------------------------------
-- Sardinian varieties --
-----------------------------------------------------
m["sc-old"] = {
"Old Sardinian",
nil,
"sc",
}
m["sc-src"] = {
"Logudorese",
777974,
"sc",
aliases = {"Logudorese Sardinian"},
}
m["sc-nuo"] = {
"Nuorese",
nil,
"sc-src",
aliases = {"Nuorese Sardinian"},
}
m["sc-sro"] = {
"Campidanese",
35348,
"sc",
aliases = {"Campidanese Sardinian"},
}
-----------------------------------------------------
-- Spanish varieties --
-----------------------------------------------------
m["es-ear"] = {
"Early Modern Spanish",
5364419,
"es",
}
m["es-AR"] = {
"Rioplatense Spanish",
509780,
"es",
}
m["es-BO"] = {
"Bolivian Spanish",
510730,
"es",
}
m["es-CL"] = {
"Chilean Spanish",
857295,
"es",
}
m["es-CO"] = {
"Colombian Spanish",
1115875,
"es",
}
m["es-CU"] = {
"Cuban Spanish",
824909,
"es",
}
m["es-MX"] = {
"Mexican Spanish",
616620,
"es",
}
m["es-PE"] = {
"Peruvian Spanish",
736236,
"es",
}
m["es-PH"] = {
"Philippine Spanish",
22091406,
"es",
}
m["es-US"] = {
"United States Spanish",
2301077,
"es",
aliases = {"US Spanish"},
}
--use label "US Spanish" to put Spanish terms in this category
m["es-PR"] = {
"Puerto Rican Spanish",
7258609,
"es",
}
m["es-VE"] = {
"Venezuelan Spanish",
840017,
"es",
}
m["es-lun"] = {
"Lunfardo",
1401612,
"es",
}
----------------------------------------------------------------------------------------------------------------------
-- Japonic varieties --
----------------------------------------------------------------------------------------------------------------------
-- Japanese varieties
m["ja-mid"] = {
"Middle Japanese",
6841474,
"ojp",
ancestors = "ojp",
}
m["ja-mid-ear"] = {
"Early Middle Japanese",
182695,
"ja-mid",
}
m["ja-mid-lat"] = {
"Late Middle Japanese",
1816184,
"ja-mid",
ancestors = "ja-mid-ear",
}
m["ja-ear"] = {
"Early Modern Japanese",
5326692,
"ja",
ancestors = "ja-mid-lat",
}
m["ojp-eas"] = {
"Eastern Old Japanese",
65247957,
"ojp",
}
m["ja-cla"] = {
"Classical Japanese",
1332057,
"ja",
-- FIXME: This is redundant because Classical Japanese is considered a child of (Modern) Japanese, which has ja-mid-ear
-- (as well as ja-mid-lat) as ancestors. However, the intent here is that the *direct* ancestor of ja-cla is ja-mid-ear
-- and ja-mid-lat is not an ancestor. Need to rethink ancestor handling.
-- ancestors = "ja-mid-ear",
}
----------------------------------------------------------------------------------------------------------------------
-- Koreanic varieties --
----------------------------------------------------------------------------------------------------------------------
-- Korean varieties
m["oko-lat"] = {
"Late Old Korean",
nil,
"oko",
}
m["okm-ear"] = {
"Early Middle Korean",
nil,
"okm",
}
m["ko-cen"] = {
"Central Korean",
nil,
"ko",
}
m["ko-gyg"] = {
"Gyeonggi Korean",
485492,
"ko-cen",
aliases = {"Seoul Korean"},
}
m["ko-chu"] = {
"Chungcheong Korean",
625800,
"ko-cen",
aliases = {"Hoseo Korean"},
}
m["ko-hwa"] = {
"Hwanghae Korean",
16183706,
"ko-cen",
}
m["ko-gan"] = {
"Gangwon Korean",
11260444,
"ko-cen",
aliases = {"Yeongdong Korean"},
}
m["ko-gys"] = {
"Gyeongsang Korean",
488002,
"ko",
aliases = {"Southeastern Korean"},
}
m["ko-jeo"] = {
"Jeolla Korean",
11250166,
"ko",
aliases = {"Southwestern Korean"},
}
m["ko-pyo"] = {
"Pyongan Korean",
7263142,
"ko",
aliases = {"Northwestern Korean"},
}
m["ko-ham"] = {
"Hamgyong Korean",
860702,
"ko",
aliases = {"Northeastern Korean"},
}
m["ko-yuk"] = {
"Yukjin Korean",
16171275,
"ko",
aliases = {"Yukchin Korean", "Ryukjin Korean", "Ryukchin Korean"},
}
----------------------------------------------------------------------------------------------------------------------
-- Mongolic varieties --
----------------------------------------------------------------------------------------------------------------------
m["xng-ear"] = {
"Early Middle Mongol",
nil,
"xng",
}
m["xng-lat"] = {
"Late Middle Mongol",
nil,
"xng",
ancestors = "xng-ear",
}
m["mn-kha"] = {
"Khalkha Mongolian",
6399808,
"mn",
aliases = {"Khalkha"},
}
m["mn-ord"] = {
"Ordos Mongolian",
716904,
"mn",
aliases = {"Ordos"},
}
m["mn-cha"] = {
"Chakhar Mongolian",
907425,
"mn",
aliases = {"Chakhar"},
}
m["mn-khr"] = {
"Khorchin Mongolian",
3196210,
"mn",
aliases = {"Khorchin"},
}
----------------------------------------------------------------------------------------------------------------------
-- Niger-Congo varieties --
----------------------------------------------------------------------------------------------------------------------
-----------------------------------------------------
-- Akan varieties --
-----------------------------------------------------
m["tw"] = {
"Twi Akan",
36850,
"ak",
aliases = {"Twi"},
}
m["abr"] = {
"Abron",
34831,
"tw",
aliases = {"Brong", "Bono", "Bono Twi"},
}
m["tw-asa"] = {
"Asante Twi",
19261685,
"tw",
aliases = {"Asante", "Ashanti", "Ashante"},
}
m["tw-aku"] = {
"Akuapem Twi",
31150449,
"tw",
aliases = {"Akuapem", "Akuapim", "Akwapem Twi", "Akwapi"},
}
m["fat"] = {
"Fante Akan",
35570,
"ak",
aliases = {"Fante", "Fanti", "Fantse", "Mfantse"},
}
m["wss"] = {
"Wasa",
36914,
"ak",
}
-- creole
m["alv-kro"] = {
"Kromanti",
1093206,
"crp-mar",
}
-----------------------------------------------------
-- Bantu varieties --
-----------------------------------------------------
m["bnt-cmn"] = {
"Common Bantu",
nil,
"bnt-pro",
}
m["xh-bha"] = {
"Bhaca",
4900493,
"xh",
aliases = {"isiBhaca", "IsiBhaca"},
}
-- Rwanda-Rundi varieties
m["rw-kin"] = {
"Kinyarwanda",
33573,
"rw",
aliases = {"Rwanda"},
}
m["rw-run"] = {
"Kirundi",
33583,
"rw",
aliases = {"Rundi"},
}
-----------------------------------------------------
-- Fula varieties --
-----------------------------------------------------
m["fuc"] = {
"Pulaar",
1420205,
"ff",
}
m["fuf"] = {
"Pular",
3915357,
"ff",
}
m["ffm"] = {
"Maasina Fulfulde",
3915322,
"ff",
}
m["fue"] = {
-- no enwiki entry as of yet but frwiki and pmswiki have one
"Borgu Fulfulde",
12952426,
"ff",
}
m["fuh"] = {
-- no enwiki entry as of yet but frwiki and pmswiki have one
"Western Niger Fulfulde",
12952430,
"ff",
}
m["fuq"] = {
-- no enwiki entry as of yet but frwiki, hrwiki and pmswiki have one
"Central-Eastern Niger Fulfulde",
12628799,
"ff",
}
m["fuv"] = {
-- no enwiki entry as of yet but dewiki, frwiki, hrwiki, pmswiki and swwiki have one
"Nigerian Fulfulde",
36129,
"ff",
}
m["fub"] = {
-- no enwiki entry as of yet but dewiki, frwiki, hrwiki, pmswiki, ptwiki, swwiki and yowiki have one
"Adamawa Fulfulde",
34776,
"ff",
}
m["fui"] = {
-- no enwiki entry as of yet but pmswiki and swwiki have one
"Bagirmi Fulfulde",
11003859,
"ff",
}
----------------------------------------------------------------------------------------------------------------------
-- Papuan varieties --
----------------------------------------------------------------------------------------------------------------------
m["kze"] = {
"Kosena",
12952663,
"auy",
}
m["ont"] = {
"Ontenu",
3352827,
"gaj",
aliases = {"Ontena"},
}
----------------------------------------------------------------------------------------------------------------------
-- Salishan varieties --
----------------------------------------------------------------------------------------------------------------------
m["lut-nor"] = {
"Northern Lushootseed",
nil,
"lut",
aliases = {"Northern Puget Sound Salish"},
}
m["slh"] = {
"Southern Lushootseed",
7997684,
"lut",
aliases = {"Southern Puget Sound Salish", "Twulshootseed", "Whulshootseed"},
}
m["ska"] = {
"Skagit",
12642471,
"lut-nor",
}
m["sno"] = {
"Snohomish",
25559662,
"lut-nor",
}
----------------------------------------------------------------------------------------------------------------------
-- Sino-Tibetan varieties --
----------------------------------------------------------------------------------------------------------------------
m["tbq-pro"] = {
"Proto-Tibeto-Burman",
7251864,
"sit-pro",
}
-----------------------------------------------------
-- Chinese varieties --
-----------------------------------------------------
------------- Old Chinese, Middle Chinese -------------
m["och-ear"] = {
"Early Old Chinese",
nil,
"och",
}
m["och-lat"] = {
"Late Old Chinese",
nil,
"och",
}
m["ltc-ear"] = {
"Early Middle Chinese",
nil,
"ltc",
}
m["ltc-lat"] = {
"Late Middle Chinese",
nil,
"ltc",
}
------------- Classical/Literary varieties -------------
-- FIXME: Temporary.
m["lzh-shi"] = {
"Traditional Chinese poetry",
1759242,
"lzh",
}
-- FIXME: Temporary.
m["lzh-cii"] = {
"Ci",
1091366,
"lzh",
}
-- FIXME: Temporary.
m["lzh-yue"] = {
"Classical Cantonese",
nil,
"lzh",
}
-- FIXME: Temporary.
m["lzh-cmn"] = {
"Classical Mandarin",
nil,
"lzh",
}
-- FIXME: Temporary.
m["lzh-tai"] = {
"Classical Taishanese",
nil,
"lzh",
}
-- FIXME: Temporary.
m["lzh-cmn-TW"] = {
"Classical Taiwanese Mandarin",
nil,
"lzh-cmn",
}
-- FIXME: Temporary.
m["lzh-VI"] = {
"Vietnamese Classical Chinese",
17034227,
"lzh",
}
-- FIXME: Temporary.
m["lzh-KO"] = {
"Korean Classical Chinese",
10496257,
"lzh",
ietf_subtag = "lzh-KR" -- KR = South Korea, as there is no code for Korea as a whole
}
-- FIXME: Temporary.
m["lzh-lit"] = {
"Literary Chinese",
nil,
"lzh",
}
-- FIXME: Temporary. FIXME: Do we need this? How does it differ from Old Chinese?
m["lzh-pre"] = {
"Pre-Classical Chinese",
nil,
"lzh",
}
------------- Written Vernacular varieties -------------
-- FIXME: Temporary.
m["cmn-wvc"] = {
"Written vernacular Mandarin",
783605,
"cmn",
}
-- FIXME: Temporary. FIXME: How does this differ from "Literary Cantonese"?
m["yue-wvc"] = {
"Written vernacular Cantonese",
nil,
"yue",
}
-- FIXME: Temporary.
m["zhx-tai-wvc"] = {
"Written vernacular Taishanese",
nil,
"zhx-tai",
}
------------- Mandarin varieties -------------
-- FIXME: Temporary. NOTE: The Linguist List assigns the "w:Beijing dialect" (Wikidata 1147606) the code "cmn-bej" and
-- the larger "w:Beijing Mandarin (division of Mandarin)" dialect group (Wikidata 2169652; what we call "Beijingic
-- Mandarin", after Glottolog) the code "cmn-bei".
m["cmn-bei"] = {
"Beijing Mandarin",
1147606,
"cmn-bec",
}
-- FIXME: Temporary.
m["cmn-bec"] = {
"Beijingic Mandarin",
2169652,
"cmn",
}
-- FIXME: Temporary. NOTE: The Linguist List uses the code cmn-zho.
m["cmn-cep"] = {
"Central Plains Mandarin",
3048775,
"cmn",
aliases = {"Zhongyuan Mandarin"},
}
m["cmn-ear"] = {
"Early Mandarin",
837169,
"cmn",
ancestors = "ltc",
}
-- FIXME: Temporary.
m["cmn-gua"] = {
"Guanzhong Mandarin",
3431648,
"cmn-cep",
}
-- FIXME: Temporary. Appears to be a subdialect of Guiliu Mandarin, which in turn is a subdialect of Southwestern Mandarin.
m["cmn-gui"] = {
"Guilin Mandarin",
11111636,
"cmn-sow",
}
m["cmn-jhu"] = {
"Jianghuai Mandarin",
2128953,
"cmn",
aliases = {"Lower Yangtze Mandarin"},
}
-- FIXME: Temporary.
m["cmn-lan"] = {
"Lanyin Mandarin",
662754,
"cmn",
}
-- FIXME: Temporary.
m["cmn-MY"] = {
"Malaysian Mandarin",
13646143,
"cmn",
}
-- FIXME: Temporary.
m["cmn-nan"] = {
"Nanjing Mandarin",
2681098,
"cmn-jhu",
}
-- FIXME: Temporary.
m["cmn-noe"] = {
"Northeastern Mandarin",
1064504,
"cmn",
}
-- FIXME: Temporary.
m["cmn-PH"] = {
"Philippine Mandarin",
7185155,
"cmn",
}
-- FIXME: Temporary.
m["cmn-SG"] = {
"Singapore Mandarin",
1048980,
"cmn",
}
-- FIXME: Temporary.
m["cmn-sow"] = {
"Southwestern Mandarin",
2609239,
"cmn",
}
-- FIXME: Temporary. Appears to be a subdialect of Jilu Mandarin.
m["cmn-tia"] = {
"Tianjin Mandarin",
7800220,
"cmn",
}
-- FIXME: Temporary. NOTE: Wikidata also has Q4380827 "Taiwanese Mandarin", defined as "rare dialect of Standard Chinese
-- (Mandarin) used in Taiwan, which is strongly influenced by Taiwanese Hokkien; mostly used by elderlies" and having no
-- English Wikipedia article (but see w:zh:臺灣國語).
m["cmn-TW"] = {
"Taiwanese Mandarin",
262828,
"cmn",
}
-- FIXME: Temporary. Appears to be a subdialect of Wu-Tian Mandarin, in turn a subdialect of Southwestern Mandarin.
-- Given the code cmn-xwu in the Linguist List.
m["cmn-wuh"] = {
"Wuhan Mandarin",
11124731,
"cmn-sow",
aliases = {"Wuhanese"},
}
-- FIXME: Temporary. Appears to be a subdialect of Lanyin Mandarin.
m["cmn-xin"] = {
"Xining Mandarin",
nil,
"cmn-lan",
}
-- FIXME: Temporary.
m["cmn-yan"] = {
"Yangzhou Mandarin",
nil,
"cmn-jhu",
}
------------- Cantonese varieties -------------
-- FIXME: Temporary.
m["yue-gua"] = {
"Guangzhou Cantonese",
nil,
"yue",
}
-- FIXME: Temporary. Given the codes yue-yue or yue-can in the Linguist List.
m["yue-HK"] = {
"Hong Kong Cantonese",
5894342,
"yue",
}
-- FIXME: Temporary. FIXME: How does this differ from "Written vernacular Cantonese"?
m["yue-lit"] = {
"Literary Cantonese",
2472605,
"yue",
}
------------- Wu varieties -------------
m["wuu-han"] = {
"Hangzhounese",
5648144,
"wuu",
}
m["wuu-nin"] = {
"Ningbonese",
3972199,
"wuu",
}
-- FIXME: Temporary.
m["wuu-nor"] = {
"Northern Wu",
7675988,
"wuu",
aliases = {"Taihu Wu"},
}
-- FIXME: Temporary? Subvariety of Taihu Wu. NOTE: "chm" stands for Chongming, the main dialect, to avoid a conflict
-- with Shanghainese.
m["wuu-chm"] = {
"Shadi Wu",
6112340,
"wuu-nor",
}
m["wuu-sha"] = {
"Shanghainese",
36718,
"wuu-nor",
}
m["wuu-suz"] = {
"Suzhounese",
831744,
"wuu-nor",
}
-- FIXME: Temporary. May be converted into a full language and/or split.
m["wuu-wen"] = {
"Wenzhounese",
710218,
"wuu",
}
------------- Xiang varieties -------------
m["hsn-lou"] = {
"Loudi Xiang",
10943823,
"hsn-old",
}
m["hsn-hya"] = {
"Hengyang Xiang",
20689035,
"hsn-hzh",
}
m["hsn-hzh"] = {
"Hengzhou Xiang",
nil,
"hsn",
}
m["hsn-new"] = {
"New Xiang",
7012696,
"hsn",
aliases = {"Chang-Yi"},
}
m["hsn-old"] = {
"Old Xiang",
7085453,
"hsn",
aliases = {"Lou-Shao"},
}
------------- Hakka varieties -------------
-- FIXME: Temporary.
m["hak-dab"] = {
"Dabu Hakka",
19855566,
"hak", -- formerly hak-TW but seems to be spoken primary in Dabu County in Guangdong
}
-- FIXME: Temporary.
m["hak-eam"] = {
"Early Modern Hakka",
nil,
"hak",
}
-- FIXME: Temporary.
m["hak-hai"] = {
"Hailu Hakka",
17038519,
"hak", -- often considered a Taiwanese lect but also spoken in [[Shanwei]], [[Guangdong]]
}
-- FIXME: Temporary.
m["hak-HK"] = {
"Hong Kong Hakka",
2675834,
"hak",
}
-- FIXME: Temporary.
m["hak-hui"] = {
"Huiyang Hakka",
16873881,
"hak",
}
-- FIXME: Temporary.
m["hak-hui-MY"] = {
"Malaysian Huiyang Hakka",
nil,
"hak-hui",
}
-- FIXME: Temporary. Similar to and possibly the parent of Sixian Hakka in Taiwan.
m["hak-mei"] = {
"Meixian Hakka",
839295,
"hak",
aliases = {"Moiyan Hakka", "Meizhou Hakka"},
}
-- FIXME: Temporary.
m["hak-six"] = {
"Sixian Hakka",
9668261,
"hak-TW",
}
-- FIXME: Temporary.
m["hak-TW"] = {
"Taiwanese Hakka",
2391532,
"hak",
}
-- FIXME: Temporary.
m["hak-zha"] = {
"Zhao'an Hakka",
6703311,
"hak",
aliases = {"Zhangzhou Hakka"},
}
-- Southern Min varieties --
m["nan-anx"] = {
"Anxi Hokkien",
97064149,
"nan-qua",
}
m["nan-cha"] = {
"Changtai Hokkien",
nil,
"nan-zha",
}
m["nan-hou"] = {
"Houlu Min",
19855492,
"nan-dat",
}
m["nan-hui"] = {
"Hui'an Hokkien",
16241797,
"nan-qua",
}
m["nan-jin"] = {
"Jinjiang Hokkien",
11089375,
"nan-qua",
}
m["nan-kin"] = {
"Kinmenese Hokkien",
56278342,
"nan-xia",
aliases = {"Kinmen Hokkien"},
}
m["nan-med"] = {
"Medan Hokkien",
6805114,
"nan-zha",
}
m["nan-pen"] = {
"Penang Hokkien",
11120689,
"nan-zha",
}
m["nan-hbl-PH"] = {
"Philippine Hokkien",
3236692,
"nan-qua",
}
m["nan-qia"] = {
"Qianlu Min",
19842517,
"nan-dat",
}
m["nan-qua"] = {
"Quanzhou Hokkien",
2251677,
"nan-hbl",
aliases = {"Chinchew", "Choanchew"},
}
-- FIXME: Temporary? Derived from both Quanzhou and Zhangzhou Hokkien.
m["nan-hbl-SG"] = {
"Singapore Hokkien",
3846528,
"nan-hbl",
}
m["nan-spm"] = {
"Southern Malaysian Hokkien",
7570322,
"nan-qua",
aliases = {"Southern Malaysia Hokkien", "Southern Peninsular Malaysian Hokkien", "Southern Peninsular Malaysia Hokkien"}
}
m["nan-hbl-TW"] = {
"Taiwanese Hokkien",
36778,
"nan-hbl",
}
m["nan-ton"] = {
"Tong'an Hokkien",
nil,
"nan-xia",
}
m["nan-xia"] = {
"Xiamen Hokkien",
68744,
"nan-hbl",
aliases = {"Amoy", "Amoyese", "Amoynese", "Xiamenese"},
}
m["nan-yon"] = {
"Yongchun Hokkien",
65118728,
"nan-qua",
}
m["nan-zha"] = {
"Zhangzhou Hokkien",
8070492,
"nan-hbl",
aliases = {"Changchew", "Chiangchew", "Changchow"},
}
m["nan-zho"] = {
"Zhao'an Hokkien",
65118728,
"nan-zha",
aliases = {"Zhao'an", "Chawan", "Chawan Hokkien"},
}
m["nan-zhp"] = {
"Zhangping Hokkien",
15937822,
"nan-zha",
}
------------- Other Min varieties -------------
-- FIXME: Temporary. Affiliation within Min uncertain; some combination of Eastern and Southern.
m["zhx-zho"] = {
"Zhongshan Min",
8070958,
"zh",
}
------------- Other Chinese varieties -------------
-- FIXME: Temporary. Affiliation within Chinese uncertain; possibly Yue.
m["zhx-dan"] = {
"Danzhou Chinese",
2578935,
"zh",
}
------------- Chinese romanization varieties -------------
-- [[Wiktionary:Information desk/2022/June#Etymology Coding Issue]]
-- [[Wiktionary:Grease pit/2022/June#Transliteration Systems in Etymologies 2]]
m["cmn-pinyin"] = {
"Hanyu Pinyin",
42222,
"cmn",
aliases = {"Pinyin"},
}
m["cmn-tongyong"] = {
"Tongyong Pinyin",
700739,
"cmn",
}
m["cmn-wadegiles"] = {
"Wade–Giles",
208442,
"cmn",
aliases = {"Wade-Giles", "Wade Giles"},
}
m["zh-postal"] = {
"Postal Romanization",
151868,
"zh",
}
-- Chinese cyrillization
m["cmn-palladius"] = {
"Palladius",
1234239,
"cmn",
aliases = {"Palladius system"},
}
-----------------------------------------------------
-- Tibetic varieties --
-----------------------------------------------------
m["adx"] = {
"Amdo Tibetan",
56509,
"bo",
}
m["kbg"] = {
"Khamba",
12952626,
"bo",
}
m["khg"] = {
"Khams Tibetan",
56601,
"bo",
}
m["tsk"] = {
"Tseku",
11159532,
"bo",
}
----------------------------------------------------------------------------------------------------------------------
-- Tai-Kadai varieties --
----------------------------------------------------------------------------------------------------------------------
m["th-old"] = {
"Old Thai",
nil,
"tai-swe-pro",
wikipedia_article = "Thai language#Old Thai",
}
m["th-suk"] = {
"Sukhothai Old Thai", -- 1238-1438. Cannot use "Sukhothai Thai" as Sukhothai is the current city and "Sukhothai Thai" is a lect.
nil,
"th-old",
aliases = {"Sukhothai Siamese"},
wikipedia_article = "Thai language#Old Thai",
}
m["th-ayu"] = {
"Ayutthaya Old Thai", -- 1351-1767. Cannot use "Ayutthaya Thai" as Ayutthaya is the current city.
nil,
"th-old",
aliases = {"Ayutthaya Siamese"},
wikipedia_article = "Thai language#Old Thai",
}
--[[
m["th-new"] = {
"Hacked Thai", -- temporary for testing new translit/display methods
nil,
"th",
translit = "User:Benwing2/th-scraping-translit",
display_text = "User:Benwing2/th-scraping-translit",
strip_diacritics = "User:Benwing2/th-scraping-translit",
preprocess_links = "User:Benwing2/th-scraping-translit",
}
]]
m["tai-shz"] = {
"Shangsi Zhuang",
13216,
"za",
}
----------------------------------------------------------------------------------------------------------------------
-- Turkic varieties --
----------------------------------------------------------------------------------------------------------------------
m["trk-cmn-pro"] = {
"Proto-Common Turkic",
1126028,
"trk-pro",
}
m["trk-ogr-pro"] = {
"Proto-Oghur",
1422731,
"trk-pro",
family = "trk-ogr",
}
m["trk-bul-pro"] = {
"Proto-Bulgar",
nil,
"trk-ogr-pro",
}
m["trk-ogz-pro"] = {
"Proto-Oghuz",
494600,
"trk-pro",
family = "trk-ogz",
aliases = {"Southwestern Common Turkic"},
}
m["crh-dbj"] = {
"Dobrujan Tatar",
12811566,
"crh",
aliases = {"Romanian Tatar"},
}
m["cv-ana"] = {
"Anatri Chuvash",
nil,
"cv",
aliases = {"Anatri", "Lower Chuvash"},
}
m["cv-mid"] = {
"Middle Chuvash",
nil,
"cv",
ancestors = "cv-old",
}
m["cv-old"] = {
"Old Chuvash",
nil,
"cv",
ancestors = "xbo-vol",
}
m["cv-vir"] = {
"Viryal Chuvash",
4278332,
"cv",
aliases = {"Viryal", "Upper Chuvash"},
}
m["kjh-fyu"] = {
"Fuyu Kyrgyz",
2598963,
"kjh",
aliases = {"Fuyu Kirgiz", "Fuyu Kirghiz", "Manchurian Kyrgyz", "Manchurian Kirgiz", "Manchurian Kirghiz"},
}
m["klj-arg"] = {
"Arghu",
33455,
"klj",
ancestors = "trk-cmn-pro",
}
m["otk-kir"] = {
"Old Kirghiz",
83142,
"otk",
aliases = {"Yenisei Turkic", "Yenisei Kyrgyz"},
}
m["otk-ork"] = {
"Orkhon Turkic",
31295480,
"otk",
}
m["qwm-cum"] = {
"Cuman",
1075050,
"qwm",
aliases = {"Kuman", "Polovtsian", "Polovcian"},
}
m["qwm-arm"] = {
"Armeno-Kipchak",
2027503,
"qwm",
ancestors = "qwm-cum",
aliases = {"Xıpçaχ tili", "Tatarça"},
}
m["qwm-mam"] = {
"Mamluk-Kipchak",
4279942,
"qwm",
aliases = {"Mameluk-Kipchak"},
}
m["az-cls"] = {
"Classical Azerbaijani",
nil,
"az",
aliases = {"Classical Azeri"},
}
m["qxq"] = {
"Qashqai",
13192,
"az",
aliases = {"Qaşqay", "Qashqayi", "Kashkai", "Kashkay"},
}
m["tr-CY"] = {
"Cypriot Turkish",
7917392,
"tr",
}
m["uz-afg"] = {
-- NOTE: has ISO 639-3 code uzs assigned to it.
"Afghan Uzbek",
1066787,
"uz",
aliases = {"Southern Uzbek"},
translit = "uz-afg-translit",
}
m["xbo-dan"] = {
"Danube Bulgar",
nil,
"xbo",
}
m["xbo-vol"] = {
"Volga Bulgar",
nil,
"xbo",
}
----------------------------------------------------------------------------------------------------------------------
-- Uralic varieties --
----------------------------------------------------------------------------------------------------------------------
m["fiu-pro"] = {
"Proto-Finno-Ugric",
79890,
"urj-pro",
}
m["urj-fpr-pro"] = {
"Proto-Finno-Permic",
nil,
"urj-pro",
}
m["krl-nor"] = {
"North Karelian",
125501196,
"krl",
}
m["krl-sou"] = {
"South Karelian",
129812730,
"krl",
}
m["mns-eas"] = {
"Eastern Mansi",
30311755,
"mns-cen",
}
m["mns-wes"] = {
"Western Mansi",
30311756,
"mns-cen",
}
----------------------------------------------------------------------------------------------------------------------
-- Yeneseian varieties --
----------------------------------------------------------------------------------------------------------------------
m["qfa-yke-pro"] = {
"Proto-Ketic",
nil,
"qfa-yen-pro",
family = "qfa-yke",
}
m["qfa-yko-pro"] = {
"Proto-Kottic",
nil,
"qfa-yen-pro",
family = "qfa-yko",
}
m["qfa-yrn-pro"] = {
"Proto-Arinic",
nil,
"qfa-yen-pro",
family = "qfa-yrn",
}
m["qfa-ypm-pro"] = {
"Proto-Pumpokolic",
nil,
"qfa-yen-pro",
family = "qfa-ypm",
}
----------------------------------------------------------------------------------------------------------------------
-- Miscellaneous varieties --
----------------------------------------------------------------------------------------------------------------------
m["mul-tax"] = {
"taxonomic name",
522190,
"mul",
}
-----------------------------------------------------
-- Elamite varieties --
-----------------------------------------------------
m["elx-old"] = {
"Old Elamite",
nil,
"elx",
}
m["elx-mid"] = {
"Middle Elamite",
nil,
"elx",
}
m["elx-neo"] = {
"Neo-Elamite",
nil,
"elx",
}
m["elx-ach"] = {
"Achaemenid Elamite",
nil,
"elx",
}
-----------------------------------------------------
-- Substrates --
-----------------------------------------------------
-- Pre-Roman substrates
m["qsb-ibe"] = {
"Paleo-Hispanic",
246801,
"und",
family = "qfa-sub",
aliases = {"Palaeo-Hispanic", "Paleohispanic", "Palaeohispanic", "Paleo-Iberian", "Palaeo-Iberian"},
}
m["qsb-bal"] = {
"Paleo-Balkan",
1815070,
"und",
family = "qfa-sub",
aliases = {"Palaeo-Balkan", "Paleobalkan", "Palaeobalkan"},
}
m["xaq"] = {
"Aquitanian",
500522,
"euq-pro",
family = "euq",
}
return require("Module:languages").finalizeData(m, "language", true)
83dn29jlgbktzhj3fbjqygqjhl86u5c
Module:languages/data/exceptional
828
5988
17425
2026-07-13T08:39:04Z
Hiyuune
6766
+
17425
Scribunto
text/plain
local m_langdata = require("Module:languages/data")
-- Loaded on demand, as it may not be needed (depending on the data).
local function u(...)
u = require("Module:string utilities").char
return u(...)
end
local c = m_langdata.chars
local p = m_langdata.puaChars
local s = m_langdata.shared
local m = {}
m["aav-khs-pro"] = {
"Proto-Khasian",
116773216,
"aav-khs",
"Latn",
type = "reconstructed",
}
m["aav-nic-pro"] = {
"Proto-Nicobarese",
116773793,
"aav-nic",
"Latn",
type = "reconstructed",
}
m["aav-pkl-pro"] = {
"Proto-Pnar-Khasi-Lyngngam",
116773259,
"aav-pkl",
"Latn",
type = "reconstructed",
}
m["aav-pro"] = { -- mkh-pro will merge into this
"Proto-Austroasiatic",
116773186,
"aav",
"Latn",
type = "reconstructed",
}
m["afa-pro"] = {
"Proto-Afroasiatic",
269125,
"afa",
"Latn",
type = "reconstructed",
}
m["alg-aga"] = {
"Agawam",
nil,
"alg-eas",
"Latn",
}
m["alg-pro"] = {
"Proto-Algonquian",
7251834,
"alg",
"Latn",
type = "reconstructed",
sort_key = {remove_diacritics = "·"},
}
m["alv-ama"] = {
"Amasi",
4740400,
"nic-grs",
"Latn",
strip_diacritics = {remove_diacritics = c.grave .. c.acute .. c.circ .. c.tilde .. c.macron},
}
m["alv-bgu"] = {
"Bainouk Gubeeher",
17002646,
"alv-bny",
"Latn",
}
m["alv-bua-pro"] = {
"Proto-Bua",
116773723,
"alv-bua",
"Latn",
type = "reconstructed",
}
m["alv-cng-pro"] = {
"Proto-Cangin",
116773726,
"alv-cng",
"Latn",
type = "reconstructed",
}
m["alv-edo-pro"] = {
"Proto-Edoid",
116773206,
"alv-edo",
"Latn",
type = "reconstructed",
}
m["alv-fli-pro"] = {
"Proto-Fali",
116773754,
"alv-fli",
"Latn",
type = "reconstructed",
}
m["alv-gbe-pro"] = {
"Proto-Gbe",
116773208,
"alv-gbe",
"Latn",
type = "reconstructed",
}
m["alv-gng-pro"] = {
"Proto-Guang",
116773757,
"alv-gng",
"Latn",
type = "reconstructed",
}
m["alv-gtm-pro"] = {
"Proto-Central Togo",
116773732,
"alv-gtm",
"Latn",
type = "reconstructed",
}
m["alv-gwa"] = {
"Gwara",
16945580,
"nic-pla",
"Latn",
}
m["alv-hei-pro"] = {
"Proto-Heiban",
116773760,
"alv-hei",
"Latn",
type = "reconstructed",
}
m["alv-ido-pro"] = {
"Proto-Idomoid",
116773764,
"alv-ido",
"Latn",
type = "reconstructed",
}
m["alv-igb-pro"] = {
"Proto-Igboid",
116773765,
"alv-igb",
"Latn",
type = "reconstructed",
}
m["alv-kwa-pro"] = {
"Proto-Kwa",
116773780,
"alv-kwa",
"Latn",
type = "reconstructed",
}
m["alv-mum-pro"] = {
"Proto-Mumuye",
116773791,
"alv-mum",
"Latn",
type = "reconstructed",
}
m["alv-nup-pro"] = {
"Proto-Nupoid",
116773795,
"alv-nup",
"Latn",
type = "reconstructed",
}
m["alv-pro"] = {
"Proto-Atlantic-Congo",
116732838,
"alv",
"Latn",
type = "reconstructed",
}
m["alv-edk-pro"] = {
"Proto-Edekiri",
nil,
"alv-edk",
"Latn",
type = "reconstructed",
}
m["alv-yor-pro"] = {
"Proto-Yoruba",
nil,
"alv-yor",
"Latn",
type = "reconstructed",
}
m["alv-yrd-pro"] = {
"Proto-Yoruboid",
116773824,
"alv-yrd",
"Latn",
type = "reconstructed",
}
m["alv-von-pro"] = {
"Proto-Volta-Niger",
116773820,
"alv-von",
"Latn",
type = "reconstructed",
}
m["apa-pro"] = {
"Proto-Apachean",
116773135,
"apa",
"Latn",
type = "reconstructed",
}
m["aql-pro"] = {
"Proto-Algic",
18389588,
"aql",
"Latn",
type = "reconstructed",
sort_key = {remove_diacritics = "·"},
}
m["art-adu"] = {
"Adûni",
1232159,
"art",
"Latn",
type = "appendix-constructed",
}
m["art-bel"] = {
"Belter Creole",
108055510,
"art",
"Latn",
type = "appendix-constructed",
sort_key = {
remove_diacritics = c.acute,
from = {"ɒ"},
to = {"a"},
},
}
m["art-blk"] = {
"Bolak",
2909283,
"art",
"Latn",
type = "appendix-constructed",
}
m["art-bsp"] = {
"Black Speech",
686210,
"art",
"Latn, Teng",
type = "appendix-constructed",
}
m["art-com"] = {
"Communicationssprache",
35227,
"art",
"Latn",
type = "appendix-constructed",
}
m["art-dtk"] = {
"Dothraki",
2914733,
"art",
"Latn",
type = "appendix-constructed",
}
m["art-elo"] = {
"Eloi",
nil,
"art",
"Latn",
type = "appendix-constructed",
}
m["art-gld"] = {
"Goa'uld",
19823,
"art",
"Latn, Egyp, Mero",
type = "appendix-constructed",
}
m["art-lap"] = {
"Lapine",
6488195,
"art",
"Latn",
type = "appendix-constructed",
}
m["art-man"] = {
"Mandalorian",
54289,
"art",
"Latn",
type = "appendix-constructed",
}
m["art-mun"] = {
"Mundolinco",
851355,
"art",
"Latn",
type = "appendix-constructed",
}
m["art-nav"] = {
"Naʼvi",
316939,
"art",
"Latn",
type = "appendix-constructed",
}
m["art-vlh"] = {
"High Valyrian",
64483808,
"art",
"Latn",
type = "appendix-constructed",
}
m["ath-nic"] = {
"Nicola",
20609,
"ath-nor",
"Latn",
}
m["ath-pro"] = {
"Proto-Athabaskan",
104841722,
"ath",
"Latn",
type = "reconstructed",
}
m["auf-pro"] = {
"Proto-Arawa",
116773706,
"auf",
"Latn",
type = "reconstructed",
}
m["aus-alu"] = {
"Alungul",
16827670,
"aus-pmn",
"Latn",
}
m["aus-and"] = {
"Andjingith",
4754509,
"aus-pmn",
"Latn",
}
m["aus-ang"] = {
"Angkula",
16828520,
"aus-pmn",
"Latn",
}
m["aus-arn-pro"] = {
"Proto-Arnhem",
116773720,
"aus-arn",
"Latn",
type = "reconstructed",
}
m["aus-bra"] = {
"Barranbinya",
4863220,
"aus-pmn",
"Latn",
}
m["aus-brm"] = {
"Barunggam",
4865914,
"aus-pmn",
"Latn",
}
m["aus-cww-pro"] = {
"Proto-Central New South Wales",
116773199,
"aus-cww",
"Latn",
type = "reconstructed",
}
m["aus-dal-pro"] = {
"Proto-Daly",
116773743,
"aus-dal",
"Latn",
type = "reconstructed",
}
m["aus-guw"] = {
"Guwar",
6652138,
"aus-pam",
"Latn",
}
m["aus-lsw"] = {
"Little Swanport",
6652138,
"qfa-unc",
"Latn",
}
m["aus-mbi"] = {
"Mbiywom",
6799701,
"aus-pmn",
"Latn",
}
m["aus-ngk"] = {
"Ngkoth",
7022405,
"aus-pmn",
"Latn",
}
m["aus-nyu-pro"] = {
"Proto-Nyulnyulan",
116773797,
"aus-nyu",
"Latn",
type = "reconstructed",
}
m["aus-pam-pro"] = {
"Proto-Pama-Nyungan",
33942,
"aus-pam",
"Latn",
type = "reconstructed",
}
m["aus-tul"] = {
"Tulua",
16938541,
"aus-pam",
"Latn",
}
m["aus-uwi"] = {
"Uwinymil",
7903995,
"aus-arn",
"Latn",
}
m["aus-wdj-pro"] = {
"Proto-Iwaidjan",
116773767,
"aus-wdj",
"Latn",
type = "reconstructed",
}
m["aus-won"] = {
"Wong-gie",
nil,
"aus-pam",
"Latn",
}
m["aus-wul"] = {
"Wulguru",
8039196,
"aus-dyb",
"Latn",
}
m["aus-ynk"] = { -- contrast nny
"Yangkaal",
3913770,
"aus-tnk",
"Latn",
}
m["awd-amc-pro"] = {
"Proto-Amuesha-Chamicuro",
nil,
"awd",
"Latn",
type = "reconstructed",
}
m["awd-kmp-pro"] = {
"Proto-Kampa",
nil,
"awd",
"Latn",
type = "reconstructed",
}
m["awd-prw-pro"] = {
"Proto-Paresi-Waura",
nil,
"awd",
"Latn",
type = "reconstructed",
}
m["awd-ama"] = {
"Amarizana",
16827787,
"awd",
"Latn",
}
m["awd-ana"] = {
"Anauyá",
16828252,
"awd",
"Latn",
}
m["awd-apo"] = {
"Apolista",
16916645,
"awd",
"Latn",
}
m["awd-cab"] = {
"Cabre",
16850160,
"awd",
"Latn",
}
m["awd-gnu"] = {
"Guinau",
3504087,
"awd",
"Latn",
}
m["awd-kar"] = {
"Cariay",
16920253,
"awd",
"Latn",
}
m["awd-kaw"] = {
"Kawishana",
6379993,
"awd-nwk",
"Latn",
}
m["awd-kus"] = {
"Kustenau",
5196293,
"awd",
"Latn",
}
m["awd-man"] = {
"Manao",
6746920,
"awd",
"Latn",
}
m["awd-mar"] = {
"Marawan",
6755108,
"awd",
"Latn",
}
m["awd-mpr"] = {
"Maipure",
6736872,
"awd",
"Latn",
}
m["awd-mrt"] = {
"Mariaté",
16910017,
"awd-nwk",
"Latn",
}
m["awd-nwk-pro"] = {
"Proto-Nawiki",
116773234,
"awd-nwk",
"Latn",
type = "reconstructed",
}
m["awd-pai"] = {
"Paikoneka",
128807835,
"awd",
"Latn",
}
m["awd-pas"] = {
"Pasé",
7143168,
"awd-nwk",
"Latn",
}
m["awd-pro"] = {
"Proto-Arawak",
97573478,
"awd",
"Latn",
type = "reconstructed",
}
m["awd-she"] = {
"Shebayo",
7492248,
"awd",
"Latn",
}
m["awd-taa-pro"] = {
"Proto-Ta-Arawak",
116773282,
"awd-taa",
"Latn",
type = "reconstructed",
}
m["awd-wai"] = {
"Wainumá",
16910017,
"awd-nwk",
"Latn",
}
m["awd-yum"] = {
"Yumana",
8061062,
"awd-nwk",
"Latn",
}
m["azc-caz"] = {
"Cazcan",
5055514,
"azc",
"Latn",
}
m["azc-cup-pro"] = {
"Proto-Cupan",
116773738,
"azc-cup",
"Latn",
type = "reconstructed",
}
m["azc-ktn"] = {
"Kitanemuk",
3197558,
"azc-tak",
"Latn",
}
m["azc-nah-pro"] = {
"Proto-Nahuan",
7251860,
"azc-nah",
"Latn",
type = "reconstructed",
}
m["azc-num-pro"] = {
"Proto-Numic",
116773247,
"azc-num",
"Latn",
type = "reconstructed",
}
m["azc-pro"] = {
"Proto-Uto-Aztecan",
96400333,
"azc",
"Latn",
type = "reconstructed",
}
m["azc-tak-pro"] = {
"Proto-Takic",
116773283,
"azc-tak",
"Latn",
type = "reconstructed",
}
m["azc-tat"] = {
"Tataviam",
743736,
"azc",
"Latn",
}
m["ber-pro"] = {
"Proto-Berber",
2855698,
"ber",
"Latn",
type = "reconstructed",
}
m["ber-fog"] = {
"Fogaha",
107610173,
"ber",
"Latn",
}
m["ber-zuw"] = {
"Zuwara",
4117169,
"ber",
"Latn",
}
m["bnt-bal"] = {
"Balong",
93935237,
"bnt-bbo",
"Latn",
}
m["bnt-bon"] = {
"Boma Nkuu",
nil,
"bnt",
"Latn",
}
m["bnt-boy"] = {
"Boma Yumu",
nil,
"bnt",
"Latn",
}
m["bnt-bwa"] = {
"Bwala",
128810345,
"bnt-tek",
"Latn",
}
m["bnt-cmw"] = {
"Chimwiini",
4958328,
"bnt-swh",
"Latn",
}
m["bnt-ind"] = {
"Indanga",
51412803,
"bnt",
"Latn",
}
m["bnt-lal"] = {
"Lala (South Africa)",
6480154,
"bnt-ngu",
"Latn",
}
m["bnt-mpi"] = {
"Mpiin",
93937013,
"bnt-bdz",
"Latn",
}
m["bnt-mpu"] = {
"Mpuono", -- not to be confused with Mbuun zmp
36056,
"bnt",
"Latn",
}
m["bnt-ngu-pro"] = {
"Proto-Nguni",
961559,
"bnt-ngu",
"Latn",
type = "reconstructed",
sort_key = {remove_diacritics = c.grave .. c.acute .. c.circ .. c.caron},
}
m["bnt-phu"] = {
"Phuthi",
33796,
"bnt-ngu",
"Latn",
strip_diacritics = {remove_diacritics = c.grave .. c.acute},
}
m["bnt-pro"] = {
"Proto-Bantu",
3408025,
"bnt",
"Latn",
type = "reconstructed",
sort_key = "bnt-pro-sortkey",
}
m["bnt-sab-pro"] = {
"Proto-Sabaki",
nil, -- Q2209395 is the code for the Sabaki family
"bnt-sab",
"Latn",
type = "reconstructed",
}
m["bnt-sbo"] = {
"South Boma",
nil,
"bnt",
"Latn",
}
m["bnt-sts-pro"] = {
"Proto-Sotho-Tswana",
116773278,
"bnt-sts",
"Latn",
type = "reconstructed",
}
m["btk-pro"] = {
"Proto-Batak",
116773191,
"btk",
"Latn",
type = "reconstructed",
}
m["cau-abz-pro"] = {
"Proto-Abkhaz-Abaza",
7251831,
"cau-abz",
"Latn",
type = "reconstructed",
}
m["cau-and-pro"] = {
"Proto-Andian",
nil,
"cau-and",
"Latn",
type = "reconstructed",
}
m["cau-ava-pro"] = {
"Proto-Avaro-Andian",
116773187,
"cau-ava",
"Latn",
type = "reconstructed",
}
m["cau-cir-pro"] = {
"Proto-Circassian",
7251838,
"cau-cir",
"Latn",
type = "reconstructed",
}
m["cau-drg-pro"] = {
"Proto-Dargwa",
116773205,
"cau-drg",
"Latn",
type = "reconstructed",
}
m["cau-lzg-pro"] = {
"Proto-Lezghian",
116773223,
"cau-lzg",
"Latn",
type = "reconstructed",
}
m["cau-nec-pro"] = {
"Proto-Northeast Caucasian",
116773244,
"cau-nec",
"Latn",
type = "reconstructed",
}
m["cau-nkh-pro"] = {
"Proto-Nakh",
108032840,
"cau-nkh",
"Latn",
type = "reconstructed",
}
m["cau-nwc-pro"] = {
"Proto-Northwest Caucasian",
7251861,
"cau-nwc",
"Latn",
type = "reconstructed",
}
m["cau-tsz-pro"] = {
"Proto-Tsezian",
116773287,
"cau-tsz",
"Latn",
type = "reconstructed",
}
m["cba-ata"] = {
"Atanques",
4812783,
"cba",
"Latn",
}
m["cba-cat"] = {
"Catío Chibcha",
7083619,
"cba",
"Latn",
}
m["cba-dor"] = {
"Dorasque",
5297532,
"cba",
"Latn",
}
m["cba-dui"] = {
"Duit",
3041061,
"cba",
"Latn",
}
m["cba-hue"] = {
"Huetar",
35514,
"cba",
"Latn",
}
m["cba-nut"] = {
"Nutabe",
7070405,
"cba",
"Latn",
}
m["cba-pro"] = {
"Proto-Chibchan",
116773203,
"cba",
"Latn",
type = "reconstructed",
}
m["ccs-pro"] = {
"Proto-Kartvelian",
2608203,
"ccs",
"Latn",
type = "reconstructed",
strip_diacritics = {
from = {"q̣", "p̣", "ʓ", "ċ"},
to = {"q̇", "ṗ", "ʒ", "c̣"}
},
}
m["ccs-gzn-pro"] = {
"Proto-Georgian-Zan",
23808119,
"ccs-gzn",
"Latn",
type = "reconstructed",
strip_diacritics = {
from = {"q̣", "p̣", "ʓ", "ċ"},
to = {"q̇", "ṗ", "ʒ", "c̣"}
},
}
m["cdc-cbm-pro"] = {
"Proto-Central Chadic",
116773197,
"cdc-cbm",
"Latn",
type = "reconstructed",
}
m["cdc-mas-pro"] = {
"Proto-Masa",
116773789,
"cdc-mas",
"Latn",
type = "reconstructed",
}
m["cdc-pro"] = {
"Proto-Chadic",
116773201,
"cdc",
"Latn",
type = "reconstructed",
}
m["cdd-pro"] = {
"Proto-Caddoan",
116773725,
"cdd",
"Latn",
type = "reconstructed",
}
m["cel-bry-pro"] = {
"Proto-Brythonic",
1248800,
"cel-bry",
"Latn, Polyt",
sort_key = {
Latn = "cel-bry-pro-sortkey",
},
-- Polyt translit, display_text, strip_diacritics, sort_key in [[Module:scripts/data]]
}
m["cel-gal"] = {
"Gallaecian",
3094789,
"cel-his",
}
m["cel-gau"] = {
"Gaulish",
29977,
"cel",
"Latn, Polyt, Ital",
strip_diacritics = {
Latn = {remove_diacritics = c.macron .. c.breve .. c.diaer},
},
sort_key = {
Latn = "cel-bry-pro-sortkey",
},
-- Ital translit in [[Module:scripts/data]]
-- Polyt translit, display_text, strip_diacritics, sort_key in [[Module:scripts/data]]
}
m["cel-pro"] = {
"Proto-Celtic",
653649,
"cel",
"Latn",
type = "reconstructed",
sort_key = "cel-pro-sortkey",
}
m["chi-pro"] = {
"Proto-Chimakuan",
116773734,
"chi",
"Latn",
type = "reconstructed",
}
m["chm-pro"] = {
"Proto-Mari",
116773788,
"chm",
"Latn",
type = "reconstructed",
}
m["cmc-pro"] = {
"Proto-Chamic",
114793834,
"cmc",
"Latn",
type = "reconstructed",
}
m["crp-bip"] = {
"Basque-Icelandic Pidgin",
810378,
"crp",
"Latn",
ancestors = "eu",
}
m["crp-cpr"] = {
"Chinese Pidgin Russian",
nil,
"crp",
"Hani, Cyrl, Latn",
ancestors = "ru, zh",
translit = {Cyrl = "ru-translit"},
strip_diacritics = {
Cyrl = {remove_diacritics = c.acute .. c.grave .. c.macron},
},
}
m["crp-gep"] = {
"West Greenlandic Pidgin",
17036301,
"crp",
"Latn",
ancestors = "kl",
}
m["crp-kia"] = {
"Kiautschou German Pidgin",
108314615,
"crp",
"Latn",
ancestors = "de",
}
m["crp-mar"] = {
"Maroon Spirit Language",
1093206,
"crp",
"Latn",
ancestors = "en",
}
m["crp-mpp"] = {
"Macau Pidgin Portuguese",
128804537,
"crp",
"Hant, Latn",
ancestors = "pt",
sort_key = {Hant = "Hani-sortkey"},
}
m["crp-rsn"] = {
"Russenorsk",
505125,
"crp",
"Cyrl, Latn",
ancestors = "nn, ru",
translit = {Cyrl = "ru-translit"},
}
m["crp-spp"] = {
"Samoan Plantation Pidgin",
7409948,
"crp",
"Latn",
ancestors = "en",
}
m["crp-slb"] = {
"Solombala English",
7558525,
"crp",
"Cyrl, Latn",
ancestors = "en, ru",
translit = {Cyrl = "ru-translit"},
}
m["crp-tpr"] = {
"Taimyr Pidgin Russian",
16930506,
"crp",
"Cyrl",
ancestors = "ru",
translit = "ru-translit",
}
m["csu-bba-pro"] = {
"Proto-Bongo-Bagirmi",
116773722,
"csu-bba",
"Latn",
type = "reconstructed",
}
m["csu-maa-pro"] = {
"Proto-Mangbetu",
116773786,
"csu-maa",
"Latn",
type = "reconstructed",
}
m["csu-pro"] = {
"Proto-Central Sudanic",
116773730,
"csu",
"Latn",
type = "reconstructed",
}
m["csu-sar-pro"] = {
"Proto-Sara",
116773809,
"csu-sar",
"Latn",
type = "reconstructed",
}
m["cus-ash"] = {
"Ashraaf",
4805855,
"cus-som",
"Latn",
}
m["cus-hec-pro"] = {
"Proto-Highland East Cushitic",
116773761,
"cus-hec",
"Latn",
type = "reconstructed",
}
m["cus-som-pro"] = {
"Proto-Somaloid",
nil,
"cus-som",
"Latn",
type = "reconstructed",
}
m["cus-sou-pro"] = {
"Proto-South Cushitic",
126081567,
"cus-sou",
"Latn",
type = "reconstructed",
}
m["cus-pro"] = {
"Proto-Cushitic",
116773204,
"cus",
"Latn",
type = "reconstructed",
}
m["dmn-dam"] = {
"Dama (Sierra Leone)",
19601574,
"dmn",
"Latn",
}
m["dra-bry"] = {
"Beary",
1089116,
"qfa-mix",
"Mlym, Knda",
ancestors = "ml, tcy",
-- Knda translit in [[Module:scripts/data]]
-- Mlym translit in [[Module:scripts/data]]
}
m["dra-cen-pro"] = {
"Proto-Central Dravidian",
nil,
"dra-cen",
"Latn",
type = "reconstructed",
}
m["dra-mkn"] = {
"Middle Kannada",
128810572,
"dra-kan",
"Knda",
-- Knda translit in [[Module:scripts/data]]
}
m["dra-nor-pro"] = {
"Proto-North Dravidian",
124433593,
"dra-nor",
"Latn",
type = "reconstructed",
}
m["dra-okn"] = {
"Old Kannada",
15723156,
"dra-kan",
"Knda",
-- Knda translit in [[Module:scripts/data]]
}
m["dra-ote"] = {
"Old Telugu",
126720868,
"dra-tel",
"Telu",
translit = "te-translit",
}
m["dra-pro"] = {
"Proto-Dravidian",
1702853,
"dra",
"Latn",
type = "reconstructed",
}
m["dra-sdo-pro"] = {
"Proto-South Dravidian I",
104847952, -- Wikipedia's "Proto-South Dravidian" is Proto-South Dravidian I in this scheme.
"dra-sdo",
"Latn",
type = "reconstructed",
}
m["dra-sdt-pro"] = {
"Proto-South Dravidian II",
128885257,
"dra-sdt",
"Latn",
type = "reconstructed",
}
m["dra-sou-pro"] = {
"Proto-South Dravidian",
128886121,
"dra-sou",
"Latn",
type = "reconstructed",
}
m["egx-dem"] = {
"Demotic Egyptian",
36765,
"egx",
"Latn, Egyd, Polyt",
sort_key = {
Latn = {
remove_diacritics = "'%-%s",
from = {"ꜣ", "j", "e", "ꜥ", "y", "w", "b", "p", "f", "m", "n", "r", "l", "ḥ", "ḫ", "h̭", "ẖ", "h", "š", "s", "q", "k", "g", "ṱ", "ṯ", "t", "ḏ", "%.", "⸗"},
to = {p[1], p[2], p[3], p[4], p[5], p[6], p[7], p[8], p[9], p[10], p[11], p[12], p[13], p[15], p[16], p[16], p[17], p[14], p[19], p[18], p[20], p[21], p[22], p[23], p[24], p[23], p[25], p[26], p[26]}
},
},
-- Polyt translit, display_text, strip_diacritics, sort_key in [[Module:scripts/data]]
}
m["dmn-pro"] = {
"Proto-Mande",
116773785,
"dmn",
"Latn",
type = "reconstructed",
}
m["dmn-mdw-pro"] = {
"Proto-Western Mande",
116773822,
"dmn-mdw",
"Latn",
type = "reconstructed",
}
m["dru-pro"] = {
"Proto-Rukai",
116773807,
"map",
"Latn",
type = "reconstructed",
}
m["ero-gsz"] = {
"Geshiza",
nil,
"ero",
"Latn",
}
m["ero-nya"] = {
"Nyagrong Minyag",
nil,
"ero",
"Latn",
}
m["ero-tau"] = {
"Stau",
nil,
"ero",
"Latn",
}
m["esx-esk-pro"] = {
"Proto-Eskimo",
7251842,
"esx-esk",
"Latn",
type = "reconstructed",
}
m["esx-ink"] = {
"Inuktun",
1671647,
"esx-inu",
"Latn",
}
m["esx-inq"] = {
"Inuinnaqtun",
28070,
"esx-inu",
"Latn",
}
m["esx-inu-pro"] = {
"Proto-Inuit",
60785588,
"esx-inu",
"Latn",
type = "reconstructed",
}
m["esx-pro"] = {
"Proto-Eskimo-Aleut",
7251843,
"esx",
"Latn",
type = "reconstructed",
}
m["esx-tut"] = {
"Tunumiisut",
15665389,
"esx-inu",
"Latn",
}
m["euq-pro"] = {
"Proto-Basque",
938011,
"euq",
"Latn",
type = "reconstructed",
}
m["gba-pro"] = {
"Proto-Gbaya",
nil,
"gba",
"Latn",
type = "reconstructed",
}
m["gem-pro"] = {
"Proto-Germanic",
669623,
"gem",
"Latn",
type = "reconstructed",
sort_key = "gem-pro-sortkey",
}
m["gme-bur"] = {
"Burgundian",
47625,
"gme",
"Latn",
}
m["gme-cgo"] = {
"Crimean Gothic",
36211,
"gme",
"Latn",
}
m["gmq-gut"] = {
"Gutnish",
1256646,
"gmq",
"Latn",
ancestors = "gmq-ogt",
}
m["gmq-jmk"] = {
"Jamtish",
35512,
"gmq-eas",
"Latn",
}
m["gmq-mno"] = {
"Middle Norwegian",
3417070,
"gmq-wes",
"Latn",
}
m["gmq-oda"] = {
"Old Danish",
12330003,
"gmq-eas",
"Latn, Runr",
strip_diacritics = {remove_diacritics = c.macron},
}
m["gmq-ogt"] = {
"Old Gutnish",
1133488,
"gmq",
"Latn, Runr",
ancestors = "non",
}
m["gmq-osw"] = {
"Old Swedish",
2417210,
"gmq-eas",
"Latn, Runr",
strip_diacritics = {remove_diacritics = c.macron},
}
m["gmq-pro"] = {
"Proto-Norse",
1671294,
"gmq",
"Runr",
translit = "Runr-translit",
}
m["gmq-scy"] = {
"Scanian",
768017,
"gmq-eas",
"Latn",
}
m["gmw-bgh"] = {
"Bergish",
329030,
"gmw-frk",
"Latn",
}
m["gmw-cfr"] = {
"Central Franconian",
572197,
"gmw-hgm",
"Latn",
ancestors = "gmh",
wikimedia_codes = "ksh",
}
m["gmw-ecg"] = {
"East Central German",
499344, -- subsumes Q699284, Q152965
"gmw-hgm",
"Latn",
ancestors = "gmh",
}
m["gmw-fin"] = {
"Fingallian",
3072588,
"gmw-ian",
"Latn",
}
m["gmw-gts"] = {
"Gottscheerish",
533109,
"gmw-hgm",
"Latn",
ancestors = "bar",
}
m["gmw-jdt"] = {
"Jersey Dutch",
1687911,
"gmw-frk",
"Latn",
ancestors = "nl",
}
m["gmw-msc"] = {
"Middle Scots",
3327000,
"gmw-ang",
"Latn",
ancestors = "enm-esc",
}
m["gmw-pro"] = {
"Proto-West Germanic",
78079021,
"gmw",
"Latn, Runr",
-- type = "reconstructed",
-- largely but not entirely reconstructed (like Proto-Norse); see April '24 BP, set back to reconstructed (?) if 'anti-asterisk' is added
sort_key = "gmw-pro-sortkey",
}
m["gmw-rfr"] = {
"Rhine Franconian",
707007,
"gmw-hgm",
"Latn",
ancestors = "gmh",
}
m["gmw-stm"] = {
"Sathmar Swabian",
2223059,
"gmw-hgm",
"Latn",
ancestors = "swg",
}
m["gmw-tsx"] = {
"Transylvanian Saxon",
260942,
"gmw-hgm",
"Latn",
ancestors = "gmw-cfr",
}
m["gmw-vog"] = {
"Volga German",
312574,
"gmw-hgm",
"Latn",
ancestors = "gmw-rfr",
}
m["gmw-zps"] = {
"Zipser German",
205548,
"gmw-hgm",
"Latn",
ancestors = "gmh",
}
m["gn-cls"] = {
"Classical Guarani",
17478065,
"gn",
"Latn",
}
m["grk-cal"] = {
"Calabrian Greek",
1146398,
"grk",
"Latn, Grek",
ancestors = "grk-ita",
translit = {
Grek = "el-translit",
},
-- Grek display_text, strip_diacritics, sort_key in [[Module:scripts/data]]
}
m["grk-ita"] = {
"Italiot Greek",
19720507,
"grk",
"Latn, Grek",
ancestors = "gkm",
translit = {
Grek = "el-translit",
},
-- Grek display_text, strip_diacritics, sort_key in [[Module:scripts/data]]
}
m["grk-mar"] = {
"Mariupol Greek",
4400023,
"grk",
"Cyrl, Latn, Grek",
ancestors = "gkm",
translit = {
Cyrl = "grk-mar-translit",
Grek = "grk-mar-translit",
},
override_translit = true,
strip_diacritics = {
Cyrl = {remove_diacritics = c.acute},
},
-- Grek display_text, strip_diacritics, sort_key in [[Module:scripts/data]]
}
m["grk-pro"] = {
"Proto-Hellenic",
1231805,
"grk",
"Latn, Polyt",
type = "reconstructed",
sort_key = {Latn = {
from = {"ʰ", "ʷ"},
to = {"h", "w"},
remove_diacritics = c.grave .. c.acute .. c.macron .. c.breve .. c.caron
}},
-- Polyt translit, display_text, strip_diacritics, sort_key in [[Module:scripts/data]]
-- NOTE: formerly no translit specified for Polyt; presumably an accidental omission; if not, set Polyt = false in
-- the translit section
}
m["hmn-pro"] = {
"Proto-Hmongic",
116773210,
"hmn",
"Latn",
type = "reconstructed",
}
m["hmx-mie-pro"] = {
"Proto-Mienic",
116773229,
"hmx-mie",
"Latn",
type = "reconstructed",
}
m["hmx-pro"] = {
"Proto-Hmong-Mien",
7251846,
"hmx",
"Latn",
type = "reconstructed",
}
m["hyx-pro"] = {
"Proto-Armenian",
3848498,
"hyx",
"Latn",
type = "reconstructed",
}
m["iir-nur-pro"] = {
"Proto-Nuristani",
116773248,
"iir-nur",
"Latn",
type = "reconstructed",
}
m["iir-pro"] = {
"Proto-Indo-Iranian",
966439,
"iir",
"Latn",
type = "reconstructed",
}
m["ijo-pro"] = {
"Proto-Ijoid",
116773766,
"ijo",
"Latn",
type = "reconstructed",
}
m["inc-apa"] = {
"Apabhramsa",
616419,
"inc-mid",
"Deva, Shrd, Sidd",
ancestors = "pra",
translit = {
Deva = "sa-translit",
-- Shrd translit in [[Module:scripts/data]]
-- Sidd translit in [[Module:scripts/data]]
},
}
m["inc-ash"] = {
"Ashokan Prakrit",
104854379,
"inc-mid",
"Brah, Khar",
ancestors = "sa",
translit = {
-- Brah translit in [[Module:scripts/data]]
Khar = "Khar-translit",
},
}
m["inc-dng-pro"] = {
"Proto-Dangari",
nil,
"inc-dng",
"Latn",
type = "reconstructed",
}
m["inc-kam"] = {
"Kamarupi Prakrit",
6356097,
"inc-bas",
"Brah, Sidd",
-- Brah, Sidd translit in [[Module:scripts/data]]
}
m["inc-kho"] = {
"Kholosi",
24952008,
"inc-snd",
"Latn",
}
m["inc-krd-pro"] = {
"Proto-Kamta",
128816843,
"inc-bas",
"Latn",
ancestors = "inc-kam",
type = "reconstructed",
}
m["inc-mas"] = {
"Middle Assamese",
128806836,
"inc-bas",
"as-Beng",
ancestors = "inc-oas",
translit = "inc-mas-translit",
}
m["inc-mbn"] = {
"Middle Bengali",
113559927,
"inc-bas",
"Beng",
ancestors = "inc-obn",
translit = "inc-mbn-translit",
}
m["inc-mgu"] = {
"Middle Gujarati",
24907429,
"inc-wes",
"Deva",
ancestors = "inc-ogu",
}
m["inc-mor"] = {
"Middle Odia",
128810882,
"inc-eas",
"Orya",
ancestors = "inc-oor",
}
m["inc-oas"] = {
"Early Assamese",
85758237,
"inc-bas",
"as-Beng",
ancestors = "inc-kam",
translit = "inc-oas-translit",
}
m["inc-oaw"] = {
"Old Awadhi",
nil,
"inc-hie",
"Deva, Kthi, ur-Arab",
strip_diacritics = {
from = {"هٔ", "ۂ"}, -- character "ۂ" code U+06C2 to "ه" and "هٔ" (U+0647 + U+0654) to "ه"
to = {"ہ", "ہ"},
remove_diacritics = c.fathatan .. c.dammatan .. c.kasratan .. c.fatha .. c.damma .. c.kasra .. c.shadda .. c.sukun .. c.nunghunna .. c.superalef
},
translit = {
Deva = "sa-translit",
Kthi = "sa-Kthi-translit",
["ur-Arab"] = "inc-ohi-translit",
},
}
m["inc-obn"] = {
"Old Bengali",
113559926,
"inc-bas",
"Beng",
}
m["inc-ogu"] = {
"Old Gujarati",
24907427,
"inc-wes",
"Deva",
translit = "sa-translit",
}
m["inc-ohi"] = {
"Old Hindi",
48767781,
"inc-hiw",
"Deva, ur-Arab",
strip_diacritics = {
from = {"هٔ", "ۂ"}, -- character "ۂ" code U+06C2 to "ه" and "هٔ" (U+0647 + U+0654) to "ه"
to = {"ہ", "ہ"},
remove_diacritics = c.fathatan .. c.dammatan .. c.kasratan .. c.fatha .. c.damma .. c.kasra .. c.shadda .. c.sukun .. c.nunghunna .. c.superalef
},
translit = {
Deva = "sa-translit",
["ur-Arab"] = "inc-ohi-translit",
},
}
m["inc-oor"] = {
"Old Odia",
128807801,
"inc-eas",
"Orya",
}
m["inc-opa"] = {
"Old Punjabi",
115270971,
"inc-pan",
"Guru, pa-Arab",
translit = {
Guru = "inc-opa-Guru-translit",
["pa-Arab"] = "pa-Arab-translit",
},
strip_diacritics = {remove_diacritics = c.fathatan .. c.dammatan .. c.kasratan .. c.fatha .. c.damma .. c.kasra .. c.shadda .. c.sukun},
}
m["inc-pro"] = {
"Proto-Indo-Aryan",
23808344,
"inc",
"Latn",
type = "reconstructed",
}
m["ine-ana-pro"] = {
"Proto-Anatolian",
7251833,
"ine-ana",
"Latn",
type = "reconstructed",
}
m["ine-bsl-pro"] = {
"Proto-Balto-Slavic",
1703347,
"ine-bsl",
"Latn",
type = "reconstructed",
sort_key = {
from = {"[áā]", "[éēḗ]", "[íī]", "[óōṓ]", "[úū]", c.acute, c.macron, "ˀ"},
to = {"a", "e", "i", "o", "u"}
},
}
m["ine-grp-pro"] = {
"Proto-Graeco-Phrygian",
nil,
"ine-grp",
"Latn",
type = "reconstructed",
}
m["ine-kal"] = {
"Kalašma",
122770439,
"ine-ana",
"Xsux",
}
m["ine-pae"] = {
"Paeonian",
2705672,
"ine",
"Polyt",
-- Polyt translit, display_text, strip_diacritics, sort_key in [[Module:scripts/data]]
}
m["ine-pro"] = {
"Proto-Indo-European",
37178,
"ine",
"Latn",
type = "reconstructed",
sort_key = {
from = {"[áā]", "[éēḗ]", "[íī]", "[óōṓ]", "[úū]", "ĺ", "ḿ", "ń", "ŕ", "ǵ", "ḱ", "ʰ", "ʷ", "₁", "₂", "₃", c.ringbelow, c.acute, c.macron},
to = {"a", "e", "i", "o", "u", "l", "m", "n", "r", "g'", "k'", "¯h", "¯w", "1", "2", "3"}
},
}
m["ine-toc-pro"] = {
"Proto-Tocharian",
104841462,
"ine-toc",
"Latn",
type = "reconstructed",
}
m["xme-old"] = {
"Old Median",
36461,
"xme",
"Polyt, Latn",
-- Polyt translit, display_text, strip_diacritics, sort_key in [[Module:scripts/data]]
}
m["xme-mid"] = {
"Middle Median",
12836150,
"xme",
"Latn",
}
m["xme-ker"] = {
"Kermanic",
129850,
"xme",
"fa-Arab, Latn, Hebr",
ancestors = "xme-mid",
-- Hebr display_text, strip_diacritics, sort_key in [[Module:scripts/data]]
}
m["xme-taf"] = {
"Tafreshi",
nil,
"xme",
"fa-Arab, Latn",
ancestors = "xme-mid",
}
m["xme-ttc-pro"] = {
"Proto-Tatic",
122973870,
"xme-ttc",
"Latn",
ancestors = "xme-mid",
}
m["xme-kls"] = {
"Kalasuri",
nil,
"xme-ttc",
ancestors = "xme-ttc-nor",
}
m["xme-klt"] = {
"Kilit",
3612452,
"xme-ttc",
"Cyrl", -- and fa-Arab?
}
m["xme-ott"] = {
"Old Tati",
434697,
"xme-ttc",
"fa-Arab, Latn",
}
m["ira-kms-pro"] = {
"Proto-Komisenian",
116773777,
"ira-kms",
"Latn",
type = "reconstructed",
}
m["ira-mpr-pro"] = {
"Proto-Medo-Parthian",
116773227,
"ira-mpr",
"Latn",
type = "reconstructed",
}
m["ira-pat-pro"] = {
"Proto-Pathan",
116773255,
"ira-pat",
"Latn",
type = "reconstructed",
}
m["ira-pro"] = {
"Proto-Iranian",
4167865,
"ira",
"Latn",
type = "reconstructed",
}
m["ira-zgr-pro"] = {
"Proto-Zaza-Gorani",
116775031,
"ira-zgr",
"Latn",
type = "reconstructed",
}
m["xsc-pro"] = {
"Proto-Scythian",
116773273,
"xsc",
"Latn",
type = "reconstructed",
}
m["xsc-sar-pro"] = {
"Proto-Sarmatian",
116773249,
"xsc-sar",
"Latn",
type = "reconstructed",
}
m["xsc-skw-pro"] = {
"Proto-Saka-Wakhi",
116773267,
"xsc-skw",
"Latn",
type = "reconstructed",
}
m["xsc-sak-pro"] = {
"Proto-Saka",
116773264,
"xsc-sak",
"Latn",
type = "reconstructed",
}
m["ira-sym-pro"] = {
"Proto-Shughni-Yazghulami-Munji",
116773813,
"ira-sym",
"Latn",
type = "reconstructed",
}
m["ira-sgi-pro"] = {
"Proto-Sanglechi-Ishkashimi",
116773808,
"ira-sgi",
"Latn",
type = "reconstructed",
}
m["ira-mny-pro"] = {
"Proto-Munji-Yidgha",
116773792,
"ira-mny",
"Latn",
type = "reconstructed",
}
m["ira-shy-pro"] = {
"Proto-Shughni-Yazghulami",
116773812,
"ira-shy",
"Latn",
type = "reconstructed",
}
m["ira-shr-pro"] = {
"Proto-Shughni-Roshani",
116773811,
"ira-shr",
"Latn",
type = "reconstructed",
}
m["ira-sgc-pro"] = {
"Proto-Sogdic",
116773276,
"ira-sgc",
"Latn",
type = "reconstructed",
}
m["ira-wnj"] = {
"Vanji",
3398419,
"ira-shy",
"Latn",
}
m["iro-ere"] = {
"Erie",
5388365,
"iro-nor",
"Latn",
}
m["iro-min"] = {
"Mingo",
128531,
"iro-nor",
"Latn",
ietf_subtag = "i-mingo", -- grandfathered IETF tag
}
m["iro-nor-pro"] = {
"Proto-North Iroquoian",
116773242,
"iro-nor",
"Latn",
type = "reconstructed",
}
m["iro-pro"] = {
"Proto-Iroquoian",
7251852,
"iro",
"Latn",
type = "reconstructed",
}
m["itc-pro"] = {
"Proto-Italic",
17102720,
"itc",
"Latn",
type = "reconstructed",
}
m["itc-psa"] = {
"Pre-Samnite",
7239186,
"itc-sbl",
"Ital, Polyt, Latn",
-- Ital translit in [[Module:scripts/data]] (NOTE: formerly not present, probably an accidental omission)
-- Polyt translit, display_text, strip_diacritics, sort_key in [[Module:scripts/data]]
}
m["jpx-hcj"] = {
"Hachijō",
5637049,
"jpx",
"Jpan",
ancestors = "ojp-eas",
translit = s["jpx-translit"],
display_text = s["jpx-displaytext"],
strip_diacritics = s["jpx-stripdiacritics"],
sort_key = s["jpx-sortkey"],
}
m["jpx-pro"] = {
"Proto-Japonic",
3924309,
"jpx",
"Latn",
type = "reconstructed",
}
m["jpx-ryu-pro"] = {
"Proto-Ryukyuan",
56349069,
"jpx-ryu",
"Latn",
type = "reconstructed",
}
m["kar-pro"] = {
"Proto-Karen",
85794783,
"kar",
"Latn",
type = "reconstructed",
}
m["kca-eas"] = {
"Eastern Khanty",
30304622,
"kca",
"Cyrl",
translit = "kca-translit",
override_translit = true,
-- TODO temporary until MediaWiki supports Unicode 16 (probably requires a PHP update from their side)
sort_key = { Cyrl = { from = {""}, to = {""} } },
}
m["kca-nor"] = {
"Northern Khanty",
30304527,
"kca",
"Cyrl",
translit = "kca-translit",
override_translit = true,
-- TODO temporary until MediaWiki supports Unicode 16 (probably requires a PHP update from their side)
sort_key = { Cyrl = { from = {""}, to = {""} } },
}
m["kca-pro"] = {
"Proto-Khanty",
127505171,
"kca",
"Latn",
type = "reconstructed",
}
m["kca-sou"] = {
"Southern Khanty",
30304618,
"kca",
"Cyrl",
translit = "kca-translit",
override_translit = true,
}
m["khi-kho-pro"] = {
"Proto-Khoe",
116773218,
"khi-kho",
"Latn",
type = "reconstructed",
}
m["khi-kun"] = {
"ǃKung",
32904,
"khi-kxa",
"Latn",
}
m["ko-ear"] = {
"Early Modern Korean",
756014,
"qfa-kor",
"Kore",
ancestors = "okm",
translit = "okm-translit",
-- Kore strip_diacritics in [[Module:scripts/data]]
}
m["kro-pro"] = {
"Proto-Kru",
116773778,
"kro",
"Latn",
type = "reconstructed",
}
m["ku-pro"] = {
"Proto-Kurdish",
116773221,
"ku",
"Latn",
type = "reconstructed",
}
m["map-ata-pro"] = {
"Proto-Atayalic",
116773151,
"map-ata",
"Latn",
type = "reconstructed",
}
m["map-bms"] = {
"Banyumasan",
33219,
"map",
"Latn, Java",
}
m["map-pro"] = {
"Proto-Austronesian",
49230,
"map",
"Latn",
type = "reconstructed",
}
m["mis-hkl"] = {
"Kelantan Peranakan Hokkien",
108794818,
"qfa-mix",
ancestors = "nan-hbl, sou, mfa",
}
m["mis-idn"] = {
"Idiom Neutral",
35847,
"art",
"Latn",
type = "appendix-constructed",
}
m["mis-isa"] = {
"Isaurian",
16956868,
nil,
-- "Xsux, Hluw, Latn",
}
m["mis-jie"] = {
"Jie",
124424186,
nil,
"Hani",
sort_key = "Hani-sortkey",
}
m["mis-jzh"] = {
"Jizhao",
45242758,
"qfa-bej",
"Latn",
}
m["mis-kas"] = {
"Kassite",
35612,
nil,
"Xsux",
}
m["mis-mmd"] = {
"Mimi of Decorse",
6862206,
nil,
"Latn",
}
m["mis-mmn"] = {
"Mimi of Nachtigal",
6862207,
nil,
"Latn",
}
m["mis-phi"] = {
"Philistine",
2230924,
nil,
"Phnx",
-- Phnx translit in [[Module:scripts/data]] (NOTE: not present before, presumably an accidental omission)
}
m["mis-rou"] = {
"Rouran",
48816637,
"qfa-xgx",
"Hani, Latn",
sort_key = {Hani = "Hani-sortkey"},
}
m["mis-tdl"] = {
"Turdulian",
133176492,
}
m["mis-tdt"] = {
"Turdetanian",
133176461,
}
m["mis-tnw"] = {
"Tangwang",
7683179,
"qfa-mix",
"Latn",
ancestors = "cmn, sce",
}
m["mis-tuh"] = {
"Tuyuhun",
48816625,
"qfa-xgx",
"Hani, Latn",
sort_key = {Hani = "Hani-sortkey"},
}
m["mis-tuo"] = {
"Tuoba",
48816629,
"qfa-xgx",
"Hani, Latn",
sort_key = {Hani = "Hani-sortkey"},
}
m["mis-wuh"] = {
"Wuhuan",
118976867,
"qfa-xgx",
"Hani, Latn",
sort_key = {Hani = "Hani-sortkey"},
}
m["mis-xbi"] = {
"Xianbei",
4448647,
"qfa-xgx",
"Hani, Latn",
sort_key = {Hani = "Hani-sortkey"},
}
m["mis-xnu"] = {
"Xiongnu",
10901674,
nil,
"Hani, Latn",
sort_key = {Hani = "Hani-sortkey"},
}
m["mjg-mgl"] = {
"Mongghul",
53765528,
"mjg",
"Latn", -- also Mong, Cyrl ?
}
m["mjg-mgr"] = {
"Mangghuer",
56285392,
"mjg",
"Latn", -- also Mong, Cyrl ?
}
m["mkh-asl-pro"] = {
"Proto-Aslian",
55630680,
"mkh-asl",
"Latn",
type = "reconstructed",
}
m["mkh-ban-pro"] = {
"Proto-Bahnaric",
116773189,
"mkh-ban",
"Latn",
type = "reconstructed",
}
m["mkh-kat-pro"] = {
"Proto-Katuic",
116773772,
"mkh-kat",
"Latn",
type = "reconstructed",
}
m["mkh-khm-pro"] = {
"Proto-Khmuic",
116773774,
"mkh-khm",
"Latn",
type = "reconstructed",
}
m["mkh-kmr-pro"] = {
"Proto-Khmeric",
55630684,
"mkh-kmr",
"Latn",
type = "reconstructed",
}
m["mkh-mmn"] = {
"Middle Mon",
121337926,
"mkh-mnc",
"Latn, Mymr", --and also Pallava
ancestors = "omx",
}
m["mkh-mnc-pro"] = {
"Proto-Monic",
116773231,
"mkh-mnc",
"Latn",
type = "reconstructed",
}
m["mkh-mvi"] = {
"Middle Vietnamese",
9199,
"mkh-vie",
"Hani, Latn",
sort_key = {Hani = "Hani-sortkey"},
}
m["mkh-pal-pro"] = {
"Proto-Palaungic",
104847372,
"mkh-pal",
"Latn",
type = "reconstructed",
}
m["mkh-pea-pro"] = {
"Proto-Pearic",
116773804,
"mkh-pea",
"Latn",
type = "reconstructed",
}
m["mkh-pkn-pro"] = {
"Proto-Pakanic",
116773803,
"mkh-pkn",
"Latn",
type = "reconstructed",
}
m["mkh-pro"] = { --This will be merged into 2015 aav-pro.
"Proto-Mon-Khmer",
7251859,
"mkh",
"Latn",
type = "reconstructed",
}
m["mnw-tha"] = { -- To be removed.
"Thai Mon",
nil,
"mkh-mnc",
"Mymr, Thai",
ancestors = "mkh-mmn",
sort_key = {
from = {"[%p]", "ျ", "ြ", "ွ", "ှ", "ၞ", "ၟ", "ၠ", "ၚ", "ဿ", "[็-๎]", "([เแโใไ])([ก-ฮ])ฺ?"},
to = {"", "္ယ", "္ရ", "္ဝ", "္ဟ", "္န", "္မ", "္လ", "င", "သ္သ", "", "%2%1"}
},
}
m["mkh-vie-pro"] = {
"Proto-Vietic",
109432616,
"mkh-vie",
"Latn",
type = "reconstructed",
}
m["mns-cen"] = {
"Central Mansi",
128810384,
"mns",
"Cyrl",
translit = "mns-translit",
override_translit = true,
}
m["mns-nor"] = {
"Northern Mansi",
30304537,
"mns",
"Cyrl",
translit = "mns-translit",
override_translit = true,
}
m["mns-pro"] = {
"Proto-Mansi",
128883093,
"mns",
"Latn",
type = "reconstructed",
}
m["mns-sou"] = {
"Southern Mansi",
30304629,
"mns",
"Cyrl",
translit = "mns-translit",
override_translit = true,
}
m["mun-pro"] = {
"Proto-Munda",
105102373,
"mun",
"Latn",
type = "reconstructed",
}
m["myn-chl"] = { -- the stage after ''emy''
"Ch'olti'",
873995,
"myn",
"Latn",
}
m["myn-pro"] = {
"Proto-Mayan",
3321532,
"myn",
"Latn",
type = "reconstructed",
}
m["nai-ala"] = {
"Alazapa",
128810233,
nil,
"Latn",
}
m["nai-bay"] = {
"Bayogoula",
1563704,
nil,
"Latn",
}
m["nai-cal"] = {
"Calusa",
51782,
nil,
"Latn",
}
m["nai-chi"] = {
"Chiquimulilla",
25339627,
"nai-xin",
"Latn",
}
m["nai-chu-pro"] = {
"Proto-Chumash",
116773736,
"nai-chu",
"Latn",
type = "reconstructed",
}
m["nai-cig"] = {
"Ciguayo",
20741700,
nil,
"Latn",
}
m["nai-ckn-pro"] = {
"Proto-Chinookan",
116773735,
"nai-ckn",
"Latn",
type = "reconstructed",
}
m["nai-guz"] = {
"Guazacapán",
19572028,
"nai-xin",
"Latn",
}
m["nai-hit"] = {
"Hitchiti",
1542882,
"nai-mus",
"Latn",
}
m["nai-ipa"] = {
"Ipai",
3027474,
"nai-yuc",
"Latn",
}
m["nai-jtp"] = {
"Jutiapa",
nil,
"nai-xin",
"Latn",
}
m["nai-jum"] = {
"Jumaytepeque",
25339626,
"nai-xin",
"Latn",
}
m["nai-kat"] = {
"Kathlamet",
6376639,
"nai-ckn",
"Latn",
}
m["nai-klp-pro"] = {
"Proto-Kalapuyan",
116773771,
"nai-klp",
"Latn",
type = "reconstructed",
}
m["nai-knm"] = {
"Konomihu",
3198734,
"nai-shs",
"Latn",
}
m["nai-kum"] = {
"Kumeyaay",
4910139,
"nai-yuc",
"Latn",
}
m["nai-mac"] = {
"Macoris",
21070851,
nil,
"Latn",
}
m["nai-mdu-pro"] = {
"Proto-Maidun",
116773784,
"nai-mdu",
"Latn",
type = "reconstructed",
}
m["nai-miz-pro"] = {
"Proto-Mixe-Zoque",
7251858,
"nai-miz",
"Latn",
type = "reconstructed",
}
m["nai-mus-pro"] = {
"Proto-Muskogean",
116775368,
"nai-mus",
"Latn",
type = "reconstructed",
}
m["nai-nao"] = {
"Naolan",
6964594,
nil,
"Latn",
}
m["nai-nrs"] = {
"New River Shasta",
7011254,
"nai-shs",
"Latn",
}
m["nai-okw"] = {
"Okwanuchu",
3350126,
"nai-shs",
"Latn",
}
m["nai-per"] = {
"Pericú",
3375369,
nil,
"Latn",
}
m["nai-pic"] = {
"Picuris",
7191257,
"nai-kta",
"Latn",
}
m["nai-plp-pro"] = {
"Proto-Plateau Penutian",
116773806,
"nai-plp",
"Latn",
type = "reconstructed",
}
m["nai-pom-pro"] = {
"Proto-Pomo",
116773262,
"nai-pom",
"Latn",
type = "reconstructed",
}
m["nai-qng"] = {
"Quinigua",
36360,
nil,
"Latn",
}
m["nai-sca-pro"] = { -- NB 'sio-pro' "Proto-Siouan" which is Proto-Western Siouan
"Proto-Siouan-Catawban",
116773275,
"nai-sca",
"Latn",
type = "reconstructed",
}
m["nai-sin"] = {
"Sinacantán",
24190249,
"nai-xin",
"Latn",
}
m["nai-sln"] = {
"Salvadoran Lenca",
3229434,
"nai-len",
"Latn",
}
m["nai-spt"] = {
"Sahaptin",
3833015,
"nai-shp",
"Latn",
}
m["nai-tap"] = {
"Tapachultec",
7684401,
"nai-miz",
"Latn",
}
m["nai-taw"] = {
"Tawasa",
7689233,
nil,
"Latn",
}
m["nai-teq"] = {
"Tequistlatec",
2964454,
"nai-tqn",
"Latn",
}
m["nai-tip"] = {
"Tipai",
3027471,
"nai-yuc",
"Latn",
}
m["nai-tot-pro"] = {
"Proto-Totozoquean",
116773285,
"nai-tot",
"Latn",
type = "reconstructed",
}
m["nai-tsi-pro"] = {
"Proto-Tsimshianic",
nil,
"nai-tsi",
"Latn",
type = "reconstructed",
}
m["nai-utn-pro"] = {
"Proto-Utian",
116773290,
"nai-utn",
"Latn",
type = "reconstructed",
}
m["nai-wai"] = {
"Waikuri",
3118702,
nil,
"Latn",
}
m["nai-wji"] = {
"Western Jicaque",
3178610,
"nai-jcq",
"Latn",
}
m["nai-yup"] = {
"Yupiltepeque",
25339628,
"nai-xin",
"Latn",
}
m["nan-dat"] = {
"Datian Min",
19855572,
"zhx-nan",
"Hants",
generate_forms = "zh-generateforms",
sort_key = "Hani-sortkey",
}
m["nan-hbl"] = {
"Hokkien",
1624231,
"zhx-nan",
"Hants, Latn, Bopo, Kana",
wikimedia_codes = "zh-min-nan",
generate_forms = "zh-generateforms",
sort_key = {
Hani = "Hani-sortkey",
Kana = "Kana-sortkey"
},
}
m["nan-hlh"] = {
"Hailufeng Min",
120755728,
"zhx-nan",
"Hants",
generate_forms = "zh-generateforms",
sort_key = "Hani-sortkey",
}
m["nan-lnx"] = {
"Longyan Min",
6674568,
"zhx-nan",
"Hants",
generate_forms = "zh-generateforms",
sort_key = "Hani-sortkey",
}
m["nan-tws"] = {
"Teochew",
36759,
"zhx-nan",
"Hants",
generate_forms = "zh-generateforms",
translit = "zh-translit",
sort_key = "Hani-sortkey",
}
m["nan-zhe"] = {
"Zhenan Min",
3846710,
"zhx-nan",
"Hants",
generate_forms = "zh-generateforms",
sort_key = "Hani-sortkey",
}
m["nan-zsh"] = {
"Sanxiang Min",
7420769,
"zhx-nan",
"Hants",
generate_forms = "zh-generateforms",
sort_key = "Hani-sortkey",
}
m["ngf-bin-pro"] = {
"Proto-Binanderean",
137881672,
"ngf-bin",
"Latn",
type = "reconstructed",
}
m["ngf-pro"] = {
"Proto-Trans-New Guinea",
85794785,
"ngf",
"Latn",
type = "reconstructed",
}
m["nic-bco-pro"] = {
"Proto-Benue-Congo",
116773194,
"nic-bco",
"Latn",
type = "reconstructed",
}
m["nic-bod-pro"] = {
"Proto-Bantoid",
116773190,
"nic-bod",
"Latn",
type = "reconstructed",
}
m["nic-eov-pro"] = {
"Proto-Eastern Oti-Volta",
116773753,
"nic-eov",
"Latn",
type = "reconstructed",
}
m["nic-gns-pro"] = {
"Proto-Gurunsi",
116773759,
"nic-gns",
"Latn",
type = "reconstructed",
}
m["nic-grf-pro"] = {
"Proto-Grassfields",
116773755,
"nic-grf",
"Latn",
type = "reconstructed",
}
m["nic-gur-pro"] = {
"Proto-Gur",
116773758,
"nic-gur",
"Latn",
type = "reconstructed",
}
m["nic-jkn-pro"] = {
"Proto-Jukunoid",
116773769,
"nic-jkn",
"Latn",
type = "reconstructed",
}
m["nic-lcr-pro"] = {
"Proto-Lower Cross River",
116773782,
"nic-lcr",
"Latn",
type = "reconstructed",
}
m["nic-ogo-pro"] = {
"Proto-Ogoni",
116773799,
"nic-ogo",
"Latn",
type = "reconstructed",
}
m["nic-ovo-pro"] = {
"Proto-Oti-Volta",
116773802,
"nic-ovo",
"Latn",
type = "reconstructed",
}
m["nic-plt-pro"] = {
"Proto-Plateau",
116773805,
"nic-plt",
"Latn",
type = "reconstructed",
}
m["nic-pro"] = {
"Proto-Niger-Congo",
108000748,
"nic",
"Latn",
type = "reconstructed",
}
m["nic-ubg-pro"] = {
"Proto-Ubangian",
116773818,
"nic-ubg",
"Latn",
type = "reconstructed",
}
m["nic-ucr-pro"] = {
"Proto-Upper Cross River",
116773819,
"nic-ucr",
"Latn",
type = "reconstructed",
}
m["nic-vco-pro"] = {
"Proto-Volta-Congo",
116773293,
"nic-vco",
"Latn",
type = "reconstructed",
}
m["njo-jgl"] = {
"Chungli Ao",
55607615,
"njo",
"Latn",
}
m["njo-mng"] = {
"Mongsen Ao",
85383221,
"njo",
"Latn",
}
m["nub-har"] = {
"Haraza",
19572059,
"nub",
"Arab, Latn",
}
m["nub-pro"] = {
"Proto-Nubian",
116773246,
"nub",
"Latn",
type = "reconstructed",
}
m["omq-cha-pro"] = {
"Proto-Chatino",
116773202,
"omq-cha",
"Latn",
type = "reconstructed",
}
m["omq-maz-pro"] = {
"Proto-Mazatec",
116773790,
"omq-maz",
"Latn",
type = "reconstructed",
}
m["omq-mix-pro"] = {
"Proto-Mixtecan",
21573423,
"omq-mix",
"Latn",
type = "reconstructed",
}
m["omq-mxt-pro"] = {
"Proto-Mixtec",
21573424,
"omq-mxt",
"Latn",
type = "reconstructed",
}
m["omq-otp-pro"] = {
"Proto-Oto-Pamean",
116773251,
"omq-otp",
"Latn",
type = "reconstructed",
}
m["omq-pro"] = {
"Proto-Oto-Manguean",
33669,
"omq",
"Latn",
type = "reconstructed",
}
m["omq-sjq"] = {
"San Juan Quiahije Chatino",
138330751,
"omq-cha",
"Latn",
}
m["omq-tel"] = {
"Teposcolula Mixtec",
nil,
"omq-mxt",
"Latn",
}
m["omq-teo"] = {
"Teojomulco Chatino",
25340451,
"omq-cha",
"Latn",
}
m["omq-tri-pro"] = {
"Proto-Triqui",
116773817,
"omq-tri",
"Latn",
type = "reconstructed",
}
m["omq-zap-pro"] = {
"Proto-Zapotecan",
116773297,
"omq-zap",
"Latn",
type = "reconstructed",
}
m["omq-zpc-pro"] = {
"Proto-Zapotec",
116773296,
"omq-zpc",
"Latn",
type = "reconstructed",
}
m["omv-aro-pro"] = {
"Proto-Aroid",
116773721,
"omv-aro",
"Latn",
type = "reconstructed",
}
m["omv-diz-pro"] = {
"Proto-Dizoid",
116773750,
"omv-diz",
"Latn",
type = "reconstructed",
}
m["omv-pro"] = {
"Proto-Omotic",
116773800,
"omv",
"Latn",
type = "reconstructed",
}
m["oto-otm-pro"] = {
"Proto-Otomi",
5908710,
"oto-otm",
"Latn",
type = "reconstructed",
}
m["oto-pro"] = {
"Proto-Otomian",
116773252,
"oto",
"Latn",
type = "reconstructed",
}
m["paa-kmn"] = {
"Kómnzo",
18344310,
"paa-wko",
"Latn",
}
m["paa-kwn"] = {
"Kuwani",
6449056,
"qfa-unc", -- poorly attested, possibly the same as or related to Kalabra
"Latn",
}
m["paa-lei"] = {
"Leitre",
85776228,
"paa-isk",
}
m["paa-nha-pro"] = {
"Proto-North Halmahera",
116773241,
"paa-nha",
"Latn",
type = "reconstructed"
}
m["paa-nun"] = {
"Nungon",
128807788,
"ngf-ynu",
"Latn",
}
m["phi-din"] = {
"Dinapigue Agta",
16945774,
"phi",
"Latn",
}
m["phi-kal-pro"] = {
"Proto-Kalamian",
116773213,
"phi-kal",
"Latn",
type = "reconstructed",
}
m["phi-nag"] = {
"Nagtipunan Agta",
16966111,
"phi",
"Latn",
}
m["phi-pro"] = {
"Proto-Philippine",
18204898,
"phi",
"Latn",
type = "reconstructed",
}
m["poz-abi"] = {
"Abai",
19570729,
"poz-san",
"Latn",
}
m["poz-bal"] = {
"Baliledo",
4850912,
"poz",
"Latn",
}
m["poz-btk-pro"] = {
"Proto-Bungku-Tolaki",
116773724,
"poz-btk",
"Latn",
type = "reconstructed",
}
m["poz-cet-pro"] = {
"Proto-Central-Eastern Malayo-Polynesian",
2269883,
"poz-cet",
"Latn",
type = "reconstructed",
}
m["poz-hce-pro"] = {
"Proto-Halmahera-Cenderawasih",
116773209,
"poz-hce",
"Latn",
type = "reconstructed",
}
m["poz-lgx-pro"] = {
"Proto-Lampungic",
116773222,
"poz-lgx",
"Latn",
type = "reconstructed",
}
m["poz-mcm-pro"] = {
"Proto-Malayo-Chamic",
116773225,
"poz-mcm",
"Latn",
type = "reconstructed",
}
m["poz-mic-pro"] = {
"Proto-Micronesian",
111939079,
"poz-mic",
"Latn",
type = "reconstructed",
}
m["poz-mly-pro"] = {
"Proto-Malayic",
98057728,
"poz-mly",
"Latn",
type = "reconstructed",
}
m["poz-msa-pro"] = {
"Proto-Malayo-Sumbawan",
116773226,
"poz-msa",
"Latn",
type = "reconstructed",
}
m["poz-oce-pro"] = {
"Proto-Oceanic",
141741,
"poz-oce",
"Latn",
type = "reconstructed",
}
m["poz-pep-pro"] = {
"Proto-Eastern Polynesian",
113988745,
"poz-pep",
"Latn",
type = "reconstructed",
}
m["poz-pnp-pro"] = {
"Proto-Nuclear Polynesian",
113988746,
"poz-pnp",
"Latn",
type = "reconstructed",
}
m["poz-pol-pro"] = {
"Proto-Polynesian",
1658709,
"poz-pol",
"Latn",
type = "reconstructed",
}
m["poz-pro"] = {
"Proto-Malayo-Polynesian",
3832960,
"poz",
"Latn",
type = "reconstructed",
}
m["poz-sml"] = {
"Sarawak Malay",
4251702,
"poz-mly",
"Latn, ms-Arab",
}
m["poz-ssw-pro"] = {
"Proto-South Sulawesi",
116773279,
"poz-ssw",
"Latn",
type = "reconstructed",
}
m["poz-swa-pro"] = {
"Proto-North Sarawak",
116773243,
"poz-swa",
"Latn",
type = "reconstructed",
}
m["poz-ter"] = {
"Terengganu Malay",
4207412,
"poz-mly",
"Latn, ms-Arab",
}
m["pqe-pro"] = {
"Proto-Eastern Malayo-Polynesian",
2269883,
"pqe",
"Latn",
type = "reconstructed",
}
m["pra-niy"] = {
"Niya Prakrit",
11991601,
"inc-mid",
"Khar",
ancestors = "inc-ash",
translit = "Khar-translit",
}
m["qfa-adm-pro"] = {
"Proto-Great Andamanese",
116773756,
"qfa-adm",
"Latn",
type = "reconstructed",
}
m["qfa-bet-pro"] = {
"Proto-Be-Tai",
116773193,
"qfa-bet",
"Latn",
type = "reconstructed",
}
m["qfa-cka-pro"] = {
"Proto-Chukotko-Kamchatkan",
7251837,
"qfa-cka",
"Latn",
type = "reconstructed",
}
m["qfa-hur-pro"] = {
"Proto-Hurro-Urartian",
116773211,
"qfa-hur",
"Latn",
type = "reconstructed",
}
m["qfa-kad-pro"] = {
"Proto-Kadu",
116773770,
"qfa-kad",
"Latn",
type = "reconstructed",
}
m["qfa-kms-pro"] = {
"Proto-Kam-Sui",
55630682,
"qfa-kms",
"Latn",
type = "reconstructed",
}
m["qfa-kor-pro"] = {
"Proto-Koreanic",
467883,
"qfa-kor",
"Latn",
type = "reconstructed",
}
m["qfa-kra-pro"] = {
"Proto-Kra",
7251854,
"qfa-kra",
"Latn",
type = "reconstructed",
}
m["qfa-lic-pro"] = {
"Proto-Hlai",
7251845,
"qfa-lic",
"Latn",
type = "reconstructed",
}
m["qfa-onb-pro"] = {
"Proto-Be",
116773192,
"qfa-onb",
"Latn",
type = "reconstructed",
}
m["qfa-ong-pro"] = {
"Proto-Ongan",
116773801,
"qfa-ong",
"Latn",
type = "reconstructed",
}
m["qfa-tak-pro"] = {
"Proto-Kra-Dai",
104901616,
"qfa-tak",
"Latn",
type = "reconstructed",
}
m["qfa-yen-pro"] = {
"Proto-Yeniseian",
27639,
"qfa-yen",
"Latn",
type = "reconstructed",
}
m["qfa-yuk-pro"] = {
"Proto-Yukaghir",
116773294,
"qfa-yuk",
"Latn",
type = "reconstructed",
}
m["qwe-kch"] = {
"Kichwa",
1740805,
"qwe",
"Latn",
ancestors = "qu",
}
m["qwe-pro"] = {
"Proto-Quechuan",
5575757,
"qwe",
"Latn",
type = "reconstructed",
}
m["roa-ang"] = {
"Angevin",
56782,
"roa-oil",
"Latn",
sort_key = s["roa-oil-sortkey"],
}
m["roa-bbn"] = {
"Bourbonnais-Berrichon",
2899128,
"roa-oil",
"Latn",
sort_key = s["roa-oil-sortkey"],
}
m["roa-brg"] = {
"Bourguignon",
508332,
"roa-oil",
"Latn",
sort_key = s["roa-oil-sortkey"],
}
m["roa-can"] = {
"Cantabrian",
917021,
"roa-asl",
"Latn",
}
m["roa-cha"] = {
"Champenois",
430018,
"roa-oil",
"Latn",
sort_key = s["roa-oil-sortkey"],
}
m["roa-fcm"] = {
"Franc-Comtois",
510561,
"roa-oil",
"Latn",
sort_key = s["roa-oil-sortkey"],
}
m["roa-gal"] = {
"Gallo",
37300,
"roa-oil",
"Latn",
sort_key = s["roa-oil-sortkey"],
}
m["roa-gib"] = {
"Gallo-Italic of Basilicata",
3094838,
"roa-git",
ancestors = "pms-old",
"Latn",
}
m["roa-gis"] = {
"Gallo-Italic of Sicily",
2629019,
"roa-git",
"Latn",
ancestors = "pms-old",
}
m["roa-leo"] = {
"Leonese",
34108,
"roa-asl",
"Latn",
}
m["roa-lor"] = {
"Lorrain",
671198,
"roa-oil",
"Latn",
sort_key = s["roa-oil-sortkey"],
}
m["roa-oca"] = {
"Old Catalan",
15478520,
"roa-ocr",
"Latn",
sort_key = {remove_diacritics = c.grave .. c.acute .. c.diaer .. c.cedilla .. "·"},
}
m["roa-ole"] = {
"Old Leonese",
125977465,
"roa-asl",
"Latn",
}
m["roa-ona"] = {
"Old Navarro-Aragonese",
2736184,
"roa-nar",
"Latn",
}
m["roa-opt"] = {
"Old Galician-Portuguese",
1072111,
"roa-gap",
"Latn",
strip_diacritics = {remove_diacritics = c.grave .. c.acute .. c.circ},
}
m["roa-orl"] = {
"Orléanais",
28497058,
"roa-oil",
"Latn",
sort_key = s["roa-oil-sortkey"],
}
m["roa-poi"] = {
"Poitevin-Saintongeais",
514123,
"roa-oil",
"Latn",
sort_key = s["roa-oil-sortkey"],
}
m["roa-tar"] = {
"Tarantino",
695526,
"roa-itr",
"Latn",
wikimedia_codes = "roa-tara",
}
m["sai-all"] = {
"Allentiac",
19570789,
"sai-hrp",
"Latn",
}
m["sai-and"] = { -- not to be confused with 'cbc' or 'ano'
"Andoquero",
16828359,
"sai-wit",
"Latn",
}
m["sai-ayo"] = {
"Ayomán",
16937754,
"sai-jir",
"Latn",
}
m["sai-bae"] = {
"Baenan",
3401998,
"qfa-unc", -- extinct, poorly attested; only known through 9 words
"Latn",
}
m["sai-bag"] = {
"Bagua",
5390321,
"qfa-unc", -- extinct, poorly attested; possibly Cariban
"Latn",
}
m["sai-bet"] = {
"Betoi",
926551,
"qfa-iso",
"Latn",
}
m["sai-bor-pro"] = {
"Proto-Boran",
nil,
"sai-bor",
"Latn",
}
m["sai-cac"] = {
"Cacán",
945482,
"qfa-unc", -- extinct, poorly attested; no consensus on classification
"Latn",
}
m["sai-caq"] = {
"Caranqui",
2937753,
"sai-bar",
"Latn",
}
m["sai-car-pro"] = {
"Proto-Cariban",
116773196,
"sai-car",
"Latn",
type = "reconstructed",
}
m["sai-cat"] = {
"Catacao",
5051136,
"sai-ctc",
"Latn",
}
m["sai-cer-pro"] = {
"Proto-Cerrado",
116773200,
"sai-cer",
"Latn",
type = "reconstructed",
}
m["sai-chi"] = {
"Chirino",
5390321,
"qfa-unc", -- extinct, only four words known; possibly related to Candoshi-Shapra (cbu)
"Latn",
}
m["sai-chn"] = {
"Chaná",
5072718,
"sai-crn",
"Latn",
}
m["sai-chp"] = {
"Chapacura",
5072884,
"sai-cpc",
"Latn",
}
m["sai-chr"] = {
"Charrua",
5086680,
"sai-crn",
"Latn",
}
m["sai-chu"] = {
"Churuya",
5118339,
"sai-guh",
"Latn",
}
m["sai-cje-pro"] = {
"Proto-Central Jê",
116773198,
"sai-cje",
"Latn",
type = "reconstructed",
}
m["sai-cmg"] = {
"Comechingon",
6644203,
"qfa-unc", -- extinct, poorly attested; no consensus on classification
"Latn",
}
m["sai-cno"] = {
"Chono",
5104704,
"qfa-unc", -- extinct, poorly attested; no consensus on classification, possibly spurious
"Latn",
}
m["sai-cnr"] = {
"Cañari",
5055572,
"qfa-unc", -- extinct, poorly attested; possibly Chimuan or Barbacoan
"Latn",
}
m["sai-coe"] = {
"Coeruna",
6425639,
"sai-wit",
"Latn",
}
m["sai-col"] = {
"Colán",
5141893,
"sai-ctc",
"Latn",
}
m["sai-cop"] = {
"Copallén",
5390321,
"qfa-unc", -- extinct, only four words attested; possibly Cholonan
"Latn",
}
m["sai-crd"] = {
"Coroado Puri",
24191321,
"sai-mje",
"Latn",
}
m["sai-ctq"] = {
"Catuquinaru",
16858455,
"qfa-unc", -- extinct, poorly attested; vocabulary does not resemble other languages
"Latn",
}
m["sai-cul"] = {
"Culli",
2879660,
"qfa-unc", -- extinct, poorly attested; often considered an isolate
"Latn",
}
m["sai-cva"] = {
"Cueva",
5192644,
"qfa-unc", -- extinct, poorly attested; possibly Chocoan
"Latn",
}
m["sai-esm"] = {
"Esmeralda",
3058083,
"qfa-unc", -- extinct, poorly attested; possibly related to Yaruro
"Latn",
}
m["sai-ewa"] = {
"Ewarhuyana",
16898104,
nil,
"Latn",
}
m["sai-gam"] = {
"Gamela",
5403661,
"qfa-unc", -- extinct, poorly attested; possibly an isolate
"Latn",
}
m["sai-gay"] = {
"Gayón",
5528902,
"sai-jir",
"Latn",
}
m["sai-gmo"] = {
"Guamo",
5613495,
"qfa-unc", -- extinct; "Kaufman (1990) finds a connection with the Chapacuran languages convincing." [Wikipedia] Considered an isolate by Campbell (2024).
"Latn",
}
m["sai-gua"] = {
"Guachí",
5613172,
"sai-guc",
"Latn",
}
m["sai-gue"] = {
"Güenoa",
5626799,
"sai-crn",
"Latn",
}
m["sai-hau"] = {
"Haush",
3128376,
"sai-cho",
"Latn",
}
m["sai-jee-pro"] = {
"Proto-Jê",
116773212,
"sai-jee",
"Latn",
type = "reconstructed",
}
m["sai-jko"] = {
"Jeikó",
6176527,
"sai-mje",
"Latn",
}
m["sai-jrj"] = {
"Jirajara",
6202966,
"sai-jir",
"Latn",
}
m["sai-kat"] = { -- contrast xoo, kzw, sai-xoc
"Katembri",
6375925,
"qfa-unc", -- extinct, poorly attested; "Kaufman (1990) has linked it with the nearly extinct Taruma, although this has not been accepted by other scholars." [Wikipedia]
"Latn",
}
m["sai-mal"] = {
"Malalí",
6741212,
"sai-mje", -- considered the most divergent Maxakalían language (a subdivision of Macro-Jê), for which we have no entry
"Latn",
}
m["sai-mar"] = {
"Maratino",
6755055,
"qfa-unc", -- extinct, poorly attested; possibly Uto-Aztecan
"Latn",
}
m["sai-mat"] = {
"Matanawi",
6786047,
"qfa-unc", -- extinct; either an isolate or distantly related to the Muran languages; Campbell (2024) lists it as an isolate, Glottolog gives it as unclassified
"Latn",
}
m["sai-mcn"] = {
"Mocana",
3402048,
"qfa-unc", -- extinct, poorly attested; given as part of the Malibu languages (geographic grouping; not a clade)
"Latn",
}
m["sai-men"] = {
"Menien",
16890110,
"sai-mje",
"Latn",
}
m["sai-mil"] = {
"Millcayac",
19573012,
"sai-hrp",
"Latn",
}
m["sai-mlb"] = {
"Malibu",
134374036,
"qfa-unc", -- extinct, poorly attested; given as part of the Malibu languages (geographic grouping; not a clade)
"Latn",
}
m["sai-msk"] = {
"Masakará",
6782426,
"sai-mje",
"Latn",
}
m["sai-muc"] = {
"Mucuchí",
6931290,
nil, -- generally considered Timotean, for which we have no entry
"Latn",
}
m["sai-mue"] = {
"Muellama",
16886936,
"sai-bar",
"Latn",
}
m["sai-muz"] = {
"Muzo",
6644203,
"qfa-unc", -- extinct language of Colombia, poorly attested; may be Pijao (Cariban)
"Latn",
}
m["sai-mys"] = {
"Maynas",
16919393,
"sai-cah", -- per Campbell (2024); formerly considered unclassified
"Latn",
}
m["sai-nat"] = {
"Natú",
9006749,
"qfa-unc", -- extinct, poorly attested; "only Greenberg dares to classify [it]".[Wikipedia, quoting Moseley, Christopher; Asher, R. E.; Tait, Mary (1994), Atlas of the world's languages]
"Latn",
}
m["sai-nje-pro"] = {
"Proto-Northern Jê",
116773245,
"sai-nje",
"Latn",
type = "reconstructed",
}
m["sai-opo"] = {
"Opón",
7099152,
"sai-car",
"Latn",
}
m["sai-oto"] = {
"Otomaco",
16879234,
"sai-otm",
"Latn",
}
m["sai-pal"] = {
"Palta",
3042978,
"qfa-unc", -- extinct, unclassified; possibly Chicham
"Latn",
}
m["sai-pam"] = {
"Pamigua",
5908689,
"sai-tin",
"Latn",
}
m["sai-par"] = {
"Paratió",
16890038,
"qfa-unc", -- extinct, poorly attested; possibly Xukuruan
"Latn",
}
m["sai-peb"] = {
"Peba",
3373890,
"sai-pey",
"Latn",
}
m["sai-pnz"] = {
"Panzaleo",
3123275,
"qfa-unc", -- extinct, unclassified; possibly Paezan
"Latn",
}
m["sai-prh"] = {
"Puruhá",
3410994,
"qfa-unc", -- extinct, poorly attested; possibly in a famil with Cañari
"Latn",
}
m["sai-ptg"] = {
"Patagón",
128807870,
"sai-tar", -- extinct, only known from 4 words, which suggest Cariban lineage (Campbell 2024)
"Latn",
}
m["sai-pur"] = {
"Purukotó",
7261622,
"sai-pem",
"Latn",
}
m["sai-pyg"] = {
"Payaguá",
7156643,
"sai-guc",
"Latn",
}
m["sai-pyk"] = {
"Pykobjê",
98113977,
"sai-nje",
"Latn",
}
m["sai-qmb"] = {
"Quimbaya",
7272043,
"qfa-unc", -- extinct, might not exist; few known words
"Latn",
}
m["sai-qtm"] = {
"Quitemo",
7272651,
"sai-cpc",
"Latn",
}
m["sai-rab"] = {
"Rabona",
6644203,
"qfa-unc", -- extinct, poorly attested, mostly plant names; possibly Candoshi-Shapra
"Latn",
}
m["sai-ram"] = {
"Ramanos",
16902824,
"qfa-unc", -- extinct, poorly attested, possibly an isolate; per Glottolog: "the minuscule wordlist ... shows no convincing resemblances to surrounding languages"
"Latn",
}
m["sai-sac"] = {
"Sácata",
5390321,
"qfa-unc", -- extinct, only 3 words known; possibly Candoshí or Arawakan
"Latn",
}
m["sai-san"] = {
"Sanaviron",
16895999,
"qfa-unc", -- extinct, unclassified; no consensus on classification
"Latn",
}
m["sai-sap"] = {
"Sapará",
7420922,
"sai-car",
"Latn",
}
m["sai-sec"] = {
"Sechura",
7442912,
"qfa-unc", -- extinct, poorly attested; possibly Catacaoan
"Latn",
}
m["sai-sin"] = {
"Sinúfana",
7525275,
"qfa-unc", -- moribund, poorly attested; possibly Chocoan
"Latn",
}
m["sai-sje-pro"] = {
"Proto-Southern Jê",
116773814,
"sai-sje",
"Latn",
type = "reconstructed",
}
m["sai-tab"] = {
"Tabancale",
5390321,
"qfa-unc", -- extinct, only 5 words known; no obvious connections, might be an isolate
"Latn",
}
m["sai-tal"] = {
"Tallán",
16910468,
"qfa-unc", -- extinct, poorly attested; might be Catacaoan
"Latn",
}
m["sai-tap"] = {
"Tapayuna",
30719984,
"sai-nje",
"Latn",
}
m["sai-tar-pro"] = {
"Proto-Taranoan",
116773816,
"sai-tar",
"Latn",
type = "reconstructed",
}
m["sai-teu"] = {
"Teushen",
3519243,
"qfa-unc", -- probably extinct by the 1950's; possibly Chonan
"Latn",
}
m["sai-tim"] = {
"Timote",
7806995,
nil, -- possibly in a small Timotean family
"Latn",
}
m["sai-tpr"] = {
"Taparita",
7684460,
"sai-otm",
"Latn",
}
m["sai-trr"] = {
"Tarairiú",
7685313,
"qfa-unc", -- extinct, too poorly attested to classify
"Latn",
}
m["sai-wai"] = {
"Waitaká",
16918610,
"qfa-unc", -- extinct, possibly Purian
"Latn",
}
m["sai-way"] = {
"Wayumara",
7960726,
"sai-car",
"Latn",
}
m["sai-wit-pro"] = {
"Proto-Witotoan",
116773823,
"sai-wit",
"Latn",
type = "reconstructed",
}
m["sai-wnm"] = {
"Wanham",
16879440,
"sai-cpc",
"Latn",
}
m["sai-xoc"] = { -- contrast xoo, kzw, sai-kat
"Xocó",
12953620,
"qfa-unc", -- extinct and poorly attested; not clear if one or three languages
"Latn",
}
m["sai-yao"] = {
"Yao (South America)",
16979655,
"sai-ven",
"Latn",
}
m["sai-yar"] = { -- not the same family as 'suy'
"Yarumá",
3505859,
"sai-pek",
"Latn",
}
m["sai-yri"] = {
"Yuri",
2669157,
"sai-tyu",
"Latn",
}
m["sai-yup"] = {
"Yupua",
8061430,
"sai-tuc",
"Latn",
}
m["sai-yur"] = {
"Yurumanguí",
1281291,
"qfa-unc", -- extinct, too poorly attested to classify
"Latn",
}
m["sal-pro"] = {
"Proto-Salish",
116773269,
"sal",
"Latn",
type = "reconstructed",
}
m["sdv-daj-pro"] = {
"Proto-Daju",
116773739,
"sdv-daj",
"Latn",
type = "reconstructed",
}
m["sdv-eje-pro"] = {
"Proto-Eastern Jebel",
116773751,
"sdv-eje",
"Latn",
type = "reconstructed",
}
m["sdv-nil-pro"] = {
"Proto-Nilotic",
116773794,
"sdv-nil",
"Latn",
type = "reconstructed",
}
m["sdv-nyi-pro"] = {
"Proto-Nyima",
116773796,
"sdv-nyi",
"Latn",
type = "reconstructed",
}
m["sdv-tmn-pro"] = {
"Proto-Taman",
116773815,
"sdv-tmn",
"Latn",
type = "reconstructed",
}
m["sel-nor"] = {
"Northern Selkup",
30304565,
"sel",
"Cyrl",
translit = "sel-nor-translit",
}
m["sel-pro"] = {
"Proto-Selkup",
128884235,
"sel",
"Latn",
type = "reconstructed",
}
m["sel-sou"] = {
"Southern Selkup",
30304639,
"sel",
"Cyrl",
translit = "sel-sou-translit",
}
m["sem-amm"] = {
"Ammonite",
279181,
"sem-can",
"Phnx",
-- Phnx translit in [[Module:scripts/data]]
}
m["sem-amo"] = {
"Amorite",
35941,
"sem-nwe",
"Xsux, Latn",
}
m["sem-cha"] = {
"Chaha",
35543,
"sem-eth",
"Ethi",
translit = "Ethi-translit",
}
m["sem-dad"] = {
"Dadanitic",
21838040,
"sem-cen",
"Narb",
-- Narb translit in [[Module:scripts/data]]
}
m["sem-dum"] = {
"Dumaitic",
128810397,
"sem-cen",
"Narb",
-- Narb translit in [[Module:scripts/data]]
}
m["sem-has"] = {
"Hasaitic",
3541433,
"sem-cen",
"Narb",
-- Narb translit in [[Module:scripts/data]]
}
m["sem-his"] = {
"Hismaic",
22948260,
"sem-cen",
"Narb",
-- Narb translit in [[Module:scripts/data]]
}
m["sem-mhr"] = {
"Muher",
33743,
"sem-eth",
"Latn",
}
m["sem-pro"] = {
"Proto-Semitic",
1658554,
"sem",
"Latn",
type = "reconstructed",
}
m["sem-saf"] = {
"Safaitic",
472586,
"sem-cen",
"Narb",
-- Narb translit in [[Module:scripts/data]]
}
m["sem-sam"] = {
"Samalian",
85847147,
"sem-nwe",
"Phnx",
-- Phnx translit in [[Module:scripts/data]]
}
m["sem-srb"] = {
"Old South Arabian",
35025,
"sem-osa",
"Sarb",
-- Sarb translit in [[Module:scripts/data]]
}
m["sem-tay"] = {
"Taymanitic",
24912301,
"sem-cen",
"Narb",
-- Narb translit in [[Module:scripts/data]]
}
m["sem-tha"] = {
"Thamudic",
843030,
"sem-cen",
"Narb",
-- Narb translit in [[Module:scripts/data]]
}
m["sem-wes-pro"] = {
"Proto-West Semitic",
98021726,
"sem-wes",
"Latn",
type = "reconstructed",
}
m["sio-pro"] = { -- NB this is not Proto-Siouan-Catawban 'nai-sca-pro'
"Proto-Siouan",
34181,
"sio",
"Latn",
type = "reconstructed",
}
m["sit-aao-pro"] = {
"Proto-Central Naga",
nil,
"sit-aao",
"Latn",
type = "reconstructed",
}
m["sit-bai-pro"] = {
"Proto-Bai",
nil,
"sit-bai",
"Latn",
type = "reconstructed",
}
m["sit-ban"] = {
"Bangru",
56071779,
"sit-hrs",
"Latn",
}
m["sit-bdi-pro"] = {
"Proto-Bodish",
nil,
"sit-bdi",
"Latn",
type = "reconstructed",
}
m["sit-bok"] = {
"Bokar",
4938727,
"sit-tan",
"Latn, Tibt",
override_translit = true,
-- Tibt translit, display_text, strip_diacritics, sort_key in [[Module:scripts/data]]
}
m["sit-cai"] = {
"Caijia",
5017528,
"sit-cln",
"Latn"
}
m["sit-cha"] = {
"Chairel",
5068066,
"sit-luu",
"Latn",
}
m["sit-ers-pro"] = {
"Proto-Ersuic",
nil,
"sit-ers",
"Latn",
type = "reconstructed",
}
m["sit-hrs-pro"] = {
"Proto-Hrusish",
116773762,
"sit-hrs",
"Latn",
type = "reconstructed",
}
m["sit-jap"] = {
"Japhug",
3162245,
"sit-egy",
"Latn",
}
m["sit-kha-pro"] = {
"Proto-Kham",
116773773,
"sit-kha",
"Latn",
type = "reconstructed",
}
m["sit-khb-pro"] = {
"Proto-Kho-Bwa",
nil,
"sit-khb",
"Latn",
type = "reconstructed",
}
m["sit-khp-pro"] = {
"Proto-Puroik",
nil,
"sit-khb",
"Latn",
type = "reconstructed",
}
m["sit-khw-pro"] = {
"Proto-Western Kho-Bwa",
nil,
"sit-khw",
"Latn",
type = "reconstructed",
}
m["sit-kon-pro"] = {
"Proto-Northern Naga",
nil,
"sit-kon",
"Latn",
type = "reconstructed",
}
m["sit-liz"] = {
"Lizu",
6660653,
"sit-ers",
"Latn", -- and Ersu Shaba
}
m["sit-lnj"] = {
"Longjia",
17096251,
"sit-cln",
"Latn"
}
m["sit-lrn"] = {
"Luren",
16946370,
"sit-cln",
"Latn"
}
m["sit-luu-pro"] = {
"Proto-Luish",
116773783,
"sit-luu",
"Latn",
type = "reconstructed",
}
m["sit-nas-pro"] = {
"Proto-Naish",
nil,
"sit-nas",
"Latn",
type = "reconstructed",
}
m["sit-prn"] = {
"Puiron",
7259048,
"sit-zem",
}
m["sit-pro"] = {
"Proto-Sino-Tibetan",
24839178,
"sit",
"Latn",
type = "reconstructed",
}
m["sit-sit"] = {
"Situ",
19840830,
"sit-egy",
"Latn",
}
m["sit-tam-pro"] = {
"Proto-Tamangic",
117469295,
"sit-tam",
"Latn",
type = "reconstructed",
}
m["sit-tan-pro"] = {
"Proto-Tani",
116773284,
"sit-tan",
"Latn", -- needs verification
type = "reconstructed",
}
m["sit-tgm"] = {
"Tangam",
17041370,
"sit-tan",
"Latn",
}
m["sit-tng-pro"] = {
"Proto-Tangkhulic",
nil,
"sit-tng",
"Latn",
type = "reconstructed"
}
m["sit-tos"] = {
"Tosu",
7827899,
"sit-ers",
"Latn", -- also Ersu Shaba
}
m["sit-tsh"] = {
"Tshobdun",
19840950,
"sit-egy",
"Latn",
}
m["sit-zbu"] = {
"Zbu",
19841106,
"sit-egy",
"Latn",
}
m["sla-pro"] = {
"Proto-Slavic",
747537,
"sla",
"Latn",
type = "reconstructed",
strip_diacritics = {
remove_diacritics = c.grave .. c.acute .. c.tilde .. c.macron .. c.dgrave .. c.invbreve,
remove_exceptions = {'ś'},
},
sort_key = {
from = {"č", "ď", "ě", "ę", "ь", "ľ", "ň", "ǫ", "ř", "š", "ś", "ť", "ъ", "ž"},
to = {"c²", "d²", "e²", "e³", "i²", "l²", "nj", "o²", "r²", "s²", "s³", "t²", "u²", "z²"},
}
}
m["smi-pro"] = {
"Proto-Samic",
7251862,
"smi",
"Latn",
type = "reconstructed",
sort_key = {
from = {"ā", "č", "δ", "[ëē]", "ŋ", "ń", "ō", "š", "θ", "%([^()]+%)"},
to = {"a", "c²", "d", "e", "n²", "n³", "o", "s²", "t²"}
},
}
m["son-pro"] = {
"Proto-Songhay",
116773277,
"son",
"Latn",
type = "reconstructed",
}
m["sqj-pro"] = {
"Proto-Albanian",
18210846,
"sqj",
"Latn",
type = "reconstructed",
}
m["ssa-klk-pro"] = {
"Proto-Kuliak",
116773779,
"ssa-klk",
"Latn",
type = "reconstructed",
}
m["ssa-kom-pro"] = {
"Proto-Koman",
116773775,
"ssa-kom",
"Latn",
type = "reconstructed",
}
m["ssa-pro"] = {
"Proto-Nilo-Saharan",
116773236,
"ssa",
"Latn",
type = "reconstructed",
}
m["syd-pro"] = {
"Proto-Samoyedic",
7251863,
"syd",
"Latn",
type = "reconstructed",
}
m["tai-pro"] = {
"Proto-Tai",
6583709,
"tai",
"Latn",
type = "reconstructed",
}
m["tai-swe-pro"] = {
"Proto-Southwestern Tai",
116773280,
"tai-swe",
"Latn",
type = "reconstructed",
}
m["tbq-bdg-pro"] = {
"Proto-Bodo-Garo",
116773195,
"tbq-bdg",
"Latn",
type = "reconstructed",
}
m["tbq-blg"] = {
"Bailang",
2879843,
"tbq-lob",
"Hani",
sort_key = "Hani-sortkey",
}
m["tbq-brm-pro"] = {
"Proto-Burmish",
nil,
"tbq-brm",
"Latn",
type = "reconstructed",
}
m["tbq-gkh"] = {
"Gokhy",
5578069,
"tbq-sil",
"Latn",
}
m["tbq-kuk-pro"] = {
"Proto-Kuki-Chin",
116773220,
"tbq-kuk",
"Latn",
type = "reconstructed",
}
m["tbq-lal-pro"] = {
"Proto-Lalo",
116773781,
"tbq-lal",
"Latn",
type = "reconstructed",
}
m["tbq-laz"] = {
"Laze",
17007626,
"sit-nas",
"Latn",
}
m["tbq-lob-pro"] = {
"Proto-Lolo-Burmese",
116773224,
"tbq-lob",
"Latn",
type = "reconstructed",
}
m["tbq-lol-pro"] = {
"Proto-Loloish",
7251855,
"tbq-lol",
"Latn",
type = "reconstructed",
}
m["tbq-mil"] = {
"Milang",
6850761,
"sit-gsi",
"Deva, Latn",
}
m["tbq-mor"] = {
"Moran",
6909216,
"tbq-bdg",
"Latn",
}
m["tbq-ngo"] = {
"Ngochang",
56582,
"tbq-brm",
"Latn",
}
-- tbq-pro is now etymology-only
m["trk-dkh"] = {
"Dukhan",
12809273,
"trk-ssb",
"Latn, Cyrl, Mong",
-- Mong translit, display_text and strip_diacritics in [[Module:scripts/data]]
}
-- As described in Mahmud al-Kashgari's 11th century ''Dīwān Lughāt al-Turk''.
m["trk-eog"] = {
"Early Old Oghuz",
nil,
"trk-ogz",
"ota-Arab",
strip_diacritics = {["ota-Arab"] = "ar-stripdiacritics"},
}
m["trk-oat"] = {
"Old Anatolian Turkish",
7083390,
"trk-ogz",
"ota-Arab",
strip_diacritics = {["ota-Arab"] = "ar-stripdiacritics"},
ancestors = "trk-eog",
}
m["trk-pro"] = {
"Proto-Turkic",
3657773,
"trk",
"Latn",
type = "reconstructed",
standard_chars = {
Latn = " ()-abdegiklmnoprstuxyzïöüāčēīĺŋōŕšūǖȫẹ" .. c.macron,
}
}
m["tup-gua-pro"] = {
"Proto-Tupi-Guarani",
116773288,
"tup-gua",
"Latn",
type = "reconstructed",
}
m["tup-kab"] = {
"Kabishiana",
15302988,
"tup",
"Latn",
}
m["tup-pro"] = {
"Proto-Tupian",
10354700,
"tup",
"Latn",
type = "reconstructed",
}
m["tuw-alk"] = {
"Alchuka",
113553616,
"tuw-jrc",
"Latn, Hans",
sort_key = {Hans = "Hani-sortkey"},
}
m["tuw-bal"] = {
"Bala",
86730632,
"tuw-jrc",
"Latn, Hans",
sort_key = {Hans = "Hani-sortkey"},
}
m["tuw-kkl"] = {
"Kyakala",
118875708,
"tuw-jrc",
"Latn, Hans",
sort_key = {Hans = "Hani-sortkey"},
}
m["tuw-kli"] = {
"Kili",
6406892,
"tuw-ewe",
"Cyrl",
}
m["tuw-pro"] = {
"Proto-Tungusic",
85872335,
"tuw",
"Latn",
type = "reconstructed",
}
m["tuw-sol"] = {
"Solon",
30004,
"tuw-ewe",
}
m["urj-fin-pro"] = {
"Proto-Finnic",
11883720,
"urj-fin",
"Latn",
type = "reconstructed",
}
m["urj-koo"] = {
"Old Komi",
86679962,
"kv",
"Perm, Cyrs",
translit = "urj-koo-translit",
-- Cyrs strip_diacritics, sort_key in [[Module:scripts/data]]; previously, Cyrs strip_diacritics not present
}
m["urj-kuk"] = {
"Kukkuzi",
107410460,
"urj-fin",
"Latn",
ancestors = "vot",
}
m["urj-kya"] = {
"Komi-Yazva",
2365210,
"kv",
"Cyrl",
translit = "kv-translit",
override_translit = true,
strip_diacritics = {remove_diacritics = c.acute},
}
m["urj-mdv-pro"] = {
"Proto-Mordvinic",
116773232,
"urj-mdv",
"Latn",
type = "reconstructed",
}
m["urj-prm-pro"] = {
"Proto-Permic",
116773257,
"urj-prm",
"Latn",
type = "reconstructed",
}
m["urj-pro"] = {
"Proto-Uralic",
288765,
"urj",
"Latn",
type = "reconstructed",
}
m["urj-ugr-pro"] = {
"Proto-Ugric",
156631,
"urj-ugr",
"Latn",
type = "reconstructed",
}
m["xnd-pro"] = {
"Proto-Na-Dene",
116773233,
"xnd",
"Latn",
type = "reconstructed",
}
m["xgn-pro"] = {
"Proto-Mongolic",
2493677,
"xgn",
"Latn",
type = "reconstructed",
sort_key = {
from = {"č", "i", "ï", "ǰ", "ŋ", "ö", "š", "ü"},
to = {"c", "i" .. p[1], "i", "j", "n" .. p[1], "o" .. p[1], "s" .. p[1], "u" .. p[1]},
},
}
m["yok-bvy"] = {
"Buena Vista Yokuts",
4985474,
"yok",
"Latn",
}
m["yok-dly"] = {
"Delta Yokuts",
70923266,
"yok",
"Latn",
}
m["yok-gsy"] = {
"Gashowu Yokuts",
3098708,
"yok",
"Latn",
}
m["yok-kry"] = {
"Kings River Yokuts",
6413014,
"yok",
"Latn",
}
m["yok-nvy"] = {
"Northern Valley Yokuts",
85789777,
"yok",
"Latn",
}
m["yok-ply"] = {
"Palewyami Yokuts",
2387391,
"yok",
"Latn",
}
m["yok-svy"] = {
"Southern Valley Yokuts",
12642473,
"yok",
"Latn",
}
m["yok-tky"] = {
"Tule-Kaweah Yokuts",
7851988,
"yok",
"Latn",
}
m["ypk-pro"] = {
"Proto-Yupik",
116773295,
"ypk",
"Latn",
type = "reconstructed",
}
m["yrk-for"] = {
"Forest Nenets",
1295107,
"yrk",
"Cyrl",
translit = "yrk-for-translit",
strip_diacritics = {remove_diacritics = c.grave .. c.acute .. c.macron .. c.breve .. c.dotabove},
}
m["yrk-tun"] = {
"Tundra Nenets",
36452,
"yrk",
"Cyrl",
strip_diacritics = {
from = {"ӑ", "а̄", "э̇", "ӣ", "ы̄", "ӯ", "ю̄", "я̆", "я̄"},
to = {"а", "а", "э", "и", "ы", "у", "ю", "я", "я"},
},
translit = "yrk-tun-translit",
}
m["zhx-min-pro"] = {
"Proto-Min",
19646347,
"zhx-min",
"Latn",
type = "reconstructed",
}
m["zhx-sht"] = {
"Shaozhou Tuhua",
1920769,
"zhx",
"Nshu, Hants",
generate_forms = "zh-generateforms",
sort_key = {Hani = "Hani-sortkey"},
}
m["zhx-sic"] = {
"Sichuanese",
2278732,
"zhx-man",
"Hants",
generate_forms = "zh-generateforms",
translit = "zh-translit",
sort_key = "Hani-sortkey",
}
m["zhx-tai"] = {
"Taishanese",
2208940,
"zhx-yue",
"Hants",
generate_forms = "zh-generateforms",
translit = "zh-translit",
sort_key = "Hani-sortkey",
}
m["zle-ono"] = {
"Old Novgorodian",
162013,
"zle",
"Cyrs, Glag",
translit = {Cyrs = "Cyrs-translit", Glag = "Glag-translit"},
-- Cyrs strip_diacritics, sort_key in [[Module:scripts/data]]
}
m["zle-ort"] = {
"Old Ruthenian",
13211,
"zle",
"Arab, Cyrs, Latn",
ancestors = "orv",
translit = {
Cyrs = "zle-ort-translit",
Arab = "zle-ort-Arab-translit",
},
strip_diacritics = {
Cyrs = {
remove_diacritics = m_langdata.chars_substitutions["Cyrs_remove_diacritics"],
remove_exceptions = {"Ї", "ї"},
},
Arab = "ar-stripdiacritics",
},
-- Cyrs sort_key in [[Module:scripts/data]]
}
m["zls-chs"] = {
"Church Slavonic",
33251,
"zls",
"Cyrs, Glag, Latn",
ancestors = "cu",
translit = {
Cyrs = "Cyrs-translit",
Glag = "Glag-translit"
},
-- Cyrs strip_diacritics, sort_key in [[Module:scripts/data]]
}
m["zlw-ocs"] = {
"Old Czech",
593096,
"zlw",
"Latn",
}
m["zlw-opl"] = {
"Old Polish",
149838,
"zlw-lch",
"Latn",
strip_diacritics = {remove_diacritics = c.ringabove},
}
m["zlw-osk"] = {
"Old Slovak",
12776676,
"zlw",
"Latn",
}
m["zlw-slv"] = {
"Slovincian",
36822,
"zlw-pom",
"Latn",
strip_diacritics = {remove_diacritics = c.macron .. c.breve},
}
return require("Module:languages").finalizeData(m, "language")
dta3mfxmgotlnmw6jci99rv4a6o9oox
Module:table/reverseIpairs
828
5989
17426
2026-07-13T08:39:35Z
Hiyuune
6766
+
17426
Scribunto
text/plain
local ipairs = ipairs
--[==[
Iterates through a table using `ipairs` in reverse.
`__ipairs` metamethods will be used, including those which return arbitrary (i.e. non-array) keys, but note that this function assumes that the first return value is a key which can be used to retrieve a value from the input table via a table lookup. As such, `__ipairs` metamethods for which this assumption is not true will not work correctly.
If the value `nil` is encountered early (e.g. because the table has been modified), the loop will terminate early.]==]
return function(t)
-- `__ipairs` metamethods can return arbitrary keys, so compile a list.
local keys, i = {}, 0
for k in ipairs(t) do
i = i + 1
keys[i] = k
end
return function()
if i == 0 then
return nil
end
local k = keys[i]
-- Retrieve `v` from the table. These aren't stored during the initial
-- ipairs loop, so that they can be modified during the loop.
local v = t[k]
-- Return if not an early nil.
if v ~= nil then
i = i - 1
return k, v
end
end
end
g7u5t487acciyypwe4jwka7ibmfy9m2
Module:writing systems/data
828
5990
17427
2026-07-13T08:39:58Z
Hiyuune
6766
+
17427
Scribunto
text/plain
local m = {}
m["abjad"] = {
"abjad",
185087,
otherNames = {"consonantary", "consonantal alphabet"},
}
m["abugida"] = {
"abugida",
335806,
otherNames = {"alphasyllabary"},
}
m["alphabet"] = {
"alphabet",
9779,
category = "alphabetic writing system",
}
m["logography"] = {
"logography",
3953107,
otherNames = {"ideography"},
category = "logographic writing system",
}
m["pictography"] = {
"pictography",
860735,
category = "pictographic writing system",
}
m["semisyllabary"] = {
"semisyllabary",
3781304,
otherNames = {"semi-syllabary"},
}
m["syllabary"] = {
"syllabary",
182133,
}
return require("Module:languages").finalizeData(m, "writing system")
kg18gfc02y6mi29hadprv64y8e0afuo
Module:table/size
828
5991
17428
2026-07-13T08:40:40Z
Hiyuune
6766
+
17428
Scribunto
text/plain
local next = next
local pairs = pairs
--[==[
This returns the size of a key/value pair table. If `raw` is set, then metamethods will be ignored, giving the true table size.
For arrays, it is faster to use `export.length`.]==]
return function(t, raw)
local i, iter, state, init = 0
if raw then
iter, state, init = next, t, nil
else
iter, state, init = pairs(t)
end
for _ in iter, state, init do
i = i + 1
end
return i
end
cngitqlralebfbp34hnb48xd0vu0xxk
Module:family tree
828
5992
17429
2026-07-13T08:41:03Z
Hiyuune
6766
+
17429
Scribunto
text/plain
--[=[
Authors: [[User:kc_kennylau]], [[User:JohnC5]], [[User:Erutuon]], [[User:Suzukaze-c]], [[User:Theknightwho]], [[User:AryamanA]]
--]=]
local export = {}
local regular_languages = require("Module:languages/code to canonical name")
local etymology_languages = require("Module:etymology languages/code to canonical name")
local families = require("Module:families/code to canonical name")
function export.find_subtree(t, code)
for _, val in ipairs(t) do
if val.name == code then -- "name" is really code
return {val}
end
local result = export.find_subtree(val, code)
if result ~= nil then
return result
end
end
end
local family_icon = "F"
local variety_icon = "V"
local proto_language_icon = family_icon
local family_with_proto_language_icon = family_icon
local function format_node(code, is_protolanguage_or_has_protolanguage, options)
local canonical_name, category_name, class, icon, tooltip, lemma_count_text
if regular_languages[code] then
canonical_name = regular_languages[code]
category_name = canonical_name:match(" [Ll]anguage$") and canonical_name or canonical_name .. " language"
class = "familytree-lang"
if is_protolanguage_or_has_protolanguage then
class = class .. ' familytree-protolang'
icon = proto_language_icon
end
-- Add lemma count if the lemma_count option is set and category name exists
if options and options.lemma_count and category_name then
page_count = mw.site.stats.pagesInCategory(
canonical_name .. " lemmas",
"pages"
)
lemma_count_text = ' (' .. page_count .. ')'
end
elseif etymology_languages[code] then
canonical_name = etymology_languages[code]
class = "familytree-etymlang"
icon = variety_icon
tooltip = "Variety"
elseif families[code] then
canonical_name = families[code]
category_name = (canonical_name:match(" [Ll]anguages$") or canonical_name:match(" [Ll]ects$")) and canonical_name or
canonical_name .. " languages"
class = "familytree-family"
if is_protolanguage_or_has_protolanguage then
class = class .. ' familytree-hasprotolang'
icon = family_with_proto_language_icon
else
icon = family_icon
end
tooltip = "Language family"
end
return '<span class="' .. class .. '" '
.. (tooltip and 'title="' .. tooltip .. '"' or '') .. '>'
.. '[[:Category:' .. (category_name or canonical_name) .. '|'
.. canonical_name
.. ' <span class="familytree-code">(' .. code .. ')</span>]]'
.. (icon and ' <span class="familytree-icon">' .. icon .. '</span>' or '')
-- Include lemma count text if available
.. (lemma_count_text or '')
.. '</span>'
end
-- If neither options.show_all_families or options.show_etymology_languages is
-- falsy, then this function does nothing.
local function filter_nested_data(nested_data, options, protolanguage_of, is_protolanguage)
if not nested_data then -- ???
return nil
else
local name = nested_data.name
local first_child = nested_data[1]
-- This indicates that new_nested_data below should only be returned
-- if it contains non-etymology languages.
local check_for_non_etymology_children = false
-- If `show_all_families` is false and this is a family and its only
-- child is its proto-language, then replace the family with the
-- proto-language.
if options.hide_families_with_protolanguages and name and families[name]
and first_child and not nested_data[2]
and protolanguage_of[name] == first_child.name then
is_protolanguage[first_child.name] = true
return filter_nested_data(first_child, options, protolanguage_of, is_protolanguage)
elseif options.hide_etymology_languages
and etymology_languages[name] then
if nested_data[1] then
check_for_non_etymology_children = true
else
return nil
end
end
local new_nested_data = { name = name }
local i = 0
for _, subtable in ipairs(nested_data) do
subtable = filter_nested_data(subtable, options, protolanguage_of, is_protolanguage)
if subtable then
i = i + 1
new_nested_data[i] = subtable
end
end
if not check_for_non_etymology_children or new_nested_data[1] then
return new_nested_data
end
end
end
local function make_node(code, is_protolanguage, protolanguage_of, options)
return '</span> ' .. format_node(code,
is_protolanguage[code] or protolanguage_of[code] ~= nil, options)
end
local function only_child_is_protolanguage(tree, options, protolanguage_of)
return (options.family_under_protolanguage
or options.protolanguage_under_family)
and tree[1] and protolanguage_of[tree.name] == tree[1].name
end
export.are_all_children_etymology_languages = require("Module:memoize")(function (nested_data)
if not nested_data[1] then
return nil
end
for _, child in ipairs(nested_data) do
if not etymology_languages[child.name]
or export.are_all_children_etymology_languages(child) == false then
return false
end
end
return true
end)
local customcollapsible_number = 0
local customcollapsible_prefix = "familytree"
local function get_customcollapsible_id()
customcollapsible_number = customcollapsible_number + 1
return customcollapsible_prefix .. customcollapsible_number
end
local no_break_space = "\194\160"
local level_separator = (no_break_space):rep(3)
local expandtext, collapsetext = "[+]─", "[-]┬"
local function make_tree(data, is_protolanguage, protolanguage_of, options, prefix)
local result = {}
local function ins(val)
table.insert(result, val)
end
-- This tag is closed in the node generated by make_node.
prefix = prefix or '<span class="familytree-linedrawing">'
local branch = "├"
local next_level = prefix .. "│" .. level_separator
local length = #data
for i, val in ipairs(data) do
if i == length then
branch = "└"
next_level = prefix .. level_separator .. no_break_space
end
local code = val.name
local language_or_family_node =
make_node(code, is_protolanguage, protolanguage_of, options)
if not val[1] then
ins('<li>' .. prefix .. branch .. options.sterile_branch_text
.. language_or_family_node .. '</li>')
else
local customcollapsible_id = get_customcollapsible_id()
ins('<li>' .. prefix .. branch
.. '<span class="familytree-toggle mw-customtoggle-'
.. customcollapsible_id .. '">───┬</span>')
-- name me!
local flag = (options.family_under_protolanguage
or options.protolanguage_under_family)
and only_child_is_protolanguage(val, options, protolanguage_of)
local top_node
if flag then
code = val[1].name
val = val[1]
top_node = make_node(code, is_protolanguage, protolanguage_of, options)
if options.protolanguage_under_family then
top_node, language_or_family_node =
language_or_family_node, top_node
end
end
local all_children_are_etymology_languages =
export.are_all_children_etymology_languages(val)
local collapsible_ul = '<ul class="mw-collapsible'
.. (all_children_are_etymology_languages
and ' familytree-only-etym-children'
or '') .. '" '
.. 'id="mw-customcollapsible-' .. customcollapsible_id
.. '" data-expandtext="' .. expandtext
.. '" data-collapsetext="' .. collapsetext .. '">'
if flag then
ins(top_node
.. collapsible_ul .. '<li>' .. prefix
.. (i == length and no_break_space or "│")
.. level_separator .. "│")
end
ins(language_or_family_node)
if not flag then
ins(collapsible_ul)
end
-- Can't get default collapsibility script to apply the data-expandtext
-- and data-collapsetext attribute values to the custom toggle,
-- so have to have a custom script do it.
ins(make_tree(val, is_protolanguage, protolanguage_of, options, next_level))
ins('</ul></li>')
end
end
return table.concat(result)
end
local function get_number_parameter_in_range(args, arg, low, high)
local val = args[arg]
if val == "" or val == nil then
val = nil
else
val = tonumber(val)
if not (type(val) == "number"
and 0 <= val and val <= 6) then
error("Expected nothing or number between " .. low .. " and "
.. high .. " in parameter |" .. arg .. "=.")
end
end
return val
end
function export.show(frame)
local args = frame.args
local descendants_of = args[1]
local to_boolean = require("Module:yesno")
-- Determines whether families that have proto-languages will be shown.
local show_all_families = to_boolean(args[2] or args.fam)
-- Determines whether all etymology languages will be shown.
local show_etymology_languages = to_boolean(args[3] or args.etym)
-- Get the value for lemma_count argument
local lemma_count = to_boolean(args.lemma_count)
-- help! parameter name too long!
local sterile_branch_length = get_number_parameter_in_range(args, "sterile_branch_length", 0, 6)
-- Determines whether (if all families are shown) a family will be shown
-- on a line directly under and at the same level as its proto-language,
-- or the proto-language on a line directly under and at the same level as
-- its family.
local family_under_protolanguage = to_boolean(args.famunderproto)
local protolanguage_under_family = to_boolean(args.protounderfam)
if family_under_protolanguage and protolanguage_under_family then
error("Kindly choose between proto-language under family and family under proto-language.")
end
return export.print_children(descendants_of, {
hide_families_with_protolanguages = not show_all_families,
hide_etymology_languages = not show_etymology_languages,
family_under_protolanguage = family_under_protolanguage,
protolanguage_under_family = protolanguage_under_family,
sterile_branch_length = sterile_branch_length,
collapsed = require("Module:yesno")(args.collapsed),
lemma_count = lemma_count
})
end
function export.print_children(descendants_of, options)
local m_languages = require("Module:languages")
local m_table = require("Module:table")
local make_auto_subtabler = require("Module:auto-subtable")
descendants_of = m_languages.getByCode(descendants_of, nil, true, true)
local names = {}
local protolanguage_of = {}
local children = make_auto_subtabler{}
local descendants = descendants_of:getDescendantCodes()
table.insert(descendants, descendants_of:getCode())
if descendants_of:hasType("family") then
protolanguage_of[descendants_of:getCode()] = descendants_of:getProtoLanguageCode()
end
local memoized = {}
local get = function(code, func, ...)
local ret = memoized[code] or func(...)
if code then
memoized[code] = ret
end
return ret
end
for _, descendant_code in ipairs(descendants) do
-- Inner "repeat until true" loop allows break to work like continue, as it will always only run once.
repeat
local descendant = get(descendant_code, m_languages.getByCode, descendant_code, nil, true, true)
names[descendant_code] = descendant:getCanonicalName():gsub("Proto%-", "")
if descendant:hasType("language") then
local ancestors = m_table.shallowCopy(descendant:getAncestorCodes())
local parent_code = descendant:getParentCode()
if parent_code and descendant:hasType("etymology-only") then
local parent = get(parent_code, descendant.getParent, descendant)
if m_table.deepEquals(parent:getAncestorCodes(), ancestors) and
descendant:getFamilyCode() == parent:getFamilyCode() then
table.insert(children[parent:getCode()], descendant_code)
break
end
end
if #ancestors > 0 then
for _, ancestor in ipairs(ancestors) do
table.insert(children[ancestor], descendant_code)
end
break
end
else
local protolang = descendant:getProtoLanguageCode()
protolanguage_of[descendant_code] = protolang
if protolang and descendant:hasAncestor(protolang) then
table.insert(children[protolang], descendant_code)
break
end
end
local family_code = descendant:getFamilyCode()
if family_code then
local family = get(family_code, descendant.getFamily, descendant)
local protolang = get(family:getProtoLanguageCode(), family.getProtoLanguage, family)
if not protolanguage_of[family] then
protolanguage_of[family] = protolang and protolang:getCode()
end
if protolang and protolang:inFamily(family) and protolang:getCode() ~= descendant_code then
table.insert(children[protolang:getCode()], descendant_code)
else
table.insert(children[family:getCode()], descendant_code)
end
end
until true
end
-- No more auto subtabling needed.
children = children:un_auto_subtable()
-- Copy to new table, to filter out unwanted ancestors from descendants with multiple ancestors, where some are not descendants of the target language.
local parent_to_children_map = {}
for _, code in ipairs(descendants) do
parent_to_children_map[code] = children[code]
end
local function make_nested(data, children)
local make_nil = {}
for key, val in pairs(data) do
if type(key) == "number" then
if children[val] then
data[val] = make_nested(children[val], children)
table.insert(make_nil, key)
end
else
data[key] = make_nested(val, children)
end
end
if make_nil[2] then -- Make sure larger keys are removed first.
table.sort(make_nil, function (a, b) return a > b end)
end
for _, key in ipairs(make_nil) do
table.remove(data, key)
end
return data
end
local nested = make_nested(parent_to_children_map, parent_to_children_map)
local function deep_sort(current)
local result = {}
local is_table = {}
for key, val in pairs(current) do
if type(key) == "number" then
table.insert(result, val)
else
is_table[key] = true
table.insert(result, key)
end
end
table.sort(result, function(code1, code2)
return names[code1] < names[code2]
end)
for i = 1, #result do
if is_table[result[i]] then
local name = result[i]
result[i] = deep_sort(current[result[i]])
result[i].name = name
else
result[i] = { name = result[i] }
end
end
return result
end
nested = deep_sort(nested)
data = { nested = nested, protolanguage_of = protolanguage_of }
local nested_data, protolanguage_of = data.nested, data.protolanguage_of
nested_data = export.find_subtree(nested_data, descendants_of:getCode())
-- Return nil instead of a tree with only the root node.
if options.must_have_descendants and (nested_data == nil or #nested_data == 0 or nested_data[1] and #nested_data[1] == 0) then
return nil
end
local is_protolanguage = {}
if options.hide_families_with_protolanguages or options.hide_etymology_languages then
nested_data = filter_nested_data(nested_data, {
hide_families_with_protolanguages = options.hide_families_with_protolanguages,
hide_etymology_languages = options.hide_etymology_languages,
}, protolanguage_of, is_protolanguage)
end
if not nested_data or not next(nested_data) then
return nil
end
local result = {'<div class="familytree"><ul>'}
local function ins(val)
table.insert(result, val)
end
local tree_options = {
sterile_branch_text = '<span class="familytree-branch">'
.. ("─"):rep(options.sterile_branch_length or 4)
.. '</span>',
family_under_protolanguage = options.family_under_protolanguage,
protolanguage_under_family = options.protolanguage_under_family,
lemma_count = options.lemma_count,
}
local collapsetext, expandtext = 'Collapse', 'Expand'
for i, subtable in ipairs(nested_data) do
-- top language name
ins('<li>')
-- name me!
local flag = (options.family_under_protolanguage
or options.protolanguage_under_family)
and only_child_is_protolanguage(subtable, options, protolanguage_of)
local top_node = format_node(subtable.name)
local next_node
if flag then
subtable = subtable[1]
next_node = format_node(subtable.name)
if options.family_under_protolanguage then
top_node, next_node = next_node, top_node
end
end
ins(top_node)
-- top toggle
local customcollapsible_id = get_customcollapsible_id()
ins('<span class="familytree-toptoggle mw-customtoggle-'
.. customcollapsible_id .. '" style="display: none;">')
ins(options.collapsed and expandtext or collapsetext)
ins('</span>')
if flag then
ins('<li>')
ins(next_node)
end
-- tree
ins('<ul class="mw-collapsible')
if options.collapsed then
ins(' mw-collapsed')
end
ins('" id="mw-customcollapsible-' .. customcollapsible_id)
ins('" data-expandtext="' .. expandtext)
ins('" data-collapsetext="' .. collapsetext .. '">')
ins(make_tree(subtable, is_protolanguage, protolanguage_of, tree_options))
if flag then
ins('</li>')
end
ins('</ul></li>')
end
ins('</ul></div>')
ins(require("Module:TemplateStyles")("Module:family tree/style.css"))
return table.concat(result)
end
return export
mnzwouf6sh0nymoc4nm2adgw0g71cs1
Module:languages/code to canonical name
828
5993
17430
2026-07-13T08:41:27Z
Hiyuune
6766
+
17430
Scribunto
text/plain
return {
["aa"] = "Afar",
["aaa"] = "Ghotuo",
["aab"] = "Alumu-Tesu",
["aac"] = "Ari",
["aad"] = "Amal",
["aaf"] = "Aranadan",
["aag"] = "Ambrak",
["aah"] = "Abu'",
["aai"] = "Arifama-Miniafia",
["aak"] = "Ankave",
["aal"] = "Afade",
["aan"] = "Anambé",
["aap"] = "Arára (Pará)",
["aaq"] = "Penobscot",
["aas"] = "Aasax",
["aau"] = "Abau",
["aav-khs-pro"] = "Proto-Khasian",
["aav-nic-pro"] = "Proto-Nicobarese",
["aav-pkl-pro"] = "Proto-Pnar-Khasi-Lyngngam",
["aav-pro"] = "Proto-Austroasiatic",
["aaw"] = "Solong",
["aax"] = "Upper Mandobo",
["aaz"] = "Amarasi",
["ab"] = "Abkhaz",
["aba"] = "Abé",
["abb"] = "Bankon",
["abc"] = "Ambala Ayta",
["abd"] = "Camarines Norte Agta",
["abe"] = "Abenaki",
["abf"] = "Abai Sungai",
["abg"] = "Abaga",
["abh"] = "Tajiki Arabic",
["abi"] = "Abidji",
["abj"] = "Aka-Bea",
["abl"] = "Abung",
["abm"] = "Abanyom",
["abn"] = "Abua",
["abo"] = "Abon",
["abp"] = "Abenlen Ayta",
["abq"] = "Abaza",
["abs"] = "Ambonese Malay",
["abt"] = "Ambulas",
["abu"] = "Abure",
["abv"] = "Baharna Arabic",
["abw"] = "Pal",
["abx"] = "Inabaknon",
["aby"] = "Aneme Wake",
["abz"] = "Abui",
["aca"] = "Achagua",
["acb"] = "Áncá",
["acd"] = "Gikyode",
["ace"] = "Acehnese",
["ach"] = "Acholi",
["aci"] = "Aka-Cari",
["ack"] = "Aka-Kora",
["acl"] = "Akar-Bale",
["acm"] = "Iraqi Arabic",
["acn"] = "Achang",
["acp"] = "Eastern Acipa",
["acr"] = "Achi",
["acs"] = "Acroá",
["acu"] = "Achuar",
["acv"] = "Achumawi",
["acw"] = "Hijazi Arabic",
["acx"] = "Omani Arabic",
["acy"] = "Cypriot Arabic",
["acz"] = "Acheron",
["ada"] = "Adangme",
["adb"] = "Atauran",
["add"] = "Dzodinka",
["ade"] = "Adele",
["adf"] = "Dhofari Arabic",
["adg"] = "Andegerebinha",
["adh"] = "Adhola",
["adi"] = "Adi",
["adj"] = "Adioukrou",
["adl"] = "Galo",
["adn"] = "Adang",
["ado"] = "Abu",
["adp"] = "Adap",
["adq"] = "Adangbe",
["adr"] = "Adonara",
["ads"] = "Adamorobe Sign Language",
["adt"] = "Adnyamathanha",
["adu"] = "Aduge",
["adw"] = "Amondawa",
["ady"] = "West Circassian",
["adz"] = "Adzera",
["ae"] = "Avestan",
["aea"] = "Areba",
["aeb"] = "Tunisian Arabic",
["aed"] = "Argentine Sign Language",
["aee"] = "Northeast Pashayi",
["aek"] = "Haeke",
["ael"] = "Ambele",
["aem"] = "Arem",
["aen"] = "Armenian Sign Language",
["aeq"] = "Aer",
["aer"] = "Eastern Arrernte",
["aes"] = "Alsea",
["aeu"] = "Akeu",
["aew"] = "Ambakich",
["aey"] = "Amele",
["aez"] = "Aeka",
["af"] = "Afrikaans",
["afa-pro"] = "Proto-Afroasiatic",
["afb"] = "Gulf Arabic",
["afd"] = "Andai",
["afe"] = "Putukwam",
["afg"] = "Afghan Sign Language",
["afh"] = "Afrihili",
["afi"] = "Akrukay",
["afk"] = "Nanubae",
["afn"] = "Defaka",
["afo"] = "Eloyi",
["afp"] = "Tapei",
["afs"] = "Afro-Seminole Creole",
["aft"] = "Afitti",
["afu"] = "Awutu",
["afz"] = "Obokuitai",
["aga"] = "Aguano",
["agb"] = "Legbo",
["agc"] = "Agatu",
["agd"] = "Agarabi",
["age"] = "Angal",
["agf"] = "Arguni",
["agg"] = "Angor",
["agh"] = "Ngelima",
["agi"] = "Agariya",
["agj"] = "Argobba",
["agk"] = "Isarog Agta",
["agl"] = "Fembe",
["agm"] = "Angaataha",
["agn"] = "Agutaynen",
["ago"] = "Tainae",
["agq"] = "Aghem",
["agr"] = "Aguaruna",
["ags"] = "Esimbi",
["agt"] = "Central Cagayan Agta",
["agu"] = "Aguacateca",
["agv"] = "Remontado Agta",
["agw"] = "Kahua",
["agx"] = "Aghul",
["agy"] = "Southern Alta",
["agz"] = "Mount Iriga Agta",
["aha"] = "Ahanta",
["ahb"] = "Axamb",
["ahg"] = "Qimant",
["ahh"] = "Aghu",
["ahi"] = "Tiagba",
["ahk"] = "Akha",
["ahl"] = "Igo",
["ahm"] = "Mobu",
["ahn"] = "Àhàn",
["aho"] = "Ahom",
["ahp"] = "Apro",
["ahr"] = "Ahirani",
["ahs"] = "Ashe",
["aht"] = "Ahtna",
["aia"] = "Arosi",
["aib"] = "Äynu",
["aic"] = "Ainbai",
["aid"] = "Alngith",
["aie"] = "Amara",
["aif"] = "Agi",
["aig"] = "Antigua and Barbuda Creole English",
["aih"] = "Ai-Cham",
["aii"] = "Assyrian Neo-Aramaic",
["aij"] = "Lishanid Noshan",
["aik"] = "Ake",
["ail"] = "Aimele",
["aim"] = "Aimol",
["ain"] = "Ainu",
["aio"] = "Aiton",
["aip"] = "Burumakok",
["air"] = "Airoran",
["ait"] = "Arikem",
["aiw"] = "Aari",
["aix"] = "Aighon",
["aiy"] = "Ali",
["aja"] = "Aja (East Africa)",
["ajg"] = "Aja (West Africa)",
["aji"] = "Ajië",
["ajn"] = "Andajin",
["ajp"] = "South Levantine Arabic",
["ajw"] = "Ajawa",
["ajz"] = "Amri Karbi",
["ak"] = "Akan",
["akb"] = "Angkola Batak",
["akc"] = "Mpur",
["akd"] = "Ukpet-Ehom",
["ake"] = "Akawaio",
["akf"] = "Akpa",
["akg"] = "Anakalangu",
["akh"] = "Angal Heneng",
["aki"] = "Aiome",
["akj"] = "Jeru",
["akk"] = "Akkadian",
["akl"] = "Aklanon",
["akm"] = "Aka-Bo",
["ako"] = "Akurio",
["akp"] = "Siwu",
["akq"] = "Ak",
["akr"] = "Araki",
["aks"] = "Akaselem",
["akt"] = "Akolet",
["aku"] = "Akum",
["akv"] = "Akhvakh",
["akw"] = "Akwa",
["akx"] = "Aka-Kede",
["aky"] = "Aka-Kol",
["akz"] = "Alabama",
["ala"] = "Alago",
["alc"] = "Kawésqar",
["ald"] = "Alladian",
["ale"] = "Aleut",
["alf"] = "Alege",
["alg-aga"] = "Agawam",
["alg-pro"] = "Proto-Algonquian",
["alh"] = "Alawa",
["ali"] = "Amaimon",
["alj"] = "Alangan",
["alk"] = "Alak",
["all"] = "Allar",
["alm"] = "Amblong",
["alo"] = "Larike-Wakasihu",
["alp"] = "Alune",
["alq"] = "Algonquin",
["alr"] = "Alutor",
["alt"] = "Southern Altai",
["alu"] = "'Are'are",
["alv-ama"] = "Amasi",
["alv-bgu"] = "Bainouk Gubeeher",
["alv-bua-pro"] = "Proto-Bua",
["alv-cng-pro"] = "Proto-Cangin",
["alv-edk-pro"] = "Proto-Edekiri",
["alv-edo-pro"] = "Proto-Edoid",
["alv-fli-pro"] = "Proto-Fali",
["alv-gbe-pro"] = "Proto-Gbe",
["alv-gng-pro"] = "Proto-Guang",
["alv-gtm-pro"] = "Proto-Central Togo",
["alv-gwa"] = "Gwara",
["alv-hei-pro"] = "Proto-Heiban",
["alv-ido-pro"] = "Proto-Idomoid",
["alv-igb-pro"] = "Proto-Igboid",
["alv-kwa-pro"] = "Proto-Kwa",
["alv-mum-pro"] = "Proto-Mumuye",
["alv-nup-pro"] = "Proto-Nupoid",
["alv-pro"] = "Proto-Atlantic-Congo",
["alv-von-pro"] = "Proto-Volta-Niger",
["alv-yor-pro"] = "Proto-Yoruba",
["alv-yrd-pro"] = "Proto-Yoruboid",
["alw"] = "Alaba",
["alx"] = "Amol",
["aly"] = "Alyawarr",
["alz"] = "Alur",
["am"] = "Amharic",
["ama"] = "Amanayé",
["amb"] = "Ambo",
["amc"] = "Amahuaca",
["ame"] = "Yanesha'",
["amf"] = "Hamer-Banna",
["amg"] = "Amurdag",
["ami"] = "Amis",
["amj"] = "Amdang",
["amk"] = "Ambai",
["aml"] = "War-Jaintia",
["amm"] = "Ama",
["amn"] = "Amanab",
["amo"] = "Amo",
["amp"] = "Alamblak",
["amq"] = "Amahai",
["amr"] = "Amarakaeri",
["ams"] = "Southern Amami Ōshima",
["amt"] = "Amto",
["amu"] = "Guerrero Amuzgo",
["amv"] = "Ambelau",
["amw"] = "Western Neo-Aramaic",
["amx"] = "Anmatyerre",
["amy"] = "Ami",
["amz"] = "Atampaya",
["an"] = "Aragonese",
["ana"] = "Andaqui",
["anb"] = "Andoa",
["anc"] = "Ngas",
["and"] = "Ansus",
["ane"] = "Xârâcùù",
["anf"] = "Animere",
["ang"] = "Old English",
["anh"] = "Nend",
["ani"] = "Andi",
["anj"] = "Anor",
["ank"] = "Goemai",
["anl"] = "Anu",
["anm"] = "Anāl",
["ann"] = "Obolo",
["ano"] = "Andoque",
["anp"] = "Angika",
["anq"] = "Jarawa",
["anr"] = "Andh",
["ans"] = "Anserma",
["ant"] = "Antakarinya",
["anu"] = "Anuak",
["anv"] = "Denya",
["anw"] = "Anaang",
["anx"] = "Andra-Hus",
["any"] = "Anyi",
["anz"] = "Anem",
["aoa"] = "Angolar",
["aob"] = "Abom",
["aoc"] = "Pemon",
["aod"] = "Andarum",
["aoe"] = "Angal Enen",
["aof"] = "Bragat",
["aog"] = "Angoram",
["aoi"] = "Anindilyakwa",
["aoj"] = "Mufian",
["aok"] = "Arhö",
["aol"] = "Alorese",
["aom"] = "Ömie",
["aon"] = "Bumbita Arapesh",
["aor"] = "Aore",
["aos"] = "Taikat",
["aot"] = "Atong (India)",
["aou"] = "A'ou",
["aox"] = "Atorada",
["aoz"] = "Uab Meto",
["apa-pro"] = "Proto-Apachean",
["apb"] = "Sa'a",
["apc"] = "North Levantine Arabic",
["apd"] = "Sudanese Arabic",
["ape"] = "Bukiyip",
["apf"] = "Pahanan Agta",
["apg"] = "Ampanang",
["aph"] = "Athpare",
["api"] = "Apiaká",
["apj"] = "Jicarilla",
["apk"] = "Plains Apache",
["apl"] = "Lipan",
["apm"] = "Chiricahua",
["apn"] = "Apinayé",
["apo"] = "Ambul",
["app"] = "Apma",
["apq"] = "A-Pucikwar",
["apr"] = "Arop-Lokep",
["aps"] = "Arop-Sissano",
["apt"] = "Apatani",
["apu"] = "Apurinã",
["apv"] = "Alapmunte",
["apw"] = "Western Apache",
["apx"] = "Aputai",
["apy"] = "Apalaí",
["apz"] = "Safeyoka",
["aqc"] = "Archi",
["aqd"] = "Ampari Dogon",
["aqg"] = "Arigidi",
["aql-pro"] = "Proto-Algic",
["aqm"] = "Atohwaim",
["aqn"] = "Northern Alta",
["aqp"] = "Atakapa",
["aqr"] = "Arhâ",
["aqt"] = "Angaité",
["aqz"] = "Akuntsu",
["ar"] = "Arabic",
["arc"] = "Aramaic",
["ard"] = "Arabana",
["are"] = "Western Arrernte",
["arh"] = "Arhuaco",
["ari"] = "Arikara",
["arj"] = "Arapaso",
["ark"] = "Arikapú",
["arl"] = "Arabela",
["arn"] = "Mapudungun",
["aro"] = "Araona",
["arp"] = "Arapaho",
["arq"] = "Algerian Arabic",
["arr"] = "Arara-Karo",
["ars"] = "Najdi Arabic",
["art-adu"] = "Adûni",
["art-bel"] = "Belter Creole",
["art-blk"] = "Bolak",
["art-bsp"] = "Black Speech",
["art-com"] = "Communicationssprache",
["art-dtk"] = "Dothraki",
["art-elo"] = "Eloi",
["art-gld"] = "Goa'uld",
["art-lap"] = "Lapine",
["art-man"] = "Mandalorian",
["art-mun"] = "Mundolinco",
["art-nav"] = "Naʼvi",
["art-vlh"] = "High Valyrian",
["aru"] = "Arua",
["arv"] = "Arbore",
["arw"] = "Lokono",
["arx"] = "Aruá",
["ary"] = "Moroccan Arabic",
["arz"] = "Egyptian Arabic",
["as"] = "Assamese",
["asa"] = "Pare",
["asb"] = "Assiniboine",
["asc"] = "Casuarina Coast Asmat",
["ase"] = "American Sign Language",
["asf"] = "Auslan",
["asg"] = "Cishingini",
["ash"] = "Abishira",
["asi"] = "Buruwai",
["asj"] = "Nsari",
["ask"] = "Ashkun",
["asl"] = "Asilulu",
["asn"] = "Xingú Asuriní",
["aso"] = "Dano",
["asp"] = "Algerian Sign Language",
["asq"] = "Austrian Sign Language",
["asr"] = "Asuri",
["ass"] = "Ipulo",
["ast"] = "Asturian",
["asu"] = "Tocantins Asurini",
["asv"] = "Asoa",
["asw"] = "Australian Aboriginal Sign Language",
["asx"] = "Muratayak",
["asy"] = "Yaosakor Asmat",
["asz"] = "As",
["ata"] = "Pele-Ata",
["atb"] = "Zaiwa",
["atc"] = "Atsahuaca",
["atd"] = "Ata Manobo",
["ate"] = "Atemble",
["atg"] = "Okpela",
["ath-nic"] = "Nicola",
["ath-pro"] = "Proto-Athabaskan",
["ati"] = "Attié",
["atj"] = "Atikamekw",
["atk"] = "Ati",
["atl"] = "Mount Iraya Agta",
["atm"] = "Ata",
["ato"] = "Atong (Cameroon)",
["atp"] = "Pudtol Atta",
["atq"] = "Aralle-Tabulahan",
["atr"] = "Waimiri-Atroari",
["ats"] = "Gros Ventre",
["att"] = "Pamplona Atta",
["atu"] = "Reel",
["atv"] = "Northern Altai",
["atw"] = "Atsugewi",
["atx"] = "Arutani",
["aty"] = "Aneityum",
["atz"] = "Arta",
["aua"] = "Asumboa",
["aub"] = "Alugu",
["auc"] = "Huaorani",
["aud"] = "Anuta",
["auf-pro"] = "Proto-Arawa",
["aug"] = "Aguna",
["auh"] = "Aushi",
["aui"] = "Anuki",
["auj"] = "Awjila",
["auk"] = "Heyo",
["aul"] = "Aulua",
["aum"] = "Asu",
["aun"] = "Molmo One",
["auo"] = "Auyokawa",
["aup"] = "Makayam",
["auq"] = "Anus",
["aur"] = "Aruek",
["aus-alu"] = "Alungul",
["aus-and"] = "Andjingith",
["aus-ang"] = "Angkula",
["aus-arn-pro"] = "Proto-Arnhem",
["aus-bra"] = "Barranbinya",
["aus-brm"] = "Barunggam",
["aus-cww-pro"] = "Proto-Central New South Wales",
["aus-dal-pro"] = "Proto-Daly",
["aus-guw"] = "Guwar",
["aus-lsw"] = "Little Swanport",
["aus-mbi"] = "Mbiywom",
["aus-ngk"] = "Ngkoth",
["aus-nyu-pro"] = "Proto-Nyulnyulan",
["aus-pam-pro"] = "Proto-Pama-Nyungan",
["aus-tul"] = "Tulua",
["aus-uwi"] = "Uwinymil",
["aus-wdj-pro"] = "Proto-Iwaidjan",
["aus-won"] = "Wong-gie",
["aus-wul"] = "Wulguru",
["aus-ynk"] = "Yangkaal",
["aut"] = "Austral",
["auu"] = "Auye",
["auw"] = "Awyi",
["aux"] = "Aurá",
["auy"] = "Auyana",
["auz"] = "Uzbeki Arabic",
["av"] = "Avar",
["avb"] = "Avau",
["avd"] = "Alviri-Vidari",
["avi"] = "Avikam",
["avk"] = "Kotava",
["avm"] = "Angkamuthi",
["avn"] = "Avatime",
["avo"] = "Agavotaguerra",
["avs"] = "Aushiri",
["avt"] = "Au",
["avu"] = "Avokaya",
["avv"] = "Avá-Canoeiro",
["awa"] = "Awadhi",
["awb"] = "Awa (New Guinea)",
["awc"] = "Cicipu",
["awd-ama"] = "Amarizana",
["awd-amc-pro"] = "Proto-Amuesha-Chamicuro",
["awd-ana"] = "Anauyá",
["awd-apo"] = "Apolista",
["awd-cab"] = "Cabre",
["awd-gnu"] = "Guinau",
["awd-kar"] = "Cariay",
["awd-kaw"] = "Kawishana",
["awd-kmp-pro"] = "Proto-Kampa",
["awd-kus"] = "Kustenau",
["awd-man"] = "Manao",
["awd-mar"] = "Marawan",
["awd-mpr"] = "Maipure",
["awd-mrt"] = "Mariaté",
["awd-nwk-pro"] = "Proto-Nawiki",
["awd-pai"] = "Paikoneka",
["awd-pas"] = "Pasé",
["awd-pro"] = "Proto-Arawak",
["awd-prw-pro"] = "Proto-Paresi-Waura",
["awd-she"] = "Shebayo",
["awd-taa-pro"] = "Proto-Ta-Arawak",
["awd-wai"] = "Wainumá",
["awd-yum"] = "Yumana",
["awe"] = "Awetí",
["awg"] = "Anguthimri",
["awh"] = "Awbono",
["awi"] = "Aekyom",
["awk"] = "Awabakal",
["awm"] = "Arawum",
["awn"] = "Awngi",
["awo"] = "Awak",
["awr"] = "Awera",
["aws"] = "South Awyu",
["awt"] = "Araweté",
["awu"] = "Central Awyu",
["awv"] = "Jair Awyu",
["aww"] = "Awun",
["awx"] = "Awara",
["awy"] = "Edera Awyu",
["axb"] = "Abipón",
["axe"] = "Ayerrerenge",
["axg"] = "Arára (Mato Grosso)",
["axk"] = "Aka (Central Africa)",
["axl"] = "Lower Southern Aranda",
["axm"] = "Middle Armenian",
["axx"] = "Xârâgurè",
["ay"] = "Aymara",
["aya"] = "Awar",
["ayb"] = "Ayizo",
["ayd"] = "Ayabadhu",
["aye"] = "Ayere",
["ayg"] = "Nyanga (Togo)",
["ayi"] = "Leyigha",
["ayk"] = "Akuku",
["ayl"] = "Libyan Arabic",
["ayn"] = "Yemeni Arabic",
["ayo"] = "Ayoreo",
["ayp"] = "North Mesopotamian Arabic",
["ayq"] = "Ayi",
["ays"] = "Sorsogon Ayta",
["ayt"] = "Bataan Ayta",
["ayu"] = "Ayu",
["ayz"] = "Maybrat",
["az"] = "Azerbaijani",
["aza"] = "Azha",
["azc-caz"] = "Cazcan",
["azc-cup-pro"] = "Proto-Cupan",
["azc-ktn"] = "Kitanemuk",
["azc-nah-pro"] = "Proto-Nahuan",
["azc-num-pro"] = "Proto-Numic",
["azc-pro"] = "Proto-Uto-Aztecan",
["azc-tak-pro"] = "Proto-Takic",
["azc-tat"] = "Tataviam",
["azd"] = "Eastern Durango Nahuatl",
["azg"] = "San Pedro Amuzgos Amuzgo",
["azm"] = "Ipalapa Amuzgo",
["azn"] = "Western Durango Nahuatl",
["azo"] = "Awing",
["azt"] = "Faire Atta",
["azz"] = "Highland Puebla Nahuatl",
["ba"] = "Bashkir",
["baa"] = "Babatana",
["bab"] = "Bainouk-Gunyuño",
["bac"] = "Baduy",
["bae"] = "Baré",
["baf"] = "Nubaca",
["bag"] = "Tuki",
["bah"] = "Bahamian Creole",
["baj"] = "Barakai",
["bal"] = "Baluchi",
["ban"] = "Balinese",
["bao"] = "Waimaha",
["bap"] = "Bantawa",
["bar"] = "Bavarian",
["bas"] = "Basaa",
["bau"] = "Badanchi",
["bav"] = "Babungo",
["baw"] = "Bambili-Bambui",
["bax"] = "Bamum",
["bay"] = "Batuley",
["bba"] = "Baatonum",
["bbb"] = "Barai",
["bbc"] = "Toba Batak",
["bbd"] = "Bau",
["bbe"] = "Bangba",
["bbf"] = "Baibai",
["bbg"] = "Barama",
["bbh"] = "Bugan",
["bbi"] = "Barombi",
["bbj"] = "Ghomala'",
["bbk"] = "Babanki",
["bbl"] = "Bats",
["bbm"] = "Babango",
["bbn"] = "Uneapa",
["bbo"] = "Konabéré",
["bbp"] = "West Central Banda",
["bbq"] = "Bamali",
["bbr"] = "Girawa",
["bbs"] = "Bakpinka",
["bbt"] = "Mburku",
["bbu"] = "Bakulung",
["bbv"] = "Karnai",
["bbw"] = "Baba",
["bbx"] = "Bubia",
["bby"] = "Befang",
["bca"] = "Central Bai",
["bcb"] = "Bainouk-Samik",
["bcd"] = "North Babar",
["bce"] = "Bamenyam",
["bcf"] = "Bamu",
["bcg"] = "Baga Pokur",
["bch"] = "Bariai",
["bci"] = "Baoule",
["bcj"] = "Bardi",
["bck"] = "Bunaba",
["bcl"] = "Central Bikol",
["bcm"] = "Banoni",
["bcn"] = "Bibaali",
["bco"] = "Kaluli",
["bcp"] = "Bali",
["bcq"] = "Bench",
["bcr"] = "Babine-Witsuwit'en",
["bcs"] = "Kohumono",
["bct"] = "Bendi",
["bcu"] = "Biliau",
["bcv"] = "Shoo-Minda-Nye",
["bcw"] = "Bana",
["bcy"] = "Bacama",
["bcz"] = "Bainouk-Gunyaamolo",
["bda"] = "Bayot",
["bdb"] = "Basap",
["bdc"] = "Emberá-Baudó",
["bdd"] = "Bunama",
["bde"] = "Bade",
["bdf"] = "Biage",
["bdg"] = "Bonggi",
["bdh"] = "Tara Baka",
["bdi"] = "Burun",
["bdj"] = "Bai (South Sudan)",
["bdk"] = "Budukh",
["bdl"] = "Indonesian Bajau",
["bdm"] = "Buduma",
["bdn"] = "Baldemu",
["bdo"] = "Morom",
["bdp"] = "Bende",
["bdq"] = "Bahnar",
["bdr"] = "West Coast Bajau",
["bds"] = "Burunge",
["bdt"] = "Bokoto",
["bdu"] = "Oroko",
["bdv"] = "Bodo Parja",
["bdw"] = "Baham",
["bdx"] = "Budong-Budong",
["bdy"] = "Bandjalang",
["bdz"] = "Badeshi",
["be"] = "Belarusian",
["bea"] = "Beaver",
["beb"] = "Bebele",
["bec"] = "Iceve-Maci",
["bed"] = "Bedoanas",
["bee"] = "Byangsi",
["bef"] = "Benabena",
["beg"] = "Belait",
["beh"] = "Biali",
["bei"] = "Bekati'",
["bej"] = "Beja",
["bek"] = "Bebeli",
["bem"] = "Bemba",
["beo"] = "Beami",
["bep"] = "Besoa",
["beq"] = "Beembe",
["ber-fog"] = "Fogaha",
["ber-pro"] = "Proto-Berber",
["ber-zuw"] = "Zuwara",
["bes"] = "Besme",
["bet"] = "Guiberoua Bété",
["beu"] = "Blagar",
["bev"] = "Daloa Bété",
["bew"] = "Betawi",
["bex"] = "Jur Modo",
["bey"] = "Beli (New Guinea)",
["bez"] = "Kibena",
["bfa"] = "Bari",
["bfb"] = "Pauri Bareli",
["bfc"] = "Panyi Bai",
["bfd"] = "Bafut",
["bfe"] = "Betaf",
["bff"] = "Bofi",
["bfg"] = "Busang Kayan",
["bfh"] = "Blafe",
["bfi"] = "British Sign Language",
["bfj"] = "Bafanji",
["bfk"] = "Ban Khor Sign Language",
["bfl"] = "Banda-Ndélé",
["bfm"] = "Mmen",
["bfn"] = "Bunak",
["bfo"] = "Malba Birifor",
["bfp"] = "Beba",
["bfq"] = "Badaga",
["bfr"] = "Bazigar",
["bfs"] = "Southern Bai",
["bft"] = "Balti",
["bfu"] = "Gahri",
["bfw"] = "Bondo",
["bfx"] = "Bantayanon",
["bfy"] = "Bagheli",
["bfz"] = "Mahasu Pahari",
["bg"] = "Bulgarian",
["bga"] = "Gwamhi-Wuri",
["bgb"] = "Bobongko",
["bgc"] = "Haryanvi",
["bgd"] = "Rathwi Bareli",
["bge"] = "Bauria",
["bgf"] = "Bangandu",
["bgg"] = "Bugun",
["bgi"] = "Giangan",
["bgj"] = "Bangolan",
["bgk"] = "Bit",
["bgl"] = "Bo",
["bgo"] = "Baga Koga",
["bgq"] = "Bagri",
["bgr"] = "Bawm Chin",
["bgs"] = "Tagabawa",
["bgt"] = "Bughotu",
["bgu"] = "Mbongno",
["bgv"] = "Warkay-Bipim",
["bgw"] = "Bhatri",
["bgx"] = "Balkan Gagauz Turkish",
["bgy"] = "Benggoi",
["bgz"] = "Banggai",
["bh"] = "Bihari",
["bha"] = "Bharia",
["bhb"] = "Bhili",
["bhc"] = "Biga",
["bhd"] = "Bhadrawahi",
["bhe"] = "Bhaya",
["bhf"] = "Odiai",
["bhg"] = "Binandere",
["bhh"] = "Bukhari",
["bhi"] = "Bhilali",
["bhj"] = "Bahing",
["bhl"] = "Bimin",
["bhm"] = "Bathari",
["bhn"] = "Bohtan Neo-Aramaic",
["bho"] = "Bhojpuri",
["bhp"] = "Bima",
["bhq"] = "South Tukang Besi",
["bhs"] = "Buwal",
["bht"] = "Bhattiyali",
["bhu"] = "Bhunjia",
["bhv"] = "Bahau",
["bhw"] = "Biak",
["bhx"] = "Bhalay",
["bhy"] = "Bhele",
["bhz"] = "Bada",
["bi"] = "Bislama",
["bia"] = "Badimaya",
["bib"] = "Bissa",
["bid"] = "Bidiyo",
["bie"] = "Bepour",
["bif"] = "Biafada",
["big"] = "Biangai",
["bij"] = "Kwanka",
["bil"] = "Bile",
["bim"] = "Bimoba",
["bin"] = "Edo",
["bio"] = "Nai",
["bip"] = "Bila",
["biq"] = "Bipi",
["bir"] = "Bisorio",
["bit"] = "Berinomo",
["biu"] = "Biete",
["biv"] = "Southern Birifor",
["biw"] = "Kol (Cameroon)",
["bix"] = "Bijori",
["biy"] = "Birhor",
["biz"] = "Baloi",
["bja"] = "Budza",
["bjb"] = "Barngarla",
["bjc"] = "Bariji",
["bje"] = "Biao-Jiao Mien",
["bjf"] = "Barzani Jewish Neo-Aramaic",
["bjg"] = "Bidyogo",
["bjh"] = "Bahinemo",
["bji"] = "Burji",
["bjj"] = "Kannauji",
["bjk"] = "Barok",
["bjl"] = "Bulu (New Guinea)",
["bjm"] = "Bajelani",
["bjn"] = "Banjarese",
["bjo"] = "Mid-Southern Banda",
["bjp"] = "Fanamaket",
["bjr"] = "Binumarien",
["bjs"] = "Bajan",
["bjt"] = "Balanta-Ganja",
["bju"] = "Busuu",
["bjv"] = "Bedjond",
["bjw"] = "Bakwé",
["bjx"] = "Banao Itneg",
["bjy"] = "Bayali",
["bjz"] = "Baruga",
["bka"] = "Kyak",
["bkc"] = "Baka",
["bkd"] = "Binukid",
["bkf"] = "Beeke",
["bkg"] = "Buraka",
["bkh"] = "Bakoko",
["bki"] = "Baki",
["bkj"] = "Pande",
["bkk"] = "Brokskat",
["bkl"] = "Berik",
["bkm"] = "Kom (Cameroon)",
["bkn"] = "Bukitan",
["bko"] = "Kwa'",
["bkp"] = "Iboko",
["bkq"] = "Bakairí",
["bkr"] = "Bakumpai",
["bks"] = "Masbate Sorsogon",
["bkt"] = "Boloki",
["bku"] = "Buhid",
["bkv"] = "Bekwarra",
["bkw"] = "Bekwel",
["bkx"] = "Baikeno",
["bky"] = "Bokyi",
["bkz"] = "Bungku",
["bla"] = "Blackfoot",
["blb"] = "Bilua",
["blc"] = "Bella Coola",
["bld"] = "Bolango",
["ble"] = "Balanta-Kentohe",
["blf"] = "Buol",
["blg"] = "Balau",
["blh"] = "Kuwaa",
["bli"] = "Bolia",
["blj"] = "Bulungan",
["blk"] = "Pa'o Karen",
["bll"] = "Biloxi",
["blm"] = "Beli (South Sudan)",
["bln"] = "Southern Catanduanes Bikol",
["blo"] = "Anii",
["blp"] = "Blablanga",
["blq"] = "Baluan-Pam",
["blr"] = "Blang",
["bls"] = "Balaesang",
["blt"] = "Tai Dam",
["blv"] = "Kibala",
["blw"] = "Balangao",
["blx"] = "Mag-Indi Ayta",
["bly"] = "Notre",
["blz"] = "Balantak",
["bm"] = "Bambara",
["bma"] = "Lame",
["bmb"] = "Bembe",
["bmc"] = "Biem",
["bmd"] = "Baga Manduri",
["bme"] = "Limassa",
["bmf"] = "Bom",
["bmg"] = "Bamwe",
["bmh"] = "Kein",
["bmi"] = "Bagirmi",
["bmj"] = "Bote-Majhi",
["bmk"] = "Ghayavi",
["bml"] = "Bomboli",
["bmn"] = "Bina",
["bmo"] = "Bambalang",
["bmp"] = "Bulgebi",
["bmq"] = "Bomu",
["bmr"] = "Muinane",
["bmt"] = "Biao Mon",
["bmu"] = "Somba-Siawari",
["bmv"] = "Bum",
["bmw"] = "Bomwali",
["bmx"] = "Baimak",
["bmz"] = "Baramu",
["bn"] = "Bengali",
["bna"] = "Bonerate",
["bnb"] = "Bookan",
["bnd"] = "Banda",
["bne"] = "Bintauna",
["bnf"] = "Masiwang",
["bng"] = "Benga",
["bni"] = "Bangi",
["bnj"] = "Eastern Tawbuid",
["bnk"] = "Bierebo",
["bnl"] = "Boon",
["bnm"] = "Batanga",
["bnn"] = "Bunun",
["bno"] = "Asi",
["bnp"] = "Bola",
["bnq"] = "Bantik",
["bnr"] = "Butmas-Tur",
["bns"] = "Bundeli",
["bnt-bal"] = "Balong",
["bnt-bon"] = "Boma Nkuu",
["bnt-boy"] = "Boma Yumu",
["bnt-bwa"] = "Bwala",
["bnt-cmw"] = "Chimwiini",
["bnt-ind"] = "Indanga",
["bnt-lal"] = "Lala (South Africa)",
["bnt-mpi"] = "Mpiin",
["bnt-mpu"] = "Mpuono",
["bnt-ngu-pro"] = "Proto-Nguni",
["bnt-phu"] = "Phuthi",
["bnt-pro"] = "Proto-Bantu",
["bnt-sab-pro"] = "Proto-Sabaki",
["bnt-sbo"] = "South Boma",
["bnt-sts-pro"] = "Proto-Sotho-Tswana",
["bnu"] = "Bentong",
["bnv"] = "Beneraf",
["bnw"] = "Bisis",
["bnx"] = "Bangubangu",
["bny"] = "Bintulu",
["bnz"] = "Beezen",
["bo"] = "Tibetan",
["boa"] = "Bora",
["bob"] = "Aweer",
["boe"] = "Mundabli",
["bof"] = "Bolon",
["bog"] = "Bamako Sign Language",
["boh"] = "North Boma",
["boi"] = "Barbareño",
["boj"] = "Anjam",
["bok"] = "Bonjo",
["bol"] = "Bole",
["bom"] = "Berom",
["bon"] = "Bine",
["boo"] = "Tiemacèwè Bozo",
["bop"] = "Bonkiman",
["boq"] = "Bogaya",
["bor"] = "Borôro",
["bot"] = "Bongo",
["bou"] = "Bondei",
["bov"] = "Tuwuli",
["bow"] = "Rema",
["box"] = "Buamu",
["boy"] = "Bodo (Central Africa)",
["boz"] = "Tiéyaxo Bozo",
["bpa"] = "Daakaka",
["bpd"] = "Banda-Banda",
["bpe"] = "Bauni",
["bpg"] = "Bonggo",
["bph"] = "Botlikh",
["bpi"] = "Bagupi",
["bpj"] = "Binji",
["bpk"] = "Orowe",
["bpl"] = "Broome Pearling Lugger Pidgin",
["bpm"] = "Biyom",
["bpn"] = "Dzao Min",
["bpo"] = "Anasi",
["bpp"] = "Kaure",
["bpq"] = "Banda Malay",
["bpr"] = "Koronadal Blaan",
["bps"] = "Sarangani Blaan",
["bpt"] = "Barrow Point",
["bpu"] = "Bongu",
["bpv"] = "Bian Marind",
["bpx"] = "Palya Bareli",
["bpy"] = "Bishnupriya Manipuri",
["bpz"] = "Bilba",
["bqa"] = "Tchumbuli",
["bqb"] = "Bagusa",
["bqc"] = "Boko",
["bqd"] = "Bung",
["bqf"] = "Baga Kaloum",
["bqg"] = "Bago-Kusuntu",
["bqh"] = "Baima",
["bqi"] = "Bakhtiari",
["bqj"] = "Bandial",
["bqk"] = "Banda-Mbrès",
["bql"] = "Karian",
["bqm"] = "Wumboko",
["bqn"] = "Bulgarian Sign Language",
["bqo"] = "Balo",
["bqp"] = "Busa",
["bqq"] = "Biritai",
["bqr"] = "Burusu",
["bqs"] = "Bosngun",
["bqt"] = "Bamukumbit",
["bqu"] = "Boguru",
["bqv"] = "Begbere-Ejar",
["bqw"] = "Buru (Nigeria)",
["bqx"] = "Baangi",
["bqy"] = "Bengkala Sign Language",
["bqz"] = "Bakaka",
["br"] = "Breton",
["bra"] = "Braj",
["brb"] = "Lave",
["brc"] = "Berbice Creole Dutch",
["brd"] = "Baraamu",
["brf"] = "Bera",
["brg"] = "Baure",
["brh"] = "Brahui",
["bri"] = "Mokpwe",
["brj"] = "Bieria",
["brk"] = "Birgid",
["brl"] = "Birwa",
["brm"] = "Barambu",
["brn"] = "Boruca",
["bro"] = "Brokkat",
["brp"] = "Barapasi",
["brq"] = "Breri",
["brr"] = "Birao",
["brs"] = "Baras",
["brt"] = "Bitare",
["bru"] = "Eastern Bru",
["brv"] = "Western Bru",
["brw"] = "Bellari",
["brx"] = "Bodo (India)",
["bry"] = "Burui",
["brz"] = "Bilbil",
["bsa"] = "Abinomn",
["bsb"] = "Brunei Bisaya",
["bsc"] = "Bassari",
["bse"] = "Wushi",
["bsf"] = "Bauchi",
["bsg"] = "Bashkardi",
["bsh"] = "Kamkata-viri",
["bsi"] = "Bassossi",
["bsj"] = "Bangwinji",
["bsk"] = "Burushaski",
["bsl"] = "Basa-Gumna",
["bsm"] = "Busami",
["bsn"] = "Barasana",
["bso"] = "Buso",
["bsp"] = "Baga Sitemu",
["bsq"] = "Bassa",
["bsr"] = "Bassa-Kontagora",
["bss"] = "Akoose",
["bst"] = "Basketo",
["bsu"] = "Bahonsuai",
["bsv"] = "Baga Sobané",
["bsw"] = "Baiso",
["bsx"] = "Yangkam",
["bsy"] = "Sabah Bisaya",
["bta"] = "Bata",
["btc"] = "Bati (Cameroon)",
["btd"] = "Dairi Batak",
["bte"] = "Gamo-Ningi",
["btf"] = "Birgit",
["btg"] = "Gagnoa Bété",
["bth"] = "Biatah Bidayuh",
["bti"] = "Burate",
["btj"] = "Bacanese Malay",
["btk-pro"] = "Proto-Batak",
["btm"] = "Mandailing Batak",
["btn"] = "Ratagnon",
["bto"] = "Rinconada Bikol",
["btp"] = "Budibud",
["btq"] = "Batek",
["btr"] = "Baetora",
["bts"] = "Simalungun Batak",
["btt"] = "Bete-Bendi",
["btu"] = "Batu",
["btv"] = "Bateri",
["btw"] = "Butuanon",
["btx"] = "Karo Batak",
["bty"] = "Bobot",
["btz"] = "Alas-Kluet Batak",
["bua"] = "Buryat",
["bub"] = "Bua",
["bud"] = "Ntcham",
["bue"] = "Beothuk",
["buf"] = "Bushoong",
["bug"] = "Buginese",
["buh"] = "Younuo Bunu",
["bui"] = "Bongili",
["buj"] = "Basa-Gurmana",
["buk"] = "Bukawa",
["bum"] = "Bulu (Cameroon)",
["bun"] = "Sherbro",
["buo"] = "Terei",
["bup"] = "Busoa",
["buq"] = "Brem",
["bus"] = "Bokobaru",
["but"] = "Bungain",
["buu"] = "Budu",
["buv"] = "Bun",
["buw"] = "Bubi",
["bux"] = "Boghom",
["buy"] = "Mmani",
["bva"] = "Barein",
["bvb"] = "Bube",
["bvc"] = "Baelelea",
["bvd"] = "Baeggu",
["bve"] = "Berau Malay",
["bvf"] = "Boor",
["bvg"] = "Bonkeng",
["bvh"] = "Bure",
["bvi"] = "Belanda Viri",
["bvj"] = "Baan",
["bvk"] = "Bukat",
["bvl"] = "Bolivian Sign Language",
["bvm"] = "Bamunka",
["bvn"] = "Buna",
["bvo"] = "Bolgo",
["bvp"] = "Bumang",
["bvq"] = "Birri",
["bvr"] = "Burarra",
["bvt"] = "Bati (Indonesia)",
["bvu"] = "Bukit Malay",
["bvv"] = "Baniva",
["bvw"] = "Boga",
["bvx"] = "Babole",
["bvy"] = "Baybayanon",
["bvz"] = "Bauzi",
["bwa"] = "Bwatoo",
["bwb"] = "Namosi-Naitasiri-Serua",
["bwc"] = "Bwile",
["bwd"] = "Bwaidoka",
["bwe"] = "Bwe Karen",
["bwf"] = "Boselewa",
["bwg"] = "Barwe",
["bwh"] = "Bishuo",
["bwi"] = "Baniwa",
["bwj"] = "Láá Láá Bwamu",
["bwk"] = "Bauwaki",
["bwl"] = "Bwela",
["bwm"] = "Biwat",
["bwn"] = "Wunai Bunu",
["bwo"] = "Shinasha",
["bwp"] = "Lower Mandobo",
["bwq"] = "Southern Bobo",
["bwr"] = "Bura",
["bws"] = "Bomboma",
["bwt"] = "Bafaw",
["bwu"] = "Buli (Ghana)",
["bww"] = "Bwa",
["bwx"] = "Bu-Nao Bunu",
["bwy"] = "Cwi Bwamu",
["bwz"] = "Bwisi",
["bxa"] = "Bauro",
["bxb"] = "Belanda Bor",
["bxc"] = "Molengue",
["bxd"] = "Pela",
["bxe"] = "Ongota",
["bxf"] = "Bilur",
["bxg"] = "Bangala",
["bxh"] = "Buhutu",
["bxi"] = "Pirlatapa",
["bxj"] = "Bayungu",
["bxk"] = "Bukusu",
["bxl"] = "Jalkunan",
["bxn"] = "Burduna",
["bxo"] = "Barikanchi",
["bxp"] = "Bebil",
["bxq"] = "Beele",
["bxs"] = "Busam",
["bxv"] = "Berakou",
["bxw"] = "Banka",
["bxz"] = "Binahari",
["bya"] = "Palawan Batak",
["byb"] = "Bikya",
["byc"] = "Ubaghara",
["byd"] = "Benyadu'",
["bye"] = "Pouye",
["byf"] = "Bete",
["byg"] = "Baygo",
["byh"] = "Bujhyal",
["byi"] = "Buyu",
["byj"] = "Binawa",
["byk"] = "Biao",
["byl"] = "Bayono",
["bym"] = "Bidyara",
["byn"] = "Blin",
["byo"] = "Biyo",
["byp"] = "Bumaji",
["byq"] = "Basay",
["byr"] = "Baruya",
["bys"] = "Burak",
["byt"] = "Berti",
["byv"] = "Medumba",
["byw"] = "Belhariya",
["byx"] = "Qaqet",
["byz"] = "Banaro",
["bza"] = "Bandi",
["bzb"] = "Andio",
["bzd"] = "Bribri",
["bze"] = "Jenaama Bozo",
["bzf"] = "Boikin",
["bzg"] = "Babuza",
["bzh"] = "Mapos Buang",
["bzi"] = "Bisu",
["bzj"] = "Belizean Creole",
["bzk"] = "Nicaraguan Creole",
["bzl"] = "Boano (Sulawesi)",
["bzm"] = "Bolondo",
["bzn"] = "Boano (Maluku)",
["bzo"] = "Bozaba",
["bzp"] = "Kemberano",
["bzq"] = "Buli (Indonesia)",
["bzr"] = "Biri",
["bzs"] = "Brazilian Sign Language",
["bzu"] = "Burmeso",
["bzv"] = "Bebe",
["bzw"] = "Basa",
["bzx"] = "Hainyaxo Bozo",
["bzy"] = "Obanliku",
["bzz"] = "Evant",
["ca"] = "Catalan",
["caa"] = "Ch'orti'",
["cab"] = "Garifuna",
["cac"] = "Chuj",
["cad"] = "Caddo",
["cae"] = "Laalaa",
["caf"] = "Southern Carrier",
["cag"] = "Nivaclé",
["cah"] = "Cahuarano",
["caj"] = "Chané",
["cak"] = "Kaqchikel",
["cal"] = "Carolinian",
["cam"] = "Cèmuhî",
["can"] = "Chambri",
["cao"] = "Chácobo",
["cap"] = "Chipaya",
["caq"] = "Car Nicobarese",
["car"] = "Kari'na",
["cas"] = "Tsimané",
["cau-abz-pro"] = "Proto-Abkhaz-Abaza",
["cau-and-pro"] = "Proto-Andian",
["cau-ava-pro"] = "Proto-Avaro-Andian",
["cau-cir-pro"] = "Proto-Circassian",
["cau-drg-pro"] = "Proto-Dargwa",
["cau-lzg-pro"] = "Proto-Lezghian",
["cau-nec-pro"] = "Proto-Northeast Caucasian",
["cau-nkh-pro"] = "Proto-Nakh",
["cau-nwc-pro"] = "Proto-Northwest Caucasian",
["cau-tsz-pro"] = "Proto-Tsezian",
["cav"] = "Cavineña",
["caw"] = "Kallawaya",
["cax"] = "Chiquitano",
["cay"] = "Cayuga",
["caz"] = "Canichana",
["cba-ata"] = "Atanques",
["cba-cat"] = "Catío Chibcha",
["cba-dor"] = "Dorasque",
["cba-dui"] = "Duit",
["cba-hue"] = "Huetar",
["cba-nut"] = "Nutabe",
["cba-pro"] = "Proto-Chibchan",
["cbb"] = "Cabiyarí",
["cbc"] = "Carapana",
["cbd"] = "Carijona",
["cbg"] = "Chimila",
["cbi"] = "Chachi",
["cbj"] = "Ede Cabe",
["cbk"] = "Chavacano",
["cbl"] = "Bualkhaw Chin",
["cbn"] = "Nyah Kur",
["cbo"] = "Izora",
["cbq"] = "Tsucuba",
["cbr"] = "Cashibo-Cacataibo",
["cbs"] = "Cashinahua",
["cbt"] = "Chayahuita",
["cbu"] = "Candoshi-Shapra",
["cbv"] = "Cacua",
["cbw"] = "Kinabalian",
["cby"] = "Carabayo",
["ccc"] = "Chamicuro",
["ccd"] = "Cafundó",
["cce"] = "Chopi",
["ccg"] = "Chamba Daka",
["cch"] = "Atsam",
["ccj"] = "Kasanga",
["ccl"] = "Cutchi-Swahili",
["ccm"] = "Malaccan Creole Malay",
["cco"] = "Comaltepec Chinantec",
["ccp"] = "Chakma",
["ccr"] = "Cacaopera",
["ccs-gzn-pro"] = "Proto-Georgian-Zan",
["ccs-pro"] = "Proto-Kartvelian",
["cda"] = "Choni",
["cdc-cbm-pro"] = "Proto-Central Chadic",
["cdc-mas-pro"] = "Proto-Masa",
["cdc-pro"] = "Proto-Chadic",
["cdd-pro"] = "Proto-Caddoan",
["cde"] = "Chenchu",
["cdf"] = "Chiru",
["cdh"] = "Chambeali",
["cdi"] = "Chodri",
["cdj"] = "Churahi",
["cdm"] = "Chepang",
["cdn"] = "Chaudangsi",
["cdo"] = "Eastern Min",
["cdr"] = "Cinda-Regi-Tiyal",
["cds"] = "Chadian Sign Language",
["cdy"] = "Chadong",
["cdz"] = "Koda",
["ce"] = "Chechen",
["cea"] = "Lower Chehalis",
["ceb"] = "Cebuano",
["ceg"] = "Chamacoco",
["cel-bry-pro"] = "Proto-Brythonic",
["cel-gal"] = "Gallaecian",
["cel-gau"] = "Gaulish",
["cel-pro"] = "Proto-Celtic",
["cen"] = "Cen",
["cet"] = "Centúúm",
["cfa"] = "Dijim-Bwilim",
["cfd"] = "Cara",
["cfg"] = "Como Karim",
["cfm"] = "Falam Chin",
["cga"] = "Changriwa",
["cgc"] = "Kagayanen",
["cgg"] = "Rukiga",
["cgk"] = "Chocangaca",
["ch"] = "Chamorro",
["chb"] = "Chibcha",
["chc"] = "Catawba",
["chd"] = "Highland Oaxaca Chontal",
["chf"] = "Chontal Maya",
["chg"] = "Chagatai",
["chh"] = "Chinook",
["chi-pro"] = "Proto-Chimakuan",
["chj"] = "Ojitlán Chinantec",
["chk"] = "Chuukese",
["chl"] = "Cahuilla",
["chm-pro"] = "Proto-Mari",
["chn"] = "Chinook Jargon",
["cho"] = "Choctaw",
["chp"] = "Chipewyan",
["chq"] = "Quiotepec Chinantec",
["chr"] = "Cherokee",
["cht"] = "Cholón",
["chw"] = "Chuabo",
["chx"] = "Chantyal",
["chy"] = "Cheyenne",
["chz"] = "Ozumacín Chinantec",
["cia"] = "Cia-Cia",
["cib"] = "Ci Gbe",
["cic"] = "Chickasaw",
["cid"] = "Chimariko",
["cie"] = "Cineni",
["cih"] = "Chinali",
["cik"] = "Chitkuli Kinnauri",
["cim"] = "Cimbrian",
["cin"] = "Cinta Larga",
["cip"] = "Chiapanec",
["cir"] = "Tinrin",
["ciy"] = "Chaima",
["cja"] = "Western Cham",
["cje"] = "Chru",
["cjh"] = "Upper Chehalis",
["cji"] = "Chamalal",
["cjk"] = "Chokwe",
["cjm"] = "Eastern Cham",
["cjn"] = "Chenapian",
["cjo"] = "Pajonal Ashéninka",
["cjp"] = "Cabécar",
["cjs"] = "Shor",
["cjv"] = "Chuave",
["cjy"] = "Jin",
["ckb"] = "Central Kurdish",
["ckh"] = "Chak",
["ckl"] = "Cibak",
["ckn"] = "Kaang Chin",
["cko"] = "Anufo",
["ckq"] = "Kajakse",
["ckr"] = "Kairak",
["cks"] = "Tayo",
["ckt"] = "Chukchi",
["cku"] = "Koasati",
["ckv"] = "Kavalan",
["ckx"] = "Caka",
["cky"] = "Cakfem-Mushere",
["ckz"] = "Kaqchikel-K'iche' Mixed Language",
["cla"] = "Ron",
["clc"] = "Chilcotin",
["cld"] = "Chaldean Neo-Aramaic",
["cle"] = "Lealao Chinantec",
["clh"] = "Chilisso",
["cli"] = "Chakali",
["clj"] = "Laitu Chin",
["clk"] = "Idu",
["cll"] = "Chala",
["clm"] = "Klallam",
["clo"] = "Lowland Oaxaca Chontal",
["clt"] = "Lutuv",
["clu"] = "Caluyanun",
["clw"] = "Chulym",
["cly"] = "Eastern Highland Chatino",
["cma"] = "Mạ",
["cmc-pro"] = "Proto-Chamic",
["cme"] = "Cerma",
["cmg"] = "Classical Mongolian",
["cmi"] = "Emberá-Chamí",
["cml"] = "Campalagian",
["cmm"] = "Michigamea",
["cmn"] = "Mandarin",
["cmo"] = "Central Mnong",
["cmr"] = "Mro Chin",
["cms"] = "Messapic",
["cmt"] = "Camtho",
["cna"] = "Changthang",
["cnb"] = "Chinbon Chin",
["cnc"] = "Cốông",
["cng"] = "Northern Qiang",
["cnh"] = "Lai",
["cni"] = "Asháninka",
["cnk"] = "Khumi Chin",
["cnl"] = "Lalana Chinantec",
["cno"] = "Con",
["cnp"] = "Northern Pinghua",
["cns"] = "Central Asmat",
["cnt"] = "Tepetotutla Chinantec",
["cnu"] = "Chenoua",
["cnw"] = "Ngawn Chin",
["cnx"] = "Middle Cornish",
["co"] = "Corsican",
["coa"] = "Cocos Islands Malay",
["cob"] = "Chicomuceltec",
["coc"] = "Cocopa",
["cod"] = "Cocama",
["coe"] = "Koreguaje",
["cof"] = "Tsafiki",
["cog"] = "Chong",
["coh"] = "Chichonyi-Chidzihana-Chikauma",
["coj"] = "Cochimi",
["cok"] = "Santa Teresa Cora",
["col"] = "Columbia-Wenatchi",
["com"] = "Comanche",
["con"] = "Cofán",
["coo"] = "Comox",
["cop"] = "Coptic",
["coq"] = "Coquille",
["cot"] = "Caquinte",
["cou"] = "Wamey",
["cov"] = "Cao Miao",
["cow"] = "Cowlitz",
["cox"] = "Nanti",
["coy"] = "Coyaima",
["coz"] = "Chochotec",
["cpa"] = "Palantla Chinantec",
["cpb"] = "Ucayali-Yurúa Ashéninka",
["cpc"] = "Apurucayali Ashéninka",
["cpg"] = "Cappadocian Greek",
["cpi"] = "Chinese Pidgin English",
["cpn"] = "Cherepon",
["cpo"] = "Kpee",
["cps"] = "Capiznon",
["cpu"] = "Pichis Ashéninka",
["cpx"] = "Puxian Min",
["cpy"] = "South Ucayali Ashéninka",
["cqd"] = "Chuanqiandian Cluster Miao",
["cr"] = "Cree",
["cra"] = "Chara",
["crb"] = "Kalinago",
["crc"] = "Lonwolwol",
["crd"] = "Coeur d'Alene",
["crf"] = "Caramanta",
["crg"] = "Michif",
["crh"] = "Crimean Tatar",
["cri"] = "Sãotomense",
["crj"] = "Southern East Cree",
["crk"] = "Plains Cree",
["crl"] = "Northern East Cree",
["crm"] = "Moose Cree",
["crn"] = "Cora",
["cro"] = "Crow",
["crp-bip"] = "Basque-Icelandic Pidgin",
["crp-cpr"] = "Chinese Pidgin Russian",
["crp-gep"] = "West Greenlandic Pidgin",
["crp-kia"] = "Kiautschou German Pidgin",
["crp-mar"] = "Maroon Spirit Language",
["crp-mpp"] = "Macau Pidgin Portuguese",
["crp-rsn"] = "Russenorsk",
["crp-slb"] = "Solombala English",
["crp-spp"] = "Samoan Plantation Pidgin",
["crp-tpr"] = "Taimyr Pidgin Russian",
["crq"] = "Iyo'wujwa Chorote",
["crr"] = "Carolina Algonquian",
["crs"] = "Seychellois Creole",
["crt"] = "Iyojwa'ja Chorote",
["crv"] = "Chaura",
["crw"] = "Chrau",
["crx"] = "Carrier",
["cry"] = "Cori",
["crz"] = "Cruzeño",
["cs"] = "Czech",
["csa"] = "Chiltepec Chinantec",
["csb"] = "Kashubian",
["csc"] = "Catalan Sign Language",
["csd"] = "Chiangmai Sign Language",
["cse"] = "Czech Sign Language",
["csf"] = "Cuban Sign Language",
["csg"] = "Chilean Sign Language",
["csh"] = "Asho Chin",
["csi"] = "Coast Miwok",
["csj"] = "Songlai Chin",
["csk"] = "Jola-Kasa",
["csl"] = "Chinese Sign Language",
["csm"] = "Central Sierra Miwok",
["csn"] = "Colombian Sign Language",
["cso"] = "Sochiapam Chinantec",
["csp"] = "Southern Pinghua",
["csq"] = "Croatian Sign Language",
["csr"] = "Costa Rican Sign Language",
["css"] = "Southern Ohlone",
["cst"] = "Northern Ohlone",
["csu-bba-pro"] = "Proto-Bongo-Bagirmi",
["csu-maa-pro"] = "Proto-Mangbetu",
["csu-pro"] = "Proto-Central Sudanic",
["csu-sar-pro"] = "Proto-Sara",
["csv"] = "Sumtu Chin",
["csw"] = "Swampy Cree",
["csx"] = "Cambodian Sign Language",
["csy"] = "Siyin Chin",
["csz"] = "Coos",
["cta"] = "Tataltepec Chatino",
["ctc"] = "Chetco-Tolowa",
["ctd"] = "Tedim Chin",
["cte"] = "Tepinapa Chinantec",
["ctg"] = "Chittagonian",
["cth"] = "Thaiphum Chin",
["ctl"] = "Tlacoatzintepec Chinantec",
["ctm"] = "Chitimacha",
["ctn"] = "Chhintange",
["cto"] = "Emberá-Catío",
["ctp"] = "Western Highland Chatino",
["cts"] = "Northern Catanduanes Bikol",
["ctt"] = "Wayanad Chetti",
["ctu"] = "Chol",
["ctz"] = "Zacatepec Chatino",
["cu"] = "Old Church Slavonic",
["cua"] = "Cua",
["cub"] = "Cubeo",
["cuc"] = "Usila Chinantec",
["cug"] = "Cung",
["cuh"] = "Chuka",
["cui"] = "Cuiba",
["cuj"] = "Mashco Piro",
["cuk"] = "Kuna",
["cul"] = "Culina",
["cuo"] = "Cumanagoto",
["cup"] = "Cupeño",
["cuq"] = "Cun",
["cur"] = "Chhulung",
["cus-ash"] = "Ashraaf",
["cus-hec-pro"] = "Proto-Highland East Cushitic",
["cus-pro"] = "Proto-Cushitic",
["cus-som-pro"] = "Proto-Somaloid",
["cus-sou-pro"] = "Proto-South Cushitic",
["cut"] = "Teutila Cuicatec",
["cuu"] = "Tai Ya",
["cuv"] = "Cuvok",
["cuw"] = "Chukwa",
["cux"] = "Tepeuxila Cuicatec",
["cuy"] = "Cuitlatec",
["cv"] = "Chuvash",
["cvg"] = "Chug",
["cvn"] = "Valle Nacional Chinantec",
["cwa"] = "Kabwa",
["cwb"] = "Maindo",
["cwd"] = "Woods Cree",
["cwe"] = "Kwere",
["cwg"] = "Chewong",
["cwt"] = "Kuwaataay",
["cy"] = "Welsh",
["cya"] = "Nopala Chatino",
["cyb"] = "Cayubaba",
["cyo"] = "Cuyunon",
["czh"] = "Huizhou",
["czk"] = "Knaanic",
["czn"] = "Zenzontepec Chatino",
["czo"] = "Central Min",
["czt"] = "Zotung Chin",
["da"] = "Danish",
["daa"] = "Dangaléat",
["dac"] = "Dambi",
["dad"] = "Marik",
["dae"] = "Duupa",
["dag"] = "Dagbani",
["dah"] = "Gwahatike",
["dai"] = "Day",
["daj"] = "Dar Fur Daju",
["dak"] = "Dakota",
["dal"] = "Dahalo",
["dam"] = "Damakawa",
["dao"] = "Daai Chin",
["daq"] = "Dandami Maria",
["dar"] = "Dargwa",
["das"] = "Daho-Doo",
["dau"] = "Dar Sila Daju",
["dav"] = "Taita",
["daw"] = "Davawenyo",
["dax"] = "Dayi",
["daz"] = "Dao",
["dba"] = "Bangime",
["dbb"] = "Deno",
["dbd"] = "Dadiya",
["dbe"] = "Dabe",
["dbf"] = "Edopi",
["dbg"] = "Dogul Dom",
["dbi"] = "Doka",
["dbj"] = "Ida'an",
["dbl"] = "Dyirbal",
["dbm"] = "Duguri",
["dbn"] = "Duriankere",
["dbo"] = "Dulbu",
["dbp"] = "Duwai",
["dbq"] = "Daba",
["dbr"] = "Dabarre",
["dbt"] = "Ben Tey",
["dbu"] = "Bondum Dom Dogon",
["dbv"] = "Dungu",
["dbw"] = "Bankan Tey Dogon",
["dby"] = "Dibiyaso",
["dcc"] = "Deccani",
["dcr"] = "Negerhollands",
["dda"] = "Dadi Dadi",
["ddd"] = "Dongotono",
["dde"] = "Doondo",
["ddg"] = "Fataluku",
["ddi"] = "Diodio",
["ddj"] = "Jaru",
["ddn"] = "Dendi",
["ddo"] = "Tsez",
["ddr"] = "Dhudhuroa",
["dds"] = "Donno So Dogon",
["ddw"] = "Dawera-Daweloor",
["de"] = "German",
["dec"] = "Dagik",
["ded"] = "Dedua",
["dee"] = "Dewoin",
["def"] = "Dezfuli",
["deg"] = "Degema",
["deh"] = "Dehwari",
["dei"] = "Demisa",
["dem"] = "Dem",
["dep"] = "Pidgin Delaware",
["der"] = "Deori",
["des"] = "Desano",
["dev"] = "Domung",
["dez"] = "Dengese",
["dga"] = "Southern Dagaare",
["dgb"] = "Bunoge",
["dgc"] = "Casiguran Dumagat Agta",
["dgd"] = "Dagaari Dioula",
["dge"] = "Degenan",
["dgg"] = "Doga",
["dgh"] = "Dghwede",
["dgi"] = "Northern Dagara",
["dgk"] = "Dagba",
["dgn"] = "Dagoman",
["dgo"] = "Hindi Dogri",
["dgr"] = "Dogrib",
["dgs"] = "Dogoso",
["dgt"] = "Ntra'ngith",
["dgw"] = "Daungwurrung",
["dgx"] = "Doghoro",
["dgz"] = "Daga",
["dhd"] = "Dhundhari",
["dhg"] = "Dhangu",
["dhi"] = "Dhimal",
["dhl"] = "Dhalandji",
["dhm"] = "Zemba",
["dhn"] = "Dhanki",
["dho"] = "Dhodia",
["dhr"] = "Tharrgari",
["dhs"] = "Dhaiso",
["dhu"] = "Dhurga",
["dhv"] = "Drehu",
["dhw"] = "Danuwar",
["dhx"] = "Dhungaloo",
["dia"] = "Dia",
["dib"] = "South Central Dinka",
["dic"] = "Lakota Dida",
["did"] = "Didinga",
["dif"] = "Dieri",
["dig"] = "Digo",
["dii"] = "Dimbong",
["dij"] = "Dai",
["dik"] = "Southwestern Dinka",
["dil"] = "Dilling",
["dim"] = "Dime",
["din"] = "Dinka",
["dio"] = "Dibo",
["dip"] = "Northeastern Dinka",
["dir"] = "Dirim",
["dis"] = "Dimasa",
["diu"] = "Gciriku",
["diw"] = "Northwestern Dinka",
["dix"] = "Dixon Reef",
["diy"] = "Diuwe",
["diz"] = "Ding",
["dja"] = "Djadjawurrung",
["djb"] = "Djinba",
["djc"] = "Dar Daju Daju",
["djd"] = "Jaminjung",
["dje"] = "Zarma",
["djf"] = "Djangun",
["dji"] = "Djinang",
["djj"] = "Ndjébbana",
["djk"] = "Aukan",
["djl"] = "Djiwarli",
["djm"] = "Jamsay",
["djn"] = "Djauan",
["djo"] = "Jangkang",
["djr"] = "Djambarrpuyngu",
["dju"] = "Kapriman",
["djw"] = "Djawi",
["dka"] = "Dakpa",
["dkk"] = "Dakka",
["dkr"] = "Kuijau",
["dks"] = "Southeastern Dinka",
["dkx"] = "Mazagway",
["dlg"] = "Dolgan",
["dlk"] = "Dahalik",
["dlm"] = "Dalmatian",
["dln"] = "Darlong",
["dma"] = "Duma",
["dmb"] = "Mombo Dogon",
["dmc"] = "Gavak",
["dmd"] = "Madhi Madhi",
["dme"] = "Dugwor",
["dmf"] = "Medefaidrin",
["dmg"] = "Upper Kinabatangan",
["dmk"] = "Domaaki",
["dml"] = "Dameli",
["dmm"] = "Dama (Nigeria)",
["dmn-dam"] = "Dama (Sierra Leone)",
["dmn-mdw-pro"] = "Proto-Western Mande",
["dmn-pro"] = "Proto-Mande",
["dmo"] = "Kemezung",
["dmr"] = "East Damar",
["dms"] = "Dampelas",
["dmu"] = "Dubu",
["dmv"] = "Dumpas",
["dmw"] = "Mudburra",
["dmx"] = "Dema",
["dmy"] = "Demta",
["dna"] = "Upper Grand Valley Dani",
["dnd"] = "Daonda",
["dne"] = "Ndendeule",
["dng"] = "Dungan",
["dni"] = "Lower Grand Valley Dani",
["dnj"] = "Dan",
["dnk"] = "Dengka",
["dnn"] = "Dzuun",
["dno"] = "Ndrulo",
["dnr"] = "Danaru",
["dnt"] = "Mid Grand Valley Dani",
["dnu"] = "Danau",
["dnv"] = "Danu",
["dnw"] = "Western Dani",
["dny"] = "Dení",
["doa"] = "Dom",
["dob"] = "Dobu",
["doc"] = "Northern Kam",
["doe"] = "Doe",
["dof"] = "Domu",
["doh"] = "Dong",
["doi"] = "Dogri",
["dok"] = "Dondo",
["dol"] = "Doso",
["don"] = "Doura",
["doo"] = "Dongo",
["dop"] = "Lukpa",
["doq"] = "Dominican Sign Language",
["dor"] = "Dori'o",
["dos"] = "Dogosé",
["dot"] = "Dass",
["dov"] = "Toka-Leya",
["dow"] = "Doyayo",
["dox"] = "Bussa",
["doy"] = "Dompo",
["doz"] = "Dorze",
["dpp"] = "Papar",
["dra-bry"] = "Beary",
["dra-cen-pro"] = "Proto-Central Dravidian",
["dra-mkn"] = "Middle Kannada",
["dra-nor-pro"] = "Proto-North Dravidian",
["dra-okn"] = "Old Kannada",
["dra-ote"] = "Old Telugu",
["dra-pro"] = "Proto-Dravidian",
["dra-sdo-pro"] = "Proto-South Dravidian I",
["dra-sdt-pro"] = "Proto-South Dravidian II",
["dra-sou-pro"] = "Proto-South Dravidian",
["drb"] = "Dair",
["drc"] = "Minderico",
["drd"] = "Darmiya",
["drg"] = "Rungus",
["dri"] = "Lela",
["drl"] = "Baagandji",
["drn"] = "West Damar",
["dro"] = "Daro-Matu Melanau",
["drq"] = "Dura",
["drs"] = "Gedeo",
["dru"] = "Rukai",
["dru-pro"] = "Proto-Rukai",
["dry"] = "Darai",
["dsb"] = "Lower Sorbian",
["dse"] = "Dutch Sign Language",
["dsh"] = "Daasanach",
["dsi"] = "Disa",
["dsl"] = "Danish Sign Language",
["dsn"] = "Dusner",
["dso"] = "Desiya",
["dsq"] = "Tadaksahak",
["dta"] = "Daur",
["dtb"] = "Labuk-Kinabatangan Kadazan",
["dtd"] = "Ditidaht",
["dth"] = "Adithinngithigh",
["dti"] = "Ana Tinga Dogon",
["dtk"] = "Tene Kan Dogon",
["dtm"] = "Tomo Kan Dogon",
["dto"] = "Tommo So",
["dtp"] = "Central Dusun",
["dtr"] = "Lotud",
["dts"] = "Toro So Dogon",
["dtt"] = "Toro Tegu Dogon",
["dtu"] = "Tebul Ure Dogon",
["dty"] = "Doteli",
["dua"] = "Duala",
["dub"] = "Dubli",
["duc"] = "Duna",
["due"] = "Umiray Dumaget Agta",
["duf"] = "Dumbea",
["dug"] = "Chiduruma",
["duh"] = "Dungra Bhil",
["dui"] = "Dumun",
["duk"] = "Uyajitaya",
["dul"] = "Alabat Island Agta",
["dum"] = "Middle Dutch",
["dun"] = "Dusun Deyah",
["duo"] = "Dupaningan Agta",
["dup"] = "Duano",
["duq"] = "Dusun Malang",
["dur"] = "Dii",
["dus"] = "Dumi",
["duu"] = "Drung",
["duv"] = "Duvle",
["duw"] = "Dusun Witu",
["dux"] = "Duun",
["duy"] = "Dicamay Agta",
["duz"] = "Duli",
["dv"] = "Dhivehi",
["dva"] = "Duau",
["dwa"] = "Diri",
["dwr"] = "Dawro",
["dwu"] = "Dhuwal",
["dww"] = "Dawawa",
["dwy"] = "Dhuwaya",
["dwz"] = "Dewas Rai",
["dya"] = "Dyan",
["dyb"] = "Dyaberdyaber",
["dyd"] = "Dyugun",
["dyi"] = "Djimini",
["dym"] = "Yanda Dogon",
["dyn"] = "Dyangadi",
["dyo"] = "Jola-Fonyi",
["dyu"] = "Dyula",
["dyy"] = "Dyaabugay",
["dz"] = "Dzongkha",
["dza"] = "Tunzu",
["dzg"] = "Dazaga",
["dzl"] = "Dzala",
["dzn"] = "Dzando",
["ebg"] = "Ebughu",
["ebk"] = "Eastern Bontoc",
["ebr"] = "Ebrié",
["ebu"] = "Embu",
["ecr"] = "Eteocretan",
["ecs"] = "Ecuadorian Sign Language",
["ecy"] = "Eteocypriot",
["ee"] = "Ewe",
["eee"] = "E",
["efa"] = "Efai",
["efe"] = "Efe",
["efi"] = "Efik",
["ega"] = "Ega",
["egl"] = "Emilian",
["ego"] = "Eggon",
["egx-dem"] = "Demotic Egyptian",
["egy"] = "Egyptian",
["ehu"] = "Ehueun",
["eip"] = "Eipomek",
["eit"] = "Eitiep",
["eiv"] = "Askopan",
["eja"] = "Ejamat",
["eka"] = "Ekajuk",
["eke"] = "Ekit",
["ekg"] = "Ekari",
["eki"] = "Eki",
["ekl"] = "Kolhe",
["ekm"] = "Elip",
["eko"] = "Koti",
["ekp"] = "Ekpeye",
["ekr"] = "Yace",
["eky"] = "Eastern Kayah",
["el"] = "Greek",
["ele"] = "Elepi",
["elh"] = "El Hugeirat",
["eli"] = "Nding",
["elk"] = "Elkei",
["elm"] = "Eleme",
["elo"] = "El Molo",
["elu"] = "Elu",
["elx"] = "Elamite",
["ema"] = "Emai",
["emb"] = "Embaloh",
["eme"] = "Emerillon",
["emg"] = "Eastern Meohang",
["emi"] = "Mussau-Emira",
["emk"] = "Eastern Maninkakan",
["emm"] = "Mamulique",
["emn"] = "Eman",
["emp"] = "Northern Emberá",
["ems"] = "Alutiiq",
["emu"] = "Eastern Muria",
["emw"] = "Emplawas",
["emx"] = "Erromintxela",
["emy"] = "Epigraphic Mayan",
["en"] = "English",
["ena"] = "Apali",
["enb"] = "Markweeta",
["enc"] = "En",
["end"] = "Ende",
["enf"] = "Forest Enets",
["enh"] = "Tundra Enets",
["enl"] = "Enlhet",
["enm"] = "Middle English",
["enn"] = "Engenni",
["eno"] = "Enggano",
["enq"] = "Enga",
["enr"] = "Emem",
["enu"] = "Enu",
["env"] = "Enwan",
["enw"] = "Enwang",
["enx"] = "Enxet",
["eo"] = "Esperanto",
["eot"] = "Eotile",
["epi"] = "Epie",
["era"] = "Eravallan",
["erg"] = "Sie",
["erh"] = "Eruwa",
["eri"] = "Ogea",
["erk"] = "South Efate",
["ero-gsz"] = "Geshiza",
["ero-nya"] = "Nyagrong Minyag",
["ero-tau"] = "Stau",
["err"] = "Erre",
["ers"] = "Ersu",
["ert"] = "Eritai",
["erw"] = "Erokwanas",
["es"] = "Spanish",
["ese"] = "Ese Ejja",
["esh"] = "Eshtehardi",
["esl"] = "Egyptian Sign Language",
["esm"] = "Esuma",
["esn"] = "Salvadoran Sign Language",
["eso"] = "Estonian Sign Language",
["esq"] = "Esselen",
["ess"] = "Central Siberian Yupik",
["esu"] = "Yup'ik",
["esx-esk-pro"] = "Proto-Eskimo",
["esx-ink"] = "Inuktun",
["esx-inq"] = "Inuinnaqtun",
["esx-inu-pro"] = "Proto-Inuit",
["esx-pro"] = "Proto-Eskimo-Aleut",
["esx-tut"] = "Tunumiisut",
["esy"] = "Eskayan",
["et"] = "Estonian",
["etb"] = "Etebi",
["etc"] = "Etchemin",
["eth"] = "Ethiopian Sign Language",
["etn"] = "Eton (Vanuatu)",
["eto"] = "Eton (Cameroon)",
["etr"] = "Edolo",
["ets"] = "Yekhee",
["ett"] = "Etruscan",
["etu"] = "Ejagham",
["etx"] = "Eten",
["etz"] = "Semimi",
["eu"] = "Basque",
["euq-pro"] = "Proto-Basque",
["eve"] = "Even",
["evh"] = "Uvbie",
["evn"] = "Evenki",
["ewo"] = "Ewondo",
["ext"] = "Extremaduran",
["eya"] = "Eyak",
["eyo"] = "Keiyo",
["eza"] = "Ezaa",
["eze"] = "Uzekwe",
["fa"] = "Persian",
["faa"] = "Fasu",
["fab"] = "Annobonese",
["fad"] = "Wagi",
["faf"] = "Fagani",
["fag"] = "Finongan",
["fah"] = "Baissa Fali",
["fai"] = "Faiwol",
["faj"] = "Kursav",
["fak"] = "Fang (Beboid)",
["fal"] = "South Fali",
["fam"] = "Fam",
["fan"] = "Fang (Bantu)",
["fap"] = "Palor",
["far"] = "Fataleka",
["fau"] = "Fayu",
["fax"] = "Fala",
["fay"] = "Southwestern Fars",
["faz"] = "Northwestern Fars",
["fbl"] = "West Miraya Bikol",
["fcs"] = "Quebec Sign Language",
["fer"] = "Feroge",
["ff"] = "Fula",
["ffi"] = "Foia Foia",
["fgr"] = "Fongoro",
["fi"] = "Finnish",
["fia"] = "Nobiin",
["fie"] = "Fyer",
["fif"] = "Faifi",
["fip"] = "Fipa",
["fir"] = "Firan",
["fit"] = "Meänkieli",
["fiw"] = "Fiwaga",
["fj"] = "Fijian",
["fkk"] = "Kirya-Konzel",
["fkv"] = "Kven",
["fla"] = "Montana Salish",
["flh"] = "Foau",
["fli"] = "Fali",
["fll"] = "North Fali",
["fln"] = "Flinders Island",
["flr"] = "Fuliiru",
["fly"] = "Tsotsitaal",
["fmp"] = "Fe'fe'",
["fmu"] = "Far Western Muria",
["fng"] = "Fanagalo",
["fni"] = "Fania",
["fo"] = "Faroese",
["fod"] = "Foodo",
["foi"] = "Foi",
["fom"] = "Foma",
["fon"] = "Fon",
["for"] = "Fore",
["fos"] = "Siraya",
["fpe"] = "Pichinglis",
["fqs"] = "Fas",
["fr"] = "French",
["frd"] = "Fordata",
["frm"] = "Middle French",
["fro"] = "Old French",
["frp"] = "Franco-Provençal",
["frq"] = "Forak",
["frr"] = "North Frisian",
["frt"] = "Fortsenal",
["fse"] = "Finnish Sign Language",
["fsl"] = "French Sign Language",
["fss"] = "Finnish-Swedish Sign Language",
["fud"] = "East Futuna",
["fuj"] = "Ko",
["fum"] = "Fum",
["fun"] = "Fulniô",
["fur"] = "Friulian",
["fut"] = "Futuna-Aniwa",
["fuu"] = "Furu",
["fuy"] = "Fuyug",
["fvr"] = "Fur",
["fwa"] = "Fwâi",
["fwe"] = "Fwe",
["fy"] = "West Frisian",
["ga"] = "Irish",
["gaa"] = "Ga",
["gab"] = "Gabri",
["gac"] = "Mixed Great Andamanese",
["gad"] = "Gaddang",
["gae"] = "Warekena",
["gaf"] = "Gende",
["gag"] = "Gagauz",
["gah"] = "Alekano",
["gai"] = "Borei",
["gaj"] = "Gadsup",
["gak"] = "Gamkonora",
["gal"] = "Galoli",
["gam"] = "Kandawo",
["gan"] = "Gan",
["gao"] = "Gants",
["gap"] = "Gal",
["gaq"] = "Gata'",
["gar"] = "Galeya",
["gas"] = "Adiwasi Garasia",
["gat"] = "Kenati",
["gau"] = "Kondekor",
["gaw"] = "Nobonob",
["gay"] = "Gayo",
["gba-pro"] = "Proto-Gbaya",
["gbb"] = "Kaytetye",
["gbd"] = "Karadjeri",
["gbe"] = "Niksek",
["gbf"] = "Gaikundi",
["gbg"] = "Gbanziri",
["gbh"] = "Defi Gbe",
["gbi"] = "Galela",
["gbj"] = "Bodo Gadaba",
["gbk"] = "Gaddi",
["gbl"] = "Gamit",
["gbm"] = "Garhwali",
["gbn"] = "Mo'da",
["gbo"] = "Northern Grebo",
["gbp"] = "Gbaya-Bossangoa",
["gbq"] = "Gbaya-Bozoum",
["gbr"] = "Gbagyi",
["gbs"] = "Gbesi Gbe",
["gbu"] = "Gagadu",
["gbv"] = "Gbanu",
["gbw"] = "Gabi",
["gbx"] = "Eastern Xwla Gbe",
["gby"] = "Gbari",
["gcc"] = "Mali",
["gcd"] = "Ganggalida",
["gce"] = "Galice",
["gcf"] = "Antillean Creole",
["gcl"] = "Grenadian Creole English",
["gcn"] = "Gaina",
["gcr"] = "Guianese Creole",
["gct"] = "Colonia Tovar German",
["gd"] = "Scottish Gaelic",
["gdb"] = "Ollari",
["gdc"] = "Gugu Badhun",
["gdd"] = "Gedaged",
["gde"] = "Gude",
["gdf"] = "Guduf-Gava",
["gdg"] = "Ga'dang",
["gdh"] = "Gadjerawang",
["gdi"] = "Gundi",
["gdj"] = "Kurtjar",
["gdk"] = "Gadang",
["gdl"] = "Dirasha",
["gdm"] = "Laal",
["gdn"] = "Umanakaina",
["gdo"] = "Godoberi",
["gdq"] = "Mehri",
["gdr"] = "Wipi",
["gds"] = "Ghandruk Sign Language",
["gdt"] = "Kungardutyi",
["gdu"] = "Gudu",
["gdx"] = "Godwari",
["gea"] = "Geruma",
["geb"] = "Kire",
["gec"] = "Gboloo Grebo",
["ged"] = "Gade",
["geg"] = "Gengle",
["geh"] = "Hutterisch",
["gei"] = "Gebe",
["gej"] = "Gen",
["gek"] = "Gerka",
["gel"] = "Fakkanci",
["gem-pro"] = "Proto-Germanic",
["geq"] = "Geme",
["ges"] = "Geser-Gorom",
["gev"] = "Viya",
["gew"] = "Gera",
["gex"] = "Garre",
["gey"] = "Enya",
["gez"] = "Ge'ez",
["gfk"] = "Patpatar",
["gft"] = "Gafat",
["gga"] = "Gao",
["ggb"] = "Gbii",
["ggd"] = "Gugadj",
["gge"] = "Guragone",
["ggg"] = "Gurgula",
["ggk"] = "Kungarakany",
["ggl"] = "Ganglau",
["ggt"] = "Gitua",
["ggu"] = "Gban",
["ggw"] = "Gogodala",
["gha"] = "Ghadames",
["ghc"] = "Classical Gaelic",
["ghe"] = "Southern Ghale",
["ghh"] = "Northern Ghale",
["ghk"] = "Geko Karen",
["ghl"] = "Ghulfan",
["ghn"] = "Ghanongga",
["gho"] = "Ghomara",
["ghr"] = "Ghera",
["ghs"] = "Guhu-Samane",
["ght"] = "Kutang Ghale",
["gia"] = "Kitja",
["gib"] = "Gibanawa",
["gid"] = "Gidar",
["gie"] = "Guébie",
["gig"] = "Goaria",
["gih"] = "Githabul",
["gii"] = "Girirra",
["gil"] = "Gilbertese",
["gim"] = "Gimi (Papuan)",
["gin"] = "Hinukh",
["gip"] = "Gimi (Austronesian)",
["giq"] = "Green Gelao",
["gir"] = "Red Gelao",
["gis"] = "North Giziga",
["git"] = "Gitxsan",
["giu"] = "Mulao",
["giw"] = "White Gelao",
["gix"] = "Gilima",
["giy"] = "Giyug",
["giz"] = "South Giziga",
["gji"] = "Geji",
["gjk"] = "Kachi Koli",
["gjm"] = "Gunditjmara",
["gjn"] = "Gonja",
["gjr"] = "Gurindji Kriol",
["gju"] = "Gojri",
["gka"] = "Guya",
["gkd"] = "Magi",
["gke"] = "Ndai",
["gkn"] = "Gokana",
["gko"] = "Kok-Nar",
["gkp"] = "Guinea Kpelle",
["gl"] = "Galician",
["glc"] = "Bon Gula",
["gld"] = "Nanai",
["glh"] = "Northwest Pashayi",
["glj"] = "Kulaal",
["glk"] = "Gilaki",
["glo"] = "Galambu",
["glr"] = "Glaro-Twabo",
["glu"] = "Gula",
["glw"] = "Glavda",
["gly"] = "Gule",
["gma"] = "Gambera",
["gmb"] = "Gula'alaa",
["gmd"] = "Mághdì",
["gme-bur"] = "Burgundian",
["gme-cgo"] = "Crimean Gothic",
["gmg"] = "Magiyi",
["gmh"] = "Middle High German",
["gml"] = "Middle Low German",
["gmm"] = "Gbaya-Mbodomo",
["gmn"] = "Gimnime",
["gmq-gut"] = "Gutnish",
["gmq-jmk"] = "Jamtish",
["gmq-mno"] = "Middle Norwegian",
["gmq-oda"] = "Old Danish",
["gmq-ogt"] = "Old Gutnish",
["gmq-osw"] = "Old Swedish",
["gmq-pro"] = "Proto-Norse",
["gmq-scy"] = "Scanian",
["gmr"] = "Mirning",
["gmu"] = "Gumalu",
["gmv"] = "Gamo",
["gmw-bgh"] = "Bergish",
["gmw-cfr"] = "Central Franconian",
["gmw-ecg"] = "East Central German",
["gmw-fin"] = "Fingallian",
["gmw-gts"] = "Gottscheerish",
["gmw-jdt"] = "Jersey Dutch",
["gmw-msc"] = "Middle Scots",
["gmw-pro"] = "Proto-West Germanic",
["gmw-rfr"] = "Rhine Franconian",
["gmw-stm"] = "Sathmar Swabian",
["gmw-tsx"] = "Transylvanian Saxon",
["gmw-vog"] = "Volga German",
["gmw-zps"] = "Zipser German",
["gmx"] = "Magoma",
["gmy"] = "Mycenaean Greek",
["gmz"] = "Mgbo",
["gn-cls"] = "Classical Guarani",
["gna"] = "Kaansa",
["gnb"] = "Gangte",
["gnc"] = "Guanche",
["gnd"] = "Zulgo-Gemzek",
["gne"] = "Ganang",
["gng"] = "Ngangam",
["gnh"] = "Lere",
["gni"] = "Gooniyandi",
["gnj"] = "Ngen of Djonkro",
["gnk"] = "ǁGana",
["gnl"] = "Gangulu",
["gnm"] = "Ginuman",
["gnn"] = "Gumatj",
["gnq"] = "Gana",
["gnr"] = "Gureng Gureng",
["gnt"] = "Guntai",
["gnu"] = "Gnau",
["gnw"] = "Western Bolivian Guarani",
["gnz"] = "Ganzi",
["goa"] = "Guro",
["gob"] = "Playero",
["goc"] = "Gorakor",
["god"] = "Godié",
["goe"] = "Gongduk",
["gof"] = "Gofa",
["gog"] = "Gogo",
["goh"] = "Old High German",
["goi"] = "Gobasi",
["goj"] = "Gowlan",
["gol"] = "Gola",
["gon"] = "Gondi",
["goo"] = "Gone Dau",
["gop"] = "Yeretuar",
["goq"] = "Gorap",
["gor"] = "Gorontalo",
["got"] = "Gothic",
["gou"] = "Gavar",
["gov"] = "Goo",
["gow"] = "Gorwaa",
["gox"] = "Gobu",
["goy"] = "Goundo",
["goz"] = "Gozarkhani",
["gpa"] = "Gupa-Abawa",
["gpn"] = "Taiap",
["gqa"] = "Ga'anda",
["gqi"] = "Guiqiong",
["gqn"] = "Kinikinao",
["gqr"] = "Gor",
["gqu"] = "Qau",
["gra"] = "Rajput Garasia",
["grc"] = "Ancient Greek",
["grd"] = "Guruntum",
["grg"] = "Madi",
["grh"] = "Gbiri-Niragu",
["gri"] = "Ghari",
["grj"] = "Southern Grebo",
["grk-cal"] = "Calabrian Greek",
["grk-ita"] = "Italiot Greek",
["grk-mar"] = "Mariupol Greek",
["grk-pro"] = "Proto-Hellenic",
["grm"] = "Kota Marudu Talantang",
["gro"] = "Groma",
["grq"] = "Gorovu",
["grs"] = "Gresi",
["grt"] = "Garo",
["gru"] = "Kistane",
["grv"] = "Central Grebo",
["grw"] = "Gweda",
["grx"] = "Guriaso",
["gry"] = "Barclayville Grebo",
["grz"] = "Guramalum",
["gse"] = "Ghanaian Sign Language",
["gsg"] = "German Sign Language",
["gsl"] = "Gusilay",
["gsm"] = "Guatemalan Sign Language",
["gsn"] = "Gusan",
["gso"] = "Southwest Gbaya",
["gsp"] = "Wasembo",
["gss"] = "Greek Sign Language",
["gsw"] = "Alemannic German",
["gta"] = "Guató",
["gtu"] = "Aghu Tharrnggala",
["gu"] = "Gujarati",
["gua"] = "Shiki",
["gub"] = "Guajajára",
["guc"] = "Wayuu",
["gud"] = "Yocoboué Dida",
["gue"] = "Gurindji",
["guf"] = "Gupapuyngu",
["gug"] = "Paraguayan Guarani",
["guh"] = "Guahibo",
["gui"] = "Eastern Bolivian Guarani",
["guk"] = "Gumuz",
["gul"] = "Gullah",
["gum"] = "Guambiano",
["gun"] = "Mbya Guarani",
["guo"] = "Guayabero",
["gup"] = "Gunwinggu",
["guq"] = "Aché",
["gur"] = "Farefare",
["gus"] = "Guinean Sign Language",
["gut"] = "Maléku Jaíka",
["guu"] = "Yanomamö",
["guv"] = "Gey",
["guw"] = "Gun",
["gux"] = "Gourmanchéma",
["guz"] = "Gusii",
["gv"] = "Manx",
["gva"] = "Kaskihá",
["gvc"] = "Guanano",
["gve"] = "Duwet",
["gvf"] = "Golin",
["gvj"] = "Guajá",
["gvl"] = "Gulay",
["gvm"] = "Gurmana",
["gvn"] = "Kuku-Yalanji",
["gvo"] = "Gavião do Jiparaná",
["gvp"] = "Pará Gavião",
["gvr"] = "Gurung",
["gvs"] = "Gumawana",
["gvy"] = "Guyani",
["gwa"] = "Mbato",
["gwb"] = "Gwa",
["gwc"] = "Kalami",
["gwd"] = "Gawwada",
["gwe"] = "Gweno",
["gwf"] = "Gowro",
["gwg"] = "Moo",
["gwi"] = "Gwich'in",
["gwj"] = "Gcwi",
["gwm"] = "Awngthim",
["gwn"] = "Gwandara",
["gwr"] = "Gwere",
["gwt"] = "Gawar-Bati",
["gwu"] = "Guwamu",
["gww"] = "Kwini",
["gwx"] = "Gua",
["gxx"] = "Wè Southern",
["gya"] = "Northwest Gbaya",
["gyb"] = "Garus",
["gyd"] = "Kayardild",
["gye"] = "Gyem",
["gyf"] = "Gungabula",
["gyg"] = "Gbayi",
["gyi"] = "Gyele",
["gyl"] = "Gayil",
["gym"] = "Ngäbere",
["gyn"] = "Guyanese Creole English",
["gyo"] = "Gyalsumdo",
["gyr"] = "Guarayu",
["gyy"] = "Gunya",
["gza"] = "Ganza",
["gzn"] = "Gane",
["ha"] = "Hausa",
["haa"] = "Hän",
["hab"] = "Hanoi Sign Language",
["hac"] = "Gurani",
["had"] = "Hatam",
["haf"] = "Haiphong Sign Language",
["hag"] = "Hanga",
["hah"] = "Hahon",
["hai"] = "Haida",
["haj"] = "Hajong",
["hak"] = "Hakka",
["hal"] = "Halang",
["ham"] = "Hewa",
["hao"] = "Hakö",
["hap"] = "Hupla",
["har"] = "Harari",
["has"] = "Haisla",
["hav"] = "Havu",
["haw"] = "Hawaiian",
["hax"] = "Southern Haida",
["hay"] = "Haya",
["hba"] = "Hamba",
["hbb"] = "Huba",
["hbn"] = "Heiban",
["hbu"] = "Habu",
["hca"] = "Andaman Creole Hindi",
["hch"] = "Huichol",
["hdn"] = "Northern Haida",
["hds"] = "Honduras Sign Language",
["hdy"] = "Hadiyya",
["he"] = "Hebrew",
["hea"] = "Northern Qiandong Miao",
["hed"] = "Herdé",
["heg"] = "Helong",
["heh"] = "Hehe",
["hei"] = "Heiltsuk",
["hem"] = "Hemba",
["hgm"] = "Haiǁom",
["hgw"] = "Haigwai",
["hhi"] = "Hoia Hoia",
["hhr"] = "Kerak",
["hhy"] = "Hoyahoya",
["hi"] = "Hindi",
["hia"] = "Lamang",
["hib"] = "Hibito",
["hid"] = "Hidatsa",
["hif"] = "Fiji Hindi",
["hig"] = "Kamwe",
["hih"] = "Pamosu",
["hii"] = "Hinduri",
["hij"] = "Hijuk",
["hik"] = "Seit-Kaitetu",
["hil"] = "Hiligaynon",
["hio"] = "Tshwa",
["hir"] = "Himarimã",
["hit"] = "Hittite",
["hiw"] = "Hiw",
["hix"] = "Hixkaryana",
["hji"] = "Haji",
["hka"] = "Kahe",
["hke"] = "Hunde",
["hkh"] = "Pogali",
["hkk"] = "Hunjara-Kaina Ke",
["hkn"] = "Mel-Khaonh",
["hks"] = "Hong Kong Sign Language",
["hla"] = "Halia",
["hlb"] = "Halbi",
["hld"] = "Halang Doan",
["hle"] = "Hlersu",
["hlt"] = "Nga La",
["hma"] = "Southern Mashan Hmong",
["hmb"] = "Humburi Senni",
["hmc"] = "Central Huishui Hmong",
["hmd"] = "A-Hmao",
["hme"] = "Eastern Huishui Hmong",
["hmf"] = "Hmong Don",
["hmg"] = "Southwestern Guiyang Hmong",
["hmh"] = "Southwestern Huishui Hmong",
["hmi"] = "Northern Huishui Hmong",
["hmj"] = "Ge",
["hmk"] = "Yemaek",
["hml"] = "Luopohe Hmong",
["hmm"] = "Central Mashan Hmong",
["hmn-pro"] = "Proto-Hmongic",
["hmp"] = "Northern Mashan Hmong",
["hmq"] = "Eastern Qiandong Miao",
["hmr"] = "Hmar",
["hms"] = "Southern Qiandong Miao",
["hmt"] = "Hamtai",
["hmu"] = "Hamap",
["hmv"] = "Hmong Dô",
["hmw"] = "Western Mashan Hmong",
["hmx-mie-pro"] = "Proto-Mienic",
["hmx-pro"] = "Proto-Hmong-Mien",
["hmy"] = "Southern Guiyang Hmong",
["hmz"] = "Hmong Shua",
["hna"] = "Mina",
["hnd"] = "Southern Hindko",
["hne"] = "Chhattisgarhi",
["hnh"] = "ǁAni",
["hni"] = "Hani",
["hnj"] = "Green Hmong",
["hnm"] = "Hainanese",
["hnn"] = "Hanunoo",
["hno"] = "Northern Hindko",
["hns"] = "Caribbean Hindustani",
["hnu"] = "Hung",
["ho"] = "Hiri Motu",
["hoa"] = "Hoava",
["hob"] = "Mari (Austronesian)",
["hoc"] = "Ho",
["hod"] = "Holma",
["hoe"] = "Horom",
["hoh"] = "Hobyót",
["hoi"] = "Holikachuk",
["hoj"] = "Hadoti",
["hol"] = "Holu",
["hom"] = "Homa",
["hoo"] = "Holoholo",
["hop"] = "Hopi",
["hor"] = "Horo",
["hos"] = "Ho Chi Minh City Sign Language",
["hot"] = "Hote",
["hov"] = "Hovongan",
["how"] = "Honi",
["hoy"] = "Holiya",
["hoz"] = "Hozo",
["hpo"] = "Hpon",
["hps"] = "Hawai'i Pidgin Sign Language",
["hra"] = "Hrangkhol",
["hrc"] = "Niwer Mil",
["hre"] = "Hrê",
["hrk"] = "Haruku",
["hrm"] = "Horned Miao",
["hro"] = "Haroi",
["hrp"] = "Nhirrpi",
["hrt"] = "Hértevin",
["hru"] = "Hruso",
["hrw"] = "Warwar Feni",
["hrx"] = "Hunsrik",
["hrz"] = "Harzani",
["hsb"] = "Upper Sorbian",
["hsh"] = "Hungarian Sign Language",
["hsl"] = "Hausa Sign Language",
["hsn"] = "Xiang",
["hss"] = "Harsusi",
["ht"] = "Haitian Creole",
["hti"] = "Hoti",
["hto"] = "Minica Huitoto",
["hts"] = "Hadza",
["htu"] = "Hitu",
["hu"] = "Hungarian",
["hub"] = "Huambisa",
["huc"] = "ǂHoan",
["hud"] = "Huaulu",
["huf"] = "Humene",
["hug"] = "Huachipaeri",
["huh"] = "Huilliche",
["hui"] = "Huli",
["huj"] = "Northern Guiyang Hmong",
["huk"] = "Hulung",
["hul"] = "Hula",
["hum"] = "Hungana",
["huo"] = "Hu",
["hup"] = "Hupa",
["huq"] = "Tsat",
["hur"] = "Halkomelem",
["hus"] = "Wastek",
["huu"] = "Murui Huitoto",
["huv"] = "Huave",
["huw"] = "Hukumina",
["hux"] = "Nüpode Huitoto",
["huy"] = "Hulaulá",
["huz"] = "Hunzib",
["hvc"] = "Haitian Vodoun Culture Language",
["hvk"] = "Haveke",
["hvn"] = "Sabu",
["hwa"] = "Wané",
["hwc"] = "Hawaiian Creole",
["hwo"] = "Hwana",
["hy"] = "Armenian",
["hya"] = "Hya",
["hyx-pro"] = "Proto-Armenian",
["hz"] = "Herero",
["ia"] = "Interlingua",
["iai"] = "Iaai",
["ian"] = "Iatmul",
["iar"] = "Purari",
["iba"] = "Iban",
["ibb"] = "Ibibio",
["ibd"] = "Iwaidja",
["ibe"] = "Akpes",
["ibg"] = "Ibanag",
["ibh"] = "Bih",
["ibl"] = "Ibaloi",
["ibm"] = "Agoi",
["ibn"] = "Ibino",
["ibr"] = "Ibuoro",
["ibu"] = "Ibu",
["iby"] = "Ibani",
["ica"] = "Ede Ica",
["ich"] = "Etkywan",
["icl"] = "Icelandic Sign Language",
["icr"] = "Islander Creole English",
["id"] = "Indonesian",
["ida"] = "Idakho-Isukha-Tiriki",
["idb"] = "Indo-Portuguese",
["idc"] = "Idon",
["idd"] = "Ede Idaca",
["ide"] = "Idere",
["idi"] = "Idi",
["idr"] = "Indri",
["ids"] = "Idesa",
["idt"] = "Idaté",
["idu"] = "Idoma",
["ie"] = "Interlingue",
["ifa"] = "Amganad Ifugao",
["ifb"] = "Batad Ifugao",
["ife"] = "Ifè",
["iff"] = "Ifo",
["ifk"] = "Tuwali Ifugao",
["ifm"] = "Teke-Fuumu",
["ifu"] = "Mayoyao Ifugao",
["ify"] = "Keley-I Kallahan",
["ig"] = "Igbo",
["igb"] = "Ebira",
["ige"] = "Igede",
["igg"] = "Igana",
["igl"] = "Igala",
["igm"] = "Kanggape",
["ign"] = "Ignaciano",
["igo"] = "Isebe",
["igs"] = "Glosa",
["igw"] = "Igwe",
["ihb"] = "Pidgin Iha",
["ihi"] = "Ihievbe",
["ihp"] = "Iha",
["ii"] = "Nuosu",
["iir-nur-pro"] = "Proto-Nuristani",
["iir-pro"] = "Proto-Indo-Iranian",
["ijc"] = "Izon",
["ije"] = "Biseni",
["ijj"] = "Ede Ije",
["ijn"] = "Kalabari",
["ijo-pro"] = "Proto-Ijoid",
["ijs"] = "Southeast Ijo",
["ik"] = "Inupiaq",
["ike"] = "Eastern Canadian Inuktitut",
["iki"] = "Iko",
["ikk"] = "Ika",
["ikl"] = "Ikulu",
["iko"] = "Olulumo-Ikom",
["ikp"] = "Ikpeshi",
["ikr"] = "Ikaranggal",
["iks"] = "Inuit Sign Language",
["ikt"] = "Inuvialuktun",
["ikv"] = "Iku-Gora-Ankwa",
["ikw"] = "Ikwere",
["ikx"] = "Ik",
["ikz"] = "Ikizu",
["ila"] = "Ile Ape",
["ilb"] = "Ila",
["ilg"] = "Ilgar",
["ili"] = "Ili Turki",
["ilk"] = "Ilongot",
["ill"] = "Iranun",
["ilo"] = "Ilocano",
["ils"] = "International Sign",
["ilu"] = "Ili'uun",
["ilv"] = "Ilue",
["ima"] = "Mala Malasar",
["imi"] = "Anamgura",
["iml"] = "Miluk",
["imn"] = "Imonda",
["imo"] = "Imbongu",
["imr"] = "Imroing",
["ims"] = "Marsian",
["imy"] = "Milyan",
["inb"] = "Inga",
["inc-apa"] = "Apabhramsa",
["inc-ash"] = "Ashokan Prakrit",
["inc-dng-pro"] = "Proto-Dangari",
["inc-kam"] = "Kamarupi Prakrit",
["inc-kho"] = "Kholosi",
["inc-krd-pro"] = "Proto-Kamta",
["inc-mas"] = "Middle Assamese",
["inc-mbn"] = "Middle Bengali",
["inc-mgu"] = "Middle Gujarati",
["inc-mor"] = "Middle Odia",
["inc-oas"] = "Early Assamese",
["inc-oaw"] = "Old Awadhi",
["inc-obn"] = "Old Bengali",
["inc-ogu"] = "Old Gujarati",
["inc-ohi"] = "Old Hindi",
["inc-oor"] = "Old Odia",
["inc-opa"] = "Old Punjabi",
["inc-pro"] = "Proto-Indo-Aryan",
["ine-ana-pro"] = "Proto-Anatolian",
["ine-bsl-pro"] = "Proto-Balto-Slavic",
["ine-grp-pro"] = "Proto-Graeco-Phrygian",
["ine-kal"] = "Kalašma",
["ine-pae"] = "Paeonian",
["ine-pro"] = "Proto-Indo-European",
["ine-toc-pro"] = "Proto-Tocharian",
["ing"] = "Deg Xinag",
["inh"] = "Ingush",
["inj"] = "Jungle Inga",
["inl"] = "Indonesian Sign Language",
["inm"] = "Minaean",
["inn"] = "Isinai",
["ino"] = "Inoke-Yate",
["inp"] = "Iñapari",
["ins"] = "Indian Sign Language",
["int"] = "Intha",
["inz"] = "Ineseño",
["io"] = "Ido",
["ior"] = "Inor",
["iou"] = "Tuma-Irumu",
["iow"] = "Chiwere",
["ipi"] = "Ipili",
["ipo"] = "Ipiko",
["iqu"] = "Iquito",
["iqw"] = "Ikwo",
["ira-kms-pro"] = "Proto-Komisenian",
["ira-mny-pro"] = "Proto-Munji-Yidgha",
["ira-mpr-pro"] = "Proto-Medo-Parthian",
["ira-pat-pro"] = "Proto-Pathan",
["ira-pro"] = "Proto-Iranian",
["ira-sgc-pro"] = "Proto-Sogdic",
["ira-sgi-pro"] = "Proto-Sanglechi-Ishkashimi",
["ira-shr-pro"] = "Proto-Shughni-Roshani",
["ira-shy-pro"] = "Proto-Shughni-Yazghulami",
["ira-sym-pro"] = "Proto-Shughni-Yazghulami-Munji",
["ira-wnj"] = "Vanji",
["ira-zgr-pro"] = "Proto-Zaza-Gorani",
["ire"] = "Iresim",
["irh"] = "Irarutu",
["iri"] = "Rigwe",
["irk"] = "Iraqw",
["irn"] = "Irantxe",
["iro-ere"] = "Erie",
["iro-min"] = "Mingo",
["iro-nor-pro"] = "Proto-North Iroquoian",
["iro-pro"] = "Proto-Iroquoian",
["irr"] = "Ir",
["iru"] = "Irula",
["irx"] = "Kamberau",
["iry"] = "Iraya",
["is"] = "Icelandic",
["isa"] = "Isabi",
["isc"] = "Isconahua",
["isd"] = "Isnag",
["ise"] = "Italian Sign Language",
["isg"] = "Irish Sign Language",
["ish"] = "Esan",
["isi"] = "Nkem-Nkum",
["isk"] = "Ishkashimi",
["ism"] = "Masimasi",
["isn"] = "Isanzu",
["iso"] = "Isoko",
["isr"] = "Israeli Sign Language",
["ist"] = "Istriot",
["isu"] = "Isu",
["isv"] = "Interslavic",
["it"] = "Italian",
["itb"] = "Binongan Itneg",
["itc-pro"] = "Proto-Italic",
["itc-psa"] = "Pre-Samnite",
["itd"] = "Southern Tidung",
["ite"] = "Itene",
["iti"] = "Inlaod Itneg",
["itk"] = "Judeo-Italian",
["itl"] = "Itelmen",
["itm"] = "Itu Mbon Uzo",
["ito"] = "Itonama",
["itr"] = "Iteri",
["its"] = "Itsekiri",
["itt"] = "Maeng Itneg",
["itv"] = "Itawit",
["itw"] = "Ito",
["itx"] = "Itik",
["ity"] = "Moyadan Itneg",
["itz"] = "Itza'",
["iu"] = "Inuktitut",
["ium"] = "Iu Mien",
["ivb"] = "Ibatan",
["ivv"] = "Ivatan",
["iwk"] = "I-Wak",
["iwm"] = "Iwam",
["iwo"] = "Iwur",
["iws"] = "Sepik Iwam",
["ixc"] = "Ixcatec",
["ixl"] = "Ixil",
["iya"] = "Iyayu",
["iyo"] = "Mesaka",
["iyx"] = "Yaa",
["izh"] = "Ingrian",
["izi"] = "Izi-Ezaa-Ikwo-Mgbo",
["izr"] = "Izere",
["izz"] = "Izi",
["ja"] = "Japanese",
["jaa"] = "Jamamadí",
["jab"] = "Hyam",
["jac"] = "Jakaltek",
["jad"] = "Jahanka",
["jae"] = "Jabem",
["jaf"] = "Jara",
["jah"] = "Jah Hut",
["jaj"] = "Zazao",
["jal"] = "Yalahatan",
["jam"] = "Jamaican Creole",
["jan"] = "Janday",
["jao"] = "Yanyuwa",
["jaq"] = "Yaqay",
["jas"] = "New Caledonian Javanese",
["jat"] = "Jakati",
["jau"] = "Yaur",
["jax"] = "Jambi Malay",
["jay"] = "Yan-nhangu",
["jaz"] = "Jawe",
["jbi"] = "Badjiri",
["jbj"] = "Arandai",
["jbk"] = "Barikewa",
["jbn"] = "Nefusa",
["jbo"] = "Lojban",
["jbr"] = "Jofotek-Bromnya",
["jbt"] = "Jabutí",
["jbu"] = "Jukun Takum",
["jbw"] = "Yawijibaya",
["jcs"] = "Jamaican Country Sign Language",
["jct"] = "Krymchak",
["jda"] = "Jad",
["jdg"] = "Jadgali",
["jdt"] = "Judeo-Tat",
["jeb"] = "Jebero",
["jee"] = "Jerung",
["jeg"] = "Jeng",
["jeh"] = "Jeh",
["jei"] = "Yei",
["jek"] = "Jeri Kuo",
["jel"] = "Yelmek",
["jen"] = "Dza",
["jer"] = "Jere",
["jet"] = "Manem",
["jeu"] = "Jonkor Bourmataguil",
["jgb"] = "Ngbee",
["jgk"] = "Gwak",
["jgo"] = "Ngomba",
["jhi"] = "Jehai",
["jhs"] = "Jhankot Sign Language",
["jia"] = "Jina",
["jib"] = "Jibu",
["jic"] = "Tol",
["jid"] = "Bu",
["jie"] = "Jilbe",
["jig"] = "Jingulu",
["jih"] = "Shangzhai",
["jii"] = "Jiiddu",
["jil"] = "Jilim",
["jim"] = "Jimjimen",
["jio"] = "Jiamao",
["jiq"] = "Khroskyabs",
["jit"] = "Jita",
["jiu"] = "Youle Jino",
["jiv"] = "Shuar",
["jiy"] = "Buyuan Jino",
["jje"] = "Jeju",
["jjr"] = "Zhár",
["jka"] = "Kaera",
["jko"] = "Kubo",
["jkp"] = "Paku Karen",
["jkr"] = "Koro (India)",
["jku"] = "Labir",
["jle"] = "Ngile",
["jls"] = "Jamaican Sign Language",
["jma"] = "Dima",
["jmb"] = "Zumbun",
["jmc"] = "Machame",
["jmd"] = "Yamdena",
["jmi"] = "Jimi",
["jml"] = "Jumli",
["jmn"] = "Makuri Naga",
["jmr"] = "Kamara",
["jmw"] = "Mouwase",
["jmx"] = "Western Juxtlahuaca Mixtec",
["jna"] = "Jangshung",
["jnd"] = "Jandavra",
["jng"] = "Yangman",
["jni"] = "Janji",
["jnj"] = "Yemsa",
["jnl"] = "Rawat",
["jns"] = "Jaunsari",
["job"] = "Joba",
["jod"] = "Wojenaka",
["jor"] = "Jorá",
["jos"] = "Jordanian Sign Language",
["jow"] = "Jowulu",
["jpr"] = "Judeo-Persian",
["jpx-hcj"] = "Hachijō",
["jpx-pro"] = "Proto-Japonic",
["jpx-ryu-pro"] = "Proto-Ryukyuan",
["jqr"] = "Jaqaru",
["jra"] = "Jarai",
["jrr"] = "Jiru",
["jru"] = "Japrería",
["jsl"] = "Japanese Sign Language",
["jua"] = "Júma",
["jub"] = "Wannu",
["juc"] = "Jurchen",
["jud"] = "Worodougou",
["juh"] = "Hone",
["jui"] = "Ngadjuri",
["juk"] = "Wapan",
["jul"] = "Jirel",
["jum"] = "Jumjum",
["jun"] = "Juang",
["juo"] = "Jiba",
["jup"] = "Hupdë",
["jur"] = "Jurúna",
["jus"] = "Jumla Sign Language",
["jut"] = "Jutish",
["juu"] = "Ju",
["juw"] = "Wãpha",
["juy"] = "Juray",
["jv"] = "Javanese",
["jvd"] = "Javindo",
["jvn"] = "Caribbean Javanese",
["jwi"] = "Jwira-Pepesa",
["jyy"] = "Jaya",
["ka"] = "Georgian",
["kaa"] = "Karakalpak",
["kab"] = "Kabyle",
["kac"] = "Jingpho",
["kad"] = "Kadara",
["kae"] = "Ketangalan",
["kaf"] = "Katso",
["kag"] = "Kajaman",
["kah"] = "Fer",
["kai"] = "Karekare",
["kaj"] = "Jju",
["kak"] = "Kayapa Kallahan",
["kam"] = "Kamba",
["kao"] = "Kassonke",
["kap"] = "Bezhta",
["kaq"] = "Capanahua",
["kar-pro"] = "Proto-Karen",
["kaw"] = "Old Javanese",
["kax"] = "Kao",
["kay"] = "Kamayurá",
["kba"] = "Kalarko",
["kbb"] = "Kaxuyana",
["kbc"] = "Kadiwéu",
["kbd"] = "East Circassian",
["kbe"] = "Kanju",
["kbh"] = "Camsá",
["kbi"] = "Kaptiau",
["kbj"] = "Kari",
["kbk"] = "Grass Koiari",
["kbm"] = "Iwal",
["kbn"] = "Kare (Central Africa)",
["kbo"] = "Keliko",
["kbp"] = "Kabiye",
["kbq"] = "Kamano",
["kbr"] = "Kafa",
["kbs"] = "Kande",
["kbt"] = "Gabadi",
["kbu"] = "Kabutra",
["kbv"] = "Kamberataro",
["kbw"] = "Kaiep",
["kbx"] = "Ap Ma",
["kbz"] = "Duhwa",
["kca-eas"] = "Eastern Khanty",
["kca-nor"] = "Northern Khanty",
["kca-pro"] = "Proto-Khanty",
["kca-sou"] = "Southern Khanty",
["kcb"] = "Kawacha",
["kcc"] = "Lubila",
["kcd"] = "Ngkâlmpw Kanum",
["kce"] = "Kaivi",
["kcf"] = "Ukaan",
["kcg"] = "Tyap",
["kch"] = "Vono",
["kci"] = "Kamantan",
["kcj"] = "Kobiana",
["kck"] = "Kalanga",
["kcl"] = "Kala",
["kcm"] = "Tar Gula",
["kcn"] = "Nubi",
["kco"] = "Kinalakna",
["kcp"] = "Kanga",
["kcq"] = "Kamo",
["kcr"] = "Katla",
["kcs"] = "Koenoem",
["kct"] = "Kaian",
["kcu"] = "Kikami",
["kcv"] = "Kete",
["kcw"] = "Kabwari",
["kcx"] = "Kachama-Ganjule",
["kcy"] = "Korandje",
["kcz"] = "Konongo",
["kda"] = "Worimi",
["kdc"] = "Kutu",
["kdd"] = "Yankunytjatjara",
["kde"] = "Makonde",
["kdf"] = "Mamusi",
["kdg"] = "Seba",
["kdh"] = "Tem",
["kdi"] = "Kumam",
["kdj"] = "Karamojong",
["kdk"] = "Numèè",
["kdl"] = "Tsikimba",
["kdm"] = "Kagoma",
["kdn"] = "Kunda",
["kdp"] = "Kaningdon-Nindem",
["kdq"] = "Koch",
["kdr"] = "Karaim",
["kdt"] = "Kuy",
["kdu"] = "Kadaru",
["kdv"] = "Kado",
["kdw"] = "Koneraw",
["kdx"] = "Kam",
["kdy"] = "Keder",
["kdz"] = "Kwaja",
["kea"] = "Kabuverdianu",
["keb"] = "Kélé",
["kec"] = "Keiga",
["ked"] = "Kerewe",
["kee"] = "Eastern Keres",
["kef"] = "Kpessi",
["keg"] = "Tese",
["keh"] = "Keak",
["kei"] = "Kei",
["kej"] = "Kadar",
["kek"] = "Q'eqchi",
["kel"] = "Kela-Yela",
["kem"] = "Kemak",
["ken"] = "Kenyang",
["keo"] = "Kakwa",
["kep"] = "Kaikadi",
["keq"] = "Kamar",
["ker"] = "Kera",
["kes"] = "Kugbo",
["ket"] = "Ket",
["keu"] = "Akebu",
["kev"] = "Kanikkaran",
["kew"] = "Kewa",
["kex"] = "Kukna",
["key"] = "Kupia",
["kez"] = "Kukele",
["kfa"] = "Kodava",
["kfb"] = "Kolami",
["kfc"] = "Konda-Dora",
["kfd"] = "Korra Koraga",
["kfe"] = "Kota (India)",
["kff"] = "Koya",
["kfg"] = "Kudiya",
["kfh"] = "Kurichiya",
["kfi"] = "Kannada Kurumba",
["kfj"] = "Kemiehua",
["kfk"] = "Kinnauri",
["kfl"] = "Kung",
["kfn"] = "Kuk",
["kfo"] = "Koro (West Africa)",
["kfp"] = "Korwa",
["kfq"] = "Korku",
["kfr"] = "Kachchi",
["kfs"] = "Bilaspuri",
["kft"] = "Kanjari",
["kfu"] = "Katkari",
["kfv"] = "Kurmukar",
["kfw"] = "Kharam Naga",
["kfx"] = "Kullu Pahari",
["kfy"] = "Kumaoni",
["kfz"] = "Koromfé",
["kg"] = "Kongo",
["kga"] = "Koyaga",
["kgb"] = "Kawe",
["kgd"] = "Kataang",
["kge"] = "Komering",
["kgf"] = "Kube",
["kgg"] = "Kusunda",
["kgi"] = "Selangor Sign Language",
["kgj"] = "Gamale Kham",
["kgk"] = "Kaiwá",
["kgl"] = "Kunggari",
["kgn"] = "Karingani",
["kgo"] = "Krongo",
["kgp"] = "Kaingang",
["kgq"] = "Kamoro",
["kgr"] = "Abun",
["kgs"] = "Kumbainggar",
["kgt"] = "Somyev",
["kgu"] = "Kobol",
["kgv"] = "Karas",
["kgw"] = "Karon Dori",
["kgx"] = "Kamaru",
["kgy"] = "Kyerung",
["kha"] = "Khasi",
["khb"] = "Lü",
["khc"] = "North Tukang Besi",
["khd"] = "Bädi Kanum",
["khe"] = "Korowai",
["khf"] = "Khuen",
["khh"] = "Kehu",
["khi-kho-pro"] = "Proto-Khoe",
["khi-kun"] = "ǃKung",
["khj"] = "Kuturmi",
["khl"] = "Lusi",
["khn"] = "Khandeshi",
["kho"] = "Khotanese",
["khp"] = "Kapauri",
["khq"] = "Koyra Chiini",
["khr"] = "Kharia",
["khs"] = "Kasua",
["kht"] = "Khamti",
["khu"] = "Nkhumbi",
["khv"] = "Khvarshi",
["khw"] = "Khowar",
["khx"] = "Kanu",
["khy"] = "Ekele",
["khz"] = "Keapara",
["ki"] = "Kikuyu",
["kia"] = "Kim",
["kib"] = "Koalib",
["kic"] = "Kickapoo",
["kid"] = "Koshin",
["kie"] = "Kibet",
["kif"] = "Eastern Parbate Kham",
["kig"] = "Kimaama",
["kih"] = "Kilmeri",
["kii"] = "Kitsai",
["kij"] = "Kilivila",
["kil"] = "Kariya",
["kim"] = "Tofa",
["kio"] = "Kiowa",
["kip"] = "Sheshi Kham",
["kiq"] = "Kosadle",
["kis"] = "Kis",
["kit"] = "Agob",
["kiv"] = "Kimbu",
["kiw"] = "Northeast Kiwai",
["kix"] = "Khiamniungan Naga",
["kiy"] = "Kirikiri",
["kiz"] = "Kisi",
["kj"] = "Kwanyama",
["kja"] = "Mlap",
["kjb"] = "Q'anjob'al",
["kjc"] = "Coastal Konjo",
["kjd"] = "Southern Kiwai",
["kje"] = "Kisar",
["kjg"] = "Khmu",
["kjh"] = "Khakas",
["kji"] = "Zabana",
["kjj"] = "Khinalug",
["kjk"] = "Highland Konjo",
["kjl"] = "Western Parbate Kham",
["kjm"] = "Kháng",
["kjn"] = "Kunjen",
["kjo"] = "Harijan Kinnauri",
["kjp"] = "Eastern Pwo",
["kjq"] = "Western Keres",
["kjr"] = "Kurudu",
["kjs"] = "East Kewa",
["kjt"] = "Phrae Pwo",
["kju"] = "Kashaya",
["kjx"] = "Ramopa",
["kjy"] = "Erave",
["kjz"] = "Bumthangkha",
["kk"] = "Kazakh",
["kka"] = "Kakanda",
["kkb"] = "Kwerisa",
["kkc"] = "Odoodee",
["kkd"] = "Kinuku",
["kke"] = "Kakabe",
["kkf"] = "Kalaktang Monpa",
["kkg"] = "Mabaka Valley Kalinga",
["kkh"] = "Khün",
["kki"] = "Kagulu",
["kkj"] = "Kako",
["kkk"] = "Kokota",
["kkl"] = "Kosarek Yale",
["kkm"] = "Kiong",
["kkn"] = "Kon Keu",
["kko"] = "Karko",
["kkp"] = "Koko-Bera",
["kkq"] = "Kaiku",
["kkr"] = "Kir-Balar",
["kks"] = "Kirfi",
["kkt"] = "Koi",
["kku"] = "Tumi",
["kkv"] = "Kangean",
["kkw"] = "Teke-Kukuya",
["kkx"] = "Kohin",
["kky"] = "Guugu Yimidhirr",
["kkz"] = "Kaska",
["kl"] = "Greenlandic",
["kla"] = "Klamath-Modoc",
["klb"] = "Kiliwa",
["klc"] = "Kolbila",
["kld"] = "Gamilaraay",
["kle"] = "Kulung",
["klf"] = "Kendeje",
["klg"] = "Tagakaulu Kalagan",
["klh"] = "Weliki",
["kli"] = "Kalumpang",
["klj"] = "Khalaj",
["klk"] = "Kono (Nigeria)",
["kll"] = "Kagan Kalagan",
["klm"] = "Kolom",
["kln"] = "Kalenjin",
["klo"] = "Kapya",
["klp"] = "Kamasa",
["klq"] = "Rumu",
["klr"] = "Khaling",
["kls"] = "Kalasha",
["klt"] = "Nukna",
["klu"] = "Klao",
["klv"] = "Maskelynes",
["klw"] = "Lindu",
["klx"] = "Koluwawa",
["kly"] = "Kalao",
["klz"] = "Kabola",
["km"] = "Khmer",
["kma"] = "Konni",
["kmb"] = "Kimbundu",
["kmc"] = "Southern Kam",
["kmd"] = "Madukayang Kalinga",
["kme"] = "Bakole",
["kmf"] = "Kare (New Guinea)",
["kmg"] = "Kâte",
["kmh"] = "Kalam",
["kmi"] = "Kami",
["kmj"] = "Kumarbhag Paharia",
["kmk"] = "Limos Kalinga",
["kml"] = "Tanudan Kalinga",
["kmm"] = "Kom (India)",
["kmn"] = "Awtuw",
["kmo"] = "Kwoma",
["kmp"] = "Gimme",
["kmq"] = "Kwama",
["kmr"] = "Northern Kurdish",
["kms"] = "Kamasau",
["kmt"] = "Kemtuik",
["kmu"] = "Kanite",
["kmv"] = "Karipúna Creole French",
["kmw"] = "Kumu",
["kmx"] = "Waboda",
["kmy"] = "Koma",
["kmz"] = "Khorasani Turkish",
["kn"] = "Kannada",
["kna"] = "Kanakuru",
["knb"] = "Lubuagan Kalinga",
["knd"] = "Konda",
["kne"] = "Kankanaey",
["knf"] = "Mankanya",
["kni"] = "Kanufi",
["knj"] = "Akatek",
["knk"] = "Kuranko",
["knl"] = "Keninjal",
["knm"] = "Kanamari",
["kno"] = "Kono (Sierra Leone)",
["knp"] = "Kwanja",
["knq"] = "Kintaq",
["knr"] = "Kaningra",
["kns"] = "Kensiu",
["knt"] = "Katukina",
["knu"] = "Kono (Guinea)",
["knv"] = "Tabo",
["knx"] = "Kendayan",
["kny"] = "Kanyok",
["knz"] = "Kalamsé",
["ko"] = "Korean",
["ko-ear"] = "Early Modern Korean",
["koa"] = "Konomala",
["koc"] = "Kpati",
["kod"] = "Kodi",
["koe"] = "Kacipo-Balesi",
["kof"] = "Kubi",
["kog"] = "Cogui",
["koh"] = "Koyo",
["koi"] = "Komi-Permyak",
["kok"] = "Konkani",
["kol"] = "Kol (New Guinea)",
["koo"] = "Konzo",
["kop"] = "Waube",
["koq"] = "Kota (Gabon)",
["kos"] = "Kosraean",
["kot"] = "Lagwan",
["kou"] = "Koke",
["kov"] = "Kudu-Camo",
["kow"] = "Kugama",
["koy"] = "Koyukon",
["koz"] = "Korak",
["kpa"] = "Kutto",
["kpb"] = "Mullu Kurumba",
["kpc"] = "Curripaco",
["kpd"] = "Koba",
["kpe"] = "Kpelle",
["kpf"] = "Komba",
["kpg"] = "Kapingamarangi",
["kph"] = "Kplang",
["kpi"] = "Kofei",
["kpj"] = "Karajá",
["kpk"] = "Kpan",
["kpl"] = "Kpala",
["kpm"] = "Koho",
["kpn"] = "Kepkiriwát",
["kpo"] = "Ikposo",
["kpq"] = "Korupun-Sela",
["kpr"] = "Korafe-Yegha",
["kps"] = "Tehit",
["kpt"] = "Karata",
["kpu"] = "Kafoa",
["kpv"] = "Komi-Zyrian",
["kpw"] = "Kobon",
["kpx"] = "Mountain Koiari",
["kpy"] = "Koryak",
["kpz"] = "Kupsabiny",
["kqa"] = "Mum",
["kqb"] = "Kovai",
["kqc"] = "Doromu-Koki",
["kqd"] = "Koy Sanjaq Surat",
["kqe"] = "Kalagan",
["kqf"] = "Kakabai",
["kqg"] = "Khe",
["kqh"] = "Kisankasa",
["kqi"] = "Koitabu",
["kqj"] = "Koromira",
["kqk"] = "Kotafon Gbe",
["kql"] = "Kyenele",
["kqm"] = "Khisa",
["kqn"] = "Kaonde",
["kqo"] = "Eastern Krahn",
["kqp"] = "Kimré",
["kqq"] = "Krenak",
["kqr"] = "Kimaragang",
["kqs"] = "Northern Kissi",
["kqt"] = "Klias River Kadazan",
["kqu"] = "Seroa",
["kqv"] = "Okolod",
["kqw"] = "Kandas",
["kqx"] = "Mser",
["kqy"] = "Koorete",
["kqz"] = "Korana",
["kr"] = "Kanuri",
["kra"] = "Kumhali",
["krb"] = "Karkin",
["krc"] = "Karachay-Balkar",
["krd"] = "Kairui-Midiki",
["kre"] = "Panará",
["krf"] = "Koro (Vanuatu)",
["krh"] = "Kurama",
["kri"] = "Krio",
["krj"] = "Kinaray-a",
["krk"] = "Kerek",
["krl"] = "Karelian",
["krm"] = "Krim",
["krn"] = "Sapo",
["kro-pro"] = "Proto-Kru",
["krp"] = "Korop",
["krr"] = "Kru'ng",
["krs"] = "Kresh",
["kru"] = "Kurux",
["krv"] = "Kavet",
["krw"] = "Western Krahn",
["krx"] = "Karon",
["kry"] = "Kryts",
["krz"] = "Sota Kanum",
["ks"] = "Kashmiri",
["ksa"] = "Shuwa-Zamani",
["ksb"] = "Shambala",
["ksc"] = "Southern Kalinga",
["ksd"] = "Tolai",
["kse"] = "Kuni",
["ksf"] = "Bafia",
["ksg"] = "Kusaghe",
["ksi"] = "Krisa",
["ksj"] = "Uare",
["ksk"] = "Kansa",
["ksl"] = "Kumalu",
["ksm"] = "Kumba",
["ksn"] = "Kasiguranin",
["kso"] = "Kofa",
["ksp"] = "Kaba",
["ksq"] = "Kwaami",
["ksr"] = "Borong",
["kss"] = "Southern Kissi",
["kst"] = "Winyé",
["ksu"] = "Khamyang",
["ksv"] = "Kusu",
["ksw"] = "S'gaw Karen",
["ksx"] = "Kedang",
["ksy"] = "Kharia Thar",
["ksz"] = "Kodaku",
["kta"] = "Katua",
["ktb"] = "Kambaata",
["ktc"] = "Kholok",
["ktd"] = "Kokata",
["ktf"] = "Kwami",
["ktg"] = "Kalkatungu",
["kth"] = "Karanga",
["kti"] = "North Muyu",
["ktj"] = "Plapo Krumen",
["ktk"] = "Kaniet",
["ktl"] = "Koroshi",
["ktm"] = "Kurti",
["ktn"] = "Karitiâna",
["kto"] = "Kuot",
["ktp"] = "Kaduo",
["ktq"] = "Katabaga",
["kts"] = "South Muyu",
["ktt"] = "Ketum",
["ktu"] = "Kituba",
["ktv"] = "Eastern Katu",
["ktw"] = "Kato",
["ktx"] = "Kaxararí",
["kty"] = "Kango",
["ktz"] = "Juǀ'hoan",
["ku-pro"] = "Proto-Kurdish",
["kub"] = "Kutep",
["kuc"] = "Kwinsu",
["kud"] = "Auhelawa",
["kue"] = "Kuman",
["kuf"] = "Western Katu",
["kug"] = "Kupa",
["kuh"] = "Kushi",
["kui"] = "Kuikúro",
["kuj"] = "Kuria",
["kuk"] = "Kepo'",
["kul"] = "Kulere",
["kum"] = "Kumyk",
["kun"] = "Kunama",
["kuo"] = "Kumukio",
["kup"] = "Kunimaipa",
["kuq"] = "Karipuna",
["kus"] = "Kusaal",
["kut"] = "Ktunaxa",
["kuu"] = "Upper Kuskokwim",
["kuv"] = "Kur",
["kuw"] = "Kpagua",
["kux"] = "Kukatja",
["kuy"] = "Kuuku-Ya'u",
["kuz"] = "Kunza",
["kva"] = "Bagvalal",
["kvb"] = "Kubu",
["kvc"] = "Kove",
["kvd"] = "Kui (Indonesia)",
["kve"] = "Kalabakan",
["kvf"] = "Kabalai",
["kvg"] = "Kuni-Boazi",
["kvh"] = "Komodo",
["kvi"] = "Kwang",
["kvj"] = "Psikye",
["kvk"] = "Korean Sign Language",
["kvl"] = "Brek Karen",
["kvm"] = "Kendem",
["kvn"] = "Border Kuna",
["kvo"] = "Dobel",
["kvp"] = "Kompane",
["kvq"] = "Geba Karen",
["kvr"] = "Kerinci",
["kvt"] = "Lahta Karen",
["kvu"] = "Yinbaw Karen",
["kvv"] = "Kola",
["kvw"] = "Wersing",
["kvx"] = "Parkari Koli",
["kvy"] = "Yintale Karen",
["kvz"] = "Tsakwambo",
["kw"] = "Cornish",
["kwa"] = "Dâw",
["kwb"] = "Baa",
["kwc"] = "Likwala",
["kwd"] = "Kwaio",
["kwe"] = "Kwerba",
["kwf"] = "Kwara'ae",
["kwg"] = "Sara Kaba Deme",
["kwh"] = "Kowiai",
["kwi"] = "Awa-Cuaiquer",
["kwj"] = "Kwanga",
["kwk"] = "Kwak'wala",
["kwl"] = "Kofyar",
["kwm"] = "Kwambi",
["kwn"] = "Kwangali",
["kwo"] = "Kwomtari",
["kwp"] = "Kodia",
["kwq"] = "Kwak",
["kwr"] = "Kwer",
["kws"] = "Kwese",
["kwt"] = "Kwesten",
["kwu"] = "Kwakum",
["kwv"] = "Sara Kaba Náà",
["kww"] = "Kwinti",
["kwx"] = "Khirwar",
["kwz"] = "Kwadi",
["kxa"] = "Kairiru",
["kxb"] = "Krobu",
["kxc"] = "Konso",
["kxd"] = "Brunei Malay",
["kxe"] = "Kakihum",
["kxf"] = "Manumanaw Karen",
["kxh"] = "Karo",
["kxi"] = "Keningau Murut",
["kxj"] = "Kulfa",
["kxk"] = "Zayein Karen",
["kxm"] = "Northern Khmer",
["kxn"] = "Kanowit",
["kxo"] = "Kanoé",
["kxp"] = "Wadiyara Koli",
["kxq"] = "Smärky Kanum",
["kxr"] = "Manus Koro",
["kxs"] = "Kangjia",
["kxt"] = "Koiwat",
["kxu"] = "Kui (India)",
["kxv"] = "Kuvi",
["kxw"] = "Konai",
["kxx"] = "Likuba",
["kxy"] = "Kayong",
["kxz"] = "Kerewo",
["ky"] = "Kyrgyz",
["kya"] = "Kwaya",
["kyb"] = "Butbut Kalinga",
["kyc"] = "Kyaka",
["kyd"] = "Karey",
["kye"] = "Krache",
["kyf"] = "Kouya",
["kyg"] = "Keyagana",
["kyh"] = "Karok",
["kyi"] = "Kiput",
["kyj"] = "Karao",
["kyk"] = "Kamayo",
["kyl"] = "Kalapuya",
["kym"] = "Kpatili",
["kyn"] = "Karolanos",
["kyo"] = "Kelon",
["kyp"] = "Kang",
["kyq"] = "Kenga",
["kyr"] = "Kuruáya",
["kys"] = "Baram Kayan",
["kyt"] = "Kayagar",
["kyu"] = "Western Kayah",
["kyv"] = "Kayort",
["kyw"] = "Kudmali",
["kyx"] = "Rapoisi",
["kyy"] = "Kambaira",
["kyz"] = "Kayabí",
["kza"] = "Western Karaboro",
["kzb"] = "Kaibobo",
["kzc"] = "Bondoukou Kulango",
["kzd"] = "Kadai",
["kzf"] = "Da'a Kaili",
["kzg"] = "Kikai",
["kzh"] = "Dongolawi",
["kzi"] = "Kelabit",
["kzj"] = "Coastal Kadazan",
["kzk"] = "Kazukuru",
["kzl"] = "Kayeli",
["kzm"] = "Kais",
["kzn"] = "Kokola",
["kzo"] = "Kaningi",
["kzp"] = "Kaidipang",
["kzq"] = "Kaike",
["kzr"] = "Karang",
["kzs"] = "Sugut Dusun",
["kzu"] = "Kayupulau",
["kzv"] = "Komyandaret",
["kzw"] = "Kariri",
["kzx"] = "Kamarian",
["kzy"] = "Kango-Sua",
["kzz"] = "Kalabra",
["la"] = "Latin",
["laa"] = "Lapuyan Subanun",
["lab"] = "Linear A",
["lac"] = "Lacandon",
["lad"] = "Ladino",
["lae"] = "Pattani",
["laf"] = "Lafofa",
["lag"] = "Langi",
["lah"] = "Lahnda",
["lai"] = "Lambya",
["laj"] = "Lango (Uganda)",
["lak"] = "Laka",
["lam"] = "Lamba",
["lan"] = "Laru",
["lap"] = "Kabba-Laka",
["laq"] = "Qabiao",
["lar"] = "Larteh",
["las"] = "Gur Lama",
["lau"] = "Laba",
["law"] = "Lauje",
["lax"] = "Tiwa",
["lay"] = "Lama Bai",
["laz"] = "Aribwatsa",
["lb"] = "Luxembourgish",
["lbb"] = "Label",
["lbc"] = "Lakkia",
["lbe"] = "Lak",
["lbf"] = "Tinani",
["lbg"] = "Laopang",
["lbi"] = "La'bi",
["lbj"] = "Ladakhi",
["lbk"] = "Central Bontoc",
["lbl"] = "Libon Bikol",
["lbm"] = "Lodhi",
["lbn"] = "Lamet",
["lbo"] = "Laven",
["lbq"] = "Wampar",
["lbr"] = "Northern Lorung",
["lbs"] = "Libyan Sign Language",
["lbt"] = "Lachi",
["lbu"] = "Labu",
["lbv"] = "Lavatbura-Lamusong",
["lbw"] = "Tolaki",
["lbx"] = "Lawangan",
["lby"] = "Lamu-Lamu",
["lbz"] = "Lardil",
["lcc"] = "Legenyem",
["lcd"] = "Lola",
["lce"] = "Loncong",
["lcf"] = "Lubu",
["lch"] = "Luchazi",
["lcl"] = "Lisela",
["lcm"] = "Tungag",
["lcp"] = "Western Lawa",
["lcq"] = "Luhu",
["lcs"] = "Lisabata-Nuniali",
["lda"] = "Kla",
["ldb"] = "Idun",
["ldd"] = "Luri (Nigeria)",
["ldg"] = "Lenyima",
["ldh"] = "Lamja-Dengsa-Tola",
["ldj"] = "Lemoro",
["ldk"] = "Leelau",
["ldl"] = "Kaan",
["ldm"] = "Landoma",
["ldn"] = "Láadan",
["ldo"] = "Loo",
["ldp"] = "Tso",
["ldq"] = "Lufu",
["lea"] = "Lega-Shabunda",
["leb"] = "Lala-Bisa",
["lec"] = "Leco",
["led"] = "Lendu",
["lee"] = "Lyélé",
["lef"] = "Lelemi",
["leh"] = "Lenje",
["lei"] = "Lemio",
["lej"] = "Lengola",
["lek"] = "Leipon",
["lel"] = "Lele (Congo)",
["lem"] = "Nomaande",
["len"] = "Honduran Lenca",
["leo"] = "Mengisa",
["lep"] = "Lepcha",
["leq"] = "Lembena",
["ler"] = "Lenkau",
["les"] = "Lese",
["let"] = "Lesing-Gelimi",
["leu"] = "Kara (New Guinea)",
["lev"] = "Lamma",
["lew"] = "Ledo Kaili",
["lex"] = "Luang",
["ley"] = "Lemolang",
["lez"] = "Lezgi",
["lfa"] = "Lefa",
["lfn"] = "Lingua Franca Nova",
["lg"] = "Luganda",
["lga"] = "Lungga",
["lgb"] = "Laghu",
["lgg"] = "Lugbara",
["lgh"] = "Laghuu",
["lgi"] = "Lengilu",
["lgk"] = "Neverver",
["lgl"] = "Wala",
["lgm"] = "Lega-Mwenga",
["lgn"] = "Opuuo",
["lgq"] = "Logba",
["lgr"] = "Lengo",
["lgs"] = "Guinea-Bissau Sign Language",
["lgt"] = "Pahi",
["lgu"] = "Longgu",
["lgz"] = "Ligenza",
["lha"] = "Laha (Vietnam)",
["lhh"] = "Laha (Indonesia)",
["lhi"] = "Lahu Shi",
["lhl"] = "Lahul Lohar",
["lhn"] = "Lahanan",
["lhp"] = "Lhokpu",
["lhs"] = "Mlahsö",
["lht"] = "Lo-Toga",
["lhu"] = "Lahu",
["li"] = "Limburgish",
["lia"] = "West-Central Limba",
["lib"] = "Likum",
["lic"] = "Hlai",
["lid"] = "Nyindrou",
["lie"] = "Likila",
["lif"] = "Limbu",
["lig"] = "Ligbi",
["lih"] = "Lihir",
["lii"] = "Lingkhim",
["lij"] = "Ligurian",
["lik"] = "Lika",
["lil"] = "Lillooet",
["lio"] = "Liki",
["lip"] = "Sekpele",
["liq"] = "Libido",
["lir"] = "Liberian Kreyol",
["lis"] = "Lisu",
["liu"] = "Logorik",
["liv"] = "Livonian",
["liw"] = "Col",
["lix"] = "Liabuku",
["liy"] = "Banda-Bambari",
["liz"] = "Libinza",
["lja"] = "Golpa",
["lje"] = "Rampi",
["lji"] = "Laiyolo",
["ljl"] = "Li'o",
["ljp"] = "Lampung Api",
["ljw"] = "Yirandali",
["ljx"] = "Yuru",
["lka"] = "Lakalei",
["lkb"] = "Kabras",
["lkc"] = "Kucong",
["lkd"] = "Lakondê",
["lke"] = "Kenyi",
["lkh"] = "Lakha",
["lki"] = "Laki",
["lkj"] = "Remun",
["lkl"] = "Laeko-Libuat",
["lkm"] = "Kalaamaya",
["lkn"] = "Lakon",
["lko"] = "Khayo",
["lkr"] = "Päri",
["lks"] = "Kisa",
["lkt"] = "Lakota",
["lku"] = "Kungkari",
["lky"] = "Lokoya",
["lla"] = "Lala-Roba",
["llb"] = "Lolo",
["llc"] = "Lele (Guinea)",
["lld"] = "Ladin",
["lle"] = "Lele (New Guinea)",
["llf"] = "Hermit",
["llg"] = "Lole",
["llh"] = "Lamu",
["lli"] = "Teke-Laali",
["llj"] = "Ladji-Ladji",
["llk"] = "Lelak",
["lll"] = "Lilau",
["llm"] = "Lasalimu",
["lln"] = "Lele (Chad)",
["llp"] = "North Efate",
["llq"] = "Lolak",
["lls"] = "Lithuanian Sign Language",
["llu"] = "Lau",
["llx"] = "Lauan",
["lma"] = "East Limba",
["lmb"] = "Merei",
["lmc"] = "Limilngan",
["lmd"] = "Lumun",
["lme"] = "Pévé",
["lmf"] = "South Lembata",
["lmg"] = "Lamogai",
["lmh"] = "Lambichhong",
["lmi"] = "Lombi",
["lmj"] = "West Lembata",
["lmk"] = "Lamkang",
["lml"] = "Raga",
["lmn"] = "Lambadi",
["lmo"] = "Lombard",
["lmp"] = "Limbum",
["lmq"] = "Lamatuka",
["lmr"] = "Lamalera",
["lmu"] = "Lamenu",
["lmv"] = "Lomaiviti",
["lmw"] = "Lake Miwok",
["lmx"] = "Laimbue",
["lmy"] = "Laboya",
["ln"] = "Lingala",
["lna"] = "Langbashe",
["lnb"] = "Mbalanhu",
["lnd"] = "Lun Bawang",
["lnh"] = "Lanoh",
["lni"] = "Daantanai'",
["lnj"] = "Linngithigh",
["lnl"] = "South Central Banda",
["lnm"] = "Pondi",
["lnn"] = "Lorediakarkar",
["lno"] = "Lango (Sudan)",
["lns"] = "Lamnso'",
["lnu"] = "Longuda",
["lnw"] = "Lanima",
["lo"] = "Lao",
["loa"] = "Loloda",
["lob"] = "Lobi",
["loc"] = "Inonhan",
["lod"] = "Berawan",
["loe"] = "Saluan",
["lof"] = "Logol",
["log"] = "Logo",
["loh"] = "Narim",
["loi"] = "Lomakka",
["loj"] = "Lou",
["lok"] = "Loko",
["lol"] = "Mongo",
["lom"] = "Loma",
["lon"] = "Malawi Lomwe",
["loo"] = "Lombo",
["lop"] = "Lopa",
["loq"] = "Lobala",
["lor"] = "Téén",
["los"] = "Loniu",
["lot"] = "Lotuko",
["lou"] = "Louisiana Creole",
["lov"] = "Lopi",
["low"] = "Tampias Lobu",
["lox"] = "Loun",
["loz"] = "Lozi",
["lpa"] = "Lelepa",
["lpe"] = "Lepki",
["lpn"] = "Long Phuri Naga",
["lpo"] = "Lipo",
["lpx"] = "Lopit",
["lra"] = "Rara Bakati'",
["lrc"] = "Northern Luri",
["lre"] = "Laurentian",
["lrg"] = "Laragia",
["lri"] = "Marachi",
["lrk"] = "Loarki",
["lrl"] = "Larestani",
["lrm"] = "Marama",
["lrn"] = "Lorang",
["lro"] = "Laro",
["lrr"] = "Southern Lorung",
["lrt"] = "Larantuka Malay",
["lrv"] = "Larëvat",
["lrz"] = "Lemerig",
["lsa"] = "Lasgerdi",
["lsb"] = "Burundian Sign Language",
["lsd"] = "Lishana Deni",
["lse"] = "Lusengo",
["lsh"] = "Lish",
["lsi"] = "Lashi",
["lsl"] = "Latvian Sign Language",
["lsm"] = "Saamia",
["lsn"] = "Tibetan Sign Language",
["lso"] = "Laos Sign Language",
["lsp"] = "Panamanian Sign Language",
["lsr"] = "Aruop",
["lss"] = "Lasi",
["lst"] = "Trinidad and Tobago Sign Language",
["lsv"] = "Sivia Sign Language",
["lsw"] = "Seychelles Sign Language",
["lsy"] = "Mauritian Sign Language",
["lt"] = "Lithuanian",
["ltc"] = "Middle Chinese",
["ltg"] = "Latgalian",
["lti"] = "Leti",
["ltn"] = "Latundê",
["lto"] = "Olutsotso",
["lts"] = "Lutachoni",
["ltu"] = "Latu",
["lu"] = "Luba-Katanga",
["lua"] = "Luba-Kasai",
["luc"] = "Aringa",
["lud"] = "Ludian",
["lue"] = "Luvale",
["luf"] = "Laua",
["luh"] = "Leizhou Min",
["lui"] = "Luiseño",
["luj"] = "Luna",
["luk"] = "Lunanakha",
["lul"] = "Olu'bo",
["lum"] = "Luimbi",
["lun"] = "Lunda",
["luo"] = "Luo",
["lup"] = "Lumbu",
["luq"] = "Lucumí",
["lur"] = "Laura",
["lus"] = "Mizo",
["lut"] = "Lushootseed",
["luu"] = "Lumba-Yakkha",
["luv"] = "Luwati",
["luy"] = "Luhya",
["luz"] = "Southern Luri",
["lv"] = "Latvian",
["lva"] = "Maku'a",
["lvi"] = "Lawi",
["lvk"] = "Lavukaleve",
["lvl"] = "Lwel",
["lvu"] = "Levuka",
["lwa"] = "Lwalu",
["lwe"] = "Lewo Eleng",
["lwg"] = "Wanga",
["lwh"] = "White Lachi",
["lwl"] = "Eastern Lawa",
["lwm"] = "Laomian",
["lwo"] = "Luwo",
["lws"] = "Malawian Sign Language",
["lwt"] = "Lewotobi",
["lwu"] = "Lawu",
["lww"] = "Lewo",
["lya"] = "Layakha",
["lyg"] = "Lyngngam",
["lyn"] = "Luyana",
["lzh"] = "Classical Chinese",
["lzl"] = "Litzlitz",
["lzn"] = "Leinong Naga",
["lzz"] = "Laz",
["maa"] = "San Jerónimo Tecóatl Mazatec",
["mab"] = "Yutanduchi Mixtec",
["mad"] = "Madurese",
["mae"] = "Bo-Rukul",
["maf"] = "Mafa",
["mag"] = "Magahi",
["mai"] = "Maithili",
["maj"] = "Jalapa de Díaz Mazatec",
["mak"] = "Makasar",
["mam"] = "Mam",
["man"] = "Mandingo",
["map-ata-pro"] = "Proto-Atayalic",
["map-bms"] = "Banyumasan",
["map-pro"] = "Proto-Austronesian",
["maq"] = "Chiquihuitlán Mazatec",
["mas"] = "Maasai",
["mat"] = "Matlatzinca",
["mau"] = "Huautla Mazatec",
["mav"] = "Sateré-Mawé",
["maw"] = "Mampruli",
["max"] = "North Moluccan Malay",
["maz"] = "Central Mazahua",
["mba"] = "Higaonon",
["mbb"] = "Western Bukidnon Manobo",
["mbc"] = "Macushi",
["mbd"] = "Dibabawon Manobo",
["mbe"] = "Molale",
["mbf"] = "Baba Malay",
["mbh"] = "Mangseng",
["mbi"] = "Ilianen Manobo",
["mbj"] = "Nadëb",
["mbk"] = "Malol",
["mbl"] = "Maxakalí",
["mbm"] = "Ombamba",
["mbn"] = "Macaguán",
["mbo"] = "Mbo (Cameroon)",
["mbp"] = "Wiwa",
["mbq"] = "Maisin",
["mbr"] = "Nukak Makú",
["mbs"] = "Sarangani Manobo",
["mbt"] = "Matigsalug Manobo",
["mbu"] = "Mbula-Bwazza",
["mbv"] = "Mbulungish",
["mbw"] = "Maring",
["mbx"] = "Mari (Sepik)",
["mby"] = "Memoni",
["mbz"] = "Amoltepec Mixtec",
["mca"] = "Maca",
["mcb"] = "Machiguenga",
["mcc"] = "Bitur",
["mcd"] = "Sharanahua",
["mce"] = "Itundujia Mixtec",
["mcf"] = "Matsés",
["mcg"] = "Mapoyo",
["mch"] = "Ye'kwana",
["mci"] = "Mese",
["mcj"] = "Mvanip",
["mck"] = "Mbunda",
["mcl"] = "Macaguaje",
["mcm"] = "Kristang",
["mcn"] = "Masana",
["mco"] = "Coatlán Mixe",
["mcp"] = "Makaa",
["mcq"] = "Ese",
["mcr"] = "Menya",
["mcs"] = "Mambai",
["mcu"] = "Cameroon Mambila",
["mcw"] = "Mawa",
["mcx"] = "Mpiemo",
["mcy"] = "South Watut",
["mcz"] = "Mawan",
["mda"] = "Mada (Nigeria)",
["mdb"] = "Morigi",
["mdc"] = "Male",
["mdd"] = "Mbum",
["mde"] = "Bura Mabang",
["mdf"] = "Moksha",
["mdg"] = "Massalat",
["mdh"] = "Maguindanao",
["mdi"] = "Mamvu",
["mdj"] = "Mangbetu",
["mdk"] = "Mangbutu",
["mdl"] = "Maltese Sign Language",
["mdm"] = "Mayogo",
["mdn"] = "Mbati",
["mdp"] = "Mbala",
["mdq"] = "Mbole",
["mdr"] = "Mandar",
["mds"] = "Maria",
["mdt"] = "Mbere",
["mdu"] = "Mboko",
["mdv"] = "Santa Lucía Monteverde Mixtec",
["mdw"] = "Mbosi",
["mdx"] = "Dizin",
["mdy"] = "Maale",
["mdz"] = "Suruí Do Pará",
["mea"] = "Menka",
["meb"] = "Ikobi-Mena",
["mec"] = "Mara",
["med"] = "Melpa",
["mee"] = "Mengen",
["mef"] = "Megam",
["meh"] = "Southwestern Tlaxiaco Mixtec",
["mei"] = "Midob",
["mej"] = "Meyah",
["mek"] = "Mekeo",
["mel"] = "Central Melanau",
["mem"] = "Mangala",
["men"] = "Mende (Sierra Leone)",
["meo"] = "Kedah Malay",
["mep"] = "Miriwoong",
["meq"] = "Merey",
["mer"] = "Meru",
["mes"] = "Masmaje",
["met"] = "Mato",
["meu"] = "Motu",
["mev"] = "Mano",
["mew"] = "Maaka",
["mey"] = "Hassaniya Arabic",
["mez"] = "Menominee",
["mfa"] = "Pattani Malay",
["mfb"] = "Bangka",
["mfc"] = "Mba",
["mfd"] = "Mendankwe-Nkwen",
["mfe"] = "Mauritian Creole",
["mff"] = "Naki",
["mfg"] = "Mixifore",
["mfh"] = "Matal",
["mfi"] = "Wandala",
["mfj"] = "Mefele",
["mfk"] = "North Mofu",
["mfl"] = "Putai",
["mfm"] = "Marghi South",
["mfn"] = "Cross River Mbembe",
["mfo"] = "Mbe",
["mfp"] = "Makassar Malay",
["mfq"] = "Moba",
["mfr"] = "Marrithiyel",
["mfs"] = "Mexican Sign Language",
["mft"] = "Mokerang",
["mfu"] = "Mbwela",
["mfv"] = "Mandjak",
["mfw"] = "Mulaha",
["mfx"] = "Melo",
["mfy"] = "Mayo",
["mfz"] = "Mabaan",
["mg"] = "Malagasy",
["mga"] = "Middle Irish",
["mgb"] = "Mararit",
["mgc"] = "Morokodo",
["mgd"] = "Moru",
["mge"] = "Mango",
["mgf"] = "Maklew",
["mgg"] = "Mpongmpong",
["mgh"] = "Makhuwa-Meetto",
["mgi"] = "Jili",
["mgj"] = "Abureni",
["mgk"] = "Mawes",
["mgl"] = "Maleu-Kilenge",
["mgm"] = "Mambae",
["mgn"] = "Mbangi",
["mgo"] = "Meta'",
["mgp"] = "Eastern Magar",
["mgq"] = "Malila",
["mgr"] = "Mambwe-Lungu",
["mgs"] = "Manda (Tanzania)",
["mgt"] = "Mwakai",
["mgu"] = "Mailu",
["mgv"] = "Matengo",
["mgw"] = "Matumbi",
["mgy"] = "Mbunga",
["mgz"] = "Mbugwe",
["mh"] = "Marshallese",
["mha"] = "Manda (India)",
["mhb"] = "Mahongwe",
["mhc"] = "Mocho",
["mhd"] = "Mbugu",
["mhe"] = "Besisi",
["mhf"] = "Mamaa",
["mhg"] = "Marrgu",
["mhi"] = "Ma'di",
["mhj"] = "Mogholi",
["mhk"] = "Mungaka",
["mhl"] = "Mauwake",
["mhm"] = "Makhuwa-Moniga",
["mhn"] = "Mòcheno",
["mho"] = "Mashi",
["mhp"] = "Balinese Malay",
["mhq"] = "Mandan",
["mhr"] = "Eastern Mari",
["mhs"] = "Buru (Indonesia)",
["mht"] = "Mandahuaca",
["mhu"] = "Taraon",
["mhw"] = "Mbukushu",
["mhx"] = "Lhao Vo",
["mhy"] = "Ma'anyan",
["mhz"] = "Mor (Austronesian)",
["mi"] = "Māori",
["mia"] = "Miami",
["mib"] = "Atatláhuca Mixtec",
["mic"] = "Mi'kmaq",
["mid"] = "Mandaic",
["mie"] = "Ocotepec Mixtec",
["mif"] = "Mofu-Gudur",
["mig"] = "San Miguel el Grande Mixtec",
["mih"] = "Chayuco Mixtec",
["mii"] = "Chigmecatitlán Mixtec",
["mij"] = "Mungbam",
["mik"] = "Mikasuki",
["mil"] = "Peñoles Mixtec",
["mim"] = "Alacatlatzala Mixtec",
["min"] = "Minangkabau",
["mio"] = "Pinotepa Nacional Mixtec",
["mip"] = "Apasco-Apoala Mixtec",
["miq"] = "Miskito",
["mir"] = "Isthmus Mixe",
["mis-hkl"] = "Kelantan Peranakan Hokkien",
["mis-idn"] = "Idiom Neutral",
["mis-isa"] = "Isaurian",
["mis-jie"] = "Jie",
["mis-jzh"] = "Jizhao",
["mis-kas"] = "Kassite",
["mis-mmd"] = "Mimi of Decorse",
["mis-mmn"] = "Mimi of Nachtigal",
["mis-phi"] = "Philistine",
["mis-rou"] = "Rouran",
["mis-tdl"] = "Turdulian",
["mis-tdt"] = "Turdetanian",
["mis-tnw"] = "Tangwang",
["mis-tuh"] = "Tuyuhun",
["mis-tuo"] = "Tuoba",
["mis-wuh"] = "Wuhuan",
["mis-xbi"] = "Xianbei",
["mis-xnu"] = "Xiongnu",
["mit"] = "Southern Puebla Mixtec",
["miu"] = "Cacaloxtepec Mixtec",
["miw"] = "Akoye",
["mix"] = "Mixtepec Mixtec",
["miy"] = "Ayutla Mixtec",
["miz"] = "Coatzospan Mixtec",
["mjb"] = "Makalero",
["mjc"] = "San Juan Colorado Mixtec",
["mjd"] = "Northwest Maidu",
["mje"] = "Muskum",
["mjg-mgl"] = "Mongghul",
["mjg-mgr"] = "Mangghuer",
["mji"] = "Kim Mun",
["mjj"] = "Mawak",
["mjk"] = "Matukar",
["mjl"] = "Mandeali",
["mjm"] = "Medebur",
["mjn"] = "Mebu",
["mjo"] = "Malankuravan",
["mjp"] = "Malapandaram",
["mjq"] = "Malaryan",
["mjr"] = "Malavedan",
["mjs"] = "Miship",
["mjt"] = "Sawriya Paharia",
["mju"] = "Manna-Dora",
["mjv"] = "Mannan",
["mjw"] = "Karbi",
["mjx"] = "Mahali",
["mjy"] = "Mahican",
["mjz"] = "Majhi",
["mk"] = "Macedonian",
["mka"] = "Mbre",
["mkb"] = "Mal Paharia",
["mkc"] = "Siliput",
["mke"] = "Mawchi",
["mkf"] = "Miya",
["mkg"] = "Mak (China)",
["mkh-asl-pro"] = "Proto-Aslian",
["mkh-ban-pro"] = "Proto-Bahnaric",
["mkh-kat-pro"] = "Proto-Katuic",
["mkh-khm-pro"] = "Proto-Khmuic",
["mkh-kmr-pro"] = "Proto-Khmeric",
["mkh-mmn"] = "Middle Mon",
["mkh-mnc-pro"] = "Proto-Monic",
["mkh-mvi"] = "Middle Vietnamese",
["mkh-pal-pro"] = "Proto-Palaungic",
["mkh-pea-pro"] = "Proto-Pearic",
["mkh-pkn-pro"] = "Proto-Pakanic",
["mkh-pro"] = "Proto-Mon-Khmer",
["mkh-vie-pro"] = "Proto-Vietic",
["mki"] = "Dhatki",
["mkj"] = "Mokilese",
["mkk"] = "Byep",
["mkl"] = "Mokole",
["mkm"] = "Moklen",
["mkn"] = "Kupang Malay",
["mko"] = "Mingang Doso",
["mkp"] = "Moikodi",
["mkq"] = "Bay Miwok",
["mkr"] = "Malas",
["mks"] = "Silacayoapan Mixtec",
["mkt"] = "Vamale",
["mku"] = "Konyanka Maninka",
["mkv"] = "Mav̋ea",
["mkx"] = "Cinamiguin Manobo",
["mky"] = "Taba",
["mkz"] = "Makasae",
["ml"] = "Malayalam",
["mla"] = "Tamambo",
["mlb"] = "Mbule",
["mlc"] = "Caolan",
["mle"] = "Manambu",
["mlf"] = "Mal",
["mlh"] = "Mape",
["mli"] = "Malimpung",
["mlj"] = "Miltu",
["mlk"] = "Ilwana",
["mll"] = "Malua Bay",
["mlm"] = "Mulam",
["mln"] = "Malango",
["mlo"] = "Mlomp",
["mlp"] = "Bargam",
["mlq"] = "Western Maninkakan",
["mlr"] = "Vame",
["mls"] = "Masalit",
["mlu"] = "To'abaita",
["mlv"] = "Mwotlap",
["mlw"] = "Moloko",
["mlx"] = "Malfaxal",
["mlz"] = "Malaynon",
["mma"] = "Mama",
["mmb"] = "Momina",
["mmc"] = "Michoacán Mazahua",
["mmd"] = "Maonan",
["mme"] = "Tirax",
["mmf"] = "Mundat",
["mmg"] = "North Ambrym",
["mmh"] = "Mehináku",
["mmi"] = "Hember Avu",
["mmj"] = "Majhwar",
["mmk"] = "Mukha-Dora",
["mml"] = "Man Met",
["mmm"] = "Maii",
["mmn"] = "Mamanwa",
["mmo"] = "Mangga Buang",
["mmp"] = "Musan",
["mmq"] = "Aisi",
["mmr"] = "Western Xiangxi Miao",
["mmt"] = "Malalamai",
["mmu"] = "Mmaala",
["mmv"] = "Miriti",
["mmw"] = "Emae",
["mmx"] = "Madak",
["mmy"] = "Migaama",
["mmz"] = "Mabaale",
["mn"] = "Mongolian",
["mna"] = "Mbula",
["mnb"] = "Muna",
["mnc"] = "Manchu",
["mnd"] = "Mondé",
["mne"] = "Naba",
["mnf"] = "Mundani",
["mng"] = "Eastern Mnong",
["mnh"] = "Mono (Congo)",
["mni"] = "Manipuri",
["mnj"] = "Munji",
["mnk"] = "Mandinka",
["mnl"] = "Tiale",
["mnm"] = "Mapena",
["mnn"] = "Southern Mnong",
["mnp"] = "Northern Min",
["mnq"] = "Minriq",
["mnr"] = "Mono (California)",
["mns-cen"] = "Central Mansi",
["mns-nor"] = "Northern Mansi",
["mns-pro"] = "Proto-Mansi",
["mns-sou"] = "Southern Mansi",
["mnt"] = "Maykulan",
["mnu"] = "Mer",
["mnv"] = "Rennellese",
["mnw"] = "Mon",
["mnw-tha"] = "Thai Mon",
["mnx"] = "Sougb",
["mny"] = "Manyawa",
["mnz"] = "Moni",
["moa"] = "Mwan",
["moc"] = "Mocoví",
["mod"] = "Mobilian",
["moe"] = "Montagnais",
["mog"] = "Mongondow",
["moh"] = "Mohawk",
["moi"] = "Mboi",
["moj"] = "Monzombo",
["mok"] = "Morori",
["mom"] = "Monimbo",
["moo"] = "Monom",
["mop"] = "Mopan Maya",
["moq"] = "Mor (Papuan)",
["mor"] = "Moro",
["mos"] = "Moore",
["mot"] = "Barí",
["mou"] = "Mogum",
["mov"] = "Mojave",
["mow"] = "Moi (Congo)",
["mox"] = "Molima",
["moy"] = "Shekkacho",
["moz"] = "Mukulu",
["mpa"] = "Mpoto",
["mpb"] = "Mullukmulluk",
["mpc"] = "Mangarayi",
["mpd"] = "Machinere",
["mpe"] = "Majang",
["mpg"] = "Marba",
["mph"] = "Maung",
["mpi"] = "Mpade",
["mpj"] = "Martu Wangka",
["mpk"] = "Mbara (Chad)",
["mpl"] = "Middle Watut",
["mpm"] = "Yosondúa Mixtec",
["mpn"] = "Mindiri",
["mpo"] = "Miu",
["mpp"] = "Migabac",
["mpq"] = "Matís",
["mpr"] = "Vangunu",
["mps"] = "Dadibi",
["mpt"] = "Mian",
["mpu"] = "Makuráp",
["mpv"] = "Mungkip",
["mpw"] = "Mapidian",
["mpx"] = "Misima-Paneati",
["mpy"] = "Mapia",
["mpz"] = "Mpi",
["mqa"] = "Maba",
["mqb"] = "Mbuko",
["mqc"] = "Mangole",
["mqe"] = "Matepi",
["mqf"] = "Momuna",
["mqg"] = "Kota Bangun Kutai Malay",
["mqh"] = "Tlazoyaltepec Mixtec",
["mqi"] = "Mariri",
["mqj"] = "Mamasa",
["mqk"] = "Rajah Kabunsuwan Manobo",
["mql"] = "Mbelime",
["mqm"] = "South Marquesan",
["mqn"] = "Moronene",
["mqo"] = "Modole",
["mqp"] = "Manipa",
["mqq"] = "Minokok",
["mqr"] = "Mander",
["mqs"] = "West Makian",
["mqt"] = "Mok",
["mqu"] = "Mandari",
["mqv"] = "Mosimo",
["mqw"] = "Murupi",
["mqx"] = "Mamuju",
["mqy"] = "Manggarai",
["mqz"] = "Malasanga",
["mr"] = "Marathi",
["mra"] = "Mlabri",
["mrb"] = "Sungwadia",
["mrc"] = "Maricopa",
["mrd"] = "Western Magar",
["mre"] = "Martha's Vineyard Sign Language",
["mrf"] = "Elseng",
["mrg"] = "Mising",
["mrh"] = "Mara Chin",
["mrj"] = "Western Mari",
["mrk"] = "Hmwaveke",
["mrl"] = "Mortlockese",
["mrm"] = "Mwerlap",
["mrn"] = "Cheke Holo",
["mro"] = "Mru",
["mrp"] = "Morouas",
["mrq"] = "North Marquesan",
["mrr"] = "Hill Maria",
["mrs"] = "Maragus",
["mrt"] = "Margi",
["mru"] = "Mono (Cameroon)",
["mrv"] = "Mangarevan",
["mrw"] = "Maranao",
["mrx"] = "Dineor",
["mry"] = "Karaga Mandaya",
["mrz"] = "Marind",
["ms"] = "Malay",
["msb"] = "Masbatenyo",
["msc"] = "Sankaran Maninka",
["msd"] = "Yucatec Maya Sign Language",
["mse"] = "Musey",
["msf"] = "Mekwei",
["msg"] = "Moraid",
["msi"] = "Sabah Malay",
["msj"] = "Ma",
["msk"] = "Mansaka",
["msl"] = "Molof",
["msm"] = "Agusan Manobo",
["msn"] = "Vurës",
["mso"] = "Mombum",
["msp"] = "Maritsauá",
["msq"] = "Caac",
["msr"] = "Mongolian Sign Language",
["mss"] = "West Masela",
["msu"] = "Musom",
["msv"] = "Maslam",
["msw"] = "Mansoanka",
["msx"] = "Moresada",
["msy"] = "Aruamu",
["msz"] = "Momare",
["mt"] = "Maltese",
["mta"] = "Cotabato Manobo",
["mtb"] = "Anyin Morofo",
["mtc"] = "Munit",
["mtd"] = "Mualang",
["mte"] = "Alu",
["mtf"] = "Murik (New Guinea)",
["mtg"] = "Una",
["mth"] = "Munggui",
["mti"] = "Maiwa (New Guinea)",
["mtj"] = "Moskona",
["mtk"] = "Mbe'",
["mtl"] = "Montol",
["mtm"] = "Mator",
["mtn"] = "Matagalpa",
["mto"] = "Totontepec Mixe",
["mtp"] = "Wichí Lhamtés Nocten",
["mtq"] = "Muong",
["mtr"] = "Mewari",
["mts"] = "Yora",
["mtt"] = "Mota",
["mtu"] = "Tututepec Mixtec",
["mtv"] = "Asaro'o",
["mtw"] = "Magahat",
["mtx"] = "Tidaá Mixtec",
["mty"] = "Nabi",
["mua"] = "Mundang",
["mub"] = "Mubi",
["muc"] = "Mbu'",
["mud"] = "Mednyj Aleut",
["mue"] = "Media Lengua",
["mug"] = "Musgu",
["muh"] = "Mündü",
["mui"] = "Musi",
["muj"] = "Mabire",
["mul"] = "Translingual",
["mum"] = "Maiwala",
["mun-pro"] = "Proto-Munda",
["muo"] = "Nyong",
["mup"] = "Malvi",
["muq"] = "Eastern Xiangxi Miao",
["mur"] = "Murle",
["mus"] = "Creek",
["mut"] = "Western Muria",
["muu"] = "Yaaku",
["muv"] = "Muthuvan",
["mux"] = "Bo-Ung",
["muy"] = "Muyang",
["muz"] = "Mursi",
["mva"] = "Manam",
["mvb"] = "Mattole",
["mvd"] = "Mamboru",
["mvg"] = "Yucuañe Mixtec",
["mvh"] = "Mire",
["mvi"] = "Miyako",
["mvk"] = "Mekmek",
["mvl"] = "Mbara (Australia)",
["mvm"] = "Muya",
["mvn"] = "Minaveha",
["mvo"] = "Marovo",
["mvp"] = "Duri",
["mvq"] = "Moere",
["mvr"] = "Marau",
["mvs"] = "Massep",
["mvt"] = "Mpotovoro",
["mvu"] = "Marfa",
["mvv"] = "Tagal Murut",
["mvw"] = "Machinga",
["mvx"] = "Meoswar",
["mvy"] = "Indus Kohistani",
["mvz"] = "Mesqan",
["mwa"] = "Mwatebu",
["mwb"] = "Juwal",
["mwc"] = "Are",
["mwe"] = "Mwera",
["mwf"] = "Murrinh-Patha",
["mwg"] = "Aiklep",
["mwh"] = "Mouk-Aria",
["mwi"] = "Labo",
["mwk"] = "Kita Maninkakan",
["mwl"] = "Mirandese",
["mwm"] = "Sar",
["mwn"] = "Nyamwanga",
["mwo"] = "Sungwadaga",
["mwp"] = "Kala Lagaw Ya",
["mwq"] = "Mün Chin",
["mwr"] = "Marwari",
["mws"] = "Mwimbi-Muthambi",
["mwt"] = "Moken",
["mwu"] = "Mittu",
["mwv"] = "Mentawai",
["mww"] = "White Hmong",
["mwz"] = "Moingi",
["mxa"] = "Northwest Oaxaca Mixtec",
["mxb"] = "Tezoatlán Mixtec",
["mxd"] = "Modang",
["mxe"] = "Mele-Fila",
["mxf"] = "Malgbe",
["mxg"] = "Mbangala",
["mxh"] = "Mvuba",
["mxi"] = "Mozarabic",
["mxj"] = "Miju",
["mxk"] = "Monumbo",
["mxl"] = "Maxi Gbe",
["mxm"] = "Meramera",
["mxn"] = "Moi (Indonesia)",
["mxo"] = "Mbowe",
["mxp"] = "Tlahuitoltepec Mixe",
["mxq"] = "Juquila Mixe",
["mxr"] = "Murik (Malaysia)",
["mxs"] = "Huitepec Mixtec",
["mxt"] = "Jamiltepec Mixtec",
["mxu"] = "Mada (Cameroon)",
["mxv"] = "Metlatónoc Mixtec",
["mxw"] = "Namo",
["mxx"] = "Mahou",
["mxy"] = "Southeastern Nochixtlán Mixtec",
["mxz"] = "Central Masela",
["my"] = "Burmese",
["myb"] = "Mbay",
["myc"] = "Mayeka",
["mye"] = "Myene",
["myf"] = "Bambassi",
["myg"] = "Manta",
["myh"] = "Makah",
["myj"] = "Mangayat",
["myk"] = "Mamara",
["myl"] = "Moma",
["mym"] = "Me'en",
["myn-chl"] = "Ch'olti'",
["myn-pro"] = "Proto-Mayan",
["myo"] = "Anfillo",
["myp"] = "Pirahã",
["myr"] = "Muniche",
["mys"] = "Mesmes",
["myu"] = "Mundurukú",
["myv"] = "Erzya",
["myw"] = "Muyuw",
["myx"] = "Masaba",
["myy"] = "Macuna",
["myz"] = "Classical Mandaic",
["mza"] = "Santa María Zacatepec Mixtec",
["mzb"] = "Northern Saharan Berber",
["mzc"] = "Madagascar Sign Language",
["mzd"] = "Malimba",
["mze"] = "Morawa",
["mzg"] = "Monastic Sign Language",
["mzh"] = "Wichí Lhamtés Güisnay",
["mzi"] = "Ixcatlán Mazatec",
["mzj"] = "Manya",
["mzk"] = "Nigeria Mambila",
["mzl"] = "Mazatlán Mixe",
["mzm"] = "Mumuye",
["mzn"] = "Mazanderani",
["mzo"] = "Matipuhy",
["mzp"] = "Movima",
["mzq"] = "Mori Atas",
["mzr"] = "Marúbo",
["mzs"] = "Macanese",
["mzt"] = "Mintil",
["mzu"] = "Inapang",
["mzv"] = "Manza",
["mzw"] = "Deg",
["mzx"] = "Mawayana",
["mzy"] = "Mozambican Sign Language",
["mzz"] = "Maiadomu",
["na"] = "Nauruan",
["naa"] = "Namla",
["nab"] = "Nambikwara",
["nac"] = "Narak",
["nae"] = "Naka'ela",
["naf"] = "Nabak",
["nag"] = "Naga Pidgin",
["nah"] = "Nahuatl",
["nai-ala"] = "Alazapa",
["nai-bay"] = "Bayogoula",
["nai-cal"] = "Calusa",
["nai-chi"] = "Chiquimulilla",
["nai-chu-pro"] = "Proto-Chumash",
["nai-cig"] = "Ciguayo",
["nai-ckn-pro"] = "Proto-Chinookan",
["nai-guz"] = "Guazacapán",
["nai-hit"] = "Hitchiti",
["nai-ipa"] = "Ipai",
["nai-jtp"] = "Jutiapa",
["nai-jum"] = "Jumaytepeque",
["nai-kat"] = "Kathlamet",
["nai-klp-pro"] = "Proto-Kalapuyan",
["nai-knm"] = "Konomihu",
["nai-kum"] = "Kumeyaay",
["nai-mac"] = "Macoris",
["nai-mdu-pro"] = "Proto-Maidun",
["nai-miz-pro"] = "Proto-Mixe-Zoque",
["nai-mus-pro"] = "Proto-Muskogean",
["nai-nao"] = "Naolan",
["nai-nrs"] = "New River Shasta",
["nai-okw"] = "Okwanuchu",
["nai-per"] = "Pericú",
["nai-pic"] = "Picuris",
["nai-plp-pro"] = "Proto-Plateau Penutian",
["nai-pom-pro"] = "Proto-Pomo",
["nai-qng"] = "Quinigua",
["nai-sca-pro"] = "Proto-Siouan-Catawban",
["nai-sin"] = "Sinacantán",
["nai-sln"] = "Salvadoran Lenca",
["nai-spt"] = "Sahaptin",
["nai-tap"] = "Tapachultec",
["nai-taw"] = "Tawasa",
["nai-teq"] = "Tequistlatec",
["nai-tip"] = "Tipai",
["nai-tot-pro"] = "Proto-Totozoquean",
["nai-tsi-pro"] = "Proto-Tsimshianic",
["nai-utn-pro"] = "Proto-Utian",
["nai-wai"] = "Waikuri",
["nai-wji"] = "Western Jicaque",
["nai-yup"] = "Yupiltepeque",
["naj"] = "Nalu",
["nak"] = "Nakanai",
["nal"] = "Nalik",
["nam"] = "Ngan'gityemerri",
["nan"] = "Min Nan",
["nan-dat"] = "Datian Min",
["nan-hbl"] = "Hokkien",
["nan-hlh"] = "Hailufeng Min",
["nan-lnx"] = "Longyan Min",
["nan-tws"] = "Teochew",
["nan-zhe"] = "Zhenan Min",
["nan-zsh"] = "Sanxiang Min",
["nao"] = "Naaba",
["nap"] = "Neapolitan",
["naq"] = "Khoekhoe",
["nar"] = "Iguta",
["nas"] = "Nasioi",
["nat"] = "Hungworo",
["naw"] = "Nawuri",
["nax"] = "Nakwi",
["nay"] = "Ngarrindjeri",
["naz"] = "Coatepec Nahuatl",
["nb"] = "Norwegian Bokmål",
["nba"] = "Nyemba",
["nbb"] = "Ndoe",
["nbc"] = "Chang",
["nbd"] = "Ngbinda",
["nbe"] = "Konyak Naga",
["nbg"] = "Nagarchal",
["nbh"] = "Ngamo",
["nbi"] = "Mao Naga",
["nbj"] = "Ngarinman",
["nbk"] = "Nake",
["nbm"] = "Ngbaka Ma'bo",
["nbn"] = "Kuri",
["nbo"] = "Nkukoli",
["nbp"] = "Nnam",
["nbq"] = "Nggem",
["nbr"] = "Numana",
["nbs"] = "Namibian Sign Language",
["nbt"] = "Na",
["nbu"] = "Rongmei Naga",
["nbv"] = "Ngamambo",
["nbw"] = "Southern Ngbandi",
["nby"] = "Ningera",
["nca"] = "Iyo",
["ncb"] = "Central Nicobarese",
["ncc"] = "Ponam",
["ncd"] = "Nachering",
["nce"] = "Yale",
["ncf"] = "Notsi",
["ncg"] = "Nisga'a",
["nch"] = "Central Huasteca Nahuatl",
["nci"] = "Classical Nahuatl",
["ncj"] = "Northern Puebla Nahuatl",
["nck"] = "Nakara",
["ncl"] = "Michoacán Nahuatl",
["ncm"] = "Nambo",
["ncn"] = "Nauna",
["nco"] = "Sibe",
["ncr"] = "Ncane",
["ncs"] = "Nicaraguan Sign Language",
["nct"] = "Chothe Naga",
["ncu"] = "Chumburung",
["ncx"] = "Central Puebla Nahuatl",
["ncz"] = "Natchez",
["nd"] = "Northern Ndebele",
["nda"] = "Ndasa",
["ndb"] = "Kenswei Nsei",
["ndc"] = "Ndau",
["ndd"] = "Nde-Nsele-Nta",
["ndf"] = "Nadruvian",
["ndg"] = "Ndengereko",
["ndh"] = "Ndali",
["ndi"] = "Chamba Leko",
["ndj"] = "Ndamba",
["ndk"] = "Ndaka",
["ndl"] = "Ndolo",
["ndm"] = "Ndam",
["ndn"] = "Ngundi",
["ndp"] = "Ndo",
["ndq"] = "Ndombe",
["ndr"] = "Ndoola",
["nds"] = "Low German",
["ndt"] = "Ndunga",
["ndu"] = "Dugun",
["ndv"] = "Ndut",
["ndw"] = "Ndobo",
["ndx"] = "Nduga",
["ndy"] = "Lutos",
["ndz"] = "Ndogo",
["ne"] = "Nepali",
["nea"] = "Eastern Ngad'a",
["neb"] = "Toura",
["nec"] = "Nedebang",
["ned"] = "Nde-Gbite",
["nee"] = "Kumak",
["nef"] = "Nefamese",
["neg"] = "Negidal",
["neh"] = "Nyenkha",
["nej"] = "Neko",
["nek"] = "Neku",
["nem"] = "Nemi",
["nen"] = "Nengone",
["neo"] = "Ná-Meo",
["neq"] = "North Central Mixe",
["ner"] = "Yahadian",
["nes"] = "Bhoti Kinnauri",
["net"] = "Nete",
["neu"] = "Neo",
["nev"] = "Nyaheun",
["new"] = "Newar",
["nex"] = "Neme",
["ney"] = "Neyo",
["nez"] = "Nez Perce",
["nfa"] = "Dhao",
["nfd"] = "Ahwai",
["nfl"] = "Äiwoo",
["nfr"] = "Nafaanra",
["nfu"] = "Mfumte",
["ng"] = "Ndonga",
["nga"] = "Ngbaka",
["ngb"] = "Northern Ngbandi",
["ngc"] = "Ngombe (Congo)",
["ngd"] = "Ngando (Central African Republic)",
["nge"] = "Ngemba",
["ngf-bin-pro"] = "Proto-Binanderean",
["ngf-pro"] = "Proto-Trans-New Guinea",
["ngg"] = "Ngbaka Manza",
["ngh"] = "Nǀuu",
["ngi"] = "Ngizim",
["ngj"] = "Ngie",
["ngk"] = "Ngalkbun",
["ngl"] = "Lomwe",
["ngm"] = "Ngatik Men's Creole",
["ngn"] = "Ngwo",
["ngo"] = "Ngoni",
["ngp"] = "Ngulu",
["ngq"] = "Ngoreme",
["ngr"] = "Nagu",
["ngs"] = "Gvoko",
["ngt"] = "Ngeq",
["ngu"] = "Guerrero Nahuatl",
["ngv"] = "Nagumi",
["ngw"] = "Ngwaba",
["ngx"] = "Nggwahyi",
["ngy"] = "Tibea",
["ngz"] = "Ngungwel",
["nha"] = "Nhanda",
["nhb"] = "Beng",
["nhc"] = "Tabasco Nahuatl",
["nhd"] = "Chiripá",
["nhe"] = "Eastern Huasteca Nahuatl",
["nhf"] = "Nhuwala",
["nhg"] = "Tetelcingo Nahuatl",
["nhh"] = "Nahari",
["nhi"] = "Zacatlán-Ahuacatlán-Tepetzintla Nahuatl",
["nhk"] = "Cosoleacaque Nahuatl",
["nhm"] = "Morelos Nahuatl",
["nhn"] = "Central Nahuatl",
["nho"] = "Takuu",
["nhp"] = "Pajapan Nahuatl",
["nhq"] = "Huaxcaleca Nahuatl",
["nhr"] = "Naro",
["nht"] = "Ometepec Nahuatl",
["nhu"] = "Noone",
["nhv"] = "Temascaltepec Nahuatl",
["nhw"] = "Western Huasteca Nahuatl",
["nhx"] = "Mecayapan Nahuatl",
["nhy"] = "Northern Oaxaca Nahuatl",
["nhz"] = "Santa María La Alta Nahuatl",
["nia"] = "Nias",
["nib"] = "Nakame",
["nic-bco-pro"] = "Proto-Benue-Congo",
["nic-bod-pro"] = "Proto-Bantoid",
["nic-eov-pro"] = "Proto-Eastern Oti-Volta",
["nic-gns-pro"] = "Proto-Gurunsi",
["nic-grf-pro"] = "Proto-Grassfields",
["nic-gur-pro"] = "Proto-Gur",
["nic-jkn-pro"] = "Proto-Jukunoid",
["nic-lcr-pro"] = "Proto-Lower Cross River",
["nic-ogo-pro"] = "Proto-Ogoni",
["nic-ovo-pro"] = "Proto-Oti-Volta",
["nic-plt-pro"] = "Proto-Plateau",
["nic-pro"] = "Proto-Niger-Congo",
["nic-ubg-pro"] = "Proto-Ubangian",
["nic-ucr-pro"] = "Proto-Upper Cross River",
["nic-vco-pro"] = "Proto-Volta-Congo",
["nid"] = "Ngandi",
["nie"] = "Niellim",
["nif"] = "Nek",
["nig"] = "Ngalakan",
["nih"] = "Nyiha",
["nii"] = "Nii",
["nij"] = "Ngaju",
["nik"] = "Southern Nicobarese",
["nil"] = "Nila",
["nim"] = "Nilamba",
["nin"] = "Ninzo",
["nio"] = "Nganasan",
["niq"] = "Nandi",
["nir"] = "Nimboran",
["nis"] = "Nimi",
["nit"] = "Southeastern Kolami",
["niu"] = "Niuean",
["niv"] = "Nivkh",
["niw"] = "Nimo",
["nix"] = "Hema",
["niy"] = "Ngiti",
["niz"] = "Ningil",
["nja"] = "Nzanyi",
["njb"] = "Nocte",
["njh"] = "Lotha Naga",
["nji"] = "Gudanji",
["njj"] = "Njen",
["njl"] = "Njalgulgule",
["njm"] = "Angami",
["njn"] = "Liangmai Naga",
["njo-jgl"] = "Chungli Ao",
["njo-mng"] = "Mongsen Ao",
["njr"] = "Njerep",
["njs"] = "Nisa",
["njt"] = "Ndyuka-Trio Pidgin",
["nju"] = "Ngadjunmaya",
["njx"] = "Kunyi",
["njy"] = "Njyem",
["njz"] = "Nyishi",
["nka"] = "Nkoya",
["nkb"] = "Khoibu Naga",
["nkc"] = "Nkongho",
["nkd"] = "Koireng",
["nke"] = "Duke",
["nkf"] = "Inpui Naga",
["nkg"] = "Nekgini",
["nkh"] = "Khezha Naga",
["nki"] = "Thangal Naga",
["nkj"] = "Nakai",
["nkk"] = "Nokuku",
["nkm"] = "Namat",
["nkn"] = "Nkangala",
["nko"] = "Nkonya",
["nkp"] = "Niuatoputapu",
["nkq"] = "Nkami",
["nkr"] = "Nukuoro",
["nks"] = "North Asmat",
["nkt"] = "Nyika",
["nku"] = "Bouna Kulango",
["nkw"] = "Nkutu",
["nkx"] = "Nkoroo",
["nkz"] = "Nkari",
["nl"] = "Dutch",
["nla"] = "Ngombale",
["nlc"] = "Nalca",
["nle"] = "East Nyala",
["nlg"] = "Gela",
["nli"] = "Grangali",
["nlj"] = "Nyali",
["nlk"] = "Ninia Yali",
["nll"] = "Nihali",
["nlm"] = "Mankiyali",
["nlo"] = "Ngul",
["nlq"] = "Lao Naga",
["nlu"] = "Nchumbulu",
["nlv"] = "Orizaba Nahuatl",
["nlw"] = "Walangama",
["nlx"] = "Nahali",
["nly"] = "Nyamal",
["nlz"] = "Nalögo",
["nma"] = "Maram Naga",
["nmb"] = "Big Nambas",
["nmc"] = "Ngam",
["nmd"] = "Ndumu",
["nme"] = "Mzieme Naga",
["nmf"] = "Tangkhul Naga",
["nmg"] = "Kwasio",
["nmh"] = "Monsang Naga",
["nmi"] = "Nyam",
["nmj"] = "Ngombe (Central African Republic)",
["nmk"] = "Namakura",
["nml"] = "Ndemli",
["nmm"] = "Manangba",
["nmn"] = "ǃXóõ",
["nmo"] = "Moyon Naga",
["nmp"] = "Nimanbur",
["nmq"] = "Nambya",
["nmr"] = "Nimbari",
["nms"] = "Letemboi",
["nmt"] = "Namonuito",
["nmu"] = "Northeast Maidu",
["nmv"] = "Ngamini",
["nmw"] = "Nimoa",
["nmx"] = "Nama",
["nmy"] = "Namuyi",
["nmz"] = "Nawdm",
["nn"] = "Norwegian Nynorsk",
["nna"] = "Nyangumarta",
["nnb"] = "Nande",
["nnc"] = "Nancere",
["nnd"] = "West Ambae",
["nne"] = "Ngandyera",
["nnf"] = "Ngaing",
["nng"] = "Maring Naga",
["nnh"] = "Ngiemboon",
["nni"] = "North Nuaulu",
["nnj"] = "Nyangatom",
["nnk"] = "Nankina",
["nnl"] = "Northern Rengma Naga",
["nnm"] = "Namia",
["nnn"] = "Ngete",
["nnp"] = "Wancho",
["nnq"] = "Ngindo",
["nnr"] = "Narungga",
["nnt"] = "Nanticoke",
["nnu"] = "Dwang",
["nnv"] = "Nukunu",
["nnw"] = "Southern Nuni",
["nnx"] = "Ngong",
["nny"] = "Nyangga",
["nnz"] = "Nda'nda'",
["no"] = "Norwegian",
["noa"] = "Woun Meu",
["noc"] = "Nuk",
["nod"] = "Northern Thai",
["noe"] = "Nimadi",
["nof"] = "Nomane",
["nog"] = "Nogai",
["noh"] = "Nomu",
["noi"] = "Noiri",
["noj"] = "Nonuya",
["nok"] = "Nooksack",
["nol"] = "Nomlaki",
["nom"] = "Nocamán",
["non"] = "Old Norse",
["nop"] = "Numanggang",
["noq"] = "Ngongo",
["nos"] = "Eastern Nisu",
["not"] = "Nomatsiguenga",
["nou"] = "Ewage-Notu",
["nov"] = "Novial",
["now"] = "Nyambo",
["noy"] = "Noy",
["noz"] = "Nayi",
["npa"] = "Nar Phu",
["npb"] = "Nupbikha",
["npg"] = "Ponyo",
["nph"] = "Phom",
["npl"] = "Southeastern Puebla Nahuatl",
["npn"] = "Mondropolon",
["npo"] = "Pochuri Naga",
["nps"] = "Nipsan",
["npu"] = "Puimei Naga",
["npx"] = "Noipä",
["npy"] = "Napu",
["nqg"] = "Ede Nago",
["nqk"] = "Kura Ede Nago",
["nql"] = "Ngendelengo",
["nqm"] = "Ndom",
["nqn"] = "Nen",
["nqo"] = "N'Ko",
["nqq"] = "Kyan-Karyaw Naga",
["nqy"] = "Akyaung Ari",
["nr"] = "Southern Ndebele",
["nra"] = "Ngom",
["nrb"] = "Nara",
["nrc"] = "Noric",
["nre"] = "Southern Rengma Naga",
["nrf"] = "Norman",
["nrg"] = "Narango",
["nri"] = "Chokri Naga",
["nrk"] = "Ngarla",
["nrl"] = "Ngarluma",
["nrm"] = "Narom",
["nrn"] = "Norn",
["nrp"] = "North Picene",
["nrr"] = "Norra",
["nrt"] = "Northern Kalapuya",
["nru"] = "Narua",
["nrx"] = "Ngurmbur",
["nrz"] = "Lala (New Guinea)",
["nsa"] = "Sangtam Naga",
["nsb"] = "Lower Nossob",
["nsc"] = "Nshi",
["nsd"] = "Southern Nisu",
["nse"] = "Nsenga",
["nsg"] = "Ngasa",
["nsh"] = "Ngoshie",
["nsi"] = "Nigerian Sign Language",
["nsk"] = "Naskapi",
["nsl"] = "Norwegian Sign Language",
["nsm"] = "Sema",
["nsn"] = "Nehan",
["nso"] = "Northern Sotho",
["nsp"] = "Nepalese Sign Language",
["nsq"] = "Northern Sierra Miwok",
["nsr"] = "Maritime Sign Language",
["nss"] = "Nali",
["nst"] = "Tangsa",
["nsu"] = "Sierra Negra Nahuatl",
["nsv"] = "Southwestern Nisu",
["nsw"] = "Navut",
["nsx"] = "Nsongo",
["nsy"] = "Nasal",
["nsz"] = "Nisenan",
["ntd"] = "Northern Tidung",
["ntg"] = "Ngantangarra",
["nti"] = "Natioro",
["ntj"] = "Ngaanyatjarra",
["ntk"] = "Ikoma",
["ntm"] = "Nateni",
["nto"] = "Ntomba",
["ntp"] = "Northern Tepehuan",
["ntr"] = "Delo",
["nts"] = "Natagaimas",
["ntu"] = "Natügu",
["ntw"] = "Nottoway",
["ntx"] = "Somra",
["nty"] = "Mantsi",
["nua"] = "Yuanga",
["nub-har"] = "Haraza",
["nub-pro"] = "Proto-Nubian",
["nuc"] = "Nukuini",
["nud"] = "Ngala",
["nue"] = "Ngundu",
["nuf"] = "Nusu",
["nug"] = "Nungali",
["nuh"] = "Ndunda",
["nui"] = "Ngumbi",
["nuj"] = "Nyole (Uganda)",
["nuk"] = "Nootka",
["nul"] = "Nusa Laut",
["num"] = "Niuafo'ou",
["nun"] = "Anong",
["nuo"] = "Nguôn",
["nup"] = "Nupe",
["nuq"] = "Nukumanu",
["nur"] = "Nuguria",
["nus"] = "Nuer",
["nut"] = "Nùng",
["nuu"] = "Ngbundu",
["nuv"] = "Northern Nuni",
["nuw"] = "Nguluwan",
["nux"] = "Mehek",
["nuy"] = "Nunggubuyu",
["nuz"] = "Tlamacazapa Nahuatl",
["nv"] = "Navajo",
["nvh"] = "Nasarian",
["nvm"] = "Namiae",
["nvo"] = "Nyokon",
["nwa"] = "Nawathinehena",
["nwb"] = "Nyabwa",
["nwc"] = "Classical Newar",
["nwe"] = "Ngwe",
["nwg"] = "Ngaiawang",
["nwi"] = "Southwest Tanna",
["nwm"] = "Nyamusa-Molo",
["nwo"] = "Nauo",
["nwr"] = "Nawaru",
["nwx"] = "Middle Newar",
["nwy"] = "Nottoway-Meherrin",
["nxa"] = "Nauete",
["nxd"] = "Ngando (Congo)",
["nxe"] = "Nage",
["nxg"] = "Ngadha",
["nxi"] = "Nindi",
["nxl"] = "South Nuaulu",
["nxm"] = "Numidian",
["nxn"] = "Ngawun",
["nxo"] = "Ndambomo",
["nxq"] = "Naxi",
["nxr"] = "Ninggerum",
["nxx"] = "Nafri",
["ny"] = "Chichewa",
["nyb"] = "Nyangbo",
["nyc"] = "Nyanga-li",
["nyd"] = "Nyole (Kenya)",
["nye"] = "Nyengo",
["nyf"] = "Giryama",
["nyg"] = "Nyindu",
["nyh"] = "Nyigina",
["nyi"] = "Nyimang",
["nyj"] = "Nyanga (Congo)",
["nyk"] = "Nyaneka",
["nyl"] = "Nyeu",
["nym"] = "Nyamwezi",
["nyn"] = "Nyankole",
["nyo"] = "Nyoro",
["nyp"] = "Nyang'i",
["nys"] = "Nyunga",
["nyt"] = "Nyawaygi",
["nyu"] = "Nyungwe",
["nyv"] = "Nyulnyul",
["nyw"] = "Nyaw",
["nyx"] = "Nganyaywana",
["nyy"] = "Nyakyusa",
["nza"] = "Tigon Mbembe",
["nzb"] = "Njebi",
["nzd"] = "Nzadi",
["nzi"] = "Nzima",
["nzk"] = "Nzakara",
["nzm"] = "Zeme Naga",
["nzs"] = "New Zealand Sign Language",
["nzu"] = "Central Teke",
["nzy"] = "Nzakambay",
["nzz"] = "Nanga Dama Dogon",
["oaa"] = "Orok",
["oac"] = "Oroch",
["oak"] = "Noakhali",
["oav"] = "Old Avar",
["obi"] = "Obispeño",
["obk"] = "Southern Bontoc",
["obl"] = "Oblo",
["obm"] = "Moabite",
["obo"] = "Obo Manobo",
["obr"] = "Old Burmese",
["obt"] = "Old Breton",
["obu"] = "Obulom",
["oc"] = "Occitan",
["oca"] = "Ocaina",
["och"] = "Old Chinese",
["ocm"] = "Old Cham",
["oco"] = "Old Cornish",
["ocu"] = "Tlahuica",
["oda"] = "Odut",
["odk"] = "Od",
["odt"] = "Old Dutch",
["odu"] = "Odual",
["ofo"] = "Ofo",
["ofs"] = "Old Frisian",
["ofu"] = "Efutop",
["ogb"] = "Ogbia",
["ogc"] = "Ogbah",
["oge"] = "Old Georgian",
["ogg"] = "Ogbogolo",
["ogo"] = "Khana",
["ogu"] = "Ogbronuagum",
["ohu"] = "Old Hungarian",
["oia"] = "Oirata",
["oin"] = "Inebu One",
["oj"] = "Ojibwe",
["ojb"] = "Northwestern Ojibwa",
["ojc"] = "Central Ojibwa",
["ojg"] = "Eastern Ojibwa",
["ojp"] = "Old Japanese",
["ojs"] = "Severn Ojibwa",
["ojv"] = "Ontong Java",
["ojw"] = "Western Ojibwa",
["oka"] = "Okanagan",
["okb"] = "Okobo",
["okd"] = "Okodia",
["oke"] = "Okpe (Southwestern Edo)",
["okg"] = "Kok-Paponk",
["okh"] = "Koresh-e Rostam",
["oki"] = "Okiek",
["okj"] = "Oko-Juwoi",
["okk"] = "Kwamtim One",
["okl"] = "Old Kentish Sign Language",
["okm"] = "Middle Korean",
["okn"] = "Okinoerabu",
["oko"] = "Old Korean",
["okr"] = "Kirike",
["oks"] = "Oko-Eni-Osayen",
["oku"] = "Oku",
["okv"] = "Orokaiva",
["okx"] = "Okpe (Northwestern Edo)",
["okz"] = "Old Khmer",
["old"] = "Mochi",
["ole"] = "Olekha",
["olm"] = "Oloma",
["olo"] = "Livvi",
["olr"] = "Olrat",
["olt"] = "Old Lithuanian",
["olu"] = "Kuvale",
["om"] = "Oromo",
["oma"] = "Omaha-Ponca",
["omb"] = "Omba",
["omc"] = "Mochica",
["omg"] = "Omagua",
["omi"] = "Omi",
["omk"] = "Omok",
["oml"] = "Ombo",
["omn"] = "Minoan",
["omo"] = "Utarmbung",
["omp"] = "Old Manipuri",
["omq-cha-pro"] = "Proto-Chatino",
["omq-maz-pro"] = "Proto-Mazatec",
["omq-mix-pro"] = "Proto-Mixtecan",
["omq-mxt-pro"] = "Proto-Mixtec",
["omq-otp-pro"] = "Proto-Oto-Pamean",
["omq-pro"] = "Proto-Oto-Manguean",
["omq-sjq"] = "San Juan Quiahije Chatino",
["omq-tel"] = "Teposcolula Mixtec",
["omq-teo"] = "Teojomulco Chatino",
["omq-tri-pro"] = "Proto-Triqui",
["omq-zap-pro"] = "Proto-Zapotecan",
["omq-zpc-pro"] = "Proto-Zapotec",
["omr"] = "Old Marathi",
["omt"] = "Omotik",
["omu"] = "Omurano",
["omv-aro-pro"] = "Proto-Aroid",
["omv-diz-pro"] = "Proto-Dizoid",
["omv-pro"] = "Proto-Omotic",
["omw"] = "South Tairora",
["omx"] = "Old Mon",
["ona"] = "Selk'nam",
["onb"] = "Lingao",
["one"] = "Oneida",
["ong"] = "Olo",
["oni"] = "Onin",
["onj"] = "Onjob",
["onk"] = "Kabore One",
["onn"] = "Onobasulu",
["ono"] = "Onondaga",
["onp"] = "Sartang",
["onr"] = "Northern One",
["ons"] = "Ono",
["onu"] = "Unua",
["onw"] = "Old Nubian",
["onx"] = "Pidgin Onin",
["ood"] = "O'odham",
["oog"] = "Ong",
["oon"] = "Önge",
["oor"] = "Oorlams",
["opa"] = "Okpamheri",
["opk"] = "Kopkaka",
["opm"] = "Oksapmin",
["opo"] = "Opao",
["opt"] = "Opata",
["opy"] = "Ofayé",
["or"] = "Odia",
["ora"] = "Oroha",
["ore"] = "Orejón",
["org"] = "Oring",
["orh"] = "Oroqen",
["oro"] = "Orokolo",
["orr"] = "Oruma",
["ort"] = "Adivasi Odia",
["oru"] = "Ormuri",
["orv"] = "Old East Slavic",
["orw"] = "Oro Win",
["orx"] = "Oro",
["orz"] = "Ormu",
["os"] = "Ossetian",
["osa"] = "Osage",
["osc"] = "Oscan",
["osi"] = "Osing",
["osn"] = "Old Sundanese",
["oso"] = "Ososo",
["osp"] = "Old Spanish",
["ost"] = "Osatu",
["osu"] = "Southern One",
["osx"] = "Old Saxon",
["ota"] = "Ottoman Turkish",
["otb"] = "Old Tibetan",
["otd"] = "Ot Danum",
["ote"] = "Mezquital Otomi",
["oti"] = "Oti",
["otk"] = "Old Turkic",
["otl"] = "Tilapa Otomi",
["otm"] = "Eastern Highland Otomi",
["otn"] = "Tenango Otomi",
["oto-otm-pro"] = "Proto-Otomi",
["oto-pro"] = "Proto-Otomian",
["otq"] = "Querétaro Otomi",
["otr"] = "Otoro",
["ots"] = "Estado de México Otomi",
["ott"] = "Temoaya Otomi",
["otu"] = "Otuke",
["otw"] = "Ottawa",
["otx"] = "Texcatepec Otomi",
["oty"] = "Old Tamil",
["otz"] = "Ixtenco Otomi",
["oub"] = "Glio-Oubi",
["oue"] = "Oune",
["oui"] = "Old Uyghur",
["oum"] = "Ouma",
["ovd"] = "Elfdalian",
["owi"] = "Owiniga",
["owl"] = "Old Welsh",
["oyb"] = "Oy",
["oyd"] = "Oyda",
["oym"] = "Wayampi",
["oyy"] = "Oya'oya",
["ozm"] = "Koonzime",
["pa"] = "Punjabi",
["paa-kmn"] = "Kómnzo",
["paa-kwn"] = "Kuwani",
["paa-lei"] = "Leitre",
["paa-nha-pro"] = "Proto-North Halmahera",
["paa-nun"] = "Nungon",
["pab"] = "Pareci",
["pac"] = "Pacoh",
["pad"] = "Paumarí",
["pae"] = "Pagibete",
["paf"] = "Paranawát",
["pag"] = "Pangasinan",
["pah"] = "Tenharim",
["pai"] = "Pe",
["pak"] = "Parakanã",
["pal"] = "Middle Persian",
["pam"] = "Kapampangan",
["pao"] = "Northern Paiute",
["pap"] = "Papiamentu",
["paq"] = "Parya",
["par"] = "Panamint",
["pas"] = "Papasena",
["pau"] = "Palauan",
["pav"] = "Wari'",
["paw"] = "Pawnee",
["pax"] = "Pankararé",
["pay"] = "Pech",
["paz"] = "Pankararú",
["pbb"] = "Páez",
["pbc"] = "Patamona",
["pbe"] = "Mezontla Popoloca",
["pbf"] = "Coyotepec Popoloca",
["pbg"] = "Paraujano",
["pbh"] = "Panare",
["pbi"] = "Podoko",
["pbl"] = "Mak (Nigeria)",
["pbm"] = "Puebla Mazatec",
["pbn"] = "Kpasam",
["pbo"] = "Papel",
["pbp"] = "Badyara",
["pbr"] = "Pangwa",
["pbs"] = "Central Pame",
["pbv"] = "Pnar",
["pby"] = "Pyu (New Guinea)",
["pca"] = "Santa Inés Ahuatempan Popoloca",
["pcb"] = "Pear",
["pcc"] = "Bouyei",
["pcd"] = "Picard",
["pce"] = "Ruching Palaung",
["pcf"] = "Paliyan",
["pcg"] = "Paniya",
["pch"] = "Pardhan",
["pci"] = "Duruwa",
["pcj"] = "Parenga",
["pck"] = "Paite",
["pcl"] = "Pardhi",
["pcm"] = "Nigerian Pidgin",
["pcn"] = "Piti",
["pcp"] = "Pacahuara",
["pcw"] = "Pyapun",
["pda"] = "Anam",
["pdc"] = "Pennsylvania German",
["pdi"] = "Pa Di",
["pdn"] = "Fedan",
["pdo"] = "Padoe",
["pdt"] = "Plautdietsch",
["pdu"] = "Kayan",
["pea"] = "Peranakan Indonesian",
["peb"] = "Eastern Pomo",
["ped"] = "Mala (New Guinea)",
["pee"] = "Taje",
["pef"] = "Northeastern Pomo",
["peg"] = "Pengo",
["peh"] = "Bonan",
["pei"] = "Chichimeca-Jonaz",
["pej"] = "Northern Pomo",
["pek"] = "Penchal",
["pel"] = "Pekal",
["pem"] = "Phende",
["peo"] = "Old Persian",
["pep"] = "Kunja",
["peq"] = "Southern Pomo",
["pev"] = "Pémono",
["pex"] = "Petats",
["pey"] = "Petjo",
["pez"] = "Eastern Penan",
["pfa"] = "Pááfang",
["pfe"] = "Peere",
["pga"] = "Juba Arabic",
["pgd"] = "Gandhari",
["pgg"] = "Pangwali",
["pgi"] = "Pagi",
["pgk"] = "Rerep",
["pgl"] = "Primitive Irish",
["pgn"] = "Paelignian",
["pgs"] = "Pangseng",
["pgu"] = "Pagu",
["pgz"] = "Papua New Guinean Sign Language",
["pha"] = "Pa-Hng",
["phd"] = "Phudagi",
["phg"] = "Phuong",
["phh"] = "Phukha",
["phi-din"] = "Dinapigue Agta",
["phi-kal-pro"] = "Proto-Kalamian",
["phi-nag"] = "Nagtipunan Agta",
["phi-pro"] = "Proto-Philippine",
["phk"] = "Phake",
["phl"] = "Palula",
["phm"] = "Phimbi",
["phn"] = "Phoenician",
["pho"] = "Phunoi",
["phq"] = "Phana'",
["phr"] = "Pahari-Potwari",
["pht"] = "Phu Thai",
["phu"] = "Phuan",
["phv"] = "Pahlavani",
["phw"] = "Phangduwali",
["pi"] = "Pali",
["pia"] = "Pima Bajo",
["pib"] = "Yine",
["pic"] = "Pinji",
["pid"] = "Piaroa",
["pie"] = "Piro",
["pif"] = "Pingelapese",
["pig"] = "Pisabo",
["pih"] = "Pitcairn-Norfolk",
["pii"] = "Pini",
["pij"] = "Pijao",
["pil"] = "Yom",
["pim"] = "Powhatan",
["pin"] = "Piame",
["pio"] = "Piapoco",
["pip"] = "Pero",
["pir"] = "Piratapuyo",
["pis"] = "Pijin",
["pit"] = "Pitta-Pitta",
["piu"] = "Pintupi-Luritja",
["piv"] = "Pileni",
["piw"] = "Pimbwe",
["pix"] = "Piu",
["piy"] = "Piya-Kwonci",
["piz"] = "Pije",
["pjt"] = "Pitjantjatjara",
["pkb"] = "Kipfokomo",
["pkc"] = "Baekje",
["pkg"] = "Pak-Tong",
["pkh"] = "Pankhu",
["pkn"] = "Pakanha",
["pko"] = "Pökoot",
["pkp"] = "Pukapukan",
["pkr"] = "Attapady Kurumba",
["pks"] = "Pakistan Sign Language",
["pkt"] = "Maleng",
["pku"] = "Paku",
["pl"] = "Polish",
["pla"] = "Miani",
["plb"] = "Polonombauk",
["plc"] = "Central Palawano",
["ple"] = "Palu'e",
["plg"] = "Pilagá",
["plh"] = "Paulohi",
["plj"] = "Polci",
["plk"] = "Kohistani Shina",
["pll"] = "Shwe Palaung",
["pln"] = "Palenquero",
["plo"] = "Oluta Popoluca",
["plq"] = "Palaic",
["plr"] = "Palaka",
["pls"] = "San Marcos Tlalcoyalco Popoloca",
["plu"] = "Palikur",
["plv"] = "Southwest Palawano",
["plw"] = "Brooke's Point Palawano",
["ply"] = "Bolyu",
["plz"] = "Paluan",
["pma"] = "Paamese",
["pmb"] = "Pambia",
["pmd"] = "Pallanganmiddang",
["pme"] = "Pwaamèi",
["pmf"] = "Pamona",
["pmi"] = "Northern Pumi",
["pmj"] = "Southern Pumi",
["pmk"] = "Pamlico",
["pml"] = "Sabir",
["pmm"] = "Pol",
["pmn"] = "Pam",
["pmo"] = "Pom",
["pmq"] = "Northern Pame",
["pmr"] = "Manat",
["pms"] = "Piedmontese",
["pmt"] = "Tuamotuan",
["pmu"] = "Mirpur Panjabi",
["pmw"] = "Plains Miwok",
["pmx"] = "Poumei Naga",
["pmy"] = "Papuan Malay",
["pmz"] = "Southern Pame",
["pna"] = "Punan Bah-Biau",
["pnc"] = "Pannei",
["pnd"] = "Mpinda",
["pne"] = "Western Penan",
["png"] = "Pongu",
["pnh"] = "Penrhyn",
["pni"] = "Aoheng",
["pnj"] = "Pinjarup",
["pnk"] = "Paunaka",
["pnl"] = "Paleni",
["pnm"] = "Punan Batu",
["pnn"] = "Pinai-Hagahai",
["pno"] = "Panobo",
["pnp"] = "Pancana",
["pnq"] = "Pana (West Africa)",
["pnr"] = "Panim",
["pns"] = "Ponosakan",
["pnt"] = "Pontic Greek",
["pnu"] = "Jiongnai Bunu",
["pnv"] = "Pinigura",
["pnw"] = "Panyjima",
["pnx"] = "Phong-Kniang",
["pny"] = "Pinyin",
["pnz"] = "Pana (Central Africa)",
["poc"] = "Poqomam",
["poe"] = "San Juan Atzingo Popoloca",
["pof"] = "Poke",
["pog"] = "Potiguára",
["poh"] = "Poqomchi'",
["poi"] = "Highland Popoluca",
["pok"] = "Pokangá",
["pom"] = "Southeastern Pomo",
["pon"] = "Pohnpeian",
["poo"] = "Central Pomo",
["pop"] = "Pwapwâ",
["poq"] = "Texistepec Popoluca",
["pos"] = "Sayula Popoluca",
["pot"] = "Potawatomi",
["pov"] = "Guinea-Bissau Creole",
["pow"] = "San Felipe Otlaltepec Popoloca",
["pox"] = "Polabian",
["poy"] = "Pogolo",
["poz-abi"] = "Abai",
["poz-bal"] = "Baliledo",
["poz-btk-pro"] = "Proto-Bungku-Tolaki",
["poz-cet-pro"] = "Proto-Central-Eastern Malayo-Polynesian",
["poz-hce-pro"] = "Proto-Halmahera-Cenderawasih",
["poz-lgx-pro"] = "Proto-Lampungic",
["poz-mcm-pro"] = "Proto-Malayo-Chamic",
["poz-mic-pro"] = "Proto-Micronesian",
["poz-mly-pro"] = "Proto-Malayic",
["poz-msa-pro"] = "Proto-Malayo-Sumbawan",
["poz-oce-pro"] = "Proto-Oceanic",
["poz-pep-pro"] = "Proto-Eastern Polynesian",
["poz-pnp-pro"] = "Proto-Nuclear Polynesian",
["poz-pol-pro"] = "Proto-Polynesian",
["poz-pro"] = "Proto-Malayo-Polynesian",
["poz-sml"] = "Sarawak Malay",
["poz-ssw-pro"] = "Proto-South Sulawesi",
["poz-swa-pro"] = "Proto-North Sarawak",
["poz-ter"] = "Terengganu Malay",
["ppa"] = "Pao",
["ppe"] = "Papi",
["ppi"] = "Paipai",
["ppk"] = "Uma",
["ppl"] = "Pipil",
["ppm"] = "Papuma",
["ppn"] = "Papapana",
["ppo"] = "Folopa",
["ppq"] = "Pei",
["pps"] = "San Luís Temalacayuca Popoloca",
["ppt"] = "Pa",
["ppu"] = "Papora",
["pqa"] = "Pa'a",
["pqe-pro"] = "Proto-Eastern Malayo-Polynesian",
["pqm"] = "Malecite-Passamaquoddy",
["pra"] = "Prakrit",
["pra-niy"] = "Niya Prakrit",
["prc"] = "Parachi",
["pre"] = "Principense",
["prf"] = "Paranan",
["prg"] = "Old Prussian",
["prh"] = "Porohanon",
["pri"] = "Paicî",
["prk"] = "Parauk",
["prl"] = "Peruvian Sign Language",
["prm"] = "Kibiri",
["prn"] = "Prasuni",
["pro"] = "Old Occitan",
["prq"] = "Perené Ashéninka",
["prr"] = "Puri",
["prt"] = "Phai",
["pru"] = "Puragi",
["prw"] = "Parawen",
["prx"] = "Purik",
["prz"] = "Providencia Sign Language",
["ps"] = "Pashto",
["psa"] = "Asue Awyu",
["psc"] = "Persian Sign Language",
["psd"] = "Plains Indian Sign Language",
["pse"] = "Central Malay",
["psg"] = "Penang Sign Language",
["psh"] = "Southwest Pashayi",
["psi"] = "Southeast Pashayi",
["psl"] = "Puerto Rican Sign Language",
["psm"] = "Pauserna",
["psn"] = "Panasuan",
["pso"] = "Polish Sign Language",
["psp"] = "Philippine Sign Language",
["psq"] = "Pasi",
["psr"] = "Portuguese Sign Language",
["pss"] = "Kaulong",
["psw"] = "Port Sandwich",
["psy"] = "Piscataway",
["pt"] = "Portuguese",
["pta"] = "Pai Tavytera",
["pth"] = "Pataxó Hã-Ha-Hãe",
["pti"] = "Pintiini",
["ptn"] = "Patani",
["pto"] = "Zo'é",
["ptp"] = "Patep",
["ptq"] = "Pattapu",
["ptr"] = "Piamatsina",
["ptt"] = "Enrekang",
["ptu"] = "Bambam",
["ptv"] = "Port Vato",
["ptw"] = "Pentlatch",
["pty"] = "Pathiya",
["pua"] = "Purepecha",
["pub"] = "Purum",
["puc"] = "Punan Merap",
["pud"] = "Punan Aput",
["pue"] = "Puelche",
["puf"] = "Punan Merah",
["pug"] = "Phuie",
["pui"] = "Puinave",
["puj"] = "Punan Tubu",
["pum"] = "Puma",
["puo"] = "Puoc",
["pup"] = "Pulabu",
["puq"] = "Puquina",
["pur"] = "Puruborá",
["put"] = "Putoh",
["puu"] = "Punu",
["puw"] = "Puluwat",
["pux"] = "Puare",
["puy"] = "Purisimeño",
["pwa"] = "Pawaia",
["pwb"] = "Panawa",
["pwg"] = "Gapapaiwa",
["pwi"] = "Patwin",
["pwm"] = "Molbog",
["pwn"] = "Paiwan",
["pwo"] = "Western Pwo",
["pwr"] = "Powari",
["pww"] = "Northern Pwo",
["pxm"] = "Quetzaltepec Mixe",
["pye"] = "Pye Krumen",
["pym"] = "Fyam",
["pyn"] = "Poyanáwa",
["pys"] = "Paraguayan Sign Language",
["pyu"] = "Puyuma",
["pyx"] = "Pyu (Myanmar)",
["pyy"] = "Pyen",
["pzh"] = "Pazeh",
["pzn"] = "Para Naga",
["qfa-adm-pro"] = "Proto-Great Andamanese",
["qfa-bet-pro"] = "Proto-Be-Tai",
["qfa-cka-pro"] = "Proto-Chukotko-Kamchatkan",
["qfa-hur-pro"] = "Proto-Hurro-Urartian",
["qfa-kad-pro"] = "Proto-Kadu",
["qfa-kms-pro"] = "Proto-Kam-Sui",
["qfa-kor-pro"] = "Proto-Koreanic",
["qfa-kra-pro"] = "Proto-Kra",
["qfa-lic-pro"] = "Proto-Hlai",
["qfa-onb-pro"] = "Proto-Be",
["qfa-ong-pro"] = "Proto-Ongan",
["qfa-tak-pro"] = "Proto-Kra-Dai",
["qfa-yen-pro"] = "Proto-Yeniseian",
["qfa-yuk-pro"] = "Proto-Yukaghir",
["qu"] = "Quechua",
["qua"] = "Quapaw",
["quc"] = "K'iche'",
["qui"] = "Quileute",
["qum"] = "Sipakapense",
["qun"] = "Quinault",
["quq"] = "Quinqui",
["quv"] = "Sacapulteco",
["qvy"] = "Queyu",
["qwc"] = "Classical Quechua",
["qwe-kch"] = "Kichwa",
["qwe-pro"] = "Proto-Quechuan",
["qwm"] = "Kipchak",
["qwt"] = "Kwalhioqua-Tlatskanai",
["qxs"] = "Southern Qiang",
["qya"] = "Quenya",
["qyp"] = "Quiripi",
["raa"] = "Dungmali",
["rab"] = "Chamling",
["rac"] = "Rasawa",
["rad"] = "Rade",
["raf"] = "Western Meohang",
["rag"] = "Logooli",
["rah"] = "Rabha",
["rai"] = "Ramoaaina",
["rak"] = "Tulu-Bohuai",
["ral"] = "Ralte",
["ram"] = "Canela",
["ran"] = "Riantana",
["rao"] = "Rao",
["rap"] = "Rapa Nui",
["raq"] = "Saam",
["rar"] = "Rarotongan",
["ras"] = "Tegali",
["rat"] = "Razajerdi",
["rau"] = "Raute",
["rav"] = "Sampang",
["raw"] = "Rawang",
["rax"] = "Rang",
["ray"] = "Rapa",
["raz"] = "Rahambuu",
["rbb"] = "Rumai Palaung",
["rbk"] = "Northern Bontoc",
["rbl"] = "East Miraya Bikol",
["rcf"] = "Réunion Creole French",
["rdb"] = "Rudbari",
["rea"] = "Rerau",
["reb"] = "Rembong",
["ree"] = "Rejang Kayan",
["reg"] = "Kara (Tanzania)",
["rei"] = "Reli",
["rej"] = "Rejang",
["rel"] = "Rendille",
["rem"] = "Remo",
["ren"] = "Rengao",
["rer"] = "Rer Bare",
["res"] = "Reshe",
["ret"] = "Retta",
["rey"] = "Reyesano",
["rga"] = "Roria",
["rge"] = "Romano-Greek",
["rgk"] = "Rangkas",
["rgn"] = "Romagnol",
["rgr"] = "Resígaro",
["rgs"] = "Southern Roglai",
["rgu"] = "Ringgou",
["rhg"] = "Rohingya",
["rhp"] = "Yahang",
["ria"] = "Reang",
["rif"] = "Tarifit",
["ril"] = "Riang",
["rim"] = "Nyaturu",
["rin"] = "Nungu",
["rir"] = "Ribun",
["rit"] = "Ritarungo",
["riu"] = "Riung",
["rjg"] = "Rajong",
["rji"] = "Raji",
["rjs"] = "Rajbanshi",
["rka"] = "Kraol",
["rkb"] = "Rikbaktsa",
["rkh"] = "Rakahanga-Manihiki",
["rki"] = "Rakhine",
["rkm"] = "Marka",
["rkt"] = "Kamta",
["rkw"] = "Arakwal",
["rm"] = "Romansh",
["rma"] = "Rama",
["rmb"] = "Rembarunga",
["rmc"] = "Carpathian Romani",
["rmd"] = "Traveller Danish",
["rme"] = "Angloromani",
["rmf"] = "Kalo Finnish Romani",
["rmg"] = "Traveller Norwegian",
["rmh"] = "Murkim",
["rmi"] = "Lomavren",
["rmk"] = "Romkun",
["rml"] = "Baltic Romani",
["rmm"] = "Roma",
["rmn"] = "Balkan Romani",
["rmo"] = "Sinte Romani",
["rmp"] = "Rempi",
["rmq"] = "Caló",
["rms"] = "Romanian Sign Language",
["rmt"] = "Domari",
["rmu"] = "Tavringer Romani",
["rmv"] = "Romanova",
["rmw"] = "Welsh Romani",
["rmx"] = "Romam",
["rmy"] = "Vlax Romani",
["rmz"] = "Marma",
["rnd"] = "Ruwund",
["rng"] = "Ronga",
["rnl"] = "Ranglong",
["rnn"] = "Roon",
["rnp"] = "Rongpo",
["rnw"] = "Rungwa",
["ro"] = "Romanian",
["roa-ang"] = "Angevin",
["roa-bbn"] = "Bourbonnais-Berrichon",
["roa-brg"] = "Bourguignon",
["roa-can"] = "Cantabrian",
["roa-cha"] = "Champenois",
["roa-fcm"] = "Franc-Comtois",
["roa-gal"] = "Gallo",
["roa-gib"] = "Gallo-Italic of Basilicata",
["roa-gis"] = "Gallo-Italic of Sicily",
["roa-leo"] = "Leonese",
["roa-lor"] = "Lorrain",
["roa-oca"] = "Old Catalan",
["roa-ole"] = "Old Leonese",
["roa-ona"] = "Old Navarro-Aragonese",
["roa-opt"] = "Old Galician-Portuguese",
["roa-orl"] = "Orléanais",
["roa-poi"] = "Poitevin-Saintongeais",
["roa-tar"] = "Tarantino",
["rob"] = "Tae'",
["roc"] = "Cacgia Roglai",
["rod"] = "Rogo",
["roe"] = "Ronji",
["rof"] = "Rombo",
["rog"] = "Northern Roglai",
["rol"] = "Romblomanon",
["rom"] = "Romani",
["roo"] = "Rotokas",
["rop"] = "Australian Kriol",
["ror"] = "Rongga",
["rou"] = "Runga",
["row"] = "Dela-Oenale",
["rpn"] = "Repanbitip",
["rpt"] = "Rapting",
["rri"] = "Ririo",
["rrm"] = "Moriori",
["rro"] = "Roro",
["rrt"] = "Arritinngithigh",
["rsb"] = "Romano-Serbian",
["rsk"] = "Pannonian Rusyn",
["rsl"] = "Russian Sign Language",
["rsm"] = "Miriwoong Sign Language",
["rsn"] = "Rwandan Sign Language",
["rtc"] = "Rungtu",
["rth"] = "Ratahan",
["rtm"] = "Rotuman",
["rtw"] = "Rathawi",
["ru"] = "Russian",
["rub"] = "Gungu",
["ruc"] = "Ruuli",
["rue"] = "Carpathian Rusyn",
["ruf"] = "Luguru",
["rug"] = "Roviana",
["ruh"] = "Ruga",
["rui"] = "Rufiji",
["ruk"] = "Che",
["ruo"] = "Istro-Romanian",
["rup"] = "Aromanian",
["ruq"] = "Megleno-Romanian",
["rut"] = "Rutul",
["ruu"] = "Lanas Lobu",
["ruy"] = "Mala (Nigeria)",
["ruz"] = "Ruma",
["rw"] = "Rwanda-Rundi",
["rwa"] = "Rawo",
["rwk"] = "Rwa",
["rwm"] = "Amba",
["rwo"] = "Rawa",
["rxd"] = "Ngardi",
["rxw"] = "Karuwali",
["ryn"] = "Northern Amami Ōshima",
["rys"] = "Yaeyama",
["ryu"] = "Okinawan",
["rzh"] = "Razihi",
["sa"] = "Sanskrit",
["saa"] = "Saba",
["sab"] = "Buglere",
["sac"] = "Fox",
["sad"] = "Sandawe",
["sae"] = "Sabanê",
["saf"] = "Safaliba",
["sah"] = "Yakut",
["sai-all"] = "Allentiac",
["sai-and"] = "Andoquero",
["sai-ayo"] = "Ayomán",
["sai-bae"] = "Baenan",
["sai-bag"] = "Bagua",
["sai-bet"] = "Betoi",
["sai-bor-pro"] = "Proto-Boran",
["sai-cac"] = "Cacán",
["sai-caq"] = "Caranqui",
["sai-car-pro"] = "Proto-Cariban",
["sai-cat"] = "Catacao",
["sai-cer-pro"] = "Proto-Cerrado",
["sai-chi"] = "Chirino",
["sai-chn"] = "Chaná",
["sai-chp"] = "Chapacura",
["sai-chr"] = "Charrua",
["sai-chu"] = "Churuya",
["sai-cje-pro"] = "Proto-Central Jê",
["sai-cmg"] = "Comechingon",
["sai-cno"] = "Chono",
["sai-cnr"] = "Cañari",
["sai-coe"] = "Coeruna",
["sai-col"] = "Colán",
["sai-cop"] = "Copallén",
["sai-crd"] = "Coroado Puri",
["sai-ctq"] = "Catuquinaru",
["sai-cul"] = "Culli",
["sai-cva"] = "Cueva",
["sai-esm"] = "Esmeralda",
["sai-ewa"] = "Ewarhuyana",
["sai-gam"] = "Gamela",
["sai-gay"] = "Gayón",
["sai-gmo"] = "Guamo",
["sai-gua"] = "Guachí",
["sai-gue"] = "Güenoa",
["sai-hau"] = "Haush",
["sai-jee-pro"] = "Proto-Jê",
["sai-jko"] = "Jeikó",
["sai-jrj"] = "Jirajara",
["sai-kat"] = "Katembri",
["sai-mal"] = "Malalí",
["sai-mar"] = "Maratino",
["sai-mat"] = "Matanawi",
["sai-mcn"] = "Mocana",
["sai-men"] = "Menien",
["sai-mil"] = "Millcayac",
["sai-mlb"] = "Malibu",
["sai-msk"] = "Masakará",
["sai-muc"] = "Mucuchí",
["sai-mue"] = "Muellama",
["sai-muz"] = "Muzo",
["sai-mys"] = "Maynas",
["sai-nat"] = "Natú",
["sai-nje-pro"] = "Proto-Northern Jê",
["sai-opo"] = "Opón",
["sai-oto"] = "Otomaco",
["sai-pal"] = "Palta",
["sai-pam"] = "Pamigua",
["sai-par"] = "Paratió",
["sai-peb"] = "Peba",
["sai-pnz"] = "Panzaleo",
["sai-prh"] = "Puruhá",
["sai-ptg"] = "Patagón",
["sai-pur"] = "Purukotó",
["sai-pyg"] = "Payaguá",
["sai-pyk"] = "Pykobjê",
["sai-qmb"] = "Quimbaya",
["sai-qtm"] = "Quitemo",
["sai-rab"] = "Rabona",
["sai-ram"] = "Ramanos",
["sai-sac"] = "Sácata",
["sai-san"] = "Sanaviron",
["sai-sap"] = "Sapará",
["sai-sec"] = "Sechura",
["sai-sin"] = "Sinúfana",
["sai-sje-pro"] = "Proto-Southern Jê",
["sai-tab"] = "Tabancale",
["sai-tal"] = "Tallán",
["sai-tap"] = "Tapayuna",
["sai-tar-pro"] = "Proto-Taranoan",
["sai-teu"] = "Teushen",
["sai-tim"] = "Timote",
["sai-tpr"] = "Taparita",
["sai-trr"] = "Tarairiú",
["sai-wai"] = "Waitaká",
["sai-way"] = "Wayumara",
["sai-wit-pro"] = "Proto-Witotoan",
["sai-wnm"] = "Wanham",
["sai-xoc"] = "Xocó",
["sai-yao"] = "Yao (South America)",
["sai-yar"] = "Yarumá",
["sai-yri"] = "Yuri",
["sai-yup"] = "Yupua",
["sai-yur"] = "Yurumanguí",
["saj"] = "Sahu",
["sak"] = "Sake",
["sal-pro"] = "Proto-Salish",
["sam"] = "Samaritan Aramaic",
["sao"] = "Sause",
["saq"] = "Samburu",
["sar"] = "Saraveca",
["sas"] = "Sasak",
["sat"] = "Santali",
["sau"] = "Saleman",
["sav"] = "Saafi-Saafi",
["saw"] = "Sawi",
["sax"] = "Sa",
["say"] = "Saya",
["saz"] = "Saurashtra",
["sba"] = "Ngambay",
["sbb"] = "Simbo",
["sbc"] = "Gele'",
["sbd"] = "Southern Samo",
["sbe"] = "Saliba (New Guinea)",
["sbf"] = "Shabo",
["sbg"] = "Seget",
["sbh"] = "Sori-Harengan",
["sbi"] = "Seti",
["sbj"] = "Surbakhal",
["sbk"] = "Safwa",
["sbl"] = "Botolan Sambal",
["sbm"] = "Sagala",
["sbn"] = "Sindhi Bhil",
["sbo"] = "Sabüm",
["sbp"] = "Sangu (Tanzania)",
["sbq"] = "Sirva",
["sbr"] = "Sembakung Murut",
["sbs"] = "Subiya",
["sbt"] = "Kimki",
["sbu"] = "Stod Bhoti",
["sbv"] = "Sabine",
["sbw"] = "Simba",
["sbx"] = "Seberuang",
["sby"] = "Soli",
["sbz"] = "Sara Kaba",
["sc"] = "Sardinian",
["scb"] = "Chut",
["sce"] = "Dongxiang",
["scf"] = "San Miguel Creole French",
["scg"] = "Sanggau",
["sch"] = "Sakachep",
["sci"] = "Sri Lankan Creole Malay",
["sck"] = "Sadri",
["scl"] = "Shina",
["scn"] = "Sicilian",
["sco"] = "Scots",
["scp"] = "Yolmo",
["scq"] = "Sa'och",
["scs"] = "North Slavey",
["scu"] = "Shumcho",
["scv"] = "Sheni",
["scw"] = "Sha",
["scx"] = "Sicel",
["scz"] = "Shetland",
["sd"] = "Sindhi",
["sda"] = "Toraja-Sa'dan",
["sdb"] = "Shabak",
["sdc"] = "Sassarese",
["sde"] = "Surubu",
["sdf"] = "Sarli",
["sdg"] = "Savi",
["sdh"] = "Southern Kurdish",
["sdj"] = "Suundi",
["sdk"] = "Sos Kundi",
["sdl"] = "Saudi Arabian Sign Language",
["sdm"] = "Semandang",
["sdn"] = "Gallurese",
["sdo"] = "Bukar-Sadung Bidayuh",
["sdp"] = "Sherdukpen",
["sdr"] = "Oraon Sadri",
["sds"] = "Tunisian Berber",
["sdu"] = "Sarudu",
["sdv-daj-pro"] = "Proto-Daju",
["sdv-eje-pro"] = "Proto-Eastern Jebel",
["sdv-nil-pro"] = "Proto-Nilotic",
["sdv-nyi-pro"] = "Proto-Nyima",
["sdv-tmn-pro"] = "Proto-Taman",
["sdx"] = "Sibu Melanau",
["se"] = "Northern Sami",
["sea"] = "Semai",
["sec"] = "Sechelt",
["sed"] = "Sedang",
["see"] = "Seneca",
["sef"] = "Cebaara",
["seg"] = "Segeju",
["seh"] = "Sena",
["sei"] = "Seri",
["sej"] = "Sene",
["sek"] = "Sekani",
["sel-nor"] = "Northern Selkup",
["sel-pro"] = "Proto-Selkup",
["sel-sou"] = "Southern Selkup",
["sem-amm"] = "Ammonite",
["sem-amo"] = "Amorite",
["sem-cha"] = "Chaha",
["sem-dad"] = "Dadanitic",
["sem-dum"] = "Dumaitic",
["sem-has"] = "Hasaitic",
["sem-his"] = "Hismaic",
["sem-mhr"] = "Muher",
["sem-pro"] = "Proto-Semitic",
["sem-saf"] = "Safaitic",
["sem-sam"] = "Samalian",
["sem-srb"] = "Old South Arabian",
["sem-tay"] = "Taymanitic",
["sem-tha"] = "Thamudic",
["sem-wes-pro"] = "Proto-West Semitic",
["sen"] = "Nanerige",
["seo"] = "Asaba",
["sep"] = "Sicite",
["seq"] = "Senara",
["ser"] = "Serrano",
["ses"] = "Koyraboro Senni",
["set"] = "Sentani",
["seu"] = "Serui-Laut",
["sev"] = "Nyarafolo",
["sew"] = "Sewa Bay",
["sey"] = "Secoya",
["sez"] = "Senthang Chin",
["sfb"] = "French Belgian Sign Language",
["sfe"] = "Eastern Subanun",
["sfm"] = "Small Flowery Miao",
["sfs"] = "South African Sign Language",
["sfw"] = "Sehwi",
["sg"] = "Sango",
["sga"] = "Old Irish",
["sgb"] = "Mag-Anchi Ayta",
["sgc"] = "Kipsigis",
["sgd"] = "Surigaonon",
["sge"] = "Segai",
["sgg"] = "Swiss-German Sign Language",
["sgh"] = "Shughni",
["sgi"] = "Suga",
["sgk"] = "Sangkong",
["sgm"] = "Singa",
["sgp"] = "Singpho",
["sgr"] = "Sangisari",
["sgs"] = "Samogitian",
["sgt"] = "Brokpake",
["sgu"] = "Salas",
["sgw"] = "Sebat Bet Gurage",
["sgx"] = "Sierra Leone Sign Language",
["sgy"] = "Sanglechi",
["sgz"] = "Sursurunga",
["sh"] = "Serbo-Croatian",
["sha"] = "Shall-Zwall",
["shb"] = "Ninam",
["shc"] = "Sonde",
["shd"] = "Kundal Shahi",
["she"] = "Sheko",
["shg"] = "Shua",
["shh"] = "Shoshone",
["shi"] = "Tashelhit",
["shj"] = "Shatt",
["shk"] = "Shilluk",
["shl"] = "Shendu",
["shm"] = "Shahrudi",
["shn"] = "Shan",
["sho"] = "Shanga",
["shp"] = "Shipibo-Conibo",
["shq"] = "Sala",
["shr"] = "Shi",
["shs"] = "Shuswap",
["sht"] = "Shasta",
["shu"] = "Chadian Arabic",
["shv"] = "Shehri",
["shw"] = "Shwai",
["shx"] = "She",
["shy"] = "Tachawit",
["shz"] = "Syenara",
["si"] = "Sinhalese",
["sia"] = "Akkala Sami",
["sib"] = "Sebop",
["sid"] = "Sidamo",
["sie"] = "Simaa",
["sif"] = "Siamou",
["sig"] = "Paasaal",
["sih"] = "Sîshëë",
["sii"] = "Shom Peng",
["sij"] = "Numbami",
["sik"] = "Sikiana",
["sil"] = "Tumulung Sisaala",
["sim"] = "Mende (New Guinea)",
["sio-pro"] = "Proto-Siouan",
["sip"] = "Sikkimese",
["siq"] = "Sonia",
["sir"] = "Siri",
["sis"] = "Siuslaw",
["sit-aao-pro"] = "Proto-Central Naga",
["sit-bai-pro"] = "Proto-Bai",
["sit-ban"] = "Bangru",
["sit-bdi-pro"] = "Proto-Bodish",
["sit-bok"] = "Bokar",
["sit-cai"] = "Caijia",
["sit-cha"] = "Chairel",
["sit-ers-pro"] = "Proto-Ersuic",
["sit-hrs-pro"] = "Proto-Hrusish",
["sit-jap"] = "Japhug",
["sit-kha-pro"] = "Proto-Kham",
["sit-khb-pro"] = "Proto-Kho-Bwa",
["sit-khp-pro"] = "Proto-Puroik",
["sit-khw-pro"] = "Proto-Western Kho-Bwa",
["sit-kon-pro"] = "Proto-Northern Naga",
["sit-liz"] = "Lizu",
["sit-lnj"] = "Longjia",
["sit-lrn"] = "Luren",
["sit-luu-pro"] = "Proto-Luish",
["sit-nas-pro"] = "Proto-Naish",
["sit-prn"] = "Puiron",
["sit-pro"] = "Proto-Sino-Tibetan",
["sit-sit"] = "Situ",
["sit-tam-pro"] = "Proto-Tamangic",
["sit-tan-pro"] = "Proto-Tani",
["sit-tgm"] = "Tangam",
["sit-tng-pro"] = "Proto-Tangkhulic",
["sit-tos"] = "Tosu",
["sit-tsh"] = "Tshobdun",
["sit-zbu"] = "Zbu",
["siu"] = "Sinagen",
["siv"] = "Sumariup",
["siw"] = "Siwai",
["six"] = "Sumau",
["siy"] = "Sivandi",
["siz"] = "Siwi",
["sja"] = "Epena",
["sjb"] = "Sajau Basap",
["sjc"] = "Shaojiang Min",
["sjd"] = "Kildin Sami",
["sje"] = "Pite Sami",
["sjg"] = "Assangori",
["sjk"] = "Kemi Sami",
["sjl"] = "Miji",
["sjm"] = "Mapun",
["sjn"] = "Sindarin",
["sjo"] = "Xibe",
["sjp"] = "Surjapuri",
["sjr"] = "Siar-Lak",
["sjs"] = "Senhaja de Srair",
["sjt"] = "Ter Sami",
["sju"] = "Ume Sami",
["sjw"] = "Shawnee",
["sk"] = "Slovak",
["skb"] = "Saek",
["skc"] = "Ma Manda",
["skd"] = "Southern Sierra Miwok",
["ske"] = "Ske",
["skf"] = "Mekéns",
["skh"] = "Sikule",
["ski"] = "Sika",
["skj"] = "Seke",
["skk"] = "Sok",
["skm"] = "Sakam",
["skn"] = "Kolibugan Subanon",
["sko"] = "Seko Tengah",
["skp"] = "Sekapan",
["skq"] = "Sininkere",
["skr"] = "Saraiki",
["sks"] = "Maia",
["skt"] = "Sakata",
["sku"] = "Sakao",
["skv"] = "Skou",
["skw"] = "Skepi Creole Dutch",
["skx"] = "Seko Padang",
["sky"] = "Sikaiana",
["skz"] = "Sekar",
["sl"] = "Slovene",
["sla-pro"] = "Proto-Slavic",
["slc"] = "Saliba (Colombia)",
["sld"] = "Sisaala",
["sle"] = "Sholaga",
["slf"] = "Swiss-Italian Sign Language",
["slg"] = "Selungai Murut",
["slj"] = "Salumá",
["sll"] = "Salt-Yui",
["slm"] = "Pangutaran Sama",
["sln"] = "Salinan",
["slp"] = "Lamaholot",
["slr"] = "Salar",
["sls"] = "Singapore Sign Language",
["slt"] = "Sila",
["slu"] = "Selaru",
["slw"] = "Sialum",
["slx"] = "Salampasu",
["sly"] = "Selayar",
["slz"] = "Ma'ya",
["sm"] = "Samoan",
["sma"] = "Southern Sami",
["smb"] = "Simbari",
["smc"] = "Som",
["smd"] = "Sama",
["smf"] = "Auwe",
["smg"] = "Simbali",
["smh"] = "Samei",
["smi-pro"] = "Proto-Samic",
["smj"] = "Lule Sami",
["smk"] = "Bolinao",
["sml"] = "Central Sama",
["smm"] = "Musasa",
["smn"] = "Inari Sami",
["smp"] = "Samaritan Hebrew",
["smq"] = "Samo",
["smr"] = "Simeulue",
["sms"] = "Skolt Sami",
["smt"] = "Simte",
["smu"] = "Somray",
["smv"] = "Samvedi",
["smw"] = "Sumbawa",
["smx"] = "Samba",
["smy"] = "Semnani",
["smz"] = "Simeku",
["sn"] = "Shona",
["snb"] = "Sebuyau",
["snc"] = "Sinaugoro",
["sne"] = "Bau Bidayuh",
["snf"] = "Noon",
["sng"] = "Sanga (Congo)",
["sni"] = "Sensi",
["snj"] = "Riverain Sango",
["snk"] = "Soninke",
["snl"] = "Sangil",
["snm"] = "Southern Ma'di",
["snn"] = "Siona",
["snp"] = "Siane",
["snq"] = "Sangu (Gabon)",
["snr"] = "Sihan",
["sns"] = "Nahavaq",
["snu"] = "Senggi",
["snv"] = "Sa'ban",
["snw"] = "Selee",
["snx"] = "Sam",
["sny"] = "Saniyo-Hiyewe",
["snz"] = "Kou",
["so"] = "Somali",
["soa"] = "Thai Song",
["sob"] = "Sobei",
["soc"] = "Soko",
["sod"] = "Songoora",
["soe"] = "Songomeno",
["sog"] = "Sogdian",
["soh"] = "Aka (Sudan)",
["soi"] = "Sonha",
["sok"] = "Sokoro",
["sol"] = "Solos",
["son-pro"] = "Proto-Songhay",
["soo"] = "Nsong",
["sop"] = "Songe",
["soq"] = "Kanasi",
["sor"] = "Somrai",
["sos"] = "Seenku",
["sou"] = "Southern Thai",
["sov"] = "Sonsorolese",
["sow"] = "Sowanda",
["sox"] = "Swo",
["soy"] = "Miyobe",
["soz"] = "Temi",
["spb"] = "Sepa (Indonesia)",
["spc"] = "Sapé",
["spd"] = "Saep",
["spe"] = "Sepa (New Guinea)",
["spg"] = "Sian",
["spi"] = "Saponi",
["spk"] = "Sengo",
["spl"] = "Selepet",
["spm"] = "Sepen",
["spn"] = "Sanapaná",
["spo"] = "Spokane",
["spp"] = "Supyire",
["spr"] = "Saparua",
["sps"] = "Saposa",
["spt"] = "Spiti Bhoti",
["spu"] = "Sapuan",
["spv"] = "Sambalpuri",
["spx"] = "South Picene",
["spy"] = "Sabaot",
["sq"] = "Albanian",
["sqa"] = "Shama-Sambuga",
["sqh"] = "Shau",
["sqj-pro"] = "Proto-Albanian",
["sqk"] = "Albanian Sign Language",
["sqm"] = "Suma",
["sqn"] = "Susquehannock",
["sqo"] = "Sorkhei",
["sqq"] = "Sou",
["sqr"] = "Siculo-Arabic",
["sqs"] = "Sri Lankan Sign Language",
["sqt"] = "Soqotri",
["squ"] = "Squamish",
["sra"] = "Saruga",
["srb"] = "Sora",
["sre"] = "Sara",
["srf"] = "Nafi",
["srg"] = "Sulod",
["srh"] = "Sarikoli",
["sri"] = "Siriano",
["srk"] = "Serudung Murut",
["srl"] = "Isirawa",
["srm"] = "Saramaccan",
["srn"] = "Sranan Tongo",
["srq"] = "Sirionó",
["srr"] = "Serer",
["srs"] = "Tsuut'ina",
["srt"] = "Sauri",
["sru"] = "Suruí",
["srv"] = "Waray Sorsogon",
["srw"] = "Serua",
["srx"] = "Sirmauri",
["sry"] = "Sera",
["srz"] = "Shahmirzadi",
["ss"] = "Swazi",
["ssa-klk-pro"] = "Proto-Kuliak",
["ssa-kom-pro"] = "Proto-Koman",
["ssa-pro"] = "Proto-Nilo-Saharan",
["ssb"] = "Southern Sama",
["ssc"] = "Suba-Simbiti",
["ssd"] = "Siroi",
["sse"] = "Balangingi",
["ssf"] = "Thao",
["ssg"] = "Seimat",
["ssh"] = "Shihhi Arabic",
["ssi"] = "Sansi",
["ssj"] = "Sausi",
["ssk"] = "Sunam",
["ssl"] = "Western Sisaala",
["ssm"] = "Semnam",
["sso"] = "Sissano",
["ssp"] = "Spanish Sign Language",
["ssq"] = "So'a",
["ssr"] = "Swiss-French Sign Language",
["sss"] = "Sô",
["sst"] = "Sinasina",
["ssu"] = "Susuami",
["ssv"] = "Shark Bay",
["ssx"] = "Samberigi",
["ssy"] = "Saho",
["ssz"] = "Sengseng",
["st"] = "Sotho",
["stb"] = "Northern Subanen",
["std"] = "Sentinelese",
["ste"] = "Liana-Seti",
["stf"] = "Seta",
["stg"] = "Trieng",
["sth"] = "Shelta",
["sti"] = "Bulo Stieng",
["stj"] = "Matya Samo",
["stk"] = "Arammba",
["stm"] = "Setaman",
["stn"] = "Owa",
["sto"] = "Stoney",
["stp"] = "Southeastern Tepehuan",
["stq"] = "Saterland Frisian",
["str"] = "Saanich",
["sts"] = "Shumashti",
["stt"] = "Budeh Stieng",
["stu"] = "Samtao",
["stv"] = "Silt'e",
["stw"] = "Satawalese",
["sty"] = "Siberian Tatar",
["su"] = "Sundanese",
["sua"] = "Sulka",
["sub"] = "Suku",
["suc"] = "Western Subanon",
["sue"] = "Suena",
["sug"] = "Suganga",
["sui"] = "Suki",
["suk"] = "Sukuma",
["suo"] = "Bouni",
["suq"] = "Suri",
["sur"] = "Mwaghavul",
["sus"] = "Susu",
["sut"] = "Subtiaba",
["suv"] = "Puroik",
["suw"] = "Sumbwa",
["sux"] = "Sumerian",
["suy"] = "Suyá",
["suz"] = "Sunwar",
["sv"] = "Swedish",
["sva"] = "Svan",
["svb"] = "Ulau-Suain",
["svc"] = "Vincentian Creole English",
["sve"] = "Serili",
["svk"] = "Slovakian Sign Language",
["svm"] = "Slavomolisano",
["svs"] = "Savosavo",
["svx"] = "Skalvian",
["sw"] = "Swahili",
["swb"] = "Maore Comorian",
["swf"] = "Sere",
["swg"] = "Swabian",
["swi"] = "Sui",
["swj"] = "Sira",
["swl"] = "Swedish Sign Language",
["swm"] = "Samosa",
["swn"] = "Sokna",
["swo"] = "Shanenawa",
["swp"] = "Suau",
["swq"] = "Sharwa",
["swr"] = "Saweru",
["sws"] = "Seluwasan",
["swt"] = "Sawila",
["swu"] = "Suwawa",
["sww"] = "Sowa",
["swx"] = "Suruahá",
["swy"] = "Sarua",
["sxb"] = "Suba",
["sxc"] = "Sicanian",
["sxe"] = "Sighu",
["sxg"] = "Shixing",
["sxk"] = "Southern Kalapuya",
["sxl"] = "Selonian",
["sxm"] = "Samre",
["sxn"] = "Sangir",
["sxo"] = "Sorothaptic",
["sxr"] = "Saaroa",
["sxs"] = "Sasaru",
["sxw"] = "Saxwe Gbe",
["sya"] = "Siang",
["syb"] = "Central Subanen",
["syc"] = "Classical Syriac",
["syd-pro"] = "Proto-Samoyedic",
["syi"] = "Seki",
["syk"] = "Sukur",
["syl"] = "Sylheti",
["sym"] = "Maya Samo",
["syn"] = "Senaya",
["syo"] = "Suoy",
["sys"] = "Sinyar",
["syw"] = "Kagate",
["syx"] = "Osamayi",
["syy"] = "Al-Sayyid Bedouin Sign Language",
["sza"] = "Semelai",
["szb"] = "Ngalum",
["szc"] = "Semaq Beri",
["szd"] = "Seru",
["sze"] = "Seze",
["szg"] = "Sengele",
["szl"] = "Silesian",
["szn"] = "Sula",
["szp"] = "Suabo",
["szs"] = "Solomon Islands Sign Language",
["szv"] = "Isubu",
["szw"] = "Sawai",
["szy"] = "Sakizaya",
["ta"] = "Tamil",
["taa"] = "Lower Tanana",
["tab"] = "Tabasaran",
["tac"] = "Lowland Tarahumara",
["tad"] = "Tause",
["tae"] = "Tariana",
["taf"] = "Tapirapé",
["tag"] = "Tagoi",
["tai-pro"] = "Proto-Tai",
["tai-swe-pro"] = "Proto-Southwestern Tai",
["taj"] = "Eastern Tamang",
["tak"] = "Tala",
["tal"] = "Tal",
["tan"] = "Tangale",
["tao"] = "Yami",
["tap"] = "Taabwa",
["tar"] = "Central Tarahumara",
["tas"] = "Tây Bồi",
["tau"] = "Upper Tanana",
["tav"] = "Tatuyo",
["taw"] = "Tai",
["tax"] = "Tamki",
["tay"] = "Atayal",
["taz"] = "Tocho",
["tba"] = "Aikanã",
["tbc"] = "Takia",
["tbd"] = "Kaki Ae",
["tbe"] = "Tanimbili",
["tbf"] = "Mandara",
["tbg"] = "North Tairora",
["tbh"] = "Thurawal",
["tbi"] = "Gaam",
["tbj"] = "Tiang",
["tbk"] = "Calamian Tagbanwa",
["tbl"] = "Tboli",
["tbm"] = "Tagbu",
["tbn"] = "Barro Negro Tunebo",
["tbo"] = "Tawala",
["tbp"] = "Taworta",
["tbq-bdg-pro"] = "Proto-Bodo-Garo",
["tbq-blg"] = "Bailang",
["tbq-brm-pro"] = "Proto-Burmish",
["tbq-gkh"] = "Gokhy",
["tbq-kuk-pro"] = "Proto-Kuki-Chin",
["tbq-lal-pro"] = "Proto-Lalo",
["tbq-laz"] = "Laze",
["tbq-lob-pro"] = "Proto-Lolo-Burmese",
["tbq-lol-pro"] = "Proto-Loloish",
["tbq-mil"] = "Milang",
["tbq-mor"] = "Moran",
["tbq-ngo"] = "Ngochang",
["tbr"] = "Tumtum",
["tbs"] = "Tanguat",
["tbt"] = "Kitembo",
["tbu"] = "Tubar",
["tbv"] = "Tobo",
["tbw"] = "Aborlan Tagbanwa",
["tbx"] = "Kapin",
["tby"] = "Tabaru",
["tbz"] = "Ditammari",
["tca"] = "Ticuna",
["tcb"] = "Tanacross",
["tcc"] = "Datooga",
["tcd"] = "Tafi",
["tce"] = "Southern Tutchone",
["tcf"] = "Malinaltepec Tlapanec",
["tcg"] = "Tamagario",
["tch"] = "Turks and Caicos Creole English",
["tci"] = "Wára",
["tck"] = "Tchitchege",
["tcl"] = "Taman (Myanmar)",
["tcm"] = "Tanahmerah",
["tco"] = "Taungyo",
["tcp"] = "Tawr Chin",
["tcq"] = "Kaiy",
["tcs"] = "Torres Strait Creole",
["tct"] = "T'en",
["tcu"] = "Southeastern Tarahumara",
["tcw"] = "Tecpatlán Totonac",
["tcx"] = "Toda",
["tcy"] = "Tulu",
["tcz"] = "Thado Chin",
["tda"] = "Tagdal",
["tdb"] = "Panchpargania",
["tdc"] = "Emberá-Tadó",
["tdd"] = "Tai Nüa",
["tde"] = "Tiranige Diga Dogon",
["tdf"] = "Talieng",
["tdg"] = "Western Tamang",
["tdh"] = "Thulung",
["tdi"] = "Tomadino",
["tdj"] = "Tajio",
["tdk"] = "Tambas",
["tdl"] = "Sur",
["tdm"] = "Taruma",
["tdn"] = "Tondano",
["tdo"] = "Teme",
["tdq"] = "Tita",
["tdr"] = "Todrah",
["tds"] = "Doutai",
["tdt"] = "Tetun Dili",
["tdu"] = "Tempasuk Dusun",
["tdv"] = "Toro",
["tdy"] = "Tadyawan",
["te"] = "Telugu",
["tea"] = "Temiar",
["teb"] = "Tetete",
["tec"] = "Terik",
["ted"] = "Tepo Krumen",
["tee"] = "Huehuetla Tepehua",
["tef"] = "Teressa",
["teg"] = "Teke-Tege",
["teh"] = "Tehuelche",
["tei"] = "Torricelli",
["tek"] = "Ibali Teke",
["tem"] = "Temne",
["ten"] = "Tama (Colombia)",
["teo"] = "Ateso",
["tep"] = "Tepecano",
["teq"] = "Temein",
["ter"] = "Tereno",
["tes"] = "Tengger",
["tet"] = "Tetum",
["teu"] = "Soo",
["tev"] = "Teor",
["tew"] = "Tewa",
["tex"] = "Tennet",
["tey"] = "Tulishi",
["tez"] = "Tetserret",
["tfi"] = "Tofin Gbe",
["tfn"] = "Dena'ina",
["tfo"] = "Tefaro",
["tfr"] = "Teribe",
["tft"] = "Ternate",
["tg"] = "Tajik",
["tga"] = "Sagalla",
["tgb"] = "Tobilung",
["tgc"] = "Tigak",
["tgd"] = "Ciwogai",
["tge"] = "Eastern Gorkha Tamang",
["tgf"] = "Chali",
["tgh"] = "Tobagonian Creole English",
["tgi"] = "Lawunuia",
["tgn"] = "Tandaganon",
["tgo"] = "Sudest",
["tgp"] = "Tangoa",
["tgq"] = "Tring",
["tgr"] = "Tareng",
["tgs"] = "Nume",
["tgt"] = "Central Tagbanwa",
["tgu"] = "Tanggu",
["tgv"] = "Tingui-Boto",
["tgw"] = "Tagwana",
["tgx"] = "Tagish",
["tgy"] = "Togoyo",
["th"] = "Thai",
["thc"] = "Tai Hang Tong",
["thd"] = "Kuuk Thaayorre",
["the"] = "Chitwania Tharu",
["thf"] = "Thangmi",
["thh"] = "Northern Tarahumara",
["thi"] = "Tai Long",
["thk"] = "Tharaka",
["thl"] = "Dangaura Tharu",
["thm"] = "Thavung",
["thn"] = "Thachanadan",
["thp"] = "Thompson",
["thq"] = "Kochila Tharu",
["thr"] = "Rana Tharu",
["ths"] = "Thakali",
["tht"] = "Tahltan",
["thu"] = "Thuri",
["thy"] = "Tha",
["ti"] = "Tigrinya",
["tic"] = "Tira",
["tif"] = "Tifal",
["tig"] = "Tigre",
["tih"] = "Timugon Murut",
["tii"] = "Tiene",
["tij"] = "Tilung",
["tik"] = "Tikar",
["til"] = "Tillamook",
["tim"] = "Timbe",
["tin"] = "Tindi",
["tio"] = "Teop",
["tip"] = "Trimuris",
["tiq"] = "Tiéfo",
["tis"] = "Masadiit Itneg",
["tit"] = "Tinigua",
["tiu"] = "Adasen",
["tiv"] = "Tiv",
["tiw"] = "Tiwi",
["tix"] = "Southern Tiwa",
["tiy"] = "Tiruray",
["tiz"] = "Tai Hongjin",
["tja"] = "Tajuasohn",
["tjg"] = "Tunjung",
["tji"] = "Northern Tujia",
["tjl"] = "Tai Laing",
["tjm"] = "Timucua",
["tjn"] = "Tonjon",
["tjs"] = "Southern Tujia",
["tju"] = "Tjurruru",
["tjw"] = "Chaap Wuurong",
["tk"] = "Turkmen",
["tka"] = "Truká",
["tkb"] = "Buksa",
["tkd"] = "Tukudede",
["tke"] = "Takwane",
["tkf"] = "Tukumanféd",
["tkl"] = "Tokelauan",
["tkm"] = "Takelma",
["tkn"] = "Tokunoshima",
["tkp"] = "Tikopia",
["tkq"] = "Tee",
["tkr"] = "Tsakhur",
["tks"] = "Ramandi",
["tkt"] = "Kathoriya Tharu",
["tku"] = "Upper Necaxa Totonac",
["tkv"] = "Mur Pano",
["tkw"] = "Teanu",
["tkx"] = "Tangko",
["tkz"] = "Takua",
["tl"] = "Tagalog",
["tla"] = "Southwestern Tepehuan",
["tlb"] = "Tobelo",
["tlc"] = "Misantla Totonac",
["tld"] = "Talaud",
["tlf"] = "Telefol",
["tlg"] = "Tofanma",
["tlh"] = "Klingon",
["tli"] = "Tlingit",
["tlj"] = "Talinga-Bwisi",
["tlk"] = "Taloki",
["tll"] = "Tetela",
["tlm"] = "Tolomako",
["tln"] = "Talondo'",
["tlo"] = "Talodi",
["tlp"] = "Filomena Mata-Coahuitlán Totonac",
["tlq"] = "Tai Loi",
["tlr"] = "Talise",
["tls"] = "Tambotalo",
["tlt"] = "Teluti",
["tlu"] = "Tulehu",
["tlv"] = "Taliabu",
["tlx"] = "Khehek",
["tly"] = "Talysh",
["tma"] = "Tama (Chad)",
["tmb"] = "Avava",
["tmc"] = "Tumak",
["tmd"] = "Haruai",
["tme"] = "Tremembé",
["tmf"] = "Toba-Maskoy",
["tmg"] = "Ternateño",
["tmh"] = "Tuareg",
["tmi"] = "Tutuba",
["tmj"] = "Samarokena",
["tml"] = "Tamnim Citak",
["tmm"] = "Tai Thanh",
["tmn"] = "Taman (Indonesia)",
["tmo"] = "Temoq",
["tmq"] = "Tumleo",
["tms"] = "Tima",
["tmt"] = "Tasmate",
["tmu"] = "Iau",
["tmv"] = "Motembo",
["tmy"] = "Tami",
["tmz"] = "Tamanaku",
["tn"] = "Tswana",
["tna"] = "Tacana",
["tnb"] = "Western Tunebo",
["tnc"] = "Tanimuca-Retuarã",
["tnd"] = "Angosturas Tunebo",
["tne"] = "Tinoc Kallahan",
["tng"] = "Tobanga",
["tnh"] = "Maiani",
["tni"] = "Tandia",
["tnk"] = "Kwamera",
["tnl"] = "Lenakel",
["tnm"] = "Tabla",
["tnn"] = "North Tanna",
["tno"] = "Toromono",
["tnp"] = "Whitesands",
["tnq"] = "Taíno",
["tnr"] = "Bedik",
["tns"] = "Tenis",
["tnt"] = "Tontemboan",
["tnu"] = "Tay Khang",
["tnv"] = "Tanchangya",
["tnw"] = "Tonsawang",
["tnx"] = "Tanema",
["tny"] = "Tongwe",
["tnz"] = "Ten'edn",
["to"] = "Tongan",
["tob"] = "Toba",
["toc"] = "Coyutla Totonac",
["tod"] = "Toma",
["tof"] = "Gizrra",
["tog"] = "Tonga (Malawi)",
["toh"] = "Tonga (Mozambique)",
["toi"] = "Tonga (Zambia)",
["toj"] = "Tojolabal",
["tok"] = "Toki Pona",
["tol"] = "Tolowa",
["tom"] = "Tombulu",
["too"] = "Xicotepec de Juárez Totonac",
["top"] = "Papantla Totonac",
["toq"] = "Toposa",
["tor"] = "Togbo-Vara Banda",
["tos"] = "Highland Totonac",
["tou"] = "Tho",
["tov"] = "Upper Taromi",
["tow"] = "Jemez",
["tox"] = "Tobian",
["toy"] = "Topoiyo",
["toz"] = "To",
["tpa"] = "Taupota",
["tpc"] = "Azoyú Me'phaa",
["tpe"] = "Tippera",
["tpf"] = "Tarpia",
["tpg"] = "Kula",
["tpi"] = "Tok Pisin",
["tpj"] = "Tapieté",
["tpk"] = "Tupinikin",
["tpl"] = "Tlacoapa Me'phaa",
["tpm"] = "Tampulma",
["tpn"] = "Tupinambá",
["tpo"] = "Tai Pao",
["tpp"] = "Pisaflores Tepehua",
["tpq"] = "Tukpa",
["tpr"] = "Tuparí",
["tpt"] = "Tlachichilco Tepehua",
["tpu"] = "Tampuan",
["tpv"] = "Tanapag",
["tpw"] = "Old Tupi",
["tpx"] = "Acatepec Me'phaa",
["tpy"] = "Trumai",
["tpz"] = "Tinputz",
["tqb"] = "Tembé",
["tql"] = "Lehali",
["tqm"] = "Turumsa",
["tqn"] = "Tenino",
["tqo"] = "Toaripi",
["tqp"] = "Tomoip",
["tqq"] = "Tunni",
["tqr"] = "Torona",
["tqt"] = "Western Totonac",
["tqu"] = "Touo",
["tqw"] = "Tonkawa",
["tr"] = "Turkish",
["tra"] = "Tirahi",
["trb"] = "Terebu",
["trc"] = "Copala Triqui",
["trd"] = "Turi",
["tre"] = "East Tarangan",
["trf"] = "Trinidadian Creole English",
["trg"] = "Lishán Didán",
["trh"] = "Turaka",
["tri"] = "Trió",
["trj"] = "Toram",
["trk-dkh"] = "Dukhan",
["trk-eog"] = "Early Old Oghuz",
["trk-oat"] = "Old Anatolian Turkish",
["trk-pro"] = "Proto-Turkic",
["trl"] = "Traveller Scottish",
["trm"] = "Tregami",
["trn"] = "Trinitario",
["tro"] = "Tarao",
["trp"] = "Kokborok",
["trq"] = "San Martín Itunyoso Triqui",
["trr"] = "Taushiro",
["trs"] = "Chicahuaxtla Triqui",
["trt"] = "Tunggare",
["tru"] = "Turoyo",
["trv"] = "Taroko",
["trw"] = "Torwali",
["trx"] = "Tringgus",
["try"] = "Turung",
["trz"] = "Torá",
["ts"] = "Tsonga",
["tsa"] = "Tsaangi",
["tsb"] = "Tsamai",
["tsc"] = "Tswa",
["tsd"] = "Tsakonian",
["tse"] = "Tunisian Sign Language",
["tsg"] = "Tausug",
["tsh"] = "Tsuvan",
["tsi"] = "Tsimshian",
["tsj"] = "Tshangla",
["tsl"] = "Ts'ün-Lao",
["tsm"] = "Turkish Sign Language",
["tsp"] = "Northern Toussian",
["tsq"] = "Thai Sign Language",
["tsr"] = "Akei",
["tss"] = "Taiwan Sign Language",
["tsu"] = "Tsou",
["tsv"] = "Tsogo",
["tsw"] = "Tsishingini",
["tsx"] = "Mubami",
["tsy"] = "Tebul Sign Language",
["tt"] = "Tatar",
["tta"] = "Tutelo",
["ttb"] = "Gaa",
["ttc"] = "Tektiteko",
["ttd"] = "Tauade",
["tte"] = "Bwanabwana",
["ttf"] = "Tuotomb",
["ttg"] = "Tutong",
["tth"] = "Upper Ta'oih",
["tti"] = "Tobati",
["ttj"] = "Tooro",
["ttk"] = "Totoro",
["ttl"] = "Totela",
["ttm"] = "Northern Tutchone",
["ttn"] = "Towei",
["tto"] = "Lower Ta'oih",
["ttp"] = "Tombelala",
["ttr"] = "Tera",
["tts"] = "Isan",
["ttt"] = "Tat",
["ttu"] = "Torau",
["ttv"] = "Titan",
["ttw"] = "Long Wat",
["tty"] = "Sikaritai",
["ttz"] = "Tsum",
["tua"] = "Wiarumus",
["tub"] = "Tübatulabal",
["tuc"] = "Mutu",
["tud"] = "Tuxá",
["tue"] = "Tuyuca",
["tuf"] = "Central Tunebo",
["tug"] = "Tunia",
["tuh"] = "Taulil",
["tui"] = "Tupuri",
["tuj"] = "Tugutil",
["tul"] = "Tula",
["tum"] = "Tumbuka",
["tun"] = "Tunica",
["tuo"] = "Tucano",
["tup-gua-pro"] = "Proto-Tupi-Guarani",
["tup-kab"] = "Kabishiana",
["tup-pro"] = "Proto-Tupian",
["tuq"] = "Tedaga",
["tus"] = "Tuscarora",
["tuu"] = "Tututni",
["tuv"] = "Turkana",
["tuw-alk"] = "Alchuka",
["tuw-bal"] = "Bala",
["tuw-kkl"] = "Kyakala",
["tuw-kli"] = "Kili",
["tuw-pro"] = "Proto-Tungusic",
["tuw-sol"] = "Solon",
["tux"] = "Tuxináwa",
["tuy"] = "Tugen",
["tuz"] = "Turka",
["tva"] = "Vaghua",
["tvd"] = "Tsuvadi",
["tve"] = "Te'un",
["tvk"] = "Southeast Ambrym",
["tvl"] = "Tuvaluan",
["tvm"] = "Tela-Masbuar",
["tvn"] = "Tavoyan",
["tvo"] = "Tidore",
["tvs"] = "Taveta",
["tvt"] = "Tutsa Naga",
["tvu"] = "Tunen",
["tvw"] = "Sedoa",
["tvx"] = "Taivoan",
["tvy"] = "Timor Pidgin",
["twa"] = "Twana",
["twb"] = "Western Tawbuid",
["twc"] = "Teshenawa",
["twe"] = "Teiwa",
["twf"] = "Taos",
["twg"] = "Tereweng",
["twh"] = "Tai Dón",
["twm"] = "Tawang Monpa",
["twn"] = "Twendi",
["two"] = "Tswapong",
["twp"] = "Ere",
["twq"] = "Tasawaq",
["twr"] = "Southwestern Tarahumara",
["twt"] = "Turiwára",
["twu"] = "Termanu",
["tww"] = "Tuwari",
["twy"] = "Tawoyan",
["txa"] = "Tombonuo",
["txb"] = "Tocharian B",
["txc"] = "Tsetsaut",
["txe"] = "Totoli",
["txg"] = "Tangut",
["txh"] = "Thracian",
["txi"] = "Ikpeng",
["txj"] = "Tarjumo",
["txm"] = "Tomini",
["txn"] = "West Tarangan",
["txo"] = "Toto",
["txq"] = "Tii",
["txr"] = "Tartessian",
["txs"] = "Tonsea",
["txt"] = "Citak",
["txu"] = "Kayapó",
["txx"] = "Tatana",
["ty"] = "Tahitian",
["tya"] = "Tauya",
["tye"] = "Kyenga",
["tyh"] = "O'du",
["tyi"] = "Teke-Tsaayi",
["tyj"] = "Tai Do",
["tyl"] = "Thu Lao",
["tyn"] = "Kombai",
["typ"] = "Kuku-Thaypan",
["tyr"] = "Tai Daeng",
["tys"] = "Sapa",
["tyt"] = "Tày Tac",
["tyu"] = "Kua",
["tyv"] = "Tuvan",
["tyx"] = "Teke-Tyee",
["tyz"] = "Tày",
["tza"] = "Tanzanian Sign Language",
["tzh"] = "Tzeltal",
["tzj"] = "Tz'utujil",
["tzl"] = "Talossan",
["tzm"] = "Central Atlas Tamazight",
["tzn"] = "Tugun",
["tzo"] = "Tzotzil",
["tzx"] = "Tabriak",
["uam"] = "Uamué",
["uan"] = "Kuan",
["uar"] = "Tairuma",
["uba"] = "Ubang",
["ubi"] = "Ubi",
["ubl"] = "Buhi'non Bikol",
["ubr"] = "Ubir",
["ubu"] = "Umbu-Ungu",
["uby"] = "Ubykh",
["uda"] = "Uda",
["ude"] = "Udihe",
["udg"] = "Muduga",
["udi"] = "Udi",
["udj"] = "Ujir",
["udl"] = "Uldeme",
["udm"] = "Udmurt",
["udu"] = "Uduk",
["ues"] = "Kioko",
["ufi"] = "Ufim",
["ug"] = "Uyghur",
["uga"] = "Ugaritic",
["ugb"] = "Kuku-Ugbanh",
["uge"] = "Ughele",
["ugn"] = "Ugandan Sign Language",
["ugo"] = "Gong",
["ugy"] = "Uruguayan Sign Language",
["uha"] = "Uhami",
["uhn"] = "Damal",
["uis"] = "Uisai",
["uiv"] = "Iyive",
["uji"] = "Tanjijili",
["uk"] = "Ukrainian",
["uka"] = "Kaburi",
["ukg"] = "Ukuriguma",
["ukh"] = "Ukhwejo",
["ukk"] = "Muak Sa-aak",
["ukl"] = "Ukrainian Sign Language",
["ukp"] = "Ukpe-Bayobiri",
["ukq"] = "Ukwa",
["uks"] = "Kaapor Sign Language",
["uku"] = "Ukue",
["ukw"] = "Ukwuani-Aboh-Ndoni",
["uky"] = "Kuuk Yak",
["ula"] = "Fungwa",
["ulb"] = "Olukumi",
["ulc"] = "Ulch",
["ule"] = "Lule",
["ulf"] = "Afra",
["uli"] = "Ulithian",
["ulk"] = "Meriam",
["ull"] = "Ullatan",
["ulm"] = "Ulumanda'",
["uln"] = "Unserdeutsch",
["ulu"] = "Uma' Lung",
["ulw"] = "Ulwa (Nicaragua)",
["uma"] = "Umatilla",
["umb"] = "Umbundu",
["umc"] = "Marrucinian",
["umd"] = "Umbindhamu",
["umg"] = "Umbuygamu",
["umi"] = "Ukit",
["umm"] = "Umon",
["umn"] = "Makyan Naga",
["umo"] = "Umotína",
["ump"] = "Umpila",
["umr"] = "Umbugarla",
["ums"] = "Pendau",
["umu"] = "Munsee",
["una"] = "North Watut",
["und"] = "Undetermined",
["une"] = "Uneme",
["ung"] = "Ngarinyin",
["uni"] = "Uni",
["unk"] = "Enawené-Nawé",
["unm"] = "Unami",
["unn"] = "Kurnai",
["unr"] = "Mundari",
["unu"] = "Unubahe",
["unx"] = "Munda",
["unz"] = "Unde Kaili",
["uok"] = "Uokha",
["uon"] = "Kulon",
["upi"] = "Umeda",
["upv"] = "Northeast Malakula",
["ur"] = "Urdu",
["ura"] = "Urarina",
["urb"] = "Urubú-Kaapor",
["urc"] = "Urningangg",
["ure"] = "Uru",
["urf"] = "Uradhi",
["urg"] = "Urigina",
["urh"] = "Urhobo",
["uri"] = "Urim",
["urj-fin-pro"] = "Proto-Finnic",
["urj-koo"] = "Old Komi",
["urj-kuk"] = "Kukkuzi",
["urj-kya"] = "Komi-Yazva",
["urj-mdv-pro"] = "Proto-Mordvinic",
["urj-prm-pro"] = "Proto-Permic",
["urj-pro"] = "Proto-Uralic",
["urj-ugr-pro"] = "Proto-Ugric",
["urk"] = "Urak Lawoi'",
["url"] = "Urali",
["urm"] = "Urapmin",
["urn"] = "Uruangnirin",
["uro"] = "Ura (New Guinea)",
["urp"] = "Uru-Pa-In",
["urr"] = "Löyöp",
["urt"] = "Urat",
["uru"] = "Urumi",
["urv"] = "Uruava",
["urw"] = "Sop",
["urx"] = "Urimo",
["ury"] = "Orya",
["urz"] = "Uru-Eu-Wau-Wau",
["usa"] = "Usarufa",
["ush"] = "Ushojo",
["usi"] = "Usui",
["usk"] = "Usaghade",
["usp"] = "Uspanteco",
["uss"] = "Saare",
["usu"] = "Uya",
["uta"] = "Otank",
["ute"] = "Ute",
["uth"] = "Hun",
["utp"] = "Aba",
["utr"] = "Etulo",
["utu"] = "Utu",
["uum"] = "Urum",
["uur"] = "Ura (Vanuatu)",
["uuu"] = "U",
["uve"] = "West Uvean",
["uvh"] = "Uri",
["uvl"] = "Lote",
["uwa"] = "Kuku-Uwanh",
["uya"] = "Doko-Uyanga",
["uz"] = "Uzbek",
["vaa"] = "Vaagri Booli",
["vae"] = "Vale",
["vag"] = "Vagla",
["vah"] = "Varhadi",
["vai"] = "Vai",
["vaj"] = "Sekele",
["val"] = "Vehes",
["vam"] = "Vanimo",
["van"] = "Valman",
["vao"] = "Vao",
["vap"] = "Vaiphei",
["var"] = "Huarijio",
["vas"] = "Vasavi",
["vau"] = "Vanuma",
["vav"] = "Varli",
["vay"] = "Vayu",
["vbb"] = "Southeast Babar",
["vbk"] = "Southwestern Bontoc",
["ve"] = "Venda",
["vec"] = "Venetan",
["ved"] = "Veddah",
["vem"] = "Vemgo-Mabas",
["veo"] = "Ventureño",
["vep"] = "Veps",
["ver"] = "Mom Jango",
["vgr"] = "Vaghri",
["vgt"] = "Flemish Sign Language",
["vi"] = "Vietnamese",
["vic"] = "Virgin Islands Creole",
["vid"] = "Vidunda",
["vif"] = "Vili",
["vig"] = "Viemo",
["vil"] = "Vilela",
["vis"] = "Vishavan",
["vit"] = "Viti",
["viv"] = "Iduna",
["vjk"] = "Bajjika",
["vka"] = "Kariyarra",
["vki"] = "Ija-Zuba",
["vkj"] = "Kujarge",
["vkk"] = "Kaur",
["vkl"] = "Kulisusu",
["vkm"] = "Kamakan",
["vko"] = "Kodeoha",
["vkp"] = "Korlai Creole Portuguese",
["vkt"] = "Tenggarong Kutai Malay",
["vku"] = "Kurrama",
["vlp"] = "Valpei",
["vls"] = "West Flemish",
["vma"] = "Martuthunira",
["vmb"] = "Mbabaram",
["vmc"] = "Juxtlahuaca Mixtec",
["vmd"] = "Mudu Koraga",
["vme"] = "East Masela",
["vmf"] = "East Franconian",
["vmg"] = "Vinitiri",
["vmh"] = "Maraghei",
["vmi"] = "Miwa",
["vmj"] = "Ixtayutla Mixtec",
["vmk"] = "Makhuwa-Shirima",
["vml"] = "Malgana",
["vmm"] = "Mitlatongo Mixtec",
["vmp"] = "Soyaltepec Mazatec",
["vmq"] = "Soyaltepec Mixtec",
["vmr"] = "Marenje",
["vmu"] = "Muluridyi",
["vmv"] = "Valley Maidu",
["vmw"] = "Makhuwa",
["vmx"] = "Tamazola Mixtec",
["vmy"] = "Ayautla Mazatec",
["vmz"] = "Mazatlán Mazatec",
["vnk"] = "Lovono",
["vnm"] = "Neve'ei",
["vnp"] = "Vunapu",
["vo"] = "Volapük",
["vor"] = "Voro",
["vot"] = "Votic",
["vra"] = "Vera'a",
["vro"] = "Võro",
["vrs"] = "Varisi",
["vrt"] = "Burmbar",
["vsi"] = "Moldova Sign Language",
["vsl"] = "Venezuelan Sign Language",
["vsv"] = "Valencian Sign Language",
["vto"] = "Vitou",
["vum"] = "Vumbu",
["vun"] = "Vunjo",
["vut"] = "Vute",
["vwa"] = "Awa (China)",
["wa"] = "Walloon",
["waa"] = "Walla Walla",
["wab"] = "Wab",
["wac"] = "Wasco-Wishram",
["wad"] = "Wandamen",
["waf"] = "Wakoná",
["wag"] = "Wa'ema",
["wah"] = "Watubela",
["waj"] = "Waffa",
["wal"] = "Wolaytta",
["wam"] = "Massachusett",
["wan"] = "Wan",
["wao"] = "Wappo",
["wap"] = "Wapishana",
["waq"] = "Wageman",
["war"] = "Waray-Waray",
["was"] = "Washo",
["wat"] = "Kaninuwa",
["wau"] = "Wauja",
["wav"] = "Waka",
["waw"] = "Waiwai",
["wax"] = "Watam",
["way"] = "Wayana",
["waz"] = "Wampur",
["wba"] = "Warao",
["wbb"] = "Wabo",
["wbe"] = "Waritai",
["wbf"] = "Wara",
["wbh"] = "Wanda",
["wbi"] = "Wanji",
["wbj"] = "Alagwa",
["wbk"] = "Waigali",
["wbl"] = "Wakhi",
["wbm"] = "Wa",
["wbp"] = "Warlpiri",
["wbq"] = "Waddar",
["wbr"] = "Wagdi",
["wbt"] = "Wanman",
["wbv"] = "Wajarri",
["wbw"] = "Woi",
["wca"] = "Yanomam",
["wci"] = "Waci Gbe",
["wdd"] = "Wandji",
["wdg"] = "Wadaginam",
["wdj"] = "Wadjiginy",
["wdt"] = "Wendat",
["wdu"] = "Wadjigu",
["wdy"] = "Wadjabangayi",
["wea"] = "Wewaw",
["wec"] = "Wè Western",
["wed"] = "Wedau",
["weh"] = "Weh",
["wei"] = "Kiunum",
["wem"] = "Weme Gbe",
["weo"] = "Wemale",
["wer"] = "Weri",
["wes"] = "Cameroon Pidgin",
["wet"] = "Perai",
["weu"] = "Welaung",
["wew"] = "Weyewa",
["wfg"] = "Yafi",
["wga"] = "Wagaya",
["wgb"] = "Wagawaga",
["wgg"] = "Wangganguru",
["wgi"] = "Wahgi",
["wgo"] = "Waigeo",
["wgu"] = "Wirangu",
["wgy"] = "Warrgamay",
["wha"] = "Manusela",
["whg"] = "North Wahgi",
["whk"] = "Wahau Kenyah",
["whu"] = "Wahau Kayan",
["wib"] = "Southern Toussian",
["wic"] = "Wichita",
["wie"] = "Wik-Epa",
["wif"] = "Wik-Keyangan",
["wig"] = "Wik-Ngathana",
["wih"] = "Wik-Me'anha",
["wii"] = "Minidien",
["wij"] = "Wik-Iiyanh",
["wik"] = "Wikalkan",
["wil"] = "Wilawila",
["wim"] = "Wik-Mungkan",
["win"] = "Winnebago",
["wir"] = "Wiraféd",
["wiu"] = "Wiru",
["wiv"] = "Muduapa",
["wiy"] = "Wiyot",
["wja"] = "Waja",
["wji"] = "Warji",
["wka"] = "Kw'adza",
["wkb"] = "Kumbaran",
["wkd"] = "Mo",
["wkl"] = "Kalanadi",
["wku"] = "Kunduvadi",
["wkw"] = "Wakawaka",
["wky"] = "Wangkayutyuru",
["wla"] = "Walio",
["wlc"] = "Mwali Comorian",
["wle"] = "Wolane",
["wlg"] = "Kunbarlang",
["wli"] = "Waioli",
["wlk"] = "Wailaki",
["wll"] = "Wali (Sudan)",
["wlm"] = "Middle Welsh",
["wlo"] = "Wolio",
["wlr"] = "Wailapa",
["wls"] = "Wallisian",
["wlu"] = "Wuliwuli",
["wlv"] = "Wichí Lhamtés Vejoz",
["wlw"] = "Walak",
["wlx"] = "Wali (Ghana)",
["wly"] = "Waling",
["wmb"] = "Wambaya",
["wmc"] = "Wamas",
["wmd"] = "Mamaindé",
["wme"] = "Wambule",
["wmh"] = "Waima'a",
["wmi"] = "Wamin",
["wmm"] = "Maiwa (Indonesia)",
["wmn"] = "Waamwang",
["wmo"] = "Wam",
["wms"] = "Wambon",
["wmt"] = "Walmajarri",
["wmw"] = "Mwani",
["wmx"] = "Womo",
["wnb"] = "Mokati",
["wnc"] = "Wantoat",
["wnd"] = "Wandarang",
["wne"] = "Waneci",
["wng"] = "Wanggom",
["wni"] = "Ndzwani Comorian",
["wnk"] = "Wanukaka",
["wnm"] = "Wanggamala",
["wno"] = "Wano",
["wnp"] = "Wanap",
["wnu"] = "Usan",
["wnw"] = "Wintu",
["wny"] = "Wanyi",
["wo"] = "Wolof",
["woa"] = "Tyaraity",
["wob"] = "Wobé",
["woc"] = "Wogeo",
["wod"] = "Wolani",
["woe"] = "Woleaian",
["wog"] = "Wogamusin",
["woi"] = "Kamang",
["wok"] = "Longto",
["wom"] = "Perema",
["won"] = "Wongo",
["woo"] = "Manombai",
["wor"] = "Woria",
["wos"] = "Hanga Hundi",
["wow"] = "Wawonii",
["woy"] = "Weyto",
["wpc"] = "Wirö",
["wra"] = "Warapu",
["wrb"] = "Warluwara",
["wrg"] = "Warungu",
["wrh"] = "Wiradjuri",
["wri"] = "Wariyangga",
["wrk"] = "Garawa",
["wrl"] = "Warlmanpa",
["wrm"] = "Warumungu",
["wrn"] = "Warnang",
["wro"] = "Worora",
["wrp"] = "Waropen",
["wrr"] = "Wardaman",
["wrs"] = "Waris",
["wru"] = "Waru",
["wrv"] = "Waruna",
["wrw"] = "Gugu Warra",
["wrx"] = "Wae Rana",
["wrz"] = "Warray",
["wsa"] = "Warembori",
["wsi"] = "Wusi",
["wsk"] = "Waskia",
["wsr"] = "Owenia",
["wsu"] = "Wasu",
["wsv"] = "Wotapuri-Katarqalai",
["wtf"] = "Watiwa",
["wth"] = "Wathaurong",
["wti"] = "Berta",
["wtk"] = "Watakataui",
["wtm"] = "Mewati",
["wtw"] = "Wotu",
["wua"] = "Wikngenchera",
["wub"] = "Wunambal",
["wud"] = "Wudu",
["wuh"] = "Wutunhua",
["wul"] = "Silimo",
["wum"] = "Wumbvu",
["wun"] = "Bungu",
["wur"] = "Wurrugu",
["wut"] = "Wutung",
["wuu"] = "Wu",
["wuv"] = "Wuvulu-Aua",
["wux"] = "Wulna",
["wuy"] = "Wauyai",
["wwa"] = "Waama",
["wwo"] = "Dorig",
["wwr"] = "Warrwa",
["www"] = "Wawa",
["wxa"] = "Waxiang",
["wxw"] = "Wardandi",
["wya"] = "Wyandot",
["wyb"] = "Ngiyambaa",
["wyi"] = "Woiwurrung",
["wym"] = "Vilamovian",
["wyr"] = "Wayoró",
["wyy"] = "Western Fijian",
["xaa"] = "Andalusian Arabic",
["xab"] = "Sambe",
["xac"] = "Kachari",
["xad"] = "Adai",
["xae"] = "Aequian",
["xag"] = "Aghwan",
["xai"] = "Kaimbé",
["xaj"] = "Ararandewára",
["xak"] = "Maku",
["xal"] = "Kalmyk",
["xam"] = "ǀXam",
["xan"] = "Xamtanga",
["xao"] = "Khao",
["xap"] = "Apalachee",
["xar"] = "Karami",
["xas"] = "Kamassian",
["xat"] = "Katawixi",
["xau"] = "Kauwera",
["xav"] = "Xavante",
["xaw"] = "Kawaiisu",
["xay"] = "Kayan Mahakam",
["xbb"] = "Lower Burdekin",
["xbc"] = "Bactrian",
["xbd"] = "Bindal",
["xbe"] = "Bigambal",
["xbg"] = "Bunganditj",
["xbi"] = "Kombio",
["xbj"] = "Birrpayi",
["xbm"] = "Middle Breton",
["xbn"] = "Kenaboi",
["xbo"] = "Bulgar",
["xbp"] = "Bibbulman",
["xbr"] = "Kambera",
["xbw"] = "Kambiwá",
["xby"] = "Butchulla",
["xcb"] = "Cumbric",
["xcc"] = "Camunic",
["xce"] = "Celtiberian",
["xch"] = "Chemakum",
["xcl"] = "Old Armenian",
["xcm"] = "Comecrudo",
["xcn"] = "Cotoname",
["xco"] = "Khwarezmian",
["xcr"] = "Carian",
["xct"] = "Classical Tibetan",
["xcu"] = "Curonian",
["xcv"] = "Chuvan",
["xcw"] = "Coahuilteco",
["xcy"] = "Cayuse",
["xda"] = "Darkinjung",
["xdc"] = "Dacian",
["xdk"] = "Dharug",
["xdm"] = "Edomite",
["xdq"] = "Kaitag",
["xdy"] = "Malayic Dayak",
["xeb"] = "Eblaite",
["xed"] = "Hdi",
["xeg"] = "ǁXegwi",
["xel"] = "Kelo",
["xem"] = "Kembayan",
["xep"] = "Epi-Olmec",
["xer"] = "Xerénte",
["xes"] = "Koromu",
["xet"] = "Xetá",
["xeu"] = "Keoru-Ahia",
["xfa"] = "Faliscan",
["xga"] = "Galatian",
["xgb"] = "Gbin",
["xgd"] = "Gudang",
["xgf"] = "Gabrielino-Fernandeño",
["xgg"] = "Goreng",
["xgi"] = "Garingbal",
["xgl"] = "Galindian",
["xgm"] = "Darumbal",
["xgn-pro"] = "Proto-Mongolic",
["xgr"] = "Garza",
["xgu"] = "Unggumi",
["xgw"] = "Guwa",
["xh"] = "Xhosa",
["xha"] = "Harami",
["xhc"] = "Hunnic",
["xhd"] = "Hadrami",
["xhe"] = "Khetrani",
["xhm"] = "Middle Khmer",
["xhr"] = "Hernican",
["xht"] = "Hattic",
["xhu"] = "Hurrian",
["xhv"] = "Khua",
["xib"] = "Iberian",
["xii"] = "Xiri",
["xil"] = "Illyrian",
["xin"] = "Xinca",
["xir"] = "Xiriâna",
["xis"] = "Kisan",
["xiv"] = "Harappan",
["xiy"] = "Xipaya",
["xjb"] = "Minjungbal",
["xka"] = "Kalkoti",
["xkb"] = "Manigri-Kambolé Ede Nago",
["xkc"] = "Khoini",
["xkd"] = "Mendalam Kayan",
["xke"] = "Kereho",
["xkf"] = "Khengkha",
["xkg"] = "Kagoro",
["xki"] = "Kenyan Sign Language",
["xkj"] = "Kajali",
["xkk"] = "Kaco'",
["xkl"] = "Bakung",
["xkn"] = "Kayan River Kayan",
["xko"] = "Kiorr",
["xkp"] = "Kabatei",
["xkq"] = "Koroni",
["xkr"] = "Xakriabá",
["xks"] = "Kumbewaha",
["xkt"] = "Kantosi",
["xku"] = "Kaamba",
["xkv"] = "Kgalagadi",
["xkw"] = "Kembra",
["xkx"] = "Karore",
["xky"] = "Uma' Lasan",
["xkz"] = "Kurtöp",
["xla"] = "Kamula",
["xlb"] = "Loup B",
["xlc"] = "Lycian",
["xld"] = "Lydian",
["xle"] = "Lemnian",
["xlg"] = "Ancient Ligurian",
["xli"] = "Liburnian",
["xln"] = "Alanic",
["xlo"] = "Loup A",
["xlp"] = "Lepontic",
["xls"] = "Lusitanian",
["xlu"] = "Luwian",
["xly"] = "Elymian",
["xmb"] = "Mbonga",
["xmc"] = "Makhuwa-Marrevone",
["xmd"] = "Mbudum",
["xme-ker"] = "Kermanic",
["xme-kls"] = "Kalasuri",
["xme-klt"] = "Kilit",
["xme-mid"] = "Middle Median",
["xme-old"] = "Old Median",
["xme-ott"] = "Old Tati",
["xme-taf"] = "Tafreshi",
["xme-ttc-pro"] = "Proto-Tatic",
["xmf"] = "Mingrelian",
["xmg"] = "Mengaka",
["xmh"] = "Kugu-Muminh",
["xmj"] = "Majera",
["xmk"] = "Ancient Macedonian",
["xml"] = "Malaysian Sign Language",
["xmm"] = "Manado Malay",
["xmo"] = "Morerebi",
["xmp"] = "Kuku-Mu'inh",
["xmq"] = "Kuku-Mangk",
["xmr"] = "Meroitic",
["xms"] = "Moroccan Sign Language",
["xmt"] = "Matbat",
["xmu"] = "Kamu",
["xmx"] = "Maden",
["xmy"] = "Mayaguduna",
["xmz"] = "Mori Bawah",
["xna"] = "Ancient North Arabian",
["xnb"] = "Kanakanabu",
["xnd-pro"] = "Proto-Na-Dene",
["xng"] = "Middle Mongol",
["xnh"] = "Kuanhua",
["xni"] = "Ngarigu",
["xnk"] = "Nganakarti",
["xnr"] = "Kangri",
["xns"] = "Kanashi",
["xnt"] = "Narragansett",
["xnu"] = "Nukunul",
["xny"] = "Nyiyaparli",
["xoc"] = "O'chi'chi'",
["xod"] = "Kokoda",
["xog"] = "Soga",
["xoi"] = "Kominimung",
["xok"] = "Xokleng",
["xom"] = "Komo",
["xon"] = "Konkomba",
["xoo"] = "Xukurú",
["xop"] = "Kopar",
["xor"] = "Korubo",
["xow"] = "Kowaki",
["xpa"] = "Pirriya",
["xpb"] = "Pyemmairre",
["xpc"] = "Pecheneg",
["xpd"] = "Paredarerme",
["xpe"] = "Liberia Kpelle",
["xpf"] = "Southeast Tasmanian",
["xpg"] = "Phrygian",
["xph"] = "Tyerrernotepanner",
["xpi"] = "Pictish",
["xpj"] = "Mpalitjanh",
["xpk"] = "Kulina",
["xpl"] = "Port Sorell",
["xpm"] = "Pumpokol",
["xpn"] = "Kapinawá",
["xpo"] = "Pochutec",
["xpp"] = "Puyo-Paekche",
["xpq"] = "Mohegan-Pequot",
["xpr"] = "Parthian",
["xps"] = "Pisidian",
["xpu"] = "Punic",
["xpv"] = "Tommeginne",
["xpw"] = "Peerapper",
["xpx"] = "Toogee",
["xpy"] = "Buyeo",
["xpz"] = "Bruny Island",
["xqa"] = "Karakhanid",
["xqt"] = "Qatabanian",
["xra"] = "Krahô",
["xrb"] = "Eastern Karaboro",
["xrd"] = "Gundungurra",
["xre"] = "Kreye",
["xrg"] = "Minang",
["xri"] = "Krikati-Timbira",
["xrm"] = "Armazic",
["xrn"] = "Arin",
["xrq"] = "Karranga",
["xrr"] = "Raetic",
["xrt"] = "Aranama-Tamique",
["xru"] = "Marriammu",
["xrw"] = "Karawa",
["xsa"] = "Sabaean",
["xsb"] = "Sambali",
["xsc-pro"] = "Proto-Scythian",
["xsc-sak-pro"] = "Proto-Saka",
["xsc-sar-pro"] = "Proto-Sarmatian",
["xsc-skw-pro"] = "Proto-Saka-Wakhi",
["xsd"] = "Sidetic",
["xse"] = "Sempan",
["xsh"] = "Shamang",
["xsi"] = "Sio",
["xsj"] = "Subi",
["xsl"] = "South Slavey",
["xsm"] = "Kasem",
["xsn"] = "Sanga (Nigeria)",
["xso"] = "Solano",
["xsp"] = "Silopi",
["xsq"] = "Makhuwa-Saka",
["xsr"] = "Sherpa",
["xss"] = "Assan",
["xsu"] = "Sanumá",
["xsv"] = "Sudovian",
["xsy"] = "Saisiyat",
["xta"] = "Alcozauca Mixtec",
["xtb"] = "Chazumba Mixtec",
["xtc"] = "Kadugli",
["xtd"] = "Diuxi-Tilantongo Mixtec",
["xte"] = "Ketengban",
["xth"] = "Yitha Yitha",
["xti"] = "Sinicahua Mixtec",
["xtj"] = "San Juan Teita Mixtec",
["xtl"] = "Tijaltepec Mixtec",
["xtm"] = "Magdalena Peñasco Mixtec",
["xtn"] = "Northern Tlaxiaco Mixtec",
["xto"] = "Tocharian A",
["xtp"] = "San Miguel Piedras Mixtec",
["xtq"] = "Tumshuqese",
["xtr"] = "Early Tripuri",
["xts"] = "Sindihui Mixtec",
["xtt"] = "Tacahua Mixtec",
["xtu"] = "Cuyamecalco Mixtec",
["xtv"] = "Thawa",
["xtw"] = "Tawandê",
["xty"] = "Yoloxochitl Mixtec",
["xua"] = "Alu Kurumba",
["xub"] = "Betta Kurumba",
["xud"] = "Umiida",
["xug"] = "Kunigami",
["xuj"] = "Jennu Kurumba",
["xul"] = "Ngunawal",
["xum"] = "Umbrian",
["xun"] = "Unggaranggu",
["xuo"] = "Kuo",
["xup"] = "Upper Umpqua",
["xur"] = "Urartian",
["xut"] = "Kuthant",
["xuu"] = "Khwe",
["xve"] = "Venetic",
["xvn"] = "Vandalic",
["xvo"] = "Volscian",
["xvs"] = "Vestinian",
["xwa"] = "Kwaza",
["xwc"] = "Woccon",
["xwd"] = "Wadi Wadi",
["xwe"] = "Xwela Gbe",
["xwg"] = "Kwegu",
["xwj"] = "Wajuk",
["xwk"] = "Wangkumara",
["xwl"] = "Western Xwla Gbe",
["xwo"] = "Written Oirat",
["xwr"] = "Kwerba Mamberamo",
["xww"] = "Wemba-Wemba",
["xxb"] = "Boro",
["xxk"] = "Ke'o",
["xxm"] = "Minkin",
["xxr"] = "Koropó",
["xxt"] = "Tambora",
["xya"] = "Yaygir",
["xyb"] = "Yandjibara",
["xyl"] = "Yalakalore",
["xyt"] = "Mayi-Thakurti",
["xyy"] = "Yorta Yorta",
["xzh"] = "Zhang-Zhung",
["xzm"] = "Semigallian",
["xzp"] = "Ancient Zapotec",
["yaa"] = "Yaminahua",
["yab"] = "Yuhup",
["yac"] = "Pass Valley Yali",
["yad"] = "Yagua",
["yae"] = "Pumé",
["yaf"] = "Yaka",
["yag"] = "Yámana",
["yah"] = "Yazghulami",
["yai"] = "Yaghnobi",
["yaj"] = "Banda-Yangere",
["yak"] = "Yakima",
["yal"] = "Yalunka",
["yam"] = "Yamba",
["yan"] = "Mayangna",
["yao"] = "Yao (Africa)",
["yap"] = "Yapese",
["yaq"] = "Yaqui",
["yar"] = "Yabarana",
["yas"] = "Gunu",
["yat"] = "Yambeta",
["yau"] = "Yuwana",
["yav"] = "Yangben",
["yaw"] = "Yawalapití",
["yay"] = "Agwagwune",
["yaz"] = "Lokaa",
["yba"] = "Yala",
["ybb"] = "Yemba",
["ybe"] = "Western Yugur",
["ybh"] = "Yakkha",
["ybi"] = "Yamphu",
["ybj"] = "Hasha",
["ybk"] = "Bokha",
["ybl"] = "Yukuben",
["ybm"] = "Yaben",
["ybn"] = "Yabaâna",
["ybo"] = "Yabong",
["ybx"] = "Yawiyo",
["yby"] = "Yaweyuha",
["ych"] = "Chesu",
["ycl"] = "Lolopo",
["ycn"] = "Yucuna",
["ycp"] = "Chepya",
["ycr"] = "Yilan Creole",
["yda"] = "Yanda",
["yde"] = "Yangum Dey",
["ydg"] = "Yidgha",
["ydk"] = "Yoidik",
["yea"] = "Ravula",
["yec"] = "Yenish",
["yee"] = "Yimas",
["yei"] = "Yeni",
["yej"] = "Yevanic",
["yen"] = "Yendang",
["yer"] = "Tarok",
["yes"] = "Yeskwa",
["yet"] = "Yetfa",
["yeu"] = "Yerukula",
["yev"] = "Yeri",
["yey"] = "Yeyi",
["ygi"] = "Yiningayi",
["ygl"] = "Yangum Gel",
["ygm"] = "Yagomi",
["ygp"] = "Gepo",
["ygr"] = "Yagaria",
["ygs"] = "Yolngu Sign Language",
["ygu"] = "Yugul",
["ygw"] = "Yagwoia",
["yha"] = "Baha",
["yhl"] = "Hlepho Phowa",
["yi"] = "Yiddish",
["yia"] = "Yinggarda",
["yif"] = "Ache",
["yig"] = "Wusa",
["yii"] = "Yidiny",
["yij"] = "Yindjibarndi",
["yik"] = "Dongshanba Lalo",
["yil"] = "Yindjilandji",
["yim"] = "Yimchungru Naga",
["yin"] = "Yinchia",
["yip"] = "Pholo",
["yiq"] = "Micha",
["yir"] = "North Awyu",
["yis"] = "Yis",
["yit"] = "Eastern Lalu",
["yiu"] = "Lope",
["yiv"] = "Northern Nisu",
["yix"] = "Axi",
["yiy"] = "Yir-Yoront",
["yiz"] = "Azhe",
["yka"] = "Yakan",
["ykg"] = "Northern Yukaghir",
["ykh"] = "Khamnigan Mongol",
["yki"] = "Yoke",
["ykk"] = "Yakaikeke",
["ykl"] = "Khlula",
["ykm"] = "Kap",
["ykn"] = "Kua-nsi",
["yko"] = "Yasa",
["ykr"] = "Yekora",
["ykt"] = "Kathu",
["yku"] = "Kuamasi",
["yky"] = "Yakoma",
["yla"] = "Ulwa (New Guinea)",
["ylb"] = "Yaleba",
["yle"] = "Yele",
["ylg"] = "Yelogu",
["yli"] = "Angguruk Yali",
["yll"] = "Yil",
["ylm"] = "Limi",
["yln"] = "Langnian Buyang",
["ylo"] = "Naruo",
["ylr"] = "Yalarnnga",
["ylu"] = "Aribwaung",
["yly"] = "Nyelâyu",
["ymb"] = "Yambes",
["ymc"] = "Southern Muji",
["ymd"] = "Muda",
["yme"] = "Yameo",
["ymg"] = "Yamongeri",
["ymh"] = "Mili",
["ymi"] = "Moji",
["ymk"] = "Makwe",
["yml"] = "Iamalele",
["ymm"] = "Maay",
["ymn"] = "Sunum",
["ymo"] = "Yangum Mon",
["ymp"] = "Yamap",
["ymq"] = "Qila Muji",
["ymr"] = "Malasar",
["yms"] = "Mysian",
["ymx"] = "Northern Muji",
["ymz"] = "Muzi",
["yna"] = "Aluo",
["ynb"] = "Yamben",
["ynd"] = "Yandruwandha",
["yne"] = "Lang'e",
["yng"] = "Yango",
["ynk"] = "Naukanski",
["ynl"] = "Yangulam",
["ynn"] = "Yana",
["yno"] = "Yong",
["yns"] = "Yansi",
["ynu"] = "Yahuna",
["yo"] = "Yoruba",
["yob"] = "Yoba",
["yog"] = "Yogad",
["yoi"] = "Yonaguni",
["yok-bvy"] = "Buena Vista Yokuts",
["yok-dly"] = "Delta Yokuts",
["yok-gsy"] = "Gashowu Yokuts",
["yok-kry"] = "Kings River Yokuts",
["yok-nvy"] = "Northern Valley Yokuts",
["yok-ply"] = "Palewyami Yokuts",
["yok-svy"] = "Southern Valley Yokuts",
["yok-tky"] = "Tule-Kaweah Yokuts",
["yol"] = "Yola",
["yom"] = "Yombe",
["yon"] = "Yongkom",
["yox"] = "Yoron",
["yoy"] = "Yoy",
["ypa"] = "Phala",
["ypb"] = "Labo Phowa",
["ypg"] = "Phola",
["yph"] = "Phupha",
["ypk-pro"] = "Proto-Yupik",
["ypm"] = "Phuma",
["ypn"] = "Ani Phowa",
["ypo"] = "Alo Phola",
["ypp"] = "Phupa",
["ypz"] = "Phuza",
["yra"] = "Yerakai",
["yrb"] = "Yareba",
["yre"] = "Yaouré",
["yri"] = "Yarí",
["yrk-for"] = "Forest Nenets",
["yrk-tun"] = "Tundra Nenets",
["yrl"] = "Nheengatu",
["yrn"] = "Yerong",
["yro"] = "Ỹaroamë",
["yrw"] = "Yarawata",
["yry"] = "Yarluyandi",
["ysc"] = "Jassic",
["ysd"] = "Samatao",
["ysg"] = "Sonaga",
["ysl"] = "Yugoslavian Sign Language",
["ysn"] = "Sani",
["yso"] = "Nisi",
["ysp"] = "Southern Lolopo",
["ysr"] = "Sirenik",
["yss"] = "Yessan-Mayo",
["ysy"] = "Sanie",
["yta"] = "Talu",
["ytl"] = "Toloza",
["ytp"] = "Thopho",
["ytw"] = "Yout Wam",
["yty"] = "Yatay",
["yua"] = "Yucatec Maya",
["yub"] = "Yugambal",
["yuc"] = "Yuchi",
["yue"] = "Cantonese",
["yuf"] = "Havasupai-Walapai-Yavapai",
["yug"] = "Yug",
["yui"] = "Yurutí",
["yuj"] = "Karkar-Yuri",
["yuk"] = "Yuki",
["yul"] = "Yulu",
["yum"] = "Yuma",
["yun"] = "Bena",
["yup"] = "Yukpa",
["yuq"] = "Yuqui",
["yur"] = "Yurok",
["yut"] = "Yopno",
["yuw"] = "Yau (Finisterre)",
["yux"] = "Southern Yukaghir",
["yuy"] = "East Yugur",
["yuz"] = "Yuracare",
["yva"] = "Yawa",
["yvt"] = "Yavitero",
["ywa"] = "Kalou",
["ywg"] = "Yinhawangka",
["ywl"] = "Western Lalu",
["ywn"] = "Yawanawa",
["ywq"] = "Nasu",
["ywr"] = "Yawuru",
["ywt"] = "Xishanba Lalo",
["ywu"] = "Wumeng",
["yww"] = "Yawarawarga",
["yxa"] = "Mayawali",
["yxg"] = "Yagara",
["yxl"] = "Yarli",
["yxm"] = "Yinwum",
["yxu"] = "Yuyu",
["yxy"] = "Yabula Yabula",
["yyu"] = "Yau (Torricelli)",
["yyz"] = "Ayizi",
["yzg"] = "E'ma Buyang",
["yzk"] = "Zokhuo",
["za"] = "Zhuang",
["zaa"] = "Sierra de Juárez Zapotec",
["zab"] = "San Juan Guelavía Zapotec",
["zac"] = "Ocotlán Zapotec",
["zad"] = "Cajonos Zapotec",
["zae"] = "Yareni Zapotec",
["zaf"] = "Ayoquesco Zapotec",
["zag"] = "Zaghawa",
["zah"] = "Zangwal",
["zai"] = "Isthmus Zapotec",
["zaj"] = "Zaramo",
["zak"] = "Zanaki",
["zal"] = "Zauzou",
["zam"] = "Central Mahuatlán Zapotec",
["zao"] = "Ozolotepec Zapotec",
["zap"] = "Zapotec",
["zaq"] = "Aloápam Zapotec",
["zar"] = "Rincón Zapotec",
["zas"] = "Santo Domingo Albarradas Zapotec",
["zat"] = "Tabaa Zapotec",
["zau"] = "Zangskari",
["zav"] = "Yatzachi Zapotec",
["zaw"] = "Mitla Zapotec",
["zax"] = "Xadani Zapotec",
["zay"] = "Zayse-Zergulla",
["zaz"] = "Zari",
["zbt"] = "Batui",
["zca"] = "Coatecas Altas Zapotec",
["zdj"] = "Ngazidja Comorian",
["zea"] = "Zealandic",
["zeg"] = "Zenag",
["zen"] = "Zenaga",
["zga"] = "Kinga",
["zgh"] = "Moroccan Amazigh",
["zgr"] = "Magori",
["zh"] = "Chinese",
["zhb"] = "Zhaba",
["zhi"] = "Zhire",
["zhn"] = "Nong Zhuang",
["zhw"] = "Zhoa",
["zhx-min-pro"] = "Proto-Min",
["zhx-sht"] = "Shaozhou Tuhua",
["zhx-sic"] = "Sichuanese",
["zhx-tai"] = "Taishanese",
["zia"] = "Zia",
["zib"] = "Zimbabwe Sign Language",
["zik"] = "Zimakani",
["zil"] = "Zialo",
["zim"] = "Mesme",
["zin"] = "Zinza",
["zir"] = "Ziriya",
["ziw"] = "Zigula",
["ziz"] = "Zizilivakan",
["zka"] = "Kaimbulawa",
["zkb"] = "Koibal",
["zkd"] = "Kadu (Myanmar)",
["zkg"] = "Goguryeo",
["zkh"] = "Khorezmian Turkic",
["zkk"] = "Karankawa",
["zko"] = "Kott",
["zkp"] = "São Paulo Kaingáng",
["zkr"] = "Zakhring",
["zkt"] = "Khitan",
["zku"] = "Kaurna",
["zkv"] = "Krevinian",
["zkz"] = "Khazar",
["zle-ono"] = "Old Novgorodian",
["zle-ort"] = "Old Ruthenian",
["zls-chs"] = "Church Slavonic",
["zlw-ocs"] = "Old Czech",
["zlw-opl"] = "Old Polish",
["zlw-osk"] = "Old Slovak",
["zlw-slv"] = "Slovincian",
["zma"] = "Manda (Australia)",
["zmb"] = "Zimba",
["zmc"] = "Margany",
["zmd"] = "Maridan",
["zme"] = "Mangerr",
["zmf"] = "Mfinu",
["zmg"] = "Marti Ke",
["zmh"] = "Makolkol",
["zmi"] = "Negeri Sembilan Malay",
["zmj"] = "Maridjabin",
["zmk"] = "Mandandanyi",
["zml"] = "Madngele",
["zmm"] = "Marimanindji",
["zmn"] = "Mbangwe",
["zmo"] = "Molo",
["zmp"] = "Mbuun",
["zmq"] = "Mituku",
["zmr"] = "Maranungku",
["zms"] = "Mbesa",
["zmt"] = "Maringarr",
["zmu"] = "Muruwari",
["zmv"] = "Mbariman-Gudhinma",
["zmw"] = "Mbo (Congo)",
["zmx"] = "Bomitaba",
["zmy"] = "Mariyedi",
["zmz"] = "Mbandja",
["zna"] = "Zan Gula",
["zne"] = "Zande",
["zng"] = "Mang",
["znk"] = "Manangkari",
["zns"] = "Mangas",
["zoc"] = "Copainalá Zoque",
["zoh"] = "Chimalapa Zoque",
["zom"] = "Zou",
["zoo"] = "Asunción Mixtepec Zapotec",
["zoq"] = "Tabasco Zoque",
["zor"] = "Rayón Zoque",
["zos"] = "Francisco León Zoque",
["zpa"] = "Lachiguiri Zapotec",
["zpb"] = "Yautepec Zapotec",
["zpc"] = "Choapan Zapotec",
["zpd"] = "Southeastern Ixtlán Zapotec",
["zpe"] = "Petapa Zapotec",
["zpf"] = "San Pedro Quiatoni Zapotec",
["zpg"] = "Guevea de Humboldt Zapotec",
["zph"] = "Totomachapan Zapotec",
["zpi"] = "Santa María Quiegolani Zapotec",
["zpj"] = "Quiavicuzas Zapotec",
["zpk"] = "Tlacolulita Zapotec",
["zpl"] = "Lachixío Zapotec",
["zpm"] = "Mixtepec Zapotec",
["zpn"] = "Santa Inés Yatzechi Zapotec",
["zpo"] = "Amatlán Zapotec",
["zpp"] = "El Alto Zapotec",
["zpq"] = "Zoogocho Zapotec",
["zpr"] = "Santiago Xanica Zapotec",
["zps"] = "Coatlán Zapotec",
["zpt"] = "San Vicente Coatlán Zapotec",
["zpu"] = "Yalálag Zapotec",
["zpv"] = "Chichicapan Zapotec",
["zpw"] = "Zaniza Zapotec",
["zpx"] = "San Baltazar Loxicha Zapotec",
["zpy"] = "Mazaltepec Zapotec",
["zpz"] = "Texmelucan Zapotec",
["zra"] = "Gaya",
["zrg"] = "Mirgan",
["zrn"] = "Zirenkel",
["zro"] = "Záparo",
["zrs"] = "Mairasi",
["zsa"] = "Sarasira",
["zsk"] = "Kaskean",
["zsl"] = "Zambian Sign Language",
["zsr"] = "Southern Rincon Zapotec",
["zsu"] = "Sukurum",
["zte"] = "Elotepec Zapotec",
["ztg"] = "Xanaguía Zapotec",
["ztl"] = "Lapaguía-Guivini Zapotec",
["ztm"] = "San Agustín Mixtepec Zapotec",
["ztn"] = "Santa Catarina Albarradas Zapotec",
["ztp"] = "Loxicha Zapotec",
["ztq"] = "Quioquitani-Quierí Zapotec",
["zts"] = "Tilquiapan Zapotec",
["ztt"] = "Tejalapan Zapotec",
["ztu"] = "San Pablo Güilá Zapotec",
["ztx"] = "Zaachila Zapotec",
["zty"] = "Yatee Zapotec",
["zu"] = "Zulu",
["zua"] = "Zeem",
["zuh"] = "Tokano",
["zum"] = "Kumzari",
["zun"] = "Zuni",
["zuy"] = "Zumaya",
["zwa"] = "Zay",
["zyp"] = "Zyphe",
["zza"] = "Zazaki",
["zzj"] = "Zuojiang Zhuang",
}
2d72j95294gd1u2gzv1hbvvpo0q61oy
Module:etymology languages/code to canonical name
828
5994
17431
2026-07-13T08:41:51Z
Hiyuune
6766
+
17431
Scribunto
text/plain
return {
["aae"] = "Arbëresh Albanian",
["aat"] = "Arvanitika Albanian",
["abr"] = "Abron",
["acm-khu"] = "Khuzestani Arabic",
["act"] = "Achterhoeks",
["adx"] = "Amdo Tibetan",
["ae-old"] = "Old Avestan",
["ae-yng"] = "Younger Avestan",
["ain-hok"] = "Hokkaido Ainu",
["ain-kur"] = "Kuril Ainu",
["ain-sak"] = "Sakhalin Ainu",
["akk-lbb"] = "Late Babylonian",
["akk-mas"] = "Middle Assyrian",
["akk-mbb"] = "Middle Babylonian",
["akk-nas"] = "Neo-Assyrian",
["akk-nbb"] = "Neo-Babylonian",
["akk-oas"] = "Old Assyrian",
["akk-obb"] = "Old Babylonian",
["akk-old"] = "Old Akkadian",
["akk-stb"] = "Standard Babylonian",
["aln"] = "Gheg Albanian",
["als"] = "Tosk Albanian",
["alv-kro"] = "Kromanti",
["ang-ang"] = "Anglian Old English",
["ang-ken"] = "Kentish Old English",
["ang-mer"] = "Mercian Old English",
["ang-nor"] = "Northumbrian Old English",
["ang-wsx"] = "West Saxon Old English",
["apc-ale"] = "Aleppine North Levantine Arabic",
["apc-dam"] = "Damascene North Levantine Arabic",
["apc-leb"] = "Lebanese North Levantine Arabic",
["apc-nle"] = "North Lebanese North Levantine Arabic",
["apc-sle"] = "South Lebanese North Levantine Arabic",
["apc-syr"] = "Syrian North Levantine Arabic",
["arc-bib"] = "Biblical Aramaic",
["arc-cpa"] = "Christian Palestinian Aramaic",
["arc-hat"] = "Hatran Aramaic",
["arc-imp"] = "Imperial Aramaic",
["arc-jla"] = "Jewish Literary Aramaic",
["arc-nab"] = "Nabataean Aramaic",
["arc-old"] = "Old Aramaic",
["arc-pal"] = "Palmyrene Aramaic",
["as-bkm"] = "Barpetia Kamrupi Assamese",
["as-nkm"] = "Nalbaria Kamrupi Assamese",
["as-pkm"] = "Palasbaria Kamrupi Assamese",
["atn"] = "Ashtiani",
["az-cls"] = "Classical Azerbaijani",
["bat-dni"] = "Dnieper Baltic",
["bat-gol"] = "Golyad",
["bat-pro"] = "Proto-Baltic",
["bcc"] = "Southern Balochi",
["bew-kot"] = "Betawi Kota",
["bgn"] = "Western Balochi",
["bgp"] = "Eastern Balochi",
["bn-dvn"] = "Dhakaiya Vaṅga Bengali",
["bn-nvn"] = "Noakhailla Vaṅga Bengali",
["bnt-cmn"] = "Common Bantu",
["bra-old"] = "Old Braj",
["bry-ear"] = "Early Brythonic",
["bry-lat"] = "Late Brythonic",
["bsg-ban"] = "Bandari",
["bsg-hor"] = "Hormozi",
["bsg-min"] = "Minabi",
["bsh-kat"] = "Kativiri",
["bsh-mum"] = "Mumviri",
["ca-val"] = "Valencian",
["ckm"] = "Chakavian Serbo-Croatian",
["cls"] = "Classical Sanskrit",
["cmn-MY"] = "Malaysian Mandarin",
["cmn-PH"] = "Philippine Mandarin",
["cmn-SG"] = "Singapore Mandarin",
["cmn-TW"] = "Taiwanese Mandarin",
["cmn-bec"] = "Beijingic Mandarin",
["cmn-bei"] = "Beijing Mandarin",
["cmn-cep"] = "Central Plains Mandarin",
["cmn-ear"] = "Early Mandarin",
["cmn-gua"] = "Guanzhong Mandarin",
["cmn-gui"] = "Guilin Mandarin",
["cmn-jhu"] = "Jianghuai Mandarin",
["cmn-lan"] = "Lanyin Mandarin",
["cmn-nan"] = "Nanjing Mandarin",
["cmn-noe"] = "Northeastern Mandarin",
["cmn-palladius"] = "Palladius",
["cmn-pinyin"] = "Hanyu Pinyin",
["cmn-sow"] = "Southwestern Mandarin",
["cmn-tia"] = "Tianjin Mandarin",
["cmn-tongyong"] = "Tongyong Pinyin",
["cmn-wadegiles"] = "Wade–Giles",
["cmn-wuh"] = "Wuhan Mandarin",
["cmn-wvc"] = "Written vernacular Mandarin",
["cmn-xin"] = "Xining Mandarin",
["cmn-yan"] = "Yangzhou Mandarin",
["cop-akh"] = "Akhmimic Coptic",
["cop-boh"] = "Bohairic Coptic",
["cop-fay"] = "Fayyumic Coptic",
["cop-ggg"] = "Coptic Dialect G",
["cop-her"] = "Hermopolitan Coptic",
["cop-jjj"] = "Coptic Dialect J",
["cop-kkk"] = "Coptic Dialect K",
["cop-lyc"] = "Lycopolitan Coptic",
["cop-old"] = "Old Coptic",
["cop-oxy"] = "Oxyrhynchite Coptic",
["cop-ply"] = "Proto-Lycopolitan Coptic",
["cop-ppp"] = "Coptic Dialect P",
["cop-sah"] = "Sahidic Coptic",
["crh-dbj"] = "Dobrujan Tatar",
["crp-cpr-kya"] = "Kyakhta Chinese Pidgin Russian",
["cs-ear"] = "Early Modern Czech",
["cu-bgm"] = "Middle Bulgarian",
["cv-ana"] = "Anatri Chuvash",
["cv-mid"] = "Middle Chuvash",
["cv-old"] = "Old Chuvash",
["cv-vir"] = "Viryal Chuvash",
["cy-nor"] = "North Wales Welsh",
["cy-sou"] = "South Wales Welsh",
["de-AT"] = "Austrian German",
["de-AT-vie"] = "Viennese German",
["de-CH"] = "Switzerland German",
["de-bal"] = "Baltic German",
["de-ear"] = "Early New High German",
["drt"] = "Drents",
["dv-add"] = "Addu Dhivehi",
["dv-huv"] = "Huvadhu Dhivehi",
["dv-mul"] = "Mulaku Dhivehi",
["dv-old"] = "Old Dhivehi",
["egl-old"] = "Old Emilian",
["egy-lat"] = "Late Egyptian",
["egy-mid"] = "Middle Egyptian",
["egy-nmi"] = "Neo-Middle Egyptian",
["egy-old"] = "Old Egyptian",
["el-crt"] = "Cretan Greek",
["el-cyp"] = "Cypriot Greek",
["el-kal"] = "Kaliarda",
["el-kth"] = "Katharevousa",
["el-pap"] = "Paphian Greek",
["elx-ach"] = "Achaemenid Elamite",
["elx-mid"] = "Middle Elamite",
["elx-neo"] = "Neo-Elamite",
["elx-old"] = "Old Elamite",
["en-AU"] = "Australian English",
["en-CA"] = "Canadian English",
["en-GB"] = "British English",
["en-GB-NIR"] = "Northern Irish English",
["en-GB-SCT"] = "Scottish English",
["en-GB-WLS"] = "Welsh English",
["en-HK"] = "Hong Kong English",
["en-IE"] = "Irish English",
["en-IM"] = "Manx English",
["en-IN"] = "Indian English",
["en-NNN"] = "North American English",
["en-NZ"] = "New Zealand English",
["en-US"] = "American English",
["en-US-CA"] = "California English",
["en-ZA"] = "South African English",
["en-aae"] = "Australian Aboriginal English",
["en-ear"] = "Early Modern English",
["en-geo"] = "Geordie",
["en-uls"] = "Ulster English",
["enm-emi"] = "East Midland Middle English",
["enm-esc"] = "Early Scots",
["enm-ken"] = "Kentish Middle English",
["enm-nor"] = "Northern Middle English",
["enm-sou"] = "Southern Middle English",
["enm-wmi"] = "West Midland Middle English",
["es-AR"] = "Rioplatense Spanish",
["es-BO"] = "Bolivian Spanish",
["es-CL"] = "Chilean Spanish",
["es-CO"] = "Colombian Spanish",
["es-CU"] = "Cuban Spanish",
["es-MX"] = "Mexican Spanish",
["es-PE"] = "Peruvian Spanish",
["es-PH"] = "Philippine Spanish",
["es-PR"] = "Puerto Rican Spanish",
["es-US"] = "United States Spanish",
["es-VE"] = "Venezuelan Spanish",
["es-ear"] = "Early Modern Spanish",
["es-lun"] = "Lunfardo",
["esi"] = "North Alaskan Inupiatun",
["esk"] = "Northwest Alaskan Inupiatun",
["fa-cls"] = "Classical Persian",
["fa-ear"] = "Early New Persian",
["fa-ira"] = "Iranian Persian",
["fat"] = "Fante Akan",
["fay-bsh"] = "Bushehri",
["fay-bur"] = "Burenjani",
["fay-dav"] = "Davani",
["fay-dsh"] = "Dashtaki",
["fay-eze"] = "Emamzada Esmaili",
["fay-gav"] = "Gavkoshaki",
["fay-kar"] = "Khargi",
["fay-kho"] = "Khollari",
["fay-kon"] = "Kondazi",
["fay-kzo"] = "Old Kazeruni",
["fay-mas"] = "Masarami",
["fay-pap"] = "Papuni",
["fay-sam"] = "Samghani",
["fay-sho"] = "Old Shirazi",
["fay-shr"] = "Shirazi",
["fay-sor"] = "Sorkhi",
["ffm"] = "Maasina Fulfulde",
["fiu-pro"] = "Proto-Finno-Ugric",
["fr-CA"] = "Canadian French",
["fr-CH"] = "Swiss French",
["fr-aca"] = "Acadian French",
["fr-lou"] = "Louisiana French",
["fr-mis"] = "Missouri French",
["frc"] = "Cajun French",
["frk"] = "Frankish",
["fro-nor"] = "Old Northern French",
["fro-pic"] = "Picard Old French",
["frp-old"] = "Old Franco-Provençal",
["frr-amr"] = "Amrum North Frisian",
["frr-fam"] = "Föhr-Amrum North Frisian",
["frr-foh"] = "Föhr North Frisian",
["frr-goe"] = "Goesharde North Frisian",
["frr-hal"] = "Halligen North Frisian",
["frr-hel"] = "Heligoland North Frisian",
["frr-ins"] = "Insular North Frisian",
["frr-kar"] = "Karrharde North Frisian",
["frr-mai"] = "Mainland North Frisian",
["frr-moo"] = "Mooring North Frisian",
["frr-syl"] = "Sylt North Frisian",
["frr-wie"] = "Wiedingharde North Frisian",
["frs"] = "East Frisian Low German",
["fub"] = "Adamawa Fulfulde",
["fuc"] = "Pulaar",
["fue"] = "Borgu Fulfulde",
["fuf"] = "Pular",
["fuh"] = "Western Niger Fulfulde",
["fui"] = "Bagirmi Fulfulde",
["fuq"] = "Central-Eastern Niger Fulfulde",
["fur-old"] = "Old Friulian",
["fuv"] = "Nigerian Fulfulde",
["gax"] = "Borana",
["gbz"] = "Zoroastrian Dari",
["gem-sue"] = "Suevic",
["gkm"] = "Byzantine Greek",
["gmq-osw-lat"] = "Late Old Swedish",
["gmw-afr-pro"] = "Proto-Anglo-Frisian",
["gmw-nsg-pro"] = "Proto-North Sea Germanic",
["gos"] = "Gronings",
["grc-aeo"] = "Aeolic Greek",
["grc-arc"] = "Arcadian Greek",
["grc-arp"] = "Arcadocypriot Greek",
["grc-att"] = "Attic Greek",
["grc-boi"] = "Boeotian Greek",
["grc-cyp"] = "Cypriot Ancient Greek",
["grc-dor"] = "Doric Greek",
["grc-ela"] = "Elean Greek",
["grc-epi"] = "Epic Greek",
["grc-ion"] = "Ionic Greek",
["grc-koi"] = "Koine Greek",
["grc-kre"] = "Cretan Ancient Greek",
["grc-opl"] = "Opuntian Locrian",
["grc-ozl"] = "Ozolian Locrian",
["grc-pam"] = "Pamphylian Greek",
["grc-ths"] = "Thessalian Greek",
["gsw-FR-als"] = "Alsatian Alemannic German",
["gsw-hig"] = "High Alemannic German",
["gsw-hst"] = "Highest Alemannic German",
["gsw-low"] = "Low Alemannic German",
["gu-kat"] = "Kathiyawadi",
["gu-lda"] = "Lisan ud-Dawat Gujarati",
["gzi"] = "Gazi",
["hae"] = "Harar Oromo",
["hak-HK"] = "Hong Kong Hakka",
["hak-TW"] = "Taiwanese Hakka",
["hak-dab"] = "Dabu Hakka",
["hak-eam"] = "Early Modern Hakka",
["hak-hai"] = "Hailu Hakka",
["hak-hui"] = "Huiyang Hakka",
["hak-hui-MY"] = "Malaysian Huiyang Hakka",
["hak-mei"] = "Meixian Hakka",
["hak-six"] = "Sixian Hakka",
["hak-zha"] = "Zhao'an Hakka",
["haz"] = "Hazaragi",
["hbo"] = "Biblical Hebrew",
["he-IL"] = "Israeli Hebrew",
["he-med"] = "Medieval Hebrew",
["he-mis"] = "Mishnaic Hebrew",
["hi-mid"] = "Middle Hindi",
["hi-mum"] = "Bombay Hindi",
["hsn-hya"] = "Hengyang Xiang",
["hsn-hzh"] = "Hengzhou Xiang",
["hsn-lou"] = "Loudi Xiang",
["hsn-new"] = "New Xiang",
["hsn-old"] = "Old Xiang",
["ht-sdm"] = "Saint Dominican Creole French",
["hye"] = "Eastern Armenian",
["hyw"] = "Western Armenian",
["inc-aav"] = "Avahattha",
["inc-agu"] = "Gurjara Apabhramsa",
["inc-aka"] = "Kasmiri Apabhramsa",
["inc-ama"] = "Maharastri Apabhramsa",
["inc-asa"] = "Sauraseni Apabhramsa",
["inc-ash-pro"] = "Proto-Middle Indo-Aryan",
["inc-ata"] = "Takka Apabhramsa",
["inc-avr"] = "Vracada Apabhramsa",
["inc-mit"] = "Mitanni",
["iro-ohu"] = "Old Wendat",
["iro-omo"] = "Old Mohawk",
["iro-oon"] = "Old Onondaga",
["it-CH"] = "Switzerland Italian",
["itc-lan"] = "Lanuvian",
["itc-ola"] = "Old Latin",
["itc-pra"] = "Praenestine",
["ja-cla"] = "Classical Japanese",
["ja-ear"] = "Early Modern Japanese",
["ja-mid"] = "Middle Japanese",
["ja-mid-ear"] = "Early Middle Japanese",
["ja-mid-lat"] = "Late Middle Japanese",
["jpa"] = "Jewish Palestinian Aramaic",
["jrb"] = "Judeo-Arabic",
["ka-mid"] = "Middle Georgian",
["kbg"] = "Khamba",
["kea-alu"] = "ALUPEC Kabuverdianu",
["kea-bar"] = "Barlavento Kabuverdianu",
["kea-bra"] = "Brava Kabuverdianu",
["kea-bvi"] = "Boa Vista Kabuverdianu",
["kea-fog"] = "Fogo Kabuverdianu",
["kea-mai"] = "Maio Kabuverdianu",
["kea-saa"] = "Santo Antão Kabuverdianu",
["kea-sal"] = "Sal Kabuverdianu",
["kea-san"] = "Santiago Kabuverdianu",
["kea-sni"] = "São Nicolau Kabuverdianu",
["kea-sot"] = "Sotavento Kabuverdianu",
["kea-svi"] = "São Vicente Kabuverdianu",
["kfm"] = "Khunsari",
["khg"] = "Khams Tibetan",
["kho-lat"] = "Late Khotanese",
["kho-old"] = "Old Khotanese",
["kjh-fyu"] = "Fuyu Kyrgyz",
["kjv"] = "Kajkavian Serbo-Croatian",
["klj-arg"] = "Arghu",
["kn-hav"] = "Havigannada",
["kn-kun"] = "Kundagannada",
["ko-cen"] = "Central Korean",
["ko-chu"] = "Chungcheong Korean",
["ko-gan"] = "Gangwon Korean",
["ko-gyg"] = "Gyeonggi Korean",
["ko-gys"] = "Gyeongsang Korean",
["ko-ham"] = "Hamgyong Korean",
["ko-hwa"] = "Hwanghae Korean",
["ko-jeo"] = "Jeolla Korean",
["ko-pyo"] = "Pyongan Korean",
["ko-yuk"] = "Yukjin Korean",
["kok-mid"] = "Middle Konkani",
["kok-old"] = "Old Konkani",
["krl-nor"] = "North Karelian",
["krl-sou"] = "South Karelian",
["ksh"] = "Kölsch",
["kze"] = "Kosena",
["la-afr"] = "African Romance",
["la-cla"] = "Classical Latin",
["la-con"] = "Contemporary Latin",
["la-ecc"] = "Ecclesiastical Latin",
["la-eme"] = "Early Medieval Latin",
["la-lat"] = "Late Latin",
["la-med"] = "Medieval Latin",
["la-new"] = "New Latin",
["la-ren"] = "Renaissance Latin",
["la-vul"] = "Vulgar Latin",
["lij-old"] = "Old Ligurian",
["lld-amp"] = "Ampezan Ladin",
["lld-bad"] = "Badiot Ladin",
["lld-cad"] = "Cadorino Ladin",
["lld-fas"] = "Fascian Ladin",
["lld-fod"] = "Fodom Ladin",
["lld-for"] = "Fornes Ladin",
["lld-ghe"] = "Gherdëina Ladin",
["lld-non"] = "Nones Ladin",
["lmo-old"] = "Old Lombard",
["lng"] = "Lombardic",
["ltc-ear"] = "Early Middle Chinese",
["ltc-lat"] = "Late Middle Chinese",
["lut-nor"] = "Northern Lushootseed",
["lzh-KO"] = "Korean Classical Chinese",
["lzh-VI"] = "Vietnamese Classical Chinese",
["lzh-cii"] = "Ci",
["lzh-cmn"] = "Classical Mandarin",
["lzh-cmn-TW"] = "Classical Taiwanese Mandarin",
["lzh-lit"] = "Literary Chinese",
["lzh-pre"] = "Pre-Classical Chinese",
["lzh-shi"] = "Traditional Chinese poetry",
["lzh-tai"] = "Classical Taishanese",
["lzh-yue"] = "Classical Cantonese",
["mn-cha"] = "Chakhar Mongolian",
["mn-kha"] = "Khalkha Mongolian",
["mn-khr"] = "Khorchin Mongolian",
["mn-ord"] = "Ordos Mongolian",
["mns-eas"] = "Eastern Mansi",
["mns-wes"] = "Western Mansi",
["ms-cla"] = "Classical Malay",
["ms-old"] = "Old Malay",
["mul-tax"] = "taxonomic name",
["nan-anx"] = "Anxi Hokkien",
["nan-cha"] = "Changtai Hokkien",
["nan-hbl-PH"] = "Philippine Hokkien",
["nan-hbl-SG"] = "Singapore Hokkien",
["nan-hbl-TW"] = "Taiwanese Hokkien",
["nan-hou"] = "Houlu Min",
["nan-hui"] = "Hui'an Hokkien",
["nan-jin"] = "Jinjiang Hokkien",
["nan-kin"] = "Kinmenese Hokkien",
["nan-med"] = "Medan Hokkien",
["nan-pen"] = "Penang Hokkien",
["nan-qia"] = "Qianlu Min",
["nan-qua"] = "Quanzhou Hokkien",
["nan-spm"] = "Southern Malaysian Hokkien",
["nan-ton"] = "Tong'an Hokkien",
["nan-xia"] = "Xiamen Hokkien",
["nan-yon"] = "Yongchun Hokkien",
["nan-zha"] = "Zhangzhou Hokkien",
["nan-zho"] = "Zhao'an Hokkien",
["nan-zhp"] = "Zhangping Hokkien",
["nap-old"] = "Old Neapolitan",
["ncb-cam"] = "Camorta",
["ncb-kat"] = "Katchal",
["ncb-nan"] = "Nancowry",
["nds-de"] = "German Low German",
["nds-lpr"] = "Low Prussian",
["nds-nl"] = "Dutch Low Saxon",
["nl-BE"] = "Belgian Dutch",
["non-grn"] = "Greenlandic Norse",
["non-oen"] = "Old East Norse",
["non-own"] = "Old West Norse",
["nrf-grn"] = "Guernsey Norman",
["nrf-jer"] = "Jersey Norman",
["ntz"] = "Natanzi",
["nyq"] = "Nayini",
["oc-ara"] = "Aranese",
["oc-auv"] = "Auvergnat",
["oc-gas"] = "Gascon",
["oc-jud"] = "Shuadit",
["oc-lan"] = "Languedocien",
["oc-lim"] = "Limousin",
["oc-pro"] = "Provençal",
["oc-pro-old"] = "Old Provençal",
["oc-viv"] = "Vivaro-Alpine",
["och-ear"] = "Early Old Chinese",
["och-lat"] = "Late Old Chinese",
["ojp-eas"] = "Eastern Old Japanese",
["okm-ear"] = "Early Middle Korean",
["oko-lat"] = "Late Old Korean",
["okz-ang"] = "Angkorian Old Khmer",
["okz-pre"] = "Pre-Angkorian Old Khmer",
["ont"] = "Ontenu",
["oos"] = "Old Ossetic",
["oos-ear"] = "Early Old Ossetic",
["oos-lat"] = "Late Old Ossetic",
["orc"] = "Orma",
["oru-kan"] = "Kaniguram",
["oru-log"] = "Logar",
["os-dig"] = "Digor Ossetian",
["os-iro"] = "Iron Ossetian",
["osc-luc"] = "Lucanian",
["osc-sam"] = "Samnite",
["otk-kir"] = "Old Kirghiz",
["otk-ork"] = "Orkhon Turkic",
["pal-ear"] = "Early Middle Persian",
["pal-lat"] = "Late Middle Persian",
["peo-ear"] = "Early Old Persian",
["peo-lat"] = "Late Old Persian",
["pfl"] = "Palatine German",
["pl-gor"] = "Goral",
["pl-gre"] = "Greater Polish",
["pl-les"] = "Lesser Polish",
["pl-mas"] = "Masovian Polish",
["pld"] = "Polari",
["pms-old"] = "Old Piedmontese",
["pnb"] = "Western Punjabi",
["pra-abh"] = "Abhiri",
["pra-ard"] = "Ardhamagadhi Prakrit",
["pra-ava"] = "Avanti",
["pra-bah"] = "Bahliki",
["pra-can"] = "Candali",
["pra-dak"] = "Daksinatya",
["pra-dra"] = "Dramili",
["pra-hel"] = "Helu Prakrit",
["pra-kha"] = "Khasa Prakrit",
["pra-mag"] = "Magadhi Prakrit",
["pra-mah"] = "Maharastri Prakrit",
["pra-odr"] = "Odri",
["pra-pai"] = "Paisaci Prakrit",
["pra-pra"] = "Pracya",
["pra-pro"] = "Proto-New Indo-Aryan",
["pra-sab"] = "Sabari",
["pra-sak"] = "Sakari",
["pra-sau"] = "Sauraseni Prakrit",
["prs"] = "Dari",
["ps-afr"] = "Afridi",
["ps-ban"] = "Bannu",
["ps-bng"] = "Bangash",
["ps-cgi"] = "Central Ghilzay",
["ps-jad"] = "Jadrani",
["ps-kak"] = "Kakari",
["ps-kan"] = "Kandahari",
["ps-mah"] = "Mahsudi",
["ps-nea"] = "Northeastern Pashto",
["ps-nwe"] = "Northwestern Pashto",
["ps-pes"] = "Peshawari",
["ps-sea"] = "Southeastern Pashto",
["ps-ser"] = "Sher",
["ps-swe"] = "Southwestern Pashto",
["ps-waz"] = "Waziri",
["ps-xat"] = "Khatak",
["pse-bsm"] = "Besemah",
["pt-BR"] = "Brazilian Portuguese",
["pt-PT"] = "European Portuguese",
["qfa-yke-pro"] = "Proto-Ketic",
["qfa-yko-pro"] = "Proto-Kottic",
["qfa-ypm-pro"] = "Proto-Pumpokolic",
["qfa-yrn-pro"] = "Proto-Arinic",
["qsb-bal"] = "Paleo-Balkan",
["qsb-bma"] = "the BMAC substrate",
["qsb-grc"] = "Pre-Greek",
["qsb-ibe"] = "Paleo-Hispanic",
["qwm-arm"] = "Armeno-Kipchak",
["qwm-cum"] = "Cuman",
["qwm-mam"] = "Mamluk-Kipchak",
["qxq"] = "Qashqai",
["rdb-jir"] = "Jirofti",
["rdb-kah"] = "Kahnuji",
["rgn-old"] = "Old Romagnol",
["rm-gri"] = "Rumantsch Grischun",
["rm-old"] = "Old Romansh",
["rm-put"] = "Puter Romansh",
["rm-srm"] = "Surmiran Romansh",
["rm-srs"] = "Sursilvan Romansh",
["rm-sut"] = "Sutsilvan Romansh",
["rm-val"] = "Vallader Romansh",
["ro-MD"] = "Moldovan",
["roa-oit"] = "Old Italian",
["roa-pro"] = "Proto-Romance",
["rw-kin"] = "Kinyarwanda",
["rw-run"] = "Kirundi",
["sa-bhs"] = "Buddhist Hybrid Sanskrit",
["sa-bra"] = "Brahmanic Sanskrit",
["sa-epi"] = "Epic Sanskrit",
["sa-neo"] = "New Sanskrit",
["sa-rig"] = "Rigvedic Sanskrit",
["sc-nuo"] = "Nuorese",
["sc-old"] = "Old Sardinian",
["sc-src"] = "Logudorese",
["sc-sro"] = "Campidanese",
["scn-old"] = "Old Sicilian",
["sco-ins"] = "Insular Scots",
["sco-nor"] = "Northern Scots",
["sco-sou"] = "Southern Scots",
["sco-uls"] = "Ulster Scots",
["sdz"] = "Sallands",
["sgh-baj"] = "Bajui",
["sgh-bar"] = "Bartangi",
["sgh-bro"] = "Bartangi-Oroshori",
["sgh-oro"] = "Oroshori",
["sgh-ros"] = "Roshani",
["sgh-rsx"] = "Roshani-Khufi",
["sgh-xgb"] = "Khughni-Bajui",
["sgh-xuf"] = "Khufi",
["sgh-xug"] = "Khughni",
["sh-tor"] = "Torlakian Serbo-Croatian",
["shi-med"] = "Medieval Tashelhit",
["si-med"] = "Medieval Sinhalese",
["ska"] = "Skagit",
["slh"] = "Southern Lushootseed",
["sli"] = "Silesian East Central German",
["sno"] = "Snohomish",
["sog-ear"] = "Early Sogdian",
["sog-lat"] = "Late Sogdian",
["soj"] = "Soi",
["ssn"] = "Waata",
["stl"] = "Stellingwerfs",
["sxu"] = "Upper Saxon German",
["ta-mid"] = "Middle Tamil",
["tai-shz"] = "Shangsi Zhuang",
["taq"] = "Tamasheq",
["tbq-pro"] = "Proto-Tibeto-Burman",
["th-ayu"] = "Ayutthaya Old Thai",
["th-old"] = "Old Thai",
["th-suk"] = "Sukhothai Old Thai",
["thv"] = "Tamahaq",
["thv-ght"] = "Ghat",
["thz"] = "Tayert",
["tks-cal"] = "Chali Tati",
["tks-dan"] = "Danesfani",
["tks-ebr"] = "Ebrahimabadi",
["tks-esf"] = "Esfarvarini",
["tks-sag"] = "Sagzabadi",
["tks-tak"] = "Takestani",
["tks-xia"] = "Khiaraji",
["tks-xoz"] = "Khoznini",
["tl-cls"] = "Classical Tagalog",
["tl-old"] = "Old Tagalog",
["tly-anb"] = "Anbarani",
["tly-asa"] = "Asalemi",
["tly-aze"] = "Azerbaijani Talysh",
["tly-cen"] = "Central Talysh",
["tly-fum"] = "Fumani",
["tly-kar"] = "Karganrudi",
["tly-msa"] = "Masali",
["tly-msu"] = "Masulei",
["tly-nor"] = "Northern Talysh",
["tly-san"] = "Shandarmani",
["tly-sou"] = "Southern Talysh",
["tly-tal"] = "Taleshdulabi",
["tly-tul"] = "Tularudi",
["tmr"] = "Jewish Babylonian Aramaic",
["tpw-lga"] = "Língua Geral Amazônica",
["tpw-lgp"] = "Língua Geral Paulista",
["tr-CY"] = "Cypriot Turkish",
["trk-bul-pro"] = "Proto-Bulgar",
["trk-cmn-pro"] = "Proto-Common Turkic",
["trk-ogr-pro"] = "Proto-Oghur",
["trk-ogz-pro"] = "Proto-Oghuz",
["tsk"] = "Tseku",
["ttq"] = "Tawellemmet",
["tw"] = "Twi Akan",
["tw-aku"] = "Akuapem Twi",
["tw-asa"] = "Asante Twi",
["twd"] = "Twents",
["uk-CA"] = "Canadian Ukrainian",
["urj-fpr-pro"] = "Proto-Finno-Permic",
["uz-afg"] = "Afghan Uzbek",
["vaf"] = "Vafsi",
["vec-old"] = "Old Venetan",
["vel"] = "Veluws",
["vsn"] = "Vedic Sanskrit",
["wae"] = "Walser German",
["wep"] = "Westphalian",
["wss"] = "Wasa",
["wuu-chm"] = "Shadi Wu",
["wuu-han"] = "Hangzhounese",
["wuu-nin"] = "Ningbonese",
["wuu-nor"] = "Northern Wu",
["wuu-sha"] = "Shanghainese",
["wuu-suz"] = "Suzhounese",
["wuu-wen"] = "Wenzhounese",
["xaq"] = "Aquitanian",
["xbo-dan"] = "Danube Bulgar",
["xbo-vol"] = "Volga Bulgar",
["xcg"] = "Cisalpine Gaulish",
["xfa-cap"] = "Capenate",
["xh-bha"] = "Bhaca",
["xme-aby"] = "Abyanehi",
["xme-abz"] = "Abuzeydabadi",
["xme-amo"] = "Amorehi",
["xme-ana"] = "Anaraki",
["xme-ard"] = "Ardestani",
["xme-azr"] = "Old Azari",
["xme-bdr"] = "Badrudi",
["xme-bid"] = "Bidhandi",
["xme-bij"] = "Bijagani",
["xme-bor"] = "Borujerdi",
["xme-cim"] = "Chimehi",
["xme-del"] = "Delijani",
["xme-far"] = "Farizandi",
["xme-ham"] = "Hamadani",
["xme-han"] = "Hanjani",
["xme-isf"] = "Isfahani",
["xme-jow"] = "Jowshaqani",
["xme-kaf"] = "Kafroni",
["xme-kah"] = "Kahaki",
["xme-kas"] = "Kashani",
["xme-kes"] = "Kesehi",
["xme-kom"] = "Komjani",
["xme-krm"] = "Kermani",
["xme-mah"] = "Mahallati",
["xme-mey"] = "Meymehi",
["xme-nar"] = "Naraqi",
["xme-nas"] = "Nashalji",
["xme-nus"] = "Nushabadi",
["xme-qal"] = "Qalhari",
["xme-qoh"] = "Qohrudi",
["xme-sed"] = "Sedehi",
["xme-tar"] = "Tari",
["xme-trh"] = "Tarehi",
["xme-ttc-cen"] = "Central Tati",
["xme-ttc-eas"] = "Eastern Tati",
["xme-ttc-nor"] = "Northern Tati",
["xme-ttc-sou"] = "Southern Tati",
["xme-ttc-wes"] = "Western Tati",
["xme-val"] = "Valujerdi",
["xme-var"] = "Varani",
["xme-von"] = "Vonishuni",
["xme-vrz"] = "Varzenehi",
["xme-xur"] = "Khuri",
["xme-yar"] = "Yarandi",
["xme-yaz"] = "Yazdi",
["xme-zef"] = "Zefrehi",
["xme-zor"] = "Zori",
["xmn"] = "Manichaean Middle Persian",
["xng-ear"] = "Early Middle Mongol",
["xng-lat"] = "Late Middle Mongol",
["xnn"] = "Northern Kankanaey",
["xno"] = "Anglo-Norman",
["xno-law"] = "Law French",
["xtg"] = "Transalpine Gaulish",
["xvi"] = "Kamviri",
["yue-HK"] = "Hong Kong Cantonese",
["yue-gua"] = "Guangzhou Cantonese",
["yue-lit"] = "Literary Cantonese",
["yue-wvc"] = "Written vernacular Cantonese",
["zh-postal"] = "Postal Romanization",
["zhx-dan"] = "Danzhou Chinese",
["zhx-tai-wvc"] = "Written vernacular Taishanese",
["zhx-zho"] = "Zhongshan Min",
["zle-mbe"] = "Middle Belarusian",
["zle-mru"] = "Middle Russian",
["zle-muk"] = "Middle Ukrainian",
["zle-ops"] = "Old Pskovian",
["zls-chs-ru"] = "Russian Church Slavonic",
["zls-chs-uk"] = "Ukrainian Church Slavonic",
["zlw-mpl"] = "Middle Polish",
["zrp"] = "Zarphatic",
}
4t4gtnxf23weh7kgdqpi5fqs2q9ymmw
Module:families/code to canonical name
828
5995
17432
2026-07-13T08:42:15Z
Hiyuune
6766
+
17432
Scribunto
text/plain
return {
["aav"] = "Austroasiatic",
["aav-khs"] = "Khasian",
["aav-nic"] = "Nicobarese",
["aav-pkl"] = "Pnar-Khasi-Lyngngam",
["afa"] = "Afroasiatic",
["alg"] = "Algonquian",
["alg-abp"] = "Abenaki-Penobscot",
["alg-ara"] = "Arapahoan",
["alg-eas"] = "Eastern Algonquian",
["alg-sfk"] = "Sac-Fox-Kickapoo",
["alv"] = "Atlantic-Congo",
["alv-aah"] = "Ayere-Ahan",
["alv-ada"] = "Adamawa",
["alv-bag"] = "Baga",
["alv-bak"] = "Bak",
["alv-bam"] = "Bambukic",
["alv-bny"] = "Banyum",
["alv-bua"] = "Bua",
["alv-bwj"] = "Bikwin-Jen",
["alv-cng"] = "Cangin",
["alv-ctn"] = "Central Tano",
["alv-dlt"] = "Delta Edoid",
["alv-dur"] = "Duru",
["alv-ede"] = "Ede",
["alv-edk"] = "Edekiri",
["alv-edo"] = "Edoid",
["alv-eeo"] = "Edo-Esan-Ora",
["alv-fli"] = "Fali",
["alv-fwo"] = "Fula-Wolof",
["alv-gbe"] = "Gbe",
["alv-gda"] = "Ga-Dangme",
["alv-gng"] = "Guang",
["alv-gtm"] = "Ghana-Togo Mountain",
["alv-hei"] = "Heiban",
["alv-ido"] = "Idomoid",
["alv-igb"] = "Igboid",
["alv-jfe"] = "Jola-Felupe",
["alv-jol"] = "Jola",
["alv-kim"] = "Kim",
["alv-kis"] = "Kissi",
["alv-krb"] = "Karaboro",
["alv-ktg"] = "Ka-Togo",
["alv-kul"] = "Kulango",
["alv-kwa"] = "Kwa",
["alv-lag"] = "Lagoon",
["alv-lek"] = "Leko",
["alv-lim"] = "Limba",
["alv-lni"] = "Leko-Nimbari",
["alv-mbd"] = "Mbum-Day",
["alv-mbm"] = "Mbum",
["alv-mel"] = "Mel",
["alv-mum"] = "Mumuye",
["alv-mye"] = "Mumuye-Yendang",
["alv-nal"] = "Nalu",
["alv-nce"] = "North-Central Edoid",
["alv-ngb"] = "Nupe-Gbagyi",
["alv-ntg"] = "Na-Togo",
["alv-nup"] = "Nupoid",
["alv-nwd"] = "Northwestern Edoid",
["alv-nyn"] = "Nyun",
["alv-pap"] = "Papel",
["alv-pph"] = "Phla-Pherá",
["alv-ptn"] = "Potou-Tano",
["alv-sav"] = "Savanna",
["alv-sma"] = "Supyire-Mamara",
["alv-snf"] = "Senufo",
["alv-sng"] = "Senegambian",
["alv-snr"] = "Senari",
["alv-swd"] = "Southwestern Edoid",
["alv-tal"] = "Talodi",
["alv-tdj"] = "Tagwana-Djimini",
["alv-ten"] = "Tenda",
["alv-the"] = "Talodi-Heiban",
["alv-von"] = "Volta-Niger",
["alv-wan"] = "Wara-Natyoro",
["alv-wjk"] = "Waja-Kam",
["alv-yek"] = "Yekhee",
["alv-yor"] = "Yoruba",
["alv-yrd"] = "Yoruboid",
["alv-yun"] = "Yungur",
["apa"] = "Apachean",
["aqa"] = "Alacalufan",
["aql"] = "Algic",
["art"] = "constructed",
["ath"] = "Athabaskan",
["ath-nor"] = "North Athabaskan",
["ath-pco"] = "Pacific Coast Athabaskan",
["auf"] = "Arauan",
["aus-arn"] = "Arnhem",
["aus-bub"] = "Bunuban",
["aus-cww"] = "Central New South Wales",
["aus-dal"] = "Daly",
["aus-dyb"] = "Dyirbalic",
["aus-gar"] = "Garawan",
["aus-gun"] = "Gunwinyguan",
["aus-jar"] = "Jarrakan",
["aus-kar"] = "Karnic",
["aus-mir"] = "Mirndi",
["aus-nga"] = "Ngayarda",
["aus-nyu"] = "Nyulnyulan",
["aus-pam"] = "Pama-Nyungan",
["aus-pmn"] = "Paman",
["aus-psw"] = "Southwest Pama-Nyungan",
["aus-rnd"] = "Arandic",
["aus-tnk"] = "Tangkic",
["aus-wdj"] = "Iwaidjan",
["aus-wor"] = "Worrorran",
["aus-yid"] = "Yidinyic",
["aus-yng"] = "Yangmanic",
["aus-yol"] = "Yolngu",
["aus-yuk"] = "Yuin-Kuric",
["awd"] = "Arawak",
["awd-nwk"] = "Nawiki",
["awd-taa"] = "Ta-Arawak",
["azc"] = "Uto-Aztecan",
["azc-cup"] = "Cupan",
["azc-dur"] = "Durango Nahuatl",
["azc-hua"] = "Huasteca Nahuatl",
["azc-nah"] = "Nahuan",
["azc-num"] = "Numic",
["azc-pim"] = "Piman",
["azc-tak"] = "Takic",
["azc-trc"] = "Taracahitic",
["bad"] = "Banda",
["bad-cnt"] = "Central Banda",
["bai"] = "Bamileke",
["bat"] = "Baltic",
["bat-eas"] = "East Baltic",
["bat-wes"] = "West Baltic",
["ber"] = "Berber",
["bnt"] = "Bantu",
["bnt-baf"] = "Bafia",
["bnt-bbo"] = "Bafo-Bonkeng",
["bnt-bdz"] = "Boma-Dzing",
["bnt-bek"] = "Bekwilic",
["bnt-bki"] = "Bena-Kinga",
["bnt-bmo"] = "Bangi-Moi",
["bnt-bne"] = "Northeast Bantu",
["bnt-bnm"] = "Bangi-Ntomba",
["bnt-boa"] = "Boan",
["bnt-bot"] = "Botatwe",
["bnt-bsa"] = "Basaa",
["bnt-bsh"] = "Bushoong",
["bnt-bso"] = "Southern Bantu",
["bnt-bta"] = "Bati-Angba",
["bnt-btb"] = "Beti",
["bnt-bte"] = "Bangi-Tetela",
["bnt-bun"] = "Buja-Ngombe",
["bnt-chg"] = "Chaga",
["bnt-cht"] = "Chaga-Taita",
["bnt-clu"] = "Chokwe-Luchazi",
["bnt-com"] = "Comorian",
["bnt-glb"] = "Great Lakes Bantu",
["bnt-haj"] = "Haya-Jita",
["bnt-kak"] = "Kako",
["bnt-kav"] = "Kavango",
["bnt-kbi"] = "Komo-Bira",
["bnt-kel"] = "Kele",
["bnt-kil"] = "Kilombero",
["bnt-kka"] = "Kikuyu-Kamba",
["bnt-kmb"] = "Kimbundu",
["bnt-kng"] = "Kongo",
["bnt-kpw"] = "Kpwe",
["bnt-ksb"] = "Kavango-Southwest Bantu",
["bnt-kts"] = "Kele-Tsogo",
["bnt-lbn"] = "Luban",
["bnt-leb"] = "Lebonya",
["bnt-lgb"] = "Lega-Binja",
["bnt-lok"] = "Logooli-Kuria",
["bnt-lub"] = "Luba",
["bnt-lun"] = "Lunda",
["bnt-mak"] = "Makua",
["bnt-mbb"] = "Mboshi-Buja",
["bnt-mbe"] = "Mbole-Enya",
["bnt-mbi"] = "Mbinga",
["bnt-mbo"] = "Mboshi",
["bnt-mbt"] = "Mbete",
["bnt-mby"] = "Mbeya",
["bnt-mij"] = "Mijikenda",
["bnt-mka"] = "Makaa",
["bnt-mne"] = "Manenguba",
["bnt-mnj"] = "Makaa-Njem",
["bnt-mon"] = "Mongo",
["bnt-mra"] = "Mbugwe-Rangi",
["bnt-msl"] = "Masaba-Luhya",
["bnt-mwi"] = "Mwika",
["bnt-ncb"] = "Northeast Coast Bantu",
["bnt-ndb"] = "Ndzem-Bomwali",
["bnt-ngn"] = "Ngondi-Ngiri",
["bnt-ngu"] = "Nguni",
["bnt-nya"] = "Nyali",
["bnt-nyb"] = "Nyanga-Buyi",
["bnt-nyg"] = "Nyoro-Ganda",
["bnt-nys"] = "Nyasa",
["bnt-nze"] = "Nzebi",
["bnt-ova"] = "Ovambo",
["bnt-par"] = "Pare",
["bnt-pen"] = "Pende",
["bnt-pob"] = "Pomo-Bomwali",
["bnt-ruk"] = "Rukwa",
["bnt-run"] = "Rungwe",
["bnt-rur"] = "Rufiji-Ruvuma",
["bnt-ruv"] = "Ruvu",
["bnt-rvm"] = "Ruvuma",
["bnt-sab"] = "Sabaki",
["bnt-saw"] = "Sawabantu",
["bnt-sbi"] = "Sabi",
["bnt-seu"] = "Seuta",
["bnt-shh"] = "Shi-Havu",
["bnt-sho"] = "Shona",
["bnt-sir"] = "Sira",
["bnt-ske"] = "Soko-Kele",
["bnt-sna"] = "Sena",
["bnt-sts"] = "Sotho-Tswana",
["bnt-swb"] = "Southwest Bantu",
["bnt-swh"] = "Swahili",
["bnt-tek"] = "Teke",
["bnt-tet"] = "Tetela",
["bnt-tkc"] = "Central Teke",
["bnt-tkm"] = "Takama",
["bnt-tmb"] = "Teke-Mbede",
["bnt-tso"] = "Tsogo",
["bnt-tsr"] = "Tswa-Ronga",
["bnt-yak"] = "Yaka",
["bnt-yko"] = "Yasa-Kombe",
["bnt-zbi"] = "Zamba-Binza",
["btk"] = "Batak",
["cau-abz"] = "Abkhaz-Abaza",
["cau-and"] = "Andian",
["cau-ava"] = "Avaro-Andian",
["cau-cir"] = "Circassian",
["cau-drg"] = "Dargwa",
["cau-esm"] = "Eastern Samur",
["cau-ets"] = "East Tsezian",
["cau-lzg"] = "Lezghian",
["cau-nec"] = "Northeast Caucasian",
["cau-nkh"] = "Nakh",
["cau-nwc"] = "Northwest Caucasian",
["cau-sam"] = "Samur",
["cau-ssm"] = "Southern Samur",
["cau-tsz"] = "Tsezian",
["cau-vay"] = "Vainakh",
["cau-wsm"] = "Western Samur",
["cau-wts"] = "West Tsezian",
["cba"] = "Chibchan",
["ccs"] = "Kartvelian",
["ccs-gzn"] = "Georgian-Zan",
["ccs-zan"] = "Zan",
["cdc"] = "Chadic",
["cdc-cbm"] = "Central Chadic",
["cdc-est"] = "East Chadic",
["cdc-mas"] = "Masa",
["cdc-wst"] = "West Chadic",
["cdd"] = "Caddoan",
["cel"] = "Celtic",
["cel-brs"] = "Southwestern Brythonic",
["cel-brw"] = "Western Brythonic",
["cel-bry"] = "Brythonic",
["cel-gae"] = "Goidelic",
["cel-his"] = "Hispano-Celtic",
["cel-ins"] = "Insular Celtic",
["chi"] = "Chimakuan",
["chm"] = "Mari",
["cmc"] = "Chamic",
["crp"] = "creole or pidgin",
["csu"] = "Central Sudanic",
["csu-bba"] = "Bongo-Bagirmi",
["csu-bbk"] = "Bongo-Baka",
["csu-bgr"] = "Bagirmi",
["csu-bkr"] = "Birri-Kresh",
["csu-ecs"] = "Eastern Central Sudanic",
["csu-kab"] = "Kaba",
["csu-lnd"] = "Lendu",
["csu-maa"] = "Mangbetu",
["csu-mle"] = "Mangbutu-Lese",
["csu-mma"] = "Moru-Madi",
["csu-sar"] = "Sara",
["csu-val"] = "Vale",
["cus"] = "Cushitic",
["cus-cen"] = "Central Cushitic",
["cus-eas"] = "East Cushitic",
["cus-hec"] = "Highland East Cushitic",
["cus-som"] = "Somaloid",
["cus-sou"] = "South Cushitic",
["day"] = "Land Dayak",
["del"] = "Lenape",
["den"] = "Slavey",
["dmn"] = "Mande",
["dmn-bbu"] = "Bisa-Busa",
["dmn-emn"] = "East Manding",
["dmn-jje"] = "Jogo-Jeri",
["dmn-man"] = "Manding",
["dmn-mda"] = "Mano-Dan",
["dmn-mdc"] = "Central Mande",
["dmn-mde"] = "Eastern Mande",
["dmn-mdw"] = "Western Mande",
["dmn-mjo"] = "Manding-Jogo",
["dmn-mmo"] = "Manding-Mokole",
["dmn-mnk"] = "Maninka",
["dmn-mnw"] = "Northwestern Mande",
["dmn-mok"] = "Mokole",
["dmn-mse"] = "Southeastern Mande",
["dmn-msw"] = "Southwestern Mande",
["dmn-mva"] = "Manding-Vai",
["dmn-nbe"] = "Nwa-Beng",
["dmn-sam"] = "Samo",
["dmn-smg"] = "Samogo",
["dmn-snb"] = "Soninke-Bobo",
["dmn-sya"] = "Susu-Yalunka",
["dmn-vak"] = "Vai-Kono",
["dmn-wmn"] = "West Manding",
["dra"] = "Dravidian",
["dra-cen"] = "Central Dravidian",
["dra-gki"] = "Gondi-Kui",
["dra-gon"] = "Gondi",
["dra-imd"] = "Irula-Muduga",
["dra-kan"] = "Kannadoid",
["dra-kki"] = "Konda-Kui",
["dra-kml"] = "Kurux-Malto",
["dra-knk"] = "Kolami-Naiki",
["dra-kod"] = "Kodagu",
["dra-kor"] = "Koraga",
["dra-mal"] = "Malayalamoid",
["dra-mdy"] = "Madiya",
["dra-mlo"] = "Malto",
["dra-mur"] = "Muria",
["dra-nor"] = "North Dravidian",
["dra-pgd"] = "Parji-Gadaba",
["dra-sdo"] = "South Dravidian I",
["dra-sdt"] = "South Dravidian II",
["dra-sou"] = "South Dravidian",
["dra-tam"] = "Tamiloid",
["dra-tel"] = "Teluguic",
["dra-tkd"] = "Tamil-Kodagu",
["dra-tkn"] = "Tamil-Kannada",
["dra-tkt"] = "Toda-Kota",
["dra-tlk"] = "Tulu-Koraga",
["dra-tml"] = "Tamil-Malayalam",
["egx"] = "Egyptian",
["ero"] = "Horpa",
["esx"] = "Eskimo-Aleut",
["esx-esk"] = "Eskimo",
["esx-inu"] = "Inuit",
["euq"] = "Vasconic",
["gba"] = "Gbaya",
["gba-eas"] = "Eastern Gbaya",
["gba-sou"] = "Southern Gbaya",
["gba-wes"] = "Western Gbaya",
["gem"] = "Germanic",
["gio"] = "Gelao",
["gme"] = "East Germanic",
["gmq"] = "North Germanic",
["gmq-eas"] = "East Scandinavian",
["gmq-ins"] = "Insular Scandinavian",
["gmq-wes"] = "West Scandinavian",
["gmw"] = "West Germanic",
["gmw-afr"] = "Anglo-Frisian",
["gmw-ang"] = "Anglic",
["gmw-fri"] = "Frisian",
["gmw-frk"] = "Low Franconian",
["gmw-hgm"] = "High German",
["gmw-ian"] = "Irish Anglo-Norman",
["gmw-lgm"] = "Low German",
["gmw-nsg"] = "North Sea Germanic",
["gn"] = "Guarani",
["grb"] = "Grebo proper",
["grk"] = "Hellenic",
["him"] = "Western Pahari",
["hmn"] = "Hmongic",
["hmx"] = "Hmong-Mien",
["hmx-mie"] = "Mienic",
["hok"] = "Hokan",
["hyx"] = "Armenian",
["iir"] = "Indo-Iranian",
["iir-nur"] = "Nuristani",
["ijo"] = "Ijoid",
["inc"] = "Indo-Aryan",
["inc-bas"] = "Bengali-Assamese",
["inc-bhi"] = "Bhil",
["inc-bih"] = "Bihari",
["inc-cen"] = "Central Indo-Aryan",
["inc-chi"] = "Chitrali",
["inc-dar"] = "Dardic",
["inc-dng"] = "Dangari",
["inc-dre"] = "Eastern Dardic",
["inc-eas"] = "Eastern Indo-Aryan",
["inc-hal"] = "Halbic",
["inc-hie"] = "Eastern Hindi",
["inc-hiw"] = "Western Hindi",
["inc-hnd"] = "Hindustani",
["inc-ins"] = "Insular Indo-Aryan",
["inc-kas"] = "Kashmiric",
["inc-koh"] = "Kohistani",
["inc-krd"] = "KRDS languages",
["inc-kun"] = "Kunar",
["inc-mid"] = "Middle Indo-Aryan",
["inc-nor"] = "Northern Indo-Aryan",
["inc-nwe"] = "Northwestern Indo-Aryan",
["inc-old"] = "Old Indo-Aryan",
["inc-pah"] = "Pahari",
["inc-pan"] = "Punjabic",
["inc-pas"] = "Pashayi",
["inc-rom"] = "Romani",
["inc-shn"] = "Shinaic",
["inc-snd"] = "Sindhic",
["inc-sou"] = "Southern Indo-Aryan",
["inc-tha"] = "Tharu",
["inc-wes"] = "Western Indo-Aryan",
["ine"] = "Indo-European",
["ine-ana"] = "Anatolian",
["ine-bsl"] = "Balto-Slavic",
["ine-grp"] = "Graeco-Phrygian",
["ine-luw"] = "Luwic",
["ine-toc"] = "Tocharian",
["ira"] = "Iranian",
["ira-cen"] = "Central Iranian",
["ira-csp"] = "Caspian",
["ira-kms"] = "Komisenian",
["ira-mid"] = "Middle Iranian",
["ira-mny"] = "Munji-Yidgha",
["ira-mpr"] = "Medo-Parthian",
["ira-msh"] = "Mazanderani-Shahmirzadi",
["ira-nei"] = "Northeastern Iranian",
["ira-nwi"] = "Northwestern Iranian",
["ira-old"] = "Old Iranian",
["ira-orp"] = "Ormuri-Parachi",
["ira-pat"] = "Pathan",
["ira-sbc"] = "Sogdo-Bactrian",
["ira-sei"] = "Southeastern Iranian",
["ira-sgc"] = "Sogdic",
["ira-sgi"] = "Sanglechi-Ishkashimi",
["ira-shr"] = "Shughni-Roshani",
["ira-shy"] = "Shughni-Yazghulami",
["ira-swi"] = "Southwestern Iranian",
["ira-sym"] = "Shughni-Yazghulami-Munji",
["ira-wes"] = "Western Iranian",
["ira-zgr"] = "Zaza-Gorani",
["iro"] = "Iroquoian",
["iro-nor"] = "North Iroquoian",
["itc"] = "Italic",
["itc-laf"] = "Latino-Faliscan",
["itc-sbl"] = "Osco-Umbrian",
["jpx"] = "Japonic",
["jpx-nry"] = "Northern Ryukyuan",
["jpx-ryu"] = "Ryukyuan",
["jpx-sry"] = "Southern Ryukyuan",
["kar"] = "Karen",
["kca"] = "Khanty",
["khi-kal"] = "Kalahari Khoe",
["khi-khk"] = "Khoekhoe",
["khi-kho"] = "Khoe",
["khi-kkw"] = "Khoe-Kwadi",
["khi-kxa"] = "Kx'a",
["khi-tuu"] = "Tuu",
["kro"] = "Kru",
["kro-aiz"] = "Aizi",
["kro-bet"] = "Bété",
["kro-did"] = "Dida",
["kro-ekr"] = "Eastern Kru",
["kro-grb"] = "Grebo",
["kro-wee"] = "Wee",
["kro-wkr"] = "Western Kru",
["ku"] = "Kurdish",
["kv"] = "Komi",
["map"] = "Austronesian",
["map-ata"] = "Atayalic",
["mjg"] = "Monguor",
["mkh"] = "Mon-Khmer",
["mkh-asl"] = "Aslian",
["mkh-ban"] = "Bahnaric",
["mkh-kat"] = "Katuic",
["mkh-khm"] = "Khmuic",
["mkh-kmr"] = "Khmeric",
["mkh-mnc"] = "Monic",
["mkh-mng"] = "Mangic",
["mkh-nbn"] = "North Bahnaric",
["mkh-pal"] = "Palaungic",
["mkh-pea"] = "Pearic",
["mkh-pkn"] = "Pakanic",
["mkh-vie"] = "Vietic",
["mno"] = "Manobo",
["mns"] = "Mansi",
["mun"] = "Munda",
["myn"] = "Mayan",
["nai-cat"] = "Catawban",
["nai-chu"] = "Chumashan",
["nai-ckn"] = "Chinookan",
["nai-coo"] = "Coosan",
["nai-jcq"] = "Jicaquean",
["nai-ker"] = "Keresan",
["nai-klp"] = "Kalapuyan",
["nai-kta"] = "Kiowa-Tanoan",
["nai-len"] = "Lencan",
["nai-mdu"] = "Maiduan",
["nai-min"] = "Misumalpan",
["nai-miz"] = "Mixe-Zoquean",
["nai-mus"] = "Muskogean",
["nai-pak"] = "Pakawan",
["nai-pal"] = "Palaihnihan",
["nai-plp"] = "Plateau Penutian",
["nai-pom"] = "Pomoan",
["nai-sca"] = "Siouan-Catawban",
["nai-shp"] = "Sahaptian",
["nai-shs"] = "Shastan",
["nai-tot"] = "Totozoquean",
["nai-tqn"] = "Tequistlatecan",
["nai-tsi"] = "Tsimshianic",
["nai-ttn"] = "Totonacan",
["nai-utn"] = "Utian",
["nai-wtq"] = "Wintuan",
["nai-xin"] = "Xincan",
["nai-ykn"] = "Yukian",
["nai-you"] = "Yok-Utian",
["nai-yuc"] = "Yuman-Cochimí",
["ngf"] = "Trans-New Guinea",
["ngf-ais"] = "Aisian",
["ngf-ang"] = "Angan",
["ngf-ank"] = "Angal-Kewa",
["ngf-ask"] = "Asmat-Kamoro",
["ngf-asm"] = "Asmat",
["ngf-ata"] = "Ankave-Tainae-Akoye",
["ngf-awd"] = "Awyu-Dumut",
["ngf-awy"] = "Awyu",
["ngf-bda"] = "Becking-Dawi",
["ngf-bin"] = "Binanderean",
["ngf-boa"] = "Boane",
["ngf-bos"] = "Bosavi",
["ngf-bsi"] = "Baruya-Simbari",
["ngf-cda"] = "Central Dani",
["ngf-chw"] = "Chimbu-Wahgi",
["ngf-dag"] = "Dagan",
["ngf-dal"] = "Dallman",
["ngf-dan"] = "Dani",
["ngf-dum"] = "Dumut",
["ngf-ehu"] = "Eastern Huon",
["ngf-eku"] = "East Kutubuan",
["ngf-enc"] = "Engic",
["ngf-eng"] = "Engan",
["ngf-era"] = "Erap",
["ngf-eso"] = "East Sogeram",
["ngf-est"] = "East Strickland",
["ngf-eva"] = "Evapia",
["ngf-fgi"] = "Fore-Gimi",
["ngf-fhu"] = "Finisterre-Huon",
["ngf-fin"] = "Finisterre",
["ngf-gah"] = "Gahuku",
["ngf-gau"] = "Gauwa",
["ngf-gaw"] = "Greater Awyu",
["ngf-gbi"] = "Greater Binanderean",
["ngf-gko"] = "Gaena-Korafe",
["ngf-gmo"] = "Gusap-Mot",
["ngf-gor"] = "Goroka",
["ngf-gsu"] = "Gogodala-Suki",
["ngf-gum"] = "Gum",
["ngf-gvd"] = "Grand Valley Dani",
["ngf-hag"] = "Hagen",
["ngf-han"] = "Hanseman",
["ngf-huo"] = "Huon",
["ngf-jim"] = "Jimi",
["ngf-kab"] = "Kabwum",
["ngf-kai"] = "Kainantu",
["ngf-kak"] = "Kalam-Kobon",
["ngf-kau"] = "Kaukombar",
["ngf-kbm"] = "Kosorong-Burum-Mindik",
["ngf-kgo"] = "Kainantu-Goroka",
["ngf-khu"] = "Kewa-Huli",
["ngf-kma"] = "Kâte-Mape",
["ngf-kme"] = "Kapau-Menya",
["ngf-koi"] = "Koiarian",
["ngf-kok"] = "Kokon",
["ngf-kow"] = "Kowan",
["ngf-ksa"] = "Kalam-Southern Adelbert",
["ngf-kto"] = "Kube-Tobo",
["ngf-kts"] = "Komyandaret-Tsaukambo",
["ngf-kum"] = "Kumil",
["ngf-kya"] = "Kamano-Yagaria",
["ngf-lok"] = "Lowland Ok",
["ngf-mab"] = "Mabuso",
["ngf-mad"] = "Madang",
["ngf-mek"] = "Mek",
["ngf-min"] = "Mindjim",
["ngf-mok"] = "Mountain Ok",
["ngf-mom"] = "Mombum",
["ngf-msu"] = "Mian-Suganga",
["ngf-nad"] = "Northern Adelbert",
["ngf-nbi"] = "North Binanderean",
["ngf-nde"] = "Ndeiram",
["ngf-ngn"] = "Ngalik-Nduga",
["ngf-nso"] = "North Sogeram",
["ngf-num"] = "Numugen",
["ngf-nur"] = "Nuru",
["ngf-nwh"] = "Northwest Hanseman",
["ngf-oen"] = "Outer Engan",
["ngf-okk"] = "Ok",
["ngf-omo"] = "Omosan",
["ngf-oro"] = "Orokaivic",
["ngf-pan"] = "Paniai Lakes",
["ngf-pek"] = "Peka",
["ngf-pom"] = "Pomoikan",
["ngf-rai"] = "Rai Coast",
["ngf-sab"] = "Sabakor",
["ngf-sad"] = "Southern Adelbert",
["ngf-sak"] = "Sau-Angal-Kewa",
["ngf-san"] = "Sankwep",
["ngf-sbh"] = "South Bird's Head",
["ngf-sim"] = "Simbu",
["ngf-sog"] = "Sogeram",
["ngf-sop"] = "Sopac",
["ngf-taa"] = "Tainae-Akoye",
["ngf-tai"] = "Tairora",
["ngf-tib"] = "Tiboran",
["ngf-tna"] = "Tangko-Nakai",
["ngf-uru"] = "Uruwa",
["ngf-usi"] = "Utu-Silopi",
["ngf-waa"] = "Wantoat-Awara",
["ngf-wah"] = "Wahgi",
["ngf-wan"] = "Wantoatic",
["ngf-war"] = "Warup",
["ngf-woj"] = "Wojokesic",
["ngf-wok"] = "West Ok",
["ngf-wso"] = "West Sogeram",
["ngf-yag"] = "Yaganon",
["ngf-yal"] = "Yali",
["ngf-yar"] = "Yareban",
["ngf-ynu"] = "Yau-Nungon",
["ngf-yup"] = "Yupna",
["nic"] = "Niger-Congo",
["nic-alu"] = "Alumic",
["nic-bas"] = "Basa",
["nic-bbe"] = "Eastern Beboid",
["nic-bco"] = "Benue-Congo",
["nic-bcr"] = "Bantoid-Cross",
["nic-bdn"] = "Northern Bantoid",
["nic-bds"] = "Southern Bantoid",
["nic-beb"] = "Beboid",
["nic-ben"] = "Bendi",
["nic-beo"] = "Beromic",
["nic-bod"] = "Bantoid",
["nic-buk"] = "Buli-Koma",
["nic-bwa"] = "Bwa",
["nic-cde"] = "Central Delta",
["nic-cri"] = "Cross River",
["nic-dag"] = "Dagbani",
["nic-dak"] = "Dakoid",
["nic-dge"] = "Escarpment Dogon",
["nic-dgw"] = "West Dogon",
["nic-eko"] = "Ekoid",
["nic-eov"] = "Eastern Oti-Volta",
["nic-fru"] = "Furu",
["nic-gne"] = "Eastern Gurunsi",
["nic-gnn"] = "Northern Gurunsi",
["nic-gns"] = "Gurunsi",
["nic-gnw"] = "Western Gurunsi",
["nic-gre"] = "Eastern Grassfields",
["nic-grf"] = "Grassfields",
["nic-grm"] = "Gurma",
["nic-grs"] = "Southwest Grassfields",
["nic-gur"] = "Gur",
["nic-ief"] = "Ibibio-Efik",
["nic-jer"] = "Jera",
["nic-jkn"] = "Jukunoid",
["nic-jrn"] = "Jarawan",
["nic-jrw"] = "Jarawa",
["nic-kam"] = "Kambari",
["nic-kau"] = "Kauru",
["nic-kmk"] = "Kamuku",
["nic-kne"] = "East Kainji",
["nic-knj"] = "Kainji",
["nic-knn"] = "Northwest Kainji",
["nic-ktl"] = "Katloid",
["nic-lcr"] = "Lower Cross River",
["nic-mam"] = "Mamfe",
["nic-mba"] = "Mbam",
["nic-mbc"] = "Mba",
["nic-mbw"] = "West Mbam",
["nic-mmb"] = "Mambiloid",
["nic-mom"] = "Momo",
["nic-mre"] = "Moré",
["nic-ngd"] = "Ngbandi",
["nic-nge"] = "Ngemba",
["nic-ngk"] = "Ngbaka",
["nic-nin"] = "Ninzic",
["nic-nka"] = "Nkambe",
["nic-nkb"] = "Baka",
["nic-nke"] = "Eastern Ngbaka",
["nic-nkg"] = "Gbanziri",
["nic-nkk"] = "Kpala",
["nic-nkm"] = "Mbaka",
["nic-nkw"] = "Western Ngbaka",
["nic-npd"] = "North Plateau Dogon",
["nic-nun"] = "Nun",
["nic-nwa"] = "Nanga-Walo",
["nic-ogo"] = "Ogoni",
["nic-ovo"] = "Oti-Volta",
["nic-pla"] = "Platoid",
["nic-plc"] = "Central Plateau",
["nic-pld"] = "Plains Dogon",
["nic-ple"] = "East Plateau",
["nic-pls"] = "South Plateau",
["nic-plt"] = "Plateau",
["nic-ras"] = "Rashad",
["nic-rnc"] = "Central Ring",
["nic-rng"] = "Ring",
["nic-rnn"] = "Northern Ring",
["nic-rnw"] = "Western Ring",
["nic-ser"] = "Sere",
["nic-shi"] = "Shiroro",
["nic-sis"] = "Sisaala",
["nic-tar"] = "Tarokoid",
["nic-tiv"] = "Tivoid",
["nic-tvc"] = "Central Tivoid",
["nic-tvn"] = "Northern Tivoid",
["nic-ubg"] = "Ubangian",
["nic-uce"] = "East-West Upper Cross River",
["nic-ucn"] = "North-South Upper Cross River",
["nic-ucr"] = "Upper Cross River",
["nic-vco"] = "Volta-Congo",
["nic-wov"] = "Western Oti-Volta",
["nic-ykb"] = "Yukubenic",
["nic-ymb"] = "Yambasa",
["nic-yon"] = "Yom-Nawdm",
["njo"] = "Ao",
["nub"] = "Nubian",
["nub-hil"] = "Hill Nubian",
["nur-nor"] = "Northern Nuristani",
["nur-sou"] = "Southern Nuristani",
["omq"] = "Oto-Manguean",
["omq-cha"] = "Chatino",
["omq-chi"] = "Chinantecan",
["omq-cui"] = "Cuicatec",
["omq-maz"] = "Mazatecan",
["omq-mix"] = "Mixtecan",
["omq-mxt"] = "Mixtec",
["omq-otp"] = "Oto-Pamean",
["omq-pop"] = "Popolocan",
["omq-tri"] = "Triqui",
["omq-zap"] = "Zapotecan",
["omq-zpc"] = "Zapotec",
["omv"] = "Omotic",
["omv-aro"] = "Aroid",
["omv-diz"] = "Dizoid",
["omv-eom"] = "East Ometo",
["omv-gon"] = "Gonga",
["omv-mao"] = "Mao",
["omv-nom"] = "North Ometo",
["omv-ome"] = "Ometo",
["oto"] = "Otomian",
["oto-otm"] = "Otomi",
["paa"] = "Papuan",
["paa-aia"] = "Aian",
["paa-alp"] = "Alor-Pantar",
["paa-amu"] = "Amto-Musan",
["paa-ani"] = "Anim",
["paa-ara"] = "Arapesh",
["paa-arf"] = "Arafundi",
["paa-ata"] = "Ataitan",
["paa-baa"] = "Bayono-Awbono",
["paa-bai"] = "Baining",
["paa-baw"] = "Bosngun-Awar",
["paa-bew"] = "Bewani",
["paa-boa"] = "Boazi",
["paa-bor"] = "Border",
["paa-bul"] = "Bulaka River",
["paa-bvi"] = "Betaf-Vitou",
["paa-clp"] = "Central Lakes Plain",
["paa-dtu"] = "Doso-Turumsa",
["paa-ebh"] = "East Bird's Head",
["paa-eel"] = "Eastern Eleman",
["paa-egb"] = "East Geelvink Bay",
["paa-eke"] = "East Keram",
["paa-ele"] = "Eleman",
["paa-elp"] = "East Lakes Plain",
["paa-epw"] = "Eastern Pauwasi",
["paa-etf"] = "Eastern Trans-Fly",
["paa-eti"] = "East Timor",
["paa-fas"] = "Fas",
["paa-flp"] = "Far West Lakes Plain",
["paa-gkw"] = "Greater Kwerba",
["paa-gto"] = "Galela-Tobelo",
["paa-hya"] = "Heyo-Yahang",
["paa-ing"] = "Inland Gulf",
["paa-isk"] = "Inner Sko",
["paa-iwa"] = "Iwam",
["paa-kae"] = "Kamula-Elevala",
["paa-kan"] = "Kanum",
["paa-kay"] = "Kayagaric",
["paa-ker"] = "Keram",
["paa-kiw"] = "Kiwaian",
["paa-kko"] = "Kaure-Kosare",
["paa-koa"] = "Kombio-Arapesh",
["paa-kol"] = "Kolopom",
["paa-kom"] = "Kombio",
["paa-kun"] = "Kunimaipan",
["paa-kwa"] = "Kwalean",
["paa-kwe"] = "Kwerba proper",
["paa-kwo"] = "Kwomtari",
["paa-lla"] = "Loloda-Laba",
["paa-lma"] = "Left May",
["paa-lmu"] = "Lepki-Murkim",
["paa-lpl"] = "Lakes Plain",
["paa-lra"] = "Lower Ramu",
["paa-lse"] = "Lower Sepik",
["paa-mai"] = "Mairasi",
["paa-mal"] = "Mailuan",
["paa-mam"] = "Maimai",
["paa-man"] = "Manubaran",
["paa-mar"] = "Marienberg",
["paa-may"] = "Maybratic",
["paa-mbi"] = "Mbaham-Iha",
["paa-mby"] = "Marind-Boazi-Yaqay",
["paa-mmu"] = "Mandi-Muniwara",
["paa-mon"] = "Monumbo",
["paa-mri"] = "Marindic",
["paa-nam"] = "Nambu",
["paa-nbo"] = "North Bougainville",
["paa-ndu"] = "Ndu",
["paa-ngk"] = "Ngkolmpu",
["paa-nha"] = "North Halmahera",
["paa-nim"] = "Nimboran",
["paa-nnd"] = "Nuclear Ndu",
["paa-nnh"] = "Northern North Halmahera",
["paa-nto"] = "Namla-Tofanma",
["paa-ott"] = "Ottilien",
["paa-pah"] = "Pahoturi River",
["paa-pal"] = "Palei",
["paa-pia"] = "Piawi",
["paa-pio"] = "Piore River",
["paa-por"] = "Porapora",
["paa-ram"] = "Ramu",
["paa-rsa"] = "Rasawa-Saponi",
["paa-rub"] = "Ruboni",
["paa-saa"] = "Samarokena-Airoran",
["paa-sah"] = "Sahu",
["paa-sbo"] = "South Bougainville",
["paa-sen"] = "Sentani",
["paa-sep"] = "Sepik",
["paa-shi"] = "Serra Hills",
["paa-sko"] = "Sko",
["paa-sng"] = "Senagi",
["paa-taa"] = "Taikat-Awyi",
["paa-tam"] = "Tamolan",
["paa-tap"] = "Timor-Alor-Pantar",
["paa-teb"] = "Teberan",
["paa-tir"] = "Tirio",
["paa-tki"] = "Turama-Kikori",
["paa-ton"] = "Tonda",
["paa-too"] = "Tor-Orya",
["paa-tor"] = "Tor",
["paa-trr"] = "Torricelli",
["paa-tti"] = "Ternate-Tidore",
["paa-wal"] = "Walio",
["paa-wap"] = "Wapei",
["paa-war"] = "Waris",
["paa-wbh"] = "West Bird's Head",
["paa-wel"] = "Western Eleman",
["paa-wig"] = "West Inland Gulf",
["paa-wke"] = "West Keram",
["paa-wko"] = "Wára-Kómnzo",
["paa-wlp"] = "West Lakes Plain",
["paa-wpa"] = "Wapei-Palei",
["paa-wpw"] = "Western Pauwasi",
["paa-yam"] = "Yam",
["paa-yaq"] = "Yaqayic",
["paa-ysa"] = "Yawa-Saweru",
["paa-yua"] = "Yuat",
["phi"] = "Philippine",
["phi-kal"] = "Kalamian",
["poz"] = "Malayo-Polynesian",
["poz-aay"] = "Admiralty Islands",
["poz-bnn"] = "North Bornean",
["poz-bre"] = "East Barito",
["poz-brw"] = "West Barito",
["poz-bss"] = "Bali-Sasak-Sumbawa",
["poz-btk"] = "Bungku-Tolaki",
["poz-cet"] = "Central-Eastern Malayo-Polynesian",
["poz-clb"] = "Celebic",
["poz-cln"] = "New Caledonian",
["poz-cma"] = "Central Maluku",
["poz-hce"] = "Halmahera-Cenderawasih",
["poz-kal"] = "Kaili-Pamona",
["poz-lgx"] = "Lampungic",
["poz-mcm"] = "Malayo-Chamic",
["poz-mic"] = "Micronesian",
["poz-mly"] = "Malayic",
["poz-msa"] = "Malayo-Sumbawan",
["poz-mun"] = "Muna-Buton",
["poz-nws"] = "Northwest Sumatran",
["poz-occ"] = "Central-Eastern Oceanic",
["poz-oce"] = "Oceanic",
["poz-ocs"] = "Southern Oceanic",
["poz-ocw"] = "Western Oceanic",
["poz-pcc"] = "Central Pacific",
["poz-pep"] = "Eastern Polynesian",
["poz-pnp"] = "Nuclear Polynesian",
["poz-pol"] = "Polynesian",
["poz-san"] = "Sabahan",
["poz-sbj"] = "Sama-Bajaw",
["poz-slb"] = "Saluan-Banggai",
["poz-sls"] = "Southeast Solomonic",
["poz-ssw"] = "South Sulawesi",
["poz-stm"] = "St. Matthias",
["poz-swa"] = "North Sarawakan",
["poz-tem"] = "Temotu",
["poz-tim"] = "Timoric",
["poz-ton"] = "Tongic",
["poz-tot"] = "Tomini-Tolitoli",
["poz-vnc"] = "Central Vanuatu",
["poz-vnn"] = "North Vanuatu",
["poz-vns"] = "South Vanuatu",
["poz-wot"] = "Wotu-Wolio",
["pqe"] = "Eastern Malayo-Polynesian",
["qfa-adc"] = "Central Great Andamanese",
["qfa-adm"] = "Great Andamanese",
["qfa-adn"] = "Northern Great Andamanese",
["qfa-ads"] = "Southern Great Andamanese",
["qfa-ain"] = "Ainuic",
["qfa-bej"] = "Be-Jizhao",
["qfa-bet"] = "Be-Tai",
["qfa-buy"] = "Buyang",
["qfa-cka"] = "Chukotko-Kamchatkan",
["qfa-ckn"] = "Chukotkan",
["qfa-cnt"] = "contact",
["qfa-cre"] = "creole",
["qfa-dgn"] = "Dogon",
["qfa-dis"] = "disputed affiliation",
["qfa-dny"] = "Dene-Yeniseian",
["qfa-hur"] = "Hurro-Urartian",
["qfa-iso"] = "isolate",
["qfa-kad"] = "Kadu",
["qfa-kms"] = "Kam-Sui",
["qfa-kor"] = "Koreanic",
["qfa-kra"] = "Kra",
["qfa-lic"] = "Hlai",
["qfa-mch"] = "Macro-Chibchan",
["qfa-mix"] = "mixed",
["qfa-not"] = "not a family",
["qfa-onb"] = "Be",
["qfa-ong"] = "Ongan",
["qfa-pid"] = "pidgin",
["qfa-sub"] = "substrate",
["qfa-tak"] = "Kra-Dai",
["qfa-tyn"] = "Tyrsenian",
["qfa-unc"] = "unclassifiable",
["qfa-xgs"] = "Serbi-Mongolic",
["qfa-xgx"] = "Para-Mongolic",
["qfa-yen"] = "Yeniseian",
["qfa-yke"] = "Ketic",
["qfa-yko"] = "Kottic",
["qfa-ypm"] = "Pumpokolic",
["qfa-yrn"] = "Arinic",
["qfa-yuk"] = "Yukaghir",
["qwe"] = "Quechuan",
["raj"] = "Rajasthani",
["roa"] = "Romance",
["roa-asl"] = "Asturleonese",
["roa-cas"] = "Castilian",
["roa-dal"] = "Dalmatian Romance",
["roa-eas"] = "Eastern Romance",
["roa-emr"] = "Emilian-Romagnol",
["roa-gap"] = "Galician-Portuguese",
["roa-gar"] = "Gallo-Romance",
["roa-git"] = "Gallo-Italic",
["roa-grh"] = "Gallo-Rhaetian",
["roa-ibe"] = "Ibero-Romance",
["roa-itd"] = "Italo-Dalmatian",
["roa-itr"] = "Italo-Romance",
["roa-iwr"] = "Italo-Western Romance",
["roa-nar"] = "Navarro-Aragonese",
["roa-ocr"] = "Occitano-Romance",
["roa-oil"] = "Oïl",
["roa-rhe"] = "Rhaeto-Romance",
["roa-sou"] = "Southern Romance",
["roa-wes"] = "Western Romance",
["sai-ara"] = "Araucanian",
["sai-aym"] = "Aymaran",
["sai-bar"] = "Barbacoan",
["sai-bor"] = "Boran",
["sai-cah"] = "Cahuapanan",
["sai-car"] = "Cariban",
["sai-cer"] = "Cerrado",
["sai-chc"] = "Chocoan",
["sai-cho"] = "Chonan",
["sai-cje"] = "Central Jê",
["sai-cpc"] = "Chapacuran",
["sai-crn"] = "Charruan",
["sai-ctc"] = "Catacaoan",
["sai-guc"] = "Guaicuruan",
["sai-guh"] = "Guahiban",
["sai-gui"] = "Guianan",
["sai-har"] = "Harákmbut",
["sai-hkt"] = "Harákmbut-Katukinan",
["sai-hrp"] = "Huarpean",
["sai-jee"] = "Jê",
["sai-jir"] = "Jirajaran",
["sai-jiv"] = "Jivaroan",
["sai-ktk"] = "Katukinan",
["sai-kui"] = "Kuikuroan",
["sai-map"] = "Mapoyan",
["sai-mas"] = "Mascoian",
["sai-mgc"] = "Mataco-Guaicuru",
["sai-mje"] = "Macro-Jê",
["sai-mtc"] = "Matacoan",
["sai-mur"] = "Muran",
["sai-nad"] = "Nadahup",
["sai-nje"] = "Northern Jê",
["sai-nmk"] = "Nambikwaran",
["sai-otm"] = "Otomacoan",
["sai-pan"] = "Panoan",
["sai-pat"] = "Pano-Tacanan",
["sai-pek"] = "Pekodian",
["sai-pem"] = "Pemongan",
["sai-pey"] = "Peba-Yaguan",
["sai-prk"] = "Parukotoan",
["sai-sje"] = "Southern Jê",
["sai-tac"] = "Tacanan",
["sai-tar"] = "Taranoan",
["sai-tin"] = "Tiniguan",
["sai-tuc"] = "Tucanoan",
["sai-tyu"] = "Ticuna-Yuri",
["sai-ucp"] = "Uru-Chipaya",
["sai-ven"] = "Venezuelan Cariban",
["sai-wic"] = "Wichí",
["sai-wit"] = "Witotoan",
["sai-ynm"] = "Yanomami",
["sai-yuk"] = "Yukpan",
["sai-zam"] = "Zamucoan",
["sai-zap"] = "Zaparoan",
["sal"] = "Salish",
["sdv"] = "Eastern Sudanic",
["sdv-bri"] = "Bari",
["sdv-daj"] = "Daju",
["sdv-dnu"] = "Dinka-Nuer",
["sdv-eje"] = "Eastern Jebel",
["sdv-kln"] = "Kalenjin",
["sdv-lma"] = "Lotuko-Maa",
["sdv-lon"] = "Northern Luo",
["sdv-los"] = "Southern Luo",
["sdv-luo"] = "Luo",
["sdv-nes"] = "Northern Eastern Sudanic",
["sdv-nie"] = "Eastern Nilotic",
["sdv-nil"] = "Nilotic",
["sdv-nis"] = "Southern Nilotic",
["sdv-niw"] = "Western Nilotic",
["sdv-nma"] = "Nandi-Markweta",
["sdv-nyi"] = "Nyima",
["sdv-tmn"] = "Taman",
["sdv-ttu"] = "Teso-Turkana",
["sel"] = "Selkup",
["sem"] = "Semitic",
["sem-ara"] = "Aramaic",
["sem-arb"] = "Arabic",
["sem-are"] = "Eastern Aramaic",
["sem-arw"] = "Western Aramaic",
["sem-ase"] = "Southeastern Aramaic",
["sem-can"] = "Canaanite",
["sem-cen"] = "Central Semitic",
["sem-cna"] = "Central Neo-Aramaic",
["sem-eas"] = "East Semitic",
["sem-eth"] = "Ethiopian Semitic",
["sem-nna"] = "Northeastern Neo-Aramaic",
["sem-nwe"] = "Northwest Semitic",
["sem-osa"] = "Old South Arabian",
["sem-sar"] = "Modern South Arabian",
["sem-wes"] = "West Semitic",
["sgn"] = "sign",
["sgn-asl"] = "American Sign Languages",
["sgn-fsl"] = "French Sign Languages",
["sgn-gsl"] = "German Sign Languages",
["sgn-jsl"] = "Japanese Sign Languages",
["sio"] = "Siouan",
["sio-dhe"] = "Dhegihan",
["sio-dkt"] = "Dakotan",
["sio-mor"] = "Missouri River Siouan",
["sio-msv"] = "Mississippi Valley Siouan",
["sio-ohv"] = "Ohio Valley Siouan",
["sit"] = "Sino-Tibetan",
["sit-aao"] = "Central Naga",
["sit-alm"] = "Almora",
["sit-bai"] = "Bai",
["sit-bdi"] = "Bodish",
["sit-cln"] = "Cai-Long",
["sit-dhi"] = "Dhimalish",
["sit-ebo"] = "East Bodish",
["sit-egy"] = "East rGyalrongic",
["sit-ers"] = "Ersuic",
["sit-gma"] = "Greater Magaric",
["sit-gsi"] = "Greater Siangic",
["sit-hrs"] = "Hrusish",
["sit-jnp"] = "Jingphoic",
["sit-jpl"] = "Kachin-Luic",
["sit-kch"] = "Konyak-Chang",
["sit-kha"] = "Kham",
["sit-khb"] = "Kho-Bwa",
["sit-khc"] = "Chug-Lish",
["sit-khm"] = "Mey-Sartang",
["sit-khw"] = "Western Kho-Bwa",
["sit-kic"] = "Central Kiranti",
["sit-kie"] = "Eastern Kiranti",
["sit-kin"] = "Kinnauric",
["sit-kir"] = "Kiranti",
["sit-kiw"] = "Western Kiranti",
["sit-kon"] = "Northern Naga",
["sit-kyk"] = "Kyirong-Kagate",
["sit-lab"] = "Ladakhi-Balti",
["sit-las"] = "Lahuli-Spiti",
["sit-luu"] = "Luish",
["sit-mar"] = "Maringic",
["sit-mba"] = "Macro-Bai",
["sit-mdz"] = "Midzu",
["sit-mnz"] = "Mondzish",
["sit-mru"] = "Mruic",
["sit-nas"] = "Naish",
["sit-nax"] = "Naic",
["sit-nba"] = "Northern Bai",
["sit-new"] = "Newaric",
["sit-nng"] = "Nungish",
["sit-qia"] = "Qiangic",
["sit-rgy"] = "Rgyalrongic",
["sit-sba"] = "Sino-Bai",
["sit-tam"] = "Tamangic",
["sit-tan"] = "Tani",
["sit-tib"] = "Tibetic",
["sit-tja"] = "Tujia",
["sit-tma"] = "Tangkhul-Maring",
["sit-tng"] = "Tangkhulic",
["sit-tno"] = "Tangsa-Nocte",
["sit-tsk"] = "Tshangla",
["sit-wgy"] = "West rGyalrongic",
["sit-whm"] = "West Himalayish",
["sit-zem"] = "Zeme",
["sla"] = "Slavic",
["smi"] = "Sami",
["son"] = "Songhay",
["sqj"] = "Albanian",
["ssa"] = "Nilo-Saharan",
["ssa-fur"] = "Fur",
["ssa-klk"] = "Kuliak",
["ssa-kom"] = "Koman",
["ssa-sah"] = "Saharan",
["syd"] = "Samoyedic",
["syd-ene"] = "Enets",
["tai"] = "Tai",
["tai-cen"] = "Central Tai",
["tai-cho"] = "Chongzuo Tai",
["tai-nor"] = "Northern Tai",
["tai-sap"] = "Sapa-Southwestern Tai",
["tai-swe"] = "Southwestern Tai",
["tai-tay"] = "Tày",
["tai-wen"] = "Wenma-Southwestern Tai",
["tbq"] = "Tibeto-Burman",
["tbq-anp"] = "Angami-Pochuri",
["tbq-axi"] = "Axioid",
["tbq-bdg"] = "Bodo-Garo",
["tbq-bis"] = "Bisoid",
["tbq-bka"] = "Bi-Ka",
["tbq-bkj"] = "Sal",
["tbq-brm"] = "Burmish",
["tbq-buq"] = "Burmo-Qiangic",
["tbq-drp"] = "Downriver Phula",
["tbq-han"] = "Hanoid",
["tbq-hph"] = "Highland Phula",
["tbq-jin"] = "Jino",
["tbq-kuk"] = "Kuki-Chin",
["tbq-kzh"] = "Kazhuoish",
["tbq-lal"] = "Lalo",
["tbq-lho"] = "Lahoish",
["tbq-llo"] = "Lipo-Lolopo",
["tbq-lob"] = "Lolo-Burmese",
["tbq-lol"] = "Loloish",
["tbq-lso"] = "Lisoish",
["tbq-lwo"] = "Lawoish",
["tbq-muj"] = "Muji",
["tbq-nas"] = "Nasoid",
["tbq-nis"] = "Nisu",
["tbq-nlo"] = "Northern Loloish",
["tbq-nso"] = "Nisoish",
["tbq-nus"] = "Nusoish",
["tbq-phw"] = "Phowa",
["tbq-rph"] = "Riverine Phula",
["tbq-sel"] = "Southeastern Loloish",
["tbq-sil"] = "Siloid",
["tbq-slo"] = "Southern Loloish",
["tbq-tal"] = "Taloid",
["tbq-urp"] = "Upriver Phula",
["trk"] = "Turkic",
["trk-cmn"] = "Common Turkic",
["trk-kar"] = "Karluk",
["trk-kbu"] = "Kipchak-Bulgar",
["trk-kcu"] = "Kipchak-Cuman",
["trk-kip"] = "Kipchak",
["trk-kkp"] = "Kyrgyz-Kipchak",
["trk-kno"] = "Kipchak-Nogai",
["trk-nsb"] = "North Siberian Turkic",
["trk-ogr"] = "Oghur",
["trk-ogz"] = "Oghuz",
["trk-sib"] = "Siberian Turkic",
["trk-ssb"] = "South Siberian Turkic",
["tup"] = "Tupian",
["tup-gua"] = "Tupi-Guarani",
["tuw"] = "Tungusic",
["tuw-ewe"] = "Ewenic",
["tuw-jrc"] = "Jurchenic",
["tuw-nan"] = "Nanaic",
["tuw-udg"] = "Udegheic",
["urj"] = "Uralic",
["urj-fin"] = "Finnic",
["urj-mdv"] = "Mordvinic",
["urj-prm"] = "Permic",
["urj-ugr"] = "Ugric",
["wak"] = "Wakashan",
["wen"] = "Sorbian",
["xgn"] = "Mongolic",
["xgn-cen"] = "Central Mongolic",
["xgn-shr"] = "Shirongolic",
["xgn-sou"] = "Southern Mongolic",
["xme"] = "Median",
["xme-ttc"] = "Tatic",
["xnd"] = "Na-Dene",
["xsc"] = "Scythian",
["xsc-sak"] = "Saka",
["xsc-sar"] = "Sarmatian",
["xsc-skw"] = "Saka-Wakhi",
["yok"] = "Yokuts",
["ypk"] = "Yupik",
["yrk"] = "Nenets",
["zhx"] = "Sinitic",
["zhx-com"] = "Coastal Min",
["zhx-inm"] = "Inland Min",
["zhx-man"] = "Mandarinic",
["zhx-min"] = "Min",
["zhx-nan"] = "Southern Min",
["zhx-pin"] = "Pinghua",
["zhx-yue"] = "Yue",
["zle"] = "East Slavic",
["zls"] = "South Slavic",
["zlw"] = "West Slavic",
["zlw-lch"] = "Lechitic",
["zlw-pom"] = "Pomeranian",
["znd"] = "Zande",
}
at1n1wg69b612bxe19wg6xq47edegaw
Module:message box
828
5996
17433
2026-07-13T08:42:37Z
Hiyuune
6766
+
17433
Scribunto
text/plain
local html_create = mw.html.create
local tostring = tostring
local export = {}
local function make_box(tag, rows, image, header, text)
tag = tag:addClass("noprint")
:tag("table")
:tag("tr")
:tag("td")
if rows > 1 then
tag:attr("rowspan", rows)
end
tag = tag:wikitext(image)
:done()
if header then
tag = tag:node(header)
:done()
:tag("tr")
end
return tostring(tag:tag("td")
:wikitext(text)
:allDone()) ..
require("Module:TemplateStyles")("Module:message box/styles.css")
end
function export.maintenance(color, image, title, text)
local div = html_create("div")
:addClass("maintenance-box")
:addClass("maintenance-box-" .. color)
local header = html_create("th")
:css("text-align", "left")
:wikitext(title)
return make_box(div, 2, image, header, text)
end
function export.request(image, text)
local div = html_create("div")
:addClass("request-box")
return make_box(div, 1, image, nil, text)
end
return export
0njvtu4cuuvz98uci9fdhcz9qzscuod
Module:message box/styles.css
828
5997
17434
2026-07-13T08:43:00Z
Hiyuune
6766
+
17434
sanitized-css
text/css
.maintenance-box {
width: 90%;
margin: 0.75em auto;
border-width: 1px;
border-style: dashed;
padding: 0.25em;
}
body.skin-vector-2022 .maintenance-box > table td p:last-of-type {
/* remove extraneous bottom margin from bottom edge of maintenance box if it has multiple lines/paragraphs */
margin-bottom: 0.25em;
}
.maintenance-box-image-cell {
padding: 0 0.5em;
}
.request-box {
/* width: fit-content added as inline style */
margin: 0.75em 1em 0.75em 1em;
border: 1px dashed var(--border-color-base, #999999);
padding: 0.25em;
background: var(--background-color-base, #FFFFFF);
}
body.skin-minerva .request-box table {
margin-top: 0.25em;
margin-bottom: 0.25em;
}
/* Colors */
.maintenance-box-blue {
background-color: var(--wikt-palette-indigo-2, #E6E6FF);
border: 1px dashed var(--wikt-palette-indigo-9, #000061);
}
.maintenance-box-red {
background-color: var(--wikt-palette-red-2, #FFE6E6);
border: 1px dashed var(--wikt-palette-red-9, #610000);
}
.maintenance-box-yellow {
background-color: var(--wikt-palette-yellow-2, #FFFFE6);
border: 1px dashed var(--wikt-palette-yellow-9, #616100);
}
.maintenance-box-grey {
background-color: var(--wikt-palette-grey-2, #F2F2F2);
border: 1px dashed var(--wikt-palette-grey-9, #303030);
}
.maintenance-box-orange {
background-color: var(--wikt-palette-orange-2, #FFF2E6);
border: 1px dashed var(--wikt-palette-orange-9, #612F00);
}
94apw72wdbw2yvw3hygvo1l8sbdhyi8
Module:template parser/data
828
5998
17435
2026-07-13T08:43:26Z
Hiyuune
6766
+
17435
Scribunto
text/plain
local string = string
local case_insensitive_pattern = require("Module:string utilities").case_insensitive_pattern
local gsub = string.gsub
local upper = string.upper
local data = {}
do
local tags = mw.loadData("Module:data/parser extension tags")
local data_end_tags = {}
-- Generates the string pattern for the end tag.
-- The preprocessor uses the regex "/<\/TAG\s*>/i", so only ASCII characters
-- are case-insensitive.
local function end_tag_pattern(tag)
data_end_tags[tag] = "</" .. case_insensitive_pattern(tag, nil, true) .. "%s*>"
end
for tag in pairs(tags) do
end_tag_pattern(tag)
end
end_tag_pattern("includeonly")
end_tag_pattern("noinclude")
data_end_tags["onlyinclude"] = true -- Pattern is not required, but a key is needed for tag validity checks.
data.end_tags = data_end_tags
end
-- The parser's HTML sanitizer validates tag attributes with the regex
-- "/^([:_\p{L}\p{N}][:_\.\-\p{L}\p{N}]*)$/sxu". Ustring's "%w" is defined as
-- "[\p{L}\p{Nd}]", so any characters in \p{N} but not \p{Nd} must be added
-- manually.
-- NOTE: \p{N} *MUST* be defined according to the same version of Unicode that
-- the sanitizer uses in order to remain in sync. As of September 2024, this is
-- version 11.0.
local N_not_Nd = "\194\178" .. -- U+00B2
"\194\179" .. -- U+00B3
"\194\185" .. -- U+00B9
"\194\188-\194\190" .. -- U+00BC-U+00BE
"\224\167\180-\224\167\185" .. -- U+09F4-U+09F9
"\224\173\178-\224\173\183" .. -- U+0B72-U+0B77
"\224\175\176-\224\175\178" .. -- U+0BF0-U+0BF2
"\224\177\184-\224\177\190" .. -- U+0C78-U+0C7E
"\224\181\152-\224\181\158" .. -- U+0D58-U+0D5E
"\224\181\176-\224\181\184" .. -- U+0D70-U+0D78
"\224\188\170-\224\188\179" .. -- U+0F2A-U+0F33
"\225\141\169-\225\141\188" .. -- U+1369-U+137C
"\225\155\174-\225\155\176" .. -- U+16EE-U+16F0
"\225\159\176-\225\159\185" .. -- U+17F0-U+17F9
"\225\167\154" .. -- U+19DA
"\226\129\176" .. -- U+2070
"\226\129\180-\226\129\185" .. -- U+2074-U+2079
"\226\130\128-\226\130\137" .. -- U+2080-U+2089
"\226\133\144-\226\134\130" .. -- U+2150-U+2182
"\226\134\133-\226\134\137" .. -- U+2185-U+2189
"\226\145\160-\226\146\155" .. -- U+2460-U+249B
"\226\147\170-\226\147\191" .. -- U+24EA-U+24FF
"\226\157\182-\226\158\147" .. -- U+2776-U+2793
"\226\179\189" .. -- U+2CFD
"\227\128\135" .. -- U+3007
"\227\128\161-\227\128\169" .. -- U+3021-U+3029
"\227\128\184-\227\128\186" .. -- U+3038-U+303A
"\227\134\146-\227\134\149" .. -- U+3192-U+3195
"\227\136\160-\227\136\169" .. -- U+3220-U+3229
"\227\137\136-\227\137\143" .. -- U+3248-U+324F
"\227\137\145-\227\137\159" .. -- U+3251-U+325F
"\227\138\128-\227\138\137" .. -- U+3280-U+3289
"\227\138\177-\227\138\191" .. -- U+32B1-U+32BF
"\234\155\166-\234\155\175" .. -- U+A6E6-U+A6EF
"\234\160\176-\234\160\181" .. -- U+A830-U+A835
"\240\144\132\135-\240\144\132\179" .. -- U+10107-U+10133
"\240\144\133\128-\240\144\133\184" .. -- U+10140-U+10178
"\240\144\134\138" .. -- U+1018A
"\240\144\134\139" .. -- U+1018B
"\240\144\139\161-\240\144\139\187" .. -- U+102E1-U+102FB
"\240\144\140\160-\240\144\140\163" .. -- U+10320-U+10323
"\240\144\141\129" .. -- U+10341
"\240\144\141\138" .. -- U+1034A
"\240\144\143\145-\240\144\143\149" .. -- U+103D1-U+103D5
"\240\144\161\152-\240\144\161\159" .. -- U+10858-U+1085F
"\240\144\161\185-\240\144\161\191" .. -- U+10879-U+1087F
"\240\144\162\167-\240\144\162\175" .. -- U+108A7-U+108AF
"\240\144\163\187-\240\144\163\191" .. -- U+108FB-U+108FF
"\240\144\164\150-\240\144\164\155" .. -- U+10916-U+1091B
"\240\144\166\188" .. -- U+109BC
"\240\144\166\189" .. -- U+109BD
"\240\144\167\128-\240\144\167\143" .. -- U+109C0-U+109CF
"\240\144\167\146-\240\144\167\191" .. -- U+109D2-U+109FF
"\240\144\169\128-\240\144\169\136" .. -- U+10A40-U+10A48
"\240\144\169\189" .. -- U+10A7D
"\240\144\169\190" .. -- U+10A7E
"\240\144\170\157-\240\144\170\159" .. -- U+10A9D-U+10A9F
"\240\144\171\171-\240\144\171\175" .. -- U+10AEB-U+10AEF
"\240\144\173\152-\240\144\173\159" .. -- U+10B58-U+10B5F
"\240\144\173\184-\240\144\173\191" .. -- U+10B78-U+10B7F
"\240\144\174\169-\240\144\174\175" .. -- U+10BA9-U+10BAF
"\240\144\179\186-\240\144\179\191" .. -- U+10CFA-U+10CFF
"\240\144\185\160-\240\144\185\190" .. -- U+10E60-U+10E7E
"\240\144\188\157-\240\144\188\166" .. -- U+10F1D-U+10F26
"\240\144\189\145-\240\144\189\148" .. -- U+10F51-U+10F54
"\240\145\129\146-\240\145\129\165" .. -- U+11052-U+11065
"\240\145\135\161-\240\145\135\180" .. -- U+111E1-U+111F4
"\240\145\156\186" .. -- U+1173A
"\240\145\156\187" .. -- U+1173B
"\240\145\163\170-\240\145\163\178" .. -- U+118EA-U+118F2
"\240\145\177\154-\240\145\177\172" .. -- U+11C5A-U+11C6C
"\240\146\144\128-\240\146\145\174" .. -- U+12400-U+1246E
"\240\150\173\155-\240\150\173\161" .. -- U+16B5B-U+16B61
"\240\150\186\128-\240\150\186\150" .. -- U+16E80-U+16E96
"\240\157\139\160-\240\157\139\179" .. -- U+1D2E0-U+1D2F3
"\240\157\141\160-\240\157\141\184" .. -- U+1D360-U+1D378
"\240\158\163\135-\240\158\163\143" .. -- U+1E8C7-U+1E8CF
"\240\158\177\177-\240\158\178\171" .. -- U+1EC71-U+1ECAB
"\240\158\178\173-\240\158\178\175" .. -- U+1ECAD-U+1ECAF
"\240\158\178\177-\240\158\178\180" .. -- U+1ECB1-U+1ECB4
"\240\159\132\128-\240\159\132\140" -- U+1F100-U+1F10C
data.valid_attribute_name = "^[:_%w" .. N_not_Nd .."][:_.%-%w" .. N_not_Nd .. "]*$"
-- Value is the namespace number of the linked page at parameter 0, where 0 is mainspace.
-- If the namespace is the mainspace, it can be overridden by an explicitly specified category (e.g. {{PAGENAME:Category:Foo}} refers to "Category:Foo"). This does not apply to any other namespace (e.g. {{#SPECIAL:Category:Foo}} refers to "Special:Category:Foo").
data.template_link_param_1 = {
["#CATEGORYTREE:"] = 14, -- Category:
["#IFEXIST:"] = 0,
["#INVOKE:"] = 828, -- Module:
["#LST:"] = 0,
["#LSTH:"] = 0,
["#LSTX:"] = 0,
["#SPECIAL:"] = -1, -- Special:
["#SPECIALE:"] = -1, -- Special:
["#TITLEPARTS:"] = 0,
["BASEPAGENAME:"] = 0,
["BASEPAGENAMEE:"] = 0,
["CANONICALURL:"] = 0,
["CANONICALURLE:"] = 0,
["CASCADINGSOURCES:"] = 0,
["FILEPATH:"] = 6, -- File:
["FULLPAGENAME:"] = 0,
["FULLPAGENAMEE:"] = 0,
["FULLURL:"] = 0,
["FULLURLE:"] = 0,
["INT:"] = 8, -- MediaWiki:
["LOCALURL:"] = 0,
["LOCALURLE:"] = 0,
["NAMESPACE:"] = 0,
["NAMESPACEE:"] = 0,
["NAMESPACENUMBER:"] = 0,
["PAGEID:"] = 0,
["PAGENAME:"] = 0,
["PAGENAMEE:"] = 0,
["PAGESINCATEGORY:"] = 14, -- Category:
["PAGESIZE:"] = 0,
["REVISIONDAY:"] = 0,
["REVISIONDAY2:"] = 0,
["REVISIONID:"] = 0,
["REVISIONMONTH:"] = 0,
["REVISIONMONTH1:"] = 0,
["REVISIONTIMESTAMP:"] = 0,
["REVISIONUSER:"] = 0,
["REVISIONYEAR:"] = 0,
["ROOTPAGENAME:"] = 0,
["ROOTPAGENAMEE:"] = 0,
["SUBJECTPAGENAME:"] = 0,
["SUBJECTPAGENAMEE:"] = 0,
["SUBJECTSPACE:"] = 0,
["SUBJECTSPACEE:"] = 0,
["SUBPAGENAME:"] = 0,
["SUBPAGENAMEE:"] = 0,
["TALKPAGENAME:"] = 0,
["TALKPAGENAMEE:"] = 0,
["TALKSPACE:"] = 0,
["TALKSPACEE:"] = 0,
}
-- Value is the namespace number of the linked page at parameter 1.
data.template_link_param_2 = {
["PROTECTIONEXPIRY:"] = 0,
["PROTECTIONLEVEL:"] = 0,
}
return data
t4rorng7wydircsbpm0pxhr9wjhuh7e
Module:data/parser extension tags
828
5999
17436
2026-07-13T08:43:49Z
Hiyuune
6766
+
17436
Scribunto
text/plain
--Note: noinclude, includeonly and onlyinclude are not parser extension tags, as they are handled in a special way by the preprocessor. Among other things, they cannot be used with {{#TAG:}}, for example.
return {
["categorytree"] = "mw:Extension:CategoryTree",
["ce"] = "mw:Extension:Math",
["charinsert"] = "mw:Extension:CharInsert",
["chem"] = "mw:Extension:Math",
["dynamicpagelist"] = "mw:Extension:DynamicPageList (Wikimedia)",
["gallery"] = "mw:Help:Images#Rendering a gallery of images",
["graph"] = "mw:Extension:Graph",
["hiero"] = "mw:Extension:WikiHiero",
["imagemap"] = "mw:Extension:ImageMap",
["indicator"] = "mw:Help:Page status indicators#Adding page status indicators",
["inputbox"] = "mw:Extension:InputBox",
["langconvert"] = "mw:Parser extension tags", -- undocumented
["mapframe"] = "mw:Extension:Kartographer",
["maplink"] = "mw:Extension:Kartographer",
["math"] = "mw:Extension:Math",
["nowiki"] = "mw:Help:Formatting",
["phonos"] = "mw:Extension:Phonos",
["poem"] = "mw:Extension:Poem",
["pre"] = "mw:Help:Formatting",
["ref"] = "mw:Extension:Cite",
["references"] = "mw:Extension:Cite",
["score"] = "mw:Extension:Score",
["section"] = "mw:Extension:Labeled Section Transclusion",
["source"] = "mw:Extension:SyntaxHighlight",
["syntaxhighlight"] = "mw:Extension:SyntaxHighlight",
["talkpage"] = "mw:Extension:LiquidThreads", -- undocumented
["templatedata"] = "mw:Extension:TemplateData",
["templatestyles"] = "mw:Extension:TemplateStyles",
["thread"] = "mw:Extension:LiquidThreads", -- undocumented
["timeline"] = "mw:Extension:EasyTimeline",
}
ofvfawk3x15dsa9oos9tt1283gyzpwv
Module:table/setNested
828
6000
17437
2026-07-13T08:44:11Z
Hiyuune
6766
+
17437
Scribunto
text/plain
local error = error
local select = select
--[==[
Given a table, value and an arbitrary number of keys, will successively access subtables using each key in turn, and sets the value at the final key. For example, if {t} is { {} }, {export.setNested(t, "foo", 1, 2, 3)} will modify {t} to { {[1] = {[2] = {[3] = "foo"} } } }.
If no subtable exists for a given key value, one will be created, but the function will throw an error if a non-table value is found at an intermediary key.
Note: the parameter order (table, value, keys) differs from functions like rawset, because the number of keys can be arbitrary. This is to avoid situations where an additional argument must be appended to arbitrary lists of variables, which can be awkward and error-prone: for example, when handling variable arguments ({...}) or function return values.]==]
return function(...)
local n = select("#", ...)
if n < 3 then
error("Must provide a table, value and at least one key.")
end
local t, v, k = ...
for i = 4, n do
local next_t = t[k]
if next_t == nil then
-- If there's no next table while setting nil, there's nothing more
-- to do.
if v == nil then
return
end
next_t = {}
t[k] = next_t
end
t, k = next_t, select(i, ...)
end
t[k] = v
end
1jxfjipchypy8qfjkmtb9b9sal1bcc1
Module:table/getNested
828
6001
17438
2026-07-13T08:44:37Z
Hiyuune
6766
new module using category tree
17438
Scribunto
text/plain
local error = error
local select = select
--[==[
Given a table and an arbitrary number of keys, will successively access subtables using each key in turn, returning the value at the final key. For example, if {t} is { {[1] = {[2] = {[3] = "foo"}}}}, {export.getNested(t, 1, 2, 3)} will return {"foo"}.
If no subtable exists for a given key value, returns nil, but will throw an error if a non-table is found at an intermediary key.]==]
return function(...)
local n = select("#", ...)
if n < 2 then
error("Must provide a table and at least one key.")
end
local t, k = ...
for i = 3, n do
local v = t[k]
if v == nil then
return nil
end
t, k = v, select(i, ...)
end
return t[k]
end
tm1q0pycz7xr0ute9n4h4yhpf1jzo33
Module:labels/data/lang/af
828
6002
17439
2026-07-13T08:45:50Z
Hiyuune
6766
+
17439
Scribunto
text/plain
local labels = {}
labels["Cape Afrikaans"] = {
aliases = {"Kaapse Afrikaans"},
Wikipedia = "Kaapse Afrikaans",
plain_categories = true,
}
labels["Namīpia"] = {
aliases = {"Namibia","Namibian"},
Wikipedia = true,
regional_categories = "Namīpia",
}
return require("Module:labels").finalize_data(labels)
tn27pnndhcilnuo4mt2qoitwsuu3iqy
Module:category tree/lang
828
6003
17440
2026-07-13T08:46:38Z
Hiyuune
6766
+
17440
Scribunto
text/plain
-- This module contains a list of languages with lang-specific modules.
local langs_with_modules = {
["acm"] = true,
}
return langs_with_modules
7yr271x5lpmsf41wcc36xc3lw3z5zgt
Module:utilities/data
828
6004
17443
2026-07-13T08:48:42Z
Hiyuune
6766
+
17443
Scribunto
text/plain
local data = {}
-- Namespaces which format_categories will allow: (main), Appendix, Thesaurus, Citations, Reconstruction
data.category_namespaces = require("Module:table").listToSet{0, 100, 110, 114, 118}
-- Script that should be applied to links in categories.
data.catfix_scripts = {
["ab"] = "Cyrl",
["ae"] = "Avst",
["ar"] = "Arab",
["ary"] = "Arab",
["be"] = "Cyrl",
["cmn"] = "Hani",
["cu"] = "Cyrs",
["de"] = "Latn",
["el"] = "Grek",
["en"] = "Latn",
["fa"] = "fa-Arab",
["grc"] = "Polyt",
["he"] = "Hebr",
["hi"] = "Deva",
["hu"] = "Latn",
["ja"] = "Jpan",
["ka"] = "Geor",
["ko"] = "Kore",
["mr"] = "Deva",
["nan-hbl"] = "Hani",
["orv"] = "Cyrs",
["ro"] = "Latn",
["ru"] = "Cyrl",
["sa"] = "Deva",
["sq"] = "Latn",
["syl"] = "Sylo",
["xfa"] = "Ital",
["yue"] = "Hani",
["zh"] = "Hani",
["zle-ono"] = "Cyrs",
["zle-ort"] = "Cyrs",
--[[
[""] = "",
]]
}
return data
4x56htm3m5cvzeaw1vqlu3qn70xkp8k
Module:languages/data/3/u
828
6005
17444
2026-07-13T08:49:07Z
Hiyuune
6766
+
17444
Scribunto
text/plain
local m_langdata = require("Module:languages/data")
-- Loaded on demand, as it may not be needed (depending on the data).
local function u(...)
u = require("Module:string utilities").char
return u(...)
end
local c = m_langdata.chars
local p = m_langdata.puaChars
local s = m_langdata.shared
local m = {}
m["uam"] = {
"Uamué",
3441418,
}
m["uan"] = {
"Kuan",
6441085,
}
m["uar"] = {
"Tairuma",
7676386,
"paa-eel",
"Latn",
}
m["uba"] = {
"Ubang",
3914467,
"nic-ben",
"Latn",
}
m["ubi"] = {
"Ubi",
56264,
}
m["ubl"] = {
"Buhi'non Bikol",
18664494,
"phi",
"Latn",
}
m["ubr"] = {
"Ubir",
3547642,
"poz-ocw",
"Latn",
}
m["ubu"] = {
"Umbu-Ungu",
12953245,
"ngf-hag",
"Latn",
}
m["uby"] = {
"Ubykh",
36931,
"cau-nwc",
"Cyrl, Latn",
translit = "uby-translit",
override_translit = true,
display_text = {Cyrl = s["cau-Cyrl-displaytext"]},
strip_diacritics = {
Cyrl = s["cau-Cyrl-stripdiacritics"],
Latn = s["cau-Latn-stripdiacritics"],
},
sort_key = "uby-sortkey",
}
m["uda"] = {
"Uda",
11011951,
"nic-lcr",
}
m["ude"] = {
"Udihe",
13235,
"tuw-udg",
"Cyrl",
}
m["udg"] = {
"Muduga",
16886762,
"dra-imd",
"Mlym",
-- Mlym translit in [[Module:scripts/data]]
}
m["udi"] = {
"Udi",
36867,
"cau-esm",
"Cyrl, Latn, Armn, Geor",
ancestors = "xag",
translit = {
Cyrl = "udi-translit",
-- Geor, Armn translit in [[Module:scripts/data]]
},
override_translit = true,
display_text = {Cyrl = s["cau-Cyrl-displaytext"]},
strip_diacritics = {
Cyrl = s["cau-Cyrl-stripdiacritics"],
Latn = s["cau-Latn-stripdiacritics"],
},
}
m["udj"] = {
"Ujir",
14916906,
"poz-cet",
"Latn",
}
m["udl"] = {
"Uldeme",
3515078,
"cdc-cbm",
"Latn",
}
m["udm"] = {
"Udmurt",
13238,
"urj-prm",
"Cyrl",
translit = "udm-translit",
override_translit = true,
sort_key = "udm-sortkey",
}
m["udu"] = {
"Uduk",
3182573,
"ssa-kom",
}
m["ues"] = {
"Kioko",
18343036,
}
m["ufi"] = {
"Ufim",
7877531,
"ngf-gmo",
"Latn",
}
m["uga"] = {
"Ugaritic",
36928,
"sem-nwe",
"Ugar",
translit = {
Ugar = "uga-translit",
}
}
m["ugb"] = {
"Kuku-Ugbanh",
10549854,
}
m["uge"] = {
"Ughele",
966303,
"poz-ocw",
}
m["ugn"] = {
"Ugandan Sign Language",
7877677,
"sgn-asl",
}
m["ugo"] = {
"Gong",
3448919,
"tbq-lob",
"Thai",
sort_key = "Thai-sortkey",
}
m["ugy"] = {
"Uruguayan Sign Language",
7901470,
"sgn",
}
m["uha"] = {
"Uhami",
3913328,
"alv-nwd",
"Latn",
}
m["uhn"] = {
"Damal",
4748974,
"qfa-dis", -- ngf? or uncertain
"Latn",
}
m["uis"] = {
"Uisai",
7878123,
"paa-sbo",
"Latn",
}
m["uiv"] = {
"Iyive",
11128658,
"nic-tvc",
"Latn",
}
m["uji"] = {
"Tanjijili",
3914939,
"nic-pls",
"Latn",
}
m["uka"] = {
"Kaburi",
6344482,
"ngf-sbh",
"Latn",
}
m["ukg"] = {
"Ukuriguma",
7878623,
"ngf-num",
"Latn",
}
m["ukh"] = {
"Ukhwejo",
36623,
"bnt-bek",
"Latn",
}
m["ukk"] = {
"Muak Sa-aak",
23807993,
"mkh-pal",
"Latn",
}
m["ukl"] = {
"Ukrainian Sign Language",
10322106,
"sgn",
}
m["ukp"] = {
"Ukpe-Bayobiri",
3914470,
"nic-ben",
"Latn",
}
m["ukq"] = {
"Ukwa",
7878635,
"nic-ief",
"Latn",
}
m["uks"] = {
"Kaapor Sign Language",
3322101,
"sgn",
}
m["uku"] = {
"Ukue",
3913387,
"alv-nwd",
"Latn",
}
m["ukw"] = {
"Ukwuani-Aboh-Ndoni",
36636,
"alv",
"Latn",
}
m["uky"] = {
"Kuuk Yak",
6448719,
"aus-psw",
"Latn",
}
m["ula"] = {
"Fungwa",
5509187,
"nic-shi",
"Latn",
}
m["ulb"] = {
"Olukumi",
36722,
"alv-yor",
"Latn",
strip_diacritics = {Latn = {remove_diacritics = c.grave .. c.acute .. c.macron}},
sort_key = {
from = {"ch", "ẹ", "gb", "gh", "gw", "kp", "kw", "ọ", "ṣ"},
to = {"c" .. p[1], "e" .. p[1], "g" .. p[1], "g" .. p[2], "g" .. p[3], "k" .. p[1], "k" .. p[2], "o" .. p[1], "s" .. p[1]}
},
}
m["ulc"] = {
"Ulch",
13239,
"tuw-nan",
"Cyrl, Latn",
strip_diacritics = {
from = {"['’]"},
to = {"ʼ"}
},
sort_key = "ulc-sortkey",
}
m["ule"] = {
"Lule",
12635889,
nil,
"Latn",
}
m["ulf"] = {
"Afra",
4477735,
"qfa-dis", -- Papuan; extinct and poorly documented; per Wurm (1975), an independent branch of TNG; per Ross (2005),
-- unclassifiable; per Usher (2020), West Pauwasi, though divergent; per Foley (2018), isolate.
"Latn",
}
m["uli"] = {
"Ulithian",
36842,
"poz-mic",
"Latn",
}
m["ulk"] = {
"Meriam",
788174,
"paa-etf",
"Latn",
}
m["ull"] = {
"Ullatan",
8761579,
"dra-mal",
}
m["ulm"] = {
"Ulumanda'",
3501892,
"poz-ssw",
"Latn",
}
m["uln"] = {
"Unserdeutsch",
13244,
"crp",
"Latn",
ancestors = "de",
}
m["ulu"] = {
"Uma' Lung",
3548186,
"poz-swa",
}
m["ulw"] = {
"Ulwa (Nicaragua)",
2405552,
"nai-min",
"Latn",
}
m["uma"] = {
"Umatilla",
12953952,
"nai-shp",
"Latn",
ancestors = "nai-spt",
}
m["umb"] = {
"Umbundu",
36983,
"bnt",
"Latn",
}
m["umc"] = {
"Marrucinian",
36110,
"itc-sbl",
"Ital, Latn",
-- Ital translit in [[Module:scripts/data]]
display_text = {
Latn = s["itc-Latn-displaytext"]
},
strip_diacritics = {
Latn = s["itc-Latn-stripdiacritics"]
},
sort_key = {
Latn = s["itc-Latn-sortkey"]
},
}
m["umd"] = {
"Umbindhamu",
7881346,
"aus-pmn",
"Latn",
}
m["umg"] = {
"Umbuygamu",
3915677,
"aus-pmn",
"Latn",
}
m["umi"] = {
"Ukit",
7878321,
nil,
"Latn",
}
m["umm"] = {
"Umon",
3915448,
"nic-ucn",
"Latn",
}
m["umn"] = {
"Makyan Naga",
6740516,
"sit-kch",
}
m["umo"] = {
"Umotína",
7881740,
"sai-mje",
}
m["ump"] = {
"Umpila",
12953954,
"aus-pmn",
"Latn",
}
m["umr"] = {
"Umbugarla",
2980392,
}
m["ums"] = {
"Pendau",
7162371,
"poz-tot",
"Latn",
}
m["umu"] = {
"Munsee",
56547,
"del",
"Latn",
strip_diacritics = {remove_diacritics = c.acute .. c.breve},
}
m["una"] = {
"North Watut",
15887898,
"poz-ocw",
"Latn",
}
m["und"] = {
"Undetermined",
22282914,
"qfa-not",
"All",
}
m["une"] = {
"Uneme",
3913357,
"alv-yek",
"Latn",
}
m["ung"] = {
"Ngarinyin",
1284885,
"aus-wor",
"Latn",
}
m["uni"] = {
"Uni",
65043886,
"paa-pio",
"Latn",
}
m["unk"] = {
"Enawené-Nawé",
3307184,
"awd",
"Latn",
}
m["unm"] = {
"Unami",
3549180,
"del",
"Latn",
--[===[Don't strip diacritics from display text, per [[WT:Grease pit/2020/May]].
strip_diacritics = {remove_diacritics = c.grave .. c.diaer},]===]
}
m["unn"] = {
"Kurnai",
61676882,
"aus-pam",
"Latn",
}
m["unr"] = {
"Mundari",
3327828,
"mun",
"Nagm, Deva, Onao", -- Onao is used by Bhumij, which may be a separate language; remove if it gets split out
translit = "hi-translit", -- for now
}
m["unu"] = {
"Unubahe",
7897776,
}
m["unx"] = {
"Munda",
36264959,
"mun",
"Latn",
}
m["unz"] = {
"Unde Kaili",
12953596,
"poz-kal",
"Latn",
}
m["uok"] = {
"Uokha",
3441216,
"alv-edo",
"Latn",
}
m["uon"] = {
"Kulon",
11182000,
"map",
"Latn",
}
m["upi"] = {
"Umeda",
7881465,
"paa-war",
"Latn",
}
m["upv"] = {
"Northeast Malakula",
13249,
"poz-vnc",
"Latn",
}
m["ura"] = {
"Urarina",
1579560,
}
m["urb"] = {
"Urubú-Kaapor",
13893353,
"tup-gua",
"Latn",
}
m["urc"] = {
"Urningangg",
10710522,
}
m["ure"] = {
"Uru",
2992892,
}
m["urf"] = {
"Uradhi",
3915680,
"aus-pam",
"Latn",
}
m["urg"] = {
"Urigina",
7900603,
"ngf-pek",
"Latn",
}
m["urh"] = {
"Urhobo",
36663,
"alv-swd",
"Latn",
}
m["uri"] = {
"Urim",
7900609,
"paa-trr",
"Latn",
}
m["urk"] = {
"Urak Lawoi'",
7899573,
"poz-mly",
"Thai",
sort_key = "Thai-sortkey",
}
m["url"] = {
"Urali",
7899602,
"dra-kod",
"Knda",
-- Knda translit in [[Module:scripts/data]] (NOTE: not present before, presumably an accidental omission)
}
m["urm"] = {
"Urapmin",
7899769,
"ngf-mok",
"Latn",
}
m["urn"] = {
"Uruangnirin",
7901389,
"poz-cet",
"Latn",
}
m["uro"] = {
"Ura (New Guinea)",
3121049,
"paa-bai",
"Latn",
}
m["urp"] = {
"Uru-Pa-In",
7901376,
"tup-gua",
"Latn",
}
m["urr"] = {
"Löyöp",
3272124,
"poz-vnn",
"Latn",
}
m["urt"] = {
"Urat",
3502084,
"paa-trr",
"Latn",
}
m["uru"] = {
"Urumi",
7901530,
"tup",
"Latn",
}
m["urv"] = {
"Uruava",
36875,
"poz-ocw",
"Latn",
}
m["urw"] = {
"Sop",
7562808,
"ngf-pek",
"Latn",
}
m["urx"] = {
"Urimo",
7900611,
"paa-mar",
"Latn",
}
m["ury"] = {
"Orya",
7105295,
"paa-too",
"Latn",
}
m["urz"] = {
"Uru-Eu-Wau-Wau",
10266012,
"tup-gua",
"Latn",
}
m["usa"] = {
"Usarufa",
7901714,
"ngf-gau",
"Latn",
}
m["ush"] = {
"Ushojo",
3540446,
"inc-shn",
"ur-Arab",
}
m["usi"] = {
"Usui",
12644231,
}
m["usk"] = {
"Usaghade",
3914048,
"nic-lcr",
"Latn",
}
m["usp"] = {
"Uspanteco",
36728,
"myn",
"Latn",
}
m["uss"] = {
"Saare",
63313662,
"nic-knn",
"Latn",
}
m["usu"] = {
"Uya",
7904082,
"ngf-nur",
"Latn",
}
m["uta"] = {
"Otank",
3913990,
"nic-tvc",
"Latn",
}
m["ute"] = {
"Ute",
13260,
"azc-num",
"Latn",
}
m["uth"] = {
"Hun",
63313668,
"nic-knn",
"Latn",
}
m["utp"] = {
"Aba",
2841465,
"poz-tem",
"Latn",
}
m["utr"] = {
"Etulo",
35262,
"alv-ido",
"Latn",
}
m["utu"] = {
"Utu",
7903469,
"ngf-usi",
"Latn",
}
m["uum"] = {
"Urum",
13257,
"trk-kcu",
"Cyrl",
translit = "uum-translit",
}
m["uur"] = {
"Ura (Vanuatu)",
7899531,
"poz-vns",
"Latn",
}
m["uuu"] = {
"U",
953082,
"mkh-pal",
}
m["uve"] = {
"West Uvean",
36837,
"poz-pnp",
"Latn",
}
m["uvh"] = {
"Uri",
7900540,
"ngf-era",
"Latn",
}
m["uvl"] = {
"Lote",
3259972,
"poz-ocw",
"Latn",
}
m["uwa"] = {
"Kuku-Uwanh",
3915687,
"aus-pmn",
"Latn",
}
m["uya"] = {
"Doko-Uyanga",
7904095,
"nic-ucr",
"Latn",
}
return require("Module:languages").finalizeData(m, "language")
3oda5x9aa99bfo2zgt1m3fng4tu86ux
Module:headword/data
828
6006
17445
2026-07-13T08:49:29Z
Hiyuune
6766
+
17445
Scribunto
text/plain
local headword_page_module = "Module:headword/page"
local list_to_set = require("Module:table").listToSet
local data = {}
------ 1. Lists which are converted into sets. ------
--[==[ var:
Large pages where we disable label tracking, red link checking and similar.
]==]
data.large_pages = list_to_set {
-- pages that consistently hit timeouts
"a",
-- pages that sometimes hit timeouts
"A",
"baba",
"de",
"e",
"i",
"lima",
"o",
"u",
"и",
"山",
"子",
"月",
"一",
"人",
}
--[==[ var:
Map from singular to plural, and from plural to itself, for recognized parts of speech with irregular plurals. Most of
these are invariable plurals, e.g. `kanji` is its own plural; but we also have `mora` plural `morae`.
]==]
data.irregular_plurals = list_to_set({
"cmavo",
"cmene",
"fu'ivla",
"gismu",
"Han tu",
"hanja",
"hanzi",
"jyutping",
"kana",
"kanji",
"lujvo",
"phrasebook",
"pinyin",
"rafsi",
}, function(_, item)
return item
end)
local irregular_plurals = data.irregular_plurals
-- Irregular non-zero plurals AND any regular plurals where the singular ends in "s",
-- because the module assumes that inputs ending in "s" are plurals. The singular and
-- plural both need to be added, as the module will generate a default plural if
-- the input doesn't match a key in this table.
for sg, pl in next, {
mora = "morae"
} do
irregular_plurals[sg], irregular_plurals[pl] = pl, pl
end
--[==[ var:
Recognized lemmas. If the part of speech in {{tl|head}} is set to one of these or its singular equivalent, the category
'LANG lemmas' will automatically be added. If the part of speech is not a singular or plural lemma or non-lemma form and
is not an abbreviation that expands to a recognized lemma or non-lemma form, the page will be added to various tracking
categories:
* [[Special:WhatLinksHere/Wiktionary:Tracking/headword/unrecognized pos]]
* [[Special:WhatLinksHere/Wiktionary:Tracking/headword/unrecognized pos/LANG]]
* [[Special:WhatLinksHere/Wiktionary:Tracking/headword/unrecognized pos/pos/POS]]
* [[Special:WhatLinksHere/Wiktionary:Tracking/headword/unrecognized pos/pos/POS/LANG]]
]==]
data.lemmas = list_to_set{
"abbreviations",
"acronyms",
"adjectives",
"adnominals",
"adpositions",
"adverbs",
"affixes",
"ambipositions",
"articles",
"circumfixes",
"circumpositions",
"classifiers",
"cmavo",
"cmavo clusters",
"cmene",
"combining forms",
"conjunctions",
"counters",
"determiners",
"diacritical marks",
"digraphs",
"equative adjectives",
"fu'ivla",
"gismu",
"Han characters",
"Han tu",
"hanja",
"hanzi",
"ideophones",
"idioms",
"infixes",
"initialisms",
"iteration marks",
"interfixes",
"interjections",
"kana",
"kanji",
"letters",
"ligatures",
"logograms",
"lujvo",
"morae",
"morphemes",
"non-constituents",
"nouns",
"numbers",
"numeral symbols",
"numerals",
"particles",
"phrases",
"postpositions",
"postpositional phrases",
"predicatives",
"prefixes",
"prepositional phrases",
"prepositions",
"preverbs",
"pronominal adverbs",
"pronouns",
"proper nouns",
"proverbs",
"punctuation marks",
"relatives",
"roots",
"stems",
"suffixes",
"syllables",
"symbols",
"verbs",
}
--[==[ var:
Recognized non-lemma forms. If the part of speech in {{tl|head}} is set to one of these or its singular equivalent, the
category 'LANG non-lemma forms' will automatically be added. If the part of speech is not a singular or plural lemma or
non-lemma form and is not an abbreviation that expands to a recognized lemma or non-lemma form, the page will be added
to various tracking categories; see the documentation of `data.lemmas`.
]==]
data.nonlemmas = list_to_set{
"active participle forms",
"active participles",
"adjectival participles",
"adjective case forms",
"adjective forms",
"adjective feminine forms",
"adjective plural forms",
"adverb forms",
"adverbial participles",
"agent participles",
"article forms",
"circumfix forms",
"combined forms",
"comparative adjective forms",
"comparative adjectives",
"comparative adverb forms",
"comparative adverbs",
"conjunction forms",
"contractions",
"converbs",
"determiner comparative forms",
"determiner forms",
"determiner superlative forms",
"diminutive nouns",
"elative adjectives",
"equative adjective forms",
"equative adjectives",
"future participles",
"gerunds",
"infinitive forms",
"infinitives",
"interjection forms",
"jyutping",
"misspellings",
"negative participles",
"nominal participles",
"noun case forms",
"noun construct forms",
"noun dual forms",
"noun forms",
"noun paucal forms",
"noun plural forms",
"noun possessive forms",
"noun singulative forms",
"numeral forms",
"participles",
"participle forms",
"particle forms",
"passive participles",
"past active participles",
"past adverbial participles",
"past participles",
"past participle forms",
"past passive participles",
"perfect active participles",
"perfect participles",
"perfect passive participles",
"pinyin",
"plurals",
"postposition forms",
"prefix forms",
"preposition contractions",
"preposition forms",
"prepositional pronouns",
"present active participles",
"present adverbial participles",
"present participles",
"present passive participles",
"preverb forms",
"pronoun forms",
"pronoun possessive forms",
"proper noun forms",
"proper noun plural forms",
"rafsi",
"romanizations",
"root forms",
"singulatives",
"suffix forms",
"superlative adjective forms",
"superlative adjectives",
"superlative adverb forms",
"superlative adverbs",
"verb forms",
"verbal nouns",
}
--[==[ var:
List of languages that will not have links to separate parts of the headword.
]==]
data.no_multiword_links = list_to_set{
"zh",
}
--[==[ var:
List of languages that will not have `LANG multiword terms` categories added. There are various reasons why languages
are in this list: (a) words are written without spaces between them; (b) syllables are written with spaces between them;
(c) variant reconstructions are notated with a tilde surrounded by spaces; (d) the language is a sign language, where
pagenames are multiword descriptions of the gesture(s) required to make an individual sign; (e) some other weirdnesses.
]==]
data.no_multiword_cat = list_to_set{
-------- Languages without spaces between words (sometimes spaces between phrases) --------
"blt", -- Tai Dam
"ja", -- Japanese
"khb", -- Lü
"km", -- Khmer
"lo", -- Lao
"mnw", -- Mon
"my", -- Burmese
"nan", -- Min Nan (some words in Latin script; hyphens between syllables)
"nan-hbl", -- Hokkien (some words in Latin script; hyphens between syllables)
"nod", -- Northern Thai
"ojp", -- Old Japanese
"shn", -- Shan
"sou", -- Southern Thai
"tdd", -- Tai Nüa
"th", -- Thai
"tts", -- Isan
"twh", -- Tai Dón
"txg", -- Tangut
"zh", -- Chinese (all varieties with Chinese characters)
"zkt", -- Khitan
-------- Languages with spaces between syllables --------
"ahk", -- Akha
"aou", -- A'ou
"atb", -- Zaiwa
"byk", -- Biao
"cdy", -- Chadong
--"duu", -- Drung; not sure
--"hmx-pro", -- Proto-Hmong-Mien
--"hnj", -- Green Hmong; not sure
"huq", -- Tsat
"ium", -- Iu Mien
--"lis", -- Lisu; not sure
"mtq", -- Muong
--"mww", -- White Hmong; not sure
"onb", -- Lingao
--"sit-gkh", -- Gokhy; not sure
--"swi", -- Sui; not sure
"tbq-lol-pro", -- Proto-Loloish
"tdh", -- Thulung
"ukk", -- Muak Sa-aak
"vi", -- Vietnamese
"yig", -- Wusa Nasu
"zng", -- Mang
-------- Languages with ~ with surrounding spaces used to separate variants --------
"mkh-ban-pro", -- Proto-Bahnaric
"sit-pro", -- Proto-Sino-Tibetan; listed above
-------- Other weirdnesses --------
"mul", -- Translingual; gestures, Morse code, etc.
"aot", -- Atong (India); bullet is a letter
-------- All sign languages --------
"ads",
"aed",
"aen",
"afg",
"ase",
"asf",
"asp",
"asq",
"asw",
"bfi",
"bfk",
"bog",
"bqn",
"bqy",
"bvl",
"bzs",
"cds",
"csc",
"csd",
"cse",
"csf",
"csg",
"csl",
"csn",
"csq",
"csr",
"doq",
"dse",
"dsl",
"ecs",
"esl",
"esn",
"eso",
"eth",
"fcs",
"fse",
"fsl",
"fss",
"gds",
"gse",
"gsg",
"gsm",
"gss",
"gus",
"hab",
"haf",
"hds",
"hks",
"hos",
"hps",
"hsh",
"hsl",
"icl",
"iks",
"ils",
"inl",
"ins",
"ise",
"isg",
"isr",
"jcs",
"jhs",
"jls",
"jos",
"jsl",
"jus",
"kgi",
"kvk",
"lbs",
"lls",
"lsl",
"lso",
"lsp",
"lst",
"lsy",
"lws",
"mdl",
"mfs",
"mre",
"msd",
"msr",
"mzc",
"mzg",
"mzy",
"nbs",
"ncs",
"nsi",
"nsl",
"nsp",
"nsr",
"nzs",
"okl",
"pgz",
"pks",
"prl",
"prz",
"psc",
"psd",
"psg",
"psl",
"pso",
"psp",
"psr",
"pys",
"rms",
"rsl",
"rsm",
"sdl",
"sfb",
"sfs",
"sgg",
"sgx",
"slf",
"sls",
"sqk",
"sqs",
"ssp",
"ssr",
"svk",
"swl",
"syy",
"tse",
"tsm",
"tsq",
"tss",
"tsy",
"tza",
"ugn",
"ugy",
"ukl",
"uks",
"vgt",
"vsi",
"vsl",
"vsv",
"xki",
"xml",
"xms",
"ygs",
"ysl",
"zib",
"zsl",
}
--[==[ var:
List of languages where a hyphen is not considered a word separator for the `LANG multiword terms` category. There are
numerous reasons why languages are in this list; by each language should be listed the reason for inclusion.
]==]
data.hyphen_not_multiword_sep = list_to_set{
"akk", -- Akkadian; hyphens between syllables
"akl", -- Aklanon; hyphens for mid-word glottal stops
"ber-pro", -- Proto-Berber; morphemes separated by hyphens
"ceb", -- Cebuano; hyphens for mid-word glottal stops
"cnk", -- Khumi Chin; hyphens used in single words
"cpi", -- Chinese Pidgin English; Chinese-derived words with hyphens between syllables
"de", -- German; too many false positives
"esx-esk-pro", -- hyphen used to separate morphemes
"fi", -- Finnish; hyphen used to separate components in compound words if the final and initial vowels match, respectively
"gd", -- Scottish Gaelic; too many false positives like [[a-chianaibh]], [[a-nìos]], [[an-dè]] and other adverbs in a- and an-
"hil", -- Hiligaynon; hyphens for mid-word glottal stops
"hnn", -- Hanunoo; too many false positives
"ilo", -- Ilocano; hyphens for mid-word glottal stops
"kne", -- Kankanaey; hyphens for mid-word glottal stops
"lcp", -- Western Lawa; dash as syllable joiner
"lwl", -- Eastern Lawa; dash as syllable joiner
"mfa", -- Pattani Malay in Thai script; dash as syllable joiner
"mkh-vie-pro", -- Proto-Vietic; morphemes separated by hyphens
"msb", -- Masbatenyo; too many false positives
"tl", -- Tagalog; too many false positives
"war", -- Waray-Waray; too many false positives
"yo", -- Yoruba; hyphens used to show lengthened nasal vowels
}
--[==[ var:
List of languages that will not have `LANG masculine nouns` and similar categories added. Generally, these languages are
lacking gender but use the gender field for other purposes. (This is a massive hack and should be changed.)
]==]
data.no_gender_cat = list_to_set{
-- Languages without gender but which use the gender field for other purposes
"ja",
"th",
}
--[==[ var:
List of languages where [[Module:headword]] should not attempt to generate a transliteration even if the term is written
in a non-Latin script. FIXME: Notate reasons why each language is in this list.
]==]
data.notranslit = list_to_set{
"ams",
"az",
"bbc",
"bug",
"cdo",
"cia",
"cjm",
"cjy",
"cmn",
"cnp",
"cpi",
"cpx",
"csp",
"czh",
"czo",
"gan",
"hak",
"hnm",
"hsn",
"ja",
"kzg",
"lad",
"ltc",
"luh",
"lzh",
"mnp",
"ms",
"mul",
"mvi",
"nan",
"nan-dat",
"nan-hbl",
"nan-hlh",
"nan-lnx",
"nan-tws",
"nan-zhe",
"nan-zsh",
"och",
"oj",
"okn",
"ryn",
"rys",
"ryu",
"sh",
"sjc",
"tgt",
"th",
"tkn",
"tly",
"txg",
"und",
"vi",
"wuu",
"xug",
"yoi",
"yox",
"yue",
"za",
"zh",
"zhx-sic",
"zhx-tai",
}
--[==[ var:
List of languages that will default to `sccat` being true, i.e. categories like `LANG POS in SCRIPT script` will
automatically be generated. This can be overridden using {{para|sccat|0}} in {{tl|head}} or setting `sccat` to
`false` in Lua.
]==]
data.default_sccat = list_to_set{
"inc-apa",
"inc-ash",
"kfr",
"ks",
"mr",
"mwr",
"inc-oaw",
"inc-ohi",
"omr",
"inc-opa",
"phr",
"pi",
"pra",
"sa",
"skr",
"sd",
}
--[==[ var:
List of script codes for which a script-tagged display title will be added.
]==]
data.toBeTagged = list_to_set{
"Ahom",
"Arab",
"fa-Arab",
"glk-Arab",
"kk-Arab",
"ks-Arab",
"ku-Arab",
"mzn-Arab",
"ms-Arab",
"ota-Arab",
"pa-Arab",
"ps-Arab",
"sd-Arab",
"tt-Arab",
"ug-Arab",
"ur-Arab",
"Armi",
"Armn",
"Avst",
"Bali",
"Bamu",
"Batk",
"Beng",
"as-Beng",
"Bopo",
"Brah",
"Brai",
"Bugi",
"Buhd",
"Cakm",
"Cans",
"Cari",
"Cham",
"Cher",
"Copt",
"Cprt",
"Cyrl",
"Cyrs",
"Deva",
"Dsrt",
"Egyd",
"Egyp",
"Ethi",
"Geok",
"Geor",
"Glag",
"Goth",
"Grek",
"Polyt",
"polytonic",
"Gujr",
"Guru",
"Hang",
"Hani",
"Hano",
"Hebr",
"Hira",
"Hluw",
"Ital",
"Java",
"Kali",
"Kana",
"Khar",
"Khmr",
"Knda",
"Kthi",
"Lana",
"Laoo",
"Latn",
"Latf",
"Latg",
"Latnx",
"Latinx",
"pjt-Latn",
"Lepc",
"Limb",
"Linb",
"Lisu",
"Lyci",
"Lydi",
"Mand",
"Mani",
"Marc",
"Merc",
"Mero",
"Mlym",
"Mong",
"mnc-Mong",
"sjo-Mong",
"xwo-Mong",
"Mtei",
"Mymr",
"Narb",
"Nkoo",
"Nshu",
"Ogam",
"Olck",
"Orkh",
"Orya",
"Osma",
"Ougr",
"Palm",
"Phag",
"Phli",
"Phlv",
"Phnx",
"Plrd",
"Prti",
"Rjng",
"Runr",
"Samr",
"Sarb",
"Saur",
"Sgnw",
"Shaw",
"Shrd",
"Sinh",
"Sora",
"Sund",
"Sylo",
"Syrc",
"Tagb",
"Tale",
"Talu",
"Taml",
"Tang",
"Tavt",
"Telu",
"Tfng",
"Tglg",
"Thaa",
"Thai",
"Tibt",
"Ugar",
"Vaii",
"Xpeo",
"Xsux",
"Yiii",
"Zmth",
"Zsym",
"Ipach",
"Music",
"Rumin",
}
--[==[ var:
Parts of speech which will not be categorised in categories like `English terms spelled with É` if the term is the
character in question (e.g. the letter entry for English [[é]]). This contrasts with entries like the French adjective
[[m̂]], which is a one-letter word spelled with the letter.
]==]
data.pos_not_spelled_with_self = list_to_set{
"diacritical marks",
"Han characters",
"Han tu",
"hanja",
"hanzi",
"iteration marks",
"kana",
"kanji",
"letters",
"ligatures",
"logograms",
"morae",
"numeral symbols",
"numerals",
"punctuation marks",
"syllables",
"symbols",
}
------ 2. Lists not converted into sets. ------
--[==[ var:
Recognized aliases for parts of speech (param 2=). Key is the short form and value is the canonical singular (not
pluralized) form. It is singular so the same table can be used in [[Module:form of]] for the {{para|p}}/{{para|POS}}
param and [[Module:links]] for the pos= param. Note that any part of speech, abbreviated or not, can be suffixed with
`f` to generate the corresponding non-lemma form part of speech, such as `adjf`, `af` or `adjectivef` for
`adjective form`, and `nounf` or `nf` for `noun form`. This expansion happens even when it does not make sense for the
given part of speech (e.g. `pclf` expands to `particle form` and `symf` expands to `symbol form`), and currently also,
at least in [[Module:headword]] (but not [[Module:links]]), even if the part before the `f` is not a recognized part of
speech or abbreviation (hence `nerf` expands to `ner form`).
]==]
data.pos_aliases = {
a = "adjective",
adj = "adjective",
adv = "adverb",
art = "article",
aug = "augmentative",
cls = "classifier",
compadj = "comparative adjective",
compadv = "comparative adverb",
compdet = "comparative determiner",
comppron = "comparative pronoun",
conj = "conjunction",
contr = "contraction",
conv = "converb",
det = "determiner",
dim = "diminutive",
int = "interjection",
interj = "interjection",
intj = "interjection",
n = "noun",
-- the next two support Algonquian languages; see also vii/vai/vti/vta below
na = "animate noun",
ni = "inanimate noun",
num = "numeral",
part = "participle",
pastpart = "past participle",
pastptcp = "past participle",
pcl = "particle",
phr = "phrase",
pn = "proper noun",
postp = "postposition",
pref = "prefix",
prep = "preposition",
prepphr = "prepositional phrase",
prespart = "present participle",
presptcp = "present participle",
pron = "pronoun",
prop = "proper noun",
proper = "proper noun",
propn = "proper noun",
ptcp = "participle",
rom = "romanization",
roman = "romanization",
romanisation = "romanization",
romanisations = "romanization",
suf = "suffix",
supadj = "superlative adjective",
supadv = "superlative adverb",
supdet = "superlative determiner",
suppron = "superlative pronoun",
sym = "symbol",
v = "verb",
vb = "verb",
vi = "intransitive verb",
vm = "modal verb",
vt = "transitive verb",
-- the next four support Algonquian languages
vii = "inanimate intransitive verb",
vai = "animate intransitive verb",
vti = "transitive inanimate verb",
vta = "transitive animate verb",
}
--[==[ var:
Map of parts of speech for which categories like `German masculine nouns` or `Russian imperfective verbs` will be
generated if the headword is of the appropriate gender/number. The map is used to canonicalize parts of speech for
categorization purposes; specifically, proper nouns categorizes like nouns.
]==]
data.pos_for_gender_number_cat = {
["nouns"] = "nouns",
["proper nouns"] = "nouns",
["suffixes"] = "suffixes",
-- We include verbs because impf and pf are valid "genders".
["verbs"] = "verbs",
}
--[==[ var:
Lower limit for a "long" word in a particular language. Used to categorize terms into e.g.
[[:Category:Long English words]] automatically. Languages with no mapping here do not get categorized.
]==]
data.long_word_thresholds = {
["af"] = 20,
["bg"] = 20,
["cy"] = 25,
["de"] = 20,
["en"] = 25,
["es"] = 20,
["fr"] = 20,
["ka"] = 20,
["sv"] = 20,
["tl"] = 25,
}
------ 3. Page-wide processing (so that it only needs to be done once per page). ------
data.page = require(headword_page_module).process_page()
-- Set some page properties directly on `data` for ease of use.
data.pagename = data.page.pagename
data.encoded_pagename = data.page.encoded_pagename
return data
81blund1lug5e3dv927kffaobiikgrc
Module:fun/isCallable
828
6007
17446
2026-07-13T08:49:50Z
Hiyuune
6766
+
17446
Scribunto
text/plain
local debug_track_module = "Module:debug/track"
local table_get_metamethod_module = "Module:table/getMetamethod"
local require = require
local type = type
local function debug_track(...)
debug_track = require(debug_track_module)
return debug_track(...)
end
local function get_metamethod(...)
get_metamethod = require(table_get_metamethod_module)
return get_metamethod(...)
end
--[==[
Return {true} if the input is a function or functor (an object which can be called like a function, because it has a {__call} metamethod).
Note: if the input is an object with a {__call} metamethod, but this function is not able to find it because the object's metatable is protected with {__metatable}, then it will return {false} by default, or {nil} if the {allow_maybe} flag is set.]==]
return function(obj, allow_maybe)
if type(obj) == "function" then
return true
end
-- An object is callable if it has a __call metamethod, so try to get it
-- with get_metamethod().
local success, __call = get_metamethod(obj, "__call")
-- If this succeeds, `obj` will only be callable if the __call metamethod is
-- a function (i.e. it can't itself be a callable table), so don't recurse
-- to check it.
if __call and type(__call) == "function" then
return true
-- If not, then the metatable is protected, so it's not possible to know if
-- `obj` is callable without actually calling it.
elseif not success then
debug_track("fun/isCallable/protected metatable")
if allow_maybe then
return nil
end
end
return false
end
nr6fmojt64uvmsick8bst0i74ec4d2z
Module:headword/page
828
6008
17447
2026-07-13T08:50:11Z
Hiyuune
6766
+
17447
Scribunto
text/plain
local export = {}
local languages_module = "Module:languages"
local maintenance_category_module = "Module:maintenance category"
local pages_module = "Module:pages"
local string_compare_module = "Module:string/compare"
local string_decode_entities_module = "Module:string/decodeEntities"
local string_remove_comments_module = "Module:string/removeComments"
local string_utilities_module = "Module:string utilities"
local table_module = "Module:table"
local template_parser_module = "Module:template parser"
local mw = mw
local string = string
local table = table
local ustring = mw.ustring
local concat = table.concat
local find = string.find
local format = string.format
local gsub = string.gsub
local insert = table.insert
local load_data = mw.loadData
local match = string.match
local new_title = mw.title.new
local pairs = pairs
local require = require
local sub = string.sub
local toNFC = ustring.toNFC
local toNFD = ustring.toNFD
local ugsub = ustring.gsub
local function class_else_type(...)
class_else_type = require(template_parser_module).class_else_type
return class_else_type(...)
end
local function decode_entities(...)
decode_entities = require(string_decode_entities_module)
return decode_entities(...)
end
local function encode_entities(...)
encode_entities = require(string_utilities_module).encode_entities
return encode_entities(...)
end
local function get_category(...)
get_category = require(maintenance_category_module).get_category
return get_category(...)
end
local function get_lang(...)
get_lang = require(languages_module).getByCode
return get_lang(...)
end
local function list_to_set(...)
list_to_set = require(table_module).listToSet
return list_to_set(...)
end
local function parse(...)
parse = require(template_parser_module).parse
return parse(...)
end
local function remove_comments(...)
remove_comments = require(string_remove_comments_module)
return remove_comments(...)
end
local function physical_to_logical_pagename_if_mammoth(...)
physical_to_logical_pagename_if_mammoth = require(pages_module).physical_to_logical_pagename_if_mammoth
return physical_to_logical_pagename_if_mammoth(...)
end
local function split(...)
split = require(string_utilities_module).split
return split(...)
end
local function string_compare(...)
string_compare = require(string_compare_module)
return string_compare(...)
end
local function uupper(...)
uupper = require(string_utilities_module).upper
return uupper(...)
end
--[==[
Loaders for objects, which load data (or some other object) into some variable, which can then be accessed as "foo or get_foo()", where the function get_foo sets the object to "foo" and then returns it. This ensures they are only loaded when needed, and avoids the need to check for the existence of the object each time, since once "foo" has been set, "get_foo" will not be called again.]==]
local langnames
local function get_langnames()
langnames, get_langnames = load_data("Module:languages/canonical names"), nil
return langnames
end
-- Combining character data used when categorising unusual characters. These resolve into two patterns, used to find
-- single combining characters (i.e. character + diacritic(s)) or double combining characters (i.e. character +
-- diacritic(s) + character).
-- Charsets are in the format used by Unicode's UnicodeSet tool: https://util.unicode.org/UnicodeJsps/list-unicodeset.jsp.
-- Single combining characters.
-- Charset: [[:M:]&[:^Canonical_Combining_Class=/^Double_/:]&[:^subhead=Grapheme joiner:]&[:^Variation_Selector=Yes:]]
-- Note: concatenating hundreds of lines at once gives an error, so () are used every 150 lines to break it up into chunks.
local comb_chars_single =
("\204\128-\205\142" .. -- U+0300-U+034E
"\205\144-\205\155" .. -- U+0350-U+035B
"\205\163-\205\175" .. -- U+0363-U+036F
"\210\131-\210\137" .. -- U+0483-U+0489
"\214\145-\214\189" .. -- U+0591-U+05BD
"\214\191" .. -- U+05BF
"\215\129" .. -- U+05C1
"\215\130" .. -- U+05C2
"\215\132" .. -- U+05C4
"\215\133" .. -- U+05C5
"\215\135" .. -- U+05C7
"\216\144-\216\154" .. -- U+0610-U+061A
"\217\139-\217\159" .. -- U+064B-U+065F
"\217\176" .. -- U+0670
"\219\150-\219\156" .. -- U+06D6-U+06DC
"\219\159-\219\164" .. -- U+06DF-U+06E4
"\219\167" .. -- U+06E7
"\219\168" .. -- U+06E8
"\219\170-\219\173" .. -- U+06EA-U+06ED
"\220\145" .. -- U+0711
"\220\176-\221\138" .. -- U+0730-U+074A
"\222\166-\222\176" .. -- U+07A6-U+07B0
"\223\171-\223\179" .. -- U+07EB-U+07F3
"\223\189" .. -- U+07FD
"\224\160\150-\224\160\153" .. -- U+0816-U+0819
"\224\160\155-\224\160\163" .. -- U+081B-U+0823
"\224\160\165-\224\160\167" .. -- U+0825-U+0827
"\224\160\169-\224\160\173" .. -- U+0829-U+082D
"\224\161\153-\224\161\155" .. -- U+0859-U+085B
"\224\162\151-\224\162\159" .. -- U+0897-U+089F
"\224\163\138-\224\163\161" .. -- U+08CA-U+08E1
"\224\163\163-\224\164\131" .. -- U+08E3-U+0903
"\224\164\186-\224\164\188" .. -- U+093A-U+093C
"\224\164\190-\224\165\143" .. -- U+093E-U+094F
"\224\165\145-\224\165\151" .. -- U+0951-U+0957
"\224\165\162" .. -- U+0962
"\224\165\163" .. -- U+0963
"\224\166\129-\224\166\131" .. -- U+0981-U+0983
"\224\166\188" .. -- U+09BC
"\224\166\190-\224\167\132" .. -- U+09BE-U+09C4
"\224\167\135" .. -- U+09C7
"\224\167\136" .. -- U+09C8
"\224\167\139-\224\167\141" .. -- U+09CB-U+09CD
"\224\167\151" .. -- U+09D7
"\224\167\162" .. -- U+09E2
"\224\167\163" .. -- U+09E3
"\224\167\190" .. -- U+09FE
"\224\168\129-\224\168\131" .. -- U+0A01-U+0A03
"\224\168\188" .. -- U+0A3C
"\224\168\190-\224\169\130" .. -- U+0A3E-U+0A42
"\224\169\135" .. -- U+0A47
"\224\169\136" .. -- U+0A48
"\224\169\139-\224\169\141" .. -- U+0A4B-U+0A4D
"\224\169\145" .. -- U+0A51
"\224\169\176" .. -- U+0A70
"\224\169\177" .. -- U+0A71
"\224\169\181" .. -- U+0A75
"\224\170\129-\224\170\131" .. -- U+0A81-U+0A83
"\224\170\188" .. -- U+0ABC
"\224\170\190-\224\171\133" .. -- U+0ABE-U+0AC5
"\224\171\135-\224\171\137" .. -- U+0AC7-U+0AC9
"\224\171\139-\224\171\141" .. -- U+0ACB-U+0ACD
"\224\171\162" .. -- U+0AE2
"\224\171\163" .. -- U+0AE3
"\224\171\186-\224\171\191" .. -- U+0AFA-U+0AFF
"\224\172\129-\224\172\131" .. -- U+0B01-U+0B03
"\224\172\188" .. -- U+0B3C
"\224\172\190-\224\173\132" .. -- U+0B3E-U+0B44
"\224\173\135" .. -- U+0B47
"\224\173\136" .. -- U+0B48
"\224\173\139-\224\173\141" .. -- U+0B4B-U+0B4D
"\224\173\149-\224\173\151" .. -- U+0B55-U+0B57
"\224\173\162" .. -- U+0B62
"\224\173\163" .. -- U+0B63
"\224\174\130" .. -- U+0B82
"\224\174\190-\224\175\130" .. -- U+0BBE-U+0BC2
"\224\175\134-\224\175\136" .. -- U+0BC6-U+0BC8
"\224\175\138-\224\175\141" .. -- U+0BCA-U+0BCD
"\224\175\151" .. -- U+0BD7
"\224\176\128-\224\176\132" .. -- U+0C00-U+0C04
"\224\176\188" .. -- U+0C3C
"\224\176\190-\224\177\132" .. -- U+0C3E-U+0C44
"\224\177\134-\224\177\136" .. -- U+0C46-U+0C48
"\224\177\138-\224\177\141" .. -- U+0C4A-U+0C4D
"\224\177\149" .. -- U+0C55
"\224\177\150" .. -- U+0C56
"\224\177\162" .. -- U+0C62
"\224\177\163" .. -- U+0C63
"\224\178\129-\224\178\131" .. -- U+0C81-U+0C83
"\224\178\188" .. -- U+0CBC
"\224\178\190-\224\179\132" .. -- U+0CBE-U+0CC4
"\224\179\134-\224\179\136" .. -- U+0CC6-U+0CC8
"\224\179\138-\224\179\141" .. -- U+0CCA-U+0CCD
"\224\179\149" .. -- U+0CD5
"\224\179\150" .. -- U+0CD6
"\224\179\162" .. -- U+0CE2
"\224\179\163" .. -- U+0CE3
"\224\179\179" .. -- U+0CF3
"\224\180\128-\224\180\131" .. -- U+0D00-U+0D03
"\224\180\187" .. -- U+0D3B
"\224\180\188" .. -- U+0D3C
"\224\180\190-\224\181\132" .. -- U+0D3E-U+0D44
"\224\181\134-\224\181\136" .. -- U+0D46-U+0D48
"\224\181\138-\224\181\141" .. -- U+0D4A-U+0D4D
"\224\181\151" .. -- U+0D57
"\224\181\162" .. -- U+0D62
"\224\181\163" .. -- U+0D63
"\224\182\129-\224\182\131" .. -- U+0D81-U+0D83
"\224\183\138" .. -- U+0DCA
"\224\183\143-\224\183\148" .. -- U+0DCF-U+0DD4
"\224\183\150" .. -- U+0DD6
"\224\183\152-\224\183\159" .. -- U+0DD8-U+0DDF
"\224\183\178" .. -- U+0DF2
"\224\183\179" .. -- U+0DF3
"\224\184\177" .. -- U+0E31
"\224\184\180-\224\184\186" .. -- U+0E34-U+0E3A
"\224\185\135-\224\185\142" .. -- U+0E47-U+0E4E
"\224\186\177" .. -- U+0EB1
"\224\186\180-\224\186\188" .. -- U+0EB4-U+0EBC
"\224\187\136-\224\187\142" .. -- U+0EC8-U+0ECE
"\224\188\152" .. -- U+0F18
"\224\188\153" .. -- U+0F19
"\224\188\181" .. -- U+0F35
"\224\188\183" .. -- U+0F37
"\224\188\185" .. -- U+0F39
"\224\188\190" .. -- U+0F3E
"\224\188\191" .. -- U+0F3F
"\224\189\177-\224\190\132" .. -- U+0F71-U+0F84
"\224\190\134" .. -- U+0F86
"\224\190\135" .. -- U+0F87
"\224\190\141-\224\190\151" .. -- U+0F8D-U+0F97
"\224\190\153-\224\190\188" .. -- U+0F99-U+0FBC
"\224\191\134" .. -- U+0FC6
"\225\128\171-\225\128\190" .. -- U+102B-U+103E
"\225\129\150-\225\129\153" .. -- U+1056-U+1059
"\225\129\158-\225\129\160" .. -- U+105E-U+1060
"\225\129\162-\225\129\164" .. -- U+1062-U+1064
"\225\129\167-\225\129\173" .. -- U+1067-U+106D
"\225\129\177-\225\129\180" .. -- U+1071-U+1074
"\225\130\130-\225\130\141" .. -- U+1082-U+108D
"\225\130\143" .. -- U+108F
"\225\130\154-\225\130\157" .. -- U+109A-U+109D
"\225\141\157-\225\141\159" .. -- U+135D-U+135F
"\225\156\146-\225\156\149" .. -- U+1712-U+1715
"\225\156\178-\225\156\180" .. -- U+1732-U+1734
"\225\157\146" .. -- U+1752
"\225\157\147" .. -- U+1753
"\225\157\178" .. -- U+1772
"\225\157\179" .. -- U+1773
"\225\158\180-\225\159\147") .. -- U+17B4-U+17D3
("\225\159\157" .. -- U+17DD
"\225\162\133" .. -- U+1885
"\225\162\134" .. -- U+1886
"\225\162\169" .. -- U+18A9
"\225\164\160-\225\164\171" .. -- U+1920-U+192B
"\225\164\176-\225\164\187" .. -- U+1930-U+193B
"\225\168\151-\225\168\155" .. -- U+1A17-U+1A1B
"\225\169\149-\225\169\158" .. -- U+1A55-U+1A5E
"\225\169\160-\225\169\188" .. -- U+1A60-U+1A7C
"\225\169\191" .. -- U+1A7F
"\225\170\176-\225\171\142" .. -- U+1AB0-U+1ACE
"\225\172\128-\225\172\132" .. -- U+1B00-U+1B04
"\225\172\180-\225\173\132" .. -- U+1B34-U+1B44
"\225\173\171-\225\173\179" .. -- U+1B6B-U+1B73
"\225\174\128-\225\174\130" .. -- U+1B80-U+1B82
"\225\174\161-\225\174\173" .. -- U+1BA1-U+1BAD
"\225\175\166-\225\175\179" .. -- U+1BE6-U+1BF3
"\225\176\164-\225\176\183" .. -- U+1C24-U+1C37
"\225\179\144-\225\179\146" .. -- U+1CD0-U+1CD2
"\225\179\148-\225\179\168" .. -- U+1CD4-U+1CE8
"\225\179\173" .. -- U+1CED
"\225\179\180" .. -- U+1CF4
"\225\179\183-\225\179\185" .. -- U+1CF7-U+1CF9
"\225\183\128-\225\183\140" .. -- U+1DC0-U+1DCC
"\225\183\142-\225\183\187" .. -- U+1DCE-U+1DFB
"\225\183\189-\225\183\191" .. -- U+1DFD-U+1DFF
"\226\131\144-\226\131\176" .. -- U+20D0-U+20F0
"\226\179\175-\226\179\177" .. -- U+2CEF-U+2CF1
"\226\181\191" .. -- U+2D7F
"\226\183\160-\226\183\191" .. -- U+2DE0-U+2DFF
"\227\128\170-\227\128\175" .. -- U+302A-U+302F
"\227\130\153" .. -- U+3099
"\227\130\154" .. -- U+309A
"\234\153\175-\234\153\178" .. -- U+A66F-U+A672
"\234\153\180-\234\153\189" .. -- U+A674-U+A67D
"\234\154\158" .. -- U+A69E
"\234\154\159" .. -- U+A69F
"\234\155\176" .. -- U+A6F0
"\234\155\177" .. -- U+A6F1
"\234\160\130" .. -- U+A802
"\234\160\134" .. -- U+A806
"\234\160\139" .. -- U+A80B
"\234\160\163-\234\160\167" .. -- U+A823-U+A827
"\234\160\172" .. -- U+A82C
"\234\162\128" .. -- U+A880
"\234\162\129" .. -- U+A881
"\234\162\180-\234\163\133" .. -- U+A8B4-U+A8C5
"\234\163\160-\234\163\177" .. -- U+A8E0-U+A8F1
"\234\163\191" .. -- U+A8FF
"\234\164\166-\234\164\173" .. -- U+A926-U+A92D
"\234\165\135-\234\165\147" .. -- U+A947-U+A953
"\234\166\128-\234\166\131" .. -- U+A980-U+A983
"\234\166\179-\234\167\128" .. -- U+A9B3-U+A9C0
"\234\167\165" .. -- U+A9E5
"\234\168\169-\234\168\182" .. -- U+AA29-U+AA36
"\234\169\131" .. -- U+AA43
"\234\169\140" .. -- U+AA4C
"\234\169\141" .. -- U+AA4D
"\234\169\187-\234\169\189" .. -- U+AA7B-U+AA7D
"\234\170\176" .. -- U+AAB0
"\234\170\178-\234\170\180" .. -- U+AAB2-U+AAB4
"\234\170\183" .. -- U+AAB7
"\234\170\184" .. -- U+AAB8
"\234\170\190" .. -- U+AABE
"\234\170\191" .. -- U+AABF
"\234\171\129" .. -- U+AAC1
"\234\171\171-\234\171\175" .. -- U+AAEB-U+AAEF
"\234\171\181" .. -- U+AAF5
"\234\171\182" .. -- U+AAF6
"\234\175\163-\234\175\170" .. -- U+ABE3-U+ABEA
"\234\175\172" .. -- U+ABEC
"\234\175\173" .. -- U+ABED
"\239\172\158" .. -- U+FB1E
"\239\184\160-\239\184\175" .. -- U+FE20-U+FE2F
"\240\144\135\189" .. -- U+101FD
"\240\144\139\160" .. -- U+102E0
"\240\144\141\182-\240\144\141\186" .. -- U+10376-U+1037A
"\240\144\168\129-\240\144\168\131" .. -- U+10A01-U+10A03
"\240\144\168\133" .. -- U+10A05
"\240\144\168\134" .. -- U+10A06
"\240\144\168\140-\240\144\168\143" .. -- U+10A0C-U+10A0F
"\240\144\168\184-\240\144\168\186" .. -- U+10A38-U+10A3A
"\240\144\168\191" .. -- U+10A3F
"\240\144\171\165" .. -- U+10AE5
"\240\144\171\166" .. -- U+10AE6
"\240\144\180\164-\240\144\180\167" .. -- U+10D24-U+10D27
"\240\144\181\169-\240\144\181\173" .. -- U+10D69-U+10D6D
"\240\144\186\171" .. -- U+10EAB
"\240\144\186\172" .. -- U+10EAC
"\240\144\187\188-\240\144\187\191" .. -- U+10EFC-U+10EFF
"\240\144\189\134-\240\144\189\144" .. -- U+10F46-U+10F50
"\240\144\190\130-\240\144\190\133" .. -- U+10F82-U+10F85
"\240\145\128\128-\240\145\128\130" .. -- U+11000-U+11002
"\240\145\128\184-\240\145\129\134" .. -- U+11038-U+11046
"\240\145\129\176" .. -- U+11070
"\240\145\129\179" .. -- U+11073
"\240\145\129\180" .. -- U+11074
"\240\145\129\191-\240\145\130\130" .. -- U+1107F-U+11082
"\240\145\130\176-\240\145\130\186" .. -- U+110B0-U+110BA
"\240\145\131\130" .. -- U+110C2
"\240\145\132\128-\240\145\132\130" .. -- U+11100-U+11102
"\240\145\132\167-\240\145\132\180" .. -- U+11127-U+11134
"\240\145\133\133" .. -- U+11145
"\240\145\133\134" .. -- U+11146
"\240\145\133\179" .. -- U+11173
"\240\145\134\128-\240\145\134\130" .. -- U+11180-U+11182
"\240\145\134\179-\240\145\135\128" .. -- U+111B3-U+111C0
"\240\145\135\137-\240\145\135\140" .. -- U+111C9-U+111CC
"\240\145\135\142" .. -- U+111CE
"\240\145\135\143" .. -- U+111CF
"\240\145\136\172-\240\145\136\183" .. -- U+1122C-U+11237
"\240\145\136\190" .. -- U+1123E
"\240\145\137\129" .. -- U+11241
"\240\145\139\159-\240\145\139\170" .. -- U+112DF-U+112EA
"\240\145\140\128-\240\145\140\131" .. -- U+11300-U+11303
"\240\145\140\187" .. -- U+1133B
"\240\145\140\188" .. -- U+1133C
"\240\145\140\190-\240\145\141\132" .. -- U+1133E-U+11344
"\240\145\141\135" .. -- U+11347
"\240\145\141\136" .. -- U+11348
"\240\145\141\139-\240\145\141\141" .. -- U+1134B-U+1134D
"\240\145\141\151" .. -- U+11357
"\240\145\141\162" .. -- U+11362
"\240\145\141\163" .. -- U+11363
"\240\145\141\166-\240\145\141\172" .. -- U+11366-U+1136C
"\240\145\141\176-\240\145\141\180" .. -- U+11370-U+11374
"\240\145\142\184-\240\145\143\128" .. -- U+113B8-U+113C0
"\240\145\143\130" .. -- U+113C2
"\240\145\143\133" .. -- U+113C5
"\240\145\143\135-\240\145\143\138" .. -- U+113C7-U+113CA
"\240\145\143\140-\240\145\143\144" .. -- U+113CC-U+113D0
"\240\145\143\146" .. -- U+113D2
"\240\145\143\161" .. -- U+113E1
"\240\145\143\162" .. -- U+113E2
"\240\145\144\181-\240\145\145\134" .. -- U+11435-U+11446
"\240\145\145\158" .. -- U+1145E
"\240\145\146\176-\240\145\147\131" .. -- U+114B0-U+114C3
"\240\145\150\175-\240\145\150\181" .. -- U+115AF-U+115B5
"\240\145\150\184-\240\145\151\128" .. -- U+115B8-U+115C0
"\240\145\151\156" .. -- U+115DC
"\240\145\151\157" .. -- U+115DD
"\240\145\152\176-\240\145\153\128" .. -- U+11630-U+11640
"\240\145\154\171-\240\145\154\183" .. -- U+116AB-U+116B7
"\240\145\156\157-\240\145\156\171" .. -- U+1171D-U+1172B
"\240\145\160\172-\240\145\160\186" .. -- U+1182C-U+1183A
"\240\145\164\176-\240\145\164\181" .. -- U+11930-U+11935
"\240\145\164\183" .. -- U+11937
"\240\145\164\184" .. -- U+11938
"\240\145\164\187-\240\145\164\190" .. -- U+1193B-U+1193E
"\240\145\165\128") .. -- U+11940
("\240\145\165\130" .. -- U+11942
"\240\145\165\131" .. -- U+11943
"\240\145\167\145-\240\145\167\151" .. -- U+119D1-U+119D7
"\240\145\167\154-\240\145\167\160" .. -- U+119DA-U+119E0
"\240\145\167\164" .. -- U+119E4
"\240\145\168\129-\240\145\168\138" .. -- U+11A01-U+11A0A
"\240\145\168\179-\240\145\168\185" .. -- U+11A33-U+11A39
"\240\145\168\187-\240\145\168\190" .. -- U+11A3B-U+11A3E
"\240\145\169\135" .. -- U+11A47
"\240\145\169\145-\240\145\169\155" .. -- U+11A51-U+11A5B
"\240\145\170\138-\240\145\170\153" .. -- U+11A8A-U+11A99
"\240\145\176\175-\240\145\176\182" .. -- U+11C2F-U+11C36
"\240\145\176\184-\240\145\176\191" .. -- U+11C38-U+11C3F
"\240\145\178\146-\240\145\178\167" .. -- U+11C92-U+11CA7
"\240\145\178\169-\240\145\178\182" .. -- U+11CA9-U+11CB6
"\240\145\180\177-\240\145\180\182" .. -- U+11D31-U+11D36
"\240\145\180\186" .. -- U+11D3A
"\240\145\180\188" .. -- U+11D3C
"\240\145\180\189" .. -- U+11D3D
"\240\145\180\191-\240\145\181\133" .. -- U+11D3F-U+11D45
"\240\145\181\135" .. -- U+11D47
"\240\145\182\138-\240\145\182\142" .. -- U+11D8A-U+11D8E
"\240\145\182\144" .. -- U+11D90
"\240\145\182\145" .. -- U+11D91
"\240\145\182\147-\240\145\182\151" .. -- U+11D93-U+11D97
"\240\145\187\179-\240\145\187\182" .. -- U+11EF3-U+11EF6
"\240\145\188\128" .. -- U+11F00
"\240\145\188\129" .. -- U+11F01
"\240\145\188\131" .. -- U+11F03
"\240\145\188\180-\240\145\188\186" .. -- U+11F34-U+11F3A
"\240\145\188\190-\240\145\189\130" .. -- U+11F3E-U+11F42
"\240\145\189\154" .. -- U+11F5A
"\240\147\145\128" .. -- U+13440
"\240\147\145\135-\240\147\145\149" .. -- U+13447-U+13455
"\240\150\132\158-\240\150\132\175" .. -- U+1611E-U+1612F
"\240\150\171\176-\240\150\171\180" .. -- U+16AF0-U+16AF4
"\240\150\172\176-\240\150\172\182" .. -- U+16B30-U+16B36
"\240\150\189\143" .. -- U+16F4F
"\240\150\189\145-\240\150\190\135" .. -- U+16F51-U+16F87
"\240\150\190\143-\240\150\190\146" .. -- U+16F8F-U+16F92
"\240\150\191\164" .. -- U+16FE4
"\240\150\191\176" .. -- U+16FF0
"\240\150\191\177" .. -- U+16FF1
"\240\155\178\157" .. -- U+1BC9D
"\240\155\178\158" .. -- U+1BC9E
"\240\156\188\128-\240\156\188\173" .. -- U+1CF00-U+1CF2D
"\240\156\188\176-\240\156\189\134" .. -- U+1CF30-U+1CF46
"\240\157\133\165-\240\157\133\169" .. -- U+1D165-U+1D169
"\240\157\133\173-\240\157\133\178" .. -- U+1D16D-U+1D172
"\240\157\133\187-\240\157\134\130" .. -- U+1D17B-U+1D182
"\240\157\134\133-\240\157\134\139" .. -- U+1D185-U+1D18B
"\240\157\134\170-\240\157\134\173" .. -- U+1D1AA-U+1D1AD
"\240\157\137\130-\240\157\137\132" .. -- U+1D242-U+1D244
"\240\157\168\128-\240\157\168\182" .. -- U+1DA00-U+1DA36
"\240\157\168\187-\240\157\169\172" .. -- U+1DA3B-U+1DA6C
"\240\157\169\181" .. -- U+1DA75
"\240\157\170\132" .. -- U+1DA84
"\240\157\170\155-\240\157\170\159" .. -- U+1DA9B-U+1DA9F
"\240\157\170\161-\240\157\170\175" .. -- U+1DAA1-U+1DAAF
"\240\158\128\128-\240\158\128\134" .. -- U+1E000-U+1E006
"\240\158\128\136-\240\158\128\152" .. -- U+1E008-U+1E018
"\240\158\128\155-\240\158\128\161" .. -- U+1E01B-U+1E021
"\240\158\128\163" .. -- U+1E023
"\240\158\128\164" .. -- U+1E024
"\240\158\128\166-\240\158\128\170" .. -- U+1E026-U+1E02A
"\240\158\130\143" .. -- U+1E08F
"\240\158\132\176-\240\158\132\182" .. -- U+1E130-U+1E136
"\240\158\138\174" .. -- U+1E2AE
"\240\158\139\172-\240\158\139\175" .. -- U+1E2EC-U+1E2EF
"\240\158\147\172-\240\158\147\175" .. -- U+1E4EC-U+1E4EF
"\240\158\151\174" .. -- U+1E5EE
"\240\158\151\175" .. -- U+1E5EF
"\240\158\163\144-\240\158\163\150" .. -- U+1E8D0-U+1E8D6
"\240\158\165\132-\240\158\165\138") -- U+1E944-U+1E94A
-- Double combining characters.
-- Charset: [[:M:]&[:Canonical_Combining_Class=/^Double_/:]&[:^subhead=Grapheme joiner:]&[:^Variation_Selector=Yes:]]
local comb_chars_double =
"\205\156-\205\162" .. -- U+035C-U+0362
"\225\183\141" .. -- U+1DCD
"\225\183\188" -- U+1DFC
-- Variation selectors etc.; separated out so that we don't get categories for them.
-- Charset: [[:M:]&[[:subhead=Grapheme joiner:][:Variation_Selector=Yes:]]].
local comb_chars_other =
"\205\143" .. -- U+034F
"\225\160\139-\225\160\141" .. -- U+180B-U+180D
"\225\160\143" .. -- U+180F
"\239\184\128-\239\184\143" .. -- U+FE00-U+FE0F
"\243\160\132\128-\243\160\135\175" -- U+E0100-U+E01EF
local comb_chars_all = comb_chars_single .. comb_chars_double .. comb_chars_other
local comb_chars = {
combined_single = "[^" .. comb_chars_all .. "][" .. comb_chars_single .. comb_chars_other .. "]+%f[^" .. comb_chars_all .. "]",
combined_double = "[^" .. comb_chars_all .. "][" .. comb_chars_single .. comb_chars_other .. "]*[" .. comb_chars_double .. "]+[" .. comb_chars_all .. "]*.[" .. comb_chars_single .. comb_chars_other .. "]*",
diacritics_single = "[" .. comb_chars_single .. "]",
diacritics_double = "[" .. comb_chars_double .. "]",
diacritics_all = "[" .. comb_chars_all .. "]"
}
-- Somewhat curated list from https://unicode.org/Public/emoji/16.0/emoji-sequences.txt.
-- NOTE: There are lots more emoji sequences involving non-emoji Plane 0 symbols followed by 0xFE0F, which we don't
-- (yet?) handle.
local emoji_chars =
"\226\140\154" .. -- U+231A (⌚)
"\226\140\155" .. -- U+231B (⌛)
"\226\140\168" .. -- U+2328 (⌨)
"\226\143\143" .. -- U+23CF (⏏)
"\226\143\169-\226\143\179" .. -- U+23E9-U+23F3 (⏩-⏳)
"\226\143\184-\226\143\186" .. -- U+23F8-U+23FA (⏸-⏺)
"\226\150\170" .. -- U+25AA (▪)
"\226\150\171" .. -- U+25AB (▫)
"\226\150\182" .. -- U+25B6 (▶)
"\226\151\128" .. -- U+25C0 (◀)
"\226\151\187-\226\151\190" .. -- U+25FB-U+25FE (◻-◾)
"\226\152\128-\226\152\132" .. -- U+2600-U+2604 (☀-☄)
"\226\152\142" .. -- U+260E (☎)
"\226\152\145" .. -- U+2611 (☑)
"\226\152\148" .. -- U+2614 (☔)
"\226\152\149" .. -- U+2615 (☕)
"\226\152\152" .. -- U+2618 (☘)
"\226\152\157" .. -- U+261D (☝)
"\226\152\160" .. -- U+2620 (☠)
"\226\152\162" .. -- U+2622 (☢)
"\226\152\163" .. -- U+2623 (☣)
"\226\152\166" .. -- U+2626 (☦)
"\226\152\170" .. -- U+262A (☪)
"\226\152\174" .. -- U+262E (☮)
"\226\152\175" .. -- U+262F (☯)
"\226\152\184-\226\152\186" .. -- U+2638-U+263A (☸-☺)
"\226\153\136-\226\153\147" .. -- U+2648-U+2653 (♈-♓)
"\226\153\159" .. -- U+265F (♟)
"\226\153\160" .. -- U+2660 (♠)
"\226\153\163" .. -- U+2663 (♣)
"\226\153\165" .. -- U+2665 (♥)
"\226\153\166" .. -- U+2666 (♦)
"\226\153\168" .. -- U+2668 (♨)
"\226\153\187" .. -- U+267B (♻)
"\226\153\190" .. -- U+267E (♾)
"\226\153\191" .. -- U+267F (♿)
"\226\154\146-\226\154\151" .. -- U+2692-U+2697 (⚒-⚗)
"\226\154\153" .. -- U+2699 (⚙)
"\226\154\155" .. -- U+269B (⚛)
"\226\154\156" .. -- U+269C (⚜)
"\226\154\160" .. -- U+26A0 (⚠)
"\226\154\161" .. -- U+26A1 (⚡)
"\226\154\170" .. -- U+26AA (⚪)
"\226\154\171" .. -- U+26AB (⚫)
"\226\154\176" .. -- U+26B0 (⚰)
"\226\154\177" .. -- U+26B1 (⚱)
"\226\154\189" .. -- U+26BD (⚽)
"\226\154\190" .. -- U+26BE (⚾)
"\226\155\132" .. -- U+26C4 (⛄)
"\226\155\133" .. -- U+26C5 (⛅)
"\226\155\136" .. -- U+26C8 (⛈)
"\226\155\142" .. -- U+26CE (⛎)
"\226\155\143" .. -- U+26CF (⛏)
"\226\155\145" .. -- U+26D1 (⛑)
"\226\155\147" .. -- U+26D3 (⛓)
"\226\155\148" .. -- U+26D4 (⛔)
"\226\155\169" .. -- U+26E9 (⛩)
"\226\155\170" .. -- U+26EA (⛪)
"\226\155\176-\226\155\181" .. -- U+26F0-U+26F5 (⛰-⛵)
"\226\155\183-\226\155\186" .. -- U+26F7-U+26FA (⛷-⛺)
"\226\155\189" .. -- U+26FD (⛽)
"\226\156\130" .. -- U+2702 (✂)
"\226\156\133" .. -- U+2705 (✅)
"\226\156\136-\226\156\141" .. -- U+2708-U+270D (✈-✍)
"\226\156\143" .. -- U+270F (✏)
"\226\156\146" .. -- U+2712 (✒)
"\226\156\148" .. -- U+2714 (✔)
"\226\156\150" .. -- U+2716 (✖)
"\226\156\157" .. -- U+271D (✝)
"\226\156\161" .. -- U+2721 (✡)
"\226\156\168" .. -- U+2728 (✨)
"\226\156\179" .. -- U+2733 (✳)
"\226\156\180" .. -- U+2734 (✴)
"\226\157\132" .. -- U+2744 (❄)
"\226\157\135" .. -- U+2747 (❇)
"\226\157\140" .. -- U+274C (❌)
"\226\157\142" .. -- U+274E (❎)
"\226\157\147-\226\157\149" .. -- U+2753-U+2755 (❓-❕)
"\226\157\151" .. -- U+2757 (❗)
"\226\157\163" .. -- U+2763 (❣)
"\226\157\164" .. -- U+2764 (❤)
"\226\158\149-\226\158\151" .. -- U+2795-U+2797 (➕-➗)
"\226\158\161" .. -- U+27A1 (➡)
"\226\158\176" .. -- U+27B0 (➰)
"\226\158\191" .. -- U+27BF (➿)
"\226\164\180" .. -- U+2934 (⤴)
"\226\164\181" .. -- U+2935 (⤵)
"\226\172\133-\226\172\135" .. -- U+2B05-U+2B07 (⬅-⬇)
"\226\172\155" .. -- U+2B1B (⬛)
"\226\172\156" .. -- U+2B1C (⬜)
"\226\173\144" .. -- U+2B50 (⭐)
"\226\173\149" .. -- U+2B55 (⭕)
"\227\128\176" .. -- U+3030 (〰)
"\227\128\189" .. -- U+303D (〽)
"\227\138\151" .. -- U+3297 (㊗)
"\227\138\153" .. -- U+3299 (㊙)
"\240\159\128\132" .. -- U+1F004 (🀄)
"\240\159\131\143" .. -- U+1F0CF (🃏)
"\240\159\133\176" .. -- U+1F170 (🅰)
"\240\159\133\177" .. -- U+1F171 (🅱)
"\240\159\133\190" .. -- U+1F17E (🅾)
"\240\159\133\191" .. -- U+1F17F (🅿)
"\240\159\134\142" .. -- U+1F18E (🆎)
"\240\159\134\145-\240\159\134\154" .. -- U+1F191-U+1F19A (🆑-🆚)
"\240\159\136\129" .. -- U+1F201 (🈁)
"\240\159\136\130" .. -- U+1F202 (🈂)
"\240\159\136\154" .. -- U+1F21A (🈚)
"\240\159\136\175" .. -- U+1F22F (🈯)
"\240\159\136\178-\240\159\136\186" .. -- U+1F232-U+1F23A (🈲-🈺)
"\240\159\137\144" .. -- U+1F250 (🉐)
"\240\159\137\145" .. -- U+1F251 (🉑)
"\240\159\140\128-\240\159\153\143" .. -- U+1F300-U+1F64F (🌀-🙏)
"\240\159\154\128-\240\159\155\151" .. -- U+1F680-U+1F6D7 (🚀-🛗)
"\240\159\155\156-\240\159\155\172" .. -- U+1F6DC-U+1F6EC (🛜-🛬)
"\240\159\155\176-\240\159\155\188" .. -- U+1F6F0-U+1F6FC (🛰-🛼)
"\240\159\159\160-\240\159\159\171" .. -- U+1F7E0-U+1F7EB (🟠-🟫)
"\240\159\159\176" .. -- U+1F7F0 (🟰)
"\240\159\164\140-\240\159\169\147" .. -- U+1F90C-U+1FA53 (🤌-🩓)
"\240\159\169\160-\240\159\169\173" .. -- U+1FA60-U+1FA6D (🩠-🩭)
"\240\159\169\176-\240\159\169\188" .. -- U+1FA70-U+1FA7C (🩰-🩼)
"\240\159\170\128-\240\159\170\137" .. -- U+1FA80-U+1FA89 (🪀-)
"\240\159\170\143-\240\159\171\134" .. -- U+1FA8F-U+1FAC6 (-)
"\240\159\171\142-\240\159\171\156" .. -- U+1FACE-U+1FADC (🫎-)
"\240\159\171\159-\240\159\171\169" .. -- U+1FADF-U+1FAE9 (-)
"\240\159\171\176-\240\159\171\184" -- U+1FAF0-U+1FAF8 (🫰-🫸)
local unsupported_characters
local function get_unsupported_characters()
unsupported_characters, get_unsupported_characters = {}, nil
for k, v in pairs(load_data("Module:links/data").unsupported_characters) do
unsupported_characters[v] = k
end
return unsupported_characters
end
-- The list of unsupported titles and invert it (so the keys are pagenames and values are canonical titles).
local unsupported_titles
local function get_unsupported_titles()
unsupported_titles, get_unsupported_titles = {}, nil
for k, v in pairs(load_data("Module:links/data").unsupported_titles) do
unsupported_titles[v] = k
end
return unsupported_titles
end
-- To save on memory, we only cache names with either non-ASCII characters in them or ASCII characters to be removed or
-- transformed (apostrophe, double quote, hyphen).
local L2_sort_key_cache = {}
function export.get_L2_sort_key(L2)
if L2 == "Translingual" then
return "\1"
elseif L2 == "English" then
return "\2"
elseif match(L2, "^[%z\1-\b\14-!#-&(-,.-\127]+$") then
return L2
end
local sort_key = L2_sort_key_cache[L2]
if sort_key then
return sort_key
end
sort_key = toNFC(ugsub(ugsub(toNFD(L2), "[" .. comb_chars_all .. "'\"ʻʼ]+", ""), "[%s%-]+", " "))
L2_sort_key_cache[L2] = sort_key
return sort_key
end
--[==[
Given a pagename (or {nil} for the current page), create and return a data structure describing the page. The returned
object includes the following fields:
* `comb_chars`: A table containing various Lua character class patterns for different types of combined characters
(those that decompose into multiple characters in the NFD decomposition). The patterns are meant to be used with
{mw.ustring.find()}. The keys are:
** `single`: Single combining characters (character + diacritic), without surrounding brackets;
** `double`: Double combining characters (character + diacritic + character), without surrounding brackets;
** `vs`: Variation selectors, without surrounding brackets;
** `all`: Concatenation of `single` + `double` + `vs`, without surrounding brackets;
** `diacritics_single`: Like `single` but with surrounding brackets;
** `diacritics_double`: Like `double` but with surrounding brackets;
** `diacritics_all`: Like `all` but with surrounding brackets;
** `combined_single`: Lua pattern for matching a spacing character followed by one or more single combining characters;
** `combined_double`: Lua pattern for matching a combination of two spacing characters separated by one or more double
combining characters, possibly also with single combining characters;
* `emoji_pattern`: A Lua character class pattern (including surrounding brackets) that matches emojis. Meant to be used
with {mw.ustring.find()}.
* `L2_list`: Ordered list of L2 headings on the page, with the extra key `n` that gives the length of the list.
* `L2_sections`: Lookup table of L2 headings on the page, where the key is the section number assigned by the preprocessor, and the value is the L2 heading name. Once an invocation has got its actual section number from get_current_L2 in [[Module:pages]], it can use this table to determine its parent L2. TODO: We could expand this to include subsections, to check POS headings are correct etc.
* `unsupported_titles`: Map from pagenames to canonical titles for unsupported-title pages.
* `namespace`: Namespace of the pagename.
* `ns`: Namespace table for the page from mw.site.namespaces (TODO: merge with `namespace` above).
* `full_raw_pagename`: Full version of the '''RAW''' pagename (i.e. unsupported-title pages aren't canonicalized);
including the namespace and the base (portion before the slash).
* `pagename`: Canonicalized subpage portion of the pagename (unsupported-title pages are canonicalized).
* `pagename_with_base`: Same as `pagename` in the main namespace; otherwise, the whole pagename without the namespace.
* `decompose_pagename`: Equivalent of `pagename` in NFD decomposition.
* `pagename_len`: Length of `pagename` in Unicode chars, where combinations of spacing character + decomposed diacritic
are treated as single characters.
* `explode_pagename`: Set of characters found in `pagename`. The keys are characters (where combinations of spacing
character + decomposed diacritic are treated as single characters).
* `encoded_pagename`: FIXME: Document me.
* `pagename_defaultsort`: FIXME: Document me.
* `raw_defaultsort`: FIXME: Document me.
* `wikitext_topic_cat`: FIXME: Document me.
* `wikitext_langname_cat`: FIXME: Document me.
`no_fetch_content` says to not fetch and parse the content or set a DEFAULTSORT sort key, in order to save time on
test and documentation pages that have lots of template invocations that set `|pagename=`. It turns out nearly all the
time of this function is contained in the line `frame:callParserFunction("DEFAULTSORT", data.pagename_defaultsort)`,
so we skip it on test and documentation pages where it accomplishes nothing in any case.
]==]
function export.process_page(pagename, no_fetch_content)
local data = {
comb_chars = comb_chars,
emoji_pattern = "[" .. emoji_chars .. "]",
unsupported_titles = unsupported_titles or get_unsupported_titles()
}
local cats = {}
data.cats = cats
-- We cannot store `raw_title` in `data` because it contains a metatable.
local raw_title
local function bad_pagename()
if not pagename then
error("Internal error: Something wrong, `data.pagename` not specified but current title contains illegal characters")
else
error(format("Bad value for `data.pagename`: '%s', which must not contain illegal characters", pagename))
end
end
if pagename then -- for testing, doc pages, etc.
raw_title = new_title(pagename)
if not raw_title then
bad_pagename()
end
else
raw_title = mw.title.getCurrentTitle()
end
local nsText = raw_title.nsText
local namespace_is_reconstruction = nsText == "Reconstruction"
data.namespace = nsText
data.ns = mw.site.namespaces[raw_title.namespace]
local full_raw_pagename = raw_title.fullText
data.full_raw_pagename = full_raw_pagename
local frame = mw.getCurrentFrame()
-- WARNING: `content` may be nil, e.g. if we're substing a template like {{ja-new}} on a not-yet-created page
-- or if the module specifies the subpage as `data.pagename` (which many modules do) and we're in an Appendix
-- or other non-mainspace page. We used to make the latter an error but there are too many modules that do it,
-- and substing on a nonexistent page is totally legit, and we don't actually need to be able to access the
-- content of the page.
local content = not no_fetch_content and raw_title:getContent() or nil
-- Get the pagename.
pagename = physical_to_logical_pagename_if_mammoth(raw_title)
pagename = gsub(pagename, "^Unsupported titles/(.+)", function(m)
insert(cats, "Unsupported titles")
local title = (unsupported_titles or get_unsupported_titles())[m]
if title then
return title
end
-- Substitute pairs of "`". Those not used for escaping should be escaped as "`grave`", but might not be,
-- so if a pair don't form a match, the closing "`" should become the opening "`" of the next match attempt.
-- This has to be done manually, instead of using gsub.
local open_pos = find(m, "`")
if not open_pos then
return m
end
title = {sub(m, 1, open_pos - 1)}
while true do
local close_pos = find(m, "`", open_pos + 1)
if not close_pos then
-- Add "`" plus any remaining characters.
insert(title, sub(m, open_pos))
break
end
local escape = sub(m, open_pos, close_pos)
local ch = (unsupported_characters or get_unsupported_characters())[escape]
-- Match found, so substitute the character and move to the first "`" after the match if found, or
-- otherwise return.
if ch then
insert(title, ch)
local nxt_pos = close_pos + 1
open_pos = find(m, "`", nxt_pos)
-- Add any characters between the match and the next "`" or end.
if open_pos then
insert(title, sub(m, nxt_pos, open_pos - 1))
else
insert(title, sub(m, nxt_pos))
break
end
-- Match not found, so make the closing "`" the opening "`" of the next attempt.
else
-- Add the failed match, except for the closing "`".
insert(title, sub(m, open_pos, close_pos - 1))
open_pos = close_pos
end
end
return concat(title)
end)
-- Save pagename, as the local variable will be destructively modified.
data.pagename = pagename
if nsText == "" then
data.pagename_with_base = pagename
else
data.pagename_with_base = raw_title.text
end
-- Decompose the pagename in Unicode normalization form D.
data.decompose_pagename = toNFD(pagename)
-- Explode the current page name into a character table, taking decomposed combining characters into account.
local explode_pagename = {}
local pagename_len = 0
local function explode(char)
explode_pagename[char] = true
pagename_len = pagename_len + 1
return ""
end
pagename = ugsub(pagename, comb_chars.combined_double, explode)
pagename = gsub(ugsub(pagename, comb_chars.combined_single, explode), ".[\128-\191]*", explode)
data.explode_pagename = explode_pagename
data.pagename_len = pagename_len
-- Generate DEFAULTSORT.
data.encoded_pagename = encode_entities(data.pagename)
data.pagename_defaultsort = get_lang("mul"):makeSortKey(data.encoded_pagename)
if not no_fetch_content then
frame:callParserFunction("DEFAULTSORT", data.pagename_defaultsort)
end
data.raw_defaultsort = uupper(raw_title.text)
-- Make `L2_list` and `L2_sections`, note raw wikitext use of {{DEFAULTSORT:}} and {{DISPLAYTITLE:}}, then add categories if any unwanted L1 headings are found, the L2 headings are in the wrong order, or they don't match a canonical language name.
-- Note: HTML comments shouldn't be removed from `content` until after this step, as they can affect the result.
do
local L2_list, L2_list_len, L2_sections = {}, 0, {}
local prev, rc
local new_cats, L2_wrong_order = {}
local function handle_heading(heading)
local level = heading.level
if level > 2 then
return
end
local name = heading:get_name()
-- heading:get_name() will return nil if there are any newline characters in the preprocessed heading name (e.g. from an expanded template). In such cases, the preprocessor section count still increments (since it's calculated pre-expansion), but the heading will fail, so the L2 count shouldn't be incremented.
if name == nil then
return
end
L2_list_len = L2_list_len + 1
L2_list[L2_list_len] = name
L2_sections[heading.section] = name
-- Also add any L1s, since they terminate the preceding L2, but add a maintenance category since it's probably a mistake.
if level == 1 then
new_cats["Pages with unwanted L1 headings"] = true
end
-- Check the heading is in the right order.
-- FIXME: we need a more sophisticated sorting method which handles non-diacritic special characters (e.g. Magɨ).
if prev and not (
L2_wrong_order or
string_compare(export.get_L2_sort_key(prev), export.get_L2_sort_key(name))
) then
new_cats["Pages with language headings in the wrong order"] = true
L2_wrong_order = true
end
-- Check it's a canonical language name.
if not (langnames or get_langnames())[name] then
new_cats["Pages with nonstandard language headings"] = true
end
prev = name
end
local function handle_template(template)
-- Turn off redirect checking except in the Reconstruction namespace because the rc flag is only
-- used in the Reconstruction namespace and the other names are parser functions, which AFAIK can't
-- be redirected to.
local name = template:get_name(nil, not namespace_is_reconstruction and "no_redirect" or nil)
if name == "DEFAULTSORT:" then
new_cats["Pages with DEFAULTSORT conflicts"] = true
elseif name == "DISPLAYTITLE:" then
new_cats["Pages with DISPLAYTITLE conflicts"] = true
elseif name == "reconstructed" then
rc = true
end
end
if content then
for node in parse(content):iterate_nodes() do
local node_class = class_else_type(node)
if node_class == "heading" then
handle_heading(node)
elseif node_class == "template" then
handle_template(node)
elseif node_class == "parameter" then
new_cats["Pages with raw triple-brace template parameters"] = true
end
end
end
L2_list.n = L2_list_len
data.L2_list = L2_list
data.L2_sections = L2_sections
insert(cats, get_category("Pages with entries"))
insert(cats, get_category(format("Pages with %s entr%s", L2_list_len, L2_list_len == 1 and "y" or "ies")))
for cat in pairs(new_cats) do
insert(cats, get_category(cat))
end
if namespace_is_reconstruction and not rc then
local langname = match(full_raw_pagename, "^Reconstruction:([^/]+)/.")
if langname then
insert(cats, get_category(langname .. " entries missing Template:reconstructed"))
end
end
end
------ 4. Parse page for maintenance categories. ------
-- Use of tab characters.
if content and find(content, "\t", 1, true) then
insert(cats, get_category("Pages with tab characters"))
end
-- Unencoded character(s) in title.
local IDS = list_to_set{"⿰", "⿱", "⿲", "⿳", "⿴", "⿵", "⿶", "⿷", "⿸", "⿹", "⿺", "⿻", "", "", "", "", ""}
for char in pairs(explode_pagename) do
if IDS[char] and char ~= data.pagename then
insert(cats, "Terms containing unencoded characters")
break
end
end
-- Raw wikitext use of a topic or langname category. Also check if any raw sortkeys have been used.
do
local wikitext_topic_cat = {}
local wikitext_langname_cat = {}
local raw_sortkey
-- If a raw sortkey has been found, add it to the relevant table.
-- If there's no table (or the index is just `true`), create one first.
local function add_cat_table(t, lang, sortkey)
local t_lang = t[lang]
if not sortkey then
if not t_lang then
t[lang] = true
end
return
elseif t_lang == true or not t_lang then
t_lang = {}
t[lang] = t_lang
end
t_lang[uupper(decode_entities(sortkey))] = true
end
local function process_category(content, cat, colon, nxt)
local pipe = find(cat, "|", colon + 1, true)
-- Categories cannot end "|]]".
if pipe == #cat then
return
end
local title = new_title(pipe and sub(cat, 1, pipe - 1) or cat)
if not (title and title.namespace == 14) then
return
end
-- Get the sortkey (if any), then canonicalize category title.
local sortkey = pipe and sub(cat, pipe + 1) or nil
cat = title.text
if sortkey then
raw_sortkey = true
-- If the sortkey contains "[", the first "]" of a final "]]]" is treated as part of the sortkey.
if find(sortkey, "[", 1, true) and sub(content, nxt, nxt) == "]" then
sortkey = sortkey .. "]"
end
end
local code = match(cat, "^([%w%-.]+):")
if code then
add_cat_table(wikitext_topic_cat, code, sortkey)
return
end
-- Split by word.
cat = split(cat, " ", true, true)
-- Formerly we looked for the language name anywhere in the category. This is simply wrong
-- because there are no categories like 'Alsatian French lemmas' (only L2 languages
-- have langname categories), but doing it this way wrongly catches things like [[Category:Shapsug Adyghe]]
-- in [[Category:Adyghe entries with language name categories using raw markup]].
local n = #cat - 1
if n <= 0 then
return
end
-- Go from longest to shortest and stop once we've found a language name. Going from shortest
-- to longest or not stopping after a match risks falsely matching (e.g.) German Low German
-- categories as German.
repeat
local name = concat(cat, " ", 1, n)
if (langnames or get_langnames())[name] then
add_cat_table(wikitext_langname_cat, name, sortkey)
return
end
n = n - 1
until n == 0
end
if content then
-- Remove comments, then iterate over category links.
content = remove_comments(content, "BOTH")
local head = find(content, "[[", 1, true)
while head do
local close = find(content, "]]", head + 2, true)
if not close then
break
end
-- Make sure there are no intervening "[[" between head and close.
local open = find(content, "[[", head + 2, true)
while open and open < close do
head = open
open = find(content, "[[", head + 2, true)
end
local cat = sub(content, head + 2, close - 1)
-- Locate the colon, and weed out most unwanted links. "[ _\128-\244]*" catches valid whitespace, and ensures any category links using the colon trick are ignored. We match all non-ASCII characters, as there could be multibyte spaces, and mw.title.new will filter out any remaining false-positives; this is a lot faster than running mw.title.new on every link.
local colon = match(cat, "^[ _\128-\244]*[Cc][Aa][Tt][EeGgOoRrYy _\128-\244]*():")
if colon then
process_category(content, cat, colon, close + 2)
end
head = open
end
end
data.wikitext_topic_cat = wikitext_topic_cat
data.wikitext_langname_cat = wikitext_langname_cat
if raw_sortkey then
insert(cats, get_category("Pages with raw sortkeys"))
end
end
return data
end
return export
0esb0zcz2sjpy8aqh1uv1deoe3q625h
Module:mammoth page
828
6009
17448
2026-07-13T08:50:48Z
Hiyuune
6766
+
17448
Scribunto
text/plain
local export = {}
local m_links_data = mw.loadData("Module:links/data")
local m_parameters = require("Module:parameters")
local m_template_parser = require("Module:template parser")
local m_utilities = require("Module:utilities")
local insert = table.insert
local concat = table.concat
local unpack = unpack or table.unpack -- Lua 5.2 compatibility
function export.show_template(frame)
local parent_args = frame:getParent().args
local args = m_parameters.process(parent_args, {
pagename = true
})
local this_title
if args.pagename then
this_title = mw.title.new(args.pagename)
if not this_title then
error(("Bad pagename: '%s'"):format(args.pagename))
end
else
this_title = mw.title.getCurrentTitle()
end
-- Are we on a subpage?
local root_mammoth_page_title = this_title
-- Formerly we checked for the specific known subpages of a given mammoth split page, e.g. we would convert
-- [[a/languages M to Z]] to [[a]] assuming that [[a/languages M to Z]] was one of the splits, but not
-- [[a/languages N to Z]]. To simplify this, we just convert anything with the right mammoth split page format
-- on the assumption that it's unlikely we will ever have a legitimate non-mammoth-split pagename of this sort.
local prefixed_base, subpage = this_title.prefixedText:match("^(.+)/(languages [A-Z] to [A-Z])$")
if subpage then
root_mammoth_page_title = mw.title.new(prefixed_base)
if not root_mammoth_page_title then
error(("Internal error: Something wrong, prefixed base '%s' of mammoth page has bad character even though prefixedText '%s' does not seem to"):format(
prefixed_base, this_title.prefixedText))
end
end
-- Translingual and English are assumed to always be present on the root page
local toc_links = {
"[[" .. root_mammoth_page_title.prefixedText .. "#Translingual|Translingual]] • " ..
"[[" .. root_mammoth_page_title.prefixedText .. "#English|English]]"
}
local L2_count = 2
-- compile a list of L2 headers on each subpage
for _, subpage_spec in ipairs(m_links_data.mammoth_page_subpage_types[m_links_data.mammoth_pages[root_mammoth_page_title.subpageText]]) do
local subpage_name = subpage_spec[1]
local subpage_title = root_mammoth_page_title:subPageTitle(subpage_name)
local subpage_content = subpage_title and subpage_title:getContent()
if subpage_content then
local subpage_links = {}
for heading in m_template_parser.find_headings(subpage_content, 2, 2) do
local name = heading:get_name()
if name then -- malformed L2 headings (e.g. with newlines in them due to template expansion) don't have names
local link = "[[" .. root_mammoth_page_title.prefixedText ..
"/" .. subpage_name .. "#" .. name .. "|" .. name .. "]]"
insert(subpage_links, link)
L2_count = L2_count + 1
end
end
insert(toc_links, concat(subpage_links, " • "))
end
end
return frame:extensionTag("templatestyles", nil, {src="Module:minitoc/styles.css"}) ..
"<div class=\"NavFrame no-collapse minitoc mammoth-minitoc\">" ..
"<div class=\"NavHead\">Languages (" .. L2_count .. ")</div>" ..
"<div class=\"NavContent\">" .. (toc_links and concat(toc_links, "<hr>") or "") .. "<hr>" ..
"<div>''The entries for '''" .. root_mammoth_page_title.text .. "''' are spread across multiple pages due to their length.''</div></div></div>" ..
m_utilities.format_categories("Mammoth pages")
end
return export
oyq8xohsusjfjndqkkkxqvrhbv19ich
Module:languages/data/3/m
828
6010
17450
2026-07-13T08:52:15Z
Hiyuune
6766
+
17450
Scribunto
text/plain
local m_langdata = require("Module:languages/data")
-- Loaded on demand, as it may not be needed (depending on the data).
local function u(...)
u = require("Module:string utilities").char
return u(...)
end
local c = m_langdata.chars
local p = m_langdata.puaChars
local s = m_langdata.shared
local m = {}
m["maa"] = {
"San Jerónimo Tecóatl Mazatec",
7692927,
"omq-maz",
"Latn",
}
m["mab"] = {
"Yutanduchi Mixtec",
12645448,
"omq-mxt",
"Latn",
}
m["mad"] = {
"Madurese",
36213,
"poz-msa",
"Latn, Java",
}
m["mae"] = {
"Bo-Rukul",
34967,
"nic-ple",
"Latn",
}
m["maf"] = {
"Mafa",
35819,
"cdc-cbm",
"Latn",
}
m["mag"] = {
"Magahi", -- Not to be confused with Magadhi Prakrit (pra-mag)
33728,
"inc-bih",
"Deva, Kthi",
translit = {
Deva = "bho-translit",
Kthi = "bho-Kthi-translit",
},
}
m["mai"] = {
"Maithili",
36109,
"inc-bih",
"Deva, Tirh, Kthi, Newa",
translit = {
Deva = "mai-translit",
Tirh = "mai-Tirh-translit",
Kthi = "bho-Kthi-translit",
},
}
m["maj"] = {
"Jalapa de Díaz Mazatec",
3915999,
"omq-maz",
"Latn",
}
m["mak"] = {
"Makasar",
33643,
"poz-ssw",
"Latn, Bugi, Maka",
}
m["mam"] = {
"Mam",
33467,
"myn",
"Latn",
}
m["man"] = {
"Mandingo",
35772,
"dmn-man",
"Latn",
}
m["maq"] = {
"Chiquihuitlán Mazatec",
5101757,
"omq-maz",
"Latn",
}
m["mas"] = {
"Maasai",
35787,
"sdv-lma",
"Latn",
}
m["mat"] = {
"Matlatzinca",
12953704,
"omq",
"Latn",
}
m["mau"] = {
"Huautla Mazatec",
36230,
"omq-maz",
"Latn",
}
m["mav"] = {
"Sateré-Mawé",
6794475,
"tup",
"Latn",
}
m["maw"] = {
"Mampruli",
35804,
"nic-wov",
"Latn",
}
m["max"] = {
"North Moluccan Malay",
7056136,
"crp",
"Latn",
ancestors = "ms",
}
m["maz"] = {
"Central Mazahua",
36228,
"oto",
"Latn",
}
m["mba"] = {
"Higaonon",
5753411,
"mno",
"Latn",
}
m["mbb"] = {
"Western Bukidnon Manobo",
7987643,
"mno",
"Latn",
}
m["mbc"] = {
"Macushi",
56633,
"sai-pem",
"Latn",
}
m["mbd"] = {
"Dibabawon Manobo",
18755523,
"mno",
"Latn",
}
m["mbe"] = {
"Molale",
3319444,
"nai-plp",
"Latn",
}
m["mbf"] = {
"Baba Malay",
18642798,
"crp",
"Latn",
ancestors = "ms",
}
m["mbh"] = {
"Mangseng",
6749147,
"poz-ocw",
"Latn",
}
m["mbi"] = {
"Ilianen Manobo",
14916911,
"mno",
"Latn",
}
m["mbj"] = {
"Nadëb",
3335011,
"sai-nad",
"Latn",
}
m["mbk"] = {
"Malol",
6744477,
"poz-ocw",
"Latn",
}
m["mbl"] = {
"Maxakalí",
3029682,
"sai-mje",
"Latn",
}
m["mbm"] = {
"Ombamba",
36407,
"bnt-mbt",
"Latn",
}
m["mbn"] = {
"Macaguán",
3273980,
"sai-guh",
"Latn",
}
m["mbo"] = { -- is, like 'bqz', 'bsi' and 'bss', a dialect of Manenguba
"Mbo (Cameroon)",
36011,
"bnt-mne",
"Latn",
}
m["mbp"] = {
"Wiwa",
3012604,
"cba",
"Latn",
}
m["mbq"] = {
"Maisin",
3448149,
nil,
"Latn",
}
m["mbr"] = {
"Nukak Makú",
3346228,
"sai-nad",
"Latn",
}
m["mbs"] = {
"Sarangani Manobo",
7423093,
"mno",
"Latn",
}
m["mbt"] = {
"Matigsalug Manobo",
6787447,
"mno",
"Latn",
}
m["mbu"] = {
"Mbula-Bwazza",
3913324,
"nic-jrn",
"Latn",
}
m["mbv"] = {
"Mbulungish",
36003,
"alv-nal",
"Latn",
}
m["mbw"] = {
"Maring",
3293280,
"ngf-jim",
"Latn",
}
m["mbx"] = {
"Mari (Sepik)",
6760942,
"paa-sep",
"Latn",
}
m["mby"] = {
"Memoni",
4180871,
"inc-snd",
"Gujr, ur-Arab",
}
m["mbz"] = {
"Amoltepec Mixtec",
13583504,
"omq-mxt",
"Latn",
}
m["mca"] = {
"Maca",
3281043,
"sai-mtc",
"Latn",
}
m["mcb"] = {
"Machiguenga",
3915441,
"awd",
"Latn",
}
m["mcc"] = {
"Bitur",
4919173,
"paa-tir",
"Latn",
}
m["mcd"] = {
"Sharanahua",
12953881,
"sai-pan",
"Latn",
}
m["mce"] = {
"Itundujia Mixtec",
12953727,
"omq-mxt",
"Latn",
}
m["mcf"] = {
"Matsés",
2981620,
"sai-pan",
"Latn",
}
m["mcg"] = {
"Mapoyo",
56946,
"sai-map",
"Latn",
}
m["mch"] = {
"Ye'kwana",
3082027,
"sai-car",
"Latn",
sort_key = {
remove_diacritics = "%-%s",
from = {"'", "ñ", "ö", "sh", "ü"},
to = {"’", "n" .. p[1], "o" .. p[1], "s" .. p[1], "u" .. p[1]}
}
}
m["mci"] = {
"Mese",
6821190,
"ngf-san",
"Latn",
}
m["mcj"] = {
"Mvanip",
3913281,
"nic-mmb",
"Latn",
}
m["mck"] = {
"Mbunda",
34170,
"bnt-clu",
"Latn",
}
m["mcl"] = {
"Macaguaje",
6722435,
"sai-tuc",
"Latn",
}
m["mcm"] = {
"Kristang",
2669169,
"crp",
"Latn",
ancestors = "pt",
}
m["mcn"] = {
"Masana",
56668,
"cdc-mas",
}
m["mco"] = {
"Coatlán Mixe",
25559716,
"nai-miz",
"Latn",
}
m["mcp"] = {
"Makaa",
35803,
"bnt-mka",
}
m["mcq"] = {
"Ese",
5397551,
"ngf-koi",
"Latn",
}
m["mcr"] = {
"Menya",
11732444,
"ngf-kme",
"Latn",
}
m["mcs"] = {
"Mambai",
6748872,
"alv-mbm",
}
m["mcu"] = {
"Cameroon Mambila",
19359039,
"nic-mmb",
"Latn",
}
-- mcv (Minanibai) merged into ffi (Foia Foia) per Glottolog
m["mcw"] = {
"Mawa",
3441333,
"cdc-est",
"Latn",
}
m["mcx"] = {
"Mpiemo",
35908,
"bnt-bek",
}
m["mcy"] = {
"South Watut",
12953293,
"poz-ocw",
"Latn",
}
m["mcz"] = {
"Mawan",
11732429,
"ngf-han",
"Latn",
}
m["mda"] = {
"Mada (Nigeria)",
3915843,
"nic-nin",
"Latn",
}
m["mdb"] = {
"Morigi",
6912195,
"paa-kiw",
"Latn",
}
m["mdc"] = {
"Male",
6742927,
"ngf-min",
"Latn",
}
m["mdd"] = {
"Mbum",
36170,
"alv-mbm",
}
m["mde"] = {
"Bura Mabang",
35860,
"ssa",
"Arab, Latn",
}
m["mdf"] = {
"Moksha",
13343,
"urj-mdv",
"Cyrl",
translit = "mdf-translit",
strip_diacritics = {remove_diacritics = c.acute},
override_translit = true,
sort_key = "mdf-sortkey",
}
m["mdg"] = {
"Massalat",
759984,
nil,
"Latn",
}
m["mdh"] = {
"Maguindanao",
33717,
"phi",
"Latn, Arab",
}
m["mdi"] = {
"Mamvu",
3033594,
"csu-mle",
}
m["mdj"] = {
"Mangbetu",
56327,
"csu-maa",
"Latn",
}
m["mdk"] = {
"Mangbutu",
6748877,
"csu-mle",
}
m["mdl"] = {
"Maltese Sign Language",
6744816,
"sgn",
}
m["mdm"] = {
"Mayogo",
6797580,
"nic-nke",
"Latn",
}
m["mdn"] = {
"Mbati",
36165,
"bnt-ngn",
}
m["mdp"] = {
"Mbala",
6799583,
"bnt-pen",
}
m["mdq"] = {
"Mbole",
6799727,
"bnt-mbe",
}
m["mdr"] = {
"Mandar",
35995,
"poz-ssw",
"Bugi, Latn",
}
m["mds"] = {
"Maria",
3448673,
"paa-man",
"Latn",
}
m["mdt"] = {
"Mbere",
36062,
"bnt-mbt",
}
m["mdu"] = {
"Mboko",
36058,
"bnt-mbo",
}
m["mdv"] = {
"Santa Lucía Monteverde Mixtec",
12953722,
"omq-mxt",
"Latn",
}
m["mdw"] = {
"Mbosi",
36035,
"bnt-mbo",
}
m["mdx"] = {
"Dizin",
35313,
"omv-diz",
"Ethi, Latn",
}
m["mdy"] = {
"Maale",
795327,
"omv-ome",
}
m["mdz"] = {
"Suruí Do Pará",
10322149,
"tup-gua",
"Latn",
}
m["mea"] = {
"Menka",
36078,
"nic-grs",
"Latn",
}
m["meb"] = {
"Ikobi-Mena",
11732241,
"paa-tki",
"Latn",
}
m["mec"] = {
"Mara",
6772774,
}
m["med"] = {
"Melpa",
36166,
"ngf-hag",
"Latn",
}
m["mee"] = {
"Mengen",
3305831,
"poz-ocw",
"Latn",
}
m["mef"] = {
"Megam",
6808589,
}
m["meh"] = {
"Southwestern Tlaxiaco Mixtec",
7070686,
"omq-mxt",
"Latn",
}
m["mei"] = {
"Midob",
36007,
"nub",
"Latn",
}
m["mej"] = {
"Meyah",
11732436,
"paa-ebh",
"Latn",
}
m["mek"] = {
"Mekeo",
3304803,
"poz-ocw",
"Latn",
}
m["mel"] = {
"Central Melanau",
18638319,
"poz-swa",
"Latn",
}
m["mem"] = {
"Mangala",
6748664,
}
m["men"] = {
"Mende (Sierra Leone)",
1478672,
"dmn-msw",
"Latn, Mend",
}
m["meo"] = {
"Kedah Malay",
4925684,
"poz-mly",
"Latn, ms-Arab, Thai",
strip_diacritics = {
from = {u(0xF70F)},
to = {"ญ"}
},
sort_key = {Thai = "Thai-sortkey"},
}
m["mep"] = {
"Miriwoong",
3111847,
"aus-jar",
"Latn",
}
m["meq"] = {
"Merey",
3502314,
"cdc-cbm",
"Latn",
}
m["mer"] = {
"Meru",
13313,
"bnt-kka",
"Latn",
}
m["mes"] = {
"Masmaje",
3440448,
}
m["met"] = {
"Mato",
3299190,
"poz-ocw",
"Latn",
}
m["meu"] = {
"Motu",
33516,
"poz-ocw",
"Latn",
}
m["mev"] = {
"Mano",
3913286,
"dmn-mda",
"Latn",
}
m["mew"] = {
"Maaka",
3438764,
"cdc-wst",
"Latn",
}
m["mey"] = {
"Hassaniya Arabic",
56231,
"sem-arb",
"Arab",
}
m["mez"] = {
"Menominee",
13363,
"alg",
"Latn",
sort_key = {remove_diacritics = "·"},
}
m["mfa"] = {
"Pattani Malay",
1199751,
"poz-mly",
"Latn, ms-Arab, Thai",
strip_diacritics = {
from = {u(0xF70F)},
to = {"ญ"}
},
sort_key = {Thai = "Thai-sortkey"},
}
m["mfb"] = {
"Bangka",
3258818,
"poz-mly",
"Latn, Arab",
}
m["mfc"] = {
"Mba",
4286464,
"nic-mbc",
"Latn",
}
m["mfd"] = {
"Mendankwe-Nkwen",
11129537,
"nic-nge",
"Latn",
}
m["mfe"] = {
"Mauritian Creole",
33661,
"crp",
"Latn",
ancestors = "fr",
sort_key = s["roa-oil-sortkey"],
}
m["mff"] = {
"Naki",
36083,
"nic-bbe",
"Latn",
}
m["mfg"] = {
"Mixifore",
3914478,
"dmn-mok",
}
m["mfh"] = {
"Matal",
3501751,
"cdc-cbm",
"Latn",
}
m["mfi"] = {
"Wandala",
3441249,
"cdc-cbm",
"Latn",
}
m["mfj"] = {
"Mefele",
3501871,
"cdc-cbm",
}
m["mfk"] = {
"North Mofu",
56303,
"cdc-cbm",
"Latn",
}
m["mfl"] = {
"Putai",
56291,
}
m["mfm"] = {
"Marghi South",
56248,
}
m["mfn"] = {
"Cross River Mbembe",
3915395,
"nic-uce",
"Latn",
}
m["mfo"] = {
"Mbe",
36075,
"nic-eko",
"Latn",
}
m["mfp"] = {
"Makassar Malay",
12952776,
"qfa-mix",
"Latn",
ancestors = "ms, mak"
}
m["mfq"] = {
"Moba",
19921578,
"nic-grm",
"Latn",
}
m["mfr"] = {
"Marrithiyel",
6773014,
"aus-dal",
"Latn",
}
m["mfs"] = {
"Mexican Sign Language",
3915511,
"sgn",
"Latn", -- when documented
}
m["mft"] = {
"Mokerang",
3319387,
"poz-aay",
"Latn",
}
m["mfu"] = {
"Mbwela",
11004988,
"bnt-clu",
ancestors = "lch",
}
m["mfv"] = {
"Mandjak",
35822,
"alv-pap",
}
m["mfw"] = {
"Mulaha",
6933720,
"paa-kwa",
"Latn",
}
m["mfx"] = {
"Melo",
6813268,
"omv-nom",
}
m["mfy"] = {
"Mayo",
56729,
"azc-trc",
"Latn",
sort_key = {remove_diacritics = c.acute},
}
m["mfz"] = {
"Mabaan",
20526385,
"sdv",
"Latn",
}
m["mga"] = {
"Middle Irish",
36116,
"cel-gae",
"Latn",
ancestors = "sga",
strip_diacritics = {remove_diacritics = c.dotabove .. c.diaer .. "·"},
sort_key = "mga-sortkey",
}
m["mgb"] = {
"Mararit",
56359,
"sdv-tmn",
}
m["mgc"] = {
"Morokodo",
6913216,
"csu-bbk",
"Latn",
}
m["mgd"] = {
"Moru",
6915014,
"csu-mma",
"Latn, Arab",
}
m["mge"] = {
"Mango",
713659,
"csu-sar",
"Latn",
}
m["mgf"] = {
"Maklew",
6739816,
"paa-bul",
"Latn",
}
m["mgg"] = {
"Mpongmpong",
35924,
"bnt-bek",
}
m["mgh"] = {
"Makhuwa-Meetto",
33604,
"bnt-mak",
"Latn",
ancestors = "vmw",
}
m["mgi"] = {
"Jili",
3914497,
"nic-pls",
}
m["mgj"] = {
"Abureni",
3441256,
"nic-cde",
"Latn",
}
m["mgk"] = {
"Mawes",
6794395,
"qfa-dis", -- Papuan; isolate in Glottolog, Foley (2018) and Hammarström (2010); in the Tor-Kwerba languages per
-- Usher (2020)
"Latn",
}
m["mgl"] = {
"Maleu-Kilenge",
3281884,
}
m["mgm"] = {
"Mambae",
35774,
"poz-tim",
"Latn",
}
m["mgn"] = {
"Mbangi",
11017443,
"nic-ngd",
"Latn",
}
m["mgo"] = {
"Meta'",
36054,
"nic-mom",
"Latn",
}
m["mgp"] = {
"Eastern Magar",
12952758,
"sit-gma",
"Deva, Latn",
}
m["mgq"] = {
"Malila",
6743679,
"bnt-mby",
"Latn",
}
m["mgr"] = {
"Mambwe-Lungu",
626210,
"bnt-mwi",
"Latn",
}
m["mgs"] = {
"Manda (Tanzania)",
16939267,
"bnt-bki",
}
m["mgt"] = {
"Mwakai",
11260674,
"paa-wke",
"Latn",
}
m["mgu"] = {
"Mailu",
3278246,
"paa-mal",
"Latn",
}
m["mgv"] = {
"Matengo",
6786446,
"bnt-mbi",
"Latn",
}
m["mgw"] = {
"Matumbi",
6791974,
"bnt-mbi",
"Latn",
}
m["mgy"] = {
"Mbunga",
6799817,
"bnt-kil",
}
m["mgz"] = {
"Mbugwe",
3426367,
"bnt-mra",
}
m["mha"] = {
"Manda (India)",
56760,
"dra-kki",
"Orya",
translit = "kxv-translit",
}
m["mhb"] = {
"Mahongwe",
35816,
"bnt-kel",
}
m["mhc"] = {
"Mocho",
1941682,
"myn",
}
m["mhd"] = {
"Mbugu",
36152,
"qfa-mix",
"Latn",
ancestors = "asa",
}
m["mhe"] = {
"Besisi",
2742262,
"mkh-asl",
"Latn",
}
m["mhf"] = {
"Mamaa",
6745346,
"ngf-era",
"Latn",
}
m["mhg"] = {
"Marrgu",
6772812,
}
m["mhi"] = {
"Ma'di",
56670,
"csu-mma",
"Latn",
strip_diacritics = {remove_diacritics = c.acute .. c.grave .. c.tilde .. c.dotbelow},
}
m["mhj"] = {
"Mogholi",
13336,
"xgn",
"fa-Arab, Latn",
translit = "fa-cls-translit",
strip_diacritics = {
["fa-Arab"] = "ar-stripdiacritics",
},
}
m["mhk"] = {
"Mungaka",
36068,
"nic-nun",
}
m["mhl"] = {
"Mauwake",
6794095,
"ngf-kum",
"Latn",
}
m["mhm"] = {
"Makhuwa-Moniga",
6900145,
"bnt-mak",
}
m["mhn"] = {
"Mòcheno",
268130,
"gmw-hgm",
"Latn",
ancestors = "bar",
sort_key = {remove_diacritics = c.grave},
}
m["mho"] = {
"Mashi",
10962737,
"bnt-kav",
"Latn",
}
m["mhp"] = {
"Balinese Malay",
12473441,
"crp",
"Latn, Bali, ms-Arab",
}
m["mhq"] = {
"Mandan",
1957120,
"sio",
"Latn",
}
m["mhr"] = {
"Eastern Mari",
3906614,
"chm",
"Cyrl",
translit = "chm-translit",
override_translit = true,
strip_diacritics = {remove_diacritics = c.grave .. c.acute},
sort_key = {
from = {"ё", "ҥ", "ӧ", "ӱ"},
to = {"е" .. p[1], "н" .. p[1], "о" .. p[1], "у" .. p[1]}
}
}
m["mhs"] = {
"Buru (Indonesia)",
2928650,
"poz-cma",
"Latn",
}
m["mht"] = {
"Mandahuaca",
6747924,
"awd-nwk",
}
m["mhu"] = {
"Taraon",
56400,
"sit-gsi",
"Latn",
}
m["mhw"] = {
"Mbukushu",
2691548,
"bnt",
"Latn",
}
m["mhx"] = {
"Lhao Vo",
11149315,
"tbq-brm",
"Latn",
}
m["mhy"] = {
"Ma'anyan",
2328761,
"poz-bre",
"Latn",
}
m["mhz"] = {
"Mor (Austronesian)",
2122792,
"poz-hce",
"Latn",
}
m["mia"] = {
"Miami",
56523,
"alg",
"Latn",
}
m["mib"] = {
"Atatláhuca Mixtec",
32093046,
"omq-mxt",
"Latn",
}
m["mic"] = {
"Mi'kmaq",
13321,
"alg-eas",
"Latn",
}
m["mid"] = {
"Mandaic",
6991742,
"sem-ase",
"Mand",
ancestors = "myz",
translit = {
Mand = "Mand-translit",
},
strip_diacritics = {
Mand = "Mand-stripdiacritics",
}
}
m["mie"] = {
"Ocotepec Mixtec",
25559575,
"omq-mxt",
"Latn",
}
m["mif"] = {
"Mofu-Gudur",
1365132,
"cdc-cbm",
"Latn",
}
m["mig"] = {
"San Miguel el Grande Mixtec",
12953719,
"omq-mxt",
"Latn",
}
m["mih"] = {
"Chayuco Mixtec",
13583510,
"omq-mxt",
"Latn",
}
m["mii"] = {
"Chigmecatitlán Mixtec",
12953724,
"omq-mxt",
"Latn",
}
m["mij"] = {
"Mungbam",
34725,
"nic-beb",
"Latn",
}
m["mik"] = {
"Mikasuki",
13316,
"nai-mus",
"Latn",
}
m["mil"] = {
"Peñoles Mixtec",
42411307,
"omq-mxt",
"Latn",
}
m["mim"] = {
"Alacatlatzala Mixtec",
14697894,
"omq-mxt",
"Latn",
}
m["min"] = {
"Minangkabau",
13324,
"poz-mly",
"Latn, Arab",
}
m["mio"] = {
"Pinotepa Nacional Mixtec",
7196415,
"omq-mxt",
"Latn",
}
m["mip"] = {
"Apasco-Apoala Mixtec",
13583505,
"omq-mxt",
"Latn",
}
m["miq"] = {
"Miskito",
1516803,
"nai-min",
"Latn",
strip_diacritics = {remove_diacritics = c.circ},
}
m["mir"] = {
"Isthmus Mixe",
6088873,
"nai-miz",
"Latn",
}
m["mit"] = {
"Southern Puebla Mixtec",
7570345,
"omq-mxt",
"Latn",
}
m["miu"] = {
"Cacaloxtepec Mixtec",
12953723,
"omq-mxt",
"Latn",
}
m["miw"] = {
"Akoye",
3327462,
"ngf-taa",
"Latn",
}
m["mix"] = {
"Mixtepec Mixtec",
6884125,
"omq-mxt",
"Latn",
}
m["miy"] = {
"Ayutla Mixtec",
13583508,
"omq-mxt",
"Latn",
}
m["miz"] = {
"Coatzospan Mixtec",
3317290,
"omq-mxt",
"Latn",
}
m["mjb"] = {
"Makalero",
35729,
"paa-alp",
"Latn",
}
m["mjc"] = {
"San Juan Colorado Mixtec",
12953718,
"omq-mxt",
"Latn",
}
m["mjd"] = {
"Northwest Maidu",
3198700,
"nai-mdu",
"Latn",
}
m["mje"] = {
"Muskum",
3913334,
}
-- mjg "Monguor" is not recognized as a language, but it is a family code
m["mji"] = {
"Kim Mun",
1115317,
"hmx-mie",
"Latn",
}
m["mjj"] = {
"Mawak",
11732427,
"ngf-tib",
"Latn",
}
m["mjk"] = {
"Matukar",
6791963,
"poz-ocw",
"Latn",
}
m["mjl"] = {
"Mandeali",
6747931,
"him",
"Deva, Takr",
translit = "hi-translit",
}
m["mjm"] = {
"Medebur",
6805227,
"poz-ocw",
"Latn",
}
m["mjn"] = {
"Mebu",
6804364,
"ngf-yup",
"Latn",
}
m["mjo"] = {
"Malankuravan",
14916887,
"dra-mal",
}
m["mjp"] = {
"Malapandaram",
10575729,
"dra-tam",
}
m["mjq"] = {
"Malaryan",
12952773,
"dra-mal",
}
m["mjr"] = {
"Malavedan",
12952775,
"dra-mal",
"Mlym",
-- Mlym translit in [[Module:scripts/data]]
}
m["mjs"] = {
"Miship",
3441264,
"cdc-wst",
"Latn",
}
m["mjt"] = {
"Sawriya Paharia",
33907,
"dra-mlo",
"Beng, Deva",
}
m["mju"] = {
"Manna-Dora",
10576453,
"dra-tel",
}
m["mjv"] = {
"Mannan",
3286037,
"dra-tam",
"Mlym, Taml",
translit = {
Taml = "ta-translit",
},
-- Mlym translit in [[Module:scripts/data]]
}
m["mjw"] = {
"Karbi",
56591,
"tbq-kuk",
"Latn",
}
m["mjx"] = {
"Mahali",
12953686,
"mun",
}
m["mjy"] = {
"Mahican",
3182562,
"alg-eas",
"Latn",
}
m["mjz"] = {
"Majhi",
6737786,
"inc-bih",
}
m["mka"] = {
"Mbre",
3450154,
"nic", --unclassified within niger-congo tho
}
m["mkb"] = {
"Mal Paharia",
6583595,
"inc-eas",
"Deva",
}
m["mkc"] = {
"Siliput",
7515090,
"paa-mam",
"Latn",
}
m["mke"] = {
"Mawchi",
21403317,
}
m["mkf"] = {
"Miya",
43328,
"cdc-wst",
"Latn",
}
m["mkg"] = {
"Mak (China)",
3280623,
"qfa-kms",
}
m["mki"] = {
"Dhatki",
32480,
"raj",
"Deva, Mahj, Arab",
}
m["mkj"] = {
"Mokilese",
2335528,
"poz-mic",
"Latn",
}
m["mkk"] = {
"Byep",
35052,
"bnt-mka",
}
m["mkl"] = {
"Mokole",
36047,
"alv-yor",
"Latn",
}
m["mkm"] = {
"Moklen",
3319380,
}
m["mkn"] = {
"Kupang Malay",
18458203,
"crp",
"Latn",
}
m["mko"] = {
"Mingang Doso",
3915382,
"alv-bwj",
}
m["mkp"] = {
"Moikodi",
6894594,
"ngf-yar",
"Latn",
}
m["mkq"] = {
"Bay Miwok",
3460957,
"nai-utn",
"Latn",
}
m["mkr"] = {
"Malas",
11732402,
"ngf-nad",
"Latn",
}
m["mks"] = {
"Silacayoapan Mixtec",
7514027,
"omq-mxt",
"Latn",
}
m["mkt"] = {
"Vamale",
14916907,
"poz-cln",
"Latn",
}
m["mku"] = {
"Konyanka Maninka",
11163298,
"dmn-mnk",
}
m["mkv"] = {
"Mav̋ea",
3073532,
"poz-vnn",
"Latn",
}
m["mkx"] = {
"Cinamiguin Manobo",
12953697,
"mno",
"Latn",
}
m["mky"] = {
"Taba",
3512690,
"poz-hce",
"Latn",
}
m["mkz"] = {
"Makasae",
35782,
"paa-eti",
"Latn",
}
m["mla"] = {
"Tamambo",
1153276,
"poz-vnn",
"Latn",
}
m["mlb"] = {
"Mbule",
35843,
"nic-ymb",
"Latn",
}
m["mlc"] = {
"Caolan",
3446682,
"tai-cho",
"Latn, Hani",
sort_key = {Hani = "Hani-sortkey"},
}
m["mle"] = {
"Manambu",
11732406,
"paa-nnd",
"Latn",
}
m["mlf"] = {
"Mal",
3281057,
"mkh-khm",
}
m["mlh"] = {
"Mape",
6753787,
"ngf-kma",
"Latn",
}
m["mli"] = {
"Malimpung",
12473435,
}
m["mlj"] = {
"Miltu",
3441310,
}
m["mlk"] = {
"Ilwana",
6001357,
"bnt-sab",
}
m["mll"] = {
"Malua Bay",
6744946,
"poz-vnc",
"Latn",
}
m["mlm"] = {
"Mulam",
3092284,
"qfa-kms",
"Latn",
}
m["mln"] = {
"Malango",
3281522,
"poz-sls",
"Latn",
}
m["mlo"] = {
"Mlomp",
36009,
"alv-bak",
}
m["mlp"] = {
"Bargam",
4860543,
"ngf-mad",
"Latn",
}
m["mlq"] = {
"Western Maninkakan",
11028033,
"dmn-wmn",
}
m["mlr"] = {
"Vame",
3515088,
"cdc-cbm",
"Latn",
}
m["mls"] = {
"Masalit",
56557,
"ssa",
}
m["mlu"] = {
"To'abaita",
36645,
"poz-sls",
"Latn",
}
m["mlv"] = {
"Mwotlap",
2475538,
"poz-vnn",
"Latn",
}
m["mlw"] = {
"Moloko",
1965222,
"cdc-cbm",
"Latn",
}
m["mlx"] = {
"Malfaxal",
2157421,
"poz-vnc",
"Latn",
}
m["mlz"] = {
"Malaynon",
18755512,
"phi",
}
m["mma"] = {
"Mama",
3913963,
"nic-jrn",
}
m["mmb"] = {
"Momina",
6897297,
}
m["mmc"] = {
"Michoacán Mazahua",
12953705,
"oto",
"Latn",
}
m["mmd"] = {
"Maonan",
3092293,
"qfa-kms",
"Latn",
}
m["mme"] = {
"Tirax",
3276286,
"poz-vnc",
"Latn",
}
m["mmf"] = {
"Mundat",
56263,
"cdc-wst",
"Latn",
}
m["mmg"] = {
"North Ambrym",
2842468,
"poz-vnc",
"Latn",
}
m["mmh"] = {
"Mehináku",
3501838,
"awd",
"Latn",
}
m["mmi"] = {
"Hember Avu",
6940113,
"ngf-tib",
"Latn",
}
m["mmj"] = {
"Majhwar",
6737795,
}
m["mmk"] = {
"Mukha-Dora",
6933447,
}
m["mml"] = {
"Man Met",
3194984,
"mkh-pal",
}
m["mmm"] = {
"Maii",
6735599,
"poz-vnc",
"Latn",
}
m["mmn"] = {
"Mamanwa",
3206623,
"phi",
"Latn",
}
m["mmo"] = {
"Mangga Buang",
12952294,
"poz-ocw",
"Latn",
}
m["mmp"] = {
"Musan",
2605703,
"paa-amu",
"Latn",
}
m["mmq"] = {
"Aisi",
6940074,
"ngf-ais",
"Latn",
}
m["mmr"] = {
"Western Xiangxi Miao",
3307901,
"hmn",
"Latn",
}
m["mmt"] = {
"Malalamai",
3281496,
"poz-ocw",
"Latn",
}
m["mmu"] = {
"Mmaala",
13123461,
"nic-ymb",
"Latn",
}
m["mmv"] = {
"Miriti",
6873567,
"sai-tuc",
"Latn",
}
m["mmw"] = {
"Emae",
3051961,
"poz-pnp",
"Latn",
}
m["mmx"] = {
"Madak",
3275205,
"poz-ocw",
"Latn",
}
m["mmy"] = {
"Migaama",
56259,
"cdc-est",
"Latn",
}
m["mmz"] = {
"Mabaale",
11003249,
"bnt-ngn",
}
m["mna"] = {
"Mbula",
3303572,
"poz-ocw",
"Latn",
}
m["mnb"] = {
"Muna",
6935584,
"poz-mun",
"Latn",
}
m["mnc"] = {
"Manchu",
33638,
"tuw-jrc",
"mnc-Mong, Latn",
ancestors = "juc",
-- mnc-Mong translit in [[Module:scripts/data]]
}
m["mnd"] = {
"Mondé",
6898840,
"tup",
"Latn",
}
m["mne"] = {
"Naba",
760732,
"csu-bgr",
}
m["mnf"] = {
"Mundani",
35839,
"nic-mom",
"Latn",
}
m["mng"] = {
"Eastern Mnong",
12953747,
"mkh-ban",
"Latn, Khmr",
}
m["mnh"] = {
"Mono (Congo)",
33501,
"bad-cnt",
"Latn",
}
m["mni"] = {
"Manipuri",
33868,
"sit",
"Mtei, Beng",
ancestors = "omp",
translit = {Mtei = "Mtei-translit"},
}
m["mnj"] = {
"Munji",
33639,
"ira-mny",
"Arab",
}
m["mnk"] = {
"Mandinka",
33678,
"dmn-wmn",
"Latn, Arab, Nkoo",
}
m["mnl"] = {
"Tiale",
6744350,
"poz-vnn",
"Latn",
}
m["mnm"] = {
"Mapena",
11732415,
"ngf-dag",
"Latn",
}
m["mnn"] = {
"Southern Mnong",
23857582,
"mkh-ban",
}
m["mnp"] = {
"Northern Min",
36457,
"zhx-inm",
"Hants",
generate_forms = "zh-generateforms",
translit = "zh-translit",
sort_key = "Hani-sortkey",
}
m["mnq"] = {
"Minriq",
2742268,
"mkh-asl",
"Latn",
}
m["mnr"] = {
"Mono (California)",
33591,
"azc-num",
"Latn",
}
m["mnt"] = {
"Maykulan",
3915696,
"aus-pam",
"Latn",
}
m["mnu"] = {
"Mer",
6817854,
"paa-mai",
"Latn",
}
m["mnv"] = {
"Rennellese",
3397346,
"poz-pnp",
"Latn",
}
m["mnw"] = {
"Mon",
13349,
"mkh-mnc",
"Mymr",
ancestors = "mkh-mmn",
sort_key = {
from = {"ျ", "ြ", "ွ", "ှ", "ၞ", "ၟ", "ၠ", "ၚ", "ဿ"},
to = {"္ယ", "္ရ", "္ဝ", "္ဟ", "္န", "္မ", "္လ", "င", "သ္သ"}
},
}
m["mnx"] = {
"Sougb",
3507964,
"paa-ebh",
"Latn",
}
m["mny"] = {
"Manyawa",
11002622,
"bnt-mak",
ancestors = "vmw",
}
m["mnz"] = {
"Moni",
6899857,
"ngf-pan",
"Latn",
}
m["moa"] = {
"Mwan",
3320111,
"dmn-nbe",
"Latn",
}
m["moc"] = {
"Mocoví",
3027906,
"sai-guc",
"Latn",
}
m["mod"] = {
"Mobilian",
13333,
"crp",
"Latn",
ancestors = "cho, cic",
}
m["moe"] = {
"Montagnais",
13351,
"alg",
"Latn",
ancestors = "cr",
strip_diacritics = {remove_diacritics = c.macron},
}
m["mog"] = {
"Mongondow",
3058458,
"phi",
"Latn",
}
m["moh"] = {
"Mohawk",
13339,
"iro-nor",
"Latn",
ancestors = "iro-omo",
}
m["moi"] = {
"Mboi",
3914417,
"alv-yun",
}
m["moj"] = {
"Monzombo",
11154772,
"nic-nkk",
"Latn",
}
m["mok"] = {
"Morori",
6913275,
}
m["mom"] = {
"Monimbo",
56542,
}
m["moo"] = {
"Monom",
6901726,
"mkh-ban",
}
m["mop"] = {
"Mopan Maya",
36183,
"myn",
"Latn",
}
m["moq"] = {
"Mor (Papuan)",
11732468,
"qfa-dis", -- Papuan; isolate in Glottolog and Palmer (2018); top-level TNG in Ross (2005), in Berau Gulf (under
-- TNG) in Usher (2020)
}
m["mor"] = {
"Moro",
36172,
"alv-hei",
"Latn",
}
m["mos"] = {
"Moore",
36096,
"nic-mre",
"Latn",
}
m["mot"] = {
"Barí",
2886281,
"cba",
"Latn",
}
m["mou"] = {
"Mogum",
3440473,
"cdc-est",
"Latn",
}
m["mov"] = {
"Mojave",
56510,
"nai-yuc",
"Latn",
}
m["mow"] = {
"Moi (Congo)",
11124792,
"bnt-bmo",
"Latn",
}
m["mox"] = {
"Molima",
3319495,
"poz-ocw",
"Latn",
}
m["moy"] = {
"Shekkacho",
56827,
"omv-gon",
}
m["moz"] = {
"Mukulu",
3440403,
"cdc-est",
}
m["mpa"] = {
"Mpoto",
6928303,
"bnt-mbi",
"Latn",
}
m["mpb"] = {
"Mullukmulluk",
6741120,
}
m["mpc"] = {
"Mangarayi",
6748829,
}
m["mpd"] = {
"Machinere",
12953681,
"awd",
"Latn",
}
m["mpe"] = {
"Majang",
56724,
"sdv",
}
m["mpg"] = {
"Marba",
56614,
"cdc-mas",
}
m["mph"] = {
"Maung",
6792550,
"aus-wdj",
"Latn",
}
m["mpi"] = {
"Mpade",
3280670,
"cdc-cbm",
"Latn",
}
m["mpj"] = {
"Martu Wangka",
3295916,
"aus-pam",
"Latn",
}
m["mpk"] = {
"Mbara (Chad)",
3912770,
"cdc-cbm",
}
m["mpl"] = {
"Middle Watut",
15887910,
"poz-ocw",
"Latn",
}
m["mpm"] = {
"Yosondúa Mixtec",
12953741,
"omq-mxt",
"Latn",
}
m["mpn"] = {
"Mindiri",
6863842,
"poz-ocw",
"Latn",
}
m["mpo"] = {
"Miu",
6883668,
"poz-ocw",
"Latn",
}
m["mpp"] = {
"Migabac",
11732448,
"ngf-sop",
"Latn",
}
m["mpq"] = {
"Matís",
3299145,
"sai-pan",
"Latn",
}
m["mpr"] = {
"Vangunu",
3554582,
"poz-ocw",
"Latn",
}
m["mps"] = {
"Dadibi",
5208077,
"paa-teb",
"Latn",
}
m["mpt"] = {
"Mian",
12952846,
"ngf-msu",
"Latn",
}
m["mpu"] = {
"Makuráp",
3281037,
"tup",
"Latn",
}
m["mpv"] = {
"Mungkip",
11732485,
"ngf-boa",
"Latn",
}
m["mpw"] = {
"Mapidian",
6753812,
"awd",
"Latn",
}
m["mpx"] = {
"Misima-Paneati",
6875666,
"poz-ocw",
"Latn",
}
m["mpy"] = {
"Mapia",
3287224,
"poz-mic",
"Latn",
}
m["mpz"] = {
"Mpi",
6928276,
"tbq-bka",
}
m["mqa"] = {
"Maba",
3273750,
}
m["mqb"] = {
"Mbuko",
3502213,
"cdc-cbm",
"Latn",
}
m["mqc"] = {
"Mangole",
6749097,
"poz-cma",
"Latn",
}
m["mqe"] = {
"Matepi",
11732426,
"ngf-han",
"Latn",
}
m["mqf"] = {
"Momuna",
6897518,
}
m["mqg"] = {
"Kota Bangun Kutai Malay",
12952778,
}
m["mqh"] = {
"Tlazoyaltepec Mixtec",
12953740,
"omq-mxt",
"Latn",
}
m["mqi"] = {
"Mariri",
6765544,
}
m["mqj"] = {
"Mamasa",
6745452,
"poz-ssw",
"Latn",
}
m["mqk"] = {
"Rajah Kabunsuwan Manobo",
12953700,
"mno",
}
m["mql"] = {
"Mbelime",
4286473,
"nic-eov",
"Latn",
}
m["mqm"] = {
"South Marquesan",
19694214,
"poz-pep",
"Latn",
}
m["mqn"] = {
"Moronene",
642581,
"poz-btk",
"Latn",
}
m["mqo"] = {
"Modole",
11732457,
"paa-gto",
"Latn",
}
m["mqp"] = {
"Manipa",
6749799,
"poz-cma",
"Latn",
}
m["mqq"] = {
"Minokok",
18642293,
"poz-san",
"Latn",
}
m["mqr"] = {
"Mander",
6747979,
"paa-tor",
"Latn",
}
m["mqs"] = {
"West Makian",
3033575,
"paa-nha",
"Latn",
}
m["mqt"] = {
"Mok",
13018559,
"mkh-pal",
}
m["mqu"] = {
"Mandari",
3285426,
"sdv-bri",
}
m["mqv"] = {
"Mosimo",
11732478,
"ngf-nwh",
"Latn",
}
m["mqw"] = {
"Murupi",
11732486,
"ngf-nwh",
"Latn",
}
m["mqx"] = {
"Mamuju",
6746004,
"poz-ssw",
"Latn",
}
m["mqy"] = {
"Manggarai",
3285748,
"poz-cet",
"Latn",
}
m["mqz"] = {
"Malasanga",
14916889,
"poz-ocw",
"Latn",
}
m["mra"] = {
"Mlabri",
3073465,
"mkh",
}
m["mrb"] = {
"Sungwadia",
3293299,
"poz-vnn",
"Latn",
}
m["mrc"] = {
"Maricopa",
56386,
"nai-yuc",
"Latn",
}
m["mrd"] = {
"Western Magar",
22303263,
"sit-gma",
"Deva",
}
m["mre"] = {
"Martha's Vineyard Sign Language",
33494,
"sgn",
"Latn, Sgnw",
}
m["mrf"] = {
"Elseng",
3915667,
"qfa-unc", -- "Border or language isolate"; unclassifiable due to paucity of data
"Latn",
}
m["mrg"] = {
"Mising",
3316328,
"sit-tan",
"Latn, Beng, Deva",
ancestors = "adi",
}
m["mrh"] = {
"Mara Chin",
4175893,
"tbq-kuk",
"Latn",
}
m["mrj"] = {
"Western Mari",
1776032,
"chm",
"Cyrl",
translit = "chm-translit",
sort_key = "mrj-sortkey",
}
m["mrk"] = {
"Hmwaveke",
5873712,
"poz-cln",
"Latn",
}
m["mrl"] = {
"Mortlockese",
3324598,
"poz-mic",
"Latn",
}
m["mrm"] = {
"Mwerlap",
3331115,
"poz-vnn",
"Latn",
}
m["mrn"] = {
"Cheke Holo",
2962165,
"poz-ocw",
"Latn",
}
m["mro"] = {
"Mru",
1951521,
"sit-mru",
"Latn, Mroo",
}
m["mrp"] = {
"Morouas",
6913299,
"poz-vnn",
"Latn",
}
m["mrq"] = {
"North Marquesan",
2603808,
"poz-pep",
"Latn",
}
m["mrr"] = {
"Hill Maria",
27602,
"dra-mdy",
"Deva",
}
m["mrs"] = {
"Maragus",
6754640,
"poz-vnc",
"Latn",
}
m["mrt"] = {
"Margi",
56241,
"cdc-cbm",
"Latn",
}
m["mru"] = {
"Mono (Cameroon)",
11031964,
"alv-mbm",
"Latn",
}
m["mrv"] = {
"Mangarevan",
36237,
"poz-pep",
"Latn",
}
m["mrw"] = {
"Maranao",
33800,
"phi",
"Latn, Arab",
}
m["mrx"] = {
"Dineor",
5278044,
"paa-tor",
"Latn",
}
m["mry"] = {
"Karaga Mandaya",
6747925,
"phi",
}
m["mrz"] = {
"Marind",
6763970,
"paa-mri",
"Latn",
}
m["msb"] = {
"Masbatenyo",
33948,
"phi",
"Latn",
}
m["msc"] = {
"Sankaran Maninka",
11155812,
"dmn-mnk",
}
m["msd"] = {
"Yucatec Maya Sign Language",
34281,
"sgn",
"Latn", -- when documented
}
m["mse"] = {
"Musey",
56328,
"cdc-mas",
}
m["msf"] = {
"Mekwei",
4544752,
"paa-nim",
"Latn",
}
m["msg"] = {
"Moraid",
6909020,
"paa-wbh",
"Latn",
}
m["msi"] = {
"Sabah Malay",
10867404,
"crp",
"Latn, Arab",
}
m["msj"] = {
"Ma",
6720909,
"nic-mbc",
"Latn",
}
m["msk"] = {
"Mansaka",
12952800,
"phi",
"Latn",
}
m["msl"] = {
"Molof",
4300950,
}
m["msm"] = {
"Agusan Manobo",
12953696,
"mno",
"Latn",
}
m["msn"] = {
"Vurës",
3563857,
"poz-vnn",
"Latn",
}
m["mso"] = {
"Mombum",
6897079,
"ngf-mom",
"Latn",
}
m["msp"] = {
"Maritsauá",
6765915,
"tup",
"Latn",
}
m["msq"] = {
"Caac",
2932212,
"poz-cln",
"Latn",
}
m["msr"] = {
"Mongolian Sign Language",
3915499,
"sgn",
}
m["mss"] = {
"West Masela",
12952816,
"poz-tim",
}
m["msu"] = {
"Musom",
6943041,
"poz-ocw",
"Latn",
}
m["msv"] = {
"Maslam",
3502273,
}
m["msw"] = {
"Mansoanka",
35814,
}
m["msx"] = {
"Moresada",
11732475,
"ngf-pom",
"Latn",
}
m["msy"] = {
"Aruamu",
3501809,
"paa-rub",
"Latn",
}
m["msz"] = {
"Momare",
6897030,
"ngf-sop",
"Latn",
}
m["mta"] = {
"Cotabato Manobo",
12953698,
"mno",
"Latn",
}
m["mtb"] = {
"Anyin Morofo",
3502338,
"alv-ctn",
"Latn",
ancestors = "any",
}
m["mtc"] = {
"Munit",
11732482,
"ngf-kok",
"Latn",
}
m["mtd"] = {
"Mualang",
3073458,
"poz-mly",
"Latn",
}
m["mte"] = {
"Alu",
33503,
"poz-ocw",
"Latn",
}
m["mtf"] = {
"Murik (New Guinea)",
7050035,
"paa-lse",
"Latn",
}
m["mtg"] = {
"Una",
5580728,
"ngf-mek",
"Latn",
}
m["mth"] = {
"Munggui",
6936018,
"poz-hce",
"Latn",
}
m["mti"] = {
"Maiwa (New Guinea)",
6737223,
"ngf-dag",
"Latn",
}
m["mtj"] = {
"Moskona",
11288953,
"paa-ebh",
"Latn",
}
m["mtk"] = {
"Mbe'",
10964025,
"nic-nka",
"Latn",
}
m["mtl"] = {
"Montol",
3440457,
"cdc-wst",
"Latn",
}
m["mtm"] = {
"Mator",
20669419,
"syd",
"Cyrl",
}
m["mtn"] = {
"Matagalpa",
3490756,
"nai-min",
}
m["mto"] = {
"Totontepec Mixe",
7828400,
"nai-miz",
"Latn",
}
m["mtp"] = {
"Wichí Lhamtés Nocten",
5908756,
"sai-wic",
"Latn",
}
m["mtq"] = {
"Muong",
3236789,
"mkh-vie",
"Latn",
sort_key = "vi-sortkey",
}
m["mtr"] = {
"Mewari",
2992857,
"raj",
"Deva",
translit = "hi-translit", -- for now
}
m["mts"] = {
"Yora",
3572572,
"sai-pan",
"Latn",
}
m["mtt"] = {
"Mota",
3325052,
"poz-vnn",
"Latn",
}
m["mtu"] = {
"Tututepec Mixtec",
7857069,
"omq-mxt",
"Latn",
}
m["mtv"] = {
"Asaro'o",
3503684,
"ngf-war", -- ngf-moa if we split out Molet from Asaro'o
"Latn",
}
m["mtw"] = {
"Magahat",
6729600,
"phi",
}
m["mtx"] = {
"Tidaá Mixtec",
7800805,
"omq-mxt",
"Latn",
}
m["mty"] = {
"Nabi",
6956858,
"paa-wpa",
"Latn",
}
m["mua"] = {
"Mundang",
36032,
"alv-mbm",
}
m["mub"] = {
"Mubi",
3440518,
"cdc-est",
"Latn",
}
m["muc"] = {
"Mbu'",
35868,
"nic-beb",
"Latn",
}
m["mud"] = {
"Mednyj Aleut",
1977419,
"qfa-mix",
ancestors = "ale, ru"
}
m["mue"] = {
"Media Lengua",
36066,
"qfa-mix",
"Latn",
ancestors = "es, qu",
}
m["mug"] = {
"Musgu",
3123545,
"cdc-cbm",
"Latn",
}
m["muh"] = {
"Mündü",
35981,
"nic-nke",
"Latn",
}
m["mui"] = {
"Musi",
615660,
"poz-mly",
"Latn",
}
m["muj"] = {
"Mabire",
3440437,
}
m["mul"] = {
"Translingual",
7834564,
"qfa-not",
"All",
-- NOTE: The following sort keys are used in process_page() in [[Module:headword/page]], which generates
-- the default sort key for the page (corresponding to {{DEFAULTSORT:...}}) by generating a sort key for
-- the pagename using `makeSortKey()` called on language object "mul". Currently this just handles
-- Japanese sort keys.
--
-- FIXME: This should be smarter and use the language of the page if there's only one.
sort_key = {
Hani = "Hani-sortkey",
Jpan = "Jpan-sortkey",
Hrkt = "Hira-sortkey", -- Sort all kana as Hira.
Hira = "Hira-sortkey",
Kana = "Hira-sortkey",
},
standard_chars = "AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz" .. c.punc,
}
m["mum"] = {
"Maiwala",
12952764,
"poz-ocw",
"Latn",
}
m["muo"] = {
"Nyong",
36373,
"alv-lek",
}
m["mup"] = {
"Malvi",
33413,
"raj",
"Deva",
translit = "hi-translit"
}
m["muq"] = {
"Eastern Xiangxi Miao",
27431376,
"hmn",
}
m["mur"] = {
"Murle",
56727,
"sdv",
}
m["mus"] = {
"Creek",
523014,
"nai-mus",
"Latn",
}
m["mut"] = {
"Western Muria",
12952886,
"dra-mur",
}
m["muu"] = {
"Yaaku",
34222,
"cus-eas",
}
m["muv"] = {
"Muthuvan",
3327420,
"dra-tam",
}
m["mux"] = {
"Bo-Ung",
15831607,
"ngf-hag",
"Latn",
}
m["muy"] = {
"Muyang",
3502301,
"cdc-cbm",
"Latn",
}
m["muz"] = {
"Mursi",
36013,
"sdv",
}
m["mva"] = {
"Manam",
6746851,
"poz-ocw",
"Latn",
}
m["mvb"] = {
"Mattole",
20824,
"ath-pco",
"Latn",
}
m["mvd"] = {
"Mamboru",
578815,
"poz",
"Latn",
}
m["mvg"] = {
"Yucuañe Mixtec",
25562736,
"omq-mxt",
"Latn",
}
m["mvh"] = {
"Mire",
3441359,
}
m["mvi"] = {
"Miyako",
36218,
"jpx-sry",
"Jpan",
translit = s["jpx-translit"],
display_text = s["jpx-displaytext"],
strip_diacritics = s["jpx-stripdiacritics"],
sort_key = s["jpx-sortkey"],
}
m["mvk"] = {
"Mekmek",
6810592,
"paa-yua",
"Latn",
}
m["mvl"] = {
"Mbara (Australia)",
6799620,
"aus-pam",
"Latn",
}
m["mvm"] = {
"Muya",
2422759,
"sit-qia",
}
m["mvn"] = {
"Minaveha",
6863278,
"poz-ocw",
"Latn",
}
m["mvo"] = {
"Marovo",
3294683,
"poz-ocw",
"Latn",
}
m["mvp"] = {
"Duri",
3915414,
"poz-ssw",
"Latn",
}
m["mvq"] = {
"Moere",
11732458,
"ngf-kum",
"Latn",
}
m["mvr"] = {
"Marau",
6755069,
"poz-hce",
"Latn",
}
m["mvs"] = {
"Massep",
3502895,
"qfa-dis", -- poorly documented (but in vigorous use); isolate per Ethnologue, Glottolog, and Foley (2018); Greater
-- Kwerba per Usher
"Latn",
}
m["mvt"] = {
"Mpotovoro",
6928305,
"poz-vnc",
"Latn",
}
m["mvu"] = {
"Marfa",
713633,
}
m["mvv"] = {
"Tagal Murut",
7675300,
"poz-san",
"Latn",
}
m["mvw"] = {
"Machinga",
12952754,
"bnt-rvm",
}
m["mvx"] = {
"Meoswar",
6817777,
"poz-hce",
"Latn",
}
m["mvy"] = {
"Indus Kohistani",
33399,
"inc-koh",
"Arab",
}
m["mvz"] = {
"Mesqan",
6821677,
"sem-eth",
}
m["mwa"] = {
"Mwatebu",
14916896,
"poz-ocw",
"Latn",
}
m["mwb"] = {
"Juwal",
6319103,
"paa-mmu",
"Latn",
}
m["mwc"] = {
"Are",
29277,
"poz-ocw",
"Latn",
}
m["mwe"] = {
"Mwera",
6944725,
"bnt-rvm",
"Latn",
}
m["mwf"] = {
"Murrinh-Patha",
2980398,
"aus-dal",
"Latn",
}
m["mwg"] = {
"Aiklep",
3399652,
"poz-ocw",
"Latn",
}
m["mwh"] = {
"Mouk-Aria",
3325498,
"poz-ocw",
"Latn",
}
m["mwi"] = {
"Labo",
2157452,
"poz-vnc",
"Latn",
}
m["mwk"] = {
"Kita Maninkakan",
3015523,
"dmn-wmn",
}
m["mwl"] = {
"Mirandese",
13330,
"roa-asl",
"Latn",
}
m["mwm"] = {
"Sar",
56850,
"csu-sar",
"Latn",
}
m["mwn"] = {
"Nyamwanga",
6944666,
"bnt-mwi",
"Latn",
}
m["mwo"] = {
"Sungwadaga",
3276435,
"poz-vnn",
"Latn",
}
m["mwp"] = {
"Kala Lagaw Ya",
2591262,
"aus-pam",
"Latn",
}
m["mwq"] = {
"Mün Chin",
331340,
"tbq-kuk",
}
m["mwr"] = {
"Marwari",
56312,
"raj",
"Deva, Mahj",
translit = {
Deva = "hi-translit", -- for now
Mahj = "Mahj-translit",
},
}
m["mws"] = {
"Mwimbi-Muthambi",
15632357,
"bnt-kka",
"Latn",
}
m["mwt"] = {
"Moken",
18648701,
"poz",
}
m["mwu"] = {
"Mittu",
6883573,
"csu-bbk",
"Latn",
}
m["mwv"] = {
"Mentawai",
13365,
"poz-nws",
"Latn",
}
m["mww"] = {
"White Hmong",
3138829,
"hmn",
"Latn, Hmng, Hmnp",
}
m["mwz"] = {
"Moingi",
11011905,
}
m["mxa"] = {
"Northwest Oaxaca Mixtec",
12953739,
"omq-mxt",
"Latn",
}
m["mxb"] = {
"Tezoatlán Mixtec",
3317286,
"omq-mxt",
"Latn",
}
m["mxd"] = {
"Modang",
6888037,
"poz",
"Latn",
}
m["mxe"] = {
"Mele-Fila",
3305008,
"poz-pnp",
"Latn",
}
m["mxf"] = {
"Malgbe",
3502224,
}
m["mxg"] = {
"Mbangala",
6799612,
"bnt-yak",
}
m["mxh"] = {
"Mvuba",
6944591,
"csu-mle",
"Latn",
}
m["mxi"] = {
"Mozarabic",
317044,
"roa-ibe",
"Arab, Hebr, Latn",
translit = "mxi-translit",
strip_diacritics = {
Arab = "ar-stripdiacritics",
},
-- Hebr display_text, strip_diacritics, sort_key in [[Module:scripts/data]]
}
m["mxj"] = {
"Miju",
56332,
"sit-mdz",
"Latn, Deva",
}
m["mxk"] = {
"Monumbo",
6906792,
"paa-mon",
"Latn",
}
m["mxl"] = {
"Maxi Gbe",
35770,
"alv-gbe",
}
m["mxm"] = {
"Meramera",
6817936,
"poz-ocw",
"Latn",
}
m["mxn"] = {
"Moi (Indonesia)",
11732459,
"paa-wbh",
"Latn",
}
m["mxo"] = {
"Mbowe",
10962309,
"bnt-kav",
}
m["mxp"] = {
"Tlahuitoltepec Mixe",
7810697,
}
m["mxq"] = {
"Juquila Mixe",
25559721,
}
m["mxr"] = {
"Murik (Malaysia)",
3328150,
nil,
"Latn",
}
m["mxs"] = {
"Huitepec Mixtec",
12953729,
"omq-mxt",
"Latn",
}
m["mxt"] = {
"Jamiltepec Mixtec",
12953730,
"omq-mxt",
"Latn",
}
m["mxu"] = {
"Mada (Cameroon)",
3441206,
"cdc-cbm",
"Latn",
}
m["mxv"] = {
"Metlatónoc Mixtec",
36363,
"omq-mxt",
"Latn",
}
m["mxw"] = {
"Namo",
12952923,
"paa-nam",
"Latn",
}
m["mxx"] = {
"Mahou",
11004334,
"dmn-mnk",
"Latn, Nkoo",
}
m["mxy"] = {
"Southeastern Nochixtlán Mixtec",
7070684,
"omq-mxt",
"Latn",
}
m["mxz"] = {
"Central Masela",
42575433,
"poz-tim",
"Latn",
}
m["myb"] = {
"Mbay",
3033565,
"csu-sar",
"Latn",
}
m["myc"] = {
"Mayeka",
11129517,
"bnt-boa",
}
m["mye"] = {
"Myene",
35832,
"bnt-tso",
"Latn",
}
m["myf"] = {
"Bambassi",
56540,
"omv-mao",
"Latn",
}
m["myg"] = {
"Manta",
35799,
"nic-mom",
"Latn",
}
m["myh"] = {
"Makah",
3280640,
"wak",
"Latn",
}
m["myj"] = {
"Mangayat",
35988,
"nic-ser",
}
m["myk"] = {
"Mamara",
36187,
"alv-sma",
"Latn",
}
m["myl"] = {
"Moma",
6897018,
"poz",
"Latn",
}
m["mym"] = {
"Me'en",
3408516,
"sdv",
}
m["myo"] = {
"Anfillo",
34928,
"omv-gon",
}
m["myp"] = {
"Pirahã",
33825,
"sai-mur",
"Latn",
}
m["myr"] = {
"Muniche",
3915654,
}
m["mys"] = {
"Mesmes",
3508617,
"sem-eth",
}
m["myu"] = {
"Mundurukú",
746723,
"tup",
"Latn",
}
m["myv"] = {
"Erzya",
29952,
"urj-mdv",
"Cyrl",
translit = "myv-translit",
override_translit = true,
}
m["myw"] = {
"Muyuw",
3502878,
"poz-ocw",
"Latn",
}
m["myx"] = {
"Masaba",
12952814,
"bnt-msl",
"Latn",
}
m["myy"] = {
"Macuna",
3275059,
"sai-tuc",
"Latn",
}
m["myz"] = {
"Classical Mandaic",
25559314,
"sem-ase",
"Mand",
translit = {
Mand = "Mand-translit",
},
strip_diacritics = {
Mand = "Mand-stripdiacritics",
}
}
m["mza"] = {
"Santa María Zacatepec Mixtec",
8063756,
"omq-mxt",
"Latn",
}
m["mzb"] = {
"Northern Saharan Berber",
11156769,
"ber",
"Arab, Latn, Tfng",
}
m["mzc"] = {
"Madagascar Sign Language",
12715020,
"sgn",
}
m["mzd"] = {
"Malimba",
35806,
"bnt-saw",
}
m["mze"] = {
"Morawa",
6909384,
"paa-mal",
"Latn",
}
m["mzg"] = {
"Monastic Sign Language",
3217333,
"sgn",
}
m["mzh"] = {
"Wichí Lhamtés Güisnay",
7998197,
"sai-wic",
"Latn",
}
m["mzi"] = {
"Ixcatlán Mazatec",
6101049,
"omq-maz",
"Latn",
}
m["mzj"] = {
"Manya",
11006832,
"dmn-mnk",
}
m["mzk"] = {
"Nigeria Mambila",
11004163,
"nic-mmb",
"Latn",
}
m["mzl"] = {
"Mazatlán Mixe",
25559728,
}
m["mzm"] = {
"Mumuye",
36021,
"alv-mum",
"Latn",
}
m["mzn"] = {
"Mazanderani",
13356,
"ira-msh",
"mzn-Arab",
}
m["mzo"] = {
"Matipuhy",
6787588,
"sai-kui",
"Latn",
}
m["mzp"] = {
"Movima",
1659701,
"qfa-iso",
"Latn",
}
m["mzq"] = {
"Mori Atas",
3324070,
"poz-btk",
"Latn",
}
m["mzr"] = {
"Marúbo",
3296011,
"sai-pan",
"Latn",
}
m["mzs"] = {
"Macanese",
35785,
"crp",
"Latn",
ancestors = "pt",
sort_key = {Latn = {remove_diacritics = c.grave .. c.acute .. c.circ .. c.tilde .. c.diaer .. c.cedilla}},
}
m["mzt"] = {
"Mintil",
6869641,
"mkh-asl",
}
m["mzu"] = {
"Inapang",
6013569,
"paa-tam",
"Latn",
}
m["mzv"] = {
"Manza",
36038,
"gba-eas",
}
m["mzw"] = {
"Deg",
35183,
"nic-gnw",
"Latn",
}
m["mzx"] = {
"Mawayana",
6794377,
"awd",
}
m["mzy"] = {
"Mozambican Sign Language",
6927809,
"sgn",
}
m["mzz"] = {
"Maiadomu",
6735234,
"poz-ocw",
"Latn",
}
return require("Module:languages").finalizeData(m, "language")
pz15eb7017x1b323qrdyp4glpwckqz2
Module:scripts/charToScript
828
6011
17451
2026-07-13T08:52:37Z
Hiyuune
6766
+
17451
Scribunto
text/plain
local subexport = {}
local require_when_needed = require("Module:require when needed")
local cp = require_when_needed("Module:string utilities", "codepoint")
local floor = math.floor
local get_plaintext = require_when_needed("Module:utilities", "get_plaintext")
local get_script = require_when_needed("Module:scripts", "getByCode")
local insert = table.insert
local ipairs = ipairs
local min = math.min
local pairs = pairs
local setmetatable = setmetatable
local sort = table.sort
local split = require_when_needed("Module:string utilities", "split")
local table_len = require_when_needed("Module:table", "length")
local type = type
-- Copied from [[Module:Unicode data]].
local function binaryRangeSearch(codepoint, ranges)
local low, mid, high
low, high = 1, ranges.length or table_len(ranges)
while low <= high do
mid = floor((low + high) / 2)
local range = ranges[mid]
if codepoint < range[1] then
high = mid - 1
elseif codepoint <= range[2] then
return range, mid
else
low = mid + 1
end
end
return nil, mid
end
-- Copied from [[Module:Unicode data]].
local function linearRangeSearch(codepoint, ranges)
for i, range in ipairs(ranges) do
if codepoint < range[1] then
break
elseif codepoint <= range[2] then
return range
end
end
end
local function compareRanges(range1, range2)
return range1[1] < range2[1]
end
-- Save previously used codepoint ranges in case another character is in the
-- same range.
local rangesCache = {}
--[=[
Takes a codepoint or a character and finds the script code(s) (if any) that are appropriate for it based on the codepoint, using the data module [[Module:scripts/recognition data]]. The data module was generated from the patterns in [[Module:scripts/data]] using [[Module:User:Erutuon/script recognition]].
By default, it returns only the first script code if there are multiple matches (i.e. the code we take to be the default). If `all_scripts` is set, then a table of all matching codes is returned.
]=]
local charToScriptData
function subexport.charToScript(char, all_scripts)
charToScriptData = charToScriptData or mw.loadData("Module:scripts/recognition data")
local t = type(char)
local codepoint
if t == "string" then
local etc
codepoint, etc = cp(char, 1, 2)
if etc then
error("bad argument #1 to 'charToScript' (expected a single character)")
end
elseif t == "number" then
codepoint = char
else
error(("bad argument #1 to 'charToScript' (expected string or a number, got %s)")
:format(t))
end
local ret = {}
local individualMatch = charToScriptData.individual[codepoint]
if individualMatch then
ret = split(individualMatch, "%s*,%s*", true)
else
local range
if rangesCache[1] then
range = linearRangeSearch(codepoint, rangesCache)
if range then
for i, script in ipairs(range) do
if i > 2 then
insert(ret, script)
if not all_scripts then
break
end
end
end
end
end
if not ret[1] then
local index = floor(codepoint / 0x1000)
range = linearRangeSearch(index, charToScriptData.blocks)
if not range and charToScriptData[index] then
range = binaryRangeSearch(codepoint, charToScriptData[index])
if range then
insert(rangesCache, range)
sort(rangesCache, compareRanges)
end
end
if range then
for i, script in ipairs(range) do
if i > 2 then
insert(ret, script)
if not all_scripts then
break
end
end
end
end
end
end
if not ret[1] then
insert(ret, "None")
end
if all_scripts then
return ret
else
return ret[1]
end
end
--[=[
Finds the best script for a string in a language-agnostic way.
Converts each character to a codepoint. Iterates the counter for the script code if the codepoint is in the list
of individual characters, or if it is in one of the defined ranges in the 4096-character block that it belongs to.
Each script has a two-part counter, for primary and secondary matches. Primary matches are when the script is the
first one listed; otherwise, it's a secondary match. When comparing scripts, first the total of both are compared
(i.e. the overall number of matches). If these are the same, the number of primary and then secondary matches are
used as tiebreakers. For example, this is used to ensure that `Grek` takes priority over `Polyt` if no characters
which exclusively match `Polyt` are found, as `Grek` is a subset of `Polyt`.
If `none_is_last_resort_only` is specified, this will never return None if any characters in `text` belong to a
script. Otherwise, it will return None if there are more characters that don't belong to a script than belong to
any individual script. (FIXME: This behavior is probably wrong, and `none_is_last_resort_only` should probably
become the default.)
]=]
function subexport.findBestScriptWithoutLang(text, none_is_last_resort_only)
-- `scripts` contains counters for any scripts detected so far. Jpan and Kore are handled as special-cases, as they are combinations of other scripts.
local scripts_mt = {Jpan = true, Kore = true}
local weights_mt = {
__lt = function(a, b)
if a[1] + a[2] ~= b[1] + b[2] then
return a[1] + a[2] < b[1] + b[2]
elseif a[1] ~= b[1] then
return a[1] < b[1]
elseif a[2] ~= b[2] then
return a[2] < b[2]
else
return false
end
end
}
scripts_mt.__index = function(t, k)
local ret = {}
if k == "Jpan" and scripts_mt.Jpan then
for i = 1, 2 do
ret[i] = t["Hani"][i] + t["Hira"][i] + t["Kana"][i]
end
elseif k == "Kore" and scripts_mt.Kore then
for i = 1, 2 do
ret[i] = t["Hani"][i] + t["Hang"][i]
end
else
for i = 1, 2 do
insert(ret, 0)
end
end
return setmetatable(ret, weights_mt)
end
local scripts = setmetatable({}, scripts_mt)
text = get_plaintext(text)
local combined_scripts = {
Jpan = {["Hani"] = true, ["Hira"] = true, ["Kana"] = true},
Kore = {["Hani"] = true, ["Hang"] = true}
}
for character in text:gmatch(".[\128-\191]*") do
for i, script in ipairs(subexport.charToScript(character, true)) do
if not none_is_last_resort_only or script ~= "None" then
scripts[script] = scripts[script]
local weight = min(i, 2)
scripts[script][weight] = scripts[script][weight] + 1
end
end
end
-- Check the combined script counts. If a single constituent has the same count (i.e. it's the only one), discard the combined script.
for combined_script, set in pairs(combined_scripts) do
for script in pairs(set) do
scripts[combined_script] = scripts[combined_script]
if (scripts[script][1] + scripts[script][2]) == (scripts[combined_script][1] + scripts[combined_script][2]) then
scripts[combined_script] = nil
break
end
end
end
local bestScript
local greatestCount
for script, count in pairs(scripts) do
if (not greatestCount) or greatestCount < count then
bestScript = script
greatestCount = count
end
end
bestScript = bestScript or "None"
return get_script(bestScript)
end
return subexport
cs19bg8d41yuv7ovit6o3v0kd4ou9kq
Module:scripts/recognition data
828
6012
17452
2026-07-13T08:52:58Z
Hiyuune
6766
+
17452
Scribunto
text/plain
local data = {
[0x00] = {
{ 0x00041, 0x0005A, "Latn"},
{ 0x00061, 0x0007A, "Latn"},
{ 0x000C0, 0x000D6, "Latn"},
{ 0x000D8, 0x000F6, "Latn"},
{ 0x000F8, 0x0024F, "Latn"},
{ 0x00370, 0x003E1, "Grek", "Polyt" },
{ 0x003E2, 0x003EF, "Copt" },
{ 0x003F0, 0x003FF, "Grek", "Polyt" },
{ 0x00400, 0x0045F, "Cyrl" },
{ 0x00460, 0x00469, "Cyrs" },
{ 0x0046A, 0x0046D, "Cyrl" },
{ 0x0046E, 0x00471, "Cyrs" },
{ 0x00472, 0x00475, "Cyrl" },
{ 0x00476, 0x00489, "Cyrs" },
{ 0x0048A, 0x00527, "Cyrl" },
{ 0x00531, 0x0058F, "Armn" },
{ 0x00590, 0x005FF, "Hebr" },
{ 0x00600, 0x006FF, "Arab" },
{ 0x00700, 0x0074F, "Syrc" },
{ 0x00750, 0x0077F, "Arab" },
{ 0x00780, 0x007B1, "Thaa" },
{ 0x007C0, 0x007FF, "Nkoo" },
{ 0x00800, 0x0083E, "Samr" },
{ 0x00840, 0x0085E, "Mand" },
{ 0x00860, 0x0086A, "Syrc" },
{ 0x008A0, 0x008FF, "Arab" },
{ 0x00900, 0x0097F, "Deva" },
{ 0x00980, 0x00983, "Beng" },
{ 0x00985, 0x0098C, "Beng" },
{ 0x00993, 0x009A8, "Beng" },
{ 0x009AA, 0x009B0, "Beng" },
{ 0x009B6, 0x009B9, "Beng" },
{ 0x009BC, 0x009C4, "Beng" },
{ 0x009CB, 0x009CE, "Beng" },
{ 0x009E0, 0x009E3, "Beng" },
{ 0x009E6, 0x009EF, "Beng" },
{ 0x009F0, 0x009F1, "as-Beng" },
{ 0x00A01, 0x00A76, "Guru" },
{ 0x00A81, 0x00AF1, "Gujr" },
{ 0x00B01, 0x00B77, "Orya" },
{ 0x00B82, 0x00BFA, "Taml" },
{ 0x00C00, 0x00C7F, "Telu" },
{ 0x00C80, 0x00CF2, "Knda" },
{ 0x00D02, 0x00D7F, "Mlym" },
{ 0x00D82, 0x00DF4, "Sinh" },
{ 0x00E01, 0x00E5B, "Thai" },
{ 0x00E81, 0x00EDF, "Laoo" },
{ 0x00F00, 0x00FDA, "Tibt" },
},
[0x01] = {
{ 0x01000, 0x0109F, "Mymr" },
{ 0x010A0, 0x010CD, "Geok" },
{ 0x010D0, 0x010FF, "Geor" },
{ 0x01100, 0x011FF, "Hang" },
{ 0x01200, 0x01399, "Ethi" },
{ 0x013A0, 0x013F4, "Cher" },
{ 0x01400, 0x0167F, "Cans" },
{ 0x01680, 0x0169C, "Ogam" },
{ 0x016A0, 0x016F0, "Runr" },
{ 0x01700, 0x01714, "Tglg" },
{ 0x01720, 0x01734, "Hano" },
{ 0x01740, 0x01753, "Buhd" },
{ 0x01760, 0x01773, "Tagb" },
{ 0x01780, 0x017F9, "Khmr" },
{ 0x01800, 0x018AA, "Mong" },
{ 0x01900, 0x0194F, "Limb" },
{ 0x01950, 0x01974, "Tale" },
{ 0x01980, 0x019DF, "Talu" },
{ 0x019E0, 0x019FF, "Khmr" },
{ 0x01A00, 0x01A1F, "Bugi" },
{ 0x01A20, 0x01AAD, "Lana" },
{ 0x01B00, 0x01B7C, "Bali" },
{ 0x01B80, 0x01BBF, "Sund" },
{ 0x01BC0, 0x01BFF, "Batk" },
{ 0x01C00, 0x01C4F, "Lepc" },
{ 0x01C50, 0x01C7F, "Olck" },
{ 0x01C90, 0x01CBF, "Geor" },
{ 0x01E00, 0x01EFF, "Latn" },
{ 0x01F00, 0x01FFE, "Polyt" },
},
[0x02] = {
{ 0x02190, 0x021FF, "Zsym" },
{ 0x02200, 0x022FF, "Zmth" },
{ 0x02300, 0x023FF, "Zsym" },
{ 0x02500, 0x027BF, "Zsym" },
{ 0x027C0, 0x027EF, "Zmth" },
{ 0x02800, 0x028FF, "Brai" },
{ 0x02980, 0x02AFF, "Zmth" },
{ 0x02B00, 0x02BFE, "Zsym" },
{ 0x02C00, 0x02C5E, "Glag" },
{ 0x02C60, 0x02C7F, "Latn" },
{ 0x02C80, 0x02CFF, "Copt" },
{ 0x02D00, 0x02D2D, "Geok" },
{ 0x02D30, 0x02D7F, "Tfng" },
{ 0x02D80, 0x02DDE, "Ethi" },
{ 0x02E80, 0x02FDF, "Hani" },
},
[0x03] = {
{ 0x03001, 0x03002, "Hani", "Bopo", "Hang", "Hira", "Kana", "Yiii" },
{ 0x03003, 0x03007, "Hani" },
{ 0x03008, 0x03011, "Hani", "Bopo", "Hang", "Hira", "Kana", "Yiii" },
{ 0x03012, 0x03013, "Hani" },
{ 0x03014, 0x0301B, "Hani", "Bopo", "Hang", "Hira", "Kana", "Yiii" },
{ 0x0301C, 0x0301F, "Hani", "Bopo", "Hang", "Hira", "Kana" },
{ 0x03020, 0x0303F, "Hani" },
{ 0x03041, 0x0309F, "Hira" },
{ 0x030A0, 0x030FF, "Kana" },
{ 0x03105, 0x0312F, "Bopo" },
{ 0x03131, 0x0318E, "Hang" },
{ 0x031A0, 0x031BA, "Bopo" },
{ 0x031C0, 0x031E3, "Hani" },
{ 0x031F0, 0x031FF, "Kana" },
{ 0x03220, 0x03247, "Hani" },
{ 0x03280, 0x032B0, "Hani" },
{ 0x032C0, 0x032CB, "Hani" },
{ 0x03300, 0x03357, "Kana" },
{ 0x03358, 0x03370, "Hani" },
{ 0x0337B, 0x0337F, "Hani" },
{ 0x033E0, 0x033FE, "Hani" },
{ 0x03400, 0x03FFF, "Hani" },
},
[0x04] = {
{ 0x04000, 0x04DB5, "Hani" },
{ 0x04E00, 0x04FFF, "Hani" },
},
[0x05] = {
{ 0x05000, 0x05FFF, "Hani" },
},
[0x06] = {
{ 0x06000, 0x06FFF, "Hani" },
},
[0x07] = {
{ 0x07000, 0x07FFF, "Hani" },
},
[0x08] = {
{ 0x08000, 0x08FFF, "Hani" },
},
[0x09] = {
{ 0x09000, 0x09FFF, "Hani" },
},
[0x0A] = {
{ 0x0A000, 0x0A4C6, "Yiii" },
{ 0x0A4D0, 0x0A4FF, "Lisu" },
{ 0x0A500, 0x0A62B, "Vaii" },
{ 0x0A640, 0x0A67F, "Cyrs" },
{ 0x0A680, 0x0A697, "Cyrl" },
{ 0x0A6A0, 0x0A6F7, "Bamu" },
{ 0x0A720, 0x0A7FF, "Latn" },
{ 0x0A800, 0x0A82B, "Sylo" },
{ 0x0A830, 0x0A832, "Deva", "Dogr", "Gujr", "Guru", "Khoj", "Knda", "Kthi", "Mahj", "Modi", "Nand", "Sind", "Takr", "Tirh"},
{ 0x0A833, 0x0A835, "Deva", "Dogr", "Gujr", "Guru", "Khoj", "Knda", "Kthi", "Mahj", "Mlym", "Modi", "Nand", "Sind", "Takr", "Tirh"},
{ 0x0A836, 0x0A839, "Deva", "Dogr", "Gujr", "Guru", "Khoj", "Kthi", "Mahj", "Modi", "Sind", "Takr", "Tirh"},
{ 0x0A840, 0x0A877, "Phag" },
{ 0x0A880, 0x0A8D9, "Saur" },
{ 0x0A8E0, 0x0A8FF, "Deva" },
{ 0x0A900, 0x0A92F, "Kali" },
{ 0x0A930, 0x0A95F, "Rjng" },
{ 0x0A980, 0x0A9DF, "Java" },
{ 0x0A9E0, 0x0A9FE, "Mymr" },
{ 0x0AA00, 0x0AA5F, "Cham" },
{ 0x0AA60, 0x0AA7F, "Mymr" },
{ 0x0AA80, 0x0AADF, "Tavt" },
{ 0x0AAE0, 0x0AAFF, "Mtei" },
{ 0x0AB01, 0x0AB2E, "Ethi" },
{ 0x0AB30, 0x0AB65, "Latn" },
{ 0x0AB70, 0x0ABBF, "Cher" },
{ 0x0ABC0, 0x0ABFF, "Mtei" },
{ 0x0AC00, 0x0AFFF, "Hang" },
},
[0x0B] = {
{ 0x0B000, 0x0BFFF, "Hang" },
},
[0x0C] = {
{ 0x0C000, 0x0CFFF, "Hang" },
},
[0x0D] = {
{ 0x0D000, 0x0D7A3, "Hang" },
},
[0x0F] = {
{ 0x0FA27, 0x0FA29, "Hani" },
{ 0x0FB13, 0x0FB17, "Armn" },
{ 0x0FB1D, 0x0FB4F, "Hebr" },
{ 0x0FB50, 0x0FDFD, "Arab" },
{ 0x0FE45, 0x0FE46, "Hani", "Bopo", "Hang", "Hira", "Kana" },
{ 0x0FE70, 0x0FEFC, "Arab" },
{ 0x0FF61, 0x0FF65, "Hani", "Bopo", "Hang", "Hira", "Kana", "Yiii" },
},
[0x10] = {
{ 0x10000, 0x100FA, "Linb" },
{ 0x10280, 0x1029C, "Lyci" },
{ 0x102A0, 0x102D0, "Cari" },
{ 0x102E1, 0x102FB, "Copt" },
{ 0x10300, 0x10323, "Ital" },
{ 0x10330, 0x1034A, "Goth" },
{ 0x10350, 0x1037A, "Perm" },
{ 0x10380, 0x1039F, "Ugar" },
{ 0x103A0, 0x103D5, "Xpeo" },
{ 0x10400, 0x1044F, "Dsrt" },
{ 0x10450, 0x1047F, "Shaw" },
{ 0x10480, 0x104A9, "Osma" },
{ 0x104B0, 0x104FB, "Osge" },
{ 0x10500, 0x10527, "Elba" },
{ 0x10530, 0x10563, "Aghb" },
{ 0x10600, 0x10767, "Lina" },
{ 0x10800, 0x1083F, "Cprt" },
{ 0x10840, 0x1085F, "Armi" },
{ 0x10860, 0x1087F, "Palm" },
{ 0x10880, 0x108AF, "Nbat" },
{ 0x108E0, 0x108FF, "Hatr" },
{ 0x10900, 0x1091F, "Phnx" },
{ 0x10920, 0x1093F, "Lydi" },
{ 0x10980, 0x1099F, "Mero" },
{ 0x109A0, 0x109BF, "Merc" },
{ 0x10A00, 0x10A58, "Khar" },
{ 0x10A60, 0x10A7F, "Sarb" },
{ 0x10A80, 0x10A9F, "Narb" },
{ 0x10AC0, 0x10AF6, "Mani" },
{ 0x10B00, 0x10B3F, "Avst" },
{ 0x10B40, 0x10B5F, "Prti" },
{ 0x10B60, 0x10B7F, "Phli" },
{ 0x10B80, 0x10BAF, "Phlp" },
{ 0x10C00, 0x10C48, "Orkh" },
{ 0x10C80, 0x10CB2, "Hung" },
{ 0x10D00, 0x10D39, "Rohg" },
{ 0x10E60, 0x10E7E, "Rumin" },
{ 0x10F00, 0x10F27, "Sogo" },
{ 0x10F30, 0x10F59, "Sogd" },
{ 0x10F70, 0x10FAF, "Ougr" },
{ 0x10FE0, 0x10FFF, "Elym" },
},
[0x11] = {
{ 0x11000, 0x1107F, "Brah" },
{ 0x11080, 0x110CD, "Kthi" },
{ 0x110D0, 0x110F9, "Sora" },
{ 0x11100, 0x11146, "Cakm" },
{ 0x11150, 0x11176, "Mahj" },
{ 0x11180, 0x111D9, "Shrd" },
{ 0x11200, 0x1123D, "Khoj" },
{ 0x11280, 0x112A9, "Mult" },
{ 0x112B0, 0x112F9, "Sind" },
{ 0x11301, 0x11374, "Gran" },
{ 0x11400, 0x1145E, "Newa" },
{ 0x11480, 0x114D9, "Tirh" },
{ 0x11580, 0x115DD, "Sidd" },
{ 0x11600, 0x11659, "Modi" },
{ 0x11680, 0x116C9, "Takr" },
{ 0x11700, 0x1173F, "Ahom" },
{ 0x11800, 0x1183B, "Dogr" },
{ 0x118A0, 0x118FF, "Wara" },
{ 0x119A0, 0x119FF, "Nand" },
{ 0x11A00, 0x11A47, "Zanb" },
{ 0x11A50, 0x11AA2, "Soyo" },
{ 0x11AC0, 0x11AF8, "Pauc" },
{ 0x11C00, 0x11C6C, "Bhks" },
{ 0x11C70, 0x11CB6, "Marc" },
{ 0x11D00, 0x11D59, "Gonm" },
{ 0x11D60, 0x11DA9, "Gong" },
{ 0x11EE0, 0x11EF8, "Maka" },
},
[0x12] = {
{ 0x12000, 0x1236E, "Xsux" },
{ 0x12400, 0x12473, "Xsux" },
{ 0x12F90, 0x12FFF, "Cpmn" },
},
[0x13] = {
{ 0x13000, 0x1342E, "Egyp" },
},
[0x14] = {
{ 0x14400, 0x14646, "Hluw" },
},
[0x16] = {
{ 0x16800, 0x16A38, "Bamu" },
{ 0x16A40, 0x16A6F, "Mroo" },
{ 0x16AD0, 0x16AF5, "Bass" },
{ 0x16B00, 0x16B8F, "Hmng" },
{ 0x16E40, 0x16E9A, "Medf" },
{ 0x16F00, 0x16F9F, "Plrd" },
},
[0x17] = {
{ 0x17000, 0x17FFF, "Tang" },
},
[0x18] = {
{ 0x18000, 0x18AF2, "Tang" },
},
[0x1B] = {
{ 0x1B001, 0x1B11E, "Hira" },
{ 0x1B170, 0x1B2FB, "Nshu" },
{ 0x1BC00, 0x1BC9F, "Dupl" },
},
[0x1C] = {
{ 0x1CF00, 0x1CFCF, "Zname" },
},
[0x1D] = {
{ 0x1D100, 0x1D1DD, "Music" },
{ 0x1D2E0, 0x1D2F3, "Maya" },
{ 0x1D400, 0x1D7FF, "Zmth" },
{ 0x1D800, 0x1DAAF, "Sgnw" },
},
[0x1E] = {
{ 0x1E000, 0x1E02A, "Glag" },
{ 0x1E800, 0x1E8D6, "Mend" },
{ 0x1E900, 0x1E95F, "Adlm" },
},
[0x1F] = {
{ 0x1F000, 0x1F0F5, "Zsym" },
{ 0x1F300, 0x1FA6D, "Zsym" },
},
[0x20] = {
{ 0x20000, 0x20FFF, "Hani" },
},
[0x21] = {
{ 0x21000, 0x21FFF, "Hani" },
},
[0x22] = {
{ 0x22000, 0x22FFF, "Hani" },
},
[0x23] = {
{ 0x23000, 0x23FFF, "Hani" },
},
[0x24] = {
{ 0x24000, 0x24FFF, "Hani" },
},
[0x25] = {
{ 0x25000, 0x25FFF, "Hani" },
},
[0x26] = {
{ 0x26000, 0x26FFF, "Hani" },
},
[0x27] = {
{ 0x27000, 0x27FFF, "Hani" },
},
[0x28] = {
{ 0x28000, 0x28FFF, "Hani" },
},
[0x29] = {
{ 0x29000, 0x29FFF, "Hani" },
},
[0x2A] = {
{ 0x2A000, 0x2AFFF, "Hani" },
},
[0x2B] = {
{ 0x2B000, 0x2BFFF, "Hani" },
},
[0x2C] = {
{ 0x2C000, 0x2CFFF, "Hani" },
},
[0x2D] = {
{ 0x2D000, 0x2DFFF, "Hani" },
},
[0x2E] = {
{ 0x2E000, 0x2EBE0, "Hani" },
},
[0x30] = {
{ 0x30000, 0x30FFF, "Hani" },
},
[0x31] = {
{ 0x31000, 0x31FFF, "Hani" },
},
[0x32] = {
{ 0x32000, 0x32FFF, "Hani" },
},
[0x33] = {
{ 0x33000, 0x33FFF, "Hani" },
},
}
for _, v in next, data do
v.length = #v
end
data.individual = {
[0x00462] = "Cyrl",
[0x00463] = "Cyrl",
[0x0060C] = "Arab, Nkoo, Rohg, Syrc, Thaa, Yezi",
[0x0061B] = "Arab, Nkoo, Rohg, Syrc, Thaa, Yezi",
[0x0061F] = "Arab, Adlm, Nkoo, Rohg, Syrc, Thaa, Yezi",
[0x00640] = "Arab, Adlm, Mand, Mani, Ougr, Phlp, Rohg, Sogd, Syrc",
[0x00951] = "Deva, Beng, Gran, Gujr, Guru, Knda, Latn, Mlym, Orya, Shrd, Taml, Telu, Tirh",
[0x00952] = "Deva, Beng, Gran, Gujr, Guru, Knda, Latn, Mlym, Orya, Taml, Telu, Tirh",
[0x00964] = "Deva, Beng, Dogr, Gong, Gonm, Gran, Gujr, Guru, Knda, Mahj, Mlym, Nand, Orya, Sind, Sinh, Sylo, Takr, Taml, Telu, Tirh",
[0x00965] = "Deva, Beng, Dogr, Gong, Gonm, Gran, Gujr, Guru, Knda, Limb, Mahj, Mlym, Nand, Orya, Sind, Sinh, Sylo, Takr, Taml, Telu, Tirh",
[0x0098F] = "Beng",
[0x00990] = "Beng",
[0x009A1] = "Beng",
[0x009A2] = "Beng",
[0x009AF] = "Beng",
[0x009B2] = "Beng",
[0x009BC] = "Beng",
[0x009C7] = "Beng",
[0x009C8] = "Beng",
[0x009D7] = "Beng",
[0x01CDA] = "Deva, Knda, Mlym, Orya, Taml, Telu",
[0x01CF2] = "Deva, Beng, Gran, Knda, Nand, Orya, Telu, Tirh",
[0x02135] = "Zmth",
[0x03000] = "Hani",
[0x03003] = "Hani, Bopo, Hang, Hira, Kana",
[0x03013] = "Hani, Bopo, Hang, Hira, Kana",
[0x03030] = "Hani, Bopo, Hang, Hira, Kana",
[0x03037] = "Hani, Bopo, Hang, Hira, Kana",
[0x030FB] = "Kana, Hani, Bopo, Hang, Hira, Yiii",
[0x032FF] = "Hani",
[0x0FA0E] = "Hani",
[0x0FA0F] = "Hani",
[0x0FA11] = "Hani",
[0x0FA13] = "Hani",
[0x0FA14] = "Hani",
[0x0FA1F] = "Hani",
[0x0FA21] = "Hani",
[0x0FA23] = "Hani",
[0x0FA24] = "Hani",
[0x1056F] = "Aghb",
[0x16FE0] = "Tang",
[0x16FE1] = "Nshu",
[0x1B000] = "Kana",
}
data.blocks = {
{ 0x04, 0x09, "Hani" },
{ 0x0B, 0x0D, "Hang" },
{ 0x17, 0x18, "Tang" },
{ 0x20, 0x2E, "Hani" },
}
return data
4m69qs8gnq8knzros5qbkff3yz21cb5
Module:auto-subtable
828
6013
17458
2026-07-13T08:57:01Z
Hiyuune
6766
+
17458
Scribunto
text/plain
local auto_subtable_mt = {
__index = function(self, key)
local val = {}
self[key] = val
return val
end
}
local function un_auto_subtable(t)
t.un_auto_subtable = nil
return setmetatable(t, nil)
end
return function(t)
t = t or {}
t.un_auto_subtable = un_auto_subtable
return setmetatable(t, auto_subtable_mt)
end
651lcbfe9p7obaexp4i0jesds6puc4f
Module:languages/data/3/t
828
6014
17459
2026-07-13T08:57:50Z
Hiyuune
6766
+
17459
Scribunto
text/plain
local m_langdata = require("Module:languages/data")
-- Loaded on demand, as it may not be needed (depending on the data).
local function u(...)
u = require("Module:string utilities").char
return u(...)
end
local c = m_langdata.chars
local p = m_langdata.puaChars
local s = m_langdata.shared
local m = {}
m["taa"] = {
"Lower Tanana",
28565,
"ath-nor",
"Latn",
}
m["tab"] = {
"Tabasaran",
34079,
"cau-esm",
"Cyrl, Latn, Arab",
translit = {
Cyrl = "tab-translit",
},
override_translit = true,
display_text = {
Cyrl = s["cau-Cyrl-displaytext"]
},
strip_diacritics = {
Cyrl = s["cau-Cyrl-stripdiacritics"],
Latn = s["cau-Latn-stripdiacritics"],
},
sort_key = {
Cyrl = "tab-sortkey",
}
}
m["tac"] = {
"Lowland Tarahumara",
15616384,
"azc-trc",
"Latn",
}
m["tad"] = {
"Tause",
2356440,
"paa-wlp",
"Latn",
}
m["tae"] = {
"Tariana",
732726,
"awd-nwk",
"Latn",
}
m["taf"] = {
"Tapirapé",
7684673,
"tup-gua",
"Latn",
}
m["tag"] = {
"Tagoi",
36537,
"nic-ras",
"Latn",
}
m["taj"] = {
"Eastern Tamang",
12953177,
"sit-tam",
"sit-tam-Tibt, Deva",
-- sit-tam-Tibt translit, display_text, strip_diacritics, sort_key in [[Module:scripts/data]]
-- NOTE: Formerly there was no sort_key or translit specified; I assume that's a mistake.
}
m["tak"] = {
"Tala",
3914494,
"cdc-wst",
"Latn",
}
m["tal"] = {
"Tal",
3440387,
"cdc-wst",
"Latn",
}
m["tan"] = {
"Tangale",
529921,
"cdc-wst",
"Latn",
}
m["tao"] = {
"Yami",
715760,
"phi",
"Latn",
}
m["tap"] = {
"Taabwa",
7673650,
"bnt-sbi",
"Latn",
}
m["tar"] = {
"Central Tarahumara",
20090009,
"azc-trc",
"Latn",
sort_key = {remove_diacritics = c.acute .. "ꞌ"},
}
m["tas"] = {
"Tây Bồi",
2233794,
"crp",
"Latn",
ancestors = "fr",
sort_key = s["roa-oil-sortkey"],
}
m["tau"] = {
"Upper Tanana",
28281,
"ath-nor",
"Latn",
}
m["tav"] = {
"Tatuyo",
2524007,
"sai-tuc",
"Latn",
}
m["taw"] = {
"Tai",
7675861,
"ngf-kak",
"Latn",
}
m["tax"] = {
"Tamki",
3449082,
"cdc-est",
"Latn",
}
m["tay"] = {
"Atayal",
715766,
"map-ata",
"Latn",
}
m["taz"] = {
"Tocho",
36680,
"alv-tal",
"Latn",
}
m["tba"] = {
"Aikanã",
3409307,
"qfa-iso",
"Latn",
}
-- Tapeba [tbb] is spurious
m["tbc"] = {
"Takia",
3514336,
"poz-oce",
"Latn",
}
m["tbd"] = {
"Kaki Ae",
6349417,
"qfa-iso", -- isolate in Glottolog and Pawley and Hammarström (2018); tentatively in Eleman family by Ross (2005)
-- (and Usher?), but they don't address counterarguments of Clifton 1997
"Latn",
}
m["tbe"] = {
"Tanimbili",
3515188,
"poz-tem",
"Latn",
}
m["tbf"] = {
"Mandara",
3285424,
"poz-ocw",
"Latn",
}
m["tbg"] = {
"North Tairora",
20210398,
"ngf-tai",
"Latn",
}
m["tbh"] = {
"Thurawal",
3537135,
"aus-yuk",
"Latn",
}
m["tbi"] = {
"Gaam",
35338,
"sdv-eje",
"Latn",
}
m["tbj"] = {
"Tiang",
3528020,
"poz-ocw",
"Latn",
}
m["tbk"] = {
"Calamian Tagbanwa",
3915487,
"phi-kal",
"Tagb, Latn",
}
m["tbl"] = {
"Tboli",
7690594,
"phi",
"Latn",
}
m["tbm"] = {
"Tagbu",
7675188,
"nic-ser",
}
m["tbn"] = {
"Barro Negro Tunebo",
12953943,
"cba",
}
m["tbo"] = {
"Tawala",
7689206,
"poz-ocw",
"Latn",
}
m["tbp"] = {
"Taworta",
7689337,
"paa-elp",
"Latn",
}
m["tbr"] = {
"Tumtum",
3407029,
"qfa-kad",
}
m["tbs"] = {
"Tanguat",
7683166,
"paa-ata",
"Latn",
}
m["tbt"] = {
"Kitembo",
13123561,
"bnt-shh",
"Latn",
}
m["tbu"] = {
"Tubar",
56730,
"azc-trc",
"Latn",
}
m["tbv"] = {
-- considered a dialect of Kulungtfu-Yuanggeng-Tobo [kgf] by Glottolog
"Tobo",
7811712,
"ngf-kto",
"Latn",
}
m["tbw"] = {
"Aborlan Tagbanwa",
3915475,
"phi",
"Latn",
}
m["tbx"] = {
"Kapin",
6366665,
"poz-ocw",
"Latn",
}
m["tby"] = {
"Tabaru",
11732670,
"paa-gto",
"Latn",
}
m["tbz"] = {
"Ditammari",
35186,
"nic-eov",
"Latn",
}
m["tca"] = {
"Ticuna",
1815205,
"sai-tyu",
"Latn",
}
m["tcb"] = {
"Tanacross",
28268,
"ath-nor",
"Latn",
}
m["tcc"] = {
"Datooga",
35327,
"sdv-nis",
"Latn",
}
m["tcd"] = {
"Tafi",
36545,
"alv-ktg",
}
m["tce"] = {
"Southern Tutchone",
31091048,
"ath-nor",
"Latn",
}
m["tcf"] = {
"Malinaltepec Tlapanec",
25559732,
"omq",
"Latn",
}
m["tcg"] = {
"Tamagario",
7680531,
"paa-kay",
"Latn",
}
m["tch"] = {
"Turks and Caicos Creole English",
7855478,
"crp",
"Latn",
ancestors = "en",
}
m["tci"] = {
"Wára",
20825638,
"paa-wko",
"Latn",
}
m["tck"] = {
"Tchitchege",
36595,
"bnt-tek",
}
m["tcl"] = {
"Taman (Myanmar)",
15616518,
"sit-jnp",
"Latn",
}
m["tcm"] = {
"Tanahmerah",
3514927,
"qfa-dis", -- Papuan; isolate per Glottolog and Palmer (2018), considered an independent branch of TNG by Usher
-- (2020); seems based only on some pronoun correspondences
"Latn",
}
m["tco"] = {
"Taungyo",
12953186,
"tbq-brm",
ancestors = "obr",
}
m["tcp"] = {
"Tawr Chin",
7689338,
"tbq-kuk",
}
m["tcq"] = {
"Kaiy",
6348709,
"paa-clp",
"Latn",
}
m["tcs"] = {
"Torres Strait Creole",
36648,
"crp",
"Latn",
ancestors = "en",
}
m["tct"] = {
"T'en",
3442330,
"qfa-kms",
}
m["tcu"] = {
"Southeastern Tarahumara",
36807,
"azc-trc",
"Latn",
}
m["tcw"] = {
"Tecpatlán Totonac",
7692795,
"nai-ttn",
"Latn",
}
m["tcx"] = {
"Toda",
34042,
"dra-tkt",
"Taml",
--translit = {Taml = "Taml-translit"},
}
m["tcy"] = {
"Tulu",
34251,
"dra-tlk",
"Tutg, Mlym, Knda", -- Mlym is nearer than Knda but both lack ɛ/ɛː.
translit = {
Tutg = "tcy-Tutg-translit",
},
-- Knda translit in [[Module:scripts/data]]
-- Mlym translit in [[Module:scripts/data]]
}
m["tcz"] = {
"Thado Chin",
6583558,
"tbq-kuk",
}
m["tda"] = {
"Tagdal",
36570,
"son",
}
m["tdb"] = {
"Panchpargania",
21946879,
"inc-bih",
"Deva, as-Beng, Orya, Chis",
}
m["tdc"] = {
"Emberá-Tadó",
3052041,
"sai-chc",
"Latn",
}
m["tdd"] = {
"Tai Nüa",
36556,
"tai-swe",
"Tale",
translit = "Tale-translit",
strip_diacritics = {remove_diacritics = c.ZWNJ .. c.ZWJ},
}
m["tde"] = {
"Tiranige Diga Dogon",
5313387,
"nic-dgw",
}
m["tdf"] = {
"Talieng",
37525108,
"mkh-ban",
}
m["tdg"] = {
"Western Tamang",
12953178,
"sit-tam",
"sit-tam-Tibt, Deva",
-- sit-tam-Tibt translit, display_text, strip_diacritics, sort_key in [[Module:scripts/data]]
-- NOTE: Formerly there was no sort_key or translit specified; I assume that's a mistake.
}
m["tdh"] = {
"Thulung",
56553,
"sit-kiw",
}
m["tdi"] = {
"Tomadino",
7818197,
"poz-btk",
"Latn",
}
m["tdj"] = {
"Tajio",
7676870,
"poz",
"Latn",
}
m["tdk"] = {
"Tambas",
3440392,
"cdc-wst",
}
m["tdl"] = {
"Sur",
3914453,
"nic-tar",
}
m["tdm"] = {
"Taruma",
5559094,
}
m["tdn"] = {
"Tondano",
3531514,
"phi",
"Latn",
}
m["tdo"] = {
"Teme",
3913994,
"alv-mye",
}
m["tdq"] = {
"Tita",
3914899,
"nic-bco",
}
m["tdr"] = {
"Todrah",
7812881,
"mkh",
}
m["tds"] = {
"Doutai",
5302331,
"paa-clp",
"Latn",
}
m["tdt"] = {
"Tetun Dili",
12643484,
"poz-tim",
"Latn",
}
m["tdu"] = {
"Tempasuk Dusun",
3529155,
"poz-san",
}
m["tdv"] = {
"Toro",
3438367,
"nic-alu",
"Latn",
}
m["tdy"] = {
"Tadyawan",
7674700,
"phi",
"Latn",
}
m["tea"] = {
"Temiar",
3914693,
"mkh-asl",
"Latn",
}
m["teb"] = {
"Tetete",
7706087,
"sai-tuc",
"Latn",
}
m["tec"] = {
"Terik",
3518379,
"sdv-nma",
}
m["ted"] = {
"Tepo Krumen",
11152243,
"kro-grb",
}
m["tee"] = {
"Huehuetla Tepehua",
56455,
"nai-ttn",
"Latn",
}
m["tef"] = {
"Teressa",
3518362,
"aav-nic",
}
m["teg"] = {
"Teke-Tege",
36478,
"bnt-tek",
}
m["teh"] = {
"Tehuelche",
33930,
"sai-cho",
"Latn",
}
m["tei"] = {
"Torricelli",
3450788,
"paa-kom",
"Latn",
}
m["tek"] = {
"Ibali Teke",
2802914,
"bnt-tek",
}
m["tem"] = {
"Temne",
36613,
"alv-mel",
"Latn",
}
m["ten"] = {
"Tama (Colombia)",
3832969,
"sai-tuc",
"Latn",
}
m["teo"] = {
"Ateso",
29474,
"sdv-ttu",
"Latn",
}
m["tep"] = {
"Tepecano",
3915525,
"azc-pim",
"Latn",
}
m["teq"] = {
"Temein",
7698064,
"sdv",
}
m["ter"] = {
"Tereno",
3314742,
"awd",
"Latn",
}
m["tes"] = {
"Tengger",
12473479,
"poz",
"Latn, Java",
}
m["tet"] = {
"Tetum",
34125,
"poz-tim",
"Latn",
}
m["teu"] = {
"Soo",
3437607,
"ssa-klk",
}
m["tev"] = {
"Teor",
12953198,
"poz-cma",
}
m["tew"] = {
"Tewa",
56492,
"nai-kta",
"Latn",
}
m["tex"] = {
"Tennet",
56346,
"sdv",
}
m["tey"] = {
"Tulishi",
12911106,
"qfa-kad",
"Latn",
}
m["tez"] = {
"Tetserret",
7706841,
"ber",
"Latn",
}
m["tfi"] = {
"Tofin Gbe",
3530330,
"alv-pph",
}
m["tfn"] = {
"Dena'ina",
27785,
"ath-nor",
"Latn",
}
m["tfo"] = {
"Tefaro",
7694618,
"paa-egb",
"Latn",
}
m["tfr"] = {
"Teribe",
36533,
"cba",
"Latn",
}
m["tft"] = {
"Ternate",
3518492,
"paa-tti",
"Latn, Arab",
}
m["tga"] = {
"Sagalla",
12953082,
"bnt-cht",
}
m["tgb"] = {
"Tobilung",
12953913,
"poz-san",
"Latn",
}
m["tgc"] = {
"Tigak",
3528276,
"poz-ocw",
"Latn",
}
m["tgd"] = {
"Ciwogai",
3438799,
"cdc-wst",
"Latn",
}
m["tge"] = {
"Eastern Gorkha Tamang",
12953175,
"sit-tam",
"sit-tam-Tibt, Deva",
-- sit-tam-Tibt translit, display_text, strip_diacritics, sort_key in [[Module:scripts/data]]
-- NOTE: Formerly there was no sort_key or translit specified; I assume that's a mistake.
}
m["tgf"] = {
"Chali",
3695197,
"sit-ebo",
"Tibt, Latn",
override_translit = true,
-- Tibt translit, display_text, strip_diacritics, sort_key in [[Module:scripts/data]]
}
m["tgh"] = {
"Tobagonian Creole English",
7811541,
"crp",
ancestors = "en",
}
m["tgi"] = {
"Lawunuia",
3219937,
"poz-ocw",
}
m["tgn"] = {
"Tandaganon",
63311769,
"phi",
"Latn",
}
m["tgo"] = {
"Sudest",
7675351,
"poz-ocw",
}
m["tgp"] = {
"Tangoa",
2410276,
"poz-vnn",
"Latn",
}
m["tgq"] = {
"Tring",
7842360,
"poz-swa",
}
m["tgr"] = {
"Tareng",
25559541,
"mkh",
}
m["tgs"] = {
"Nume",
3346290,
"poz-vnn",
"Latn",
}
m["tgt"] = {
"Central Tagbanwa",
3915515,
"phi",
"Tagb",
}
m["tgu"] = {
"Tanggu",
7682930,
"paa-ata",
"Latn",
}
m["tgv"] = {
"Tingui-Boto",
7808195,
"sai-mje",
"Latn",
}
m["tgw"] = {
"Tagwana",
36514,
"alv-tdj",
}
m["tgx"] = {
"Tagish",
28064,
"ath-nor",
"Latn",
}
m["tgy"] = {
"Togoyo",
36825,
"nic-ser",
}
m["thc"] = {
"Tai Hang Tong",
7675753,
"tai-nor",
}
m["thd"] = {
"Kuuk Thaayorre",
6448718,
"aus-pmn",
"Latn",
}
m["the"] = {
"Chitwania Tharu",
22083804,
"inc-tha",
"Deva",
}
m["thf"] = {
"Thangmi",
7710314,
"sit-new",
}
m["thh"] = {
"Northern Tarahumara",
15616395,
"azc-trc",
"Latn",
}
m["thi"] = {
"Tai Long",
25559562,
"tai-swe",
}
m["thk"] = {
"Tharaka",
15407179,
"bnt-kka",
}
m["thl"] = {
"Dangaura Tharu",
22083815,
"inc-tha",
"Deva",
}
m["thm"] = {
"Thavung",
34780,
"mkh-vie",
"Thai", --Laoo is feasible but no evidence yet.
sort_key = "Thai-sortkey",
}
m["thn"] = {
"Thachanadan",
7708880,
"dra-mal",
}
m["thp"] = {
"Thompson",
1755054,
"sal",
"Latn, Dupl",
}
m["thq"] = {
"Kochila Tharu",
22083826,
"inc-tha",
}
m["thr"] = {
"Rana Tharu",
12953920,
"inc-tha",
"Deva",
}
m["ths"] = {
"Thakali",
7709348,
"sit-tam",
}
m["tht"] = {
"Tahltan",
30125,
"ath-nor",
"Latn",
}
m["thu"] = {
"Thuri",
7799291,
"sdv-lon",
}
m["thy"] = {
"Tha",
3915849,
"alv-bwj",
}
m["tic"] = {
"Tira",
36677,
"alv-hei",
}
m["tif"] = {
"Tifal",
11732691,
"ngf-mok",
"Latn",
}
m["tig"] = {
"Tigre",
34129,
"sem-eth",
"Ethi",
translit = "Ethi-translit",
}
m["tih"] = {
"Timugon Murut",
7807680,
"poz-san",
"Latn",
}
m["tii"] = {
"Tiene",
36469,
"bnt-tek",
}
m["tij"] = {
"Tilung",
7803037,
"sit-kiw",
}
m["tik"] = {
"Tikar",
36483,
"nic-bdn",
"Latn",
}
m["til"] = {
"Tillamook",
2109432,
"sal",
"Latn",
}
m["tim"] = {
"Timbe",
7804599,
"ngf-kab",
"Latn",
}
m["tin"] = {
"Tindi",
36860,
"cau-and",
"Cyrl",
display_text = s["cau-Cyrl-displaytext"],
strip_diacritics = s["cau-Cyrl-stripdiacritics"],
}
m["tio"] = {
"Teop",
3518239,
"poz-ocw",
"Latn",
}
m["tip"] = {
"Trimuris",
7842270,
"paa-kwe",
"Latn",
}
m["tiq"] = {
"Tiéfo",
3914874,
"alv-sav",
}
m["tis"] = {
"Masadiit Itneg",
18748769,
"phi",
}
m["tit"] = {
"Tinigua",
3029805,
"sai-tin",
"Latn",
}
m["tiu"] = {
"Adasen",
11214797,
"phi",
"Latn",
}
m["tiv"] = {
"Tiv",
34131,
"nic-tvc",
"Latn",
}
m["tiw"] = {
"Tiwi",
1656014,
"qfa-iso",
"Latn",
}
m["tix"] = {
"Southern Tiwa",
7570552,
"nai-kta",
"Latn",
}
m["tiy"] = {
"Tiruray",
7809425,
"phi",
"Latn",
}
m["tiz"] = {
"Tai Hongjin",
3915716,
"tai-swe",
}
m["tja"] = {
"Tajuasohn",
3915326,
"kro-wkr",
}
m["tjg"] = {
"Tunjung",
3542117,
"poz",
"Latn",
}
m["tji"] = {
"Northern Tujia",
12953229,
"sit-tja",
"Latn",
}
m["tjl"] = {
"Tai Laing",
7675773,
"tai-swe",
"Mymr",
}
m["tjm"] = {
"Timucua",
638300,
"qfa-iso",
"Latn",
}
m["tjn"] = {
"Tonjon",
3913372,
"dmn-jje",
}
m["tjs"] = {
"Southern Tujia",
12633994,
"sit-tja",
"Latn",
}
m["tju"] = {
"Tjurruru",
3913834,
"aus-nga",
"Latn",
}
m["tjw"] = {
"Chaap Wuurong",
5285187,
"aus-pam",
"Latn",
}
m["tka"] = {
"Truká",
7847648,
}
m["tkb"] = {
"Buksa",
20983638,
"inc-eas",
"Deva",
}
m["tkd"] = {
"Tukudede",
36863,
"poz-tim",
"Latn",
}
m["tke"] = {
"Takwane",
11030092,
"bnt-mak",
"Latn",
ancestors = "vmw",
}
m["tkf"] = {
"Tukumanféd",
42330115,
"tup-gua",
"Latn",
}
m["tkl"] = {
"Tokelauan",
34097,
"poz-pnp",
"Latn",
}
m["tkm"] = {
"Takelma",
56710,
}
m["tkn"] = {
"Tokunoshima",
3530484,
"jpx-nry",
"Jpan",
translit = s["jpx-translit"],
display_text = s["jpx-displaytext"],
strip_diacritics = s["jpx-stripdiacritics"],
sort_key = s["jpx-sortkey"],
}
m["tkp"] = {
"Tikopia",
36682,
"poz-pnp",
"Latn",
}
m["tkq"] = {
"Tee",
3075144,
"nic-ogo",
"Latn",
}
m["tkr"] = {
"Tsakhur",
36853,
"cau-wsm",
"Cyrl, Latn, Arab",
translit = "tkr-translit",
override_translit = true,
display_text = {
Cyrl = s["cau-Cyrl-displaytext"]
},
strip_diacritics = {
Cyrl = s["cau-Cyrl-stripdiacritics"],
Latn = s["cau-Latn-stripdiacritics"],
},
}
m["tks"] = {
"Ramandi",
25261947,
"xme-ttc",
"Arab",
ancestors = "xme-ttc-sou",
}
m["tkt"] = {
"Kathoriya Tharu",
22083822,
"inc-tha",
}
m["tku"] = {
"Upper Necaxa Totonac",
56343,
"nai-ttn",
"Latn",
}
m["tkv"] = {
"Mur Pano",
16939373,
"poz-ocw",
"Latn",
}
m["tkw"] = {
"Teanu",
3516731,
"poz-tem",
"Latn",
}
m["tkx"] = {
"Tangko",
7682993,
"ngf-tna",
"Latn",
}
m["tkz"] = {
"Takua",
7678544,
"mkh",
}
m["tla"] = {
"Southwestern Tepehuan",
3518245,
"azc-pim",
"Latn",
}
m["tlb"] = {
"Tobelo",
1142333,
"paa-gto",
"Latn",
}
m["tlc"] = {
"Misantla Totonac",
56460,
"nai-ttn",
"Latn",
}
m["tld"] = {
"Talaud",
7678964,
"phi",
"Latn",
}
m["tlf"] = {
"Telefol",
7696150,
"ngf-mok",
"Latn",
}
m["tlg"] = {
"Tofanma",
4461493,
"paa-nto",
"Latn",
}
m["tlh"] = {
"Klingon",
10134,
"art",
"Latn",
type = "appendix-constructed",
}
m["tli"] = {
"Tlingit",
27792,
"xnd",
"Latn, Cyrl",
}
m["tlj"] = {
"Talinga-Bwisi",
7679530,
"bnt-haj",
}
m["tlk"] = {
"Taloki",
3514563,
"poz-btk",
}
m["tll"] = {
"Tetela",
2613465,
"bnt-tet",
}
m["tlm"] = {
"Tolomako",
3130514,
"poz-vnn",
"Latn",
}
m["tln"] = {
"Talondo'",
7680293,
"poz-ssw",
}
m["tlo"] = {
"Talodi",
36525,
"alv-tal",
}
m["tlp"] = {
"Filomena Mata-Coahuitlán Totonac",
5449202,
"nai-ttn",
"Latn",
}
m["tlq"] = {
"Tai Loi",
7675784,
"mkh-pal",
}
m["tlr"] = {
"Talise",
3514510,
"poz-sls",
"Latn",
}
m["tls"] = {
"Tambotalo",
7681065,
"poz-vnn",
"Latn",
}
m["tlt"] = {
"Teluti",
12953194,
"poz-cma",
}
m["tlu"] = {
"Tulehu",
7852006,
"poz-cma",
}
m["tlv"] = {
"Taliabu",
3514498,
"poz-cma",
"Latn",
}
m["tlx"] = {
"Khehek",
3196124,
"poz-aay",
}
m["tly"] = {
"Talysh",
34318,
"xme-ttc",
"Latn, Cyrl, fa-Arab",
}
m["tma"] = {
"Tama (Chad)",
57001,
"sdv-tmn",
}
m["tmb"] = {
"Avava",
2157461,
"poz-vnc",
"Latn",
}
m["tmc"] = {
"Tumak",
3121045,
"cdc-est",
}
m["tmd"] = {
"Haruai",
12632146,
"paa-pia",
"Latn",
}
m["tme"] = {
"Tremembé",
5246937,
}
m["tmf"] = {
"Toba-Maskoy",
3033544,
"sai-mas",
"Latn",
}
m["tmg"] = {
"Ternateño",
7232597,
}
m["tmh"] = {
"Tuareg",
34065,
"ber",
"Latn, Tfng, Arab",
strip_diacritics = {
Latn = {remove_diacritics = c.grave .. c.acute .. c.circ},
},
}
m["tmi"] = {
"Tutuba",
7857052,
"poz-vnn",
"Latn",
}
m["tmj"] = {
"Samarokena",
7408865,
"paa-saa",
"Latn",
}
m["tml"] = {
"Tamnim Citak",
12643315,
"ngf-asm",
"Latn",
}
m["tmm"] = {
"Tai Thanh",
7675842,
"tai-swe",
}
m["tmn"] = {
"Taman (Indonesia)",
7680671,
"poz",
"Latn",
}
m["tmo"] = {
"Temoq",
7698205,
"mkh-asl",
}
m["tmq"] = {
"Tumleo",
7852641,
"poz-ocw",
}
m["tms"] = {
"Tima",
36684,
"nic-ktl",
}
m["tmt"] = {
"Tasmate",
7687571,
"poz-vnn",
"Latn",
}
m["tmu"] = {
"Iau",
56867,
"paa-lpl",
"Latn",
}
m["tmv"] = {
"Motembo",
11013108,
"bnt-bun",
}
m["tmy"] = {
"Tami",
3514812,
"poz-oce",
}
m["tmz"] = {
"Tamanaku",
3441435,
"sai-ven",
"Latn",
}
m["tna"] = {
"Tacana",
3182551,
"sai-tac",
"Latn",
}
m["tnb"] = {
"Western Tunebo",
3181238,
"cba",
}
m["tnc"] = {
"Tanimuca-Retuarã",
36535,
"sai-tuc",
"Latn",
}
m["tnd"] = {
"Angosturas Tunebo",
25559604,
"cba",
}
m["tne"] = {
"Tinoc Kallahan",
3192219,
}
m["tng"] = {
"Tobanga",
3440501,
"cdc-est",
}
m["tnh"] = {
"Maiani",
6735243,
"ngf-kau",
"Latn",
}
m["tni"] = {
"Tandia",
7682454,
"poz-hce",
"Latn",
}
m["tnk"] = {
"Kwamera",
3200806,
"poz-vns",
"Latn",
}
m["tnl"] = {
"Lenakel",
3229429,
"poz-vns",
"Latn",
}
m["tnm"] = {
"Tabla",
7673105,
"paa-sen",
"Latn",
}
m["tnn"] = {
"North Tanna",
957945,
"poz-vns",
"Latn",
}
m["tno"] = {
"Toromono",
510544,
"sai-tac",
"Latn",
}
m["tnp"] = {
"Whitesands",
3063761,
"poz-vns",
"Latn",
}
m["tnq"] = {
"Taíno",
5232952,
"awd-taa",
"Latn",
}
m["tnr"] = {
"Bedik",
35096,
"alv-ten",
"Latn",
}
m["tns"] = {
"Tenis",
7699870,
"poz-stm",
"Latn",
}
m["tnt"] = {
"Tontemboan",
3531666,
"phi",
"Latn",
}
m["tnu"] = {
"Tay Khang",
6362363,
"tai",
}
m["tnv"] = {
"Tanchangya",
7682361,
"inc-bas",
"Cakm",
ancestors = "inc-obn",
}
m["tnw"] = {
"Tonsawang",
3531660,
"phi",
"Latn",
}
m["tnx"] = {
"Tanema",
2106984,
"poz-tem",
"Latn",
}
m["tny"] = {
"Tongwe",
7821200,
"bnt",
}
m["tnz"] = {
"Ten'edn",
3073453,
"mkh-asl",
"Latn",
}
m["tob"] = {
"Toba",
3113756,
"sai-guc",
"Latn",
}
m["toc"] = {
"Coyutla Totonac",
15615591,
"nai-ttn",
"Latn",
}
m["tod"] = {
"Toma",
11055484,
"dmn-msw",
"Latn, Loma"
}
m["tof"] = {
"Gizrra",
5565941,
"paa-etf",
"Latn",
}
m["tog"] = {
"Tonga (Malawi)",
3847648,
"bnt-nys",
"Latn",
}
m["toh"] = {
"Tonga (Mozambique)",
7820988,
"bnt-bso",
}
m["toi"] = {
"Tonga (Zambia)",
34101,
"bnt-bot",
"Latn",
}
m["toj"] = {
"Tojolabal",
36762,
"myn",
"Latn",
}
m["tok"] = {
"Toki Pona",
36846,
"art",
"Latn",
type = "appendix-constructed",
}
m["tol"] = {
"Tolowa",
20827,
"ath-pco",
"Latn",
}
m["tom"] = {
"Tombulu",
3531199,
"phi",
"Latn",
}
m["too"] = {
"Xicotepec de Juárez Totonac",
8044353,
"nai-ttn",
"Latn",
}
m["top"] = {
"Papantla Totonac",
56329,
"nai-ttn",
"Latn",
}
m["toq"] = {
"Toposa",
3033588,
"sdv-ttu",
}
m["tor"] = {
"Togbo-Vara Banda",
11002922,
"bad-cnt",
}
m["tos"] = {
"Highland Totonac",
13154149,
"nai-ttn",
"Latn",
}
m["tou"] = {
"Tho",
22694631,
"mkh-vie",
"Latn",
}
m["tov"] = {
"Upper Taromi",
12953183,
"xme-ttc",
ancestors = "xme-ttc-cen",
}
m["tow"] = {
"Jemez",
3912876,
"nai-kta",
"Latn",
}
m["tox"] = {
"Tobian",
34022,
"poz-mic",
}
m["toy"] = {
"Topoiyo",
7824977,
"poz-kal",
}
m["toz"] = {
"To",
7811216,
"alv-mbm",
}
m["tpa"] = {
"Taupota",
7688832,
"poz-ocw",
}
m["tpc"] = {
"Azoyú Me'phaa",
25559730,
"omq",
"Latn",
}
m["tpe"] = {
"Tippera",
16115423,
"tbq-bdg",
}
m["tpf"] = {
"Tarpia",
12953185,
"poz-ocw",
"Latn",
}
m["tpg"] = {
"Kula",
6442714,
"paa-alp",
"Latn",
}
m["tpi"] = {
"Tok Pisin",
34159,
"crp",
"Latn",
ancestors = "en",
}
m["tpj"] = {
"Tapieté",
3121063,
"gn",
"Latn",
}
m["tpk"] = {
"Tupinikin",
33924,
"tup-gua",
}
m["tpl"] = {
"Tlacoapa Me'phaa",
16115511,
"omq",
}
m["tpm"] = {
"Tampulma",
36590,
"nic-gnw",
}
m["tpn"] = {
"Tupinambá",
31528147,
"tup-gua",
"Latn",
}
m["tpo"] = {
"Tai Pao",
7675795,
"tai-nor",
}
m["tpp"] = {
"Pisaflores Tepehua",
56349,
"nai-ttn",
}
m["tpq"] = {
"Tukpa",
12953230,
"sit-las",
}
m["tpr"] = {
"Tuparí",
3542217,
"tup",
"Latn",
}
m["tpt"] = {
"Tlachichilco Tepehua",
56330,
"nai-ttn",
}
m["tpu"] = {
"Tampuan",
3514882,
"mkh-ban",
"Khmr",
}
m["tpv"] = {
"Tanapag",
3397371,
"poz-mic",
}
m["tpw"] = {
"Old Tupi",
56944,
"tup-gua",
"Latn",
}
m["tpx"] = {
"Acatepec Me'phaa",
31157882,
"omq",
"Latn",
}
m["tpy"] = {
"Trumai",
12294279,
"qfa-iso",
}
m["tpz"] = {
"Tinputz",
3529205,
"poz-ocw",
}
m["tqb"] = {
"Tembé",
10322157,
"tup-gua",
"Latn",
}
m["tql"] = {
"Lehali",
3229119,
"poz-vnn",
"Latn",
}
m["tqm"] = {
"Turumsa",
7856508,
"paa-dtu",
"Latn",
}
m["tqn"] = {
"Tenino",
15699255,
"nai-shp",
"Latn",
ancestors = "nai-spt",
}
m["tqo"] = {
"Toaripi",
7811403,
"paa-eel",
"Latn",
}
m["tqp"] = {
"Tomoip",
3531388,
"poz-ocw",
}
m["tqq"] = {
"Tunni",
3514343,
"cus-som",
}
m["tqr"] = {
"Torona",
36679,
"alv-tal",
}
m["tqt"] = {
"Western Totonac",
7116691,
"nai-ttn",
"Latn",
}
m["tqu"] = {
"Touo",
56750,
}
m["tqw"] = {
"Tonkawa",
2454881,
"qfa-iso",
"Latn",
}
m["tra"] = {
"Tirahi",
3812406,
"inc-koh",
}
m["trb"] = {
"Terebu",
7701797,
"poz-ocw",
}
m["trc"] = {
"Copala Triqui",
12953935,
"omq-tri",
"Latn",
}
m["trd"] = {
"Turi",
7854914,
"mun",
}
m["tre"] = {
"East Tarangan",
18609750,
"poz",
}
m["trf"] = {
"Trinidadian Creole English",
7842493,
"crp",
"Latn",
ancestors = "en",
}
m["trg"] = {
"Lishán Didán",
56473,
"sem-nna",
"Hebr",
}
m["trh"] = {
"Turaka",
12953237,
"ngf-dag",
"Latn",
}
m["tri"] = {
"Trió",
56885,
"sai-tar",
"Latn",
}
m["trj"] = {
"Toram",
3441225,
"cdc-est",
}
m["trl"] = {
"Traveller Scottish",
3915671,
"qfa-mix",
"Latn",
ancestors = "rom, sco",
}
m["trm"] = {
"Tregami",
34081,
"nur-sou",
}
m["trn"] = {
"Trinitario",
3539279,
"awd",
}
m["tro"] = {
"Tarao",
3515603,
"tbq-kuk",
"Latn",
}
m["trp"] = {
"Kokborok",
35947,
"tbq-bdg",
"Beng, Latn" -- WP lists 2 more
}
m["trq"] = {
"San Martín Itunyoso Triqui",
12953934,
"omq-tri",
"Latn",
}
m["trr"] = {
"Taushiro",
1957508,
nil,
"Latn",
}
m["trs"] = {
"Chicahuaxtla Triqui",
3539587,
"omq-tri",
"Latn",
}
m["trt"] = {
"Tunggare",
615071,
"paa-egb",
"Latn",
}
m["tru"] = {
"Turoyo",
34040,
"sem-cna",
"Syrc, Latn",
translit = {
Syrc = "tru-translit",
},
strip_diacritics = {
Syrc = "Syrc-stripdiacritics",
},
}
m["trv"] = {
"Taroko",
716686,
"map-ata",
"Latn",
}
m["trw"] = {
"Torwali",
2665246,
"inc-koh",
"ur-Arab",
}
m["trx"] = {
"Tringgus",
7842365,
"day",
}
m["try"] = {
"Turung",
7856514,
"tai-swe",
"as-Beng",
}
m["trz"] = {
"Torá",
7827518,
"sai-cpc",
}
m["tsa"] = {
"Tsaangi",
36675,
"bnt-nze",
}
m["tsb"] = {
"Tsamai",
2371358,
"cus-eas",
}
m["tsc"] = {
"Tswa",
2085051,
"bnt-tsr",
}
m["tsd"] = {
"Tsakonian",
220607,
"grk",
"Grek",
ancestors = "grc-dor",
translit = "el-translit",
-- Grek display_text, strip_diacritics, sort_key in [[Module:scripts/data]]
}
m["tse"] = {
"Tunisian Sign Language",
7853191,
"sgn",
}
m["tsg"] = {
"Tausug",
34142,
"phi",
"Latn, Arab",
}
m["tsh"] = {
"Tsuvan",
3502326,
"cdc-cbm",
"Latn",
}
m["tsi"] = {
"Tsimshian",
20085721,
"nai-tsi",
"Latn",
}
m["tsj"] = {
"Tshangla",
36840,
"sit-tsk",
"Tibt, Latn, Deva",
override_translit = true,
-- Tibt translit, display_text, strip_diacritics, sort_key in [[Module:scripts/data]]
}
m["tsl"] = {
"Ts'ün-Lao",
3446675,
"tai",
}
m["tsm"] = {
"Turkish Sign Language",
36885,
"sgn",
}
m["tsp"] = {
"Northern Toussian",
11155635,
"alv-sav",
}
m["tsq"] = {
"Thai Sign Language",
7709156,
"sgn-asl",
"Sgnw",
}
m["tsr"] = {
"Akei",
2828964,
"poz-vnn",
"Latn",
}
m["tss"] = {
"Taiwan Sign Language",
34019,
"sgn-jsl",
}
m["tsu"] = {
"Tsou",
716681,
"map",
"Latn",
}
m["tsv"] = {
"Tsogo",
36674,
"bnt-tso",
}
m["tsw"] = {
"Tsishingini",
13123571,
"nic-kam",
}
m["tsx"] = {
"Mubami",
6930815,
"paa-wig",
"Latn",
}
m["tsy"] = {
"Tebul Sign Language",
7692090,
"sgn",
}
m["tta"] = {
"Tutelo",
2311602,
"sio-ohv",
"Latn",
}
m["ttb"] = {
"Gaa",
3438361,
"nic-dak",
"Latn",
}
m["ttc"] = {
"Tektiteko",
36686,
"myn",
"Latn",
}
m["ttd"] = {
"Tauade",
7688634,
"qfa-dis", -- Papuan; isolate per Glottolog; Glottolog says "A Goilalan family uniting Kunimaipan, Tauade and Fuyug
-- is often posited based on the lexicostatistical figures reported in Tom E. Dutton 1975: 631-632" but
-- goes on to say the data "is clearly insufficient, as the lexical links so far proposed are few and
-- show irregular one-consonant correspondences".
"Latn",
}
m["tte"] = {
"Bwanabwana",
5003667,
"poz-ocw",
"Latn",
}
m["ttf"] = {
"Tuotomb",
7853459,
"nic-mbw",
"Latn",
}
m["ttg"] = {
"Tutong",
3507990,
"poz-swa",
"Latn",
}
m["tth"] = {
"Upper Ta'oih",
3512660,
"mkh-kat",
}
m["tti"] = {
"Tobati",
7811556,
"poz-ocw",
"Latn",
}
m["ttj"] = {
"Tooro",
7824218,
"bnt-nyg",
"Latn",
}
m["ttk"] = {
"Totoro",
3532756,
"sai-bar",
"Latn",
}
m["ttl"] = {
"Totela",
10962316,
"bnt-bot",
"Latn",
}
m["ttm"] = {
"Northern Tutchone",
20822,
"ath-nor",
"Latn",
}
m["ttn"] = {
"Towei",
7829606,
"paa-wpw",
"Latn",
}
m["tto"] = {
"Lower Ta'oih",
25559539,
"mkh-kat",
}
m["ttp"] = {
"Tombelala",
6799663,
"poz-kal",
}
m["ttr"] = {
"Tera",
56267,
"cdc-cbm",
}
m["tts"] = {
"Isan",
33417,
"tai-swe",
"Thai", -- also Tai Noi/Lao Buhan script
sort_key = "Thai-sortkey",
}
m["ttt"] = {
"Tat",
56489,
"ira-swi",
"Cyrl, Latn, Armn, fa-Arab",
-- Armn translit in [[Module:scripts/data]] (NOTE: formerly not present, probably an accidental omission)
ancestors = "fa",
}
m["ttu"] = {
"Torau",
3532208,
"poz-ocw",
}
m["ttv"] = {
"Titan",
3445811,
"poz-aay",
"Latn",
}
m["ttw"] = {
"Long Wat",
7856961,
"poz-swa",
}
m["tty"] = {
"Sikaritai",
7513600,
"paa-clp",
"Latn",
}
m["ttz"] = {
"Tsum",
12953223,
"sit-kyk",
}
m["tua"] = {
"Wiarumus",
7998045,
"paa-mmu",
"Latn",
}
m["tub"] = {
"Tübatulabal",
56704,
"azc",
"Latn",
}
m["tuc"] = {
"Mutu",
3331003,
"poz-ocw",
"Latn",
}
m["tud"] = {
"Tuxá",
7857217,
}
m["tue"] = {
"Tuyuca",
2520538,
"sai-tuc",
"Latn",
}
m["tuf"] = {
"Central Tunebo",
12953942,
"cba",
"Latn",
}
m["tug"] = {
"Tunia",
863721,
"alv-bua",
}
m["tuh"] = {
"Taulil",
3516141,
}
m["tui"] = {
"Tupuri",
36646,
"alv-mbm",
"Latn",
}
m["tuj"] = {
"Tugutil",
12953228,
"paa-gto",
"Latn",
}
m["tul"] = {
"Tula",
3914907,
"alv-wjk",
}
m["tum"] = {
"Tumbuka",
34138,
"bnt-nys",
"Latn",
}
m["tun"] = {
"Tunica",
56619,
"qfa-iso",
"Latn",
}
m["tuo"] = {
"Tucano",
3541834,
"sai-tuc",
"Latn",
}
m["tuq"] = {
"Tedaga",
36639,
"ssa-sah",
"Latn",
}
m["tus"] = {
"Tuscarora",
36944,
"iro-nor",
"Latn",
}
m["tuu"] = {
"Tututni",
20627,
"ath-pco",
"Latn",
}
m["tuv"] = {
"Turkana",
36958,
"sdv-ttu",
"Latn",
}
m["tux"] = {
"Tuxináwa",
7857204,
"sai-pan",
"Latn",
}
m["tuy"] = {
"Tugen",
3541935,
"sdv-nma",
}
m["tuz"] = {
"Turka",
36643,
"nic-gur",
"Latn",
}
m["tva"] = {
"Vaghua",
3553248,
"poz-ocw",
"Latn",
}
m["tvd"] = {
"Tsuvadi",
3914936,
"nic-kam",
}
m["tve"] = {
"Te'un",
7690709,
"poz-cet",
"Latn",
}
m["tvk"] = {
"Southeast Ambrym",
252411,
"poz-vnc",
"Latn",
}
m["tvl"] = {
"Tuvaluan",
34055,
"poz-pnp",
"Latn",
}
m["tvm"] = {
"Tela-Masbuar",
7695666,
"poz-tim",
}
m["tvn"] = {
"Tavoyan",
7689158,
"tbq-brm",
"Mymr",
ancestors = "obr",
}
m["tvo"] = {
"Tidore",
3528199,
"paa-tti",
"Latn, Arab",
}
m["tvs"] = {
"Taveta",
15632387,
"bnt-par",
"Latn",
}
m["tvt"] = {
"Tutsa Naga",
7856987,
"sit-tno",
}
m["tvu"] = {
"Tunen",
36632,
"nic-mbw",
}
m["tvw"] = {
"Sedoa",
7445362,
"poz-kal",
}
m["tvx"] = {
"Taivoan",
1975271,
"map",
"Latn",
}
m["tvy"] = {
"Timor Pidgin",
4904029,
"crp",
ancestors = "pt",
}
m["twa"] = {
"Twana",
7857412,
"sal",
"Latn",
}
m["twb"] = {
"Western Tawbuid",
12953912,
"phi",
}
m["twc"] = {
"Teshenawa",
3436597,
"phi",
}
m["twe"] = {
"Teiwa",
3519302,
"paa-alp",
"Latn",
}
m["twf"] = {
"Taos",
7684320,
"nai-kta",
"Latn",
}
m["twg"] = {
"Tereweng",
12953200,
"paa-alp",
"Latn",
}
m["twh"] = {
"Tai Dón",
7675751,
"tai-swe",
"Tavt",
--translit = "Tavt-translit",
sort_key = {
from = {"[꪿ꫀ꫁ꫂ]", "([ꪵꪶꪹꪻꪼ])([ꪀ-ꪯ])"},
to = {"", "%2%1"}
},
}
m["twm"] = {
"Tawang Monpa",
36586,
"sit-ebo",
"Tibt",
override_translit = true,
-- Tibt translit, display_text, strip_diacritics, sort_key in [[Module:scripts/data]]
}
m["twn"] = {
"Twendi",
7857682,
"nic-mmb",
}
m["two"] = {
"Tswapong",
3446241,
"bnt-sts",
}
m["twp"] = {
"Ere",
3056045,
"poz-aay",
"Latn",
}
m["twq"] = {
"Tasawaq",
36564,
"son",
}
m["twr"] = {
"Southwestern Tarahumara",
12953909,
"azc-trc",
"Latn",
}
m["twt"] = {
"Turiwára",
3542307,
"tup-gua",
"Latn",
}
m["twu"] = {
"Termanu",
7702572,
"poz-tim",
"Latn",
}
m["tww"] = {
"Tuwari",
7857159,
"paa-wal",
"Latn",
}
m["twy"] = {
"Tawoyan",
3513542,
"poz-bre",
"Latn",
}
m["txa"] = {
"Tombonuo",
7818692,
"poz-san",
"Latn",
}
m["txb"] = {
"Tocharian B",
3199353,
"ine-toc",
"Latn",
standard_chars = "AaÄäĀāCcEeIiKkLlMmṂṃNnṄṅÑñOoPpRrSsŚśṢṣTtUuWwYy" .. c.punc,
}
m["txc"] = {
"Tsetsaut",
20829,
"ath-nor",
"Latn",
}
m["txe"] = {
"Totoli",
7828387,
"poz-tot",
"Latn",
}
m["txg"] = {
"Tangut",
2727930,
"ero",
"Tang",
-- Tang translit in [[Module:scripts/data]]
}
m["txh"] = {
"Thracian",
36793,
"ine",
"Latn, Polyt",
-- Polyt translit, display_text, strip_diacritics, sort_key in [[Module:scripts/data]]
}
m["txi"] = {
"Ikpeng",
9344891,
"sai-pek",
"Latn",
}
m["txj"] = {
"Tarjumo",
24906088,
"ssa-sah",
"Latn, Arab",
}
m["txm"] = {
"Tomini",
7818911,
"poz",
"Latn",
}
m["txn"] = {
"West Tarangan",
3515594,
"poz",
"Latn",
}
m["txo"] = {
"Toto",
36709,
"sit-dhi",
"Beng, Toto"
}
m["txq"] = {
"Tii",
7801784,
"poz-tim",
}
m["txr"] = {
"Tartessian",
36795,
"qfa-unc", -- extinct, no consensus on classification
}
m["txs"] = {
"Tonsea",
3531659,
"phi",
"Latn",
}
m["txt"] = {
"Citak",
3447279,
"ngf-asm",
"Latn",
}
m["txu"] = {
"Kayapó",
3101212,
"sai-nje",
"Latn",
}
m["txx"] = {
"Tatana",
18643518,
"poz-san",
"Latn",
}
m["tya"] = {
"Tauya",
7688978,
"ngf-rai",
"Latn",
}
m["tye"] = {
"Kyenga",
3913304,
"dmn-bbu",
"Latn",
}
m["tyh"] = {
"O'du",
3347428,
"mkh",
}
m["tyi"] = {
"Teke-Tsaayi",
33123613,
"bnt-nze",
}
m["tyj"] = {
"Tai Do",
7675746,
"tai-nor", -- Chamberlain (1991), but Pittayaporn (2009) suggests tai-swe
"Latn, Tayo", -- Vietnam
}
m["tyl"] = {
"Thu Lao",
12953921,
"tai-cen",
}
m["tyn"] = {
"Kombai",
6428241,
"ngf-nde",
"Latn",
}
m["typ"] = {
"Kuku-Thaypan",
3915693,
"aus-pmn",
"Latn",
}
m["tyr"] = {
"Tai Daeng",
3915207,
"tai-swe",
"Tavt",
}
m["tys"] = {
"Sapa",
3446668,
"tai-sap",
"Latn",
}
m["tyt"] = {
"Tày Tac",
7862029,
"tai-swe",
}
m["tyu"] = {
"Kua",
3832933,
"khi-kal",
"Latn",
}
m["tyv"] = {
"Tuvan",
34119,
"trk-ssb",
"Cyrl",
translit = "tyv-translit",
override_translit = true,
sort_key = "tyv-sortkey",
}
m["tyx"] = {
"Teke-Tyee",
36634,
"bnt-nze",
"Latn",
}
m["tyz"] = {
"Tày", -- This does not mean its family "Tai" languages.
2511476,
"tai-tay",
"Latn, Hani",
sort_key = {
Hani = "Hani-sortkey"
},
}
m["tza"] = {
"Tanzanian Sign Language",
7684177,
"sgn",
}
m["tzh"] = {
"Tzeltal",
36808,
"myn",
"Latn",
}
m["tzj"] = {
"Tz'utujil",
36941,
"myn",
"Latn",
}
m["tzl"] = {
"Talossan",
1063911,
"art",
"Latn",
type = "appendix-constructed",
sort_key = "tzl-sortkey",
}
m["tzm"] = {
"Central Atlas Tamazight",
49741,
"ber",
"Tfng, Arab, Latn",
translit = {
Tfng = "Tfng-translit",
},
}
m["tzn"] = {
"Tugun",
12953225,
"poz-tim",
"Latn",
}
m["tzo"] = {
"Tzotzil",
36809,
"myn",
"Latn",
}
m["tzx"] = {
"Tabriak",
56872,
"paa-lse",
"Latn",
}
return require("Module:languages").finalizeData(m, "language")
iv1un0e66t5lah4fo1uaq0ipxx9ulbl