विक्षनरी hiwiktionary https://hi.wiktionary.org/wiki/%E0%A4%AE%E0%A5%81%E0%A4%96%E0%A4%AA%E0%A5%83%E0%A4%B7%E0%A5%8D%E0%A4%A0 MediaWiki 1.47.0-wmf.18 case-sensitive मीडिया विशेष वार्ता सदस्य सदस्य वार्ता विक्षनरी विक्षनरी वार्ता चित्र चित्र वार्ता मीडियाविकि मीडियाविकि वार्ता साँचा साँचा वार्ता सहायता सहायता वार्ता श्रेणी श्रेणी वार्ता TimedText TimedText talk मॉड्यूल मॉड्यूल वार्ता Event Event talk असमिया 0 978 487733 448088 2026-09-02T14:03:44Z अजीत कुमार तिवारी 4887 अजीत कुमार तिवारी ने पृष्ठ [[आसामी]] को [[असमिया]] पर स्थानांतरित किया: अधिक प्रचलित नाम. 448088 wikitext text/x-wiki {{-hi-}} {{-noun-}} स्त्री. # [[भारत]] की [[भाषा]] हैं । # [[व्यक्ति]] {{-trans-}} * {{as}} : [[অসমিয়া]] * {{de}} : [[Assami]] * {{en}} : [[Assamese]] [[:en:Assamese]] * {{fr}} : [[assamais]] पु. [[:fr:assamais]] (१), [[Assamais]] पु. [[:fr:Assamais]] (२) * {{gu}} : [[આસામી]] स्त्री. [[:gu:આસામી]] * {{nl}} : [[Assamitisch]] न. [[:nl:Assamitisch]] * {{zh}} : [[阿萨密语]] {{-adj-}} # {{-trans-}} * {{en}} : [[Assamese]] * {{fr}} : [[assamais]] पु., [[assamaise]] स्त्री. [[:fr:assamaise]] * {{gu}} : [[આસામી]] [[श्रेणी:भाषाएँ]] {{-hi-}} == प्रकाशितकोशों से अर्थ == === शब्दसागर === आसामी ^१ संज्ञा पुं॰ स्त्री॰ [हि॰] दे॰ 'आसामी' । आसामी ^२ वि॰ [हि॰ आसाम] आसाम देश का । आसाम देश संबंधी । आसामी ^३ संज्ञा पुं॰ आसाम देश का निवासी । आसामी ^४ संज्ञा स्त्री॰ आसाम देश की भाषा । [[श्रेणी: हिन्दी-प्रकाशितकोशों से अर्थ-शब्दसागर]] ptr3nbz2yrapwkoavrgiu1sfheg4hik साँचा:audio 10 7289 487754 478030 2026-09-02T15:14:24Z SM7 6218 updating... 487754 wikitext text/x-wiki {{ {{#if:{{{lang|}}}|check deprecated lang param usage|no deprecated lang param usage}}|lang={{{lang|}}}|1=<!-- -->{{#invoke:audio|show}}<!-- -->}}<noinclude>{{documentation}}</noinclude> m5e7v618pe7zo812h4lo5dzfuuhjzjh साँचा:temp 10 11912 487767 479835 2026-09-02T16:34:41Z SM7 6218 updating... 487767 wikitext text/x-wiki <includeonly><onlyinclude>{{safesubst:<noinclude/>#invoke:template parser/templates|template_link_t}}</onlyinclude></includeonly><!-- -->{{temp|temp}}{{documentation}} j7pe9fadahr6jqm0fnpuxcxasravo3o अखंड 0 140156 487728 390773 2026-09-02T13:58:48Z अजीत कुमार तिवारी 4887 अजीत कुमार तिवारी ने पृष्ठ [[अखण्ड़]] को [[अखंड]] पर स्थानांतरित किया: शीर्षक में गलत वर्तनी 390773 wikitext text/x-wiki {{-hi-}} == प्रकाशितकोशों से अर्थ == === शब्दसागर === अखंड़ वि॰ [सं॰ अखण्ड़] <br><br>१. जिसके खंड़ या टुकड़े न हों । अटूट । अविछिन्न । संपूर्ण । समूचा । पूरा । उ॰—ज्ञान अखंड़ एक सीताबर । मायावस्य जीव सचराचर । —मानस, ७ ।७८ । <br><br>२. जिसका क्रम या सिलसिला न टूटे । जो बीच में न रुके । लगातर । अनवरत । उ॰—जहाँ अखंड़ शांति रहती है वहाँ ११ सदा स्वच्छंद रहें ।—प्रेम॰, पृ॰ ३२ । <br><br>३. निर्विघ्न । बेरोक । उ॰—रावन क्रोध अनल निज स्वास समीर प्रचंड़ । जरत बिभीषन राखेउ दीन्हेउ राज अखंड़ । —मानस ५ ।४९ । यौ॰—अखंड़ ऐश्वर्य । अखंड़ कीर्ति । अखंड़ पुण्य । अखंड़ प्रताप । अखंड़ यश । अखंड़ राज्य । अखंड़ वृष्टि । अखंड़ द्वादशी संज्ञा स्त्री॰ [सं॰ अखंड़द्वादशी] अगहन सुदी द्वादशी । मार्गशीर्ष मास के शुक्ल पक्ष की बारहवीं तिथि [को॰] । अखंड़ सौभाग्य संज्ञा पुं॰ [सं॰ अखंड़+सौभाग्यवती] जीवन पर्यत स्त्रियों के अविधवा होने का सौभाग्य । जीवन पयँत अविधवा रहने की स्थिति [को॰] । अखंड़ सौभाग्यवती वि॰ [सं॰ अखंड़+सौभाग्यवती] जीवन पर्यंत सुहागिनी रहनेवाली [को॰] । [[श्रेणी: हिन्दी-प्रकाशितकोशों से अर्थ-शब्दसागर]] lte67m7w9hfyeias6smnvczxhwqmekl 487730 487728 2026-09-02T14:01:28Z अजीत कुमार तिवारी 4887 वर्तनी सुधार. 487730 wikitext text/x-wiki {{-as-}} == प्रकाशितकोशों से अर्थ == === शब्दसागर === अखंड वि॰ [सं॰ अखण्ड] <br><br>१. जिसके खंड या टुकड़े न हों। अटूट। अविछिन्न। संपूर्ण। समूचा। पूरा। उ॰—ज्ञान अखंड एक सीताबर। मायावस्य जीव सचराचर। —मानस, ७ ।७८ । <br><br>२. जिसका क्रम या सिलसिला न टूटे । जो बीच में न रुके । लगातर । अनवरत । उ॰—जहाँ अखंड़ शांति रहती है वहाँ ११ सदा स्वच्छंद रहें ।—प्रेम॰, पृ॰ ३२ । <br><br>३. निर्विघ्न । बेरोक । उ॰—रावन क्रोध अनल निज स्वास समीर प्रचंड । जरत बिभीषन राखेउ दीन्हेउ राज अखंड। —मानस ५ ।४९ । यौ॰—अखंड ऐश्वर्य। अखंड कीर्ति। अखंड पुण्य। अखंड प्रताप। अखंड यश। अखंड राज्य। अखंड वृष्टि। अखंड द्वादशी संज्ञा स्त्री॰ [सं॰ अखंडद्वादशी] अगहन सुदी द्वादशी। मार्गशीर्ष मास के शुक्ल पक्ष की बारहवीं तिथि [को॰] । अखंड सौभाग्य संज्ञा पुं॰ [सं॰ अखंड+सौभाग्यवती] जीवन पर्यत स्त्रियों के अविधवा होने का सौभाग्य। जीवन पर्यंत अविधवा रहने की स्थिति [को॰]। अखंड सौभाग्यवती वि॰ [सं॰ अखंड+सौभाग्यवती] जीवन पर्यंत सुहागिनी रहनेवाली [को॰]। [[श्रेणी: हिन्दी-प्रकाशितकोशों से अर्थ-शब्दसागर]] 6w4lmv0lub33r8oxzf91vtgr83tuse0 487731 487730 2026-09-02T14:01:50Z अजीत कुमार तिवारी 4887 487731 wikitext text/x-wiki {{-hi-}} == प्रकाशितकोशों से अर्थ == === शब्दसागर === अखंड वि॰ [सं॰ अखण्ड] <br><br>१. जिसके खंड या टुकड़े न हों। अटूट। अविछिन्न। संपूर्ण। समूचा। पूरा। उ॰—ज्ञान अखंड एक सीताबर। मायावस्य जीव सचराचर। —मानस, ७ ।७८ । <br><br>२. जिसका क्रम या सिलसिला न टूटे । जो बीच में न रुके । लगातर । अनवरत । उ॰—जहाँ अखंड़ शांति रहती है वहाँ ११ सदा स्वच्छंद रहें ।—प्रेम॰, पृ॰ ३२ । <br><br>३. निर्विघ्न । बेरोक । उ॰—रावन क्रोध अनल निज स्वास समीर प्रचंड । जरत बिभीषन राखेउ दीन्हेउ राज अखंड। —मानस ५ ।४९ । यौ॰—अखंड ऐश्वर्य। अखंड कीर्ति। अखंड पुण्य। अखंड प्रताप। अखंड यश। अखंड राज्य। अखंड वृष्टि। अखंड द्वादशी संज्ञा स्त्री॰ [सं॰ अखंडद्वादशी] अगहन सुदी द्वादशी। मार्गशीर्ष मास के शुक्ल पक्ष की बारहवीं तिथि [को॰] । अखंड सौभाग्य संज्ञा पुं॰ [सं॰ अखंड+सौभाग्यवती] जीवन पर्यत स्त्रियों के अविधवा होने का सौभाग्य। जीवन पर्यंत अविधवा रहने की स्थिति [को॰]। अखंड सौभाग्यवती वि॰ [सं॰ अखंड+सौभाग्यवती] जीवन पर्यंत सुहागिनी रहनेवाली [को॰]। [[श्रेणी: हिन्दी-प्रकाशितकोशों से अर्थ-शब्दसागर]] malfkishzyfng9qomgt5ppmevyfkw6z अखण्डनीय 0 140159 487725 390776 2026-09-02T13:56:18Z अजीत कुमार तिवारी 4887 अजीत कुमार तिवारी ने पृष्ठ [[अखण्ड़नीय]] को [[अखण्डनीय]] पर स्थानांतरित किया: शीर्षक में गलत वर्तनी 390776 wikitext text/x-wiki {{-hi-}} == प्रकाशितकोशों से अर्थ == === शब्दसागर === अखंड़नीय वि॰ [सं॰ अखण्ड़नीय] <br><br>१. जिसके टुकड़े न हो सकें ।जिसका खंड़ न हो सके । जो काटा न जा सके । <br><br>२. जिसके विरुद्ध न कहा जा सके । पुष्ट । अकाट्य । [[श्रेणी: हिन्दी-प्रकाशितकोशों से अर्थ-शब्दसागर]] gt9l6grzm0hill6i63380h9xfwoandw 487727 487725 2026-09-02T13:57:04Z अजीत कुमार तिवारी 4887 वर्तनी सुधार. 487727 wikitext text/x-wiki {{-hi-}} == प्रकाशितकोशों से अर्थ == === शब्दसागर === अखंडनीय वि॰ [सं॰ अखण्डनीय] <br><br>१. जिसके टुकड़े न हो सकें ।जिसका खंड न हो सके । जो काटा न जा सके । <br><br>२. जिसके विरुद्ध न कहा जा सके। पुष्ट। अकाट्य। [[श्रेणी: हिन्दी-प्रकाशितकोशों से अर्थ-शब्दसागर]] arjkcbdgt31qhza43trmowtwtakj4j9 मॉड्यूल:scripts 828 302126 487836 487620 2026-09-02T19:54:12Z SM7 6218 updating... 487836 Scribunto text/plain local export = {} local combining_classes_module = "Module:Unicode data/combining classes" local debug_track_module = "Module:debug/track" local json_module = "Module:JSON" local language_like_module = "Module:language-like" local load_module = "Module:load" local scripts_canonical_names_module = "Module:scripts/canonical names" local scripts_chartoscript_module = "Module:scripts/charToScript" local scripts_data_module = "Module:scripts/data" local string_utilities_module = "Module:string utilities" local table_module = "Module:table" local writing_systems_module = "Module:writing systems" local writing_systems_data_module = "Module:writing systems/data" local concat = table.concat local get_by_code -- Defined below. local gmatch = string.gmatch local insert = table.insert local make_object -- Defined below. local match = string.match local require = require local select = select local setmetatable = setmetatable local toNFC = mw.ustring.toNFC local toNFD = mw.ustring.toNFD local toNFKC = mw.ustring.toNFKC local toNFKD = mw.ustring.toNFKD 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 debug_track(...) debug_track = require(debug_track_module) return debug_track(...) end local function deep_copy(...) deep_copy = require(table_module).deepCopy return deep_copy(...) end local function explode(...) explode = require(string_utilities_module).explode_utf8 return explode(...) end local function get_writing_system(...) get_writing_system = require(writing_systems_module).getByCode return get_writing_system(...) 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 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 track(page) debug_track("scripts/" .. page) return true 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 scripts_canonical_names local function get_scripts_canonical_names() scripts_canonical_names, get_scripts_canonical_names = load_data(scripts_canonical_names_module), nil return scripts_canonical_names end local scripts_data local function get_scripts_data() scripts_data, get_scripts_data = load_data(scripts_data_module), nil return scripts_data end local scripts_suffixes local function get_scripts_suffixes() scripts_suffixes, get_scripts_suffixes = { "script", "code", "notation", "letters", "numerals", "semaphore", }, nil for _, v in pairs(load_data(writing_systems_data_module)) do insert(scripts_suffixes, v[1]) end return scripts_suffixes end local Script = {} Script.__index = Script --[==[Returns the script code of the script. Example: {{lua|"Cyrl"}} for Cyrillic.]==] function Script:getCode() return self._code end --[==[ Return the canonical name of the script. This is the name used to represent that script on Wiktionary. Example: {"Cyrillic"} for Cyrillic. If `lang` is specified and the script has a language-specific name, return that (e.g. {"Shahmukhi"} for script `Aran` with Punjabi and certain related languages); otherwise, return the default name (if the script has different names in different languages, e.g. {"Arabic"} for `Aran`), or the only name if there is only one. ]==] function Script:getCanonicalName(lang) local rawdata = self._data[1] if type(rawdata) == "string" then return rawdata end local name if lang then name = rawdata[lang:getCode()] if name then return name end name = rawdata[lang:getFullCode()] if name then return name end end name = rawdata.default if not name then error(("Internal error: no default key in script name table for script %s"):format(self:getCode())) end return name end --[==[ Return the table mapping languages to names for the script. If the script has only one name (as most scripts do), return a string consisting of that name. Otherwise, return a table mapping language codes to names, where the key named `default` contains the default name used for languages not specified in the table. ]==] function Script:getCanonicalNameTable() return self._data[1] end --[==[ Return all canonical names of the script. The default name is first. ]==] function Script:getCanonicalNames() local rawdata = self._data[1] if type(rawdata) == "string" then return {rawdata} end local names = {} for lang, name in pairs(rawdata) do if lang ~= "default" then require(table_module).insertIfNot(names, name) end end table.sort(names) require(table_module).insertIfNot(names, rawdata.default, {pos = 1}) return names end --[==[ Return the display form of the script. For scripts, this is the same as the value returned by {:getCategoryName("nocap")}, i.e. 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. If the script has different names in different languages (e.g. `Aran`, which is called {"Shahmukhi"} in Punjabi and certain related languages but otherwise {"Arabic"}), and `lang` is given, return the language-specific name; otherwise return the default or only name. ]==] function Script:getDisplayForm(lang) return self:getCategoryName("nocap", lang) end function Script:getAliases() Script.getAliases = require(language_like_module).getAliases return self:getAliases() end function Script:getVarieties(flatten) Script.getVarieties = require(language_like_module).getVarieties return self:getVarieties(flatten) end function Script:getOtherNames() Script.getOtherNames = require(language_like_module).getOtherNames return self:getOtherNames() end function Script:getAllNames() Script.getAllNames = require(language_like_module).getAllNames return self:getAllNames() end --[==[Returns the {{w|IETF language tag#Syntax of language tags|IETF subtag}} used for the script, which should always be a valid {{w|ISO 15924}} script code. This is used when constructing HTML {{code|html|lang{{=}}}} tags. The {{lua|ietf_subtag}} value from the script's data file is used, if present; otherwise, the script code is used. For script codes which contain a hyphen, only the part after the hyphen is used (e.g. {{lua|"fa-Arab"}} becomes {{lua|"Arab"}}).]==] function Script:getIETFSubtag() local code = self._ietf_subtag if code == nil then code = self._data.ietf_subtag or match(self:getCode(), "[^%-]+$") self._ietf_subtag = code end return code end --[==[Returns a script object for the parent of the script, such as {"Arab"} for {"fa-Arab"}. It returns {nil} for scripts without a parent, like {"Latn"}, {"Grek"}, etc.]==] function Script: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) or false self._parentObject = parent end return parent or nil end --[==[Returns the script code of the parent of the script, such as {"Arab"} for {"fa-Arab"}. It returns {nil} for scripts without a parent, like {"Latn"}, {"Grek"}, etc.]==] function Script: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 Script:getSystemCodes() if not self._systemCodes then local system_codes = self._data[3] if type(system_codes) == "table" then self._systemCodes = system_codes elseif type(system_codes) == "string" then self._systemCodes = split(system_codes, ",", true, true) else self._systemCodes = {} end end return self._systemCodes end function Script:getSystems() if not self._systemObjects then self._systemObjects = {} for _, system in ipairs(self:getSystemCodes()) do insert(self._systemObjects, get_writing_system(system)) end end return self._systemObjects end --[==[Check whether the script is of type `system`, which can be a writing system code or object. If multiple systems are passed, return true if the script is any of the specified systems.]==] function Script:isSystem(...) for _, system in ipairs{...} do if type(system) == "table" then system = system:getCode() end for _, s in ipairs(self:getSystemCodes()) do if system == s then return true end end end return false end --[==[Returns a table of types as a lookup table (with the types as keys). Currently, the only possible type is {script}.]==] function Script:getTypes() local types = self._types if types == nil then types = {script = 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 script has all of them. Use {{lua|hasType("script")}} to determine if an object that may be a language, family or script is a script.]==] function Script:hasType(...) Script.hasType = require(language_like_module).hasType return self:hasType(...) end --[==[ Return the name of the main category of that script. Example: {"Cyrillic script"} for Cyrillic, whose category is at [[:Category:Cyrillic script]]. Unless optional argument `nocap` is given, the script name at the beginning of the returned value will be capitalized. This capitalization is correct for category names, but not if the script name is lowercase and the returned value of this function is used in the middle of a sentence. (For example, the script with the code `Semap` has the name {"flag semaphore"}, which should remain lowercase when used as part of the category name [[:Category:Translingual letters in flag semaphore]] but should be capitalized in [[:Category:Flag semaphore templates]].) If you are considering using {getCategoryName("nocap")}, use {getDisplayForm()} instead. If the script has different names in different languages (e.g. `Aran`, which is called {"Shahmukhi"} in Punjabi and certain related languages but otherwise {"Arabic"}), and `lang` is given, return the language-specific name; otherwise return the default or only name. ]==] function Script:getCategoryName(nocap, lang) local name = self:getCanonicalName(lang) if category_name_has_suffix(name, scripts_suffixes or get_scripts_suffixes()) then name = name .. " script" end if not nocap then name = mw.getContentLanguage():ucfirst(name) end return name end --[==[ Return a link to the appropriate category for the script, displaying using the display form of the script. For example, `Cyrl` returns `[[:Category:Cyrillic script|Cyrillic script]]`. The display form is not automatically capitalized, so e.g. the script code `Semap` will return `[[:Category:Flag semaphore|flag semaphore]]`. If the script has different names in different languages (e.g. `Aran`, which is called {"Shahmukhi"} in Punjabi and certain related languages but otherwise {"Arabic"}), and `lang` is given, return the language-specific name; otherwise return the default or only name. ]==] function Script:makeCategoryLink(lang) return "[[:Category:" .. self:getCategoryName(lang) .. "|" .. self:getDisplayForm(lang) .. "]]" end --[==[Returns the Wikidata item id for the script or <code>nil</code>. This corresponds to the the second field in the data modules.]==] function Script:getWikidataItem() Script.getWikidataItem = require(language_like_module).getWikidataItem return self:getWikidataItem() end --[==[ Returns the name of the Wikipedia article for the script. `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 script's category, but this won't normally happen for any other project. ]==] function Script:getWikipediaArticle(noCategoryFallback, project) Script.getWikipediaArticle = require(language_like_module).getWikipediaArticle return self:getWikipediaArticle(noCategoryFallback, project) end --[==[Returns the name of the Wikimedia Commons category page for the script.]==] function Script:getCommonsCategory() Script.getCommonsCategory = require(language_like_module).getCommonsCategory return self:getCommonsCategory() end --[==[Returns the charset defining the script's characters from the script's data file. This can be used to search for words consisting only of this script, but see the warning above.]==] function Script:getCharacters() return self.characters or nil end --[==[Returns the number of characters in the text that are part of this script. '''Note:''' You should never assume that text consists entirely of the same script. Strings may contain spaces, punctuation and even wiki markup or HTML tags. HTML tags will skew the counts, as they contain Latin-script characters. So it's best to avoid them.]==] function Script:countCharacters(text) local charset = self._data.characters if charset == nil then return 0 end return select(2, ugsub(text, "[" .. charset .. "]", "")) end function Script:hasCapitalization() return not not self._data.capitalized end function Script:hasSpaces() return self._data.spaces ~= false end function Script:isTransliterated() return self._data.translit ~= false end --[==[Returns true if the script is (sometimes) sorted by scraping page content, meaning that it is sensitive to changes in capitalization during sorting.]==] function Script:sortByScraping() return not not self._data.sort_by_scraping end --[==[Returns the text direction. Horizontal scripts return {{lua|"ltr"}} (left-to-right) or {{lua|"rtl"}} (right-to-left), while vertical scripts return {{lua|"vertical-ltr"}} (vertical left-to-right) or {{lua|"vertical-rtl"}} (vertical right-to-left).]==] function Script:getDirection() return self._data.direction or "ltr" end function Script:getData() return self._data end --[==[Returns the name of the module containing the script's data. Currently, this is always [[Module:scripts/data]].]==] function Script:getDataModuleName() return scripts_data_module end --[==[Returns {{lua|true}} if the script contains characters that require fixes to Unicode normalization under certain circumstances, {{lua|false}} if it doesn't.]==] function Script:hasNormalizationFixes() return not not self._data.normalizationFixes end --[==[Corrects discouraged sequences of Unicode characters to the encouraged equivalents.]==] function Script:fixDiscouragedSequences(text) if self:hasNormalizationFixes() then local norm_fixes = self._data.normalizationFixes local to = norm_fixes.to if to then for i, v in ipairs(norm_fixes.from) do text = ugsub(text, v, to[i] or "") end end end return text end do local combining_classes -- Obtain the list of default combining classes. local function get_combining_classes() combining_classes, get_combining_classes = load_data(combining_classes_module), nil return combining_classes end -- Implements a modified form of Unicode normalization for instances where there are identified deficiencies in the default Unicode combining classes. local function fixNormalization(text, self) if not self:hasNormalizationFixes() then return text end local norm_fixes = self._data.normalizationFixes local new_classes = norm_fixes.combiningClasses if not (new_classes and umatch(text, "[" .. norm_fixes.combiningClassCharacters .. "]")) then return text end text = explode(text) -- Manual sort based on new combining classes. -- We can't use table.sort, as it compares the first/last values in an array as a shortcut, which messes things up. for i = 2, #text do local char = text[i] local class = new_classes[char] or (combining_classes or get_combining_classes())[char] if class then repeat i = i - 1 local prev = text[i] if (new_classes[prev] or (combining_classes or get_combining_classes())[prev] or 0) < class then break end text[i], text[i + 1] = char, prev until i == 1 end end return concat(text) end function Script:toFixedNFC(text) return fixNormalization(toNFC(text), self) end function Script:toFixedNFD(text) return fixNormalization(toNFD(text), self) end function Script:toFixedNFKC(text) return fixNormalization(toNFKC(text), self) end function Script:toFixedNFKD(text) return fixNormalization(toNFKD(text), self) end end function Script:toJSON(opts) local ret = { canonicalName = self:getCanonicalName(), canonicalNameTable = self:getCanonicalNameTable(), categoryName = self:getCategoryName("nocap"), code = self:getCode(), parent = self:getParentCode(), systems = self:getSystemCodes(), aliases = self:getAliases(), varieties = self:getVarieties(), otherNames = self:getOtherNames(), type = keys_to_list(self:getTypes()), direction = self:getDirection(), characters = self:getCharacters(), ietfSubtag = self:getIETFSubtag(), 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.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, characters = data.characters}, Script) end make_object = export.makeObject local scripts_to_track = { ["fa-Arab"] = true, ["kk-Arab"] = true, ["ks-Arab"] = true, ["ku-Arab"] = true, ["ms-Arab"] = true, ["mzn-Arab"] = true, ["ota-Arab"] = true, ["pa-Arab"] = true, ["ps-Arab"] = true, ["sd-Arab"] = true, ["tt-Arab"] = true, ["ug-Arab"] = true, ["ur-Arab"] = true, } --[==[ Finds the script whose code matches the one provided. If it exists, it returns a {Script} object representing the script. Otherwise, it returns {nil}.]==] function export.getByCode(code) if scripts_to_track[code] then track(code) end local data = (scripts_data or get_scripts_data())[code] return data ~= nil and make_object(code, data) or nil end get_by_code = export.getByCode --[==[ Look for the script whose canonical name (the name used to represent that script on Wiktionary) matches the one provided. If it exists, it returns a {Script} object representing the script. Otherwise, it returns {nil}. The canonical name of scripts should always be unique (it is an error for two scripts 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 = (scripts_canonical_names or get_scripts_canonical_names())[name] if code == nil then return nil end return get_by_code(code) end --[==[ Look for the script whose category name (the name used in categories for that script) matches the one provided. If it exists, it returns a {Script} object representing the script. Otherwise, it returns {nil}. In almost all cases, the category name for a script is its canonical name plus the word "script", e.g. "Cyrillic" has the category name "Cyrillic script". Where a canonical name ends with "script", "code" or "semaphore", the category name is identical to the canonical name. ]==] function export.getByCategoryName(name) if name == nil then return nil end local code, canonical_name = category_name_to_code( name, " script", scripts_canonical_names or get_scripts_canonical_names(), scripts_suffixes or get_scripts_suffixes() ) if code == nil then return nil, nil end return get_by_code(code), canonical_name end --[==[ Convert a canonical name to the corresponding category name. Unless optional argument `nocap` is given, the script name at the beginning of the returned value will be capitalized. See {:getCategoryName()} for more discussion. ]==] function export.canonicalNameToCategoryName(name, nocap) if category_name_has_suffix(name, scripts_suffixes or get_scripts_suffixes()) then name = name .. " script" end if not nocap then name = mw.getContentLanguage():ucfirst(name) end return name end --[==[ Takes a codepoint or a character and finds the script code (if any) that is 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]]. Converts the character to a codepoint. Returns a 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, else returns "None". ]==] function export.charToScript(char) export.charToScript = require(scripts_chartoscript_module).charToScript return export.charToScript(char) end --[==[ Returns the code for the script that has the greatest number of characters in `text`. Useful for script tagging text that is unspecified for language. Uses [[Module:scripts/recognition data]] to determine a script code for a character language-agnostically. Specifically, it works as follows: Convert each character to a codepoint. Increment 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 export.findBestScriptWithoutLang(text, none_is_last_resort_only) export.findBestScriptWithoutLang = require(scripts_chartoscript_module).findBestScriptWithoutLang return export.findBestScriptWithoutLang(text, none_is_last_resort_only) end return export io3j9hrdqyxoerkjf8e2y02nar9stid मॉड्यूल:scripts/data 828 302127 487837 487549 2026-09-02T19:55:42Z SM7 6218 updating... 487837 Scribunto text/plain --[=[ When adding new scripts to this file, please don't forget to add style definitons for the script in [[MediaWiki:Gadget-LanguagesAndScripts.css]]. ]=] local concat = table.concat local insert = table.insert local ipairs = ipairs local next = next local remove = table.remove local select = select local sort = table.sort -- Loaded on demand, as it may not be needed (depending on the data). local function u(...) u = require("Module:string/char") return u(...) end -- We can't use mw.loadData() on [[Module:languages/chars]] because [[Module:languages/data]] itself is sometimes loaded -- using mw.loadData(), and calling mw.loadData() on [[Module:languages/chars]] will insert metatables into the -- character tables, which the second mw.loadData() will choke on. local m_chars = require("Module:languages/chars") local c = m_chars.chars local p = m_chars.puaChars local cs = m_chars.chars_substitutions ------------------------------------------------------------------------------------ -- -- Helper functions -- ------------------------------------------------------------------------------------ -- Note: a[2] > b[2] means opens are sorted before closes if otherwise equal. local function sort_ranges(a, b) return a[1] < b[1] or a[1] == b[1] and a[2] > b[2] end -- Returns the union of two or more range tables. local function union(...) local ranges = {} for i = 1, select("#", ...) do local argt = select(i, ...) for j, v in ipairs(argt) do insert(ranges, {v, j % 2 == 1 and 1 or -1}) end end sort(ranges, sort_ranges) local ret, i = {}, 0 for _, range in ipairs(ranges) do i = i + range[2] if i == 0 and range[2] == -1 then -- close insert(ret, range[1]) elseif i == 1 and range[2] == 1 then -- open if ret[#ret] and range[1] <= ret[#ret] + 1 then remove(ret) -- merge adjacent ranges else insert(ret, range[1]) end end end return ret end -- Adds the `characters` key, which is determined by a script's `ranges` table. local function process_ranges(sc) local ranges, chars = sc.ranges, {} for i = 2, #ranges, 2 do if ranges[i] == ranges[i - 1] then insert(chars, u(ranges[i])) else insert(chars, u(ranges[i - 1])) if ranges[i] > ranges[i - 1] + 1 then insert(chars, "-") end insert(chars, u(ranges[i])) end end sc.characters = concat(chars) ranges.n = #ranges return sc end local function handle_normalization_fixes(fixes) local combiningClasses = fixes.combiningClasses if combiningClasses then local chars, i = {}, 0 for char in next, combiningClasses do i = i + 1 chars[i] = char end fixes.combiningClassCharacters = concat(chars) end return fixes end ------------------------------------------------------------------------------------ -- -- Data -- ------------------------------------------------------------------------------------ local m = {} m["Adlm"] = process_ranges{ "Adlam", 19606346, "alphabet", ranges = { 0x061F, 0x061F, 0x0640, 0x0640, 0x1E900, 0x1E94B, 0x1E950, 0x1E959, 0x1E95E, 0x1E95F, }, capitalized = true, direction = "rtl", } m["Afak"] = { "Afaka", 382019, "syllabary", -- Not in Unicode } m["Aghb"] = process_ranges{ "Caucasian Albanian", 2495716, "alphabet", ranges = { 0x10530, 0x10563, 0x1056F, 0x1056F, }, } m["Ahom"] = process_ranges{ "Ahom", 2839633, "abugida", ranges = { 0x11700, 0x1171A, 0x1171D, 0x1172B, 0x11730, 0x11746, }, } m["Arab"] = process_ranges{ "Arabic", 1828555, "abjad", -- more precisely, impure abjad varieties = {"Jawi", "Perso-Arabic", "Sulat Sūg"}, ranges = { 0x0600, 0x06FF, 0x0750, 0x077F, 0x0870, 0x088E, 0x0890, 0x0891, 0x0897, 0x08E1, 0x08E3, 0x08FF, 0xFB50, 0xFBC2, 0xFBD3, 0xFD8F, 0xFD92, 0xFDC7, 0xFDCF, 0xFDCF, 0xFDF0, 0xFDFF, 0xFE70, 0xFE74, 0xFE76, 0xFEFC, 0x102E0, 0x102FB, 0x10E60, 0x10E7E, 0x10EC2, 0x10EC4, 0x10EFC, 0x10EFF, 0x1EE00, 0x1EE03, 0x1EE05, 0x1EE1F, 0x1EE21, 0x1EE22, 0x1EE24, 0x1EE24, 0x1EE27, 0x1EE27, 0x1EE29, 0x1EE32, 0x1EE34, 0x1EE37, 0x1EE39, 0x1EE39, 0x1EE3B, 0x1EE3B, 0x1EE42, 0x1EE42, 0x1EE47, 0x1EE47, 0x1EE49, 0x1EE49, 0x1EE4B, 0x1EE4B, 0x1EE4D, 0x1EE4F, 0x1EE51, 0x1EE52, 0x1EE54, 0x1EE54, 0x1EE57, 0x1EE57, 0x1EE59, 0x1EE59, 0x1EE5B, 0x1EE5B, 0x1EE5D, 0x1EE5D, 0x1EE5F, 0x1EE5F, 0x1EE61, 0x1EE62, 0x1EE64, 0x1EE64, 0x1EE67, 0x1EE6A, 0x1EE6C, 0x1EE72, 0x1EE74, 0x1EE77, 0x1EE79, 0x1EE7C, 0x1EE7E, 0x1EE7E, 0x1EE80, 0x1EE89, 0x1EE8B, 0x1EE9B, 0x1EEA1, 0x1EEA3, 0x1EEA5, 0x1EEA9, 0x1EEAB, 0x1EEBB, 0x1EEF0, 0x1EEF1, }, direction = "rtl", normalizationFixes = handle_normalization_fixes{ from = {"ٳ"}, to = {"اٟ"} }, } m["Aran"] = { { hnd = "Shahmukhi", -- Southern Hindko hno = "Shahmukhi", -- Northern Hindko ["inc-opa"] = "Shahmukhi", -- Old Punjabi lah = "Shahmukhi", -- Lahnda pa = "Shahmukhi", -- Punjabi phr = "Shahmukhi", -- Pahari-Potwari skr = "Shahmukhi", -- Saraiki default = "Arabic", }, 1133121, -- FIXME: 133800 for Shahmukhi m["Arab"][3], ranges = m["Arab"].ranges, characters = m["Arab"].characters, aliases = {"Nastaliq", "Nastaleeq"}, direction = "rtl", parent = "Arab", normalizationFixes = m["Arab"].normalizationFixes, } m["Armi"] = process_ranges{ "Imperial Aramaic", 26978, "abjad", ranges = { 0x10840, 0x10855, 0x10857, 0x1085F, }, direction = "rtl", } m["Armn"] = process_ranges{ "Armenian", 11932, "alphabet", ranges = { 0x0531, 0x0556, 0x0559, 0x058A, 0x058D, 0x058F, 0xFB13, 0xFB17, }, capitalized = true, translit = "Armn-translit", } m["Avst"] = process_ranges{ "Avestan", 790681, "alphabet", ranges = { 0x10B00, 0x10B35, 0x10B39, 0x10B3F, }, direction = "rtl", } m["pal-Avst"] = { "Pazend", 4925073, m["Avst"][3], ranges = m["Avst"].ranges, characters = m["Avst"].characters, direction = "rtl", parent = "Avst", } m["Bali"] = process_ranges{ "Balinese", 804984, "abugida", ranges = { 0x1B00, 0x1B4C, 0x1B4E, 0x1B7F, }, } m["Bamu"] = process_ranges{ "Bamum", 806024, "syllabary", ranges = { 0xA6A0, 0xA6F7, 0x16800, 0x16A38, }, } m["Bass"] = process_ranges{ "Bassa", 810458, "alphabet", aliases = {"Bassa Vah", "Vah"}, ranges = { 0x16AD0, 0x16AED, 0x16AF0, 0x16AF5, }, } m["Batk"] = process_ranges{ "Batak", 51592, "abugida", ranges = { 0x1BC0, 0x1BF3, 0x1BFC, 0x1BFF, }, } m["Beng"] = process_ranges{ "Bengali", 756802, "abugida", ranges = { 0x0951, 0x0952, 0x0964, 0x0965, 0x0980, 0x0983, 0x0985, 0x098C, 0x098F, 0x0990, 0x0993, 0x09A8, 0x09AA, 0x09B0, 0x09B2, 0x09B2, 0x09B6, 0x09B9, 0x09BC, 0x09C4, 0x09C7, 0x09C8, 0x09CB, 0x09CE, 0x09D7, 0x09D7, 0x09DC, 0x09DD, 0x09DF, 0x09E3, 0x09E6, 0x09EF, 0x09F2, 0x09FE, 0x1CD0, 0x1CD0, 0x1CD2, 0x1CD2, 0x1CD5, 0x1CD6, 0x1CD8, 0x1CD8, 0x1CE1, 0x1CE1, 0x1CEA, 0x1CEA, 0x1CED, 0x1CED, 0x1CF2, 0x1CF2, 0x1CF5, 0x1CF7, 0xA8F1, 0xA8F1, }, normalizationFixes = handle_normalization_fixes{ from = {"অা", "ঋৃ", "ঌৢ"}, to = {"আ", "ৠ", "ৡ"} }, } m["as-Beng"] = process_ranges{ "Assamese", 191272, m["Beng"][3], other_names = {"Eastern Nagari"}, ranges = { 0x0951, 0x0952, 0x0964, 0x0965, 0x0980, 0x0983, 0x0985, 0x098C, 0x098F, 0x0990, 0x0993, 0x09A8, 0x09AA, 0x09AF, 0x09B2, 0x09B2, 0x09B6, 0x09B9, 0x09BC, 0x09C4, 0x09C7, 0x09C8, 0x09CB, 0x09CE, 0x09D7, 0x09D7, 0x09DC, 0x09DD, 0x09DF, 0x09E3, 0x09E6, 0x09FE, 0x1CD0, 0x1CD0, 0x1CD2, 0x1CD2, 0x1CD5, 0x1CD6, 0x1CD8, 0x1CD8, 0x1CE1, 0x1CE1, 0x1CEA, 0x1CEA, 0x1CED, 0x1CED, 0x1CF2, 0x1CF2, 0x1CF5, 0x1CF7, 0xA8F1, 0xA8F1, }, normalizationFixes = m["Beng"].normalizationFixes, } m["Bhks"] = process_ranges{ "Bhaiksuki", 17017839, "abugida", ranges = { 0x11C00, 0x11C08, 0x11C0A, 0x11C36, 0x11C38, 0x11C45, 0x11C50, 0x11C6C, }, } m["Blis"] = { "Blissymbolic", 609817, "logography", aliases = {"Blissymbols"}, -- Not in Unicode } m["Bopo"] = process_ranges{ "Zhuyin", 198269, "semisyllabary", aliases = {"Zhuyin Fuhao", "Bopomofo"}, ranges = { 0x02EA, 0x02EB, 0x3001, 0x3003, 0x3008, 0x3011, 0x3013, 0x301F, 0x302A, 0x302D, 0x3030, 0x3030, 0x3037, 0x3037, 0x30FB, 0x30FB, 0x3105, 0x312F, 0x31A0, 0x31BF, 0xFE45, 0xFE46, 0xFF61, 0xFF65, }, } m["Brah"] = process_ranges{ "Brahmi", 185083, "abugida", ranges = { 0x11000, 0x1104D, 0x11052, 0x11075, 0x1107F, 0x1107F, }, normalizationFixes = handle_normalization_fixes{ from = {"𑀅𑀸", "𑀋𑀾", "𑀏𑁂"}, to = {"𑀆", "𑀌", "𑀐"} }, translit = "Brah-translit", } m["Brai"] = process_ranges{ "Braille", 79894, "alphabet", ranges = { 0x2800, 0x28FF, }, } m["Bugi"] = process_ranges{ "Lontara", 1074947, "abugida", aliases = {"Buginese"}, ranges = { 0x1A00, 0x1A1B, 0x1A1E, 0x1A1F, 0xA9CF, 0xA9CF, }, } m["Buhd"] = process_ranges{ "Buhid", 1002969, "abugida", ranges = { 0x1735, 0x1736, 0x1740, 0x1751, 0x1752, 0x1753, }, } m["Cakm"] = process_ranges{ "Chakma", 1059328, "abugida", ranges = { 0x09E6, 0x09EF, 0x1040, 0x1049, 0x11100, 0x11134, 0x11136, 0x11147, }, } m["Cans"] = process_ranges{ "Canadian syllabic", 2479183, "abugida", ranges = { 0x1400, 0x167F, 0x18B0, 0x18F5, 0x11AB0, 0x11ABF, }, } m["Cari"] = process_ranges{ "Carian", 1094567, "alphabet", ranges = { 0x102A0, 0x102D0, }, } m["Cham"] = process_ranges{ "Cham", 1060381, "abugida", ranges = { 0xAA00, 0xAA36, 0xAA40, 0xAA4D, 0xAA50, 0xAA59, 0xAA5C, 0xAA5F, }, } m["Cher"] = process_ranges{ "Cherokee", 26549, "syllabary", ranges = { 0x13A0, 0x13F5, 0x13F8, 0x13FD, 0xAB70, 0xABBF, }, } m["Chis"] = { "Chisoi", 123173777, "abugida", -- Not in Unicode } m["Chrs"] = process_ranges{ "Khwarezmian", 72386710, "abjad", aliases = {"Chorasmian"}, ranges = { 0x10FB0, 0x10FCB, }, direction = "rtl", } m["Copt"] = process_ranges{ "Coptic", 321083, "alphabet", ranges = { 0x03E2, 0x03EF, 0x2C80, 0x2CF3, 0x2CF9, 0x2CFF, 0x102E0, 0x102FB, }, capitalized = true, } m["Cpmn"] = process_ranges{ "Cypro-Minoan", 1751985, "syllabary", aliases = {"Cypro Minoan"}, ranges = { 0x10100, 0x10101, 0x12F90, 0x12FF2, }, } m["Cprt"] = process_ranges{ "Cypriot", 1757689, "syllabary", ranges = { 0x10100, 0x10102, 0x10107, 0x10133, 0x10137, 0x1013F, 0x10800, 0x10805, 0x10808, 0x10808, 0x1080A, 0x10835, 0x10837, 0x10838, 0x1083C, 0x1083C, 0x1083F, 0x1083F, }, direction = "rtl", } m["Cyrl"] = process_ranges{ "Cyrillic", 8209, "alphabet", ranges = { 0x0400, 0x052F, 0x1C80, 0x1C8A, 0x1D2B, 0x1D2B, 0x1D78, 0x1D78, 0x1DF8, 0x1DF8, 0x2DE0, 0x2DFF, 0x2E43, 0x2E43, 0xA640, 0xA69F, 0xFE2E, 0xFE2F, 0x1E030, 0x1E06D, 0x1E08F, 0x1E08F, }, capitalized = true, } m["Cyrs"] = { "Old Cyrillic", 442244, m["Cyrl"][3], aliases = {"Early Cyrillic"}, ranges = m["Cyrl"].ranges, characters = m["Cyrl"].characters, capitalized = m["Cyrl"].capitalized, wikipedia_article = "Early Cyrillic alphabet", normalizationFixes = handle_normalization_fixes{ from = {"Ѹ", "ѹ"}, to = {"Ꙋ", "ꙋ"} }, strip_diacritics = {remove_diacritics = cs.Cyrs_remove_diacritics}, sort_key = { remove_diacritics = cs.Cyrs_remove_diacritics, from = { "ї", "оу", -- 2 chars "[ґꙣєѕꙃꙅꙁіꙇђꙉѻꙩꙫꙭꙮꚙꚛꙋѡѿꙍѽꙑѣꙗѥꙕѧꙙѩꙝꙛѫѭѯѱѳѵҁ]" }, to = { "и" .. p[1], "у", { ["ґ"] = "г" .. p[1], ["ꙣ"] = "д" .. p[1], ["є"] = "е", ["ѕ"] = "ж" .. p[1], ["ꙃ"] = "ж" .. p[1], ["ꙅ"] = "ж" .. p[1], ["ꙁ"] = "з", ["і"] = "и" .. p[1], ["ꙇ"] = "и" .. p[1], ["ђ"] = "и" .. p[2], ["ꙉ"] = "и" .. p[2], ["ѻ"] = "о", ["ꙩ"] = "о", ["ꙫ"] = "о", ["ꙭ"] = "о", ["ꙮ"] = "о", ["ꚙ"] = "о", ["ꚛ"] = "о", ["ꙋ"] = "у", ["ѡ"] = "х" .. p[1], ["ѿ"] = "х" .. p[1], ["ꙍ"] = "х" .. p[1], ["ѽ"] = "х" .. p[1], ["ꙑ"] = "ы", ["ѣ"] = "ь" .. p[1], ["ꙗ"] = "ь" .. p[2], ["ѥ"] = "ь" .. p[3], ["ꙕ"] = "ю", ["ѧ"] = "я", ["ꙙ"] = "я", ["ѩ"] = "я" .. p[1], ["ꙝ"] = "я" .. p[1], ["ꙛ"] = "я" .. p[2], ["ѫ"] = "я" .. p[3], ["ѭ"] = "я" .. p[4], ["ѯ"] = "я" .. p[5], ["ѱ"] = "я" .. p[6], ["ѳ"] = "я" .. p[7], ["ѵ"] = "я" .. p[8], ["ҁ"] = "я" .. p[9], } }, } } m["Deva"] = process_ranges{ { ahr = "Balbodh", -- Ahirani kfq = "Balbodh", -- Korku kok = "Balbodh", -- Konkani mr = "Balbodh", -- Marathi omr = "Balbodh", -- Old Marathi vah = "Balbodh", -- Varhadi default = "Devanagari", }, 38592, -- FIXME: 16948817 for Balbodh "abugida", ranges = { 0x0900, 0x097F, 0x1CD0, 0x1CF6, 0x1CF8, 0x1CF9, 0x20F0, 0x20F0, 0xA830, 0xA839, 0xA8E0, 0xA8FF, 0x11B00, 0x11B09, }, normalizationFixes = handle_normalization_fixes{ from = {"ॆॆ", "ेे", "ाॅ", "ाॆ", "ाꣿ", "ॊॆ", "ाे", "ाै", "ोे", "ाऺ", "ॖॖ", "अॅ", "अॆ", "अा", "एॅ", "एॆ", "एे", "एꣿ", "ऎॆ", "अॉ", "आॅ", "अॊ", "आॆ", "अो", "आे", "अौ", "आै", "ओे", "अऺ", "अऻ", "आऺ", "अाꣿ", "आꣿ", "ऒॆ", "अॖ", "अॗ", "ॶॖ", "्‍?ा"}, to = {"ꣿ", "ै", "ॉ", "ॊ", "ॏ", "ॏ", "ो", "ौ", "ौ", "ऻ", "ॗ", "ॲ", "ऄ", "आ", "ऍ", "ऎ", "ऐ", "ꣾ", "ꣾ", "ऑ", "ऑ", "ऒ", "ऒ", "ओ", "ओ", "औ", "औ", "औ", "ॳ", "ॴ", "ॴ", "ॵ", "ॵ", "ॵ", "ॶ", "ॷ", "ॷ"} }, } m["Diak"] = process_ranges{ "Dhives Akuru", 3307073, "abugida", aliases = {"Dhivehi Akuru", "Dives Akuru", "Divehi Akuru"}, ranges = { 0x11900, 0x11906, 0x11909, 0x11909, 0x1190C, 0x11913, 0x11915, 0x11916, 0x11918, 0x11935, 0x11937, 0x11938, 0x1193B, 0x11946, 0x11950, 0x11959, }, } m["Dogr"] = process_ranges{ "Dogra", 72402987, "abugida", ranges = { 0x0964, 0x096F, 0xA830, 0xA839, 0x11800, 0x1183B, }, } m["Dsrt"] = process_ranges{ "Deseret", 1200582, "alphabet", ranges = { 0x10400, 0x1044F, }, capitalized = true, } m["Dupl"] = process_ranges{ "Duployan", 5316025, "alphabet", ranges = { 0x1BC00, 0x1BC6A, 0x1BC70, 0x1BC7C, 0x1BC80, 0x1BC88, 0x1BC90, 0x1BC99, 0x1BC9C, 0x1BCA3, }, } m["Egyd"] = { "Demotic", 188519, "abjad, logography", -- Not in Unicode } m["Egyh"] = { "Hieratic", 208111, "abjad, logography", -- Unified with Egyptian hieroglyphic in Unicode } m["Egyp"] = process_ranges{ "Egyptian hieroglyphic", 132659, "abjad, logography", ranges = { 0x13000, 0x13455, 0x13460, 0x143FA, }, varieties = {"Hieratic"}, wikipedia_article = "Egyptian hieroglyphs", normalizationFixes = handle_normalization_fixes{ from = {"𓃁", "𓆖"}, to = {"𓃀𓐶𓂝", "𓆓𓐳𓐷𓏏𓐰𓇿𓐸"} }, } m["Elba"] = process_ranges{ "Elbasan", 1036714, "alphabet", ranges = { 0x10500, 0x10527, }, } m["Elym"] = process_ranges{ "Elymaic", 60744423, "abjad", ranges = { 0x10FE0, 0x10FF6, }, direction = "rtl", } m["Ethi"] = process_ranges{ "Ethiopic", 257634, "abugida", aliases = {"Ge'ez", "Geʽez"}, ranges = { 0x1200, 0x1248, 0x124A, 0x124D, 0x1250, 0x1256, 0x1258, 0x1258, 0x125A, 0x125D, 0x1260, 0x1288, 0x128A, 0x128D, 0x1290, 0x12B0, 0x12B2, 0x12B5, 0x12B8, 0x12BE, 0x12C0, 0x12C0, 0x12C2, 0x12C5, 0x12C8, 0x12D6, 0x12D8, 0x1310, 0x1312, 0x1315, 0x1318, 0x135A, 0x135D, 0x137C, 0x1380, 0x1399, 0x2D80, 0x2D96, 0x2DA0, 0x2DA6, 0x2DA8, 0x2DAE, 0x2DB0, 0x2DB6, 0x2DB8, 0x2DBE, 0x2DC0, 0x2DC6, 0x2DC8, 0x2DCE, 0x2DD0, 0x2DD6, 0x2DD8, 0x2DDE, 0xAB01, 0xAB06, 0xAB09, 0xAB0E, 0xAB11, 0xAB16, 0xAB20, 0xAB26, 0xAB28, 0xAB2E, 0x1E7E0, 0x1E7E6, 0x1E7E8, 0x1E7EB, 0x1E7ED, 0x1E7EE, 0x1E7F0, 0x1E7FE, }, sort_key = "Ethi-sortkey", strip_diacritics = {remove_diacritics = u(0x135D) .. u(0x135E) .. u(0x135F)} } m["Gara"] = process_ranges{ "Garay", 3095302, "alphabet", capitalized = true, direction = "rtl", ranges = { 0x060C, 0x060C, 0x061B, 0x061B, 0x061F, 0x061F, 0x10D40, 0x10D65, 0x10D69, 0x10D85, 0x10D8E, 0x10D8F, }, } m["Geok"] = process_ranges{ "Khutsuri", 1090055, "alphabet", ranges = { -- Ⴀ-Ⴭ is Asomtavruli, ⴀ-ⴭ is Nuskhuri 0x10A0, 0x10C5, 0x10C7, 0x10C7, 0x10CD, 0x10CD, 0x10FB, 0x10FB, 0x2D00, 0x2D25, 0x2D27, 0x2D27, 0x2D2D, 0x2D2D, }, varieties = {"Nuskhuri", "Asomtavruli"}, capitalized = true, translit = "Geok-translit", } m["Geor"] = process_ranges{ "Georgian", 3317411, "alphabet", ranges = { -- ა-ჿ is lowercase Mkhedruli; Ა-Ჿ is uppercase Mkhedruli (Mtavruli) 0x0589, 0x0589, 0x10D0, 0x10FF, 0x1C90, 0x1CBA, 0x1CBD, 0x1CBF, }, varieties = {"Mkhedruli", "Mtavruli"}, capitalized = true, translit = "Geor-translit", } m["Glag"] = process_ranges{ "Glagolitic", 145625, "alphabet", ranges = { 0x0484, 0x0484, 0x0487, 0x0487, 0x0589, 0x0589, 0x10FB, 0x10FB, 0x2C00, 0x2C5F, 0x2E43, 0x2E43, 0xA66F, 0xA66F, 0x1E000, 0x1E006, 0x1E008, 0x1E018, 0x1E01B, 0x1E021, 0x1E023, 0x1E024, 0x1E026, 0x1E02A, }, capitalized = true, } m["Gong"] = process_ranges{ "Gunjala Gondi", 18125340, "abugida", ranges = { 0x0964, 0x0965, 0x11D60, 0x11D65, 0x11D67, 0x11D68, 0x11D6A, 0x11D8E, 0x11D90, 0x11D91, 0x11D93, 0x11D98, 0x11DA0, 0x11DA9, }, } m["Gonm"] = process_ranges{ "Masaram Gondi", 16977603, "abugida", ranges = { 0x0964, 0x0965, 0x11D00, 0x11D06, 0x11D08, 0x11D09, 0x11D0B, 0x11D36, 0x11D3A, 0x11D3A, 0x11D3C, 0x11D3D, 0x11D3F, 0x11D47, 0x11D50, 0x11D59, }, } m["Goth"] = process_ranges{ "Gothic", 467784, "alphabet", ranges = { 0x10330, 0x1034A, }, wikipedia_article = "Gothic alphabet", } m["Gran"] = process_ranges{ "Grantha", 1119274, "abugida", ranges = { 0x0951, 0x0952, 0x0964, 0x0965, 0x0BE6, 0x0BF3, 0x1CD0, 0x1CD0, 0x1CD2, 0x1CD3, 0x1CF2, 0x1CF4, 0x1CF8, 0x1CF9, 0x20F0, 0x20F0, 0x11300, 0x11303, 0x11305, 0x1130C, 0x1130F, 0x11310, 0x11313, 0x11328, 0x1132A, 0x11330, 0x11332, 0x11333, 0x11335, 0x11339, 0x1133B, 0x11344, 0x11347, 0x11348, 0x1134B, 0x1134D, 0x11350, 0x11350, 0x11357, 0x11357, 0x1135D, 0x11363, 0x11366, 0x1136C, 0x11370, 0x11374, 0x11FD0, 0x11FD1, 0x11FD3, 0x11FD3, }, } m["Grek"] = process_ranges{ "Greek", 8216, "alphabet", ranges = { 0x0341, 0x0341, 0x0374, 0x0375, 0x037E, 0x037E, 0x0384, 0x038A, 0x038C, 0x038C, 0x038E, 0x03A1, 0x03A3, 0x03D7, 0x03DA, 0x03DB, 0x03DE, 0x03E1, 0x03F0, 0x03F1, 0x03F4, 0x03F4, 0x03FC, 0x03FC, 0x1D26, 0x1D2A, 0x1D5D, 0x1D61, 0x1D66, 0x1D6A, 0x1DBF, 0x1DBF, 0x2126, 0x2127, 0x2129, 0x2129, 0x213C, 0x2140, 0xAB65, 0xAB65, 0x10140, 0x1018E, 0x101A0, 0x101A0, 0x1D200, 0x1D245, }, capitalized = true, display_text = "Grek-common", strip_diacritics = "Grek-common", sort_key = { remove_diacritics = "'ʼ;·`¨´῀" .. c.grave .. c.acute .. c.diaer .. c.caron .. c.turnedcommaabove .. c.commaabove .. c.revcommaabove .. c.macron .. c.breve .. c.diaerbelow .. c.brevebelow .. c.perispomeni .. c.ypogegrammeni .. c.RSQuo .. c.prime .. c.keraia .. c.lowerkeraia .. c.tonos .. c.coronis .. c.psili .. c.dasia, from = {"ϝ", "ͷ", "ϛ", "ͱ", "ͺ", "ϳ", "ϻ", "[ϟϙ]", "[ςϲ]", "ͳ"}, to = {"ε" .. p[1], "ε" .. p[2], "ε" .. p[3], "ζ" .. p[1], "ι", "ι" .. p[1], "π" .. p[1], "π" .. p[2], "σ", "ϡ"}, }, } m["Polyt"] = process_ranges{ "Greek", 1475332, m["Grek"][3], ranges = union(m["Grek"].ranges, { 0x0340, 0x0340, 0x0342, 0x0345, 0x0370, 0x0373, 0x0376, 0x0377, 0x037A, 0x037D, 0x037F, 0x037F, 0x03D8, 0x03D9, 0x03DC, 0x03DD, 0x03F2, 0x03F3, 0x03F5, 0x03FB, 0x03FD, 0x03FF, 0x1F00, 0x1F15, 0x1F18, 0x1F1D, 0x1F20, 0x1F45, 0x1F48, 0x1F4D, 0x1F50, 0x1F57, 0x1F59, 0x1F59, 0x1F5B, 0x1F5B, 0x1F5D, 0x1F5D, 0x1F5F, 0x1F7D, 0x1F80, 0x1FB4, 0x1FB6, 0x1FC4, 0x1FC6, 0x1FD3, 0x1FD6, 0x1FDB, 0x1FDD, 0x1FEF, 0x1FF2, 0x1FF4, 0x1FF6, 0x1FFE, }), ietf_subtag = "Grek", capitalized = m["Grek"].capitalized, parent = "Grek", display_text = m["Grek"].display_text, strip_diacritics = "Polyt-stripdiacritics", sort_key = m["Grek"].sort_key, translit = "grc-translit", } m["Gujr"] = process_ranges{ "Gujarati", 733944, "abugida", ranges = { 0x0951, 0x0952, 0x0964, 0x0965, 0x0A81, 0x0A83, 0x0A85, 0x0A8D, 0x0A8F, 0x0A91, 0x0A93, 0x0AA8, 0x0AAA, 0x0AB0, 0x0AB2, 0x0AB3, 0x0AB5, 0x0AB9, 0x0ABC, 0x0AC5, 0x0AC7, 0x0AC9, 0x0ACB, 0x0ACD, 0x0AD0, 0x0AD0, 0x0AE0, 0x0AE3, 0x0AE6, 0x0AF1, 0x0AF9, 0x0AFF, 0xA830, 0xA839, }, normalizationFixes = handle_normalization_fixes{ from = {"ઓ", "અાૈ", "અા", "અૅ", "અે", "અૈ", "અૉ", "અો", "અૌ", "આૅ", "આૈ", "ૅા"}, to = {"અાૅ", "ઔ", "આ", "ઍ", "એ", "ઐ", "ઑ", "ઓ", "ઔ", "ઓ", "ઔ", "ૉ"} }, } m["Gukh"] = process_ranges{ "Khema", 110064239, "abugida", aliases = {"Gurung Khema", "Khema Phri", "Khema Lipi"}, ranges = { 0x0965, 0x0965, 0x16100, 0x16139, }, } m["Guru"] = process_ranges{ "Gurmukhi", 689894, "abugida", ranges = { 0x0951, 0x0952, 0x0964, 0x0965, 0x0A01, 0x0A03, 0x0A05, 0x0A0A, 0x0A0F, 0x0A10, 0x0A13, 0x0A28, 0x0A2A, 0x0A30, 0x0A32, 0x0A33, 0x0A35, 0x0A36, 0x0A38, 0x0A39, 0x0A3C, 0x0A3C, 0x0A3E, 0x0A42, 0x0A47, 0x0A48, 0x0A4B, 0x0A4D, 0x0A51, 0x0A51, 0x0A59, 0x0A5C, 0x0A5E, 0x0A5E, 0x0A66, 0x0A76, 0xA830, 0xA839, }, normalizationFixes = handle_normalization_fixes{ from = {"ਅਾ", "ਅੈ", "ਅੌ", "ੲਿ", "ੲੀ", "ੲੇ", "ੳੁ", "ੳੂ", "ੳੋ"}, to = {"ਆ", "ਐ", "ਔ", "ਇ", "ਈ", "ਏ", "ਉ", "ਊ", "ਓ"} }, } m["Hang"] = process_ranges{ "Hangul", 8222, "syllabary", aliases = {"Hangeul"}, ranges = { 0x1100, 0x11FF, 0x3001, 0x3003, 0x3008, 0x3011, 0x3013, 0x301F, 0x302E, 0x3030, 0x3037, 0x3037, 0x30FB, 0x30FB, 0x3131, 0x318E, 0x3200, 0x321E, 0x3260, 0x327E, 0xA960, 0xA97C, 0xAC00, 0xD7A3, 0xD7B0, 0xD7C6, 0xD7CB, 0xD7FB, 0xFE45, 0xFE46, 0xFF61, 0xFF65, 0xFFA0, 0xFFBE, 0xFFC2, 0xFFC7, 0xFFCA, 0xFFCF, 0xFFD2, 0xFFD7, 0xFFDA, 0xFFDC, }, } m["Hani"] = process_ranges{ "Han", 8201, "logography", ranges = { 0x2E80, 0x2E99, 0x2E9B, 0x2EF3, 0x2F00, 0x2FD5, 0x2FF0, 0x2FFF, 0x3001, 0x3003, 0x3005, 0x3011, 0x3013, 0x301F, 0x3021, 0x302D, 0x3030, 0x3030, 0x3037, 0x303F, 0x3190, 0x319F, 0x31C0, 0x31E5, 0x31EF, 0x31EF, 0x3220, 0x3247, 0x3280, 0x32B0, 0x32C0, 0x32CB, 0x30FB, 0x30FB, 0x32FF, 0x32FF, 0x3358, 0x3370, 0x337B, 0x337F, 0x33E0, 0x33FE, 0x3400, 0x4DBF, 0x4E00, 0x9FFF, 0xA700, 0xA707, 0xF900, 0xFA6D, 0xFA70, 0xFAD9, 0xFE45, 0xFE46, 0xFF61, 0xFF65, 0x16FE2, 0x16FE3, 0x16FF0, 0x16FF1, 0x1D360, 0x1D371, 0x1F250, 0x1F251, 0x20000, 0x2A6DF, 0x2A700, 0x2B739, 0x2B740, 0x2B81D, 0x2B820, 0x2CEA1, 0x2CEB0, 0x2EBE0, 0x2EBF0, 0x2EE5D, 0x2F800, 0x2FA1D, 0x30000, 0x3134A, 0x31350, 0x3347F, }, varieties = {"Hanzi", "Kanji", "Hanja", "Chu Nom"}, spaces = false, } m["Hans"] = { "Simplified Han", 185614, m["Hani"][3], ranges = m["Hani"].ranges, characters = m["Hani"].characters, spaces = m["Hani"].spaces, parent = "Hani", } m["Hant"] = { "Traditional Han", 178528, m["Hani"][3], ranges = m["Hani"].ranges, characters = m["Hani"].characters, spaces = m["Hani"].spaces, parent = "Hani", } m["Hano"] = process_ranges{ "Hanunoo", 1584045, "abugida", aliases = {"Hanunó'o", "Hanuno'o"}, ranges = { 0x1720, 0x1736, }, } m["Hatr"] = process_ranges{ "Hatran", 20813038, "abjad", ranges = { 0x108E0, 0x108F2, 0x108F4, 0x108F5, 0x108FB, 0x108FF, }, direction = "rtl", } m["Hebr"] = process_ranges{ "Hebrew", 33513, "abjad", -- more precisely, impure abjad ranges = { 0x0591, 0x05C7, 0x05D0, 0x05EA, 0x05EF, 0x05F4, 0x2135, 0x2138, 0xFB1D, 0xFB36, 0xFB38, 0xFB3C, 0xFB3E, 0xFB3E, 0xFB40, 0xFB41, 0xFB43, 0xFB44, 0xFB46, 0xFB4F, }, direction = "rtl", display_text = "Hebr-common", sort_key = "Hebr-common", strip_diacritics = "Hebr-common", } m["Hira"] = process_ranges{ "Hiragana", 48332, "syllabary", ranges = { 0x3001, 0x3003, 0x3008, 0x3011, 0x3013, 0x301F, 0x3030, 0x3035, 0x3037, 0x3037, 0x303C, 0x303D, 0x3041, 0x3096, 0x3099, 0x30A0, 0x30FB, 0x30FC, 0xFE45, 0xFE46, 0xFF61, 0xFF65, 0xFF70, 0xFF70, 0xFF9E, 0xFF9F, 0x1B001, 0x1B11F, 0x1B132, 0x1B132, 0x1B150, 0x1B152, 0x1F200, 0x1F200, }, varieties = {"Hentaigana"}, spaces = false, } m["Hluw"] = process_ranges{ "Anatolian hieroglyphic", 521323, "logography, syllabary", ranges = { 0x14400, 0x14646, }, wikipedia_article = "Anatolian hieroglyphs", } m["Hmng"] = process_ranges{ "Pahawh Hmong", 365954, "semisyllabary", aliases = {"Hmong"}, ranges = { 0x16B00, 0x16B45, 0x16B50, 0x16B59, 0x16B5B, 0x16B61, 0x16B63, 0x16B77, 0x16B7D, 0x16B8F, }, } m["Hmnp"] = process_ranges{ "Nyiakeng Puachue Hmong", 33712499, "alphabet", ranges = { 0x1E100, 0x1E12C, 0x1E130, 0x1E13D, 0x1E140, 0x1E149, 0x1E14E, 0x1E14F, }, } m["Hung"] = process_ranges{ "Old Hungarian", 446224, "alphabet", aliases = {"Hungarian runic"}, ranges = { 0x10C80, 0x10CB2, 0x10CC0, 0x10CF2, 0x10CFA, 0x10CFF, }, capitalized = true, direction = "rtl", } m["Ibrnn"] = { "Northeastern Iberian", 1113155, "semisyllabary", ietf_subtag = "Zzzz", -- Not in Unicode } m["Ibrns"] = { "Southeastern Iberian", 2305351, "semisyllabary", ietf_subtag = "Zzzz", -- Not in Unicode } m["Image"] = { -- To be used to avoid any formatting or link processing "Image-rendered", 478798, -- This should not have any characters listed ietf_subtag = "Zyyy", translit = false, character_category = false, -- none } m["Inds"] = { "Indus", 601388, aliases = {"Harappan", "Indus Valley"}, } m["Ipach"] = { "International Phonetic Alphabet", 21204, aliases = {"IPA"}, ietf_subtag = "Latn", } m["Ital"] = process_ranges{ "Old Italic", 4891256, "alphabet", ranges = { 0x10300, 0x10323, 0x1032D, 0x1032F, }, translit = "Ital-translit", } m["Java"] = process_ranges{ "Javanese", 879704, "abugida", ranges = { 0xA980, 0xA9CD, 0xA9CF, 0xA9D9, 0xA9DE, 0xA9DF, }, } m["Jurc"] = { "Jurchen", 912240, "logography", spaces = false, } m["Kali"] = process_ranges{ "Kayah Li", 4919239, "abugida", ranges = { 0xA900, 0xA92F, }, } m["Kana"] = process_ranges{ "Katakana", 82946, "syllabary", ranges = { 0x3001, 0x3003, 0x3008, 0x3011, 0x3013, 0x301F, 0x3030, 0x3035, 0x3037, 0x3037, 0x303C, 0x303D, 0x3099, 0x309C, 0x30A0, 0x30FF, 0x31F0, 0x31FF, 0x32D0, 0x32FE, 0x3300, 0x3357, 0xFE45, 0xFE46, 0xFF61, 0xFF9F, 0x1AFF0, 0x1AFF3, 0x1AFF5, 0x1AFFB, 0x1AFFD, 0x1AFFE, 0x1B000, 0x1B000, 0x1B120, 0x1B122, 0x1B155, 0x1B155, 0x1B164, 0x1B167, }, spaces = false, } m["Kawi"] = process_ranges{ "Kawi", 975802, "abugida", ranges = { 0x11F00, 0x11F10, 0x11F12, 0x11F3A, 0x11F3E, 0x11F5A, }, } m["Khar"] = process_ranges{ "Kharoshthi", 1161266, "abugida", ranges = { 0x10A00, 0x10A03, 0x10A05, 0x10A06, 0x10A0C, 0x10A13, 0x10A15, 0x10A17, 0x10A19, 0x10A35, 0x10A38, 0x10A3A, 0x10A3F, 0x10A48, 0x10A50, 0x10A58, }, direction = "rtl", } m["Khmr"] = process_ranges{ "Khmer", 1054190, "abugida", ranges = { 0x1780, 0x17DD, 0x17E0, 0x17E9, 0x17F0, 0x17F9, 0x19E0, 0x19FF, }, spaces = false, normalizationFixes = handle_normalization_fixes{ from = {"ឣ", "ឤ"}, to = {"អ", "អា"} }, } m["Khoj"] = process_ranges{ "Khojki", 1740656, "abugida", ranges = { 0x0AE6, 0x0AEF, 0xA830, 0xA839, 0x11200, 0x11211, 0x11213, 0x11241, }, normalizationFixes = handle_normalization_fixes{ from = {"𑈀𑈬𑈱", "𑈀𑈬", "𑈀𑈱", "𑈀𑈳", "𑈁𑈱", "𑈆𑈬", "𑈬𑈰", "𑈬𑈱", "𑉀𑈮"}, to = {"𑈇", "𑈁", "𑈅", "𑈇", "𑈇", "𑈃", "𑈲", "𑈳", "𑈂"} }, } m["Khomt"] = { "Khom Thai", 13023788, "abugida", -- Not in Unicode } m["Kitl"] = { "Khitan large", 6401797, "logography", spaces = false, } m["Kits"] = process_ranges{ "Khitan small", 6401800, "logography, syllabary", ranges = { 0x16FE4, 0x16FE4, 0x18B00, 0x18CD5, 0x18CFF, 0x18CFF, }, spaces = false, } m["Knda"] = process_ranges{ "Kannada", 839666, "abugida", ranges = { 0x0951, 0x0952, 0x0964, 0x0965, 0x0C80, 0x0C8C, 0x0C8E, 0x0C90, 0x0C92, 0x0CA8, 0x0CAA, 0x0CB3, 0x0CB5, 0x0CB9, 0x0CBC, 0x0CC4, 0x0CC6, 0x0CC8, 0x0CCA, 0x0CCD, 0x0CD5, 0x0CD6, 0x0CDD, 0x0CDE, 0x0CE0, 0x0CE3, 0x0CE6, 0x0CEF, 0x0CF1, 0x0CF3, 0x1CD0, 0x1CD0, 0x1CD2, 0x1CD3, 0x1CDA, 0x1CDA, 0x1CF2, 0x1CF2, 0x1CF4, 0x1CF4, 0xA830, 0xA835, }, normalizationFixes = handle_normalization_fixes{ from = {"ಉಾ", "ಋಾ", "ಒೌ"}, to = {"ಊ", "ೠ", "ಔ"} }, translit = "kn-translit", } m["Kpel"] = { "Kpelle", 1586299, "syllabary", -- Not in Unicode } m["Krai"] = process_ranges{ "Kirat Rai", 123173834, "abugida", aliases = {"Rai", "Khambu Rai", "Rai Barṇamālā", "Kirat Khambu Rai"}, ranges = { 0x16D40, 0x16D79, }, } m["Kthi"] = process_ranges{ "Kaithi", 1253814, "abugida", ranges = { 0x0966, 0x096F, 0xA830, 0xA839, 0x11080, 0x110C2, 0x110CD, 0x110CD, }, } m["Kulit"] = { "Kulitan", 6443044, "abugida", -- Not in Unicode } m["Lana"] = process_ranges{ "Tai Tham", 1314503, "abugida", aliases = {"Tham", "Tua Mueang", "Lanna"}, ranges = { 0x1A20, 0x1A5E, 0x1A60, 0x1A7C, 0x1A7F, 0x1A89, 0x1A90, 0x1A99, 0x1AA0, 0x1AAD, }, spaces = false, } m["Laoo"] = process_ranges{ "Lao", 1815229, "abugida", ranges = { 0x0E81, 0x0E82, 0x0E84, 0x0E84, 0x0E86, 0x0E8A, 0x0E8C, 0x0EA3, 0x0EA5, 0x0EA5, 0x0EA7, 0x0EBD, 0x0EC0, 0x0EC4, 0x0EC6, 0x0EC6, 0x0EC8, 0x0ECE, 0x0ED0, 0x0ED9, 0x0EDC, 0x0EDF, }, spaces = false, } m["Latn"] = process_ranges{ "Latin", 8229, "alphabet", aliases = {"Roman"}, ranges = { 0x0041, 0x005A, 0x0061, 0x007A, 0x00AA, 0x00AA, 0x00BA, 0x00BA, 0x00C0, 0x00D6, 0x00D8, 0x00F6, 0x00F8, 0x02B8, 0x02C0, 0x02C1, 0x02E0, 0x02E4, 0x0363, 0x036F, 0x0485, 0x0486, 0x0951, 0x0952, 0x10FB, 0x10FB, 0x1D00, 0x1D25, 0x1D2C, 0x1D5C, 0x1D62, 0x1D65, 0x1D6B, 0x1D77, 0x1D79, 0x1DBE, 0x1DF8, 0x1DF8, 0x1E00, 0x1EFF, 0x202F, 0x202F, 0x2071, 0x2071, 0x207F, 0x207F, 0x2090, 0x209C, 0x20F0, 0x20F0, 0x2100, 0x2125, 0x2128, 0x2128, 0x212A, 0x2134, 0x2139, 0x213B, 0x2141, 0x214E, 0x2160, 0x2188, 0x2C60, 0x2C7F, 0xA700, 0xA707, 0xA722, 0xA787, 0xA78B, 0xA7CD, 0xA7D0, 0xA7D1, 0xA7D3, 0xA7D3, 0xA7D5, 0xA7DC, 0xA7F2, 0xA7FF, 0xA92E, 0xA92E, 0xAB30, 0xAB5A, 0xAB5C, 0xAB64, 0xAB66, 0xAB69, 0xFB00, 0xFB06, 0xFF21, 0xFF3A, 0xFF41, 0xFF5A, 0x10780, 0x10785, 0x10787, 0x107B0, 0x107B2, 0x107BA, 0x1DF00, 0x1DF1E, 0x1DF25, 0x1DF2A, }, varieties = {"Rumi", "Romaji", "Rōmaji", "Romaja"}, capitalized = true, translit = false, } m["Latf"] = { "Fraktur", 148443, m["Latn"][3], ranges = m["Latn"].ranges, characters = m["Latn"].characters, other_names = {"Blackletter"}, -- Blackletter is actually the parent "script" capitalized = m["Latn"].capitalized, translit = m["Latn"].translit, parent = "Latn", } m["Latg"] = { "Gaelic", 1432616, m["Latn"][3], ranges = m["Latn"].ranges, characters = m["Latn"].characters, other_names = {"Irish"}, capitalized = m["Latn"].capitalized, translit = m["Latn"].translit, parent = "Latn", } m["pjt-Latn"] = { "Latin", nil, m["Latn"][3], ranges = m["Latn"].ranges, characters = m["Latn"].characters, capitalized = m["Latn"].capitalized, translit = m["Latn"].translit, parent = "Latn", } m["Leke"] = { "Leke", 19572613, "abugida", -- Not in Unicode } m["Lepc"] = process_ranges{ "Lepcha", 1481626, "abugida", aliases = {"Róng"}, ranges = { 0x1C00, 0x1C37, 0x1C3B, 0x1C49, 0x1C4D, 0x1C4F, }, } m["Limb"] = process_ranges{ "Limbu", 933796, "abugida", ranges = { 0x0965, 0x0965, 0x1900, 0x191E, 0x1920, 0x192B, 0x1930, 0x193B, 0x1940, 0x1940, 0x1944, 0x194F, }, } m["Lina"] = process_ranges{ "Linear A", 30972, ranges = { 0x10107, 0x10133, 0x10600, 0x10736, 0x10740, 0x10755, 0x10760, 0x10767, }, } m["Linb"] = process_ranges{ "Linear B", 190102, ranges = { 0x10000, 0x1000B, 0x1000D, 0x10026, 0x10028, 0x1003A, 0x1003C, 0x1003D, 0x1003F, 0x1004D, 0x10050, 0x1005D, 0x10080, 0x100FA, 0x10100, 0x10102, 0x10107, 0x10133, 0x10137, 0x1013F, }, } m["Lisu"] = process_ranges{ "Fraser", 1194621, "alphabet", aliases = {"Old Lisu", "Lisu"}, ranges = { 0x300A, 0x300B, 0xA4D0, 0xA4FF, 0x11FB0, 0x11FB0, }, normalizationFixes = handle_normalization_fixes{ from = {"['’]", "[.ꓸ][.ꓸ]", "[.ꓸ][,ꓹ]"}, to = {"ʼ", "ꓺ", "ꓻ"} }, translit = "Lisu-translit", sort_key = { from = {"𑾰"}, to = {"ꓬ" .. p[1]} }, } m["Loma"] = { "Loma", 13023816, "syllabary", -- Not in Unicode } m["Lyci"] = process_ranges{ "Lycian", 913587, "alphabet", ranges = { 0x10280, 0x1029C, }, } m["Lydi"] = process_ranges{ "Lydian", 4261300, "alphabet", ranges = { 0x10920, 0x10939, 0x1093F, 0x1093F, }, direction = "rtl", } m["Mahj"] = process_ranges{ "Mahajani", 6732850, "abugida", ranges = { 0x0964, 0x096F, 0xA830, 0xA839, 0x11150, 0x11176, }, } m["Maka"] = process_ranges{ "Makasar", 72947229, "abugida", aliases = {"Old Makasar"}, ranges = { 0x11EE0, 0x11EF8, }, } m["Mand"] = process_ranges{ "Mandaic", 1812130, aliases = {"Mandaean"}, ranges = { 0x0640, 0x0640, 0x0840, 0x085B, 0x085E, 0x085E, }, direction = "rtl", } m["Mani"] = process_ranges{ "Manichaean", 3544702, "abjad", ranges = { 0x0640, 0x0640, 0x10AC0, 0x10AE6, 0x10AEB, 0x10AF6, }, direction = "rtl", translit = "Mani-translit", } m["Marc"] = process_ranges{ "Marchen", 72403709, "abugida", ranges = { 0x11C70, 0x11C8F, 0x11C92, 0x11CA7, 0x11CA9, 0x11CB6, }, } m["Maya"] = process_ranges{ "Maya", 211248, aliases = {"Maya hieroglyphic", "Mayan", "Mayan hieroglyphic"}, ranges = { 0x1D2E0, 0x1D2F3, }, } m["Medf"] = process_ranges{ "Medefaidrin", 1519764, aliases = {"Oberi Okaime", "Oberi Ɔkaimɛ"}, ranges = { 0x16E40, 0x16E9A, }, capitalized = true, } m["Mend"] = process_ranges{ "Mende", 951069, aliases = {"Mende Kikakui"}, ranges = { 0x1E800, 0x1E8C4, 0x1E8C7, 0x1E8D6, }, direction = "rtl", } m["Merc"] = process_ranges{ "Meroitic cursive", 73028124, "abugida", ranges = { 0x109A0, 0x109B7, 0x109BC, 0x109CF, 0x109D2, 0x109FF, }, direction = "rtl", } m["Mero"] = process_ranges{ "Meroitic hieroglyphic", 73028623, "abugida", ranges = { 0x10980, 0x1099F, }, direction = "rtl", wikipedia_article = "Meroitic hieroglyphs", } m["Mlym"] = process_ranges{ "Malayalam", 1164129, "abugida", ranges = { 0x0951, 0x0952, 0x0964, 0x0965, 0x0D00, 0x0D0C, 0x0D0E, 0x0D10, 0x0D12, 0x0D44, 0x0D46, 0x0D48, 0x0D4A, 0x0D4F, 0x0D54, 0x0D63, 0x0D66, 0x0D7F, 0x1CDA, 0x1CDA, 0x1CF2, 0x1CF2, 0xA830, 0xA832, }, normalizationFixes = handle_normalization_fixes{ from = {"ഇൗ", "ഉൗ", "എെ", "ഒാ", "ഒൗ", "ക്‍", "ണ്‍", "ന്‍റ", "ന്‍", "മ്‍", "യ്‍", "ര്‍", "ല്‍", "ള്‍", "ഴ്‍", "െെ", "ൻ്റ"}, to = {"ഈ", "ഊ", "ഐ", "ഓ", "ഔ", "ൿ", "ൺ", "ൻറ", "ൻ", "ൔ", "ൕ", "ർ", "ൽ", "ൾ", "ൖ", "ൈ", "ന്റ"} }, translit = "ml-translit", } m["Modi"] = process_ranges{ "Modi", 1703713, "abugida", ranges = { 0xA830, 0xA839, 0x11600, 0x11644, 0x11650, 0x11659, }, normalizationFixes = handle_normalization_fixes{ from = {"𑘀𑘹", "𑘀𑘺", "𑘁𑘹", "𑘁𑘺"}, to = {"𑘊", "𑘋", "𑘌", "𑘍"} }, } do local Mong_displaytext = { from = {"([ᠨ-ᡂᡸ])ᠶ([ᠨ-ᡂᡸ])", "([ᠠ-ᡂᡸ])ᠸ([^᠋ᠠ-ᠧ])", "([ᠠ-ᡂᡸ])ᠸ$"}, to = {"%1ᠢ%2", "%1ᠧ%2", "%1ᠧ"} } m["Mong"] = process_ranges{ "Mongolian", 1055705, "alphabet", aliases = {"Mongol bichig", "Hudum Mongol bichig"}, ranges = { 0x1800, 0x1805, 0x180A, 0x1819, 0x1820, 0x1842, 0x1878, 0x1878, 0x1880, 0x1897, 0x18A6, 0x18A6, 0x18A9, 0x18A9, 0x200C, 0x200D, 0x202F, 0x202F, 0x3001, 0x3002, 0x3008, 0x300B, 0x11660, 0x11668, }, direction = "vertical-ltr", display_text = Mong_displaytext, strip_diacritics = Mong_displaytext, translit = "Mong-translit", } m["mnc-Mong"] = process_ranges{ "Manchu", 122888, m["Mong"][3], ranges = { 0x1801, 0x1801, 0x1804, 0x1804, 0x1808, 0x180F, 0x1820, 0x1820, 0x1823, 0x1823, 0x1828, 0x182A, 0x182E, 0x1830, 0x1834, 0x1838, 0x183A, 0x183A, 0x185D, 0x185D, 0x185F, 0x1861, 0x1864, 0x1869, 0x186C, 0x1871, 0x1873, 0x1877, 0x1880, 0x1888, 0x188F, 0x188F, 0x189A, 0x18A5, 0x18A8, 0x18A8, 0x18AA, 0x18AA, 0x200C, 0x200D, 0x202F, 0x202F, }, direction = "vertical-ltr", parent = "Mong", translit = "mnc-translit", } m["sjo-Mong"] = process_ranges{ "Xibe", 113624153, m["Mong"][3], aliases = {"Sibe"}, ranges = { 0x1804, 0x1804, 0x1807, 0x1807, 0x180A, 0x180F, 0x1820, 0x1820, 0x1823, 0x1823, 0x1828, 0x1828, 0x182A, 0x182A, 0x182E, 0x1830, 0x1834, 0x1838, 0x183A, 0x183A, 0x185D, 0x1872, 0x200C, 0x200D, 0x202F, 0x202F, }, direction = "vertical-ltr", parent = "mnc-Mong", } m["xwo-Mong"] = process_ranges{ "Clear Script", 529085, m["Mong"][3], aliases = {"Todo", "Todo bichig"}, ranges = { 0x1800, 0x1801, 0x1804, 0x1806, 0x180A, 0x1820, 0x1828, 0x1828, 0x182F, 0x1831, 0x1834, 0x1834, 0x1837, 0x1838, 0x183A, 0x183B, 0x1840, 0x1840, 0x1843, 0x185C, 0x1880, 0x1887, 0x1889, 0x188F, 0x1894, 0x1894, 0x1896, 0x1899, 0x18A7, 0x18A7, 0x200C, 0x200D, 0x202F, 0x202F, 0x11669, 0x1166C, }, direction = "vertical-ltr", parent = "Mong", translit = "xwo-translit", } end m["Moon"] = { "Moon", 918391, "alphabet", aliases = {"Moon System of Embossed Reading", "Moon type", "Moon writing", "Moon alphabet", "Moon code"}, -- Not in Unicode } m["Morse"] = { "Morse code", 79897, ietf_subtag = "Zsym", } m["Mroo"] = process_ranges{ "Mru", 75919253, aliases = {"Mro", "Mrung"}, ranges = { 0x16A40, 0x16A5E, 0x16A60, 0x16A69, 0x16A6E, 0x16A6F, }, } m["Mtei"] = process_ranges{ "Meitei Mayek", 2981413, "abugida", aliases = {"Meetei Mayek", "Manipuri"}, ranges = { 0xAAE0, 0xAAF6, 0xABC0, 0xABED, 0xABF0, 0xABF9, }, } m["Mult"] = process_ranges{ "Multani", 17047906, "abugida", ranges = { 0x0A66, 0x0A6F, 0x11280, 0x11286, 0x11288, 0x11288, 0x1128A, 0x1128D, 0x1128F, 0x1129D, 0x1129F, 0x112A9, }, } m["Music"] = process_ranges{ "musical notation", 233861, "pictography", ranges = { 0x2669, 0x266F, 0x1D100, 0x1D126, 0x1D129, 0x1D1EA, }, ietf_subtag = "Zsym", translit = false, } m["Mymr"] = process_ranges{ "Burmese", 43887939, "abugida", aliases = {"Myanmar"}, ranges = { 0x1000, 0x109F, 0xA92E, 0xA92E, 0xA9E0, 0xA9FE, 0xAA60, 0xAA7F, 0x116D0, 0x116E3, }, spaces = false, } m["Nagm"] = process_ranges{ "Mundari Bani", 106917274, "alphabet", aliases = {"Nag Mundari"}, ranges = { 0x1E4D0, 0x1E4F9, }, } m["Nand"] = process_ranges{ "Nandinagari", 6963324, "abugida", ranges = { 0x0964, 0x0965, 0x0CE6, 0x0CEF, 0x1CE9, 0x1CE9, 0x1CF2, 0x1CF2, 0x1CFA, 0x1CFA, 0xA830, 0xA835, 0x119A0, 0x119A7, 0x119AA, 0x119D7, 0x119DA, 0x119E4, }, } m["Narb"] = process_ranges{ "Ancient North Arabian", 1472213, "abjad", aliases = {"Old North Arabian"}, ranges = { 0x10A80, 0x10A9F, }, direction = "rtl", translit = "Narb-translit", } m["Nbat"] = process_ranges{ "Nabataean", 855624, "abjad", aliases = {"Nabatean"}, ranges = { 0x10880, 0x1089E, 0x108A7, 0x108AF, }, direction = "rtl", } m["Newa"] = process_ranges{ "Newa", 7237292, "abugida", aliases = {"Newar", "Newari", "Prachalit Nepal"}, ranges = { 0x11400, 0x1145B, 0x1145D, 0x11461, }, } m["Nkdb"] = { "Dongba", 1190953, "pictography", aliases = {"Naxi Dongba", "Nakhi Dongba", "Tomba", "Tompa", "Mo-so"}, spaces = false, -- Not in Unicode } m["Nkgb"] = { "Geba", 731189, "syllabary", aliases = {"Nakhi Geba", "Naxi Geba"}, spaces = false, -- Not in Unicode } m["Nkoo"] = process_ranges{ "N'Ko", 1062587, "alphabet", ranges = { 0x060C, 0x060C, 0x061B, 0x061B, 0x061F, 0x061F, 0x07C0, 0x07FA, 0x07FD, 0x07FF, 0xFD3E, 0xFD3F, }, direction = "rtl", } m["None"] = { "unspecified", nil, -- This should not have any characters listed ietf_subtag = "Zyyy", translit = false, character_category = false, -- none } m["Nshu"] = process_ranges{ "Nüshu", 56436, "syllabary", aliases = {"Nushu"}, ranges = { 0x16FE1, 0x16FE1, 0x1B170, 0x1B2FB, }, spaces = false, } m["Ogam"] = process_ranges{ "Ogham", 184661, ranges = { 0x1680, 0x169C, }, } m["Olck"] = process_ranges{ "Ol Chiki", 201688, aliases = {"Ol Chemetʼ", "Ol", "Santali"}, ranges = { 0x1C50, 0x1C7F, }, } m["Onao"] = process_ranges{ "Ol Onal", 108607084, "alphabet", ranges = { 0x0964, 0x0965, 0x1E5D0, 0x1E5FA, 0x1E5FF, 0x1E5FF, }, } m["Orkh"] = process_ranges{ "Old Turkic", 5058305, aliases = {"Orkhon runic"}, ranges = { 0x10C00, 0x10C48, }, direction = "rtl", translit = "Orkh-translit", } m["Orya"] = process_ranges{ "Odia", 1760127, "abugida", aliases = {"Oriya"}, ranges = { 0x0951, 0x0952, 0x0964, 0x0965, 0x0B01, 0x0B03, 0x0B05, 0x0B0C, 0x0B0F, 0x0B10, 0x0B13, 0x0B28, 0x0B2A, 0x0B30, 0x0B32, 0x0B33, 0x0B35, 0x0B39, 0x0B3C, 0x0B44, 0x0B47, 0x0B48, 0x0B4B, 0x0B4D, 0x0B55, 0x0B57, 0x0B5C, 0x0B5D, 0x0B5F, 0x0B63, 0x0B66, 0x0B77, 0x1CDA, 0x1CDA, 0x1CF2, 0x1CF2, }, normalizationFixes = handle_normalization_fixes{ from = {"ଅା", "ଏୗ", "ଓୗ"}, to = {"ଆ", "ଐ", "ଔ"} }, } m["Osge"] = process_ranges{ "Osage", 7105529, ranges = { 0x104B0, 0x104D3, 0x104D8, 0x104FB, }, capitalized = true, translit = "Osge-translit", } m["Osma"] = process_ranges{ "Osmanya", 1377866, ranges = { 0x10480, 0x1049D, 0x104A0, 0x104A9, }, } m["Ougr"] = process_ranges{ "Old Uyghur", 1998938, "abjad, alphabet", ranges = { 0x0640, 0x0640, 0x10AF2, 0x10AF2, 0x10F70, 0x10F89, }, -- This should ideally be "vertical-ltr", but getting the CSS right is tricky because it's right-to-left horizontally, but left-to-right vertically. Currently, displaying it vertically causes it to display bottom-to-top. direction = "rtl", } m["Palm"] = process_ranges{ "Palmyrene", 17538100, ranges = { 0x10860, 0x1087F, }, direction = "rtl", } m["Pauc"] = process_ranges{ "Pau Cin Hau", 25339852, ranges = { 0x11AC0, 0x11AF8, }, } m["Pcun"] = { "Proto-Cuneiform", 1650699, "pictography", -- Not in Unicode } m["Pelm"] = { "Proto-Elamite", 56305763, "pictography", -- Not in Unicode } m["Perm"] = process_ranges{ "Old Permic", 147899, ranges = { 0x0483, 0x0483, 0x10350, 0x1037A, }, } m["Phag"] = process_ranges{ "Phags-pa", 822836, "abugida", ranges = { 0x1802, 0x1803, 0x1805, 0x1805, 0x200C, 0x200D, 0x202F, 0x202F, 0x3002, 0x3002, 0xA840, 0xA877, }, direction = "vertical-ltr", } m["Phli"] = process_ranges{ "Inscriptional Pahlavi", 24089793, "abjad", ranges = { 0x10B60, 0x10B72, 0x10B78, 0x10B7F, }, direction = "rtl", } m["Phlp"] = process_ranges{ "Psalter Pahlavi", 7253954, "abjad", ranges = { 0x0640, 0x0640, 0x10B80, 0x10B91, 0x10B99, 0x10B9C, 0x10BA9, 0x10BAF, }, direction = "rtl", } m["Phlv"] = { "Book Pahlavi", 72403118, "abjad", direction = "rtl", wikipedia_article = "Pahlavi scripts#Book Pahlavi", -- Not in Unicode } m["Phnx"] = process_ranges{ "Phoenician", 26752, "abjad", ranges = { 0x10900, 0x1091B, 0x1091F, 0x1091F, }, direction = "rtl", translit = "Phnx-translit", } m["Plrd"] = process_ranges{ "Pollard", 601734, "abugida", aliases = {"Miao"}, ranges = { 0x16F00, 0x16F4A, 0x16F4F, 0x16F87, 0x16F8F, 0x16F9F, }, } m["Prti"] = process_ranges{ "Inscriptional Parthian", 13023804, ranges = { 0x10B40, 0x10B55, 0x10B58, 0x10B5F, }, direction = "rtl", } m["Psin"] = { "Proto-Sinaitic", 1065250, "abjad", direction = "rtl", -- Not in Unicode } m["Ranj"] = { "Ranjana", 2385276, "abugida", -- Not in Unicode } m["Rjng"] = process_ranges{ "Rejang", 2007960, "abugida", ranges = { 0xA930, 0xA953, 0xA95F, 0xA95F, }, } m["Rohg"] = process_ranges{ "Hanifi Rohingya", 21028705, "alphabet", ranges = { 0x060C, 0x060C, 0x061B, 0x061B, 0x061F, 0x061F, 0x0640, 0x0640, 0x06D4, 0x06D4, 0x10D00, 0x10D27, 0x10D30, 0x10D39, }, direction = "rtl", } m["Roro"] = { "Rongorongo", 209764, -- Not in Unicode } m["Rumin"] = process_ranges{ "Rumi numerals", nil, ranges = { 0x10E60, 0x10E7E, }, ietf_subtag = "Arab", } m["Runr"] = process_ranges{ "Runic", 82996, "alphabet", ranges = { 0x16A0, 0x16EA, 0x16EE, 0x16F8, }, } do local Samr_stripdiacritics = { remove_diacritics = c.CGJ .. u(0x0816) .. "-" .. u(0x082D), } m["Samr"] = process_ranges{ "Samaritan", 1550930, "abjad", ranges = { 0x0800, 0x082D, 0x0830, 0x083E, }, direction = "rtl", strip_diacritics = Samr_stripdiacritics, sort_key = Samr_stripdiacritics, } end m["Sarb"] = process_ranges{ "Ancient South Arabian", 446074, "abjad", aliases = {"Old South Arabian"}, ranges = { 0x10A60, 0x10A7F, }, direction = "rtl", translit = "Sarb-translit", } m["Saur"] = process_ranges{ "Saurashtra", 3535165, "abugida", ranges = { 0xA880, 0xA8C5, 0xA8CE, 0xA8D9, }, } m["Semap"] = { "flag semaphore", 250796, "pictography", ietf_subtag = "Zsym", } m["Sgnw"] = process_ranges{ "SignWriting", 1497335, "pictography", aliases = {"Sutton SignWriting"}, ranges = { 0x1D800, 0x1DA8B, 0x1DA9B, 0x1DA9F, 0x1DAA1, 0x1DAAF, }, translit = false, } m["Shaw"] = process_ranges{ "Shavian", 1970098, aliases = {"Shaw"}, ranges = { 0x10450, 0x1047F, }, } m["Shrd"] = process_ranges{ "Sharada", 2047117, "abugida", ranges = { 0x0951, 0x0951, 0x1CD7, 0x1CD7, 0x1CD9, 0x1CD9, 0x1CDC, 0x1CDD, 0x1CE0, 0x1CE0, 0xA830, 0xA835, 0xA838, 0xA838, 0x11180, 0x111DF, }, translit = "Shrd-translit", } m["Shui"] = { "Sui", 752854, "logography", spaces = false, -- Not in Unicode } m["Sidd"] = process_ranges{ "Siddham", 250379, "abugida", ranges = { 0x11580, 0x115B5, 0x115B8, 0x115DD, }, translit = "Sidd-translit", } m["Sidt"] = { "Sidetic", 36659, "alphabet", direction = "rtl", -- Not in Unicode } m["Sind"] = process_ranges{ "Khudabadi", 6402810, "abugida", aliases = {"Khudawadi"}, ranges = { 0x0964, 0x0965, 0xA830, 0xA839, 0x112B0, 0x112EA, 0x112F0, 0x112F9, }, normalizationFixes = handle_normalization_fixes{ from = {"𑊰𑋠", "𑊰𑋥", "𑊰𑋦", "𑊰𑋧", "𑊰𑋨"}, to = {"𑊱", "𑊶", "𑊷", "𑊸", "𑊹"} }, } m["Sinh"] = process_ranges{ "Sinhalese", 1574992, "abugida", aliases = {"Sinhala"}, ranges = { 0x0964, 0x0965, 0x0D81, 0x0D83, 0x0D85, 0x0D96, 0x0D9A, 0x0DB1, 0x0DB3, 0x0DBB, 0x0DBD, 0x0DBD, 0x0DC0, 0x0DC6, 0x0DCA, 0x0DCA, 0x0DCF, 0x0DD4, 0x0DD6, 0x0DD6, 0x0DD8, 0x0DDF, 0x0DE6, 0x0DEF, 0x0DF2, 0x0DF4, 0x1CF2, 0x1CF2, 0x111E1, 0x111F4, }, normalizationFixes = handle_normalization_fixes{ from = {"අා", "අැ", "අෑ", "උෟ", "ඍෘ", "ඏෟ", "එ්", "එෙ", "ඔෟ", "ෘෘ"}, to = {"ආ", "ඇ", "ඈ", "ඌ", "ඎ", "ඐ", "ඒ", "ඓ", "ඖ", "ෲ"} }, } m["Sogd"] = process_ranges{ "Sogdian", 578359, "abjad", ranges = { 0x0640, 0x0640, 0x10F30, 0x10F59, }, direction = "rtl", } m["Sogo"] = process_ranges{ "Old Sogdian", 72403254, "abjad", ranges = { 0x10F00, 0x10F27, }, direction = "rtl", } m["Sora"] = process_ranges{ "Sorang Sompeng", 7563292, aliases = {"Sora Sompeng"}, ranges = { 0x110D0, 0x110E8, 0x110F0, 0x110F9, }, } m["Soyo"] = process_ranges{ "Soyombo", 8009382, "abugida", ranges = { 0x11A50, 0x11AA2, }, } m["Sund"] = process_ranges{ "Sundanese", 51589, "abugida", ranges = { 0x1B80, 0x1BBF, 0x1CC0, 0x1CC7, }, } m["Sunu"] = process_ranges{ "Sunuwar", 109984965, "alphabet", ranges = { 0x11BC0, 0x11BE1, 0x11BF0, 0x11BF9, }, } m["Sylo"] = process_ranges{ "Sylheti Nagri", 144128, "abugida", aliases = {"Sylheti Nāgarī", "Syloti Nagri"}, ranges = { 0x0964, 0x0965, 0x09E6, 0x09EF, 0xA800, 0xA82C, }, } m["Syrc"] = process_ranges{ "Syriac", 26567, "abjad", -- more precisely, impure abjad ranges = { 0x060C, 0x060C, 0x061B, 0x061C, 0x061F, 0x061F, 0x0640, 0x0640, 0x064B, 0x0655, 0x0670, 0x0670, 0x0700, 0x070D, 0x070F, 0x074A, 0x074D, 0x074F, 0x0860, 0x086A, 0x1DF8, 0x1DF8, 0x1DFA, 0x1DFA, }, direction = "rtl", } -- Syre, Syrj, Syrn are apparently subsumed into Syrc; discuss if this causes issues m["Tagb"] = process_ranges{ "Tagbanwa", 977444, "abugida", ranges = { 0x1735, 0x1736, 0x1760, 0x176C, 0x176E, 0x1770, 0x1772, 0x1773, }, } m["Takr"] = process_ranges{ "Takri", 759202, "abugida", ranges = { 0x0964, 0x0965, 0xA830, 0xA839, 0x11680, 0x116B9, 0x116C0, 0x116C9, }, normalizationFixes = handle_normalization_fixes{ from = {"𑚀𑚭", "𑚀𑚴", "𑚀𑚵", "𑚆𑚲"}, to = {"𑚁", "𑚈", "𑚉", "𑚇"} }, } m["Tale"] = process_ranges{ "Tai Nüa", 2566326, "abugida", aliases = {"Tai Nuea", "New Tai Nüa", "New Tai Nuea", "Dehong Dai", "Tai Dehong", "Tai Le"}, ranges = { 0x1040, 0x1049, 0x1950, 0x196D, 0x1970, 0x1974, }, spaces = false, } m["Talu"] = process_ranges{ "New Tai Lue", 3498863, "abugida", ranges = { 0x1980, 0x19AB, 0x19B0, 0x19C9, 0x19D0, 0x19DA, 0x19DE, 0x19DF, }, spaces = false, } m["Taml"] = process_ranges{ "Tamil", 26803, "abugida", ranges = { 0x0951, 0x0952, 0x0964, 0x0965, 0x0B82, 0x0B83, 0x0B85, 0x0B8A, 0x0B8E, 0x0B90, 0x0B92, 0x0B95, 0x0B99, 0x0B9A, 0x0B9C, 0x0B9C, 0x0B9E, 0x0B9F, 0x0BA3, 0x0BA4, 0x0BA8, 0x0BAA, 0x0BAE, 0x0BB9, 0x0BBE, 0x0BC2, 0x0BC6, 0x0BC8, 0x0BCA, 0x0BCD, 0x0BD0, 0x0BD0, 0x0BD7, 0x0BD7, 0x0BE6, 0x0BFA, 0x1CDA, 0x1CDA, 0xA8F3, 0xA8F3, 0x11301, 0x11301, 0x11303, 0x11303, 0x1133B, 0x1133C, 0x11FC0, 0x11FF1, 0x11FFF, 0x11FFF, }, normalizationFixes = handle_normalization_fixes{ from = {"அூ", "ஸ்ரீ"}, to = {"ஆ", "ஶ்ரீ"} }, } m["Tang"] = process_ranges{ "Tangut", 1373610, "logography, syllabary", ranges = { 0x31EF, 0x31EF, 0x16FE0, 0x16FE0, 0x17000, 0x187F7, 0x18800, 0x18AFF, 0x18D00, 0x18D08, }, spaces = false, translit = "txg-translit", } m["Tavt"] = process_ranges{ "Tai Viet", 11818517, "abugida", ranges = { 0xAA80, 0xAAC2, 0xAADB, 0xAADF, }, spaces = false, } m["Tayo"] = process_ranges{ "Lai Tay", 16306701, "abugida", aliases = {"Tai Yo"}, direction = "vertical-rtl", ranges = { 0x1E6C0, 0x1E6DE, 0x1E6E0, 0x1E6F5, 0x1E6FE, 0x1E6FF, }, spaces = false, } m["Telu"] = process_ranges{ "Telugu", 570450, "abugida", ranges = { 0x0951, 0x0952, 0x0964, 0x0965, 0x0C00, 0x0C0C, 0x0C0E, 0x0C10, 0x0C12, 0x0C28, 0x0C2A, 0x0C39, 0x0C3C, 0x0C44, 0x0C46, 0x0C48, 0x0C4A, 0x0C4D, 0x0C55, 0x0C56, 0x0C58, 0x0C5A, 0x0C5D, 0x0C5D, 0x0C60, 0x0C63, 0x0C66, 0x0C6F, 0x0C77, 0x0C7F, 0x1CDA, 0x1CDA, 0x1CF2, 0x1CF2, }, normalizationFixes = handle_normalization_fixes{ from = {"ఒౌ", "ఒౕ", "ిౕ", "ెౕ", "ొౕ"}, to = {"ఔ", "ఓ", "ీ", "ే", "ో"} }, } m["Teng"] = { "Tengwar", 473725, } m["Tfng"] = process_ranges{ "Tifinagh", 208503, "abjad, alphabet", ranges = { 0x2D30, 0x2D67, 0x2D6F, 0x2D70, 0x2D7F, 0x2D7F, }, other_names = {"Libyco-Berber", "Berber"}, -- per Wikipedia, Libyco-Berber is the parent } m["Tglg"] = process_ranges{ "Baybayin", 812124, "abugida", aliases = {"Tagalog"}, varieties = {"Badlit", "Basahan", "Kur-itan"}, ranges = { 0x1700, 0x1715, 0x171F, 0x171F, 0x1735, 0x1736, }, } m["Thaa"] = process_ranges{ "Thaana", 877906, "abugida", ranges = { 0x060C, 0x060C, 0x061B, 0x061C, 0x061F, 0x061F, 0x0660, 0x0669, 0x0780, 0x07B1, 0xFDF2, 0xFDF2, 0xFDFD, 0xFDFD, }, direction = "rtl", } m["Thai"] = process_ranges{ "Thai", 236376, "abugida", ranges = { 0x0E01, 0x0E3A, 0x0E40, 0x0E5B, }, spaces = false, } do local Tibt_displaytext = { from = {"ༀ", "༌", "།།", "༚༚", "༚༝", "༝༚", "༝༝", "ཷ", "ཹ", "ེེ", "ོོ"}, to = {"ཨོཾ", "་", "༎", "༛", "༟", "࿎", "༞", "ྲཱྀ", "ླཱྀ", "ཻ", "ཽ"} } m["Tibt"] = process_ranges{ "Tibetan", 46861, "abugida", ranges = { 0x0F00, 0x0F47, 0x0F49, 0x0F6C, 0x0F71, 0x0F97, 0x0F99, 0x0FBC, 0x0FBE, 0x0FCC, 0x0FCE, 0x0FD4, 0x0FD9, 0x0FDA, 0x3008, 0x300B, }, normalizationFixes = handle_normalization_fixes{ combiningClasses = {["༹"] = 1}, from = {"ཷ", "ཹ"}, to = {"ྲཱྀ", "ླཱྀ"} }, display_text = Tibt_displaytext, strip_diacritics = Tibt_displaytext, sort_key = "Tibt-sortkey", translit = "Tibt-translit", } m["sit-tam-Tibt"] = { "Tamyig", 109875213, m["Tibt"][3], -- There is no inheritance of properties currently implemented for scripts. Per [[User:Theknightwho]], this -- is because it's tricky to do since there are several types of child scripts: those that are mere display -- variants (like fa-Arab), which should be eliminated in favor of CSS language selectors to -- handle the font differences; those that are genuinely different scripts that happen to share the same -- Unicode codepoints but have mostly different properties (e.g. Manchu vs. Mongolian); and those that are -- somewhere in between (like Tamyig vs. Tibetan). As a result, we currently have to manually specify -- which properties we want inherited as follows. ranges = m["Tibt"].ranges, characters = m["Tibt"].characters, parent = "Tibt", normalizationFixes = m["Tibt"].normalizationFixes, display_text = m["Tibt"].display_text, strip_diacritics = m["Tibt"].strip_diacritics, sort_key = m["Tibt"].sort_key, translit = m["Tibt"].translit, } end m["Tirh"] = process_ranges{ "Tirhuta", 1765752, "abugida", ranges = { 0x0951, 0x0952, 0x0964, 0x0965, 0x1CF2, 0x1CF2, 0xA830, 0xA839, 0x11480, 0x114C7, 0x114D0, 0x114D9, }, normalizationFixes = handle_normalization_fixes{ from = {"𑒁𑒰", "𑒋𑒺", "𑒍𑒺", "𑒪𑒵", "𑒪𑒶"}, to = {"𑒂", "𑒌", "𑒎", "𑒉", "𑒊"} }, } m["Tnsa"] = process_ranges{ "Tangsa", 105576311, "alphabet", ranges = { 0x16A70, 0x16ABE, 0x16AC0, 0x16AC9, }, } m["Todr"] = process_ranges{ "Todhri", 10274731, "alphabet", direction = "rtl", ranges = { 0x105C0, 0x105F3, }, } m["Tols"] = { "Tolong Siki", 4459822, "alphabet", -- Not in Unicode } m["Toto"] = process_ranges{ "Toto", 104837516, "abugida", ranges = { 0x1E290, 0x1E2AE, }, } m["Tutg"] = process_ranges{ "Tigalari", 2604990, "abugida", aliases = {"Tulu"}, ranges = { 0x1CF2, 0x1CF2, 0x1CF4, 0x1CF4, 0xA8F1, 0xA8F1, 0x11380, 0x11389, 0x1138B, 0x1138B, 0x1138E, 0x1138E, 0x11390, 0x113B5, 0x113B7, 0x113C0, 0x113C2, 0x113C2, 0x113C5, 0x113C5, 0x113C7, 0x113CA, 0x113CC, 0x113D5, 0x113D7, 0x113D8, 0x113E1, 0x113E2, }, } m["Ugar"] = process_ranges{ "Ugaritic", 332652, "abjad", ranges = { 0x10380, 0x1039D, 0x1039F, 0x1039F, }, } m["Vaii"] = process_ranges{ "Vai", 523078, "syllabary", ranges = { 0xA500, 0xA62B, }, } m["Visp"] = { "Visible Speech", 1303365, "alphabet", -- Not in Unicode } m["Vith"] = process_ranges{ "Vithkuqi", 3301993, "alphabet", ranges = { 0x10570, 0x1057A, 0x1057C, 0x1058A, 0x1058C, 0x10592, 0x10594, 0x10595, 0x10597, 0x105A1, 0x105A3, 0x105B1, 0x105B3, 0x105B9, 0x105BB, 0x105BC, }, capitalized = true, } m["Wara"] = process_ranges{ "Varang Kshiti", 79199, aliases = {"Warang Citi"}, ranges = { 0x118A0, 0x118F2, 0x118FF, 0x118FF, }, capitalized = true, } m["Wcho"] = process_ranges{ "Wancho", 33713728, "alphabet", ranges = { 0x1E2C0, 0x1E2F9, 0x1E2FF, 0x1E2FF, }, } m["Wole"] = { "Woleai", 6643710, "syllabary", -- Not in Unicode } m["Xpeo"] = process_ranges{ "Old Persian", 1471822, ranges = { 0x103A0, 0x103C3, 0x103C8, 0x103D5, }, } m["Xsux"] = process_ranges{ "Cuneiform", 401, aliases = {"Sumero-Akkadian Cuneiform"}, ranges = { 0x12000, 0x12399, 0x12400, 0x1246E, 0x12470, 0x12474, 0x12480, 0x12543, }, } m["Yezi"] = process_ranges{ "Yezidi", 13175481, "alphabet", ranges = { 0x060C, 0x060C, 0x061B, 0x061B, 0x061F, 0x061F, 0x0660, 0x0669, 0x10E80, 0x10EA9, 0x10EAB, 0x10EAD, 0x10EB0, 0x10EB1, }, direction = "rtl", } m["Yiii"] = process_ranges{ "Yi", 1197646, "syllabary", ranges = { 0x3001, 0x3002, 0x3008, 0x3011, 0x3014, 0x301B, 0x30FB, 0x30FB, 0xA000, 0xA48C, 0xA490, 0xA4C6, 0xFF61, 0xFF65, }, } m["Zanb"] = process_ranges{ "Zanabazar Square", 50809208, "abugida", ranges = { 0x11A00, 0x11A47, }, } m["Zmth"] = process_ranges{ "mathematical notation", 1140046, ranges = { 0x00AC, 0x00AC, 0x00B1, 0x00B1, 0x00D7, 0x00D7, 0x00F7, 0x00F7, 0x03D0, 0x03D2, 0x03D5, 0x03D5, 0x03F0, 0x03F1, 0x03F4, 0x03F6, 0x0606, 0x0608, 0x2016, 0x2016, 0x2032, 0x2034, 0x2040, 0x2040, 0x2044, 0x2044, 0x2052, 0x2052, 0x205F, 0x205F, 0x2061, 0x2064, 0x207A, 0x207E, 0x208A, 0x208E, 0x20D0, 0x20DC, 0x20E1, 0x20E1, 0x20E5, 0x20E6, 0x20EB, 0x20EF, 0x2102, 0x2102, 0x2107, 0x2107, 0x210A, 0x2113, 0x2115, 0x2115, 0x2118, 0x211D, 0x2124, 0x2124, 0x2128, 0x2129, 0x212C, 0x212D, 0x212F, 0x2131, 0x2133, 0x2138, 0x213C, 0x2149, 0x214B, 0x214B, 0x2190, 0x21A7, 0x21A9, 0x21AE, 0x21B0, 0x21B1, 0x21B6, 0x21B7, 0x21BC, 0x21DB, 0x21DD, 0x21DD, 0x21E4, 0x21E5, 0x21F4, 0x22FF, 0x2308, 0x230B, 0x2320, 0x2321, 0x237C, 0x237C, 0x239B, 0x23B5, 0x23B7, 0x23B7, 0x23D0, 0x23D0, 0x23DC, 0x23E2, 0x25A0, 0x25A1, 0x25AE, 0x25B7, 0x25BC, 0x25C1, 0x25C6, 0x25C7, 0x25CA, 0x25CB, 0x25CF, 0x25D3, 0x25E2, 0x25E2, 0x25E4, 0x25E4, 0x25E7, 0x25EC, 0x25F8, 0x25FF, 0x2605, 0x2606, 0x2640, 0x2640, 0x2642, 0x2642, 0x2660, 0x2663, 0x266D, 0x266F, 0x27C0, 0x27FF, 0x2900, 0x2AFF, 0x2B30, 0x2B44, 0x2B47, 0x2B4C, 0xFB29, 0xFB29, 0xFE61, 0xFE66, 0xFE68, 0xFE68, 0xFF0B, 0xFF0B, 0xFF1C, 0xFF1E, 0xFF3C, 0xFF3C, 0xFF3E, 0xFF3E, 0xFF5C, 0xFF5C, 0xFF5E, 0xFF5E, 0xFFE2, 0xFFE2, 0xFFE9, 0xFFEC, 0x1D400, 0x1D454, 0x1D456, 0x1D49C, 0x1D49E, 0x1D49F, 0x1D4A2, 0x1D4A2, 0x1D4A5, 0x1D4A6, 0x1D4A9, 0x1D4AC, 0x1D4AE, 0x1D4B9, 0x1D4BB, 0x1D4BB, 0x1D4BD, 0x1D4C3, 0x1D4C5, 0x1D505, 0x1D507, 0x1D50A, 0x1D50D, 0x1D514, 0x1D516, 0x1D51C, 0x1D51E, 0x1D539, 0x1D53B, 0x1D53E, 0x1D540, 0x1D544, 0x1D546, 0x1D546, 0x1D54A, 0x1D550, 0x1D552, 0x1D6A5, 0x1D6A8, 0x1D7CB, 0x1D7CE, 0x1D7FF, 0x1EE00, 0x1EE03, 0x1EE05, 0x1EE1F, 0x1EE21, 0x1EE22, 0x1EE24, 0x1EE24, 0x1EE27, 0x1EE27, 0x1EE29, 0x1EE32, 0x1EE34, 0x1EE37, 0x1EE39, 0x1EE39, 0x1EE3B, 0x1EE3B, 0x1EE42, 0x1EE42, 0x1EE47, 0x1EE47, 0x1EE49, 0x1EE49, 0x1EE4B, 0x1EE4B, 0x1EE4D, 0x1EE4F, 0x1EE51, 0x1EE52, 0x1EE54, 0x1EE54, 0x1EE57, 0x1EE57, 0x1EE59, 0x1EE59, 0x1EE5B, 0x1EE5B, 0x1EE5D, 0x1EE5D, 0x1EE5F, 0x1EE5F, 0x1EE61, 0x1EE62, 0x1EE64, 0x1EE64, 0x1EE67, 0x1EE6A, 0x1EE6C, 0x1EE72, 0x1EE74, 0x1EE77, 0x1EE79, 0x1EE7C, 0x1EE7E, 0x1EE7E, 0x1EE80, 0x1EE89, 0x1EE8B, 0x1EE9B, 0x1EEA1, 0x1EEA3, 0x1EEA5, 0x1EEA9, 0x1EEAB, 0x1EEBB, 0x1EEF0, 0x1EEF1, }, translit = false, } m["Zname"] = process_ranges{ "Znamenny musical notation", 965834, "pictography", ranges = { 0x1CF00, 0x1CF2D, 0x1CF30, 0x1CF46, 0x1CF50, 0x1CFC3, }, ietf_subtag = "Zsym", translit = false, } m["Zsym"] = process_ranges{ "symbolic", 80071, "pictography", ranges = { 0x20DD, 0x20E0, 0x20E2, 0x20E4, 0x20E7, 0x20EA, 0x20F0, 0x20F0, 0x2100, 0x2101, 0x2103, 0x2106, 0x2108, 0x2109, 0x2114, 0x2114, 0x2116, 0x2117, 0x211E, 0x2123, 0x2125, 0x2127, 0x212A, 0x212B, 0x212E, 0x212E, 0x2132, 0x2132, 0x2139, 0x213B, 0x214A, 0x214A, 0x214C, 0x214F, 0x21A8, 0x21A8, 0x21AF, 0x21AF, 0x21B2, 0x21B5, 0x21B8, 0x21BB, 0x21DC, 0x21DC, 0x21DE, 0x21E3, 0x21E6, 0x21F3, 0x2300, 0x2307, 0x230C, 0x231F, 0x2322, 0x237B, 0x237D, 0x239A, 0x23B6, 0x23B6, 0x23B8, 0x23CF, 0x23D1, 0x23DB, 0x23E3, 0x23FF, 0x2500, 0x259F, 0x25A2, 0x25AD, 0x25B8, 0x25BB, 0x25C2, 0x25C5, 0x25C8, 0x25C9, 0x25CC, 0x25CE, 0x25D4, 0x25E1, 0x25E3, 0x25E3, 0x25E5, 0x25E6, 0x25ED, 0x25F7, 0x2600, 0x2604, 0x2607, 0x263F, 0x2641, 0x2641, 0x2643, 0x265F, 0x2664, 0x266C, 0x2670, 0x27BF, 0x2B00, 0x2B2F, 0x2B45, 0x2B46, 0x2B4D, 0x2B73, 0x2B76, 0x2B95, 0x2B97, 0x2BFF, 0x4DC0, 0x4DFF, 0x1F000, 0x1F02B, 0x1F030, 0x1F093, 0x1F0A0, 0x1F0AE, 0x1F0B1, 0x1F0BF, 0x1F0C1, 0x1F0CF, 0x1F0D1, 0x1F0F5, 0x1F300, 0x1F6D7, 0x1F6DC, 0x1F6EC, 0x1F6F0, 0x1F6FC, 0x1F700, 0x1F776, 0x1F77B, 0x1F7D9, 0x1F7E0, 0x1F7EB, 0x1F7F0, 0x1F7F0, 0x1F800, 0x1F80B, 0x1F810, 0x1F847, 0x1F850, 0x1F859, 0x1F860, 0x1F887, 0x1F890, 0x1F8AD, 0x1F8B0, 0x1F8B1, 0x1F900, 0x1FA53, 0x1FA60, 0x1FA6D, 0x1FA70, 0x1FA7C, 0x1FA80, 0x1FA88, 0x1FA90, 0x1FABD, 0x1FABF, 0x1FAC5, 0x1FACE, 0x1FADB, 0x1FAE0, 0x1FAE8, 0x1FAF0, 0x1FAF8, 0x1FB00, 0x1FB92, 0x1FB94, 0x1FBCA, 0x1FBF0, 0x1FBF9, }, translit = false, character_category = false, -- none } m["Zxxx"] = { "unwritten", 104839715, -- This should not have any characters listed translit = false, character_category = false, -- none } m["Zyyy"] = { "undetermined", 104839687, -- This should not have any characters listed, probably translit = false, character_category = false, -- none } m["Zzzz"] = { "uncoded", 104839675, -- This should not have any characters listed translit = false, character_category = false, -- none } -- These should be defined after the scripts they are composed of. m["Hrkt"] = process_ranges{ "Kana", 187659, "syllabary", aliases = {"Japanese syllabaries"}, ranges = union( m["Hira"].ranges, m["Kana"].ranges ), spaces = false, } m["Jpan"] = process_ranges{ "Japanese", 190502, "logography, syllabary", ranges = union( m["Hrkt"].ranges, m["Hani"].ranges, m["Latn"].ranges ), spaces = false, sort_by_scraping = true, } m["Kore"] = process_ranges{ "Korean", 711797, "logography, syllabary", ranges = union( m["Hang"].ranges, m["Hani"].ranges, m["Latn"].ranges ), -- `漢字(한자)`→`漢字` -- `가-나-다`→`가나다`, `가--나--다`→`가-나-다` -- `온돌(溫突/溫堗)`→`온돌` ([[ondol]]) strip_diacritics = { remove_diacritics = u(0x302E) .. u(0x302F), from = {"([" .. m["Hani"].characters .. "])%(.-%)", "^%-", "%-$", "%-(%-?)", "\1", "%([" .. m["Hani"].characters .. "/]+%)"}, to = {"%1", "\1", "\1", "%1", "-"} } } return require("Module:languages").finalizeData(m, "script") 9sspbdakjsd6y1scsky44ytlagvjvy1 मॉड्यूल:script utilities 828 302131 487785 477441 2026-09-02T17:17:56Z SM7 6218 updating... 487785 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 &gt; 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("&gt;", ""):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("&gt;", ""):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. mnc-Mong adds both Mong and mnc-Mong 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 = "लिपि" -- 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 rzm4o5bgeoygyloax24lbwgngj7wpo6 मॉड्यूल:script utilities/data 828 302134 487787 477442 2026-09-02T17:19:13Z SM7 6218 updating... 487787 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 मॉड्यूल:headword 828 302137 487781 487589 2026-09-02T17:12:39Z SM7 6218 localization... 487781 Scribunto text/plain local export = {} -- Named constants for all modules used, to make it easier to swap out sandbox versions. local debug_track_module = "Module:debug/track" local en_utilities_module = "Module:en-utilities" local gender_and_number_module = "Module:gender and number" local headword_data_module = "Module:headword/data" local headword_page_module = "Module:headword/page" local links_module = "Module:links" local load_module = "Module:load" local pages_module = "Module:pages" local palindromes_module = "Module:palindromes" local pron_qualifier_module = "Module:pron qualifier" local scripts_module = "Module:scripts" local scripts_data_module = "Module:scripts/data" local script_utilities_module = "Module:script utilities" local script_utilities_data_module = "Module:script utilities/data" local string_utilities_module = "Module:string utilities" local table_module = "Module:table" local utilities_module = "Module:utilities" local concat = table.concat local dump = mw.dumpObject local insert = table.insert local ipairs = ipairs local max = math.max local new_title = mw.title.new local pairs = pairs local require = require local toNFC = mw.ustring.toNFC local toNFD = mw.ustring.toNFD local type = type local ufind = mw.ustring.find local ugmatch = mw.ustring.gmatch local ugsub = mw.ustring.gsub 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 debug_track(...) debug_track = require(debug_track_module) return debug_track(...) end local function contains(...) contains = require(table_module).contains return contains(...) end local function encode_entities(...) encode_entities = require(string_utilities_module).encode_entities 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_pron_qualifiers(...) format_pron_qualifiers = require(pron_qualifier_module).format_qualifiers return format_pron_qualifiers(...) end local function full_link(...) full_link = require(links_module).full_link return full_link(...) end local function get_current_L2(...) get_current_L2 = require(pages_module).get_current_L2 return get_current_L2(...) end local function get_link_page(...) get_link_page = require(links_module).get_link_page return get_link_page(...) end local function get_script(...) get_script = require(scripts_module).getByCode return get_script(...) end local function is_palindrome(...) is_palindrome = require(palindromes_module).is_palindrome return is_palindrome(...) end local function language_link(...) language_link = require(links_module).language_link return language_link(...) end local function load_data(...) load_data = require(load_module).load_data return load_data(...) end local function pattern_escape(...) pattern_escape = require(string_utilities_module).pattern_escape return pattern_escape(...) end local function pluralize(...) pluralize = require(en_utilities_module).pluralize return pluralize(...) end local function process_page(...) process_page = require(headword_page_module).process_page return process_page(...) end local function remove_links(...) remove_links = require(links_module).remove_links return remove_links(...) end local function shallow_copy(...) shallow_copy = require(table_module).shallowCopy return shallow_copy(...) end local function tag_text(...) tag_text = require(script_utilities_module).tag_text return tag_text(...) end local function tag_transcription(...) tag_transcription = require(script_utilities_module).tag_transcription return tag_transcription(...) 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 ulen(...) ulen = require(string_utilities_module).len return ulen(...) 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 = load_data(headword_data_module) return m_data end local script_data local function get_script_data() script_data = load_data(scripts_data_module) return script_data end local script_utilities_data local function get_script_utilities_data() script_utilities_data = load_data(script_utilities_data_module) return script_utilities_data end -- If set to true, categories always appear, even in non-mainspace pages local test_force_categories = false -- Add a tracking category to track entries with certain (unusually undesirable) properties. `track_id` is an identifier -- for the particular property being tracked and goes into the tracking page. Specifically, this adds a link in the -- page text to [[Wiktionary:Tracking/headword/TRACK_ID]], meaning you can find all entries with the `track_id` property -- by visiting [[Special:WhatLinksHere/Wiktionary:Tracking/headword/TRACK_ID]]. -- -- If `lang` (a language object) is given, an additional tracking page [[Wiktionary:Tracking/headword/TRACK_ID/CODE]] is -- linked to where CODE is the language code of `lang`, and you can find all entries in the combination of `track_id` -- and `lang` by visiting [[Special:WhatLinksHere/Wiktionary:Tracking/headword/TRACK_ID/CODE]]. This makes it possible to -- isolate only the entries with a specific tracking property that are in a given language. Note that if `lang` -- references at etymology-only language, both that language's code and its full parent's code are tracked. local function track(track_id, lang) local tracking_page = "headword/" .. track_id if lang and lang:hasType("etymology-only") then debug_track{tracking_page, tracking_page .. "/" .. lang:getCode(), tracking_page .. "/" .. lang:getFullCode()} elseif lang then debug_track{tracking_page, tracking_page .. "/" .. lang:getCode()} else debug_track(tracking_page) end return true end local function text_in_script(text, script_code) local sc = get_script(script_code) if not sc then error("Internal error: Bad script code " .. script_code) end local characters = sc.characters local out if characters then text = ugsub(text, "%W", "") out = ufind(text, "[" .. characters .. "]") end if out then return true else return false end end local spacingPunctuation = "[%s%p]+" --[[ List of punctuation or spacing characters that are found inside of words. Used to exclude characters from the regex above. ]] local wordPunc = "-#%%&@־׳״'.·*’་•:᠊" local notWordPunc = "[^" .. wordPunc .. "]+" -- Format a term (either a head term or an inflection term) along with any left or right qualifiers, labels, references -- or customized separator: `part` is the object specifying the term (and `lang` the language of the term), which should -- optionally contain: -- * left qualifiers in `q`, an array of strings; -- * right qualifiers in `qq`, an array of strings; -- * left labels in `l`, an array of strings; -- * right labels in `ll`, an array of strings; -- * 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`; -- * a separator in `separator`, defaulting to " <i>or</i> " if this is not the first term (j > 1), otherwise "". -- `formatted` is the formatted version of the term itself, and `j` is the index of the term. local function format_term_with_qualifiers_and_refs(lang, part, formatted, j) local function part_non_empty(field) local list = part[field] if not list then return nil end if type(list) ~= "table" then error(("Internal error: Wrong type for `part.%s`=%s, should be \"table\""):format(field, dump(list))) end return list[1] end if part_non_empty("q") or part_non_empty("qq") or part_non_empty("l") or part_non_empty("ll") or part_non_empty("refs") then formatted = format_pron_qualifiers { lang = lang, text = formatted, q = part.q, qq = part.qq, l = part.l, ll = part.ll, refs = part.refs, } end local separator = part.separator or j > 1 and " <i>अथवा</i> " -- use "" to request no separator if separator then formatted = separator .. formatted end return formatted end --[==[Return true if the given head is multiword according to the algorithm used in full_headword().]==] function export.head_is_multiword(head) for possibleWordBreak in ugmatch(head, spacingPunctuation) do if umatch(possibleWordBreak, notWordPunc) then return true end end return false end do local function workaround_to_exclude_chars(s) return (ugsub(s, notWordPunc, "\2%1\1")) end --[==[ Add appropriate links to `head`, correctly handling multiword terms. This is intended for multiword terms but can be used for any term if you want links added to single-word terms as well. If you want to only add links to multiword terms, first check that the term is multiword using `head_is_multiword`. If `default` is specified, this will escape colons so that they don't get interpreted as interwiki links. This should generally only be used when `head` is an actual pagename or is taken from a {{para|pagename}} parameter, not when taken from a {{para|head}} parameter. ]==] function export.add_multiword_links(head, default) head = "\1" .. ugsub(head, spacingPunctuation, workaround_to_exclude_chars) .. "\2" if default then head = head :gsub("(\1[^\2]*)\\([:#][^\2]*\2)", "%1\\\\%2") :gsub("(\1[^\2]*)([:#][^\2]*\2)", "%1\\%2") end --Escape any remaining square brackets to stop them breaking links (e.g. "[citation needed]"). head = encode_entities(head, "[]", true, true) --[=[ use this when workaround is no longer needed: head = "[[" .. ugsub(head, WORDBREAKCHARS, "]]%1[[") .. "]]" Remove any empty links, which could have been created above at the beginning or end of the string. ]=] return (head :gsub("\1\2", "") :gsub("[\1\2]", {["\1"] = "[[", ["\2"] = "]]"})) end end local function non_categorizable(full_raw_pagename) return full_raw_pagename:find("^Appendix:Gestures/") or -- Unsupported titles with descriptive names. (full_raw_pagename:find("^Unsupported titles/") and not full_raw_pagename:find("`")) end local function tag_text_and_add_quals_and_refs(data, head, formatted, j) -- Add language and script wrapper. formatted = tag_text(formatted, data.lang, head.sc, "head", nil, j == 1 and data.id or nil) -- Add qualifiers, labels, references and separator. return format_term_with_qualifiers_and_refs(data.lang, head, formatted, j) end -- Format a headword with transliterations. local function format_headword(data) -- Are there non-empty transliterations? local has_translits = false local has_manual_translits = false ------ Format the headwords. ------ local head_parts = {} local unique_head_parts = {} local has_multiple_heads = not not data.heads[2] for j, head in ipairs(data.heads) do if head.tr or head.ts then has_translits = true end if head.tr and head.tr_manual or head.ts then has_manual_translits = true end local formatted -- Apply processing to the headword, for formatting links and such. if head.term:find("[[", nil, true) and head.sc:getCode() ~= "Image" then formatted = language_link{term = head.term, lang = data.lang} else formatted = data.lang:makeDisplayText(head.term, head.sc, true) end local head_part = tag_text_and_add_quals_and_refs(data, head, formatted, j) insert(head_parts, head_part) -- If multiple heads, try to determine whether all heads display the same. To do this we need to effectively -- rerun the text tagging and addition of qualifiers and references, using 1 for all indices. if has_multiple_heads then local unique_head_part if j == 1 then unique_head_part = head_part else unique_head_part = tag_text_and_add_quals_and_refs(data, head, formatted, 1) end unique_head_parts[unique_head_part] = true end end local set_size = 0 if has_multiple_heads then for _ in pairs(unique_head_parts) do set_size = set_size + 1 end end if set_size == 1 then head_parts = head_parts[1] else head_parts = concat(head_parts) end if has_manual_translits then -- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/manual-tr]] -- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/manual-tr/LANGCODE]] track("manual-tr", data.lang) end ------ Format the transliterations and transcriptions. ------ local translits_formatted if has_translits then local translit_parts = {} for _, head in ipairs(data.heads) do if head.tr or head.ts then local this_parts = {} if head.tr then insert(this_parts, tag_translit(head.tr, data.lang:getCode(), "head", nil, head.tr_manual)) if head.ts then insert(this_parts, " ") end end if head.ts then insert(this_parts, "/" .. tag_transcription(head.ts, data.lang:getCode(), "head") .. "/") end insert(translit_parts, concat(this_parts)) end end translits_formatted = " (" .. concat(translit_parts, " <i>अथवा</i> ") .. ")" local langname = data.lang:getCanonicalName() local transliteration_page = new_title(langname .. " ट्रांसलिट्रेशन", "विक्षनरी") local saw_translit_page = false if transliteration_page and transliteration_page:getContent() then translits_formatted = " [[विक्षनरी:" .. langname .. " ट्रांसलिट्रेशन|•]]" .. translits_formatted saw_translit_page = true end -- If data.lang is an etymology-only language and we didn't find a translation page for it, fall back to the -- full parent. if not saw_translit_page and data.lang:hasType("etymology-only") then langname = data.lang:getFullName() transliteration_page = new_title(langname .. " ट्रांसलिट्रेशन", "विक्षनरी") if transliteration_page and transliteration_page:getContent() then translits_formatted = " [[विक्षनरी:" .. langname .. " ट्रांसलिट्रेशन|•]]" .. translits_formatted end end else translits_formatted = "" end ------ Paste heads and transliterations/transcriptions. ------ local lemma_gloss if data.gloss then lemma_gloss = ' <span class="ib-content qualifier-content">' .. data.gloss .. '</span>' else lemma_gloss = "" end return head_parts .. translits_formatted .. lemma_gloss end local function format_headword_genders(data, is_varform_only) local retval = "" if data.genders and data.genders[1] then if data.gloss then retval = "," end local pos_for_cat if not data.nogendercat and not is_varform_only then local no_gender_cat = (m_data or get_data()).no_gender_cat if not (no_gender_cat[data.lang:getCode()] or no_gender_cat[data.lang:getFullCode()]) then pos_for_cat = (m_data or get_data()).pos_for_gender_number_cat[data.pos_category:gsub("^reconstructed ", "")] end end local text, cats = format_genders(data.genders, data.lang, pos_for_cat) if cats then extend(data.categories, cats) end retval = retval .. "&nbsp;" .. text end return retval end -- Forward reference local format_inflections local function format_inflection_parts(data, parts) for j, part in ipairs(parts) do if type(part) ~= "table" then part = {term = part} end local partaccel = part.accel local face = part.face or "bold" if face ~= "bold" and face ~= "plain" and face ~= "hypothetical" then error("The face `" .. face .. "` " .. ( (script_utilities_data or get_script_utilities_data()).faces[face] and "should not be used for non-headword terms on the headword line." or "is invalid." )) end -- Here the final part 'or data.nolinkinfl' allows to have 'nolinkinfl=true' -- right into the 'data' table to disable inflection links of the entire headword -- when inflected forms aren't entry-worthy, e.g.: in Vulgar Latin local nolinkinfl = part.face == "hypothetical" or (part.nolink and track("nolink") or part.nolinkinfl) or ( data.nolink and track("nolink") or data.nolinkinfl) local formatted if part.label then -- FIXME: There should be a better way of italicizing a label. As is, this isn't customizable. formatted = "<i>" .. part.label .. "</i>" else -- Convert the term into a full link. Don't show a transliteration here unless enable_auto_translit is -- requested, either at the `parts` level (i.e. per inflection) or at the `data.inflections` level (i.e. -- specified for all inflections). This is controllable in {{head}} using autotrinfl=1 for all inflections, -- or fNautotr=1 for an individual inflection (remember that a single inflection may be associated with -- multiple terms). The reason for doing this is to avoid clutter in headword lines by default in languages -- where the script is relatively straightforward to read by learners (e.g. Greek, Russian), but allow it -- to be enabled in languages with more complex scripts (e.g. Arabic). -- -- FIXME: With nested inflections, should we also respect `enable_auto_translit` at the top level of the -- nested inflections structure? local tr = part.tr or not (parts.enable_auto_translit or data.inflections.enable_auto_translit) and "-" or nil -- FIXME: Temporary errors added 2025-10-03. Remove after a month or so. if part.translit then error("Internal error: Use field `tr` not `translit` for specifying an inflection part translit") end if part.transcription then error("Internal error: Use field `ts` not `transcription` for specifying an inflection part transcription") end local postprocess_annotations if part.inflections then postprocess_annotations = function(infldata) insert(infldata.annotations, format_inflections(data, part.inflections)) end end formatted = full_link( { term = not nolinkinfl and part.term or nil, alt = part.alt or (nolinkinfl and part.term or nil), lang = part.lang or data.lang, sc = part.sc or parts.sc or nil, gloss = part.gloss, pos = part.pos, lit = part.lit, id = part.id, genders = part.genders, tr = tr, ts = part.ts, accel = partaccel or parts.accel, postprocess_annotations = postprocess_annotations, }, face ) end parts[j] = format_term_with_qualifiers_and_refs(part.lang or data.lang, part, formatted, j) end local parts_output if parts[1] then parts_output = (parts.label and " " or "") .. concat(parts) elseif parts.request then parts_output = " <small>[please provide]</small>" insert(data.categories, "Requests for inflections in " .. data.lang:getFullName() .. " entries") else parts_output = "" end local parts_label = parts.label and ("<i>" .. parts.label .. "</i>") or "" return format_term_with_qualifiers_and_refs(data.lang, parts, parts_label .. parts_output, 1) end -- Format the inflections following the headword or nested after a given inflection. Declared local above. function format_inflections(data, inflections) if inflections and inflections[1] then -- Format each inflection individually. for key, infl in ipairs(inflections) do inflections[key] = format_inflection_parts(data, infl) end return concat(inflections, ", ") else return "" end end -- Format the top-level inflections following the headword. Currently this just adds parens around the -- formatted comma-separated inflections in `data.inflections`. local function format_top_level_inflections(data) local result = format_inflections(data, data.inflections) if result ~= "" then return " (" .. result .. ")" else return result end end -- Forward reference local check_red_link_inflections -- Check a single inflection (which consists of a label and zero or more terms, each possibly with nested inflections) -- for red links. If so, insert a red-link category based on `plpos` (the plural part of speech to insert in the -- category), stop further processing, and return true. If no red links found, return false. local function check_red_link_inflection_parts(data, parts, plpos) for _, part in ipairs(parts) do if type(part) ~= "table" then part = {term = part} end local term = part.term if term and not term:find("%[%[") then local stripped_physical_term = get_link_page(term, data.lang, part.sc or parts.sc or nil) if stripped_physical_term then local title = mw.title.new(stripped_physical_term) if title and not title:getContent() then insert(data.categories, data.lang:getFullName() .. " " .. plpos .. " with red links in their headword lines") return true end end end if part.inflections then if check_red_link_inflections(data, part.inflections, plpos) then return true end end end return false end -- Check a set of inflections (each of which describes a single inflection of the term, such as feminine or plural, and -- consists of a label and zero or more terms, each possibly with nested inflections) for red links. If so, insert a -- red-link category based on `plpos` (the plural part of speech to insert in the category), stop further processing, -- and return true. If no red links found, return false. function check_red_link_inflections(data, inflections, plpos) if inflections and inflections[1] then -- Check each inflection individually. for key, infl in ipairs(inflections) do if check_red_link_inflection_parts(data, infl, plpos) then return true end end end return false end -- Check the top-level inflections in `data.inflections`, along with any nested inflections, for red links. If so, -- insert a red-link category based on `plpos` (the plural part of speech to insert in the category), stop further -- processing, and return true. If no red links found, return false. local function check_red_link_inflections_top_level(data, plpos) return check_red_link_inflections(data, data.inflections, plpos) end --[==[ Returns the plural form of `pos`, a raw part of speech input, which could be singular or plural. Irregular plural POS are taken into account (e.g. "kanji" pluralizes to "kanji"). ]==] function export.pluralize_pos(pos) -- Make the plural form of the part of speech return (m_data or get_data()).irregular_plurals[pos] or pos:sub(-1) == "s" and pos or pluralize(pos) end --[==[ Return "lemma" if the given POS is a lemma, "non-lemma form" if a non-lemma form, or nil if unknown. The POS passed in must be in its plural form ("nouns", "prefixes", etc.). If you have a POS in its singular form, call {export.pluralize_pos()} above to pluralize it in a smart fashion that knows when to add "-s" and when to add "-es", and also takes into account any irregular plurals. If `best_guess` is given and the POS is in neither the lemma nor non-lemma list, guess based on whether it ends in " forms"; otherwise, return nil. ]==] function export.pos_lemma_or_nonlemma(plpos, best_guess) local m_headword_data = m_data or get_data() local isLemma = m_headword_data.lemmas -- Is it a lemma category? if isLemma[plpos] then return "लेम्मा" end local plpos_no_recon = plpos:gsub("^reconstructed ", "") if isLemma[plpos_no_recon] then return "लेम्मा" end -- Is it a nonlemma category? local isNonLemma = m_headword_data.nonlemmas if isNonLemma[plpos] or isNonLemma[plpos_no_recon] then return "non-lemma form" end local plpos_no_mut = plpos:gsub("^mutated ", "") if isLemma[plpos_no_mut] or isNonLemma[plpos_no_mut] then return "non-lemma form" elseif best_guess then return plpos:find(" forms$") and "non-lemma form" or "लेम्मा" else return nil end end --[==[ Canonicalize a part of speech as specified in 2= in {{tl|head}}. This checks for POS aliases and non-lemma form aliases ending in 'f', and then pluralizes if the POS term does not have an invariable plural. ]==] function export.canonicalize_pos(pos) -- FIXME: Temporary code to throw an error for alias 'pre' (= preposition) that will go away. if pos == "pre" then -- Don't throw error on 'pref' as it's an alias for "prefix". error("POS 'pre' for 'preposition' no longer allowed as it's too ambiguous; use 'prep'") end -- Likewise for pro = pronoun. if pos == "pro" or pos == "prof" then error("POS 'pro' for 'pronoun' no longer allowed as it's too ambiguous; use 'pron'") end local m_headword_data = m_data or get_data() if m_headword_data.pos_aliases[pos] then pos = m_headword_data.pos_aliases[pos] elseif pos:sub(-1) == "f" then pos = pos:sub(1, -2) pos = (m_headword_data.pos_aliases[pos] or pos) .. " रूप" end return export.pluralize_pos(pos) end -- Find and return the maximum index in the array `data[element]` (which may have gaps in it), and initialize it to a -- zero-length array if unspecified. Check to make sure all keys are numeric (other than "maxindex", which is set by -- [[Module:parameters]] for list parameters), all values are strings, and unless `allow_blank_string` is given, -- no blank (zero-length) strings are present. local function init_and_find_maximum_index(data, element, allow_blank_string) local maxind = 0 if not data[element] then data[element] = {} end local typ = type(data[element]) if typ ~= "table" then error(("Internal error: In full_headword(), `data.%s` must be an array but is a %s"):format(element, typ)) end for k, v in pairs(data[element]) do if k ~= "maxindex" then if type(k) ~= "number" then error(("Internal error: Unrecognized non-numeric key '%s' in `data.%s`"):format(k, element)) end if k > maxind then maxind = k end if v then if type(v) ~= "string" then error(("Internal error: For key '%s' in `data.%s`, value should be a string but is a %s"):format(k, element, type(v))) end if not allow_blank_string and v == "" then error(("Internal error: For key '%s' in `data.%s`, blank string not allowed; use 'false' for the default"):format(k, element)) end end end end return maxind end --[==[ -- Add the page to various maintenance categories for the language and the -- whole page. These are placed in the headword somewhat arbitrarily, but -- mainly because headword templates are mandatory for entries (meaning that -- in theory it provides full coverage). -- -- This is provided as an external entry point so that modules which transclude -- information from other entries (such as {{tl|ja-see}}) can take advantage -- of this feature as well, because they are used in place of a conventional -- headword template.]==] do -- Handle any manual sortkeys that have been specified in raw categories -- by tracking if they are the same or different from the automatically- -- generated sortkey, so that we can track them in maintenance -- categories. local function handle_raw_sortkeys(tbl, sortkey, page, lang, lang_cats) sortkey = sortkey or lang:makeSortKey(page.pagename) -- If there are raw categories with no sortkey, then they will be -- sorted based on the default MediaWiki sortkey, so we check against -- that. if tbl == true then if page.raw_defaultsort ~= sortkey then insert(lang_cats, lang:getFullName() .. " terms with non-redundant non-automated sortkeys") end return end local redundant, different for k in pairs(tbl) do if k == sortkey then redundant = true else different = true end end if redundant then insert(lang_cats, lang:getFullName() .. " terms with redundant sortkeys") end if different then insert(lang_cats, lang:getFullName() .. " terms with non-redundant non-automated sortkeys") end return sortkey end function export.maintenance_cats(page, lang, lang_cats, page_cats) extend(page_cats, page.cats) lang = lang:getFull() -- since we are just generating categories local canonical = lang:getCanonicalName() local tbl = page.wikitext_topic_cat[lang:getCode()] local sortkey = nil if tbl then sortkey = handle_raw_sortkeys(tbl, sortkey, page, lang, lang_cats) insert(lang_cats, canonical .. " entries with topic categories using raw markup") end tbl = page.wikitext_langname_cat[canonical] if tbl then handle_raw_sortkeys(tbl, sortkey, page, lang, lang_cats) insert(lang_cats, canonical .. " entries with language name categories using raw markup") end if get_current_L2() ~= canonical then insert(lang_cats, canonical .. " entries with incorrect language header") -- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/incorrect language header]] -- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/incorrect language header/LANGCODE]] track("incorrect language header", lang) end end end --[==[This is the primary external entry point. {{lua|full_headword(data)}} This is used by {{temp|head}} and various language-specific headword templates (e.g. {{temp|ru-adj}} for Russian adjectives, {{temp|de-noun}} for German nouns, etc.) to display an entire headword line. See [[#Further explanations for full_headword()]] ]==] function export.full_headword(data) -- Prevent data from being destructively modified. data = shallow_copy(data) ------------ 1. Basic checks for old-style (multi-arg) calling convention. ------------ if data.getCanonicalName then error("Internal error: In full_headword(), the first argument `data` needs to be a Lua object (table) of properties, not a language object") end if not data.lang or type(data.lang) ~= "table" or not data.lang.getCode then error("Internal error: In full_headword(), the first argument `data` needs to be a Lua object (table) and `data.lang` must be a language object") end if data.id and type(data.id) ~= "string" then error("Internal error: The id in the data table should be a string.") end ------------ 2. Initialize pagename etc. ------------ local langcode = data.lang:getCode() local full_langcode = data.lang:getFullCode() local langname = data.lang:getCanonicalName() local full_langname = data.lang:getFullName() local raw_pagename = data.pagename local page local m_headword_data = m_data or get_data() if raw_pagename and raw_pagename ~= m_headword_data.pagename then -- for testing, doc pages, etc. -- data.pagename is often set on documentation and test pages through the pagename= parameter of various -- templates, to emulate running on that page. Having a large number of such test templates on a single -- page often leads to timeouts, because we fetch and parse the contents of each page in turn. However, -- we don't really need to do that and can function fine without fetching and parsing the contents of a -- given page, so turn off content fetching/parsing (and also setting the DEFAULTSORT key through a parser -- function, which is *slooooow*) in certain namespaces where test and documentation templates are likely to -- be found and where actual content does not live (User, Template, Module). local actual_namespace = m_headword_data.page.namespace local no_fetch_content = actual_namespace == "सदस्य" or actual_namespace == "साँचा" or actual_namespace == "मॉड्यूल" page = process_page(raw_pagename, no_fetch_content) else page = m_headword_data.page end local namespace = page.namespace if data.altform then -- Temporary tracking for use of old altform= track("altform", data.lang) end local is_varform_only = data.var and data.var ~= "both" local is_varform_both = data.var == "both" ------------ 3. Initialize `data.heads` table; if old-style, convert to new-style. ------------ if type(data.heads) == "table" and type(data.heads[1]) == "table" then -- new-style if data.translits or data.transcriptions then error("Internal error: In full_headword(), if `data.heads` is new-style (array of head objects), `data.translits` and `data.transcriptions` cannot be given") end else -- convert old-style `heads`, `translits` and `transcriptions` to new-style local maxind = max( init_and_find_maximum_index(data, "heads"), init_and_find_maximum_index(data, "translits", true), init_and_find_maximum_index(data, "transcriptions", true) ) for i = 1, maxind do data.heads[i] = { term = data.heads[i], tr = data.translits[i], ts = data.transcriptions[i], } end end -- Make sure there's at least one head. if not data.heads[1] then data.heads[1] = {} end ------------ 4. Initialize and validate `data.categories` and `data.whole_page_categories`, and determine `pos_category` if not given, and add basic categories. ------------ init_and_find_maximum_index(data, "श्रेणियाँ") init_and_find_maximum_index(data, "whole_page_categories") local pos_category_already_present = false if data.categories[1] then local escaped_langname = pattern_escape(full_langname) local matches_lang_pattern = "^" .. escaped_langname .. " " for _, cat in ipairs(data.categories) do -- Does the category begin with the language name? If not, tag it with a tracking category. if not cat:find(matches_lang_pattern) then -- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/no lang category]] -- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/no lang category/LANGCODE]] track("no lang category", data.lang) end end -- If `pos_category` not given, try to infer it from the first specified category. If this doesn't work, we -- throw an error below. if not data.pos_category and data.categories[1]:find(matches_lang_pattern) then data.pos_category = data.categories[1]:gsub(matches_lang_pattern, "") -- Optimization to avoid inserting category already present. pos_category_already_present = true end end if not data.pos_category then error("Internal error: `data.pos_category` not specified and could not be inferred from the categories given in " .. "`data.categories`. Either specify the plural part of speech in `data.pos_category` " .. "(e.g. \"proper nouns\") or ensure that the first category in `data.categories` is formed from the " .. "language's canonical name plus the plural part of speech (e.g. \"Norwegian Bokmål proper nouns\")." ) end -- Insert a category at the beginning for the part of speech unless it's already present or `data.noposcat` given. if not pos_category_already_present and not data.noposcat and not is_varform_only then local pos_category = full_langname .. " " .. data.pos_category -- FIXME: [[User:Theknightwho]] Why is this special case here? Please add an explanatory comment. if pos_category ~= "Translingual Han characters" then insert(data.categories, 1, pos_category) end end -- Try to determine whether the part of speech refers to a lemma or a non-lemma form; if we can figure this out, -- add an appropriate category. local postype = export.pos_lemma_or_nonlemma(data.pos_category) if not postype then -- We don't know what this category is, so tag it with a tracking category. -- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/unrecognized pos]] -- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/unrecognized pos/LANGCODE]] track("unrecognized pos", data.lang) -- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/unrecognized pos/POS]] -- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/unrecognized pos/POS/LANGCODE]] track("unrecognized pos/pos/" .. data.pos_category, data.lang) elseif not data.noposcat and not is_varform_only then insert(data.categories, 1, full_langname .. " " .. postype .. "s") end -- Categorize variant forms into 'variant lemmas' or 'variant non-lemma forms'. Originally proposed in -- [[Wiktionary:Beer parlour/2024/June#Decluttering the altform mess]] as 'alternative forms'; renamed in -- [[Wiktionary:Beer parlour/2026/July#Renaming the "alternative forms" categories]]. if (is_varform_only or is_varform_both) and postype then insert(data.categories, 1, full_langname .. " variant " .. postype .. "s") end ------------ 5. Create a default headword, and add links to multiword page names. ------------ -- Determine if this is an "anti-asterisk" term, i.e. an attested term in a language that must normally be -- reconstructed. local is_anti_asterisk = data.heads[1].term and data.heads[1].term:find("^!!") local lang_reconstructed = data.lang:hasType("reconstructed") if is_anti_asterisk then if not lang_reconstructed then error("Anti-asterisk feature (head= beginning with !!) can only be used with reconstructed languages") end lang_reconstructed = false end -- Determine if term is reconstructed local is_reconstructed = namespace == "Reconstruction" or lang_reconstructed -- Create a default headword based on the pagename, which is determined in -- advance by the data module so that it only needs to be done once. local default_head = page.pagename -- Add links to multi-word page names when appropriate if not (is_reconstructed or data.nolinkhead) then local no_links = m_headword_data.no_multiword_links if not (no_links[langcode] or no_links[full_langcode]) and export.head_is_multiword(default_head) then default_head = export.add_multiword_links(default_head, true) end end if is_reconstructed then default_head = "*" .. default_head end ------------ 6. Check the namespace against the language type. ------------ if namespace == "" then if lang_reconstructed then error("Entries in " .. langname .. " must be placed in the Reconstruction: namespace") elseif data.lang:hasType("appendix-constructed") then error("Entries in " .. langname .. " must be placed in the Appendix: namespace") end elseif namespace == "Citations" or namespace == "Thesaurus" then error("Headword templates should not be used in the " .. namespace .. ": namespace.") end ------------ 7. Fill in missing values in `data.heads`. ------------ -- True if any script among the headword scripts has spaces in it. local any_script_has_spaces = false -- True if any term has a redundant head= param. local has_redundant_head_param = false for _, head in ipairs(data.heads) do ------ 7a. If missing head, replace with default head. if not head.term then head.term = default_head elseif head.term == default_head then has_redundant_head_param = true elseif is_anti_asterisk and head.term == "!!" then -- If explicit head=!! is given, it's an anti-asterisk term and we fill in the default head. head.term = "!!" .. default_head elseif head.term:find("^[!?]$") then -- If explicit head= just consists of ! or ?, add it to the end of the default head. head.term = default_head .. head.term end head.term_no_initial_bang_bang = is_anti_asterisk and head.term:sub(3) or head.term if is_reconstructed then local head_term = head.term if head_term:find("%[%[") then head_term = remove_links(head_term) end if head_term:sub(1, 1) ~= "*" then error("The headword '" .. head_term .. "' must begin with '*' to indicate that it is reconstructed.") end end ------ 7b. Try to detect the script(s) if not provided. If a per-head script is provided, that takes precedence, ------ otherwise fall back to the overall script if given. If neither given, autodetect the script. local auto_sc = data.lang:findBestScript(head.term) if ( auto_sc:getCode() == "None" and find_best_script_without_lang(head.term):getCode() ~= "None" ) then insert(data.categories, full_langname .. " टर्म गैर-स्टैंडर्ड लिपि में") end if not (head.sc or data.sc) then -- No script code given, so use autodetected script. head.sc = auto_sc else if not head.sc then -- Overall script code given. head.sc = data.sc end -- Track uses of sc parameter. if head.sc:getCode() == auto_sc:getCode() then track("redundant script code", data.lang) if not data.no_script_code_cat then insert(data.categories, full_langname .. " टर्म दुहराव वाले लिपि कोड के साथ") end else track("non-redundant manual script code", data.lang) if not data.no_script_code_cat then insert(data.categories, full_langname .. " terms with non-redundant manual script codes") end end end -- If using a discouraged character sequence, add to maintenance category. if head.sc:hasNormalizationFixes() == true then local composed_head = toNFC(head.term) if head.sc:fixDiscouragedSequences(composed_head) ~= composed_head then insert(data.whole_page_categories, "Pages using discouraged character sequences") end end any_script_has_spaces = any_script_has_spaces or head.sc:hasSpaces() ------ 7c. Create automatic transliterations for any non-Latin headwords without manual translit given ------ (provided automatic translit is available, e.g. not in Persian or Hebrew). -- Make transliterations head.tr_manual = nil -- Try to generate a transliteration if necessary if head.tr == "-" then head.tr = nil else local notranslit = m_headword_data.notranslit if not (notranslit[langcode] or notranslit[full_langcode]) and head.sc:isTransliterated() then head.tr_manual = not not head.tr local text = head.term_no_initial_bang_bang if not data.lang:link_tr(head.sc) then text = remove_links(text) end local automated_tr = data.lang:transliterate(text, head.sc) if automated_tr then local manual_tr = head.tr if manual_tr then if remove_links(manual_tr) == remove_links(automated_tr) then insert(data.categories, full_langname .. " terms with redundant transliterations") else insert(data.categories, full_langname .. " terms with non-redundant manual transliterations") end end if not manual_tr then head.tr = automated_tr end end -- There is still no transliteration? -- Add the entry to a cleanup category. if not head.tr then head.tr = "<small>transliteration needed</small>" -- FIXME: No current support for 'Request for transliteration of Classical Persian terms' or similar. -- Consider adding this support in [[Module:category tree/poscatboiler/data/entry maintenance]]. insert(data.categories, "Requests for transliteration of " .. full_langname .. " terms") else -- Otherwise, trim it. head.tr = trim(head.tr) end end end -- Link to the transliteration entry for languages that require this. if head.tr and data.lang:link_tr(head.sc) then head.tr = full_link{ term = head.tr, lang = data.lang, sc = get_script("Latn"), tr = "-" } end end ------------ 8. Maybe tag the title with the appropriate script code, using the `display_title` mechanism. ------------ -- Assumes that the scripts in "toBeTagged" will never occur in the Reconstruction namespace. -- (FIXME: Don't make assumptions like this, and if you need to do so, throw an error if the assumption is violated.) -- Avoid tagging ASCII as Hani even when it is tagged as Hani in the headword, as in [[check]]. The check for ASCII -- might need to be expanded to a check for any Latin characters and whitespace or punctuation. local display_title -- Where there are multiple headwords, use the script for the first. This assumes the first headword is similar to -- the pagename, and that headwords that are in different scripts from the pagename aren't first. This seems to be -- about the best we can do (alternatively we could potentially do script detection on the pagename). local dt_script = data.heads[1].sc local dt_script_code = dt_script:getCode() local page_non_ascii = namespace == "" and not page.pagename:find("^[%z\1-\127]+$") local unsupported_pagename, unsupported = page.full_raw_pagename:gsub("^Unsupported titles/", "") if unsupported == 1 and page.unsupported_titles[unsupported_pagename] then display_title = 'Unsupported titles/<span class="' .. dt_script_code .. '">' .. page.unsupported_titles[unsupported_pagename] .. '</span>' elseif page_non_ascii and m_headword_data.toBeTagged[dt_script_code] or (dt_script_code == "Jpan" and (text_in_script(page.pagename, "Hira") or text_in_script(page.pagename, "Kana"))) or (dt_script_code == "Kore" and text_in_script(page.pagename, "Hang")) then display_title = '<span class="' .. dt_script_code .. '">' .. page.full_raw_pagename .. '</span>' -- Keep Han entries region-neutral in the display title. elseif page_non_ascii and (dt_script_code == "Hant" or dt_script_code == "Hans") then display_title = '<span class="Hani">' .. page.full_raw_pagename .. '</span>' elseif namespace == "Reconstruction" then local matched display_title, matched = ugsub( page.full_raw_pagename, "^(Reconstruction:[^/]+/)(.+)$", function(before, term) return before .. tag_text(term, data.lang, dt_script) end ) if matched == 0 then display_title = nil end end -- FIXME: Generalize this. -- If the current language uses Aran (Nastaliq), e.g. Urdu, and there's more than one language on the page, don't -- set the display title because we don't want Nastaliq for terms that also exist in other languages that don't -- display in Nastaliq (e.g. Arabic or Persian). Because the word "Urdu" occurs near the end of the alphabet, Urdu -- fonts tend to override the fonts of other languages. FIXME: This is checking for more than one language on the -- page but instead needs to check if there are any languages using scripts other than Aran. if dt_script_code == "Aran" and page.L2_list.n > 1 then display_title = nil end if display_title then mw.getCurrentFrame():callParserFunction( "DISPLAYTITLE", display_title ) end ------------ 9. Insert additional categories. ------------ if data.force_cat_output then -- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/force cat output]] track("force cat output") end if has_redundant_head_param then if not data.no_redundant_head_cat then -- This is not the right way to go about this; too many exceptions and problems due to language-specific headword -- handling customization. If we want this, it should be opt-in by a given language passing in the default headword. -- insert(data.categories, full_langname .. " terms with redundant head parameter") end end -- If the first head is multiword (after removing links), maybe insert into "LANG multiword terms". if not data.nomultiwordcat and not is_varform_only and any_script_has_spaces and postype == "lemma" then local no_multiword_cat = m_headword_data.no_multiword_cat if not (no_multiword_cat[langcode] or no_multiword_cat[full_langcode]) then -- Check for spaces or hyphens, but exclude prefixes and suffixes. -- Use the pagename, not the head= value, because the latter may have extra -- junk in it, e.g. superscripted text that throws off the algorithm. local no_hyphen = m_headword_data.hyphen_not_multiword_sep -- Exclude hyphens if the data module states that they should for this language. local checkpattern = (no_hyphen[langcode] or no_hyphen[full_langcode]) and ".[%s፡]." or ".[%s%-፡]." local is_multiword = umatch(page.pagename, checkpattern) if is_multiword and not non_categorizable(page.full_raw_pagename) then insert(data.categories, full_langname .. " कई शब्द वाले टर्म") elseif not is_multiword then local long_word_threshold = m_headword_data.long_word_thresholds[langcode] or m_headword_data.long_word_thresholds[full_langcode] if long_word_threshold and ulen(page.pagename) >= long_word_threshold then insert(data.categories, "लंबे " .. full_langname .. " शब्द") end end end end -- Determine whether to insert a category 'LANGNAME POS in SCRIPT'. If there are multiple heads, we may need to check -- each head, as the heads may (theoretically) have different scripts. local default_sccat = m_headword_data.default_sccat if data.sccat or not is_varform_only and (default_sccat[langcode] or langcode ~= full_langcode and default_sccat[full_langcode]) then local function needs_sccat(sccat_entry, sc) if sccat_entry == true or not sccat_entry then return sccat_entry end if type(sccat_entry) == "table" then local in_list = contains(sccat_entry, sc:getCode()) if sccat_entry[1] == "not" then in_list = not in_list end return in_list end return nil end for _, head in ipairs(data.heads) do -- First check the `sccat` specified at the {{head}} level. local this_needs_sccat = needs_sccat(data.sccat, head.sc) -- If that wasn't given, check the default sccat at the language level for the lang code. if this_needs_sccat == nil and not is_varform_only then this_needs_sccat = needs_sccat(default_sccat[langcode], head.sc) end -- If that wasn't found and the lang code is an etym code, check the default sccat at the parent language level. if this_needs_sccat == nil and not is_varform_only and langcode ~= full_langcode then this_needs_sccat = needs_sccat(default_sccat[full_langcode], head.sc) end if this_needs_sccat then insert(data.categories, full_langname .. " " .. data.pos_category .. " in " .. head.sc:getDisplayForm(data.lang)) end end end -- Reconstructed terms often use weird combinations of scripts and realistically aren't spelled so much as notated. if namespace ~= "Reconstruction" and not is_varform_only then -- Map from languages to a string containing the characters to ignore when considering whether a term has -- multiple written scripts in it. Typically these are Greek or Cyrillic letters used for their phonetic -- values. local characters_to_ignore = { ["aaq"] = "αάὰ", -- Penobscot (Algonquian) ["acy"] = "δθ", -- Cypriot Arabic ["aez"] = "β", -- Aeka (Trans-New Guinea) ["anc"] = "γ", -- Ngas (Chadic/Afroasiatic) ["aou"] = "χ", -- A'ou (Kra-Dai) ["art-blk"] = "ч", -- Bolak (conlang) ["awg"] = "β", -- Anguthimri (Pama-Nyungan) ["az"] = "ь", -- Azerbaijani (Turkic; Yañalif Latin spelling, c. 1928 - 1938) ["ba"] = "ь", -- Bashkir (Turkic; Yañalif Latin spelling, c. 1928 - 1938) ["bhp"] = "β", -- Bima (Austronesian) ["bjz"] = "β", -- Baruga (Trans-New Guinea) ["byk"] = "θ", -- Biao (Kra-Dai) ["cdy"] = "θ", -- Chadong (Kra-Dai) ["chp"] = "θ", -- Chipewyan (Athabaskan) ["cjh"] = "χ", -- Upper Chehalis (Salishan) ["clm"] = "χ", -- Klallam (Salishan) ["col"] = "χ", -- Colombia-Wenatchi (Salishan) ["coo"] = "χθ", -- Comox (Salishan) ["crx"] = "θ", -- Carrier (Athabaskan) ["ets"] = "θ", -- Yekhee (Edoid/Niger-Congo) ["ett"] = "χ", -- Etruscan (isolate; in romanizations) ["fla"] = "χ", -- Montana Salish (Salishan) ["grt"] = "་", -- Garo (South Asian Sino-Tibetan) ["gmw-gts"] = "χ", -- Gottscheerish (Bavarian variant spoken in Slovenia) ["hur"] = "χθ", -- Halkomelem (Salishan) ["itc-psa"] = "f", -- Pre-Samnite (Italic; normally written in Greek) ["izh"] = "ь", -- Ingrian (Finnic) ["kic"] = "θ", -- Kickapoo (Algonquian) ["kk"] = "ь", -- Kazakh (Turkic; Yañalif Latin spelling, c. 1928 - 1938) ["ky"] = "ь", -- Kyrgyz (Turkic; Yañalif Latin spelling, c. 1928 - 1938) ["lil"] = "χ", -- Lillooet (Salishan) ["lsi"] = "ꓹ", -- Lashi (Lolo-Burmese/Sino-Tibetan; represents a glottal stop) ["mhz"] = "β", -- Mor (Austronesian) ["mqn"] = "β", -- Moronene (Austronesian) ["neg"]= "ӡā", -- Negidal (Tungusic; normally in Cyrillic) ["oka"] = "χ", -- Okanagan (Salishan) ["ole"] = "θ", -- Olekha (Sino-Tibetan) ["oui"] = "γβ", -- Old Uyghur (Turkic; FIXME: others? E.g. Greek delta (δ)?) ["pox"] = "χ", -- Polabian (West Slavic) ["rif"] = "ε", -- Tarifit (Berber) ["rom"] = "Θθ", -- Romani (Indic: International Standard; two different thetas???) ["rpn"] = "β", -- Repanbitip (Austronesian) ["sah"] = "ь", -- Yakut (Turkic; 1929 - 1939 Latin spelling) ["sit-jap"] = "χ", -- Japhug (Sino-Tibetan) ["sjw"] = "θ", -- Shawnee (Algonquian) ["squ"] = "χ", -- Squamish (Salishan) ["str"] = "χθ", -- Saanich (Salishan) ["teh"] = "χ", -- Tehuelche (Chonan; spoken in Argentina) ["tep"] = "η", -- Tepecano (Uto-Aztecan) ["thp"] = "χ", -- Thompson (Salishan) ["tk"] = "ь", -- Turkmen (Turkic; Yañalif Latin spelling, c. 1928 - 1938) ["tt"] = "ь", -- Kazakh (Turkic; Yañalif Latin spelling, c. 1928 - 1938) ["twa"] = "χ", -- Twana (Salishan) ["wbl"] = "ы", -- Wakhi (Iranian) ["xbc"] = "ϸ", -- Bactrian (Iranian; represents š; normally written in Greek) ["yha"] = "θ", -- Baha (Kra-Dai) ["za"] = "зч", -- Zhuang (Tai/Kra-Dai); 1957-1982 alphabet used two Cyrillic letters (as well as some others like -- ƃ, ƅ, ƨ, ɯ and ɵ that look like Cyrillic or Greek but are actually Latin) ["zlw-slv"] = "χђћ", -- Slovincian (West Slavic; FIXME: χ is Greek, the other two are Cyrillic, but I'm not sure -- the currect characters are being chosen in the entry names) ["zng"] = "θ", -- Mang (Mon-Khmer) ["ztp"] = "θ", -- Loxicha Zapotec (Zapotecan) } -- Determine how many real scripts are found in the pagename, where we exclude symbols and such. We exclude -- scripts whose `character_category` is false as well as Zmth (mathematical notation symbols), which has a -- category of "Mathematical notation symbols". When counting scripts, we need to elide language-specific -- variants because e.g. Beng and as-Beng have slightly different characters but we don't want to consider them -- two different scripts (e.g. [[এৰ]] has two characters which are detected respectively as Beng and as-Beng). local seen_scripts = {} local num_seen_scripts = 0 local num_loops = 0 local canon_pagename = page.pagename local ch_to_ignore = characters_to_ignore[full_langcode] if ch_to_ignore then canon_pagename = ugsub(canon_pagename, "[" .. ch_to_ignore .. "]", "") end while true do if canon_pagename == "" or num_seen_scripts >= 2 or num_loops >= 10 then break end -- Make sure we don't get into a loop checking the same script over and over again; happens with e.g. [[ᠪᡳ]] num_loops = num_loops + 1 local pagename_script = find_best_script_without_lang(canon_pagename, "None only as last resort") local script_chars = pagename_script.characters if not script_chars then -- we are stuck; this happens with None break end local script_code = pagename_script:getCode() local replaced canon_pagename, replaced = ugsub(canon_pagename, "[" .. script_chars .. "]", "") if ( replaced and script_code ~= "Zmth" and (script_data or get_script_data())[script_code] and script_data[script_code].character_category ~= false ) then script_code = script_code:gsub("^.-%-", "") if not seen_scripts[script_code] then seen_scripts[script_code] = true num_seen_scripts = num_seen_scripts + 1 end end end if num_seen_scripts > 1 then insert(data.categories, full_langname .. " टर्म कई लिपियों में लिखे जाने वाले") end end -- Categorise for unusual characters. Takes into account combining characters, so that we can categorise for characters with diacritics that aren't encoded as atomic characters (e.g. U̠). These can be in two formats: single combining characters (i.e. character + diacritic(s)) or double combining characters (i.e. character + diacritic(s) + character). Each can have any number of diacritics. local standard = data.lang:getStandardCharacters() if not is_varform_only and standard and not non_categorizable(page.full_raw_pagename) then local function char_category(char) local specials = { ["#"] = "number sign", ["("] = "parentheses", [")"] = "parentheses", ["<"] = "angle brackets", [">"] = "angle brackets", ["["] = "square brackets", ["]"] = "square brackets", ["_"] = "underscore", ["{"] = "braces", ["|"] = "vertical line", ["}"] = "braces", ["ß"] = "ẞ", ["\205\133"] = "", -- this is UTF-8 for U+0345 ( ͅ) ["\239\191\189"] = "replacement character", } char = toNFD(char) :gsub(".[\128-\191]*", function(m) local new_m = specials[m] new_m = new_m or m:uupper() return new_m end) return toNFC(char) end if full_langcode ~= "hi" and full_langcode ~= "lo" then local standard_chars_scripts = {} for _, head in ipairs(data.heads) do standard_chars_scripts[head.sc:getCode()] = true end -- Iterate over the scripts, in case there is more than one (as they can have different sets of standard characters). for code in pairs(standard_chars_scripts) do local sc_standard = data.lang:getStandardCharacters(code) if sc_standard then if page.pagename_len > 1 then local explode_standard = {} local function explode(char) explode_standard[char] = true return "" end local sc_standard_exploded = ugsub(sc_standard, page.comb_chars.combined_double, explode) -- The following is correct; it relies on side-effecing the explode_standard[] table. ugsub(sc_standard_exploded, page.comb_chars.combined_single, explode):gsub(".[\128-\191]*", explode) local num_cat_inserted for char in pairs(page.explode_pagename) do if not explode_standard[char] then if char:find("[0-9]") then if not num_cat_inserted then insert(data.categories, full_langname .. " terms spelled with numbers") num_cat_inserted = true end elseif ufind(char, page.emoji_pattern) then insert(data.categories, full_langname .. " terms spelled with emoji") else local upper = char_category(char) if not explode_standard[upper] then char = upper end insert(data.categories, full_langname .. " terms spelled with " .. char) end end end end -- If a diacritic doesn't appear in any of the standard characters, also categorise for it generally. sc_standard = toNFD(sc_standard) for diacritic in ugmatch(page.decompose_pagename, page.comb_chars.diacritics_single) do if not umatch(sc_standard, diacritic) then insert(data.categories, full_langname .. " terms spelled with ◌" .. diacritic) end end for diacritic in ugmatch(page.decompose_pagename, page.comb_chars.diacritics_double) do if not umatch(sc_standard, diacritic) then insert(data.categories, full_langname .. " terms spelled with ◌" .. diacritic .. "◌") end end end end -- Ancient Greek, Hindi and Lao handled the old way for now, as their standard chars still need to be converted to the new format (because there are a lot of them). elseif ulen(page.pagename) ~= 1 then for character in ugmatch(page.pagename, "([^" .. standard .. "])") do local upper = char_category(character) if not umatch(upper, "[" .. standard .. "]") then character = upper end insert(data.categories, full_langname .. " terms spelled with " .. character) end end end if not is_varform_only and data.heads[1].sc:isSystem("alphabet") then local pagename, i = page.pagename:ulower(), 2 while umatch(pagename, "(%a)" .. ("%1"):rep(i)) do i = i + 1 insert(data.categories, full_langname .. " terms with " .. i .. " consecutive instances of the same letter") end end -- Categorise for palindromes if not is_varform_only and not data.nopalindromecat and namespace ~= "Reconstruction" and ulen(page.pagename) > 2 -- FIXME: Use of first script here seems hacky. What is the clean way of doing this in the presence of -- multiple scripts? and is_palindrome(page.pagename, data.lang, data.heads[1].sc) then insert(data.categories, full_langname .. " पैलिंड्रोम") end if namespace == "" and not lang_reconstructed then for _, head in ipairs(data.heads) do if page.full_raw_pagename ~= get_link_page(remove_links(head.term), data.lang, head.sc) then -- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/pagename spelling mismatch]] -- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/pagename spelling mismatch/LANGCODE]] track("pagename spelling mismatch", data.lang) break end end end -- Add red link category if called for and we're not a "large" page, where such checks are disabled. if data.checkredlinks and not m_headword_data.large_pages[m_headword_data.pagename] then local plposcat = type(data.checkredlinks) == "string" and data.checkredlinks or data.pos_category check_red_link_inflections_top_level(data, plposcat) end -- Add to various maintenance categories. export.maintenance_cats(page, data.lang, data.categories, data.whole_page_categories) ------------ 10. Format and return headwords, genders, inflections and categories. ------------ -- Format and return all the gathered information. This may add more categories (e.g. gender/number categories), -- so make sure we do it before evaluating `data.categories`. local text = '<span class="headword-line">' .. format_headword(data) .. format_headword_genders(data, is_varform_only) .. format_top_level_inflections(data) .. '</span>' -- Language-specific categories. local cats = format_categories( data.categories, data.lang, data.sort_key, page.encoded_pagename, data.force_cat_output or test_force_categories, data.heads[1].sc ) -- Language-agnostic categories. local whole_page_cats = format_categories( data.whole_page_categories, nil, "-" ) return text .. cats .. whole_page_cats end return export eyvsm46yn0rfctlhis3poxc3lhndtof 487782 487781 2026-09-02T17:13:58Z SM7 6218 localization... 487782 Scribunto text/plain local export = {} -- Named constants for all modules used, to make it easier to swap out sandbox versions. local debug_track_module = "Module:debug/track" local en_utilities_module = "Module:en-utilities" local gender_and_number_module = "Module:gender and number" local headword_data_module = "Module:headword/data" local headword_page_module = "Module:headword/page" local links_module = "Module:links" local load_module = "Module:load" local pages_module = "Module:pages" local palindromes_module = "Module:palindromes" local pron_qualifier_module = "Module:pron qualifier" local scripts_module = "Module:scripts" local scripts_data_module = "Module:scripts/data" local script_utilities_module = "Module:script utilities" local script_utilities_data_module = "Module:script utilities/data" local string_utilities_module = "Module:string utilities" local table_module = "Module:table" local utilities_module = "Module:utilities" local concat = table.concat local dump = mw.dumpObject local insert = table.insert local ipairs = ipairs local max = math.max local new_title = mw.title.new local pairs = pairs local require = require local toNFC = mw.ustring.toNFC local toNFD = mw.ustring.toNFD local type = type local ufind = mw.ustring.find local ugmatch = mw.ustring.gmatch local ugsub = mw.ustring.gsub 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 debug_track(...) debug_track = require(debug_track_module) return debug_track(...) end local function contains(...) contains = require(table_module).contains return contains(...) end local function encode_entities(...) encode_entities = require(string_utilities_module).encode_entities 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_pron_qualifiers(...) format_pron_qualifiers = require(pron_qualifier_module).format_qualifiers return format_pron_qualifiers(...) end local function full_link(...) full_link = require(links_module).full_link return full_link(...) end local function get_current_L2(...) get_current_L2 = require(pages_module).get_current_L2 return get_current_L2(...) end local function get_link_page(...) get_link_page = require(links_module).get_link_page return get_link_page(...) end local function get_script(...) get_script = require(scripts_module).getByCode return get_script(...) end local function is_palindrome(...) is_palindrome = require(palindromes_module).is_palindrome return is_palindrome(...) end local function language_link(...) language_link = require(links_module).language_link return language_link(...) end local function load_data(...) load_data = require(load_module).load_data return load_data(...) end local function pattern_escape(...) pattern_escape = require(string_utilities_module).pattern_escape return pattern_escape(...) end local function pluralize(...) pluralize = require(en_utilities_module).pluralize return pluralize(...) end local function process_page(...) process_page = require(headword_page_module).process_page return process_page(...) end local function remove_links(...) remove_links = require(links_module).remove_links return remove_links(...) end local function shallow_copy(...) shallow_copy = require(table_module).shallowCopy return shallow_copy(...) end local function tag_text(...) tag_text = require(script_utilities_module).tag_text return tag_text(...) end local function tag_transcription(...) tag_transcription = require(script_utilities_module).tag_transcription return tag_transcription(...) 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 ulen(...) ulen = require(string_utilities_module).len return ulen(...) 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 = load_data(headword_data_module) return m_data end local script_data local function get_script_data() script_data = load_data(scripts_data_module) return script_data end local script_utilities_data local function get_script_utilities_data() script_utilities_data = load_data(script_utilities_data_module) return script_utilities_data end -- If set to true, categories always appear, even in non-mainspace pages local test_force_categories = false -- Add a tracking category to track entries with certain (unusually undesirable) properties. `track_id` is an identifier -- for the particular property being tracked and goes into the tracking page. Specifically, this adds a link in the -- page text to [[Wiktionary:Tracking/headword/TRACK_ID]], meaning you can find all entries with the `track_id` property -- by visiting [[Special:WhatLinksHere/Wiktionary:Tracking/headword/TRACK_ID]]. -- -- If `lang` (a language object) is given, an additional tracking page [[Wiktionary:Tracking/headword/TRACK_ID/CODE]] is -- linked to where CODE is the language code of `lang`, and you can find all entries in the combination of `track_id` -- and `lang` by visiting [[Special:WhatLinksHere/Wiktionary:Tracking/headword/TRACK_ID/CODE]]. This makes it possible to -- isolate only the entries with a specific tracking property that are in a given language. Note that if `lang` -- references at etymology-only language, both that language's code and its full parent's code are tracked. local function track(track_id, lang) local tracking_page = "headword/" .. track_id if lang and lang:hasType("etymology-only") then debug_track{tracking_page, tracking_page .. "/" .. lang:getCode(), tracking_page .. "/" .. lang:getFullCode()} elseif lang then debug_track{tracking_page, tracking_page .. "/" .. lang:getCode()} else debug_track(tracking_page) end return true end local function text_in_script(text, script_code) local sc = get_script(script_code) if not sc then error("Internal error: Bad script code " .. script_code) end local characters = sc.characters local out if characters then text = ugsub(text, "%W", "") out = ufind(text, "[" .. characters .. "]") end if out then return true else return false end end local spacingPunctuation = "[%s%p]+" --[[ List of punctuation or spacing characters that are found inside of words. Used to exclude characters from the regex above. ]] local wordPunc = "-#%%&@־׳״'.·*’་•:᠊" local notWordPunc = "[^" .. wordPunc .. "]+" -- Format a term (either a head term or an inflection term) along with any left or right qualifiers, labels, references -- or customized separator: `part` is the object specifying the term (and `lang` the language of the term), which should -- optionally contain: -- * left qualifiers in `q`, an array of strings; -- * right qualifiers in `qq`, an array of strings; -- * left labels in `l`, an array of strings; -- * right labels in `ll`, an array of strings; -- * 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`; -- * a separator in `separator`, defaulting to " <i>or</i> " if this is not the first term (j > 1), otherwise "". -- `formatted` is the formatted version of the term itself, and `j` is the index of the term. local function format_term_with_qualifiers_and_refs(lang, part, formatted, j) local function part_non_empty(field) local list = part[field] if not list then return nil end if type(list) ~= "table" then error(("Internal error: Wrong type for `part.%s`=%s, should be \"table\""):format(field, dump(list))) end return list[1] end if part_non_empty("q") or part_non_empty("qq") or part_non_empty("l") or part_non_empty("ll") or part_non_empty("refs") then formatted = format_pron_qualifiers { lang = lang, text = formatted, q = part.q, qq = part.qq, l = part.l, ll = part.ll, refs = part.refs, } end local separator = part.separator or j > 1 and " <i>अथवा</i> " -- use "" to request no separator if separator then formatted = separator .. formatted end return formatted end --[==[Return true if the given head is multiword according to the algorithm used in full_headword().]==] function export.head_is_multiword(head) for possibleWordBreak in ugmatch(head, spacingPunctuation) do if umatch(possibleWordBreak, notWordPunc) then return true end end return false end do local function workaround_to_exclude_chars(s) return (ugsub(s, notWordPunc, "\2%1\1")) end --[==[ Add appropriate links to `head`, correctly handling multiword terms. This is intended for multiword terms but can be used for any term if you want links added to single-word terms as well. If you want to only add links to multiword terms, first check that the term is multiword using `head_is_multiword`. If `default` is specified, this will escape colons so that they don't get interpreted as interwiki links. This should generally only be used when `head` is an actual pagename or is taken from a {{para|pagename}} parameter, not when taken from a {{para|head}} parameter. ]==] function export.add_multiword_links(head, default) head = "\1" .. ugsub(head, spacingPunctuation, workaround_to_exclude_chars) .. "\2" if default then head = head :gsub("(\1[^\2]*)\\([:#][^\2]*\2)", "%1\\\\%2") :gsub("(\1[^\2]*)([:#][^\2]*\2)", "%1\\%2") end --Escape any remaining square brackets to stop them breaking links (e.g. "[citation needed]"). head = encode_entities(head, "[]", true, true) --[=[ use this when workaround is no longer needed: head = "[[" .. ugsub(head, WORDBREAKCHARS, "]]%1[[") .. "]]" Remove any empty links, which could have been created above at the beginning or end of the string. ]=] return (head :gsub("\1\2", "") :gsub("[\1\2]", {["\1"] = "[[", ["\2"] = "]]"})) end end local function non_categorizable(full_raw_pagename) return full_raw_pagename:find("^Appendix:Gestures/") or -- Unsupported titles with descriptive names. (full_raw_pagename:find("^Unsupported titles/") and not full_raw_pagename:find("`")) end local function tag_text_and_add_quals_and_refs(data, head, formatted, j) -- Add language and script wrapper. formatted = tag_text(formatted, data.lang, head.sc, "head", nil, j == 1 and data.id or nil) -- Add qualifiers, labels, references and separator. return format_term_with_qualifiers_and_refs(data.lang, head, formatted, j) end -- Format a headword with transliterations. local function format_headword(data) -- Are there non-empty transliterations? local has_translits = false local has_manual_translits = false ------ Format the headwords. ------ local head_parts = {} local unique_head_parts = {} local has_multiple_heads = not not data.heads[2] for j, head in ipairs(data.heads) do if head.tr or head.ts then has_translits = true end if head.tr and head.tr_manual or head.ts then has_manual_translits = true end local formatted -- Apply processing to the headword, for formatting links and such. if head.term:find("[[", nil, true) and head.sc:getCode() ~= "Image" then formatted = language_link{term = head.term, lang = data.lang} else formatted = data.lang:makeDisplayText(head.term, head.sc, true) end local head_part = tag_text_and_add_quals_and_refs(data, head, formatted, j) insert(head_parts, head_part) -- If multiple heads, try to determine whether all heads display the same. To do this we need to effectively -- rerun the text tagging and addition of qualifiers and references, using 1 for all indices. if has_multiple_heads then local unique_head_part if j == 1 then unique_head_part = head_part else unique_head_part = tag_text_and_add_quals_and_refs(data, head, formatted, 1) end unique_head_parts[unique_head_part] = true end end local set_size = 0 if has_multiple_heads then for _ in pairs(unique_head_parts) do set_size = set_size + 1 end end if set_size == 1 then head_parts = head_parts[1] else head_parts = concat(head_parts) end if has_manual_translits then -- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/manual-tr]] -- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/manual-tr/LANGCODE]] track("manual-tr", data.lang) end ------ Format the transliterations and transcriptions. ------ local translits_formatted if has_translits then local translit_parts = {} for _, head in ipairs(data.heads) do if head.tr or head.ts then local this_parts = {} if head.tr then insert(this_parts, tag_translit(head.tr, data.lang:getCode(), "head", nil, head.tr_manual)) if head.ts then insert(this_parts, " ") end end if head.ts then insert(this_parts, "/" .. tag_transcription(head.ts, data.lang:getCode(), "head") .. "/") end insert(translit_parts, concat(this_parts)) end end translits_formatted = " (" .. concat(translit_parts, " <i>अथवा</i> ") .. ")" local langname = data.lang:getCanonicalName() local transliteration_page = new_title(langname .. " ट्रांसलिट्रेशन", "विक्षनरी") local saw_translit_page = false if transliteration_page and transliteration_page:getContent() then translits_formatted = " [[विक्षनरी:" .. langname .. " ट्रांसलिट्रेशन|•]]" .. translits_formatted saw_translit_page = true end -- If data.lang is an etymology-only language and we didn't find a translation page for it, fall back to the -- full parent. if not saw_translit_page and data.lang:hasType("etymology-only") then langname = data.lang:getFullName() transliteration_page = new_title(langname .. " ट्रांसलिट्रेशन", "विक्षनरी") if transliteration_page and transliteration_page:getContent() then translits_formatted = " [[विक्षनरी:" .. langname .. " ट्रांसलिट्रेशन|•]]" .. translits_formatted end end else translits_formatted = "" end ------ Paste heads and transliterations/transcriptions. ------ local lemma_gloss if data.gloss then lemma_gloss = ' <span class="ib-content qualifier-content">' .. data.gloss .. '</span>' else lemma_gloss = "" end return head_parts .. translits_formatted .. lemma_gloss end local function format_headword_genders(data, is_varform_only) local retval = "" if data.genders and data.genders[1] then if data.gloss then retval = "," end local pos_for_cat if not data.nogendercat and not is_varform_only then local no_gender_cat = (m_data or get_data()).no_gender_cat if not (no_gender_cat[data.lang:getCode()] or no_gender_cat[data.lang:getFullCode()]) then pos_for_cat = (m_data or get_data()).pos_for_gender_number_cat[data.pos_category:gsub("^reconstructed ", "")] end end local text, cats = format_genders(data.genders, data.lang, pos_for_cat) if cats then extend(data.categories, cats) end retval = retval .. "&nbsp;" .. text end return retval end -- Forward reference local format_inflections local function format_inflection_parts(data, parts) for j, part in ipairs(parts) do if type(part) ~= "table" then part = {term = part} end local partaccel = part.accel local face = part.face or "bold" if face ~= "bold" and face ~= "plain" and face ~= "hypothetical" then error("The face `" .. face .. "` " .. ( (script_utilities_data or get_script_utilities_data()).faces[face] and "should not be used for non-headword terms on the headword line." or "is invalid." )) end -- Here the final part 'or data.nolinkinfl' allows to have 'nolinkinfl=true' -- right into the 'data' table to disable inflection links of the entire headword -- when inflected forms aren't entry-worthy, e.g.: in Vulgar Latin local nolinkinfl = part.face == "hypothetical" or (part.nolink and track("nolink") or part.nolinkinfl) or ( data.nolink and track("nolink") or data.nolinkinfl) local formatted if part.label then -- FIXME: There should be a better way of italicizing a label. As is, this isn't customizable. formatted = "<i>" .. part.label .. "</i>" else -- Convert the term into a full link. Don't show a transliteration here unless enable_auto_translit is -- requested, either at the `parts` level (i.e. per inflection) or at the `data.inflections` level (i.e. -- specified for all inflections). This is controllable in {{head}} using autotrinfl=1 for all inflections, -- or fNautotr=1 for an individual inflection (remember that a single inflection may be associated with -- multiple terms). The reason for doing this is to avoid clutter in headword lines by default in languages -- where the script is relatively straightforward to read by learners (e.g. Greek, Russian), but allow it -- to be enabled in languages with more complex scripts (e.g. Arabic). -- -- FIXME: With nested inflections, should we also respect `enable_auto_translit` at the top level of the -- nested inflections structure? local tr = part.tr or not (parts.enable_auto_translit or data.inflections.enable_auto_translit) and "-" or nil -- FIXME: Temporary errors added 2025-10-03. Remove after a month or so. if part.translit then error("Internal error: Use field `tr` not `translit` for specifying an inflection part translit") end if part.transcription then error("Internal error: Use field `ts` not `transcription` for specifying an inflection part transcription") end local postprocess_annotations if part.inflections then postprocess_annotations = function(infldata) insert(infldata.annotations, format_inflections(data, part.inflections)) end end formatted = full_link( { term = not nolinkinfl and part.term or nil, alt = part.alt or (nolinkinfl and part.term or nil), lang = part.lang or data.lang, sc = part.sc or parts.sc or nil, gloss = part.gloss, pos = part.pos, lit = part.lit, id = part.id, genders = part.genders, tr = tr, ts = part.ts, accel = partaccel or parts.accel, postprocess_annotations = postprocess_annotations, }, face ) end parts[j] = format_term_with_qualifiers_and_refs(part.lang or data.lang, part, formatted, j) end local parts_output if parts[1] then parts_output = (parts.label and " " or "") .. concat(parts) elseif parts.request then parts_output = " <small>[please provide]</small>" insert(data.categories, "Requests for inflections in " .. data.lang:getFullName() .. " entries") else parts_output = "" end local parts_label = parts.label and ("<i>" .. parts.label .. "</i>") or "" return format_term_with_qualifiers_and_refs(data.lang, parts, parts_label .. parts_output, 1) end -- Format the inflections following the headword or nested after a given inflection. Declared local above. function format_inflections(data, inflections) if inflections and inflections[1] then -- Format each inflection individually. for key, infl in ipairs(inflections) do inflections[key] = format_inflection_parts(data, infl) end return concat(inflections, ", ") else return "" end end -- Format the top-level inflections following the headword. Currently this just adds parens around the -- formatted comma-separated inflections in `data.inflections`. local function format_top_level_inflections(data) local result = format_inflections(data, data.inflections) if result ~= "" then return " (" .. result .. ")" else return result end end -- Forward reference local check_red_link_inflections -- Check a single inflection (which consists of a label and zero or more terms, each possibly with nested inflections) -- for red links. If so, insert a red-link category based on `plpos` (the plural part of speech to insert in the -- category), stop further processing, and return true. If no red links found, return false. local function check_red_link_inflection_parts(data, parts, plpos) for _, part in ipairs(parts) do if type(part) ~= "table" then part = {term = part} end local term = part.term if term and not term:find("%[%[") then local stripped_physical_term = get_link_page(term, data.lang, part.sc or parts.sc or nil) if stripped_physical_term then local title = mw.title.new(stripped_physical_term) if title and not title:getContent() then insert(data.categories, data.lang:getFullName() .. " " .. plpos .. " with red links in their headword lines") return true end end end if part.inflections then if check_red_link_inflections(data, part.inflections, plpos) then return true end end end return false end -- Check a set of inflections (each of which describes a single inflection of the term, such as feminine or plural, and -- consists of a label and zero or more terms, each possibly with nested inflections) for red links. If so, insert a -- red-link category based on `plpos` (the plural part of speech to insert in the category), stop further processing, -- and return true. If no red links found, return false. function check_red_link_inflections(data, inflections, plpos) if inflections and inflections[1] then -- Check each inflection individually. for key, infl in ipairs(inflections) do if check_red_link_inflection_parts(data, infl, plpos) then return true end end end return false end -- Check the top-level inflections in `data.inflections`, along with any nested inflections, for red links. If so, -- insert a red-link category based on `plpos` (the plural part of speech to insert in the category), stop further -- processing, and return true. If no red links found, return false. local function check_red_link_inflections_top_level(data, plpos) return check_red_link_inflections(data, data.inflections, plpos) end --[==[ Returns the plural form of `pos`, a raw part of speech input, which could be singular or plural. Irregular plural POS are taken into account (e.g. "kanji" pluralizes to "kanji"). ]==] function export.pluralize_pos(pos) -- Make the plural form of the part of speech return (m_data or get_data()).irregular_plurals[pos] or pos:sub(-1) == "" and pos or pluralize(pos) end --[==[ Return "lemma" if the given POS is a lemma, "non-lemma form" if a non-lemma form, or nil if unknown. The POS passed in must be in its plural form ("nouns", "prefixes", etc.). If you have a POS in its singular form, call {export.pluralize_pos()} above to pluralize it in a smart fashion that knows when to add "-s" and when to add "-es", and also takes into account any irregular plurals. If `best_guess` is given and the POS is in neither the lemma nor non-lemma list, guess based on whether it ends in " forms"; otherwise, return nil. ]==] function export.pos_lemma_or_nonlemma(plpos, best_guess) local m_headword_data = m_data or get_data() local isLemma = m_headword_data.lemmas -- Is it a lemma category? if isLemma[plpos] then return "लेम्मा" end local plpos_no_recon = plpos:gsub("^reconstructed ", "") if isLemma[plpos_no_recon] then return "लेम्मा" end -- Is it a nonlemma category? local isNonLemma = m_headword_data.nonlemmas if isNonLemma[plpos] or isNonLemma[plpos_no_recon] then return "non-lemma form" end local plpos_no_mut = plpos:gsub("^mutated ", "") if isLemma[plpos_no_mut] or isNonLemma[plpos_no_mut] then return "non-lemma form" elseif best_guess then return plpos:find(" forms$") and "non-lemma form" or "लेम्मा" else return nil end end --[==[ Canonicalize a part of speech as specified in 2= in {{tl|head}}. This checks for POS aliases and non-lemma form aliases ending in 'f', and then pluralizes if the POS term does not have an invariable plural. ]==] function export.canonicalize_pos(pos) -- FIXME: Temporary code to throw an error for alias 'pre' (= preposition) that will go away. if pos == "pre" then -- Don't throw error on 'pref' as it's an alias for "prefix". error("POS 'pre' for 'preposition' no longer allowed as it's too ambiguous; use 'prep'") end -- Likewise for pro = pronoun. if pos == "pro" or pos == "prof" then error("POS 'pro' for 'pronoun' no longer allowed as it's too ambiguous; use 'pron'") end local m_headword_data = m_data or get_data() if m_headword_data.pos_aliases[pos] then pos = m_headword_data.pos_aliases[pos] elseif pos:sub(-1) == "f" then pos = pos:sub(1, -2) pos = (m_headword_data.pos_aliases[pos] or pos) .. " रूप" end return export.pluralize_pos(pos) end -- Find and return the maximum index in the array `data[element]` (which may have gaps in it), and initialize it to a -- zero-length array if unspecified. Check to make sure all keys are numeric (other than "maxindex", which is set by -- [[Module:parameters]] for list parameters), all values are strings, and unless `allow_blank_string` is given, -- no blank (zero-length) strings are present. local function init_and_find_maximum_index(data, element, allow_blank_string) local maxind = 0 if not data[element] then data[element] = {} end local typ = type(data[element]) if typ ~= "table" then error(("Internal error: In full_headword(), `data.%s` must be an array but is a %s"):format(element, typ)) end for k, v in pairs(data[element]) do if k ~= "maxindex" then if type(k) ~= "number" then error(("Internal error: Unrecognized non-numeric key '%s' in `data.%s`"):format(k, element)) end if k > maxind then maxind = k end if v then if type(v) ~= "string" then error(("Internal error: For key '%s' in `data.%s`, value should be a string but is a %s"):format(k, element, type(v))) end if not allow_blank_string and v == "" then error(("Internal error: For key '%s' in `data.%s`, blank string not allowed; use 'false' for the default"):format(k, element)) end end end end return maxind end --[==[ -- Add the page to various maintenance categories for the language and the -- whole page. These are placed in the headword somewhat arbitrarily, but -- mainly because headword templates are mandatory for entries (meaning that -- in theory it provides full coverage). -- -- This is provided as an external entry point so that modules which transclude -- information from other entries (such as {{tl|ja-see}}) can take advantage -- of this feature as well, because they are used in place of a conventional -- headword template.]==] do -- Handle any manual sortkeys that have been specified in raw categories -- by tracking if they are the same or different from the automatically- -- generated sortkey, so that we can track them in maintenance -- categories. local function handle_raw_sortkeys(tbl, sortkey, page, lang, lang_cats) sortkey = sortkey or lang:makeSortKey(page.pagename) -- If there are raw categories with no sortkey, then they will be -- sorted based on the default MediaWiki sortkey, so we check against -- that. if tbl == true then if page.raw_defaultsort ~= sortkey then insert(lang_cats, lang:getFullName() .. " terms with non-redundant non-automated sortkeys") end return end local redundant, different for k in pairs(tbl) do if k == sortkey then redundant = true else different = true end end if redundant then insert(lang_cats, lang:getFullName() .. " terms with redundant sortkeys") end if different then insert(lang_cats, lang:getFullName() .. " terms with non-redundant non-automated sortkeys") end return sortkey end function export.maintenance_cats(page, lang, lang_cats, page_cats) extend(page_cats, page.cats) lang = lang:getFull() -- since we are just generating categories local canonical = lang:getCanonicalName() local tbl = page.wikitext_topic_cat[lang:getCode()] local sortkey = nil if tbl then sortkey = handle_raw_sortkeys(tbl, sortkey, page, lang, lang_cats) insert(lang_cats, canonical .. " entries with topic categories using raw markup") end tbl = page.wikitext_langname_cat[canonical] if tbl then handle_raw_sortkeys(tbl, sortkey, page, lang, lang_cats) insert(lang_cats, canonical .. " entries with language name categories using raw markup") end if get_current_L2() ~= canonical then insert(lang_cats, canonical .. " entries with incorrect language header") -- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/incorrect language header]] -- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/incorrect language header/LANGCODE]] track("incorrect language header", lang) end end end --[==[This is the primary external entry point. {{lua|full_headword(data)}} This is used by {{temp|head}} and various language-specific headword templates (e.g. {{temp|ru-adj}} for Russian adjectives, {{temp|de-noun}} for German nouns, etc.) to display an entire headword line. See [[#Further explanations for full_headword()]] ]==] function export.full_headword(data) -- Prevent data from being destructively modified. data = shallow_copy(data) ------------ 1. Basic checks for old-style (multi-arg) calling convention. ------------ if data.getCanonicalName then error("Internal error: In full_headword(), the first argument `data` needs to be a Lua object (table) of properties, not a language object") end if not data.lang or type(data.lang) ~= "table" or not data.lang.getCode then error("Internal error: In full_headword(), the first argument `data` needs to be a Lua object (table) and `data.lang` must be a language object") end if data.id and type(data.id) ~= "string" then error("Internal error: The id in the data table should be a string.") end ------------ 2. Initialize pagename etc. ------------ local langcode = data.lang:getCode() local full_langcode = data.lang:getFullCode() local langname = data.lang:getCanonicalName() local full_langname = data.lang:getFullName() local raw_pagename = data.pagename local page local m_headword_data = m_data or get_data() if raw_pagename and raw_pagename ~= m_headword_data.pagename then -- for testing, doc pages, etc. -- data.pagename is often set on documentation and test pages through the pagename= parameter of various -- templates, to emulate running on that page. Having a large number of such test templates on a single -- page often leads to timeouts, because we fetch and parse the contents of each page in turn. However, -- we don't really need to do that and can function fine without fetching and parsing the contents of a -- given page, so turn off content fetching/parsing (and also setting the DEFAULTSORT key through a parser -- function, which is *slooooow*) in certain namespaces where test and documentation templates are likely to -- be found and where actual content does not live (User, Template, Module). local actual_namespace = m_headword_data.page.namespace local no_fetch_content = actual_namespace == "सदस्य" or actual_namespace == "साँचा" or actual_namespace == "मॉड्यूल" page = process_page(raw_pagename, no_fetch_content) else page = m_headword_data.page end local namespace = page.namespace if data.altform then -- Temporary tracking for use of old altform= track("altform", data.lang) end local is_varform_only = data.var and data.var ~= "both" local is_varform_both = data.var == "both" ------------ 3. Initialize `data.heads` table; if old-style, convert to new-style. ------------ if type(data.heads) == "table" and type(data.heads[1]) == "table" then -- new-style if data.translits or data.transcriptions then error("Internal error: In full_headword(), if `data.heads` is new-style (array of head objects), `data.translits` and `data.transcriptions` cannot be given") end else -- convert old-style `heads`, `translits` and `transcriptions` to new-style local maxind = max( init_and_find_maximum_index(data, "heads"), init_and_find_maximum_index(data, "translits", true), init_and_find_maximum_index(data, "transcriptions", true) ) for i = 1, maxind do data.heads[i] = { term = data.heads[i], tr = data.translits[i], ts = data.transcriptions[i], } end end -- Make sure there's at least one head. if not data.heads[1] then data.heads[1] = {} end ------------ 4. Initialize and validate `data.categories` and `data.whole_page_categories`, and determine `pos_category` if not given, and add basic categories. ------------ init_and_find_maximum_index(data, "श्रेणियाँ") init_and_find_maximum_index(data, "whole_page_categories") local pos_category_already_present = false if data.categories[1] then local escaped_langname = pattern_escape(full_langname) local matches_lang_pattern = "^" .. escaped_langname .. " " for _, cat in ipairs(data.categories) do -- Does the category begin with the language name? If not, tag it with a tracking category. if not cat:find(matches_lang_pattern) then -- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/no lang category]] -- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/no lang category/LANGCODE]] track("no lang category", data.lang) end end -- If `pos_category` not given, try to infer it from the first specified category. If this doesn't work, we -- throw an error below. if not data.pos_category and data.categories[1]:find(matches_lang_pattern) then data.pos_category = data.categories[1]:gsub(matches_lang_pattern, "") -- Optimization to avoid inserting category already present. pos_category_already_present = true end end if not data.pos_category then error("Internal error: `data.pos_category` not specified and could not be inferred from the categories given in " .. "`data.categories`. Either specify the plural part of speech in `data.pos_category` " .. "(e.g. \"proper nouns\") or ensure that the first category in `data.categories` is formed from the " .. "language's canonical name plus the plural part of speech (e.g. \"Norwegian Bokmål proper nouns\")." ) end -- Insert a category at the beginning for the part of speech unless it's already present or `data.noposcat` given. if not pos_category_already_present and not data.noposcat and not is_varform_only then local pos_category = full_langname .. " " .. data.pos_category -- FIXME: [[User:Theknightwho]] Why is this special case here? Please add an explanatory comment. if pos_category ~= "Translingual Han characters" then insert(data.categories, 1, pos_category) end end -- Try to determine whether the part of speech refers to a lemma or a non-lemma form; if we can figure this out, -- add an appropriate category. local postype = export.pos_lemma_or_nonlemma(data.pos_category) if not postype then -- We don't know what this category is, so tag it with a tracking category. -- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/unrecognized pos]] -- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/unrecognized pos/LANGCODE]] track("unrecognized pos", data.lang) -- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/unrecognized pos/POS]] -- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/unrecognized pos/POS/LANGCODE]] track("unrecognized pos/pos/" .. data.pos_category, data.lang) elseif not data.noposcat and not is_varform_only then insert(data.categories, 1, full_langname .. " " .. postype .. "") end -- Categorize variant forms into 'variant lemmas' or 'variant non-lemma forms'. Originally proposed in -- [[Wiktionary:Beer parlour/2024/June#Decluttering the altform mess]] as 'alternative forms'; renamed in -- [[Wiktionary:Beer parlour/2026/July#Renaming the "alternative forms" categories]]. if (is_varform_only or is_varform_both) and postype then insert(data.categories, 1, full_langname .. " वैरिएंट " .. postype .. "") end ------------ 5. Create a default headword, and add links to multiword page names. ------------ -- Determine if this is an "anti-asterisk" term, i.e. an attested term in a language that must normally be -- reconstructed. local is_anti_asterisk = data.heads[1].term and data.heads[1].term:find("^!!") local lang_reconstructed = data.lang:hasType("reconstructed") if is_anti_asterisk then if not lang_reconstructed then error("Anti-asterisk feature (head= beginning with !!) can only be used with reconstructed languages") end lang_reconstructed = false end -- Determine if term is reconstructed local is_reconstructed = namespace == "Reconstruction" or lang_reconstructed -- Create a default headword based on the pagename, which is determined in -- advance by the data module so that it only needs to be done once. local default_head = page.pagename -- Add links to multi-word page names when appropriate if not (is_reconstructed or data.nolinkhead) then local no_links = m_headword_data.no_multiword_links if not (no_links[langcode] or no_links[full_langcode]) and export.head_is_multiword(default_head) then default_head = export.add_multiword_links(default_head, true) end end if is_reconstructed then default_head = "*" .. default_head end ------------ 6. Check the namespace against the language type. ------------ if namespace == "" then if lang_reconstructed then error("Entries in " .. langname .. " must be placed in the Reconstruction: namespace") elseif data.lang:hasType("appendix-constructed") then error("Entries in " .. langname .. " must be placed in the Appendix: namespace") end elseif namespace == "Citations" or namespace == "Thesaurus" then error("Headword templates should not be used in the " .. namespace .. ": namespace.") end ------------ 7. Fill in missing values in `data.heads`. ------------ -- True if any script among the headword scripts has spaces in it. local any_script_has_spaces = false -- True if any term has a redundant head= param. local has_redundant_head_param = false for _, head in ipairs(data.heads) do ------ 7a. If missing head, replace with default head. if not head.term then head.term = default_head elseif head.term == default_head then has_redundant_head_param = true elseif is_anti_asterisk and head.term == "!!" then -- If explicit head=!! is given, it's an anti-asterisk term and we fill in the default head. head.term = "!!" .. default_head elseif head.term:find("^[!?]$") then -- If explicit head= just consists of ! or ?, add it to the end of the default head. head.term = default_head .. head.term end head.term_no_initial_bang_bang = is_anti_asterisk and head.term:sub(3) or head.term if is_reconstructed then local head_term = head.term if head_term:find("%[%[") then head_term = remove_links(head_term) end if head_term:sub(1, 1) ~= "*" then error("The headword '" .. head_term .. "' must begin with '*' to indicate that it is reconstructed.") end end ------ 7b. Try to detect the script(s) if not provided. If a per-head script is provided, that takes precedence, ------ otherwise fall back to the overall script if given. If neither given, autodetect the script. local auto_sc = data.lang:findBestScript(head.term) if ( auto_sc:getCode() == "None" and find_best_script_without_lang(head.term):getCode() ~= "None" ) then insert(data.categories, full_langname .. " टर्म गैर-स्टैंडर्ड लिपि में") end if not (head.sc or data.sc) then -- No script code given, so use autodetected script. head.sc = auto_sc else if not head.sc then -- Overall script code given. head.sc = data.sc end -- Track uses of sc parameter. if head.sc:getCode() == auto_sc:getCode() then track("redundant script code", data.lang) if not data.no_script_code_cat then insert(data.categories, full_langname .. " टर्म दुहराव वाले लिपि कोड के साथ") end else track("non-redundant manual script code", data.lang) if not data.no_script_code_cat then insert(data.categories, full_langname .. " terms with non-redundant manual script codes") end end end -- If using a discouraged character sequence, add to maintenance category. if head.sc:hasNormalizationFixes() == true then local composed_head = toNFC(head.term) if head.sc:fixDiscouragedSequences(composed_head) ~= composed_head then insert(data.whole_page_categories, "Pages using discouraged character sequences") end end any_script_has_spaces = any_script_has_spaces or head.sc:hasSpaces() ------ 7c. Create automatic transliterations for any non-Latin headwords without manual translit given ------ (provided automatic translit is available, e.g. not in Persian or Hebrew). -- Make transliterations head.tr_manual = nil -- Try to generate a transliteration if necessary if head.tr == "-" then head.tr = nil else local notranslit = m_headword_data.notranslit if not (notranslit[langcode] or notranslit[full_langcode]) and head.sc:isTransliterated() then head.tr_manual = not not head.tr local text = head.term_no_initial_bang_bang if not data.lang:link_tr(head.sc) then text = remove_links(text) end local automated_tr = data.lang:transliterate(text, head.sc) if automated_tr then local manual_tr = head.tr if manual_tr then if remove_links(manual_tr) == remove_links(automated_tr) then insert(data.categories, full_langname .. " terms with redundant transliterations") else insert(data.categories, full_langname .. " terms with non-redundant manual transliterations") end end if not manual_tr then head.tr = automated_tr end end -- There is still no transliteration? -- Add the entry to a cleanup category. if not head.tr then head.tr = "<small>transliteration needed</small>" -- FIXME: No current support for 'Request for transliteration of Classical Persian terms' or similar. -- Consider adding this support in [[Module:category tree/poscatboiler/data/entry maintenance]]. insert(data.categories, "Requests for transliteration of " .. full_langname .. " terms") else -- Otherwise, trim it. head.tr = trim(head.tr) end end end -- Link to the transliteration entry for languages that require this. if head.tr and data.lang:link_tr(head.sc) then head.tr = full_link{ term = head.tr, lang = data.lang, sc = get_script("Latn"), tr = "-" } end end ------------ 8. Maybe tag the title with the appropriate script code, using the `display_title` mechanism. ------------ -- Assumes that the scripts in "toBeTagged" will never occur in the Reconstruction namespace. -- (FIXME: Don't make assumptions like this, and if you need to do so, throw an error if the assumption is violated.) -- Avoid tagging ASCII as Hani even when it is tagged as Hani in the headword, as in [[check]]. The check for ASCII -- might need to be expanded to a check for any Latin characters and whitespace or punctuation. local display_title -- Where there are multiple headwords, use the script for the first. This assumes the first headword is similar to -- the pagename, and that headwords that are in different scripts from the pagename aren't first. This seems to be -- about the best we can do (alternatively we could potentially do script detection on the pagename). local dt_script = data.heads[1].sc local dt_script_code = dt_script:getCode() local page_non_ascii = namespace == "" and not page.pagename:find("^[%z\1-\127]+$") local unsupported_pagename, unsupported = page.full_raw_pagename:gsub("^Unsupported titles/", "") if unsupported == 1 and page.unsupported_titles[unsupported_pagename] then display_title = 'Unsupported titles/<span class="' .. dt_script_code .. '">' .. page.unsupported_titles[unsupported_pagename] .. '</span>' elseif page_non_ascii and m_headword_data.toBeTagged[dt_script_code] or (dt_script_code == "Jpan" and (text_in_script(page.pagename, "Hira") or text_in_script(page.pagename, "Kana"))) or (dt_script_code == "Kore" and text_in_script(page.pagename, "Hang")) then display_title = '<span class="' .. dt_script_code .. '">' .. page.full_raw_pagename .. '</span>' -- Keep Han entries region-neutral in the display title. elseif page_non_ascii and (dt_script_code == "Hant" or dt_script_code == "Hans") then display_title = '<span class="Hani">' .. page.full_raw_pagename .. '</span>' elseif namespace == "Reconstruction" then local matched display_title, matched = ugsub( page.full_raw_pagename, "^(Reconstruction:[^/]+/)(.+)$", function(before, term) return before .. tag_text(term, data.lang, dt_script) end ) if matched == 0 then display_title = nil end end -- FIXME: Generalize this. -- If the current language uses Aran (Nastaliq), e.g. Urdu, and there's more than one language on the page, don't -- set the display title because we don't want Nastaliq for terms that also exist in other languages that don't -- display in Nastaliq (e.g. Arabic or Persian). Because the word "Urdu" occurs near the end of the alphabet, Urdu -- fonts tend to override the fonts of other languages. FIXME: This is checking for more than one language on the -- page but instead needs to check if there are any languages using scripts other than Aran. if dt_script_code == "Aran" and page.L2_list.n > 1 then display_title = nil end if display_title then mw.getCurrentFrame():callParserFunction( "DISPLAYTITLE", display_title ) end ------------ 9. Insert additional categories. ------------ if data.force_cat_output then -- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/force cat output]] track("force cat output") end if has_redundant_head_param then if not data.no_redundant_head_cat then -- This is not the right way to go about this; too many exceptions and problems due to language-specific headword -- handling customization. If we want this, it should be opt-in by a given language passing in the default headword. -- insert(data.categories, full_langname .. " terms with redundant head parameter") end end -- If the first head is multiword (after removing links), maybe insert into "LANG multiword terms". if not data.nomultiwordcat and not is_varform_only and any_script_has_spaces and postype == "lemma" then local no_multiword_cat = m_headword_data.no_multiword_cat if not (no_multiword_cat[langcode] or no_multiword_cat[full_langcode]) then -- Check for spaces or hyphens, but exclude prefixes and suffixes. -- Use the pagename, not the head= value, because the latter may have extra -- junk in it, e.g. superscripted text that throws off the algorithm. local no_hyphen = m_headword_data.hyphen_not_multiword_sep -- Exclude hyphens if the data module states that they should for this language. local checkpattern = (no_hyphen[langcode] or no_hyphen[full_langcode]) and ".[%s፡]." or ".[%s%-፡]." local is_multiword = umatch(page.pagename, checkpattern) if is_multiword and not non_categorizable(page.full_raw_pagename) then insert(data.categories, full_langname .. " कई शब्द वाले टर्म") elseif not is_multiword then local long_word_threshold = m_headword_data.long_word_thresholds[langcode] or m_headword_data.long_word_thresholds[full_langcode] if long_word_threshold and ulen(page.pagename) >= long_word_threshold then insert(data.categories, "लंबे " .. full_langname .. " शब्द") end end end end -- Determine whether to insert a category 'LANGNAME POS in SCRIPT'. If there are multiple heads, we may need to check -- each head, as the heads may (theoretically) have different scripts. local default_sccat = m_headword_data.default_sccat if data.sccat or not is_varform_only and (default_sccat[langcode] or langcode ~= full_langcode and default_sccat[full_langcode]) then local function needs_sccat(sccat_entry, sc) if sccat_entry == true or not sccat_entry then return sccat_entry end if type(sccat_entry) == "table" then local in_list = contains(sccat_entry, sc:getCode()) if sccat_entry[1] == "not" then in_list = not in_list end return in_list end return nil end for _, head in ipairs(data.heads) do -- First check the `sccat` specified at the {{head}} level. local this_needs_sccat = needs_sccat(data.sccat, head.sc) -- If that wasn't given, check the default sccat at the language level for the lang code. if this_needs_sccat == nil and not is_varform_only then this_needs_sccat = needs_sccat(default_sccat[langcode], head.sc) end -- If that wasn't found and the lang code is an etym code, check the default sccat at the parent language level. if this_needs_sccat == nil and not is_varform_only and langcode ~= full_langcode then this_needs_sccat = needs_sccat(default_sccat[full_langcode], head.sc) end if this_needs_sccat then insert(data.categories, full_langname .. " " .. data.pos_category .. " in " .. head.sc:getDisplayForm(data.lang)) end end end -- Reconstructed terms often use weird combinations of scripts and realistically aren't spelled so much as notated. if namespace ~= "Reconstruction" and not is_varform_only then -- Map from languages to a string containing the characters to ignore when considering whether a term has -- multiple written scripts in it. Typically these are Greek or Cyrillic letters used for their phonetic -- values. local characters_to_ignore = { ["aaq"] = "αάὰ", -- Penobscot (Algonquian) ["acy"] = "δθ", -- Cypriot Arabic ["aez"] = "β", -- Aeka (Trans-New Guinea) ["anc"] = "γ", -- Ngas (Chadic/Afroasiatic) ["aou"] = "χ", -- A'ou (Kra-Dai) ["art-blk"] = "ч", -- Bolak (conlang) ["awg"] = "β", -- Anguthimri (Pama-Nyungan) ["az"] = "ь", -- Azerbaijani (Turkic; Yañalif Latin spelling, c. 1928 - 1938) ["ba"] = "ь", -- Bashkir (Turkic; Yañalif Latin spelling, c. 1928 - 1938) ["bhp"] = "β", -- Bima (Austronesian) ["bjz"] = "β", -- Baruga (Trans-New Guinea) ["byk"] = "θ", -- Biao (Kra-Dai) ["cdy"] = "θ", -- Chadong (Kra-Dai) ["chp"] = "θ", -- Chipewyan (Athabaskan) ["cjh"] = "χ", -- Upper Chehalis (Salishan) ["clm"] = "χ", -- Klallam (Salishan) ["col"] = "χ", -- Colombia-Wenatchi (Salishan) ["coo"] = "χθ", -- Comox (Salishan) ["crx"] = "θ", -- Carrier (Athabaskan) ["ets"] = "θ", -- Yekhee (Edoid/Niger-Congo) ["ett"] = "χ", -- Etruscan (isolate; in romanizations) ["fla"] = "χ", -- Montana Salish (Salishan) ["grt"] = "་", -- Garo (South Asian Sino-Tibetan) ["gmw-gts"] = "χ", -- Gottscheerish (Bavarian variant spoken in Slovenia) ["hur"] = "χθ", -- Halkomelem (Salishan) ["itc-psa"] = "f", -- Pre-Samnite (Italic; normally written in Greek) ["izh"] = "ь", -- Ingrian (Finnic) ["kic"] = "θ", -- Kickapoo (Algonquian) ["kk"] = "ь", -- Kazakh (Turkic; Yañalif Latin spelling, c. 1928 - 1938) ["ky"] = "ь", -- Kyrgyz (Turkic; Yañalif Latin spelling, c. 1928 - 1938) ["lil"] = "χ", -- Lillooet (Salishan) ["lsi"] = "ꓹ", -- Lashi (Lolo-Burmese/Sino-Tibetan; represents a glottal stop) ["mhz"] = "β", -- Mor (Austronesian) ["mqn"] = "β", -- Moronene (Austronesian) ["neg"]= "ӡā", -- Negidal (Tungusic; normally in Cyrillic) ["oka"] = "χ", -- Okanagan (Salishan) ["ole"] = "θ", -- Olekha (Sino-Tibetan) ["oui"] = "γβ", -- Old Uyghur (Turkic; FIXME: others? E.g. Greek delta (δ)?) ["pox"] = "χ", -- Polabian (West Slavic) ["rif"] = "ε", -- Tarifit (Berber) ["rom"] = "Θθ", -- Romani (Indic: International Standard; two different thetas???) ["rpn"] = "β", -- Repanbitip (Austronesian) ["sah"] = "ь", -- Yakut (Turkic; 1929 - 1939 Latin spelling) ["sit-jap"] = "χ", -- Japhug (Sino-Tibetan) ["sjw"] = "θ", -- Shawnee (Algonquian) ["squ"] = "χ", -- Squamish (Salishan) ["str"] = "χθ", -- Saanich (Salishan) ["teh"] = "χ", -- Tehuelche (Chonan; spoken in Argentina) ["tep"] = "η", -- Tepecano (Uto-Aztecan) ["thp"] = "χ", -- Thompson (Salishan) ["tk"] = "ь", -- Turkmen (Turkic; Yañalif Latin spelling, c. 1928 - 1938) ["tt"] = "ь", -- Kazakh (Turkic; Yañalif Latin spelling, c. 1928 - 1938) ["twa"] = "χ", -- Twana (Salishan) ["wbl"] = "ы", -- Wakhi (Iranian) ["xbc"] = "ϸ", -- Bactrian (Iranian; represents š; normally written in Greek) ["yha"] = "θ", -- Baha (Kra-Dai) ["za"] = "зч", -- Zhuang (Tai/Kra-Dai); 1957-1982 alphabet used two Cyrillic letters (as well as some others like -- ƃ, ƅ, ƨ, ɯ and ɵ that look like Cyrillic or Greek but are actually Latin) ["zlw-slv"] = "χђћ", -- Slovincian (West Slavic; FIXME: χ is Greek, the other two are Cyrillic, but I'm not sure -- the currect characters are being chosen in the entry names) ["zng"] = "θ", -- Mang (Mon-Khmer) ["ztp"] = "θ", -- Loxicha Zapotec (Zapotecan) } -- Determine how many real scripts are found in the pagename, where we exclude symbols and such. We exclude -- scripts whose `character_category` is false as well as Zmth (mathematical notation symbols), which has a -- category of "Mathematical notation symbols". When counting scripts, we need to elide language-specific -- variants because e.g. Beng and as-Beng have slightly different characters but we don't want to consider them -- two different scripts (e.g. [[এৰ]] has two characters which are detected respectively as Beng and as-Beng). local seen_scripts = {} local num_seen_scripts = 0 local num_loops = 0 local canon_pagename = page.pagename local ch_to_ignore = characters_to_ignore[full_langcode] if ch_to_ignore then canon_pagename = ugsub(canon_pagename, "[" .. ch_to_ignore .. "]", "") end while true do if canon_pagename == "" or num_seen_scripts >= 2 or num_loops >= 10 then break end -- Make sure we don't get into a loop checking the same script over and over again; happens with e.g. [[ᠪᡳ]] num_loops = num_loops + 1 local pagename_script = find_best_script_without_lang(canon_pagename, "None only as last resort") local script_chars = pagename_script.characters if not script_chars then -- we are stuck; this happens with None break end local script_code = pagename_script:getCode() local replaced canon_pagename, replaced = ugsub(canon_pagename, "[" .. script_chars .. "]", "") if ( replaced and script_code ~= "Zmth" and (script_data or get_script_data())[script_code] and script_data[script_code].character_category ~= false ) then script_code = script_code:gsub("^.-%-", "") if not seen_scripts[script_code] then seen_scripts[script_code] = true num_seen_scripts = num_seen_scripts + 1 end end end if num_seen_scripts > 1 then insert(data.categories, full_langname .. " टर्म कई लिपियों में लिखे जाने वाले") end end -- Categorise for unusual characters. Takes into account combining characters, so that we can categorise for characters with diacritics that aren't encoded as atomic characters (e.g. U̠). These can be in two formats: single combining characters (i.e. character + diacritic(s)) or double combining characters (i.e. character + diacritic(s) + character). Each can have any number of diacritics. local standard = data.lang:getStandardCharacters() if not is_varform_only and standard and not non_categorizable(page.full_raw_pagename) then local function char_category(char) local specials = { ["#"] = "number sign", ["("] = "parentheses", [")"] = "parentheses", ["<"] = "angle brackets", [">"] = "angle brackets", ["["] = "square brackets", ["]"] = "square brackets", ["_"] = "underscore", ["{"] = "braces", ["|"] = "vertical line", ["}"] = "braces", ["ß"] = "ẞ", ["\205\133"] = "", -- this is UTF-8 for U+0345 ( ͅ) ["\239\191\189"] = "replacement character", } char = toNFD(char) :gsub(".[\128-\191]*", function(m) local new_m = specials[m] new_m = new_m or m:uupper() return new_m end) return toNFC(char) end if full_langcode ~= "hi" and full_langcode ~= "lo" then local standard_chars_scripts = {} for _, head in ipairs(data.heads) do standard_chars_scripts[head.sc:getCode()] = true end -- Iterate over the scripts, in case there is more than one (as they can have different sets of standard characters). for code in pairs(standard_chars_scripts) do local sc_standard = data.lang:getStandardCharacters(code) if sc_standard then if page.pagename_len > 1 then local explode_standard = {} local function explode(char) explode_standard[char] = true return "" end local sc_standard_exploded = ugsub(sc_standard, page.comb_chars.combined_double, explode) -- The following is correct; it relies on side-effecing the explode_standard[] table. ugsub(sc_standard_exploded, page.comb_chars.combined_single, explode):gsub(".[\128-\191]*", explode) local num_cat_inserted for char in pairs(page.explode_pagename) do if not explode_standard[char] then if char:find("[0-9]") then if not num_cat_inserted then insert(data.categories, full_langname .. " terms spelled with numbers") num_cat_inserted = true end elseif ufind(char, page.emoji_pattern) then insert(data.categories, full_langname .. " terms spelled with emoji") else local upper = char_category(char) if not explode_standard[upper] then char = upper end insert(data.categories, full_langname .. " terms spelled with " .. char) end end end end -- If a diacritic doesn't appear in any of the standard characters, also categorise for it generally. sc_standard = toNFD(sc_standard) for diacritic in ugmatch(page.decompose_pagename, page.comb_chars.diacritics_single) do if not umatch(sc_standard, diacritic) then insert(data.categories, full_langname .. " terms spelled with ◌" .. diacritic) end end for diacritic in ugmatch(page.decompose_pagename, page.comb_chars.diacritics_double) do if not umatch(sc_standard, diacritic) then insert(data.categories, full_langname .. " terms spelled with ◌" .. diacritic .. "◌") end end end end -- Ancient Greek, Hindi and Lao handled the old way for now, as their standard chars still need to be converted to the new format (because there are a lot of them). elseif ulen(page.pagename) ~= 1 then for character in ugmatch(page.pagename, "([^" .. standard .. "])") do local upper = char_category(character) if not umatch(upper, "[" .. standard .. "]") then character = upper end insert(data.categories, full_langname .. " terms spelled with " .. character) end end end if not is_varform_only and data.heads[1].sc:isSystem("alphabet") then local pagename, i = page.pagename:ulower(), 2 while umatch(pagename, "(%a)" .. ("%1"):rep(i)) do i = i + 1 insert(data.categories, full_langname .. " terms with " .. i .. " consecutive instances of the same letter") end end -- Categorise for palindromes if not is_varform_only and not data.nopalindromecat and namespace ~= "Reconstruction" and ulen(page.pagename) > 2 -- FIXME: Use of first script here seems hacky. What is the clean way of doing this in the presence of -- multiple scripts? and is_palindrome(page.pagename, data.lang, data.heads[1].sc) then insert(data.categories, full_langname .. " पैलिंड्रोम") end if namespace == "" and not lang_reconstructed then for _, head in ipairs(data.heads) do if page.full_raw_pagename ~= get_link_page(remove_links(head.term), data.lang, head.sc) then -- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/pagename spelling mismatch]] -- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/pagename spelling mismatch/LANGCODE]] track("pagename spelling mismatch", data.lang) break end end end -- Add red link category if called for and we're not a "large" page, where such checks are disabled. if data.checkredlinks and not m_headword_data.large_pages[m_headword_data.pagename] then local plposcat = type(data.checkredlinks) == "string" and data.checkredlinks or data.pos_category check_red_link_inflections_top_level(data, plposcat) end -- Add to various maintenance categories. export.maintenance_cats(page, data.lang, data.categories, data.whole_page_categories) ------------ 10. Format and return headwords, genders, inflections and categories. ------------ -- Format and return all the gathered information. This may add more categories (e.g. gender/number categories), -- so make sure we do it before evaluating `data.categories`. local text = '<span class="headword-line">' .. format_headword(data) .. format_headword_genders(data, is_varform_only) .. format_top_level_inflections(data) .. '</span>' -- Language-specific categories. local cats = format_categories( data.categories, data.lang, data.sort_key, page.encoded_pagename, data.force_cat_output or test_force_categories, data.heads[1].sc ) -- Language-agnostic categories. local whole_page_cats = format_categories( data.whole_page_categories, nil, "-" ) return text .. cats .. whole_page_cats end return export bkjlsqf7k368usjgc60mfr3w6wvufb1 487796 487782 2026-09-02T17:44:26Z SM7 6218 सुधार 487796 Scribunto text/plain local export = {} -- Named constants for all modules used, to make it easier to swap out sandbox versions. local debug_track_module = "Module:debug/track" local en_utilities_module = "Module:en-utilities" local gender_and_number_module = "Module:gender and number" local headword_data_module = "Module:headword/data" local headword_page_module = "Module:headword/page" local links_module = "Module:links" local load_module = "Module:load" local pages_module = "Module:pages" local palindromes_module = "Module:palindromes" local pron_qualifier_module = "Module:pron qualifier" local scripts_module = "Module:scripts" local scripts_data_module = "Module:scripts/data" local script_utilities_module = "Module:script utilities" local script_utilities_data_module = "Module:script utilities/data" local string_utilities_module = "Module:string utilities" local table_module = "Module:table" local utilities_module = "Module:utilities" local concat = table.concat local dump = mw.dumpObject local insert = table.insert local ipairs = ipairs local max = math.max local new_title = mw.title.new local pairs = pairs local require = require local toNFC = mw.ustring.toNFC local toNFD = mw.ustring.toNFD local type = type local ufind = mw.ustring.find local ugmatch = mw.ustring.gmatch local ugsub = mw.ustring.gsub 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 debug_track(...) debug_track = require(debug_track_module) return debug_track(...) end local function contains(...) contains = require(table_module).contains return contains(...) end local function encode_entities(...) encode_entities = require(string_utilities_module).encode_entities 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_pron_qualifiers(...) format_pron_qualifiers = require(pron_qualifier_module).format_qualifiers return format_pron_qualifiers(...) end local function full_link(...) full_link = require(links_module).full_link return full_link(...) end local function get_current_L2(...) get_current_L2 = require(pages_module).get_current_L2 return get_current_L2(...) end local function get_link_page(...) get_link_page = require(links_module).get_link_page return get_link_page(...) end local function get_script(...) get_script = require(scripts_module).getByCode return get_script(...) end local function is_palindrome(...) is_palindrome = require(palindromes_module).is_palindrome return is_palindrome(...) end local function language_link(...) language_link = require(links_module).language_link return language_link(...) end local function load_data(...) load_data = require(load_module).load_data return load_data(...) end local function pattern_escape(...) pattern_escape = require(string_utilities_module).pattern_escape return pattern_escape(...) end local function pluralize(...) pluralize = require(en_utilities_module).pluralize return pluralize(...) end local function process_page(...) process_page = require(headword_page_module).process_page return process_page(...) end local function remove_links(...) remove_links = require(links_module).remove_links return remove_links(...) end local function shallow_copy(...) shallow_copy = require(table_module).shallowCopy return shallow_copy(...) end local function tag_text(...) tag_text = require(script_utilities_module).tag_text return tag_text(...) end local function tag_transcription(...) tag_transcription = require(script_utilities_module).tag_transcription return tag_transcription(...) 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 ulen(...) ulen = require(string_utilities_module).len return ulen(...) 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 = load_data(headword_data_module) return m_data end local script_data local function get_script_data() script_data = load_data(scripts_data_module) return script_data end local script_utilities_data local function get_script_utilities_data() script_utilities_data = load_data(script_utilities_data_module) return script_utilities_data end -- If set to true, categories always appear, even in non-mainspace pages local test_force_categories = false -- Add a tracking category to track entries with certain (unusually undesirable) properties. `track_id` is an identifier -- for the particular property being tracked and goes into the tracking page. Specifically, this adds a link in the -- page text to [[Wiktionary:Tracking/headword/TRACK_ID]], meaning you can find all entries with the `track_id` property -- by visiting [[Special:WhatLinksHere/Wiktionary:Tracking/headword/TRACK_ID]]. -- -- If `lang` (a language object) is given, an additional tracking page [[Wiktionary:Tracking/headword/TRACK_ID/CODE]] is -- linked to where CODE is the language code of `lang`, and you can find all entries in the combination of `track_id` -- and `lang` by visiting [[Special:WhatLinksHere/Wiktionary:Tracking/headword/TRACK_ID/CODE]]. This makes it possible to -- isolate only the entries with a specific tracking property that are in a given language. Note that if `lang` -- references at etymology-only language, both that language's code and its full parent's code are tracked. local function track(track_id, lang) local tracking_page = "headword/" .. track_id if lang and lang:hasType("etymology-only") then debug_track{tracking_page, tracking_page .. "/" .. lang:getCode(), tracking_page .. "/" .. lang:getFullCode()} elseif lang then debug_track{tracking_page, tracking_page .. "/" .. lang:getCode()} else debug_track(tracking_page) end return true end local function text_in_script(text, script_code) local sc = get_script(script_code) if not sc then error("Internal error: Bad script code " .. script_code) end local characters = sc.characters local out if characters then text = ugsub(text, "%W", "") out = ufind(text, "[" .. characters .. "]") end if out then return true else return false end end local spacingPunctuation = "[%s%p]+" --[[ List of punctuation or spacing characters that are found inside of words. Used to exclude characters from the regex above. ]] local wordPunc = "-#%%&@־׳״'.·*’་•:᠊" local notWordPunc = "[^" .. wordPunc .. "]+" -- Format a term (either a head term or an inflection term) along with any left or right qualifiers, labels, references -- or customized separator: `part` is the object specifying the term (and `lang` the language of the term), which should -- optionally contain: -- * left qualifiers in `q`, an array of strings; -- * right qualifiers in `qq`, an array of strings; -- * left labels in `l`, an array of strings; -- * right labels in `ll`, an array of strings; -- * 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`; -- * a separator in `separator`, defaulting to " <i>or</i> " if this is not the first term (j > 1), otherwise "". -- `formatted` is the formatted version of the term itself, and `j` is the index of the term. local function format_term_with_qualifiers_and_refs(lang, part, formatted, j) local function part_non_empty(field) local list = part[field] if not list then return nil end if type(list) ~= "table" then error(("Internal error: Wrong type for `part.%s`=%s, should be \"table\""):format(field, dump(list))) end return list[1] end if part_non_empty("q") or part_non_empty("qq") or part_non_empty("l") or part_non_empty("ll") or part_non_empty("refs") then formatted = format_pron_qualifiers { lang = lang, text = formatted, q = part.q, qq = part.qq, l = part.l, ll = part.ll, refs = part.refs, } end local separator = part.separator or j > 1 and " <i>अथवा</i> " -- use "" to request no separator if separator then formatted = separator .. formatted end return formatted end --[==[Return true if the given head is multiword according to the algorithm used in full_headword().]==] function export.head_is_multiword(head) for possibleWordBreak in ugmatch(head, spacingPunctuation) do if umatch(possibleWordBreak, notWordPunc) then return true end end return false end do local function workaround_to_exclude_chars(s) return (ugsub(s, notWordPunc, "\2%1\1")) end --[==[ Add appropriate links to `head`, correctly handling multiword terms. This is intended for multiword terms but can be used for any term if you want links added to single-word terms as well. If you want to only add links to multiword terms, first check that the term is multiword using `head_is_multiword`. If `default` is specified, this will escape colons so that they don't get interpreted as interwiki links. This should generally only be used when `head` is an actual pagename or is taken from a {{para|pagename}} parameter, not when taken from a {{para|head}} parameter. ]==] function export.add_multiword_links(head, default) head = "\1" .. ugsub(head, spacingPunctuation, workaround_to_exclude_chars) .. "\2" if default then head = head :gsub("(\1[^\2]*)\\([:#][^\2]*\2)", "%1\\\\%2") :gsub("(\1[^\2]*)([:#][^\2]*\2)", "%1\\%2") end --Escape any remaining square brackets to stop them breaking links (e.g. "[citation needed]"). head = encode_entities(head, "[]", true, true) --[=[ use this when workaround is no longer needed: head = "[[" .. ugsub(head, WORDBREAKCHARS, "]]%1[[") .. "]]" Remove any empty links, which could have been created above at the beginning or end of the string. ]=] return (head :gsub("\1\2", "") :gsub("[\1\2]", {["\1"] = "[[", ["\2"] = "]]"})) end end local function non_categorizable(full_raw_pagename) return full_raw_pagename:find("^Appendix:Gestures/") or -- Unsupported titles with descriptive names. (full_raw_pagename:find("^Unsupported titles/") and not full_raw_pagename:find("`")) end local function tag_text_and_add_quals_and_refs(data, head, formatted, j) -- Add language and script wrapper. formatted = tag_text(formatted, data.lang, head.sc, "head", nil, j == 1 and data.id or nil) -- Add qualifiers, labels, references and separator. return format_term_with_qualifiers_and_refs(data.lang, head, formatted, j) end -- Format a headword with transliterations. local function format_headword(data) -- Are there non-empty transliterations? local has_translits = false local has_manual_translits = false ------ Format the headwords. ------ local head_parts = {} local unique_head_parts = {} local has_multiple_heads = not not data.heads[2] for j, head in ipairs(data.heads) do if head.tr or head.ts then has_translits = true end if head.tr and head.tr_manual or head.ts then has_manual_translits = true end local formatted -- Apply processing to the headword, for formatting links and such. if head.term:find("[[", nil, true) and head.sc:getCode() ~= "Image" then formatted = language_link{term = head.term, lang = data.lang} else formatted = data.lang:makeDisplayText(head.term, head.sc, true) end local head_part = tag_text_and_add_quals_and_refs(data, head, formatted, j) insert(head_parts, head_part) -- If multiple heads, try to determine whether all heads display the same. To do this we need to effectively -- rerun the text tagging and addition of qualifiers and references, using 1 for all indices. if has_multiple_heads then local unique_head_part if j == 1 then unique_head_part = head_part else unique_head_part = tag_text_and_add_quals_and_refs(data, head, formatted, 1) end unique_head_parts[unique_head_part] = true end end local set_size = 0 if has_multiple_heads then for _ in pairs(unique_head_parts) do set_size = set_size + 1 end end if set_size == 1 then head_parts = head_parts[1] else head_parts = concat(head_parts) end if has_manual_translits then -- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/manual-tr]] -- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/manual-tr/LANGCODE]] track("manual-tr", data.lang) end ------ Format the transliterations and transcriptions. ------ local translits_formatted if has_translits then local translit_parts = {} for _, head in ipairs(data.heads) do if head.tr or head.ts then local this_parts = {} if head.tr then insert(this_parts, tag_translit(head.tr, data.lang:getCode(), "head", nil, head.tr_manual)) if head.ts then insert(this_parts, " ") end end if head.ts then insert(this_parts, "/" .. tag_transcription(head.ts, data.lang:getCode(), "head") .. "/") end insert(translit_parts, concat(this_parts)) end end translits_formatted = " (" .. concat(translit_parts, " <i>अथवा</i> ") .. ")" local langname = data.lang:getCanonicalName() local transliteration_page = new_title(langname .. " ट्रांसलिट्रेशन", "विक्षनरी") local saw_translit_page = false if transliteration_page and transliteration_page:getContent() then translits_formatted = " [[विक्षनरी:" .. langname .. " ट्रांसलिट्रेशन|•]]" .. translits_formatted saw_translit_page = true end -- If data.lang is an etymology-only language and we didn't find a translation page for it, fall back to the -- full parent. if not saw_translit_page and data.lang:hasType("etymology-only") then langname = data.lang:getFullName() transliteration_page = new_title(langname .. " ट्रांसलिट्रेशन", "विक्षनरी") if transliteration_page and transliteration_page:getContent() then translits_formatted = " [[विक्षनरी:" .. langname .. " ट्रांसलिट्रेशन|•]]" .. translits_formatted end end else translits_formatted = "" end ------ Paste heads and transliterations/transcriptions. ------ local lemma_gloss if data.gloss then lemma_gloss = ' <span class="ib-content qualifier-content">' .. data.gloss .. '</span>' else lemma_gloss = "" end return head_parts .. translits_formatted .. lemma_gloss end local function format_headword_genders(data, is_varform_only) local retval = "" if data.genders and data.genders[1] then if data.gloss then retval = "," end local pos_for_cat if not data.nogendercat and not is_varform_only then local no_gender_cat = (m_data or get_data()).no_gender_cat if not (no_gender_cat[data.lang:getCode()] or no_gender_cat[data.lang:getFullCode()]) then pos_for_cat = (m_data or get_data()).pos_for_gender_number_cat[data.pos_category:gsub("^reconstructed ", "")] end end local text, cats = format_genders(data.genders, data.lang, pos_for_cat) if cats then extend(data.categories, cats) end retval = retval .. "&nbsp;" .. text end return retval end -- Forward reference local format_inflections local function format_inflection_parts(data, parts) for j, part in ipairs(parts) do if type(part) ~= "table" then part = {term = part} end local partaccel = part.accel local face = part.face or "bold" if face ~= "bold" and face ~= "plain" and face ~= "hypothetical" then error("The face `" .. face .. "` " .. ( (script_utilities_data or get_script_utilities_data()).faces[face] and "should not be used for non-headword terms on the headword line." or "is invalid." )) end -- Here the final part 'or data.nolinkinfl' allows to have 'nolinkinfl=true' -- right into the 'data' table to disable inflection links of the entire headword -- when inflected forms aren't entry-worthy, e.g.: in Vulgar Latin local nolinkinfl = part.face == "hypothetical" or (part.nolink and track("nolink") or part.nolinkinfl) or ( data.nolink and track("nolink") or data.nolinkinfl) local formatted if part.label then -- FIXME: There should be a better way of italicizing a label. As is, this isn't customizable. formatted = "<i>" .. part.label .. "</i>" else -- Convert the term into a full link. Don't show a transliteration here unless enable_auto_translit is -- requested, either at the `parts` level (i.e. per inflection) or at the `data.inflections` level (i.e. -- specified for all inflections). This is controllable in {{head}} using autotrinfl=1 for all inflections, -- or fNautotr=1 for an individual inflection (remember that a single inflection may be associated with -- multiple terms). The reason for doing this is to avoid clutter in headword lines by default in languages -- where the script is relatively straightforward to read by learners (e.g. Greek, Russian), but allow it -- to be enabled in languages with more complex scripts (e.g. Arabic). -- -- FIXME: With nested inflections, should we also respect `enable_auto_translit` at the top level of the -- nested inflections structure? local tr = part.tr or not (parts.enable_auto_translit or data.inflections.enable_auto_translit) and "-" or nil -- FIXME: Temporary errors added 2025-10-03. Remove after a month or so. if part.translit then error("Internal error: Use field `tr` not `translit` for specifying an inflection part translit") end if part.transcription then error("Internal error: Use field `ts` not `transcription` for specifying an inflection part transcription") end local postprocess_annotations if part.inflections then postprocess_annotations = function(infldata) insert(infldata.annotations, format_inflections(data, part.inflections)) end end formatted = full_link( { term = not nolinkinfl and part.term or nil, alt = part.alt or (nolinkinfl and part.term or nil), lang = part.lang or data.lang, sc = part.sc or parts.sc or nil, gloss = part.gloss, pos = part.pos, lit = part.lit, id = part.id, genders = part.genders, tr = tr, ts = part.ts, accel = partaccel or parts.accel, postprocess_annotations = postprocess_annotations, }, face ) end parts[j] = format_term_with_qualifiers_and_refs(part.lang or data.lang, part, formatted, j) end local parts_output if parts[1] then parts_output = (parts.label and " " or "") .. concat(parts) elseif parts.request then parts_output = " <small>[please provide]</small>" insert(data.categories, "Requests for inflections in " .. data.lang:getFullName() .. " entries") else parts_output = "" end local parts_label = parts.label and ("<i>" .. parts.label .. "</i>") or "" return format_term_with_qualifiers_and_refs(data.lang, parts, parts_label .. parts_output, 1) end -- Format the inflections following the headword or nested after a given inflection. Declared local above. function format_inflections(data, inflections) if inflections and inflections[1] then -- Format each inflection individually. for key, infl in ipairs(inflections) do inflections[key] = format_inflection_parts(data, infl) end return concat(inflections, ", ") else return "" end end -- Format the top-level inflections following the headword. Currently this just adds parens around the -- formatted comma-separated inflections in `data.inflections`. local function format_top_level_inflections(data) local result = format_inflections(data, data.inflections) if result ~= "" then return " (" .. result .. ")" else return result end end -- Forward reference local check_red_link_inflections -- Check a single inflection (which consists of a label and zero or more terms, each possibly with nested inflections) -- for red links. If so, insert a red-link category based on `plpos` (the plural part of speech to insert in the -- category), stop further processing, and return true. If no red links found, return false. local function check_red_link_inflection_parts(data, parts, plpos) for _, part in ipairs(parts) do if type(part) ~= "table" then part = {term = part} end local term = part.term if term and not term:find("%[%[") then local stripped_physical_term = get_link_page(term, data.lang, part.sc or parts.sc or nil) if stripped_physical_term then local title = mw.title.new(stripped_physical_term) if title and not title:getContent() then insert(data.categories, data.lang:getFullName() .. " " .. plpos .. " with red links in their headword lines") return true end end end if part.inflections then if check_red_link_inflections(data, part.inflections, plpos) then return true end end end return false end -- Check a set of inflections (each of which describes a single inflection of the term, such as feminine or plural, and -- consists of a label and zero or more terms, each possibly with nested inflections) for red links. If so, insert a -- red-link category based on `plpos` (the plural part of speech to insert in the category), stop further processing, -- and return true. If no red links found, return false. function check_red_link_inflections(data, inflections, plpos) if inflections and inflections[1] then -- Check each inflection individually. for key, infl in ipairs(inflections) do if check_red_link_inflection_parts(data, infl, plpos) then return true end end end return false end -- Check the top-level inflections in `data.inflections`, along with any nested inflections, for red links. If so, -- insert a red-link category based on `plpos` (the plural part of speech to insert in the category), stop further -- processing, and return true. If no red links found, return false. local function check_red_link_inflections_top_level(data, plpos) return check_red_link_inflections(data, data.inflections, plpos) end --[==[ Returns the plural form of `pos`, a raw part of speech input, which could be singular or plural. Irregular plural POS are taken into account (e.g. "kanji" pluralizes to "kanji"). ]==] function export.pluralize_pos(pos) -- Make the plural form of the part of speech return (m_data or get_data()).irregular_plurals[pos] or pos:sub(-1) == "" and pos or pluralize(pos) end --[==[ Return "lemma" if the given POS is a lemma, "non-lemma form" if a non-lemma form, or nil if unknown. The POS passed in must be in its plural form ("nouns", "prefixes", etc.). If you have a POS in its singular form, call {export.pluralize_pos()} above to pluralize it in a smart fashion that knows when to add "-s" and when to add "-es", and also takes into account any irregular plurals. If `best_guess` is given and the POS is in neither the lemma nor non-lemma list, guess based on whether it ends in " forms"; otherwise, return nil. ]==] function export.pos_lemma_or_nonlemma(plpos, best_guess) local m_headword_data = m_data or get_data() local isLemma = m_headword_data.lemmas -- Is it a lemma category? if isLemma[plpos] then return "लेम्मा" end local plpos_no_recon = plpos:gsub("^reconstructed ", "") if isLemma[plpos_no_recon] then return "लेम्मा" end -- Is it a nonlemma category? local isNonLemma = m_headword_data.nonlemmas if isNonLemma[plpos] or isNonLemma[plpos_no_recon] then return "non-lemma form" end local plpos_no_mut = plpos:gsub("^mutated ", "") if isLemma[plpos_no_mut] or isNonLemma[plpos_no_mut] then return "non-lemma form" elseif best_guess then return plpos:find(" forms$") and "non-lemma form" or "लेम्मा" else return nil end end --[==[ Canonicalize a part of speech as specified in 2= in {{tl|head}}. This checks for POS aliases and non-lemma form aliases ending in 'f', and then pluralizes if the POS term does not have an invariable plural. ]==] function export.canonicalize_pos(pos) -- FIXME: Temporary code to throw an error for alias 'pre' (= preposition) that will go away. if pos == "pre" then -- Don't throw error on 'pref' as it's an alias for "prefix". error("POS 'pre' for 'preposition' no longer allowed as it's too ambiguous; use 'prep'") end -- Likewise for pro = pronoun. if pos == "pro" or pos == "prof" then error("POS 'pro' for 'pronoun' no longer allowed as it's too ambiguous; use 'pron'") end local m_headword_data = m_data or get_data() if m_headword_data.pos_aliases[pos] then pos = m_headword_data.pos_aliases[pos] elseif pos:sub(-1) == "f" then pos = pos:sub(1, -2) pos = (m_headword_data.pos_aliases[pos] or pos) .. " रूप" end return export.pluralize_pos(pos) end -- Find and return the maximum index in the array `data[element]` (which may have gaps in it), and initialize it to a -- zero-length array if unspecified. Check to make sure all keys are numeric (other than "maxindex", which is set by -- [[Module:parameters]] for list parameters), all values are strings, and unless `allow_blank_string` is given, -- no blank (zero-length) strings are present. local function init_and_find_maximum_index(data, element, allow_blank_string) local maxind = 0 if not data[element] then data[element] = {} end local typ = type(data[element]) if typ ~= "table" then error(("Internal error: In full_headword(), `data.%s` must be an array but is a %s"):format(element, typ)) end for k, v in pairs(data[element]) do if k ~= "maxindex" then if type(k) ~= "number" then error(("Internal error: Unrecognized non-numeric key '%s' in `data.%s`"):format(k, element)) end if k > maxind then maxind = k end if v then if type(v) ~= "string" then error(("Internal error: For key '%s' in `data.%s`, value should be a string but is a %s"):format(k, element, type(v))) end if not allow_blank_string and v == "" then error(("Internal error: For key '%s' in `data.%s`, blank string not allowed; use 'false' for the default"):format(k, element)) end end end end return maxind end --[==[ -- Add the page to various maintenance categories for the language and the -- whole page. These are placed in the headword somewhat arbitrarily, but -- mainly because headword templates are mandatory for entries (meaning that -- in theory it provides full coverage). -- -- This is provided as an external entry point so that modules which transclude -- information from other entries (such as {{tl|ja-see}}) can take advantage -- of this feature as well, because they are used in place of a conventional -- headword template.]==] do -- Handle any manual sortkeys that have been specified in raw categories -- by tracking if they are the same or different from the automatically- -- generated sortkey, so that we can track them in maintenance -- categories. local function handle_raw_sortkeys(tbl, sortkey, page, lang, lang_cats) sortkey = sortkey or lang:makeSortKey(page.pagename) -- If there are raw categories with no sortkey, then they will be -- sorted based on the default MediaWiki sortkey, so we check against -- that. if tbl == true then if page.raw_defaultsort ~= sortkey then insert(lang_cats, lang:getFullName() .. " terms with non-redundant non-automated sortkeys") end return end local redundant, different for k in pairs(tbl) do if k == sortkey then redundant = true else different = true end end if redundant then insert(lang_cats, lang:getFullName() .. " terms with redundant sortkeys") end if different then insert(lang_cats, lang:getFullName() .. " terms with non-redundant non-automated sortkeys") end return sortkey end function export.maintenance_cats(page, lang, lang_cats, page_cats) extend(page_cats, page.cats) lang = lang:getFull() -- since we are just generating categories local canonical = lang:getCanonicalName() local tbl = page.wikitext_topic_cat[lang:getCode()] local sortkey = nil if tbl then sortkey = handle_raw_sortkeys(tbl, sortkey, page, lang, lang_cats) insert(lang_cats, canonical .. " entries with topic categories using raw markup") end tbl = page.wikitext_langname_cat[canonical] if tbl then handle_raw_sortkeys(tbl, sortkey, page, lang, lang_cats) insert(lang_cats, canonical .. " entries with language name categories using raw markup") end if get_current_L2() ~= canonical then insert(lang_cats, canonical .. " प्रविष्टियाँ त्रुटिपूर्ण भाषा हेडर के साथ") -- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/incorrect language header]] -- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/incorrect language header/LANGCODE]] track("त्रुटिपूर्ण भाषा हेडर", lang) end end end --[==[This is the primary external entry point. {{lua|full_headword(data)}} This is used by {{temp|head}} and various language-specific headword templates (e.g. {{temp|ru-adj}} for Russian adjectives, {{temp|de-noun}} for German nouns, etc.) to display an entire headword line. See [[#Further explanations for full_headword()]] ]==] function export.full_headword(data) -- Prevent data from being destructively modified. data = shallow_copy(data) ------------ 1. Basic checks for old-style (multi-arg) calling convention. ------------ if data.getCanonicalName then error("Internal error: In full_headword(), the first argument `data` needs to be a Lua object (table) of properties, not a language object") end if not data.lang or type(data.lang) ~= "table" or not data.lang.getCode then error("Internal error: In full_headword(), the first argument `data` needs to be a Lua object (table) and `data.lang` must be a language object") end if data.id and type(data.id) ~= "string" then error("Internal error: The id in the data table should be a string.") end ------------ 2. Initialize pagename etc. ------------ local langcode = data.lang:getCode() local full_langcode = data.lang:getFullCode() local langname = data.lang:getCanonicalName() local full_langname = data.lang:getFullName() local raw_pagename = data.pagename local page local m_headword_data = m_data or get_data() if raw_pagename and raw_pagename ~= m_headword_data.pagename then -- for testing, doc pages, etc. -- data.pagename is often set on documentation and test pages through the pagename= parameter of various -- templates, to emulate running on that page. Having a large number of such test templates on a single -- page often leads to timeouts, because we fetch and parse the contents of each page in turn. However, -- we don't really need to do that and can function fine without fetching and parsing the contents of a -- given page, so turn off content fetching/parsing (and also setting the DEFAULTSORT key through a parser -- function, which is *slooooow*) in certain namespaces where test and documentation templates are likely to -- be found and where actual content does not live (User, Template, Module). local actual_namespace = m_headword_data.page.namespace local no_fetch_content = actual_namespace == "सदस्य" or actual_namespace == "साँचा" or actual_namespace == "मॉड्यूल" page = process_page(raw_pagename, no_fetch_content) else page = m_headword_data.page end local namespace = page.namespace if data.altform then -- Temporary tracking for use of old altform= track("altform", data.lang) end local is_varform_only = data.var and data.var ~= "both" local is_varform_both = data.var == "both" ------------ 3. Initialize `data.heads` table; if old-style, convert to new-style. ------------ if type(data.heads) == "table" and type(data.heads[1]) == "table" then -- new-style if data.translits or data.transcriptions then error("Internal error: In full_headword(), if `data.heads` is new-style (array of head objects), `data.translits` and `data.transcriptions` cannot be given") end else -- convert old-style `heads`, `translits` and `transcriptions` to new-style local maxind = max( init_and_find_maximum_index(data, "heads"), init_and_find_maximum_index(data, "translits", true), init_and_find_maximum_index(data, "transcriptions", true) ) for i = 1, maxind do data.heads[i] = { term = data.heads[i], tr = data.translits[i], ts = data.transcriptions[i], } end end -- Make sure there's at least one head. if not data.heads[1] then data.heads[1] = {} end ------------ 4. Initialize and validate `data.categories` and `data.whole_page_categories`, and determine `pos_category` if not given, and add basic categories. ------------ init_and_find_maximum_index(data, "श्रेणियाँ") init_and_find_maximum_index(data, "whole_page_categories") local pos_category_already_present = false if data.categories[1] then local escaped_langname = pattern_escape(full_langname) local matches_lang_pattern = "^" .. escaped_langname .. " " for _, cat in ipairs(data.categories) do -- Does the category begin with the language name? If not, tag it with a tracking category. if not cat:find(matches_lang_pattern) then -- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/no lang category]] -- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/no lang category/LANGCODE]] track("no lang category", data.lang) end end -- If `pos_category` not given, try to infer it from the first specified category. If this doesn't work, we -- throw an error below. if not data.pos_category and data.categories[1]:find(matches_lang_pattern) then data.pos_category = data.categories[1]:gsub(matches_lang_pattern, "") -- Optimization to avoid inserting category already present. pos_category_already_present = true end end if not data.pos_category then error("Internal error: `data.pos_category` not specified and could not be inferred from the categories given in " .. "`data.categories`. Either specify the plural part of speech in `data.pos_category` " .. "(e.g. \"proper nouns\") or ensure that the first category in `data.categories` is formed from the " .. "language's canonical name plus the plural part of speech (e.g. \"Norwegian Bokmål proper nouns\")." ) end -- Insert a category at the beginning for the part of speech unless it's already present or `data.noposcat` given. if not pos_category_already_present and not data.noposcat and not is_varform_only then local pos_category = full_langname .. " " .. data.pos_category -- FIXME: [[User:Theknightwho]] Why is this special case here? Please add an explanatory comment. if pos_category ~= "Translingual Han characters" then insert(data.categories, 1, pos_category) end end -- Try to determine whether the part of speech refers to a lemma or a non-lemma form; if we can figure this out, -- add an appropriate category. local postype = export.pos_lemma_or_nonlemma(data.pos_category) if not postype then -- We don't know what this category is, so tag it with a tracking category. -- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/unrecognized pos]] -- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/unrecognized pos/LANGCODE]] track("unrecognized pos", data.lang) -- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/unrecognized pos/POS]] -- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/unrecognized pos/POS/LANGCODE]] track("unrecognized pos/pos/" .. data.pos_category, data.lang) elseif not data.noposcat and not is_varform_only then insert(data.categories, 1, full_langname .. " " .. postype .. "") end -- Categorize variant forms into 'variant lemmas' or 'variant non-lemma forms'. Originally proposed in -- [[Wiktionary:Beer parlour/2024/June#Decluttering the altform mess]] as 'alternative forms'; renamed in -- [[Wiktionary:Beer parlour/2026/July#Renaming the "alternative forms" categories]]. if (is_varform_only or is_varform_both) and postype then insert(data.categories, 1, full_langname .. " वैरिएंट " .. postype .. "") end ------------ 5. Create a default headword, and add links to multiword page names. ------------ -- Determine if this is an "anti-asterisk" term, i.e. an attested term in a language that must normally be -- reconstructed. local is_anti_asterisk = data.heads[1].term and data.heads[1].term:find("^!!") local lang_reconstructed = data.lang:hasType("reconstructed") if is_anti_asterisk then if not lang_reconstructed then error("Anti-asterisk feature (head= beginning with !!) can only be used with reconstructed languages") end lang_reconstructed = false end -- Determine if term is reconstructed local is_reconstructed = namespace == "Reconstruction" or lang_reconstructed -- Create a default headword based on the pagename, which is determined in -- advance by the data module so that it only needs to be done once. local default_head = page.pagename -- Add links to multi-word page names when appropriate if not (is_reconstructed or data.nolinkhead) then local no_links = m_headword_data.no_multiword_links if not (no_links[langcode] or no_links[full_langcode]) and export.head_is_multiword(default_head) then default_head = export.add_multiword_links(default_head, true) end end if is_reconstructed then default_head = "*" .. default_head end ------------ 6. Check the namespace against the language type. ------------ if namespace == "" then if lang_reconstructed then error("Entries in " .. langname .. " must be placed in the Reconstruction: namespace") elseif data.lang:hasType("appendix-constructed") then error("Entries in " .. langname .. " must be placed in the Appendix: namespace") end elseif namespace == "Citations" or namespace == "Thesaurus" then error("Headword templates should not be used in the " .. namespace .. ": namespace.") end ------------ 7. Fill in missing values in `data.heads`. ------------ -- True if any script among the headword scripts has spaces in it. local any_script_has_spaces = false -- True if any term has a redundant head= param. local has_redundant_head_param = false for _, head in ipairs(data.heads) do ------ 7a. If missing head, replace with default head. if not head.term then head.term = default_head elseif head.term == default_head then has_redundant_head_param = true elseif is_anti_asterisk and head.term == "!!" then -- If explicit head=!! is given, it's an anti-asterisk term and we fill in the default head. head.term = "!!" .. default_head elseif head.term:find("^[!?]$") then -- If explicit head= just consists of ! or ?, add it to the end of the default head. head.term = default_head .. head.term end head.term_no_initial_bang_bang = is_anti_asterisk and head.term:sub(3) or head.term if is_reconstructed then local head_term = head.term if head_term:find("%[%[") then head_term = remove_links(head_term) end if head_term:sub(1, 1) ~= "*" then error("The headword '" .. head_term .. "' must begin with '*' to indicate that it is reconstructed.") end end ------ 7b. Try to detect the script(s) if not provided. If a per-head script is provided, that takes precedence, ------ otherwise fall back to the overall script if given. If neither given, autodetect the script. local auto_sc = data.lang:findBestScript(head.term) if ( auto_sc:getCode() == "None" and find_best_script_without_lang(head.term):getCode() ~= "None" ) then insert(data.categories, full_langname .. " टर्म गैर-स्टैंडर्ड लिपि में") end if not (head.sc or data.sc) then -- No script code given, so use autodetected script. head.sc = auto_sc else if not head.sc then -- Overall script code given. head.sc = data.sc end -- Track uses of sc parameter. if head.sc:getCode() == auto_sc:getCode() then track("redundant script code", data.lang) if not data.no_script_code_cat then insert(data.categories, full_langname .. " टर्म दुहराव वाले लिपि कोड के साथ") end else track("non-redundant manual script code", data.lang) if not data.no_script_code_cat then insert(data.categories, full_langname .. " terms with non-redundant manual script codes") end end end -- If using a discouraged character sequence, add to maintenance category. if head.sc:hasNormalizationFixes() == true then local composed_head = toNFC(head.term) if head.sc:fixDiscouragedSequences(composed_head) ~= composed_head then insert(data.whole_page_categories, "Pages using discouraged character sequences") end end any_script_has_spaces = any_script_has_spaces or head.sc:hasSpaces() ------ 7c. Create automatic transliterations for any non-Latin headwords without manual translit given ------ (provided automatic translit is available, e.g. not in Persian or Hebrew). -- Make transliterations head.tr_manual = nil -- Try to generate a transliteration if necessary if head.tr == "-" then head.tr = nil else local notranslit = m_headword_data.notranslit if not (notranslit[langcode] or notranslit[full_langcode]) and head.sc:isTransliterated() then head.tr_manual = not not head.tr local text = head.term_no_initial_bang_bang if not data.lang:link_tr(head.sc) then text = remove_links(text) end local automated_tr = data.lang:transliterate(text, head.sc) if automated_tr then local manual_tr = head.tr if manual_tr then if remove_links(manual_tr) == remove_links(automated_tr) then insert(data.categories, full_langname .. " terms with redundant transliterations") else insert(data.categories, full_langname .. " terms with non-redundant manual transliterations") end end if not manual_tr then head.tr = automated_tr end end -- There is still no transliteration? -- Add the entry to a cleanup category. if not head.tr then head.tr = "<small>transliteration needed</small>" -- FIXME: No current support for 'Request for transliteration of Classical Persian terms' or similar. -- Consider adding this support in [[Module:category tree/poscatboiler/data/entry maintenance]]. insert(data.categories, "Requests for transliteration of " .. full_langname .. " terms") else -- Otherwise, trim it. head.tr = trim(head.tr) end end end -- Link to the transliteration entry for languages that require this. if head.tr and data.lang:link_tr(head.sc) then head.tr = full_link{ term = head.tr, lang = data.lang, sc = get_script("Latn"), tr = "-" } end end ------------ 8. Maybe tag the title with the appropriate script code, using the `display_title` mechanism. ------------ -- Assumes that the scripts in "toBeTagged" will never occur in the Reconstruction namespace. -- (FIXME: Don't make assumptions like this, and if you need to do so, throw an error if the assumption is violated.) -- Avoid tagging ASCII as Hani even when it is tagged as Hani in the headword, as in [[check]]. The check for ASCII -- might need to be expanded to a check for any Latin characters and whitespace or punctuation. local display_title -- Where there are multiple headwords, use the script for the first. This assumes the first headword is similar to -- the pagename, and that headwords that are in different scripts from the pagename aren't first. This seems to be -- about the best we can do (alternatively we could potentially do script detection on the pagename). local dt_script = data.heads[1].sc local dt_script_code = dt_script:getCode() local page_non_ascii = namespace == "" and not page.pagename:find("^[%z\1-\127]+$") local unsupported_pagename, unsupported = page.full_raw_pagename:gsub("^Unsupported titles/", "") if unsupported == 1 and page.unsupported_titles[unsupported_pagename] then display_title = 'Unsupported titles/<span class="' .. dt_script_code .. '">' .. page.unsupported_titles[unsupported_pagename] .. '</span>' elseif page_non_ascii and m_headword_data.toBeTagged[dt_script_code] or (dt_script_code == "Jpan" and (text_in_script(page.pagename, "Hira") or text_in_script(page.pagename, "Kana"))) or (dt_script_code == "Kore" and text_in_script(page.pagename, "Hang")) then display_title = '<span class="' .. dt_script_code .. '">' .. page.full_raw_pagename .. '</span>' -- Keep Han entries region-neutral in the display title. elseif page_non_ascii and (dt_script_code == "Hant" or dt_script_code == "Hans") then display_title = '<span class="Hani">' .. page.full_raw_pagename .. '</span>' elseif namespace == "Reconstruction" then local matched display_title, matched = ugsub( page.full_raw_pagename, "^(Reconstruction:[^/]+/)(.+)$", function(before, term) return before .. tag_text(term, data.lang, dt_script) end ) if matched == 0 then display_title = nil end end -- FIXME: Generalize this. -- If the current language uses Aran (Nastaliq), e.g. Urdu, and there's more than one language on the page, don't -- set the display title because we don't want Nastaliq for terms that also exist in other languages that don't -- display in Nastaliq (e.g. Arabic or Persian). Because the word "Urdu" occurs near the end of the alphabet, Urdu -- fonts tend to override the fonts of other languages. FIXME: This is checking for more than one language on the -- page but instead needs to check if there are any languages using scripts other than Aran. if dt_script_code == "Aran" and page.L2_list.n > 1 then display_title = nil end if display_title then mw.getCurrentFrame():callParserFunction( "DISPLAYTITLE", display_title ) end ------------ 9. Insert additional categories. ------------ if data.force_cat_output then -- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/force cat output]] track("force cat output") end if has_redundant_head_param then if not data.no_redundant_head_cat then -- This is not the right way to go about this; too many exceptions and problems due to language-specific headword -- handling customization. If we want this, it should be opt-in by a given language passing in the default headword. -- insert(data.categories, full_langname .. " terms with redundant head parameter") end end -- If the first head is multiword (after removing links), maybe insert into "LANG multiword terms". if not data.nomultiwordcat and not is_varform_only and any_script_has_spaces and postype == "lemma" then local no_multiword_cat = m_headword_data.no_multiword_cat if not (no_multiword_cat[langcode] or no_multiword_cat[full_langcode]) then -- Check for spaces or hyphens, but exclude prefixes and suffixes. -- Use the pagename, not the head= value, because the latter may have extra -- junk in it, e.g. superscripted text that throws off the algorithm. local no_hyphen = m_headword_data.hyphen_not_multiword_sep -- Exclude hyphens if the data module states that they should for this language. local checkpattern = (no_hyphen[langcode] or no_hyphen[full_langcode]) and ".[%s፡]." or ".[%s%-፡]." local is_multiword = umatch(page.pagename, checkpattern) if is_multiword and not non_categorizable(page.full_raw_pagename) then insert(data.categories, full_langname .. " कई शब्द वाले टर्म") elseif not is_multiword then local long_word_threshold = m_headword_data.long_word_thresholds[langcode] or m_headword_data.long_word_thresholds[full_langcode] if long_word_threshold and ulen(page.pagename) >= long_word_threshold then insert(data.categories, "लंबे " .. full_langname .. " शब्द") end end end end -- Determine whether to insert a category 'LANGNAME POS in SCRIPT'. If there are multiple heads, we may need to check -- each head, as the heads may (theoretically) have different scripts. local default_sccat = m_headword_data.default_sccat if data.sccat or not is_varform_only and (default_sccat[langcode] or langcode ~= full_langcode and default_sccat[full_langcode]) then local function needs_sccat(sccat_entry, sc) if sccat_entry == true or not sccat_entry then return sccat_entry end if type(sccat_entry) == "table" then local in_list = contains(sccat_entry, sc:getCode()) if sccat_entry[1] == "not" then in_list = not in_list end return in_list end return nil end for _, head in ipairs(data.heads) do -- First check the `sccat` specified at the {{head}} level. local this_needs_sccat = needs_sccat(data.sccat, head.sc) -- If that wasn't given, check the default sccat at the language level for the lang code. if this_needs_sccat == nil and not is_varform_only then this_needs_sccat = needs_sccat(default_sccat[langcode], head.sc) end -- If that wasn't found and the lang code is an etym code, check the default sccat at the parent language level. if this_needs_sccat == nil and not is_varform_only and langcode ~= full_langcode then this_needs_sccat = needs_sccat(default_sccat[full_langcode], head.sc) end if this_needs_sccat then insert(data.categories, full_langname .. " " .. data.pos_category .. " in " .. head.sc:getDisplayForm(data.lang)) end end end -- Reconstructed terms often use weird combinations of scripts and realistically aren't spelled so much as notated. if namespace ~= "Reconstruction" and not is_varform_only then -- Map from languages to a string containing the characters to ignore when considering whether a term has -- multiple written scripts in it. Typically these are Greek or Cyrillic letters used for their phonetic -- values. local characters_to_ignore = { ["aaq"] = "αάὰ", -- Penobscot (Algonquian) ["acy"] = "δθ", -- Cypriot Arabic ["aez"] = "β", -- Aeka (Trans-New Guinea) ["anc"] = "γ", -- Ngas (Chadic/Afroasiatic) ["aou"] = "χ", -- A'ou (Kra-Dai) ["art-blk"] = "ч", -- Bolak (conlang) ["awg"] = "β", -- Anguthimri (Pama-Nyungan) ["az"] = "ь", -- Azerbaijani (Turkic; Yañalif Latin spelling, c. 1928 - 1938) ["ba"] = "ь", -- Bashkir (Turkic; Yañalif Latin spelling, c. 1928 - 1938) ["bhp"] = "β", -- Bima (Austronesian) ["bjz"] = "β", -- Baruga (Trans-New Guinea) ["byk"] = "θ", -- Biao (Kra-Dai) ["cdy"] = "θ", -- Chadong (Kra-Dai) ["chp"] = "θ", -- Chipewyan (Athabaskan) ["cjh"] = "χ", -- Upper Chehalis (Salishan) ["clm"] = "χ", -- Klallam (Salishan) ["col"] = "χ", -- Colombia-Wenatchi (Salishan) ["coo"] = "χθ", -- Comox (Salishan) ["crx"] = "θ", -- Carrier (Athabaskan) ["ets"] = "θ", -- Yekhee (Edoid/Niger-Congo) ["ett"] = "χ", -- Etruscan (isolate; in romanizations) ["fla"] = "χ", -- Montana Salish (Salishan) ["grt"] = "་", -- Garo (South Asian Sino-Tibetan) ["gmw-gts"] = "χ", -- Gottscheerish (Bavarian variant spoken in Slovenia) ["hur"] = "χθ", -- Halkomelem (Salishan) ["itc-psa"] = "f", -- Pre-Samnite (Italic; normally written in Greek) ["izh"] = "ь", -- Ingrian (Finnic) ["kic"] = "θ", -- Kickapoo (Algonquian) ["kk"] = "ь", -- Kazakh (Turkic; Yañalif Latin spelling, c. 1928 - 1938) ["ky"] = "ь", -- Kyrgyz (Turkic; Yañalif Latin spelling, c. 1928 - 1938) ["lil"] = "χ", -- Lillooet (Salishan) ["lsi"] = "ꓹ", -- Lashi (Lolo-Burmese/Sino-Tibetan; represents a glottal stop) ["mhz"] = "β", -- Mor (Austronesian) ["mqn"] = "β", -- Moronene (Austronesian) ["neg"]= "ӡā", -- Negidal (Tungusic; normally in Cyrillic) ["oka"] = "χ", -- Okanagan (Salishan) ["ole"] = "θ", -- Olekha (Sino-Tibetan) ["oui"] = "γβ", -- Old Uyghur (Turkic; FIXME: others? E.g. Greek delta (δ)?) ["pox"] = "χ", -- Polabian (West Slavic) ["rif"] = "ε", -- Tarifit (Berber) ["rom"] = "Θθ", -- Romani (Indic: International Standard; two different thetas???) ["rpn"] = "β", -- Repanbitip (Austronesian) ["sah"] = "ь", -- Yakut (Turkic; 1929 - 1939 Latin spelling) ["sit-jap"] = "χ", -- Japhug (Sino-Tibetan) ["sjw"] = "θ", -- Shawnee (Algonquian) ["squ"] = "χ", -- Squamish (Salishan) ["str"] = "χθ", -- Saanich (Salishan) ["teh"] = "χ", -- Tehuelche (Chonan; spoken in Argentina) ["tep"] = "η", -- Tepecano (Uto-Aztecan) ["thp"] = "χ", -- Thompson (Salishan) ["tk"] = "ь", -- Turkmen (Turkic; Yañalif Latin spelling, c. 1928 - 1938) ["tt"] = "ь", -- Kazakh (Turkic; Yañalif Latin spelling, c. 1928 - 1938) ["twa"] = "χ", -- Twana (Salishan) ["wbl"] = "ы", -- Wakhi (Iranian) ["xbc"] = "ϸ", -- Bactrian (Iranian; represents š; normally written in Greek) ["yha"] = "θ", -- Baha (Kra-Dai) ["za"] = "зч", -- Zhuang (Tai/Kra-Dai); 1957-1982 alphabet used two Cyrillic letters (as well as some others like -- ƃ, ƅ, ƨ, ɯ and ɵ that look like Cyrillic or Greek but are actually Latin) ["zlw-slv"] = "χђћ", -- Slovincian (West Slavic; FIXME: χ is Greek, the other two are Cyrillic, but I'm not sure -- the currect characters are being chosen in the entry names) ["zng"] = "θ", -- Mang (Mon-Khmer) ["ztp"] = "θ", -- Loxicha Zapotec (Zapotecan) } -- Determine how many real scripts are found in the pagename, where we exclude symbols and such. We exclude -- scripts whose `character_category` is false as well as Zmth (mathematical notation symbols), which has a -- category of "Mathematical notation symbols". When counting scripts, we need to elide language-specific -- variants because e.g. Beng and as-Beng have slightly different characters but we don't want to consider them -- two different scripts (e.g. [[এৰ]] has two characters which are detected respectively as Beng and as-Beng). local seen_scripts = {} local num_seen_scripts = 0 local num_loops = 0 local canon_pagename = page.pagename local ch_to_ignore = characters_to_ignore[full_langcode] if ch_to_ignore then canon_pagename = ugsub(canon_pagename, "[" .. ch_to_ignore .. "]", "") end while true do if canon_pagename == "" or num_seen_scripts >= 2 or num_loops >= 10 then break end -- Make sure we don't get into a loop checking the same script over and over again; happens with e.g. [[ᠪᡳ]] num_loops = num_loops + 1 local pagename_script = find_best_script_without_lang(canon_pagename, "None only as last resort") local script_chars = pagename_script.characters if not script_chars then -- we are stuck; this happens with None break end local script_code = pagename_script:getCode() local replaced canon_pagename, replaced = ugsub(canon_pagename, "[" .. script_chars .. "]", "") if ( replaced and script_code ~= "Zmth" and (script_data or get_script_data())[script_code] and script_data[script_code].character_category ~= false ) then script_code = script_code:gsub("^.-%-", "") if not seen_scripts[script_code] then seen_scripts[script_code] = true num_seen_scripts = num_seen_scripts + 1 end end end if num_seen_scripts > 1 then insert(data.categories, full_langname .. " टर्म कई लिपियों में लिखे जाने वाले") end end -- Categorise for unusual characters. Takes into account combining characters, so that we can categorise for characters with diacritics that aren't encoded as atomic characters (e.g. U̠). These can be in two formats: single combining characters (i.e. character + diacritic(s)) or double combining characters (i.e. character + diacritic(s) + character). Each can have any number of diacritics. local standard = data.lang:getStandardCharacters() if not is_varform_only and standard and not non_categorizable(page.full_raw_pagename) then local function char_category(char) local specials = { ["#"] = "number sign", ["("] = "parentheses", [")"] = "parentheses", ["<"] = "angle brackets", [">"] = "angle brackets", ["["] = "square brackets", ["]"] = "square brackets", ["_"] = "underscore", ["{"] = "braces", ["|"] = "vertical line", ["}"] = "braces", ["ß"] = "ẞ", ["\205\133"] = "", -- this is UTF-8 for U+0345 ( ͅ) ["\239\191\189"] = "replacement character", } char = toNFD(char) :gsub(".[\128-\191]*", function(m) local new_m = specials[m] new_m = new_m or m:uupper() return new_m end) return toNFC(char) end if full_langcode ~= "hi" and full_langcode ~= "lo" then local standard_chars_scripts = {} for _, head in ipairs(data.heads) do standard_chars_scripts[head.sc:getCode()] = true end -- Iterate over the scripts, in case there is more than one (as they can have different sets of standard characters). for code in pairs(standard_chars_scripts) do local sc_standard = data.lang:getStandardCharacters(code) if sc_standard then if page.pagename_len > 1 then local explode_standard = {} local function explode(char) explode_standard[char] = true return "" end local sc_standard_exploded = ugsub(sc_standard, page.comb_chars.combined_double, explode) -- The following is correct; it relies on side-effecing the explode_standard[] table. ugsub(sc_standard_exploded, page.comb_chars.combined_single, explode):gsub(".[\128-\191]*", explode) local num_cat_inserted for char in pairs(page.explode_pagename) do if not explode_standard[char] then if char:find("[0-9]") then if not num_cat_inserted then insert(data.categories, full_langname .. " terms spelled with numbers") num_cat_inserted = true end elseif ufind(char, page.emoji_pattern) then insert(data.categories, full_langname .. " terms spelled with emoji") else local upper = char_category(char) if not explode_standard[upper] then char = upper end insert(data.categories, full_langname .. " terms spelled with " .. char) end end end end -- If a diacritic doesn't appear in any of the standard characters, also categorise for it generally. sc_standard = toNFD(sc_standard) for diacritic in ugmatch(page.decompose_pagename, page.comb_chars.diacritics_single) do if not umatch(sc_standard, diacritic) then insert(data.categories, full_langname .. " terms spelled with ◌" .. diacritic) end end for diacritic in ugmatch(page.decompose_pagename, page.comb_chars.diacritics_double) do if not umatch(sc_standard, diacritic) then insert(data.categories, full_langname .. " terms spelled with ◌" .. diacritic .. "◌") end end end end -- Ancient Greek, Hindi and Lao handled the old way for now, as their standard chars still need to be converted to the new format (because there are a lot of them). elseif ulen(page.pagename) ~= 1 then for character in ugmatch(page.pagename, "([^" .. standard .. "])") do local upper = char_category(character) if not umatch(upper, "[" .. standard .. "]") then character = upper end insert(data.categories, full_langname .. " terms spelled with " .. character) end end end if not is_varform_only and data.heads[1].sc:isSystem("alphabet") then local pagename, i = page.pagename:ulower(), 2 while umatch(pagename, "(%a)" .. ("%1"):rep(i)) do i = i + 1 insert(data.categories, full_langname .. " terms with " .. i .. " consecutive instances of the same letter") end end -- Categorise for palindromes if not is_varform_only and not data.nopalindromecat and namespace ~= "Reconstruction" and ulen(page.pagename) > 2 -- FIXME: Use of first script here seems hacky. What is the clean way of doing this in the presence of -- multiple scripts? and is_palindrome(page.pagename, data.lang, data.heads[1].sc) then insert(data.categories, full_langname .. " पैलिंड्रोम") end if namespace == "" and not lang_reconstructed then for _, head in ipairs(data.heads) do if page.full_raw_pagename ~= get_link_page(remove_links(head.term), data.lang, head.sc) then -- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/pagename spelling mismatch]] -- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/pagename spelling mismatch/LANGCODE]] track("pagename spelling mismatch", data.lang) break end end end -- Add red link category if called for and we're not a "large" page, where such checks are disabled. if data.checkredlinks and not m_headword_data.large_pages[m_headword_data.pagename] then local plposcat = type(data.checkredlinks) == "string" and data.checkredlinks or data.pos_category check_red_link_inflections_top_level(data, plposcat) end -- Add to various maintenance categories. export.maintenance_cats(page, data.lang, data.categories, data.whole_page_categories) ------------ 10. Format and return headwords, genders, inflections and categories. ------------ -- Format and return all the gathered information. This may add more categories (e.g. gender/number categories), -- so make sure we do it before evaluating `data.categories`. local text = '<span class="headword-line">' .. format_headword(data) .. format_headword_genders(data, is_varform_only) .. format_top_level_inflections(data) .. '</span>' -- Language-specific categories. local cats = format_categories( data.categories, data.lang, data.sort_key, page.encoded_pagename, data.force_cat_output or test_force_categories, data.heads[1].sc ) -- Language-agnostic categories. local whole_page_cats = format_categories( data.whole_page_categories, nil, "-" ) return text .. cats .. whole_page_cats end return export ccsdk2qtqw6x7bl3xw0h7wwwe4cu328 487801 487796 2026-09-02T18:32:20Z SM7 6218 फिलहाल हिंदी विक्षनरी पर s लगा कर प्लूरल बनाने की आवश्यकता नहीं / यह मॉड्यूल:affix का प्रयोग करता था। इसलिए इसे निरस्त रखा है। 487801 Scribunto text/plain local export = {} -- Named constants for all modules used, to make it easier to swap out sandbox versions. local debug_track_module = "Module:debug/track" local en_utilities_module = "Module:en-utilities" local gender_and_number_module = "Module:gender and number" local headword_data_module = "Module:headword/data" local headword_page_module = "Module:headword/page" local links_module = "Module:links" local load_module = "Module:load" local pages_module = "Module:pages" local palindromes_module = "Module:palindromes" local pron_qualifier_module = "Module:pron qualifier" local scripts_module = "Module:scripts" local scripts_data_module = "Module:scripts/data" local script_utilities_module = "Module:script utilities" local script_utilities_data_module = "Module:script utilities/data" local string_utilities_module = "Module:string utilities" local table_module = "Module:table" local utilities_module = "Module:utilities" local concat = table.concat local dump = mw.dumpObject local insert = table.insert local ipairs = ipairs local max = math.max local new_title = mw.title.new local pairs = pairs local require = require local toNFC = mw.ustring.toNFC local toNFD = mw.ustring.toNFD local type = type local ufind = mw.ustring.find local ugmatch = mw.ustring.gmatch local ugsub = mw.ustring.gsub 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 debug_track(...) debug_track = require(debug_track_module) return debug_track(...) end local function contains(...) contains = require(table_module).contains return contains(...) end local function encode_entities(...) encode_entities = require(string_utilities_module).encode_entities 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_pron_qualifiers(...) format_pron_qualifiers = require(pron_qualifier_module).format_qualifiers return format_pron_qualifiers(...) end local function full_link(...) full_link = require(links_module).full_link return full_link(...) end local function get_current_L2(...) get_current_L2 = require(pages_module).get_current_L2 return get_current_L2(...) end local function get_link_page(...) get_link_page = require(links_module).get_link_page return get_link_page(...) end local function get_script(...) get_script = require(scripts_module).getByCode return get_script(...) end local function is_palindrome(...) is_palindrome = require(palindromes_module).is_palindrome return is_palindrome(...) end local function language_link(...) language_link = require(links_module).language_link return language_link(...) end local function load_data(...) load_data = require(load_module).load_data return load_data(...) end local function pattern_escape(...) pattern_escape = require(string_utilities_module).pattern_escape return pattern_escape(...) end local function pluralize(...) pluralize = require(en_utilities_module).pluralize return pluralize(...) end local function process_page(...) process_page = require(headword_page_module).process_page return process_page(...) end local function remove_links(...) remove_links = require(links_module).remove_links return remove_links(...) end local function shallow_copy(...) shallow_copy = require(table_module).shallowCopy return shallow_copy(...) end local function tag_text(...) tag_text = require(script_utilities_module).tag_text return tag_text(...) end local function tag_transcription(...) tag_transcription = require(script_utilities_module).tag_transcription return tag_transcription(...) 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 ulen(...) ulen = require(string_utilities_module).len return ulen(...) 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 = load_data(headword_data_module) return m_data end local script_data local function get_script_data() script_data = load_data(scripts_data_module) return script_data end local script_utilities_data local function get_script_utilities_data() script_utilities_data = load_data(script_utilities_data_module) return script_utilities_data end -- If set to true, categories always appear, even in non-mainspace pages local test_force_categories = false -- Add a tracking category to track entries with certain (unusually undesirable) properties. `track_id` is an identifier -- for the particular property being tracked and goes into the tracking page. Specifically, this adds a link in the -- page text to [[Wiktionary:Tracking/headword/TRACK_ID]], meaning you can find all entries with the `track_id` property -- by visiting [[Special:WhatLinksHere/Wiktionary:Tracking/headword/TRACK_ID]]. -- -- If `lang` (a language object) is given, an additional tracking page [[Wiktionary:Tracking/headword/TRACK_ID/CODE]] is -- linked to where CODE is the language code of `lang`, and you can find all entries in the combination of `track_id` -- and `lang` by visiting [[Special:WhatLinksHere/Wiktionary:Tracking/headword/TRACK_ID/CODE]]. This makes it possible to -- isolate only the entries with a specific tracking property that are in a given language. Note that if `lang` -- references at etymology-only language, both that language's code and its full parent's code are tracked. local function track(track_id, lang) local tracking_page = "headword/" .. track_id if lang and lang:hasType("etymology-only") then debug_track{tracking_page, tracking_page .. "/" .. lang:getCode(), tracking_page .. "/" .. lang:getFullCode()} elseif lang then debug_track{tracking_page, tracking_page .. "/" .. lang:getCode()} else debug_track(tracking_page) end return true end local function text_in_script(text, script_code) local sc = get_script(script_code) if not sc then error("Internal error: Bad script code " .. script_code) end local characters = sc.characters local out if characters then text = ugsub(text, "%W", "") out = ufind(text, "[" .. characters .. "]") end if out then return true else return false end end local spacingPunctuation = "[%s%p]+" --[[ List of punctuation or spacing characters that are found inside of words. Used to exclude characters from the regex above. ]] local wordPunc = "-#%%&@־׳״'.·*’་•:᠊" local notWordPunc = "[^" .. wordPunc .. "]+" -- Format a term (either a head term or an inflection term) along with any left or right qualifiers, labels, references -- or customized separator: `part` is the object specifying the term (and `lang` the language of the term), which should -- optionally contain: -- * left qualifiers in `q`, an array of strings; -- * right qualifiers in `qq`, an array of strings; -- * left labels in `l`, an array of strings; -- * right labels in `ll`, an array of strings; -- * 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`; -- * a separator in `separator`, defaulting to " <i>or</i> " if this is not the first term (j > 1), otherwise "". -- `formatted` is the formatted version of the term itself, and `j` is the index of the term. local function format_term_with_qualifiers_and_refs(lang, part, formatted, j) local function part_non_empty(field) local list = part[field] if not list then return nil end if type(list) ~= "table" then error(("Internal error: Wrong type for `part.%s`=%s, should be \"table\""):format(field, dump(list))) end return list[1] end if part_non_empty("q") or part_non_empty("qq") or part_non_empty("l") or part_non_empty("ll") or part_non_empty("refs") then formatted = format_pron_qualifiers { lang = lang, text = formatted, q = part.q, qq = part.qq, l = part.l, ll = part.ll, refs = part.refs, } end local separator = part.separator or j > 1 and " <i>अथवा</i> " -- use "" to request no separator if separator then formatted = separator .. formatted end return formatted end --[==[Return true if the given head is multiword according to the algorithm used in full_headword().]==] function export.head_is_multiword(head) for possibleWordBreak in ugmatch(head, spacingPunctuation) do if umatch(possibleWordBreak, notWordPunc) then return true end end return false end do local function workaround_to_exclude_chars(s) return (ugsub(s, notWordPunc, "\2%1\1")) end --[==[ Add appropriate links to `head`, correctly handling multiword terms. This is intended for multiword terms but can be used for any term if you want links added to single-word terms as well. If you want to only add links to multiword terms, first check that the term is multiword using `head_is_multiword`. If `default` is specified, this will escape colons so that they don't get interpreted as interwiki links. This should generally only be used when `head` is an actual pagename or is taken from a {{para|pagename}} parameter, not when taken from a {{para|head}} parameter. ]==] function export.add_multiword_links(head, default) head = "\1" .. ugsub(head, spacingPunctuation, workaround_to_exclude_chars) .. "\2" if default then head = head :gsub("(\1[^\2]*)\\([:#][^\2]*\2)", "%1\\\\%2") :gsub("(\1[^\2]*)([:#][^\2]*\2)", "%1\\%2") end --Escape any remaining square brackets to stop them breaking links (e.g. "[citation needed]"). head = encode_entities(head, "[]", true, true) --[=[ use this when workaround is no longer needed: head = "[[" .. ugsub(head, WORDBREAKCHARS, "]]%1[[") .. "]]" Remove any empty links, which could have been created above at the beginning or end of the string. ]=] return (head :gsub("\1\2", "") :gsub("[\1\2]", {["\1"] = "[[", ["\2"] = "]]"})) end end local function non_categorizable(full_raw_pagename) return full_raw_pagename:find("^Appendix:Gestures/") or -- Unsupported titles with descriptive names. (full_raw_pagename:find("^Unsupported titles/") and not full_raw_pagename:find("`")) end local function tag_text_and_add_quals_and_refs(data, head, formatted, j) -- Add language and script wrapper. formatted = tag_text(formatted, data.lang, head.sc, "head", nil, j == 1 and data.id or nil) -- Add qualifiers, labels, references and separator. return format_term_with_qualifiers_and_refs(data.lang, head, formatted, j) end -- Format a headword with transliterations. local function format_headword(data) -- Are there non-empty transliterations? local has_translits = false local has_manual_translits = false ------ Format the headwords. ------ local head_parts = {} local unique_head_parts = {} local has_multiple_heads = not not data.heads[2] for j, head in ipairs(data.heads) do if head.tr or head.ts then has_translits = true end if head.tr and head.tr_manual or head.ts then has_manual_translits = true end local formatted -- Apply processing to the headword, for formatting links and such. if head.term:find("[[", nil, true) and head.sc:getCode() ~= "Image" then formatted = language_link{term = head.term, lang = data.lang} else formatted = data.lang:makeDisplayText(head.term, head.sc, true) end local head_part = tag_text_and_add_quals_and_refs(data, head, formatted, j) insert(head_parts, head_part) -- If multiple heads, try to determine whether all heads display the same. To do this we need to effectively -- rerun the text tagging and addition of qualifiers and references, using 1 for all indices. if has_multiple_heads then local unique_head_part if j == 1 then unique_head_part = head_part else unique_head_part = tag_text_and_add_quals_and_refs(data, head, formatted, 1) end unique_head_parts[unique_head_part] = true end end local set_size = 0 if has_multiple_heads then for _ in pairs(unique_head_parts) do set_size = set_size + 1 end end if set_size == 1 then head_parts = head_parts[1] else head_parts = concat(head_parts) end if has_manual_translits then -- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/manual-tr]] -- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/manual-tr/LANGCODE]] track("manual-tr", data.lang) end ------ Format the transliterations and transcriptions. ------ local translits_formatted if has_translits then local translit_parts = {} for _, head in ipairs(data.heads) do if head.tr or head.ts then local this_parts = {} if head.tr then insert(this_parts, tag_translit(head.tr, data.lang:getCode(), "head", nil, head.tr_manual)) if head.ts then insert(this_parts, " ") end end if head.ts then insert(this_parts, "/" .. tag_transcription(head.ts, data.lang:getCode(), "head") .. "/") end insert(translit_parts, concat(this_parts)) end end translits_formatted = " (" .. concat(translit_parts, " <i>अथवा</i> ") .. ")" local langname = data.lang:getCanonicalName() local transliteration_page = new_title(langname .. " ट्रांसलिट्रेशन", "विक्षनरी") local saw_translit_page = false if transliteration_page and transliteration_page:getContent() then translits_formatted = " [[विक्षनरी:" .. langname .. " ट्रांसलिट्रेशन|•]]" .. translits_formatted saw_translit_page = true end -- If data.lang is an etymology-only language and we didn't find a translation page for it, fall back to the -- full parent. if not saw_translit_page and data.lang:hasType("etymology-only") then langname = data.lang:getFullName() transliteration_page = new_title(langname .. " ट्रांसलिट्रेशन", "विक्षनरी") if transliteration_page and transliteration_page:getContent() then translits_formatted = " [[विक्षनरी:" .. langname .. " ट्रांसलिट्रेशन|•]]" .. translits_formatted end end else translits_formatted = "" end ------ Paste heads and transliterations/transcriptions. ------ local lemma_gloss if data.gloss then lemma_gloss = ' <span class="ib-content qualifier-content">' .. data.gloss .. '</span>' else lemma_gloss = "" end return head_parts .. translits_formatted .. lemma_gloss end local function format_headword_genders(data, is_varform_only) local retval = "" if data.genders and data.genders[1] then if data.gloss then retval = "," end local pos_for_cat if not data.nogendercat and not is_varform_only then local no_gender_cat = (m_data or get_data()).no_gender_cat if not (no_gender_cat[data.lang:getCode()] or no_gender_cat[data.lang:getFullCode()]) then pos_for_cat = (m_data or get_data()).pos_for_gender_number_cat[data.pos_category:gsub("^reconstructed ", "")] end end local text, cats = format_genders(data.genders, data.lang, pos_for_cat) if cats then extend(data.categories, cats) end retval = retval .. "&nbsp;" .. text end return retval end -- Forward reference local format_inflections local function format_inflection_parts(data, parts) for j, part in ipairs(parts) do if type(part) ~= "table" then part = {term = part} end local partaccel = part.accel local face = part.face or "bold" if face ~= "bold" and face ~= "plain" and face ~= "hypothetical" then error("The face `" .. face .. "` " .. ( (script_utilities_data or get_script_utilities_data()).faces[face] and "should not be used for non-headword terms on the headword line." or "is invalid." )) end -- Here the final part 'or data.nolinkinfl' allows to have 'nolinkinfl=true' -- right into the 'data' table to disable inflection links of the entire headword -- when inflected forms aren't entry-worthy, e.g.: in Vulgar Latin local nolinkinfl = part.face == "hypothetical" or (part.nolink and track("nolink") or part.nolinkinfl) or ( data.nolink and track("nolink") or data.nolinkinfl) local formatted if part.label then -- FIXME: There should be a better way of italicizing a label. As is, this isn't customizable. formatted = "<i>" .. part.label .. "</i>" else -- Convert the term into a full link. Don't show a transliteration here unless enable_auto_translit is -- requested, either at the `parts` level (i.e. per inflection) or at the `data.inflections` level (i.e. -- specified for all inflections). This is controllable in {{head}} using autotrinfl=1 for all inflections, -- or fNautotr=1 for an individual inflection (remember that a single inflection may be associated with -- multiple terms). The reason for doing this is to avoid clutter in headword lines by default in languages -- where the script is relatively straightforward to read by learners (e.g. Greek, Russian), but allow it -- to be enabled in languages with more complex scripts (e.g. Arabic). -- -- FIXME: With nested inflections, should we also respect `enable_auto_translit` at the top level of the -- nested inflections structure? local tr = part.tr or not (parts.enable_auto_translit or data.inflections.enable_auto_translit) and "-" or nil -- FIXME: Temporary errors added 2025-10-03. Remove after a month or so. if part.translit then error("Internal error: Use field `tr` not `translit` for specifying an inflection part translit") end if part.transcription then error("Internal error: Use field `ts` not `transcription` for specifying an inflection part transcription") end local postprocess_annotations if part.inflections then postprocess_annotations = function(infldata) insert(infldata.annotations, format_inflections(data, part.inflections)) end end formatted = full_link( { term = not nolinkinfl and part.term or nil, alt = part.alt or (nolinkinfl and part.term or nil), lang = part.lang or data.lang, sc = part.sc or parts.sc or nil, gloss = part.gloss, pos = part.pos, lit = part.lit, id = part.id, genders = part.genders, tr = tr, ts = part.ts, accel = partaccel or parts.accel, postprocess_annotations = postprocess_annotations, }, face ) end parts[j] = format_term_with_qualifiers_and_refs(part.lang or data.lang, part, formatted, j) end local parts_output if parts[1] then parts_output = (parts.label and " " or "") .. concat(parts) elseif parts.request then parts_output = " <small>[please provide]</small>" insert(data.categories, "Requests for inflections in " .. data.lang:getFullName() .. " entries") else parts_output = "" end local parts_label = parts.label and ("<i>" .. parts.label .. "</i>") or "" return format_term_with_qualifiers_and_refs(data.lang, parts, parts_label .. parts_output, 1) end -- Format the inflections following the headword or nested after a given inflection. Declared local above. function format_inflections(data, inflections) if inflections and inflections[1] then -- Format each inflection individually. for key, infl in ipairs(inflections) do inflections[key] = format_inflection_parts(data, infl) end return concat(inflections, ", ") else return "" end end -- Format the top-level inflections following the headword. Currently this just adds parens around the -- formatted comma-separated inflections in `data.inflections`. local function format_top_level_inflections(data) local result = format_inflections(data, data.inflections) if result ~= "" then return " (" .. result .. ")" else return result end end -- Forward reference local check_red_link_inflections -- Check a single inflection (which consists of a label and zero or more terms, each possibly with nested inflections) -- for red links. If so, insert a red-link category based on `plpos` (the plural part of speech to insert in the -- category), stop further processing, and return true. If no red links found, return false. local function check_red_link_inflection_parts(data, parts, plpos) for _, part in ipairs(parts) do if type(part) ~= "table" then part = {term = part} end local term = part.term if term and not term:find("%[%[") then local stripped_physical_term = get_link_page(term, data.lang, part.sc or parts.sc or nil) if stripped_physical_term then local title = mw.title.new(stripped_physical_term) if title and not title:getContent() then insert(data.categories, data.lang:getFullName() .. " " .. plpos .. " with red links in their headword lines") return true end end end if part.inflections then if check_red_link_inflections(data, part.inflections, plpos) then return true end end end return false end -- Check a set of inflections (each of which describes a single inflection of the term, such as feminine or plural, and -- consists of a label and zero or more terms, each possibly with nested inflections) for red links. If so, insert a -- red-link category based on `plpos` (the plural part of speech to insert in the category), stop further processing, -- and return true. If no red links found, return false. function check_red_link_inflections(data, inflections, plpos) if inflections and inflections[1] then -- Check each inflection individually. for key, infl in ipairs(inflections) do if check_red_link_inflection_parts(data, infl, plpos) then return true end end end return false end -- Check the top-level inflections in `data.inflections`, along with any nested inflections, for red links. If so, -- insert a red-link category based on `plpos` (the plural part of speech to insert in the category), stop further -- processing, and return true. If no red links found, return false. local function check_red_link_inflections_top_level(data, plpos) return check_red_link_inflections(data, data.inflections, plpos) end --[==[ Returns the plural form of `pos`, a raw part of speech input, which could be singular or plural. Irregular plural POS are taken into account (e.g. "kanji" pluralizes to "kanji"). फिलहाल हिंदी विक्षनरी पर s लगा कर प्लूरल बनाने की आवश्यकता नहीं / यह मॉड्यूल:affix का प्रयोग करता था। इसलिए इसे निरस्त रखा है। function export.pluralize_pos(pos) -- Make the plural form of the part of speech return (m_data or get_data()).irregular_plurals[pos] or pos:sub(-1) == "" and pos or pluralize(pos) end ]==] --[==[ Return "lemma" if the given POS is a lemma, "non-lemma form" if a non-lemma form, or nil if unknown. The POS passed in must be in its plural form ("nouns", "prefixes", etc.). If you have a POS in its singular form, call {export.pluralize_pos()} above to pluralize it in a smart fashion that knows when to add "-s" and when to add "-es", and also takes into account any irregular plurals. If `best_guess` is given and the POS is in neither the lemma nor non-lemma list, guess based on whether it ends in " forms"; otherwise, return nil. ]==] function export.pos_lemma_or_nonlemma(plpos, best_guess) local m_headword_data = m_data or get_data() local isLemma = m_headword_data.lemmas -- Is it a lemma category? if isLemma[plpos] then return "लेम्मा" end local plpos_no_recon = plpos:gsub("^reconstructed ", "") if isLemma[plpos_no_recon] then return "लेम्मा" end -- Is it a nonlemma category? local isNonLemma = m_headword_data.nonlemmas if isNonLemma[plpos] or isNonLemma[plpos_no_recon] then return "non-lemma form" end local plpos_no_mut = plpos:gsub("^mutated ", "") if isLemma[plpos_no_mut] or isNonLemma[plpos_no_mut] then return "non-lemma form" elseif best_guess then return plpos:find(" forms$") and "non-lemma form" or "लेम्मा" else return nil end end --[==[ Canonicalize a part of speech as specified in 2= in {{tl|head}}. This checks for POS aliases and non-lemma form aliases ending in 'f', and then pluralizes if the POS term does not have an invariable plural. ]==] function export.canonicalize_pos(pos) -- FIXME: Temporary code to throw an error for alias 'pre' (= preposition) that will go away. if pos == "pre" then -- Don't throw error on 'pref' as it's an alias for "prefix". error("POS 'pre' for 'preposition' no longer allowed as it's too ambiguous; use 'prep'") end -- Likewise for pro = pronoun. if pos == "pro" or pos == "prof" then error("POS 'pro' for 'pronoun' no longer allowed as it's too ambiguous; use 'pron'") end local m_headword_data = m_data or get_data() if m_headword_data.pos_aliases[pos] then pos = m_headword_data.pos_aliases[pos] elseif pos:sub(-1) == "f" then pos = pos:sub(1, -2) pos = (m_headword_data.pos_aliases[pos] or pos) .. " रूप" end return export.pluralize_pos(pos) end -- Find and return the maximum index in the array `data[element]` (which may have gaps in it), and initialize it to a -- zero-length array if unspecified. Check to make sure all keys are numeric (other than "maxindex", which is set by -- [[Module:parameters]] for list parameters), all values are strings, and unless `allow_blank_string` is given, -- no blank (zero-length) strings are present. local function init_and_find_maximum_index(data, element, allow_blank_string) local maxind = 0 if not data[element] then data[element] = {} end local typ = type(data[element]) if typ ~= "table" then error(("Internal error: In full_headword(), `data.%s` must be an array but is a %s"):format(element, typ)) end for k, v in pairs(data[element]) do if k ~= "maxindex" then if type(k) ~= "number" then error(("Internal error: Unrecognized non-numeric key '%s' in `data.%s`"):format(k, element)) end if k > maxind then maxind = k end if v then if type(v) ~= "string" then error(("Internal error: For key '%s' in `data.%s`, value should be a string but is a %s"):format(k, element, type(v))) end if not allow_blank_string and v == "" then error(("Internal error: For key '%s' in `data.%s`, blank string not allowed; use 'false' for the default"):format(k, element)) end end end end return maxind end --[==[ -- Add the page to various maintenance categories for the language and the -- whole page. These are placed in the headword somewhat arbitrarily, but -- mainly because headword templates are mandatory for entries (meaning that -- in theory it provides full coverage). -- -- This is provided as an external entry point so that modules which transclude -- information from other entries (such as {{tl|ja-see}}) can take advantage -- of this feature as well, because they are used in place of a conventional -- headword template.]==] do -- Handle any manual sortkeys that have been specified in raw categories -- by tracking if they are the same or different from the automatically- -- generated sortkey, so that we can track them in maintenance -- categories. local function handle_raw_sortkeys(tbl, sortkey, page, lang, lang_cats) sortkey = sortkey or lang:makeSortKey(page.pagename) -- If there are raw categories with no sortkey, then they will be -- sorted based on the default MediaWiki sortkey, so we check against -- that. if tbl == true then if page.raw_defaultsort ~= sortkey then insert(lang_cats, lang:getFullName() .. " terms with non-redundant non-automated sortkeys") end return end local redundant, different for k in pairs(tbl) do if k == sortkey then redundant = true else different = true end end if redundant then insert(lang_cats, lang:getFullName() .. " terms with redundant sortkeys") end if different then insert(lang_cats, lang:getFullName() .. " terms with non-redundant non-automated sortkeys") end return sortkey end function export.maintenance_cats(page, lang, lang_cats, page_cats) extend(page_cats, page.cats) lang = lang:getFull() -- since we are just generating categories local canonical = lang:getCanonicalName() local tbl = page.wikitext_topic_cat[lang:getCode()] local sortkey = nil if tbl then sortkey = handle_raw_sortkeys(tbl, sortkey, page, lang, lang_cats) insert(lang_cats, canonical .. " entries with topic categories using raw markup") end tbl = page.wikitext_langname_cat[canonical] if tbl then handle_raw_sortkeys(tbl, sortkey, page, lang, lang_cats) insert(lang_cats, canonical .. " entries with language name categories using raw markup") end if get_current_L2() ~= canonical then insert(lang_cats, canonical .. " प्रविष्टियाँ त्रुटिपूर्ण भाषा हेडर के साथ") -- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/incorrect language header]] -- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/incorrect language header/LANGCODE]] track("त्रुटिपूर्ण भाषा हेडर", lang) end end end --[==[This is the primary external entry point. {{lua|full_headword(data)}} This is used by {{temp|head}} and various language-specific headword templates (e.g. {{temp|ru-adj}} for Russian adjectives, {{temp|de-noun}} for German nouns, etc.) to display an entire headword line. See [[#Further explanations for full_headword()]] ]==] function export.full_headword(data) -- Prevent data from being destructively modified. data = shallow_copy(data) ------------ 1. Basic checks for old-style (multi-arg) calling convention. ------------ if data.getCanonicalName then error("Internal error: In full_headword(), the first argument `data` needs to be a Lua object (table) of properties, not a language object") end if not data.lang or type(data.lang) ~= "table" or not data.lang.getCode then error("Internal error: In full_headword(), the first argument `data` needs to be a Lua object (table) and `data.lang` must be a language object") end if data.id and type(data.id) ~= "string" then error("Internal error: The id in the data table should be a string.") end ------------ 2. Initialize pagename etc. ------------ local langcode = data.lang:getCode() local full_langcode = data.lang:getFullCode() local langname = data.lang:getCanonicalName() local full_langname = data.lang:getFullName() local raw_pagename = data.pagename local page local m_headword_data = m_data or get_data() if raw_pagename and raw_pagename ~= m_headword_data.pagename then -- for testing, doc pages, etc. -- data.pagename is often set on documentation and test pages through the pagename= parameter of various -- templates, to emulate running on that page. Having a large number of such test templates on a single -- page often leads to timeouts, because we fetch and parse the contents of each page in turn. However, -- we don't really need to do that and can function fine without fetching and parsing the contents of a -- given page, so turn off content fetching/parsing (and also setting the DEFAULTSORT key through a parser -- function, which is *slooooow*) in certain namespaces where test and documentation templates are likely to -- be found and where actual content does not live (User, Template, Module). local actual_namespace = m_headword_data.page.namespace local no_fetch_content = actual_namespace == "सदस्य" or actual_namespace == "साँचा" or actual_namespace == "मॉड्यूल" page = process_page(raw_pagename, no_fetch_content) else page = m_headword_data.page end local namespace = page.namespace if data.altform then -- Temporary tracking for use of old altform= track("altform", data.lang) end local is_varform_only = data.var and data.var ~= "both" local is_varform_both = data.var == "both" ------------ 3. Initialize `data.heads` table; if old-style, convert to new-style. ------------ if type(data.heads) == "table" and type(data.heads[1]) == "table" then -- new-style if data.translits or data.transcriptions then error("Internal error: In full_headword(), if `data.heads` is new-style (array of head objects), `data.translits` and `data.transcriptions` cannot be given") end else -- convert old-style `heads`, `translits` and `transcriptions` to new-style local maxind = max( init_and_find_maximum_index(data, "heads"), init_and_find_maximum_index(data, "translits", true), init_and_find_maximum_index(data, "transcriptions", true) ) for i = 1, maxind do data.heads[i] = { term = data.heads[i], tr = data.translits[i], ts = data.transcriptions[i], } end end -- Make sure there's at least one head. if not data.heads[1] then data.heads[1] = {} end ------------ 4. Initialize and validate `data.categories` and `data.whole_page_categories`, and determine `pos_category` if not given, and add basic categories. ------------ init_and_find_maximum_index(data, "श्रेणियाँ") init_and_find_maximum_index(data, "whole_page_categories") local pos_category_already_present = false if data.categories[1] then local escaped_langname = pattern_escape(full_langname) local matches_lang_pattern = "^" .. escaped_langname .. " " for _, cat in ipairs(data.categories) do -- Does the category begin with the language name? If not, tag it with a tracking category. if not cat:find(matches_lang_pattern) then -- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/no lang category]] -- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/no lang category/LANGCODE]] track("no lang category", data.lang) end end -- If `pos_category` not given, try to infer it from the first specified category. If this doesn't work, we -- throw an error below. if not data.pos_category and data.categories[1]:find(matches_lang_pattern) then data.pos_category = data.categories[1]:gsub(matches_lang_pattern, "") -- Optimization to avoid inserting category already present. pos_category_already_present = true end end if not data.pos_category then error("Internal error: `data.pos_category` not specified and could not be inferred from the categories given in " .. "`data.categories`. Either specify the plural part of speech in `data.pos_category` " .. "(e.g. \"proper nouns\") or ensure that the first category in `data.categories` is formed from the " .. "language's canonical name plus the plural part of speech (e.g. \"Norwegian Bokmål proper nouns\")." ) end -- Insert a category at the beginning for the part of speech unless it's already present or `data.noposcat` given. if not pos_category_already_present and not data.noposcat and not is_varform_only then local pos_category = full_langname .. " " .. data.pos_category -- FIXME: [[User:Theknightwho]] Why is this special case here? Please add an explanatory comment. if pos_category ~= "Translingual Han characters" then insert(data.categories, 1, pos_category) end end -- Try to determine whether the part of speech refers to a lemma or a non-lemma form; if we can figure this out, -- add an appropriate category. local postype = export.pos_lemma_or_nonlemma(data.pos_category) if not postype then -- We don't know what this category is, so tag it with a tracking category. -- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/unrecognized pos]] -- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/unrecognized pos/LANGCODE]] track("unrecognized pos", data.lang) -- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/unrecognized pos/POS]] -- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/unrecognized pos/POS/LANGCODE]] track("unrecognized pos/pos/" .. data.pos_category, data.lang) elseif not data.noposcat and not is_varform_only then insert(data.categories, 1, full_langname .. " " .. postype .. "") end -- Categorize variant forms into 'variant lemmas' or 'variant non-lemma forms'. Originally proposed in -- [[Wiktionary:Beer parlour/2024/June#Decluttering the altform mess]] as 'alternative forms'; renamed in -- [[Wiktionary:Beer parlour/2026/July#Renaming the "alternative forms" categories]]. if (is_varform_only or is_varform_both) and postype then insert(data.categories, 1, full_langname .. " वैरिएंट " .. postype .. "") end ------------ 5. Create a default headword, and add links to multiword page names. ------------ -- Determine if this is an "anti-asterisk" term, i.e. an attested term in a language that must normally be -- reconstructed. local is_anti_asterisk = data.heads[1].term and data.heads[1].term:find("^!!") local lang_reconstructed = data.lang:hasType("reconstructed") if is_anti_asterisk then if not lang_reconstructed then error("Anti-asterisk feature (head= beginning with !!) can only be used with reconstructed languages") end lang_reconstructed = false end -- Determine if term is reconstructed local is_reconstructed = namespace == "Reconstruction" or lang_reconstructed -- Create a default headword based on the pagename, which is determined in -- advance by the data module so that it only needs to be done once. local default_head = page.pagename -- Add links to multi-word page names when appropriate if not (is_reconstructed or data.nolinkhead) then local no_links = m_headword_data.no_multiword_links if not (no_links[langcode] or no_links[full_langcode]) and export.head_is_multiword(default_head) then default_head = export.add_multiword_links(default_head, true) end end if is_reconstructed then default_head = "*" .. default_head end ------------ 6. Check the namespace against the language type. ------------ if namespace == "" then if lang_reconstructed then error("Entries in " .. langname .. " must be placed in the Reconstruction: namespace") elseif data.lang:hasType("appendix-constructed") then error("Entries in " .. langname .. " must be placed in the Appendix: namespace") end elseif namespace == "Citations" or namespace == "Thesaurus" then error("Headword templates should not be used in the " .. namespace .. ": namespace.") end ------------ 7. Fill in missing values in `data.heads`. ------------ -- True if any script among the headword scripts has spaces in it. local any_script_has_spaces = false -- True if any term has a redundant head= param. local has_redundant_head_param = false for _, head in ipairs(data.heads) do ------ 7a. If missing head, replace with default head. if not head.term then head.term = default_head elseif head.term == default_head then has_redundant_head_param = true elseif is_anti_asterisk and head.term == "!!" then -- If explicit head=!! is given, it's an anti-asterisk term and we fill in the default head. head.term = "!!" .. default_head elseif head.term:find("^[!?]$") then -- If explicit head= just consists of ! or ?, add it to the end of the default head. head.term = default_head .. head.term end head.term_no_initial_bang_bang = is_anti_asterisk and head.term:sub(3) or head.term if is_reconstructed then local head_term = head.term if head_term:find("%[%[") then head_term = remove_links(head_term) end if head_term:sub(1, 1) ~= "*" then error("The headword '" .. head_term .. "' must begin with '*' to indicate that it is reconstructed.") end end ------ 7b. Try to detect the script(s) if not provided. If a per-head script is provided, that takes precedence, ------ otherwise fall back to the overall script if given. If neither given, autodetect the script. local auto_sc = data.lang:findBestScript(head.term) if ( auto_sc:getCode() == "None" and find_best_script_without_lang(head.term):getCode() ~= "None" ) then insert(data.categories, full_langname .. " टर्म गैर-स्टैंडर्ड लिपि में") end if not (head.sc or data.sc) then -- No script code given, so use autodetected script. head.sc = auto_sc else if not head.sc then -- Overall script code given. head.sc = data.sc end -- Track uses of sc parameter. if head.sc:getCode() == auto_sc:getCode() then track("redundant script code", data.lang) if not data.no_script_code_cat then insert(data.categories, full_langname .. " टर्म दुहराव वाले लिपि कोड के साथ") end else track("non-redundant manual script code", data.lang) if not data.no_script_code_cat then insert(data.categories, full_langname .. " terms with non-redundant manual script codes") end end end -- If using a discouraged character sequence, add to maintenance category. if head.sc:hasNormalizationFixes() == true then local composed_head = toNFC(head.term) if head.sc:fixDiscouragedSequences(composed_head) ~= composed_head then insert(data.whole_page_categories, "Pages using discouraged character sequences") end end any_script_has_spaces = any_script_has_spaces or head.sc:hasSpaces() ------ 7c. Create automatic transliterations for any non-Latin headwords without manual translit given ------ (provided automatic translit is available, e.g. not in Persian or Hebrew). -- Make transliterations head.tr_manual = nil -- Try to generate a transliteration if necessary if head.tr == "-" then head.tr = nil else local notranslit = m_headword_data.notranslit if not (notranslit[langcode] or notranslit[full_langcode]) and head.sc:isTransliterated() then head.tr_manual = not not head.tr local text = head.term_no_initial_bang_bang if not data.lang:link_tr(head.sc) then text = remove_links(text) end local automated_tr = data.lang:transliterate(text, head.sc) if automated_tr then local manual_tr = head.tr if manual_tr then if remove_links(manual_tr) == remove_links(automated_tr) then insert(data.categories, full_langname .. " terms with redundant transliterations") else insert(data.categories, full_langname .. " terms with non-redundant manual transliterations") end end if not manual_tr then head.tr = automated_tr end end -- There is still no transliteration? -- Add the entry to a cleanup category. if not head.tr then head.tr = "<small>transliteration needed</small>" -- FIXME: No current support for 'Request for transliteration of Classical Persian terms' or similar. -- Consider adding this support in [[Module:category tree/poscatboiler/data/entry maintenance]]. insert(data.categories, "Requests for transliteration of " .. full_langname .. " terms") else -- Otherwise, trim it. head.tr = trim(head.tr) end end end -- Link to the transliteration entry for languages that require this. if head.tr and data.lang:link_tr(head.sc) then head.tr = full_link{ term = head.tr, lang = data.lang, sc = get_script("Latn"), tr = "-" } end end ------------ 8. Maybe tag the title with the appropriate script code, using the `display_title` mechanism. ------------ -- Assumes that the scripts in "toBeTagged" will never occur in the Reconstruction namespace. -- (FIXME: Don't make assumptions like this, and if you need to do so, throw an error if the assumption is violated.) -- Avoid tagging ASCII as Hani even when it is tagged as Hani in the headword, as in [[check]]. The check for ASCII -- might need to be expanded to a check for any Latin characters and whitespace or punctuation. local display_title -- Where there are multiple headwords, use the script for the first. This assumes the first headword is similar to -- the pagename, and that headwords that are in different scripts from the pagename aren't first. This seems to be -- about the best we can do (alternatively we could potentially do script detection on the pagename). local dt_script = data.heads[1].sc local dt_script_code = dt_script:getCode() local page_non_ascii = namespace == "" and not page.pagename:find("^[%z\1-\127]+$") local unsupported_pagename, unsupported = page.full_raw_pagename:gsub("^Unsupported titles/", "") if unsupported == 1 and page.unsupported_titles[unsupported_pagename] then display_title = 'Unsupported titles/<span class="' .. dt_script_code .. '">' .. page.unsupported_titles[unsupported_pagename] .. '</span>' elseif page_non_ascii and m_headword_data.toBeTagged[dt_script_code] or (dt_script_code == "Jpan" and (text_in_script(page.pagename, "Hira") or text_in_script(page.pagename, "Kana"))) or (dt_script_code == "Kore" and text_in_script(page.pagename, "Hang")) then display_title = '<span class="' .. dt_script_code .. '">' .. page.full_raw_pagename .. '</span>' -- Keep Han entries region-neutral in the display title. elseif page_non_ascii and (dt_script_code == "Hant" or dt_script_code == "Hans") then display_title = '<span class="Hani">' .. page.full_raw_pagename .. '</span>' elseif namespace == "Reconstruction" then local matched display_title, matched = ugsub( page.full_raw_pagename, "^(Reconstruction:[^/]+/)(.+)$", function(before, term) return before .. tag_text(term, data.lang, dt_script) end ) if matched == 0 then display_title = nil end end -- FIXME: Generalize this. -- If the current language uses Aran (Nastaliq), e.g. Urdu, and there's more than one language on the page, don't -- set the display title because we don't want Nastaliq for terms that also exist in other languages that don't -- display in Nastaliq (e.g. Arabic or Persian). Because the word "Urdu" occurs near the end of the alphabet, Urdu -- fonts tend to override the fonts of other languages. FIXME: This is checking for more than one language on the -- page but instead needs to check if there are any languages using scripts other than Aran. if dt_script_code == "Aran" and page.L2_list.n > 1 then display_title = nil end if display_title then mw.getCurrentFrame():callParserFunction( "DISPLAYTITLE", display_title ) end ------------ 9. Insert additional categories. ------------ if data.force_cat_output then -- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/force cat output]] track("force cat output") end if has_redundant_head_param then if not data.no_redundant_head_cat then -- This is not the right way to go about this; too many exceptions and problems due to language-specific headword -- handling customization. If we want this, it should be opt-in by a given language passing in the default headword. -- insert(data.categories, full_langname .. " terms with redundant head parameter") end end -- If the first head is multiword (after removing links), maybe insert into "LANG multiword terms". if not data.nomultiwordcat and not is_varform_only and any_script_has_spaces and postype == "lemma" then local no_multiword_cat = m_headword_data.no_multiword_cat if not (no_multiword_cat[langcode] or no_multiword_cat[full_langcode]) then -- Check for spaces or hyphens, but exclude prefixes and suffixes. -- Use the pagename, not the head= value, because the latter may have extra -- junk in it, e.g. superscripted text that throws off the algorithm. local no_hyphen = m_headword_data.hyphen_not_multiword_sep -- Exclude hyphens if the data module states that they should for this language. local checkpattern = (no_hyphen[langcode] or no_hyphen[full_langcode]) and ".[%s፡]." or ".[%s%-፡]." local is_multiword = umatch(page.pagename, checkpattern) if is_multiword and not non_categorizable(page.full_raw_pagename) then insert(data.categories, full_langname .. " कई शब्द वाले टर्म") elseif not is_multiword then local long_word_threshold = m_headword_data.long_word_thresholds[langcode] or m_headword_data.long_word_thresholds[full_langcode] if long_word_threshold and ulen(page.pagename) >= long_word_threshold then insert(data.categories, "लंबे " .. full_langname .. " शब्द") end end end end -- Determine whether to insert a category 'LANGNAME POS in SCRIPT'. If there are multiple heads, we may need to check -- each head, as the heads may (theoretically) have different scripts. local default_sccat = m_headword_data.default_sccat if data.sccat or not is_varform_only and (default_sccat[langcode] or langcode ~= full_langcode and default_sccat[full_langcode]) then local function needs_sccat(sccat_entry, sc) if sccat_entry == true or not sccat_entry then return sccat_entry end if type(sccat_entry) == "table" then local in_list = contains(sccat_entry, sc:getCode()) if sccat_entry[1] == "not" then in_list = not in_list end return in_list end return nil end for _, head in ipairs(data.heads) do -- First check the `sccat` specified at the {{head}} level. local this_needs_sccat = needs_sccat(data.sccat, head.sc) -- If that wasn't given, check the default sccat at the language level for the lang code. if this_needs_sccat == nil and not is_varform_only then this_needs_sccat = needs_sccat(default_sccat[langcode], head.sc) end -- If that wasn't found and the lang code is an etym code, check the default sccat at the parent language level. if this_needs_sccat == nil and not is_varform_only and langcode ~= full_langcode then this_needs_sccat = needs_sccat(default_sccat[full_langcode], head.sc) end if this_needs_sccat then insert(data.categories, full_langname .. " " .. data.pos_category .. " in " .. head.sc:getDisplayForm(data.lang)) end end end -- Reconstructed terms often use weird combinations of scripts and realistically aren't spelled so much as notated. if namespace ~= "Reconstruction" and not is_varform_only then -- Map from languages to a string containing the characters to ignore when considering whether a term has -- multiple written scripts in it. Typically these are Greek or Cyrillic letters used for their phonetic -- values. local characters_to_ignore = { ["aaq"] = "αάὰ", -- Penobscot (Algonquian) ["acy"] = "δθ", -- Cypriot Arabic ["aez"] = "β", -- Aeka (Trans-New Guinea) ["anc"] = "γ", -- Ngas (Chadic/Afroasiatic) ["aou"] = "χ", -- A'ou (Kra-Dai) ["art-blk"] = "ч", -- Bolak (conlang) ["awg"] = "β", -- Anguthimri (Pama-Nyungan) ["az"] = "ь", -- Azerbaijani (Turkic; Yañalif Latin spelling, c. 1928 - 1938) ["ba"] = "ь", -- Bashkir (Turkic; Yañalif Latin spelling, c. 1928 - 1938) ["bhp"] = "β", -- Bima (Austronesian) ["bjz"] = "β", -- Baruga (Trans-New Guinea) ["byk"] = "θ", -- Biao (Kra-Dai) ["cdy"] = "θ", -- Chadong (Kra-Dai) ["chp"] = "θ", -- Chipewyan (Athabaskan) ["cjh"] = "χ", -- Upper Chehalis (Salishan) ["clm"] = "χ", -- Klallam (Salishan) ["col"] = "χ", -- Colombia-Wenatchi (Salishan) ["coo"] = "χθ", -- Comox (Salishan) ["crx"] = "θ", -- Carrier (Athabaskan) ["ets"] = "θ", -- Yekhee (Edoid/Niger-Congo) ["ett"] = "χ", -- Etruscan (isolate; in romanizations) ["fla"] = "χ", -- Montana Salish (Salishan) ["grt"] = "་", -- Garo (South Asian Sino-Tibetan) ["gmw-gts"] = "χ", -- Gottscheerish (Bavarian variant spoken in Slovenia) ["hur"] = "χθ", -- Halkomelem (Salishan) ["itc-psa"] = "f", -- Pre-Samnite (Italic; normally written in Greek) ["izh"] = "ь", -- Ingrian (Finnic) ["kic"] = "θ", -- Kickapoo (Algonquian) ["kk"] = "ь", -- Kazakh (Turkic; Yañalif Latin spelling, c. 1928 - 1938) ["ky"] = "ь", -- Kyrgyz (Turkic; Yañalif Latin spelling, c. 1928 - 1938) ["lil"] = "χ", -- Lillooet (Salishan) ["lsi"] = "ꓹ", -- Lashi (Lolo-Burmese/Sino-Tibetan; represents a glottal stop) ["mhz"] = "β", -- Mor (Austronesian) ["mqn"] = "β", -- Moronene (Austronesian) ["neg"]= "ӡā", -- Negidal (Tungusic; normally in Cyrillic) ["oka"] = "χ", -- Okanagan (Salishan) ["ole"] = "θ", -- Olekha (Sino-Tibetan) ["oui"] = "γβ", -- Old Uyghur (Turkic; FIXME: others? E.g. Greek delta (δ)?) ["pox"] = "χ", -- Polabian (West Slavic) ["rif"] = "ε", -- Tarifit (Berber) ["rom"] = "Θθ", -- Romani (Indic: International Standard; two different thetas???) ["rpn"] = "β", -- Repanbitip (Austronesian) ["sah"] = "ь", -- Yakut (Turkic; 1929 - 1939 Latin spelling) ["sit-jap"] = "χ", -- Japhug (Sino-Tibetan) ["sjw"] = "θ", -- Shawnee (Algonquian) ["squ"] = "χ", -- Squamish (Salishan) ["str"] = "χθ", -- Saanich (Salishan) ["teh"] = "χ", -- Tehuelche (Chonan; spoken in Argentina) ["tep"] = "η", -- Tepecano (Uto-Aztecan) ["thp"] = "χ", -- Thompson (Salishan) ["tk"] = "ь", -- Turkmen (Turkic; Yañalif Latin spelling, c. 1928 - 1938) ["tt"] = "ь", -- Kazakh (Turkic; Yañalif Latin spelling, c. 1928 - 1938) ["twa"] = "χ", -- Twana (Salishan) ["wbl"] = "ы", -- Wakhi (Iranian) ["xbc"] = "ϸ", -- Bactrian (Iranian; represents š; normally written in Greek) ["yha"] = "θ", -- Baha (Kra-Dai) ["za"] = "зч", -- Zhuang (Tai/Kra-Dai); 1957-1982 alphabet used two Cyrillic letters (as well as some others like -- ƃ, ƅ, ƨ, ɯ and ɵ that look like Cyrillic or Greek but are actually Latin) ["zlw-slv"] = "χђћ", -- Slovincian (West Slavic; FIXME: χ is Greek, the other two are Cyrillic, but I'm not sure -- the currect characters are being chosen in the entry names) ["zng"] = "θ", -- Mang (Mon-Khmer) ["ztp"] = "θ", -- Loxicha Zapotec (Zapotecan) } -- Determine how many real scripts are found in the pagename, where we exclude symbols and such. We exclude -- scripts whose `character_category` is false as well as Zmth (mathematical notation symbols), which has a -- category of "Mathematical notation symbols". When counting scripts, we need to elide language-specific -- variants because e.g. Beng and as-Beng have slightly different characters but we don't want to consider them -- two different scripts (e.g. [[এৰ]] has two characters which are detected respectively as Beng and as-Beng). local seen_scripts = {} local num_seen_scripts = 0 local num_loops = 0 local canon_pagename = page.pagename local ch_to_ignore = characters_to_ignore[full_langcode] if ch_to_ignore then canon_pagename = ugsub(canon_pagename, "[" .. ch_to_ignore .. "]", "") end while true do if canon_pagename == "" or num_seen_scripts >= 2 or num_loops >= 10 then break end -- Make sure we don't get into a loop checking the same script over and over again; happens with e.g. [[ᠪᡳ]] num_loops = num_loops + 1 local pagename_script = find_best_script_without_lang(canon_pagename, "None only as last resort") local script_chars = pagename_script.characters if not script_chars then -- we are stuck; this happens with None break end local script_code = pagename_script:getCode() local replaced canon_pagename, replaced = ugsub(canon_pagename, "[" .. script_chars .. "]", "") if ( replaced and script_code ~= "Zmth" and (script_data or get_script_data())[script_code] and script_data[script_code].character_category ~= false ) then script_code = script_code:gsub("^.-%-", "") if not seen_scripts[script_code] then seen_scripts[script_code] = true num_seen_scripts = num_seen_scripts + 1 end end end if num_seen_scripts > 1 then insert(data.categories, full_langname .. " टर्म कई लिपियों में लिखे जाने वाले") end end -- Categorise for unusual characters. Takes into account combining characters, so that we can categorise for characters with diacritics that aren't encoded as atomic characters (e.g. U̠). These can be in two formats: single combining characters (i.e. character + diacritic(s)) or double combining characters (i.e. character + diacritic(s) + character). Each can have any number of diacritics. local standard = data.lang:getStandardCharacters() if not is_varform_only and standard and not non_categorizable(page.full_raw_pagename) then local function char_category(char) local specials = { ["#"] = "number sign", ["("] = "parentheses", [")"] = "parentheses", ["<"] = "angle brackets", [">"] = "angle brackets", ["["] = "square brackets", ["]"] = "square brackets", ["_"] = "underscore", ["{"] = "braces", ["|"] = "vertical line", ["}"] = "braces", ["ß"] = "ẞ", ["\205\133"] = "", -- this is UTF-8 for U+0345 ( ͅ) ["\239\191\189"] = "replacement character", } char = toNFD(char) :gsub(".[\128-\191]*", function(m) local new_m = specials[m] new_m = new_m or m:uupper() return new_m end) return toNFC(char) end if full_langcode ~= "hi" and full_langcode ~= "lo" then local standard_chars_scripts = {} for _, head in ipairs(data.heads) do standard_chars_scripts[head.sc:getCode()] = true end -- Iterate over the scripts, in case there is more than one (as they can have different sets of standard characters). for code in pairs(standard_chars_scripts) do local sc_standard = data.lang:getStandardCharacters(code) if sc_standard then if page.pagename_len > 1 then local explode_standard = {} local function explode(char) explode_standard[char] = true return "" end local sc_standard_exploded = ugsub(sc_standard, page.comb_chars.combined_double, explode) -- The following is correct; it relies on side-effecing the explode_standard[] table. ugsub(sc_standard_exploded, page.comb_chars.combined_single, explode):gsub(".[\128-\191]*", explode) local num_cat_inserted for char in pairs(page.explode_pagename) do if not explode_standard[char] then if char:find("[0-9]") then if not num_cat_inserted then insert(data.categories, full_langname .. " terms spelled with numbers") num_cat_inserted = true end elseif ufind(char, page.emoji_pattern) then insert(data.categories, full_langname .. " terms spelled with emoji") else local upper = char_category(char) if not explode_standard[upper] then char = upper end insert(data.categories, full_langname .. " terms spelled with " .. char) end end end end -- If a diacritic doesn't appear in any of the standard characters, also categorise for it generally. sc_standard = toNFD(sc_standard) for diacritic in ugmatch(page.decompose_pagename, page.comb_chars.diacritics_single) do if not umatch(sc_standard, diacritic) then insert(data.categories, full_langname .. " terms spelled with ◌" .. diacritic) end end for diacritic in ugmatch(page.decompose_pagename, page.comb_chars.diacritics_double) do if not umatch(sc_standard, diacritic) then insert(data.categories, full_langname .. " terms spelled with ◌" .. diacritic .. "◌") end end end end -- Ancient Greek, Hindi and Lao handled the old way for now, as their standard chars still need to be converted to the new format (because there are a lot of them). elseif ulen(page.pagename) ~= 1 then for character in ugmatch(page.pagename, "([^" .. standard .. "])") do local upper = char_category(character) if not umatch(upper, "[" .. standard .. "]") then character = upper end insert(data.categories, full_langname .. " terms spelled with " .. character) end end end if not is_varform_only and data.heads[1].sc:isSystem("alphabet") then local pagename, i = page.pagename:ulower(), 2 while umatch(pagename, "(%a)" .. ("%1"):rep(i)) do i = i + 1 insert(data.categories, full_langname .. " terms with " .. i .. " consecutive instances of the same letter") end end -- Categorise for palindromes if not is_varform_only and not data.nopalindromecat and namespace ~= "Reconstruction" and ulen(page.pagename) > 2 -- FIXME: Use of first script here seems hacky. What is the clean way of doing this in the presence of -- multiple scripts? and is_palindrome(page.pagename, data.lang, data.heads[1].sc) then insert(data.categories, full_langname .. " पैलिंड्रोम") end if namespace == "" and not lang_reconstructed then for _, head in ipairs(data.heads) do if page.full_raw_pagename ~= get_link_page(remove_links(head.term), data.lang, head.sc) then -- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/pagename spelling mismatch]] -- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/pagename spelling mismatch/LANGCODE]] track("pagename spelling mismatch", data.lang) break end end end -- Add red link category if called for and we're not a "large" page, where such checks are disabled. if data.checkredlinks and not m_headword_data.large_pages[m_headword_data.pagename] then local plposcat = type(data.checkredlinks) == "string" and data.checkredlinks or data.pos_category check_red_link_inflections_top_level(data, plposcat) end -- Add to various maintenance categories. export.maintenance_cats(page, data.lang, data.categories, data.whole_page_categories) ------------ 10. Format and return headwords, genders, inflections and categories. ------------ -- Format and return all the gathered information. This may add more categories (e.g. gender/number categories), -- so make sure we do it before evaluating `data.categories`. local text = '<span class="headword-line">' .. format_headword(data) .. format_headword_genders(data, is_varform_only) .. format_top_level_inflections(data) .. '</span>' -- Language-specific categories. local cats = format_categories( data.categories, data.lang, data.sort_key, page.encoded_pagename, data.force_cat_output or test_force_categories, data.heads[1].sc ) -- Language-agnostic categories. local whole_page_cats = format_categories( data.whole_page_categories, nil, "-" ) return text .. cats .. whole_page_cats end return export qsqmjpa3rf62ra4d196y13zara7enwo 487803 487801 2026-09-02T18:46:10Z SM7 6218 f वाले forms को भी प्लूरल बनाने की आवश्यकता नहीं थी 487803 Scribunto text/plain local export = {} -- Named constants for all modules used, to make it easier to swap out sandbox versions. local debug_track_module = "Module:debug/track" local en_utilities_module = "Module:en-utilities" local gender_and_number_module = "Module:gender and number" local headword_data_module = "Module:headword/data" local headword_page_module = "Module:headword/page" local links_module = "Module:links" local load_module = "Module:load" local pages_module = "Module:pages" local palindromes_module = "Module:palindromes" local pron_qualifier_module = "Module:pron qualifier" local scripts_module = "Module:scripts" local scripts_data_module = "Module:scripts/data" local script_utilities_module = "Module:script utilities" local script_utilities_data_module = "Module:script utilities/data" local string_utilities_module = "Module:string utilities" local table_module = "Module:table" local utilities_module = "Module:utilities" local concat = table.concat local dump = mw.dumpObject local insert = table.insert local ipairs = ipairs local max = math.max local new_title = mw.title.new local pairs = pairs local require = require local toNFC = mw.ustring.toNFC local toNFD = mw.ustring.toNFD local type = type local ufind = mw.ustring.find local ugmatch = mw.ustring.gmatch local ugsub = mw.ustring.gsub 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 debug_track(...) debug_track = require(debug_track_module) return debug_track(...) end local function contains(...) contains = require(table_module).contains return contains(...) end local function encode_entities(...) encode_entities = require(string_utilities_module).encode_entities 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_pron_qualifiers(...) format_pron_qualifiers = require(pron_qualifier_module).format_qualifiers return format_pron_qualifiers(...) end local function full_link(...) full_link = require(links_module).full_link return full_link(...) end local function get_current_L2(...) get_current_L2 = require(pages_module).get_current_L2 return get_current_L2(...) end local function get_link_page(...) get_link_page = require(links_module).get_link_page return get_link_page(...) end local function get_script(...) get_script = require(scripts_module).getByCode return get_script(...) end local function is_palindrome(...) is_palindrome = require(palindromes_module).is_palindrome return is_palindrome(...) end local function language_link(...) language_link = require(links_module).language_link return language_link(...) end local function load_data(...) load_data = require(load_module).load_data return load_data(...) end local function pattern_escape(...) pattern_escape = require(string_utilities_module).pattern_escape return pattern_escape(...) end local function pluralize(...) pluralize = require(en_utilities_module).pluralize return pluralize(...) end local function process_page(...) process_page = require(headword_page_module).process_page return process_page(...) end local function remove_links(...) remove_links = require(links_module).remove_links return remove_links(...) end local function shallow_copy(...) shallow_copy = require(table_module).shallowCopy return shallow_copy(...) end local function tag_text(...) tag_text = require(script_utilities_module).tag_text return tag_text(...) end local function tag_transcription(...) tag_transcription = require(script_utilities_module).tag_transcription return tag_transcription(...) 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 ulen(...) ulen = require(string_utilities_module).len return ulen(...) 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 = load_data(headword_data_module) return m_data end local script_data local function get_script_data() script_data = load_data(scripts_data_module) return script_data end local script_utilities_data local function get_script_utilities_data() script_utilities_data = load_data(script_utilities_data_module) return script_utilities_data end -- If set to true, categories always appear, even in non-mainspace pages local test_force_categories = false -- Add a tracking category to track entries with certain (unusually undesirable) properties. `track_id` is an identifier -- for the particular property being tracked and goes into the tracking page. Specifically, this adds a link in the -- page text to [[Wiktionary:Tracking/headword/TRACK_ID]], meaning you can find all entries with the `track_id` property -- by visiting [[Special:WhatLinksHere/Wiktionary:Tracking/headword/TRACK_ID]]. -- -- If `lang` (a language object) is given, an additional tracking page [[Wiktionary:Tracking/headword/TRACK_ID/CODE]] is -- linked to where CODE is the language code of `lang`, and you can find all entries in the combination of `track_id` -- and `lang` by visiting [[Special:WhatLinksHere/Wiktionary:Tracking/headword/TRACK_ID/CODE]]. This makes it possible to -- isolate only the entries with a specific tracking property that are in a given language. Note that if `lang` -- references at etymology-only language, both that language's code and its full parent's code are tracked. local function track(track_id, lang) local tracking_page = "headword/" .. track_id if lang and lang:hasType("etymology-only") then debug_track{tracking_page, tracking_page .. "/" .. lang:getCode(), tracking_page .. "/" .. lang:getFullCode()} elseif lang then debug_track{tracking_page, tracking_page .. "/" .. lang:getCode()} else debug_track(tracking_page) end return true end local function text_in_script(text, script_code) local sc = get_script(script_code) if not sc then error("Internal error: Bad script code " .. script_code) end local characters = sc.characters local out if characters then text = ugsub(text, "%W", "") out = ufind(text, "[" .. characters .. "]") end if out then return true else return false end end local spacingPunctuation = "[%s%p]+" --[[ List of punctuation or spacing characters that are found inside of words. Used to exclude characters from the regex above. ]] local wordPunc = "-#%%&@־׳״'.·*’་•:᠊" local notWordPunc = "[^" .. wordPunc .. "]+" -- Format a term (either a head term or an inflection term) along with any left or right qualifiers, labels, references -- or customized separator: `part` is the object specifying the term (and `lang` the language of the term), which should -- optionally contain: -- * left qualifiers in `q`, an array of strings; -- * right qualifiers in `qq`, an array of strings; -- * left labels in `l`, an array of strings; -- * right labels in `ll`, an array of strings; -- * 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`; -- * a separator in `separator`, defaulting to " <i>or</i> " if this is not the first term (j > 1), otherwise "". -- `formatted` is the formatted version of the term itself, and `j` is the index of the term. local function format_term_with_qualifiers_and_refs(lang, part, formatted, j) local function part_non_empty(field) local list = part[field] if not list then return nil end if type(list) ~= "table" then error(("Internal error: Wrong type for `part.%s`=%s, should be \"table\""):format(field, dump(list))) end return list[1] end if part_non_empty("q") or part_non_empty("qq") or part_non_empty("l") or part_non_empty("ll") or part_non_empty("refs") then formatted = format_pron_qualifiers { lang = lang, text = formatted, q = part.q, qq = part.qq, l = part.l, ll = part.ll, refs = part.refs, } end local separator = part.separator or j > 1 and " <i>अथवा</i> " -- use "" to request no separator if separator then formatted = separator .. formatted end return formatted end --[==[Return true if the given head is multiword according to the algorithm used in full_headword().]==] function export.head_is_multiword(head) for possibleWordBreak in ugmatch(head, spacingPunctuation) do if umatch(possibleWordBreak, notWordPunc) then return true end end return false end do local function workaround_to_exclude_chars(s) return (ugsub(s, notWordPunc, "\2%1\1")) end --[==[ Add appropriate links to `head`, correctly handling multiword terms. This is intended for multiword terms but can be used for any term if you want links added to single-word terms as well. If you want to only add links to multiword terms, first check that the term is multiword using `head_is_multiword`. If `default` is specified, this will escape colons so that they don't get interpreted as interwiki links. This should generally only be used when `head` is an actual pagename or is taken from a {{para|pagename}} parameter, not when taken from a {{para|head}} parameter. ]==] function export.add_multiword_links(head, default) head = "\1" .. ugsub(head, spacingPunctuation, workaround_to_exclude_chars) .. "\2" if default then head = head :gsub("(\1[^\2]*)\\([:#][^\2]*\2)", "%1\\\\%2") :gsub("(\1[^\2]*)([:#][^\2]*\2)", "%1\\%2") end --Escape any remaining square brackets to stop them breaking links (e.g. "[citation needed]"). head = encode_entities(head, "[]", true, true) --[=[ use this when workaround is no longer needed: head = "[[" .. ugsub(head, WORDBREAKCHARS, "]]%1[[") .. "]]" Remove any empty links, which could have been created above at the beginning or end of the string. ]=] return (head :gsub("\1\2", "") :gsub("[\1\2]", {["\1"] = "[[", ["\2"] = "]]"})) end end local function non_categorizable(full_raw_pagename) return full_raw_pagename:find("^Appendix:Gestures/") or -- Unsupported titles with descriptive names. (full_raw_pagename:find("^Unsupported titles/") and not full_raw_pagename:find("`")) end local function tag_text_and_add_quals_and_refs(data, head, formatted, j) -- Add language and script wrapper. formatted = tag_text(formatted, data.lang, head.sc, "head", nil, j == 1 and data.id or nil) -- Add qualifiers, labels, references and separator. return format_term_with_qualifiers_and_refs(data.lang, head, formatted, j) end -- Format a headword with transliterations. local function format_headword(data) -- Are there non-empty transliterations? local has_translits = false local has_manual_translits = false ------ Format the headwords. ------ local head_parts = {} local unique_head_parts = {} local has_multiple_heads = not not data.heads[2] for j, head in ipairs(data.heads) do if head.tr or head.ts then has_translits = true end if head.tr and head.tr_manual or head.ts then has_manual_translits = true end local formatted -- Apply processing to the headword, for formatting links and such. if head.term:find("[[", nil, true) and head.sc:getCode() ~= "Image" then formatted = language_link{term = head.term, lang = data.lang} else formatted = data.lang:makeDisplayText(head.term, head.sc, true) end local head_part = tag_text_and_add_quals_and_refs(data, head, formatted, j) insert(head_parts, head_part) -- If multiple heads, try to determine whether all heads display the same. To do this we need to effectively -- rerun the text tagging and addition of qualifiers and references, using 1 for all indices. if has_multiple_heads then local unique_head_part if j == 1 then unique_head_part = head_part else unique_head_part = tag_text_and_add_quals_and_refs(data, head, formatted, 1) end unique_head_parts[unique_head_part] = true end end local set_size = 0 if has_multiple_heads then for _ in pairs(unique_head_parts) do set_size = set_size + 1 end end if set_size == 1 then head_parts = head_parts[1] else head_parts = concat(head_parts) end if has_manual_translits then -- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/manual-tr]] -- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/manual-tr/LANGCODE]] track("manual-tr", data.lang) end ------ Format the transliterations and transcriptions. ------ local translits_formatted if has_translits then local translit_parts = {} for _, head in ipairs(data.heads) do if head.tr or head.ts then local this_parts = {} if head.tr then insert(this_parts, tag_translit(head.tr, data.lang:getCode(), "head", nil, head.tr_manual)) if head.ts then insert(this_parts, " ") end end if head.ts then insert(this_parts, "/" .. tag_transcription(head.ts, data.lang:getCode(), "head") .. "/") end insert(translit_parts, concat(this_parts)) end end translits_formatted = " (" .. concat(translit_parts, " <i>अथवा</i> ") .. ")" local langname = data.lang:getCanonicalName() local transliteration_page = new_title(langname .. " ट्रांसलिट्रेशन", "विक्षनरी") local saw_translit_page = false if transliteration_page and transliteration_page:getContent() then translits_formatted = " [[विक्षनरी:" .. langname .. " ट्रांसलिट्रेशन|•]]" .. translits_formatted saw_translit_page = true end -- If data.lang is an etymology-only language and we didn't find a translation page for it, fall back to the -- full parent. if not saw_translit_page and data.lang:hasType("etymology-only") then langname = data.lang:getFullName() transliteration_page = new_title(langname .. " ट्रांसलिट्रेशन", "विक्षनरी") if transliteration_page and transliteration_page:getContent() then translits_formatted = " [[विक्षनरी:" .. langname .. " ट्रांसलिट्रेशन|•]]" .. translits_formatted end end else translits_formatted = "" end ------ Paste heads and transliterations/transcriptions. ------ local lemma_gloss if data.gloss then lemma_gloss = ' <span class="ib-content qualifier-content">' .. data.gloss .. '</span>' else lemma_gloss = "" end return head_parts .. translits_formatted .. lemma_gloss end local function format_headword_genders(data, is_varform_only) local retval = "" if data.genders and data.genders[1] then if data.gloss then retval = "," end local pos_for_cat if not data.nogendercat and not is_varform_only then local no_gender_cat = (m_data or get_data()).no_gender_cat if not (no_gender_cat[data.lang:getCode()] or no_gender_cat[data.lang:getFullCode()]) then pos_for_cat = (m_data or get_data()).pos_for_gender_number_cat[data.pos_category:gsub("^reconstructed ", "")] end end local text, cats = format_genders(data.genders, data.lang, pos_for_cat) if cats then extend(data.categories, cats) end retval = retval .. "&nbsp;" .. text end return retval end -- Forward reference local format_inflections local function format_inflection_parts(data, parts) for j, part in ipairs(parts) do if type(part) ~= "table" then part = {term = part} end local partaccel = part.accel local face = part.face or "bold" if face ~= "bold" and face ~= "plain" and face ~= "hypothetical" then error("The face `" .. face .. "` " .. ( (script_utilities_data or get_script_utilities_data()).faces[face] and "should not be used for non-headword terms on the headword line." or "is invalid." )) end -- Here the final part 'or data.nolinkinfl' allows to have 'nolinkinfl=true' -- right into the 'data' table to disable inflection links of the entire headword -- when inflected forms aren't entry-worthy, e.g.: in Vulgar Latin local nolinkinfl = part.face == "hypothetical" or (part.nolink and track("nolink") or part.nolinkinfl) or ( data.nolink and track("nolink") or data.nolinkinfl) local formatted if part.label then -- FIXME: There should be a better way of italicizing a label. As is, this isn't customizable. formatted = "<i>" .. part.label .. "</i>" else -- Convert the term into a full link. Don't show a transliteration here unless enable_auto_translit is -- requested, either at the `parts` level (i.e. per inflection) or at the `data.inflections` level (i.e. -- specified for all inflections). This is controllable in {{head}} using autotrinfl=1 for all inflections, -- or fNautotr=1 for an individual inflection (remember that a single inflection may be associated with -- multiple terms). The reason for doing this is to avoid clutter in headword lines by default in languages -- where the script is relatively straightforward to read by learners (e.g. Greek, Russian), but allow it -- to be enabled in languages with more complex scripts (e.g. Arabic). -- -- FIXME: With nested inflections, should we also respect `enable_auto_translit` at the top level of the -- nested inflections structure? local tr = part.tr or not (parts.enable_auto_translit or data.inflections.enable_auto_translit) and "-" or nil -- FIXME: Temporary errors added 2025-10-03. Remove after a month or so. if part.translit then error("Internal error: Use field `tr` not `translit` for specifying an inflection part translit") end if part.transcription then error("Internal error: Use field `ts` not `transcription` for specifying an inflection part transcription") end local postprocess_annotations if part.inflections then postprocess_annotations = function(infldata) insert(infldata.annotations, format_inflections(data, part.inflections)) end end formatted = full_link( { term = not nolinkinfl and part.term or nil, alt = part.alt or (nolinkinfl and part.term or nil), lang = part.lang or data.lang, sc = part.sc or parts.sc or nil, gloss = part.gloss, pos = part.pos, lit = part.lit, id = part.id, genders = part.genders, tr = tr, ts = part.ts, accel = partaccel or parts.accel, postprocess_annotations = postprocess_annotations, }, face ) end parts[j] = format_term_with_qualifiers_and_refs(part.lang or data.lang, part, formatted, j) end local parts_output if parts[1] then parts_output = (parts.label and " " or "") .. concat(parts) elseif parts.request then parts_output = " <small>[please provide]</small>" insert(data.categories, "Requests for inflections in " .. data.lang:getFullName() .. " entries") else parts_output = "" end local parts_label = parts.label and ("<i>" .. parts.label .. "</i>") or "" return format_term_with_qualifiers_and_refs(data.lang, parts, parts_label .. parts_output, 1) end -- Format the inflections following the headword or nested after a given inflection. Declared local above. function format_inflections(data, inflections) if inflections and inflections[1] then -- Format each inflection individually. for key, infl in ipairs(inflections) do inflections[key] = format_inflection_parts(data, infl) end return concat(inflections, ", ") else return "" end end -- Format the top-level inflections following the headword. Currently this just adds parens around the -- formatted comma-separated inflections in `data.inflections`. local function format_top_level_inflections(data) local result = format_inflections(data, data.inflections) if result ~= "" then return " (" .. result .. ")" else return result end end -- Forward reference local check_red_link_inflections -- Check a single inflection (which consists of a label and zero or more terms, each possibly with nested inflections) -- for red links. If so, insert a red-link category based on `plpos` (the plural part of speech to insert in the -- category), stop further processing, and return true. If no red links found, return false. local function check_red_link_inflection_parts(data, parts, plpos) for _, part in ipairs(parts) do if type(part) ~= "table" then part = {term = part} end local term = part.term if term and not term:find("%[%[") then local stripped_physical_term = get_link_page(term, data.lang, part.sc or parts.sc or nil) if stripped_physical_term then local title = mw.title.new(stripped_physical_term) if title and not title:getContent() then insert(data.categories, data.lang:getFullName() .. " " .. plpos .. " with red links in their headword lines") return true end end end if part.inflections then if check_red_link_inflections(data, part.inflections, plpos) then return true end end end return false end -- Check a set of inflections (each of which describes a single inflection of the term, such as feminine or plural, and -- consists of a label and zero or more terms, each possibly with nested inflections) for red links. If so, insert a -- red-link category based on `plpos` (the plural part of speech to insert in the category), stop further processing, -- and return true. If no red links found, return false. function check_red_link_inflections(data, inflections, plpos) if inflections and inflections[1] then -- Check each inflection individually. for key, infl in ipairs(inflections) do if check_red_link_inflection_parts(data, infl, plpos) then return true end end end return false end -- Check the top-level inflections in `data.inflections`, along with any nested inflections, for red links. If so, -- insert a red-link category based on `plpos` (the plural part of speech to insert in the category), stop further -- processing, and return true. If no red links found, return false. local function check_red_link_inflections_top_level(data, plpos) return check_red_link_inflections(data, data.inflections, plpos) end --[==[ Returns the plural form of `pos`, a raw part of speech input, which could be singular or plural. Irregular plural POS are taken into account (e.g. "kanji" pluralizes to "kanji"). फिलहाल हिंदी विक्षनरी पर s लगा कर प्लूरल बनाने की आवश्यकता नहीं / यह मॉड्यूल:affix का प्रयोग करता था। इसलिए इसे निरस्त रखा है। function export.pluralize_pos(pos) -- Make the plural form of the part of speech return (m_data or get_data()).irregular_plurals[pos] or pos:sub(-1) == "" and pos or pluralize(pos) end ]==] --[==[ Return "lemma" if the given POS is a lemma, "non-lemma form" if a non-lemma form, or nil if unknown. The POS passed in must be in its plural form ("nouns", "prefixes", etc.). If you have a POS in its singular form, call {export.pluralize_pos()} above to pluralize it in a smart fashion that knows when to add "-s" and when to add "-es", and also takes into account any irregular plurals. If `best_guess` is given and the POS is in neither the lemma nor non-lemma list, guess based on whether it ends in " forms"; otherwise, return nil. ]==] function export.pos_lemma_or_nonlemma(plpos, best_guess) local m_headword_data = m_data or get_data() local isLemma = m_headword_data.lemmas -- Is it a lemma category? if isLemma[plpos] then return "लेम्मा" end local plpos_no_recon = plpos:gsub("^reconstructed ", "") if isLemma[plpos_no_recon] then return "लेम्मा" end -- Is it a nonlemma category? local isNonLemma = m_headword_data.nonlemmas if isNonLemma[plpos] or isNonLemma[plpos_no_recon] then return "non-lemma form" end local plpos_no_mut = plpos:gsub("^mutated ", "") if isLemma[plpos_no_mut] or isNonLemma[plpos_no_mut] then return "non-lemma form" elseif best_guess then return plpos:find(" forms$") and "non-lemma form" or "लेम्मा" else return nil end end --[==[ Canonicalize a part of speech as specified in 2= in {{tl|head}}. This checks for POS aliases and non-lemma form aliases ending in 'f', and then pluralizes if the POS term does not have an invariable plural. ]==] function export.canonicalize_pos(pos) -- FIXME: Temporary code to throw an error for alias 'pre' (= preposition) that will go away. if pos == "pre" then -- Don't throw error on 'pref' as it's an alias for "prefix". error("POS 'pre' for 'preposition' no longer allowed as it's too ambiguous; use 'prep'") end -- Likewise for pro = pronoun. if pos == "pro" or pos == "prof" then error("POS 'pro' for 'pronoun' no longer allowed as it's too ambiguous; use 'pron'") end local m_headword_data = m_data or get_data() if m_headword_data.pos_aliases[pos] then pos = m_headword_data.pos_aliases[pos] elseif pos:sub(-1) == "f" then pos = pos:sub(1, -2) pos = (m_headword_data.pos_aliases[pos] or pos) .. " रूप" end return pos -- export.pluralize_pos(pos) यहाँ भी s लगाकर pluralize करने कीई आवश्यकता नहीं end -- Find and return the maximum index in the array `data[element]` (which may have gaps in it), and initialize it to a -- zero-length array if unspecified. Check to make sure all keys are numeric (other than "maxindex", which is set by -- [[Module:parameters]] for list parameters), all values are strings, and unless `allow_blank_string` is given, -- no blank (zero-length) strings are present. local function init_and_find_maximum_index(data, element, allow_blank_string) local maxind = 0 if not data[element] then data[element] = {} end local typ = type(data[element]) if typ ~= "table" then error(("Internal error: In full_headword(), `data.%s` must be an array but is a %s"):format(element, typ)) end for k, v in pairs(data[element]) do if k ~= "maxindex" then if type(k) ~= "number" then error(("Internal error: Unrecognized non-numeric key '%s' in `data.%s`"):format(k, element)) end if k > maxind then maxind = k end if v then if type(v) ~= "string" then error(("Internal error: For key '%s' in `data.%s`, value should be a string but is a %s"):format(k, element, type(v))) end if not allow_blank_string and v == "" then error(("Internal error: For key '%s' in `data.%s`, blank string not allowed; use 'false' for the default"):format(k, element)) end end end end return maxind end --[==[ -- Add the page to various maintenance categories for the language and the -- whole page. These are placed in the headword somewhat arbitrarily, but -- mainly because headword templates are mandatory for entries (meaning that -- in theory it provides full coverage). -- -- This is provided as an external entry point so that modules which transclude -- information from other entries (such as {{tl|ja-see}}) can take advantage -- of this feature as well, because they are used in place of a conventional -- headword template.]==] do -- Handle any manual sortkeys that have been specified in raw categories -- by tracking if they are the same or different from the automatically- -- generated sortkey, so that we can track them in maintenance -- categories. local function handle_raw_sortkeys(tbl, sortkey, page, lang, lang_cats) sortkey = sortkey or lang:makeSortKey(page.pagename) -- If there are raw categories with no sortkey, then they will be -- sorted based on the default MediaWiki sortkey, so we check against -- that. if tbl == true then if page.raw_defaultsort ~= sortkey then insert(lang_cats, lang:getFullName() .. " terms with non-redundant non-automated sortkeys") end return end local redundant, different for k in pairs(tbl) do if k == sortkey then redundant = true else different = true end end if redundant then insert(lang_cats, lang:getFullName() .. " terms with redundant sortkeys") end if different then insert(lang_cats, lang:getFullName() .. " terms with non-redundant non-automated sortkeys") end return sortkey end function export.maintenance_cats(page, lang, lang_cats, page_cats) extend(page_cats, page.cats) lang = lang:getFull() -- since we are just generating categories local canonical = lang:getCanonicalName() local tbl = page.wikitext_topic_cat[lang:getCode()] local sortkey = nil if tbl then sortkey = handle_raw_sortkeys(tbl, sortkey, page, lang, lang_cats) insert(lang_cats, canonical .. " entries with topic categories using raw markup") end tbl = page.wikitext_langname_cat[canonical] if tbl then handle_raw_sortkeys(tbl, sortkey, page, lang, lang_cats) insert(lang_cats, canonical .. " entries with language name categories using raw markup") end if get_current_L2() ~= canonical then insert(lang_cats, canonical .. " प्रविष्टियाँ त्रुटिपूर्ण भाषा हेडर के साथ") -- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/incorrect language header]] -- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/incorrect language header/LANGCODE]] track("त्रुटिपूर्ण भाषा हेडर", lang) end end end --[==[This is the primary external entry point. {{lua|full_headword(data)}} This is used by {{temp|head}} and various language-specific headword templates (e.g. {{temp|ru-adj}} for Russian adjectives, {{temp|de-noun}} for German nouns, etc.) to display an entire headword line. See [[#Further explanations for full_headword()]] ]==] function export.full_headword(data) -- Prevent data from being destructively modified. data = shallow_copy(data) ------------ 1. Basic checks for old-style (multi-arg) calling convention. ------------ if data.getCanonicalName then error("Internal error: In full_headword(), the first argument `data` needs to be a Lua object (table) of properties, not a language object") end if not data.lang or type(data.lang) ~= "table" or not data.lang.getCode then error("Internal error: In full_headword(), the first argument `data` needs to be a Lua object (table) and `data.lang` must be a language object") end if data.id and type(data.id) ~= "string" then error("Internal error: The id in the data table should be a string.") end ------------ 2. Initialize pagename etc. ------------ local langcode = data.lang:getCode() local full_langcode = data.lang:getFullCode() local langname = data.lang:getCanonicalName() local full_langname = data.lang:getFullName() local raw_pagename = data.pagename local page local m_headword_data = m_data or get_data() if raw_pagename and raw_pagename ~= m_headword_data.pagename then -- for testing, doc pages, etc. -- data.pagename is often set on documentation and test pages through the pagename= parameter of various -- templates, to emulate running on that page. Having a large number of such test templates on a single -- page often leads to timeouts, because we fetch and parse the contents of each page in turn. However, -- we don't really need to do that and can function fine without fetching and parsing the contents of a -- given page, so turn off content fetching/parsing (and also setting the DEFAULTSORT key through a parser -- function, which is *slooooow*) in certain namespaces where test and documentation templates are likely to -- be found and where actual content does not live (User, Template, Module). local actual_namespace = m_headword_data.page.namespace local no_fetch_content = actual_namespace == "सदस्य" or actual_namespace == "साँचा" or actual_namespace == "मॉड्यूल" page = process_page(raw_pagename, no_fetch_content) else page = m_headword_data.page end local namespace = page.namespace if data.altform then -- Temporary tracking for use of old altform= track("altform", data.lang) end local is_varform_only = data.var and data.var ~= "both" local is_varform_both = data.var == "both" ------------ 3. Initialize `data.heads` table; if old-style, convert to new-style. ------------ if type(data.heads) == "table" and type(data.heads[1]) == "table" then -- new-style if data.translits or data.transcriptions then error("Internal error: In full_headword(), if `data.heads` is new-style (array of head objects), `data.translits` and `data.transcriptions` cannot be given") end else -- convert old-style `heads`, `translits` and `transcriptions` to new-style local maxind = max( init_and_find_maximum_index(data, "heads"), init_and_find_maximum_index(data, "translits", true), init_and_find_maximum_index(data, "transcriptions", true) ) for i = 1, maxind do data.heads[i] = { term = data.heads[i], tr = data.translits[i], ts = data.transcriptions[i], } end end -- Make sure there's at least one head. if not data.heads[1] then data.heads[1] = {} end ------------ 4. Initialize and validate `data.categories` and `data.whole_page_categories`, and determine `pos_category` if not given, and add basic categories. ------------ init_and_find_maximum_index(data, "श्रेणियाँ") init_and_find_maximum_index(data, "whole_page_categories") local pos_category_already_present = false if data.categories[1] then local escaped_langname = pattern_escape(full_langname) local matches_lang_pattern = "^" .. escaped_langname .. " " for _, cat in ipairs(data.categories) do -- Does the category begin with the language name? If not, tag it with a tracking category. if not cat:find(matches_lang_pattern) then -- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/no lang category]] -- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/no lang category/LANGCODE]] track("no lang category", data.lang) end end -- If `pos_category` not given, try to infer it from the first specified category. If this doesn't work, we -- throw an error below. if not data.pos_category and data.categories[1]:find(matches_lang_pattern) then data.pos_category = data.categories[1]:gsub(matches_lang_pattern, "") -- Optimization to avoid inserting category already present. pos_category_already_present = true end end if not data.pos_category then error("Internal error: `data.pos_category` not specified and could not be inferred from the categories given in " .. "`data.categories`. Either specify the plural part of speech in `data.pos_category` " .. "(e.g. \"proper nouns\") or ensure that the first category in `data.categories` is formed from the " .. "language's canonical name plus the plural part of speech (e.g. \"Norwegian Bokmål proper nouns\")." ) end -- Insert a category at the beginning for the part of speech unless it's already present or `data.noposcat` given. if not pos_category_already_present and not data.noposcat and not is_varform_only then local pos_category = full_langname .. " " .. data.pos_category -- FIXME: [[User:Theknightwho]] Why is this special case here? Please add an explanatory comment. if pos_category ~= "Translingual Han characters" then insert(data.categories, 1, pos_category) end end -- Try to determine whether the part of speech refers to a lemma or a non-lemma form; if we can figure this out, -- add an appropriate category. local postype = export.pos_lemma_or_nonlemma(data.pos_category) if not postype then -- We don't know what this category is, so tag it with a tracking category. -- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/unrecognized pos]] -- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/unrecognized pos/LANGCODE]] track("unrecognized pos", data.lang) -- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/unrecognized pos/POS]] -- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/unrecognized pos/POS/LANGCODE]] track("unrecognized pos/pos/" .. data.pos_category, data.lang) elseif not data.noposcat and not is_varform_only then insert(data.categories, 1, full_langname .. " " .. postype .. "") end -- Categorize variant forms into 'variant lemmas' or 'variant non-lemma forms'. Originally proposed in -- [[Wiktionary:Beer parlour/2024/June#Decluttering the altform mess]] as 'alternative forms'; renamed in -- [[Wiktionary:Beer parlour/2026/July#Renaming the "alternative forms" categories]]. if (is_varform_only or is_varform_both) and postype then insert(data.categories, 1, full_langname .. " वैरिएंट " .. postype .. "") end ------------ 5. Create a default headword, and add links to multiword page names. ------------ -- Determine if this is an "anti-asterisk" term, i.e. an attested term in a language that must normally be -- reconstructed. local is_anti_asterisk = data.heads[1].term and data.heads[1].term:find("^!!") local lang_reconstructed = data.lang:hasType("reconstructed") if is_anti_asterisk then if not lang_reconstructed then error("Anti-asterisk feature (head= beginning with !!) can only be used with reconstructed languages") end lang_reconstructed = false end -- Determine if term is reconstructed local is_reconstructed = namespace == "Reconstruction" or lang_reconstructed -- Create a default headword based on the pagename, which is determined in -- advance by the data module so that it only needs to be done once. local default_head = page.pagename -- Add links to multi-word page names when appropriate if not (is_reconstructed or data.nolinkhead) then local no_links = m_headword_data.no_multiword_links if not (no_links[langcode] or no_links[full_langcode]) and export.head_is_multiword(default_head) then default_head = export.add_multiword_links(default_head, true) end end if is_reconstructed then default_head = "*" .. default_head end ------------ 6. Check the namespace against the language type. ------------ if namespace == "" then if lang_reconstructed then error("Entries in " .. langname .. " must be placed in the Reconstruction: namespace") elseif data.lang:hasType("appendix-constructed") then error("Entries in " .. langname .. " must be placed in the Appendix: namespace") end elseif namespace == "Citations" or namespace == "Thesaurus" then error("Headword templates should not be used in the " .. namespace .. ": namespace.") end ------------ 7. Fill in missing values in `data.heads`. ------------ -- True if any script among the headword scripts has spaces in it. local any_script_has_spaces = false -- True if any term has a redundant head= param. local has_redundant_head_param = false for _, head in ipairs(data.heads) do ------ 7a. If missing head, replace with default head. if not head.term then head.term = default_head elseif head.term == default_head then has_redundant_head_param = true elseif is_anti_asterisk and head.term == "!!" then -- If explicit head=!! is given, it's an anti-asterisk term and we fill in the default head. head.term = "!!" .. default_head elseif head.term:find("^[!?]$") then -- If explicit head= just consists of ! or ?, add it to the end of the default head. head.term = default_head .. head.term end head.term_no_initial_bang_bang = is_anti_asterisk and head.term:sub(3) or head.term if is_reconstructed then local head_term = head.term if head_term:find("%[%[") then head_term = remove_links(head_term) end if head_term:sub(1, 1) ~= "*" then error("The headword '" .. head_term .. "' must begin with '*' to indicate that it is reconstructed.") end end ------ 7b. Try to detect the script(s) if not provided. If a per-head script is provided, that takes precedence, ------ otherwise fall back to the overall script if given. If neither given, autodetect the script. local auto_sc = data.lang:findBestScript(head.term) if ( auto_sc:getCode() == "None" and find_best_script_without_lang(head.term):getCode() ~= "None" ) then insert(data.categories, full_langname .. " टर्म गैर-स्टैंडर्ड लिपि में") end if not (head.sc or data.sc) then -- No script code given, so use autodetected script. head.sc = auto_sc else if not head.sc then -- Overall script code given. head.sc = data.sc end -- Track uses of sc parameter. if head.sc:getCode() == auto_sc:getCode() then track("redundant script code", data.lang) if not data.no_script_code_cat then insert(data.categories, full_langname .. " टर्म दुहराव वाले लिपि कोड के साथ") end else track("non-redundant manual script code", data.lang) if not data.no_script_code_cat then insert(data.categories, full_langname .. " terms with non-redundant manual script codes") end end end -- If using a discouraged character sequence, add to maintenance category. if head.sc:hasNormalizationFixes() == true then local composed_head = toNFC(head.term) if head.sc:fixDiscouragedSequences(composed_head) ~= composed_head then insert(data.whole_page_categories, "Pages using discouraged character sequences") end end any_script_has_spaces = any_script_has_spaces or head.sc:hasSpaces() ------ 7c. Create automatic transliterations for any non-Latin headwords without manual translit given ------ (provided automatic translit is available, e.g. not in Persian or Hebrew). -- Make transliterations head.tr_manual = nil -- Try to generate a transliteration if necessary if head.tr == "-" then head.tr = nil else local notranslit = m_headword_data.notranslit if not (notranslit[langcode] or notranslit[full_langcode]) and head.sc:isTransliterated() then head.tr_manual = not not head.tr local text = head.term_no_initial_bang_bang if not data.lang:link_tr(head.sc) then text = remove_links(text) end local automated_tr = data.lang:transliterate(text, head.sc) if automated_tr then local manual_tr = head.tr if manual_tr then if remove_links(manual_tr) == remove_links(automated_tr) then insert(data.categories, full_langname .. " terms with redundant transliterations") else insert(data.categories, full_langname .. " terms with non-redundant manual transliterations") end end if not manual_tr then head.tr = automated_tr end end -- There is still no transliteration? -- Add the entry to a cleanup category. if not head.tr then head.tr = "<small>transliteration needed</small>" -- FIXME: No current support for 'Request for transliteration of Classical Persian terms' or similar. -- Consider adding this support in [[Module:category tree/poscatboiler/data/entry maintenance]]. insert(data.categories, "Requests for transliteration of " .. full_langname .. " terms") else -- Otherwise, trim it. head.tr = trim(head.tr) end end end -- Link to the transliteration entry for languages that require this. if head.tr and data.lang:link_tr(head.sc) then head.tr = full_link{ term = head.tr, lang = data.lang, sc = get_script("Latn"), tr = "-" } end end ------------ 8. Maybe tag the title with the appropriate script code, using the `display_title` mechanism. ------------ -- Assumes that the scripts in "toBeTagged" will never occur in the Reconstruction namespace. -- (FIXME: Don't make assumptions like this, and if you need to do so, throw an error if the assumption is violated.) -- Avoid tagging ASCII as Hani even when it is tagged as Hani in the headword, as in [[check]]. The check for ASCII -- might need to be expanded to a check for any Latin characters and whitespace or punctuation. local display_title -- Where there are multiple headwords, use the script for the first. This assumes the first headword is similar to -- the pagename, and that headwords that are in different scripts from the pagename aren't first. This seems to be -- about the best we can do (alternatively we could potentially do script detection on the pagename). local dt_script = data.heads[1].sc local dt_script_code = dt_script:getCode() local page_non_ascii = namespace == "" and not page.pagename:find("^[%z\1-\127]+$") local unsupported_pagename, unsupported = page.full_raw_pagename:gsub("^Unsupported titles/", "") if unsupported == 1 and page.unsupported_titles[unsupported_pagename] then display_title = 'Unsupported titles/<span class="' .. dt_script_code .. '">' .. page.unsupported_titles[unsupported_pagename] .. '</span>' elseif page_non_ascii and m_headword_data.toBeTagged[dt_script_code] or (dt_script_code == "Jpan" and (text_in_script(page.pagename, "Hira") or text_in_script(page.pagename, "Kana"))) or (dt_script_code == "Kore" and text_in_script(page.pagename, "Hang")) then display_title = '<span class="' .. dt_script_code .. '">' .. page.full_raw_pagename .. '</span>' -- Keep Han entries region-neutral in the display title. elseif page_non_ascii and (dt_script_code == "Hant" or dt_script_code == "Hans") then display_title = '<span class="Hani">' .. page.full_raw_pagename .. '</span>' elseif namespace == "Reconstruction" then local matched display_title, matched = ugsub( page.full_raw_pagename, "^(Reconstruction:[^/]+/)(.+)$", function(before, term) return before .. tag_text(term, data.lang, dt_script) end ) if matched == 0 then display_title = nil end end -- FIXME: Generalize this. -- If the current language uses Aran (Nastaliq), e.g. Urdu, and there's more than one language on the page, don't -- set the display title because we don't want Nastaliq for terms that also exist in other languages that don't -- display in Nastaliq (e.g. Arabic or Persian). Because the word "Urdu" occurs near the end of the alphabet, Urdu -- fonts tend to override the fonts of other languages. FIXME: This is checking for more than one language on the -- page but instead needs to check if there are any languages using scripts other than Aran. if dt_script_code == "Aran" and page.L2_list.n > 1 then display_title = nil end if display_title then mw.getCurrentFrame():callParserFunction( "DISPLAYTITLE", display_title ) end ------------ 9. Insert additional categories. ------------ if data.force_cat_output then -- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/force cat output]] track("force cat output") end if has_redundant_head_param then if not data.no_redundant_head_cat then -- This is not the right way to go about this; too many exceptions and problems due to language-specific headword -- handling customization. If we want this, it should be opt-in by a given language passing in the default headword. -- insert(data.categories, full_langname .. " terms with redundant head parameter") end end -- If the first head is multiword (after removing links), maybe insert into "LANG multiword terms". if not data.nomultiwordcat and not is_varform_only and any_script_has_spaces and postype == "lemma" then local no_multiword_cat = m_headword_data.no_multiword_cat if not (no_multiword_cat[langcode] or no_multiword_cat[full_langcode]) then -- Check for spaces or hyphens, but exclude prefixes and suffixes. -- Use the pagename, not the head= value, because the latter may have extra -- junk in it, e.g. superscripted text that throws off the algorithm. local no_hyphen = m_headword_data.hyphen_not_multiword_sep -- Exclude hyphens if the data module states that they should for this language. local checkpattern = (no_hyphen[langcode] or no_hyphen[full_langcode]) and ".[%s፡]." or ".[%s%-፡]." local is_multiword = umatch(page.pagename, checkpattern) if is_multiword and not non_categorizable(page.full_raw_pagename) then insert(data.categories, full_langname .. " कई शब्द वाले टर्म") elseif not is_multiword then local long_word_threshold = m_headword_data.long_word_thresholds[langcode] or m_headword_data.long_word_thresholds[full_langcode] if long_word_threshold and ulen(page.pagename) >= long_word_threshold then insert(data.categories, "लंबे " .. full_langname .. " शब्द") end end end end -- Determine whether to insert a category 'LANGNAME POS in SCRIPT'. If there are multiple heads, we may need to check -- each head, as the heads may (theoretically) have different scripts. local default_sccat = m_headword_data.default_sccat if data.sccat or not is_varform_only and (default_sccat[langcode] or langcode ~= full_langcode and default_sccat[full_langcode]) then local function needs_sccat(sccat_entry, sc) if sccat_entry == true or not sccat_entry then return sccat_entry end if type(sccat_entry) == "table" then local in_list = contains(sccat_entry, sc:getCode()) if sccat_entry[1] == "not" then in_list = not in_list end return in_list end return nil end for _, head in ipairs(data.heads) do -- First check the `sccat` specified at the {{head}} level. local this_needs_sccat = needs_sccat(data.sccat, head.sc) -- If that wasn't given, check the default sccat at the language level for the lang code. if this_needs_sccat == nil and not is_varform_only then this_needs_sccat = needs_sccat(default_sccat[langcode], head.sc) end -- If that wasn't found and the lang code is an etym code, check the default sccat at the parent language level. if this_needs_sccat == nil and not is_varform_only and langcode ~= full_langcode then this_needs_sccat = needs_sccat(default_sccat[full_langcode], head.sc) end if this_needs_sccat then insert(data.categories, full_langname .. " " .. data.pos_category .. " in " .. head.sc:getDisplayForm(data.lang)) end end end -- Reconstructed terms often use weird combinations of scripts and realistically aren't spelled so much as notated. if namespace ~= "Reconstruction" and not is_varform_only then -- Map from languages to a string containing the characters to ignore when considering whether a term has -- multiple written scripts in it. Typically these are Greek or Cyrillic letters used for their phonetic -- values. local characters_to_ignore = { ["aaq"] = "αάὰ", -- Penobscot (Algonquian) ["acy"] = "δθ", -- Cypriot Arabic ["aez"] = "β", -- Aeka (Trans-New Guinea) ["anc"] = "γ", -- Ngas (Chadic/Afroasiatic) ["aou"] = "χ", -- A'ou (Kra-Dai) ["art-blk"] = "ч", -- Bolak (conlang) ["awg"] = "β", -- Anguthimri (Pama-Nyungan) ["az"] = "ь", -- Azerbaijani (Turkic; Yañalif Latin spelling, c. 1928 - 1938) ["ba"] = "ь", -- Bashkir (Turkic; Yañalif Latin spelling, c. 1928 - 1938) ["bhp"] = "β", -- Bima (Austronesian) ["bjz"] = "β", -- Baruga (Trans-New Guinea) ["byk"] = "θ", -- Biao (Kra-Dai) ["cdy"] = "θ", -- Chadong (Kra-Dai) ["chp"] = "θ", -- Chipewyan (Athabaskan) ["cjh"] = "χ", -- Upper Chehalis (Salishan) ["clm"] = "χ", -- Klallam (Salishan) ["col"] = "χ", -- Colombia-Wenatchi (Salishan) ["coo"] = "χθ", -- Comox (Salishan) ["crx"] = "θ", -- Carrier (Athabaskan) ["ets"] = "θ", -- Yekhee (Edoid/Niger-Congo) ["ett"] = "χ", -- Etruscan (isolate; in romanizations) ["fla"] = "χ", -- Montana Salish (Salishan) ["grt"] = "་", -- Garo (South Asian Sino-Tibetan) ["gmw-gts"] = "χ", -- Gottscheerish (Bavarian variant spoken in Slovenia) ["hur"] = "χθ", -- Halkomelem (Salishan) ["itc-psa"] = "f", -- Pre-Samnite (Italic; normally written in Greek) ["izh"] = "ь", -- Ingrian (Finnic) ["kic"] = "θ", -- Kickapoo (Algonquian) ["kk"] = "ь", -- Kazakh (Turkic; Yañalif Latin spelling, c. 1928 - 1938) ["ky"] = "ь", -- Kyrgyz (Turkic; Yañalif Latin spelling, c. 1928 - 1938) ["lil"] = "χ", -- Lillooet (Salishan) ["lsi"] = "ꓹ", -- Lashi (Lolo-Burmese/Sino-Tibetan; represents a glottal stop) ["mhz"] = "β", -- Mor (Austronesian) ["mqn"] = "β", -- Moronene (Austronesian) ["neg"]= "ӡā", -- Negidal (Tungusic; normally in Cyrillic) ["oka"] = "χ", -- Okanagan (Salishan) ["ole"] = "θ", -- Olekha (Sino-Tibetan) ["oui"] = "γβ", -- Old Uyghur (Turkic; FIXME: others? E.g. Greek delta (δ)?) ["pox"] = "χ", -- Polabian (West Slavic) ["rif"] = "ε", -- Tarifit (Berber) ["rom"] = "Θθ", -- Romani (Indic: International Standard; two different thetas???) ["rpn"] = "β", -- Repanbitip (Austronesian) ["sah"] = "ь", -- Yakut (Turkic; 1929 - 1939 Latin spelling) ["sit-jap"] = "χ", -- Japhug (Sino-Tibetan) ["sjw"] = "θ", -- Shawnee (Algonquian) ["squ"] = "χ", -- Squamish (Salishan) ["str"] = "χθ", -- Saanich (Salishan) ["teh"] = "χ", -- Tehuelche (Chonan; spoken in Argentina) ["tep"] = "η", -- Tepecano (Uto-Aztecan) ["thp"] = "χ", -- Thompson (Salishan) ["tk"] = "ь", -- Turkmen (Turkic; Yañalif Latin spelling, c. 1928 - 1938) ["tt"] = "ь", -- Kazakh (Turkic; Yañalif Latin spelling, c. 1928 - 1938) ["twa"] = "χ", -- Twana (Salishan) ["wbl"] = "ы", -- Wakhi (Iranian) ["xbc"] = "ϸ", -- Bactrian (Iranian; represents š; normally written in Greek) ["yha"] = "θ", -- Baha (Kra-Dai) ["za"] = "зч", -- Zhuang (Tai/Kra-Dai); 1957-1982 alphabet used two Cyrillic letters (as well as some others like -- ƃ, ƅ, ƨ, ɯ and ɵ that look like Cyrillic or Greek but are actually Latin) ["zlw-slv"] = "χђћ", -- Slovincian (West Slavic; FIXME: χ is Greek, the other two are Cyrillic, but I'm not sure -- the currect characters are being chosen in the entry names) ["zng"] = "θ", -- Mang (Mon-Khmer) ["ztp"] = "θ", -- Loxicha Zapotec (Zapotecan) } -- Determine how many real scripts are found in the pagename, where we exclude symbols and such. We exclude -- scripts whose `character_category` is false as well as Zmth (mathematical notation symbols), which has a -- category of "Mathematical notation symbols". When counting scripts, we need to elide language-specific -- variants because e.g. Beng and as-Beng have slightly different characters but we don't want to consider them -- two different scripts (e.g. [[এৰ]] has two characters which are detected respectively as Beng and as-Beng). local seen_scripts = {} local num_seen_scripts = 0 local num_loops = 0 local canon_pagename = page.pagename local ch_to_ignore = characters_to_ignore[full_langcode] if ch_to_ignore then canon_pagename = ugsub(canon_pagename, "[" .. ch_to_ignore .. "]", "") end while true do if canon_pagename == "" or num_seen_scripts >= 2 or num_loops >= 10 then break end -- Make sure we don't get into a loop checking the same script over and over again; happens with e.g. [[ᠪᡳ]] num_loops = num_loops + 1 local pagename_script = find_best_script_without_lang(canon_pagename, "None only as last resort") local script_chars = pagename_script.characters if not script_chars then -- we are stuck; this happens with None break end local script_code = pagename_script:getCode() local replaced canon_pagename, replaced = ugsub(canon_pagename, "[" .. script_chars .. "]", "") if ( replaced and script_code ~= "Zmth" and (script_data or get_script_data())[script_code] and script_data[script_code].character_category ~= false ) then script_code = script_code:gsub("^.-%-", "") if not seen_scripts[script_code] then seen_scripts[script_code] = true num_seen_scripts = num_seen_scripts + 1 end end end if num_seen_scripts > 1 then insert(data.categories, full_langname .. " टर्म कई लिपियों में लिखे जाने वाले") end end -- Categorise for unusual characters. Takes into account combining characters, so that we can categorise for characters with diacritics that aren't encoded as atomic characters (e.g. U̠). These can be in two formats: single combining characters (i.e. character + diacritic(s)) or double combining characters (i.e. character + diacritic(s) + character). Each can have any number of diacritics. local standard = data.lang:getStandardCharacters() if not is_varform_only and standard and not non_categorizable(page.full_raw_pagename) then local function char_category(char) local specials = { ["#"] = "number sign", ["("] = "parentheses", [")"] = "parentheses", ["<"] = "angle brackets", [">"] = "angle brackets", ["["] = "square brackets", ["]"] = "square brackets", ["_"] = "underscore", ["{"] = "braces", ["|"] = "vertical line", ["}"] = "braces", ["ß"] = "ẞ", ["\205\133"] = "", -- this is UTF-8 for U+0345 ( ͅ) ["\239\191\189"] = "replacement character", } char = toNFD(char) :gsub(".[\128-\191]*", function(m) local new_m = specials[m] new_m = new_m or m:uupper() return new_m end) return toNFC(char) end if full_langcode ~= "hi" and full_langcode ~= "lo" then local standard_chars_scripts = {} for _, head in ipairs(data.heads) do standard_chars_scripts[head.sc:getCode()] = true end -- Iterate over the scripts, in case there is more than one (as they can have different sets of standard characters). for code in pairs(standard_chars_scripts) do local sc_standard = data.lang:getStandardCharacters(code) if sc_standard then if page.pagename_len > 1 then local explode_standard = {} local function explode(char) explode_standard[char] = true return "" end local sc_standard_exploded = ugsub(sc_standard, page.comb_chars.combined_double, explode) -- The following is correct; it relies on side-effecing the explode_standard[] table. ugsub(sc_standard_exploded, page.comb_chars.combined_single, explode):gsub(".[\128-\191]*", explode) local num_cat_inserted for char in pairs(page.explode_pagename) do if not explode_standard[char] then if char:find("[0-9]") then if not num_cat_inserted then insert(data.categories, full_langname .. " terms spelled with numbers") num_cat_inserted = true end elseif ufind(char, page.emoji_pattern) then insert(data.categories, full_langname .. " terms spelled with emoji") else local upper = char_category(char) if not explode_standard[upper] then char = upper end insert(data.categories, full_langname .. " terms spelled with " .. char) end end end end -- If a diacritic doesn't appear in any of the standard characters, also categorise for it generally. sc_standard = toNFD(sc_standard) for diacritic in ugmatch(page.decompose_pagename, page.comb_chars.diacritics_single) do if not umatch(sc_standard, diacritic) then insert(data.categories, full_langname .. " terms spelled with ◌" .. diacritic) end end for diacritic in ugmatch(page.decompose_pagename, page.comb_chars.diacritics_double) do if not umatch(sc_standard, diacritic) then insert(data.categories, full_langname .. " terms spelled with ◌" .. diacritic .. "◌") end end end end -- Ancient Greek, Hindi and Lao handled the old way for now, as their standard chars still need to be converted to the new format (because there are a lot of them). elseif ulen(page.pagename) ~= 1 then for character in ugmatch(page.pagename, "([^" .. standard .. "])") do local upper = char_category(character) if not umatch(upper, "[" .. standard .. "]") then character = upper end insert(data.categories, full_langname .. " terms spelled with " .. character) end end end if not is_varform_only and data.heads[1].sc:isSystem("alphabet") then local pagename, i = page.pagename:ulower(), 2 while umatch(pagename, "(%a)" .. ("%1"):rep(i)) do i = i + 1 insert(data.categories, full_langname .. " terms with " .. i .. " consecutive instances of the same letter") end end -- Categorise for palindromes if not is_varform_only and not data.nopalindromecat and namespace ~= "Reconstruction" and ulen(page.pagename) > 2 -- FIXME: Use of first script here seems hacky. What is the clean way of doing this in the presence of -- multiple scripts? and is_palindrome(page.pagename, data.lang, data.heads[1].sc) then insert(data.categories, full_langname .. " पैलिंड्रोम") end if namespace == "" and not lang_reconstructed then for _, head in ipairs(data.heads) do if page.full_raw_pagename ~= get_link_page(remove_links(head.term), data.lang, head.sc) then -- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/pagename spelling mismatch]] -- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/pagename spelling mismatch/LANGCODE]] track("pagename spelling mismatch", data.lang) break end end end -- Add red link category if called for and we're not a "large" page, where such checks are disabled. if data.checkredlinks and not m_headword_data.large_pages[m_headword_data.pagename] then local plposcat = type(data.checkredlinks) == "string" and data.checkredlinks or data.pos_category check_red_link_inflections_top_level(data, plposcat) end -- Add to various maintenance categories. export.maintenance_cats(page, data.lang, data.categories, data.whole_page_categories) ------------ 10. Format and return headwords, genders, inflections and categories. ------------ -- Format and return all the gathered information. This may add more categories (e.g. gender/number categories), -- so make sure we do it before evaluating `data.categories`. local text = '<span class="headword-line">' .. format_headword(data) .. format_headword_genders(data, is_varform_only) .. format_top_level_inflections(data) .. '</span>' -- Language-specific categories. local cats = format_categories( data.categories, data.lang, data.sort_key, page.encoded_pagename, data.force_cat_output or test_force_categories, data.heads[1].sc ) -- Language-agnostic categories. local whole_page_cats = format_categories( data.whole_page_categories, nil, "-" ) return text .. cats .. whole_page_cats end return export 6w0fzb98z3jh236evvb6anqlkjvqe0j मॉड्यूल:headword/data 828 302138 487802 487582 2026-09-02T18:37:11Z SM7 6218 पार्ट्स ऑफ़ स्पीच में अंग्रेजी को alias बनाया और हिंदी नाम को मुख्य नाम रखा 487802 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", "लघुरूप", "विशेषण", "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", "संज्ञाएँ", "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", "चिह्न", "क्रियाएँ", } --[==[ 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: Languages where we track all direct uses of {{tl|head}} in place of a language-specific template, such as {{tl|en-head}}, {{tl|hi-head}}, {{tl|sa-head}}, {{tl|tl-head}}. ]==] data.track_head_template = list_to_set{ -- "en", -- when the time comes? "hi", "sa", "tl", } --[==[ var: List of script codes for which a script-tagged display title will be added. ]==] data.toBeTagged = list_to_set{ "Ahom", "Arab", "fa-Arab", "Aran", "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", "Gujr", "Guru", "Hang", "Hani", "Hano", "Hebr", "Hira", "Hluw", "Ital", "Java", "Kali", "Kana", "Khar", "Khmr", "Knda", "Kthi", "Lana", "Laoo", "Latn", "Latf", "Latg", "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: 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. If the value on the right-hand side is {true}, such categories will be generated for all scripts. If {false}, no categories will be generated (this is useful for etym languages that override the spec of their parent). If a list of scripts, such categories will be generated only for the specified scripts. If a list of scripts where the first element is {"not"}, such categories will be generated for all scripts ''except'' the specified scripts. ]==] data.default_sccat = { ["af"] = {"not", "Latn"}, ["az"] = {"not", "Latn"}, ["inc-apa"] = true, ["inc-ash"] = true, ["kfr"] = true, ["ks"] = true, ["mr"] = true, ["mwr"] = true, ["inc-oaw"] = true, ["inc-ohi"] = true, ["omr"] = true, ["inc-opa"] = true, ["phr"] = true, ["pi"] = true, ["pra"] = true, ["sa"] = true, ["skr"] = true, ["sd"] = true, ["yi"] = {"not", "Hebr"}, } --[==[ 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", infin = "infinitive", -- not inf, which is ambiguous due to infixes int = "interjection", interj = "interjection", intj = "interjection", n = "संज्ञाएँ", nouns = "संज्ञाएँ", 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 = "क्रियाएँ", 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", ["suffixes"] = "प्रत्यय", -- We include verbs because impf and pf are valid "genders". ["क्रियाएँ"] = "क्रियायें", } --[==[ 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 iiga4g8sq7ftugbvlu4lt6e4ocdv5ct मॉड्यूल:etymology 828 302144 487878 478039 2026-09-03T10:10:27Z SM7 6218 updating... 487878 Scribunto text/plain local export = {} -- For testing local force_cat = false local debug_track_module = "Module:debug/track" local languages_module = "Module:languages" local links_module = "Module:links" local pron_qualifier_module = "Module:pron qualifier" local table_module = "Module:table" local utilities_module = "Module:utilities" local concat = table.concat local insert = table.insert local new_title = mw.title.new local function debug_track(...) debug_track = require(debug_track_module) return debug_track(...) end local function format_categories(...) format_categories = require(utilities_module).format_categories return format_categories(...) end local function format_qualifiers(...) format_qualifiers = require(pron_qualifier_module).format_qualifiers return format_qualifiers(...) end local function full_link(...) full_link = require(links_module).full_link return full_link(...) end local function get_language_data_module_name(...) get_language_data_module_name = require(languages_module).getDataModuleName return get_language_data_module_name(...) end local function get_link_page(...) get_link_page = require(links_module).get_link_page return get_link_page(...) end local function language_link(...) language_link = require(links_module).language_link return language_link(...) end local function serial_comma_join(...) serial_comma_join = require(table_module).serialCommaJoin return serial_comma_join(...) end local function shallow_copy(...) shallow_copy = require(table_module).shallowCopy return shallow_copy(...) end local function track(page, code) local tracking_page = "etymology/" .. page debug_track(tracking_page) if code then debug_track(tracking_page .. "/" .. code) end end local function join_segs(segs, conj) if not segs[2] then return segs[1] elseif conj == "and" or conj == "or" then return serial_comma_join(segs, {conj = conj}) end local sep if conj == "," or conj == ";" then sep = conj .. " " elseif conj == "/" then sep = "/" elseif conj == "~" then sep = " ~ " elseif conj then error(("Internal error: Unrecognized conjunction \"%s\""):format(conj)) else error(("Internal error: No value supplied for conjunction"):format(conj)) end return concat(segs, sep) end -- Returns true if `lang` is the same as `source`, or a variety of it. local function lang_is_source(lang, source) return lang:getCode() == source:getCode() or lang:hasParent(source) end --[==[ Format one or more links as specified in `termobjs`, a list of term objects of the format accepted by `full_link()` in [[Module:links]], additionally with optional qualifiers, labels and references. `conj` is used to join multiple terms and must be specified if there is more than one term. `template_name` is the template name used in debug tracking and must be specified. Optional `sourcetext` is text to prepend to the concatenated terms, separated by a space if the concatenated terms are non-empty (which is always the case unless there is a single term with the value "-"). If `qualifiers_labels_on_outside` is given, any qualifiers, labels or references specified in the first term go on the outside of (i.e before) `sourcetext`; otherwise they will end up on the inside. ]==] function export.format_links(termobjs, conj, template_name, sourcetext, qualifiers_labels_on_outside) if not template_name then error("Internal error: Must specify `template_name` to format_links()") end for i, termobj in ipairs(termobjs) do if termobj.lang:hasType("family") or termobj.lang:getFamilyCode() == "qfa-sub" then if termobj.term and termobj.term ~= "-" then debug_track(template_name .. "/family-with-term") end termobj.term = "-" end if termobj.term == "-" then --[=[ [[Special:WhatLinksHere/Wiktionary:Tracking/cognate/no-term]] [[Special:WhatLinksHere/Wiktionary:Tracking/derived/no-term]] [[Special:WhatLinksHere/Wiktionary:Tracking/borrowed/no-term]] [[Special:WhatLinksHere/Wiktionary:Tracking/calque/no-term]] ]=] debug_track(template_name .. "/no-term") termobjs[i] = i == 1 and sourcetext or "" else if i == 1 and qualifiers_labels_on_outside and sourcetext then termobj.pretext = sourcetext .. " " sourcetext = nil end termobjs[i] = (i == 1 and sourcetext and sourcetext .. " " or "") .. full_link(termobj, "term", nil, "show qualifiers") end end return join_segs(termobjs, conj) end function export.get_display_and_cat_name(source, raw) local display, cat_name if source:getCode() == "und" then display = "undetermined" cat_name = "other languages" elseif source:getCode() == "mul" then display = raw and "translingual" or "[[w:Translingualism|translingual]]" cat_name = "Translingual" elseif source:getCode() == "mul-tax" then display = raw and "taxonomic name" or "[[w:Biological nomenclature|taxonomic name]]" cat_name = "taxonomic names" else display = raw and source:getCanonicalName() or source:makeWikipediaLink() cat_name = source:getDisplayForm() end return display, cat_name end function export.insert_source_cat_get_display(data) local categories, lang, source = data.categories, data.lang, data.source local display, cat_name = export.get_display_and_cat_name(source, data.raw) if lang and not data.nocat then -- Add the category, but only if there is a current language if not categories then categories = {} end local langname = lang:getFullName() -- If `lang` is an etym-only language, we need to check both it and its parent full language against `source`. -- Otherwise if e.g. `lang` is Medieval Latin and `source` is Latin, we'll end up wrongly constructing a -- category 'Latin terms derived from Latin'. insert(categories, langname .. ( lang_is_source(lang, source) and " terms borrowed back into " .. cat_name or " " .. (data.borrowing_type or "terms derived") .. " from " .. cat_name )) end return display, categories end function export.format_source(data) local lang, sort_key = data.lang, data.sort_key -- [[Special:WhatLinksHere/Wiktionary:Tracking/etymology/sortkey]] if sort_key then track("sortkey") end local display, categories = export.insert_source_cat_get_display(data) if lang and not data.nocat then -- Format categories, but only if there is a current language; {{cog}} currently gets no categories categories = format_categories(categories, lang, sort_key, nil, data.force_cat or force_cat) else categories = "" end return "<span class=\"etyl\">" .. display .. categories .. "</span>" end --[==[ Format sources for etymology templates such as {{tl|bor}}, {{tl|der}}, {{tl|inh}} and {{tl|cog}}. There may potentially be more than one source language (except currently {{tl|inh}}, which doesn't support it because it doesn't really make sense). In that case, all but the last source language is linked to the first term, but only if there is such a term and this linking makes sense, i.e. either (1) the term page exists after stripping diacritics according to the source language in question, or (2) the result of stripping diacritics according to the source language in question results in a different page from the same process applied with the last source language. For example, {{m|ru|соля́нка}} will link to [[солянка]] but {{m|en|соля́нка}} will link to [[соля́нка]] with an accent, and since they are different pages, the use of English as a non-final source with term 'соля́нка' will link to [[соля́нка]] even though it doesn't exist, on the assumption that it is merely a redlink that might exist. If none of the above criteria apply, a non-final source language will be linked to the Wikipedia entry for the language, just as final source languages always are. `data` contains the following fields: * `lang`: The destination language object into which the terms were borrowed, inherited or otherwise derived. Used for categorization and can be nil, as with {{tl|cog}}. * `sources`: List of source objects. Most commonly there is only one. If there are multiple, the non-final ones are handled specially; see above. * `terms`: List of term objects. Most commonly there is only one. If there are multiple source objects as well as multiple term objects, the non-final source objects link to the first term object. * `sort_key`: Sort key for categories. Usually nil. * `categories`: Categories to add to the page. Additional categories may be added to `categories` based on the source languages ('''in which case `categories` is destructively modified'''). If `lang` is nil, no categories will be added. * `nocat`: Don't add any categories to the page. * `sourceconj`: Conjunction used to separate multiple source languages. Defaults to {"and"}. Currently recognized values are `and`, `or`, `,`, `;`, `/` and `~`. * `borrowing_type`: Borrowing type used in categories, such as {"learned borrowings"}. Defaults to {"terms derived"}. * `force_cat`: Force category generation on non-mainspace pages. ]==] function export.format_sources(data) local lang, sources, terms, borrowing_type, sort_key, categories, nocat = data.lang, data.sources, data.terms, data.borrowing_type, data.sort_key, data.categories, data.nocat local term1, sources_n, source_segs = terms[1], #sources, {} local final_link_page local term1_term, term1_sc = term1.term, term1.sc if sources_n > 1 and term1_term and term1_term ~= "-" then final_link_page = get_link_page(term1_term, sources[sources_n], term1_sc) end for i, source in ipairs(sources) do local seg, display_term if i < sources_n and term1_term and term1_term ~= "-" then local link_page = get_link_page(term1_term, source, term1_sc) display_term = (link_page ~= final_link_page) or (link_page and not not new_title(link_page):getContent()) end -- TODO: if the display forms or transliterations are different, display the terms separately. if display_term then local display, this_cats = export.insert_source_cat_get_display{ lang = lang, source = source, borrowing_type = borrowing_type, raw = true, categories = categories, nocat = nocat, } seg = language_link { lang = source, term = term1_term, alt = display, tr = "-", } if lang and not nocat then -- Format categories, but only if there is a current language; {{cog}} currently gets no categories this_cats = format_categories(this_cats, lang, sort_key, nil, data.force_cat or force_cat) else this_cats = "" end seg = "<span class=\"etyl\">" .. seg .. this_cats .. "</span>" else seg = export.format_source{ lang = lang, source = source, borrowing_type = borrowing_type, sort_key = sort_key, categories = categories, nocat = nocat, } end insert(source_segs, seg) end return join_segs(source_segs, data.sourceconj or "and") end -- Internal implementation of {{cognate}}/{{cog}} template. function export.format_cognate(data) return export.format_derived { sources = data.sources, terms = data.terms, sort_key = data.sort_key, sourceconj = data.sourceconj, conj = data.conj, template_name = "cognate", force_cat = data.force_cat, } end --[==[ Internal implementation of {{derived}}/{{der}} template. This dispThis is called externally from [[Module:affix]], [[Module:affixusex]] and [[Module:see]] and needs to support qualifiers, labels and references on the outside of the sources for use by those modules. `data` contains the following fields: * `lang`: The destination language object into which the terms were derived. Used for categorization and can be nil, as with {{tl|cog}}; in this case, no categories are added. * `sources`: List of source objects. Most commonly there is only one. If there are multiple, the non-final ones are handled specially; see `format_sources()`. * `terms`: List of term objects. Most commonly there is only one. If there are multiple source objects as well as multiple term objects, the non-final source objects link to the first term object. * `conj`: Conjunction used to separate multiple terms. '''Required'''. Currently recognized values are `and`, `or`, `,`, `;`, `/` and `~`. * `sourceconj`: Conjunction used to separate multiple source languages. Defaults to {"and"}. Currently recognized values are as for `conj` above. * `qualifiers_labels_on_outside`: If specified, any qualifiers, labels or references in the first term in `terms` will be displayed on the outside of (before) the source language(s) in `sources`. Normally this should be specified if there is only one term possible in `terms`. * `template_name`: Name of the template invoking this function. Must be specified. Only used for tracking pages. * `sort_key`: Sort key for categories. Usually nil. * `categories`: Categories to add to the page. Additional categories may be added to `categories` based on the source languages ('''in which case `categories` is destructively modified'''). If `lang` is nil, no categories will be added. * `nocat`: Don't add any categories to the page. * `borrowing_type`: Borrowing type used in categories, such as {"learned borrowings"}. Defaults to {"terms derived"}. * `force_cat`: Force category generation on non-mainspace pages. ]==] function export.format_derived(data) local terms = data.terms local sourcetext = export.format_sources(data) return export.format_links(terms, data.conj, data.template_name, sourcetext, data.qualifiers_labels_on_outside) end function export.insert_borrowed_cat(categories, lang, source) if lang_is_source(lang, source) then return end -- If both are the same, we want e.g. [[:Category:English terms borrowed back into English]] not -- [[:Category:English terms borrowed from English]]; the former is inserted automatically by format_source(). -- The second parameter here doesn't matter as it only affects `display`, which we don't use. insert(categories, lang:getFullName() .. " terms borrowed from " .. select(2, export.get_display_and_cat_name(source, "raw"))) end -- Internal implementation of {{borrowed}}/{{bor}} template. function export.format_borrowed(data) local categories = {} if not data.nocat then local lang = data.lang for _, source in ipairs(data.sources) do export.insert_borrowed_cat(categories, lang, source) end end data = shallow_copy(data) data.categories = categories return export.format_links(data.terms, data.conj, "borrowed", export.format_sources(data)) end do -- Generate the non-ancestor error message. local function show_language(lang) local retval = ("%s (%s)"):format(lang:makeCategoryLink(), lang:getCode()) if lang:hasType("etymology-only") then retval = retval .. (" (an etymology-only language whose regular parent is %s)"):format( show_language(lang:getParent())) end return retval end -- Check that `lang` has `otherlang` (which may be an etymology-only language) as an ancestor. Throw an error if -- not. When `lang` is a family, verifies that `otherlang` is a language in that family. function export.check_ancestor(lang, otherlang) -- When `lang` is a family, verify `otherlang` is in that family or in its parent family. if lang.hasType and lang:hasType("family") then local family_code = lang:getCode() local function in_family_code(fcode, other) if not fcode or fcode == "" then return false end if other.inFamily and other:inFamily(fcode) then return true end if other.getFamilyCode and other:getFamilyCode() == fcode then return true end return false end local in_family = in_family_code(family_code, otherlang) if not in_family then local parent_code if lang.getParent then local parent_family = lang:getParent() if parent_family and parent_family.getCode then parent_code = parent_family:getCode() end end if not parent_code and family_code:find("-", 1, true) then parent_code = family_code:match("^(.+)-[^-]+$") end if parent_code then in_family = in_family_code(parent_code, otherlang) end end if not in_family then local other_display = (otherlang.getCanonicalName and otherlang:getCanonicalName()) or (otherlang.getCode and otherlang:getCode()) or tostring(otherlang) local fam_display = (lang.getCanonicalName and lang:getCanonicalName()) or family_code error(("%s is not in family %s; inherited ancestor under a family must be a language in that family or its parent family.") :format(other_display, fam_display)) end return end -- FIXME: I don't know if this function works correctly with etym-only languages in `lang`. I have fixed up -- the module link code appropriately (June 2024) but the remaining logic is untouched. if lang:hasAncestor(otherlang) then -- [[Special:WhatLinksHere/Wiktionary:Tracking/etymology/variety]] -- Track inheritance from varieties of Latin that shouldn't have any descendants (everything except Old Latin, Classical Latin and Vulgar Latin). if otherlang:getFullCode() == "la" then otherlang = otherlang:getCode() if not (otherlang == "itc-ola" or otherlang == "la-cla" or otherlang == "la-vul") then track("bad ancestor", otherlang) end end return end local ancestors, postscript = lang:getAncestors() local etym_module_link = lang:hasType("etymology-only") and "[[Module:etymology languages/data]] or " or "" local module_link = "[[" .. get_language_data_module_name(lang:getFullCode()) .. "]]" if not ancestors[1] then postscript = show_language(lang) .. " has no ancestors." else local ancestor_list = {} for _, ancestor in ipairs(ancestors) do insert(ancestor_list, show_language(ancestor)) end postscript = ("The ancestor%s of %s %s %s."):format( ancestors[2] and "s" or "", lang:getCanonicalName(), ancestors[2] and "are" or "is", concat(ancestor_list, " and ")) end error(("%s is not set as an ancestor of %s in %s%s. %s") :format(show_language(otherlang), show_language(lang), etym_module_link, module_link, postscript)) end end -- Internal implementation of {{inherited}}/{{inh}} template. function export.format_inherited(data) local lang, terms, nocat = data.lang, data.terms, data.nocat local source = terms[1].lang local categories = {} if not nocat then insert(categories, lang:getFullName() .. " terms inherited from " .. source:getCanonicalName()) end export.check_ancestor(lang, source) data = shallow_copy(data) data.categories = categories data.source = source return export.format_links(terms, data.conj, "inherited", export.format_source(data)) end -- Internal implementation of "misc variant" templates such as {{abbrev}}, {{clipping}}, {{reduplication}} and the like. function export.format_misc_variant(data) local lang, notext, terms, cats, parts = data.lang, data.notext, data.terms, data.cats, {} if not notext then insert(parts, data.text) end if terms[1] then if not notext then -- FIXME: If term is given as '-', we should consider displaying just "Clipping" not "Clipping of". insert(parts, " " .. (data.oftext or "of")) end local termparts = {} -- Make links out of all the parts. for _, termobj in ipairs(terms) do local result if termobj.lang then result = export.format_derived { lang = lang, terms = {termobj}, sources = termobj.termlangs or {termobj.lang}, template_name = "misc_variant", qualifiers_labels_on_outside = true, force_cat = data.force_cat, } else termobj.lang = lang result = export.format_links({termobj}, nil, "misc_variant") end table.insert(termparts, result) end local linktext = join_segs(termparts, data.conj) if not notext and linktext ~= "" then insert(parts, " ") end insert(parts, linktext) end local categories = {} if not data.nocat and cats then for _, cat in ipairs(cats) do insert(categories, lang:getFullName() .. " " .. cat) end end if categories[1] then insert(parts, format_categories(categories, lang, data.sort_key, nil, data.force_cat or force_cat)) end return concat(parts) end -- Implementation of miscellaneous templates such as {{unknown}} and {{onomatopoeia}} that have no associated terms. function export.format_misc_variant_no_term(data) local parts = {} if not data.notext then insert(parts, data.title) end if not data.nocat and data.cat then local lang, categories = data.lang, {} insert(categories, lang:getFullName() .. " " .. data.cat) insert(parts, format_categories(categories, lang, data.sort_key, nil, data.force_cat or force_cat)) end return concat(parts) end return export 719oqh4cehi6zb4y8xnbsb9vtnae84e मॉड्यूल:etymology/templates 828 302145 487880 487665 2026-09-03T10:12:02Z SM7 6218 updating... 487880 Scribunto text/plain local export = {} local require_when_needed = require("Module:require when needed") local get_current_L2 = require_when_needed("Module:pages", "get_current_L2") local get_lang_by_name = require_when_needed("Module:languages", "getByCanonicalName") local is_content_page = require_when_needed("Module:pages", "is_content_page") local process_params = require_when_needed("Module:parameters", "process") local trim = mw.text.trim local lower = mw.ustring.lower local etymology_module = "Module:etymology" local headword_data_module = "Module:headword/data" local etymology_specialized_module = "Module:etymology/specialized" local parameter_utilities_module = "Module:parameter utilities" -- For testing local force_cat = false local allowed_conjs = {"and", "or", ",", "/", "~", ";"} -- Sinitic lects (Mandarin, Cantonese, Hokkien, etc.) are full languages, but Chinese entries sit -- under a single ==Chinese== L2, while romanization entries (pinyin, jyutping, pe̍h-ōe-jī) have lect -- L2s, and content is often shared between them. Contact languages (Chinese-based creoles and mixed -- languages) have their own L2s and are excluded. local function is_sinitic(lang) return lang:inFamily("zhx") and not lang:inFamily("qfa-cnt") end local content_page local function is_content_page_cached() if content_page == nil then content_page = is_content_page(mw.title.getCurrentTitle()) end return content_page end -- Throw an error if `lang` (the language of the entry) doesn't match -- the L2 header that the template is invoked under. local function check_lang_matches_L2(lang, nocat) if nocat or not lang or lang:getCode() == "und" or (lang.hasType and lang:hasType("family")) then return end local headword_data = mw.loadData(headword_data_module) if headword_data.large_pages[headword_data.pagename] then return end if not is_content_page_cached() then return end local current_L2 = get_current_L2() if not current_L2 then return end local full_name = lang:getFullName() if full_name == current_L2 then return end -- Accept any Sinitic language under any Sinitic L2. if is_sinitic(lang) then local L2_lang = get_lang_by_name(current_L2) if L2_lang and is_sinitic(L2_lang) then return end end local lang_desc = lang:getCode() .. " (" .. lang:getCanonicalName() .. ")" if lang:getFullCode() ~= lang:getCode() then lang_desc = lang_desc .. ", an etymology-only language whose full language is " .. lang:getFullCode() .. " (" .. full_name .. ")" end error("Language '" .. lang_desc .. "' does not match the L2 header (" .. current_L2 .. ").") end local function parse_etym_args(parent_args, base_params, has_dest_lang) local m_param_utils = require(parameter_utilities_module) local param_mods = m_param_utils.construct_param_mods { {group = {"link", "q", "l", "ref"}}, } local sourcearg, termarg if has_dest_lang then sourcearg, termarg = 2, 3 else sourcearg, termarg = 1, 2 end local terms, args = m_param_utils.parse_term_with_inline_modifiers_and_separate_params { params = base_params, param_mods = param_mods, raw_args = parent_args, termarg = termarg, track_module = "etymology", lang = function(args) return args[sourcearg][#args[sourcearg]] end, sc = "sc", -- Don't do this, doesn't seem to make sense. -- parse_lang_prefix = true, make_separate_g_into_list = true, splitchar = ",", subitem_param_handling = "last", } -- If term param 3= is empty, there will be no terms in terms.terms. To facilitate further code and for -- compatibility,, insert one. It will display as <small>[Term?]</small>. if not terms.terms[1] then terms.terms[1] = { lang = args[sourcearg][#args[sourcearg]], sc = args.sc, } end return terms.terms, args end function export.parse_2_lang_args(parent_args, has_text, no_family) local boolean = {type = "boolean"} local params = { [1] = { required = true, type = "language", default = "und" }, [2] = { required = true, sublist = true, type = "language", family = not no_family, default = "und" }, [3] = true, [4] = {alias_of = "alt"}, [5] = {alias_of = "t"}, ["senseid"] = true, ["nocat"] = boolean, ["sort"] = true, ["sourceconj"] = true, ["conj"] = {set = allowed_conjs, default = ","}, } if has_text then params["notext"] = boolean params["nocap"] = boolean end local terms, args = parse_etym_args(parent_args, params, "has dest lang") check_lang_matches_L2(args[1], args.nocat) return terms, args end -- Implementation of deprecated {{etyl}}. Provided to make histories more legible. function export.etyl(frame) local params = { [1] = {required = true, type = "language", default = "und"}, [2] = {type = "language", default = "en"}, ["sort"] = {}, } -- Empty language means English, but "-" means no language. Yes, confusing... local args = frame:getParent().args if args[2] and trim(args[2]) == "-" then params[2] = nil args = process_params({ [1] = args[1], ["sort"] = args.sort }, params) else args = process_params(args, params) end check_lang_matches_L2(args[2]) return require(etymology_module).format_source { lang = args[2], source = args[1], sort_key = args.sort, force_cat = force_cat, } end -- Implementation of {{derived}}/{{der}}. function export.derived(frame) local parent_args = frame:getParent().args local terms, args = export.parse_2_lang_args(parent_args) return require(etymology_module).format_derived { lang = args[1], sources = args[2], terms = terms, sort_key = args.sort, nocat = args.nocat, sourceconj = args.sourceconj, conj = args.conj, template_name = "derived", force_cat = force_cat, } end -- Implementation of {{borrowed}}/{{bor}}. function export.borrowed(frame) local parent_args = frame:getParent().args local terms, args = export.parse_2_lang_args(parent_args) return require(etymology_module).format_borrowed { lang = args[1], sources = args[2], terms = terms, sort_key = args.sort, nocat = args.nocat, sourceconj = args.sourceconj, conj = args.conj, force_cat = force_cat, } end function export.inherited(frame) local parent_args = frame:getParent().args local terms, args = export.parse_2_lang_args(parent_args) local sources = args[2] if sources[2] then -- Because this doesn't really make sense. error("[[Template:inherited]] doesn't support multiple comma-separated sources") end return require(etymology_module).format_inherited { lang = args[1], terms = terms, sort_key = args.sort, nocat = args.nocat, conj = args.conj, force_cat = force_cat, } end function export.cognate(frame) local params = { [1] = { required = true, sublist = true, type = "language", family = true, default = "und" }, [2] = true, [3] = {alias_of = "alt"}, [4] = {alias_of = "t"}, sourceconj = true, ["conj"] = {set = allowed_conjs, default = ","}, sort = true, } local parent_args = frame:getParent().args local terms, args = parse_etym_args(parent_args, params, false) return require(etymology_module).format_cognate { sources = args[1], terms = terms, sort_key = args.sort, sourceconj = args.sourceconj, conj = args.conj, force_cat = force_cat, } end function export.noncognate(frame) return export.cognate(frame) end -- Supports various specialized types of borrowings, according to `frame.args.bortype`: -- "learned" = {{lbor}}/{{learned borrowing}} -- "semi-learned" = {{slbor}}/{{semi-learned borrowing}} -- "orthographic" = {{obor}}/{{orthographic borrowing}} -- "unadapted" = {{ubor}}/{{unadapted borrowing}} -- "calque" = {{cal}}/{{calque}} -- "partial-calque" = {{pcal}}/{{partial calque}} -- "semantic-loan" = {{sl}}/{{semantic loan}} -- "transliteration" = {{translit}}/{{transliteration}} -- "phono-semantic-matching" = {{psm}}/{{phono-semantic matching}} function export.specialized_borrowing(frame) local parent_args = frame:getParent().args local terms, args = export.parse_2_lang_args(parent_args, "has text") local m_etymology_specialized = require(etymology_specialized_module) return m_etymology_specialized.specialized_borrowing { bortype = frame.args.bortype, lang = args[1], sources = args[2], terms = terms, sort_key = args.sort, nocap = args.nocap, notext = args.notext, nocat = args.nocat, sourceconj = args.sourceconj, conj = args.conj, senseid = args.senseid, force_cat = force_cat, } end -- Implementation of miscellaneous templates such as {{abbrev}}, {{back-formation}}, {{clipping}}, {{ellipsis}}, -- {{rebracketing}} and {{reduplication}} that have a single associated term. function export.misc_variant(frame) local iparams = { ["ignore-params"] = true, text = {required = true}, oftext = true, cat = {list = true}, -- allow and compress holes conj = true, } local iargs = process_params(frame.args, iparams) local boolean = {type = "boolean"} local params = { [1] = {required = true, type = "language", default = "und"}, [2] = true, [3] = {alias_of = "alt"}, [4] = {alias_of = "t"}, nocap = boolean, -- should be processed in the template itself notext = boolean, nocat = boolean, conj = {set = allowed_conjs}, sort = true, } -- |ignore-params= parameter to module invocation specifies -- additional parameter names to allow in template invocation, separated by -- commas. They must consist of ASCII letters or numbers or hyphens. local ignore_params = iargs["ignore-params"] if ignore_params then ignore_params = trim(ignore_params) if not ignore_params:match("^[%w%-,]+$") then error("Invalid characters in |ignore-params=: " .. ignore_params:gsub("[%w%-,]+", "")) end for param in ignore_params:gmatch("[%w%-]+") do if params[param] then error("Duplicate param |" .. param .. " in |ignore-params=: already specified in params") end params[param] = true end end local m_param_utils = require(parameter_utilities_module) local param_mods = m_param_utils.construct_param_mods { {group = {"link", "q", "l", "ref"}}, } local parent_args = frame:getParent().args local terms, args = m_param_utils.parse_term_with_inline_modifiers_and_separate_params { params = params, param_mods = param_mods, raw_args = parent_args, termarg = 2, track_module = "etymology", -- Don't set lang here as we want to know whether there was a lang prefix or not. sc = "sc", parse_lang_prefix = true, allow_multiple_lang_prefixes = true, make_separate_g_into_list = true, splitchar = ",", subitem_param_handling = "last", } check_lang_matches_L2(args[1], args.nocat) return require(etymology_module).format_misc_variant { lang = args[1], notext = args.notext, text = iargs.text, oftext = iargs.oftext, terms = terms.terms, sort_key = args.sort, conj = args.conj or iargs.conj or "and", nocat = args.nocat, cats = iargs.cat, force_cat = force_cat, } end -- Implementation of miscellaneous templates such as {{doublet}} that can take multiple terms. Doesn't handle {{blend}} -- or {{univerbation}}, which display + signs between elements and use compound_like in [[Module:affix/templates]]. function export.misc_variant_multiple_terms(frame) local iparams = { text = {required = true}, oftext = true, cat = {list = true}, -- allow and compress holes conj = true, } local iargs = process_params(frame.args, iparams) local boolean = {type = "boolean"} local params = { [1] = {required = true, type = "language", template_default = "und"}, [2] = {list = true, allow_holes = true}, nocap = boolean, -- should be processed in the template itself notext = boolean, nocat = boolean, conj = {set = allowed_conjs}, sort = true, } local m_param_utils = require(parameter_utilities_module) local param_mods = m_param_utils.construct_param_mods { -- We want to require an index for all params. {default = true, require_index = true}, {group = {"link", "q", "l", "ref"}}, } local parent_args = frame:getParent().args local terms, args = m_param_utils.parse_list_with_inline_modifiers_and_separate_params { params = params, param_mods = param_mods, raw_args = parent_args, termarg = 2, parse_lang_prefix = true, allow_multiple_lang_prefixes = true, track_module = "etymology-templates-doublet", disallow_custom_separators = true, -- For compatibility, we need to not skip completely unspecified items. It is common, for example, to do -- {{suffix|lang||foo}} to generate "+ -foo". dont_skip_items = true, -- Don't set lang here as we want to know whether there was a lang prefix or not. sc = "sc.default", } check_lang_matches_L2(args[1], args.nocat) return require(etymology_module).format_misc_variant { lang = args[1], notext = args.notext, text = iargs.text, oftext = iargs.oftext, terms = terms, sort_key = args.sort, conj = args.conj or iargs.conj or "and", nocat = args.nocat, cats = iargs.cat, force_cat = force_cat, } end -- Implementation of miscellaneous templates such as {{unknown}} that have no associated terms. do local function get_args(frame) local boolean = {type = "boolean"} local params = { [1] = {required = true, type = "language", default = "und"}, ["title"] = true, ["nocap"] = boolean, -- should be processed in the template itself ["notext"] = boolean, ["nocat"] = boolean, ["sort"] = true, } if frame.args.title2_alias then params[2] = {alias_of = "title"} end local args = process_params(frame:getParent().args, params) check_lang_matches_L2(args[1], args.nocat) return args end function export.misc_variant_no_term(frame) local args = get_args(frame) return require(etymology_module).format_misc_variant_no_term { lang = args[1], notext = args.notext, title = args.title or frame.args.text, nocat = args.nocat, cat = frame.args.cat, sort_key = args.sort, force_cat = force_cat, } end -- This function works similarly to misc_variant_no_term(), but with some automatic linking to the glossary in -- `title`. function export.onomatopoeia(frame) local args = get_args(frame) local title = args.title if title and (lower(title) == "imitative" or lower(title) == "imitation") then title = "[[Appendix:Glossary#imitative|" .. title .. "]]" end return require(etymology_module).format_misc_variant_no_term { lang = args[1], notext = args.notext, title = title or frame.args.text, nocat = args.nocat, cat = frame.args.cat, sort_key = args.sort, force_cat = force_cat, } end end return export 62uclsg0tnc97nmhtj6qaxzsgsp4laq मॉड्यूल:palindromes 828 302147 487789 477437 2026-09-02T17:20:27Z SM7 6218 updating... 487789 Scribunto text/plain local export = {} local data = mw.loadData("Module:palindromes/data") local function ignoreCharacters(term, lang, sc, langdata) term = mw.ustring.lower(term) term = mw.ustring.gsub(term, "[ ,%.%?!%%%-'\"]", "") -- Language-specific substitutions -- Ignore entire scripts (e.g. romaji in Japanese) if langdata.ignore then sc_name = sc and sc:getCode() or lang:findBestScript(term):getCode() for _, script in ipairs(langdata.ignore) do if script == sc_name then return "" end end end for i, from in ipairs(langdata.from or {}) do term = mw.ustring.gsub(term, from, langdata.to[i] or "") end return term end function export.is_palindrome(term, lang, sc) local langdata = data[lang:getCode()] or data[lang:getFullCode()] or {} -- Affixes aren't palindromes if mw.ustring.find(term, "^%-") or mw.ustring.find(term, "%-$") then return false end -- Remove punctuation and casing term = ignoreCharacters(term, lang, sc, langdata) local len = mw.ustring.len(term) if langdata.allow_repeated_char then -- Ignore single-character terms if len < 2 then return false end else -- Ignore terms that consist of just one character repeated -- This also excludes terms consisting of fewer than 3 characters if term == mw.ustring.rep(mw.ustring.sub(term, 1, 1), len) then return false end end local charlist = {} for c in mw.ustring.gmatch(term, ".") do table.insert(charlist, c) end for i = 1, math.floor(len / 2) do if charlist[i] ~= charlist[len - i + 1] then return false end end return true end return export ms2gvz5ktlkntyfgy8vn9mt955uxqdg मॉड्यूल:palindromes/data 828 302148 487788 477438 2026-09-02T17:19:46Z SM7 6218 updating... 487788 Scribunto text/plain local data = { ["ar"] = { allow_repeated_char = true, from = { "[أإآ]", "ؤ", "[ئى]", "ة", "ء", }, to = { "ا", "و", "ي", "ه", }, }, ["arc"] = { allow_repeated_char = true, from = { "ם", "ן", "ך", "ף", "ץ", "ﭏ", "װ", "ױ", "ײ", "[״׳־]", }, to = { "מ", "נ", "כ", "פ", "צ", "אל", "וו", "וי", "יי", } }, ["axm"] = { from = {"ու"}, to = {"ŭ"}, }, ["ca"] = { from = {"à", "[èé]", "[íï]", "[òó]", "[úü]", "ç", "l·l"}, to = {"a", "e", "i", "o", "u", "c", "ll"}, }, ["cmn"] = {ignore = {"Latn"}}, ["cs"] = { from = {"á", "é", "í", "ó", "[úů]", "ý", "ch"}, to = {"a", "e", "i", "o", "u", "y", "χ"}, }, ["de"] = { from = {"ä", "ö", "ü", "[ßẞ]"}, to = {"a", "o", "u", "ss"}, }, ["el"] = { from = { "[ᾳάᾴὰᾲᾶᾷἀᾀἄᾄἂᾂἆᾆἁᾁἅᾅἃᾃἇᾇᾱᾰἈᾈἌᾌἊᾊἎᾎἉᾉἍᾍἋᾋἏᾏᾹᾸ]", --uppercase characters are included due to this bug: https://bugs.php.net/bug.php?id=69267 "[έὲἐἔἒἑἕἓἘἜἚἙἝἛ]", "[ῃήῄὴῂῆῇἠᾐἤᾔἢᾒἦᾖἡᾑἥᾕἣᾓἧᾗἨᾘἬᾜἪᾚἮᾞἩᾙἭᾝἫᾛἯᾟ]", "[ίὶῖἰἴἲἶἱἵἳἷϊΐῒῗῑῐἸἼἺἾἹἽἻἿῙῘ]", "[όὸὀὄὂὁὅὃὈὌὊὉὍὋ]", "[ύὺῦὐὔὒὖὑὕὓὗϋΰῢῧῡῠὙὝὛὟῩῨ]", "[ῳώῴὼῲῶῷὠᾠὤᾤὢᾢὦᾦὡᾡὥᾥὣᾣὧᾧὨᾨὬᾬὪᾪὮᾮὩᾩὭᾭὫᾫὯᾯ]", "[ῥῤῬ]", "[ς]", "[́͂]" }, to = { "α", "ε", "η", "ι", "ο", "υ", "ω", "ρ", "σ" }, }, ["en"] = { from = {"[äàáâåā]", "[ëèéêē]", "[ïìíîī]", "[öòóôō]", "[üùúûū]", "æ" , "œ" , "[çč]", "ñ", "'"}, to = {"a", "e", "i", "o", "u", "ae", "oe", "c", "n"}, }, ["fr"] = { from = {"[áàâä]", "[éèêë]", "[íìîï]", "[óòôö]", "[úùûü]", "[ýỳŷÿ]", "ç", "æ", "œ", "'"}, to = {"a", "e", "i", "o", "u", "y", "c", "ae", "oe"}, }, ["fy"] = { from = {"[áàâä]", "[éèêë]", "[íìîï]", "[óòôö]", "[úùûü]", "[ýỳŷÿ]", "æ", "'"}, to = {"a", "e", "i", "o", "u", "y", "ae"}, }, ["grc"] = { from = { "[ᾳάᾴὰᾲᾶᾷἀᾀἄᾄἂᾂἆᾆἁᾁἅᾅἃᾃἇᾇᾱᾰἈᾈἌᾌἊᾊἎᾎἉᾉἍᾍἋᾋἏᾏᾹᾸ]", --uppercase characters are included due to this bug: https://bugs.php.net/bug.php?id=69267 "[έὲἐἔἒἑἕἓἘἜἚἙἝἛ]", "[ῃήῄὴῂῆῇἠᾐἤᾔἢᾒἦᾖἡᾑἥᾕἣᾓἧᾗἨᾘἬᾜἪᾚἮᾞἩᾙἭᾝἫᾛἯᾟ]", "[ίὶῖἰἴἲἶἱἵἳἷϊΐῒῗῑῐἸἼἺἾἹἽἻἿῙῘ]", "[όὸὀὄὂὁὅὃὈὌὊὉὍὋ]", "[ύὺῦὐὔὒὖὑὕὓὗϋΰῢῧῡῠὙὝὛὟῩῨ]", "[ῳώῴὼῲῶῷὠᾠὤᾤὢᾢὦᾦὡᾡὥᾥὣᾣὧᾧὨᾨὬᾬὪᾪὮᾮὩᾩὭᾭὫᾫὯᾯ]", "[ῥῤῬ]", "[ς]", "[́͂]" }, to = { "α", "ε", "η", "ι", "ο", "υ", "ω", "ρ", "σ" } }, ["he"] = { allow_repeated_char = true, from = { "ם", "ן", "ך", "ף", "ץ", "ﭏ", "װ", "ױ", "ײ", "[״׳־]", }, to = { "מ", "נ", "כ", "פ", "צ", "אל", "וו", "וי", "יי", } }, ["hu"] = { from = {"í", "ó", "ú", "ő", "ű", "ccs", "cs", "ggy", "gy", "lly", "ly", "nny", "ny", "ssz", "sz", "tty", "ty", "zzs", "zs", "ddzs", "dzs"}, to = {"i", "o", "u", "ö", "ü", "čč", "č", "ǰǰ", "ǰ", "ľľ", "ľ", "ňň", "ň", "šš", "š", "ťť", "ť", "žž", "ž", "ddž", "dž"}, }, ["hy"] = { from = {"ու", "եւ"}, to = {"ŭ", "և"}, }, ["ja"] = { allow_repeated_char = true, from = {'が', 'ぎ', 'ぐ', 'げ', 'ご', 'ざ', 'じ', 'ず', 'ぜ', 'ぞ', 'だ', 'ぢ', 'づ', 'で', 'ど', 'ば', 'び', 'ぶ', 'べ', 'ぼ', 'ぱ', 'ぴ', 'ぷ', 'ぺ', 'ぽ', 'ゔ'}, to = {'か', 'き', 'く', 'け', 'こ', 'さ', 'し', 'す', 'せ', 'そ', 'た', 'ち', 'つ', 'て', 'と', 'は', 'ひ', 'ふ', 'へ', 'ほ', 'は', 'ひ', 'ふ', 'へ', 'ほ', 'う'}, ignore = {"Latn"}, }, ["la"] = { from = {"v", "j"}, to = {"u", "i"} }, ["nl"] = { from = {"[áàä]", "[éèë]", "[íìï]", "[óòö]", "[úùü]"}, to = {"a", "e", "i", "o", "u"}, }, ["pl"] = { from = {"ć", "ę", "ł", "ń", "ó", "ś", "[źż]"}, to = {"c", "e", "l", "n", "o", "s", "z"}, }, ["ru"] = { from = {"ё"}, to = {"е"}, }, ["xcl"] = { from = {"ու"}, to = {"ŭ"}, }, ["yi"] = { allow_repeated_char = true, from = { "ם", "ן", "ך", "ף", "ץ", "ﭏ", "װ", "ױ", "ײ", "[״׳־]", "[ִַָּֿׁׂ]", }, to = { "מ", "נ", "כ", "פ", "צ", "אל", "וו", "וי", "יי", } }, ["zh"] = { ignore = {"Latn"}, }, } return data lnfzz4yt7hlswzgb8pzp3idlrgkcnyk मॉड्यूल:families 828 302161 487831 477815 2026-09-02T19:34:11Z SM7 6218 updating...+local little more 487831 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 = { "भाषाएँ", "लेक्ट" }, 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 .. " भाषाएँ" 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 "[[:श्रेणी:" .. 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, " भाषाएँ", 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 b0ika04i5fpin9ozyr0zdyuju3asr99 मॉड्यूल:qualifier 828 302212 487761 465280 2026-09-02T16:00:40Z SM7 6218 updating... 487761 Scribunto text/plain local export = {} local concat = table.concat --[==[ Wrap text in one or more CSS classes. `classes` should be a string; separate multiple classes with a space. ]==] function export.wrap_css(text, classes) return ("<span class=\"%s\">%s</span>"):format(classes, text) end --[==[ Wrap text in one or more qualifier CSS classes. `suffix` is the suffix describing the type of content, e.g. `brac` for parens, `content` for content, `comma` for commas. CSS classes <code>ib-<var>suffix</var></code> and i<code>qualifier-<var>suffix</var></code> are added. ]==] function export.wrap_qualifier_css(text, suffix) local css_classes = ("ib-%s qualifier-%s"):format(suffix, suffix) return export.wrap_css(text, css_classes) end --[==[ Format one or more qualifiers. `data` is an object with the following fields: * `qualifiers`: A single qualifier or a list or qualifiers. * `open`: Override the open paren displayed before the qualifiers. If `false` or an empty string, no paren is displayed. * `close`: Override the close paren displayed before the qualifiers. If `false` or an empty string, no paren is displayed. * `opencontent`: Content to display before the qualifiers, after the open paren. * `closecontent`: Content to display after the qualifiers, before the close paren. * `no_ib_content`: Suppress wrapping the content with classes `ib-content` and `qualifier-content`. Parens and commas will still be wrapped in CSS. * `raw`: Suppress all CSS wrapping. ]==] function export.format_qualifiers(data) local qualifiers, open, close = data.qualifiers, data.open, data.close if type(qualifiers) ~= "table" then qualifiers = {qualifiers} end if not qualifiers[1] then return "" end local parts = {} local function ins(text) table.insert(parts, text) end local function wrap_qualifier_css(text, suffix) if data.raw then return text end return export.wrap_qualifier_css(text, suffix) end if open ~= false and open ~= ""then ins(wrap_qualifier_css(open or "(", "brac")) end if data.opencontent then ins(data.opencontent) end local content = concat(qualifiers, wrap_qualifier_css(",", "comma") .. " ") if not data.no_ib_content then content = wrap_qualifier_css(content, "content") end ins(content) if data.closecontent then ins(data.closecontent) end if close ~= false and close ~= "" then ins(wrap_qualifier_css(close or ")", "brac")) end return concat(parts) end --[==[ An older interface onto `format_qualifiers`. Eventually code should be converted to use the new entry point. ]==] function export.format_qualifier(qualifiers, open, close, opencontent, closecontent, no_ib_content) return export.format_qualifiers { qualifiers = qualifiers, open = open, close = close, opencontent = opencontent, closecontent = closecontent, no_ib_content = no_ib_content, } end local function format_qualifiers_with_clarification(qualifiers, clarification, openquote, closequote) local opencontent = export.wrap_css(clarification, "qualifier-clarification") .. export.wrap_css(openquote or "“", "qualifier-clarification qualifier-quote") local closecontent = export.wrap_css(closequote or "”", "qualifier-clarification qualifier-quote") return export.format_qualifiers { qualifiers = qualifiers, open = "(", close = ")", opencontent = opencontent, closecontent = closecontent, } end --[==[ Internal implementation of {{tl|sense}}. ]==] function export.sense(qualifiers) return export.format_qualifiers { qualifiers = qualifiers }.. export.wrap_css(":", "ib-colon sense-qualifier-colon") end --[==[ Internal implementation of {{tl|antsense}}. ]==] function export.antsense(qualifiers) return format_qualifiers_with_clarification(qualifiers, "antonym(s) of ") .. export.wrap_css(":", "ib-colon sense-qualifier-colon") end return export tc3tigewud11x9n9900h1tvmhjpvcah मॉड्यूल:labels 828 302248 487747 477417 2026-09-02T14:56:12Z SM7 6218 updating... 487747 Scribunto text/plain local export = {} export.lang_specific_data_list_module = "Module:labels/data/lang" export.lang_specific_data_modules_prefix = "Module:labels/data/lang/" local load_module = "Module:load" local parse_utilities_module = "Module:parse utilities" local string_utilities_module = "Module:string utilities" local utilities_module = "Module:utilities" local insert = table.insert local require_when_needed = require("Module:require when needed") local unpack = unpack or table.unpack -- Lua 5.2 compatibility local dump = mw.dumpObject local m_lang_specific_data = mw.loadData(export.lang_specific_data_list_module) local m_table = require_when_needed("Module:table") --[==[ intro: Labels go through several stages of processing to get from the original (raw) label specified in the Wikicode to the final (formatted) label displayed to the user. The following terminology will help keep things straight: * The "raw label" is the label specified in the Wikicode. * The "non-canonical label" is the label extracted from the raw label, used for looking up in the label modules in order to fetch the associated label data structure and determine the canonical form of the label. Normally this is the same as the raw label, but it will be different if the raw label is of the form `!<var>label</var>` (e.g. `!Australian`) `<var>label</var>!<var>display</var>` (e.g. `Southern US!Southern`). The former syntax indicates that the label should display as-is instead of in its canonical form (which in the example given is `Australia`), and the latter syntax indicates that the label should display in the form specified after the exclamation point. * The "canonical label" is the result of applying alias resolution to the non-canonical label. Normally, the canonical label rather than the non-canonical label is what is shown to the user. * The "display form of the label" is what is shown to the user, not considering links and HTML that may wrap the display form to get the formatted form of the label. The display form comes from the `.display` field of the module label data for the label; if no such field exists in the label data, it is normally the canonical label. However, if the display override exists (see below), it takes precedence over the `.display` field or canonical label when determining the display form of the label. * The "display override", if specified, overrides all other means of determining the display form of the label. It is specified in two circumstances, i.e. in the `!<var>label</var>` and `<var>label</var>!<var>display</var>` raw label formats (i.e. in the same cirumstances where the raw label and non-canonical label are different). * The "formatted form of the label" is the final form of the label shown directly to the user. It generally appears to the user as the display form of the label, but in the Wikicode, the formatted form may wrap the display form with a link to Wikipedia, the Wiktionary glossary or another Wiktionary entry, and that link in turn may be wrapped in an HTML span with a "deprecated" CSS class attached, causing the label to display differently (to indicate that it is deprecated). ]==] -- for testing local force_cat = false local m_headword_data = mw.loadData("Module:headword/data") local SUBPAGENAME = m_headword_data.pagename -- Disable tracking on heavy pages to save time. local pages_where_tracking_is_disabled = m_headword_data.large_pages -- Add tracking category for PAGE. The tracking category linked to is [[Wiktionary:Tracking/labels/PAGE]]. -- We also add to [[Wiktionary:Tracking/labels/PAGE/LANGCODE]] and [[Wiktionary:Tracking/labels/PAGE/MODE]] if -- LANGCODE and/or MODE given. local function track(page, langcode, mode) if pages_where_tracking_is_disabled[SUBPAGENAME] then return true end -- avoid including links in pages (may cause error) page = page:gsub("%[", "("):gsub("%]", ")"):gsub("|", "!") require("Module:debug/track")("labels/" .. page) if langcode then require("Module:debug/track")("labels/" .. page .. "/" .. langcode) end if mode then require("Module:debug/track")("labels/" .. page .. "/" .. mode) end -- We don't currently add a tracking label for both langcode and mode to reduce the total number of labels, to -- save some memory. return true end local function ucfirst(txt) return mw.getContentLanguage():ucfirst(txt) end local mode_to_outer_class = { ["label"] = "usage-label-sense", ["term-label"] = "usage-label-term", ["accent"] = "usage-label-accent", ["form-of"] = "usage-label-form-of", } local mode_to_property_prefix = { ["label"] = false, ["term-label"] = false, -- handled specially ["accent"] = "accent_", ["form-of"] = "form_of_", } local function validate_mode(mode) mode = mode or "label" if not mode_to_outer_class[mode] then local allowed_values = {} for key, _ in pairs(mode_to_outer_class) do insert(allowed_values, "'" .. key .. "'") end table.sort(allowed_values) error(("Invalid value '%s' for `mode`; should be one of %s"):format(mode, table.concat(allowed_values, ", "))) end return mode end local function getprop(labdata, mode, prop) local mode_prefix = mode_to_property_prefix[mode] return mode_prefix and labdata[mode_prefix .. prop] or labdata[prop] end local function check_type(label, lang, prop, value, expected_types) if value == nil or expected_types == nil then return value end if type(expected_types) ~= "table" then expected_types = {expected_types} end local valtype = type(value) local matches = false for _, expected_type in ipairs(expected_types) do if type(expected_type) == "string" then if valtype == expected_type then matches = true break end elseif value == expected_type then matches = true break end end if not matches then local function join_untagged_or(elements) return m_table.serialCommaJoin(elements, {conj = "or", dontTag = true}) end local quoted_types = {} local quoted_values = {} for _, expected_type in ipairs(expected_types) do if type(expected_type) == "string" then insert(quoted_types, "'" .. expected_type .. "'") else insert(quoted_values, "'" .. dump(expected_type) .. "'") end end local possible_matches = {} if quoted_types[1] then insert(possible_matches, ("be of type%s %s"):format( quoted_types[2] and "s" or "", join_untagged_or(quoted_types))) end if quoted_values[1] then insert(possible_matches, ("have the value%s %s"):format( quoted_values[2] and "s" or "", join_untagged_or(quoted_values))) end error(("Internal error: For label '%s', langcode '%s', property '%s' should %s but is of type '%s' with value %s"):format( label, lang and lang:getCode() or "UNKNOWN", prop, join_untagged_or(possible_matches), valtype, dump(value))) end end -- HACK! For languages in any of the given families, check the specified-language Wikipedia for appropriate -- Wikipedia articles for the language in question (esp. useful for obscure etymology-only languages that may not -- have English articles for them, like many Chinese lects). local families_to_wikipedia_languages = { {"zhx", "zh"}, {"sem-arb", "ar"}, } --[==[ Given language `lang` (a full language, etymology-language or family), fetch a list of Wikimedia languages to check when converting a Wikidata item to a Wikipedia article. English is always first, followed by the Wikimedia language code(s) of `lang` if `lang` is a language (which may or may not be the same as `lang`'s Wiktionary code), followed by the macrolanguage of `lang` for certain languages and families (currently, only languages and families in the Chinese and Arabic families). If `lang` is nil, only return English. Note that the same code may occur more than once in the list. This is exported because it's also used by [[Module:category tree/poscatboiler/data/language varieties]]. ]==] function export.get_langs_to_extract_wikipedia_articles_from_wikidata(lang) local wikipedia_langs = {} insert(wikipedia_langs, "en") if lang then local article_lang = lang while article_lang do if article_lang:hasType("language") then local wmcodes = article_lang:getWikimediaLanguageCodes() for _, wmcode in ipairs(wmcodes) do insert(wikipedia_langs, wmcode) end end article_lang = article_lang:getParent() end for _, family_to_wp_lang in ipairs(families_to_wikipedia_languages) do local family, wp_lang = unpack(family_to_wp_lang) if lang:inFamily(family) then insert(wikipedia_langs, wp_lang) end end end return wikipedia_langs end --[==[ Fetch the categories to add to a page, given that the label whose canonical form is `canon_label` with language `lang` has been seen. `labdata` is the label data structure for `label`, fetched from the appropriate submodule. `mode` specifies how the label was invoked (see {get_label_info()} for more information). The return value is a list of the actual categories, unless `for_doc` is specified, in which case the categories returned are marked up for display on a documentation page. If `for_doc` is given, `lang` may be nil to format the categories in a language-independent fashion; otherwise, it must be specified. If `category_types` is specified, it should be a set object (i.e. with category types as keys and {true} as values), and only categories of the specified types will be returned. ]==] function export.fetch_categories(canon_label, labdata, lang, mode, for_doc, category_types) local categories = {} mode = validate_mode(mode) local langcode, canonical_name if lang then langcode = lang:getFullCode() canonical_name = lang:getFullName() elseif for_doc then langcode = "<var>[langcode]</var>" canonical_name = "<var>[language name]</var>" else error("Internal error: Must specify `lang` unless `for_doc` is given") end local function labprop(prop, expected_types) local retval = getprop(labdata, mode, prop) check_type(canon_label, lang, prop, retval, expected_types) return retval end local empty_list = {} local function get_cats(cat_type) if category_types and not category_types[cat_type] then return empty_list end local cats = labprop(cat_type) if not cats then return empty_list end if type(cats) ~= "table" then return {cats} end return cats end local topical_categories = get_cats("topical_categories") local sense_categories = get_cats("sense_categories") local pos_categories = get_cats("pos_categories") local regional_categories = get_cats("regional_categories") local plain_categories = get_cats("plain_categories") local function insert_cat(cat, sense_cat) if for_doc then cat = "<code>" .. cat .. "</code>" if sense_cat then if mode == "term-label" then cat = cat .. " (using {{tl|tlb}})" else cat = cat .. " (using {{tl|lb}} or form-of template)" end cat = mw.getCurrentFrame():preprocess(cat) end end insert(categories, cat) end for _, cat in ipairs(topical_categories) do insert_cat(langcode .. ":" .. (cat == true and ucfirst(canon_label) or cat)) end for _, cat in ipairs(sense_categories) do if cat == true then cat = canon_label end cat = mode == "term-label" and cat .. " terms" or "terms with " .. cat .. " senses" insert_cat(canonical_name .. " " .. cat, true) end for _, cat in ipairs(pos_categories) do insert_cat(canonical_name .. " " .. (cat == true and canon_label or cat)) end for _, cat in ipairs(regional_categories) do insert_cat((cat == true and ucfirst(canon_label) or cat) .. " " .. canonical_name) end for _, cat in ipairs(plain_categories) do insert_cat(cat == true and ucfirst(canon_label) or cat) end return categories end --[==[ Return the list of all labels data modules for a label whose language is `lang`. The return value is a list of module names, with overriding modules earlier in the list (that is, if a label occurs in two modules in the list, the earlier-listed module takes precedence). If `lang` is nil, only return non-language-specific submodules. ]==] function export.get_submodules(lang) local submodules = { "Module:labels/data", "Module:labels/data/qualifiers", "Module:labels/data/regional", "Module:labels/data/topical", } if not lang then return submodules end -- get language-specific labels from data module local langcode = lang:getFullCode() if m_lang_specific_data.langs_with_lang_specific_modules[langcode] then -- prefer per-language label in order to pick subvariety labels over regional ones insert(submodules, 1, export.lang_specific_data_modules_prefix .. langcode) end return submodules end --[==[ Return the formatted form of a label `label` (which should be the canonical form of the label; see comment at top), given (a) the label data structure `labdata` from one of the data modules; (b) the language object `lang` of the language being processed, or nil for no language; (c) `deprecated` (true if the label is deprecated, otherwise the deprecation information is taken from `labdata`); (d) `override_display` (if specified, override the display form of the label with the specified string, instead of any value in `labdata.display` or `labdata.special_display` or the canonical label in `label` itself); (e) `mode` (same as `data.mode` passed to {get_label_info()}). Returns two values: the formatted label form and a boolean indicating whether the label is deprecated. '''NOTE: Under normal circumstances, do not use this.''' Instead, use {get_label_info()}, which searches all the data modules for a given label and handles other complications. ]==] function export.format_label(label, labdata, lang, deprecated, override_display, mode) local formatted_label mode = validate_mode(mode) local function labprop(prop, expected_types) local retval = getprop(labdata, mode, prop) check_type(label, lang, prop, retval, expected_types) return retval end deprecated = deprecated or labprop("deprecated") if not override_display and labprop("special_display") then local function add_language_name(str) if str == "canonical_name" then if lang then return lang:getFullName() else return "<code><var>[language name]</var></code>" end else return "" end end formatted_label = labprop("special_display", "string"):gsub("<(.-)>", add_language_name) else --[=[ We proceed as follows: 1. The display form comes from either (a) the `override_display` variable if set (this happens when the user uses a label like '!British'); (b) the `display` property, if set; or (c) the label iself. 2. If the display form contains a link, use it directly and ignore the other display-related settings. (NOTE: Settings `Wikipedia` and `Wikidata` may still be used on the category page itself, by the category tree code.) 3. Otherwise, use one of the other display-related settings, in the following order: `glossary` > `Wiktionary` > `Wikipedia` > `Wikidata`. Specifically: a. If any of the values is equal to `true`, that is equivalent to specifying a string consisting of the canonical label. b. If `glossary` is set, it specifies the anchor in [[Appendix:Glossary]]. c. If `Wiktionary` is set, it specifies an arbitrary Wiktionary page or page + anchor (e.g. a separate Appendix entry). d. If `Wikipedia` is set, it specifies an arbitrary Wikipedia article, or a list of such items (in this case, we select the first one, but the category tree uses all of them). e. If `Wikidata` is set, it specifies an arbitrary Wikidata item to retrieve a Wikipedia article from, or a list of such items (in this case, we select the first one, but the category tree uses all of them). If the item is of the form `wmcode:id`, the Wikipedia article corresponding to `id` in the `wmcode`-language Wikipedia is fetched if available. Otherwise, the English-language Wikipedia article corresponding to `id` is retrieved if available, falling back to the Wikimedia language(s) corresponding to `lang` and then (in certain cases) to the macrolanguage that `lang` is part of. Note that if `mode` is specified, prefixed properties (e.g. `accent_display` for `mode` == "accent", `form_display` for `mode` == "form") are checked before the bare equivalent (e.g. `display`). ]=] local display = override_display or labprop("display", "string") or label -- There are several 'Foo spelling' labels specially designed for use in the |from= param in -- {{alternative form of}}, {{standard spelling of}} and the like. Often the display includes the word -- "spelling" at the end (e.g. if it's defaulted), which is useful when the label is used with {{tl|lb}} or -- {{tl|tlb}}; but it causes redundancy when used with the form-of templates, which add the word "form", -- "spelling", "standard spelling", etc. after the label. if mode == "form-of" then display = display:gsub(" spelling$", "") end if display:find("%[%[") then formatted_label = display else local glossary = labprop("glossary", {"string", true}) local Wiktionary = labprop("Wiktionary", {"string", true}) local Wikipedia = labprop("Wikipedia", {"string", true, "table"}) local Wikidata = labprop("Wikidata", {"string", true, "table"}) if glossary then local glossary_entry = glossary == true and label or glossary formatted_label = "[[Appendix:Glossary#" .. glossary_entry .. "|" .. display .. "]]" elseif Wiktionary then local Wiktionary_entry = Wiktionary == true and label or Wiktionary if Wiktionary == display then formatted_label = "[[" .. display .. "]]" else formatted_label = "[[" .. Wiktionary_entry .. "|" .. display .. "]]" end elseif Wikipedia then if type(Wikipedia) == "table" then Wikipedia = Wikipedia[1] end local Wikipedia_entry = Wikipedia == true and label or Wikipedia formatted_label = "[[w:" .. Wikipedia_entry .. "|" .. display .. "]]" elseif Wikidata then if not mw.wikibase then error(("Unable to retrieve data from Wikidata ID for label '%s'; `mw.wikibase` not defined" ):format(label)) end local function make_formatted_label(wmcode, id) local article = mw.wikibase.sitelink(id, wmcode .. "wiki") if article then local link = wmcode == "en" and "w:" .. article or "w:" .. wmcode .. ":" .. article return ("[[%s|%s]]"):format(link, display) else return nil end end if type(Wikidata) == "table" then Wikidata = Wikidata[1] end local wmcode, id = Wikidata:match("^(.*):(.*)$") if wmcode then formatted_label = make_formatted_label(wmcode, id) else local langs_to_check = export.get_langs_to_extract_wikipedia_articles_from_wikidata(lang) for _, wmcode in ipairs(langs_to_check) do formatted_label = make_formatted_label(wmcode, Wikidata) if formatted_label then break end end end formatted_label = formatted_label or display else formatted_label = display end end end if deprecated then formatted_label = '<span class="deprecated-label">' .. formatted_label .. '</span>' end return formatted_label, deprecated end --[==[ Return information on a label. On input `data` is an object with the following fields: * `label`: The raw label to return information on. * `lang`: The language of the label. Must be specified unless `for_doc` is given. * `mode`: How the label was invoked. One of the following: ** {nil} or {"label"}: invoked through {{tl|lb}} or another template whose labels in the same fashion, e.g. {{tl|alt}}, {{tl|quote}} or {{tl|syn}}; ** {"term-label"}: invoked through {{tl|tlb}}; ** {"accent"}: invoked through {{tl|a}} or the {{para|a}} or {{para|aa}} parameters of other pronunciation templates, such as {{tl|IPA}}, {{tl|rhymes}} or {{tl|homophones}}; ** {"form-of"}: invoked through {{tl|alt form}}, {{tl|standard spelling of}} or other form-of template. This changes the display and/or categorization of a minority of labels. (The majority work the same for all modes.) * `for_doc`: Data is being fetched for documentation purposes. This causes the raw categories returned in `categories` to be formatted for documentation display. * `nocat`: If true, don't add the label to any categories. * `force_cat`: Force adding categories even in namespaces that normally exclude them (e.g. userspace and discussion pages). * `notrack`: Disable all tracking for this label. * `sort`: Sort key for categorization. * `already_seen`: An object used to track labels already seen, so they aren't displayed twice. Tracking is according to the display form of the label, so if two labels have the same display form, the second one won't be displayed (but its categories will still be added). If `already_seen` is {nil}, this tracking doesn't happen. The return value is an object with the following fields: * `raw_text`: If specified, the object does not describe a label but simply raw text surrounding labels. This occurs when double angle bracket (<<...>>) notation is used. {get_label_info()} does not currently return objects with this field set, but {process_raw_labels()} does. The value is {"begin"} (this is the first raw text portion derived from a double angle bracket spec, provided there are at least two raw text portions); {"end"} (this is the last raw text portion derived from a double angle bracket spec, provided there are at least two portions); {"middle"} (this is neither the first nor the last raw text portion); or {"only"} (this is a raw text portion standing by itself). The particular value determines the handling of commas and spaces on one or both sides of the raw text. If this field is specified, only the `label` field (containing the actual raw text) and the `category` field (containing an empty list) are set; all other fields are {nil}. * `raw_label`: The raw label that was passed in. * `non_canonical`: The label prior to canonicalization (i.e. alias resolution). Usually this is the same as `raw_label`, but if the raw label was preceded by an exclamation point (meaning "display the raw label as-is"), this field will contain the label stripped of the exclamation point, and if the raw label is of the form `<var>label</var>!<var>display</var>` (meaning "display the label in the specified form"), this field will contain the label before the exclamation point. * `canonical`: If the label in `non_canonical` is an alias, this contains the canonical name of the label; otherwise it will be {nil}. * `override_display`: If specified, this contains a string that overrides the normal display form of the label. The display form of a label is the `.display` field of the label data if present, and otherwise is normally the canonical form of the label (i.e. after alias resolution). (This is not the same as the formatted form of the label, found in `label`, which is the final form shown to the user and includes links to Wikipedia, the glossary, etc. as well as an HTML wrapper if the label is deprecated.) If `override_display` is specified, however, this is used in place of the normal display form of the label. This currently happens in two circumstances: (1) the label was preceded by ! to indicate that the raw label should be displayed rather than the canonical form; (2) the label was given in the form `<var>label</var>!<var>display</var>` (meaning "display the label in the specified `<var>display</var>` form"). * `label`: The formatted form of the label. This is what is actually shown to the user. If the label is recognized (found in some module), this will typically be in the form of a link. * `categories`: A list of the categories to add the label to; an empty list if `nocat` was specified. * `formatted_categories`: A string containing the formatted categories; {nil} if `nocat` or `for_doc` was specified, or if `categories` is empty. Currently will be an empty string if there are categories to format but the namespace is one that normally excludes categories (e.g. userspace and discussion pages), and `force_cat` isn't specified. * `deprecated`: True if the label is deprecated. * `recognized`: If true, the label was found in some module. * `data`: The data structure for the label, as fetched from the label modules. For unrecognized labels, this will be an empty object. ]==] function export.get_label_info(data) if not data.label then error("`data` must now be an object containing the params") end local mode = validate_mode(data.mode) local ret = {categories = {}} local label = data.label local raw_label = label ret.raw_label = raw_label local override_display if label:find("^!") then label = label:gsub("^!", "") override_display = label elseif label:find("![^%s]") then label, override_display = label:match("^(.-)!([^%s].*)$") if not label then error(("Internal error: This Lua pattern should never fail to match for label '%s'"):format(raw_label)) end end local non_canonical = label ret.non_canonical = non_canonical local deprecated = false local labdata local submodule local data_langcode = data.lang and data.lang:getCode() or nil local submodules_to_check = export.get_submodules(data.lang) for _, submodule_to_check in ipairs(submodules_to_check) do submodule = mw.loadData(submodule_to_check) local this_labdata = submodule[label] local resolved_label if type(this_labdata) == "string" then resolved_label = this_labdata this_labdata = submodule[this_labdata] if not this_labdata then error(("Internal error: Label alias '%s' points to '%s', which is undefined in module [[%s]]"):format( label, resolved_label, submodule_to_check)) end if type(this_labdata) == "string" then error(("Internal error: Label alias '%s' points to '%s', which is also an alias (of '%s') in module [[%s]]"):format( label, resolved_label, this_labdata, submodule_to_check)) end end if this_labdata then -- Make sure either there's no lang restriction, or we're processing lang-independent, or our language -- is among the listed languages. Otherwise, continue processing (which could conceivably pick up a -- lang-appropriate version of the label in another label data module). local lablangs = getprop(this_labdata, mode, "langs") if not lablangs or not data_langcode then labdata = this_labdata label = resolved_label or label break end local lang_in_list = false for _, langcode in ipairs(lablangs) do if langcode == data_langcode then lang_in_list = true break end end if lang_in_list then labdata = this_labdata label = resolved_label or label break elseif not data.notrack then -- Track use of a label that fails the lang restriction. -- [[Special:WhatLinksHere/Wiktionary:Tracking/labels/wrong-lang-label]] -- [[Special:WhatLinksHere/Wiktionary:Tracking/labels/wrong-lang-label/LANGCODE]] -- [[Special:WhatLinksHere/Wiktionary:Tracking/labels/wrong-lang-label/LABEL]] -- [[Special:WhatLinksHere/Wiktionary:Tracking/labels/wrong-lang-label/LABEL/LANGCODE]] track("wrong-lang-label", data_langcode) track("wrong-lang-label/" .. label, data_langcode) if resolved_label then track("wrong-lang-label/" .. resolved_label, data_langcode) end end end end if labdata then ret.recognized = true else labdata = {} ret.recognized = false end local function labprop(prop) return getprop(labdata, mode, prop) end if labprop("deprecated") then deprecated = true end if label ~= non_canonical then -- Note that this is an alias and store the canonical version. ret.canonical = label end if not data.notrack then -- labprop("track") then -- track all labels now -- Track label (after converting aliases to canonical form; but also track raw label (alias) if different -- from canonical label). -- [[Special:WhatLinksHere/Wiktionary:Tracking/labels/label/LABEL]] -- [[Special:WhatLinksHere/Wiktionary:Tracking/labels/label/LABEL/LANGCODE]] -- [[Special:WhatLinksHere/Wiktionary:Tracking/labels/label/LABEL/MODE]] track("label/" .. label, data_langcode, mode) if label ~= non_canonical then track("label/" .. non_canonical, data_langcode, mode) end end local formatted_label formatted_label, deprecated = export.format_label(label, labdata, data.lang, deprecated, override_display, mode) ret.deprecated = deprecated if deprecated then if not data.nocat then local depcat = "Entries with deprecated labels" if data.for_doc then depcat = "<code>" .. depcat .. "</code>" end insert(ret.categories, depcat) end end local label_for_already_seen = (labprop("topical_categories") or labprop("regional_categories") or labprop("plain_categories") or labprop("pos_categories") or labprop("sense_categories")) and formatted_label or nil -- Track label text. If label text was previously used, don't show it, but include the categories. -- For an example, see [[hypocretin]]. if data.already_seen and data.already_seen[label_for_already_seen] then ret.label = "" else if formatted_label:find("{") then formatted_label = mw.getCurrentFrame():preprocess(formatted_label) end ret.label = formatted_label end if data.nocat then -- do nothing else local cats = export.fetch_categories(label, labdata, data.lang, mode, data.for_doc) for _, cat in ipairs(cats) do insert(ret.categories, cat) end if not ret.categories[1] or data.for_doc then -- Don't try to format categories if we're doing this for documentation ({{label/doc}}), because there -- will be HTML in the categories. -- do nothing else ret.formatted_categories = require(utilities_module).format_categories(ret.categories, data.lang, data.sort, nil, force_cat or data.force_cat) end end ret.data = labdata if label_for_already_seen and data.already_seen then data.already_seen[label_for_already_seen] = true end return ret end --[==[ Split a string containing comma-separated raw labels into the individual labels. This will not split on a comma followed by whitespace, and it will not split inside of matched <...> or [...]. The code is written to be efficient, so that it does not load modules (e.g. [[Module:parse utilities]]) unnecessarily. ]==] function export.split_labels_on_comma(term) if term:find("[%[<]") then -- Do it the "hard way". We don't want to split anything inside of <...> or <<...>> even if there are commas -- inside of the angle brackets. For good measure we do the same for [...] and [[...]]. We first parse balanced -- segment runs involving either [...] or <...>. Then we split alternating runs on comma (but not on -- comma+whitespace). Then we rejoin the split runs. For example, given the following: -- "regional,older <<non-rhotic,and,non-hoarse-horse>> speakers", the first call to -- parse_multi_delimiter_balanced_segment_run() produces -- -- {"regional,older ", "<<non-rhotic,and,non-hoarse-horse>>", " speakers"} -- -- After calling split_alternating_runs_on_comma(), we get the following: -- -- {{"regional"}, {"older ", "<<non-rhotic,and,non-hoarse-horse>>", " speakers"}} -- -- After rejoining each group, we get: -- -- {"regional", "older <<non-rhotic,and,non-hoarse-horse>> speakers"} -- -- which is the desired output. When processing the second "label" string, the code in process_raw_labels() -- will do a similar process to this to pull out the labels inside of the <<...>> notation. local put = require(parse_utilities_module) local segments = put.parse_multi_delimiter_balanced_segment_run(term, {{"<", ">"}, {"[", "]"}}) -- This won't split on comma+whitespace. local comma_separated_groups = put.split_alternating_runs_on_comma(segments) for i, group in ipairs(comma_separated_groups) do comma_separated_groups[i] = table.concat(group) end return comma_separated_groups elseif term:find(",%s") then -- This won't split on comma+whitespace. return require(parse_utilities_module).split_on_comma(term) elseif term:find(",") then return require(string_utilities_module).split(term, ",") else return {term} end end --[==[ Return a list of objects corresponding to a set of raw labels. Each object returned is of the format returned by {get_label_info()}. This is similar to looping over the labels and calling {get_label_info()} on each one, but it also correctly handles embedded double angle bracket specs <<...>> found in the labels. (In such a case, there will be more objects returned than raw labels passed in.) On input, `data` is an object with the following fields: * `labels`: The list of labels to process. * `lang`: The language of the labels. Must be specified. * `mode`: How the label was invoked; see {get_label_info()} for more information. * `nocat`: If true, don't add the label to any categories. * `force_cat`: Force adding categories even in namespaces that normally exclude them (e.g. userspace and discussion pages). * `notrack`: Disable all tracking for this label. * `sort`: Sort key for categorization. * `already_seen`: An object used to track labels already seen, so they aren't displayed twice. Tracking is according to the display form of the label, so if two labels have the same display form, the second one won't be displayed (but its categories will still be added). If `already_seen` is {nil}, this tracking doesn't happen. * `ok_to_destructively_modify`: If set, the `data` structure will be destructively modified in the process of this function running. ]==] function export.process_raw_labels(data) local label_infos = {} if not data.ok_to_destructively_modify then data = m_table.shallowCopy(data) data.ok_to_destructively_modify = true end local function get_info_and_insert(label) -- Reuse this structure to save memory. data.label = label insert(label_infos, export.get_label_info(data)) end for _, label in ipairs(data.labels) do if label:find("<<") then local segments = require(string_utilities_module).split(label, "<<(.-)>>") for i, segment in ipairs(segments) do if i % 2 == 1 then local raw_text_type = i == 1 and "begin" or i == #segments and "end" or "middle" insert(label_infos, {raw_text = raw_text_type, label = segment, categories = {}}) else local segment_labels = export.split_labels_on_comma(segment) for _, segment_label in ipairs(segment_labels) do get_info_and_insert(segment_label) end end end else get_info_and_insert(label) end end return label_infos end --[==[ Split a comma-separated string of raw labels and process each label to get a list of objects suitable for passing to {format_processed_labels()}. Each object returned is of the format returned by {get_label_info()}. This is equivalent to calling {split_labels_on_comma()} followed by {process_raw_labels()}. On input, `data` is an object with the following fields: * `labels`: The string containing the raw comma-separated labels. * `lang`: The language of the labels. Must be specified. * `mode`: How the label was invoked; see {get_label_info()} for more information. * `nocat`: If true, don't add the label to any categories. * `force_cat`: Force adding categories even in namespaces that normally exclude them (e.g. userspace and discussion pages). * `notrack`: Disable all tracking for this label. * `sort`: Sort key for categorization. * `already_seen`: An object used to track labels already seen, so they aren't displayed twice. Tracking is according to the display form of the label, so if two labels have the same display form, the second one won't be displayed (but its categories will still be added). If `already_seen` is {nil}, this tracking doesn't happen. * `ok_to_destructively_modify`: If set, the `data` structure will be destructively modified in the process of this function running. ]==] function export.split_and_process_raw_labels(data) if not data.ok_to_destructively_modify then data = m_table.shallowCopy(data) data.ok_to_destructively_modify = true end data.labels = export.split_labels_on_comma(data.labels) return export.process_raw_labels(data) end --[==[ Format one or more already-processed labels for display and categorization. "Already-processed" means that {get_label_info()} or {process_raw_labels()} has been called on the raw labels to convert them into objects containing information on how to display and categorize the labels. This is a lower-level alternative to {show_labels()} and is meant for modules such as [[Module:alternative forms]], [[Module:quote]] and [[Module:etymology/templates/descendant]] that support displaying labels along with some other information. On input `data` is an object with the following fields: * `labels`: List of the label objects to format, in the format returned by {get_label_info()}. * `lang`: The language of the labels. * `open`: Open bracket or parenthesis to display before the concatenated labels. If specified, it is wrapped in the {"ib-brac"} and {"label-brac"} CSS classes. If {nil} or {false}, no open bracket is displayed. * `close`: Close bracket or parenthesis to display after the concatenated labels. If specified, it is wrapped in the {"ib-brac"} and {"label-brac"} CSS classes. If {nil} or {false}, no close bracket is displayed. * `no_ib_content`: By default, the concatenated formatted labels inside of the open/close brackets are wrapped in the {"ib-content"} and {"label-content"} CSS classes. Specify this to suppress this wrapping. * `raw`: Suppress all CSS wrapping of content, including open/close parentheses, content and comma delimiters (which are normally wrapped in {"ib-comma"} and {"label-comma"} CSS classes). * `ok_to_destructively_modify`: If set, the `data` structure, and the `data.labels` table inside of it, will be destructively modified in the process of this function running. * `split_output`: If not given, the return value is a concatenation of the formatted concatenated labels and formatted categories. Otherwise, two values are returned: the formatted pronunciation and the categories. If `split_output` is the value {"raw"}, the categories are returned in list form, where the list elements are strings f the form suitable for passing to {format_categories()} in [[Module:utilities]]. If `split_output` is any other value besides {nil}, the categories are returned as a pre-formatted concatenated string. The return value (or the first return value, if `split_output` is given) is a string containing the contenated labels, optionally surrounded by open/close brackets or parentheses. Normally, labels are separated by comma-space sequences, but this may be suppressed for certain labels. If `nocat` wasn't given to {get_label_info()} or {process_raw_labels()}, and `split_output` wasn't given, the label objects will contain formatted categories in them, which will be inserted into the returned text. (Use `split_output` if you need the categories returned separately.) The concatenated text inside of the open/close brackets is normally wrapped in the {"ib-content"} CSS class, but this can be suppressed, as mentioned above. ]==] function export.format_processed_labels(data) if not data.labels then error("`data` must now be an object containing the params") end if not data.ok_to_destructively_modify then data = m_table.shallowCopy(data) data.labels = m_table.deepCopy(data.labels) data.ok_to_destructively_modify = true end local labels = data.labels if not labels[1] then error("You must specify at least one label.") end -- Show the labels local omit_preComma = false local omit_postComma = true local omit_preSpace = false local omit_postSpace = true for _, label in ipairs(labels) do omit_preComma = omit_postComma omit_preSpace = omit_postSpace local raw_text_omit_before = label.raw_text == "middle" or label.raw_text == "end" local raw_text_omit_after = label.raw_text == "middle" or label.raw_text == "begin" label.omit_comma = omit_preComma or (label.data and label.data.omit_preComma) or raw_text_omit_before omit_postComma = (label.data and label.data.omit_postComma) or raw_text_omit_after label.omit_space = omit_preSpace or (label.data and label.data.omit_preSpace) or raw_text_omit_before omit_postSpace = (label.data and label.data.omit_postSpace) or raw_text_omit_after end if data.lang then local lang_functions_module = export.lang_specific_data_modules_prefix .. data.lang:getCode() .. "/functions" local m_lang_functions = require(load_module).safe_require(lang_functions_module) if m_lang_functions and m_lang_functions.postprocess_handlers then for _, handler in ipairs(m_lang_functions.postprocess_handlers) do handler(data) end end end local function wrap_css(txt, suffix) if data.raw then return txt end return ("<span class=\"ib-%s label-%s\">%s</span>"):format(suffix, suffix, txt) end local categories = nil local formatted_categories = split_output and split_output ~= "raw" and {} or nil for i, labelinfo in ipairs(labels) do local label -- Need to check for 'not raw_text' here because blank labels may legitimately occur as raw text if a double -- angle bracket spec occurs at the beginning of a label. In this case we've already taken into account the -- context and don't want to leave out a preceding comma and space e.g. in a case like -- {{lb|en|rare|<<dialect>> or <<eye dialect>>}}. FIXME: We should reconsider whether we need this special case -- at all. if labelinfo.label == "" and not labelinfo.raw_text then label = "" else label = (labelinfo.omit_comma and "" or wrap_css(",", "comma")) .. (labelinfo.omit_space and "" or "&#32;") .. labelinfo.label end if split_output then labels[i] = label if split_output == "raw" then if labelinfo.categories and labelinfo.categories[1] then if categories then m_table.extend(categories, labelinfo.categories) else categories = labelinfo.categories end end elseif labelinfo.formatted_categories then insert(formatted_categories, labelinfo.formatted_categories) end else labels[i] = label .. (labelinfo.formatted_categories or "") end end local function wrap_open_close(val) if val then return wrap_css(val, "brac") else return "" end end local concatenated_labels = table.concat(labels, "") if not data.no_ib_content then concatenated_labels = wrap_css(concatenated_labels, "content") end local ret_labels = wrap_open_close(data.open) .. concatenated_labels .. wrap_open_close(data.close) if split_output == "raw" then return ret_labels, categories elseif split_output then return ret_labels, concat(formatted_categories) else return ret_labels end end --[==[ Format one or more labels for display and categorization. This provides the implementation of the {{tl|label}}/{{tl|lb}}, {{tl|term label}}/{{tl|tlb}} and {{tl|accent}}/{{tl|a}} templates, and can also be called from a module. The return value is a string to be inserted into the generated page, including the display and categories. On input `data` is an object with the following fields: * `labels`: List of the labels to format. * `lang`: The language of the labels. * `mode`: How the label was invoked; see {get_label_info()} for more information. * `nocat`: If true, don't add the labels to any categories. * `force_cat`: Force adding categories even in namespaces that normally exclude them (e.g. userspace and discussion pages). * `notrack`: Disable all tracking for these labels. * `sort`: Sort key for categorization. * `no_track_already_seen`: Don't track already-seen labels. If not specified, already-seen labels are not displayed again, but still categorize. See the documentation of {get_label_info()}. * `open`: Open bracket or parenthesis to display before the concatenated labels. If {nil}, defaults to an open parenthesis. Set to {false} to disable. * `close`: Close bracket or parenthesis to display after the concatenated labels. If {nil}, defaults to a close parenthesis. Set to {false} to disable. * `no_ib_content`: As in `format_processed_labels()`. * `raw`: As in `format_processed_labels()`. Also suppress wrapping the entire formatted result in a usage label CSS class (see below). * `ok_to_destructively_modify`: If set, the `data` structure will be destructively modified in the process of this function running. Compared with {format_processed_labels()}, this function has the following differences: # The labels specified in `labels` are raw labels (i.e. strings) rather than formatted objects. # The open and close brackets default to parentheses ("round brackets") rather than not being displayed by default. # Tracking of already-seen labels is enabled unless explicitly turned off using `no_track_already_seen`. # The entire formatted result is wrapped in a {"usage-label-<var>type</var>"} CSS class (depending on the value of `mode`), unless `raw` is given. ]==] function export.show_labels(data) if not data.labels then error("`data` must now be an object containing the params") end if not data.ok_to_destructively_modify then data = m_table.shallowCopy(data) data.ok_to_destructively_modify = true end local labels = data.labels if not labels[1] then error("You must specify at least one label.") end local mode = validate_mode(data.mode) if not data.no_track_already_seen then data.already_seen = {} end data.labels = export.process_raw_labels(data) if data.open == nil then data.open = "(" end if data.close == nil then data.close = ")" end local formatted = export.format_processed_labels(data) if data.raw then return formatted else return "<span class=\"" .. mode_to_outer_class[mode] .. "\">" .. formatted .. "</span>" end end --[==[Helper function for the data modules.]==] function export.alias(labels, key, aliases) m_table.alias(labels, key, aliases) end --[==[ Split the display form of a label. Returns two values: `link` and `display`. If the display form consists of a two-part link, `link` is the first part and `display` is the second part. If the display form consists of a single-part link, `link` and `display` are the same. Otherwise (the display form is not a link or contains an embedded link), `link` is the same as the passed-in `label` and `display` is nil. ]==] function export.split_display_form(label) if not label:find("%[%[") then return label, nil end local link, display = label:match("^%[%[([^%[%]|]+)|([^%[%]|]+)%]%]$") if link then return link, display end link = label:match("^%[%[([^%[%]|])+%]%]$") if link then return link, link end return label, nil end --[==[ Combine the `link` and `display` parts of the display form of a label as returned by {split_display_form()}. If `display` is nil, `link` is returned directly. Otherwise, a one-part or two-part link is constructed depending on whether `link` and `display` are the same. (As a special case, if both consist of a blank string, the return value is a blank string rather than a malformed link.) ]==] function export.combine_display_form_parts(link, display) if not display then return link end if link == display then if link == "" then return "" else return ("[[%s]]"):format(link) end end return ("[[%s|%s]]"):format(link, display) end --[==[Used to finalize the data into the form that is actually returned.]==] function export.finalize_data(labels) local shallow_copy = m_table.shallowCopy local aliases = {} for label, data in pairs(labels) do if type(data) == "table" then if data.aliases then for _, alias in ipairs(data.aliases) do aliases[alias] = label end data.aliases = nil end if data.deprecated_aliases then local data2 = shallow_copy(data) data2.deprecated = true data2.canonical = label for _, alias in ipairs(data2.deprecated_aliases) do aliases[alias] = data2 end data.deprecated_aliases = nil data2.deprecated_aliases = nil end end end for label, data in pairs(aliases) do labels[label] = data end return labels end return export suogoty75rc7wpvghtef20qg65xtsmn 487748 487747 2026-09-02T15:02:31Z SM7 6218 local 487748 Scribunto text/plain local export = {} export.lang_specific_data_list_module = "Module:labels/data/lang" export.lang_specific_data_modules_prefix = "Module:labels/data/lang/" local load_module = "Module:load" local parse_utilities_module = "Module:parse utilities" local string_utilities_module = "Module:string utilities" local utilities_module = "Module:utilities" local insert = table.insert local require_when_needed = require("Module:require when needed") local unpack = unpack or table.unpack -- Lua 5.2 compatibility local dump = mw.dumpObject local m_lang_specific_data = mw.loadData(export.lang_specific_data_list_module) local m_table = require_when_needed("Module:table") --[==[ intro: Labels go through several stages of processing to get from the original (raw) label specified in the Wikicode to the final (formatted) label displayed to the user. The following terminology will help keep things straight: * The "raw label" is the label specified in the Wikicode. * The "non-canonical label" is the label extracted from the raw label, used for looking up in the label modules in order to fetch the associated label data structure and determine the canonical form of the label. Normally this is the same as the raw label, but it will be different if the raw label is of the form `!<var>label</var>` (e.g. `!Australian`) `<var>label</var>!<var>display</var>` (e.g. `Southern US!Southern`). The former syntax indicates that the label should display as-is instead of in its canonical form (which in the example given is `Australia`), and the latter syntax indicates that the label should display in the form specified after the exclamation point. * The "canonical label" is the result of applying alias resolution to the non-canonical label. Normally, the canonical label rather than the non-canonical label is what is shown to the user. * The "display form of the label" is what is shown to the user, not considering links and HTML that may wrap the display form to get the formatted form of the label. The display form comes from the `.display` field of the module label data for the label; if no such field exists in the label data, it is normally the canonical label. However, if the display override exists (see below), it takes precedence over the `.display` field or canonical label when determining the display form of the label. * The "display override", if specified, overrides all other means of determining the display form of the label. It is specified in two circumstances, i.e. in the `!<var>label</var>` and `<var>label</var>!<var>display</var>` raw label formats (i.e. in the same cirumstances where the raw label and non-canonical label are different). * The "formatted form of the label" is the final form of the label shown directly to the user. It generally appears to the user as the display form of the label, but in the Wikicode, the formatted form may wrap the display form with a link to Wikipedia, the Wiktionary glossary or another Wiktionary entry, and that link in turn may be wrapped in an HTML span with a "deprecated" CSS class attached, causing the label to display differently (to indicate that it is deprecated). ]==] -- for testing local force_cat = false local m_headword_data = mw.loadData("Module:headword/data") local SUBPAGENAME = m_headword_data.pagename -- Disable tracking on heavy pages to save time. local pages_where_tracking_is_disabled = m_headword_data.large_pages -- Add tracking category for PAGE. The tracking category linked to is [[Wiktionary:Tracking/labels/PAGE]]. -- We also add to [[Wiktionary:Tracking/labels/PAGE/LANGCODE]] and [[Wiktionary:Tracking/labels/PAGE/MODE]] if -- LANGCODE and/or MODE given. local function track(page, langcode, mode) if pages_where_tracking_is_disabled[SUBPAGENAME] then return true end -- avoid including links in pages (may cause error) page = page:gsub("%[", "("):gsub("%]", ")"):gsub("|", "!") require("Module:debug/track")("labels/" .. page) if langcode then require("Module:debug/track")("labels/" .. page .. "/" .. langcode) end if mode then require("Module:debug/track")("labels/" .. page .. "/" .. mode) end -- We don't currently add a tracking label for both langcode and mode to reduce the total number of labels, to -- save some memory. return true end local function ucfirst(txt) return mw.getContentLanguage():ucfirst(txt) end local mode_to_outer_class = { ["label"] = "usage-label-sense", ["term-label"] = "usage-label-term", ["accent"] = "usage-label-accent", ["form-of"] = "usage-label-form-of", } local mode_to_property_prefix = { ["label"] = false, ["term-label"] = false, -- handled specially ["accent"] = "accent_", ["form-of"] = "form_of_", } local function validate_mode(mode) mode = mode or "label" if not mode_to_outer_class[mode] then local allowed_values = {} for key, _ in pairs(mode_to_outer_class) do insert(allowed_values, "'" .. key .. "'") end table.sort(allowed_values) error(("Invalid value '%s' for `mode`; should be one of %s"):format(mode, table.concat(allowed_values, ", "))) end return mode end local function getprop(labdata, mode, prop) local mode_prefix = mode_to_property_prefix[mode] return mode_prefix and labdata[mode_prefix .. prop] or labdata[prop] end local function check_type(label, lang, prop, value, expected_types) if value == nil or expected_types == nil then return value end if type(expected_types) ~= "table" then expected_types = {expected_types} end local valtype = type(value) local matches = false for _, expected_type in ipairs(expected_types) do if type(expected_type) == "string" then if valtype == expected_type then matches = true break end elseif value == expected_type then matches = true break end end if not matches then local function join_untagged_or(elements) return m_table.serialCommaJoin(elements, {conj = "or", dontTag = true}) end local quoted_types = {} local quoted_values = {} for _, expected_type in ipairs(expected_types) do if type(expected_type) == "string" then insert(quoted_types, "'" .. expected_type .. "'") else insert(quoted_values, "'" .. dump(expected_type) .. "'") end end local possible_matches = {} if quoted_types[1] then insert(possible_matches, ("be of type%s %s"):format( quoted_types[2] and "s" or "", join_untagged_or(quoted_types))) end if quoted_values[1] then insert(possible_matches, ("have the value%s %s"):format( quoted_values[2] and "s" or "", join_untagged_or(quoted_values))) end error(("Internal error: For label '%s', langcode '%s', property '%s' should %s but is of type '%s' with value %s"):format( label, lang and lang:getCode() or "UNKNOWN", prop, join_untagged_or(possible_matches), valtype, dump(value))) end end -- HACK! For languages in any of the given families, check the specified-language Wikipedia for appropriate -- Wikipedia articles for the language in question (esp. useful for obscure etymology-only languages that may not -- have English articles for them, like many Chinese lects). local families_to_wikipedia_languages = { {"zhx", "zh"}, {"sem-arb", "ar"}, } --[==[ Given language `lang` (a full language, etymology-language or family), fetch a list of Wikimedia languages to check when converting a Wikidata item to a Wikipedia article. English is always first, followed by the Wikimedia language code(s) of `lang` if `lang` is a language (which may or may not be the same as `lang`'s Wiktionary code), followed by the macrolanguage of `lang` for certain languages and families (currently, only languages and families in the Chinese and Arabic families). If `lang` is nil, only return English. Note that the same code may occur more than once in the list. This is exported because it's also used by [[Module:category tree/poscatboiler/data/language varieties]]. ]==] function export.get_langs_to_extract_wikipedia_articles_from_wikidata(lang) local wikipedia_langs = {} insert(wikipedia_langs, "hi") if lang then local article_lang = lang while article_lang do if article_lang:hasType("language") then local wmcodes = article_lang:getWikimediaLanguageCodes() for _, wmcode in ipairs(wmcodes) do insert(wikipedia_langs, wmcode) end end article_lang = article_lang:getParent() end for _, family_to_wp_lang in ipairs(families_to_wikipedia_languages) do local family, wp_lang = unpack(family_to_wp_lang) if lang:inFamily(family) then insert(wikipedia_langs, wp_lang) end end end return wikipedia_langs end --[==[ Fetch the categories to add to a page, given that the label whose canonical form is `canon_label` with language `lang` has been seen. `labdata` is the label data structure for `label`, fetched from the appropriate submodule. `mode` specifies how the label was invoked (see {get_label_info()} for more information). The return value is a list of the actual categories, unless `for_doc` is specified, in which case the categories returned are marked up for display on a documentation page. If `for_doc` is given, `lang` may be nil to format the categories in a language-independent fashion; otherwise, it must be specified. If `category_types` is specified, it should be a set object (i.e. with category types as keys and {true} as values), and only categories of the specified types will be returned. ]==] function export.fetch_categories(canon_label, labdata, lang, mode, for_doc, category_types) local categories = {} mode = validate_mode(mode) local langcode, canonical_name if lang then langcode = lang:getFullCode() canonical_name = lang:getFullName() elseif for_doc then langcode = "<var>[langcode]</var>" canonical_name = "<var>[language name]</var>" else error("Internal error: Must specify `lang` unless `for_doc` is given") end local function labprop(prop, expected_types) local retval = getprop(labdata, mode, prop) check_type(canon_label, lang, prop, retval, expected_types) return retval end local empty_list = {} local function get_cats(cat_type) if category_types and not category_types[cat_type] then return empty_list end local cats = labprop(cat_type) if not cats then return empty_list end if type(cats) ~= "table" then return {cats} end return cats end local topical_categories = get_cats("topical_categories") local sense_categories = get_cats("sense_categories") local pos_categories = get_cats("pos_categories") local regional_categories = get_cats("regional_categories") local plain_categories = get_cats("plain_categories") local function insert_cat(cat, sense_cat) if for_doc then cat = "<code>" .. cat .. "</code>" if sense_cat then if mode == "term-label" then cat = cat .. " (using {{tl|tlb}})" else cat = cat .. " (using {{tl|lb}} or form-of template)" end cat = mw.getCurrentFrame():preprocess(cat) end end insert(categories, cat) end for _, cat in ipairs(topical_categories) do insert_cat(langcode .. ":" .. (cat == true and ucfirst(canon_label) or cat)) end for _, cat in ipairs(sense_categories) do if cat == true then cat = canon_label end cat = mode == "term-label" and cat .. " टर्म" or "टर्म " .. cat .. " सेंस के साथ" insert_cat(canonical_name .. " " .. cat, true) end for _, cat in ipairs(pos_categories) do insert_cat(canonical_name .. " " .. (cat == true and canon_label or cat)) end for _, cat in ipairs(regional_categories) do insert_cat((cat == true and ucfirst(canon_label) or cat) .. " " .. canonical_name) end for _, cat in ipairs(plain_categories) do insert_cat(cat == true and ucfirst(canon_label) or cat) end return categories end --[==[ Return the list of all labels data modules for a label whose language is `lang`. The return value is a list of module names, with overriding modules earlier in the list (that is, if a label occurs in two modules in the list, the earlier-listed module takes precedence). If `lang` is nil, only return non-language-specific submodules. ]==] function export.get_submodules(lang) local submodules = { "Module:labels/data", "Module:labels/data/qualifiers", "Module:labels/data/regional", "Module:labels/data/topical", } if not lang then return submodules end -- get language-specific labels from data module local langcode = lang:getFullCode() if m_lang_specific_data.langs_with_lang_specific_modules[langcode] then -- prefer per-language label in order to pick subvariety labels over regional ones insert(submodules, 1, export.lang_specific_data_modules_prefix .. langcode) end return submodules end --[==[ Return the formatted form of a label `label` (which should be the canonical form of the label; see comment at top), given (a) the label data structure `labdata` from one of the data modules; (b) the language object `lang` of the language being processed, or nil for no language; (c) `deprecated` (true if the label is deprecated, otherwise the deprecation information is taken from `labdata`); (d) `override_display` (if specified, override the display form of the label with the specified string, instead of any value in `labdata.display` or `labdata.special_display` or the canonical label in `label` itself); (e) `mode` (same as `data.mode` passed to {get_label_info()}). Returns two values: the formatted label form and a boolean indicating whether the label is deprecated. '''NOTE: Under normal circumstances, do not use this.''' Instead, use {get_label_info()}, which searches all the data modules for a given label and handles other complications. ]==] function export.format_label(label, labdata, lang, deprecated, override_display, mode) local formatted_label mode = validate_mode(mode) local function labprop(prop, expected_types) local retval = getprop(labdata, mode, prop) check_type(label, lang, prop, retval, expected_types) return retval end deprecated = deprecated or labprop("deprecated") if not override_display and labprop("special_display") then local function add_language_name(str) if str == "canonical_name" then if lang then return lang:getFullName() else return "<code><var>[language name]</var></code>" end else return "" end end formatted_label = labprop("special_display", "string"):gsub("<(.-)>", add_language_name) else --[=[ We proceed as follows: 1. The display form comes from either (a) the `override_display` variable if set (this happens when the user uses a label like '!British'); (b) the `display` property, if set; or (c) the label iself. 2. If the display form contains a link, use it directly and ignore the other display-related settings. (NOTE: Settings `Wikipedia` and `Wikidata` may still be used on the category page itself, by the category tree code.) 3. Otherwise, use one of the other display-related settings, in the following order: `glossary` > `Wiktionary` > `Wikipedia` > `Wikidata`. Specifically: a. If any of the values is equal to `true`, that is equivalent to specifying a string consisting of the canonical label. b. If `glossary` is set, it specifies the anchor in [[Appendix:Glossary]]. c. If `Wiktionary` is set, it specifies an arbitrary Wiktionary page or page + anchor (e.g. a separate Appendix entry). d. If `Wikipedia` is set, it specifies an arbitrary Wikipedia article, or a list of such items (in this case, we select the first one, but the category tree uses all of them). e. If `Wikidata` is set, it specifies an arbitrary Wikidata item to retrieve a Wikipedia article from, or a list of such items (in this case, we select the first one, but the category tree uses all of them). If the item is of the form `wmcode:id`, the Wikipedia article corresponding to `id` in the `wmcode`-language Wikipedia is fetched if available. Otherwise, the English-language Wikipedia article corresponding to `id` is retrieved if available, falling back to the Wikimedia language(s) corresponding to `lang` and then (in certain cases) to the macrolanguage that `lang` is part of. Note that if `mode` is specified, prefixed properties (e.g. `accent_display` for `mode` == "accent", `form_display` for `mode` == "form") are checked before the bare equivalent (e.g. `display`). ]=] local display = override_display or labprop("display", "string") or label -- There are several 'Foo spelling' labels specially designed for use in the |from= param in -- {{alternative form of}}, {{standard spelling of}} and the like. Often the display includes the word -- "spelling" at the end (e.g. if it's defaulted), which is useful when the label is used with {{tl|lb}} or -- {{tl|tlb}}; but it causes redundancy when used with the form-of templates, which add the word "form", -- "spelling", "standard spelling", etc. after the label. if mode == "form-of" then display = display:gsub(" spelling$", "") end if display:find("%[%[") then formatted_label = display else local glossary = labprop("glossary", {"string", true}) local Wiktionary = labprop("Wiktionary", {"string", true}) local Wikipedia = labprop("Wikipedia", {"string", true, "table"}) local Wikidata = labprop("Wikidata", {"string", true, "table"}) if glossary then local glossary_entry = glossary == true and label or glossary formatted_label = "[[विक्षनरी:शब्दावली#" .. glossary_entry .. "|" .. display .. "]]" elseif Wiktionary then local Wiktionary_entry = Wiktionary == true and label or Wiktionary if Wiktionary == display then formatted_label = "[[" .. display .. "]]" else formatted_label = "[[" .. Wiktionary_entry .. "|" .. display .. "]]" end elseif Wikipedia then if type(Wikipedia) == "table" then Wikipedia = Wikipedia[1] end local Wikipedia_entry = Wikipedia == true and label or Wikipedia formatted_label = "[[w:" .. Wikipedia_entry .. "|" .. display .. "]]" elseif Wikidata then if not mw.wikibase then error(("Unable to retrieve data from Wikidata ID for label '%s'; `mw.wikibase` not defined" ):format(label)) end local function make_formatted_label(wmcode, id) local article = mw.wikibase.sitelink(id, wmcode .. "wiki") if article then local link = wmcode == "hi" and "w:" .. article or "w:" .. wmcode .. ":" .. article return ("[[%s|%s]]"):format(link, display) else return nil end end if type(Wikidata) == "table" then Wikidata = Wikidata[1] end local wmcode, id = Wikidata:match("^(.*):(.*)$") if wmcode then formatted_label = make_formatted_label(wmcode, id) else local langs_to_check = export.get_langs_to_extract_wikipedia_articles_from_wikidata(lang) for _, wmcode in ipairs(langs_to_check) do formatted_label = make_formatted_label(wmcode, Wikidata) if formatted_label then break end end end formatted_label = formatted_label or display else formatted_label = display end end end if deprecated then formatted_label = '<span class="deprecated-label">' .. formatted_label .. '</span>' end return formatted_label, deprecated end --[==[ Return information on a label. On input `data` is an object with the following fields: * `label`: The raw label to return information on. * `lang`: The language of the label. Must be specified unless `for_doc` is given. * `mode`: How the label was invoked. One of the following: ** {nil} or {"label"}: invoked through {{tl|lb}} or another template whose labels in the same fashion, e.g. {{tl|alt}}, {{tl|quote}} or {{tl|syn}}; ** {"term-label"}: invoked through {{tl|tlb}}; ** {"accent"}: invoked through {{tl|a}} or the {{para|a}} or {{para|aa}} parameters of other pronunciation templates, such as {{tl|IPA}}, {{tl|rhymes}} or {{tl|homophones}}; ** {"form-of"}: invoked through {{tl|alt form}}, {{tl|standard spelling of}} or other form-of template. This changes the display and/or categorization of a minority of labels. (The majority work the same for all modes.) * `for_doc`: Data is being fetched for documentation purposes. This causes the raw categories returned in `categories` to be formatted for documentation display. * `nocat`: If true, don't add the label to any categories. * `force_cat`: Force adding categories even in namespaces that normally exclude them (e.g. userspace and discussion pages). * `notrack`: Disable all tracking for this label. * `sort`: Sort key for categorization. * `already_seen`: An object used to track labels already seen, so they aren't displayed twice. Tracking is according to the display form of the label, so if two labels have the same display form, the second one won't be displayed (but its categories will still be added). If `already_seen` is {nil}, this tracking doesn't happen. The return value is an object with the following fields: * `raw_text`: If specified, the object does not describe a label but simply raw text surrounding labels. This occurs when double angle bracket (<<...>>) notation is used. {get_label_info()} does not currently return objects with this field set, but {process_raw_labels()} does. The value is {"begin"} (this is the first raw text portion derived from a double angle bracket spec, provided there are at least two raw text portions); {"end"} (this is the last raw text portion derived from a double angle bracket spec, provided there are at least two portions); {"middle"} (this is neither the first nor the last raw text portion); or {"only"} (this is a raw text portion standing by itself). The particular value determines the handling of commas and spaces on one or both sides of the raw text. If this field is specified, only the `label` field (containing the actual raw text) and the `category` field (containing an empty list) are set; all other fields are {nil}. * `raw_label`: The raw label that was passed in. * `non_canonical`: The label prior to canonicalization (i.e. alias resolution). Usually this is the same as `raw_label`, but if the raw label was preceded by an exclamation point (meaning "display the raw label as-is"), this field will contain the label stripped of the exclamation point, and if the raw label is of the form `<var>label</var>!<var>display</var>` (meaning "display the label in the specified form"), this field will contain the label before the exclamation point. * `canonical`: If the label in `non_canonical` is an alias, this contains the canonical name of the label; otherwise it will be {nil}. * `override_display`: If specified, this contains a string that overrides the normal display form of the label. The display form of a label is the `.display` field of the label data if present, and otherwise is normally the canonical form of the label (i.e. after alias resolution). (This is not the same as the formatted form of the label, found in `label`, which is the final form shown to the user and includes links to Wikipedia, the glossary, etc. as well as an HTML wrapper if the label is deprecated.) If `override_display` is specified, however, this is used in place of the normal display form of the label. This currently happens in two circumstances: (1) the label was preceded by ! to indicate that the raw label should be displayed rather than the canonical form; (2) the label was given in the form `<var>label</var>!<var>display</var>` (meaning "display the label in the specified `<var>display</var>` form"). * `label`: The formatted form of the label. This is what is actually shown to the user. If the label is recognized (found in some module), this will typically be in the form of a link. * `categories`: A list of the categories to add the label to; an empty list if `nocat` was specified. * `formatted_categories`: A string containing the formatted categories; {nil} if `nocat` or `for_doc` was specified, or if `categories` is empty. Currently will be an empty string if there are categories to format but the namespace is one that normally excludes categories (e.g. userspace and discussion pages), and `force_cat` isn't specified. * `deprecated`: True if the label is deprecated. * `recognized`: If true, the label was found in some module. * `data`: The data structure for the label, as fetched from the label modules. For unrecognized labels, this will be an empty object. ]==] function export.get_label_info(data) if not data.label then error("`data` must now be an object containing the params") end local mode = validate_mode(data.mode) local ret = {categories = {}} local label = data.label local raw_label = label ret.raw_label = raw_label local override_display if label:find("^!") then label = label:gsub("^!", "") override_display = label elseif label:find("![^%s]") then label, override_display = label:match("^(.-)!([^%s].*)$") if not label then error(("Internal error: This Lua pattern should never fail to match for label '%s'"):format(raw_label)) end end local non_canonical = label ret.non_canonical = non_canonical local deprecated = false local labdata local submodule local data_langcode = data.lang and data.lang:getCode() or nil local submodules_to_check = export.get_submodules(data.lang) for _, submodule_to_check in ipairs(submodules_to_check) do submodule = mw.loadData(submodule_to_check) local this_labdata = submodule[label] local resolved_label if type(this_labdata) == "string" then resolved_label = this_labdata this_labdata = submodule[this_labdata] if not this_labdata then error(("Internal error: Label alias '%s' points to '%s', which is undefined in module [[%s]]"):format( label, resolved_label, submodule_to_check)) end if type(this_labdata) == "string" then error(("Internal error: Label alias '%s' points to '%s', which is also an alias (of '%s') in module [[%s]]"):format( label, resolved_label, this_labdata, submodule_to_check)) end end if this_labdata then -- Make sure either there's no lang restriction, or we're processing lang-independent, or our language -- is among the listed languages. Otherwise, continue processing (which could conceivably pick up a -- lang-appropriate version of the label in another label data module). local lablangs = getprop(this_labdata, mode, "langs") if not lablangs or not data_langcode then labdata = this_labdata label = resolved_label or label break end local lang_in_list = false for _, langcode in ipairs(lablangs) do if langcode == data_langcode then lang_in_list = true break end end if lang_in_list then labdata = this_labdata label = resolved_label or label break elseif not data.notrack then -- Track use of a label that fails the lang restriction. -- [[Special:WhatLinksHere/Wiktionary:Tracking/labels/wrong-lang-label]] -- [[Special:WhatLinksHere/Wiktionary:Tracking/labels/wrong-lang-label/LANGCODE]] -- [[Special:WhatLinksHere/Wiktionary:Tracking/labels/wrong-lang-label/LABEL]] -- [[Special:WhatLinksHere/Wiktionary:Tracking/labels/wrong-lang-label/LABEL/LANGCODE]] track("wrong-lang-label", data_langcode) track("wrong-lang-label/" .. label, data_langcode) if resolved_label then track("wrong-lang-label/" .. resolved_label, data_langcode) end end end end if labdata then ret.recognized = true else labdata = {} ret.recognized = false end local function labprop(prop) return getprop(labdata, mode, prop) end if labprop("deprecated") then deprecated = true end if label ~= non_canonical then -- Note that this is an alias and store the canonical version. ret.canonical = label end if not data.notrack then -- labprop("track") then -- track all labels now -- Track label (after converting aliases to canonical form; but also track raw label (alias) if different -- from canonical label). -- [[Special:WhatLinksHere/Wiktionary:Tracking/labels/label/LABEL]] -- [[Special:WhatLinksHere/Wiktionary:Tracking/labels/label/LABEL/LANGCODE]] -- [[Special:WhatLinksHere/Wiktionary:Tracking/labels/label/LABEL/MODE]] track("label/" .. label, data_langcode, mode) if label ~= non_canonical then track("label/" .. non_canonical, data_langcode, mode) end end local formatted_label formatted_label, deprecated = export.format_label(label, labdata, data.lang, deprecated, override_display, mode) ret.deprecated = deprecated if deprecated then if not data.nocat then local depcat = "Entries with deprecated labels" if data.for_doc then depcat = "<code>" .. depcat .. "</code>" end insert(ret.categories, depcat) end end local label_for_already_seen = (labprop("topical_categories") or labprop("regional_categories") or labprop("plain_categories") or labprop("pos_categories") or labprop("sense_categories")) and formatted_label or nil -- Track label text. If label text was previously used, don't show it, but include the categories. -- For an example, see [[hypocretin]]. if data.already_seen and data.already_seen[label_for_already_seen] then ret.label = "" else if formatted_label:find("{") then formatted_label = mw.getCurrentFrame():preprocess(formatted_label) end ret.label = formatted_label end if data.nocat then -- do nothing else local cats = export.fetch_categories(label, labdata, data.lang, mode, data.for_doc) for _, cat in ipairs(cats) do insert(ret.categories, cat) end if not ret.categories[1] or data.for_doc then -- Don't try to format categories if we're doing this for documentation ({{label/doc}}), because there -- will be HTML in the categories. -- do nothing else ret.formatted_categories = require(utilities_module).format_categories(ret.categories, data.lang, data.sort, nil, force_cat or data.force_cat) end end ret.data = labdata if label_for_already_seen and data.already_seen then data.already_seen[label_for_already_seen] = true end return ret end --[==[ Split a string containing comma-separated raw labels into the individual labels. This will not split on a comma followed by whitespace, and it will not split inside of matched <...> or [...]. The code is written to be efficient, so that it does not load modules (e.g. [[Module:parse utilities]]) unnecessarily. ]==] function export.split_labels_on_comma(term) if term:find("[%[<]") then -- Do it the "hard way". We don't want to split anything inside of <...> or <<...>> even if there are commas -- inside of the angle brackets. For good measure we do the same for [...] and [[...]]. We first parse balanced -- segment runs involving either [...] or <...>. Then we split alternating runs on comma (but not on -- comma+whitespace). Then we rejoin the split runs. For example, given the following: -- "regional,older <<non-rhotic,and,non-hoarse-horse>> speakers", the first call to -- parse_multi_delimiter_balanced_segment_run() produces -- -- {"regional,older ", "<<non-rhotic,and,non-hoarse-horse>>", " speakers"} -- -- After calling split_alternating_runs_on_comma(), we get the following: -- -- {{"regional"}, {"older ", "<<non-rhotic,and,non-hoarse-horse>>", " speakers"}} -- -- After rejoining each group, we get: -- -- {"regional", "older <<non-rhotic,and,non-hoarse-horse>> speakers"} -- -- which is the desired output. When processing the second "label" string, the code in process_raw_labels() -- will do a similar process to this to pull out the labels inside of the <<...>> notation. local put = require(parse_utilities_module) local segments = put.parse_multi_delimiter_balanced_segment_run(term, {{"<", ">"}, {"[", "]"}}) -- This won't split on comma+whitespace. local comma_separated_groups = put.split_alternating_runs_on_comma(segments) for i, group in ipairs(comma_separated_groups) do comma_separated_groups[i] = table.concat(group) end return comma_separated_groups elseif term:find(",%s") then -- This won't split on comma+whitespace. return require(parse_utilities_module).split_on_comma(term) elseif term:find(",") then return require(string_utilities_module).split(term, ",") else return {term} end end --[==[ Return a list of objects corresponding to a set of raw labels. Each object returned is of the format returned by {get_label_info()}. This is similar to looping over the labels and calling {get_label_info()} on each one, but it also correctly handles embedded double angle bracket specs <<...>> found in the labels. (In such a case, there will be more objects returned than raw labels passed in.) On input, `data` is an object with the following fields: * `labels`: The list of labels to process. * `lang`: The language of the labels. Must be specified. * `mode`: How the label was invoked; see {get_label_info()} for more information. * `nocat`: If true, don't add the label to any categories. * `force_cat`: Force adding categories even in namespaces that normally exclude them (e.g. userspace and discussion pages). * `notrack`: Disable all tracking for this label. * `sort`: Sort key for categorization. * `already_seen`: An object used to track labels already seen, so they aren't displayed twice. Tracking is according to the display form of the label, so if two labels have the same display form, the second one won't be displayed (but its categories will still be added). If `already_seen` is {nil}, this tracking doesn't happen. * `ok_to_destructively_modify`: If set, the `data` structure will be destructively modified in the process of this function running. ]==] function export.process_raw_labels(data) local label_infos = {} if not data.ok_to_destructively_modify then data = m_table.shallowCopy(data) data.ok_to_destructively_modify = true end local function get_info_and_insert(label) -- Reuse this structure to save memory. data.label = label insert(label_infos, export.get_label_info(data)) end for _, label in ipairs(data.labels) do if label:find("<<") then local segments = require(string_utilities_module).split(label, "<<(.-)>>") for i, segment in ipairs(segments) do if i % 2 == 1 then local raw_text_type = i == 1 and "begin" or i == #segments and "end" or "middle" insert(label_infos, {raw_text = raw_text_type, label = segment, categories = {}}) else local segment_labels = export.split_labels_on_comma(segment) for _, segment_label in ipairs(segment_labels) do get_info_and_insert(segment_label) end end end else get_info_and_insert(label) end end return label_infos end --[==[ Split a comma-separated string of raw labels and process each label to get a list of objects suitable for passing to {format_processed_labels()}. Each object returned is of the format returned by {get_label_info()}. This is equivalent to calling {split_labels_on_comma()} followed by {process_raw_labels()}. On input, `data` is an object with the following fields: * `labels`: The string containing the raw comma-separated labels. * `lang`: The language of the labels. Must be specified. * `mode`: How the label was invoked; see {get_label_info()} for more information. * `nocat`: If true, don't add the label to any categories. * `force_cat`: Force adding categories even in namespaces that normally exclude them (e.g. userspace and discussion pages). * `notrack`: Disable all tracking for this label. * `sort`: Sort key for categorization. * `already_seen`: An object used to track labels already seen, so they aren't displayed twice. Tracking is according to the display form of the label, so if two labels have the same display form, the second one won't be displayed (but its categories will still be added). If `already_seen` is {nil}, this tracking doesn't happen. * `ok_to_destructively_modify`: If set, the `data` structure will be destructively modified in the process of this function running. ]==] function export.split_and_process_raw_labels(data) if not data.ok_to_destructively_modify then data = m_table.shallowCopy(data) data.ok_to_destructively_modify = true end data.labels = export.split_labels_on_comma(data.labels) return export.process_raw_labels(data) end --[==[ Format one or more already-processed labels for display and categorization. "Already-processed" means that {get_label_info()} or {process_raw_labels()} has been called on the raw labels to convert them into objects containing information on how to display and categorize the labels. This is a lower-level alternative to {show_labels()} and is meant for modules such as [[Module:alternative forms]], [[Module:quote]] and [[Module:etymology/templates/descendant]] that support displaying labels along with some other information. On input `data` is an object with the following fields: * `labels`: List of the label objects to format, in the format returned by {get_label_info()}. * `lang`: The language of the labels. * `open`: Open bracket or parenthesis to display before the concatenated labels. If specified, it is wrapped in the {"ib-brac"} and {"label-brac"} CSS classes. If {nil} or {false}, no open bracket is displayed. * `close`: Close bracket or parenthesis to display after the concatenated labels. If specified, it is wrapped in the {"ib-brac"} and {"label-brac"} CSS classes. If {nil} or {false}, no close bracket is displayed. * `no_ib_content`: By default, the concatenated formatted labels inside of the open/close brackets are wrapped in the {"ib-content"} and {"label-content"} CSS classes. Specify this to suppress this wrapping. * `raw`: Suppress all CSS wrapping of content, including open/close parentheses, content and comma delimiters (which are normally wrapped in {"ib-comma"} and {"label-comma"} CSS classes). * `ok_to_destructively_modify`: If set, the `data` structure, and the `data.labels` table inside of it, will be destructively modified in the process of this function running. * `split_output`: If not given, the return value is a concatenation of the formatted concatenated labels and formatted categories. Otherwise, two values are returned: the formatted pronunciation and the categories. If `split_output` is the value {"raw"}, the categories are returned in list form, where the list elements are strings f the form suitable for passing to {format_categories()} in [[Module:utilities]]. If `split_output` is any other value besides {nil}, the categories are returned as a pre-formatted concatenated string. The return value (or the first return value, if `split_output` is given) is a string containing the contenated labels, optionally surrounded by open/close brackets or parentheses. Normally, labels are separated by comma-space sequences, but this may be suppressed for certain labels. If `nocat` wasn't given to {get_label_info()} or {process_raw_labels()}, and `split_output` wasn't given, the label objects will contain formatted categories in them, which will be inserted into the returned text. (Use `split_output` if you need the categories returned separately.) The concatenated text inside of the open/close brackets is normally wrapped in the {"ib-content"} CSS class, but this can be suppressed, as mentioned above. ]==] function export.format_processed_labels(data) if not data.labels then error("`data` must now be an object containing the params") end if not data.ok_to_destructively_modify then data = m_table.shallowCopy(data) data.labels = m_table.deepCopy(data.labels) data.ok_to_destructively_modify = true end local labels = data.labels if not labels[1] then error("You must specify at least one label.") end -- Show the labels local omit_preComma = false local omit_postComma = true local omit_preSpace = false local omit_postSpace = true for _, label in ipairs(labels) do omit_preComma = omit_postComma omit_preSpace = omit_postSpace local raw_text_omit_before = label.raw_text == "middle" or label.raw_text == "end" local raw_text_omit_after = label.raw_text == "middle" or label.raw_text == "begin" label.omit_comma = omit_preComma or (label.data and label.data.omit_preComma) or raw_text_omit_before omit_postComma = (label.data and label.data.omit_postComma) or raw_text_omit_after label.omit_space = omit_preSpace or (label.data and label.data.omit_preSpace) or raw_text_omit_before omit_postSpace = (label.data and label.data.omit_postSpace) or raw_text_omit_after end if data.lang then local lang_functions_module = export.lang_specific_data_modules_prefix .. data.lang:getCode() .. "/functions" local m_lang_functions = require(load_module).safe_require(lang_functions_module) if m_lang_functions and m_lang_functions.postprocess_handlers then for _, handler in ipairs(m_lang_functions.postprocess_handlers) do handler(data) end end end local function wrap_css(txt, suffix) if data.raw then return txt end return ("<span class=\"ib-%s label-%s\">%s</span>"):format(suffix, suffix, txt) end local categories = nil local formatted_categories = split_output and split_output ~= "raw" and {} or nil for i, labelinfo in ipairs(labels) do local label -- Need to check for 'not raw_text' here because blank labels may legitimately occur as raw text if a double -- angle bracket spec occurs at the beginning of a label. In this case we've already taken into account the -- context and don't want to leave out a preceding comma and space e.g. in a case like -- {{lb|en|rare|<<dialect>> or <<eye dialect>>}}. FIXME: We should reconsider whether we need this special case -- at all. if labelinfo.label == "" and not labelinfo.raw_text then label = "" else label = (labelinfo.omit_comma and "" or wrap_css(",", "comma")) .. (labelinfo.omit_space and "" or "&#32;") .. labelinfo.label end if split_output then labels[i] = label if split_output == "raw" then if labelinfo.categories and labelinfo.categories[1] then if categories then m_table.extend(categories, labelinfo.categories) else categories = labelinfo.categories end end elseif labelinfo.formatted_categories then insert(formatted_categories, labelinfo.formatted_categories) end else labels[i] = label .. (labelinfo.formatted_categories or "") end end local function wrap_open_close(val) if val then return wrap_css(val, "brac") else return "" end end local concatenated_labels = table.concat(labels, "") if not data.no_ib_content then concatenated_labels = wrap_css(concatenated_labels, "content") end local ret_labels = wrap_open_close(data.open) .. concatenated_labels .. wrap_open_close(data.close) if split_output == "raw" then return ret_labels, categories elseif split_output then return ret_labels, concat(formatted_categories) else return ret_labels end end --[==[ Format one or more labels for display and categorization. This provides the implementation of the {{tl|label}}/{{tl|lb}}, {{tl|term label}}/{{tl|tlb}} and {{tl|accent}}/{{tl|a}} templates, and can also be called from a module. The return value is a string to be inserted into the generated page, including the display and categories. On input `data` is an object with the following fields: * `labels`: List of the labels to format. * `lang`: The language of the labels. * `mode`: How the label was invoked; see {get_label_info()} for more information. * `nocat`: If true, don't add the labels to any categories. * `force_cat`: Force adding categories even in namespaces that normally exclude them (e.g. userspace and discussion pages). * `notrack`: Disable all tracking for these labels. * `sort`: Sort key for categorization. * `no_track_already_seen`: Don't track already-seen labels. If not specified, already-seen labels are not displayed again, but still categorize. See the documentation of {get_label_info()}. * `open`: Open bracket or parenthesis to display before the concatenated labels. If {nil}, defaults to an open parenthesis. Set to {false} to disable. * `close`: Close bracket or parenthesis to display after the concatenated labels. If {nil}, defaults to a close parenthesis. Set to {false} to disable. * `no_ib_content`: As in `format_processed_labels()`. * `raw`: As in `format_processed_labels()`. Also suppress wrapping the entire formatted result in a usage label CSS class (see below). * `ok_to_destructively_modify`: If set, the `data` structure will be destructively modified in the process of this function running. Compared with {format_processed_labels()}, this function has the following differences: # The labels specified in `labels` are raw labels (i.e. strings) rather than formatted objects. # The open and close brackets default to parentheses ("round brackets") rather than not being displayed by default. # Tracking of already-seen labels is enabled unless explicitly turned off using `no_track_already_seen`. # The entire formatted result is wrapped in a {"usage-label-<var>type</var>"} CSS class (depending on the value of `mode`), unless `raw` is given. ]==] function export.show_labels(data) if not data.labels then error("`data` must now be an object containing the params") end if not data.ok_to_destructively_modify then data = m_table.shallowCopy(data) data.ok_to_destructively_modify = true end local labels = data.labels if not labels[1] then error("You must specify at least one label.") end local mode = validate_mode(data.mode) if not data.no_track_already_seen then data.already_seen = {} end data.labels = export.process_raw_labels(data) if data.open == nil then data.open = "(" end if data.close == nil then data.close = ")" end local formatted = export.format_processed_labels(data) if data.raw then return formatted else return "<span class=\"" .. mode_to_outer_class[mode] .. "\">" .. formatted .. "</span>" end end --[==[Helper function for the data modules.]==] function export.alias(labels, key, aliases) m_table.alias(labels, key, aliases) end --[==[ Split the display form of a label. Returns two values: `link` and `display`. If the display form consists of a two-part link, `link` is the first part and `display` is the second part. If the display form consists of a single-part link, `link` and `display` are the same. Otherwise (the display form is not a link or contains an embedded link), `link` is the same as the passed-in `label` and `display` is nil. ]==] function export.split_display_form(label) if not label:find("%[%[") then return label, nil end local link, display = label:match("^%[%[([^%[%]|]+)|([^%[%]|]+)%]%]$") if link then return link, display end link = label:match("^%[%[([^%[%]|])+%]%]$") if link then return link, link end return label, nil end --[==[ Combine the `link` and `display` parts of the display form of a label as returned by {split_display_form()}. If `display` is nil, `link` is returned directly. Otherwise, a one-part or two-part link is constructed depending on whether `link` and `display` are the same. (As a special case, if both consist of a blank string, the return value is a blank string rather than a malformed link.) ]==] function export.combine_display_form_parts(link, display) if not display then return link end if link == display then if link == "" then return "" else return ("[[%s]]"):format(link) end end return ("[[%s|%s]]"):format(link, display) end --[==[Used to finalize the data into the form that is actually returned.]==] function export.finalize_data(labels) local shallow_copy = m_table.shallowCopy local aliases = {} for label, data in pairs(labels) do if type(data) == "table" then if data.aliases then for _, alias in ipairs(data.aliases) do aliases[alias] = label end data.aliases = nil end if data.deprecated_aliases then local data2 = shallow_copy(data) data2.deprecated = true data2.canonical = label for _, alias in ipairs(data2.deprecated_aliases) do aliases[alias] = data2 end data.deprecated_aliases = nil data2.deprecated_aliases = nil end end end for label, data in pairs(aliases) do labels[label] = data end return labels end return export 8y4w3lzzgvhvzvuw0dmsn1oub3ws07b मॉड्यूल:labels/data 828 302252 487766 479150 2026-09-02T16:33:34Z SM7 6218 updating... 487766 Scribunto text/plain local labels = {} -- Grammatical labels labels["abbreviation"] = { aliases = {"abbreviations", "abbreviated"}, glossary = true, pos_categories = "abbreviations", } labels["abstract noun"] = { display = "abstract", glossary = true, pos_categories = "abstract nouns", } labels["abstract verb"] = { display = "abstract", glossary = true, pos_categories = "abstract verbs", } labels["acronym"] = { glossary = true, pos_categories = "acronyms", } labels["active voice"] = { aliases = {"active", "in active", "in the active", "in active voice", "in the active voice"}, glossary = true, } labels["ambitransitive"] = { aliases = {"ambitransitively"}, glossary = true, pos_categories = {"transitive verbs", "intransitive verbs"}, } labels["angry register"] = { aliases = {"angry", "anger", "said in anger"}, glossary = true, pos_categories = "angry register terms", } labels["animate"] = { glossary = true, } labels["indicative"] = { aliases = {"in the indicative", "indicative mood"}, glossary = "indicative mood", } labels["subjunctive"] = { aliases = {"in the subjunctive", "subjunctive mood"}, glossary = "subjunctive mood", } labels["imperative"] = { aliases = {"in the imperative", "imperative mood"}, glossary = "imperative mood", } labels["jussive"] = { aliases = {"in the jussive", "jussive mood"}, glossary = "jussive mood", } labels["atelic"] = { glossary = true, } labels["attenuative"] = { pos_categories = "attenuative verbs", } labels["attributive"] = { glossary = true, } labels["attributively"] = { glossary = "attributive", } labels["auxiliary"] = { glossary = true, pos_categories = "auxiliary verbs", } labels["cardinal"] = { aliases = {"cardinal number", "cardinal numeral"}, display = "[[cardinal number]]", pos_categories = "cardinal numbers", } labels["catenative"] = { glossary = "catenative verb", } labels["causative"] = { glossary = true, } labels["causative verb"] = { display = "causative", glossary = true, pos_categories = "causative verbs", } labels["cognate object"] = { aliases = {"with cognate object"}, display = "with [[w:Cognate object|cognate object]]", pos_categories = "verbs used with cognate objects", } labels["collective"] = { glossary = true, display = "collective", pos_categories = "collective nouns", } labels["collectively"] = { glossary = "collective", display = "collectively", pos_categories = "collective nouns", } labels["collective number"] = { aliases = {"collective numeral"}, display = "[[collective number]]", pos_categories = "collective numbers", } labels["common"] = { glossary = true, } labels["comparable"] = { glossary = true, } labels["completive"] = { pos_categories = "completive verbs", } labels["concrete verb"] = { display = "concrete", Wiktionary = true, pos_categories = "concrete verbs", } labels["contraction"] = { aliases = {"contractions", "contracted"}, glossary = true, pos_categories = "contractions", } labels["control verb"] = { aliases = {"control"}, Wikipedia = true, pos_categories = "control verbs", } labels["copulative"] = { aliases = {"copular"}, glossary = true, pos_categories = "copulative verbs", } labels["countable"] = { glossary = true, pos_categories = "countable nouns", } labels["cumulative"] = { pos_categories = "cumulative verbs", } labels["defective adjective"] = { aliases = {"defective a", "defective adj", "defective adjectives"}, display = "defective", glossary = true, pos_categories = "defective adjectives", } labels["defective noun"] = { aliases = {"defective n", "defective nouns"}, display = "defective", glossary = true, pos_categories = "defective nouns", } labels["defective verb"] = { aliases = {"defective v", "defective vb", "defective verbs"}, display = "defective", glossary = true, pos_categories = "defective verbs", } labels["definite"] = { aliases = {"def"}, glossary = true, } labels["deliberate misspelling"] = { deprecated_aliases = {"deliberate mispelling"}, display = "deliberate [[misspelling]]", } labels["delimitative"] = { pos_categories = "delimitative verbs", } labels["deponent"] = { glossary = true, pos_categories = "deponent verbs", } labels["distributive"] = { pos_categories = "distributive verbs", } labels["distributive number"] = { aliases = {"distributive numeral"}, display = "[[distributive number]]", pos_categories = "distributive numbers", } labels["ditransitive"] = { aliases = {"ditransitively"}, glossary = true, pos_categories = "ditransitive verbs", } labels["dual only"] = { aliases = {"dual-only", "dualonly", "duale tantum"}, display = "[[dual]] only", pos_categories = "dualia tantum", } labels["dysphemistic"] = { aliases = {"dysphemism"}, glossary = "dysphemism", pos_categories = "dysphemisms", } labels["by ellipsis"] = { aliases = {"ellipsis"}, glossary = "ellipsis", pos_categories = "ellipses", } labels["elongated"] = { aliases = {"elongation"}, glossary = true, pos_categories = "elongated forms", } labels["emphatic"] = { glossary = true, } labels["ergative"] = { glossary = true, pos_categories = "ergative verbs", } labels["expressive"] = { glossary = true, pos_categories = "expressive terms", } labels["by extension"] = { aliases = {"hence"}, } labels["feminine"] = { glossary = true, } labels["focus"] = { glossary = true, pos_categories = "focus adverbs", } labels["fractional"] = { aliases = {"fractional number", "fractional numeral"}, display = "[[fractional number]]", pos_categories = "fractional numbers", } labels["frequentative"] = { glossary = true, pos_categories = "frequentative verbs", } labels["hedge"] = { aliases = {"hedges"}, glossary = true, pos_categories = "hedges", } labels["ideophonic"] = { aliases = {"ideophone"}, glossary = true, } labels["idiomatic"] = { aliases = {"idiom", "idiomatically"}, glossary = true, pos_categories = "idioms", } labels["imperfect"] = { glossary = true, } labels["imperfective"] = { glossary = true, pos_categories = "imperfective verbs", } labels["impersonal"] = { glossary = "impersonal verb", pos_categories = "impersonal verbs", } labels["in the singular"] = { aliases = {"in singular"}, display = "in the [[singular]]", } labels["in the dual"] = { aliases = {"in dual"}, display = "in the [[dual]]", } labels["in the plural"] = { aliases = {"in plural"}, display = "in the [[Appendix:Glossary#plural|plural]]", } labels["inanimate"] = { aliases = {"not animate"}, glossary = true, } labels["inchoative"] = { glossary = true, pos_categories = "inchoative verbs", } labels["indefinite"] = { aliases = {"indef", "not definite"}, glossary = true, } labels["initialism"] = { glossary = true, pos_categories = "initialisms", } labels["intensive verb"] = { display = "intensive", pos_categories = "intensive verbs", } labels["intransitive"] = { aliases = {"not transitive", "intransitively", "not transitively"}, glossary = true, pos_categories = "intransitive verbs", } labels["IPA"] = { aliases = {"International Phonetic Alphabet"}, Wikipedia = "International Phonetic Alphabet", plain_categories = "IPA symbols", } labels["iterative"] = { glossary = true, pos_categories = "iterative verbs", } labels["litotes"] = { aliases = {"litote", "litotic", "litotical"}, glossary = true, pos_categories = true, } labels["masculine"] = { glossary = true, } labels["mediopassive voice"] = { aliases = {"mediopassive", "middle passive", "middle-passive", "in mediopassive", "in middle passive", "in middle-passive", "in the mediopassive", "in the middle passive", "in the middle-passive", "in mediopassive voice", "in middle passive voice", "in middle-passive voice", "in the mediopassive voice", "in the middle passive voice", "in the middle-passive voice"}, glossary = true, } labels["meiosis"] = { aliases = {"meioses", "meiotic"}, glossary = true, pos_categories = "meioses", } labels["middle voice"] = { aliases = {"middle", "in middle", "in the middle", "in middle voice", "in the middle voice"}, glossary = true, } labels["वर्तनी त्रुटि"] = { deprecated_aliases = {"वर्तनी त्रुटि"}, display = "[[वर्तनी त्रुटि]]", } labels["mnemonic"] = { display = "[[mnemonic]]", pos_categories = "mnemonics", } labels["modal"] = { Wikipedia = "Modality (linguistics)", } labels["modal adverb"] = { aliases = {"modal adverbs"}, display = "modal", Wikipedia = "Modality (linguistics)", pos_categories = "modal adverbs", } labels["modal verb"] = { aliases = {"modal verbs"}, display = "modal", Wikipedia = "Modality (linguistics)", pos_categories = "modal verbs", } labels["NAPA"] = { aliases = {"Americanist_phonetic_notation"}, Wikipedia = "Americanist_phonetic_notation", plain_categories = "NAPA symbols", } labels["always in the negative"] = { display = "always in the [[Appendix:Glossary#negative polarity item|negative]]", pos_categories = "negative polarity items", } labels["chiefly in the negative"] = { aliases = {"chiefly used in the negative", "negative polarity", "negative polarity item", "usually in the negative", "usually used in the negative"}, display = "chiefly in the [[Appendix:Glossary#negative polarity item|negative]]", pos_categories = "negative polarity items", } labels["chiefly in the negative plural"] = { aliases = {"chiefly used in the negative plural", "negative polarity plural", "negative polarity plural item", "usually in the negative plural", "usually used in the negative plural"}, display = "chiefly in the [[Appendix:Glossary#negative polarity item|negative]] [[Appendix:Glossary#plural|plural]]", pos_categories = "negative polarity items", } labels["always in the positive"] = { display = "always in the [[Appendix:Glossary#positive polarity item|positive]]", -- pos_categories = {"positive polarity items"}, } labels["chiefly in the positive"] = { aliases = {"chiefly used in the positive", "positive polarity", "positive polarity item", "usually in the positive", "usually used in the positive"}, display = "chiefly in the [[Appendix:Glossary#positive polarity item|positive]]", -- pos_categories = {"positive polarity items"}, } labels["chiefly in the positive plural"] = { aliases = {"chiefly used in the positive plural", "positive polarity plural", "positive polarity plural item", "usually in the positive plural", "usually used in the positive plural"}, display = "chiefly in the [[Appendix:Glossary#positive polarity item|positive]] [[Appendix:Glossary#plural|plural]]", -- pos_categories = "positive polarity items", } labels["neuter"] = { glossary = true, } -- British English ("ise") labels["nominalised"] = { aliases = {"nominalisation", "substantivised", "substantivisation"}, glossary = "nominalization", pos_categories = "nominalized adjectives", } -- American English ("ize") labels["nominalized"] = { aliases = {"nominalization", "substantivized", "substantivization"}, glossary = "nominalization", pos_categories = "nominalized adjectives", } labels["not comparable"] = { aliases = {"notcomp", "incomparable", "uncomparable"}, glossary = "uncomparable", } labels["onomatopoeia"] = { glossary = true, pos_categories = "onomatopoeias", } labels["ordinal"] = { aliases = {"ordinal number", "ordinal numeral"}, display = "[[ordinal number]]", pos_categories = "ordinal numbers", } labels["partitive verb"] = { display = "[[Appendix:Glossary#transitive|transitive]], usually [[Appendix:Finnic telic and atelic verbs|atelic]]", pos_categories = "transitive verbs", -- = "partitive verbs", } labels["perfect"] = { glossary = true, } labels["participle"] = { glossary = true, } labels["passive voice"] = { aliases = {"passive", "in passive", "in the passive", "in passive voice", "in the passive voice"}, glossary = true, } labels["perfect"] = { glossary = true, } labels["perfective"] = { glossary = true, pos_categories = "perfective verbs", } labels["plural only"] = { aliases = {"plural-only", "pluralonly", "plurale tantum"}, display = "[[Appendix:Glossary#plural|plural]] only", pos_categories = "pluralia tantum", } labels["possessional adjective"] = { aliases = {"possessional", "possessional adjectives"}, display = "possessional", glossary = true, pos_categories = "possessional adjectives", } labels["possessive pronoun"] = { aliases = {"possessive determiner"}, display = "possessive", glossary = "possessive determiner", pos_categories = "possessive pronouns", } labels["postpositive"] = { glossary = true, } labels["predicative"] = { glossary = true, } labels["predicatively"] = { glossary = "predicative", } labels["prepositive"] = { glossary = true, } labels["prescriptive"] = { aliases = {"normative", "prescribed"}, glossary = true, } labels["privative"] = { pos_categories = "privative verbs", } labels["procedure word"] = { display = "[[procedure word]]", } labels["productive"] = { glossary = true, } -- TODO: This label is probably inappropriate for many languages labels["pronominal"] = { glossary = "pronominal verb", } labels["pronunciation spelling"] = { glossary = true, } labels["pro-verb"] = { Wikipedia = true, } labels["reciprocal"] = { glossary = true, pos_categories = "reciprocal verbs", } labels["reflexive"] = { glossary = true, pos_categories = "reflexive verbs", } labels["reflexive pronoun"] = { glossary = "reflexive", pos_categories = "reflexive pronouns", } labels["relational"] = { glossary = true, pos_categories = "relational adjectives", } labels["repetitive"] = { pos_categories = "repetitive verbs", } labels["respelling"] = { glossary = true, } labels["reversative"] = { pos_categories = "reversative verbs", } labels["rhetorical question"] = { glossary = true, pos_categories = "rhetorical questions", } labels["rhotic"] = { glossary = true, } labels["saturative"] = { aliases = {"sative"}, pos_categories = "saturative verbs", } labels["semelfactive"] = { glossary = true, pos_categories = "semelfactive verbs", } labels["sentence adverb"] = { glossary = true, pos_categories = "sentence adverbs", } labels["set phrase"] = { display = "[[set phrase]]", } labels["simile"] = { glossary = true, pos_categories = "similes", } labels["singular only"] = { aliases = {"singular-only", "singulare tantum", "no plural"}, display = "singular only", pos_categories = "singularia tantum", } labels["snowclone"] = { glossary = true, pos_categories = "snowclones", } labels["stative"] = { aliases = {"stative verb"}, glossary = true, pos_categories = "stative verbs", } labels["strictly"] = { aliases = {"strict", "narrowly", "narrow"}, glossary = true, } labels["substantive"] = { glossary = true, track = true, } labels["terminative"] = { pos_categories = "terminative verbs", } labels["transitive"] = { aliases = {"transitively"}, glossary = true, pos_categories = "transitive verbs", } labels["transmission error"] = { Wiktionary = true, } labels["unaccusative"] = { aliases = {"not accusative"}, Wikipedia = "Unaccusative verb", } labels["uncountable"] = { aliases = {"not countable"}, glossary = true, pos_categories = "uncountable nouns", } labels["unergative"] = { aliases = {"not ergative"}, Wikipedia = "Unergative verb", } labels["UPA"] = { aliases = {"Uralic Phonetic Alphabet"}, Wikipedia = "Uralic Phonetic Alphabet", plain_categories = "UPA symbols", } labels["usually plural"] = { aliases = {"usually in the plural", "usually in plural"}, display = "usually in the [[Appendix:Glossary#plural|plural]]", deprecated = true, } -- Usage labels labels["4chan"] = { aliases = {"4chan slang"}, display = "[[w:4chan|4chan]] {{glossary|slang}}", pos_categories = "4chan slang", } labels["4chan lgbt"] = { aliases = {"tttt"}, display = "[[w:4chan|4chan]] /lgbt/ {{glossary|slang}}", pos_categories = "4chan /lgbt/ slang", } labels["ACG"] = { display = "[[ACG]]", -- see also "fandom slang" pos_categories = "fandom slang", } labels["endearing"] = { aliases = {"affectionate"}, display = "[[endearing]]", -- should be "terms with X senses", leaving "X terms" to the term-context temp pos_categories = "endearing terms", } labels["endearing form"] = { aliases = {"affectionate form"}, display = "[[endearing]]", pos_categories = "endearing forms", } labels["pre-classical"] = { aliases = {"Pre-classical", "pre-Classical", "Pre-Classical", "Preclassical", "preclassical", "ante-classical", "Ante-classical", "ante-Classical", "Ante-Classical", "Anteclassical", "anteclassical"}, display = "pre-Classical", regional_categories = true, } labels["anti-LGBTQ slur"] = { -- don't add aliases "homophobia" or "transphobia" because these could be topical categories aliases = {"homophobic", "transphobic"}, display = "anti-[[LGBTQ]] [[slur]]", pos_categories = "anti-LGBTQ slurs", } labels["archaic"] = { aliases = {"antiquated"}, glossary = true, sense_categories = true, } labels["archaic form"] = { glossary = "archaic", display = "archaic", pos_categories = "archaic forms", } labels["Australian slang"] = { display = "[[Australian]] {{glossary|slang}}", regional_categories = "Australian", plain_categories = true, } labels["avoidance"] = { glossary = true, } labels["back slang"] = { aliases = {"backslang", "back-slang"}, glossary = "backslang", pos_categories = true, } labels["Bargoens"] = { Wikipedia = true, plain_categories = true, } labels["Braille"] = { Wikipedia = true, } labels["British slang"] = { aliases = {"UK slang"}, display = "[[British]] {{glossary|slang}}", plain_categories = true, } labels["Cambridge University slang"] = { aliases = {"University of Cambridge slang", "Cantab slang"}, display = "[[w:University of Cambridge|Cambridge University]] {{glossary|slang}}", topical_categories = "Universities", plain_categories = true, } labels["cant"] = { aliases = {"argot", "cryptolect"}, display = "[[cant]]", pos_categories = true, } labels["capitalized"] = { aliases = {"capitalised"}, display = "[[capitalisation|capitalized]]", } labels["Castilianism"] = { aliases = {"Hispanicism"}, display = "[[Castilianism]]", } labels["childish"] = { aliases = {"baby talk", "child language", "infantile", "puerile"}, display = "[[childish]]", -- should be "terms with X senses", leaving "X terms" to the term-context temp? pos_categories = "childish terms", } labels["chu Nom"] = { display = "[[Vietnamese]] [[chữ Nôm]]", plain_categories = "Vietnamese Han tu", } labels["Cockney rhyming slang"] = { display = "[[Cockney rhyming slang]]", plain_categories = true, } labels["colloquial"] = { aliases = {"colloquially"}, glossary = true, pos_categories = "colloquialisms", } -- FIXME! The following two are apparently for Persian but probably don't belong in this file. labels["colloquial-um"] = { glossary = "colloquial", pos_categories = "colloquialisms containing sequence um", } labels["colloquial-un"] = { glossary = "colloquial", pos_categories = "colloquialisms containing sequence un", } labels["corporate jargon"] = { aliases = {"business jargon", "corporatese", "businessese", "corporate speak", "business speak"}, display = "[[corporate]] [[jargon]]", pos_categories = true, } labels["costermongers"] = { aliases = {"coster", "costers", "costermonger", "costermongers back slang", "costermongers' back slang"}, display = "[[Appendix:Costermongers' back slang|costermongers]]", plain_categories = "Costermongers' back slang", } labels["criminal slang"] = { aliases = {"thieves' cant", "Thieves' Cant", "thieves cant", "thieves'", "thieves", "thieves' cant"}, -- Thieves' Cant is English-only, so defined in the English submodule; if other languages try to use it, it's just criminal slang display = "[[criminal]] {{glossary|slang}}", topical_categories = "Crime", pos_categories = true, } labels["dated"] = { aliases = {"old-fashioned"}, glossary = true, -- should be "terms with X senses", leaving "X terms" to the term-context temp pos_categories = "dated terms", } labels["dated form"] = { aliases = {"old-fashioned form"}, glossary = "dated", display = "dated", pos_categories = "dated forms", } -- combine with previous? labels["dated sense"] = { glossary = "dated", sense_categories = "dated", } labels["derogatory"] = { aliases = {"pejorative", "derogative", "disparaging"}, display = "[[derogatory]]", -- should be "terms with X senses", leaving "X terms" to the term-context temp pos_categories = "derogatory terms", } labels["derogatory form"] = { aliases = {"pejorative form", "derogative form", "disparaging form"}, display = "[[derogatory]]", pos_categories = "derogatory forms", } labels["dialect"] = {-- separated from "dialectal" so e.g. "obsolete|outside|the|_|dialect|of..." displays right glossary = "dialectal", pos_categories = "dialectal terms", } labels["dialectal"] = { glossary = true, -- should be "terms with X senses", leaving "X terms" to the term-context temp pos_categories = "dialectal terms", } labels["dialectal form"] = { glossary = "dialectal", display = "dialectal", pos_categories = "dialectal forms", } labels["dialects"] = {-- separated from "dialectal" so e.g. "obsolete|outside|dialects" displays right glossary = "dialectal", pos_categories = "dialectal terms", } labels["dis legomenon"] = { display = "[[dis legomenon]]", pos_categories = "dis legomena", } labels["dismissal"] = { display = "[[dismissal]]", pos_categories = "dismissals", } labels["drag slang"] = { aliases = {"Drag Race slang"}, display = "[[drag]] {{glossary|slang}}", pos_categories = "drag slang", } labels["ecclesiastical"] = { display = "[[ecclesiastical#Adjective|ecclesiastical]]", pos_categories = "ecclesiastical terms", } labels["ethnic slur"] = { aliases = {"racial slur"}, display = "[[ethnic]] [[slur]]", pos_categories = "ethnic slurs", } labels["euphemistic"] = { aliases = {"euphemism"}, glossary = "euphemism", pos_categories = "euphemisms", } labels["eye dialect"] = { display = "[[eye dialect]]", pos_categories = true, } labels["familiar"] = { glossary = true, -- should be "terms with X senses", leaving "X terms" to the term-context temp? pos_categories = "familiar terms", } labels["fandom slang"] = { aliases = {"fandom"}, display = "[[fandom]] {{glossary|slang}}", pos_categories = true, } labels["figurative"] = { aliases = {"metaphorical", "metaphoric", "metaphor"}, glossary = "figurative", } labels["figuratively"] = { aliases = {"metaphorically"}, glossary = "figurative", } labels["folk songs"] = { aliases = {"folksongs", "used in folk songs", "used in folksongs"}, pos_categories = "folk poetic terms", display = "used in [[folk song]]s", } labels["folk tales"] = { aliases = {"folktales", "used in folk tales", "used in folktales"}, pos_categories = "folk poetic terms", display = "used in [[folk tale]]s", } labels["folk poetic"] = { -- should be "terms with X senses", leaving "X terms" to the term-context temp pos_categories = "folk poetic terms", } labels["formal"] = { glossary = true, -- should be "terms with X senses", leaving "X terms" to the term-context temp? pos_categories = "formal terms", } labels["formal form"] = { glossary = "formal", display = "formal", pos_categories = "formal forms", } labels["gay slang"] = { display = "[[gay]] {{glossary|slang}}", pos_categories = true, } labels["gender critical slang"] = { aliases = {"gender-critical slang", "GC slang", "TERF slang"}, display = "[[gender-critical]] {{glossary|slang}}", pos_categories = "gender-critical slang", } labels["gender-neutral"] = { glossary = "gender-neutral", pos_categories = "gender-neutral terms", } labels["graffiti slang"] = { display = "[[graffiti#Noun|graffiti]] {{glossary|slang}}", pos_categories = true, } labels["genericized trademark"] = { aliases = {"genericised trademark", "generic trademark", "proprietary eponym", "gentrade"}, display = "[[genericized trademark]]", pos_categories = "genericized trademarks", } labels["ghost word"] = { aliases = {"ghost"}, display = "ghost word", glossary = true, pos_categories = "ghost words", } labels["hapax legomenon"] = { aliases = {"hapax"}, display = "hapax legomenon", glossary = true, pos_categories = "hapax legomena", } labels["higher register"] = { aliases = {"high register", "elevated register", "elevated"}, glossary = "higher register", pos_categories = "higher register terms", } labels["historical"] = { aliases = {"historic"}, glossary = true, sense_categories = true, } labels["non-native speakers"] = {-- language-agnostic version aliases = {"NNS"}, display = "[[non-native speaker]]s", -- so preceded by "used by", "error by children and", etc? or reword? regional_categories = {"Non-native speakers'"}, } -- used exclusively by languages that use the "Jpan" script code labels["historical hiragana"] = { pos_categories = true, } -- used exclusively by languages that use the "Jpan" script code labels["historical katakana"] = { pos_categories = true, } -- applies to Japanese and Korean, etc., please do not confuse with "polite" labels["honorific"] = { Wikipedia = "Honorifics (linguistics)", -- should be "terms with X senses", leaving "X terms" to the term-context temp? pos_categories = "honorific terms", } -- for Ancient Greek labels["Homeric epithet"] = { display = "[[Homeric Greek|Homeric]] [[w:Epithets in Homer|epithet]]", omit_postComma = true, plain_categories = "Epic Greek", } -- applies to Japanese and Korean, etc. labels["humble"] = { -- should be "terms with X senses", leaving "X terms" to the term-context temp? display = "[[humble]]", pos_categories = "humble terms", } -- for Akkadian labels["in hendiadys"] = { aliases = {"hendiadys"}, display = "in {{w|hendiadys}}", pos_categories = "terms used in hendiadys", } labels["humorous"] = { -- should be "terms with X senses", leaving "X terms" to the term-context temp; NB and cf a similar "jocular" label further up on this page aliases = {"humorously", "jocular"}, glossary = true, pos_categories = "humorous terms", } labels["hyperbolic"] = { aliases = {"hyperbole"}, glossary = true, pos_categories = "hyperboles", } labels["hypercorrect"] = { glossary = true, pos_categories = "hypercorrections", } labels["hyperforeign"] = { glossary = true, pos_categories = "hyperforeign terms", } labels["imperial"] = { aliases = {"emperor", "empress"}, pos_categories = "royal terms", } labels["incel slang"] = { display = "[[incel]] {{glossary|slang}}", pos_categories = true, } labels["informal"] = { aliases = {"informally", "not formal"}, glossary = true, -- should be "terms with X senses", leaving "X terms" to the term-context temp pos_categories = "informal terms", } labels["informal form"] = { glossary = "informal", display = "informal", pos_categories = "informal forms", } labels["Internet slang"] = { aliases = {"internet slang"}, display = "[[Internet]] {{glossary|slang}}", pos_categories = "internet slang", } labels["IRC"] = { display = "[[IRC]]", pos_categories = "internet slang", } labels["ironic"] = { display = "[[irony|ironic]]", } -- Not the same as "journalism", which maps to a topical category (e.g. [[:Category:en:Journalism]], instead of [[:Category:English journalistic terms]]). labels["journalistic"] = { aliases = {"journalese"}, display = "[[journalistic]]", pos_categories = "journalistic terms", } labels["leet"] = { aliases = {"leetspeak"}, display = "[[leetspeak]]", pos_categories = "leetspeak", } labels["LGBTQ slang"] = { aliases = {"LGBT slang"}, display = "[[LGBTQ]] {{glossary|slang}}", pos_categories = true, } labels["literal"] = { glossary = "literally", } labels["literally"] = { glossary = "literally", } labels["literary"] = { -- should be "terms with X senses", leaving "X terms" to the term-context temp aliases = {"bookish"}, glossary = true, pos_categories = "literary terms", } labels["literary form"] = { aliases = {"bookish form"}, glossary = "literary", display = "literary", pos_categories = "literary forms", } --see also "short scale" labels["long scale"] = { display = "[[w:Long and short scales|long scale]]" } labels["loosely"] = { aliases = {"loose", "broadly", "broad"}, glossary = true, } labels["Lubunyaca"] = { display = "[[Lubunyaca]]", pos_categories = true, } labels["medical slang"] = { display = "[[medical]] {{glossary|slang}}", pos_categories = true, } -- for Awetí, Karajá, etc., where men and women use different words labels["men's speech"] = { aliases = {"male speech"}, glossary = "men's speech", pos_categories = "men's speech terms", } labels["metonymic"] = { aliases = {"metonymically", "metonymy", "metonym"}, glossary = true, pos_categories = "metonyms", } labels["military slang"] = { display = "[[military]] {{glossary|slang}}", pos_categories = true, } labels["minced oath"] = { display = "[[minced oath]]", pos_categories = "minced oaths", } labels["multiplicative"] = { aliases = {"multiplicative number", "multiplicative numeral"}, display = "[[multiplicative number]]", pos_categories = "multiplicative numbers", } labels["multiplicity slang"] = { display = "{{l|en|multiplicity|id=multiple personalities}} {{glossary|slang}}", pos_categories = true, } labels["naval slang"] = { aliases = {"navy slang"}, display = "[[naval]] {{glossary|slang}}", pos_categories = true, } labels["neologism"] = { aliases = {"neologistic"}, glossary = true, pos_categories = "neologisms", } labels["neopronoun"] = { display = "[[neopronoun]]", -- pos_categories = {"neopronouns"}, } labels["no longer productive"] = { aliases = {"non-productive"}, display = "no longer [[Appendix:Glossary#productive|productive]]", } labels["nonce word"] = { -- should be "terms with X senses", leaving "X terms" to the term-context temp? aliases = {"nonce"}, glossary = true, pos_categories = "nonce terms", } labels["nonstandard"] = { aliases = {"non-standard", "substandard", "sub-standard"}, glossary = true, -- should be "terms with X senses", leaving "X terms" to the term-context temp pos_categories = "nonstandard terms", } labels["nonstandard form"] = { aliases = {"non-standard form", "substandard form", "sub-standard form"}, glossary = "nonstandard", display = "nonstandard", pos_categories = "nonstandard forms", } labels["numismatic slang"] = { display = "[[numismatic]] {{glossary|slang}}", pos_categories = true, } labels["obsolete"] = { glossary = true, sense_categories = true, } labels["obsolete form"] = { glossary = "obsolete", display = "obsolete", pos_categories = "obsolete forms", } labels["obsolete term"] = { glossary = "obsolete", -- combine with previous two, q.v. pos_categories = "obsolete terms", } labels["offensive"] = { glossary = true, -- should be "terms with X senses", leaving "X terms" to the term-context temp pos_categories = "offensive terms", } labels["officialese"] = { aliases = {"bureaucratic"}, display = "[[officialese]]", pos_categories = "officialese terms", } labels["Oxbridge slang"] = { display = "[[w:Oxbridge|Oxbridge]] {{glossary|slang}}", topical_categories = "Universities", plain_categories = {"Cambridge University slang", "Oxford University slang"}, } labels["Oxford University slang"] = { aliases = {"University of Oxford slang", "Oxon slang"}, display = "[[w:University of Oxford|Oxford University]] {{glossary|slang}}", topical_categories = "Universities", plain_categories = true, } labels["poetic"] = { aliases = {"poi"}, -- Only used in Ancient Greek as a holdover from [[Module:grc:Dialects]]. -- should be "terms with X senses", leaving "X terms" to the term-context temp glossary = true, pos_categories = "poetic terms", } labels["poetic form"] = { glossary = "poetic", display = "poetic", pos_categories = "poetic forms", } labels["polite"] = { glossary = true, pos_categories = "polite terms", } labels["post-classical"] = { aliases = {"Post-classical", "post-Classical", "Post-Classical", "Postclassical", "postclassical"}, display = "post-Classical", regional_categories = true, } labels["prison slang"] = { display = "[[prison]] {{glossary|slang}}", pos_categories = true, } labels["proscribed"] = { glossary = true, pos_categories = "proscribed terms", } labels["puristic"] = { aliases = {"purism"}, Wikipedia = "Linguistic purism", pos_categories = "puristic terms", } labels["radio slang"] = { display = "[[radio]] {{glossary|slang}}", pos_categories = true, } labels["Reddit slang"] = { display = "[[Reddit]] {{glossary|slang}}", pos_categories = true, } labels["rare"] = { aliases = {"rare sense"}, glossary = true, sense_categories = true, } labels["rare form"] = { glossary = "rare", display = "rare", pos_categories = "rare forms", } labels["rare term"] = { display = "rare", -- see comments about "obsolete" pos_categories = "rare terms", } -- cf Cockney rhyming slang labels["rhyming slang"] = { display = "[[rhyming slang]]", pos_categories = true, } labels["religious slur"] = { aliases = {"sectarian slur"}, display = "[[religious]] [[slur]]", pos_categories = "religious slurs", } labels["retronym"] = { glossary = true, pos_categories = "retronyms", } labels["reverential"] = { -- should be "terms with X senses", leaving "X terms" to the term-context temp? display = "[[reverential]]", pos_categories = "reverential terms", } labels["royal"] = { aliases = {"regal"}, pos_categories = "royal terms", } labels["rustic"] = { glossary = true, -- should be "terms with X senses", leaving "X terms" to the term-context temp? aliases = {"rural"}, pos_categories = "rustic terms", } labels["sarcastic"] = { display = "[[sarcastic]]", pos_categories = "sarcastic terms", } labels["school slang"] = { aliases = {"public school slang"}, display = "[[school]] {{glossary|slang}}", pos_categories = true, } labels["self-deprecatory"] = { aliases = {"self-deprecating"}, display = "[[self-deprecatory]]", -- should be "terms with X senses", leaving "X terms" to the term-context temp? pos_categories = "self-deprecatory terms", } -- Swahili Sheng cant / argot -- should this be in a language-specific module? labels["Sheng"] = { Wikipedia = "Sheng slang", plain_categories = true, } labels["siglum"] = { aliases = {"sigla"}, glossary = true, pos_categories = "sigla", } --see also "long scale" labels["short scale"] = { display = "[[w:Long and short scales|short scale]]" } labels["slang"] = { glossary = true, pos_categories = true, } labels["solemn"] = { glossary = true, pos_categories = "solemn terms", } labels["Stenoscript"] = { aliases = {"stenoscript"}, display = "[[Stenoscript]]", pos_categories = "Stenoscript abbreviations", } labels["superseded"] = { glossary = true } labels["swear word"] = { aliases = {"profanity", "expletive"}, pos_categories = "swear words", } labels["syncopated"] = { aliases = {"syncope", "syncopic", "syncopation"}, glossary = true, pos_categories = "syncopic forms", } labels["synecdochic"] = { aliases = {"synecdochically", "synecdochical", "synecdoche"}, glossary = true, pos_categories = "synecdoches", } labels["technical"] = { display = "[[technical]]", pos_categories = "technical terms", } labels["telic"] = { glossary = true, } labels["text messaging"] = { aliases = {"texting"}, display = "[[text messaging]]", pos_categories = "text messaging slang", } labels["tone indicator"] = { display = "[[tone indicator]]", pos_categories = "tone indicators", } labels["trademark"] = { display = "[[trademark]]", pos_categories = "trademarks", } labels["transferred sense"] = { glossary = true, pos_categories = "terms with transferred senses", } labels["transferred senses"] = { display = "[[transferred sense#English|transferred senses]]", pos_categories = "terms with transferred senses", } labels["transgender slang"] = { aliases = {"trans slang"}, display = "[[transgender]] {{glossary|slang}}", pos_categories = true, } labels["Twitch-speak"] = { display = "[[Twitch-speak]]", pos_categories = true, } labels["uds."] = { display = "[[Appendix:Spanish pronouns#Ustedes and vosotros|used formally in Spain]]", } labels["uncommon"] = { glossary = true, sense_categories = true, } labels["uncommon form"] = { glossary = "uncommon", display = "uncommon", pos_categories = "uncommon forms", } labels["university slang"] = { aliases = {"college slang", "student slang"}, display = "[[university]] {{glossary|slang}}", topical_categories = "Universities", pos_categories = "student slang", } labels["verlan"] = { glossary = true, plain_categories = true, } labels["very rare"] = { display = "very [[Appendix:Glossary#rare|rare]]", sense_categories = "rare", } labels["vulgar"] = { aliases = {"coarse", "obscene", "profane"}, glossary = true, pos_categories = "vulgarities", } labels["vesre"] = { Wikipedia = true, plain_categories = true, } labels["youth slang"] = { display = "[[youth]] {{glossary|slang}}", pos_categories = "slang", } labels["2channel slang"] = { aliases = {"2channel", "2ch slang"}, display ="[[w:2channel|2channel]] {{glossary|slang}}", pos_categories = {"internet slang" , "2channel slang"}, } -- for Awetí, Karajá, etc., where men & women use different words labels["women's speech"] = { aliases = {"female speech"}, glossary = "women's speech", pos_categories = "women's speech terms", } -- terms applying to Old Norse skaldic poetry labels["kenning"] = { aliases = {"Kenning"}, Wikipedia = "Kenning", pos_categories = "kennings", } labels["heiti"] = { aliases = {"Heiti"}, Wikipedia = "Heiti", pos_categories = true, } return require("Module:labels").finalize_data(labels) kvqy5ztc6qbizxdczxt5y4jvmz9lbhd मॉड्यूल:labels/data/regional 828 302254 487759 479148 2026-09-02T15:58:10Z SM7 6218 updating... 487759 Scribunto text/plain local labels = {} ------------------------------------------ Generic ------------------------------------------ --not sure where to put this labels["Classical"] = { aliases = {"classical"}, -- "ar", ca", "fa", "id", la", "zh" handled in lang-specific module langs = {"az", "ja", "jv", "kum", "ms", "quc", "sa", "tl"}, special_display = "[[Classical <canonical_name>]]", regional_categories = true, } labels["Epigraphic"] = { langs = {"grc", "pgd", "pra", "sa"}, special_display = "[[w:Epigraphy|Epigraphic <canonical_name>]]", regional_categories = true, } labels["regional"] = { aliases = {"regionally"}, display = "[[regional#English|regional]]", regional_categories = true, } ------------------------------------------ Places ------------------------------------------ labels["Anatri"] = { aliases = {"Lower Chuvash"}, langs = {"cv"}, -- e.g. вот "fire" vs the Upper Chuvash / literary standard вут Wikipedia = true, regional_categories = true, } labels["Australia"] = { aliases = {"AU", "Australian"}, -- "de", "en", "mt", "zh" handled in lang-specific modules langs = {"el", "it", "ko", "ru"}, Wikipedia = true, regional_categories = "Australian", } labels["Black Isle"] = { langs = {"sco"}, -- conceivably also en, gd, perhaps enm, but -sche could only find sco Wikipedia = true, regional_categories = true, } -- WARNING: No existing languages or categories associated with label; add to `langs` as needed labels["Bogor"] = { langs = {}, Wikipedia = true, regional_categories = true, } labels["Brazil"] = { aliases = {"Brazilian"}, -- "pt" handled in lang-specific module langs = {"ja", "mch", "vec", "yi"}, Wikipedia = true, regional_categories = "Brazilian", } -- WARNING: No existing languages or categories associated with label; add to `langs` as needed labels["Brebes"] = { aliases = {"Brebian"}, langs = {}, Wikipedia = "Brebes Regency", regional_categories = true, } labels["Bukovina"] = { aliases = {"Bucovina", "Bukovinian", "Bukowina"}, langs = {"pl", "ro"}, Wikipedia = true, regional_categories = "Bukovinian", } -- WARNING: No existing languages or categories associated with label; add to `langs` as needed labels["Burundi"] = { aliases = {"Burundian"}, langs = {}, Wikipedia = true, regional_categories = "Burundian", } labels["Canada"] = { aliases = {"Canadian"}, -- "en", "fr", "zh" handled in lang-specific module langs = {"gd", "haa", "is", "ko", "ru", "tli", "vi"}, Wikipedia = true, regional_categories = "Canadian", } labels["China"] = { -- "en", "ko" handled in lang-specific module langs = {"ja", "khb", "kk", "mhx", "mn", "ug"}, Wikipedia = true, regional_categories = "Chinese", } labels["Cisalpine"] = { aliases = {"xcg"}, langs = {"cel-gau"}, Wikipedia = "Cisalpine Gaulish", regional_categories = "Cisalpine", } labels["Congo"] = { aliases = {"Democratic Republic of the Congo", "Democratic Republic of Congo", "DR Congo", "Congo-Kinshasa", "Republic of the Congo", "Republic of Congo", "Congo-Brazzaville", "Congolese"}, -- these could be split if need be -- "fr" handled in lang-specific module langs = {"avu", "yom"}, Wikipedia = true, regional_categories = "Congolese", } labels["Cyprus"] = { aliases = {"cypriot", "Cypriot"}, -- "ar", tr" handled in lang-specific module langs = {"el"}, Wikipedia = true, regional_categories = "Cypriot", } labels["Dobruja"] = { aliases = {"Dobrogea", "Dobrujan"}, langs = {"crh", "ro"}, Wikipedia = true, regional_categories = "Dobrujan", } -- WARNING: No existing languages or categories associated with label; add to `langs` as needed labels["Durban"] = { langs = {}, Wikipedia = true, regional_categories = true, } labels["Europe"] = { -- "en", "es", "fr", "pt" handled in lang-specific module langs = {"ur"}, Wikipedia = true, regional_categories = "European", } labels["France"] = { aliases = {"French"}, -- "fr", "zh" handled in lang-specific module langs = {"la", "lad", "nrf", "vi", "yi"}, Wikipedia = true, regional_categories = "French", } labels["India"] = { aliases = {"Indian"}, -- "en", "pa", "pt" handled in lang-specific module langs = {"bn", "dv", "fa", "ml", "ta", "ur"}, Wikipedia = true, regional_categories = "Indian", } labels["Indonesia"] = { aliases = {"Indonesian"}, -- "en", "zh" handled in lang-specific module langs = {"id", "jv", "ms", "nl"}, Wikipedia = true, regional_categories = "Indonesian", } labels["Israel"] = { aliases = {"Israeli"}, -- "ar", en" handled in lang-specific module langs = {"ajp", "he", "ru", "yi"}, Wikipedia = true, regional_categories = "Israeli", } -- WARNING: No existing languages or categories associated with label; add to `langs` as needed labels["Kalix"] = { langs = {}, Wikipedia = true, regional_categories = true, } -- FIXME: Move to Uyghur label data module labels["Kazakhstan"] = { aliases = {"Kazakhstani", "Kazakh"}, langs = {"ug"}, Wikipedia = true, regional_categories = "Kazakhstani", } -- WARNING: No existing languages or categories associated with label; add to `langs` as needed labels["Kemaliye"] = { langs = {}, Wikipedia = true, regional_categories = true, } -- WARNING: No existing languages or categories associated with label; add to `langs` as needed labels["Kitti"] = { langs = {}, Wikipedia = "Kitti, Federated States of Micronesia", regional_categories = true, } -- WARNING: No existing languages or categories associated with label; add to `langs` as needed labels["Kukkuzi"] = { langs = {}, Wikipedia = true, regional_categories = true, } -- WARNING: No existing languages or categories associated with label; add to `langs` as needed labels["Lucknow"] = { langs = {}, Wikipedia = true, regional_categories = true, } -- WARNING: No existing languages or categories associated with label; add to `langs` as needed labels["Luleå"] = { aliases = {"Lulea"}, langs = {}, Wikipedia = true, regional_categories = true, } labels["Lviv"] = { aliases = {"Lvov", "Lwow", "Lwów"}, langs = {"pl"}, Wikipedia = true, regional_categories = true, } -- WARNING: No existing languages or categories associated with label; add to `langs` as needed labels["Muş"] = { aliases = {"Mush"}, langs = {}, Wikipedia = true, regional_categories = true, } labels["Myanmar"] = { aliases = {"Myanmarese", "Burma", "Burmese"}, -- "en", "my", "zh" handled in lang-specific module; FIXME: move ksw and mnw to lang-specific modules langs = {"ksw", "mnw"}, Wikipedia = true, regional_categories = true, } labels["Nigeria"] = { aliases = {"Nigerian"}, -- "ar", en" handled in lang-specific module langs = {"ff", "guw", "ha", "yo"}, Wikipedia = true, regional_categories = "Nigerian", } labels["Palestine"] = { aliases = {"Palestinian"}, -- "ar", "en" handled in lang-specific module langs = {"ajp", "arc"}, Wikipedia = true, regional_categories = "Palestinian", } -- WARNING: No existing languages or categories associated with label; add to `langs` as needed labels["Priangan"] = { langs = {}, Wikipedia = "Parahyangan", regional_categories = true, } -- WARNING: No existing languages or categories associated with label; add to `langs` as needed labels["Rome"] = { aliases = {"Roma", "Romano"}, langs = {}, Wikipedia = true, regional_categories = "Roman", } labels["Scania"] = { aliases = {"Scanian", "Skanian", "Skåne"}, langs = {"gmq-oda", "sv"}, Wikipedia = true, regional_categories = "Scanian", } -- Silesia German, Silesia Polish; for differentiation between sli "Silesian East Central German" -- don't add Silesian as alias labels["Silesia"] = { langs = {"de", "pl"}, Wikipedia = true, } labels["South Africa"] = { aliases = {"South African"}, -- "de", "en", "pt" handled in lang-specific module langs = {"af", "nl", "st", "te", "yi", "zu"}, Wikipedia = true, regional_categories = "South African", } labels["Spain"] = { aliases = {"Spanish", "ES"}, -- "ca", "es" handled in lang-specific module langs = {"la"}, Wikipedia = true, regional_categories = "Spanish", } -- WARNING: No existing languages or categories associated with label; add to `langs` as needed labels["Surati"] = { langs = {}, Wikipedia = "Surat district", regional_categories = true, } -- WARNING: No existing languages or categories associated with label; add to `langs` as needed labels["Surgut"] = { langs = {}, Wikipedia = true, regional_categories = true, } labels["Suriname"] = { aliases = {"Surinamese"}, langs = {"car", "hns", "jv", "nl"}, Wikipedia = true, regional_categories = "Surinamese", } labels["Thailand"] = { aliases = {"Thai"}, -- "en", "zh" handled in lang-specific module langs = {"khb", "mnw", "th"}, Wikipedia = true, regional_categories = "Thai", } labels["Transalpine"] = { aliases = {"xtg"}, langs = {"cel-gau"}, Wikipedia = "Transalpine Gaulish", regional_categories = "Transalpine", } labels["UK"] = { aliases = {"United Kingdom", "Britain", "Brit", "British", "Great Britain"}, -- "en", "zh" handled in lang-specific module langs = {"bn", "ur", "vi"}, Wikipedia = "United Kingdom", regional_categories = "British", } -- WARNING: No existing languages or categories associated with label; add to `langs` as needed labels["Old Ukrainian"] = { langs = {}, Wikipedia = true, plain_categories = true, } labels["US"] = { aliases = {"U.S.", "United States", "United States of America", "USA", "America", "American"}, -- America/American: should these be aliases of 'North America'? -- DO NOT include "es" here, otherwise {{lb|es|American}} will categorize in [[:Category:American Spanish]]; see [[:Category:United States Spanish]]. -- "de", "en", "pt", "zh" handled in lang-specific module langs = {"hi", "is", "it", "ja", "ko", "nl", "ru", "tli", "ur", "vi", "yi"}, Wikipedia = "United States", regional_categories = "American", } -- WARNING: No existing languages or categories associated with label; add to `langs` as needed labels["Vilhelmina"] = { langs = {}, Wikipedia = true, regional_categories = true, } labels["Viryal"] = { aliases = {"Upper Chuvash"}, langs = {"cv"}, Wikipedia = true, regional_categories = true, } -- WARNING: No existing languages or categories associated with label; add to `langs` as needed labels["Wallonia"] = { aliases = {"Wallonian"}, langs = {}, Wikipedia = true, regional_categories = "Wallonian", } -- WARNING: No existing languages or categories associated with label; add to `langs` as needed labels["Special Region of Yogyakarta"] = { aliases = {"SR Yogyakarta"}, langs = {}, Wikipedia = true, regional_categories = true, } -- WARNING: No existing languages or categories associated with label; add to `langs` as needed labels["Zakarpattia"] = { langs = {}, Wikipedia = "Zakarpattia Oblast", regional_categories = true, } -- WARNING: No existing languages or categories associated with label; add to `langs` as needed labels["Zululand"] = { langs = {}, Wikipedia = true, regional_categories = true, } ------------------------------------------ Chinese romanizations ------------------------------------------ labels["Hanyu Pinyin"] = { aliases = {"Hanyu pinyin", "Pinyin", "pinyin"}, Wikidata = "Q42222", plain_categories = true, } labels["Postal Romanization"] = { aliases = {"Postal romanization", "postal romanization"}, Wikidata = "Q151868", plain_categories = true, } labels["Tongyong Pinyin"] = { aliases = {"Tongyong pinyin"}, Wikidata = "Q700739", plain_categories = true, } labels["Wade–Giles"] = { aliases = {"Wade-Giles"}, Wikidata = "Q208442", plain_categories = true, } return require("Module:labels").finalize_data(labels) 473c6skcpxp1apfry68vrgkn72k2wlr मॉड्यूल:labels/data/topical 828 302256 487758 479147 2026-09-02T15:57:01Z SM7 6218 updating... 487758 Scribunto text/plain local labels = {} -- To sort these, you first have to convert each label section into a single line, and then sort the lines, and undo -- the single-line conversion. This can be done using Vim commands, something like this: -- 1. Mark the first line to be changed using `ma`. -- 2. Go to the last line and use `'a,.s/\n/\\n/g` to convert newlines to \n sequences. -- 3. Use `'a,.s/\\n\\n/\r/g` to convert sequences of two \n's (marking section divisions) back to newlines. -- 4. Go to the last line again and use `'a,.!sort -f -d` to sort. The `-f` makes it case-insensitive and the `-d` -- selects "dictionary order", which is needed to get 'yoga' to sort before 'yoga pose' instead of the other way -- around. -- 5. Go to the last line again and use `'a,.s/\\n/\r/g` to convert \n sequences back to newlines. -- 6. Go to the last line again and use `'a,.s/^labels/\rlabels/` to put an extra newline before each section. labels["3D printing"] = { aliases = {"3D printer", "3D printers"}, Wiktionary = "3D printing#Noun", Wikipedia = true, Wikidata = "Q229367", topical_categories = true, } labels["ABDL"] = { aliases = {"AB/DL"}, Wiktionary = true, Wikipedia = true, topical_categories = true, } labels["Abrahamism"] = { Wiktionary = "Abrahamism#Noun", topical_categories = true, } labels["accounting"] = { Wiktionary = "accounting#Noun", topical_categories = true, } labels["acoustics"] = { Wiktionary = true, topical_categories = true, } labels["acting"] = { Wiktionary = "acting#Noun", topical_categories = true, } labels["advertising"] = { Wiktionary = "advertising#Noun", topical_categories = true, } labels["aeronautics"] = { Wiktionary = true, topical_categories = true, } labels["aerospace"] = { Wiktionary = true, topical_categories = true, } labels["aesthetic"] = { aliases = {"aesthetics"}, Wiktionary = true, topical_categories = "Aesthetics", } labels["age regression"] = { aliases = {"agere", "agereg"}, Wiktionary = true, topical_categories = "Age regression" } labels["ageplay"] = { aliases = {"age play"}, Wiktionary = true, topical_categories = true, } labels["agriculture"] = { aliases = {"farming"}, Wiktionary = true, topical_categories = true, } labels["Ahmadiyya"] = { aliases = {"Ahmadiyyat", "Ahmadi"}, Wiktionary = true, topical_categories = true, } labels["aircraft"] = { Wiktionary = true, topical_categories = true, } labels["alchemy"] = { Wiktionary = true, topical_categories = true, } labels["alcoholic beverages"] = { aliases = {"alcohol"}, display = "[[alcoholic#Adjective|alcoholic]] [[beverage]]s", topical_categories = true, } labels["alcoholism"] = { Wiktionary = true, topical_categories = true, } labels["algebra"] = { Wiktionary = true, topical_categories = true, } labels["algebraic geometry"] = { Wiktionary = true, topical_categories = true, } labels["algebraic topology"] = { Wiktionary = true, topical_categories = true, } labels["alternative history"] = { aliases = {"alt hist", "alternate history"}, Wikidata = "Q224989", topical_categories = true, } labels["alternative medicine"] = { Wiktionary = true, topical_categories = true, } labels["alt-right"] = { aliases = {"altright", "Alt-right", "Altright"}, Wiktionary = true, topical_categories = true, } labels["amateur radio"] = { aliases = {"ham radio"}, Wiktionary = true, topical_categories = true, } labels["American football"] = { Wiktionary = true, topical_categories = "Football (American)", } labels["amino acid"] = { display = "[[biochemistry]]", topical_categories = "Amino acids", } labels["analytic geometry"] = { Wiktionary = true, topical_categories = "Geometry", } labels["analytical chemistry"] = { display = "[[analytical]] [[chemistry]]", topical_categories = true, } labels["anarchism"] = { Wiktionary = true, topical_categories = true, } labels["anatomy"] = { Wiktionary = true, topical_categories = true, } labels["Ancient Greece"] = { aliases = {"ancient Greece"}, Wiktionary = true, topical_categories = true, } labels["Ancient Rome"] = { aliases = {"ancient Rome"}, Wiktionary = true, topical_categories = true, } labels["Anglicanism"] = { aliases = {"Anglican", "Anglicanist", "Anglican Church"}, Wiktionary = true, topical_categories = true, } labels["animation"] = { Wiktionary = true, topical_categories = true, } labels["anime"] = { Wiktionary = true, topical_categories = "Japanese fiction", } labels["anthropology"] = { Wiktionary = true, topical_categories = true, } labels["Arabian god"] = { display = "[[Arabian]] [[mythology]]", topical_categories = "Arabian deities", } labels["arachnology"] = { Wiktionary = true, topical_categories = true, } labels["archaeological culture"] = { aliases = {"archeological culture", "archaeological cultures", "archeological cultures"}, display = "[[archaeology]]", topical_categories = "Archaeological cultures", } labels["archaeology"] = { aliases = {"archeology"}, Wiktionary = true, topical_categories = true, } labels["archery"] = { Wiktionary = true, topical_categories = true, } labels["architectural element"] = { aliases = {"architectural elements"}, display = "[[architecture]]", topical_categories = "Architectural elements", } labels["architecture"] = { Wiktionary = true, topical_categories = true, } labels["Argentine politics"] = { aliases = {"Argentina politics", "Argentinian politics"}, Wikipedia = "Politics of Argentina", topical_categories = true, } labels["arithmetic"] = { Wiktionary = true, topical_categories = true, } labels["Armenian mythology"] = { display = "[[Armenian]] [[mythology]]", topical_categories = true, } labels["art"] = { aliases = {"arts"}, Wiktionary = "art#Noun", topical_categories = true, } labels["Arthurian legend"] = { aliases = {"Arthurian mythology"}, Wikipedia = "Matter_of_Britain#Arthurian_legend", topical_categories = "Arthurian mythology", } labels["artificial intelligence"] = { aliases = {"AI"}, Wiktionary = true, topical_categories = true, } labels["artillery"] = { display = "[[weaponry]]", topical_categories = true, } labels["artistic work"] = { display = "[[art#Noun|art]]", topical_categories = "Artistic works", } labels["asterism"] = { display = "[[uranography]]", topical_categories = "Asterisms", } labels["asteroid"] = { display = "[[astronomy]]", topical_categories = {"Asteroids", "Astronomy"} } labels["astrology"] = { aliases = {"horoscope", "zodiac"}, Wiktionary = true, topical_categories = true, } labels["astronautics"] = { aliases = {"rocketry"}, Wiktionary = true, topical_categories = true, } labels["astronomy"] = { Wiktionary = true, topical_categories = true, } labels["astrophysics"] = { Wiktionary = true, topical_categories = true, } labels["Asturian mythology"] = { display = "[[Asturian]] [[mythology]]", topical_categories = true, } labels["athletics"] = { Wiktionary = true, topical_categories = true, } labels["Australian Aboriginal mythology"] = { Wikipedia = true, topical_categories = true, } labels["Australian politics"] = { Wikipedia = "Politics of Australia", topical_categories = true, } labels["Australian rules football"] = { aliases = {"Australian Rules football"}, Wiktionary = true, topical_categories = true, } labels["autism"] = { Wiktionary = true, Wikipedia = true, topical_categories = true, } labels["auto parts"] = { display = "[[automotive]]", topical_categories = true, } labels["automotive"] = { aliases = {"automotives"}, Wiktionary = true, topical_categories = true, } labels["automotive parts"] = { display = "[[automotive]]", topical_categories = true, } labels["aviation"] = { aliases = {"air transport"}, Wiktionary = true, topical_categories = true, } labels["backgammon"] = { Wiktionary = true, topical_categories = true, } labels["bacteria"] = { display = "[[bacteriology]]", topical_categories = true, } labels["bacteriology"] = { Wiktionary = true, topical_categories = true, } labels["badminton"] = { Wiktionary = true, topical_categories = true, } labels["Baháʼí Faith"] = { aliases = {"Baháʼí", "Bahaʼi", "Bahá'í", "Baha'i", "Bahai", "Bahaʼi Faith", "Bahá'í Faith", "Baha'i Faith", "Bahai Faith"}, Wiktionary = true, topical_categories = true, } labels["baking"] = { Wiktionary = "baking#Noun", topical_categories = true, } labels["ball games"] = { aliases = {"ball sports"}, display = "[[ball game]]s", topical_categories = true, } labels["ballet"] = { Wiktionary = true, topical_categories = true, } labels["ballistics"] = { Wiktionary = true, topical_categories = true, } labels["Bangladeshi politics"] = { Wikipedia = "Politics of Bangladesh", topical_categories = true, } labels["banking"] = { Wiktionary = "banking#Noun", topical_categories = true, } labels["baseball"] = { Wiktionary = true, topical_categories = true, } labels["basketball"] = { Wiktionary = true, topical_categories = true, } labels["BDSM"] = { Wiktionary = true, topical_categories = true, } labels["beekeeping"] = { aliases = {"melittology", "apiology", "apidology"}, -- could potentially be split out Wiktionary = true, topical_categories = true, } labels["beer"] = { Wiktionary = true, topical_categories = true, } labels["betting"] = { aliases = {"bet", "bets"}, display = "[[gambling#Noun|gambling]]", topical_categories = true, } labels["biblical"] = { aliases = {"Bible", "bible", "Biblical"}, Wiktionary = "Bible", topical_categories = "Bible", } labels["biblical character"] = { aliases = {"Biblical character", "biblical figure", "Biblical figure"}, display = "[[Bible|biblical]]", topical_categories = "Biblical characters", } labels["bibliography"] = { Wiktionary = true, topical_categories = true, } labels["bicycle parts"] = { aliases = {"bicycle part"}, display = "[[w:List of bicycle parts|cycling]]", topical_categories = true, } labels["billiards"] = { aliases = {"cue sports"}, Wiktionary = true, topical_categories = true, } labels["bingo"] = { Wiktionary = true, topical_categories = true, } labels["biochemistry"] = { Wiktionary = true, topical_categories = true, } labels["biology"] = { aliases = {"biological"}, Wiktionary = true, topical_categories = true, } labels["biotechnology"] = { aliases = {"biotechnological"}, Wiktionary = true, topical_categories = true, } labels["birdwatching"] = { aliases = {"birding"}, Wiktionary = "birdwatching#Noun", topical_categories = true, } labels["blacksmithing"] = { aliases = {"blacksmith"}, Wiktionary = true, topical_categories = true, } labels["blogging"] = { aliases = {"blog"}, Wiktionary = "blogging#Noun", topical_categories = "Internet", } labels["board games"] = { aliases = {"board game"}, display = "[[board game]]s", topical_categories = true, } labels["board sports"] = { Wiktionary = "boardsport", topical_categories = true, } labels["bodybuilding"] = { Wiktionary = "bodybuilding#Noun", topical_categories = true, } labels["book of the Bible"] = { aliases = {"book of the bible", "books of the Bible", "books of the bible", "Biblical book", "biblical book"}, display = "[[Bible|biblical]]", topical_categories = "Books of the Bible", } labels["bookbinding"] = { Wiktionary = true, topical_categories = true, } labels["botany"] = { Wiktionary = true, topical_categories = true, } labels["bowling"] = { Wiktionary = "bowling#Noun", topical_categories = true, } labels["bowls"] = { aliases = {"lawn bowls", "crown green bowls"}, Wiktionary = true, topical_categories = "Bowls (game)", } labels["boxing"] = { Wiktionary = "boxing#Noun", topical_categories = true, } labels["brass instruments"] = { aliases = {"brass instrument"}, display = "[[music]]", topical_categories = true, } labels["Brazilian politics"] = { Wikipedia = "Politics of Brazil", topical_categories = true, } labels["brewing"] = { Wiktionary = "brewing#Noun", topical_categories = true, } labels["bridge"] = { Wiktionary = "bridge#English:_game", topical_categories = true, } labels["broadcasting"] = { Wiktionary = "broadcasting#Noun", topical_categories = true, } labels["bryology"] = { Wiktionary = true, topical_categories = true, } labels["Buddhism"] = { Wiktionary = true, topical_categories = true, } labels["Buddhist deity"] = { aliases = {"Buddhist god", "Buddhist goddess"}, display = "[[Buddhism]]", topical_categories = "Buddhist deities", } labels["Bulgarian politics"] = { Wikipedia = "Politics of Bulgaria", topical_categories = true, } labels["bullfighting"] = { aliases = {"bullfight"}, Wiktionary = true, topical_categories = true, } labels["business"] = { aliases = {"professional"}, Wiktionary = true, topical_categories = true, } labels["Byzantine Empire"] = { aliases = {"Byzantine"}, Wiktionary = true, topical_categories = true, } labels["calculus"] = { Wiktionary = true, topical_categories = true, } labels["calligraphy"] = { Wiktionary = true, topical_categories = true, } labels["Calvinism"] = { aliases = {"Calvinist", "Reformed Christianity", "Calvinist Church", "Reformed Church"}, Wikipedia = true, topical_categories = true, } labels["Canadian football"] = { Wiktionary = true, topical_categories = true, } labels["Canadian politics"] = { Wikipedia = "Politics of Canada", topical_categories = true, } labels["Candomblé"] = { aliases = {"candomblé"}, Wiktionary = true, topical_categories = true, } labels["canid"] = { display = "[[zoology]]", topical_categories = "Canids", } labels["canoeing"] = { aliases = {"canoe"}, Wiktionary = "canoeing#Noun", topical_categories = "Water sports", } labels["capitalism"] = { aliases = {"capitalist"}, Wiktionary = true, topical_categories = true, } labels["carbohydrate"] = { aliases = {"carbohydrates"}, display = "[[biochemistry]]", topical_categories = "Carbohydrates", } labels["carboxylic acid"] = { aliases = {"carboxylic acids"}, display = "[[organic chemistry]]", topical_categories = "Carboxylic acids", } labels["card games"] = { aliases = {"cards", "card game", "playing card"}, display = "[[card game]]s", topical_categories = true, } labels["cardiology"] = { Wiktionary = true, topical_categories = true, } labels["carpentry"] = { Wiktionary = true, topical_categories = true, } labels["cartography"] = { Wiktionary = true, topical_categories = true, } labels["cartomancy"] = { Wiktionary = true, topical_categories = true, } labels["castells"] = { Wiktionary = true, topical_categories = true, } labels["category theory"] = { Wiktionary = true, topical_categories = true, } labels["Catholicism"] = { aliases = {"catholicism", "Catholic", "catholic"}, Wiktionary = true, topical_categories = true, } labels["caving"] = { Wiktionary = "caving#Noun", topical_categories = true, } labels["cellular automata"] = { Wiktionary = true, topical_categories = true, } labels["Celtic mythology"] = { display = "[[Celtic]] [[mythology]]", topical_categories = true, } labels["ceramics"] = { Wiktionary = true, topical_categories = true, } labels["cheerleading"] = { Wiktionary = "cheerleading#Noun", topical_categories = true, } labels["chemical element"] = { display = "[[chemistry]]", topical_categories = "Chemical elements", } labels["chemical element symbol"] = { -- Compare "systematic chemical element symbol" and "obsolete chemical element symbol". display = "[[chemistry]]", plain_categories = "Chemical element symbols", } labels["chemical engineering"] = { Wiktionary = true, topical_categories = true, } labels["chemistry"] = { aliases = {"chemical"}, Wiktionary = true, topical_categories = true, } labels["chess"] = { Wiktionary = true, topical_categories = true, } labels["children's games"] = { aliases = {"children's game"}, display = "[[children|children's]] [[game]]s", topical_categories = true, } labels["Chilean politics"] = { Wikipedia = "Politics of Chile", topical_categories = true, } labels["Chinese astronomy"] = { display = "[[Chinese]] [[astronomy]]", topical_categories = true, } labels["Chinese calligraphy"] = { display = "[[Chinese]] [[calligraphy]]", topical_categories = "Calligraphy", } labels["Chinese constellation"] = { display = "[[Chinese]] [[astronomy]]", topical_categories = "Constellations", } labels["Chinese folk religion"] = { display = "[[Chinese]] [[folk religion]]", topical_categories = "Religion", } labels["Chinese linguistics"] = { display = "[[Chinese]] [[linguistics]]", topical_categories = "Linguistics", } labels["Chinese mythology"] = { display = "[[Chinese]] [[mythology]]", topical_categories = true, } labels["Chinese philosophy"] = { display = "[[Chinese]] [[philosophy]]", topical_categories = true, } labels["Chinese phonetics"] = { display = "[[Chinese]] [[phonetics]]", topical_categories = true, } labels["Chinese religion"] = { display = "[[Chinese]] [[religion]]", topical_categories = "Religion", } labels["Chinese star"] = { display = "[[Chinese]] [[astronomy]]", topical_categories = "Stars", } labels["Christianity"] = { aliases = {"christianity", "Christian", "christian"}, Wiktionary = true, topical_categories = true, } labels["Church of England"] = { aliases = {"C of E", "CofE"}, Wikipedia = true, topical_categories = true, } labels["Church of the East"] = { Wiktionary = true, topical_categories = true, } labels["cinematography"] = { aliases = {"filmology"}, Wiktionary = true, topical_categories = true, } labels["cladistics"] = { Wiktionary = true, topical_categories = "Taxonomy", } labels["classical mechanics"] = { Wiktionary = true, topical_categories = true, } labels["classical studies"] = { Wiktionary = true, topical_categories = true, } labels["climate change"] = { Wiktionary = true, topical_categories = true, } labels["climatology"] = { Wiktionary = true, topical_categories = true, } labels["climbing"] = { aliases = {"rock climbing"}, Wiktionary = "climbing#Noun", topical_categories = true, } labels["clinical psychology"] = { Wiktionary = true, topical_categories = true, } labels["clothing"] = { Wiktionary = "clothing#Noun", topical_categories = true, } labels["cloud computing"] = { Wiktionary = true, topical_categories = "Computing", } labels["cockfighting"] = { aliases = {"cockfight"}, Wiktionary = true, topical_categories = true, } labels["codicology"] = { Wiktionary = true, topical_categories = true, } labels["coenzyme"] = { aliases = {"coenzymes"}, display = "[[biochemistry]]", topical_categories = "Coenzymes", } labels["coins"] = { -- Do not merge with "numismatics", as the category is different. aliases = {"coin"}, display = "[[numismatics]]", topical_categories = true, } labels["collectible card games"] = { aliases = {"trading card games", "collectible cards", "trading cards"}, Wikipedia = true, topical_categories = true, } labels["combinatorics"] = { Wiktionary = true, topical_categories = true, } labels["comedy"] = { Wiktionary = true, topical_categories = true, } labels["comics"] = { Wiktionary = true, topical_categories = true, } labels["commerce"] = { Wiktionary = true, topical_categories = true, } labels["commercial law"] = { display = "[[commercial#Adjective|commercial]] [[law]]", topical_categories = true, } labels["communication"] = { aliases = {"communications"}, Wiktionary = true, topical_categories = true, } labels["communism"] = { aliases = {"Communism", "communist"}, Wiktionary = true, topical_categories = true, } labels["compilation"] = { aliases = {"compiler"}, display = "[[software]] [[compilation]]", topical_categories = true, } labels["complex analysis"] = { Wiktionary = true, topical_categories = true, } labels["computational linguistics"] = { Wiktionary = true, topical_categories = true, } labels["computer chess"] = { Wiktionary = true, topical_categories = true, } labels["computer games"] = { aliases = {"computer game", "computer gaming"}, display = "[[computer game]]s", topical_categories = "Video games", } labels["computer graphics"] = { Wiktionary = true, topical_categories = true, } labels["computer hardware"] = { display = "[[computer]] [[hardware]]", topical_categories = true, } labels["computer languages"] = { aliases = {"computer language", "programming language", "programming languages"}, display = "[[computer language]]s", topical_categories = true, } labels["computer science"] = { aliases = {"comp sci", "CompSci", "compsci"}, Wiktionary = true, topical_categories = true, } labels["computer security"] = { Wiktionary = true, topical_categories = true, } labels["computing"] = { aliases = {"computer", "computers"}, Wiktionary = "computing#Noun", topical_categories = true, } labels["computing theory"] = { aliases = {"comptheory", "computability theory"}, display = "[[computing#Noun|computing]] [[theory]]", topical_categories = "Theory of computing", } labels["conchology"] = { Wiktionary = true, topical_categories = true, } labels["Confucianism"] = { Wiktionary = true, topical_categories = true, } labels["conlanging"] = { aliases = {"conlang", "conlanger", "constructed languages", "constructed language"}, Wiktionary = true, topical_categories = true, } labels["conservatism"] = { aliases = {"conservative"}, Wiktionary = true, topical_categories = true, } labels["conspiracy theories"] = { aliases = {"conspiracy theory", "conspiracy"}, Wiktionary = "conspiracy theory#Noun", topical_categories = true, } labels["constellation"] = { display = "[[astronomy]]", topical_categories = "Constellations", } labels["construction"] = { Wiktionary = true, topical_categories = true, } labels["control theory"] = { Wiktionary = true, topical_categories = true, } labels["cooking"] = { aliases = {"culinary", "cuisine", "cookery", "gastronomy"}, Wiktionary = "cooking#Noun", topical_categories = true, } labels["cookware"] = { aliases = {"bakeware"}, display = "[[cooking#Noun|cooking]]", topical_categories = "Cookware and bakeware", } labels["Coptic Orthodoxy"] = { aliases = {"Coptic Orthodox", "Coptic Orthodox Church"}, Wikipedia = true, topical_categories = true, } labels["copyright"] = { aliases = {"copyright law", "intellectual property", "intellectual property law", "IP law"}, display = "[[copyright]] [[law]]", topical_categories = true, } labels["copyright license"] = { aliases = {"copyright licenses", "license", "copyright licence", "copyright licences", "licence"}, display = "[[w:Copyright license|copyright law]]", Wikipedia = true, topical_categories = "Copyright licenses", } labels["cosmetics"] = { aliases = {"cosmetology"}, Wiktionary = true, topical_categories = true, } labels["cosmology"] = { Wiktionary = true, topical_categories = true, } labels["creationism"] = { aliases = {"baraminology"}, Wiktionary = "creationism#English", topical_categories = true, } labels["cribbage"] = { Wiktionary = true, topical_categories = true, } labels["cricket"] = { Wiktionary = true, topical_categories = true, } labels["crime"] = { aliases = {"criminal"}, Wiktionary = true, topical_categories = true, } labels["criminal law"] = { Wiktionary = true, topical_categories = true, } labels["criminology"] = { Wiktionary = true, topical_categories = true, } labels["crochet"] = { aliases = {"crocheting"}, Wiktionary = true, topical_categories = true, } labels["croquet"] = { Wiktionary = true, topical_categories = true, } labels["crosswording"] = { aliases = {"crosswords", "cruciverbalism", "cryptic crosswords", "crossword puzzles"}, Wiktionary = true, topical_categories = true, } labels["cryptocurrencies"] = { aliases = {"cryptocurrency", "crypto"}, Wiktionary = "cryptocurrency", topical_categories = "Cryptocurrency", } labels["cryptography"] = { aliases = {"cryptographic"}, Wiktionary = true, topical_categories = true, } labels["cryptozoology"] = { Wiktionary = true, topical_categories = true, } labels["crystallography"] = { Wiktionary = true, topical_categories = true, } labels["cultural anthropology"] = { Wiktionary = true, topical_categories = true, } labels["curling"] = { Wiktionary = true, topical_categories = true, } labels["currencies"] = { -- Do not merge with "numismatics", as the category is different. aliases = {"currency"}, display = "[[numismatics]]", topical_categories = true, } labels["cybernetics"] = { aliases = {"cybernetic"}, Wiktionary = true, topical_categories = true, } labels["cybersecurity"] = { Wiktionary = true, topical_categories = "Networking", } labels["cycle racing"] = { aliases = {"cycle sport"}, Wikipedia = "cycle sport", topical_categories = true, } labels["cycling"] = { aliases = {"bicycling", "bicycle", "bike"}, Wiktionary = "cycling#Noun", topical_categories = true, } labels["cytology"] = { aliases = {"cell biology", "cellular biology"}, Wiktionary = true, topical_categories = true, } labels["dance"] = { aliases = {"dancing"}, Wiktionary = "dance#Noun", topical_categories = true, } labels["dances"] = { display = "[[dance#Noun|dance]]", topical_categories = true, } labels["darts"] = { Wiktionary = true, topical_categories = true, } labels["data management"] = { Wiktionary = true, topical_categories = true, } labels["data modeling"] = { Wiktionary = true, topical_categories = true, } labels["databases"] = { aliases = {"database"}, display = "[[database]]s", topical_categories = true, } labels["decision theory"] = { Wiktionary = true, topical_categories = true, } labels["deltiology"] = { Wiktionary = true, topical_categories = true, } labels["demography"] = { aliases = {"demographics"}, Wiktionary = true, topical_categories = true, } labels["demonym"] = { aliases = {"demonyms"}, Wiktionary = true, topical_categories = "Demonyms", } labels["demoscene"] = { topical_categories = true, } labels["dentistry"] = { aliases = {"dentist"}, Wiktionary = true, topical_categories = true, } labels["dermatology"] = { Wiktionary = true, topical_categories = true, } labels["design"] = { Wiktionary = "design#Noun", topical_categories = true, } labels["developmental psychology"] = { Wiktionary = true, topical_categories = "Psychology", } labels["dice games"] = { aliases = {"dice"}, display = "[[dice game]]s", topical_categories = true, } labels["dictation"] = { Wiktionary = true, topical_categories = true, } labels["differential geometry"] = { Wiktionary = true, topical_categories = true, } labels["diplomacy"] = { Wiktionary = true, topical_categories = true, } labels["disc golf"] = { Wiktionary = true, topical_categories = true, } labels["disease"] = { aliases = {"diseases"}, display = "[[pathology]]", topical_categories = "Diseases", } labels["divination"] = { Wiktionary = true, topical_categories = true, } labels["diving"] = { Wiktionary = "diving#Noun", topical_categories = true, } labels["dominoes"] = { Wiktionary = true, topical_categories = true, } labels["dou dizhu"] = { Wikipedia = true, topical_categories = true, } labels["drama"] = { Wiktionary = true, topical_categories = true, } labels["dressage"] = { Wiktionary = true, topical_categories = true, } labels["E number"] = { display = "[[food]] [[manufacture]]", plain_categories = "European food additive numbers", } labels["early Christianity"] = { aliases = {"early christianity", "Early Christianity", "early Church", "early church", "Early Church", "the early Church", "the early church", "the Early Church"}, Wikipedia = true, topical_categories = true, } labels["earth science"] = { Wiktionary = true, topical_categories = "Earth sciences", } labels["Eastern Catholicism"] = { aliases = {"Eastern Catholic"}, Wikipedia = true, topical_categories = true, } labels["Eastern Christianity"] = { aliases = {"Eastern christianity", "Eastern Christian", "Eastern christian", "Eastern Church", "Eastern church"}, Wikipedia = true, topical_categories = true, } labels["Eastern Orthodoxy"] = { aliases = {"Eastern Orthodox", "Eastern Orthodox Church"}, Wikipedia = true, topical_categories = true, } labels["eating disorders"] = { aliases = {"eating disorder"}, display = "[[eating disorder]]s", topical_categories = true, } labels["ecology"] = { Wiktionary = true, topical_categories = true, } labels["economics"] = { Wiktionary = true, topical_categories = true, } labels["education"] = { Wiktionary = true, topical_categories = true, } labels["Egyptian god"] = { aliases = {"Egyptian goddess", "Egyptian deity"}, display = "[[Egyptian]] [[mythology]]", topical_categories = "Egyptian deities", } labels["Egyptian mythology"] = { display = "[[Egyptian]] [[mythology]]", topical_categories = true, } labels["Egyptology"] = { Wiktionary = true, aliases = {"Ancient Egypt"}, topical_categories = "Ancient Egypt", } labels["electrencephalography"] = { Wiktionary = true, topical_categories = true, } labels["electrical engineering"] = { Wiktionary = true, topical_categories = true, } labels["electricity"] = { aliases = {"electrical"}, Wiktionary = true, topical_categories = true, } labels["electrochemistry"] = { aliases = {"electrochemical"}, Wiktionary = true, topical_categories = true, } labels["electrodynamics"] = { Wiktionary = true, topical_categories = true, } labels["electromagnetism"] = { Wiktionary = true, topical_categories = true, } labels["electronics"] = { Wiktionary = true, topical_categories = true, } labels["embryology"] = { Wiktionary = true, topical_categories = true, } labels["emergency medicine"] = { Wiktionary = true, topical_categories = true, } labels["emergency services"] = { Wiktionary = true, topical_categories = true, } labels["endocrinology"] = { Wiktionary = true, topical_categories = true, } labels["engineering"] = { Wiktionary = "engineering#Noun", topical_categories = true, } labels["enterprise engineering"] = { Wiktionary = true, topical_categories = true, } labels["entomology"] = { Wiktionary = true, topical_categories = true, } labels["enzyme"] = { aliases = {"enzymes"}, display = "[[biochemistry]]", topical_categories = "Enzymes", } labels["epidemiology"] = { Wiktionary = true, topical_categories = true, } labels["epigraphy"] = { Wiktionary = true, topical_categories = true, } labels["epistemology"] = { Wiktionary = true, topical_categories = true, } labels["equestrianism"] = { aliases = {"equestrian", "horses", "horsemanship"}, Wiktionary = true, topical_categories = true, } labels["espionage"] = { Wiktionary = true, topical_categories = true, } labels["ethics"] = { aliases = {"ethical"}, Wiktionary = true, topical_categories = true, } labels["ethnography"] = { Wiktionary = true, topical_categories = true, } labels["ethology"] = { Wiktionary = true, topical_categories = true, } labels["EU politics"] = { aliases = {"European Union politics"}, Wikipedia = "Politics of the European Union", topical_categories = true, } labels["European folklore"] = { display = "[[European]] [[folklore]]", topical_categories = true, } labels["European politics"] = { Wikipedia = "Politics of Europe", topical_categories = true, } labels["European Union"] = { aliases = {"EU"}, Wiktionary = true, topical_categories = true, } labels["Evangelicalism"] = { aliases = {"Evangelical", "evangelical", "Evangelical Christianity", "Evangelical Christian", "Evangelical Protestantism", "Evangelical Protestant"}, Wikipedia = true, topical_categories = true, } labels["evolutionary theory"] = { aliases = {"evolutionary biology"}, Wiktionary = true, topical_categories = true, } labels["exercise"] = { Wiktionary = true, topical_categories = true, } labels["eye color"] = { aliases = {"eye colour"}, display = "[[eye]] [[color]]", topical_categories = "Eye colors", } labels["eyewear"] = { Wiktionary = true, topical_categories = true, } labels["fairy tale"] = { -- names of fairy tales aliases = {"fairytale", "fairy-tale"}, Wiktionary = true, topical_categories = true, } labels["fairy tales"] = { -- relating to fairy tales aliases = {"fairytales", "fairy-tales"}, Wiktionary = true, topical_categories = true, } labels["falconry"] = { Wiktionary = true, topical_categories = true, } labels["fantasy"] = { Wiktionary = true, topical_categories = true, } labels["farriery"] = { Wiktionary = true, topical_categories = true, } labels["fascism"] = { Wiktionary = true, topical_categories = true, } labels["fashion"] = { Wiktionary = true, topical_categories = true, } labels["fatty acid"] = { display = "[[organic chemistry]]", topical_categories = "Fatty acids", } labels["felid"] = { aliases = {"cat"}, display = "[[zoology]]", topical_categories = "Felids", } labels["feminism"] = { Wiktionary = true, topical_categories = true, } labels["fencing"] = { Wiktionary = "fencing#Noun", topical_categories = true, } labels["feudalism"] = { Wiktionary = true, topical_categories = true, } labels["fiction"] = { aliases = {"fictional"}, Wiktionary = true, topical_categories = true, } labels["fictional character"] = { display = "[[fiction]]", topical_categories = "Fictional characters", } labels["field hockey"] = { Wiktionary = true, topical_categories = true, } labels["figure of speech"] = { display = "[[rhetoric]]", topical_categories = "Figures of speech", } labels["figure skating"] = { Wiktionary = true, topical_categories = true, } labels["file format"] = { Wiktionary = true, topical_categories = "File formats", } labels["film"] = { Wiktionary = "film#Noun", topical_categories = true, } labels["film genre"] = { aliases = {"cinema"}, display = "[[film#Noun|film]]", topical_categories = "Film genres", } labels["finance"] = { Wiktionary = "finance#Noun", topical_categories = true, } labels["Finnic mythology"] = { aliases = {"Finnish mythology"}, display = "[[Finnic]] [[mythology]]", topical_categories = true, } labels["firearms"] = { aliases = {"firearm"}, display = "[[firearm]]s", topical_categories = true, } labels["firefighting"] = { Wiktionary = true, topical_categories = true, } labels["fish"] = { display = "[[zoology]]", topical_categories = true, } labels["fishing"] = { aliases = {"angling"}, Wiktionary = "fishing#Noun", topical_categories = true, } labels["flamenco"] = { Wiktionary = true, topical_categories = true, } labels["fluid dynamics"] = { Wiktionary = true, topical_categories = true, } labels["fluid mechanics"] = { Wiktionary = true, topical_categories = "Mechanics", } labels["folklore"] = { Wiktionary = true, topical_categories = true, } labels["footwear"] = { Wiktionary = true, topical_categories = true, } labels["forestry"] = { Wiktionary = true, topical_categories = true, } labels["Forteana"] = { Wiktionary = true, topical_categories = true, } labels["Freemasonry"] = { aliases = {"freemasonry"}, Wiktionary = true, topical_categories = true, } labels["French politics"] = { Wikipedia = "Politics of France", topical_categories = true, } labels["functional analysis"] = { Wiktionary = true, topical_categories = true, } labels["functional group prefix"] = { display = "[[organic chemistry]]", topical_categories = "Functional group prefixes", } labels["functional group suffix"] = { display = "[[organic chemistry]]", topical_categories = "Functional group suffixes", } labels["functional programming"] = { Wiktionary = true, topical_categories = "Programming", } labels["furniture"] = { Wiktionary = true, topical_categories = true, } labels["furry fandom"] = { aliases = {"furry", "furry community", "fursuit", "kemonā", "kemona", "kemono", "kemonomimi"}, display = "[[furry#Noun|furry]] [[fandom]]", topical_categories = true, } labels["fuzzy logic"] = { Wiktionary = true, topical_categories = true, } labels["Gaelic football"] = { Wiktionary = true, topical_categories = true, } labels["galaxy"] = { display = "[[astronomy]]", topical_categories = "Galaxies", } labels["gambling"] = { Wiktionary = "gambling#Noun", topical_categories = true, } labels["game theory"] = { Wiktionary = true, topical_categories = true, } labels["games"] = { aliases = {"game"}, Wiktionary = "game#Noun", topical_categories = true, } labels["gaming"] = { Wiktionary = "gaming#Noun", topical_categories = true, } labels["gender critical"] = { aliases = {"gender-critical", "gender critical feminism", "gender-critical feminism", "GC", "GCF", "trans-exclusionary radical feminism", "TERF", "TERFism"}, Wiktionary = "gender-critical#Adjective", Wikipedia = "Gender-critical feminism", topical_categories = "Gender-critical feminism", } labels["genealogy"] = { Wiktionary = true, topical_categories = true, } labels["general semantics"] = { Wiktionary = true, topical_categories = true, } labels["genetic disorder"] = { display = "[[medical]] [[genetics]]", topical_categories = "Genetic disorders", } labels["genetics"] = { Wiktionary = true, topical_categories = true, } labels["geography"] = { Wiktionary = true, topical_categories = true, } labels["geological period"] = { Wikipedia = true, display ="[[geology]]", topical_categories = "Geological periods", } labels["geology"] = { Wiktionary = true, topical_categories = true, } labels["geometry"] = { aliases = {"geometric", "geometrical"}, Wiktionary = true, topical_categories = true, } labels["geomorphology"] = { Wiktionary = true, topical_categories = true, } labels["geopolitics"] = { Wiktionary = true, topical_categories = true, } labels["German politics"] = { Wikipedia = "Politics of Germany", topical_categories = true, } labels["Germanic god"] = { aliases = {"Germanic goddess", "Germanic deity"}, display = "[[Germanic]] [[mythology]]", topical_categories = "Germanic deities", } labels["Germanic paganism"] = { aliases = {"Asatru", "Ásatrú", "Germanic neopaganism", "Germanic Paganism", "Heathenry", "heathenry", "Norse neopaganism", "Norse paganism"}, display = "[[Germanic#Adjective|Germanic]] [[paganism]]", topical_categories = true, } labels["gerontology"] = { Wiktionary = true, topical_categories = true, } labels["gladiatorial combat"] = { Wikipedia = true, topical_categories = true, } labels["glassblowing"] = { Wiktionary = true, topical_categories = true, } labels["Gnosticism"] = { aliases = {"gnosticism"}, Wiktionary = true, topical_categories = true, } labels["go"] = { aliases = {"Go", "game of go", "game of Go"}, display = "{{l|en|go|id=game}}", topical_categories = true, } labels["golf"] = { aliases = {"golfing"}, Wiktionary = true, topical_categories = true, } labels["government"] = { Wiktionary = true, topical_categories = true, } labels["grammar"] = { aliases = {"grammatical"}, Wiktionary = true, topical_categories = true, } labels["grammatical case"] = { display = "[[grammar]]", topical_categories = "Grammatical cases", } labels["grammatical mood"] = { display = "[[grammar]]", topical_categories = "Grammatical moods", } labels["graph theory"] = { Wiktionary = true, topical_categories = true, } labels["graphic design"] = { Wiktionary = true, topical_categories = true, } labels["graphical user interface"] = { aliases = {"GUI"}, Wiktionary = true, topical_categories = true, } labels["Greek god"] = { aliases = {"Greek goddess", "Greek deity"}, display = "[[Greek]] [[mythology]]", topical_categories = "Greek deities", } labels["Greek mythology"] = { display = "[[Greek]] [[mythology]]", topical_categories = true, } labels["Greek Orthodoxy"] = { aliases = {"Greek Orthodox", "Greek Orthodox Church"}, Wikipedia = true, topical_categories = true, } labels["group theory"] = { Wiktionary = true, topical_categories = true, } labels["gun mechanisms"] = { aliases = {"firearm mechanism", "firearm mechanisms", "gun mechanism"}, display = "[[firearm]]s", topical_categories = true, } labels["gun sports"] = { aliases = {"shooting sports"}, display = "[[gun]] [[sport]]s", topical_categories = true, } labels["gymnastics"] = { Wiktionary = true, Wikipedia = true, topical_categories = true, } labels["gynaecology"] = { aliases = {"gynecology"}, Wiktionary = "gynecology", topical_categories = true, } labels["hair color"] = { aliases = {"hair colour"}, display = "[[hair]] [[color]]", topical_categories = "Hair colors", } labels["hairdressing"] = { Wiktionary = true, topical_categories = true, } labels["hanafuda"] = { Wikipedia = true, topical_categories = true, } labels["hand games"] = { aliases = {"hand game"}, display = "[[hand]] [[game]]s", topical_categories = true, } labels["handball"] = { Wiktionary = true, topical_categories = true, } labels["Hawaiian mythology"] = { display = "[[Hawaiian]] [[mythology]]", topical_categories = true, } labels["headwear"] = { display = "[[clothing#Noun|clothing]]", topical_categories = true, } labels["healthcare"] = { Wiktionary = true, topical_categories = true, } labels["helminthology"] = { Wiktionary = true, topical_categories = true, } labels["hematology"] = { aliases = {"haematology"}, Wiktionary = true, topical_categories = true, } labels["heraldic charge"] = { aliases = {"heraldiccharge"}, display = "[[heraldry]]", topical_categories = "Heraldic charges", } labels["heraldry"] = { Wiktionary = true, topical_categories = true, } labels["herbalism"] = { Wiktionary = true, topical_categories = true, } labels["herpetology"] = { Wiktionary = true, topical_categories = true, } labels["Hindu god"] = { display = "[[Hinduism]]", topical_categories = "Hindu deities", } labels["Hinduism"] = { Wiktionary = true, topical_categories = true, } labels["Hindutva"] = { Wiktionary = true, topical_categories = true, } labels["historical currencies"] = { aliases = {"historical currency"}, display = "[[numismatics]]", sense_categories = "historical", topical_categories = "Historical currencies", } labels["historical linguistics"] = { Wiktionary = true, topical_categories = "Linguistics", } labels["historical period"] = { aliases = {"historical periods"}, display = "[[history]]", topical_categories = "Historical periods", } labels["historiography"] = { Wiktionary = true, topical_categories = true, } labels["history"] = { Wiktionary = true, topical_categories = true, } labels["hockey"] = { display = "[[field hockey]] or [[ice hockey]]", topical_categories = {"Field hockey", "Ice hockey"}, } labels["homeopathy"] = { Wiktionary = true, topical_categories = true, } labels["Homestuck"] = { display = "''[[Homestuck]]''", Wiktionary = true, topical_categories = true, } labels["Hong Kong politics"] = { aliases = {"HK politics"}, Wikipedia = "Politics of Hong Kong", topical_categories = true, } labels["hormone"] = { display = "[[biochemistry]]", topical_categories = "Hormones", } labels["horse color"] = { aliases = {"horse colour"}, display = "[[horse]] [[color]]", topical_categories = "Horse colors", } labels["horse racing"] = { Wiktionary = true, topical_categories = true, } labels["horticulture"] = { aliases = {"gardening"}, Wiktionary = true, topical_categories = true, } labels["HTML"] = { Wiktionary = "Hypertext Markup Language", topical_categories = true, } labels["human resources"] = { aliases = {"HR"}, Wiktionary = true, topical_categories = true, } labels["humanities"] = { Wiktionary = true, topical_categories = true, } labels["hunting"] = { Wiktionary = "hunting#Noun", topical_categories = true, } labels["hurling"] = { Wiktionary = "hurling#Noun", topical_categories = true, } labels["hydroacoustics"] = { Wikipedia = true, topical_categories = true, } labels["hydrocarbon chain prefix"] = { display = "[[organic chemistry]]", topical_categories = "Hydrocarbon chain prefixes", } labels["hydrocarbon chain suffix"] = { display = "[[organic chemistry]]", topical_categories = "Hydrocarbon chain suffixes", } labels["hydrology"] = { Wiktionary = true, topical_categories = true, } labels["ice hockey"] = { Wiktionary = true, topical_categories = true, } labels["ichthyology"] = { Wiktionary = true, topical_categories = true, } labels["idol fandom"] = { aliases = {"idol"}, display = "[[idol]] [[fandom]]", topical_categories = true, } labels["immunochemistry"] = { Wiktionary = true, topical_categories = true, } labels["immunology"] = { Wiktionary = true, topical_categories = true, } labels["import/export"] = { aliases = {"import", "export"}, display = "[[import#Noun|import]]/[[export#Noun|export]]", topical_categories = true, } labels["incoterm"] = { display = "[[Incoterm]]", topical_categories = "Incoterms", } labels["Indian politics"] = { Wikipedia = "Politics of India", topical_categories = true, } labels["Indo-European studies"] = { aliases = {"indo-european studies"}, Wiktionary = true, topical_categories = true, } labels["Indonesian politics"] = { aliases = {"Indonesia politics"}, Wikipedia = "Politics of Indonesia", topical_categories = true, } labels["information science"] = { Wiktionary = true, topical_categories = true, } labels["information technology"] = { aliases = {"IT"}, Wiktionary = true, topical_categories = "Computing", } labels["information theory"] = { Wiktionary = true, topical_categories = true, } labels["inheritance law"] = { Wiktionary = true, topical_categories = true, } labels["inorganic chemistry"] = { Wiktionary = true, topical_categories = true, } labels["inorganic compound"] = { display = "[[inorganic chemistry]]", topical_categories = "Inorganic compounds", } labels["insurance"] = { Wiktionary = true, topical_categories = true, } labels["international law"] = { Wiktionary = true, topical_categories = true, } labels["international relations"] = { Wiktionary = true, topical_categories = true, } labels["international standards"] = { aliases = {"international standard", "ISO", "International Organization for Standardization", "International Organisation for Standardisation"}, Wikipedia = "International standard", } labels["Internet"] = { aliases = {"internet", "online"}, Wiktionary = true, topical_categories = true, } labels["Iranian mythology"] = { display = "[[Iranian]] [[mythology]]", topical_categories = true, } labels["Irish mythology"] = { display = "[[Irish]] [[mythology]]", topical_categories = true, } labels["Irish politics"] = { Wikipedia = "Politics of the Republic of Ireland", topical_categories = true, } labels["Islam"] = { aliases = {"islam", "Islamic", "Muslim"}, Wikipedia = true, topical_categories = true, } labels["Islamic finance"] = { aliases = {"Islamic banking", "Muslim finance", "Muslim banking", "Sharia-compliant finance"}, Wikipedia = true, topical_categories = true, } labels["Islamic law"] = { aliases = {"Islamic legal", "Sharia"}, Wikipedia = true, topical_categories = true, } labels["isotope"] = { display = "[[physics]]", topical_categories = "Isotopes", } labels["Jainism"] = { Wiktionary = true, Wikipedia = true, topical_categories = true, } labels["Japanese fiction"] = { -- aliases = {"anime", "manga", "anime and manga", "manga and anime"}, display = "[[Japanese#Adjective|Japanese]] [[fiction]]", Wikipedia = true, topical_categories = true, } labels["Japanese god"] = { display = "[[Japanese#Adjective|Japanese]] [[mythology]]", topical_categories = "Japanese deities", } labels["Japanese mythology"] = { display = "[[Japanese#Adjective|Japanese]] [[mythology]]", topical_categories = true, } labels["Japanese politics"] = { Wikipedia = "Politics of Japan", topical_categories = true, } labels["Japanese pornography"] = { aliases = {"Japanese porn", "hentai", "adult anime", "erotic anime", "ero anime"}, display = "[[Japanese#Adjective|Japanese]] [[pornography]]", Wikipedia = true, topical_categories = true, } labels["Java programming language"] = { aliases = {"JavaPL", "Java PL"}, Wikipedia = "Java (programming language)", topical_categories = true, } labels["jazz"] = { Wiktionary = "jazz#Noun", topical_categories = true, } labels["jewelry"] = { aliases = {"jewellery"}, Wiktionary = true, topical_categories = true, } labels["Jewish law"] = { aliases = {"Halacha", "Halachah", "Halakha", "Halakhah", "halacha", "halachah", "halakha", "halakhah", "Jewish Law", "jewish law"}, display = "[[Jewish]] [[law]]", topical_categories = true, } labels["journalism"] = { Wiktionary = true, topical_categories = "Mass media", } labels["Judaism"] = { Wiktionary = true, topical_categories = true, } labels["judo"] = { Wiktionary = true, topical_categories = true, } labels["juggling"] = { Wiktionary = "juggling#Noun", topical_categories = true, } labels["karuta"] = { Wiktionary = true, topical_categories = true, } labels["kendo"] = { Wiktionary = true, topical_categories = true, } labels["knitting"] = { Wiktionary = "knitting#Noun", topical_categories = true, } labels["Korean mythology"] = { display = "[[Korean#Adjective|Korean]] [[mythology]]", topical_categories = true, } labels["labour"] = { aliases = {"labor", "labour movement", "labor movement"}, Wiktionary = true, topical_categories = true, } labels["labour law"] = { aliases = {"labor law"}, Wiktionary = true, topical_categories = "Law", } labels["lacrosse"] = { Wiktionary = true, topical_categories = true, } labels["landforms"] = { display = "[[geography]]", topical_categories = true, } labels["law"] = { aliases = {"legal"}, Wiktionary = "law#English", topical_categories = true, } labels["law enforcement"] = { aliases = {"police", "policing"}, Wiktionary = true, topical_categories = true, } labels["leatherworking"] = { Wiktionary = true, topical_categories = true, } labels["leftism"] = { aliases = {"leftist"}, Wiktionary = true, topical_categories = true, } labels["letterpress"] = { aliases = {"metal type", "metal typesetting"}, display = "[[letterpress]] [[typography]]", topical_categories = "Typography", } labels["lexicography"] = { Wiktionary = true, topical_categories = true, } labels["LGBTQ"] = { aliases = {"LGBT", "LGBT+", "LGBT*", "LGBTQ+", "LGBTQ*", "LGBTQIA", "LGBTQIA+", "LGBTQIA*", "queer"}, Wiktionary = true, topical_categories = true, } labels["liberalism"] = { aliases = {"liberal"}, Wiktionary = true, topical_categories = true, } labels["library science"] = { Wiktionary = true, topical_categories = true, } labels["lichenology"] = { Wiktionary = true, topical_categories = true, } labels["limnology"] = { Wiktionary = true, topical_categories = "Ecology", } labels["linear algebra"] = { aliases = {"vector algebra"}, Wiktionary = true, topical_categories = true, } labels["linguistic morphology"] = { display = "[[linguistic]] [[morphology]]", topical_categories = true, } labels["linguistics"] = { aliases = {"linguistic", "philology"}, Wiktionary = true, topical_categories = true, } labels["lipid"] = { aliases = {"lipids"}, display = "[[biochemistry]]", topical_categories = "Lipids", } labels["literature"] = { Wiktionary = true, topical_categories = true, } labels["locksmithing"] = { Wiktionary = true, display = "[[locksmithing]]", topical_categories = true, } labels["logic"] = { Wiktionary = true, topical_categories = true, } labels["logical fallacy"] = { aliases = {"fallacies"}, display = "[[rhetoric]]", topical_categories = "Logical fallacies", } labels["logistics"] = { Wiktionary = true, topical_categories = true, } labels["luge"] = { Wiktionary = true, topical_categories = true, } labels["Lutheranism"] = { aliases = {"Lutheran", "Lutheranist", "Lutheran Church"}, Wikipedia = true, topical_categories = true, } labels["lutherie"] = { Wiktionary = true, topical_categories = true, } labels["machine learning"] = { aliases = {"ML"}, Wiktionary = true, topical_categories = true, } labels["machining"] = { Wiktionary = "machining#Noun", topical_categories = true, } labels["macroeconomics"] = { Wiktionary = true, topical_categories = "Economics", } labels["mahjong"] = { Wiktionary = true, topical_categories = true, } labels["malacology"] = { Wiktionary = true, topical_categories = true, } labels["Malaysian politics"] = { aliases = {"Malaysia politics"}, Wikipedia = "Politics of Malaysia", topical_categories = true, } labels["mammalogy"] = { Wiktionary = true, topical_categories = true, } labels["management"] = { Wiktionary = true, topical_categories = true, } labels["manga"] = { aliases = {"Japanese comics"}, Wiktionary = true, topical_categories = "Japanese fiction", } labels["manhua"] = { aliases = {"Chinese comics"}, Wiktionary = true, topical_categories = "Chinese fiction", } labels["manhwa"] = { aliases = {"Korean comics"}, Wiktionary = true, topical_categories = "Korean fiction", } labels["Manichaeism"] = { Wiktionary = true, topical_categories = true, } labels["manufacturing"] = { Wiktionary = "manufacturing#Noun", topical_categories = true, } labels["Maoism"] = { aliases = {"Maoist"}, Wiktionary = true, topical_categories = true, } labels["marching"] = { Wiktionary = "marching#Noun", topical_categories = true, } labels["marine biology"] = { aliases = {"coral science"}, Wiktionary = true, topical_categories = true, } labels["marketing"] = { Wiktionary = "marketing#Noun", topical_categories = true, } labels["martial arts"] = { Wiktionary = true, topical_categories = true, } labels["Marxism"] = { aliases = {"Marxist"}, Wiktionary = true, topical_categories = true, } labels["masonry"] = { Wiktionary = true, topical_categories = true, } labels["massage"] = { Wiktionary = true, topical_categories = true, } labels["materials science"] = { Wiktionary = true, topical_categories = true, } labels["mathematical analysis"] = { aliases = {"analysis"}, Wiktionary = true, topical_categories = true, } labels["mathematics"] = { aliases = {"math", "maths"}, Wiktionary = true, topical_categories = true, } labels["measure theory"] = { Wiktionary = true, topical_categories = true, } labels["mechanical engineering"] = { Wiktionary = true, topical_categories = true, } labels["mechanics"] = { Wiktionary = true, topical_categories = true, } labels["media"] = { Wiktionary = true, topical_categories = true, } labels["mediaeval folklore"] = { aliases = {"medieval folklore"}, display = "[[mediaeval]] [[folklore]]", topical_categories = "European folklore", } labels["medical genetics"] = { display = "[[medical]] [[genetics]]", topical_categories = true, } labels["medical sign"] = { aliases = {"medical symptoms", "symptom", "symptoms"}, display = "[[medicine]]", topical_categories = "Medical signs and symptoms", } labels["medicine"] = { aliases = {"medical"}, Wiktionary = true, topical_categories = true, } labels["Meitei god"] = { aliases = {"Meitei goddess", "Meitei deity"}, display = "[[Meitei]] [[mythology]]", topical_categories = "Meitei deities", } labels["mental health"] = { Wiktionary = true, topical_categories = true, } labels["Mesopotamian god"] = { aliases = {"Mesopotamian goddess", "Mesopotamian deity", "Mesopotamian diety" -- FIXME: existing typo }, display = "[[Mesopotamian]] [[mythology]]", topical_categories = "Mesopotamian deities", } labels["Mesopotamian mythology"] = { display = "[[Mesopotamian]] [[mythology]]", topical_categories = true, } labels["metadata"] = { Wiktionary = true, topical_categories = "Data management", } labels["metallurgy"] = { Wiktionary = true, topical_categories = true, } labels["metalworking"] = { Wiktionary = true, topical_categories = true, } labels["metamaterial"] = { display = "[[physics]]", topical_categories = "Metamaterials", } labels["metaphysics"] = { Wiktionary = true, topical_categories = true, } labels["meteorology"] = { Wiktionary = true, topical_categories = true, } labels["Methodism"] = { aliases = {"Methodist", "methodism", "methodist"}, Wiktionary = true, topical_categories = true, } labels["metrology"] = { Wiktionary = true, topical_categories = true, } labels["Mexican politics"] = { aliases = {"Mexico politics"}, Wikipedia = "Politics of Mexico", topical_categories = true, } labels["microbiology"] = { Wiktionary = true, topical_categories = true, } labels["microelectronics"] = { Wiktionary = true, topical_categories = true, } labels["micronationalism"] = { aliases = {"micronation", "micronations"}, Wiktionary = true, topical_categories = true, } labels["microscopy"] = { Wiktionary = true, topical_categories = true, } labels["military"] = { aliases = {"army"}, Wiktionary = true, topical_categories = true, } labels["military ranks"] = { aliases = {"military rank"}, display = "[[military]]", topical_categories = true, } labels["military unit"] = { display = "[[military]]", topical_categories = "Military units", } labels["milling"] = { Wiktionary = true, topical_categories = true, } labels["Minecraft"] = { display = "''[[Minecraft]]''", topical_categories = true, } labels["mineral"] = { display = "[[mineralogy]]", topical_categories = "Minerals", } labels["mineralogy"] = { Wiktionary = true, topical_categories = true, } labels["mining"] = { Wiktionary = "mining#Noun", topical_categories = true, } labels["mobile phones"] = { aliases = {"cell phone", "cell phones", "mobile phone", "mobile telephony", "smartphone", "smartphones", "mobile"}, display = "[[mobile telephone|mobile telephony]]", topical_categories = true, } labels["molecular biology"] = { Wiktionary = true, topical_categories = true, } labels["monarchy"] = { Wiktionary = true, topical_categories = true, } labels["money"] = { Wiktionary = true, topical_categories = true, } labels["Mormonism"] = { Wiktionary = true, topical_categories = true, } labels["motor racing"] = { -- There are other types of racing, but 99% of the time "racing" on its own refers to motorsports. aliases = {"motor sport", "motorsport", "motorsports", "racing"}, Wiktionary = true, topical_categories = true, } labels["motorcycling"] = { aliases = {"motorcycle", "motorcycles", "motorbike"}, Wiktionary = "motorcycling#Noun", topical_categories = "Motorcycles", } labels["multiplicity"] = { aliases = {"plurality", "polypsychism", "dissociative identity disorder", "DID"}, display = "{{l|en|multiplicity|id=multiple personalities}}", topical_categories = "Multiplicity (psychology)", } labels["muscle"] = { aliases = {"muscles"}, display = "[[anatomy]]", topical_categories = "Muscles", } labels["mushroom"] = { aliases = {"mushrooms"}, display = "[[mycology]]", topical_categories = "Mushrooms", } labels["music"] = { aliases = {"musical"}, Wiktionary = true, topical_categories = true, } labels["music genre"] = { display = "[[music]]", topical_categories = "Musical genres", } labels["music industry"] = { Wikipedia = true, topical_categories = true, } labels["musical instruments"] = { aliases = {"musical instrument"}, display = "[[music]]", topical_categories = true, } labels["musician"] = { display = "[[music]]", topical_categories = "Musicians", } labels["musicology"] = { Wiktionary = true, topical_categories = "Music", } labels["mycology"] = { Wiktionary = true, topical_categories = true, } labels["mysticism"] = { Wiktionary = true, topical_categories = true, } labels["mythological creature"] = { aliases = {"mythological creatures"}, display = "[[mythology]]", topical_categories = "Mythological creatures", } labels["mythology"] = { Wiktionary = true, topical_categories = true, } labels["nanotechnology"] = { Wiktionary = true, topical_categories = true, } labels["narratology"] = { Wiktionary = true, topical_categories = true, } labels["nautical"] = { Wiktionary = true, topical_categories = true, } labels["Navajo mythology"] = { display = "[[Navajo]] [[mythology]]", topical_categories = true, } labels["navigation"] = { Wiktionary = true, topical_categories = true, } labels["Nazism"] = { -- see also Neo-Nazism aliases = {"nazism", "Nazi", "nazi", "Nazis", "nazis"}, Wikipedia = true, topical_categories = true, } labels["nematology"] = { Wiktionary = true, topical_categories = "Zoology", } labels["neo-Nazism"] = { -- Often used to indicate Nazi-used jargon; compare "white supremacist ideology" aliases = {"Neo-Nazism", "Neo-nazism", "neo-nazism", "Neo-Nazi", "Neo-nazi", "neo-Nazi", "neo-nazi", "Neo-Nazis", "Neo-nazis", "neo-Nazis", "neo-nazis", "NeoNazism", "Neonazism", "neoNazism", "neonazism", "NeoNazi", "Neonazi", "neoNazi", "neonazi", "NeoNazis", "Neonazis", "neoNazis", "neonazis"}, Wikipedia = true, topical_categories = true, } labels["netball"] = { Wiktionary = true, topical_categories = true, } labels["networking"] = { Wiktionary = "networking#Noun", topical_categories = true, } labels["neuroanatomy"] = { Wiktionary = true, topical_categories = true, } labels["neurology"] = { Wiktionary = true, topical_categories = true, } labels["neuroscience"] = { Wiktionary = true, topical_categories = true, } labels["neurosurgery"] = { Wiktionary = true, topical_categories = true, } labels["neurotoxin"] = { display = "[[neurotoxicology]]", topical_categories = "Neurotoxins", } labels["neurotransmitter"] = { display = "[[biochemistry]]", topical_categories = "Neurotransmitters", } labels["New Zealand politics"] = { Wikipedia = "Politics of New Zealand", topical_categories = true, } labels["newspapers"] = { display = "[[newspaper]]s", topical_categories = true, } labels["Norse god"] = { aliases = {"Norse goddess", "Norse deity"}, display = "[[Norse]] [[mythology]]", topical_categories = "Norse deities", } labels["Norse mythology"] = { display = "[[Norse]] [[mythology]]", topical_categories = true, } labels["nuclear energy"] = { Wiktionary = true, topical_categories = true, } labels["nuclear physics"] = { Wiktionary = true, topical_categories = true, } labels["number theory"] = { Wiktionary = true, topical_categories = true, } labels["numismatics"] = { Wiktionary = true, topical_categories = "Currency", } labels["nutrition"] = { Wiktionary = true, topical_categories = true, } labels["object-oriented programming"] = { aliases = {"object-oriented", "OOP"}, Wiktionary = true, topical_categories = true, } labels["obsolete chemical element symbol"] = { display = "[[chemistry]], [[obsolete]]", plain_categories = "Obsolete chemical element symbols", } labels["obstetrics"] = { aliases = {"obstetric"}, Wiktionary = true, topical_categories = true, } labels["occult"] = { Wiktionary = true, topical_categories = true, } labels["oceanography"] = { Wiktionary = true, topical_categories = true, } labels["Odinani"] = { aliases = {"Odinala", "Omenala", "Odinana", "Omenana", "Igbo religion"}, Wikipedia = true, topical_categories = true, } labels["oil industry"] = { aliases = {"oil", "oil drilling", "petroleum industry", "petroleum"}, Wikipedia = true, topical_categories = true, } labels["oncology"] = { Wiktionary = true, topical_categories = true, } labels["online gaming"] = { aliases = {"online games", "MMO", "MMORPG"}, display = "[[online]] [[gaming#Noun|gaming]]", topical_categories = "Video games", } labels["onomastics"] = { Wiktionary = true, topical_categories = true, } labels["opera"] = { Wiktionary = true, topical_categories = true, } labels["operating systems"] = { display = "[[operating system]]s", topical_categories = "Software", } labels["ophthalmology"] = { Wiktionary = true, topical_categories = true, } labels["optics"] = { Wiktionary = true, topical_categories = true, } labels["organic chemistry"] = { Wiktionary = true, topical_categories = true, } labels["organic compound"] = { display = "[[organic chemistry]]", topical_categories = "Organic compounds", } labels["Oriental Orthodoxy"] = { aliases = {"Oriental Orthodox", "Oriental Orthodox Church"}, Wikipedia = true, topical_categories = true, } labels["ornithology"] = { Wiktionary = true, topical_categories = true, } labels["orthodontics"] = { Wiktionary = true, topical_categories = "Dentistry", } labels["orthography"] = { Wiktionary = true, topical_categories = true, } labels["paganism"] = { aliases = {"pagan", "neopagan", "neopaganism", "neo-pagan", "neo-paganism"}, Wiktionary = true, topical_categories = true, } labels["pain"] = { display = "[[medicine]]", topical_categories = true, } labels["paintball"] = { Wiktionary = true, topical_categories = true, } labels["painting"] = { Wiktionary = "painting#Noun", topical_categories = true, } labels["Pakistani politics"] = { Wikipedia = "Politics of Pakistan", topical_categories = true, } labels["palaeography"] = { aliases = {"paleography"}, Wiktionary = true, topical_categories = true, } labels["paleontology"] = { aliases = {"palaeontology"}, Wiktionary = true, topical_categories = true, } labels["Palestinian politics"] = { aliases = {"Palestine politics"}, Wikipedia = "Politics of the Palestinian National Authority", topical_categories = true, } labels["palmistry"] = { Wiktionary = true, topical_categories = true, } labels["palynology"] = { Wiktionary = true, topical_categories = true, } labels["papermaking"] = { Wiktionary = true, topical_categories = true, } labels["paraphilia"] = { aliases = {"paraphilias", "paraphilic", "fetish", "fetishes", "fetishism", "fetishistic", "fetishization", "fetishisation"}, Wiktionary = "paraphilia#Noun", topical_categories = "Paraphilias", } labels["parapsychology"] = { Wiktionary = true, topical_categories = true, } labels["parasitology"] = { Wiktionary = true, topical_categories = true, } labels["part of speech"] = { aliases = {"PoS"}, display = "[[grammar]]", topical_categories = "Parts of speech", } labels["particle"] = { aliases = {"subatomic particle", "subatomic particles"}, display = "[[particle physics]]", topical_categories = "Subatomic particles", } labels["particle physics"] = { Wiktionary = true, topical_categories = true, } labels["pasteurization"] = { aliases = {"pasteurisation"}, Wiktionary = true, topical_categories = true, } labels["patent law"] = { aliases = {"patents"}, display = "[[patent#Noun|patent]] [[law]]", topical_categories = true, } labels["pathology"] = { Wiktionary = true, topical_categories = true, } labels["pensions"] = { aliases = {"pension"}, display = "[[pension]]s", topical_categories = true, } labels["percussion instruments"] = { aliases = {"percussion instrument"}, display = "[[music]]", topical_categories = true, } labels["perfumery"] = { Wiktionary = true, topical_categories = true, } labels["Peruvian politics"] = { Wikipedia = "Politics of Peru", topical_categories = true, } labels["pesäpallo"] = { aliases = {"pesapallo"}, Wiktionary = true, topical_categories = true, } labels["petrochemistry"] = { Wiktionary = true, topical_categories = true, } labels["petrology"] = { Wiktionary = true, topical_categories = true, } labels["pharmaceutical drug"] = { display = "[[pharmacology]]", topical_categories = "Pharmaceutical drugs", } labels["pharmaceutical effect"] = { display = "[[pharmacology]]", topical_categories = "Pharmaceutical effects", } labels["pharmacology"] = { Wiktionary = true, topical_categories = true, } labels["pharmacy"] = { Wiktionary = true, topical_categories = true, } labels["pharyngology"] = { Wiktionary = true, topical_categories = true, } labels["philately"] = { Wiktionary = true, topical_categories = true, } labels["Philippine politics"] = { aliases = {"Filipino politics"}, Wikipedia = "Politics of the Philippines", topical_categories = true, } labels["Philmont Scout Ranch"] = { aliases = {"Philmont"}, Wikipedia = true, topical_categories = true, } labels["philosophy"] = { Wiktionary = true, topical_categories = true, } labels["phonetics"] = { aliases = {"phonetic"}, Wiktionary = true, topical_categories = true, } labels["phonology"] = { aliases = {"phonological"}, Wiktionary = true, topical_categories = true, } labels["photography"] = { aliases = {"photograph"}, Wiktionary = true, topical_categories = true, } labels["phrenology"] = { Wiktionary = true, topical_categories = true, } labels["phycology"] = { Wiktionary = true, topical_categories = true, } labels["physical chemistry"] = { Wiktionary = true, topical_categories = true, } labels["physical quantity"] = { display = "[[physics]]", topical_categories = "Physical quantities", } labels["physics"] = { Wiktionary = true, topical_categories = true, } labels["physiology"] = { Wiktionary = true, topical_categories = true, } labels["phytopathology"] = { Wiktionary = true, topical_categories = true, } labels["pinball"] = { Wiktionary = true, topical_categories = true, } labels["planetology"] = { Wiktionary = true, topical_categories = true, } labels["plant"] = { aliases = {"plants"}, display = "[[botany]]", topical_categories = "Plants", } labels["plant disease"] = { aliases = {"plant diseases"}, display = "[[phytopathology]]", topical_categories = "Plant diseases", } labels["plastic surgery"] = { Wiktionary = true, topical_categories = true, } labels["playground games"] = { aliases = {"playground game"}, display = "[[playground]] [[game]]s", topical_categories = true, } labels["poetry"] = { Wiktionary = true, topical_categories = true, } labels["poison"] = { display = "[[toxicology]]", topical_categories = "Poisons", } labels["Pokémon"] = { aliases = {"Pokemon"}, display = "''[[w:Pokémon|Pokémon]]''", Wikipedia = true, topical_categories = true, } labels["poker"] = { Wiktionary = true, topical_categories = true, } labels["poker slang"] = { display = "[[poker]] [[slang]]", topical_categories = "Poker", } labels["political science"] = { Wiktionary = true, topical_categories = true, } labels["political subdivision"] = { display = "[[government]]", topical_categories = "Political subdivisions", } labels["politics"] = { aliases = {"political"}, Wiktionary = true, topical_categories = true, } labels["pornography"] = { aliases = {"porn", "porno", "adult video", "adult videos"}, Wiktionary = true, topical_categories = true, } labels["Portuguese folklore"] = { display = "[[Portuguese#Adjective|Portuguese]] [[folklore]]", topical_categories = "European folklore", } labels["Portuguese politics"] = { Wikipedia = "Politics of Portugal", topical_categories = true, } labels["post"] = { aliases = {"mail", "postal"}, display = "[[postal]]", topical_categories = true, } labels["postal abbreviation"] = { aliases = {"postal abbr", "postal abbrev"}, display = "[[postal]]", topical_categories = "Postal abbreviations", } labels["potential theory"] = { Wiktionary = true, topical_categories = true, } labels["pottery"] = { Wiktionary = true, topical_categories = "Ceramics", } labels["pragmatics"] = { Wiktionary = true, topical_categories = true, } labels["printing"] = { Wiktionary = "printing#Noun", topical_categories = true, } labels["probability theory"] = { Wiktionary = true, topical_categories = true, } labels["professional wrestling"] = { aliases = {"pro wrestling"}, Wiktionary = true, topical_categories = true, } labels["programming"] = { aliases = {"computer programming"}, Wiktionary = "programming#Noun", topical_categories = true, } labels["property law"] = { aliases = {"land law", "real estate law"}, Wiktionary = true, topical_categories = true, } labels["prosody"] = { Wiktionary = true, topical_categories = true, } labels["protein"] = { aliases = {"proteins"}, display = "[[biochemistry]]", topical_categories = "Proteins", } labels["Protestantism"] = { aliases = {"protestantism", "Protestant", "protestant"}, Wiktionary = true, topical_categories = true, } labels["pseudoscience"] = { Wiktionary = true, topical_categories = true, } labels["psychiatry"] = { Wiktionary = true, topical_categories = true, } labels["psychoanalysis"] = { Wiktionary = true, topical_categories = true, } labels["psychology"] = { Wiktionary = true, topical_categories = true, } labels["psychotherapy"] = { Wiktionary = true, topical_categories = true, } labels["publishing"] = { Wiktionary = "publishing#Noun", topical_categories = true, } labels["pulmonology"] = { Wiktionary = true, topical_categories = true, } labels["pyrotechnics"] = { Wiktionary = true, aliases = { "firework", "fireworks" }, topical_categories = true, } labels["QAnon"] = { aliases = {"Qanon"}, Wikipedia = true, topical_categories = true, } labels["Quakerism"] = { Wiktionary = true, topical_categories = true, } labels["quantum computing"] = { Wiktionary = true, topical_categories = true, } labels["quantum mechanics"] = { aliases = {"quantum physics"}, Wiktionary = true, topical_categories = true, } labels["Quimbanda"] = { Wiktionary = true, topical_categories = true, } labels["radiation"] = { -- TODO: What kind of topic is "radiation"? Is it specific kinds of radiation? That would be a set-type category. display = "[[physics]]", topical_categories = true, } labels["radio"] = { Wiktionary = true, topical_categories = true, } labels["Raëlism"] = { Wiktionary = true, topical_categories = true, } labels["rail transport"] = { aliases = {"rail", "railroading", "railroads"}, Wiktionary = true, topical_categories = "Rail transportation", } labels["Rastafari"] = { aliases = {"Rasta", "rasta", "Rastafarian", "rastafarian", "Rastafarianism"}, Wiktionary = true, topical_categories = true, } labels["real estate"] = { Wiktionary = true, topical_categories = true, } labels["real tennis"] = { Wiktionary = true, topical_categories = "Tennis", } labels["recreational mathematics"] = { Wiktionary = true, topical_categories = "Mathematics", } labels["Reddit"] = { Wiktionary = true, topical_categories = true, } labels["regular expressions"] = { aliases = {"regex"}, display = "[[regular expression]]s", topical_categories = true, } labels["relativity"] = { Wiktionary = true, topical_categories = true, } labels["religion"] = { Wiktionary = true, topical_categories = true, } labels["rhetoric"] = { Wiktionary = true, topical_categories = true, } labels["rhythmic gymnastics"] = { Wiktionary = true, Wikipedia = true, topical_categories = true, } labels["road transport"] = { aliases = {"roads"}, Wikipedia = true, topical_categories = true, } labels["robotics"] = { Wiktionary = true, topical_categories = true, } labels["rock"] = { aliases = {"rocks"}, display = "[[geology]]", topical_categories = "Rocks", } labels["rock paper scissors"] = { topical_categories = true, } labels["roleplaying games"] = { aliases = {"role playing games", "role-playing games", "RPG", "RPGs"}, display = "[[roleplaying game]]s", topical_categories = "Role-playing games", } labels["roller derby"] = { Wiktionary = true, topical_categories = true, } labels["Roman Catholicism"] = { aliases = {"Roman Catholic", "Roman Catholic Church"}, Wiktionary = true, topical_categories = true, } labels["Roman Empire"] = { Wiktionary = true, topical_categories = true, } labels["Roman god"] = { aliases = {"Roman goddess", "Roman deity"}, display = "[[Roman]] [[mythology]]", topical_categories = "Roman deities", } labels["Roman mythology"] = { display = "[[Roman]] [[mythology]]", topical_categories = true, } labels["Roman numerals"] = { display = "[[Roman numeral]]s", topical_categories = true, } labels["roofing"] = { Wiktionary = "roofing#Noun", topical_categories = true, } labels["rosiculture"] = { Wiktionary = true, topical_categories = true, } labels["rowing"] = { Wiktionary = "rowing#Noun", topical_categories = true, } labels["Rubik's Cube"] = { aliases = {"Rubik's cube", "Rubik's cubes", "Magic Cube", "magic cube"}, Wiktionary = "Rubik's cube", topical_categories = true, } labels["rugby"] = { Wiktionary = true, topical_categories = true, } labels["rugby league"] = { Wiktionary = true, topical_categories = true, } labels["rugby union"] = { Wiktionary = true, topical_categories = true, } labels["Russian Orthodoxy"] = { aliases = {"Russian Orthodox", "Russian Orthodox Church"}, Wikipedia = true, topical_categories = true, } labels["sailing"] = { Wiktionary = "sailing#Noun", topical_categories = true, } labels["schools"] = { display = "[[education]]", topical_categories = true, } labels["science fiction"] = { aliases = {"scifi", "sci fi", "sci-fi"}, Wiktionary = true, topical_categories = true, } labels["sciences"] = { aliases = {"science", "scientific"}, Wiktionary = true, topical_categories = true, } labels["Scientology"] = { Wiktionary = true, topical_categories = true, } labels["Scots law"] = { -- Note: this is the usual term, not "Scottish law". aliases = {"Scottish law", "Scotland law", "Scots Law", "Scottish Law", "Scotland Law"}, Wikipedia = true, topical_categories = true, } labels["Scouting"] = { aliases = {"scouting"}, display = "[[scouting]]", topical_categories = true, } labels["Scrabble"] = { display = "''[[Scrabble]]''", Wikipedia = true, topical_categories = true, } labels["scrapbooks"] = { display = "[[scrapbook]]s", topical_categories = true, } labels["sculpture"] = { Wiktionary = true, topical_categories = true, } labels["seduction community"] = { aliases = {"pickup artist", "pickup artists", "pickup artistry", "pickup community"}, Wikipedia = true, topical_categories = true, } labels["seismology"] = { Wiktionary = true, topical_categories = true, } labels["self-harm"] = { aliases = {"selfharm", "self harm", "self-harm community"}, Wiktionary = true, topical_categories = true, } labels["semantics"] = { Wiktionary = true, topical_categories = true, } labels["semiconductors"] = { display = "[[semiconductor]]s", topical_categories = true, } labels["semiotics"] = { Wiktionary = true, topical_categories = true, } labels["SEO"] = { Wiktionary = "search engine optimization", topical_categories = {"Internet", "Marketing"}, } labels["set theory"] = { Wiktionary = true, topical_categories = true, } labels["sewing"] = { Wiktionary = "sewing#Noun", topical_categories = true, } labels["sex"] = { Wiktionary = true, topical_categories = true, } labels["sex position"] = { display = "[[sex]]", topical_categories = "Sex positions", } labels["sexology"] = { Wiktionary = true, topical_categories = true, } labels["sexuality"] = { Wiktionary = true, topical_categories = true, } labels["Shaivism"] = { Wiktionary = true, topical_categories = true, } labels["shamanism"] = { aliases = {"Shamanism"}, Wiktionary = true, topical_categories = true, } labels["Shi'ism"] = { aliases = {"Shia", "Shi'ite", "Shi'i"}, display = "[[Shia Islam]]", topical_categories = true, } labels["Shinto"] = { Wiktionary = true, topical_categories = true, } labels["ship parts"] = { display = "[[nautical]]", topical_categories = "Ship parts", } labels["shipping"] = { Wiktionary = "shipping#Noun", topical_categories = true, } labels["shoemaking"] = { Wiktionary = true, topical_categories = true, } labels["shogi"] = { Wiktionary = true, topical_categories = true, } labels["signal processing"] = { Wikipedia = true, topical_categories = true, } labels["Sikhism"] = { aliases = {"Sikh"}, Wiktionary = true, topical_categories = true, } labels["Singaporean politics"] = { Wikipedia = "Politics of Singapore", topical_categories = true, } labels["singing"] = { Wiktionary = "singing#Noun", topical_categories = true, } labels["skateboarding"] = { Wiktionary = "skateboarding#Noun", topical_categories = true, } labels["skating"] = { Wiktionary = "skating#Noun", topical_categories = true, } labels["skeleton"] = { display = "[[anatomy]]", topical_categories = true, } labels["skiing"] = { Wiktionary = "skiing#Noun", topical_categories = true, } labels["skydiving"] = { Wiktionary = "skydiving#Noun", topical_categories = true, } labels["Slavic god"] = { display = "[[Slavic]] [[mythology]]", topical_categories = "Slavic deities", } labels["Slavic mythology"] = { display = "[[Slavic]] [[mythology]]", topical_categories = true, } labels["smoking"] = { Wiktionary = "smoking#Noun", topical_categories = true, } labels["snooker"] = { Wiktionary = "snooker#Noun", topical_categories = true, } labels["snowboarding"] = { Wiktionary = "snowboarding#Noun", topical_categories = true, } labels["soccer"] = { aliases = {"football", "association football"}, Wiktionary = true, topical_categories = "Football (soccer)", } labels["social media"] = { Wiktionary = true, topical_categories = true, } labels["social sciences"] = { aliases = {"social science"}, display = "[[social science]]s", topical_categories = true, } labels["socialism"] = { Wiktionary = true, topical_categories = true, } labels["sociolinguistics"] = { Wiktionary = true, topical_categories = true, } labels["sociology"] = { Wiktionary = true, topical_categories = true, } labels["softball"] = { Wiktionary = true, topical_categories = true, } labels["software"] = { Wiktionary = true, topical_categories = true, } labels["software architecture"] = { Wiktionary = true, topical_categories = {"Software engineering", "Programming"}, } labels["software engineering"] = { aliases = {"software development"}, Wiktionary = true, topical_categories = true, } labels["soil science"] = { Wiktionary = true, topical_categories = true, } labels["sound"] = { Wiktionary = "sound#Noun", topical_categories = true, } labels["sound engineering"] = { Wiktionary = true, topical_categories = true, } labels["South Korean idol fandom"] = { aliases = {"Korean idol fandom", "Korean idol"}, display = "[[South Korean]] [[idol]] [[fandom]]", topical_categories = true, } labels["South Park"] = { display = "''[[w:South Park|South Park]]''", Wikipedia = true, topical_categories = true, } labels["Soviet Union"] = { aliases = {"USSR", "Soviet"}, Wiktionary = true, topical_categories = true, } labels["space flight"] = { aliases = {"spaceflight", "space travel"}, Wiktionary = true, topical_categories = "Space", } labels["space science"] = { aliases = {"space"}, Wiktionary = true, topical_categories = "Space", } labels["Spanish politics"] = { Wikipedia = "Politics of Spain", topical_categories = true, } labels["spectroscopy"] = { Wiktionary = true, topical_categories = true, } labels["speedrunning"] = { aliases = {"speedrun", "speedruns"}, Wiktionary = true, topical_categories = true, } labels["spinning"] = { Wiktionary = true, topical_categories = true, } labels["spiritualism"] = { Wiktionary = true, topical_categories = true, } labels["sports"] = { aliases = {"sport"}, Wiktionary = true, topical_categories = true, } labels["square dancing"] = { aliases = {"square dance"}, Wiktionary = true, topical_categories = true, } labels["squash"] = { Wikipedia = "Squash (sport)", topical_categories = true, } labels["standard of identity"] = { display = "[[standard of identity|standards of identity]]", topical_categories = "Standards of identity", } labels["star"] = { display = "[[astronomy]]", topical_categories = "Stars", } labels["Star Wars"] = { display = "''[[Star Wars]]''", topical_categories = true, } labels["statistical mechanics"] = { Wiktionary = true, topical_categories = true, } labels["statistics"] = { Wiktionary = true, topical_categories = true, } labels["steroid"] = { display = "[[biochemistry]]", topical_categories = "Steroids", } labels["steroid hormone"] = { aliases = {"steroid drug"}, display = "[[biochemistry]], [[steroids]]", topical_categories = "Hormones", } labels["stock market"] = { Wiktionary = true, topical_categories = true, } labels["stock ticker symbol"] = { aliases = {"stock symbol"}, Wiktionary = true, topical_categories = "Stock symbols for companies", } labels["string instruments"] = { aliases = {"string instrument"}, display = "[[music]]", topical_categories = true, } labels["subculture"] = { Wiktionary = true, topical_categories = "Culture", } labels["Sufism"] = { aliases = {"Sufi Islam"}, Wikipedia = true, topical_categories = true, } labels["sugar acid"] = { display = "[[organic chemistry]]", topical_categories = "Sugar acids", } labels["sumo"] = { Wiktionary = true, topical_categories = true, } labels["supply chain"] = { Wiktionary = true, topical_categories = true, } labels["surface feature"] = { display = "[[planetology]]", topical_categories = "Planetary nomenclature", } labels["surfing"] = { aliases = {"surf"}, Wiktionary = "surfing#Noun", topical_categories = true, } labels["surgery"] = { Wiktionary = true, topical_categories = true, } labels["surveying"] = { Wiktionary = "surveying#Noun", topical_categories = true, } labels["sushi"] = { Wiktionary = true, topical_categories = true, } labels["swimming"] = { Wiktionary = "swimming#Noun", topical_categories = true, } labels["Swiss politics"] = { Wikipedia = "Politics of Switzerland", topical_categories = true, } labels["swords"] = { display = "[[sword]]s", topical_categories = true, } labels["syntax"] = { Wiktionary = true, topical_categories = true, } labels["Syriac Orthodoxy"] = { aliases = {"Syriac Orthodox", "Syriac Orthodox Church"}, Wikipedia = true, topical_categories = true, } labels["systematic chemical element symbol"] = { display = "[[chemistry]]", plain_categories = "Systematic chemical element symbols", } labels["systematics"] = { Wiktionary = true, topical_categories = "Taxonomy", } labels["systems engineering"] = { Wiktionary = true, topical_categories = true, } labels["systems theory"] = { Wiktionary = true, topical_categories = true, } labels["table tennis"] = { Wiktionary = true, topical_categories = true, } labels["Taoism"] = { aliases = {"Daoism"}, Wiktionary = true, topical_categories = true, } labels["tarot"] = { Wiktionary = true, topical_categories = "Cartomancy", } labels["taxation"] = { aliases = {"tax", "taxes"}, Wiktionary = true, topical_categories = true, } labels["taxonomic name"] = { display = "[[taxonomy]]", topical_categories = "Taxonomic names", } labels["taxonomy"] = { Wiktionary = true, topical_categories = true, } labels["technology"] = { Wiktionary = true, topical_categories = true, } labels["telecommunications"] = { aliases = {"telecommunication", "telecom"}, Wiktionary = true, topical_categories = true, } labels["telegraphy"] = { Wiktionary = true, topical_categories = true, } labels["telephony"] = { aliases = {"telephone", "telephones"}, Wiktionary = true, topical_categories = true, } labels["television"] = { aliases = {"TV"}, Wiktionary = true, topical_categories = true, } labels["tennis"] = { Wiktionary = true, topical_categories = true, } labels["teratology"] = { Wiktionary = true, topical_categories = true, } labels["Tetris"] = { Wiktionary = true, topical_categories = true, } labels["textiles"] = { Wiktionary = true, topical_categories = true, } labels["textual criticism"] = { Wiktionary = true, topical_categories = true, } labels["theater"] = { aliases = {"theatre"}, Wiktionary = true, topical_categories = true, } labels["theology"] = { Wiktionary = true, topical_categories = true, } labels["thermodynamics"] = { Wiktionary = true, topical_categories = true, } labels["Thracian god"] = { aliases = {"Thracian goddess", "Thracian deity"}, display = "[[w:Thracian religion|Thracian religion]]", Wikipedia = "Thracian religion", topical_categories = "Thracian deities", } labels["Tibetan Buddhism"] = { Wiktionary = true, topical_categories = "Buddhism", } labels["tiddlywinks"] = { Wiktionary = true, topical_categories = true, } labels["TikTok aesthetic"] = { display = "[[TikTok]] aesthetic", topical_categories = "Aesthetics", } labels["timber industry"] = { aliases = {"timber", "wood industry", "lumber industry", "lumber", "logging"}, Wikipedia = true, topical_categories = true, } labels["time"] = { Wiktionary = true, topical_categories = true, } labels["tincture"] = { display = "[[heraldry]]", topical_categories = "Heraldic tinctures", } labels["topology"] = { Wiktionary = true, topical_categories = true, } labels["tort law"] = { Wiktionary = true, topical_categories = "Law", } labels["tourism"] = { aliases = {"tourist"}, Wiktionary = true, topical_categories = true, } labels["toxicology"] = { Wiktionary = true, topical_categories = true, } labels["trading"] = { aliases = {"trade"}, Wiktionary = "trading#Noun", topical_categories = true, } labels["trading cards"] = { display = "[[trading card]]s", topical_categories = true, } labels["traditional Chinese medicine"] = { aliases = {"TCM", "Chinese medicine"}, Wiktionary = true, topical_categories = true, } labels["traditional Korean medicine"] = { aliases = {"Korean medicine"}, topical_categories = true, } labels["transgender"] = { aliases = {"trans"}, Wiktionary = true, topical_categories = true, } labels["translation studies"] = { Wiktionary = true, topical_categories = true, } labels["transport"] = { aliases = {"transportation"}, Wiktionary = true, topical_categories = true, } labels["traumatology"] = { Wiktionary = true, topical_categories = "Emergency medicine", } labels["travel"] = { aliases = {"travelling"}, Wiktionary = true, topical_categories = true, } labels["trigonometric function"] = { display = "[[trigonometry]]", topical_categories = "Trigonometric functions", } labels["trigonometry"] = { Wiktionary = true, topical_categories = true, } labels["trust law"] = { Wiktionary = true, topical_categories = "Law", } labels["Tumblr aesthetic"] = { display = "[[Tumblr]] [[aesthetic]]", topical_categories = "Aesthetics", } labels["Twitter"] = { aliases = {"twitter", "X"}, Wiktionary = "Twitter#Proper noun", topical_categories = true, } labels["two-up"] = { Wiktionary = true, topical_categories = true, } labels["typography"] = { aliases = {"typesetting"}, Wiktionary = true, topical_categories = true, } labels["ufology"] = { Wiktionary = true, topical_categories = true, } labels["UK politics"] = { Wikipedia = "Politics of the United Kingdom", topical_categories = true, } labels["Umbanda"] = { Wiktionary = true, topical_categories = true, } labels["underwater diving"] = { aliases = {"scuba", "scuba diving"}, display = "[[underwater]] [[diving#Noun|diving]]", topical_categories = true, } labels["Unicode"] = { aliases = {"Unicode standard"}, Wikipedia = true, topical_categories = true, } labels["United Nations"] = { aliases = {"UN"}, display = "[[United Nations|UN]]", Wikipedia = true, topical_categories = true, } labels["Unix"] = { Wiktionary = true, topical_categories = true, } labels["urban studies"] = { aliases = {"urbanism", "urban planning"}, Wiktionary = true, topical_categories = true, } labels["urology"] = { Wiktionary = true, topical_categories = true, } labels["US politics"] = { Wikipedia = "Politics of the United States", topical_categories = true, } labels["Usenet"] = { aliases = {"newsgroup"}, Wiktionary = true, topical_categories = true, } labels["Vaishnavism"] = { aliases = {"Vaishnavist"}, Wiktionary = true, topical_categories = true, } labels["Valentinianism"] = { aliases = {"valentinianism", "Valentinianist", "valentinianist"}, Wikipedia = true, topical_categories = true, } labels["Vedic religion"] = { aliases = {"Vedic Hinduism", "Vedism", "Vedicism", "Ancient Hinduism", "ancient Hinduism"}, Wikipedia = "Historical Vedic religion", topical_categories = true, } labels["vegetable"] = { aliases = {"vegetables"}, Wiktionary = true, topical_categories = "Vegetables", } labels["vehicles"] = { aliases = {"vehicle"}, display = "[[vehicle]]s", topical_categories = true, } labels["Venezuelan politics"] = { aliases = {"Venezuela politics"}, Wikipedia = "Politics of Venezuela", topical_categories = true, } labels["veterinary disease"] = { display = "[[veterinary medicine]]", topical_categories = "Veterinary diseases", } labels["veterinary medicine"] = { aliases = {"veterinary", "vet"}, Wiktionary = true, topical_categories = true, } labels["video compression"] = { Wikipedia = true, topical_categories = true, } labels["video game genre"] = { display = "[[video game]]s", topical_categories = "Video game genres", } labels["video games"] = { aliases = {"video game", "video gaming"}, display = "[[video game]]s", topical_categories = true, } labels["virology"] = { Wiktionary = true, topical_categories = true, } labels["virus"] = { display = "[[virology]]", topical_categories = "Viruses", } labels["vitamin"] = { display = "[[biochemistry]]", topical_categories = "Vitamins", } labels["viticulture"] = { Wiktionary = true, topical_categories = {"Horticulture", "Wine"}, } labels["volcanology"] = { aliases = {"vulcanology"}, Wiktionary = true, topical_categories = true, } labels["volleyball"] = { Wiktionary = true, topical_categories = true, } labels["voodoo"] = { Wiktionary = true, topical_categories = true, } labels["VTuber"] = { aliases = {"Virtual YouTuber"}, Wiktionary = true, topical_categories = "Virtual YouTuber", } labels["war"] = { aliases = {"warfare"}, Wiktionary = true, topical_categories = true, } labels["water sports"] = { aliases = {"watersport", "watersports", "water sport"}, Wiktionary = "watersport", topical_categories = true, } labels["watercraft"] = { display = "[[nautical]]", topical_categories = true, } labels["weaponry"] = { aliases = {"weapon", "weapons"}, Wiktionary = true, topical_categories = "Weapons", } labels["weather"] = { topical_categories = true, } labels["weaving"] = { Wiktionary = "weaving#Noun", topical_categories = true, } labels["web design"] = { Wiktionary = true, topical_categories = true, aliases = {"Web design"} } labels["web development"] = { Wiktionary = true, topical_categories = {"Programming", "Web design"}, } labels["weightlifting"] = { Wiktionary = true, topical_categories = true, } labels["white supremacy"] = { -- Often used to indicate Nazi-used jargon; compare "neo-Nazism" aliases = {"white nationalism", "white nationalist", "white power", "white racism", "white supremacist ideology", "white supremacism", "white supremacist"}, Wikipedia = true, topical_categories = "White supremacist ideology", } labels["Wicca"] = { Wiktionary = true, topical_categories = true, } labels["wiki jargon"] = { aliases = {"wiki", "wikis"}, display = "[[wiki]] [[jargon]]", topical_categories = "Wiki", } labels["Wikimedia jargon"] = { aliases = { "Wikimedia", "Wiktionary", "Wiktionary jargon", "Wikipedia", "Wikipedia jargon", "WMF", "WMF jargon" -- technically not correct }, display = "[[w:Wikimedia movement|Wikimedia]] [[jargon]]", topical_categories = "Wikimedia", } labels["wind instruments"] = { aliases = {"wind instrument"}, display = "[[music]]", topical_categories = true, } labels["wine"] = { aliases = {"oenology", "winemaking"}, Wiktionary = true, topical_categories = true, } labels["winter sports"] = { display = "[[winter sport]]s", topical_categories = true, } labels["woodwind instruments"] = { aliases = {"woodwind instrument"}, display = "[[music]]", topical_categories = true, } labels["woodworking"] = { Wiktionary = true, topical_categories = true, } labels["World War I"] = { aliases = {"World War 1", "WWI", "WW I", "WW1", "WW 1"}, Wikipedia = true, topical_categories = true, } labels["World War II"] = { aliases = {"World War 2", "WWII", "WW II", "WW2", "WW 2"}, Wikipedia = true, topical_categories = true, } labels["wrestling"] = { Wiktionary = "wrestling#Noun", topical_categories = true, } labels["writing"] = { Wiktionary = "writing#Noun", topical_categories = true, } labels["xiangqi"] = { aliases = {"Chinese chess"}, Wiktionary = true, topical_categories = true, } labels["Yazidism"] = { aliases = {"Yezidism"}, Wiktionary = true, topical_categories = true, } labels["yoga"] = { Wiktionary = true, topical_categories = true, } labels["yoga pose"] = { aliases = {"asana"}, display = "[[yoga]]", topical_categories = "Yoga poses", } labels["zodiac constellations"] = { display = "[[astronomy]]", topical_categories = "Constellations in the zodiac", } labels["zoology"] = { Wiktionary = true, topical_categories = true, } labels["zootomy"] = { Wiktionary = true, topical_categories = "Animal body parts", } labels["Zoroastrianism"] = { Wiktionary = true, topical_categories = true, } -- Deprecated/do not use warning (ambiguous, unsuitable etc) labels["deprecated label"] = { aliases = {"emergency", "greekmyth", "industry", "morphology", "musici", "quantum", "vector"}, display = "<span style=\"color:var(--wikt-palette-red,red);\"><b>deprecated label</b></span>", deprecated = true, } return require("Module:labels").finalize_data(labels) o4s2izs1xzb9qh6y7aalgyei7zhwnvh साँचा:code 10 302285 487770 478870 2026-09-02T16:37:53Z SM7 6218 updating... 487770 wikitext text/x-wiki {{#invoke:code|show}}<noinclude>{{documentation}}</noinclude> elz92n6wosc3vfz1cu3dkycgrq2rkrh मॉड्यूल:category tree 828 302327 487856 487701 2026-09-02T20:37:11Z SM7 6218 सुधार टेस्ट 487856 Scribunto text/plain -- Prevent substitution. if mw.isSubsting() then return require("Module:unsubst") end local export = {} local category_tree_submodule_prefix = "Module:category tree/" local category_tree_styles_css = "Module:category tree/styles.css" local m_str_utils = require("Module:string utilities") local m_template_parser = require("Module:template parser") local m_utilities = require("Module:utilities") local ceil = math.ceil local class_else_type = m_template_parser.class_else_type local concat = table.concat local deep_copy = require("Module:table").deepCopy local full_url = mw.uri.fullUrl local insert = table.insert local is_callable = require("Module:fun").is_callable local log10 = math.log10 or require("Module:math").log10 local new_title = mw.title.new local pages_in_category = mw.site.stats.pagesInCategory local parse = m_template_parser.parse local remove_comments = require("Module:string/removeComments") local sort = table.sort local split = m_str_utils.split local string_compare = require("Module:string/compare") local trim = m_str_utils.trim local uupper = m_str_utils.upper local yesno = require("Module:yesno") local current_frame = mw.getCurrentFrame() local current_title = mw.title.getCurrentTitle() local namespace = current_title.namespace local poscatboiler_subsystem = "poscatboiler" local extra_args_error = "Extra arguments to {{((}}auto cat{{))}} are not allowed for this category." -- Generates a sortkey for a numeral `n`, adding leading zeroes to avoid the "1, 10, 2, 3" sorting problem. `max_n` is the greatest expected value of `n`, and is used to determine how many leading zeroes are needed. If not supplied, it defaults to the number of languages. function export.numeral_sortkey(n, max_n) max_n = max_n or require("Module:list of languages").count() return ("#%%0%dd"):format(ceil(log10(max_n + 1))):format(n) end function export.split_lang_label(title_text) local getByCanonicalName = require("Module:languages").getByCanonicalName -- Progressively remove a word from the potential canonical name until it -- matches an actual canonical name. local words = split(title_text, " ", true) for i = #words - 1, 1, -1 do local lang = getByCanonicalName(concat(words, " ", 1, i)) if lang then return lang, concat(words, " ", i + 1) end end return nil, title_text end local function show_error(text, title) return require("Module:message box").maintenance( "red", "[[File:Codex icon Alert red.svg|40px|alt=alert]]", title or "This category is not defined in Wiktionary's category tree.", text ) end local function error_not_in_category_tree() error( "This category is not defined in Wiktionary's category tree. " .. "Double-check the category name for typos. " .. "Search existing categories or request definition at [[Wiktionary:Category and label treatment requests|WT:CLTR]]. " .. "Affected category: " .. current_title.fullText, 2 ) end -- Show the text that goes at the very top right of the page. local function show_topright(current) return current.getTopright and current:getTopright() or nil end local function link_box(content) return ("<div class=\"noprint plainlinks\" style=\"float: right; clear: both; margin: 0 0 .5em 1em; background: var(--wikt-palette-paleblue, #f9f9f9); border: 1px var(--border-color-base, #aaaaaa) solid; margin-top: -1px; padding: 5px; font-weight: bold;\">%s</div>"):format(content) end local function show_editlink(current) return link_box(("[%s Edit category data]"):format(tostring(full_url(current:getDataModule(), "action=edit")))) end local function show_related_changes() local title = current_title.fullText return link_box(("[%s <span title=\"Recent edits and other changes to pages in %s\">Recent changes</span>]"):format( tostring(full_url("Special:RecentChangesLinked", { target = title, showlinkedto = 0, })), title )) end local function show_pagelist(current) local namespace = "namespace=" local info = current:getInfo() local lang_code = info.code if info.label == "citations" or info.label == "citations of undefined terms" then namespace = namespace .. "Citations" elseif lang_code then local lang = require("Module:languages").getByCode(lang_code, true, true) if lang then -- Proto-Norse (gmq-pro) is probably the only language with a code ending in -pro -- that's intended to have mostly non-reconstructed entries. if (lang_code:find("%-pro$") and lang_code ~= "gmq-pro") or lang:hasType("reconstructed") then namespace = namespace .. "विक्षनरी" elseif lang:hasType("appendix-constructed") then namespace = namespace .. "विक्षनरी" end end elseif info.label:match("templates") then namespace = namespace .. "साँचा" elseif info.label:match("modules") then namespace = namespace .. "Module" elseif info.label:match("^विक्षनरी") or info.label:match("^Pages") then namespace = "" end return ([=[ {| id="newest-and-oldest-pages" class="wikitable mw-collapsible" style="float: right; clear: both; margin: 0 0 .5em 1em;" ! Newest and oldest pages&nbsp; |- | id="recent-additions" style="font-size:0.9em;" | '''Newest pages ordered by last [[mw:Manual:Categorylinks table#cl_timestamp|category link update]]:''' %s |- | id="oldest-pages" style="font-size:0.9em;" | '''Oldest pages ordered by last edit:''' %s |}]=]):format( current_frame:extensionTag( "DynamicPageList", ([=[ category=%s %s count=10 mode=ordered ordermethod=categoryadd order=descending]=] ):format(current_title.text, namespace) ), current_frame:extensionTag( "DynamicPageList", ([=[ category=%s %s count=10 mode=ordered ordermethod=lastedit order=ascending]=] ):format(current_title.text, namespace) ) ) end -- Show navigational "breadcrumbs" at the top of the page. local function show_breadcrumbs(current) local steps = {} -- Start at the current label and move our way up the "chain" from child to parent, until we can't go further. while current do local category, display_name, nocap if type(current) == "string" then category = current display_name = current:gsub("^श्रेणी:", "") else if not current.getCategoryName then error("Internal error: Bad format in breadcrumb chain structure, probably a misformatted value for `parents`: " .. mw.dumpObject(current)) end category = "श्रेणी:" .. current:getCategoryName() display_name, nocap = current:getBreadcrumbName() end if not nocap then display_name = mw.getContentLanguage():ucfirst(display_name) end insert(steps, 1, ("[[:%s|%s]]"):format(category, display_name)) -- Move up the "chain" by one level. if type(current) == "string" then current = nil else current = current:getParents() end if current then current = current[1].name end end local templateStyles = require("Module:TemplateStyles")(category_tree_styles_css) local ol = mw.html.create("ol") for i, step in ipairs(steps) do local li = mw.html.create("li") if i ~= 1 then local span = mw.html.create("span") :attr("aria-hidden", "true") :addClass("ts-categoryBreadcrumbs-separator") :wikitext(" » ") li:node(span) end li:wikitext(step) ol:node(li) end return templateStyles .. tostring(mw.html.create("div") :attr("role", "navigation") :attr("aria-label", "Breadcrumb") :addClass("ts-categoryBreadcrumbs") :node(ol)) end local function show_also(current) local also = current._info.also if also and #also > 0 then return ('<div style="margin-top:-1em;margin-bottom:1.5em">%s</div>'):format(require("Module:also").main(also)) end return nil end -- Show a short description text for the category. local function show_description(current) return current.getDescription and current:getDescription() or nil end local function show_appendix(current) local appendix = current.getAppendix and current:getAppendix() return appendix and ("For more information, see [[%s]]."):format(appendix) or nil end local function sort_children(child1, child2) return string_compare(uupper(child1.sort), uupper(child2.sort)) end -- Show a list of child categories. local function show_children(current) local children = current.getChildren and current:getChildren() or nil if not children then return nil end sort(children, sort_children) local children_list = {} for _, child in ipairs(children) do local child_name, child_pagetitle = child.name if type(child_name) == "string" then child_pagetitle = child_name else child_pagetitle = "श्रेणी:" .. child_name:getCategoryName() end if new_title(child_pagetitle).exists then insert(children_list, ("* [[:%s]]: %s"):format( child_pagetitle, child.description or type(child_name) == "string" and child_name:gsub("^श्रेणी:", "") .. "." or child_name:getDescription("child") )) end end return concat(children_list, "\n") end -- Show a table of contents with links to each letter in the language's script. local function show_TOC(current) local titleText = current_title.text local inCategoryPages = pages_in_category(titleText, "pages") local inCategorySubcats = pages_in_category(titleText, "subcats") local TOC_type -- Compute type of table of contents required. if inCategoryPages > 2500 or inCategorySubcats > 2500 then TOC_type = "full" elseif inCategoryPages > 200 or inCategorySubcats > 200 then TOC_type = "normal" else -- No (usual) need for a TOC if all pages or subcategories can fit on one page; -- but allow this to be overridden by a custom TOC handler. TOC_type = "none" end if current.getTOC then local TOC_text = current:getTOC(TOC_type) if TOC_text ~= true then return TOC_text or nil end end if TOC_type ~= "none" then local templatename = current:getTOCTemplateName() local TOC_template if TOC_type == "full" then -- This category is very large, see if there is a "full" version of the TOC. local TOC_template_full = new_title(templatename .. "/full") if TOC_template_full.exists then TOC_template = TOC_template_full end end if not TOC_template then local TOC_template_normal = new_title(templatename) if TOC_template_normal.exists then TOC_template = TOC_template_normal end end if TOC_template then return current_frame:expandTemplate{title = TOC_template.text, args = {}} end end return nil end -- Show the "catfix" that adds language attributes and script classes to the page. local function show_catfix(current) local lang, sc = current:getCatfixInfo() return lang and m_utilities.catfix(lang, sc) or nil end -- Show the parent categories that the current category should be placed in. local function show_categories(current, categories) local parents = current.getParents and current:getParents() or nil if not parents then return nil end for _, parent in ipairs(parents) do local parent_name = parent.name local sortkey = type(parent.sort) == "table" and parent.sort:makeSortKey() or parent.sort if type(parent_name) == "string" then insert(categories, ("[[%s|%s]]"):format(parent_name, sortkey)) else insert(categories, ("[[श्रेणी:%s|%s]]"):format(parent_name:getCategoryName(), sortkey)) end end -- Also put the category in its corresponding "umbrella" or "by language" category. local umbrella = current:getUmbrella() if umbrella then -- FIXME: use a language-neutral sorting function like the Unicode Collation Algorithm. local sortkey = current._lang and current._lang:getCanonicalName() or current:getCategoryName() sortkey = require("Module:languages").getByCode("en", true):makeSortKey(sortkey) if type(umbrella) == "string" then insert(categories, ("[[%s|%s]]"):format(umbrella, sortkey)) else insert(categories, ("[[श्रेणी:%s|%s]]"):format(umbrella:getCategoryName(), sortkey)) end end -- Check for various unwanted parser functions, which should be integrated into the category tree data instead. -- Note: HTML comments shouldn't be removed from `content` until after this step, as they can affect the result. local content = current_title:getContent() if not content then -- This happens when using [[Special:ExpandTemplates]] to call {{auto cat}} on a nonexistent category page, -- which is needed by Benwing's create_wanted_categories.py script. return end local defaultsort, displaytitle, page_has_param for node in parse(content):iterate_nodes() do local node_class = class_else_type(node) if node_class == "template" then local name = node:get_name() if name == "DEFAULTSORT:" and not defaultsort then insert(categories, "[[Category:Pages with DEFAULTSORT conflicts]]") defaultsort = true elseif name == "DISPLAYTITLE:" and not displaytitle then insert(categories,"[[Category:Pages with DISPLAYTITLE conflicts]]") displaytitle = true end elseif node_class == "parameter" and not page_has_param then insert(categories,"[[Category:Pages with raw triple-brace template parameters]]") page_has_param = true end end -- Check for raw category markup, which should also be integrated into the category tree data. content = remove_comments(content, "BOTH") local head = content:find("[[", 1, true) while head do local close = content:find("]]", head + 2, true) if not close then break end -- Make sure there are no intervening "[[" between head and close. local open = content:find("[[", head + 2, true) while open and open < close do head = open open = content:find("[[", head + 2, true) end local cat = content:sub(head + 2, close - 1) local colon = cat:match("^[ _\128-\244]*[श्रेणी _\128-\244]*():") if colon then local pipe = cat:find("|", colon + 1, true) if pipe ~= #cat then local title = new_title(pipe and cat:sub(1, pipe - 1) or cat) if title and title.namespace == 14 then insert(categories,"[[Category:Categories with categories using raw markup]]") break end end end head = open end end local function generate_output(current) if current then for _, functionName in pairs{ "getBreadcrumbName", "getDataModule", "canBeEmpty", "getDescription", "getParents", "getChildren", "getUmbrella", "getAppendix", "getTOCTemplateName", } do if not is_callable(current[functionName]) then require("Module:debug").track{"category tree/missing function", "category tree/missing function/" .. functionName} end end end local boxes, display, categories = {}, {}, {} -- Categories should never show files as a gallery. insert(categories, "__NOGALLERY__") if current_frame:getParent():getTitle() == "साँचा:auto cat" then insert(categories, "[[Category:Categories calling Template:auto cat]]") end -- Check if the category is empty local totalPages = pages_in_category(current_title.text, "all") local hugeCategory = totalPages > 1000000 -- 1 million -- Categorize huge categories, as they cause DynamicPageList to time out and make the category inaccessible. if hugeCategory then insert(categories, "[[Category:Huge categories]]") end -- Are the parameters valid? if not current then -- Signal failure so export.show can try the next handler. return nil, true end -- Does the category have the correct name? local currentName = current:getCategoryName() local correctName = current_title.text == currentName if not correctName then insert(categories, "[[श्रेणी:Categories with incorrect names]]") insert(display, show_error( ("Based on the data in the category tree, this category should be called '''[[:श्रेणी:%s]]'''."):format(currentName), "इस श्रेणी में कोई ग़लत नाम है।" )) end -- Add cleanup category for empty categories. local canBeEmpty = current:canBeEmpty() if canBeEmpty and correctName then insert(categories, " __EXPECTUNUSEDCATEGORY__") elseif totalPages == 0 then insert(categories, "[[Category:Empty categories]]") end if current:isHidden() then insert(categories, " __HIDDENCAT__") end -- Put all the float-right stuff into a <div> that does not clear, so that float-left stuff like the breadcrumbs and -- description can go opposite the float-right stuff without vertical space. insert(boxes, "<div style=\"float: right;\">") insert(boxes, show_topright(current)) insert(boxes, show_editlink(current)) insert(boxes, show_related_changes()) -- Show pagelist, unless it's a huge category (since they can't use DynamicPageList - see above). if not hugeCategory then insert(boxes, show_pagelist(current)) end insert(boxes, "</div>") -- Generate the displayed information insert(display, show_breadcrumbs(current)) insert(display, show_also(current)) insert(display, show_description(current)) insert(display, show_appendix(current)) insert(display, show_children(current)) insert(display, show_TOC(current)) insert(display, show_catfix(current)) insert(display, '<br class="clear-both-in-vector-2022-only">') show_categories(current, categories) return concat(boxes, "\n") .. "\n" .. concat(display, "\n\n") .. concat(categories, "") end --[==[ List of handler functions that try to match the page name. A handler should return the name of a submodule to [[Module:category tree]] and an info table which is passed as an argument to the submodule. If a handler does not recognize the page name, it should return nil. Note that the order of handlers matters! ]==] local handlers = {} -- Thesaurus per-language category insert(handlers, function(title) local code, label = title:match("^विक्षनरी:(%l[%a-]*%a):(.+)") if code then return poscatboiler_subsystem, {label = title, raw = true} end end) -- Topic per-language category insert(handlers, function(title) local code, label = title:match("^(%l[%a-]*%a):(.+)") if code then return poscatboiler_subsystem, {label = title, raw = true} end end) -- Lect category e.g. for [[:Category:New Zealand English]] or [[:Category:Issime Walser]] insert(handlers, function(title, args) local lect = args.lect or args.dialect if lect ~= "" and yesno(lect, true) then -- Same as boolean in [[Module:parameters]]. return poscatboiler_subsystem, {label = title, args = args, raw = true} end end) -- poscatboiler per-language label, e.g. [[Category:English non-lemma forms]] insert(handlers, function(title, args) local lang, label = export.split_lang_label(title) if not lang then return end local baseLabel, script = label:match("(.+) in (.-)$") if script and baseLabel ~= "टर्म" then local scriptObj = require("Module:scripts").getByCategoryName(script) if scriptObj then return poscatboiler_subsystem, {label = baseLabel, code = lang:getCode(), sc = scriptObj:getCode(), args = args} end end return poscatboiler_subsystem, {label = label, code = lang:getCode(), args = args} end) -- poscatboiler label umbrella category insert(handlers, function(title, args) local label = title:match("(.+) भाषा अनुसार$") if label then -- The poscatboiler code will appropriately lowercase if needed. return poscatboiler_subsystem, {label = label, args = args} end end) -- poscatboiler raw handlers insert(handlers, function(title, args) return poscatboiler_subsystem, {label = title, args = args, raw = true} end) -- poscatboiler umbrella handlers without 'by language' insert(handlers, function(title, args) return poscatboiler_subsystem, {label = title, args = args} end) function export.show(frame) local args, other_args = require("Module:parameters").process(frame:getParent().args, { ["also"] = {type = "title", sublist = "comma without whitespace", namespace = 14} }, true) if args.also then for k, arg in next, args.also do args.also[k] = arg.prefixedText end end for k, arg in next, other_args do other_args[k] = trim(arg) end if namespace == 10 then -- Template return "(यह साँचा [[Help:Namespaces#Category|श्रेणी:]] नामस्थान में स्थित पृष्ठ पर प्रयोग किया जाना चाहिये।)" elseif namespace ~= 14 then -- Category error("यह साँचा/मॉड्यूल केवल [[mw:Help:Namespaces#Category|श्रेणी:]] नामस्थान में प्रयोग में लाया जा सकता है।") end local saw_tree_lookup_failure = false local failure_consumed_args = false -- Go through each handler in turn. If a handler doesn't recognize the format of the category, it will return nil, -- and we will consider the next handler. Otherwise, it returns a template name and arguments to call it with, but -- even then, that template might return an error, and we need to consider the next handler. This happens, for -- example, with the category "CAT:Mato Grosso, Brazil", where "Mato" is the name of a language, so the poscatboiler -- per-language label handler fires and tries to find a label "Grosso, Brazil". This throws an error, and -- previously, this blocked further handler consideration, but now we check for the error and continue checking -- handlers; eventually, the topic umbrella handler will fire and correctly handle the category. for _, handler in ipairs(handlers) do -- Use a new title object and args table for each handler, to keep them isolated. local submodule, info = handler(current_title.text, deep_copy(other_args)) if submodule then info.also = deep_copy(args.also) require("Module:debug").track("auto cat/" .. submodule) -- `failed` is true if no match was found in the category tree. submodule = require(category_tree_submodule_prefix .. submodule) local cattext, failed = generate_output(submodule.main(info)) if failed then saw_tree_lookup_failure = true failure_consumed_args = failure_consumed_args or not not info.args elseif not info.args and next(other_args) then error(extra_args_error) else return cattext end end end -- No handler produced a valid category-tree match. -- Preserve previous behavior: if no failing handler consumed args, surface extra-arg errors first. if saw_tree_lookup_failure and not failure_consumed_args and next(other_args) then error(extra_args_error) end error_not_in_category_tree() end -- TODO: new test entrypoint. return export ia7nzbei6nzouh7ygyhpoosr8rgpefn मॉड्यूल:category tree/data 828 302328 487804 487713 2026-09-02T18:58:29Z SM7 6218 कुछ submodule का प्रयोग फिलहाल रोका गया 487804 Scribunto text/plain local labels = {} local raw_categories = {} local handlers = {} local raw_handlers = {} 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. -- "विषय", -- "affixes and compounds", -- "वर्ण", "प्रविष्टि रखरखाव", "व्युत्पत्ति", "परिवार", -- "figures of speech", -- "grammatical classes", -- "lang-specific-raw", "भाषाएँ", -- "लेक्ट", "लेम्मा", -- "lexical properties", -- "miscellaneous", -- "मॉड्यूल", "नाम", -- "गैर-लेम्मा रूप", -- "phrases", -- "pragmatic properties", -- "तुक", "लिपियाँ", -- "semantic classes", -- "shortenings", -- "speech acts", -- "चिह्न", "साँचे", --"टर्म लिपि अनुसार", -- "ट्रांसलिट्रेशन", -- "युनिकोड", -- "विक्षनरी", "विक्षनरी रखरखाव", -- "विक्षनरी सदस्य'", -- "wiktionary votes", -- "word of the day", "हेडवर्ड", } -- 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 .. " जिसे [[" .. datamodule .. "]] और [[" .. 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("प्रारूपहीन श्रेणी " .. category .. " जिसे [[" .. datamodule .. "]] और [[" .. 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("^श्रेणी:") 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 } 805drj44oi06dmfy6voqjmxckv0x9r2 487827 487804 2026-09-02T19:28:48Z SM7 6218 कुछ और subpage रोके 487827 Scribunto text/plain local labels = {} local raw_categories = {} local handlers = {} local raw_handlers = {} 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. -- "विषय", -- "affixes and compounds", -- "वर्ण", "प्रविष्टि रखरखाव", "व्युत्पत्ति", "परिवार", -- "figures of speech", -- "grammatical classes", -- "lang-specific-raw", "भाषाएँ", -- "लेक्ट", "लेम्मा", -- "lexical properties", -- "miscellaneous", -- "मॉड्यूल", -- "नाम", -- "गैर-लेम्मा रूप", -- "phrases", -- "pragmatic properties", -- "तुक", "लिपियाँ", -- "semantic classes", -- "shortenings", -- "speech acts", -- "चिह्न", -- "साँचे", --"टर्म लिपि अनुसार", -- "ट्रांसलिट्रेशन", -- "युनिकोड", -- "विक्षनरी", -- "विक्षनरी रखरखाव", -- "विक्षनरी सदस्य'", -- "wiktionary votes", -- "word of the day", "हेडवर्ड", } -- 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 .. " जिसे [[" .. datamodule .. "]] और [[" .. 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("प्रारूपहीन श्रेणी " .. category .. " जिसे [[" .. datamodule .. "]] और [[" .. 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("^श्रेणी:") 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 } dfuqz8h4tn9b2ph4a0lzu49ctprh0yh मॉड्यूल:category tree/poscatboiler 828 302330 487805 477906 2026-09-02T19:04:12Z SM7 6218 updating... 487805 Scribunto text/plain local lang_independent_data = require("Module:category tree/data") local lang_specific_module = "Module:category tree/lang" local lang_specific_module_prefix = lang_specific_module .. "/" local family_specific_module = "Module:category tree/fam" local family_specific_module_prefix = family_specific_module .. "/" local labels_utilities_module = "Module:labels/utilities" local template_parser_module = "Module:template parser" local concat = table.concat local dump = mw.dumpObject local expand_template = require("Module:frame").expandTemplate local insert = table.insert local is_callable = require("Module:fun").is_callable local lcfirst = require("Module:string utilities").lcfirst local list_to_set = require("Module:table").listToSet local make_title = mw.title.makeTitle local new_title = mw.title.new local parse = require(template_parser_module).parse local sparse_concat = require("Module:table").sparseConcat local tostring = tostring local type = type local ucfirst = require("Module:string utilities").ucfirst local uupper = require("Module:string utilities").upper local function internal_error(msg) error("Internal error: " .. msg) end local function get_lang(...) local _get_lang = require("Module:languages").getByCode function get_lang(...) return _get_lang(...) or require("Module:languages/errorGetBy").code(...) end return get_lang(...) end local function get_script(...) local _get_script = require("Module:scripts").getByCode function get_script(code) return _get_script(code) or require("Module:languages/error")(code, true, "script code") end return get_script(...) end -- Category object local Category = {} Category.__index = Category function Category:get_originating_info() local originating_info = "" if self._info.originating_label then originating_info = " (originating from label \"" .. self._info.originating_label .. "\" in module [[" .. self._info.originating_module .. "]])" end return originating_info end local valid_keys = list_to_set{"code", "label", "sc", "raw", "args", "also", "called_from_inside", "originating_label", "originating_module"} function Category.new(info) for key in pairs(info) do if not valid_keys[key] then internal_error("The parameter \"" .. key .. "\" was not recognized.") end end local self = setmetatable({}, Category) self._info = info if not self._info.label then internal_error("No label was specified.") end self:initCommon() if not self._data then internal_error("The " .. (self._info.raw and "raw " or "") .. "label \"" .. self._info.label .. "\" does not exist" .. self:get_originating_info() .. ".") end return self end function Category:initCommon() local function patch_args(args) -- This fixes the issue with Scribunto automatically converting keys -- in a table as numbers to strings, which in turn causes a circular -- error for having argument parameter names as numbers as strings. if type(args) ~= "table" then return args end local new_args = {} for k, v in pairs(args) do if type(k) == "string" and string.len(k) < 10 and not string.match(k, "^0") and string.match(k, "^%d+$") then new_args[tonumber(k)] = patch_args(v) else new_args[k] = patch_args(v) end end return new_args end local args_handled = false if self._info.raw then -- Check if the category exists local raw_categories = lang_independent_data["RAW_CATEGORIES"] self._data = raw_categories[self._info.label] if self._data then if self._data.lang then self._lang = get_lang(self._data.lang, nil, true) self._info.code = self._lang:getCode() end if self._data.sc then self._sc = get_script(self._data.sc) self._info.sc = self._sc:getCode() end else -- Go through raw handlers local data = { category = self._info.label, args = patch_args(self._info.args) or {}, called_from_inside = self._info.called_from_inside, } for _, handler in ipairs(lang_independent_data["RAW_HANDLERS"]) do self._data, args_handled = handler.handler(data) if self._data then self._data.module = self._data.module or handler.module break end end if self._data then -- Update the label if the handler specified a canonical name for it. if self._data.canonical_name then self._info.canonical_name = self._data.canonical_name end if self._data.lang then if type(self._data.lang) ~= "string" then internal_error("Received non-string value " .. dump(self._data.lang) .. " for self._data.lang, label \"" .. self._info.label .. "\"" .. self:get_originating_info() .. ".") end self._lang = get_lang(self._data.lang, nil, true) self._info.code = self._lang:getCode() end if self._data.sc then if type(self._data.sc) ~= "string" then internal_error("Received non-string value " .. dump(self._data.sc) .. " for self._data.sc, label \"" .. self._info.label .. "\"" .. self:get_originating_info() .. ".") end self._sc = get_script(self._data.sc) self._info.sc = self._sc:getCode() end end end else -- Already parsed into language + label if self._info.code then self._lang = get_lang(self._info.code, nil, true) else self._lang = nil end if self._info.sc then self._sc = get_script(self._info.sc) else self._sc = nil end self._info.orig_label = self._info.label if not self._lang then -- Umbrella categories without a preceding language always begin with a capital letter, but the actual label may be -- lowercase (cf. [[:Category:Nouns by language]] with label 'nouns' with per-language [[:Category:English nouns]]; -- but [[:Category:Reddit slang by language]] with label 'Reddit slang' with per-language -- [[:Category:English Reddit slang]]). Since the label is almost always lowercase, we lowercase it for umbrella -- categories, storing the original into `orig_label`, and correct it later if needed. self._info.label = lcfirst(self._info.label) end -- First, check lang-specific labels and handlers if this is not an umbrella category. if self._lang then local objects_with_modules = require(lang_specific_module) local obj, seen = self._lang, {} local object_specific_module_prefix = lang_specific_module_prefix local is_family = false repeat if objects_with_modules[obj:getCode()] then local module = object_specific_module_prefix .. obj:getCode() local labels_and_handlers = require(module) if labels_and_handlers.LABELS then self._data = labels_and_handlers.LABELS[self._info.label] if self._data then if not is_family and self._data.umbrella == nil and self._data.umbrella_parents == nil then self._data.umbrella = false end self._data.module = self._data.module or module end end if not self._data and labels_and_handlers.HANDLERS then for _, handler in ipairs(labels_and_handlers.HANDLERS) do local data = { label = self._info.label, lang = self._lang, sc = self._sc, args = patch_args(self._info.args) or {}, called_from_inside = self._info.called_from_inside, } self._data, args_handled = handler(data) if self._data then if not is_family and self._data.umbrella == nil and self._data.umbrella_parents == nil then self._data.umbrella = false end self._data.module = self._data.module or module break end end end if self._data then break end end seen[obj:getCode()] = true obj = obj:getFamily() if not is_family then is_family = true object_specific_module_prefix = family_specific_module_prefix objects_with_modules = require(family_specific_module) end until not obj or seen[obj:getCode()] end local function fetch_label_data(labels) self._data = labels[self._info.label] -- See comment above about uppercase- vs. lowercase-initial labels, which are indistinguishable -- in umbrella categories. if not self._data then self._data = labels[self._info.orig_label] if self._data then self._info.label = self._info.orig_label end end end -- Then check lang-independent labels. if not self._data then -- lang_independent_data.LABELS should always exist. fetch_label_data(lang_independent_data.LABELS) if not self._data and not self._lang then -- Check family-specific labels for umbrella label. local families_with_modules = require(family_specific_module) for famcode, _ in pairs(families_with_modules) do local module = family_specific_module_prefix .. famcode local labels_and_handlers = require(module) if labels_and_handlers.LABELS then fetch_label_data(labels_and_handlers.LABELS) if self._data then self._data.module = self._data.module or module break end end end end end -- Then check lang-independent handlers. if not self._data then local data = { label = self._info.label, lang = self._lang, sc = self._sc, args = patch_args(self._info.args) or {}, called_from_inside = self._info.called_from_inside, } for _, handler in ipairs(lang_independent_data["HANDLERS"]) do self._data, args_handled = handler.handler(data) if self._data then self._data.module = self._data.module or handler.module break end end if not self._data and not self._lang then -- Check family-specific labels for umbrella handler. local families_with_modules = require(family_specific_module) for famcode, _ in pairs(families_with_modules) do local module = family_specific_module_prefix .. famcode local labels_and_handlers = require(module) if labels_and_handlers.HANDLERS then for _, handler in ipairs(labels_and_handlers.HANDLERS) do local data = { label = self._info.label, sc = self._sc, args = patch_args(self._info.args) or {}, called_from_inside = self._info.called_from_inside, } self._data, args_handled = handler(data) if self._data then self._data.module = self._data.module or module break end end end if self._data then break end end end end end if not args_handled and self._data and self._info.args and next(self._info.args) then local module_text = " (handled in [[" .. (self._data.module or "UNKNOWN").. "]])" local args_text = {} for k, v in pairs(self._info.args) do insert(args_text, k .. "=" .. ((type(v) == "string" or type(v) == "number") and v or dump(v))) end error("poscatboiler label '" .. self._info.label .. "' " .. module_text .. " doesn't accept extra args " .. concat(args_text, ", ")) end if self._sc and not self._lang then internal_error("Umbrella categories cannot have a script specified.") end end function Category:convert_spec_to_string(desc) if not desc then return desc end local desc_type = type(desc) if desc_type == "string" then return desc elseif desc_type == "number" then return tostring(desc) elseif not is_callable(desc) then internal_error("`desc` must be a string, number, function, callable table or nil; received " .. dump(desc)) end desc = desc { lang = self._lang, sc = self._sc, label = self._info.label, raw = self._info.raw, } if not desc then return desc end desc_type = type(desc) if desc_type == "string" then return desc end internal_error("The value returned by `desc` must be a string or nil; received " .. dump(desc)) end local function add_obj_args(args, obj, obj_type, sc_lang) if obj then args[obj_type .. "code"] = obj:getCode() args[obj_type .. "name"] = obj:getCanonicalName(sc_lang) args[obj_type .. "disp"] = obj:getDisplayForm(sc_lang) args[obj_type .. "cat"] = obj:getCategoryName(false, sc_lang) args[obj_type .. "link"] = obj:makeCategoryLink(sc_lang) end end -- Expands `desc` like a template, passing values for specs like {{{langname}}}. function Category:substitute_template_specs(desc) -- This may end up happening twice but that's OK as the function is (usually) idempotent. -- FIXME: Not idempotent if a preprocessed template returns wikicode. desc = self:convert_spec_to_string(desc) if not desc then return nil end -- Populate the substitution arguments. local args = {} args.umbrella_msg = "This is an umbrella category. It contains no dictionary entries, but only other, language-specific categories, which in turn contain relevant terms in a given language." args.umbrella_meta_msg = "This is an umbrella metacategory, covering a general area such as \"lemmas\", \"names\" or \"terms by etymology\". It contains no dictionary entries, but holds only umbrella (\"by language\") categories covering specific subtopics, which in turn contain language-specific categories holding terms in a given language for that same topic." add_obj_args(args, self._lang, "lang") add_obj_args(args, self._sc, "sc", self._lang) return parse(desc, true):expand(args) end function Category:substitute_template_specs_in_args(args) if not args then return args end local pinfo = {} for k, v in pairs(args) do pinfo[self:substitute_template_specs(k)] = self:substitute_template_specs(v) end return pinfo end function Category:make_new(info) info.originating_label = self._info.label info.originating_module = self._data.module info.called_from_inside = true return Category.new(info) end function Category:getBreadcrumbName() local ret if self._sc then -- The parent of 'LANG POS in SCRIPT script' is always 'SCRIPT script' regardless of the parents normally set, -- so the breadcrumb should always be 'POS' regardless of the breadcrumb normally set. return self._info.label, nil end if self._lang or self._info.raw then ret = self._data.breadcrumb or self._data.breadcrumb_base or self._data.breadcrumb_and_first_sort_base or self._data.breadcrumb_key or self._data.breadcrumb_and_first_sort_key or nil else ret = self._data.umbrella and (self._data.umbrella.breadcrumb or self._data.umbrella.breadcrumb_base or self._data.umbrella.breadcrumb_and_first_sort_base or self._data.umbrella.breadcrumb_key or self._data.umbrella.breadcrumb_and_first_sort_key) or nil end if not ret then ret = self._info.label end if type(ret) ~= "table" then ret = {name = ret} end return self:substitute_template_specs(ret.name), ret.nocap end local function expand_toc_template_if(template) local template_obj = new_title(template, 10) if template_obj.exists then return expand_template{title = template_obj.text} end return nil end -- Return the textual expansion of the first existing template among the given templates, first performing -- substitutions on the template name such as replacing {{{langcode}}} with the current language's code (if any). -- If no templates exist after expansion, or if nil is passed in, return nil. If a single string is passed in, -- treat it like a one-element list consisting of that string. function Category:get_template_text(templates) if templates == nil then return nil elseif type(templates) ~= "table" then templates = {templates} end for _, template in ipairs(templates) do if template == false then return false end template = self:substitute_template_specs(template) return expand_toc_template_if(template) end return nil end function Category:getTOC(toc_type) -- Type "none" means everything fits on a single page; in that case, display nothing. if toc_type == "none" then return nil end local templates, fallback_templates -- If TOC type is "full" (more than 2500 entries), do the following, in order: -- 1. look up and expand the `toc_template_full` templates (normal or umbrella, depending on whether there is -- a current language); -- 2. look up and expand the `toc_template` templates (normal or umbrella, as above); -- 3. do the default behavior, which is as follows: -- 3a. look up a language-specific "full" template according to the current language (using English if there -- is no current language); -- 3b. look up a script-specific "full" template according to the first script of current language (using English -- if there is no current language); -- 3c. look up a language-specific "normal" template according to the current language (using English if there -- is no current language); -- 3d. look up a script-specific "normal" template according to the first script of the current language (using -- English if there is no current language); -- 3e. display nothing. -- -- If TOC type is "normal" (between 200 and 2500 entries), do the following, in order: -- 1. look up and expand the `toc_template` templates (normal or umbrella, depending on whether there is -- a current language); -- 2. do the default behavior, which is as follows: -- 2a. look up a language-specific "normal" template according to the current language (using English if there -- is no current language); -- 2b. look up a script-specific "normal" template according to the first script of the current language (using -- English if there is no current language); -- 2c. display nothing. local data_source if self._lang or self._info.raw then data_source = self._data else data_source = self._data.umbrella end if data_source then if toc_type == "full" then templates = data_source.toc_template_full fallback_templates = data_source.toc_template else templates = data_source.toc_template end end local text = self:get_template_text(templates) if text then return text elseif text == false then return nil end text = self:get_template_text(fallback_templates) if text then return text elseif text == false then return nil end local default_toc_templates_to_check = {} local lang, sc = self:getCatfixInfo() local langcode = lang and lang:getCode() or "en" local sccode = sc and sc:getCode() or lang and lang:getScriptCodes()[1] or "Latn" -- FIXME: What is toctemplateprefix used for? local tocname = (self._data.toctemplateprefix or "") .. "categoryTOC" if toc_type == "full" then insert(default_toc_templates_to_check, ("%s-%s/full"):format(langcode, tocname)) insert(default_toc_templates_to_check, ("%s-%s/full"):format(sccode, tocname)) end insert(default_toc_templates_to_check, ("%s-%s"):format(langcode, tocname)) insert(default_toc_templates_to_check, ("%s-%s"):format(sccode, tocname)) for _, toc_template in ipairs(default_toc_templates_to_check) do local toc_template_text = expand_toc_template_if(toc_template) if toc_template_text then return toc_template_text end end return nil end function Category:getInfo() return self._info end function Category:getDataModule() return self._data.module end function Category:canBeEmpty() if self._lang or self._info.raw then return self._data.can_be_empty end return self._data.umbrella and self._data.umbrella.can_be_empty end function Category:isHidden() if self._lang or self._info.raw then return self._data.hidden end return self._data.umbrella and self._data.umbrella.hidden end function Category:getCategoryName() if self._info.raw then return self._info.canonical_name or self._info.label elseif self._lang then local ret = self._lang:getCanonicalName() .. " " .. self._info.label if self._sc then ret = ret .. " in " .. self._sc:getDisplayForm(self._lang) end return ucfirst(ret) end local ret = ucfirst(self._info.label) if not (self._data.no_by_language or self._data.umbrella and self._data.umbrella.no_by_language) then ret = ret .. " by language" end return ret end function Category:getTopright() if self._lang or self._info.raw then return self:substitute_template_specs(self._data.topright) end return self._data.umbrella and self:substitute_template_specs(self._data.umbrella.topright) end function Category:display_title(displaytitle, lang) if type(displaytitle) == "string" then displaytitle = self:substitute_template_specs(displaytitle) else displaytitle = displaytitle(self:getCategoryName(), lang) end mw.getCurrentFrame():callParserFunction("DISPLAYTITLE", "Category:" .. displaytitle) end function Category:get_labels_categorizing() local m_labels_utilities = require(labels_utilities_module) local pos_cat_labels, sense_cat_labels, use_tlb pos_cat_labels = m_labels_utilities.find_labels_for_category(self._info.label, "pos", self._lang) local sense_label = self._info.label:match("^(.*) terms$") if sense_label then use_tlb = true else sense_label = self._info.label:match("^terms with (.*) senses$") end if not sense_label then return nil end sense_cat_labels = m_labels_utilities.find_labels_for_category(sense_label, "sense", self._lang) if use_tlb then return m_labels_utilities.format_labels_categorizing(pos_cat_labels, sense_cat_labels, self._lang) end local all_labels = pos_cat_labels for k, v in pairs(sense_cat_labels) do all_labels[k] = v end return m_labels_utilities.format_labels_categorizing(all_labels, nil, self._lang) end -- FIXME: this is clunky. local function remove_lang_params(desc) -- Simply remove a language name/code/category from the beginning of the string, but replace the language name -- in the middle of the string with either "specific languages" or "specific-language" depending on whether the -- language name appears to be an attributive qualifier of another noun or to stand by itself. This may be wrong, -- in which case the category in question should supply its own umbrella description. desc = desc:gsub("^{{{langname}}} ", "") :gsub("{{{langname}}} %(", "specific languages (") :gsub("{{{langname}}}([.,])", "specific languages%1") :gsub("{{{langname}}} ", "specific-language ") :gsub("{{{langdisp}}}", "specific languages") :gsub("{{{langlink}}}", "specific languages") return desc end function Category:getDescription(isChild) -- Allows different text in the list of a category's children local isChild = isChild == "child" if self._lang or self._info.raw then if not isChild and self._data.displaytitle then self:display_title(self._data.displaytitle, self._lang) end if self._sc then return self:getCategoryName() .. "." end local desc = self:substitute_template_specs(self._data.description) if not desc then return nil elseif isChild then return desc end return sparse_concat({ self:substitute_template_specs(self._data.preceding), desc, self:substitute_template_specs(self._data.additional), self:substitute_template_specs(self:get_labels_categorizing()), }, "\n\n") end local umbrella = self._data.umbrella if not isChild and umbrella and umbrella.displaytitle then self:display_title(umbrella.displaytitle) end local desc = self:substitute_template_specs(umbrella and umbrella.description) local has_umbrella_desc = not not desc if not desc then desc = self:convert_spec_to_string(self._data.description) if desc then desc = remove_lang_params(desc) desc = lcfirst(desc) desc = desc:gsub("%.$", "") desc = "Categories with " .. desc .. "." else desc = "Categories with " .. self._info.label .. " in various specific languages." end desc = self:substitute_template_specs(desc) end if isChild then return desc end return sparse_concat({ self:substitute_template_specs(umbrella and umbrella.preceding or not has_umbrella_desc and self._data.preceding), desc, self:substitute_template_specs(umbrella and umbrella.additional or not has_umbrella_desc and self._data.additional), self:substitute_template_specs("{{{umbrella_msg}}}"), self:substitute_template_specs(self:get_labels_categorizing()), }, "\n\n") end function Category:new_sortkey(sortkey) local sortkey_type = type(sortkey) if sortkey_type == "string" then sortkey = uupper(sortkey) elseif sortkey_type == "table" then function sortkey:makeSortKey() local sort_func = self.sort_func if sort_func ~= nil then return sort_func(self.sort_base) end local lang = self.lang if lang == nil then return self.sort_base end lang = get_lang(lang, nil, true) if lang == nil then return self.sort_base end local sc = self.sc if sc ~= nil then sc = get_script(sc) end return lang:makeSortKey(self.sort_base, sc) end end return sortkey end function Category:inherit_spec(spec, parent_spec, substitute_result) if spec == false then return nil end local retval = spec or parent_spec if substitute_result then retval = self:substitute_template_specs(retval) end return retval end function Category:canonicalize_parents_children(cats, is_children, fallback_sort_key, fallback_sort_base) if not cats then return nil elseif type(cats) == "table" then if cats.name or cats.module then cats = {cats} elseif #cats == 0 then return nil end else cats = {cats} end local ret = {} for _, cat in ipairs(cats) do if type(cat) ~= "table" or not cat.name and not cat.module then cat = {name = cat} end insert(ret, cat) end local is_umbrella = not self._lang and not self._info.raw local table_type = is_children and "extra_children" or "parents" for i, cat in ipairs(ret) do local raw if self._info.raw or is_umbrella then raw = not cat.is_label else raw = cat.raw end local lang = self:inherit_spec(cat.lang, not raw and self._info.code or nil, "substitute") local sc = self:inherit_spec(cat.sc, not raw and self._info.sc or nil, "substitute") -- Get the sortkey. local sortkey = self:inherit_spec(cat.sort, i == 1 and (fallback_sort_key or fallback_sort_base and {sort_base = fallback_sort_base}) or nil) if type(sortkey) == "table" then sortkey.sort_base = self:substitute_template_specs(sortkey.sort_base) or internal_error("Missing .sort_base in '" .. table_type .. "' .sort table for '" .. self._info.label .. "' category entry in module '" .. (self._data.module or "unknown") .. "'") if sortkey.sort_func then -- Not allowed to give a lang and/or script if sort_func is given. local bad_spec = sortkey.lang and "lang" or sortkey.sc and "sc" or nil if bad_spec then internal_error("Cannot specify both ." .. bad_spec .. " and .sort_func in '" .. table_type .. "' .sort table for '" .. self._info.label .. "' category entry in module '" .. (self._data.module or "unknown") .. "'") end else sortkey.lang = self:inherit_spec(sortkey.lang, lang, "substitute") sortkey.sc = self:inherit_spec(sortkey.sc, sc, "substitute") end else sortkey = self:substitute_template_specs(sortkey) end local name if cat.module then -- A reference to a category using another category tree module. if not cat.args then internal_error("Missing .args in '" .. table_type .. "' table with module=\"" .. cat.module .. "\" for '" .. self._info.label .. "' category entry in module '" .. (self._data.module or "unknown") .. "'") end name = require("Module:category tree/" .. cat.module).new(self:substitute_template_specs_in_args(cat.args)) else name = cat.name if not name then internal_error("Missing .name in " .. (is_umbrella and "umbrella " or "") .. "'" .. table_type .. "' table for '" .. self._info.label .. "' category entry in module '" .. (self._data.module or "unknown") .. "'") elseif type(name) == "string" then -- otherwise, assume it's a category object and use it directly name = self:substitute_template_specs(name) if name:find("^Category:") then -- It's a non-poscatboiler category name. sortkey = sortkey or is_children and name:gsub("^Category:", "") or self:getCategoryName() else -- It's a label. sortkey = sortkey or is_children and name or self._info.label name = self:make_new{ label = name, code = lang, sc = sc, raw = raw, args = self:substitute_template_specs_in_args(cat.args) } end end end sortkey = sortkey or is_children and " " or self._info.label ret[i] = { name = name, description = is_children and self:substitute_template_specs(cat.description) or nil, sort = self:new_sortkey(sortkey) } end return ret end function Category:getParents() local is_umbrella, ret = not self._lang and not self._info.raw if self._sc then local parent1 = self:make_new{code = self._info.code, label = "terms in " .. self._sc:getDisplayForm(self._lang)} local parent2 = self:make_new{code = self._info.code, label = self._info.label, raw = self._info.raw, args = self._info.args} ret = { {name = parent1, sort = self._sc:getCanonicalName(self._lang)}, {name = parent2, sort = self._sc:getCanonicalName(self._lang)}, } else local parents, fallback_sort_base, fallback_sort_key if is_umbrella then parents = self._data.umbrella and self._data.umbrella.parents or self._data.umbrella_parents fallback_sort_base = self._data.umbrella and (self._data.umbrella.breadcrumb_base or self._data.umbrella.breadcrumb_and_first_sort_base) or nil fallback_sort_key = self._data.umbrella and (self._data.umbrella.breadcrumb_key or self._data.umbrella.breadcrumb_and_first_sort_key) or nil else parents = self._data.parents fallback_sort_base = self._data.breadcrumb_base or self._data.breadcrumb_and_first_sort_base fallback_sort_key = self._data.breadcrumb_key or self._data.breadcrumb_and_first_sort_key end ret = self:canonicalize_parents_children(parents, nil, fallback_sort_key, fallback_sort_base) if not ret then return nil end end local self_cat = self:getCategoryName() for _, parent in ipairs(ret) do local parent_cat = parent.name.getCategoryName and parent.name:getCategoryName() if self_cat == parent_cat then internal_error(("Infinite loop would occur, as parent category '%s' is the same as the child category"):format(self_cat)) end end return ret end function Category:getChildren() local is_umbrella = not self._lang and not self._info.raw local children = self._data.children local ret = {} if not is_umbrella and children then for _, child in ipairs(children) do child = mw.clone(child) if type(child) ~= "table" then child = {name = child} end if not child.sort then child.sort = child.name end -- FIXME, is preserving the script correct? child.name = self:make_new{code = self._info.code, label = child.name, raw = child.raw, sc = self._info.sc} insert(ret, child) end end local extra_children if is_umbrella then extra_children = self._data.umbrella and self._data.umbrella.extra_children else extra_children = self._data.extra_children end extra_children = self:canonicalize_parents_children(extra_children, "children") if extra_children then for _, child in ipairs(extra_children) do insert(ret, child) end end return #ret > 0 and ret or nil end function Category:getUmbrella() local umbrella = self._data.umbrella if umbrella == false or self._info.raw or not self._lang or self._sc then return nil end -- If `umbrella` is a string, use that; otherwise, use the label. return self:make_new({label = type(umbrella) == "string" and umbrella or self._info.label}) end function Category:getAppendix() -- FIXME, this should be customizable. local lang, label = self._lang, self._info.label if self._info.raw or not (lang and label) then return nil end local appendix = make_title(100, lang:getCanonicalName() .. " " .. label) return appendix.exists and appendix.fullText or nil end function Category:getCatfixInfo() if self._lang or self._sc or self._info.raw then local langcode, sccode = self._data.catfix, self._data.catfix_sc local lang, sc if langcode then langcode = self:substitute_template_specs(langcode) lang = get_lang(langcode, nil, true) elseif langcode == nil then -- not false lang = self._lang end if sccode then sccode = self:substitute_template_specs(sccode) sc = get_script(sccode) elseif sccode == nil then -- not false sc = self._sc end if lang then lang = lang:getFull() end return lang, sc elseif not self._data.umbrella then return end -- umbrella local langcode, sccode = self._data.umbrella.catfix, self._data.umbrella.catfix_sc local lang, sc if langcode then langcode = self:substitute_template_specs(langcode) lang = get_lang(langcode, nil, true) end if sccode then sccode = self:substitute_template_specs(sccode) sc = get_script(sccode) end if lang then lang = lang:getFull() end return lang, sc end function Category:getTOCTemplateName() -- This should only be invoked if getTOC() returns true, meaning to do the default algorithm, but getTOC() -- implements its own default algorithm. internal_error("This should never get called") end local export = {} function export.main(info) local self = setmetatable({_info = info}, Category) self:initCommon() return self._data and self or nil end export.new = Category.new return export 9b7irq94y5jplhe4pd0okuk8aoeevuh 487855 487805 2026-09-02T20:33:19Z SM7 6218 localization... 487855 Scribunto text/plain local lang_independent_data = require("Module:category tree/data") local lang_specific_module = "Module:category tree/lang" local lang_specific_module_prefix = lang_specific_module .. "/" local family_specific_module = "Module:category tree/fam" local family_specific_module_prefix = family_specific_module .. "/" local labels_utilities_module = "Module:labels/utilities" local template_parser_module = "Module:template parser" local concat = table.concat local dump = mw.dumpObject local expand_template = require("Module:frame").expandTemplate local insert = table.insert local is_callable = require("Module:fun").is_callable local lcfirst = require("Module:string utilities").lcfirst local list_to_set = require("Module:table").listToSet local make_title = mw.title.makeTitle local new_title = mw.title.new local parse = require(template_parser_module).parse local sparse_concat = require("Module:table").sparseConcat local tostring = tostring local type = type local ucfirst = require("Module:string utilities").ucfirst local uupper = require("Module:string utilities").upper local function internal_error(msg) error("Internal error: " .. msg) end local function get_lang(...) local _get_lang = require("Module:languages").getByCode function get_lang(...) return _get_lang(...) or require("Module:languages/errorGetBy").code(...) end return get_lang(...) end local function get_script(...) local _get_script = require("Module:scripts").getByCode function get_script(code) return _get_script(code) or require("Module:languages/error")(code, true, "script code") end return get_script(...) end -- Category object local Category = {} Category.__index = Category function Category:get_originating_info() local originating_info = "" if self._info.originating_label then originating_info = " (originating from label \"" .. self._info.originating_label .. "\" in module [[" .. self._info.originating_module .. "]])" end return originating_info end local valid_keys = list_to_set{"code", "label", "sc", "raw", "args", "also", "called_from_inside", "originating_label", "originating_module"} function Category.new(info) for key in pairs(info) do if not valid_keys[key] then internal_error("The parameter \"" .. key .. "\" was not recognized.") end end local self = setmetatable({}, Category) self._info = info if not self._info.label then internal_error("No label was specified.") end self:initCommon() if not self._data then internal_error("The " .. (self._info.raw and "raw " or "") .. "label \"" .. self._info.label .. "\" does not exist" .. self:get_originating_info() .. ".") end return self end function Category:initCommon() local function patch_args(args) -- This fixes the issue with Scribunto automatically converting keys -- in a table as numbers to strings, which in turn causes a circular -- error for having argument parameter names as numbers as strings. if type(args) ~= "table" then return args end local new_args = {} for k, v in pairs(args) do if type(k) == "string" and string.len(k) < 10 and not string.match(k, "^0") and string.match(k, "^%d+$") then new_args[tonumber(k)] = patch_args(v) else new_args[k] = patch_args(v) end end return new_args end local args_handled = false if self._info.raw then -- Check if the category exists local raw_categories = lang_independent_data["RAW_CATEGORIES"] self._data = raw_categories[self._info.label] if self._data then if self._data.lang then self._lang = get_lang(self._data.lang, nil, true) self._info.code = self._lang:getCode() end if self._data.sc then self._sc = get_script(self._data.sc) self._info.sc = self._sc:getCode() end else -- Go through raw handlers local data = { category = self._info.label, args = patch_args(self._info.args) or {}, called_from_inside = self._info.called_from_inside, } for _, handler in ipairs(lang_independent_data["RAW_HANDLERS"]) do self._data, args_handled = handler.handler(data) if self._data then self._data.module = self._data.module or handler.module break end end if self._data then -- Update the label if the handler specified a canonical name for it. if self._data.canonical_name then self._info.canonical_name = self._data.canonical_name end if self._data.lang then if type(self._data.lang) ~= "string" then internal_error("Received non-string value " .. dump(self._data.lang) .. " for self._data.lang, label \"" .. self._info.label .. "\"" .. self:get_originating_info() .. ".") end self._lang = get_lang(self._data.lang, nil, true) self._info.code = self._lang:getCode() end if self._data.sc then if type(self._data.sc) ~= "string" then internal_error("Received non-string value " .. dump(self._data.sc) .. " for self._data.sc, label \"" .. self._info.label .. "\"" .. self:get_originating_info() .. ".") end self._sc = get_script(self._data.sc) self._info.sc = self._sc:getCode() end end end else -- Already parsed into language + label if self._info.code then self._lang = get_lang(self._info.code, nil, true) else self._lang = nil end if self._info.sc then self._sc = get_script(self._info.sc) else self._sc = nil end self._info.orig_label = self._info.label if not self._lang then -- Umbrella categories without a preceding language always begin with a capital letter, but the actual label may be -- lowercase (cf. [[:Category:Nouns by language]] with label 'nouns' with per-language [[:Category:English nouns]]; -- but [[:Category:Reddit slang by language]] with label 'Reddit slang' with per-language -- [[:Category:English Reddit slang]]). Since the label is almost always lowercase, we lowercase it for umbrella -- categories, storing the original into `orig_label`, and correct it later if needed. self._info.label = lcfirst(self._info.label) end -- First, check lang-specific labels and handlers if this is not an umbrella category. if self._lang then local objects_with_modules = require(lang_specific_module) local obj, seen = self._lang, {} local object_specific_module_prefix = lang_specific_module_prefix local is_family = false repeat if objects_with_modules[obj:getCode()] then local module = object_specific_module_prefix .. obj:getCode() local labels_and_handlers = require(module) if labels_and_handlers.LABELS then self._data = labels_and_handlers.LABELS[self._info.label] if self._data then if not is_family and self._data.umbrella == nil and self._data.umbrella_parents == nil then self._data.umbrella = false end self._data.module = self._data.module or module end end if not self._data and labels_and_handlers.HANDLERS then for _, handler in ipairs(labels_and_handlers.HANDLERS) do local data = { label = self._info.label, lang = self._lang, sc = self._sc, args = patch_args(self._info.args) or {}, called_from_inside = self._info.called_from_inside, } self._data, args_handled = handler(data) if self._data then if not is_family and self._data.umbrella == nil and self._data.umbrella_parents == nil then self._data.umbrella = false end self._data.module = self._data.module or module break end end end if self._data then break end end seen[obj:getCode()] = true obj = obj:getFamily() if not is_family then is_family = true object_specific_module_prefix = family_specific_module_prefix objects_with_modules = require(family_specific_module) end until not obj or seen[obj:getCode()] end local function fetch_label_data(labels) self._data = labels[self._info.label] -- See comment above about uppercase- vs. lowercase-initial labels, which are indistinguishable -- in umbrella categories. if not self._data then self._data = labels[self._info.orig_label] if self._data then self._info.label = self._info.orig_label end end end -- Then check lang-independent labels. if not self._data then -- lang_independent_data.LABELS should always exist. fetch_label_data(lang_independent_data.LABELS) if not self._data and not self._lang then -- Check family-specific labels for umbrella label. local families_with_modules = require(family_specific_module) for famcode, _ in pairs(families_with_modules) do local module = family_specific_module_prefix .. famcode local labels_and_handlers = require(module) if labels_and_handlers.LABELS then fetch_label_data(labels_and_handlers.LABELS) if self._data then self._data.module = self._data.module or module break end end end end end -- Then check lang-independent handlers. if not self._data then local data = { label = self._info.label, lang = self._lang, sc = self._sc, args = patch_args(self._info.args) or {}, called_from_inside = self._info.called_from_inside, } for _, handler in ipairs(lang_independent_data["HANDLERS"]) do self._data, args_handled = handler.handler(data) if self._data then self._data.module = self._data.module or handler.module break end end if not self._data and not self._lang then -- Check family-specific labels for umbrella handler. local families_with_modules = require(family_specific_module) for famcode, _ in pairs(families_with_modules) do local module = family_specific_module_prefix .. famcode local labels_and_handlers = require(module) if labels_and_handlers.HANDLERS then for _, handler in ipairs(labels_and_handlers.HANDLERS) do local data = { label = self._info.label, sc = self._sc, args = patch_args(self._info.args) or {}, called_from_inside = self._info.called_from_inside, } self._data, args_handled = handler(data) if self._data then self._data.module = self._data.module or module break end end end if self._data then break end end end end end if not args_handled and self._data and self._info.args and next(self._info.args) then local module_text = " (handled in [[" .. (self._data.module or "UNKNOWN").. "]])" local args_text = {} for k, v in pairs(self._info.args) do insert(args_text, k .. "=" .. ((type(v) == "string" or type(v) == "number") and v or dump(v))) end error("poscatboiler label '" .. self._info.label .. "' " .. module_text .. " doesn't accept extra args " .. concat(args_text, ", ")) end if self._sc and not self._lang then internal_error("Umbrella categories cannot have a script specified.") end end function Category:convert_spec_to_string(desc) if not desc then return desc end local desc_type = type(desc) if desc_type == "string" then return desc elseif desc_type == "number" then return tostring(desc) elseif not is_callable(desc) then internal_error("`desc` must be a string, number, function, callable table or nil; received " .. dump(desc)) end desc = desc { lang = self._lang, sc = self._sc, label = self._info.label, raw = self._info.raw, } if not desc then return desc end desc_type = type(desc) if desc_type == "string" then return desc end internal_error("The value returned by `desc` must be a string or nil; received " .. dump(desc)) end local function add_obj_args(args, obj, obj_type, sc_lang) if obj then args[obj_type .. "code"] = obj:getCode() args[obj_type .. "name"] = obj:getCanonicalName(sc_lang) args[obj_type .. "disp"] = obj:getDisplayForm(sc_lang) args[obj_type .. "cat"] = obj:getCategoryName(false, sc_lang) args[obj_type .. "link"] = obj:makeCategoryLink(sc_lang) end end -- Expands `desc` like a template, passing values for specs like {{{langname}}}. function Category:substitute_template_specs(desc) -- This may end up happening twice but that's OK as the function is (usually) idempotent. -- FIXME: Not idempotent if a preprocessed template returns wikicode. desc = self:convert_spec_to_string(desc) if not desc then return nil end -- Populate the substitution arguments. local args = {} args.umbrella_msg = "This is an umbrella category. It contains no dictionary entries, but only other, language-specific categories, which in turn contain relevant terms in a given language." args.umbrella_meta_msg = "This is an umbrella metacategory, covering a general area such as \"lemmas\", \"names\" or \"terms by etymology\". It contains no dictionary entries, but holds only umbrella (\"by language\") categories covering specific subtopics, which in turn contain language-specific categories holding terms in a given language for that same topic." add_obj_args(args, self._lang, "lang") add_obj_args(args, self._sc, "sc", self._lang) return parse(desc, true):expand(args) end function Category:substitute_template_specs_in_args(args) if not args then return args end local pinfo = {} for k, v in pairs(args) do pinfo[self:substitute_template_specs(k)] = self:substitute_template_specs(v) end return pinfo end function Category:make_new(info) info.originating_label = self._info.label info.originating_module = self._data.module info.called_from_inside = true return Category.new(info) end function Category:getBreadcrumbName() local ret if self._sc then -- The parent of 'LANG POS in SCRIPT script' is always 'SCRIPT script' regardless of the parents normally set, -- so the breadcrumb should always be 'POS' regardless of the breadcrumb normally set. return self._info.label, nil end if self._lang or self._info.raw then ret = self._data.breadcrumb or self._data.breadcrumb_base or self._data.breadcrumb_and_first_sort_base or self._data.breadcrumb_key or self._data.breadcrumb_and_first_sort_key or nil else ret = self._data.umbrella and (self._data.umbrella.breadcrumb or self._data.umbrella.breadcrumb_base or self._data.umbrella.breadcrumb_and_first_sort_base or self._data.umbrella.breadcrumb_key or self._data.umbrella.breadcrumb_and_first_sort_key) or nil end if not ret then ret = self._info.label end if type(ret) ~= "table" then ret = {name = ret} end return self:substitute_template_specs(ret.name), ret.nocap end local function expand_toc_template_if(template) local template_obj = new_title(template, 10) if template_obj.exists then return expand_template{title = template_obj.text} end return nil end -- Return the textual expansion of the first existing template among the given templates, first performing -- substitutions on the template name such as replacing {{{langcode}}} with the current language's code (if any). -- If no templates exist after expansion, or if nil is passed in, return nil. If a single string is passed in, -- treat it like a one-element list consisting of that string. function Category:get_template_text(templates) if templates == nil then return nil elseif type(templates) ~= "table" then templates = {templates} end for _, template in ipairs(templates) do if template == false then return false end template = self:substitute_template_specs(template) return expand_toc_template_if(template) end return nil end function Category:getTOC(toc_type) -- Type "none" means everything fits on a single page; in that case, display nothing. if toc_type == "none" then return nil end local templates, fallback_templates -- If TOC type is "full" (more than 2500 entries), do the following, in order: -- 1. look up and expand the `toc_template_full` templates (normal or umbrella, depending on whether there is -- a current language); -- 2. look up and expand the `toc_template` templates (normal or umbrella, as above); -- 3. do the default behavior, which is as follows: -- 3a. look up a language-specific "full" template according to the current language (using English if there -- is no current language); -- 3b. look up a script-specific "full" template according to the first script of current language (using English -- if there is no current language); -- 3c. look up a language-specific "normal" template according to the current language (using English if there -- is no current language); -- 3d. look up a script-specific "normal" template according to the first script of the current language (using -- English if there is no current language); -- 3e. display nothing. -- -- If TOC type is "normal" (between 200 and 2500 entries), do the following, in order: -- 1. look up and expand the `toc_template` templates (normal or umbrella, depending on whether there is -- a current language); -- 2. do the default behavior, which is as follows: -- 2a. look up a language-specific "normal" template according to the current language (using English if there -- is no current language); -- 2b. look up a script-specific "normal" template according to the first script of the current language (using -- English if there is no current language); -- 2c. display nothing. local data_source if self._lang or self._info.raw then data_source = self._data else data_source = self._data.umbrella end if data_source then if toc_type == "full" then templates = data_source.toc_template_full fallback_templates = data_source.toc_template else templates = data_source.toc_template end end local text = self:get_template_text(templates) if text then return text elseif text == false then return nil end text = self:get_template_text(fallback_templates) if text then return text elseif text == false then return nil end local default_toc_templates_to_check = {} local lang, sc = self:getCatfixInfo() local langcode = lang and lang:getCode() or "en" local sccode = sc and sc:getCode() or lang and lang:getScriptCodes()[1] or "Latn" -- FIXME: What is toctemplateprefix used for? local tocname = (self._data.toctemplateprefix or "") .. "categoryTOC" if toc_type == "full" then insert(default_toc_templates_to_check, ("%s-%s/full"):format(langcode, tocname)) insert(default_toc_templates_to_check, ("%s-%s/full"):format(sccode, tocname)) end insert(default_toc_templates_to_check, ("%s-%s"):format(langcode, tocname)) insert(default_toc_templates_to_check, ("%s-%s"):format(sccode, tocname)) for _, toc_template in ipairs(default_toc_templates_to_check) do local toc_template_text = expand_toc_template_if(toc_template) if toc_template_text then return toc_template_text end end return nil end function Category:getInfo() return self._info end function Category:getDataModule() return self._data.module end function Category:canBeEmpty() if self._lang or self._info.raw then return self._data.can_be_empty end return self._data.umbrella and self._data.umbrella.can_be_empty end function Category:isHidden() if self._lang or self._info.raw then return self._data.hidden end return self._data.umbrella and self._data.umbrella.hidden end function Category:getCategoryName() if self._info.raw then return self._info.canonical_name or self._info.label elseif self._lang then local ret = self._lang:getCanonicalName() .. " " .. self._info.label if self._sc then ret = ret .. " in " .. self._sc:getDisplayForm(self._lang) end return ucfirst(ret) end local ret = ucfirst(self._info.label) if not (self._data.no_by_language or self._data.umbrella and self._data.umbrella.no_by_language) then ret = ret .. " by language" end return ret end function Category:getTopright() if self._lang or self._info.raw then return self:substitute_template_specs(self._data.topright) end return self._data.umbrella and self:substitute_template_specs(self._data.umbrella.topright) end function Category:display_title(displaytitle, lang) if type(displaytitle) == "string" then displaytitle = self:substitute_template_specs(displaytitle) else displaytitle = displaytitle(self:getCategoryName(), lang) end mw.getCurrentFrame():callParserFunction("DISPLAYTITLE", "श्रेणी:" .. displaytitle) end function Category:get_labels_categorizing() local m_labels_utilities = require(labels_utilities_module) local pos_cat_labels, sense_cat_labels, use_tlb pos_cat_labels = m_labels_utilities.find_labels_for_category(self._info.label, "pos", self._lang) local sense_label = self._info.label:match("^(.*) terms$") if sense_label then use_tlb = true else sense_label = self._info.label:match("^terms with (.*) senses$") end if not sense_label then return nil end sense_cat_labels = m_labels_utilities.find_labels_for_category(sense_label, "sense", self._lang) if use_tlb then return m_labels_utilities.format_labels_categorizing(pos_cat_labels, sense_cat_labels, self._lang) end local all_labels = pos_cat_labels for k, v in pairs(sense_cat_labels) do all_labels[k] = v end return m_labels_utilities.format_labels_categorizing(all_labels, nil, self._lang) end -- FIXME: this is clunky. local function remove_lang_params(desc) -- Simply remove a language name/code/category from the beginning of the string, but replace the language name -- in the middle of the string with either "specific languages" or "specific-language" depending on whether the -- language name appears to be an attributive qualifier of another noun or to stand by itself. This may be wrong, -- in which case the category in question should supply its own umbrella description. desc = desc:gsub("^{{{langname}}} ", "") :gsub("{{{langname}}} %(", "specific languages (") :gsub("{{{langname}}}([.,])", "specific languages%1") :gsub("{{{langname}}} ", "specific-language ") :gsub("{{{langdisp}}}", "specific languages") :gsub("{{{langlink}}}", "specific languages") return desc end function Category:getDescription(isChild) -- Allows different text in the list of a category's children local isChild = isChild == "child" if self._lang or self._info.raw then if not isChild and self._data.displaytitle then self:display_title(self._data.displaytitle, self._lang) end if self._sc then return self:getCategoryName() .. "." end local desc = self:substitute_template_specs(self._data.description) if not desc then return nil elseif isChild then return desc end return sparse_concat({ self:substitute_template_specs(self._data.preceding), desc, self:substitute_template_specs(self._data.additional), self:substitute_template_specs(self:get_labels_categorizing()), }, "\n\n") end local umbrella = self._data.umbrella if not isChild and umbrella and umbrella.displaytitle then self:display_title(umbrella.displaytitle) end local desc = self:substitute_template_specs(umbrella and umbrella.description) local has_umbrella_desc = not not desc if not desc then desc = self:convert_spec_to_string(self._data.description) if desc then desc = remove_lang_params(desc) desc = lcfirst(desc) desc = desc:gsub("%.$", "") desc = "Categories with " .. desc .. "." else desc = "Categories with " .. self._info.label .. " in various specific languages." end desc = self:substitute_template_specs(desc) end if isChild then return desc end return sparse_concat({ self:substitute_template_specs(umbrella and umbrella.preceding or not has_umbrella_desc and self._data.preceding), desc, self:substitute_template_specs(umbrella and umbrella.additional or not has_umbrella_desc and self._data.additional), self:substitute_template_specs("{{{umbrella_msg}}}"), self:substitute_template_specs(self:get_labels_categorizing()), }, "\n\n") end function Category:new_sortkey(sortkey) local sortkey_type = type(sortkey) if sortkey_type == "string" then sortkey = uupper(sortkey) elseif sortkey_type == "table" then function sortkey:makeSortKey() local sort_func = self.sort_func if sort_func ~= nil then return sort_func(self.sort_base) end local lang = self.lang if lang == nil then return self.sort_base end lang = get_lang(lang, nil, true) if lang == nil then return self.sort_base end local sc = self.sc if sc ~= nil then sc = get_script(sc) end return lang:makeSortKey(self.sort_base, sc) end end return sortkey end function Category:inherit_spec(spec, parent_spec, substitute_result) if spec == false then return nil end local retval = spec or parent_spec if substitute_result then retval = self:substitute_template_specs(retval) end return retval end function Category:canonicalize_parents_children(cats, is_children, fallback_sort_key, fallback_sort_base) if not cats then return nil elseif type(cats) == "table" then if cats.name or cats.module then cats = {cats} elseif #cats == 0 then return nil end else cats = {cats} end local ret = {} for _, cat in ipairs(cats) do if type(cat) ~= "table" or not cat.name and not cat.module then cat = {name = cat} end insert(ret, cat) end local is_umbrella = not self._lang and not self._info.raw local table_type = is_children and "extra_children" or "parents" for i, cat in ipairs(ret) do local raw if self._info.raw or is_umbrella then raw = not cat.is_label else raw = cat.raw end local lang = self:inherit_spec(cat.lang, not raw and self._info.code or nil, "substitute") local sc = self:inherit_spec(cat.sc, not raw and self._info.sc or nil, "substitute") -- Get the sortkey. local sortkey = self:inherit_spec(cat.sort, i == 1 and (fallback_sort_key or fallback_sort_base and {sort_base = fallback_sort_base}) or nil) if type(sortkey) == "table" then sortkey.sort_base = self:substitute_template_specs(sortkey.sort_base) or internal_error("Missing .sort_base in '" .. table_type .. "' .sort table for '" .. self._info.label .. "' category entry in module '" .. (self._data.module or "unknown") .. "'") if sortkey.sort_func then -- Not allowed to give a lang and/or script if sort_func is given. local bad_spec = sortkey.lang and "lang" or sortkey.sc and "sc" or nil if bad_spec then internal_error("Cannot specify both ." .. bad_spec .. " and .sort_func in '" .. table_type .. "' .sort table for '" .. self._info.label .. "' category entry in module '" .. (self._data.module or "unknown") .. "'") end else sortkey.lang = self:inherit_spec(sortkey.lang, lang, "substitute") sortkey.sc = self:inherit_spec(sortkey.sc, sc, "substitute") end else sortkey = self:substitute_template_specs(sortkey) end local name if cat.module then -- A reference to a category using another category tree module. if not cat.args then internal_error("Missing .args in '" .. table_type .. "' table with module=\"" .. cat.module .. "\" for '" .. self._info.label .. "' category entry in module '" .. (self._data.module or "unknown") .. "'") end name = require("Module:category tree/" .. cat.module).new(self:substitute_template_specs_in_args(cat.args)) else name = cat.name if not name then internal_error("Missing .name in " .. (is_umbrella and "umbrella " or "") .. "'" .. table_type .. "' table for '" .. self._info.label .. "' category entry in module '" .. (self._data.module or "unknown") .. "'") elseif type(name) == "string" then -- otherwise, assume it's a category object and use it directly name = self:substitute_template_specs(name) if name:find("^श्रेणी:") then -- It's a non-poscatboiler category name. sortkey = sortkey or is_children and name:gsub("^श्रेणी:", "") or self:getCategoryName() else -- It's a label. sortkey = sortkey or is_children and name or self._info.label name = self:make_new{ label = name, code = lang, sc = sc, raw = raw, args = self:substitute_template_specs_in_args(cat.args) } end end end sortkey = sortkey or is_children and " " or self._info.label ret[i] = { name = name, description = is_children and self:substitute_template_specs(cat.description) or nil, sort = self:new_sortkey(sortkey) } end return ret end function Category:getParents() local is_umbrella, ret = not self._lang and not self._info.raw if self._sc then local parent1 = self:make_new{code = self._info.code, label = "terms in " .. self._sc:getDisplayForm(self._lang)} local parent2 = self:make_new{code = self._info.code, label = self._info.label, raw = self._info.raw, args = self._info.args} ret = { {name = parent1, sort = self._sc:getCanonicalName(self._lang)}, {name = parent2, sort = self._sc:getCanonicalName(self._lang)}, } else local parents, fallback_sort_base, fallback_sort_key if is_umbrella then parents = self._data.umbrella and self._data.umbrella.parents or self._data.umbrella_parents fallback_sort_base = self._data.umbrella and (self._data.umbrella.breadcrumb_base or self._data.umbrella.breadcrumb_and_first_sort_base) or nil fallback_sort_key = self._data.umbrella and (self._data.umbrella.breadcrumb_key or self._data.umbrella.breadcrumb_and_first_sort_key) or nil else parents = self._data.parents fallback_sort_base = self._data.breadcrumb_base or self._data.breadcrumb_and_first_sort_base fallback_sort_key = self._data.breadcrumb_key or self._data.breadcrumb_and_first_sort_key end ret = self:canonicalize_parents_children(parents, nil, fallback_sort_key, fallback_sort_base) if not ret then return nil end end local self_cat = self:getCategoryName() for _, parent in ipairs(ret) do local parent_cat = parent.name.getCategoryName and parent.name:getCategoryName() if self_cat == parent_cat then internal_error(("Infinite loop would occur, as parent category '%s' is the same as the child category"):format(self_cat)) end end return ret end function Category:getChildren() local is_umbrella = not self._lang and not self._info.raw local children = self._data.children local ret = {} if not is_umbrella and children then for _, child in ipairs(children) do child = mw.clone(child) if type(child) ~= "table" then child = {name = child} end if not child.sort then child.sort = child.name end -- FIXME, is preserving the script correct? child.name = self:make_new{code = self._info.code, label = child.name, raw = child.raw, sc = self._info.sc} insert(ret, child) end end local extra_children if is_umbrella then extra_children = self._data.umbrella and self._data.umbrella.extra_children else extra_children = self._data.extra_children end extra_children = self:canonicalize_parents_children(extra_children, "children") if extra_children then for _, child in ipairs(extra_children) do insert(ret, child) end end return #ret > 0 and ret or nil end function Category:getUmbrella() local umbrella = self._data.umbrella if umbrella == false or self._info.raw or not self._lang or self._sc then return nil end -- If `umbrella` is a string, use that; otherwise, use the label. return self:make_new({label = type(umbrella) == "string" and umbrella or self._info.label}) end function Category:getAppendix() -- FIXME, this should be customizable. local lang, label = self._lang, self._info.label if self._info.raw or not (lang and label) then return nil end local appendix = make_title(100, lang:getCanonicalName() .. " " .. label) return appendix.exists and appendix.fullText or nil end function Category:getCatfixInfo() if self._lang or self._sc or self._info.raw then local langcode, sccode = self._data.catfix, self._data.catfix_sc local lang, sc if langcode then langcode = self:substitute_template_specs(langcode) lang = get_lang(langcode, nil, true) elseif langcode == nil then -- not false lang = self._lang end if sccode then sccode = self:substitute_template_specs(sccode) sc = get_script(sccode) elseif sccode == nil then -- not false sc = self._sc end if lang then lang = lang:getFull() end return lang, sc elseif not self._data.umbrella then return end -- umbrella local langcode, sccode = self._data.umbrella.catfix, self._data.umbrella.catfix_sc local lang, sc if langcode then langcode = self:substitute_template_specs(langcode) lang = get_lang(langcode, nil, true) end if sccode then sccode = self:substitute_template_specs(sccode) sc = get_script(sccode) end if lang then lang = lang:getFull() end return lang, sc end function Category:getTOCTemplateName() -- This should only be invoked if getTOC() returns true, meaning to do the default algorithm, but getTOC() -- implements its own default algorithm. internal_error("This should never get called") end local export = {} function export.main(info) local self = setmetatable({_info = info}, Category) self:initCommon() return self._data and self or nil end export.new = Category.new return export jiotpx8j0r07jouav5fszvyoe7zxrmy साँचा:IPA 10 303048 487749 470038 2026-09-02T15:04:22Z SM7 6218 updating... 487749 wikitext text/x-wiki {{ {{#if:{{{lang|}}}|check deprecated lang param usage|no deprecated lang param usage}}|lang={{{lang|}}}|<!-- -->{{#invoke:IPA/templates|IPA}}<!-- -->}}<!-- --><noinclude>{{documentation}}</noinclude> 9boayrvohq0yw9npgjusxgwtdcrlssr साँचा:deprecated code 10 303050 487750 470040 2026-09-02T15:05:26Z SM7 6218 updating... 487750 wikitext text/x-wiki {{#ifeq:{{{active|}}}|no|{{{1}}}|<span class="deprecated" title="{{#if:{{{tooltip|}}}|{{{tooltip}}}|This is a deprecated template usage.}}">''([[:Category:Successfully deprecated templates|{{#if:{{{text|}}}|{{{text}}}|deprecated template usage}}]])'' {{{1}}}</span><includeonly>[[Category:Pages using deprecated templates{{#switch:{{NAMESPACE}}|Appendix|Reconstruction|Thesaurus|Sign gloss|Citations|=|#default=/other}}]]</includeonly>}}<!-- --><noinclude>{{documentation}}</noinclude> sbklorazzvj1bljd6402e0f7vxjwog3 मॉड्यूल:IPA/templates 828 303054 487745 470044 2026-09-02T14:52:05Z SM7 6218 updating... 487745 Scribunto text/plain local export = {} local m_IPA = require("Module:IPA") local parameter_utilities_module = "Module:parameter utilities" local function track(template, page) require("Module:debug/track")(template .. "/" .. page) return true end -- Used for [[Template:IPA]]. function export.IPA(frame) local parent_args = frame:getParent().args -- Track uses of n so they can be converted to ref. -- Track uses of qual so they can be converted to q. for k, v in pairs(parent_args) do if type(k) == "string" and k:find("^qual%d*$") then track("IPA", "q") end end local include_langname = frame.args.include_langname local compat = parent_args.lang local offset = compat and 0 or 1 local lang_arg = compat and "lang" or 1 local params = { [lang_arg] = {required = true, type = "language", default = "en"}, [1 + offset] = {list = true, disallow_holes = true}, -- Deprecated; don't use in new code. ["qual"] = {list = true, separate_no_index = true, alias_of = "q"}, ["nocount"] = {type = "boolean"}, ["nocat"] = {type = "boolean"}, ["sort"] = {}, } local m_param_utils = require(parameter_utilities_module) local param_mods = m_param_utils.construct_param_mods { {group = {"ref", "a", "q"}}, {group = "link", include = {"t", "gloss", "pos"}}, } local items, args = m_param_utils.parse_list_with_inline_modifiers_and_separate_params { params = params, param_mods = param_mods, raw_args = parent_args, termarg = 1 + offset, term_dest = "pron", track_module = "IPA", } local lang = args[lang_arg] for _, item in ipairs(items) do require("Module:IPA/tracking").run_tracking(item.pron, lang) end -- Tracking for direct (manual) uses of {{IPA}} instead of lang-specific automatic templates such as {{is-IPA}}. -- [[Category:LANG terms with IPA pronunciation]] tracks terms with IPA pronunciation added in any manner, -- but doesn't distinguish manual {{IPA}} calls from calls to the automatic template. track("IPA", "manual") track("IPA", "manual/" .. lang:getCode()) local data = { lang = lang, items = items, no_count = args.nocount, nocat = args.nocat, sort_key = args.sort, include_langname = include_langname, q = args.q.default, qq = args.qq.default, a = args.a.default, aa = args.aa.default, } return m_IPA.format_IPA_full(data) end -- Used for [[Template:IPAchar]]. function export.IPAchar(frame) local parent_args = frame.getParent and frame:getParent().args or frame -- Track uses of n so they can be converted to ref. -- Track uses of qual so they can be converted to q. for k, v in pairs(parent_args) do if type(k) == "string" and k:find("^n%d*$") then track("IPAchar", "n") end if type(k) == "string" and k:find("^qual%d*$") then track("IPAchar", "q") end end local params = { [1] = {list = true, disallow_holes = true}, -- FIXME, remove this. ["lang"] = {}, -- This parameter is not used and does nothing, but is allowed for futureproofing. } local m_param_utils = require(parameter_utilities_module) local param_mods = m_param_utils.construct_param_mods { -- It doesn't really make sense to have separate overall a=/aa=/q=/qq= for {{IPAchar}}, which doesn't format a -- whole line but just individual pronunciations. Instead they are associated with the first item. {group = {"ref", "a", "q"}, separate_no_index = false}, -- Deprecated; don't use in new code. {param = "qual", alias_of = "q"}, } local items, args = m_param_utils.parse_list_with_inline_modifiers_and_separate_params { params = params, param_mods = param_mods, raw_args = parent_args, termarg = 1, term_dest = "pron", track_module = "IPAchar", } -- [[Special:WhatLinksHere/Wiktionary:Tracking/IPAchar/lang]] if args.lang then track("IPAchar", "lang") end -- Format return m_IPA.format_IPA_multiple(nil, items) end function export.XSAMPA(frame) local params = { [1] = { required = true }, } local args = require("Module:parameters").process(frame:getParent().args, params) return m_IPA.XSAMPA_to_IPA(args[1] or "[Eg'zA:mp5=]") end -- Used by [[Template:X2IPA]] function export.X2IPAtemplate(frame) local parent_args = frame.getParent and frame:getParent().args or frame local compat = parent_args["lang"] local offset = compat and 0 or 1 local params = { [compat and "lang" or 1] = {required = true, default = "und"}, [1 + offset] = {list = true, allow_holes = true}, ["ref"] = {list = true, allow_holes = true}, ["a"] = {list = true, allow_holes = true, separate_no_index = true}, ["aa"] = {list = true, allow_holes = true, separate_no_index = true}, ["q"] = {list = true, allow_holes = true, separate_no_index = true}, ["qq"] = {list = true, allow_holes = true, separate_no_index = true}, ["qual"] = {list = true, allow_holes = true}, ["nocount"] = {type = "boolean"}, ["sort"] = {}, } local args = require("Module:parameters").process(parent_args, params) local m_XSAMPA = require("Module:IPA/X-SAMPA") local pronunciations, refs, a, aa, q, qq, qual, lang = args[1 + offset], args.ref, args.a, args.aa, args.q, args.qq, args.qual, args[compat and "lang" or 1] local output = {} table.insert(output, "{{IPA") table.insert(output, "|" .. lang) if a.default then table.insert(output, "|a=" .. a.default) end if q.default then table.insert(output, "|q=" .. q.default) end for i = 1, math.max(pronunciations.maxindex, refs.maxindex, a.maxindex, aa.maxindex, q.maxindex, qq.maxindex, qual.maxindex) do if pronunciations[i] then table.insert(output, "|" .. m_XSAMPA.XSAMPA_to_IPA(pronunciations[i])) end if a[i] then table.insert(output, "|a" .. i .. "=" .. a[i]) end if aa[i] then table.insert(output, "|aa" .. i .. "=" .. aa[i]) end if q[i] then table.insert(output, "|q" .. i .. "=" .. q[i]) end if qq[i] then table.insert(output, "|qq" .. i .. "=" .. qq[i]) end if refs[i] then table.insert(output, "|ref" .. i .. "=" .. refs[i]) end if qual[i] then table.insert(output, "|qual" .. i .. "=" .. qual[i]) end end if aa.default then table.insert(output, "|aa=" .. aa.default) end if qq.default then table.insert(output, "|qq=" .. qq.default) end if args.nocount then table.insert(output, "|nocount=1") end if args.sort then table.insert(output, "|sort=" .. args.sort) end table.insert(output, "}}") return table.concat(output) end -- Used by [[Template:X2IPAchar]] function export.X2IPAchar(frame) local params = { [1] = { list = true, allow_holes = true }, ["ref"] = {list = true, allow_holes = true}, ["q"] = {list = true, allow_holes = true, require_index = true}, ["qq"] = {list = true, allow_holes = true, require_index = true}, ["qual"] = { list = true, allow_holes = true }, -- FIXME, remove this. ["lang"] = {}, } local args = require("Module:parameters").process(frame:getParent().args, params) -- [[Special:WhatLinksHere/Wiktionary:Tracking/X2IPAchar/lang]] if args.lang then track("X2IPAchar", "lang") end local m_XSAMPA = require("Module:IPA/X-SAMPA") local pronunciations, refs, q, qq, qual, lang = args[1], args.ref, args.q, args.qq, args.qual, args.lang local output = {} table.insert(output, "{{IPAchar") for i = 1, math.max(pronunciations.maxindex, refs.maxindex, q.maxindex, qq.maxindex, qual.maxindex) do if pronunciations[i] then table.insert(output, "|" .. m_XSAMPA.XSAMPA_to_IPA(pronunciations[i])) end if q[i] then table.insert(output, "|q" .. i .. "=" .. q[i]) end if qq[i] then table.insert(output, "|qq" .. i .. "=" .. qq[i]) end if qual[i] then table.insert(output, "|qual" .. i .. "=" .. qual[i]) end if refs[i] then table.insert(output, "|ref" .. i .. "=" .. refs[i]) end end if lang then table.insert(output, "|lang=" .. lang) end table.insert(output, "}}") return table.concat(output) end -- Used by [[Template:x2rhymes]] function export.X2rhymes(frame) local parent_args = frame.getParent and frame:getParent().args or frame local compat = parent_args["lang"] local offset = compat and 0 or 1 local params = { [compat and "lang" or 1] = {required = true, default = "und"}, [1 + offset] = {required = true, list = true, allow_holes = true}, } local args = require("Module:parameters").process(parent_args, params) local m_XSAMPA = require("Module:IPA/X-SAMPA") local pronunciations, lang = args[1 + offset], args[compat and "lang" or 1] local output = {} table.insert(output, "{{rhymes") table.insert(output, "|" .. lang) for i = 1, pronunciations.maxindex do if pronunciations[i] then table.insert(output, "|" .. m_XSAMPA.XSAMPA_to_IPA(pronunciations[i])) end end table.insert(output, "}}") return table.concat(output) end -- Used for [[Template:enPR]]. function export.enPR(frame) local parent_args = frame:getParent().args local params = { [1] = {list = true, disallow_holes = true}, } local m_param_utils = require(parameter_utilities_module) local param_mods = m_param_utils.construct_param_mods { {group = {"q", "a", "ref"}}, } local items, args = m_param_utils.parse_list_with_inline_modifiers_and_separate_params { params = params, param_mods = param_mods, raw_args = parent_args, termarg = 1, term_dest = "pron", track_module = "enPR", } local data = { items = items, q = args.q.default, qq = args.qq.default, a = args.a.default, aa = args.aa.default, } return m_IPA.format_enPR_full(data) end return export 4d032bpwth3egruuulwhrdv60ldftme मॉड्यूल:IPA 828 303055 487773 487250 2026-09-02T16:55:05Z SM7 6218 updating... 487773 Scribunto text/plain local export = {} local force_cat = false -- for testing local pages_module = "Module:pages" local pron_qualifier_module = "Module:pron qualifier" local qualifier_module = "Module:qualifier" local references_module = "Module:references" local string_utilities_module = "Module:string utilities" local syllables_module = "Module:syllables" local utilities_module = "Module:utilities" local m_data = mw.loadData("Module:IPA/data") local m_str_utils = require(string_utilities_module) local m_syllables -- [[Module:syllables]]; loaded below if needed local m_symbols = mw.loadData("Module:IPA/data/symbols") local concat = table.concat local decode_entities = m_str_utils.decode_entities local find = string.find local gcodepoint = m_str_utils.gcodepoint local gmatch = m_str_utils.gmatch local gsub = string.gsub local insert = table.insert local is_preview = require(pages_module).is_preview local len = m_str_utils.len local listToText = mw.text.listToText local match = string.match local pattern_escape = m_str_utils.pattern_escape local sub = string.sub local u = m_str_utils.char local ugsub = m_str_utils.gsub local umatch = m_str_utils.match local usub = m_str_utils.sub local function with_codepoints(s) if find(s, "%S%s") then local parts = {} for ch in gmatch(s, "%S") do parts[#parts + 1] = with_codepoints(ch) end return concat(parts, ", ") end local cps = {} for cp in gcodepoint(s) do cps[#cps + 1] = ("U+%04X"):format(cp) end return s .. " [" .. concat(cps, " ") .. "]" end local namespace = mw.title.getCurrentTitle().nsText local function is_content_page(lang, namespace) return namespace == "" or namespace == "Reconstruction" or lang and lang:hasType("appendix-constructed") and namespace == "Appendix" end -- Etymology-only languages are not L2 entry languages; IPA should use the parent full language. local function assert_not_etymology_only_lang(lang) if lang and lang.hasType and lang:hasType("language", "etymology-only") then local parent_code = lang.getParentCode and lang:getParentCode() or nil error(("Cannot use IPA with the etymology-only language %q; use the parent full language %q instead."):format(lang:getCode(), parent_code)) end end local function track(page) require("Module:debug/track")("IPA/" .. page) return true end local function process_maybe_split_categories(split_output, categories, prontext, lang, errtext) if split_output ~= "raw" then if categories[1] then categories = require(utilities_module).format_categories(categories, lang, nil, nil, force_cat) else categories = "" end end if split_output then -- for use of IPA in links, etc. if errtext then return prontext, categories, errtext else return prontext, categories end else return prontext .. (errtext or "") .. categories end end --[==[ Format a line of one or more IPA pronunciations as {{tl|IPA}} would do it, i.e. with a preceding {"IPA:"} followed by the word {"key"} linking to an Appendix page describing the language's phonology, and with an added category ` ``lang`` terms with IPA pronunciation`. Other than the extra preceding text and category, this is identical to {format_IPA_multiple()}, and the considerations described there in the documentation apply here as well. There is a single parameter `data`, an object with the following fields: * `lang`: Object representing the language of the pronunciations, which is used when adding cleanup categories for pronunciations with invalid phonemes; for determining how many syllables the pronunciations have in them, in order to add a category such as [[:Category:Italian 2-syllable words]] (for certain languages only); for adding a category ` ``lang`` terms with IPA pronunciation`; and for determining the proper sort keys for categories. Unlike for {format_IPA_multiple()}, `lang` may not be {nil}. * `items`: List of pronunciations, in exactly the same format as for {format_IPA_multiple()}. * `err`: If not {nil}, a string containing an error message to use in place of the link to the language's phonology. * `separator`: The default separator to use when separating formatted items. Defaults to {", "}. Does not apply to the first item, where the default separator is always the empty string. Overridden by the per-item `separator` field in `items`. * `sort_key`: Explicit sort key used for categories. * `no_count`: Suppress adding a {#-syllable words} category such as [[:Category:Italian 2-syllable words]]. Note that only certain languages add such categories to begin with, because it depends on knowing how to count syllables in a given language, which depends on the phonology of the language. Also, this does not suppress the addition of cleanup or other categories. If you need them suppressed, use `split_output` to return the categories separately and ignore them. * `split_output`: If not given, the return value is a concatenation of the formatted pronunciation and formatted categories. Otherwise, two values are returned: the formatted pronunciation and the categories. If `split_output` is the value {"raw"}, the categories are returned in list form, where the list elements are a combination of category strings and category objects of the form suitable for passing to {format_categories()} in [[Module:utilities]]. If `split_output` is any other value besides {nil}, the categories are returned as a pre-formatted concatenated string. * `include_langname`: If specified, prefix the result with the language name, followed by a colon. * `q`: {nil} or a list of left qualifiers (as in {{tl|q}}) to display at the beginning, before the formatted pronunciations and preceding {"IPA:"}. * `qq`: {nil} or a list of right qualifiers to display after all formatted pronunciations. * `a`: {nil} or a list of left accent qualifiers (as in {{tl|a}}) to display at the beginning, before the formatted pronunciations and preceding {"IPA:"}. * `aa`: {nil} or a list of right accent qualifiers to display after all formatted pronunciations. ]==] function export.format_IPA_full(data) if type(data) ~= "table" or data.getCode then error("Must now supply a table of arguments to format_IPA_full(); first argument should be that table, not a language object") end local lang = data.lang local items = data.items local err = data.err local separator = data.separator local sort_key = data.sort_key local no_count = data.no_count local split_output = data.split_output local q = data.q local qq = data.qq local a = data.a local aa = data.aa local include_langname = data.include_langname local hasKey = m_data.langs_with_infopages if not lang or not lang.getCode then error("Must specify language to format_IPA_full()") end assert_not_etymology_only_lang(lang) local langname = lang:getCanonicalName() local prefix_text if err then prefix_text = '<span class="error">' .. err .. '</span>' else if hasKey[lang:getCode()] then prefix_text = "Appendix:" .. langname .. " pronunciation" else prefix_text = "wikipedia:" .. langname .. " phonology" end prefix_text = "[[" .. prefix_text .. "|key]]" end local prefix = "[[विक्षनरी:अंतर्राष्ट्रीय ध्वन्यात्मक वर्णमाला|आईपीए]]<sup>(" .. prefix_text .. ")</sup>:&#32;" local IPAs, categories = export.format_IPA_multiple(lang, items, separator, no_count, "raw") if is_content_page(lang, namespace) then insert(categories, { cat = langname .. " टर्म आईपीए उच्चारण के साथ", sort_key = sort_key }) end local prontext = prefix .. IPAs if q and q[1] or qq and qq[1] or a and a[1] or aa and aa[1] then prontext = require(pron_qualifier_module).format_qualifiers { lang = lang, text = prontext, q = q, qq = qq, a = a, aa = aa, } end if include_langname then prontext = langname .. ": " .. prontext end return process_maybe_split_categories(split_output, categories, prontext, lang) end local function split_phonemic_phonetic(pron) local reconstructed, phonemic, phonetic = match(pron, "^(%*?)(/.-/)%s+(%[.-%])$") if reconstructed then return reconstructed .. phonemic, reconstructed .. phonetic else return pron, nil end end local function determine_repr(pron) local reconstructed -- Temporarily remove any initial asterisk before representation marks, -- which avoids having to account for it in the data, but set the -- `reconstructed` flag. if sub(pron, 1, 1) == "*" then reconstructed = true pron = sub(pron, 2) end -- Some representation types have aliases for convenience (e.g. "// //" is -- an alias for "⫽ ⫽"). and these need to be substituted in before checking -- for other data. local opening, n = match(pron, "^.[\128-\191]*") local subs_data = m_data.representation_subs[opening] if subs_data then pron, n = ugsub(pron, subs_data[1], subs_data[2]) -- If the substitution was made, `opening` needs to be changed to the -- new opening character. if n ~= 0 then opening = subs_data[3] end end -- Get the type data based on the opening character (if any), and set the -- representation type if the closing character matches. local type_data, repr, closing = m_data.representation_types[opening] if type_data then closing = type_data[2] if type_data and match(pron, pattern_escape(closing) .. "$", #opening + 1) then repr = type_data[1] end end -- Default to the empty string. if not repr then opening, closing = "", "" end -- Reattach the asterisk if reconstructed. if reconstructed then pron = "*" .. pron end return pron, repr, opening, closing, reconstructed end local function hasInvalidSeparators(transcription) -- Escape certain characters as well as pauses, which have the format "(...)" (with any number of dots), to avoid false-positives. transcription = transcription:gsub(".[\128-\191]*", m_symbols.separator_escapes) :gsub("%(%.+%)", "\3") :gsub("[()]+", "") return ( transcription:find("..", nil, true) or transcription:match("%.%f[%z \1\2\3,:;]") or transcription:match("\1%f[%z \2\3,:;]") or transcription:match("\2%f[%z \1\3,:;]") or transcription:match("\3[:;]") or transcription:match("%f[^%z \1\2\3,]%.") ) and true or false end --[==[ Format a line of one or more bare IPA pronunciations (i.e. without any preceding {"IPA:"} and without adding to a category ` ``lang`` terms with IPA pronunciation`). Individual pronunciations are formatted using {format_IPA()} and are combined with separators, qualifiers, pre-text, post-text, etc. to form a line of pronunciations. Parameters accepted are: * `lang` is an object representing the language of the pronunciations, which is used when adding cleanup categories for pronunciations with invalid phonemes; for determining how many syllables the pronunciations have in them, in order to add a category such as [[:Category:Italian 2-syllable words]] (for certain languages only); and for computing the proper sort keys for categories. `lang` may be {nil}. * `items` is a list of pronunciations, each of which is an object with the following properties: ** `pron`: the pronunciation, in the same format as is accepted by {format_IPA()}, i.e. it should be either phonemic (surrounded by {/.../}), phonetic (surrounded by {[...]}), orthographic (surrounded by {⟨...⟩}) or a rhyme (beginning with a hyphen); ** `pretext`: text to display directly before the formatted pronunciation, inside of any qualifiers or accent qualifiers; ** `posttext`: text to display directly after the formatted pronunciation, inside of any qualifiers or accent qualifiers; ** `q` or `qualifiers`: {nil} or a list of left qualifiers (as in {{tl|q}}) to display before the formatted pronunciation; note that `qualifiers` is deprecated; ** `qq`: {nil} or a list of right qualifiers to display after the formatted pronunciation; ** `a`: {nil} or a list of left accent qualifiers (as in {{tl|a}}) to display before the formatted pronunciation; ** `aa`: {nil} or a list of right accent qualifiers to after before the formatted pronunciation; ** `refs`: {nil} or a list of references or reference specs to add after the pronunciation and any posttext and qualifiers; the value of a list item is either a string containing the reference text (typically a call to a citation template such as {{tl|cite-book}}, or a template wrapping such a call), or an object with fields `text` (the reference text), `name` (the name of the reference, as in {{cd|<nowiki><ref name="foo">...</ref></nowiki>}} or {{cd|<nowiki><ref name="foo" /></nowiki>}}) and/or `group` (the group of the reference, as in {{cd|<nowiki><ref name="foo" group="bar">...</ref></nowiki>}} or {{cd|<nowiki><ref name="foo" group="bar"/></nowiki>}}); this uses a parser function to format the reference appropriately and insert a footnote number that hyperlinks to the actual reference, located in the {{cd|<nowiki><references /></nowiki>}} section; ** `gloss`: {nil} or a gloss (definition) for this item, if different definitions have different pronunciations; ** `pos`: {nil} or a part of speech for this item, if different parts of speech have different pronunciations; ** `separator`: the separator text to insert directly before the formatted pronunciation and all qualifiers, accent qualifiers and pre-text; defaults to the outer `separator` parameter. * `separator`: The default separator to use when separating formatted items. Defaults to {", "}. Does not apply to the first item, where the default separator is always the empty string. Overridden by the per-item `separator` field in `items`. * `no_count`: Suppress adding a {#-syllable words} category such as [[:Category:Italian 2-syllable words]]. Note that only certain languages add such categories to begin with, because it depends on knowing how to count syllables in a given language, which depends on the phonology of the language. Also, this does not suppress the addition of cleanup categories. If you need them suppressed, use `split_output` to return the categories separately and ignore them. * `split_output`: If not given, the return value is a concatenation of the formatted pronunciation and formatted categories. Otherwise, two values are returned: the formatted pronunciation and the categories. If `split_output` is the value {"raw"}, the categories are returned in list form, where the list elements are a combination of category strings and category objects of the form suitable for passing to {format_categories()} in [[Module:utilities]]. If `split_output` is any other value besides {nil}, the categories are returned as a pre-formatted concatenated string. ]==] function export.format_IPA_multiple(lang, items, separator, no_count, split_output) local categories = {} separator = separator or ", " if not lang then track("format-multiple-nolang") else assert_not_etymology_only_lang(lang) end -- Format if not items[1] then if namespace == "साँचा" then insert(items, {pron = "/aɪ piː ˈeɪ/"}) else insert(categories, "Pronunciation templates without a pronunciation") end end local bits = {} for i, item in ipairs(items) do local bit -- If the pronunciation is entirely empty, allow this and don't do anything, so that e.g. the pretext and/or -- posttext can be specified to force something like ''unknown'' to appear in place of the pronunciation -- (as happens e.g. when ? is used as a respelling in [[Module:ca-IPA]]; see [[guèiser]] for an example). if item.pron == "" then bit = "" else local item_categories, errtext bit, item_categories, errtext = export.format_IPA(lang, item.pron, "raw") bit = bit .. errtext for _, cat in ipairs(item_categories) do insert(categories, cat) end end if item.pretext then bit = item.pretext .. bit end if item.posttext then bit = bit .. item.posttext end local has_qualifiers = item.q and item.q[1] or item.qq and item.qq[1] or item.qualifiers and item.qualifiers[1] or item.a and item.a[1] or item.aa and item.aa[1] local has_gloss_or_pos = item.gloss or item.pos if has_qualifiers or has_gloss_or_pos then -- FIXME: Currently we tack the gloss and POS (in that order) onto the end of the regular left qualifiers. -- Should we do something different? local q = item.q if has_gloss_or_pos then q = mw.clone(item.q) or {} if item.gloss then local m_qualifier = require(qualifier_module) insert(q, m_qualifier.wrap_qualifier_css("“", "quote") .. item.gloss .. m_qualifier.wrap_qualifier_css("”", "quote")) end if item.pos then -- FIXME: Consider expanding aliases as found in [[Module:headword/data]] or similar. insert(q, item.pos) end end bit = require("Module:pron qualifier").format_qualifiers { lang = lang, text = bit, q = q, qq = item.qq, qualifiers = item.qualifiers, a = item.a, aa = item.aa, } end if item.note then -- Support removed on 2024-06-15. error("Support for `.note` has been removed; switch to `.refs` (which must be a list)") end if item.refs then local refspecs = item.refs if #refspecs > 0 then bit = bit .. require(references_module).format_references(refspecs) end end bit = (item.separator or (i == 1 and "" or separator)) .. bit insert(bits, bit) --[=[ [[Special:WhatLinksHere/Wiktionary:Tracking/IPA/syntax-error]] The length or gemination symbol should not appear after a syllable break or stress symbol. ]=] -- The nature of the following pattern match is such that we don't have to split a combined '/.../ [...]' spec -- into its parts in order to process. if match(item.pron, "[.\203][\136\140]?\203[\144\145]") then -- [.ˈˌ][ːˑ] track("syntax-error") end if lang then -- Add syllable count if the language's diphthongs are listed in [[Module:syllables]]. -- Don't do this if the term has spaces, a liaison mark (‿) or isn't in mainspace. if not no_count and namespace == "" then m_syllables = m_syllables or require(syllables_module) local langcode = lang:getCode() if m_data.langs_to_generate_syllable_count_categories[langcode] then local raw_phonemic, phonetic, use_it = split_phonemic_phonetic(item.pron) local phonemic, repr = determine_repr(raw_phonemic) if not phonetic then -- not a '/.../ [...]' combined pronunciation if m_data.langs_to_use_phonetic_or_phonemic_notation[langcode] then use_it = phonemic elseif m_data.langs_to_use_phonetic_notation[langcode] then use_it = repr == "phonetic" and phonemic or nil else use_it = repr == "phonemic" and phonemic or nil end elseif repr == "phonetic" then use_it = phonetic elseif repr == "phonemic" then use_it = phonemic end -- Note: two uses of find with plain patterns is much faster than umatch with [ ‿]. if use_it and not (find(use_it, " ") or find(use_it, "‿")) then local syllable_count = m_syllables.getVowels(use_it, lang) if syllable_count then insert(categories, lang:getCanonicalName() .. " " .. syllable_count .. "-सिलेबल शब्द") end end end end end end return process_maybe_split_categories(split_output, categories, concat(bits), lang) end --[=[ Format a single IPA pronunciation, which cannot be a combined spec (such as {/.../ [...]}). This has been extracted from {format_IPA()} to allow the latter to handle such combined specs. This works like {format_IPA()} but requires that pre-created {err} (for error messages) and {categories} lists be passed in, and adds any generated error messages and categories to those lists. A single value is returned, the pronunciation, which is usually the same as passed in, but may have HTML added surrounding invalid characters so they appear in red. ]=] local function format_one_IPA(lang, raw_pron, err, categories) -- Disallow wikilinks. if match(raw_pron, "%[%[.-%]%]") then error("IPA input must not contain wikilinks.") end raw_pron = decode_entities(raw_pron) -- Detect the type of transcription. local pron, repr, opening, closing, reconstructed = determine_repr(raw_pron) -- Strip any reconstruction asterisk and representation marks. pron = sub(pron, #opening + 1 + (reconstructed and 1 or 0), -#closing - 1) if not repr then insert(categories, "IPA pronunciations with invalid representation marks") -- insert(err, "invalid representation marks") -- Removed because it's annoying when previewing pronunciation pages. end if repr ~= "orthographic" and lang and lang:getCode() == "en" and hasInvalidSeparators(pron) then insert(categories, "English IPA pronunciations with invalid separators") end if pron == "" then insert(categories, "IPA pronunciations with no pronunciation present") end -- Check for obsolete and nonstandard symbols for _, symbol in ipairs(m_data.nonstandard) do local result for nonstandard in gmatch(pron, symbol) do if not result then result = {} end insert(result, nonstandard) insert(categories, {cat = "IPA pronunciations with obsolete or nonstandard characters", sort_key = nonstandard} ) end if result then insert(err, "obsolete or nonstandard characters (" .. concat(result) .. ")") break end end --[[ Check for invalid symbols after removing the following: 1. wikilinks (handled above) 2. paired HTML tags 3. bolding 4. italics 5. asterisk at beginning of transcription 6. comma followed by spacing characters 7. superscripts enclosed in superscript parentheses ]] local found_HTML local result = gsub(pron, "<(%a+)[^>]*>([^<]+)</%1>", function(tagName, content) found_HTML = true return content end) result = gsub(result, "'''([^']*)'''", "%1") result = gsub(result, "''([^']*)''", "%1") result = gsub(result, "^%*", "") result = ugsub(result, ",%s+", "") -- VS15 local vs15_class = "[" .. m_symbols.add_vs15 .. "]" if umatch(pron, vs15_class) then local vs15 = u(0xFE0E) if find(result, vs15) then result = gsub(result, vs15, "") pron = gsub(pron, vs15, "") end pron = ugsub(pron, vs15_class, "%0" .. vs15) end if result ~= "" then local content_page = is_content_page(lang, namespace) if lang then -- Get the per_lang_valid data, and convert any per-language valid sequences to spaces. local per_lang_valid = m_symbols.per_lang_valid[lang:getCode()] if per_lang_valid then if type(per_lang_valid) == "table" then for _, pattern in pairs(per_lang_valid) do result = ugsub(result, pattern, " ") end else -- Should be a string. result = ugsub(result, per_lang_valid, " ") end end end local suggestions = {} -- Check for any invalid sequences, excluding anything in the per-language lookup table. for k, v in pairs(m_symbols.invalid) do if find(result, k, nil, true) then insert(suggestions, with_codepoints(k) .. " with " .. with_codepoints(v)) end end if suggestions[1] then local replacements = "replace " .. listToText(suggestions) if content_page then error("Invalid IPA: " .. replacements) end insert(err, replacements) end -- Convert any valid character sequences to spaces for _, pattern in pairs(m_symbols.valid) do result = ugsub(result, pattern, " ") end if not match(result, "^ *$") then local category = "IPA pronunciations with invalid IPA characters" if not content_page then category = category .. "/non_mainspace" end insert(categories, category) insert(err, "invalid IPA characters: " .. with_codepoints(result)) end end if found_HTML then insert(categories, "IPA pronunciations with paired HTML tags") end if (repr == "phonemic" or repr == "rhyme") and lang and m_data.phonemes[lang:getCode()] then local valid_phonemes = m_data.phonemes[lang:getCode()] local rest = pron local phonemes = {} while #rest > 0 do local longestmatch, longestmatch_len = "", 0 local rest_init = sub(rest, 1, 1) if rest_init == "(" or rest_init == ")" then longestmatch = rest_init longestmatch_len = 1 else for _, phoneme in ipairs(valid_phonemes) do local phoneme_len = len(phoneme) if phoneme_len > longestmatch_len and usub(rest, 1, phoneme_len) == phoneme then longestmatch = phoneme longestmatch_len = len(longestmatch) end end end if longestmatch_len > 0 then insert(phonemes, longestmatch) rest = usub(rest, longestmatch_len + 1) else local phoneme = usub(rest, 1, 1) insert(phonemes, "<span style=\"color: var(--wikt-palette-red,red)\">" .. phoneme .. "</span>") rest = usub(rest, 2) insert(categories, "IPA pronunciations with invalid phonemes/" .. lang:getCode()) track("invalid phonemes/" .. phoneme) end end pron = concat(phonemes) end return (reconstructed and "*" or "") .. opening .. pron .. closing end --[==[ Format an IPA pronunciation. This wraps the pronunciation in appropriate CSS classes and adds cleanup categories and error messages as needed. The pronunciation `pron` should be either phonemic (surrounded by {/.../}), phonetic (surrounded by {[...]}), orthographic (surrounded by {⟨...⟩}), a rhyme (beginning with a hyphen) or a combined phonemic/phonetic spec (of the form {/.../ [...]}). `lang` indicates the language of the pronunciation and can be {nil}. If not {nil}, and the specified language has data in [[Module:IPA/data]] indicating the allowed phonemes, then the page will be added to a cleanup category and an error message displayed next to the outputted pronunciation. Note that {lang} also determines sort key processing in the added cleanup categories. If `split_output` is not given, the return value is a concatenation of the formatted pronunciation, error messages and formatted cleanup categories. Otherwise, three values are returned: the formatted pronunciation, the cleanup categories and the concatenated error messages. If `split_output` is the value {"raw"}, the cleanup categories are returned in list form, where the list elements are a combination of category strings and category objects of the form suitable for passing to {format_categories()} in [[Module:utilities]]. If `split_output` is any other value besides {nil}, the cleanup categories are returned as a pre-formatted concatenated string. ]==] function export.format_IPA(lang, pron, split_output) local err = {} local categories = {} -- `pron` shouldn't contain ref tags. if match(pron, "\127'\"`UNIQ%-%-ref%-[%dA-F]+%-QINU`\"'\127") then error("<ref> tags found inside pronunciation parameter.") end if not lang then track("format-nolang") else assert_not_etymology_only_lang(lang) end local phonemic, phonetic = split_phonemic_phonetic(pron) pron = format_one_IPA(lang, phonemic, err, categories) if phonetic then track("phonemic-phonetic") -- There's no benefit to supporting the "/.../ [...]" format within one parameter. phonetic = format_one_IPA(lang, phonetic, err, categories) pron = pron .. " " .. phonetic end if err[1] and is_preview() then err = '<span class="error" style="font-size: small;>&#32;' .. concat(err, ", ") .. "</span>" else err = "" end return process_maybe_split_categories(split_output, categories, '<span class="IPA nowrap">' .. pron .. "</span>", lang, err) end --[==[ Format a line of one or more enPR pronunciations as {{tl|enPR}} would do it, i.e. with a preceding {"enPR:"} (linked to [[Appendix:English pronunciation]]) followed by one or more formatted, comma-separated enPR pronunciations. The pronunciations are formatted by wrapping them in the `AHD` and `enPR` CSS classes and adding any left and right regular and accent qualifiers. In addition, the overall result is wrapped in any overall left and right regular and accent qualifiers. There is a single parameter `data`, an object with the following fields: * `items` is a list of enPR pronunciations, each of which is an object with the following properties: ** `pron`: the enPR pronunciation; ** `q`: {nil} or a list of left qualifiers (as in {{tl|q}}) to display before the formatted pronunciation; ** `qq`: {nil} or a list of right qualifiers to display after the formatted pronunciation; ** `a`: {nil} or a list of left accent qualifiers (as in {{tl|a}}) to display before the formatted pronunciation; ** `aa`: {nil} or a list of right accent qualifiers to after before the formatted pronunciation. * `q`: {nil} or a list of left qualifiers (as in {{tl|q}}) to display at the beginning, before the formatted pronunciations and preceding {"enPR:"}. * `qq`: {nil} or a list of right qualifiers to display after all formatted pronunciations. * `a`: {nil} or a list of left accent qualifiers (as in {{tl|a}}) to display at the beginning, before the formatted pronunciations and preceding {"enPR:"}. * `aa`: {nil} or a list of right accent qualifiers to display after all formatted pronunciations. ]==] function export.format_enPR_full(data) local prefix = "[[:English pronunciation|enPR]]: " local lang = require("Module:languages").getByCode("en") local parts = {} for _, item in ipairs(data.items) do local part = '<span class="AHD enPR">' .. item.pron .. "</span>" if item.q and item.q[1] or item.qq and item.qq[1] or item.a and item.a[1] or item.aa and item.aa[1] then part = require("Module:pron qualifier").format_qualifiers { lang = lang, text = part, q = item.q, qq = item.qq, a = item.a, aa = item.aa, } end insert(parts, part) end local prontext = prefix .. concat(parts, ", ") if data.q and data.q[1] or data.qq and data.qq[1] or data.a and data.a[1] or data.aa and data.aa[1] then prontext = require(pron_qualifier_module).format_qualifiers { lang = lang, text = prontext, q = data.q, qq = data.qq, a = data.a, aa = data.aa, } end return prontext end return export cbqohhv5z2dkjwwscddlkstt9gy4709 487774 487773 2026-09-02T16:57:25Z SM7 6218 localization... 487774 Scribunto text/plain local export = {} local force_cat = false -- for testing local pages_module = "Module:pages" local pron_qualifier_module = "Module:pron qualifier" local qualifier_module = "Module:qualifier" local references_module = "Module:references" local string_utilities_module = "Module:string utilities" local syllables_module = "Module:syllables" local utilities_module = "Module:utilities" local m_data = mw.loadData("Module:IPA/data") local m_str_utils = require(string_utilities_module) local m_syllables -- [[Module:syllables]]; loaded below if needed local m_symbols = mw.loadData("Module:IPA/data/symbols") local concat = table.concat local decode_entities = m_str_utils.decode_entities local find = string.find local gcodepoint = m_str_utils.gcodepoint local gmatch = m_str_utils.gmatch local gsub = string.gsub local insert = table.insert local is_preview = require(pages_module).is_preview local len = m_str_utils.len local listToText = mw.text.listToText local match = string.match local pattern_escape = m_str_utils.pattern_escape local sub = string.sub local u = m_str_utils.char local ugsub = m_str_utils.gsub local umatch = m_str_utils.match local usub = m_str_utils.sub local function with_codepoints(s) if find(s, "%S%s") then local parts = {} for ch in gmatch(s, "%S") do parts[#parts + 1] = with_codepoints(ch) end return concat(parts, ", ") end local cps = {} for cp in gcodepoint(s) do cps[#cps + 1] = ("U+%04X"):format(cp) end return s .. " [" .. concat(cps, " ") .. "]" end local namespace = mw.title.getCurrentTitle().nsText local function is_content_page(lang, namespace) return namespace == "" or namespace == "Reconstruction" or lang and lang:hasType("appendix-constructed") and namespace == "Appendix" end -- Etymology-only languages are not L2 entry languages; IPA should use the parent full language. local function assert_not_etymology_only_lang(lang) if lang and lang.hasType and lang:hasType("language", "etymology-only") then local parent_code = lang.getParentCode and lang:getParentCode() or nil error(("Cannot use IPA with the etymology-only language %q; use the parent full language %q instead."):format(lang:getCode(), parent_code)) end end local function track(page) require("Module:debug/track")("IPA/" .. page) return true end local function process_maybe_split_categories(split_output, categories, prontext, lang, errtext) if split_output ~= "raw" then if categories[1] then categories = require(utilities_module).format_categories(categories, lang, nil, nil, force_cat) else categories = "" end end if split_output then -- for use of IPA in links, etc. if errtext then return prontext, categories, errtext else return prontext, categories end else return prontext .. (errtext or "") .. categories end end --[==[ Format a line of one or more IPA pronunciations as {{tl|IPA}} would do it, i.e. with a preceding {"IPA:"} followed by the word {"key"} linking to an Appendix page describing the language's phonology, and with an added category ` ``lang`` terms with IPA pronunciation`. Other than the extra preceding text and category, this is identical to {format_IPA_multiple()}, and the considerations described there in the documentation apply here as well. There is a single parameter `data`, an object with the following fields: * `lang`: Object representing the language of the pronunciations, which is used when adding cleanup categories for pronunciations with invalid phonemes; for determining how many syllables the pronunciations have in them, in order to add a category such as [[:Category:Italian 2-syllable words]] (for certain languages only); for adding a category ` ``lang`` terms with IPA pronunciation`; and for determining the proper sort keys for categories. Unlike for {format_IPA_multiple()}, `lang` may not be {nil}. * `items`: List of pronunciations, in exactly the same format as for {format_IPA_multiple()}. * `err`: If not {nil}, a string containing an error message to use in place of the link to the language's phonology. * `separator`: The default separator to use when separating formatted items. Defaults to {", "}. Does not apply to the first item, where the default separator is always the empty string. Overridden by the per-item `separator` field in `items`. * `sort_key`: Explicit sort key used for categories. * `no_count`: Suppress adding a {#-syllable words} category such as [[:Category:Italian 2-syllable words]]. Note that only certain languages add such categories to begin with, because it depends on knowing how to count syllables in a given language, which depends on the phonology of the language. Also, this does not suppress the addition of cleanup or other categories. If you need them suppressed, use `split_output` to return the categories separately and ignore them. * `split_output`: If not given, the return value is a concatenation of the formatted pronunciation and formatted categories. Otherwise, two values are returned: the formatted pronunciation and the categories. If `split_output` is the value {"raw"}, the categories are returned in list form, where the list elements are a combination of category strings and category objects of the form suitable for passing to {format_categories()} in [[Module:utilities]]. If `split_output` is any other value besides {nil}, the categories are returned as a pre-formatted concatenated string. * `include_langname`: If specified, prefix the result with the language name, followed by a colon. * `q`: {nil} or a list of left qualifiers (as in {{tl|q}}) to display at the beginning, before the formatted pronunciations and preceding {"IPA:"}. * `qq`: {nil} or a list of right qualifiers to display after all formatted pronunciations. * `a`: {nil} or a list of left accent qualifiers (as in {{tl|a}}) to display at the beginning, before the formatted pronunciations and preceding {"IPA:"}. * `aa`: {nil} or a list of right accent qualifiers to display after all formatted pronunciations. ]==] function export.format_IPA_full(data) if type(data) ~= "table" or data.getCode then error("Must now supply a table of arguments to format_IPA_full(); first argument should be that table, not a language object") end local lang = data.lang local items = data.items local err = data.err local separator = data.separator local sort_key = data.sort_key local no_count = data.no_count local split_output = data.split_output local q = data.q local qq = data.qq local a = data.a local aa = data.aa local include_langname = data.include_langname local hasKey = m_data.langs_with_infopages if not lang or not lang.getCode then error("Must specify language to format_IPA_full()") end assert_not_etymology_only_lang(lang) local langname = lang:getCanonicalName() local prefix_text if err then prefix_text = '<span class="error">' .. err .. '</span>' else if hasKey[lang:getCode()] then prefix_text = "विक्षनरी:" .. langname .. " उच्चारण" else prefix_text = "विकिपीडिया:" .. langname .. " ध्वनिविज्ञान" end prefix_text = "[[" .. prefix_text .. "|कुंजी]]" end local prefix = "[[विक्षनरी:अंतर्राष्ट्रीय ध्वन्यात्मक वर्णमाला|आईपीए]]<sup>(" .. prefix_text .. ")</sup>:&#32;" local IPAs, categories = export.format_IPA_multiple(lang, items, separator, no_count, "raw") if is_content_page(lang, namespace) then insert(categories, { cat = langname .. " टर्म आईपीए उच्चारण के साथ", sort_key = sort_key }) end local prontext = prefix .. IPAs if q and q[1] or qq and qq[1] or a and a[1] or aa and aa[1] then prontext = require(pron_qualifier_module).format_qualifiers { lang = lang, text = prontext, q = q, qq = qq, a = a, aa = aa, } end if include_langname then prontext = langname .. ": " .. prontext end return process_maybe_split_categories(split_output, categories, prontext, lang) end local function split_phonemic_phonetic(pron) local reconstructed, phonemic, phonetic = match(pron, "^(%*?)(/.-/)%s+(%[.-%])$") if reconstructed then return reconstructed .. phonemic, reconstructed .. phonetic else return pron, nil end end local function determine_repr(pron) local reconstructed -- Temporarily remove any initial asterisk before representation marks, -- which avoids having to account for it in the data, but set the -- `reconstructed` flag. if sub(pron, 1, 1) == "*" then reconstructed = true pron = sub(pron, 2) end -- Some representation types have aliases for convenience (e.g. "// //" is -- an alias for "⫽ ⫽"). and these need to be substituted in before checking -- for other data. local opening, n = match(pron, "^.[\128-\191]*") local subs_data = m_data.representation_subs[opening] if subs_data then pron, n = ugsub(pron, subs_data[1], subs_data[2]) -- If the substitution was made, `opening` needs to be changed to the -- new opening character. if n ~= 0 then opening = subs_data[3] end end -- Get the type data based on the opening character (if any), and set the -- representation type if the closing character matches. local type_data, repr, closing = m_data.representation_types[opening] if type_data then closing = type_data[2] if type_data and match(pron, pattern_escape(closing) .. "$", #opening + 1) then repr = type_data[1] end end -- Default to the empty string. if not repr then opening, closing = "", "" end -- Reattach the asterisk if reconstructed. if reconstructed then pron = "*" .. pron end return pron, repr, opening, closing, reconstructed end local function hasInvalidSeparators(transcription) -- Escape certain characters as well as pauses, which have the format "(...)" (with any number of dots), to avoid false-positives. transcription = transcription:gsub(".[\128-\191]*", m_symbols.separator_escapes) :gsub("%(%.+%)", "\3") :gsub("[()]+", "") return ( transcription:find("..", nil, true) or transcription:match("%.%f[%z \1\2\3,:;]") or transcription:match("\1%f[%z \2\3,:;]") or transcription:match("\2%f[%z \1\3,:;]") or transcription:match("\3[:;]") or transcription:match("%f[^%z \1\2\3,]%.") ) and true or false end --[==[ Format a line of one or more bare IPA pronunciations (i.e. without any preceding {"IPA:"} and without adding to a category ` ``lang`` terms with IPA pronunciation`). Individual pronunciations are formatted using {format_IPA()} and are combined with separators, qualifiers, pre-text, post-text, etc. to form a line of pronunciations. Parameters accepted are: * `lang` is an object representing the language of the pronunciations, which is used when adding cleanup categories for pronunciations with invalid phonemes; for determining how many syllables the pronunciations have in them, in order to add a category such as [[:Category:Italian 2-syllable words]] (for certain languages only); and for computing the proper sort keys for categories. `lang` may be {nil}. * `items` is a list of pronunciations, each of which is an object with the following properties: ** `pron`: the pronunciation, in the same format as is accepted by {format_IPA()}, i.e. it should be either phonemic (surrounded by {/.../}), phonetic (surrounded by {[...]}), orthographic (surrounded by {⟨...⟩}) or a rhyme (beginning with a hyphen); ** `pretext`: text to display directly before the formatted pronunciation, inside of any qualifiers or accent qualifiers; ** `posttext`: text to display directly after the formatted pronunciation, inside of any qualifiers or accent qualifiers; ** `q` or `qualifiers`: {nil} or a list of left qualifiers (as in {{tl|q}}) to display before the formatted pronunciation; note that `qualifiers` is deprecated; ** `qq`: {nil} or a list of right qualifiers to display after the formatted pronunciation; ** `a`: {nil} or a list of left accent qualifiers (as in {{tl|a}}) to display before the formatted pronunciation; ** `aa`: {nil} or a list of right accent qualifiers to after before the formatted pronunciation; ** `refs`: {nil} or a list of references or reference specs to add after the pronunciation and any posttext and qualifiers; the value of a list item is either a string containing the reference text (typically a call to a citation template such as {{tl|cite-book}}, or a template wrapping such a call), or an object with fields `text` (the reference text), `name` (the name of the reference, as in {{cd|<nowiki><ref name="foo">...</ref></nowiki>}} or {{cd|<nowiki><ref name="foo" /></nowiki>}}) and/or `group` (the group of the reference, as in {{cd|<nowiki><ref name="foo" group="bar">...</ref></nowiki>}} or {{cd|<nowiki><ref name="foo" group="bar"/></nowiki>}}); this uses a parser function to format the reference appropriately and insert a footnote number that hyperlinks to the actual reference, located in the {{cd|<nowiki><references /></nowiki>}} section; ** `gloss`: {nil} or a gloss (definition) for this item, if different definitions have different pronunciations; ** `pos`: {nil} or a part of speech for this item, if different parts of speech have different pronunciations; ** `separator`: the separator text to insert directly before the formatted pronunciation and all qualifiers, accent qualifiers and pre-text; defaults to the outer `separator` parameter. * `separator`: The default separator to use when separating formatted items. Defaults to {", "}. Does not apply to the first item, where the default separator is always the empty string. Overridden by the per-item `separator` field in `items`. * `no_count`: Suppress adding a {#-syllable words} category such as [[:Category:Italian 2-syllable words]]. Note that only certain languages add such categories to begin with, because it depends on knowing how to count syllables in a given language, which depends on the phonology of the language. Also, this does not suppress the addition of cleanup categories. If you need them suppressed, use `split_output` to return the categories separately and ignore them. * `split_output`: If not given, the return value is a concatenation of the formatted pronunciation and formatted categories. Otherwise, two values are returned: the formatted pronunciation and the categories. If `split_output` is the value {"raw"}, the categories are returned in list form, where the list elements are a combination of category strings and category objects of the form suitable for passing to {format_categories()} in [[Module:utilities]]. If `split_output` is any other value besides {nil}, the categories are returned as a pre-formatted concatenated string. ]==] function export.format_IPA_multiple(lang, items, separator, no_count, split_output) local categories = {} separator = separator or ", " if not lang then track("format-multiple-nolang") else assert_not_etymology_only_lang(lang) end -- Format if not items[1] then if namespace == "साँचा" then insert(items, {pron = "/aɪ piː ˈeɪ/"}) else insert(categories, "Pronunciation templates without a pronunciation") end end local bits = {} for i, item in ipairs(items) do local bit -- If the pronunciation is entirely empty, allow this and don't do anything, so that e.g. the pretext and/or -- posttext can be specified to force something like ''unknown'' to appear in place of the pronunciation -- (as happens e.g. when ? is used as a respelling in [[Module:ca-IPA]]; see [[guèiser]] for an example). if item.pron == "" then bit = "" else local item_categories, errtext bit, item_categories, errtext = export.format_IPA(lang, item.pron, "raw") bit = bit .. errtext for _, cat in ipairs(item_categories) do insert(categories, cat) end end if item.pretext then bit = item.pretext .. bit end if item.posttext then bit = bit .. item.posttext end local has_qualifiers = item.q and item.q[1] or item.qq and item.qq[1] or item.qualifiers and item.qualifiers[1] or item.a and item.a[1] or item.aa and item.aa[1] local has_gloss_or_pos = item.gloss or item.pos if has_qualifiers or has_gloss_or_pos then -- FIXME: Currently we tack the gloss and POS (in that order) onto the end of the regular left qualifiers. -- Should we do something different? local q = item.q if has_gloss_or_pos then q = mw.clone(item.q) or {} if item.gloss then local m_qualifier = require(qualifier_module) insert(q, m_qualifier.wrap_qualifier_css("“", "quote") .. item.gloss .. m_qualifier.wrap_qualifier_css("”", "quote")) end if item.pos then -- FIXME: Consider expanding aliases as found in [[Module:headword/data]] or similar. insert(q, item.pos) end end bit = require("Module:pron qualifier").format_qualifiers { lang = lang, text = bit, q = q, qq = item.qq, qualifiers = item.qualifiers, a = item.a, aa = item.aa, } end if item.note then -- Support removed on 2024-06-15. error("Support for `.note` has been removed; switch to `.refs` (which must be a list)") end if item.refs then local refspecs = item.refs if #refspecs > 0 then bit = bit .. require(references_module).format_references(refspecs) end end bit = (item.separator or (i == 1 and "" or separator)) .. bit insert(bits, bit) --[=[ [[Special:WhatLinksHere/Wiktionary:Tracking/IPA/syntax-error]] The length or gemination symbol should not appear after a syllable break or stress symbol. ]=] -- The nature of the following pattern match is such that we don't have to split a combined '/.../ [...]' spec -- into its parts in order to process. if match(item.pron, "[.\203][\136\140]?\203[\144\145]") then -- [.ˈˌ][ːˑ] track("syntax-error") end if lang then -- Add syllable count if the language's diphthongs are listed in [[Module:syllables]]. -- Don't do this if the term has spaces, a liaison mark (‿) or isn't in mainspace. if not no_count and namespace == "" then m_syllables = m_syllables or require(syllables_module) local langcode = lang:getCode() if m_data.langs_to_generate_syllable_count_categories[langcode] then local raw_phonemic, phonetic, use_it = split_phonemic_phonetic(item.pron) local phonemic, repr = determine_repr(raw_phonemic) if not phonetic then -- not a '/.../ [...]' combined pronunciation if m_data.langs_to_use_phonetic_or_phonemic_notation[langcode] then use_it = phonemic elseif m_data.langs_to_use_phonetic_notation[langcode] then use_it = repr == "phonetic" and phonemic or nil else use_it = repr == "phonemic" and phonemic or nil end elseif repr == "phonetic" then use_it = phonetic elseif repr == "phonemic" then use_it = phonemic end -- Note: two uses of find with plain patterns is much faster than umatch with [ ‿]. if use_it and not (find(use_it, " ") or find(use_it, "‿")) then local syllable_count = m_syllables.getVowels(use_it, lang) if syllable_count then insert(categories, lang:getCanonicalName() .. " " .. syllable_count .. "-सिलेबल शब्द") end end end end end end return process_maybe_split_categories(split_output, categories, concat(bits), lang) end --[=[ Format a single IPA pronunciation, which cannot be a combined spec (such as {/.../ [...]}). This has been extracted from {format_IPA()} to allow the latter to handle such combined specs. This works like {format_IPA()} but requires that pre-created {err} (for error messages) and {categories} lists be passed in, and adds any generated error messages and categories to those lists. A single value is returned, the pronunciation, which is usually the same as passed in, but may have HTML added surrounding invalid characters so they appear in red. ]=] local function format_one_IPA(lang, raw_pron, err, categories) -- Disallow wikilinks. if match(raw_pron, "%[%[.-%]%]") then error("IPA input must not contain wikilinks.") end raw_pron = decode_entities(raw_pron) -- Detect the type of transcription. local pron, repr, opening, closing, reconstructed = determine_repr(raw_pron) -- Strip any reconstruction asterisk and representation marks. pron = sub(pron, #opening + 1 + (reconstructed and 1 or 0), -#closing - 1) if not repr then insert(categories, "IPA pronunciations with invalid representation marks") -- insert(err, "invalid representation marks") -- Removed because it's annoying when previewing pronunciation pages. end if repr ~= "orthographic" and lang and lang:getCode() == "en" and hasInvalidSeparators(pron) then insert(categories, "English IPA pronunciations with invalid separators") end if pron == "" then insert(categories, "IPA pronunciations with no pronunciation present") end -- Check for obsolete and nonstandard symbols for _, symbol in ipairs(m_data.nonstandard) do local result for nonstandard in gmatch(pron, symbol) do if not result then result = {} end insert(result, nonstandard) insert(categories, {cat = "IPA pronunciations with obsolete or nonstandard characters", sort_key = nonstandard} ) end if result then insert(err, "obsolete or nonstandard characters (" .. concat(result) .. ")") break end end --[[ Check for invalid symbols after removing the following: 1. wikilinks (handled above) 2. paired HTML tags 3. bolding 4. italics 5. asterisk at beginning of transcription 6. comma followed by spacing characters 7. superscripts enclosed in superscript parentheses ]] local found_HTML local result = gsub(pron, "<(%a+)[^>]*>([^<]+)</%1>", function(tagName, content) found_HTML = true return content end) result = gsub(result, "'''([^']*)'''", "%1") result = gsub(result, "''([^']*)''", "%1") result = gsub(result, "^%*", "") result = ugsub(result, ",%s+", "") -- VS15 local vs15_class = "[" .. m_symbols.add_vs15 .. "]" if umatch(pron, vs15_class) then local vs15 = u(0xFE0E) if find(result, vs15) then result = gsub(result, vs15, "") pron = gsub(pron, vs15, "") end pron = ugsub(pron, vs15_class, "%0" .. vs15) end if result ~= "" then local content_page = is_content_page(lang, namespace) if lang then -- Get the per_lang_valid data, and convert any per-language valid sequences to spaces. local per_lang_valid = m_symbols.per_lang_valid[lang:getCode()] if per_lang_valid then if type(per_lang_valid) == "table" then for _, pattern in pairs(per_lang_valid) do result = ugsub(result, pattern, " ") end else -- Should be a string. result = ugsub(result, per_lang_valid, " ") end end end local suggestions = {} -- Check for any invalid sequences, excluding anything in the per-language lookup table. for k, v in pairs(m_symbols.invalid) do if find(result, k, nil, true) then insert(suggestions, with_codepoints(k) .. " with " .. with_codepoints(v)) end end if suggestions[1] then local replacements = "replace " .. listToText(suggestions) if content_page then error("Invalid IPA: " .. replacements) end insert(err, replacements) end -- Convert any valid character sequences to spaces for _, pattern in pairs(m_symbols.valid) do result = ugsub(result, pattern, " ") end if not match(result, "^ *$") then local category = "IPA pronunciations with invalid IPA characters" if not content_page then category = category .. "/non_mainspace" end insert(categories, category) insert(err, "invalid IPA characters: " .. with_codepoints(result)) end end if found_HTML then insert(categories, "IPA pronunciations with paired HTML tags") end if (repr == "phonemic" or repr == "rhyme") and lang and m_data.phonemes[lang:getCode()] then local valid_phonemes = m_data.phonemes[lang:getCode()] local rest = pron local phonemes = {} while #rest > 0 do local longestmatch, longestmatch_len = "", 0 local rest_init = sub(rest, 1, 1) if rest_init == "(" or rest_init == ")" then longestmatch = rest_init longestmatch_len = 1 else for _, phoneme in ipairs(valid_phonemes) do local phoneme_len = len(phoneme) if phoneme_len > longestmatch_len and usub(rest, 1, phoneme_len) == phoneme then longestmatch = phoneme longestmatch_len = len(longestmatch) end end end if longestmatch_len > 0 then insert(phonemes, longestmatch) rest = usub(rest, longestmatch_len + 1) else local phoneme = usub(rest, 1, 1) insert(phonemes, "<span style=\"color: var(--wikt-palette-red,red)\">" .. phoneme .. "</span>") rest = usub(rest, 2) insert(categories, "IPA pronunciations with invalid phonemes/" .. lang:getCode()) track("invalid phonemes/" .. phoneme) end end pron = concat(phonemes) end return (reconstructed and "*" or "") .. opening .. pron .. closing end --[==[ Format an IPA pronunciation. This wraps the pronunciation in appropriate CSS classes and adds cleanup categories and error messages as needed. The pronunciation `pron` should be either phonemic (surrounded by {/.../}), phonetic (surrounded by {[...]}), orthographic (surrounded by {⟨...⟩}), a rhyme (beginning with a hyphen) or a combined phonemic/phonetic spec (of the form {/.../ [...]}). `lang` indicates the language of the pronunciation and can be {nil}. If not {nil}, and the specified language has data in [[Module:IPA/data]] indicating the allowed phonemes, then the page will be added to a cleanup category and an error message displayed next to the outputted pronunciation. Note that {lang} also determines sort key processing in the added cleanup categories. If `split_output` is not given, the return value is a concatenation of the formatted pronunciation, error messages and formatted cleanup categories. Otherwise, three values are returned: the formatted pronunciation, the cleanup categories and the concatenated error messages. If `split_output` is the value {"raw"}, the cleanup categories are returned in list form, where the list elements are a combination of category strings and category objects of the form suitable for passing to {format_categories()} in [[Module:utilities]]. If `split_output` is any other value besides {nil}, the cleanup categories are returned as a pre-formatted concatenated string. ]==] function export.format_IPA(lang, pron, split_output) local err = {} local categories = {} -- `pron` shouldn't contain ref tags. if match(pron, "\127'\"`UNIQ%-%-ref%-[%dA-F]+%-QINU`\"'\127") then error("<ref> tags found inside pronunciation parameter.") end if not lang then track("format-nolang") else assert_not_etymology_only_lang(lang) end local phonemic, phonetic = split_phonemic_phonetic(pron) pron = format_one_IPA(lang, phonemic, err, categories) if phonetic then track("phonemic-phonetic") -- There's no benefit to supporting the "/.../ [...]" format within one parameter. phonetic = format_one_IPA(lang, phonetic, err, categories) pron = pron .. " " .. phonetic end if err[1] and is_preview() then err = '<span class="error" style="font-size: small;>&#32;' .. concat(err, ", ") .. "</span>" else err = "" end return process_maybe_split_categories(split_output, categories, '<span class="IPA nowrap">' .. pron .. "</span>", lang, err) end --[==[ Format a line of one or more enPR pronunciations as {{tl|enPR}} would do it, i.e. with a preceding {"enPR:"} (linked to [[Appendix:English pronunciation]]) followed by one or more formatted, comma-separated enPR pronunciations. The pronunciations are formatted by wrapping them in the `AHD` and `enPR` CSS classes and adding any left and right regular and accent qualifiers. In addition, the overall result is wrapped in any overall left and right regular and accent qualifiers. There is a single parameter `data`, an object with the following fields: * `items` is a list of enPR pronunciations, each of which is an object with the following properties: ** `pron`: the enPR pronunciation; ** `q`: {nil} or a list of left qualifiers (as in {{tl|q}}) to display before the formatted pronunciation; ** `qq`: {nil} or a list of right qualifiers to display after the formatted pronunciation; ** `a`: {nil} or a list of left accent qualifiers (as in {{tl|a}}) to display before the formatted pronunciation; ** `aa`: {nil} or a list of right accent qualifiers to after before the formatted pronunciation. * `q`: {nil} or a list of left qualifiers (as in {{tl|q}}) to display at the beginning, before the formatted pronunciations and preceding {"enPR:"}. * `qq`: {nil} or a list of right qualifiers to display after all formatted pronunciations. * `a`: {nil} or a list of left accent qualifiers (as in {{tl|a}}) to display at the beginning, before the formatted pronunciations and preceding {"enPR:"}. * `aa`: {nil} or a list of right accent qualifiers to display after all formatted pronunciations. ]==] function export.format_enPR_full(data) local prefix = "[[:English pronunciation|enPR]]: " local lang = require("Module:languages").getByCode("en") local parts = {} for _, item in ipairs(data.items) do local part = '<span class="AHD enPR">' .. item.pron .. "</span>" if item.q and item.q[1] or item.qq and item.qq[1] or item.a and item.a[1] or item.aa and item.aa[1] then part = require("Module:pron qualifier").format_qualifiers { lang = lang, text = part, q = item.q, qq = item.qq, a = item.a, aa = item.aa, } end insert(parts, part) end local prontext = prefix .. concat(parts, ", ") if data.q and data.q[1] or data.qq and data.qq[1] or data.a and data.a[1] or data.aa and data.aa[1] then prontext = require(pron_qualifier_module).format_qualifiers { lang = lang, text = prontext, q = data.q, qq = data.qq, a = data.a, aa = data.aa, } end return prontext end return export cypbgq0y29f5h73lxp5xmuve1i0nf5o मॉड्यूल:IPA/data 828 303056 487743 477489 2026-09-02T14:49:49Z SM7 6218 updating... 487743 Scribunto text/plain local list_to_set = require("Module:table").listToSet local data = {} --[=[ A list of representation types (e.g. /foo/ for phonemic and [bar] for phonetic), given as a table. The key is the opening character, the first value the representation type, and the second value the closing symbol.]=] data.representation_types = { ["/"] = {"phonemic", "/"}, ["["] = {"phonetic", "]"}, ["⫽"] = {"morphophonemic", "⫽"}, ["⟨"] = {"orthographic", "⟩"}, ["-"] = {"rhyme", ""}, } --[=[ A list of convenience inputs for certain representation types. The key is the opening character, and the table is a three-item array consisting of (1) an mw.ustring.gsub pattern which is anchored to the start and end of the string, with a single capture group that excludes the characters to be substituted, (2) a corresponding replacement pattern to be used with the pattern, and (3) the replacement opening character.]=] data.representation_subs = { ["<"] = {"^<(.*)>$", "⟨%1⟩", "⟨"}, ["/"] = {"^//(.*)//$", "⫽%1⫽", "⫽"}, } --[=[ This should list the language codes of all languages that have a pronunciation page in the appendix of the form ''Appendix:LANG pronunciation'', e.g. [[Appendix:Russian pronunciation]]. For these languages, the text "key" next to the generated pronunciation links to such pages; for other languages, it links to the "LANG phonology" page in Wikipedia (which may or may not exist). [[Module:IPA]] is responsible for this linking; see format_IPA_full().]=] data.langs_with_infopages = list_to_set{ "acw", "ady", "ang", "arc", "ba", "bg", "bo", "ca", "cho", "cmn", "cs", "cv", "cy", "da", "de", "dsb", "dz", "egl", "egy", "el", "en", "enm", "eo", "es", "fa", "fi", "fo", "fr", "fy", "ga", "gd", "ghc", "gmh", "gmw-msc", "got", "he", "hi", "hrx", "hu", "hy", "id", "ii", "is", "it", "iu", "ja", "jbo", "ka", "kls", "ko", "kw", "la", "lb", "liv", "lt", "lv", "mdf", "mfe", "mic", "mk", "mns-nor", "ms", "mt", "mul", "my", "nan", "nci", "nl", "nn", "no", "nov", "nv", "pjt", "pl", "ps", "pt", "ro", "ru", "scn", "sco", "sga", "sh", "sl", "sq", "sv", "sw", "syc", "szl", "tg", "th", "tl", "tpw", "tr", "tyv", "ug", "uk", "vi", "vo", "wlm", "yi", "yrl", "yue", "zlw-mas" } --[=[ This should list the diphthongs of a language (in the form of Lua patterns), provided they do *NOT* contain semivowel symbols such as /j w ɰ ɥ/ or vowels with nonsyllabic diacritics such as /i̯ u̯/. For example, list /au/ or /aʊ/, but do not list /aw/ or /au̯/. The data in this table is used to count the number of syllables in a word. [[Module:syllables]] automatically knows how to correctly handle semivowel symbols and nonsyllabic diacritics. Any language listed here will automatically have categories of the form "LANG #-syllable words" generated. In addition, any language listed below under `langs_to_generate_syllable_count_categories` will also have such categories generated. NOTE: There are some additional languages that have these categories. For example: * Thai words have these categories added by [[Module:th-pron]].]=] data.diphthongs = { ["cs"] = { -- [[w:Czech phonology#Diphthongs]] "[aeo]u", }, ["de"] = { "a[ɪʊ]", "ɔ[ʏɪ]", }, ["en"] = { -- from [[Appendix:English pronunciation]] mostly, but /ʌɪ/ is from the OED "[aɑæeɛoɔʌ][ɪi]", "[ɑɒæo]e", "[əɐ]ʉ", "[aɒəoɔæ]ʊ", "æo", "[ɛeɪiɔʊʉ]ə", -- /iə/ is a diphthong in NZE, but a disyllabic sequence in GA. -- /ɪə/ is both a disyllabic sequence and a diphthong in old-fashioned RP. "[aʌ][ʊɪ]ə", -- May be a disyllabic sequence in some or all dialects? }, ["grc"] = { "[aeyo]i", "[ae]u", "[ɛɔa]ː[iu]", }, ["hrx"] = { "aɪ̯", "aʊ̯", "oɪ̯", "eʊ̯", }, ["is"] = { -- [[w:Icelandic phonology#Vowels]] "[aeɔœʏ]i", -- diphthongs as the module generates them "[ao]u", -- diphthongs as the module generates them "ø[iɪy]", -- additional forms that may occur; Wikipedia is oddly specific about the second element: ei and ai, but øɪ. }, ["it"] = { "[aeɛoɔu]i", "[aeɛioɔ]u", }, ["lb"] = { "[iu]ə", "[ɜoæɑ]ɪ", "[əæɑ]ʊ", }, ["lt"] = { "ɐɪ", "ɒʊ", "ɛɪ", "ɛʊ", "ʊɪ", "ɔɪ", "ɔʊ", -- Simple diphthongs (unstressed forms) "iɛ", "uɔ", -- Complex diphthongs "ɑˑɪ", "ɑˑʊ", "æˑɪ", "æˑʊ", "oˑɪ", -- Falling tone (acute) "ɐɪˑ", "ɒʊˑ", "ɛɪˑ", "ɛʊˑ", "ʊɪˑ", -- Rising tone (tilde) - lengthened second element -- Note: Mixed diphthongs (e.g., ɐlˑ, æˑn, ʊl, etc.) are omitted since they are inherently monosyllabic }, } --[=[ This should list any languages for which categories of the form "LANG #-syllable words", e.g. [[:Category:Russian 3-syllable words]], should be generated. Do not list languages here if they have an entry above under `data.diphthongs`; such languages are automatically added to this list.]=] local langs_to_generate_syllable_count_categories = list_to_set{ "ar", -- Arabic has diphthongs, but they are transcribed -- with semivowel symbols. "ary", -- Moroccan Arabic has diphthongs, but they are transcribed -- with semivowel symbols. "bg", -- Bulgarian has diphthongs with /j/ and marginally with /w/, -- but these are semivowels. "ca", -- Catalan has diphthongs, but they are generally transcribed using -- /w/ and /j/, so do not need to be listed (see [[w:Catalan language#Diphthongs and triphthongs]]. "eo", "es", -- Spanish has diphthongs, but they are transcribed with i̯ etc. "eu", -- Basque has dipthongs, but they are transcribed with i̯ and u̯. "fi", -- Finnish has diphthongs, but they are now automatically transcribed with -- the nonsyllabic diacritic "fr", -- French has diphthongs, but they are transcribed -- with semivowel symbols: [[w:French phonology#Glides and diphthongs]]. "hnn", "id", -- Indonesian has diphthongs, but they are transcribed with i̯ or /j/ etc. "ka", "kne", "kmr", "ku", "la", -- All diphthongs transcribed with e̯ or /j/ etc. "mk", "ms", -- Malay has diphthongs, but they are transcribed with i̯ or /j/ etc. "mt", -- Maltese has diphthongs, but they are transcribed -- with semivowel symbols. "pl", -- No diphthongs, properly speaking; sequences of a vowel and /w/ or /j/ though. "pt", -- Portuguese has diphthongs, but they are transcribed with i̯ or /j/ etc. "rsk", -- No diphthongs but there are sequences of vowel and /j/ or /w/. "ru", -- No diphthongs, properly speaking; sequences of a vowel and /j/ though. "sk", -- Slovak has rising diphthongs, /i̯e, i̯a, i̯u, u̯o/, which are probably always spelled with the nonsyllabic diacritic, so do not need to be listed. "sl", -- No diphthongs, properly speaking; sequences of a vowel, /j/ and /w/ though "sq", -- [[w:Albanian language#Vowels]] doesn't mention anything about diphthongs. "szy", -- All diphthongs are transcribed with /j/ or /w/ "tl", -- Tagalog has diphthongs, but they are transcribed with i̯ or /j/ etc "tsg", "ug", -- No diphthongs. } -- Also add languages listed under `data.diphthongs`. for langcode, _ in pairs(data.diphthongs) do langs_to_generate_syllable_count_categories[langcode] = true end data.langs_to_generate_syllable_count_categories = langs_to_generate_syllable_count_categories -- Languages to use the phonetic not phonemic notation to compute syllable counts. data.langs_to_use_phonetic_notation = list_to_set{ "bg", "es", "id", "la", "lt", "mk", "ms", "rsk", "ru", } -- Languages to use the phonetic or phonemic notation to compute syllable counts, whichever is available. data.langs_to_use_phonetic_or_phonemic_notation = list_to_set{ -- [[Module:is-IPA]] generates [...] but many manual pronuns use /.../. "is", } -- Non-standard or obsolete IPA symbols. data.nonstandard = { --[[ The following symbols consist of more than one character, so we can't put them in the line below. ]] "ɑ̢", "ɔ̗", "ɔ̖", "[?ƍσƺƪƞƛłščžǰǧǯẋⱻʚω∅ØȣᴀᴇⱻQKPT]" } -- See valid IPA characters at [[Module:IPA/data/symbols]]. data.phonemes = {} data.phonemes["dz"] = { "m", "n", "ŋ", "p", "t", "ʈ", "k", "pʰ", "tʰ", "ʈʰ", "kʰ", "t͡s", "t͡ɕ", "t͡sʰ", "t͡ɕʰ", "w", "s", "z", "ɬ", "l", "r", "ɕ", "ʑ", "j", "h", "ɑ", "e", "i", "o", "u", "ɑː", "eː", "ɛː", "iː", "oː", "øː", "uː", "yː", "ɑ˥", "e˥", "i˥", "o˥", "u˥", "ɑː˥", "eː˥", "ɛː˥", "iː˥", "oː˥", "øː˥", "uː˥", "yː˥", "m˥", "n˥", "ŋ˥", "p˥", "k˥", "k̚˥", "w˥", "l˥", "r˥", "ɕ˥", "j˥", ")˥", "ɑ˩", "e˩", "i˩", "o˩", "u˩", "ɑː˩", "eː˩", "ɛː˩", "iː˩", "oː˩", "øː˩", "uː˩", "yː˩", "m˩", "n˩", "ŋ˩", "p˩", "k˩", "k̚˩", "w˩", "l˩", "r˩", "ɕ˩", "j˩", ")˩", ".", ",", "-", } data.phonemes["eo"] = { "a", "b", "d", "d͡ʒ", "d͡z", "e", "f", "h", "i", "j", "k", "l", "m", "n", "o", "p", "r", "s", "t", "t͡s", "t͡ʃ", "u", "u̯", "v", "w", "x", "z", "ɡ", "ʃ", "ʒ", "ˈ", ".", " ", "-", "u̯", "i̯" } data.phonemes["hy"] = { "ɑ", "b", "ɡ", "d", "e", "z", "ə", "tʰ", "ʒ", "i", "l", "χ", "t͡s", "k", "h", "d͡z", "ʁ", "t͡ʃ", "m", "j", "n", "ʃ", "ɔ", "t͡ʃʰ", "p", "d͡ʒ", "r", "s", "v", "t", "ɾ", "t͡sʰ", "v", "pʰ", "kʰ", "o", "f", "ŋɡ", "ŋk", "ŋχ", "u", "œ", "ʏ", "ˈ", "ˌ", ".", " ", "ː", } data.phonemes["nl"] = { "m", "n", "ŋ", "p", "b", "t", "d", "k", "ɡ", "f", "v", "s", "z", "ʃ", "ʒ", "x", "ɣ", "ɦ", "ʋ", "l", "j", "r", "ɪ", "ʏ", "ɛ", "ə", "ɔ", "ɑ", "i", "iː", "y", "yː", "u", "uː", "eː", "øː", "oː", "ɛː", "œː", "ɔː", "aː", "ɛi̯", "œy̯", "ɔi̯", "ɑu̯", "ɑi̯", "iu̯", "yu̯", "ui̯", "eːu̯", "oːi̯", "aːi̯", "ˈ", "ˌ", ".", " ", "-", } data.phonemes["mt"] = { "m", "n", "p", "t", "k", "ʔ", "b", "d", "ɡ", "t͡s", "t͡ʃ", "d͡z", "d͡ʒ", "f", "s", "ʃ", "ħ", "v", "z", "ʒ", "ɣ", "l", "j", "w", "r", "ɪ", "ɛ", "ɔ", "a", "u", "ɛˤ", "ɔˤ", "aˤ", "əˤ", "ɛˤː", "ɔˤː", "aˤː", "əˤː", "ɪˤː", "iː", "ɪː", "ɛː", "ɔː", "aː", "uː", "ˈ", "ˌ", ".", " ", "‿", "-" } return data 9j3yfr5dzmr70htnh6pfy97jzb11aph मॉड्यूल:IPA/data/symbols 828 303057 487744 477490 2026-09-02T14:51:22Z SM7 6218 updating... 487744 Scribunto text/plain local data = {} --[=[ Valid IPA symbols. Currently almost all values of "title" and "link" keys are just the comments that were used in [[Module:IPA]]. The "link" fields should be checked (those that start with an uppercase letter are checked). ]=] --[=[ local phones = {} -- Vowels. phones["i"] = { close = true, front = true, unrounded = true, vowel = true, } phones["e"] = { ["close-mid"] = true, front = true, unrounded = true, vowel = true, } phones["ɛ"] = { ["open-mid"] = true, front = true, unrounded = true, vowel = true, } phones["æ"] = { ["near-open"] = true, front = true, unrounded = true, vowel = true, } phones["a"] = { open = true, front = true, unrounded = true, vowel = true, } phones["y"] = { close = true, front = true, rounded = true, vowel = true, } phones["ø"] = { ["close-mid"] = true, front = true, rounded = true, vowel = true, } phones["œ"] = { ["open-mid"] = true, front = true, rounded = true, vowel = true, } phones["ɶ"] = { open = true, front = true, rounded = true, vowel = true, } phones["ɪ"] = { ["near-close"] = true, ["near-front"] = true, unrounded = true, vowel = true, } phones["ʏ"] = { ["near-close"] = true, ["near-front"] = true, rounded = true, vowel = true, } phones["ɨ"] = { close = true, central = true, unrounded = true, vowel = true, } phones["ᵻ"] = { ["near-close"] = true, central = true, unrounded = true, vowel = true, } phones["ɘ"] = { ["close-mid"] = true, central = true, unrounded = true, vowel = true, } phones["ɜ"] = { ["open-mid"] = true, central = true, unrounded = true, vowel = true, } phones["ɝ"] = { rhotic = true, ["open-mid"] = true, central = true, unrounded = true, vowel = true, } phones["ə"] = { mid = true, central = true, vowel = true, } phones["ɚ"] = { rhotic = true, mid = true, central = true, vowel = true, } phones["ɐ"] = { ["near-open"] = true, central = true, vowel = true, } phones["ʉ"] = { close = true, central = true, rounded = true, vowel = true, } phones["ᵿ"] = { ["near-close"] = true, central = true, rounded = true, vowel = true, } phones["ɵ"] = { ["close-mid"] = true, central = true, rounded = true, vowel = true, } phones["ɞ"] = { ["open-mid"] = true, central = true, rounded = true, vowel = true, } phones["ʊ"] = { ["near-close"] = true, ["near-back"] = true, rounded = true, vowel = true, } phones["ɯ"] = { close = true, back = true, unrounded = true, vowel = true, } phones["ɤ"] = { ["close-mid"] = true, back = true, unrounded = true, vowel = true, } phones["ʌ"] = { ["open-mid"] = true, back = true, unrounded = true, vowel = true, } phones["ɑ"] = { open = true, back = true, unrounded = true, vowel = true, } phones["u"] = { close = true, back = true, rounded = true, vowel = true, } phones["o"] = { ["close-mid"] = true, back = true, rounded = true, vowel = true, } phones["ɔ"] = { ["open-mid"] = true, back = true, rounded = true, vowel = true, } phones["ɒ"] = { open = true, back = true, rounded = true, vowel = true, } -- Nasals. phones["m"] = { voiced = true, bilabial = true, nasal = true, } phones["ɱ"] = { voiced = true, labiodental = true, nasal = true, } phones["n"] = { voiced = true, alveolar = true, nasal = true, } phones["ɳ"] = { voiced = true, retroflex = true, nasal = true, } phones["ɲ"] = { voiced = true, palatal = true, nasal = true, } phones["ŋ"] = { voiced = true, velar = true, nasal = true, } phones["𝼇"] = { voiced = true, velodorsal = true, nasal = true, } phones["ɴ"] = { voiced = true, uvular = true, nasal = true, } -- Plosives. phones["p"] = { voiceless = true, bilabial = true, plosive = true, } phones["b"] = { voiced = true, bilabial = true, plosive = true, } phones["t"] = { voiceless = true, alveolar = true, plosive = true, } phones["d"] = { voiced = true, alveolar = true, plosive = true, } phones["ʈ"] = { voiceless = true, retroflex = true, plosive = true, } phones["ɖ"] = { voiced = true, retroflex = true, plosive = true, } phones["c"] = { voiceless = true, palatal = true, plosive = true, } phones["ɟ"] = { voiced = true, palatal = true, plosive = true, } phones["k"] = { voiceless = true, velar = true, plosive = true, } phones["ɡ"] = { voiced = true, velar = true, plosive = true, } phones["𝼃"] = { voiceless = true, velodorsal = true, plosive = true, } phones["𝼁"] = { voiced = true, velodorsal = true, plosive = true, } phones["q"] = { voiceless = true, uvular = true, plosive = true, } phones["ɢ"] = { voiced = true, uvular = true, plosive = true, } phones["ꞯ"] = { voiceless = true, ["upper-pharyngeal"] = true, plosive = true, } phones["𝼂"] = { voiced = true, ["upper-pharyngeal"] = true, plosive = true, } phones["ʡ"] = { epiglottal = true, plosive = true, } phones["ʔ"] = { glottal = true, plosive = true, } -- Fricatives. phones["ɸ"] = { voiceless = true, bilabial = true, fricative = true, } phones["β"] = { voiced = true, bilabial = true, fricative = true, } phones["ʍ"] = { voiceless = true, ["labial-velar"] = true, fricative = true, } phones["f"] = { voiceless = true, labiodental = true, fricative = true, } phones["v"] = { voiced = true, labiodental = true, fricative = true, } phones["θ"] = { voiceless = true, dental = true, ["non-sibilant"] = true, fricative = true, } phones["ð"] = { voiced = true, dental = true, ["non-sibilant"] = true, fricative = true, } phones["s"] = { voiceless = true, alveolar = true, sibilant = true, fricative = true, } phones["z"] = { voiced = true, alveolar = true, sibilant = true, fricative = true, } phones["ɬ"] = { voiceless = true, alveolar = true, lateral = true, fricative = true, } phones["ɮ"] = { voiced = true, alveolar = true, lateral = true, fricative = true, } phones["ʃ"] = { voiceless = true, postalveolar = true, sibilant = true, fricative = true, } phones["ʒ"] = { voiced = true, postalveolar = true, sibilant = true, fricative = true, } phones["ʂ"] = { voiceless = true, retroflex = true, sibilant = true, fricative = true, } phones["ʐ"] = { voiced = true, retroflex = true, sibilant = true, fricative = true, } phones["ꞎ"] = { voiceless = true, retroflex = true, lateral = true, fricative = true, } phones["𝼅"] = { voiced = true, retroflex = true, lateral = true, fricative = true, } phones["ɕ"] = { voiceless = true, ["alveolo-palatal"] = true, sibilant = true, fricative = true, } phones["ʑ"] = { voiced = true, ["alveolo-palatal"] = true, sibilant = true, fricative = true, } phones["ç"] = { voiceless = true, palatal = true, fricative = true, } phones["ʝ"] = { voiced = true, palatal = true, fricative = true, } phones["𝼆"] = { voiceless = true, palatal = true, lateral = true, fricative = true, } phones["ɧ"] = { voiceless = true, ["palatal-velar"] = true, fricative = true, } phones["x"] = { voiceless = true, velar = true, fricative = true, } phones["ɣ"] = { voiced = true, velar = true, fricative = true, } phones["𝼄"] = { voiceless = true, velar = true, lateral = true, fricative = true, } phones["ʩ"] = { voiceless = true, velopharyngeal = true, fricative = true, } phones["χ"] = { voiceless = true, uvular = true, fricative = true, } phones["ʁ"] = { voiced = true, uvular = true, fricative = true, } phones["ħ"] = { voiceless = true, pharyngeal = true, fricative = true, } phones["ʕ"] = { voiced = true, pharyngeal = true, fricative = true, } phones["ʜ"] = { voiceless = true, epiglottal = true, fricative = true, } phones["ʢ"] = { voiced = true, epiglottal = true, fricative = true, } phones["h"] = { voiceless = true, glottal = true, fricative = true, } phones["ɦ"] = { voiced = true, glottal = true, fricative = true, } -- Approximants. phones["ʋ"] = { voiced = true, labiodental = true, approximant = true, } phones["ɥ"] = { voiced = true, ["labial–palatal"] = true, approximant = true, } phones["w"] = { voiced = true, ["labial–velar"] = true, approximant = true, } phones["ɹ"] = { voiced = true, alveolar = true, approximant = true, } phones["ꭨ"] = { ["velarized or pharyngealized"] = true, voiced = true, alveolar = true, approximant = true, } phones["l"] = { voiced = true, alveolar = true, lateral = true, approximant = true, } phones["ɫ"] = { ["velarized or pharyngealized"] = true, voiced = true, alveolar = true, lateral = true, approximant = true, } phones["ɻ"] = { voiced = true, retroflex = true, approximant = true, } phones["ɭ"] = { voiced = true, retroflex = true, lateral = true, approximant = true, } phones["j"] = { voiced = true, palatal = true, approximant = true, } phones["ʎ"] = { voiced = true, palatal = true, lateral = true, approximant = true, } phones["ɰ"] = { voiced = true, velar = true, approximant = true, } phones["ʟ"] = { voiced = true, velar = true, lateral = true, approximant = true, } -- Flaps. phones["ⱱ"] = { voiced = true, labiodental = true, flap = true, } phones["ɾ"] = { voiced = true, alveolar = true, flap = true, } phones["ɺ"] = { voiced = true, alveolar = true, lateral = true, flap = true, } phones["ɽ"] = { voiced = true, retroflex = true, flap = true, } phones["𝼈"] = { voiced = true, retroflex = true, lateral = true, flap = true, } -- Trills. phones["ʙ"] = { voiced = true, bilabial = true, trill = true, } phones["r"] = { voiced = true, alveolar = true, trill = true, } phones["𝼀"] = { voiceless = true, velopharyngeal = true, trill = true, } phones["ʀ"] = { voiced = true, uvular = true, trill = true, } phones["ᴙ"] = { voiced = true, pharyngeal = true, trill = true, } -- Clicks. phones["ʘ"] = { bilabial = true, click = true, } phones["ǀ"] = { dental = true, click = true, } phones["ǃ"] = { alveolar = true, click = true, } phones["𝼊"] = { retroflex = true, click = true, } phones["ǂ"] = { palatal = true, click = true, } phones["ʞ"] = { velar = true, click = true, } phones["ǁ"] = { lateral = true, click = true, } -- Implosives. phones["ɓ"] = { voiced = true, bilabial = true, implosive = true, } phones["ɗ"] = { voiced = true, alveolar = true, implosive = true, } phones["ᶑ"] = { voiced = true, retroflex = true, implosive = true, } phones["ʄ"] = { voiced = true, palatal = true, implosive = true, } phones["ɠ"] = { voiced = true, velar = true, implosive = true, } phones["ʛ"] = { voiced = true, uvular = true, implosive = true, } -- Percussives. phones["ʬ"] = { bilabial = true, percussive = true, } phones["ʭ"] = { bidental = true, percussive = true, } phones["¡"] = { sublaminal = true, ["lower-alveolar"] = true, percussive = true, } ]=] local u = require("Module:string/char") data[1] = { -- PULMONIC CONSONANTS -- nasal ["m"] = { title = "bilabial nasal", link = "w:Bilabial nasal", }, ["ɱ"] = { title = "labiodental nasal", link = "w:Labiodental nasal", }, ["n"] = { title = "alveolar nasal", link = "w:Alveolar nasal", }, ["ɳ"] = { title = "retroflex nasal", link = "w:Retroflex nasal", }, ["ɲ"] = { title = "palatal nasal", link = "w:Palatal nasal", }, ["ŋ"] = { title = "velar nasal", link = "w:Velar nasal", }, ["ɴ"] = { title = "uvular nasal", link = "w:Uvular nasal", }, -- plosive ["p"] = { title = "voiceless bilabial plosive", link = "w:Voiceless bilabial stop", }, ["b"] = { title = "voiced bilabial plosive", link = "w:Voiced bilabial stop", }, ["t"] = { title = "voiceless alveolar plosive", link = "w:Voiceless alveolar stop", }, ["d"] = { title = "voiced alveolar plosive", link = "w:Voiced alveolar stop", }, ["ʈ"] = { title = "voiceless retroflex plosive", link = "w:Voiceless retroflex stop", }, ["ɖ"] = { title = "voiced retroflex plosive", link = "w:Voiced retroflex stop", }, ["c"] = { title = "voiceless palatal plosive", link = "w:Voiceless palatal stop", }, ["ɟ"] = { title = "voiced palatal plosive", link = "w:Voiced palatal stop", }, ["k"] = { title = "voiceless velar plosive", link = "w:Voiceless velar stop", }, ["ɡ"] = { title = "voiced velar plosive", link = "w:Voiced velar stop", }, ["q"] = { title = "voiceless uvular plosive", link = "w:Voiceless uvular stop", }, ["ɢ"] = { title = "voiced uvular plosive", link = "w:Voiced uvular stop", }, ["ʡ"] = { title = "epiglottal plosive", link = "w:Epiglottal stop", }, ["ʔ"] = { title = "glottal stop", link = "w:Glottal stop", }, -- fricative ["ɸ"] = { title = "voiceless bilabial fricative", link = "w:Voiceless bilabial fricative", }, ["β"] = { title = "voiced bilabial fricative", link = "w:Voiced bilabial fricative", }, ["f"] = { title = "voiceless labiodental fricative", link = "w:Voiceless labiodental fricative", }, ["v"] = { title = "voiced labiodental fricative", link = "w:Voiced labiodental fricative", }, ["θ"] = { title = "voiceless dental fricative", link = "w:Voiceless dental fricative", }, ["ð"] = { title = "voiced dental fricative", link = "w:Voiced dental fricative", }, ["s"] = { title = "voiceless alveolar fricative", link = "w:Voiceless alveolar fricative", }, ["z"] = { title = "voiced alveolar fricative", link = "w:Voiced alveolar fricative", }, ["ʃ"] = { title = "voiceless postalveolar fricative", link = "w:Voiceless palato-alveolar sibilant", }, ["ʒ"] = { title = "voiced postalveolar fricative", link = "w:Voiced palato-alveolar sibilant", }, ["ʂ"] = { title = "voiceless retroflex fricative", link = "w:Voiceless retroflex sibilant", }, ["ʐ"] = { title = "voiced retroflex fricative", link = "w:Voiced retroflex sibilant", }, ["ɕ"] = { title = "voiceless alveolo-palatal fricative", link = "w:Voiceless alveolo-palatal sibilant", }, ["ʑ"] = { title = "voiced alveolo-palatal fricative", link = "w:Voiced alveolo-palatal sibilant", }, ["ç"] = { title = "voiceless palatal fricative", link = "w:Voiceless palatal fricative", }, ["ʝ"] = { title = "voiced palatal fricative", link = "w:Voiced palatal fricative", }, ["x"] = { title = "voiceless velar fricative", link = "w:Voiceless velar fricative", }, ["ɣ"] = { title = "voiced velar fricative", link = "w:Voiced velar fricative", }, ["χ"] = { title = "voiceless uvular fricative", link = "w:Voiceless uvular fricative", }, ["ʁ"] = { title = "voiced uvular fricative", link = "w:Voiced uvular fricative", }, ["ħ"] = { title = "voiceless pharyngeal fricative", link = "w:Voiceless pharyngeal fricative", }, ["ʕ"] = { title = "voiced pharyngeal fricative", link = "w:Voiced pharyngeal fricative", }, ["ʜ"] = { title = "voiceless epiglottal fricative", link = "w:Voiceless epiglottal fricative", }, ["ʢ"] = { title = "voiced epiglottal fricative", link = "w:Voiced epiglottal fricative", }, ["h"] = { title = "voiceless glottal fricative", link = "w:Voiceless glottal fricative", }, ["ɦ"] = { title = "voiced glottal fricative", link = "w:Voiced glottal fricative", }, -- approximant ["ʋ"] = { title = "labiodental approximant", link = "w:Labiodental approximant", }, ["ɹ"] = { title = "alveolar approximant", link = "w:Alveolar approximant", }, ["ɻ"] = { title = "retroflex approximant", link = "w:Retroflex approximant", }, ["j"] = { title = "palatal approximant", link = "w:Palatal approximant", }, ["ɰ"] = { title = "velar approximant", link = "w:Velar approximant", }, -- tap, flap ["ⱱ"] = { title = "labiodental tap", link = "w:Labiodental flap", }, ["ɾ"] = { title = "alveolar flap", link = "w:Alveolar flap", }, ["ɽ"] = { title = "retroflex flap", link = "w:Retroflex flap", }, -- trill ["ʙ"] = { title = "bilabial trill", link = "w:Bilabial trill", }, ["r"] = { title = "alveolar trill", link = "w:Alveolar trill", }, ["ʀ"] = { title = "uvular trill", link = "w:Uvular trill", }, ["ᴙ"] = { title = "epiglottal trill", link = "w:Epiglottal trill", }, -- lateral fricative ["ɬ"] = { title = "voiceless alveolar lateral fricative", link = "w:Voiceless alveolar lateral fricative", }, ["ɮ"] = { title = "voiced alveolar lateral fricative", link = "w:Voiced alveolar lateral fricative", }, -- no precomposed Unicode character --TOMOVE --["ɬ̢"] = {title = "voiceless retroflex lateral fricative", link = "w:voiceless retroflex lateral fricative"}, -- no precomposed Unicode character --TOMOVE:3 --["ʎ̝̊"] = {title = "voiceless palatal lateral fricative", link = "w:voiceless palatal lateral fricative"}, -- no precomposed Unicode character --TOMOVE:3 --["ʟ̝̊"] = {title = "voiceless velar lateral fricative", link = "w:voiceless velar lateral fricative"}, -- no precomposed Unicode character --TOMOVE --["ʟ̝"] = {title = "voiced velar lateral fricative", link = "w:voiced velar lateral fricative"}, -- lateral approximant ["l"] = { title = "alveolar lateral approximant", link = "w:Alveolar lateral approximant", }, ["ɭ"] = { title = "retroflex lateral approximant", link = "w:Retroflex lateral approximant", }, ["ʎ"] = { title = "palatal lateral approximant", link = "w:Palatal lateral approximant", }, ["ʟ"] = { title = "velar lateral approximant", link = "w:Velar lateral approximant", }, -- lateral flap ["ɺ"] = { title = "alveolar lateral flap", link = "w:Alveolar lateral flap", }, --["ɭ̆"] = {title = "retroflex lateral flap", link = "w:retroflex lateral flap"}, -- no precomposed Unicode character --TOMOVE --["ɺ˞"] = {title = "retroflex lateral flap", link = "w:retroflex lateral flap"}, -- no precomposed Unicode character --TOMOVE -- NON-PULMONIC CONSONANTS -- clicks ["ʘ"] = { title = "bilabial click", link = "w:Bilabial clicks", }, ["ǀ"] = { title = "dental click", link = "w:Dental clicks", }, ["ǃ"] = { title = "postalveolar click", link = "w:Alveolar clicks", }, ["𝼊"] = { title = "subapical retroflex", link = "w:Retroflex clicks", }, -- NOT IN X-SAMPA ["ǂ"] = { title = "palatal click", link = "w:Palatal clicks", }, ["ǁ"] = { title = "alveolar lateral click", link = "w:Lateral clicks", }, -- implosives ["ɓ"] = { title = "voiced bilabial implosive", link = "w:Voiced bilabial implosive", }, ["ɗ"] = { title = "voiced alveolar implosive", link = "w:Voiced alveolar implosive", }, -- NOT IN X-SAMPA ["ᶑ"] = { title = "retroflex implosive", link = "w:Voiced retroflex implosive", }, ["ʄ"] = { title = "voiced palatal implosive", link = "w:Voiced palatal implosive", }, ["ɠ"] = { title = "voiced velar implosive", link = "w:Voiced velar implosive", }, ["ʛ"] = { title = "voiced uvular implosive", link = "w:Voiced uvular implosive", }, -- ejectives ["ʼ"] = { title = "ejective", link = "w:Ejective consonant", }, -- CO-ARTICULATED CONSONANTS ["ʍ"] = { title = "voiceless labial-velar fricative", link = "w:Voiceless labio-velar approximant", }, ["w"] = { title = "labial-velar approximant", link = "w:Labio-velar approximant", }, ["ɥ"] = { title = "labial-palatal approximant", link = "w:Labialized palatal approximant", }, ["ɧ"] = { title = "voiceless palatal-velar fricative", link = "w:Sj-sound", }, -- should be handled in [[Module:IPA]] and not through this table -- BRACKETS --[[ -- ["//"] = { title = "morphophonemic", link = "w:morphophonemic", }, ["/"] = { title = "phonemic", link = "w:phonemic", }, ["["] = { title = "phonetic", link = "w:phonetic", }, ["["] = { title = "phonetic", link = "w:phonetic", }, ["〈"] = { title = "orthographic", link = "w:orthographic", }, ["〉"] = { title = "orthographic", link = "w:orthographic", }, ["⟨"] = { title = "orthographic", link = "w:orthographic", }, ["⟩"] = { title = "orthographic", link = "w:orthographic", }, ]] -- VOWELS -- close ["i"] = { title = "close front unrounded vowel", link = "w:Close front unrounded vowel", }, ["y"] = { title = "close front rounded vowel", link = "w:Close front rounded vowel", }, ["ɨ"] = { title = "close central unrounded vowel", link = "w:Close central unrounded vowel", }, ["ʉ"] = { title = "close central rounded vowel", link = "w:Close central rounded vowel", }, ["ɯ"] = { title = "close back unrounded vowel", link = "w:Close back unrounded vowel", }, ["u"] = { title = "close back rounded vowel", link = "w:Close back rounded vowel", }, -- near close ["ɪ"] = { title = "near-close near-front unrounded vowel", link = "w:Near-close near-front unrounded vowel", }, ["ʏ"] = { title = "near-close near-front rounded vowel", link = "w:Near-close near-front rounded vowel", }, ["ᵻ"] = { title = "near-close central unrounded vowel", link = "w:Near-close central unrounded vowel", }, -- (alternative) --TOMOVE --[[ ["ɪ̈"] = { title = "near-close central unrounded vowel", link = "w:near-close central unrounded vowel", }, ]] ["ᵿ"] = { title = "near-close central rounded vowel", link = "w:Near-close central rounded vowel", }, --[[ (alternative) TOMOVE ["ʊ̈"] = { title = "near-close central rounded vowel", link = "w:near-close central rounded vowel", }, ]] ["ʊ"] = { title = "near-close near-back rounded vowel", link = "w:Near-close near-back rounded vowel", }, --close mid ["e"] = { title = "close-mid front unrounded vowel", link = "w:Close-mid front unrounded vowel", }, ["ø"] = { title = "close-mid front rounded vowel", link = "w:Close-mid front rounded vowel", }, ["ɘ"] = { title = "close-mid central unrounded vowel", link = "w:Close-mid central unrounded vowel", }, ["ɵ"] = { title = "close-mid central rounded vowel", link = "w:Close-mid central rounded vowel", }, ["ɤ"] = { title = "close-mid back unrounded vowel", link = "w:Close-mid back unrounded vowel", }, ["o"] = { title = "close-mid back rounded vowel", link = "w:Close-mid back rounded vowel", }, -- mid ["ə"] = { title = "schwa", link = "w:Schwa", }, ["ɚ"] = { title = "schwa+r", link = "w:R-colored vowel", }, -- open mid ["ɛ"] = { title = "open-mid front unrounded vowel", link = "w:Open-mid front unrounded vowel", }, ["œ"] = { title = "open-mid front rounded vowel", link = "w:Open-mid front rounded vowel", }, ["ɜ"] = { title = "open-mid central unrounded vowel", link = "w:Open-mid central unrounded vowel", }, ["ɝ"] = { title = "open-mid central unrounded vowel+r", link = "w:R-colored vowel", }, ["ɞ"] = { title = "open-mid central rounded vowel", link = "w:Open-mid central rounded vowel", }, ["ʌ"] = { title = "open-mid back unrounded vowel", link = "w:Open-mid back unrounded vowel", }, ["ɔ"] = { title = "open-mid back rounded vowel", link = "w:Open-mid back rounded vowel", }, -- near open ["æ"] = { title = "near-open front unrounded vowel", link = "w:Near-open front unrounded vowel", }, ["ɐ"] = { title = "near-open central vowel", link = "w:Near-open central vowel", }, -- open ["a"] = { title = "open front unrounded vowel", link = "w:Open front unrounded vowel", }, ["ɶ"] = { title = "open front rounded vowel", link = "w:Open front rounded vowel", }, ["ɑ"] = { title = "open back unrounded vowel", link = "w:Open back unrounded vowel", }, ["ɒ"] = { title = "open back rounded vowel", link = "w:Open back rounded vowel", }, -- SUPRASEGMENTALS ["ˈ"] = {title = "primary stress", link = "w:Stress (linguistics)", XSAMPA = "\""}, --[[ ["???"] = { title = "extra stress: no Unicode char; double primary stress instead", link = "w:extra stress: no Unicode char; double primary stress instead", XSAMPA = "" }, --TOMOVE:3 ]] ["ˌ"] = { title = "secondary stress", link = "w:Secondary stress", }, ["ː"] = { title = "long", link = "w:Length (phonetics)", }, ["ˑ"] = { title = "half long", link = "w:Length (phonetics)", }, ["̆"] = { title = "extra-short", link = "w:Length (phonetics)", }, --[[ ["%."] = { title = "syllable break", link = "w:syllable break", }, ]] --TOMOVE ["‿"] = { title = "linking mark (absence of a break)", link = "w:Tie (typography)#International_Phonetic_Alphabet", }, [" "] = { title = "separator", link = "w:separator", }, -- TONE -- level tones ["˥"] = { title = "top", link = "w:Tone letter", }, ["˦"] = { title = "high", link = "w:Tone letter", }, ["˧"] = { title = "mid", link = "w:Tone letter", }, ["˨"] = { title = "low", link = "w:Tone letter", }, ["˩"] = { title = "bottom", link = "w:Tone letter", }, ["̋"] = { title = "extra high tone", link = "w:Tone letter", }, ["́"] = { title = "high tone", link = "w:Tone letter", }, ["̄"] = { title = "mid tone", link = "w:Tone letter", }, ["̀"] = { title = "low tone", link = "w:Tone letter", }, ["̏"] = { title = "extra low tone", link = "w:Tone letter", }, -- tone terracing ["ꜛ"] = { title = "upstep", link = "w:Upstep", }, ["ꜜ"] = { title = "downstep", link = "w:Downstep", }, -- contour tones ["̌"] = { title = "rising tone", link = "w:Tone (linguistics)", }, ["̂"] = { title = "falling tone", link = "w:Tone (linguistics)", }, ["᷄"] = { title = "high rising tone", link = "w:Tone (linguistics)", }, ["᷅"] = { title = "low rising tone", link = "w:Tone (linguistics)", }, ["᷇"] = { title = "high falling tone", link = "w:Tone (linguistics)", }, ["᷆"] = { title = "low falling tone", link = "w:Tone (linguistics)", }, ["᷈"] = { title = "rising falling tone (peaking)", link = "w:Tone (linguistics)", }, ["᷉"] = { title = "dipping", link = "w:Tone (linguistics)", }, -- [extrapolated from the chart -- please confirm] -- intonation ["|"] = { title = "minor (foot) group", link = "w:Prosodic unit", }, ["‖"] = { title = "major (intonation) group", link = "w:Prosodic unit", }, ["↗"] = { title = "global rise", link = "w:Intonation (linguistics)", }, ["↘"] = { title = "global fall", link = "w:Intonation (linguistics)", }, -- DIACRITICS -- syllabicity & releases ["̩"] = { title = "syllabi ", link = "w:Syllabic consonant", withdescender = "̍" }, -- (or "_=" ["̯"] = { title = "non-syllabic", link = "w:Semivowel", withdescender = "̑" }, ["ʰ"] = { title = "aspirated", link = "w:Aspirated consonant", }, ["ⁿ"] = { title = "nasal release", link = "w:Nasal release", }, ["ˡ"] = { title = "lateral release", link = "w:Lateral release (phonetics)", }, ["̚"] = { title = "no audible release", link = "w:No audible release", }, -- phonation ["̥"] = { title = "voiceless", link = "w:Voicelessness", withdescender = "̊" }, ["̬"] = { title = "voiced", link = "w:Voice (phonetics)", }, ["̤"] = { title = "breathy voice", link = "w:Breathy voice", }, ["̰"] = { title = "creaky voice", link = "w:Creaky voice", }, ["᷽"] = { title = "strident", link = "w:Strident vowel", }, -- primary articulation ["̪"] = { title = "dental", link = "w:Dental consonant", }, ["̺"] = { title = "apical", link = "w:Apical consonant", }, ["̻"] = { title = "laminal", link = "w:Laminal consonant", }, ["̟"] = { title = "advanced", link = "w:Relative articulation#Advanced_and_retracted", withdescender = "˖" }, ["̠"] = { title = "retracted", link = "w:Relative articulation#Retracted", withdescender = "˗" }, ["̼"] = { title = "linguolabial", link = "w:Linguolabial consonant", }, ["̈"] = { title = "centralized", link = "w:Relative articulation#Centralized_vowels", XSAMPA = "_\"" }, ["̽"] = { title = "mid-centralized", link = "Relative articulation#Mid-centralized_vowel", }, ["̞"] = { title = "lowered", link = "w:Relative articulation#Raised_and_lowered", withdescender = "˕" }, ["̝"] = { title = "raised", link = "w:Relative articulation#Raised_and_lowered", withdescender = "˔" }, ["͡"] = { title = "coarticulated", link = "w:Co-articulated consonant", }, ["͈"] = { title = "strong articulation", link = "w:Fortis and lenis", }, -- secondary articulation ["ʷ"] = { title = "labialized", link = "w:Labialization", }, ["ʲ"] = { title = "palatalized", link = "w:Palatalization (phonetics)", }, ["ˠ"] = { title = "velarized", link = "w:Velarization", }, ["ˤ"] = { title = "pharyngealized", link = "w:Pharyngealization", }, -- also see _e ["ɫ"] = { title = "velarized alveolar lateral approximant", link = "w:Alveolar lateral approximant", }, ["̴"] = { title = "velarized or pharyngealized; also see 5", link = "w:Velarization", }, ["̹"] = { title = "more rounded", link = "w:Roundedness", }, ["̜"] = { title = "less rounded", link = "w:Roundedness", }, ["̃"] = { title = "nasalization", link = "w:Nasalization", }, ["˞"] = { title = "rhotacization in vowels, retroflexion in consonants", link = "w:R-colored vowel", }, ["̘"] = { title = "advanced tongue root", link = "w:Advanced and retracted tongue root", }, ["̙"] = { title = "retracted tongue root", link = "w:Advanced and retracted tongue root", }, } data[2] = { -- TODO --["%("] = {}, --["%)"] = {}, ["ːː"] = { title = "extra long", link = "w:Length (phonetics)", }, ["r̥"] = {title = "voiceless alveolar trill", link = "w:Voiceless alveolar trill"}, ["ɬ’"] = {title = "alveolar lateral ejective fricative", link = "w:Alveolar lateral ejective fricative"}, } data[3] = { ["t͡s"] = {title = "voiceless alveolar sibilant affricate", link = "w:Voiceless alveolar affricate"}, ["d͡z"] = {title = "voiced alveolar sibilant affricate", link = "w:Voiced alveolar affricate"}, ["t͡ʃ"] = {title = "voiceless palato-alveolar affricate", link = "w:Voiceless palato-alveolar affricate", descender = true}, ["d͡ʒ"] = {title = "voiced palato-alveolar affricate", link = "w:Voiced palato-alveolar affricate"}, ["ʈ͡ʂ"] = {title = "voiceless retroflex affricate", link = "w:Voiceless retroflex affricate", descender = true}, ["ɖ͡ʐ"] = {title = "voiced retroflex affricate", link = "w:Voiced retroflex affricate, descender = true"}, ["t͡ɕ"] = {title = "voiceless alveolo-palatal affricate", link = "w:Voiceless alveolo-palatal affricate"}, ["d͡ʑ"] = {title = "voiced alveolo-palatal affricate", link = "w:Voiced alveolo-palatal affricate"}, ["c͡ç"] = {title = "voiceless palatal affricate", link = "w:Voiceless palatal affricate, descender = true"}, ["ɟ͡ʝ"] = {title = "voiced palatal affricate", link = "w:Voiced palatal affricate, descender = true"}, ["k͡x"] = {title = "voiceless velar affricate", link = "w:Voiceless velar affricate"}, ["ɡ͡ɣ"] = {title = "voiced velar affricate", link = "w:Voiced velar affricate, descender = true"}, } data[4] = { ["ǃ͡qʼ"] = {title = "alveolar linguo-glottalic stop", link = "w:Ejective-contour clicks, descender = true"}, ["ǁ͡χʼ"] = {title = "lateral linguo-glottalic affricate (homorganic)", link = "w:Ejective-contour clicks", descender = true}, } data[5] = { ["k͡ʟ̝̊"] = {title = "voiceless velar lateral affricate", link = "w:Voiceless velar lateral affricate"}, ["ᶢǀ͡qʼ"] = {title = "voiced dental linguo-glottalic stop", link = "w:Ejective-contour clicks"}, ["ǂ͡kxʼ"] = {title = "palatal linguo-glottalic affricate (heterorganic)", link = "w:Ejective-contour clicks"}, } data[6] = { ["k͡ʟ̝̊ʼ"] = {title = "velar lateral ejective affricate", link = "w:Velar lateral ejective affricate"}, ["ᶢʘ͡kxʼ"] = {title = "voiced labial linguo-glottalic affricate", link = "w:Ejective-contour clicks"}, } data.separator_escapes = { ["⁽"] = "(", ["⁾"] = ")", ["₍"] = "(", ["₎"] = ")", ["ˈ"] = "\1", ["ˌ"] = "\2", ["ː"] = ":", ["ˑ"] = ";", } -- acute and grave tone marks local diacritics = u( -- grave, acute, circumflex, tilde, macron, breve 0x300, 0x301, 0x302, 0x303, 0x304, 0x306, -- diaeresis, ring above, double acute, caron, vertical line above, double grave, left tack 0x308, 0x30A, 0x30B, 0x30C, 0x30D, 0x30F, 0x318, -- right tack, left angle, left half ring below, up tack below, down tack below, plus sign below 0x319, 0x31A, 0x31C, 0x31D, 0x31E, 0x31F, -- minus sign below, rhotic hook below, dot below, diaeresis below, ring below, vertical line below, bridge below 0x320, 0x322, 0x323, 0x324, 0x325, 0x329, 0x32A, -- caron below, inverted breve below 0x32C, 0x32F, -- tilde below, combining tilde overlay, right half ring below, inverted bridge below, square below, seagull below, x above 0x330, 0x334, 0x339, 0x33A, 0x33B, 0x33C, 0x33D, -- grave tone mark, acute tone mark, bridge above, equals sign below, double vertical line below 0x340, 0x341, 0x346, 0x347, 0x348, -- left angle below, not tilde above, homothetic above, almost equal above, left right arrow below 0x349, 0x34A, 0x34B, 0x34C, 0x34D, -- upwards arrow below, left arrowhead below, right arrowhead below 0x34E, 0x354, 0x355, -- double rightwards arrow below, combining Latin small letter a 0x362, 0x361, -- macron–acute, grave–macron, macron–grave, acute–macron, grave–acute–grave, acute–grave–acute 0x1DC4, 0x1DC5, 0x1DC6, 0x1DC7, 0x1DC8, 0x1DC9) data.diacritics = diacritics data.vowels = "iyɨʉɯuɪᵻʏʊᵿeøɘɵɤoəɚɛœɜɝɞʌɔæɐaɶɑɒäëïöüÿ" local tones = "˥˦˧˨˩꜒꜓꜔꜕꜖꜈꜉꜊꜋꜌꜍꜎꜏꜐꜑¹²³⁴⁵⁶⁷⁸⁹⁰" data.tones = tones local superscripts = u(0xA0) .. " ⁰¹²³⁴⁵⁶⁷⁸⁹ᵃ𐞃ᵄᵅᶛᵇ𐞄𐞅ᶜᶝᵈᶞ𐞋𐞌𐞍ᵉᵊᵋ𐞎ᶟᵌ𐞏𐞑ᶠᶢ𐞒𐞓𐞔ˠʰ𐞕𐞖ʱ𐞗ⁱᶦᶤʲᶨᶡ𐞘ᵏˡᶫꭞ𐞛ᶩ𐞞𐞠𐞡ᵐᶬⁿᶰᶮᶯᵑᵒ𐞢ꟹ𐞣ᵓᶱᵖᶲ𐞥ʳ𐞪ʴ𐞦𐞧ʵ𐞨𐞩ʶˢᶳᶴᵗ𐞯ᵘᶶᶣᵚᶭᶷᵛᶹ𐞰ᶺʷꭩˣʸ𐞲ᶻᶼᶽᶾˀˤ𐞳𐞴𐞶𐞷𐞸𐞹𐞵ᵝᶿᵡ˞⁻𐞁𐞂" data.superscripts = superscripts -- An array of patterns of valid character sequences. data.valid = { "⁽[" .. superscripts .. "]+⁾", "[ %(%)%%<>{|}%-→~⁓%.◌abcdefhijklmnopqrstuvwxyz¡àáâãāăēäæçèéêëĕěħìíîïĩīĭĺḿǹńňðòóôõöōŏőœøŕùúûüũūŭűýÿŷŋ" .. "ǀǁǂǃǎǐǒǔřǖǘǚǜǟǣǽǿȁȅȉȍȕȫȭȳɐɑɒɓɔɕɖɗɘəɚɛɜɝɞɟɠɡɢɣɤɥɦɧɨɪᵻɫɬɭɮɯɰɱɲɳɴɵɶɸɹɺ𝼈ɻɽɾʀʁʂʃʄʈʉʊᵿʋṽʌʍʎ𝼆ʏʐʑʒʔʕʘʞʙʛʜʝʟʡʢ𝼊ʬʭ" .. "ʼˈˌːˑˣ˔˕ˬ͗˭ˇ˖β͜θχᴙᶑ᷽ḁḛḭḯṍṏṳṵṹṻạẹẽịọụỳỵỹ‖․‥…‿↑↓↗↘ⱱꜛꜜꟸ𝆏𝆑˗ˋˊ–⸨⸩⁽⁾" .. diacritics .. tones .. superscripts .. "]+" } -- Character sequences which are valid only in a particular language. -- These can be either a single pattern (as a string), or an array of patterns (as a table). data.per_lang_valid = { ["egy"] = "V+", -- V for uncertain vowel ["okm"] = "[LHR!WT]+", -- irregular verb morphophonemes } -- Characters to add VARIATION SELECTOR-15 (U+FE0E) after. -- These are characters with emoji variants that are used by default by some clients. -- Adding VS15 after them instructs them to draw the characters as text instead. data.add_vs15 = "↗↘" data.invalid = { ["!"] = "ǃ", ["ꜝ"] = "ꜜ", ["ꜞ"] = "ꜛ", ["ꜟ"] = "ꜛ", ["'"] = "ˈ", ["’"] = "ʼ", [":"] = "ː", -- Confusable Latin letters ["B"] = "ʙ", ["g"] = "ɡ", ["G"] = "ɢ", ["Ɠ"] = "ʛ", ["H"] = "ʜ", ["ı"] = "ɪ", ["I"] = "ɪ", ["L"] = "ʟ", ["N"] = "ɴ", ["Œ"] = "ɶ", ["Q"] = "ꞯ", ["R"] = "ʀ", ["∫"] = "ʃ", ["⨎"] = "ǂ", -- due to confusion with obsolete 𝼋 below ["ß"] = "β", ["ẞ"] = "β", ["Y"] = "ʏ", ["Ə"] = "ə", ["ǝ"] = "ə", ["Ɂ"] = "ʔ", ["ɂ"] = "ʔ", ["ˁ"] = "ˤ", -- Confusable Greek letters ["α"] = "ɑ", ["γ"] = "ɣ", ["δ"] = "ð", ["ε"] = "ɛ", ["Η"] = "ʜ", ["η"] = "ŋ", ["ι"] = "ɪ", ["λ"] = "ʎ", ["υ"] = "ʋ", ["Ψ"] = "𝼊", ["ψ"] = "𝼊", ["Φ"] = "ɸ", ["ϕ"] = "ɸ", ["ꭓ"] = "χ", -- Actually Latin, since IPA uses the Greek letter(!) -- Confusable Cyrillic letters ["ӕ"] = "æ", ["Ә"] = "ə", ["ә"] = "ə", ["В"] = "ʙ", ["в"] = "ʙ", ["е"] = "e", ["З"] = "ɜ", ["з"] = "ɜ", ["Ѕ"] = "s", ["ѕ"] = "s", ["і"] = "i", ["ј"] = "j", ["Н"] = "ʜ", ["н"] = "ʜ", ["О"] = "o", ["о"] = "o", ["р"] = "p", ["с"] = "c", ["у"] = "y", ["Ү"] = "ʏ", ["ү"] = "ʏ", ["Ф"] = "ɸ", ["ф"] = "ɸ", ["х"] = "x", ["Һ"] = "h", ["һ"] = "h", ["Я"] = "ᴙ", ["я"] = "ᴙ", ["Ѱ"] = "𝼊", ["ѱ"] = "𝼊", ["Ѵ"] = "ⱱ", ["ѵ"] = "ⱱ", ["Ҁ"] = "ʕ", ["ҁ"] = "ʕ", -- Palatalization ["ᶀ"] = "bʲ", ["ꞔ"] = "cʲ", ["ᶁ"] = "dʲ", ["ȡ"] = "d̠ʲ", ["d̂"] = "d̠ʲ", ["ᶂ"] = "fʲ", ["ᶃ"] = "ɡʲ", ["ꞕ"] = "hʲ", ["ᶄ"] = "kʲ", ["ᶅ"] = "lʲ", ["ȴ"] = "l̠ʲ", ["l̂"] = "l̠ʲ", ["𝼓"] = "ɬʲ", ["ᶆ"] = "mʲ", ["ᶇ"] = "nʲ", ["ȵ"] = "n̠ʲ", ["n̂"] = "n̠ʲ", ["𝼔"] = "ŋʲ", ["ᶈ"] = "pʲ", ["ᶉ"] = "rʲ", ["𝼕"] = "ɹʲ", ["𝼖"] = "ɾʲ", ["ᶊ"] = "sʲ", ["𝼞"] = "ɕ", ["𐞺"] = "ᶝ", ["ᶋ"] = "ʃʲ", ["ʆ"] = "ʃʲ", ["ƫ"] = "tʲ", ["ȶ"] = "t̠ʲ", ["t̂"] = "t̠ʲ", ["ᶌ"] = "vʲ", ["ᶍ"] = "xʲ", ["ᶎ"] = "zʲ", ["𝼘"] = "ʒʲ", ["ʓ"] = "ʒʲ", -- Retroflex ["𝼝"] = "ʈ͡ʂ", ["𝼥"] = "ɖ", ["𝼦"] = "ɭ", ["𝼧"] = "ɳ", ["𝼨"] = "ɽ", ["𝼩"] = "ʂ", ["𝼪"] = "ʈ", -- Rhotic vowels ["ᶏ"] = "a˞", ["ᶐ"] = "ɑ˞", ["ᶒ"] = "e˞", ["ə˞"] = "ɚ", ["ᶕ"] = "ɚ", ["ᶓ"] = "ɛ˞", ["ɜ˞"] = "ɝ", ["ᶔ"] = "ɝ", ["ᶖ"] = "i˞", ["𝼚"] = "ɨ˞", ["𝼛"] = "o˞", ["ᶗ"] = "ɔ˞", ["ᶙ"] = "u˞", -- Syllabic approximants ["ɿ"] = "ɹ̩", ["ʅ"] = "ɻ̩", ["ʮ"] = "ɹ̩ʷ", ["ʯ"] = "ɻ̩ʷ", -- Clicks ["ʗ"] = "ǃ", ["𝼋"] = "ǂ", ["ʇ"] = "ǀ", ["ʖ"] = "ǁ", ["‼"] = "𝼊", -- Voiceless implosives ["ƈ"] = "ʄ̊", ["ƙ"] = "ɠ̊", ["ƥ"] = "ɓ̥", ["ʠ"] = "ʛ̥", ["ƭ"] = "ɗ̥", ["𝼉"] = "ᶑ̥", -- Monographs ["ꜰ"] = "ɸ", ["ɩ"] = "ɪ", ["ɼ"] = "r̝", ["ᴜ"] = "ʊ", ["ɷ"] = "ʊ", ["𐞤"] = "ᶷ", ["ƛ"] = "t͡ɬ", ["ƻ"] = "d͡z", ["ƾ"] = "t͡s", -- Digraphs ["ȸ"] = "b̪", ["ʣ"] = "d͡z", ["ʥ"] = "d͡ʑ", ["ꭦ"] = "ɖ͡ʐ", ["ʤ"] = "d͡ʒ", ["𝼒"] = "d͡ʒʲ", ["𝼙"] = "d͡ᶚ", ["ʪ"] = "ɬ͡s", ["ʫ"] = "ɮ͡z", ["ȹ"] = "p̪", ["ʦ"] = "t͡s", ["ʨ"] = "t͡ɕ", ["ꭧ"] = "ʈ͡ʂ", ["ʧ"] = "t͡ʃ", ["𝼗"] = "t͡ʃʲ", ["𝼜"] = "t͡ᶘ", -- Deprecated or confusable diacritics ["̫"] = "ʷ", ["͂"] = "̃", ["᫇"] = "ʷ", ["⸋"] = "̚", ["̱"] = "̠", -- COMBINING MACRON BELOW (U+0331) -> COMBINING MINUS SIGN BELOW (U+0320) -- Precomposed characters with deprecated or confusable diacritics; the left is a precomposed -- version of a lowercase letter with COMBINING MACRON BELOW and the right is the equivalent -- using COMBINING MINUS SIGN BELOW ["ḇ"] = "b̠", ["ḏ"] = "d̠", ["ẖ"] = "h̠", ["ḵ"] = "k̠", ["ḻ"] = "l̠", ["ṉ"] = "n̠", ["ṟ"] = "r̠", ["ṯ"] = "t̠", ["ẕ"] = "z̠", } return data mjopki8sklky9m3kv63kzgka1usuiki मॉड्यूल:IPA/tracking 828 303058 487755 470049 2026-09-02T15:17:37Z SM7 6218 updating... 487755 Scribunto text/plain local export = {} --[[ symb is what is tracked. It can be a literal symbol or a Lua pattern. If it is a table, tracking is added for any of the symbols in the list. cat is the subtemplate that is added to the default path "IPA/" + language code + "/". ]] local U = require("Module:string/char") local syllabic = U(0x329) -- The validity of this table is checked by documentation function -- in [[Module:User:Erutuon/sandbox]]. export.tracking = { en = { { symb = "iə", cat = "ambig", }, { symb = { "ɪi", "ʊu", "ɪj", "ʊw" }, cat = "eeoo", }, { symb = { "r" }, cat = "plain r", }, }, cs = { { symb = "[mnrl]" .. syllabic, cat = "syllabic-consonant", }, }, ps = { { symb = "ɤ", cat = "Pashto", }, }, fa = { { symb = "ʔ", cat = "glottal-stop", }, }, { { symb = "", cat = "", }, }, } function export.run_tracking(IPA, lang) if not IPA or IPA == "" then return end lang = lang:getCode() if not export.tracking[lang] then return end for i, arguments in ipairs(export.tracking[lang]) do local symbols = arguments.symb local category = arguments.cat if type(symbols) == "string" then symbols = { symbols } end for _, symbol in pairs(symbols) do if mw.ustring.find(IPA, symbol) then require("Module:debug/track")("IPA/" .. lang .. "/" .. category) end end end end return export se04v8uivjuynpeoe4fnp0a4t96kccz मॉड्यूल:rhymes 828 304114 487753 475429 2026-09-02T15:13:10Z SM7 6218 updating... 487753 Scribunto text/plain local export = {} local force_cat = false -- for testing local rhymes_styles_css_module = "Module:rhymes/styles.css" local IPA_module = "Module:IPA" local parameters_module = "Module:parameters" local parameter_utilities_module = "Module:parameter utilities" local pron_qualifier_module = "Module:pron qualifier" local script_utilities_module = "Module:script utilities" local string_utilities_module = "Module:string utilities" local TemplateStyles_module = "Module:TemplateStyles" local utilities_module = "Module:utilities" local rhymes_data = require("Module:rhymes/data") local concat = table.concat local insert = table.insert local function rsplit(text, pattern) return require(string_utilities_module).split(text, pattern) end local function track(page) require("Module:debug/track")("तुकांत/" .. page) return true end local function tag_rhyme(rhyme, lang) local formatted_rhyme, cats, err formatted_rhyme, cats, err = require(IPA_module).format_IPA(lang, rhyme, "raw") return formatted_rhyme, cats, err end local function make_rhyme_link(lang, link_rhyme, display_rhyme) local retval, cats local prefix = "[[तुकांत:" if rhymes_data.link_to_category_langs[lang:getCode()] then prefix = "[[:श्रेणी:तुकांत:" end if not link_rhyme then retval = concat{prefix, lang:getCanonicalName(), "|", lang:getCanonicalName(), "]]"} cats = {} else local formatted_rhyme, err formatted_rhyme, cats, err = tag_rhyme(display_rhyme or link_rhyme, lang) retval = concat{prefix, lang:getCanonicalName(), "/", link_rhyme, "|", formatted_rhyme, "]]", err} end return retval, cats end --[==[ Implementation of {{tl|rhymes row}}. ]==] function export.show_row(frame) local args = require(parameters_module).process( frame.getParent and frame:getParent().args or frame, { [1] = {required = true, type = "full language"}, [2] = {required = true}, [3] = {}, } ) if not args[1] then return "[[Rhymes:English/aɪmz|<span class=\"IPA\">-aɪmz</span>]]" end -- Discard cleanup categories from make_rhyme_link(). return (make_rhyme_link(args[1], args[2], "-" .. args[2])) .. (args[3] and (" (''" .. args[3] .. "'')") or "") end do local function add_syllable_categories(categories, lang, rhyme, num_syl) local prefix = "तुकांत:" .. lang .. "/" .. rhyme insert(categories, prefix) if num_syl then for _, n in ipairs(num_syl) do local c if n > 1 then c = prefix .. "/" .. n .. " सिलेबल" else c = prefix .. "/1 सिलेबल" end insert(categories, c) end end end --[==[ Meant to be called from a module. `data` is a table containing the following fields: * `lang`: language object for the rhymes; * `rhymes`: a list of rhymes, each described by an object which specifies the rhyme, optional number of syllables, and optional left and right regular and accent qualifier fields: ** `rhyme`: the rhyme itself; ** `num_syl`: {nil} or a list of numbers, specifying the number of syllables of the word with this rhyme; optional and currently used only for categorization; if omitted, defaults to the top-level `num_syl`; ** `separator`: {nil} or the string used to separate this rhyme from the preceding one when displayed; defaults to the top-level `separator`; ** `q`: {nil} or a list of left regular qualifier strings, formatted using {format_qualifier()} in [[Module:qualifier]] and displayed directly before the rhyme in question; ** `qq`: {nil} or a list of right regular qualifier strings, displayed directly after the rhyme in question; ** `qualifiers`: {nil} or a list of qualifier strings; also displayed on the left; for compatibility purposes only, do not use in new code; ** `a`: {nil} or a list of left accent qualifier strings, formatted using {format_qualifiers()} in [[Module:accent qualifier]] and displayed directly before the rhyme in question; ** `aa`: {nil} or a list of right accent qualifier strings, displayed directly after the rhyme in question; ** `refs`: {nil} or a list of references or reference specs to add directly after the rhyme; the value of a list item is either a string containing the reference text (typically a call to a citation template such as {{tl|cite-book}}, or a template wrapping such a call), or an object with fields `text` (the reference text), `name` (the name of the reference, as in {{cd|<nowiki><ref name="foo">...</ref></nowiki>}} or {{cd|<nowiki><ref name="foo" /></nowiki>}}) and/or `group` (the group of the reference, as in {{cd|<nowiki><ref name="foo" group="bar">...</ref></nowiki>}} or {{cd|<nowiki><ref name="foo" group="bar"/></nowiki>}}); this uses a parser function to format the reference appropriately and insert a footnote number that hyperlinks to the actual reference, located in the {{cd|<nowiki><references /></nowiki>}} section; ** `nocat`: if {true}, suppress categorization for this rhyme only; * `num_syl`: {nil} or a list of numbers, specifying the number of syllables for all rhymes; optional and currently used only for categorization; overridable at the individual rhyme level; * `separator`: {nil} or a string, specifying the separator displayed before all rhymes but the first; by default, {", "}; overridable at the individual rhyme level; * `q`: {nil} or a list of left regular qualifier strings, formatted using {format_qualifier()} in [[Module:qualifier]] and displayed before the initial caption; * `qq`: {nil} or a list of right regular qualifier strings, displayed after all rhymes; * `qualifiers`: {nil} or a list of left regular qualifier strings; for compatibility purposes only, do not use in new code; * `a`: {nil} or a list of left accent qualifier strings, formatted using {format_qualifiers()} in [[Module:accent qualifier]] and dispalyed before the initial caption; * `aa`: {nil} or a list of right accent qualifier strings, displayed after all rhymes; * `sort`: {nil} or sort key; * `caption`: {nil} or string specifying the caption to use, in place of {"Rhymes"}; a colon and space is automatically added after the caption; * `nocaption`: if {true}, suppress the caption display; * `nocat`: if {true}, suppress categorization; * `force_cat`: if {true}, force categorization even on non-mainspace pages. If both regular and accent qualifiers on the same side and at the same level are specified, the accent qualifiers precede the regular qualifiers on both left and right. '''WARNING''': Destructively modifies the objects inside the `rhymes` field. Note that the number of syllables is currently used only for categorization; if present, an extra category will be added such as [[:Category:Rhymes:Italian/ino/3 syllables]] in addition to [[:Category:Rhymes:Italian/ino]]. ]==] function export.format_rhymes(data) local langname = data.lang:getFullName() local parts = {} local categories = {} local overall_sep = data.separator or ", " for i, r in ipairs(data.rhymes) do local rhyme = r.rhyme local link, link_cats = make_rhyme_link(data.lang, rhyme, "-" .. rhyme) if not r.nocat and not data.nocat then for _, cat in ipairs(link_cats) do insert(categories, cat) end end if r.qualifiers then track("old-qualifiers") end if r.q and r.q[1] or r.qq and r.qq[1] or r.qualifiers and r.qualifiers[1] or r.a and r.a[1] or r.aa and r.aa[1] or r.refs and r.refs[1] then link = require(pron_qualifier_module).format_qualifiers { lang = data.lang, text = link, q = r.q, qq = r.qq, qualifiers = r.qualifiers, a = r.a, aa = r.aa, refs = r.refs, } end insert(parts, r.separator or i > 1 and overall_sep or "") insert(parts, link) if not r.nocat and not data.nocat then add_syllable_categories(categories, langname, rhyme, r.num_syl or data.num_syl) end end local text = concat(parts) if not data.nocaption then text = (data.caption or "तुकांत") .. ": " .. text end if data.q and data.q[1] or data.qq and data.qq[1] or data.a and data.a[1] or data.aa and data.aa[1] then text = require(pron_qualifier_module).format_qualifiers { lang = data.lang, text = text, q = data.q, qq = data.qq, a = data.a, aa = data.aa, } end if categories[1] then local categories = require(utilities_module).format_categories(categories, data.lang, data.sort, nil, force_cat or data.force_cat) text = text .. categories end return text end end --[==[ Implementation of {{tl|rhymes}}. ]==] function export.show(frame) local parent_args = frame:getParent().args local compat = parent_args.lang local offset = compat and 0 or 1 local lang_param = compat and "lang" or 1 local plain = {} local boolean = {type = "boolean"} local params = { [lang_param] = {required = true, type = "language", default = "hi"}, [1 + offset] = {list = true, required = true, disallow_holes = true, default = "aɪmz"}, ["caption"] = plain, ["nocaption"] = boolean, ["nocat"] = boolean, ["sort"] = plain, } local m_param_utils = require(parameter_utilities_module) local param_mods = m_param_utils.construct_param_mods { { param = "s", item_dest = "num_syl", separate_no_index = true, type = "number", sublist = true, }, {group = {"q", "a", "ref"}}, } local rhymes, args = m_param_utils.parse_list_with_inline_modifiers_and_separate_params { params = params, param_mods = param_mods, raw_args = parent_args, termarg = 1 + offset, term_dest = "rhyme", track_module = "rhymes", } local lang = args[lang_param] local data = { lang = lang, rhymes = rhymes, num_syl = args.s.default, caption = args.caption, nocaption = args.nocaption, nocat = args.nocat, sort = args.sort, q = args.q.default, qq = args.qq.default, a = args.a.default, aa = args.aa.default, } return export.format_rhymes(data) end --[==[ Implementation of {{tl|rhymes nav}}. ]==] function export.show_nav(frame) local args = require(parameters_module).process( frame:getParent().args, { [1] = {required = true, type = "full language", default = "und"}, [2] = {list = true, allow_holes = true}, ["nocat"] = {type = "boolean"}, } ) local lang = args[1] local langname = lang:getCanonicalName() local parts = args[2] -- Create steps -- FIXME: We should probably use format_categories() in [[Module:utilities]] rather than constructing categories -- manually. local categories = {} -- Here and below, we ignore any cleanup categories coming out of make_rhyme_link() by adding an extra set of parens -- around the call to make_rhyme_link() to cause the second argument (the categories) to be ignored. {{rhymes nav}} -- is run on a rhymes page so it's not clear we want the page to be added to any such categories, if they exist. local steps = {"[[Wiktionary:Rhymes|Rhymes]]", (make_rhyme_link(lang))} if #parts > 0 then local last = parts[#parts] parts[#parts] = nil local prefix = "" for i, part in ipairs(parts) do prefix = prefix .. part parts[i] = prefix end for _, part in ipairs(parts) do insert(steps, (make_rhyme_link(lang, part .. "-", "-" .. part .. "-"))) end if last == "-" then insert(steps, (make_rhyme_link(lang, prefix, "-" .. prefix))) insert(categories, "[[Category:" .. langname .. " तुकांत" .. (prefix == "" and "" or "/" .. prefix .. "-") .. "| ]]") elseif mw.title.getCurrentTitle().text == langname .. "/" .. prefix .. last .. "-" then -- DO NOT replace with mw.loadData("Module:headword/data").pagename as we need the root portion insert(steps, (make_rhyme_link(lang, prefix .. last .. "-", "-" .. prefix .. last .. "-"))) insert(categories, "[[Category:" .. langname .. " तुकांत/" .. prefix .. last .. "-|-]]") else insert(steps, (make_rhyme_link(lang, prefix .. last, "-" .. prefix .. last))) insert(categories, "[[Category:" .. langname .. " तुकांत" .. (prefix == "" and "" or "/" .. prefix .. "-") .. "|" .. last .. "]]") end elseif lang:getCode() ~= "und" then insert(categories, "[[Category:" .. langname .. " तुकांत| ]]") end if mw.title.getCurrentTitle().nsText == "तुकांत" then frame:callParserFunction("DISPLAYTITLE", mw.title.getCurrentTitle().fullText:gsub( "/(.+)$", function (rhyme) return "/" .. (tag_rhyme(rhyme, lang)) -- ignore cleanup categories end)) end local templateStyles = require(TemplateStyles_module)(rhymes_styles_css_module) local ol = mw.html.create("ol") for _, step in ipairs(steps) do ol:node(mw.html.create("li"):wikitext(step)) end local div = mw.html.create("div") :attr("role", "navigation") :attr("aria-label", "Breadcrumb") :addClass("ts-rhymesBreadcrumbs") :node(ol) local formatted_cats = args.nocat and "" or concat(categories) return templateStyles .. tostring(div) .. formatted_cats end return export are6gnmps5oiwn03zvwnbz12pu6ke3y मॉड्यूल:audio 828 304141 487762 475458 2026-09-02T16:04:06Z SM7 6218 updating... 487762 Scribunto text/plain local export = {} local headword_data_module = "Module:headword/data" local IPA_module = "Module:IPA" local labels_module = "Module:labels" local links_module = "Module:links" local parameters_module = "Module:parameters" local qualifier_module = "Module:qualifier" local references_module = "Module:references" local string_utilities_module = "Module:string utilities" local table_module = "Module:table" local template_styles_module = "Module:TemplateStyles" local utilities_module = "Module:utilities" local audio_styles_css = "audio/styles.css" local function track(page) require("Module:debug/track")("audio/" .. page) return true end local function wrap_qualifier_css(text, suffix) return require(qualifier_module).wrap_qualifier_css(text, suffix) end --[==[ Display a box that can be used to play an audio file. `data` is a table containing the following fields: * `lang` ('''required'''): language object for the audio files; * `file` ('''required'''): file containing the audio; * `caption`: Caption to display before the audio box; normally {"Audio"}, and does not usually need to be changed; * `nocaption`: If specified, don't display the caption; * `q`: {nil} or a list of left regular qualifier strings, formatted using {format_qualifier()} in [[Module:qualifier]] and displayed before the audio box and after the caption (and any accent qualifiers); * `qq`: {nil} or a list of right regular qualifier strings, displayed directly after the audio box (and after any accent qualifiers); * `a`: {nil} or a list of left accent qualifier strings, formatted using {format_qualifiers()} in [[Module:accent qualifier]] and displayed before the audio box and after the caption; * `aa`: {nil} or a list of right accent qualifier strings, displayed directly after the homophone in question; * `refs`: {nil} or a list of references or reference specs to add directly after the audio box; the value of a list item is either a string containing the reference text (typically a call to a citation template such as {{tl|cite-book}}, or a template wrapping such a call), or an object with fields `text` (the reference text), `name` (the name of the reference, as in {{cd|<nowiki><ref name="foo">...</ref></nowiki>}} or {{cd|<nowiki><ref name="foo" /></nowiki>}}) and/or `group` (the group of the reference, as in {{cd|<nowiki><ref name="foo" group="bar">...</ref></nowiki>}} or {{cd|<nowiki><ref name="foo" group="bar"/></nowiki>}}); this uses a parser function to format the reference appropriately and insert a footnote number that hyperlinks to the actual reference, located in the {{cd|<nowiki><references /></nowiki>}} section; * `text`: Text of the audio snippet; if specified, should be an object of the form passed to {full_link()} in [[Module:links]], including a `lang` field containing the language of the text (usually the same as `data.lang`); displayed before the audio box, after any regular and accent qualifiers; * `IPA`: IPA of the audio snippet, or a list of IPA specs; if specified, should be surrounded by slashes or brackets, and will be processed using {format_IPA_multiple()} in [[Module:IPA]] and displayed before the audio box, after any regular and accent qualifiers and after the text of the audio snippet, if given; * `nocat`: If true, suppress categorization; * `sort`: Sort key for categorization. ]==] function export.format_audio(data) local langname = data.lang:getFullName() local cats = { langname .. " terms with audio pronunciation" } local function format_a(a) if a and a[1] then return require(labels_module).show_labels { lang = data.lang, labels = a, mode = "accent", nocat = true, open = false, close = false, no_track_already_seen = true, } end return nil end local function format_q(q) if q and q[1] then return require(qualifier_module).format_qualifier(q, false, false) end return nil end local function make_td_if(text) if text == "" then return text end return "<td>" .. text .. "</td>" end -- Generate the full text preceding the audio box. local pretext_parts = {} local function ins(text) table.insert(pretext_parts, text) end local formatted_accent_labels, formatted_qualifiers, formatted_text, formatted_ipa formatted_accent_labels = format_a(data.a) formatted_qualifiers = format_q(data.q) if data.text then formatted_text = require(links_module).full_link(data.text, "term", true) end if data.IPA then local ipa_cats local ipa = data.IPA if type(ipa) == "string" then ipa = {ipa} end local ipa_items = {} for _, ipa_item in ipairs(ipa) do table.insert(ipa_items, {pron = ipa_item}) end formatted_ipa, ipa_cats = require(IPA_module).format_IPA_multiple(data.lang, ipa_items, nil, "no count", "raw") if ipa_cats[1] then require(table_module).extend(cats, ipa_cats) end end local has_qual = formatted_accent_labels or formatted_qualifiers if not data.nocaption then -- Track uses of caption (3=). Over time as we eliminate most of them, we can use this to find and -- eliminate the remainder. if data.caption then track("caption") end ins(data.caption or "Audio") if has_qual then ins(" " .. wrap_qualifier_css("(", "brac")) end end if formatted_accent_labels then ins(formatted_accent_labels) if formatted_qualifiers then ins(wrap_qualifier_css(",", "comma") .. " ") end end if formatted_qualifiers then ins(formatted_qualifiers) end if has_qual then if not data.nocaption then ins(wrap_qualifier_css(")", "brac")) end end if (formatted_text or formatted_ipa) and (has_qual or not data.nocaption) then ins(wrap_qualifier_css(";", "semicolon") .. " ") end if formatted_text then ins(formatted_text) if formatted_ipa then ins(" ") end end ins(formatted_ipa) if not data.nocaption then ins(wrap_qualifier_css(":", "colon")) end local pretext = make_td_if(table.concat(pretext_parts)) -- Generate the full text following the audio box. local posttext_parts = {} local function ins(text) table.insert(posttext_parts, text) end local formatted_post_accent_labels = format_a(data.aa) local formatted_post_qualifiers = format_q(data.qq) local formatted_references = data.refs and require(references_module).format_references(data.refs) or nil if formatted_references then ins(formatted_references) end if formatted_post_accent_labels or formatted_post_qualifiers then if formatted_references then ins(" ") end ins(wrap_qualifier_css("(", "brac")) if formatted_post_accent_labels then ins(formatted_post_accent_labels) if formatted_post_qualifiers then ins(wrap_qualifier_css(",", "comma") .. " ") end end if formatted_post_qualifiers then ins(formatted_post_qualifiers) end ins(wrap_qualifier_css(")", "brac")) end if data.bad then table.insert(cats, langname .. " terms with nonstandard or incorrect audio pronunciations") ins(" " .. require(qualifier_module).wrap_css("Note: this pronunciation may be nonstandard or incorrect: " .. data.bad, "bad-audio-note")) end local posttext = make_td_if(table.concat(posttext_parts)) local template = [=[ <tr>%s<td class="audiofile">[[File:%s|noicon|175px]]</td><td class="audiometa" style="font-size: 80%%;">([[:File:%s|file]])</td>%s</tr>]=] local text = template:format(pretext, data.file, data.file, posttext) text = '<table class="audiotable" style="vertical-align: middle; display: inline-block; list-style: none; line-height: 1em; border-collapse: collapse; margin: 0;">' .. text .. "</table>" local stylesheet = require(template_styles_module)(audio_styles_css) local categories = data.nocat and "" or cats[1] and require(utilities_module).format_categories(cats, data.lang, data.sort) or "" return stylesheet .. text .. categories end --[==[ FIXME: Old entry point for formatting multiple audios in a single table. Not used anywhere and needs rewriting to the standard of format_audio(). Meant to be called from a module. `data` is a table containing the following fields: <pre> { lang = LANGUAGE_OBJECT, audios = {{file = "FILENAME", qualifiers = nil or {"QUALIFIER", "QUALIFIER", ...}}, ...}, caption = nil or "CAPTION" } </pre> Here: * `lang` is a language object. * `audios` is the list of audio files to display. FILENAME is the name of the audio file without a namespace. QUALIFIER is a qualifier string to display after the specific audio file in question, formatted using {format_qualifier()} in [[Module:qualifier]]. * `caption`, if specified, adds a caption before the audio file. ]==] function export.format_multiple_audios(data) local audiocats = { data.lang:getFullName() .. " terms with audio pronunciation" } local rows = { } local caption = data.caption for _, audio in ipairs(data.audios) do local qualifiers = audio.qualifiers local function repl(key) if key == "file" then return audio.file elseif key == "caption" then if not caption then return "" end return "<td rowspan=" .. #data.audios .. ">" .. caption .. ":</td>" elseif key == "qualifiers" then if not qualifiers or not qualifiers[1] then return "" end return "<td>" .. require(qualifier_module).format_qualifier(qualifiers) .. "</td>" end end local template = [=[ <tr>{{{caption}}} <td class="audiofile">[[File:{{{file}}}|noicon|175px]]</td> <td class="audiometa" style="font-size: 80%;">([[:File:{{{file}}}|file]])</td> {{{qualifiers}}}</tr>]=] local text = (mw.ustring.gsub(template, "{{{([a-z0-9_:]+)}}}", repl)) table.insert(rows, text) caption = nil end local function repl(key) if key == "rows" then return table.concat(rows, "\n") end end local template = [=[ <table class="audiotable" style="vertical-align: middle; display: inline-block; list-style: none; line-height: 1em; border-collapse: collapse;"> {{{rows}}} </table> ]=] local stylesheet = require(template_styles_module)(audio_styles_css) local text = mw.ustring.gsub(template, "{{{([a-z0-9_:]+)}}}", repl) local categories = data.nocat and "" or #audiocats > 0 and require(utilities_module).format_categories(audiocats, data.lang, data.sort) or "" -- remove newlines due to HTML generator bug in MediaWiki(?) - newlines in tables cause list items to not end correctly text = mw.ustring.gsub(text, "\n", "") return stylesheet .. text .. categories end --[==[ Construct the `text` object passed into {format_audio()}, from raw-ish arguments (essentially, the output of {process()} in [[Module:parameters]]). On entry, `args` contains the following fields: * `lang` ('''required'''): Language object. * `text`: Text. If this isn't defined and neither are any of `gloss`, `tr`, `ts`, `pos`, `lit` or `genders`, the function returns {nil}. * `gloss`: Gloss of text. * `tr`: Manual transliteration of text. * `ts`: Transcription of text. * `pos`: Part of speech of text. * `lit`: Literal meaning of text. * `genders`: List of gender/number spec(s) of text. * `sc`: Optional script object of text (rarely needs to be set). * `pagename`: Pagename; used in place of `text` when `text` is unset but other text-related parameters are set. If not specified, taken from the actual pagename. ]==] function export.construct_audio_textobj(args) local textobj if args.text or args.gloss or args.tr or args.ts or args.pos or args.lit or args.genders and args.genders[1] then local text = args.text or args.pagename or mw.loadData("Module:headword/data").pagename textobj = { lang = args.lang, alt = wrap_qualifier_css("“", "quote") .. text .. wrap_qualifier_css("”", "quote"), gloss = args.gloss, tr = args.tr, ts = args.ts, pos = args.pos, lit = args.lit, genders = args.genders, sc = args.sc, } end return textobj end --[==[ Entry point for {{tl|audio}} template. ]==] function export.show(frame) local parent_args = frame:getParent().args local compat = parent_args.lang local offset = compat and 0 or 1 local params = { [compat and "lang" or 1] = {required = true, type = "language", default = "en"}, [1 + offset] = {required = true, default = "Example.ogg"}, [2 + offset] = {}, ["q"] = {type = "qualifier"}, ["qq"] = {type = "qualifier"}, ["a"] = {type = "labels"}, ["aa"] = {type = "labels"}, ["ref"] = {type = "references"}, ["IPA"] = {sublist = true}, ["text"] = {}, ["t"] = {}, ["gloss"] = {alias_of = "t"}, ["tr"] = {}, ["ts"] = {}, ["pos"] = {}, ["lit"] = {}, ["g"] = {sublist = true}, ["sc"] = {type = "script"}, ["bad"] = {}, ["nocat"] = {type = "boolean"}, ["sort"] = {}, ["pagename"] = {}, } local args = require(parameters_module).process(parent_args, params) local lang = args[compat and "lang" or 1] -- Needed in construct_audio_textobj(). args.lang = lang local textobj = export.construct_audio_textobj(args) local caption = args[2 + offset] local nocaption if caption == "-" then caption = nil nocaption = true end if caption then -- Remove final colon if given, to avoid two colons. caption = caption:gsub(":$", "") end local data = { lang = lang, file = args[1 + offset], caption = caption, nocaption = nocaption, q = args.q, qq = args.qq, a = args.a, aa = args.aa, refs = args.ref, text = textobj, IPA = args.IPA, bad = args.bad, nocat = args.nocat, sort = args.sort, } return export.format_audio(data) end return export akem8fdq9thdv6zx89zo3kwaky8a452 487763 487762 2026-09-02T16:08:25Z SM7 6218 localization 487763 Scribunto text/plain local export = {} local headword_data_module = "Module:headword/data" local IPA_module = "Module:IPA" local labels_module = "Module:labels" local links_module = "Module:links" local parameters_module = "Module:parameters" local qualifier_module = "Module:qualifier" local references_module = "Module:references" local string_utilities_module = "Module:string utilities" local table_module = "Module:table" local template_styles_module = "Module:TemplateStyles" local utilities_module = "Module:utilities" local audio_styles_css = "audio/styles.css" local function track(page) require("Module:debug/track")("audio/" .. page) return true end local function wrap_qualifier_css(text, suffix) return require(qualifier_module).wrap_qualifier_css(text, suffix) end --[==[ Display a box that can be used to play an audio file. `data` is a table containing the following fields: * `lang` ('''required'''): language object for the audio files; * `file` ('''required'''): file containing the audio; * `caption`: Caption to display before the audio box; normally {"Audio"}, and does not usually need to be changed; * `nocaption`: If specified, don't display the caption; * `q`: {nil} or a list of left regular qualifier strings, formatted using {format_qualifier()} in [[Module:qualifier]] and displayed before the audio box and after the caption (and any accent qualifiers); * `qq`: {nil} or a list of right regular qualifier strings, displayed directly after the audio box (and after any accent qualifiers); * `a`: {nil} or a list of left accent qualifier strings, formatted using {format_qualifiers()} in [[Module:accent qualifier]] and displayed before the audio box and after the caption; * `aa`: {nil} or a list of right accent qualifier strings, displayed directly after the homophone in question; * `refs`: {nil} or a list of references or reference specs to add directly after the audio box; the value of a list item is either a string containing the reference text (typically a call to a citation template such as {{tl|cite-book}}, or a template wrapping such a call), or an object with fields `text` (the reference text), `name` (the name of the reference, as in {{cd|<nowiki><ref name="foo">...</ref></nowiki>}} or {{cd|<nowiki><ref name="foo" /></nowiki>}}) and/or `group` (the group of the reference, as in {{cd|<nowiki><ref name="foo" group="bar">...</ref></nowiki>}} or {{cd|<nowiki><ref name="foo" group="bar"/></nowiki>}}); this uses a parser function to format the reference appropriately and insert a footnote number that hyperlinks to the actual reference, located in the {{cd|<nowiki><references /></nowiki>}} section; * `text`: Text of the audio snippet; if specified, should be an object of the form passed to {full_link()} in [[Module:links]], including a `lang` field containing the language of the text (usually the same as `data.lang`); displayed before the audio box, after any regular and accent qualifiers; * `IPA`: IPA of the audio snippet, or a list of IPA specs; if specified, should be surrounded by slashes or brackets, and will be processed using {format_IPA_multiple()} in [[Module:IPA]] and displayed before the audio box, after any regular and accent qualifiers and after the text of the audio snippet, if given; * `nocat`: If true, suppress categorization; * `sort`: Sort key for categorization. ]==] function export.format_audio(data) local langname = data.lang:getFullName() local cats = { langname .. " टर्म ऑडियो उच्चारण के साथ" } local function format_a(a) if a and a[1] then return require(labels_module).show_labels { lang = data.lang, labels = a, mode = "accent", nocat = true, open = false, close = false, no_track_already_seen = true, } end return nil end local function format_q(q) if q and q[1] then return require(qualifier_module).format_qualifier(q, false, false) end return nil end local function make_td_if(text) if text == "" then return text end return "<td>" .. text .. "</td>" end -- Generate the full text preceding the audio box. local pretext_parts = {} local function ins(text) table.insert(pretext_parts, text) end local formatted_accent_labels, formatted_qualifiers, formatted_text, formatted_ipa formatted_accent_labels = format_a(data.a) formatted_qualifiers = format_q(data.q) if data.text then formatted_text = require(links_module).full_link(data.text, "टर्म", true) end if data.IPA then local ipa_cats local ipa = data.IPA if type(ipa) == "string" then ipa = {ipa} end local ipa_items = {} for _, ipa_item in ipairs(ipa) do table.insert(ipa_items, {pron = ipa_item}) end formatted_ipa, ipa_cats = require(IPA_module).format_IPA_multiple(data.lang, ipa_items, nil, "no count", "raw") if ipa_cats[1] then require(table_module).extend(cats, ipa_cats) end end local has_qual = formatted_accent_labels or formatted_qualifiers if not data.nocaption then -- Track uses of caption (3=). Over time as we eliminate most of them, we can use this to find and -- eliminate the remainder. if data.caption then track("caption") end ins(data.caption or "ऑडियो") if has_qual then ins(" " .. wrap_qualifier_css("(", "brac")) end end if formatted_accent_labels then ins(formatted_accent_labels) if formatted_qualifiers then ins(wrap_qualifier_css(",", "comma") .. " ") end end if formatted_qualifiers then ins(formatted_qualifiers) end if has_qual then if not data.nocaption then ins(wrap_qualifier_css(")", "brac")) end end if (formatted_text or formatted_ipa) and (has_qual or not data.nocaption) then ins(wrap_qualifier_css(";", "semicolon") .. " ") end if formatted_text then ins(formatted_text) if formatted_ipa then ins(" ") end end ins(formatted_ipa) if not data.nocaption then ins(wrap_qualifier_css(":", "colon")) end local pretext = make_td_if(table.concat(pretext_parts)) -- Generate the full text following the audio box. local posttext_parts = {} local function ins(text) table.insert(posttext_parts, text) end local formatted_post_accent_labels = format_a(data.aa) local formatted_post_qualifiers = format_q(data.qq) local formatted_references = data.refs and require(references_module).format_references(data.refs) or nil if formatted_references then ins(formatted_references) end if formatted_post_accent_labels or formatted_post_qualifiers then if formatted_references then ins(" ") end ins(wrap_qualifier_css("(", "brac")) if formatted_post_accent_labels then ins(formatted_post_accent_labels) if formatted_post_qualifiers then ins(wrap_qualifier_css(",", "comma") .. " ") end end if formatted_post_qualifiers then ins(formatted_post_qualifiers) end ins(wrap_qualifier_css(")", "brac")) end if data.bad then table.insert(cats, langname .. " terms with nonstandard or incorrect audio pronunciations") ins(" " .. require(qualifier_module).wrap_css("Note: this pronunciation may be nonstandard or incorrect: " .. data.bad, "bad-audio-note")) end local posttext = make_td_if(table.concat(posttext_parts)) local template = [=[ <tr>%s<td class="audiofile">[[File:%s|noicon|175px]]</td><td class="audiometa" style="font-size: 80%%;">([[:File:%s|file]])</td>%s</tr>]=] local text = template:format(pretext, data.file, data.file, posttext) text = '<table class="audiotable" style="vertical-align: middle; display: inline-block; list-style: none; line-height: 1em; border-collapse: collapse; margin: 0;">' .. text .. "</table>" local stylesheet = require(template_styles_module)(audio_styles_css) local categories = data.nocat and "" or cats[1] and require(utilities_module).format_categories(cats, data.lang, data.sort) or "" return stylesheet .. text .. categories end --[==[ FIXME: Old entry point for formatting multiple audios in a single table. Not used anywhere and needs rewriting to the standard of format_audio(). Meant to be called from a module. `data` is a table containing the following fields: <pre> { lang = LANGUAGE_OBJECT, audios = {{file = "FILENAME", qualifiers = nil or {"QUALIFIER", "QUALIFIER", ...}}, ...}, caption = nil or "CAPTION" } </pre> Here: * `lang` is a language object. * `audios` is the list of audio files to display. FILENAME is the name of the audio file without a namespace. QUALIFIER is a qualifier string to display after the specific audio file in question, formatted using {format_qualifier()} in [[Module:qualifier]]. * `caption`, if specified, adds a caption before the audio file. ]==] function export.format_multiple_audios(data) local audiocats = { data.lang:getFullName() .. " टर्म ऑडियो उच्चारण के साथ" } local rows = { } local caption = data.caption for _, audio in ipairs(data.audios) do local qualifiers = audio.qualifiers local function repl(key) if key == "file" then return audio.file elseif key == "caption" then if not caption then return "" end return "<td rowspan=" .. #data.audios .. ">" .. caption .. ":</td>" elseif key == "qualifiers" then if not qualifiers or not qualifiers[1] then return "" end return "<td>" .. require(qualifier_module).format_qualifier(qualifiers) .. "</td>" end end local template = [=[ <tr>{{{caption}}} <td class="audiofile">[[File:{{{file}}}|noicon|175px]]</td> <td class="audiometa" style="font-size: 80%;">([[:File:{{{file}}}|file]])</td> {{{qualifiers}}}</tr>]=] local text = (mw.ustring.gsub(template, "{{{([a-z0-9_:]+)}}}", repl)) table.insert(rows, text) caption = nil end local function repl(key) if key == "rows" then return table.concat(rows, "\n") end end local template = [=[ <table class="audiotable" style="vertical-align: middle; display: inline-block; list-style: none; line-height: 1em; border-collapse: collapse;"> {{{rows}}} </table> ]=] local stylesheet = require(template_styles_module)(audio_styles_css) local text = mw.ustring.gsub(template, "{{{([a-z0-9_:]+)}}}", repl) local categories = data.nocat and "" or #audiocats > 0 and require(utilities_module).format_categories(audiocats, data.lang, data.sort) or "" -- remove newlines due to HTML generator bug in MediaWiki(?) - newlines in tables cause list items to not end correctly text = mw.ustring.gsub(text, "\n", "") return stylesheet .. text .. categories end --[==[ Construct the `text` object passed into {format_audio()}, from raw-ish arguments (essentially, the output of {process()} in [[Module:parameters]]). On entry, `args` contains the following fields: * `lang` ('''required'''): Language object. * `text`: Text. If this isn't defined and neither are any of `gloss`, `tr`, `ts`, `pos`, `lit` or `genders`, the function returns {nil}. * `gloss`: Gloss of text. * `tr`: Manual transliteration of text. * `ts`: Transcription of text. * `pos`: Part of speech of text. * `lit`: Literal meaning of text. * `genders`: List of gender/number spec(s) of text. * `sc`: Optional script object of text (rarely needs to be set). * `pagename`: Pagename; used in place of `text` when `text` is unset but other text-related parameters are set. If not specified, taken from the actual pagename. ]==] function export.construct_audio_textobj(args) local textobj if args.text or args.gloss or args.tr or args.ts or args.pos or args.lit or args.genders and args.genders[1] then local text = args.text or args.pagename or mw.loadData("Module:headword/data").pagename textobj = { lang = args.lang, alt = wrap_qualifier_css("“", "quote") .. text .. wrap_qualifier_css("”", "quote"), gloss = args.gloss, tr = args.tr, ts = args.ts, pos = args.pos, lit = args.lit, genders = args.genders, sc = args.sc, } end return textobj end --[==[ Entry point for {{tl|audio}} template. ]==] function export.show(frame) local parent_args = frame:getParent().args local compat = parent_args.lang local offset = compat and 0 or 1 local params = { [compat and "lang" or 1] = {required = true, type = "language", default = "en"}, [1 + offset] = {required = true, default = "Example.ogg"}, [2 + offset] = {}, ["q"] = {type = "qualifier"}, ["qq"] = {type = "qualifier"}, ["a"] = {type = "labels"}, ["aa"] = {type = "labels"}, ["ref"] = {type = "references"}, ["IPA"] = {sublist = true}, ["text"] = {}, ["t"] = {}, ["gloss"] = {alias_of = "t"}, ["tr"] = {}, ["ts"] = {}, ["pos"] = {}, ["lit"] = {}, ["g"] = {sublist = true}, ["sc"] = {type = "script"}, ["bad"] = {}, ["nocat"] = {type = "boolean"}, ["sort"] = {}, ["pagename"] = {}, } local args = require(parameters_module).process(parent_args, params) local lang = args[compat and "lang" or 1] -- Needed in construct_audio_textobj(). args.lang = lang local textobj = export.construct_audio_textobj(args) local caption = args[2 + offset] local nocaption if caption == "-" then caption = nil nocaption = true end if caption then -- Remove final colon if given, to avoid two colons. caption = caption:gsub(":$", "") end local data = { lang = lang, file = args[1 + offset], caption = caption, nocaption = nocaption, q = args.q, qq = args.qq, a = args.a, aa = args.aa, refs = args.ref, text = textobj, IPA = args.IPA, bad = args.bad, nocat = args.nocat, sort = args.sort, } return export.format_audio(data) end return export 2v2s1ab6b8g04hjzga4p1u44idh93au मॉड्यूल:interproject 828 304234 487847 487529 2026-09-02T20:09:23Z SM7 6218 updating... 487847 Scribunto text/plain local export = {} local m_links = require("Module:links") local m_params = require("Module:parameters") local en_utilities_module = "Module:en-utilities" local parse_interface_module = "Module:parse interface" local parse_utilities_module = "Module:parse utilities" local string_utilities_module = "Module:string utilities" local table_module = "Module:table" local wikimedia_languages_module = "Module:wikimedia languages" local full_link = m_links.full_link local concat = table.concat local insert = table.insert local boolean_param = {type = "boolean"} local function track(page) require("Module:debug/track")("interproject/" .. page) end local disambiguation_data local function get_disambiguation_format_string(language) if not disambiguation_data then disambiguation_data = mw.loadData("Module:interproject/data/disambiguation") end return disambiguation_data[language] or "%s (disambiguation)" end -- Split an argument on comma, but not comma followed by whitespace, or backslash + comma, or comma inside of brackets. local function split_on_comma(val) if val:find(",") then return require(parse_interface_module).split_on_comma(val) else return {val} end end -- Join one or more items using commas, with "and" between the last two items. local function join_on_comma(val) if val[2] then return require(table_module).serialCommaJoin(val) else return val[1] end end -- Replace + with the pagename, but replace \+ with +. local function substitute_plus(val, pagename) if not val then return val end if val:find("%+") then val = val:gsub("%\\%+", "\1"):gsub("%+", require(string_utilities_module).replacement_escape(pagename)): gsub("\1", "+") end return val end local function process_links(linkdata, prefix, name, wmlang, sc) local links = {} local iplinks = {} for _, link in ipairs(linkdata) do local this_wmlang = link.wmlang or wmlang local this_prefix = prefix .. ":" .. (this_wmlang:getCode() == "en" and "" or this_wmlang:getCode() .. ":") local lang = this_wmlang:getWiktionaryLanguage() local ipalt = name .. " " .. (this_wmlang:getCode() == "en" and "" or "<sup>" .. this_wmlang:getCode() .. "</sup>") link.lang = lang link.sc = sc link.track_sc = true link.no_nonstandard_sc_cat = true link.tr = "-" -- Strip diacritics according to Wiktionary language principles. This isn't done automatically with Wikipedia -- links but seems a good idea to do. Prefix the link with a colon to override this. We try to separate the -- fragment before doing this to avoid the term getting converted to an unsupported title, and don't do any -- diacritic stripping on non-mainspace Wikipedia links. if link.term:find("^:") then link.term = link.term:sub(2) elseif not link.term:find(":") then -- Apply some Wikipedia-style transformations before calling stripDiacritics() to avoid problems with -- the punctuation getting stripped. local term, fragment = m_links.get_fragment(link.term:gsub("_", " "):gsub("%?", "%%3F"):gsub("!", "%%21")) -- FIXME: This isn't sustainable and has to be removed. local stripped_term = lang:stripDiacritics(term) if stripped_term ~= term then link.alt = link.alt or link.term link.term = stripped_term .. (fragment and "#" .. fragment or "") end end if link.fragment ~= nil then link.alt = (link.alt or link.term) .. " § " .. link.fragment end if link.alt == link.term then link.alt = nil end link.term = this_prefix .. link.term insert(iplinks, "<span class=\"interProject\">[[" .. mw.ustring.gsub(link.term, "'''?", "") .. "|" .. ipalt .. "]]</span>") insert(links, full_link(link, "bold")) end return links, iplinks end local function parse_one_wikipedia_link(val, pagename, default_wmlang, link_prefix) local origval = val local rest, dab = val:match("^(.*)<(dab!?)>$") val = rest or val local langcode, rest = val:match("^([a-z][a-z-]+):(.*)$") if rest and not rest:find("^ ") then val = rest else langcode = nil end local wmlang if langcode then wmlang = require(wikimedia_languages_module).getByCodeWithFallback(langcode) if not wmlang then error(("Unrecogized Wikimedia or Wiktionary code '%s': %s"):format(langcode, -- FIXME, move escape_wikicode() elsewhere require(parse_utilities_module).escape_wikicode(origval))) end else wmlang = default_wmlang end local link, label = val:match("^%[%[(.-)|(.*)%]%]$") if not link then link = val:match("^%[%[(.*)%]%]$") end link = link or val local rest, fragment = link:match("^(.-)#(.*)$") link = rest or link if link == "" then link = "+" end link = substitute_plus(link, pagename) label = substitute_plus(label, pagename) fragment = substitute_plus(fragment, pagename) local user_specified_label = not not label label = label or link if label == "" then -- implement pipe trick rest = link:match("^(.+) %(.-%)$") if rest then label = rest else label = link:gsub(",.*$", "") end end if dab == "dab" or dab == "dab!" then link = get_disambiguation_format_string(wmlang:getCode()):format(link) end if dab == "dab!" then label = get_disambiguation_format_string(wmlang:getCode()):format(label) end if user_specified_label and fragment then link = link .. "#" .. fragment fragment = nil end return {wmlang = wmlang, term = link_prefix .. link, alt = label, fragment = fragment} end local function parse_wikipedia_links(val, pagename, default_wmlang, link_prefix) local raw_links = split_on_comma(val) for i, raw_link in ipairs(raw_links) do raw_links[i] = parse_one_wikipedia_link(raw_link, pagename, default_wmlang, link_prefix) default_wmlang = raw_links[i].wmlang end return raw_links end -- FIXME: From [[Module:zh/templates]] implementation of old {{zh-wp}}; do we want something like this? --local wp_data = { -- ["zh"] = { "Written Standard Chinese<sup>[[w:Written vernacular Chinese|?]]</sup>", "zh" }, -- ["cdo"] = { "Eastern Min", "cdo" }, -- ["gan"] = { "Gan", "zh" }, -- ["hak"] = { "Hakka", "hak" }, -- ["lzh"] = { "Classical", "zh" }, -- ["nan"] = { "Southern Min", "nan" }, -- ["wuu"] = { "Wu", "zh" }, -- ["yue"] = { "Cantonese", "zh" }, --} local function format_wikipedia_box(frame, linkdata, linktype, slim, sc) local wmlangcode, multibox for i, linkspec in ipairs(linkdata) do if i == 1 then wmlangcode = linkspec.wmlang:getCode() elseif wmlangcode ~= linkspec.wmlang:getCode() then multibox = true break end end if slim and not multibox then for _, linkspec in ipairs(linkdata) do if linktype == "category" then linkspec.alt = "Category:" .. linkspec.alt elseif linktype == "portal" then linkspec.alt = "Portal:" .. linkspec.alt end end end if not linkdata[2] then linktype = require(en_utilities_module).add_indefinite_article(linktype) else linktype = require(en_utilities_module).pluralize(linktype) end local links, iplinks = process_links(linkdata, "w", "Wikipedia", nil, sc) local div_prefix = "<div class=\"interproject-box sister-wikipedia sister-project noprint floatright\">" local template_extension = frame:extensionTag("templatestyles", "", {src="Module:interproject/style.css"}) if multibox then local result = { div_prefix .. "<div style=\"float: left;\">[[File:Wikipedia-logo.png|32px|none|link=|alt=]]</div>" .. "<div style=\"margin-left: 40px;\">[[Wikipedia]] has " .. linktype .. " on:<ul>" } for i, linkspec in ipairs(linkdata) do local annotation = " <span style=\"font-size:80%\">(" .. linkspec.wmlang:getCanonicalName() .. ")</span>" insert(result, "<li>" .. links[i] .. annotation .. "</li>") end insert(result, "</ul></div></div>" .. template_extension) return concat(result) elseif slim then local wmlang = linkdata[1].wmlang return div_prefix .. "<div style=\"float: left;\">[[File:Wikipedia-logo.png|14px|none| ]]</div>" .. "<div style=\"margin-left: 15px;\">" .. " &nbsp;" .. join_on_comma(links) .. " on " .. (wmlang:getCode() == "en" and "" or wmlang:getCanonicalName() .. "&nbsp;") .. "Wikipedia" .. "</div></div>" .. template_extension else local wmlang = linkdata[1].wmlang return div_prefix .. "<div style=\"float: left;\" class=\"interproject-box-logo\">[[File:Wikipedia-logo-v2.svg|x40px|none|link=|alt=]]</div>" .. "<div style=\"margin-left: 60px;\">" .. wmlang:getCanonicalName() .. " [[Wikipedia]] has " .. linktype .. " on:" .. "<div style=\"margin-left: 10px;\">" .. join_on_comma(links) .. "</div>" .. "</div>" .. concat(iplinks) .. "</div>" .. template_extension end end function export.wikipedia_box(frame) local params = { [1] = true, ["cat"] = true, ["category"] = {alias_of = "cat"}, ["i"] = boolean_param, ["lang"] = {type = "Wikimedia language", fallback = true, default = "en"}, ["portal"] = true, ["sc"] = {type = "script"}, ["pagename"] = true, -- make old parameters throw an explanatory error; FIXME: eventually remove these. [2] = {replaced_by = false, instead = "use a piped link in 1=, e.g. {{!((}}foo{{!}}bar{{))!}}"}, ["mul"] = {replaced_by = false, instead = "use comma-separated items in 1="}, ["mullabel"] = {replaced_by = false, instead = "use a piped link in 1=, e.g. {{!((}}foo{{!}}bar{{))!}}"}, ["mulcat"] = {replaced_by = false, instead = "use comma-separated items in cat="}, ["mulcatlabel"] = {replaced_by = false, instead = "use a piped link in cat=, e.g. {{!((}}foo{{!}}bar{{))!}}"}, ["section"] = {replaced_by = false, instead = "use the syntax 'article#Section' in 1="}, } local parargs = frame:getParent().args local args = m_params.process(parargs, params) local pagename = args.pagename or mw.loadData("Module:headword/data").pagename local sc = args.sc local linkdata, linktype if parargs.lang then -- Tracking for old use of lang= instead of a language prefix. track("old-wp") end if (args[1] and 1 or 0) + (args.cat and 1 or 0) + (args.portal and 1 or 0) > 1 then error("Can't specify more than one of 1=, cat= and portal=") end local rawval, link_prefix if args.cat then linktype = "category" link_prefix = "Category:" rawval = args.cat elseif args.portal then linktype = "portal" link_prefix = "Portal:" rawval = args.portal else linktype = "article" link_prefix = "" rawval = args[1] or "" end linkdata = parse_wikipedia_links(rawval, pagename, args.lang, link_prefix) return format_wikipedia_box(frame, linkdata, linktype, frame.args.slim, sc) end function export.projectlink(frame, compat) local required = {required = true} local iparams = { ["prefix"] = required, ["name"] = required, ["image"] = required, ["requirelang"] = boolean_param, ["compat"] = boolean_param, } local iargs = m_params.process(frame.args, iparams) compat = compat or iargs.compat local lang_required = iargs.requirelang or false local lang_param = compat and "lang" or 1 local term_param = compat and 1 or 2 local alt_param = compat and 2 or 3 local params = { [lang_param] = {type = "Wikimedia language", method = "fallback", required = lang_required, default = "en"}, [term_param] = true, [alt_param] = true, ["i"] = boolean_param, ["nodot"] = true, ["sc"] = {type = "script"}, ["section"] = true } local args = m_params.process(frame:getParent().args, params) local wmlang = args[lang_param] local sc = args["sc"] local term = args[term_param] or mw.loadData("Module:headword/data").pagename local linkdata = {term = term, alt = args[alt_param], fragment = args["section"]} if args["i"] then local prefixed = "''" if (iargs["prefix"] == "commons:Category") then prefixed = "Category:" .. prefixed end if linkdata.alt then linkdata.alt = prefixed .. linkdata.alt .. "''" else -- While it is true that the link module automatically removes italics from terms, -- linkdata.term is used outside this module too (image link and "interProject" link) linkdata.alt = prefixed .. linkdata.term .. "''" end end local links, iplinks = process_links({linkdata}, iargs["prefix"], iargs["name"], wmlang, sc) return "[[Image:" .. iargs["image"] .. "|15px|link=" .. iargs["prefix"] .. ":" .. (wmlang:getCode() == "en" and "" or wmlang:getCode() .. ":") .. term .. "]] " .. concat(links, " and ") .. " on " .. (wmlang:getCode() == "en" and "" or "the " .. wmlang:getCanonicalName() .. " ") .. " " .. iargs["name"] .. (args["nodot"] and "" or ".") .. concat(iplinks) end return export k4cs1tn4v37029w3ia8qq4zkyfpvwnz मॉड्यूल:labels/data/lang 828 304265 487746 477418 2026-09-02T14:55:11Z SM7 6218 updating... 487746 Scribunto text/plain -- Table listing all of the languages with lang-specific labels modules. local langs_with_lang_specific_modules = { ["ab"] = true, ["acm"] = true, ["ady"] = true, ["ae"] = true, ["af"] = true, ["afb"] = true, ["aht"] = true, ["aii"] = true, ["ain"] = true, ["ajp"] = true, ["ak"] = true, ["akk"] = true, ["amf"] = true, ["an"] = true, ["ang"] = true, ["apc"] = true, ["ar"] = true, ["arc"] = true, ["arq"] = true, ["arz"] = true, ["as"] = true, ["ast"] = true, ["av"] = true, ["ayl"] = true, ["az"] = true, ["bar"] = true, ["bcl"] = true, ["be"] = true, ["bew"] = true, ["bg"] = true, ["bho"] = true, ["bn"] = true, ["bo"] = true, ["br"] = true, ["bsh"] = true, ["bua"] = true, ["byk"] = true, ["ca"] = true, ["car"] = true, ["cbk"] = true, ["ceb"] = true, ["cel-pro"] = true, ["ch"] = true, ["cho"] = true, ["chr"] = true, ["cim"] = true, ["ckb"] = true, ["cop"] = true, ["cpg"] = true, ["cpi"] = true, ["crh"] = true, ["crp-cpr"] = true, ["cs"] = true, ["csb"] = true, ["cu"] = true, ["cy"] = true, ["da"] = true, ["dcc"] = true, ["de"] = true, ["dlm"] = true, ["dng"] = true, ["dnj"] = true, ["dum"] = true, ["dv"] = true, ["egl"] = true, ["egy"] = true, ["el"] = true, ["en"] = true, ["enm"] = true, ["es"] = true, ["et"] = true, ["eu"] = true, ["evn"] = true, ["fa"] = true, ["fax"] = true, ["ff"] = true, ["fi"] = true, ["fo"] = true, ["fr"] = true, ["fro"] = true, ["frp"] = true, ["frr"] = true, ["fur"] = true, ["fy"] = true, ["ga"] = true, ["gd"] = true, ["gem-pro"] = true, ["gl"] = true, ["gmq-oda"] = true, ["gmq-pro"] = true, ["gmw-bgh"] = true, ["gmw-cfr"] = true, ["gmw-ecg"] = true, ["gmw-pro"] = true, ["gmw-rfr"] = true, ["gmy"] = true, ["goh"] = true, ["grc"] = true, ["grk-ita"] = true, ["gsw"] = true, ["gu"] = true, ["gug"] = true, ["guw"] = true, ["ha"] = true, ["haa"] = true, ["haw"] = true, ["he"] = true, ["hi"] = true, ["hit"] = true, ["hrx"] = true, ["hsb"] = true, ["ht"] = true, ["hu"] = true, ["hy"] = true, ["id"] = true, ["idb"] = true, ["ilo"] = true, ["inc-apa"] = true, ["inc-ash"] = true, ["inc-ohi"] = true, ["is"] = true, ["it"] = true, ["iu"] = true, ["izh"] = true, ["ja"] = true, ["jbo"] = true, ["jje"] = true, ["jut"] = true, ["jv"] = true, ["ka"] = true, ["kbd"] = true, ["kca-eas"] = true, ["kca-nor"] = true, ["kca-sou"] = true, ["kea"] = true, ["kho"] = true, ["kix"] = true, ["klj"] = true, ["kls"] = true, ["kmr"] = true, ["kn"] = true, ["kne"] = true, ["ko"] = true, ["kok"] = true, ["kpt"] = true, ["kpv"] = true, ["krc"] = true, ["krl"] = true, ["kry"] = true, ["kw"] = true, ["kzw"] = true, ["la"] = true, ["lad"] = true, ["li"] = true, ["lij"] = true, ["lis"] = true, ["liv"] = true, ["lld"] = true, ["lmo"] = true, ["lrl"] = true, ["lv"] = true, ["lzz"] = true, ["mak"] = true, ["mch"] = true, ["mco"] = true, ["mh"] = true, ["mhd"] = true, ["mic"] = true, ["mk"] = true, ["ml"] = true, ["mlm"] = true, ["mn"] = true, ["mns-cen"] = true, ["mns-nor"] = true, ["mns-sou"] = true, ["moh"] = true, ["mr"] = true, ["ms"] = true, ["mt"] = true, ["mui"] = true, ["mul"] = true, ["mus"] = true, ["mvi"] = true, ["mwl"] = true, ["my"] = true, ["nap"] = true, ["nb"] = true, ["nds"] = true, ["ne"] = true, ["new"] = true, ["nhn"] = true, ["nhx"] = true, ["niv"] = true, ["nl"] = true, ["nn"] = true, ["non"] = true, ["nrf"] = true, ["nrn"] = true, ["nv"] = true, ["oc"] = true, ["oj"] = true, ["oko"] = true, ["okz"] = true, ["onb"] = true, ["os"] = true, ["osc"] = true, ["ota"] = true, ["otk"] = true, ["pa"] = true, ["pam"] = true, ["paw"] = true, ["peh"] = true, ["phl"] = true, ["pl"] = true, ["pms"] = true, ["pnt"] = true, ["poz-pro"] = true, ["ppl"] = true, ["pra"] = true, ["ps"] = true, ["pt"] = true, ["qu"] = true, ["qwc"] = true, ["qwm"] = true, ["rcf"] = true, ["rgn"] = true, ["rm"] = true, ["rmc"] = true, ["rml"] = true, ["rmn"] = true, ["rmy"] = true, ["ro"] = true, ["roa-bbn"] = true, ["roa-leo"] = true, ["roa-ona"] = true, ["roa-opt"] = true, ["rom"] = true, ["rsk"] = true, ["ru"] = true, ["rue"] = true, ["rup"] = true, ["rw"] = true, ["rys"] = true, ["ryu"] = true, ["sa"] = true, ["saj"] = true, ["sc"] = true, ["scl"] = true, ["scn"] = true, ["sco"] = true, ["sd"] = true, ["se"] = true, ["sel-sou"] = true, ["sgh"] = true, ["sh"] = true, ["shi"] = true, ["sjd"] = true, ["sjs"] = true, ["sk"] = true, ["skr"] = true, ["sl"] = true, ["sla-pro"] = true, ["smi-pro"] = true, ["sn"] = true, ["sq"] = true, ["srn"] = true, ["su"] = true, ["sux"] = true, ["sv"] = true, ["sw"] = true, ["szl"] = true, ["ta"] = true, ["taa"] = true, ["tay"] = true, ["te"] = true, ["tet"] = true, ["tfn"] = true, ["tg"] = true, ["th"] = true, ["tkr"] = true, ["tl"] = true, ["tmh"] = true, ["tpw"] = true, ["tr"] = true, ["trk-pro"] = true, ["tsg"] = true, ["tt"] = true, ["tuw-sol"] = true, ["tyv"] = true, ["udi"] = true, ["udm"] = true, ["uk"] = true, ["ur"] = true, ["urj-fin-pro"] = true, ["uz"] = true, ["vot"] = true, ["war"] = true, ["vec"] = true, ["vi"] = true, ["vo"] = true, ["xcl"] = true, ["xh"] = true, ["xme-ker"] = true, ["xmf"] = true, ["xpg"] = true, ["xqa"] = true, ["xum"] = true, ["ycr"] = true, ["yi"] = true, ["yo"] = true, ["yok-bvy"] = true, ["yok-dly"] = true, ["yok-kry"] = true, ["yok-nvy"] = true, ["yok-svy"] = true, ["yok-tky"] = true, ["yrk-tun"] = true, ["yrl"] = true, ["za"] = true, ["xbo"] = true, ["zh"] = true, ["zle-ono"] = true, ["zle-ort"] = true, ["zls-chs"] = true, ["zlw-ocs"] = true, ["zlw-opl"] = true, ["zlw-osk"] = true, ["zlw-slv"] = true, ["zu"] = true, } return { langs_with_lang_specific_modules = langs_with_lang_specific_modules, } lkqksfcuw1x2kj4t43eisbfne0c3a0d मॉड्यूल:parse utilities 828 304307 487752 475624 2026-09-02T15:08:37Z SM7 6218 updating... 487752 Scribunto text/plain local export = {} local fun_is_callable_module = "Module:fun/isCallable" local languages_module = "Module:languages" local parameters_module = "Module:parameters" local string_char_module = "Module:string/char" local string_utilities_module = "Module:string utilities" local table_insert_if_not_module = "Module:table/insertIfNot" local assert = assert local concat = table.concat local dump = mw.dumpObject local error = error local insert = table.insert local ipairs = ipairs local list_to_text = mw.text.listToText local pairs = pairs local require = require local sort = table.sort local type = type local ugsub = mw.ustring.gsub local function convert_val(...) convert_val = require(parameters_module).convert_val return convert_val(...) end local function get_lang(...) get_lang = require(languages_module).getByCode return get_lang(...) end local function insert_if_not(...) insert_if_not = require(table_insert_if_not_module) return insert_if_not(...) end local function is_callable(...) is_callable = require(fun_is_callable_module) return is_callable(...) end local function split(...) split = require(string_utilities_module).split return split(...) end local function u(...) u = require(string_char_module) return u(...) end local function umatch(...) umatch = require(string_utilities_module).match return umatch(...) end --[==[ intro: In order to understand the following parsing code, you need to understand how inflected text specs work. They are intended to work with inflected text where individual words to be inflected may be followed by inflection specs in angle brackets. The format of the text inside of the angle brackets is up to the individual language and part-of-speech specific implementation. A real-world example is as follows: `<nowiki>[[медичний|меди́чна]]<+> [[сестра́]]<*,*#.pr></nowiki>`. This is the inflection of the Ukrainian multiword expression {{m|uk|меди́чна сестра́||nurse|lit=medical sister}}, consisting of two words: the adjective {{m|uk|меди́чна||medical|pos=feminine singular}} and the noun {{m|uk|сестра́||sister}}. The specs in angle brackets follow each word to be inflected; for example, `<+>` means that the preceding word should be declined as an adjective. The code below works in terms of balanced expressions, which are bounded by delimiters such as `< >` or `[ ]`. The intention is to allow separators such as spaces to be embedded inside of delimiters; such embedded separators will not be parsed as separators. For example, Ukrainian noun specs allow footnotes in brackets to be inserted inside of angle brackets; something like `меди́чна<+> сестра́<pr.[this is a footnote]>` is legal, as is `<nowiki>[[медичний|меди́чна]]<+> [[сестра́]]<pr.[this is an <i>italicized footnote</i>]></nowiki>`, and the parsing code should not be confused by the embedded brackets, spaces or angle brackets. The parsing is done by two functions, which work in close concert: {parse_balanced_segment_run()} and {split_alternating_runs()}. To illustrate, consider the following: {parse_balanced_segment_run("foo<M.proper noun> bar<F>", "<", ">")} =<br /> { {"foo", "<M.proper noun>", " bar", "<F>", ""}} then {split_alternating_runs({"foo", "<M.proper noun>", " bar", "<F>", ""}, " ")} =<br /> { {{"foo", "<M.proper noun>", ""}, {"bar", "<F>", ""}}} Here, we start out with a typical inflected text spec `foo<M.proper noun> bar<F>`, call {parse_balanced_segment_run()} on it, and call {split_alternating_runs()} on the result. The output of {parse_balanced_segment_run()} is a list where even-numbered segments are bounded by the bracket-like characters passed into the function, and odd-numbered segments consist of the surrounding text. {split_alternating_runs()} is called on this, and splits '''only''' the odd-numbered segments, grouping all segments between the specified character. Note that the inner lists output by {split_alternating_runs()} are themselves in the same format as the output of {parse_balanced_segment_run()}, with bracket-bounded text in the even-numbered segments. Hence, such lists can be passed again to {split_alternating_runs()}. ]==] --[==[ Parse a string containing matched instances of parens, brackets or the like. Return a list of strings, alternating between textual runs not containing the open/close characters and runs beginning and ending with the open/close characters. For example, {parse_balanced_segment_run("foo(x(1)), bar(2)", "(", ")") = {"foo", "(x(1))", ", bar", "(2)", ""}} ]==] function export.parse_balanced_segment_run(segment_run, open, close) return split(segment_run, "(%b" .. open .. close .. ")") end -- The following is an equivalent, older implementation that does not use %b (written before I was aware of %b). --[=[ function export.parse_balanced_segment_run(segment_run, open, close) local break_on_open_close = split(segment_run, "([%" .. open .. "%" .. close .. "])") local text_and_specs = {} local level = 0 local seg_group = {} for i, seg in ipairs(break_on_open_close) do if i % 2 == 0 then if seg == open then insert(seg_group, seg) level = level + 1 else assert(seg == close) insert(seg_group, seg) level = level - 1 if level < 0 then error("Unmatched " .. close .. " sign: '" .. segment_run .. "'") elseif level == 0 then insert(text_and_specs, concat(seg_group)) seg_group = {} end end elseif level > 0 then insert(seg_group, seg) else insert(text_and_specs, seg) end end if level > 0 then error("Unmatched " .. open .. " sign: '" .. segment_run .. "'") end return text_and_specs end ]=] --[==[ Like parse_balanced_segment_run() but accepts multiple sets of delimiters. For example, {parse_multi_delimiter_balanced_segment_run("foo[bar(baz[bat])], quux<glorp>", {{"[", "]"}, {"(", ")"}, {"<", ">"}}) = {"foo", "[bar(baz[bat])]", ", quux", "<glorp>", ""}}. Each element in the list of delimiter pairs is a string specifying an equivalence class of possible delimiter characters. You can use this, for example, to allow either "[" or "&amp;#91;" to be treated equivalently, with either one closed by either "]" or "&amp;#93;". To do this, first replace "&amp;#91;" and "&amp;#93;" with single Unicode characters such as U+FFF0 and U+FFF1, and then specify a two-character string containing "[" and U+FFF0 as the opening delimiter, and a two-character string containing "]" and U+FFF1 as the corresponding closing delimiter. If `no_error_on_unmatched` is given and an error is found during parsing, a string is returned containing the error message instead of throwing an error. ]==] function export.parse_multi_delimiter_balanced_segment_run(segment_run, delimiter_pairs, no_error_on_unmatched) local escaped_delimiter_pairs = {} local open_to_close_map = {} local open_close_items = {} local open_items = {} for _, open_close in ipairs(delimiter_pairs) do local open, close = open_close[1], open_close[2] open = open:gsub("([%[%]%%%%-])", "%%%1") close = close:gsub("([%[%]%%%%-])", "%%%1") insert(open_close_items, open) insert(open_close_items, close) insert(open_items, open) open = "[" .. open .. "]" close = "[" .. close .. "]" open_to_close_map[open] = close insert(escaped_delimiter_pairs, {open, close}) end local open_close_pattern = "([" .. concat(open_close_items) .. "])" local open_pattern = "([" .. concat(open_items) .. "])" local break_on_open_close = split(segment_run, open_close_pattern) local text_and_specs = {} local level = 0 local seg_group = {} local open_at_level_zero for i, seg in ipairs(break_on_open_close) do if i % 2 == 0 then insert(seg_group, seg) if level == 0 then if not umatch(seg, open_pattern) then local errmsg = "Unmatched close sign " .. seg .. ": '" .. segment_run .. "'" if no_error_on_unmatched then return errmsg else error(errmsg) end end assert(open_at_level_zero == nil) for _, open_close in ipairs(escaped_delimiter_pairs) do local open = open_close[1] if umatch(seg, open) then open_at_level_zero = open break end end if open_at_level_zero == nil then error(("Internal error: Segment %s didn't match any open regex"):format(seg)) end level = level + 1 elseif umatch(seg, open_at_level_zero) then level = level + 1 elseif umatch(seg, open_to_close_map[open_at_level_zero]) then level = level - 1 assert(level >= 0) if level == 0 then insert(text_and_specs, concat(seg_group)) seg_group = {} open_at_level_zero = nil end end elseif level > 0 then insert(seg_group, seg) else insert(text_and_specs, seg) end end if level > 0 then local errmsg = "Unmatched open sign " .. open_at_level_zero .. ": '" .. segment_run .. "'" if no_error_on_unmatched then return errmsg else error(errmsg) end end return text_and_specs end --[==[ Check whether a term contains top-level HTML. We want to distinguish inline modifiers from HTML. We assume an inline modifier is either a boolean modifier like `<bor>` or a prefix modifier like `<tr:Miryem>`. All other things inside of angle brackets, e.g. `<nowiki><span class="foo"></nowiki>`, `<nowiki></span></nowiki>`, `<nowiki><br/></nowiki>`, etc., should be flagged as HTML (typically caused by wrapping an argument in {{tl|m|...}}, {{tl|af|...}} or similar, but sometimes specified directly, e.g. `<nowiki><sup>6</sup></nowiki>`). By default, we assume the tag in an inline modifier contains either letters, numbers, hyphens or underscore (but not spaces), and must either stand alone or be followed by a colon, leading to a default HTML-checking pattern of {"<[%w_%-]*[^%w_%-:>]"}. But this can be modified; e.g. [[Module:tl-pronunciation]] allows modifiers of the form `<<var>pos</var>^<var>defn</var>>` or `<<var>pos</var>,<var>pos</var>,<var>pos</var>^<var>defn</var>>`, and would need to use its own HTML pattern. It's important we restrict the check for HTML to top-level to allow for generated HTML inside of e.g. qualifier tags, such as `<nowiki>foo<q:similar to {{m|fr|bar}}></nowiki>`. ]==] function export.term_contains_top_level_html(term, html_pattern) html_pattern = html_pattern or "<[%w_%-]*[^%w_%-:>]" -- If no HTML anywhere, the answer is no. if not term:find(html_pattern) then return false end -- Otherwise, we have to call parse_balanced_segment_run() and check alternate runs at top level. local runs = export.parse_balanced_segment_run(term, "<", ">") for i = 2, #runs, 2 do if runs[i]:find("^" .. html_pattern) then return true end end return false end --[==[ Check whether a term appears to have already been passed through `full_link()`. Passing it again will mangle it in various ways; at best it will have unnecessary lang/script wrapping, which might do nothing but might result in overly large fonts or other issues. We also check for uses of {{tl|ja-r/args}}, {{tl|ryu-r/args}} or {{tl|ko-l/args}}, which will be manged by `full_link()`. If this check succeeds, use the text raw instead of passing through `full_link()`. ]==] function export.term_already_linked(term) return term:find("<span") or term:find("{{ja%-r|") or term:find("{{ryu%-r|") or term:find("{{ko%-l|") end --[==[ Split a list of alternating textual runs of the format returned by `parse_balanced_segment_run` on `splitchar`. This only splits the odd-numbered textual runs (the portions between the balanced open/close characters). The return value is a list of lists, where each list contains an odd number of elements, where the even-numbered elements of the sublists are the original balanced textual run portions. For example, if we do {parse_balanced_segment_run("foo<M.proper noun> bar<F>", "<", ">") = {"foo", "<M.proper noun>", " bar", "<F>", ""}} then {split_alternating_runs({"foo", "<M.proper noun>", " bar", "<F>", ""}, " ") = {{"foo", "<M.proper noun>", ""}, {"bar", "<F>", ""}}} Note that we did not touch the text "<M.proper noun>" even though it contains a space in it, because it is an even-numbered element of the input list. This is intentional and allows for embedded separators inside of brackets/parens/etc. Note also that the inner lists in the return value are of the same form as the input list (i.e. they consist of alternating textual runs where the even-numbered segments are balanced runs), and can in turn be passed to split_alternating_runs(). If `preserve_splitchar` is passed in, the split character is included in the output, as follows: {split_alternating_runs({"foo", "<M.proper noun>", " bar", "<F>", ""}, " ", true) = {{"foo", "<M.proper noun>", ""}, {" "}, {"bar", "<F>", ""}}} Consider what happens if the original string has multiple spaces between brackets, and multiple sets of brackets without spaces between them. {parse_balanced_segment_run("foo[dated][low colloquial] baz-bat quux xyzzy[archaic]", "[", "]") = {"foo", "[dated]", "", "[low colloquial]", " baz-bat quux xyzzy", "[archaic]", ""}} then {split_alternating_runs({"foo", "[dated]", "", "[low colloquial]", " baz-bat quux xyzzy", "[archaic]", ""}, "[ %-]") = {{"foo", "[dated]", "", "[low colloquial]", ""}, {"baz"}, {"bat"}, {"quux"}, {"xyzzy", "[archaic]", ""}}} If `preserve_splitchar` is passed in, the split character is included in the output, as follows: {split_alternating_runs({"foo", "[dated]", "", "[low colloquial]", " baz bat quux xyzzy", "[archaic]", ""}, "[ %-]", true) = {{"foo", "[dated]", "", "[low colloquial]", ""}, {" "}, {"baz"}, {"-"}, {"bat"}, {" "}, {"quux"}, {" "}, {"xyzzy", "[archaic]", ""}}} As can be seen, the even-numbered elements in the outer list are one-element lists consisting of the separator text. ]==] function export.split_alternating_runs(segment_runs, splitchar, preserve_splitchar) local grouped_runs = {} local run = {} for i, seg in ipairs(segment_runs) do if i % 2 == 0 then insert(run, seg) else local parts = split(seg, preserve_splitchar and "(" .. splitchar .. ")" or splitchar) insert(run, parts[1]) for j=2,#parts do insert(grouped_runs, run) run = {parts[j]} end end end if #run > 0 then insert(grouped_runs, run) end return grouped_runs end --[==[ After calling `parse_multi_delimiter_balanced_segment_run()`, rejoin delimiter-bounded textual runs (i.e. textual runs surrounded by certain matched delimiters) with the runs on either side. This can be used when some of the matched delimiters are specified only in order to ensure that delimiters inside of other delimiters aren't parsed. As an example, [[Module:object usage]] calls {m_parse_utilities.parse_multi_delimiter_balanced_segment_run(object, {{"[", "]"}, {"(", ")"}, {"<", ">"}})} but the actual syntax of {{tl|+obj}} only uses parens and angle brackets as delimiters. Square brackets are included so that internal links are treated as units (i.e. parens and angle brackets occurring inside of them aren't parsed), but beyond that we don't treat square brackets as delimiters, so we want to rejoin square-bracket-delimited textual runs with adjacent runs before further parsing. There are two primary workflows when using this function: # If you only care about balanced delimiters occurring inside of other balanced delimiters (e.g. in the above example with [[Module:object usage]], you can call `rejoin_delimited_runs()` directly after `parse_multi_delimiter_balanced_segment_run()`. # However, if you care about single delimiters such as commas and slashes occurring inside of balanced delimiters (e.g. if you allow multiple comma-separated terms, e.g. of which can have associated inline modifiers, and you don't want commas inside of internal links to be treated as delimiters), you need to call `rejoin_delimited_runs()` ''after'' calling `split_alternating_runs()`. This is used, for example, in `parse_inline_modifiers()` for exactly this reason, when a `splitchar` is provided. `data` is an object of properties. Currently there are two: `runs` (the output of calling `parse_multi_delimiter_balanced_segment_run()`, i.e. a list of textual runs, where even-numbered elements begin and end with a matched delimiter and odd-numbered elements are surrounding text) and `delimiter_pattern` (a Lua pattern matching delimited textual runs that we want to rejoin with the surrounding text). `delimiter_pattern` should normally be anchored at the beginning; e.g. {"^%["} would be the correct pattern to use when rejoining square-bracket-delimited textual runs, as described above. ]==] function export.rejoin_delimited_runs(data) local joined_runs = {} local i = 1 while i <= #data.runs do local run = data.runs[i] if i % 2 == 0 and run:find(data.delimiter_pattern) then joined_runs[#joined_runs] = joined_runs[#joined_runs] .. run .. data.runs[i + 1] i = i + 2 else insert(joined_runs, run) i = i + 1 end end return joined_runs end function export.strip_spaces(text) return (ugsub(text, "^%s*(.-)%s*$", "%1")) end --[==[ Apply an arbitrary function `frob` to the "raw-text" segments in a split run set (the output of split_alternating_runs()). We leave alone stuff within balanced delimiters (footnotes, inflection specs and the like), as well as splitchars themselves if present. `preserve_splitchar` indicates whether splitchars are present in the split run set. `frob` is a function of one argument (the string to frob) and should return one argument (the frobbed string). We operate by only frobbing odd-numbered segments, and only in odd-numbered runs if preserve_splitchar is given. ]==] function export.frob_raw_text_alternating_runs(split_run_set, frob, preserve_splitchar) for i, run in ipairs(split_run_set) do if not preserve_splitchar or i % 2 == 1 then for j, segment in ipairs(run) do if j % 2 == 1 then run[j] = frob(segment) end end end end end --[==[ Like split_alternating_runs() but applies an arbitrary function `frob` to "raw-text" segments in the result (i.e. not stuff within balanced delimiters such as footnotes and inflection specs, and not splitchars if present). `frob` is a function of one argument (the string to frob) and should return one argument (the frobbed string). ]==] function export.split_alternating_runs_and_frob_raw_text(run, splitchar, frob, preserve_splitchar) local split_runs = export.split_alternating_runs(run, splitchar, preserve_splitchar) export.frob_raw_text_alternating_runs(split_runs, frob, preserve_splitchar) return split_runs end --[==[ FIXME: Older entry point. Call `split_alternating_runs_and_frob_raw_text()` in [[Module:parse utilities]] directly. Like `split_alternating_runs()` but strips spaces from both ends of the odd-numbered elements (only in odd-numbered runs if `preserve_splitchar` is given). Effectively we leave alone the footnotes and splitchars themselves, but otherwise strip extraneous spaces. Spaces in the middle of an element are also left alone. ]==] function export.split_alternating_runs_and_strip_spaces(segment_runs, splitchar, preserve_splitchar) return export.split_alternating_runs_and_frob_raw_text(segment_runs, splitchar, export.strip_spaces, preserve_splitchar) end --[==[ Split the non-modifier parts of an alternating run (after parse_balanced_segment_run() is called) on a Lua pattern, but not on certain sequences involving characters in that pattern (e.g. comma+whitespace). `splitchar` is the pattern to split on; `preserve_splitchar` indicates whether to preserve the delimiter and is the same as in split_alternating_runs(). `escape_fun` is called beforehand on each run of raw text and should return two values: the escaped run and whether unescaping is needed. If any call to `escape_fun` indicates that unescaping is needed, `unescape_fun` will be called on each run of raw text after splitting on `splitchar`. The return value of this function is as in split_alternating_runs(). ]==] function export.split_alternating_runs_escaping(run, splitchar, preserve_splitchar, escape_fun, unescape_fun) -- First replace comma with a temporary character in comma+whitespace sequences. local need_unescape = false for i in ipairs(run) do if i % 2 == 1 and escape_fun then local this_need_unescape run[i], this_need_unescape = escape_fun(run[i]) need_unescape = need_unescape or this_need_unescape end end if need_unescape then return export.split_alternating_runs_and_frob_raw_text(run, splitchar, unescape_fun, preserve_splitchar) else return export.split_alternating_runs(run, splitchar, preserve_splitchar) end end --[==[ Replace comma with a temporary char in comma + whitespace. ]==] function export.escape_comma_whitespace(run, tempcomma) tempcomma = tempcomma or u(0xFFF0) local escaped = false if run:find("\\,") then -- FIXME: we should probably convert literal \\ to \ to allow people to put a backslash before a comma that -- should be passed through; but maybe it's enough to use an HTML escape for the comma or backslash. run = (run:gsub("\\,", tempcomma)) -- discard backslash before comma, doing its duty to protect the comma escaped = true end if run:find(",%s") then run = (run:gsub(",(%s)", tempcomma .. "%1")) escaped = true end return run, escaped end --[==[ Undo the replacement of comma with a temporary char. ]==] function export.unescape_comma_whitespace(run, tempcomma) tempcomma = tempcomma or u(0xFFF0) return (run:gsub(tempcomma, ",")) end --[==[ Split the non-modifier parts of an alternating run (after parse_balanced_segment_run() is called) on comma, but not on comma+whitespace. See `split_on_comma()` above for more information and the meaning of `tempcomma`. ]==] function export.split_alternating_runs_on_comma(run, tempcomma) tempcomma = tempcomma or u(0xFFF0) -- Replace comma with a temporary char in comma + whitespace. local function escape_comma_whitespace(seg) return export.escape_comma_whitespace(seg, tempcomma) end -- Undo replacement of comma with a temporary char in comma + whitespace. local function unescape_comma_whitespace(seg) return export.unescape_comma_whitespace(seg, tempcomma) end return export.split_alternating_runs_escaping(run, ",", false, escape_comma_whitespace, unescape_comma_whitespace) end --[==[ Split text on a Lua pattern, but not on certain sequences involving characters in that pattern (e.g. comma+whitespace). `splitchar` is the pattern to split on; `preserve_splitchar` indicates whether to preserve the delimiter between split segments. `escape_fun` is called beforehand on the text and should return two values: the escaped run and whether unescaping is needed. If the call to `escape_fun` indicates that unescaping is needed, `unescape_fun` will be called on each run of text after splitting on `splitchar`. The return value of this a list of runs, interspersed with delimiters if `preserve_splitchar` is specified. ]==] function export.split_escaping(text, splitchar, preserve_splitchar, escape_fun, unescape_fun) if not umatch(text, splitchar) then return {text} end -- If there are square or angle brackets, we don't want to split on delimiters inside of them. To effect this, we -- use parse_multi_delimiter_balanced_segment_run() to parse balanced brackets, then do delimiter splitting on the -- non-bracketed portions of text using split_alternating_runs_escaping(), and concatenate back to a list of -- strings. When calling parse_multi_delimiter_balanced_segment_run(), we make sure not to throw an error on -- unbalanced brackets; in that case, we fall through to the code below that handles the case without brackets. if text:find("[%[<]") then local runs = export.parse_multi_delimiter_balanced_segment_run(text, {{"[", "]"}, {"<", ">"}}, "no error on unmatched") if type(runs) ~= "string" then local split_runs = export.split_alternating_runs_escaping(runs, splitchar, preserve_splitchar, escape_fun, unescape_fun) for i = 1, #split_runs do split_runs[i] = concat(split_runs[i]) end return split_runs end end -- First escape sequences we don't want to count for splitting. local need_unescape if escape_fun then text, need_unescape = escape_fun(text) end local parts = split(text, preserve_splitchar and "(" .. splitchar .. ")" or splitchar) if need_unescape then for i = 1, #parts, (preserve_splitchar and 2 or 1) do parts[i] = unescape_fun(parts[i]) end end return parts end --[==[ Split text on comma, but not on comma+whitespace. This is similar to `mw.text.split(text, ",")` but will not split on commas directly followed by whitespace, to handle embedded commas in terms (which are almost always followed by a space). `tempcomma` is the Unicode character to temporarily use when doing the splitting; normally U+FFF0, but you can specify a different character if you use U+FFF0 for some internal purpose. ]==] function export.split_on_comma(text, tempcomma) -- Don't do anything if no comma. Note that split_escaping() has a similar check at the beginning, so if there's a -- comma we effectively do this check twice, but this is worth it to optimize for the common no-comma case. if not text:find(",") then return {text} end tempcomma = tempcomma or u(0xFFF0) -- Replace comma with a temporary char in comma + whitespace. local function escape_comma_whitespace(run) return export.escape_comma_whitespace(run, tempcomma) end -- Undo replacement of comma with a temporary char in comma + whitespace. local function unescape_comma_whitespace(run) return export.unescape_comma_whitespace(run, tempcomma) end return export.split_escaping(text, ",", false, escape_comma_whitespace, unescape_comma_whitespace) end --[==[ Ensure that Wikicode (template calls, bracketed links, HTML, bold/italics, etc.) displays literally in error messages by inserting a Unicode word-joiner symbol after all characters that may trigger Wikicode interpretation. Replacing with equivalent HTML escapes doesn't work because they are displayed literally. I could not get this to work using <nowiki>...</nowiki> (those tags display literally), using using {{#tag:nowiki|...}} (same thing) or using mw.getCurrentFrame():extensionTag("nowiki", ...) (everything gets converted to a strip marker `UNIQ--nowiki-00000000-QINU` or similar). FIXME: This is a massive hack; there must be a better way. ]==] function export.escape_wikicode(term) term = term:gsub("([%[<'{])", "%1" .. u(0x2060)) return term end function export.make_parse_err(arg_gloss) return function(msg, stack_frames_to_ignore) error(export.escape_wikicode(("%s: %s"):format(msg, arg_gloss)), stack_frames_to_ignore) end end -- Parse a term that may include a link '[[LINK]]' or a two-part link '[[LINK|DISPLAY]]'. FIXME: Doesn't currently -- handle embedded links like '[[FOO]] [[BAR]]' or [[FOO|BAR]] [[BAZ]]' or '[[FOO]]s'; if they are detected, it returns -- the term unchanged and `nil` for the display form. local function parse_bracketed_term(term, parse_err) local inside = term:match("^%[%[(.*)%]%]$") if inside then if inside:find("%[%[") or inside:find("%]%]") then -- embedded links, e.g. '[[FOO]] [[BAR]]'; FIXME: we should process them properly return term, nil end local parts = split(inside, "|") if #parts > 2 then parse_err("Saw more than two parts inside a bracketed link") end return parts[1], parts[2] end return term, nil end --[==[ Parse a term that may have a language code (or possibly multiple plus-separated language codes, if `data.allow_multiple` is given) preceding it (e.g. {la:minūtia} or {grc:[[σκῶρ|σκατός]]} or {nan-hbl+hak:[[毋]][[知]]}). Return five arguments: # the original prefixed term; in the case of a Wikipedia or Wikisource prefix followed by a two-part link, it is a two-part link with the Wikipedia/Wikisource prefix moved inside the link; in the case of a Wikipedia or Wikisource prefix followed by a redundant one-part link, the brackets are removed; # the language object corresponding to the language code (possibly a family object if `data.allow_family` is given), or a list of such objects if `data.allow_multiple` is given; # the link if the unprefixed term is of the form <code>[[<var>link</var>|<var>display</var>]]</code> or of the form <code>[[<var>link</var>]]</code>, otherwise the full unprefixed term; # the display part if the term is of the form <code>[[<var>link</var>|<var>display</var>]]</code> or has a Wikipedia or Wikisource prefix (in which case the part minus the prefix and any following language code will be returned, with redundant brackets stripped), else {nil}; # {true} if the term has a Wikipedia/Wikisource prefix, else {false}. Etymology-only languages are always allowed. This function also correctly handles Wikipedia prefixes (e.g. {w:Abatemarco} or {w:it:Colle Val d'Elsa} or {lw:ru:Филарет}) and Wikisource prefixes (e.g. {s:Twelve O'Clock} or {s:[[Walden/Chapter XVIII|Walden]]} or {s:fr:Perceval ou le conte du Graal} or {s:ro:[[Domnul Vucea|Mr. Vucea]]} or {ls:ko:이상적 부인} or {ls:ko:[[조선 독립의 서#一. 槪論|조선 독립의 서]]}) and converts them into two-part links, with the display form not including the Wikipedia or Wikisource prefix unless it was explicitly specified using a two-part link as in {lw:ru:[[Филарет (Дроздов)|Митрополи́т Филаре́т]]} or {ls:ko:[[조선 독립의 서#一. 槪論|조선 독립의 서]]}. The difference between {w:} ("Wikipedia") and {lw:} ("Wikipedia link") is that the latter requires a language code and returns the corresponding language object; same for the difference between {s:} ("Wikisource") and {ls:} ("Wikisource link"). NOTE: Embedded links are not correctly handled currently. If an embedded link is detected, the whole term is returned as the link part (third argument), and the display part is nil. If you construct your own link from the link and display parts, you must check for this. The calling convention is to pass in a single argument `data` containing the following fields: * `term`: The term to parse. * `parse_err`: An optional function of one or two arguments to display an error. (The second argument to the function is the number of stack frames to ignore when calling error(); if you declare your error function with only one argument, things will still work fine.) * `paramname`: If `parse_err` is omitted, this should be a string naming a parameter to display in the error message, along with the term in question, and will be used to generate a `parse_err` function using `make_parse_err()`. (If `paramname` is omitted, just the term itself appears in the error message.) * `allow_multiple`: Allow multiple plus-separated language codes, e.g. {nan-hbl+hak:[[毋]][[知]]}. See above. * `allow_family`: Allow family objects to appear in place of language codes. * `allow_bad`: Don't throw an error on invalid language code prefixes; instead, include the prefix and colon as part of the term. Note that if a prefix doesn't look like a language code (e.g. if it's a number), the code won't even try to parse it as a language code, regardless of the `allow_bad` setting, but will always include it in the term. * `lang_cache`: A table mapping language codes to language objects, where invalid language codes are indicated by the value `false`. If this field is specified, the cache will be consulted before calling `getByCode()` in [[Module:languages]], and the result cached. If not specified, no cache will be used. ]==] function export.parse_term_with_lang(data) local term = data.term local parse_err = data.parse_err or data.paramname and export.make_parse_err(("%s=%s"):format(data.paramname, term)) or export.make_parse_err(term) -- Parse off an initial language code (e.g. 'la:minūtia' or 'grc:[[σκῶρ|σκατός]]'). First check for Wikipedia -- prefixes ('w:Abatemarco' or 'w:it:Colle Val d'Elsa' or 'lw:zh:邹衡') and Wikisource prefixes -- ('s:ro:[[Domnul Vucea|Mr. Vucea]]' or 'ls:ko:이상적 부인'). Wikipedia/Wikisource language codes follow a similar -- format to Wiktionary language codes (see below). Here and below we don't parse if there's a space after the -- colon (happens e.g. if the user uses {{desc|...}} inside of {{col}}, grrr ...). local termlang, foreign_wiki, actual_term = term:match("^(l?[ws]):([a-z][a-z][a-z-]*):([^ ].*)$") if not termlang then termlang, actual_term = term:match("^([ws]):([^ ].*)$") end if termlang then local wiki_links = termlang:find("^l") local base_wiki_prefix = termlang:find("w$") and "w:" or "s:" local wiki_prefix = base_wiki_prefix .. (foreign_wiki and foreign_wiki .. ":" or "") local link, display = parse_bracketed_term(actual_term, parse_err) if link:find("%[%[") or display and display:find("%[%[") then -- FIXME, this should be handlable with the right parsing code parse_err("Cannot have embedded brackets following a Wikipedia (w:... or lw:...) link; expand the term to a fully bracketed term w:[[LINK|DISPLAY]] or similar") end local lang = wiki_links and get_lang(foreign_wiki, parse_err, "allow etym") or nil local prefixed_link = wiki_prefix .. link if display then return ("[[%s|%s]]"):format(prefixed_link, display), lang, prefixed_link, display, true else -- Return the link minus any language codes as the fourth term (display form). Previously we returned `actual_term` -- but this causes problems with redundant Wikipedia links of the form `w:[[Dragon Ball Z]]`. Don't generate a -- two-part link so you can specify a display form in 3=. Note that the fourth and fifth params are currently only -- used in [[Module:quote]]. return prefixed_link, lang, prefixed_link, link, true end end -- Wiktionary language codes are in one of the following formats, where 'x' is a lowercase letter and 'X' an -- uppercase letter: -- xx -- xxx -- xxx-xxx -- xxx-xxx-xxx (esp. for protolanguages) -- xx-xxx (for etymology-only languages) -- xx-xxx-xxx (maybe? for etymology-only languages) -- xx-XX (for etymology-only languages, where XX is a country code, e.g. en-US) -- xxx-XX (for etymology-only languages, where XX is a country code) -- xx-xxx-XX (for etymology-only languages, where XX is a country code) -- xxx-xxx-XX (for etymology-only langauges, where XX is a country code, e.g. nan-hbl-PH) -- Things like xxx-x+ (e.g. cmn-pinyin, cmn-tongyong) -- VL., LL., etc. -- -- We check the for nonstandard Latin etymology language codes separately, and otherwise make only the following -- assumptions: -- (1) There are one to three hyphen-separated components. -- (2) The last component can consist of two uppercase ASCII letters; otherwise, all components contain only -- lowercase ASCII letters. -- (3) Each component must have at least two letters. -- (4) The first component must have two or three letters. local function is_possible_lang_code(code) -- Special hack for Latin variants, which can have nonstandard etym codes, e.g. VL., LL. if code:find("^[A-Z]L%.$") then return true end return code:find("^([a-z][a-z][a-z]?)$") or code:find("^[a-z][a-z][a-z]?%-[A-Z][A-Z]$") or code:find("^[a-z][a-z][a-z]?%-[a-z][a-z]+$") or code:find("^[a-z][a-z][a-z]?%-[a-z][a-z]+%-[A-Z][A-Z]$") or code:find("^[a-z][a-z][a-z]?%-[a-z][a-z]+%-[a-z][a-z]+$") end local function get_by_code(code, allow_bad) local lang if data.lang_cache then lang = data.lang_cache[code] end if lang == nil then lang = get_lang(code, not allow_bad and parse_err or nil, "allow etym", data.allow_family) if data.lang_cache then data.lang_cache[code] = lang or false end end return lang or nil end if data.allow_multiple then local termlang_spec termlang_spec, actual_term = term:match("^([a-zA-Z.,+-]+):([^ ].*)$") if termlang_spec then termlang = split(termlang_spec, "[,+]") local all_possible_code = true for _, code in ipairs(termlang) do if not is_possible_lang_code(code) then all_possible_code = false break end end if all_possible_code then local saw_nil = false for i, code in ipairs(termlang) do termlang[i] = get_by_code(code, data.allow_bad) if not termlang[i] then saw_nil = true end end if saw_nil then termlang = nil else term = actual_term end else termlang = nil end end else termlang, actual_term = term:match("^([a-zA-Z.-]+):([^ ].*)$") if termlang then if is_possible_lang_code(termlang) then termlang = get_by_code(termlang, data.allow_bad) if termlang then term = actual_term end else termlang = nil end end end local link, display = parse_bracketed_term(term, parse_err) return term, termlang, link, display, false end --[==[ Maybe parse any language prefix off of a given term and store the term and language(s) into a new or existing object. This function is useful for implementing a `generate_obj` handler of `parse_inline_modifiers` that can support terms with prefixed language(s). This wraps `parse_term_with_lang` and has the same handling of language prefixes as that function. The calling convention is to pass in a single argument `data` containing the following fields (NOTE: you must set `parse_lang_prefix` to get language-prefix-parsing behavior): * `term`: The term to parse. This is the only required parameter. * `parse_lang_prefix`: This must be specified in order for language prefixes to be recognized and parsed off. * `termobj`: The existing object to store results into. If unspecified, a new object is created. * `term_dest`: The field in `termobj` into which the term itself (minus any language prefix) is stored. If unspecified, defaults to {"term"}. * `parse_err`: An optional function of one or two arguments to display an error. (The second argument to the function is the number of stack frames to ignore when calling error(); if you declare your error function with only one argument, things will still work fine.) * `paramname`: If `parse_err` is omitted, this should be a string naming a parameter to display in the error message, along with the term in question, and will be used to generate a `parse_err` function using `make_parse_err()`. (If `paramname` is omitted, just the term itself appears in the error message.) * `allow_multiple_lang_prefixes`: Allow multiple plus-separated language codes, e.g. {nan-hbl+hak:[[毋]][[知]]}. See `parse_term_with_lang` for more information. * `allow_bad_lang_prefix`: Don't throw an error on invalid language code prefixes; instead, include the prefix and colon as part of the term. Note that if a prefix doesn't look like a language code (e.g. if it's a number), the code won't even try to parse it as a language code, regardless of this setting, but will always include it in the term. * `allow_family_as_lang_prefix`: Allow family objects to appear in place of language codes. * `lang_cache`: A table mapping language codes to language objects, where invalid language codes are indicated by the value `false`. If this field is specified, the cache will be consulted before calling `getByCode()` in [[Module:languages]], and the result cached. If not specified, no cache will be used. The return value is the object in `data.termobj` (if non-{nil}) or a newly-created object (otherwise), with the parsed-off term stored in the field named by the `data.term_dest` property (normally `.term`). If `data.allow_multiple_lang_prefixes` was not given and a language prefix was parsed off, the corresponding language object is stored into both `lang` and `termlang` (the storage into `termlang` is so that the presence of a language prefix can specifically be determined in the event that `lang` is already set in an existing termobj). If `data.allow_multiple_lang_prefixes` was given and one or more language prefixes were parsed off, the first such language object is stored into `lang`, and the list of all language objects stored into `termlangs. ]==] function export.generate_obj_maybe_parsing_lang_prefix(data) local term = data.term local term_dest = data.term_dest or "term" local termobj = data.termobj or {} if data.parse_lang_prefix and term:find(":", nil, true) then local actual_term, termlangs = export.parse_term_with_lang { term = term, parse_err = data.parse_err, paramname = data.paramname, allow_bad = data.allow_bad_lang_prefix, allow_multiple = data.allow_multiple_lang_prefixes, allow_family = data.allow_family_as_lang_prefix, lang_cache = data.lang_cache, } termobj[term_dest] = actual_term ~= "" and actual_term or nil if termlangs then -- If we couldn't parse a language code, don't overwrite an existing setting in `lang` -- that may have originated from a separate |langN= param. if data.allow_multiple_lang_prefixes then termobj.termlangs = termlangs termobj.lang = termlangs and termlangs[1] or nil else termobj.termlang = termlangs termobj.lang = termlangs end end else termobj[term_dest] = term ~= "" and term or nil end return termobj end --[==[ Parse a term that may have inline modifiers attached (e.g. {rifiuti<q:plural-only>} or {rinfusa<t:bulk cargo><lit:resupplying><qq:more common in the plural {{m|it|rinfuse}}>}). * `arg` is the term to parse. * `props` is an object holding further properties controlling how to parse the term (only `param_mods` and `generate_obj` are required): ** `paramname` is the name of the parameter where `arg` comes from, or nil if this isn't available (it is used only in error messages). ** `param_mods` is a table describing the allowed inline modifiers (see below). ** `generate_obj` is a function of one or two arguments that should parse the argument minus the inline modifiers and return a corresponding parsed object (into which the inline modifiers will be rewritten). If declared with one argument, that will be the raw value to parse; if declared with two arguments, the second argument will be the `parse_err` function (see below). ** `parse_err` is an optional function of one argument (an error message) and should display the error message, along with any desired contextual text (e.g. the argument name and value that triggered the error). If omitted, a default function will be generated which displays the error along with the original value of `arg` (passed through {escape_wikicode()} above to ensure that Wikicode (such as links) is displayed literally). ** `splitchar` is a Lua pattern. If specified, `arg` can consist of multiple delimiter-separated terms, each of which may be followed by inline modifiers, and the return value will be a list of parsed objects instead of a single object. Note that splitting on delimiters will not happen in certain protected sequences (by default comma+whitespace; see below). The algorithm to split on delimiters is sensitive to inline modifier syntax and will not be confused by delimiters inside of inline modifiers, which do not trigger splitting (whether or not contained within protected sequences). ** `outer_container`, if specified, is used when multiple delimiter-separated terms are possible, and is the object into which the list of per-term objects is stored (into the `terms` field) and into which any modifiers that are given the `overall` property (see below) will be stored. If given, this value will be returned as the value of {parse_inline_modifiers()}. If `outer_container` is not given, {parse_inline_modifiers()} will return the list of per-term objects directly, and no modifier may have an `overall` property. ** `preserve_splitchar`, if specified, causes the actual delimiter matched by `splitchar` to be returned in the parsed object describing the element that comes after the delimiter. The delimiter is stored in a key whose name is controlled by `delimiter_key`, which defaults to "delimiter". ** `delimiter_key` controls the key into which the actual delimiter is written when `preserve_splitchar` is used. See above. ** `escape_fun` and `unescape_fun` are as in split_escaping() and split_alternating_runs_escaping() above and control the protected sequences that won't be split. By default, `escape_comma_whitespace` and `unescape_comma_whitespace` are used, so that comma+whitespace sequences won't be split. Set to `false` to disable escaping/unescaping. ** `pre_normalize_modifiers`, if specified, is a function of one argument, which can be used to "normalize" modifiers prior to further parsing. This is used, for example, in [[Module:tl-pronunciation]] to convert modifiers of the form `<noun^expectation; hope>` to `<t:noun^expectation; hope>`, so they can be processed as standard modifiers. It is also used in [[Module:ar-verb]] to convert footnotes of the form `[rare]` to `<footnote:[rare]>`, to allow for mixing bracketed footnotes and inline modifiers when overriding verbal nouns and such. It could similarly be used to handle boolean modifiers like `<slb>` in {{tl|desc}} and convert them to a standard form `<slb:1>`. It runs just before parsing out the modifier prefix and value, and is passed an object containing fields `modtext` (the un-normalized modifier text, including surrounding angle brackets, or in some cases, text surrounded by other delimiters such as square brackets, if `parse_inline_modifiers_from_segments()` is being called and the caller did their own parsing of balanced segment runs) and `parse_err` (the passed-in or autogenerated function to signal an error during parsing; a function of one argument, a message, which throws an error displaying that message). It should return a single value, the normalized value of `modtext`, including surrounding angle brackets. `param_mods` is a table describing allowed modifiers. The keys of the table are modifier prefixes and the values are tables describing how to parse and store the associated modifier values. Here is a typical example, for an item that takes the standard modifiers associated with `full_link()` in [[Module:links]], as well as left and right qualifiers and labels: { local param_mods = { alt = {}, t = { -- [[Module:links]] expects the gloss in "gloss". item_dest = "gloss", }, gloss = {}, tr = {}, ts = {}, g = { -- [[Module:links]] expects the genders in "g". `sublist = true` automatically splits on comma (optionally -- with surrounding whitespace). item_dest = "genders", sublist = true, }, pos = {}, lit = {}, id = {}, sc = { -- Automatically parse as a script code and convert to a script object. type = "script", }, -- Qualifiers and labels q = { type = "qualifier", }, qq = { type = "qualifier", }, l = { type = "labels", }, ll = { type = "labels", }, } } In the table values: * `item_dest` specifies the destination key to store the object into (if not the same as the modifier key itself). * `type`, `set`, `sublist` and `convert` have the same meaning as in [[Module:parameters]] and are used for converting the object from the string form given by the user into the form needed for further processing. Note that `type` makes use of additional properties that may be specified. Specifically, if {type = "language"}, the properties `family` and `method` are also examined, and if {type = "family"} or {type = "script"}, the property `method` is examined. * `store` describes how to store the converted modifier value into the parsed object. If omitted, the converted value is simply written into the parsed object under the appropriate key; but an error is generated if the key already has a value. (This means that multiple occurrences of a given modifier are allowed if `store` is given, but not otherwise.) `store` can be one of the following: ** {"insert"}: the converted value is appended to the key's value using {insert()}; if the key has no value, it is first converted to an empty list; ** {"insertIfNot"}: is similar but appends the value using {insertIfNot()} in [[Module:table]]; ** {"insert-flattened"}, the converted value is assumed to be a list and the objects are appended one-by-one into the key's existing value using {insert()}; ** {"insertIfNot-flattened"} is similar but appends using {insertIfNot()} in [[Module:table]]; (WARNING: When using {"insert-flattened"} and {"insertIfNot-flattened"}, if there is no existing value for the key, the converted value is just stored directly. This means that future appends will side-effect that value, so make sure that the return value of the conversion function for this key generates a fresh list each time.) ** a function of one argument, an object with the following properties: *** `dest`: the object to write the value into; *** `key`: the field where the value should be written; *** `converted`: the (converted) value to write; *** `raw_val`: the raw, user-specified value (a string); *** `parse_err`: a function of one argument (an error string), which signals an error, and includes extra context in the message about the modifier in question, the angle-bracket spec that includes the modifier in it, the overall value, and (if `paramname` was given) the parameter holding the overall value. * `overall` only applies if `splitchar` is given. In this case, the modifier applies to the entire argument rather than to an individual term in the argument, and must occur after the last item separated by `splitchar`, instead of being allowed to occur after any of them. The modifier will be stored into the outer container object, which must exist (i.e. `outer_container` must have been given). The return value of {parse_inline_modifiers()} depends on whether `splitchar` and `outer_container` have been given. If neither is given, the return value is the object returned by `generate_obj`. If `splitchar` but not `outer_container` is given, the return value is a list of per-term objects, each of which is generated by `generate_obj`. If both `splitchar` and `outer_container` are given, the return value is the value of `outer_container` and the per-term objects are stored into the `terms` field of this object. ]==] function export.parse_inline_modifiers(arg, props) local segments local function rejoin_bracket_delimited_runs(segments) return export.rejoin_delimited_runs { runs = segments, delimiter_pattern = "^%[.*%]$", } end local rejoin_square_brackets_after_split = false -- The following is an optimization. If we see a square bracket (normally a double square bracket internal link -- [[...]]), we want to not treat delimiter characters inside (either <...> balanced delimiters or separators such -- as commas) as delimiters. But this requires a more sophisticated and slower algorithm, and most of the time it -- isn't needed because there are no square brackets. So we check for a square bracket and fall back to a simpler -- algorithm otherwise (which, since it involves only a single balanced delimiter, can use the built-in %b() Lua -- pattern syntax, which AFAIK is implemented in C). if arg:find("%[") then segments = export.parse_multi_delimiter_balanced_segment_run(arg, {{"[", "]"}, {"<", ">"}}) if not props.splitchar then segments = rejoin_bracket_delimited_runs(segments) else rejoin_square_brackets_after_split = true end else segments = export.parse_balanced_segment_run(arg, "<", ">") end local function verify_no_overall() for _, mod_props in pairs(props.param_mods) do if mod_props.overall then error("Internal caller error: Can't specify `overall` for a modifier in `param_mods` unless `outer_container` property is given") end end end if not props.splitchar then if props.outer_container then error("Internal caller error: Can't specify `outer_container` property unless `splitchar` is given") end verify_no_overall() return export.parse_inline_modifiers_from_segments { group = segments, group_index = nil, separated_groups = nil, arg = arg, props = props, } else local terms = {} if props.outer_container then props.outer_container.terms = terms else verify_no_overall() end local escape_fun = props.escape_fun if escape_fun == nil then escape_fun = export.escape_comma_whitespace end local unescape_fun = props.unescape_fun if unescape_fun == nil then unescape_fun = export.unescape_comma_whitespace end local separated_groups = export.split_alternating_runs_escaping(segments, props.splitchar, props.preserve_splitchar, escape_fun, unescape_fun) for j = 1, #separated_groups, (props.preserve_splitchar and 2 or 1) do if rejoin_square_brackets_after_split then separated_groups[j] = rejoin_bracket_delimited_runs(separated_groups[j]) end local parsed = export.parse_inline_modifiers_from_segments { group = separated_groups[j], group_index = j, separated_groups = separated_groups, arg = arg, props = props, } if props.preserve_splitchar and j > 1 then parsed[props.delimiter_key or "delimiter"] = separated_groups[j - 1][1] end insert(terms, parsed) end if props.outer_container then return props.outer_container else return terms end end end --[==[ Parse a single term that may have inline modifiers attached. This is a helper function of {parse_inline_modifiers()} but is exported separately in case the caller needs to make their own call to {parse_balanced_segment_run()} (as in [[Module:quote]], which splits on several matched delimiters simultaneously). It takes only a single argument, `data`, which is an object with the following fields: * `group`: A list of segments as output by {parse_balanced_segment_run()} (see the overall comment at the top of [[Module:parse utilities]]), or one of the lists returned by calling {split_alternating_runs()}. * `separated_groups`: The list of groups (each of which is of the form of `group`) describing all the terms in the argument parsed by {parse_inline_modifiers()}, or {nil} if this isn't applicable (i.e. multiple terms aren't allowed in the argument). Currently used only the check the number of groups in the list against `group_index`. * `group_index`: The index into `separated_groups` where `group` can be found, or {nil} if not applicable (see below). * `arg`: The original user-specified argument being parsed; used only for error messages and only when `props.parse_err` is not specified. * `props`: The `props` argument to {parse_inline_modifiers()}. The return value is the object created by `generate_obj`, with properties filled in describing the modifiers of the term in question. Note that `props.outer_container` and the `overall` setting of the `props.param_mods` structure are respected, but `props.splitchar` is ignored because the splitting happens in the caller. Specifically, if there are any modifiers with the `overall` setting, `props.separated_groups` and `props.group_index` must be given so that the function is able to determine if the modifier is indeed attached to the last term, and `props.outer_container` must be given because that is where such modifiers are stored. Otherwise, none of these settings need be given. ]==] function export.parse_inline_modifiers_from_segments(data) local props = data.props local group = data.group local function get_valid_prefixes() local valid_prefixes = {} for param_mod, mod_props in pairs(props.param_mods) do if not mod_props.deprecated then insert(valid_prefixes, param_mod) end end sort(valid_prefixes) return valid_prefixes end local function get_arg_gloss() if props.paramname then return ("%s=%s"):format(props.paramname, data.arg) else return data.arg end end local parse_err = props.parse_err or export.make_parse_err(get_arg_gloss()) local term_obj = props.generate_obj(group[1], parse_err) for k = 2, #group - 1, 2 do if group[k + 1] ~= "" then parse_err("Extraneous text '" .. group[k + 1] .. "' after modifier") end local group_k = group[k] if props.pre_normalize_modifiers then -- FIXME: For some use cases, we might have to pass more information. group_k = props.pre_normalize_modifiers { modtext = group_k, parse_err = parse_err } end local modtext = group_k:match("^<(.*)>$") if not modtext then parse_err("Internal error: Modifier '" .. group_k .. "' isn't surrounded by angle brackets") end local prefix, val = modtext:match("^([a-zA-Z0-9+_-]+):(.*)$") if not prefix then local valid_prefixes = get_valid_prefixes() for i, valid_prefix in ipairs(valid_prefixes) do valid_prefixes[i] = "'" .. valid_prefix .. ":'" end parse_err(("Modifier %s%s lacks a prefix, should begin with one of %s"):format( group_k, group_k ~= group[k] and (" (normalized from %s)"):format(group[k]) or "", list_to_text(valid_prefixes))) end local prefix_parse_err if props.parse_err then prefix_parse_err = function(msg, stack_frames_to_ignore) props.parse_err(("%s: modifier prefix '%s' in %s"):format(msg, prefix, group[k]), stack_frames_to_ignore) end else prefix_parse_err = export.make_parse_err(("modifier prefix '%s' in %s in %s"):format( prefix, group[k], get_arg_gloss())) end if props.param_mods[prefix] then local mod_props = props.param_mods[prefix] if mod_props.replaced_by == false then prefix_parse_err( ("Prefix has been removed and is no longer valid%s%s"):format( mod_props.reason and ", " .. mod_props.reason or "", mod_props.instead and "; instead, " .. mod_props.instead or "") ) elseif mod_props.replaced_by then prefix_parse_err( ("Prefix has been replaced by '%s'%s"):format( mod_props.replaced_by, mod_props.reason and ", " .. mod_props.reason or "") ) end local key = mod_props.item_dest or prefix local dest if mod_props.overall then if not data.separated_groups then prefix_parse_err("Internal error: `data.separated_groups` not given when `overall` is seen") end if not props.outer_container then -- This should have been caught earlier during validation in parse_inline_modifiers(). prefix_parse_err("Internal error: `props.outer_container` not given when `overall` is seen") end if data.group_index ~= #data.separated_groups then prefix_parse_err("Prefix should occur after the last comma-separated term") end dest = props.outer_container else dest = term_obj end local converted = val if mod_props.type or mod_props.set or mod_props.sublist or mod_props.convert then -- WARNING: Here as an optimization we embed some knowledge of convert_val() in [[Module:parameters]], -- specifically that if none of `type`, `set`, `sublist` and `convert` are set, the conversion is an -- identity operation and can be skipped. (convert_val() also makes use of the fields `method` and -- `family`, but only if `type` is set to certain values such as "language", "family" or "script", and -- makes use of the field `required`, but only if `set` is set.) If this becomes problematic, consider -- removing the optimization. converted = convert_val(converted, prefix_parse_err, mod_props) end local store = props.param_mods[prefix].store if not store then if dest[key] then prefix_parse_err("Prefix occurs twice") end dest[key] = converted elseif store == "insert" then if not dest[key] then dest[key] = {converted} else insert(dest[key], converted) end elseif store == "insertIfNot" then if not dest[key] then dest[key] = {converted} else insert_if_not(dest[key], converted) end elseif store == "insert-flattened" then if not dest[key] then dest[key] = converted else for _, obj in ipairs(converted) do insert(dest[key], obj) end end elseif store == "insertIfNot-flattened" then if not dest[key] then dest[key] = converted else for _, obj in ipairs(converted) do insert_if_not(dest[key], obj) end end elseif type(store) == "string" then prefix_parse_err(("Internal caller error: Unrecognized value '%s' for `store` property"):format(store)) elseif not is_callable(store) then prefix_parse_err(("Internal caller error: Unrecognized type for `store` property %s"):format(dump(store))) else store{ dest = dest, key = key, converted = converted, raw = val, parse_err = prefix_parse_err } end else local valid_prefixes = get_valid_prefixes() for i, valid_prefix in ipairs(valid_prefixes) do valid_prefixes[i] = "'" .. valid_prefix .. "'" end prefix_parse_err("Unrecognized prefix, should be one of " .. list_to_text(valid_prefixes)) end end return term_obj end return export 7m7efxuys6lveo94nvwye55dw2c55on मॉड्यूल:languages/data/2 828 304604 487764 487638 2026-09-02T16:16:40Z SM7 6218 localization... 487764 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"] = { "असमिया", 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, Arab", ancestors = "trk-oat", dotted_dotless_i = true, strip_diacritics = { Latn = { from = {"ʼ"}, to = {"'"}, }, 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"] = { "बिहारी", 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"] = { "बंगाली", 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"] = { "अंग्रेज़ी", 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"] = { "स्पैनिश", 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"] = { "फ़ारसी", 9168, "ira-swi", "Arab, Hebr", ancestors = "fa-cls", strip_diacritics = { 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"] = { "फ़्रांसीसी", 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"] = { "हिंदी", 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, Arab", translit = "kk-translit", -- 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", "Aran, Deva, Shrd, Latn", translit = { Aran = "ks-Aran-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"] = { "मराठी", 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, 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"] = { "बर्मी", 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"] = { "नेपाली", 33823, "inc-pae", "Deva, Newa", translit = { Deva = "ne-translit" }, } m["ng"] = { "Ndonga", 33900, "bnt-ova", "Latn", } m["nl"] = { "डच", 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"] = { "नॉर्वेजियन", 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"] = { "पंजाबी", 58635, "inc-pan", "Guru, Aran", translit = { Guru = "Guru-translit", Aran = "pa-Aran-translit", }, strip_diacritics = { Aran = { remove_diacritics = c.fathatan .. c.dammatan .. c.kasratan .. c.fatha .. c.damma .. c.kasra .. c.shadda .. c.sukun .. c.nunghunna, from = {"ݨ", "ࣇ"}, to = {"ن", "ل"} }, }, } m["pi"] = { "पालि", 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"] = { "पश्तो", 58680, "ira-pat", "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"] = { "पुर्तगाली", 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"] = { "रोमानियाई", 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"] = { "रूसी", 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"] = { "संस्कृत", 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"] = { "सिंधी", 33997, "inc-snd", "Arab, Deva, Sind, Khoj", translit = { Sind = "Sind-translit", Arab = "sd-Arab-translit" }, strip_diacritics = { 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"] = { "सिंहली", 13267, "inc-ins", "Sinh", translit = "si-translit", override_translit = true, } m["sk"] = { "स्लोवाक", 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"] = { "स्लोवेन", 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, 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"] = { "स्वीडिश", 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", "tz", "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"] = { "तमिल", 5885, "dra-tam", "Taml", ancestors = "ta-mid", translit = "ta-translit", override_translit = true, } m["te"] = { "तेलुगु", 8097, "dra-tel", "Telu", translit = "te-translit", override_translit = true, } m["tg"] = { "Tajik", 9260, "ira-swi", "Cyrl, 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"] = { "तुर्की", 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, Arab", translit = { Cyrl = "tt-translit", 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", "Arab, Latn, Cyrl", ancestors = "chg", translit = { Arab = "ug-translit", Cyrl = "ug-translit", }, override_translit = true, } m["uk"] = { "युक्रेनियाई", 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"] = { "उर्दू", 1617, "inc-hnd", "Aran, Hebr", translit = { Aran = "ur-translit" }, strip_diacritics = { Aran = { -- 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 = { Aran = "ایببپتثجچحخدذرزژسشصضطظعغفقکگلࣇڷمنݨوؤہھئٹڈڑآے", c.punc, }, } m["uz"] = { "Uzbek", 9264, "trk-kar", "Latn, Cyrl, 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 = { 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"] = { "झुआंग", 13216, "tai", "Latn, Hani", sort_key = { Latn = "za-sortkey", Hani = "Hani-sortkey", }, } m["zh"] = { "चीनी", 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, "भाषा") 19j8jmmlgot05xr10hnwfvegqcfw2lj मॉड्यूल:languages/canonical names.json 828 304628 487882 487552 2026-09-03T10:17:09Z SM7 6218 updating... 487882 json application/json { "'Are'are": "alu", "A'ou": "aou", "A-Hmao": "hmd", "A-Pucikwar": "apq", "Aari": "aiw", "Aasax": "aas", "Aba": "utp", "Abaga": "abg", "Abai": "poz-abi", "Abai Sungai": "abf", "Abanyom": "abm", "Abau": "aau", "Abaza": "abq", "Abenaki": "abe", "Abenlen Ayta": "abp", "Abidji": "abi", "Abinomn": "bsa", "Abipon": "axb", "Abishira": "ash", "Abkhaz": "ab", "Abom": "aob", "Abon": "abo", "Abron": "abr", "Abu": "ado", "Abu' Arapesh": "aah", "Abua": "abn", "Abui": "abz", "Abun": "kgr", "Abung": "abl", "Abure": "abu", "Abureni": "mgj", "Abé": "aba", "Acatepec Me'phaa": "tpx", "Acehnese": "ace", "Achagua": "aca", "Achang": "acn", "Ache": "yif", "Acheron": "acz", "Achi": "acr", "Acholi": "ach", "Achuar": "acu", "Achumawi": "acv", "Aché": "guq", "Acroá": "acs", "Adabe": "adb", "Adai": "xad", "Adamorobe Sign Language": "ads", "Adang": "adn", "Adangbe": "adq", "Adangme": "ada", "Adap": "adp", "Adasen": "tiu", "Adele": "ade", "Adhola": "adh", "Adi": "adi", "Adioukrou": "adj", "Adithinngithigh": "dth", "Adivasi Oriya": "ort", "Adiwasi Garasia": "gas", "Adja": "ajg", "Adnyamathanha": "adt", "Adonara": "adr", "Aduge": "adu", "Adyghe": "ady", "Adzera": "adz", "Aeka": "aez", "Aekyom": "awi", "Aequian": "xae", "Aer": "aeq", "Afade": "aal", "Afar": "aa", "Afghan Sign Language": "afg", "Afitti": "aft", "Afra": "ulf", "Afrihili": "afh", "Afrikaans": "af", "Afro-Seminole Creole": "afs", "Agarabi": "agd", "Agariya": "agi", "Agatu": "agc", "Agavotaguerra": "avo", "Agawam": "alg-aga", "Aghem": "agq", "Aghu": "ahh", "Aghu Tharrnggala": "gtu", "Aghul": "agx", "Aghwan": "xag", "Agi": "aif", "Agob": "kit", "Agoi": "ibm", "Aguacateca": "agu", "Aguano": "aga", "Aguaruna": "agr", "Aguna": "aug", "Agusan Manobo": "msm", "Agutaynen": "agn", "Agwagwune": "yay", "Ahanta": "aha", "Ahirani": "ahr", "Ahom": "aho", "Ahtna": "aht", "Ahwai": "nfd", "Ai-Cham": "aih", "Aighon": "aix", "Aikanã": "tba", "Aiklep": "mwg", "Aimele": "ail", "Aimol": "aim", "Ainbai": "aic", "Ainu": "ain", "Aiome": "aki", "Airoran": "air", "Aisi": "mmq", "Aiton": "aio", "Aiwoo": "nfl", "Aja": "aja", "Ajagua": "sai-ajg", "Ajawa": "ajw", "Ajië": "aji", "Ajyíninka Apurucayali": "cpc", "Ak": "akq", "Aka (Central Africa)": "axk", "Aka (Sudan)": "soh", "Aka-Bea": "abj", "Aka-Bo": "akm", "Aka-Cari": "aci", "Aka-Kede": "akx", "Aka-Kol": "aky", "Aka-Kora": "ack", "Akan": "ak", "Akar-Bale": "acl", "Akaselem": "aks", "Akatek": "knj", "Akawaio": "ake", "Ake": "aik", "Akebu": "keu", "Akei": "tsr", "Akeu": "aeu", "Akha": "ahk", "Akhvakh": "akv", "Akkadian": "akk", "Akkala Sami": "sia", "Aklanon": "akl", "Akolet": "akt", "Akoose": "bss", "Akoye": "miw", "Akpa": "akf", "Akpes": "ibe", "Akrukay": "afi", "Akuku": "ayk", "Akum": "aku", "Akuntsu": "aqz", "Akurio": "ako", "Akuwagel": "bey", "Akwa": "akw", "Akyaung Ari": "nqy", "Al-Sayyid Bedouin Sign Language": "syy", "Alaba": "alw", "Alabama": "akz", "Alabat Island Agta": "dul", "Alacatlatzala Mixtec": "mim", "Alago": "ala", "Alagwa": "wbj", "Alak": "alk", "Alamblak": "amp", "Alangan": "alj", "Alapmunte": "apv", "Alas-Kluet Batak": "btz", "Alawa": "alh", "Alazapa": "nai-ala", "Albanian": "sq", "Albanian Sign Language": "sqk", "Alcozauca Mixtec": "xta", "Alege": "alf", "Alekano": "gah", "Alemannic German": "gsw", "Aleut": "ale", "Algerian Arabic": "arq", "Algerian Sign Language": "asp", "Algonquin": "alq", "Ali": "aiy", "Alladian": "ald", "Allar": "all", "Allentiac": "sai-all", "Alngith": "aid", "Alo Phola": "ypo", "Alor": "aol", "Aloápam Zapotec": "zaq", "Alsea": "aes", "Alu": "mte", "Alu Kurumba": "xua", "Alugu": "aub", "Alumu-Tesu": "aab", "Alune": "alp", "Alungul": "aus-alu", "Aluo": "yna", "Alur": "alz", "Alutiiq": "ems", "Alutor": "alr", "Alviri-Vidari": "avd", "Alyawarr": "aly", "Ama": "amm", "Amahai": "amq", "Amahuaca": "amc", "Amaimon": "ali", "Amal": "aad", "Amanab": "amn", "Amanayé": "ama", "Amara": "aie", "Amarakaeri": "amr", "Amarasi": "aaz", "Amarizana": "awd-ama", "Amasi": "alv-ama", "Amatlán Zapotec": "zpo", "Amba": "rwm", "Ambai": "amk", "Ambakich": "aew", "Ambala Ayta": "abc", "Ambelau": "amv", "Ambele": "ael", "Amblong": "alm", "Ambo": "amb", "Ambonese Malay": "abs", "Ambrak": "aag", "Ambul": "apo", "Ambulas": "abt", "Amdang": "amj", "Amele": "aey", "American Sign Language": "ase", "Amganad Ifugao": "ifa", "Amharic": "am", "Ami": "amy", "Amis": "ami", "Ammonite": "sem-amm", "Amo": "amo", "Amol": "alx", "Amoltepec Mixtec": "mbz", "Amondawa": "adw", "Amorite": "sem-amo", "Ampanang": "apg", "Ampari Dogon": "aqd", "Amri Karbi": "ajz", "Amto": "amt", "Amurdag": "amg", "Ana Tinga Dogon": "dti", "Anaang": "anw", "Anakalangu": "akg", "Anal": "anm", "Anam": "pda", "Anambé": "aan", "Anamgura": "imi", "Anasi": "bpo", "Anauyá": "awd-ana", "Ancient Greek": "grc", "Ancient Ligurian": "xlg", "Ancient Macedonian": "xmk", "Ancient North Arabian": "xna", "Ancient Zapotec": "xzp", "Andai": "afd", "Andajin": "ajn", "Andalusian Arabic": "xaa", "अंडमान क्रियोल हिंदी": "hca", "Andaqui": "ana", "Andarum": "aod", "Andegerebinha": "adg", "Andh": "anr", "Andi": "ani", "Andio": "bzb", "Andjingith": "aus-and", "Andoa": "anb", "Andoque": "ano", "Andoquero": "sai-and", "Andra-Hus": "anx", "Aneityum": "aty", "Anem": "anz", "Aneme Wake": "aby", "Anfillo": "myo", "Angaataha": "agm", "Angaité": "aqt", "Angal": "age", "Angal Enen": "aoe", "Angal Heneng": "akh", "Angami": "njm", "Angevin": "roa-ang", "Angguruk Yali": "yli", "Angika": "anp", "Angkamuthi": "avm", "Angkola Batak": "akb", "Angkula": "aus-ang", "Angloromani": "rme", "Angolar": "aoa", "Angor": "agg", "Angoram": "aog", "Angosturas Tunebo": "tnd", "Anguthimri": "awg", "Ani Phowa": "ypn", "Anii": "blo", "Animere": "anf", "Anindilyakwa": "aoi", "Anjam": "boj", "Ankave": "aak", "Anmatyerre": "amx", "Annobonese": "fab", "Anong": "nun", "Anor": "anj", "Anserma": "ans", "Ansus": "and", "Antakarinya": "ant", "Antigua and Barbuda Creole English": "aig", "Antillean Creole": "gcf", "Anu": "anl", "Anuak": "anu", "Anufo": "cko", "Anuki": "aui", "Anus": "auq", "Anuta": "aud", "Anyi": "any", "Anyin Morofo": "mtb", "Ao": "njo", "Aoheng": "pni", "Aore": "aor", "Ap Ma": "kbx", "Apalachee": "xap", "Apalaí": "apy", "Apali": "ena", "Apasco-Apoala Mixtec": "mip", "Apatani": "apt", "Apiaká": "api", "Apinayé": "apn", "Apma": "app", "Apolista": "awd-apo", "Aproumu Aizi": "ahp", "Apurinã": "apu", "Aputai": "apx", "Aquitanian": "xaq", "Arabana": "ard", "Arabela": "arl", "Arabic": "ar", "Aragonese": "an", "Araki": "akr", "Arakwal": "rkw", "Aralle-Tabulahan": "atq", "Aramaic": "arc", "Arammba": "stk", "Aranadan": "aaf", "Aranama-Tamique": "xrt", "Arandai": "jbj", "Araona": "aro", "Arapaho": "arp", "Arapaso": "arj", "Arara-Karo": "arr", "Ararandewára": "xaj", "Arawak": "arw", "Araweté": "awt", "Arawum": "awm", "Arbore": "arv", "Archi": "aqc", "Ardhamagadhi Prakrit": "pka", "Are": "mwc", "Areba": "aea", "Arem": "aem", "Argentine Sign Language": "aed", "Argobba": "agj", "Arguni": "agf", "Arhuaco": "arh", "Arhâ": "aqr", "Arhö": "aok", "Ari": "aac", "Aribwatsa": "laz", "Aribwaung": "ylu", "Arifama-Miniafia": "aai", "Arigidi": "aqg", "Arikapú": "ark", "Arikara": "ari", "Arikem": "ait", "Arin": "xrn", "Aringa": "luc", "Armazic": "xrm", "Armenian": "hy", "Armenian Sign Language": "aen", "Aromanian": "rup", "Arop-Lokep": "apr", "Arop-Sissano": "aps", "Arosi": "aia", "Arritinngithigh": "rrt", "Arta": "atz", "Arua": "aru", "Aruamu": "msy", "Aruek": "aur", "Aruop": "lsr", "Arutani": "atx", "Aruá": "arx", "As": "asz", "Asaro'o": "mtv", "Ashe": "ahs", "Ashkun": "ask", "Asho Chin": "csh", "Ashokan Prakrit": "inc-ash", "Ashraaf": "cus-ash", "Asháninka": "cni", "Ashéninka Pajonal": "cjo", "Ashéninka Perené": "prq", "Asi": "bno", "Asilulu": "asl", "Askopan": "eiv", "Asoa": "asv", "असमिया": "as", "Assan": "xss", "Assangori": "sjg", "Assiniboine": "asb", "Assyrian Neo-Aramaic": "aii", "Asturian": "ast", "Asu": "aum", "Asue Awyu": "psa", "Asumboa": "aua", "Asunción Mixtepec Zapotec": "zoo", "Asuri": "asr", "Ata": "atm", "Ata Manobo": "atd", "Atakapa": "aqp", "Atampaya": "amz", "Atanques": "cba-ata", "Atatláhuca Mixtec": "mib", "Atayal": "tay", "Atemble": "ate", "Ateso": "teo", "Athpare": "aph", "Ati": "atk", "Atikamekw": "atj", "Atohwaim": "aqm", "Atong (Cameroon)": "ato", "Atong (India)": "aot", "Atorada": "aox", "Atsahuaca": "atc", "Atsam": "cch", "Atsugewi": "atw", "Attapady Kurumba": "pkr", "Attié": "ati", "Au": "avt", "Auhelawa": "kud", "Aukan": "djk", "Aulua": "aul", "Aurá": "aux", "Aushi": "auh", "Aushiri": "avs", "Auslan": "asf", "Austral": "aut", "Australian Aboriginal Sign Language": "asw", "Austrian Sign Language": "asq", "Austronesian Mari": "hob", "Auwe": "smf", "Auyana": "auy", "Auye": "auu", "Auyokawa": "auo", "Avar": "av", "Avatime": "avn", "Avau": "avb", "Avava": "tmb", "Avestan": "ae", "Avikam": "avi", "Avokaya": "avu", "Avá-Canoeiro": "avv", "Awa (China)": "vwa", "Awa (New Guinea)": "awb", "Awa-Cuaiquer": "kwi", "Awabakal": "awk", "Awadhi": "awa", "Awak": "awo", "Awar": "aya", "Awara": "awx", "Awbono": "awh", "Aweer": "bob", "Awera": "awr", "Awetí": "awe", "Awing": "azo", "Awjila": "auj", "Awngi": "awn", "Awngthim": "gwm", "Awtuw": "kmn", "Awu": "yiu", "Awun": "aww", "Awutu": "afu", "Awyi": "auw", "Axamb": "ahb", "Axi Yi": "yix", "Ayabadhu": "ayd", "Ayautla Mazatec": "vmy", "Ayere": "aye", "Ayerrerenge": "axe", "Ayi": "ayq", "Ayizi": "yyz", "Ayizo": "ayb", "Aymara": "ay", "Aynu": "aib", "Ayomán": "sai-ayo", "Ayoquesco Zapotec": "zaf", "Ayoreo": "ayo", "Ayu": "ayu", "Ayutla Mixtec": "miy", "Azerbaijani": "az", "Azha": "aza", "Azhe": "yiz", "Azoyú Me'phaa": "tpc", "Baa": "kwb", "Baagandji": "drl", "Baan": "bvj", "Baangi": "bqx", "Baatonum": "bba", "Baba": "bbw", "Baba Malay": "mbf", "Babango": "bbm", "Babanki": "bbk", "Babatana": "baa", "Babine-Witsuwit'en": "bcr", "Babole": "bvx", "Babungo": "bav", "Babuza": "bzg", "Bacama": "bcy", "Bacanese Malay": "btj", "Bactrian": "xbc", "Bada": "bhz", "Badaga": "bfq", "Badanchi": "bau", "Bade": "bde", "Badeshi": "bdz", "Badimaya": "bia", "Badui": "bac", "Badyara": "pbp", "Baeggu": "bvd", "Baekje": "pkc", "Baelelea": "bvc", "Baenan": "sai-bae", "Baetora": "btr", "Bafanji": "bfj", "Bafaw": "bwt", "Bafia": "ksf", "Bafut": "bfd", "Baga Kaloum": "bqf", "Baga Koga": "bgo", "Baga Manduri": "bmd", "Baga Pokur": "bcg", "Baga Sitemu": "bsp", "Baga Sobané": "bsv", "Bagheli": "bfy", "Bagirmi": "bmi", "Bago-Kusuntu": "bqg", "Bagri": "bgq", "Bagua": "sai-bag", "Bagupi": "bpi", "Bagusa": "bqb", "Bagvalal": "kva", "Baha": "yha", "Baham": "bdw", "Bahamian Creole": "bah", "Baharna Arabic": "abv", "Bahau": "bhv", "Bahinemo": "bjh", "Bahing": "bhj", "Bahnar": "bdq", "Bahonsuai": "bsu", "Bai": "bdj", "Baibai": "bbf", "Baikeno": "bkx", "Baima": "bqh", "Baimak": "bmx", "Bainouk-Gunyaamolo": "bcz", "Bainouk-Gunyuño": "bab", "Bainouk-Samik": "bcb", "Baiso": "bsw", "Baissa Fali": "fah", "Bajan": "bjs", "Bajelani": "bjm", "Baka": "bkc", "Bakairí": "bkq", "Bakaka": "bqz", "Bakhtiari": "bqi", "Baki": "bki", "Bakoko": "bkh", "Bakole": "kme", "Bakpinka": "bbs", "Bakulung": "bbu", "Bakumpai": "bkr", "Bakung": "xkl", "Bakwé": "bjw", "Balaesang": "bls", "Balangao": "blw", "Balangingi": "sse", "Balanta-Ganja": "bjt", "Balanta-Kentohe": "ble", "Balantak": "blz", "Balau": "blg", "Baldemu": "bdn", "Bali": "bcp", "Baliledo": "poz-bal", "Balinese": "ban", "Balinese Malay": "mhp", "Balkan Gagauz Turkish": "bgx", "Balkan Romani": "rmn", "Balo": "bqo", "Baloi": "biz", "Balong": "bnt-bal", "Balti": "bft", "Baltic Romani": "rml", "Baluan-Pam": "blq", "Baluchi": "bal", "Bamako Sign Language": "bog", "Bamali": "bbq", "Bambalang": "bmo", "Bambam": "ptu", "Bambara": "bm", "Bambassi": "myf", "Bambili-Bambui": "baw", "Bamenyam": "bce", "Bamu": "bcf", "Bamukumbit": "bqt", "Bamum": "bax", "Bamunka": "bvm", "Bamwe": "bmg", "Ban Khor Sign Language": "bfk", "Bana": "bcw", "Banam Bay": "vrt", "Banao Itneg": "bjx", "Banaro": "byz", "Banda": "bnd", "Banda Malay": "bpq", "Banda-Bambari": "liy", "Banda-Banda": "bpd", "Banda-Mbrès": "bqk", "Banda-Ndélé": "bfl", "Banda-Yangere": "yaj", "Bandi": "bza", "Bandial": "bqj", "Bandjalang": "bdy", "Bangala": "bxg", "Bangandu": "bgf", "Bangba": "bbe", "Banggai": "bgz", "Bangi": "bni", "Bangime": "dba", "Bangka": "mfb", "Bangolan": "bgj", "Bangubangu": "bnx", "Bangwinji": "bsj", "Baniva": "bvv", "Baniwa": "bwi", "Banjarese": "bjn", "Banka": "bxw", "Bankan Tey Dogon": "dbw", "Bankon": "abb", "Banoni": "bcm", "Bantawa": "bap", "Bantayanon": "bfx", "Bantik": "bnq", "Banyumasan": "map-bms", "Baoule": "bci", "Baraamu": "brd", "Barai": "bbb", "Barakai": "baj", "Baram Kayan": "kys", "Barama": "bbg", "Barambu": "brm", "Baramu": "bmz", "Barapasi": "brp", "Baras": "brs", "Barasana": "bsn", "Barbareño": "boi", "Barclayville Grebo": "gry", "Bardi": "bcj", "Barein": "bva", "Bargam": "mlp", "Bari": "bfa", "Bariai": "bch", "Bariji": "bjc", "Barikanchi": "bxo", "Barikewa": "jbk", "Barngarla": "bjb", "Barok": "bjk", "Barombi": "bbi", "Barranbinya": "aus-bra", "Barro Negro Tunebo": "tbn", "Barrow Point": "bpt", "Baruga": "bjz", "Barunggam": "aus-brm", "Baruya": "byr", "Barwe": "bwg", "Barzani Jewish Neo-Aramaic": "bjf", "Baré": "bae", "Barí": "mot", "Basa": "bzw", "Basa-Gumna": "bsl", "Basa-Gurmana": "buj", "Basaa": "bas", "Basap": "bdb", "Basay": "byq", "Bashkardi": "bsg", "Bashkir": "ba", "Basketo": "bst", "Basque": "eu", "Bassa": "bsq", "Bassa-Kontagora": "bsr", "Bassari": "bsc", "Bassossi": "bsi", "Bata": "bta", "Bataan Ayta": "ayt", "Batad Ifugao": "ifb", "Batanga": "bnm", "Batek": "btq", "Bateri": "btv", "Bathari": "bhm", "Bati (Cameroon)": "btc", "Bati (Indonesia)": "bvt", "Bats": "bbl", "Batu": "btu", "Batui": "zbt", "Batuley": "bay", "Bau": "bbd", "Bau Bidayuh": "sne", "Bauchi": "bsf", "Baure": "brg", "Bauria": "bge", "Bauro": "bxa", "Bauwaki": "bwk", "Bauzi": "bvz", "Bavarian": "bar", "Bawm Chin": "bgr", "Bay Miwok": "mkq", "Bayali": "bjy", "Baybayanon": "bvy", "Baygo": "byg", "Bayogoula": "nai-bay", "Bayono": "byl", "Bayot": "bda", "Bayungu": "bxj", "Bazigar": "bfr", "Baïnounk Gubëeher": "alv-bgu", "Beami": "beo", "Beaver": "bea", "Beba": "bfp", "Bebe": "bzv", "Bebele": "beb", "Bebeli": "bek", "Bebil": "bxp", "Bedik": "tnr", "Bedjond": "bjv", "Bedoanas": "bed", "Beeke": "bkf", "Beele": "bxq", "Beembe": "beq", "Beezen": "bnz", "Befang": "bby", "Begbere-Ejar": "bqv", "Beja": "bej", "Bekati'": "bei", "Bekwarra": "bkv", "Bekwel": "bkw", "Belait": "beg", "Belanda Bor": "bxb", "Belanda Viri": "bvi", "Belarusian": "be", "Belhariya": "byw", "Beli": "blm", "Belizean Creole": "bzj", "Bella Coola": "blc", "Bellari": "brw", "Bemba": "bem", "Bembe": "bmb", "Ben Tey": "dbt", "Bena": "yun", "Benabena": "bef", "Bench": "bcq", "Bende": "bdp", "Bendi": "bct", "Beneraf": "bnv", "Beng": "nhb", "Benga": "bng", "बंगाली": "bn", "Benggoi": "bgy", "Bengkala Sign Language": "bqy", "Bentong": "bnu", "Benyadu'": "byd", "Beothuk": "bue", "Bepour": "bie", "Bera": "brf", "Berakou": "bxv", "Berau Malay": "bve", "Berawan": "lod", "Berbice Creole Dutch": "brc", "Bergish": "gmw-bgh", "Berik": "bkl", "Berinomo": "bit", "Berom": "bom", "Berta": "wti", "Berti": "byt", "Besisi": "mhe", "Besme": "bes", "Besoa": "bep", "Betaf": "bfe", "Betawi": "bew", "Bete": "byf", "Bete-Bendi": "btt", "Betoi": "sai-bet", "Betta Kurumba": "xub", "Bezhta": "kap", "Bhadrawahi": "bhd", "Bhalay": "bhx", "Bharia": "bha", "Bhatri": "bgw", "Bhattiyali": "bht", "Bhaya": "bhe", "Bhele": "bhy", "Bhilali": "bhi", "Bhili": "bhb", "भोजपुरी": "bho", "Bhoti Kinnauri": "nes", "Bhunjia": "bhu", "Biafada": "bif", "Biage": "bdf", "Biak": "bhw", "Biali": "beh", "Bian Marind": "bpv", "Biangai": "big", "Biao": "byk", "Biao Mon": "bmt", "Biao-Jiao Mien": "bje", "Biatah Bidayuh": "bth", "Bibaali": "bcn", "Bibbulman": "xbp", "Bidiyo": "bid", "Bidyara": "bym", "Bidyogo": "bjg", "Biem": "bmc", "Bierebo": "bnk", "Bieria": "brj", "Biete": "biu", "Big Nambas": "nmb", "Biga": "bhc", "Bigambal": "xbe", "Bih": "ibh", "बिहारी": "bh", "Bijori": "bix", "Bikaru": "bic", "Bikol Central": "bcl", "Bikya": "byb", "Bila": "bip", "Bilakura": "bql", "Bilaspuri": "kfs", "Bilba": "bpz", "Bilbil": "brz", "Bile": "bil", "Biliau": "bcu", "Biloxi": "bll", "Bilua": "blb", "Bilur": "bxf", "Bima": "bhp", "Bimin": "bhl", "Bimoba": "bim", "Bina": "bmn", "Binahari": "bxz", "Binandere": "bhg", "Binawa": "byj", "Bindal": "xbd", "Bine": "bon", "Binji": "bpj", "Binongan Itneg": "itb", "Bintauna": "bne", "Bintulu": "bny", "Binukid": "bkd", "Binumarien": "bjr", "Bipi": "biq", "Birao": "brr", "Birgid": "brk", "Birgit": "btf", "Birhor": "biy", "Biri": "bzr", "Biritai": "bqq", "Birri": "bvq", "Birrpayi": "xbj", "Birwa": "brl", "Biseni": "ije", "Bishnupriya Manipuri": "bpy", "Bishuo": "bwh", "Bisis": "bnw", "Bislama": "bi", "Bisorio": "bir", "Bissa": "bib", "Bisu": "bzi", "Bit": "bgk", "Bitare": "brt", "Bitur": "mcc", "Biwat": "bwm", "Biyo": "byo", "Biyom": "bpm", "Blablanga": "blp", "Black Speech": "art-bsp", "Blackfoot": "bla", "Blafe": "bfh", "Blagar": "beu", "Blang": "blr", "Blin": "byn", "Bo": "bgl", "Bo-Rukul": "mae", "Bo-Ung": "mux", "Boano (Maluku)": "bzn", "Boano (Sulawesi)": "bzl", "Bobongko": "bgb", "Bobot": "bty", "Bodo (Central Africa)": "boy", "Bodo (India)": "brx", "Bodo Gadaba": "gbj", "Bodo Parja": "bdv", "Bofi": "bff", "Boga": "bvw", "Bogaya": "boq", "Boghom": "bux", "Boguru": "bqu", "Bohtan Neo-Aramaic": "bhn", "Boikin": "bzf", "Bokar": "sit-bok", "Bokha": "ybk", "Boko": "bqc", "Bokobaru": "bus", "Bokoto": "bdt", "Bokyi": "bky", "Bola": "bnp", "Bolak": "art-blk", "Bolango": "bld", "Bole": "bol", "Bolgo": "bvo", "Bolia": "bli", "Bolinao": "smk", "Bolivian Sign Language": "bvl", "Boloki": "bkt", "Bolon": "bof", "Bolondo": "bzm", "Bolongan": "blj", "Bolyu": "ply", "Bom": "bmf", "Boma Nkuu": "bnt-bon", "Boma Yumu": "bnt-boy", "Bomboli": "bml", "Bomboma": "bws", "Bomitaba": "zmx", "Bomu": "bmq", "Bomwali": "bmw", "Bon Gula": "glc", "Bonan": "peh", "Bondei": "bou", "Bondo": "bfw", "Bondoukou Kulango": "kzc", "Bondum Dom Dogon": "dbu", "Bonerate": "bna", "Bonggi": "bdg", "Bonggo": "bpg", "Bongili": "bui", "Bongo": "bot", "Bongu": "bpu", "Bonjo": "bok", "Bonkeng": "bvg", "Bonkiman": "bop", "Bookan": "bnb", "Boon": "bnl", "Boor": "bvf", "Bora": "boa", "Border Kuna": "kvn", "Borei": "gai", "Boro": "xxb", "Borong": "ksr", "Boruca": "brn", "Borôro": "bor", "Boselewa": "bwf", "Bosngun": "bqs", "Bote-Majhi": "bmj", "Botlikh": "bph", "Botolan Sambal": "sbl", "Bouna Kulango": "nku", "Bourbonnais-Berrichon": "roa-bbn", "Bourguignon": "roa-brg", "Bouyei": "pcc", "Bozaba": "bzo", "Bragat": "aof", "Brahui": "brh", "Braj": "bra", "Brazilian Sign Language": "bzs", "Brek Karen": "kvl", "Brem": "buq", "Breri": "brq", "Breton": "br", "Bribri": "bzd", "British Sign Language": "bfi", "Brokkat": "bro", "Brokpake": "sgt", "Brokskat": "bkk", "Brooke's Point Palawano": "plw", "Broome Pearling Lugger Pidgin": "bpl", "Brunei Bisaya": "bsb", "Brunei Malay": "kxd", "Bruny Island": "xpz", "Bu": "jid", "Bu-Nao Bunu": "bwx", "Bua": "bub", "Bualkhaw Chin": "cbl", "Buamu": "box", "Bube": "bvb", "Bubi": "buw", "Bubia": "bbx", "Budeh Stieng": "stt", "Budibud": "btp", "Budong-Budong": "bdx", "Budu": "buu", "Budukh": "bdk", "Buduma": "bdm", "Budza": "bja", "Buena Vista Yokuts": "nai-bvy", "Bugan": "bbh", "Bughotu": "bgt", "Buginese": "bug", "Buglere": "sab", "Bugun": "bgg", "Buhi'non Bikol": "ubl", "Buhid": "bku", "Buhutu": "bxh", "Bujhyal": "byh", "Bukar-Sadung Bidayuh": "sdo", "Bukat": "bvk", "Bukawa": "buk", "Bukhari": "bhh", "Bukit Malay": "bvu", "Bukitan": "bkn", "Bukiyip": "ape", "Buksa": "tkb", "Bukusu": "bxk", "Bulgar": "xbo", "Bulgarian": "bg", "Bulgarian Sign Language": "bqn", "Bulgebi": "bmp", "Buli (Ghana)": "bwu", "Buli (Indonesia)": "bzq", "Bulo Stieng": "sti", "Bulu (Cameroon)": "bum", "Bulu (New Guinea)": "bjl", "Bum": "bmv", "Bumaji": "byp", "Bumang": "bvp", "Bumbita Arapesh": "aon", "Bumthangkha": "kjz", "Bun": "buv", "Buna": "bvn", "Bunaba": "bck", "Bunak": "bfn", "Bunama": "bdd", "Bundeli": "bns", "Bung": "bqd", "Bungain": "but", "Bunganditj": "xbg", "Bungku": "bkz", "Bungu": "wun", "Bunoge": "dgb", "Bunun": "bnn", "Buol": "blf", "Bura": "bwr", "Bura Mabang": "mde", "Burak": "bys", "Buraka": "bkg", "Burarra": "bvr", "Burate": "bti", "Burduna": "bxn", "Bure": "bvh", "Burgundian": "gem-bur", "Burji": "bji", "Burmese": "my", "Burmeso": "bzu", "Buru (Indonesia)": "mhs", "Buru (Nigeria)": "bqw", "Burui": "bry", "Burumakok": "aip", "Burun": "bdi", "Burunge": "bds", "Burushaski": "bsk", "Burusu": "bqr", "Buruwai": "asi", "Buryat": "bua", "Busa": "bqp", "Busam": "bxs", "Busami": "bsm", "Busang Kayan": "bfg", "Bushoong": "buf", "Buso": "bso", "Busoa": "bup", "Bussa": "dox", "Busuu": "bju", "Butbut Kalinga": "kyb", "Butchulla": "xby", "Butmas-Tur": "bnr", "Butuanon": "btw", "Buwal": "bhs", "Buyeo": "xpy", "Buyu": "byi", "Buyuan Jinuo": "jiy", "Bwa": "bww", "Bwaidoka": "bwd", "Bwala": "bnt-bwa", "Bwanabwana": "tte", "Bwatoo": "bwa", "Bwe Karen": "bwe", "Bwela": "bwl", "Bwile": "bwc", "Bwisi": "bwz", "Byangsi": "bee", "Byep": "mkk", "Bädi Kanum": "khd", "Caac": "msq", "Cabiyarí": "cbb", "Cabécar": "cjp", "Cacaloxtepec Mixtec": "miu", "Cacaopera": "ccr", "Cacgia Roglai": "roc", "Cacua": "cbv", "Cacán": "sai-cac", "Caddo": "cad", "Cafundó": "ccd", "Cahuarano": "cah", "Cahuilla": "chl", "Cajonos Zapotec": "zad", "Caka": "ckx", "Cakchiquel-Quiché Mixed Language": "ckz", "Cakfem-Mushere": "cky", "Calabrian Greek": "grk-cal", "Calamian Tagbanwa": "tbk", "Callawalla": "caw", "Calusa": "nai-cal", "Caluyanun": "clu", "Caló": "rmq", "Camarines Norte Agta": "abd", "Cameroon Mambila": "mcu", "Cameroon Pidgin": "wes", "Campalagian": "cml", "Camsá": "kbh", "Camtho": "cmt", "Camunic": "xcc", "Candoshi-Shapra": "cbu", "Canela": "ram", "Canichana": "caz", "Cantonese": "yue", "Cao Miao": "cov", "Caolan": "mlc", "Capanahua": "kaq", "Capiznon": "cps", "Cappadocian Greek": "cpg", "Caquinte": "cot", "Car Nicobarese": "caq", "Cara": "cfd", "Carabayo": "cby", "Caramanta": "crf", "Caranqui": "sai-caq", "Carapana": "cbc", "Carian": "xcr", "Cariay": "awd-kar", "Caribbean Hindustani": "hns", "Caribbean Javanese": "jvn", "Carijona": "cbd", "Carolina Algonquian": "crr", "Carolinian": "cal", "Carpathian Romani": "rmc", "Carrier": "crx", "Cashibo-Cacataibo": "cbr", "Cashinahua": "cbs", "Casiguran Dumagat Agta": "dgc", "Casuarina Coast Asmat": "asc", "Catacao": "sai-cat", "Catalan": "ca", "Catalan Sign Language": "csc", "Catawba": "chc", "Catuquinaru": "sai-ctq", "Catío Chibcha": "cba-cat", "Cauca": "cca", "Cavere": "awd-cav", "Cavineña": "cav", "Cayubaba": "cyb", "Cayuga": "cay", "Cayuse": "xcy", "Cazcan": "azc-caz", "Cañari": "sai-cnr", "Cebaara Senoufo": "sef", "Cebuano": "ceb", "Celtiberian": "xce", "Cemuhî": "cam", "Cen": "cen", "Central Asmat": "cns", "Central Atlas Tamazight": "tzm", "Central Awyu": "awu", "Central Bai": "bca", "Central Bontoc": "lbk", "Central Cagayan Agta": "agt", "Central Dusun": "dtp", "Central Franconian": "gmw-cfr", "Central Grebo": "grv", "Central Huasteca Nahuatl": "nch", "Central Huishui Hmong": "hmc", "Central Kurdish": "ckb", "Central Maewo": "mwo", "Central Mahuatlán Zapoteco": "zam", "Central Malay": "pse", "Central Masela": "mxz", "Central Mashan Hmong": "hmm", "Central Mazahua": "maz", "Central Melanau": "mel", "Central Mnong": "cmo", "Central Nahuatl": "nhn", "Central Nicobarese": "ncb", "Central Ojibwa": "ojc", "Central Palawano": "plc", "Central Pame": "pbs", "Central Pomo": "poo", "Central Puebla Nahuatl": "ncx", "Central Sama": "sml", "Central Siberian Yupik": "ess", "Central Sierra Miwok": "csm", "Central Subanen": "syb", "Central Tagbanwa": "tgt", "Central Tarahumara": "tar", "Central Teke": "nzu", "Central Tunebo": "tuf", "Centúúm": "cet", "Cerma": "cme", "Ch'olti'": "myn-chl", "Ch'orti'": "caa", "Chaap Wuurong": "tjw", "Chachi": "cbi", "Chadian Arabic": "shu", "Chadian Sign Language": "cds", "Chadong": "cdy", "Chagatai": "chg", "Chaha": "sem-cha", "Chaima": "ciy", "Chairel": "sit-cha", "Chak": "ckh", "Chakali": "cli", "Chakma": "ccp", "Chala": "cll", "Chaldean Neo-Aramaic": "cld", "Chali": "tgf", "Chamacoco": "ceg", "Chamalal": "cji", "Chamba Daka": "ccg", "Chamba Leko": "ndi", "Chambeali": "cdh", "Chambri": "can", "Chamicuro": "ccc", "Chamling": "rab", "Chamorro": "ch", "Champenois": "roa-cha", "Chang": "nbc", "Changriwa": "cga", "Changthang": "cna", "Chantyal": "chx", "Chaná": "sai-chn", "Chané": "caj", "Chapacura": "sai-chp", "Chara": "cra", "Charrua": "sai-chr", "Chaudangsi": "cdn", "Chaura": "crv", "Chavacano": "cbk", "Chayahuita": "cbt", "Chayuco Mixtec": "mih", "Chazumba Mixtec": "xtb", "Che": "ruk", "Chechen": "ce", "Cheke Holo": "mrn", "Chemakum": "xch", "Chenapian": "cjn", "Chenchu": "cde", "Chenoua": "cnu", "Chepang": "cdm", "Chepya": "ycp", "Cherepon": "cpn", "Cherokee": "chr", "Chesu": "ych", "Chetco-Tolowa": "ctc", "Chewong": "cwg", "Cheyenne": "chy", "Chhattisgarhi": "hne", "Chhintange": "ctn", "Chhulung": "cur", "Chiangmai Sign Language": "csd", "Chiapanec": "cip", "Chibcha": "chb", "Chicahuaxtla Triqui": "trs", "Chichewa": "ny", "Chichicapan Zapotec": "zpv", "Chichimeca-Jonaz": "pei", "Chichonyi-Chidzihana-Chikauma": "coh", "Chickasaw": "cic", "Chicomuceltec": "cob", "Chiduruma": "dug", "Chigmecatitlán Mixtec": "mii", "Chilcotin": "clc", "Chilean Sign Language": "csg", "Chilisso": "clh", "Chiltepec Chinantec": "csa", "Chimalapa Zoque": "zoh", "Chimariko": "cid", "Chimila": "cbg", "Chimwiini": "bnt-cmw", "Chinali": "cih", "Chinbon Chin": "cnb", "Chinese": "zh", "Chinese Pidgin English": "cpi", "Chinese Sign Language": "csl", "Chinook": "chh", "Chinook Jargon": "chn", "Chipaya": "cap", "Chipewyan": "chp", "Chiquihuitlán Mazatec": "maq", "Chiquimulilla": "nai-chi", "Chiquitano": "cax", "Chiricahua": "apm", "Chirino": "sai-chi", "Chiripá": "nhd", "Chiru": "cdf", "Chitimacha": "ctm", "Chitkuli Kinnauri": "cik", "Chittagonian": "ctg", "Chitwania Tharu": "the", "Chiwere": "iow", "Choapan Zapotec": "zpc", "Chocangaca": "cgk", "Chochotec": "coz", "Choctaw": "cho", "Chodri": "cdi", "Chokri Naga": "nri", "Chokwe": "cjk", "Chol": "ctu", "Cholón": "cht", "Chong": "cog", "Choni": "cda", "Chono": "sai-cno", "Chopi": "cce", "Chothe Naga": "nct", "Chrau": "crw", "Chru": "cje", "Chuabo": "chw", "Chuanqiandian Cluster Miao": "cqd", "Chuave": "cjv", "Chug": "cvg", "Chuj": "cac", "Chuka": "cuh", "Chukchi": "ckt", "Chukwa": "cuw", "Chulym": "clw", "Chumburung": "ncu", "Churahi": "cdj", "Churuya": "sai-chu", "Chut": "scb", "Chuukese": "chk", "Chuvan": "xcv", "Chuvash": "cv", "Chácobo": "cao", "Ci Gbe": "cib", "Cia-Cia": "cia", "Cibak": "ckl", "Cicipu": "awc", "Ciguayo": "nai-cig", "Cimbrian": "cim", "Cinamiguin Manobo": "mkx", "Cinda-Regi-Tiyal": "cdr", "Cineni": "cie", "Cinta Larga": "cin", "Cishingini": "asg", "Citak": "txt", "Ciwogai": "tgd", "Classical Guaraní": "gn-cls", "Classical Mandaic": "myz", "Classical Mongolian": "cmg", "Classical Nahuatl": "nci", "Classical Newar": "nwc", "Classical Quechua": "qwc", "Classical Syriac": "syc", "Classical Tibetan": "xct", "Coahuilteco": "xcw", "Coast Miwok": "csi", "Coastal Kadazan": "kzj", "Coastal Konjo": "kjc", "Coatecas Altas Zapotec": "zca", "Coatepec Nahuatl": "naz", "Coatlán Mixe": "mco", "Coatlán Zapotec": "zps", "Coatzospan Mixtec": "miz", "Cocama": "cod", "Cochimi": "coj", "Cocopa": "coc", "Cocos Islands Malay": "coa", "Coeruna": "sai-coe", "Coeur d'Alene": "crd", "Cofán": "con", "Cogui": "kog", "Col": "liw", "Colombian Sign Language": "csn", "Colonia Tovar German": "gct", "Columbia-Wenatchi": "col", "Colán": "sai-col", "Comaltepec Chinantec": "cco", "Comanche": "com", "Comechingon": "sai-cmg", "Comecrudo": "xcm", "Communicationssprache": "art-com", "Como Karim": "cfg", "Comox": "coo", "Con": "cno", "Coos": "csz", "Copainalá Zoque": "zoc", "Copala Triqui": "trc", "Copallén": "sai-cop", "Coptic": "cop", "Coquille": "coq", "Cora": "crn", "Cori": "cry", "Cornish": "kw", "Coroado Puri": "sai-crd", "Corsican": "co", "Cosoleacaque Nahuatl": "nhk", "Costa Rican Sign Language": "csr", "Cotabato Manobo": "mta", "Cotoname": "xcn", "Cowlitz": "cow", "Coyaima": "coy", "Coyotepec Popoloca": "pbf", "Coyutla Totonac": "toc", "Cree": "cr", "Creek": "mus", "Crimean Gothic": "gme-cgo", "Crimean Tatar": "crh", "Croatian Sign Language": "csq", "Cross River Mbembe": "mfn", "Crow": "cro", "Cruzeño": "crz", "Cua": "cua", "Cuban Sign Language": "csf", "Cubeo": "cub", "Cueva": "sai-cva", "Cuiba": "cui", "Cuitlatec": "cuy", "Culina": "cul", "Culli": "sai-cul", "Cumanagoto": "cuo", "Cumbric": "xcb", "Cun": "cuq", "Cung": "cug", "Cupeño": "cup", "Curonian": "xcu", "Curripaco": "kpc", "Cutchi-Swahili": "ccl", "Cuvok": "cuv", "Cuyamecalco Mixtec": "xtu", "Cuyunon": "cyo", "Cwi Bwamu": "bwy", "Cypriot Arabic": "acy", "Czech": "cs", "Czech Sign Language": "cse", "Côông": "cnc", "Da'a Kaili": "kzf", "Daai Chin": "dao", "Daantanai'": "lni", "Daasanach": "dsh", "Daba": "dbq", "Dabarre": "dbr", "Dabe": "dbe", "Dacian": "xdc", "Dadanitic": "sem-dad", "Dadi Dadi": "dda", "Dadibi": "mps", "Dadiya": "dbd", "Daga": "dgz", "Dagaari Dioula": "dgd", "Dagba": "dgk", "Dagbani": "dag", "Dagik": "dec", "Dagoman": "dgn", "Dahalik": "dlk", "Dahalo": "dal", "Daho-Doo": "das", "Dai": "dij", "Dair": "drb", "Dairi Batak": "btd", "Dakaka": "bpa", "Dakka": "dkk", "Dakota": "dak", "Dakpa": "dka", "Dalmatian": "dlm", "Daloa Bété": "bev", "Dama (Nigeria)": "dmm", "Dama (Sierra Leone)": "dmn-dam", "Damakawa": "dam", "Damal": "uhn", "Dambi": "dac", "Dameli": "dml", "Dampelas": "dms", "Dan": "dnj", "Danaru": "dnr", "Danau": "dnu", "Dandami Maria": "daq", "Dangaléat": "daa", "Dangaura Tharu": "thl", "Danish": "da", "Danish Sign Language": "dsl", "Dano": "aso", "Danu": "dnv", "Danuwar": "dhw", "Dao": "daz", "Daonda": "dnd", "Dar Daju Daju": "djc", "Dar Fur Daju": "daj", "Dar Sila Daju": "dau", "Darai": "dry", "Dargwa": "dar", "Darkinjung": "xda", "Darlong": "dln", "Darmiya": "drd", "Daro-Matu Melanau": "dro", "Darumbal": "xgm", "Dass": "dot", "Datooga": "tcc", "Daungwurrung": "dgw", "Daur": "dta", "Davawenyo": "daw", "Dawawa": "dww", "Dawera-Daweloor": "ddw", "Dawro": "dwr", "Day": "dai", "Dayi": "dax", "Dazaga": "dzg", "Deccani": "dcc", "Dedua": "ded", "Defaka": "afn", "Defi Gbe": "gbh", "Deg": "mzw", "Deg Xinag": "ing", "Degema": "deg", "Degenan": "dge", "Dehwari": "deh", "Dek": "dek", "Dela-Oenale": "row", "Delo": "ntr", "Delta Yokuts": "nai-dly", "Dem": "dem", "Dema": "dmx", "Demisa": "dei", "Demotic": "egx-dem", "Demta": "dmy", "Dena'ina": "tfn", "Dendi": "ddn", "Dengese": "dez", "Dengka": "dnk", "Deno": "dbb", "Denya": "anv", "Dení": "dny", "Deori": "der", "Desano": "des", "Desiya": "dso", "Dewas Rai": "dwz", "Dewoin": "dee", "Dezfuli": "def", "Dghwede": "dgh", "Dhaiso": "dhs", "Dhalandji": "dhl", "Dhangu": "dhg", "Dhanki": "dhn", "Dhao": "nfa", "Dharug": "xdk", "Dhatki": "mki", "Dhimal": "dhi", "Dhivehi": "dv", "Dhodia": "dho", "Dhofari Arabic": "adf", "Dhudhuroa": "ddr", "Dhungaloo": "dhx", "Dhurga": "dhu", "Dhuwal": "dwu", "Dhuwaya": "dwy", "Dia": "dia", "Dibabawon Manobo": "mbd", "Dibiyaso": "dby", "Dibo": "dio", "Dicamay Agta": "duy", "Didinga": "did", "Dieri": "dif", "Digo": "dig", "Dii": "dur", "Dijim-Bwilim": "cfa", "Dilling": "dil", "Dima": "jma", "Dimasa": "dis", "Dimbong": "dii", "Dime": "dim", "Dinapigue Agta": "phi-din", "Dineor": "mrx", "Ding": "diz", "Dinka": "din", "Diodio": "ddi", "Dirasha": "gdl", "Diri": "dwa", "Dirim": "dir", "Disa": "dsi", "Ditammari": "tbz", "Ditidaht": "dtd", "Diuwe": "diy", "Diuxi-Tilantongo Mixtec": "xtd", "Dixon Reef": "dix", "Dizin": "mdx", "Djadjawurrung": "dja", "Djambarrpuyngu": "djr", "Djangun": "djf", "Djauan": "djn", "Djawi": "djw", "Djimini": "dyi", "Djinang": "dji", "Djinba": "djb", "Djiwarli": "djl", "Dobel": "kvo", "Dobu": "dob", "Doe": "doe", "Doga": "dgg", "Doghoro": "dgx", "Dogoso": "dgs", "Dogosé": "dos", "Dogri": "doi", "Dogrib": "dgr", "Dogul Dom": "dbg", "Doka": "dbi", "Doko-Uyanga": "uya", "Dolgan": "dlg", "Dom": "doa", "Domaaki": "dmk", "Domari": "rmt", "Dominican Sign Language": "doq", "Dompo": "doy", "Domu": "dof", "Domung": "dev", "Dondo": "dok", "Dong": "doh", "Dongo": "doo", "Dongolawi": "kzh", "Dongotono": "ddd", "Dongshanba Lalo": "yik", "Dongxiang": "sce", "Donno So Dogon": "dds", "Doondo": "dde", "Dorasque": "cba-dor", "Dori'o": "dor", "Dorig": "wwo", "Doromu-Koki": "kqc", "Dorze": "doz", "Doso": "dol", "Doteli": "dty", "Dothraki": "art-dtk", "Doura": "don", "Doutai": "tds", "Doyayo": "dow", "Drehu": "dhv", "Drung": "duu", "Duala": "dua", "Duano": "dup", "Duau": "dva", "Dubli": "dub", "Dubu": "dmu", "Dugun": "ndu", "Duguri": "dbm", "Dugwor": "dme", "Duhwa": "kbz", "Duit": "cba-dui", "Duke": "nke", "Dukhan": "trk-dkh", "Dulbu": "dbo", "Duli": "duz", "Duma": "dma", "Dumaitic": "sem-dum", "Dumbea": "duf", "Dumi": "dus", "Dumpas": "dmv", "Dumun": "dui", "Duna": "duc", "Dungan": "dng", "Dungmali": "raa", "Dungra Bhil": "duh", "Dungu": "dbv", "Dupaningan Agta": "duo", "Dura": "drq", "Duri": "mvp", "Duriankere": "dbn", "Duruwa": "pci", "Dusner": "dsn", "Dusun Deyah": "dun", "Dusun Malang": "duq", "Dusun Witu": "duw", "Dutch": "nl", "Dutch Low Saxon": "nds-nl", "Dutch Sign Language": "dse", "Duun": "dux", "Duupa": "dae", "Duvle": "duv", "Duwai": "dbp", "Duwet": "gve", "Dwang": "nnu", "Dyaabugay": "dyy", "Dyaberdyaber": "dyb", "Dyan": "dya", "Dyangadi": "dyn", "Dyirbal": "dbl", "Dyugun": "dyd", "Dyula": "dyu", "Dza": "jen", "Dzala": "dzl", "Dzando": "dzn", "Dzao Min": "bpn", "Dzodinka": "add", "Dzongkha": "dz", "Dzuun": "dnn", "Dâw": "kwa", "E": "eee", "E'ma Buyang": "yzg", "प्रारंभिक असमिया": "inc-oas", "Early Modern Korean": "ko-ear", "Early Tripuri": "xtr", "East Central German": "gmw-ecg", "East Damar": "dmr", "East Franconian": "vmf", "East Futuna": "fud", "East Kewa": "kjs", "East Limba": "lma", "East Makian": "mky", "East Masela": "vme", "East Nyala": "nle", "East Tarangan": "tre", "East Yugur": "yuy", "Eastern Acipa": "acp", "Eastern Arrernte": "aer", "Eastern Bolivian Guaraní": "gui", "Eastern Bontoc": "ebk", "Eastern Bru": "bru", "Eastern Canadian Inuktitut": "ike", "Eastern Cham": "cjm", "Eastern Durango Nahuatl": "azd", "Eastern Gorkha Tamang": "tge", "Eastern Gurung": "ggn", "Eastern Highland Chatino": "cly", "Eastern Highland Otomi": "otm", "Eastern Huasteca Nahuatl": "nhe", "Eastern Huishui Hmong": "hme", "Eastern Karaboro": "xrb", "Eastern Katu": "ktv", "Eastern Kayah": "eky", "Eastern Keres": "kee", "Eastern Krahn": "kqo", "Eastern Lalu": "yit", "Eastern Lawa": "lwl", "Eastern Magar": "mgp", "Eastern Maninkakan": "emk", "Eastern Mari": "mhr", "Eastern Meohang": "emg", "Eastern Mnong": "mng", "Eastern Muria": "emu", "Eastern Ngad'a": "nea", "Eastern Nisu": "nos", "Eastern Ojibwa": "ojg", "Eastern Parbate Kham": "kif", "Eastern Penan": "pez", "Eastern Pomo": "peb", "Eastern Pwo": "kjp", "Eastern Qiandong Miao": "hmq", "Eastern Tamang": "taj", "Eastern Tawbuid": "bnj", "Eastern Xiangxi Miao": "muq", "Eastern Xwla Gbe": "gbx", "Ebira": "igb", "Eblaite": "xeb", "Ebrié": "ebr", "Ebughu": "ebg", "Ecuadorian Sign Language": "ecs", "Ede Cabe": "cbj", "Ede Ica": "ica", "Ede Idaca": "idd", "Ede Ije": "ijj", "Ede Nago": "nqg", "Edera Awyu": "awy", "Edo": "bin", "Edolo": "etr", "Edomite": "xdm", "Edopi": "dbf", "Efai": "efa", "Efe": "efe", "Efik": "efi", "Efutop": "ofu", "Ega": "ega", "Eggon": "ego", "Egyptian": "egy", "Egyptian Arabic": "arz", "Egyptian Sign Language": "esl", "Ehueun": "ehu", "Eipomek": "eip", "Eitiep": "eit", "Ejagham": "etu", "Ejamat": "eja", "Ekajuk": "eka", "Ekari": "ekg", "Ekele": "khy", "Eki": "eki", "Ekit": "eke", "Ekpeye": "ekp", "El Alto Zapotec": "zpp", "El Hugeirat": "elh", "El Molo": "elo", "Elamite": "elx", "Eleme": "elm", "Elepi": "ele", "Elfdalian": "ovd", "Elip": "ekm", "Elkei": "elk", "Eloi": "art-elo", "Elotepec Zapotec": "zte", "Eloyi": "afo", "Elseng": "mrf", "Elu": "elu", "Elymian": "xly", "Emae": "mmw", "Emai": "ema", "Eman": "emn", "Embaloh": "emb", "Emberá-Baudó": "bdc", "Emberá-Catío": "cto", "Emberá-Chamí": "cmi", "Emberá-Tadó": "tdc", "Embu": "ebu", "Emem": "enr", "Emerillon": "eme", "Emilian": "egl", "Emplawas": "emw", "En": "enc", "Enawené-Nawé": "unk", "Ende": "end", "Enga": "enq", "Engenni": "enn", "Enggano": "eno", "English": "en", "Enlhet": "enl", "Enrekang": "ptt", "Enu": "enu", "Enwan": "env", "Enwang": "enw", "Enxet": "enx", "Enya": "gey", "Eotile": "eot", "Epena": "sja", "Epi-Olmec": "xep", "Epie": "epi", "Epigraphic Mayan": "emy", "Eravallan": "era", "Erave": "kjy", "Ere": "twp", "Erie": "iro-ere", "Eritai": "ert", "Erokwanas": "erw", "Erre": "err", "Erromintxela": "emx", "Ersu": "ers", "Eruwa": "erh", "Erzya": "myv", "Esan": "ish", "Ese": "mcq", "Ese Ejja": "ese", "Eshtehardi": "esh", "Esimbi": "ags", "Eskayan": "esy", "Esmeralda": "sai-esm", "Esperanto": "eo", "Esselen": "esq", "Estado de México Otomi": "ots", "Estonian": "et", "Estonian Sign Language": "eso", "Esuma": "esm", "Etchemin": "etc", "Etebi": "etb", "Eten": "etx", "Eteocretan": "ecr", "Eteocypriot": "ecy", "Ethiopian Sign Language": "eth", "Etkywan": "ich", "Eton (Cameroon)": "eto", "Eton (Vanuatu)": "etn", "Etruscan": "ett", "Etulo": "utr", "Evant": "bzz", "Even": "eve", "Evenki": "evn", "Ewage-Notu": "nou", "Ewarhuyana": "sai-ewa", "Ewe": "ee", "Ewondo": "ewo", "Extremaduran": "ext", "Eyak": "eya", "Ezaa": "eza", "Fagani": "faf", "Faire Atta": "azt", "Faita": "faj", "Faiwol": "fai", "Fakkanci": "gel", "Fala": "fax", "Falam Chin": "cfm", "Fali": "fli", "Faliscan": "xfa", "Fam": "fam", "Fanagalo": "fng", "Fanamaket": "bjp", "Fang (Bantu)": "fan", "Fang (Beboid)": "fak", "Fania": "fni", "Far Western Muria": "fmu", "Farefare": "gur", "Faroese": "fo", "Fas": "fqs", "Fasu": "faa", "Fataleka": "far", "Fataluku": "ddg", "Fayu": "fau", "Fe'fe'": "fmp", "Fedan": "pdn", "Fembe": "agl", "Fer": "kah", "Feroge": "fer", "फिजी हिंदी": "hif", "Fijian": "fj", "Filomena Mata-Coahuitlán Totonac": "tlp", "Finisterre Yau": "yuw", "Finnish": "fi", "Finnish Sign Language": "fse", "Finnish-Swedish Sign Language": "fss", "Finongan": "fag", "Fipa": "fip", "Firan": "fir", "Fiwaga": "fiw", "Flemish Sign Language": "vgt", "Flinders Island": "fln", "Foau": "flh", "Fogaha": "ber-fog", "Foi": "foi", "Foia Foia": "ffi", "Folopa": "ppo", "Foma": "fom", "Fon": "fon", "Fongoro": "fgr", "Foodo": "fod", "Forak": "frq", "Fordata": "frd", "Fore": "for", "Forest Enets": "enf", "Forest Nenets": "syd-fne", "Fortsenal": "frt", "Fox": "sac", "Franc-Comtois": "roa-fcm", "Francisco León Zoque": "zos", "Franco-Provençal": "frp", "French": "fr", "French Belgian Sign Language": "sfb", "French Sign Language": "fsl", "Friulian": "fur", "Fula": "ff", "Fuliiru": "flr", "Fulniô": "fun", "Fum": "fum", "Fungwa": "ula", "Fur": "fvr", "Furu": "fuu", "Futuna-Aniwa": "fut", "Fuyug": "fuy", "Fwe": "fwe", "Fwâi": "fwa", "Fyam": "pym", "Fyer": "fie", "Ga": "gaa", "Ga'anda": "gqa", "Ga'dang": "gdg", "Gaa": "ttb", "Gaam": "tbi", "Gabadi": "kbt", "Gabi": "gbw", "Gabri": "gab", "Gabrielino-Fernandeño": "xgf", "Gadang": "gdk", "Gaddang": "gad", "Gaddi": "gbk", "Gade": "ged", "Gadjerawang": "gdh", "Gadsup": "gaj", "Gafat": "gft", "Gagadu": "gbu", "Gagauz": "gag", "Gagnoa Bété": "btg", "Gahri": "bfu", "Gaikundi": "gbf", "Gaina": "gcn", "Gal": "gap", "Galambu": "glo", "Galatian": "xga", "Galela": "gbi", "Galeya": "gar", "Galibi Carib": "car", "Galice": "gce", "Galician": "gl", "Galindan": "xgl", "Gallaecian": "cel-gal", "Gallo": "roa-gal", "Gallurese": "sdn", "Galo": "adl", "Galoli": "gal", "Gamale Kham": "kgj", "Gambera": "gma", "Gamela": "sai-gam", "Gamilaraay": "kld", "Gamit": "gbl", "Gamkonora": "gak", "Gamo": "gmv", "Gamo-Ningi": "bte", "Gan": "gan", "Gana": "gnq", "Ganang": "gne", "Gandhari": "pgd", "Gane": "gzn", "Ganggalida": "gcd", "Ganglau": "ggl", "Gangte": "gnb", "Gangulu": "gnl", "Gants": "gao", "Ganza": "gza", "Ganzi": "gnz", "Gao": "gga", "Gapapaiwa": "pwg", "Garawa": "wrk", "Garhwali": "gbm", "Garifuna": "cab", "Garingbal": "xgi", "Garo": "grt", "Garre": "gex", "Garus": "gyb", "Garza": "xgr", "Gashowu": "nai-gsy", "Gata'": "gaq", "Gaulish": "cel-gau", "Gavak": "dmc", "Gavar": "gou", "Gavião do Jiparaná": "gvo", "Gawar-Bati": "gwt", "Gawwada": "gwd", "Gayil": "gyl", "Gayo": "gay", "Gayón": "sai-gay", "Gbagyi": "gbr", "Gban": "ggu", "Gbanu": "gbv", "Gbanziri": "gbg", "Gbari": "gby", "Gbaya": "gba", "Gbaya-Bossangoa": "gbp", "Gbaya-Bozoum": "gbq", "Gbaya-Mbodomo": "gmm", "Gbayi": "gyg", "Gbesi Gbe": "gbs", "Gbii": "ggb", "Gbin": "xgb", "Gbiri-Niragu": "grh", "Gboloo Grebo": "gec", "Gciriku": "diu", "Gcwi": "gwj", "Ge": "hmj", "Ge'ez": "gez", "Geba Karen": "kvq", "Gebe": "gei", "Gedaged": "gdd", "Gedeo": "drs", "Geji": "gji", "Geko Karen": "ghk", "Gela": "nlg", "Gelao": "gio", "Gele'": "sbc", "Geme": "geq", "Gen": "gej", "Gende": "gaf", "Gengle": "geg", "Georgian": "ka", "Gepo": "ygp", "Gera": "gew", "Gerka": "gek", "German": "de", "German Low German": "nds-de", "German Sign Language": "gsg", "Geruma": "gea", "Geser-Gorom": "ges", "Gey": "guv", "Ghadames": "gha", "Ghanaian Sign Language": "gse", "Ghandruk Sign Language": "gds", "Ghanongga": "ghn", "Ghari": "gri", "Ghayavi": "bmk", "Ghera": "ghr", "Ghomala'": "bbj", "Ghomara": "gho", "Ghotuo": "aaa", "Ghulfan": "ghl", "Giangan": "bgi", "Gibanawa": "gib", "Gidar": "gid", "Gikyode": "acd", "Gilaki": "glk", "Gilbertese": "gil", "Gilima": "gix", "Gimi (Austronesian)": "gip", "Gimi (Goroka)": "gim", "Gimme": "kmp", "Gimnime": "gmn", "Ginuman": "gnm", "Girawa": "bbr", "Girirra": "gii", "Giryama": "nyf", "Githabul": "gih", "Gitua": "ggt", "Gitxsan": "git", "Giyug": "giy", "Gizrra": "tof", "Glaro-Twabo": "glr", "Glavda": "glw", "Glio-Oubi": "oub", "Glosa": "igs", "Gnau": "gnu", "Goa'uld": "art-gld", "Goaria": "gig", "Gobasi": "goi", "Gobu": "gox", "Godié": "god", "Godoberi": "gdo", "Godwari": "gdx", "Goemai": "ank", "Gofa": "gof", "Gogo": "gog", "Gogodala": "ggw", "Goguryeo": "zkg", "Gojri": "gju", "Gokana": "gkn", "Gokhy": "sit-gkh", "Gola": "gol", "Golin": "gvf", "Golpa": "lja", "Gondi": "gon", "Gone Dau": "goo", "Gong": "ugo", "Gongduk": "goe", "Gonja": "gjn", "Goo": "gov", "Gooniyandi": "gni", "Gor": "gqr", "Gorakor": "goc", "Gorap": "goq", "Goreng": "xgg", "Gorontalo": "gor", "Gorovu": "grq", "Gorowa": "gow", "Gothic": "got", "Gottscheerish": "gmw-gts", "Goundo": "goy", "Gourmanchéma": "gux", "Gowlan": "goj", "Gowro": "gwf", "Gozarkhani": "goz", "Grangali": "nli", "Grass Koiari": "kbk", "Grebo": "grb", "Greek": "el", "Greek Sign Language": "gss", "Green Gelao": "giq", "Green Hmong": "hnj", "Greenlandic": "kl", "Grenadian Creole English": "gcl", "Gresi": "grs", "Groma": "gro", "Gros Ventre": "ats", "Gua": "gwx", "Guahibo": "guh", "Guajajára": "gub", "Guajá": "gvj", "Guambiano": "gum", "Guamo": "sai-gmo", "Guanano": "gvc", "Guanche": "gnc", "Guaraní": "gn", "Guarayu": "gyr", "Guatemalan Sign Language": "gsm", "Guató": "gta", "Guayabero": "guo", "Guazacapán": "nai-guz", "Gudang": "xgd", "Gudanji": "nji", "Gude": "gde", "Gudu": "gdu", "Guduf-Gava": "gdf", "Guerrero Amuzgo": "amu", "Guerrero Nahuatl": "ngu", "Guevea de Humboldt Zapotec": "zpg", "Gugadj": "ggd", "Gugu Badhun": "gdc", "Gugu Warra": "wrw", "Guhu-Samane": "ghs", "Guianese Creole": "gcr", "Guiberoua Bété": "bet", "Guinau": "awd-gnu", "Guinea Kpelle": "gkp", "Guinea-Bissau Creole": "pov", "Guinea-Bissau Sign Language": "lgs", "Guinean Sign Language": "gus", "Guiqiong": "gqi", "Gujarati": "gu", "Gula": "glu", "Gula'alaa": "gmb", "Gulay": "gvl", "Gule": "gly", "Gulf Arabic": "afb", "Gullah": "gul", "Gumalu": "gmu", "Gumatj": "gnn", "Gumawana": "gvs", "Gumuz": "guk", "Gun": "guw", "Gundi": "gdi", "Gunditjmara": "gjm", "Gundungurra": "xrd", "Gungabula": "gyf", "Gungu": "rub", "Guntai": "gnt", "Gunu": "yas", "Gunwinggu": "gup", "Gunya": "gyy", "Gupa-Abawa": "gpa", "Gupapuyngu": "guf", "Gur Lama": "las", "Guragone": "gge", "Guramalum": "grz", "Gurani": "hac", "Gureng Gureng": "gnr", "Gurgula": "ggg", "Guriaso": "grx", "Gurindji": "gue", "Gurjar Apabhramsa": "inc-gup", "Gurmana": "gvm", "Guro": "goa", "Guruntum": "grd", "Gusan": "gsn", "Gusii": "guz", "Gusilay": "gsl", "Gutnish": "gmq-gut", "Guugu Yimidhirr": "kky", "Guwa": "xgw", "Guwamu": "gwu", "Guwar": "aus-guw", "Guya": "gka", "Guyanese Creole English": "gyn", "Guyani": "gvy", "Guébie": "gie", "Gvoko": "ngs", "Gwa": "gwb", "Gwahatike": "dah", "Gwak": "jgk", "Gwamhi-Wuri": "bga", "Gwandara": "gwn", "Gwara": "alv-gwa", "Gweda": "grw", "Gweno": "gwe", "Gwere": "gwr", "Gwich'in": "gwi", "Gyalsumdo": "gyo", "Gyele": "gyi", "Gyem": "gye", "Güenoa": "sai-gue", "Habu": "hbu", "Hadiyya": "hdy", "Hadothi": "hoj", "Hadrami": "xhd", "Hadza": "hts", "Haeke": "aek", "Hahon": "hah", "Haida": "hai", "Haigwai": "hgw", "Hainyaxo Bozo": "bzx", "Haiphong Sign Language": "haf", "Haisla": "has", "Haitian Creole": "ht", "Haitian Vodoun Culture Language": "hvc", "Haiǁom": "hgm", "Haji": "hji", "Hajong": "haj", "Hakka": "hak", "Hakö": "hao", "Halang": "hal", "Halang Doan": "hld", "Halbi": "hlb", "Halia": "hla", "Halkomelem": "hur", "Hamap": "hmu", "Hamba": "hba", "Hamer-Banna": "amf", "Hamtai": "hmt", "Hanga": "hag", "Hanga Hundi": "wos", "Hani": "hni", "Hanoi Sign Language": "hab", "Hanunoo": "hnn", "Harami": "xha", "Harari": "har", "Haraza": "nub-har", "Harijan Kinnauri": "kjo", "Haroi": "hro", "Harsusi": "hss", "Haruai": "tmd", "Haruku": "hrk", "Haryanvi": "bgc", "Harzani": "hrz", "Hasaitic": "sem-has", "Hasha": "ybj", "Hassaniya": "mey", "Hatam": "had", "Hattic": "xht", "Hausa": "ha", "Hausa Sign Language": "hsl", "Haush": "sai-hau", "Havasupai-Walapai-Yavapai": "yuf", "Haveke": "hvk", "Havu": "hav", "Hawai'i Pidgin Sign Language": "hps", "Hawaiian": "haw", "Hawaiian Creole": "hwc", "Haya": "hay", "Hazaragi": "haz", "Hdi": "xed", "Hebrew": "he", "Hehe": "heh", "Heiban": "hbn", "Heiltsuk": "hei", "Helong": "heg", "Helu": "elu-prk", "Hema": "nix", "Hemba": "hem", "Herdé": "hed", "Herero": "hz", "Hermit": "llf", "Hernican": "xhr", "Hewa": "ham", "Heyo": "auk", "Hibito": "hib", "Hidatsa": "hid", "Higaonon": "mba", "Highland Konjo": "kjk", "Highland Oaxaca Chontal": "chd", "Highland Popoluca": "poi", "Highland Puebla Nahuatl": "azz", "Highland Totonac": "tos", "Hijazi Arabic": "acw", "Hijuk": "hij", "Hiligaynon": "hil", "Hill Maria": "mrr", "Himarimã": "hir", "Himyaritic": "sem-him", "हिंदी": "hi", "हिंदी डोगरी": "dgo", "Hinduri": "hii", "Hinukh": "gin", "Hiri Motu": "ho", "Hismaic": "sem-his", "Hitchiti": "nai-hit", "Hittite": "hit", "Hitu": "htu", "Hiw": "hiw", "Hixkaryana": "hix", "Hlai": "lic", "Hlepho Phowa": "yhl", "Hlersu": "hle", "Hmar": "hmr", "Hmong Don": "hmf", "Hmong Dô": "hmv", "Hmong Shua": "hmz", "Hmwaveke": "mrk", "Ho": "hoc", "Ho Chi Minh City Sign Language": "hos", "Hoava": "hoa", "Hobyót": "hoh", "Hoia Hoia": "hhi", "Holikachuk": "hoi", "Holiya": "hoy", "Holma": "hod", "Holoholo": "hoo", "Holu": "hol", "Homa": "hom", "Honduran Lenca": "len", "Honduras Sign Language": "hds", "Hone": "juh", "Hong Kong Sign Language": "hks", "Honi": "how", "Hopi": "hop", "Horned Miao": "hrm", "Horo": "hor", "Horom": "hoe", "Horpa": "ero", "Hote": "hot", "Hoti": "hti", "Hovongan": "hov", "Hoyahoya": "hhy", "Hozo": "hoz", "Hpon": "hpo", "Hrangkhol": "hra", "Hre": "hre", "Hruso": "hru", "Hu": "huo", "Huachipaeri": "hug", "Huambisa": "hub", "Huaorani": "auc", "Huarijio": "var", "Huaulu": "hud", "Huautla Mazatec": "mau", "Huave": "huv", "Huaxcaleca Nahuatl": "nhq", "Huba": "hbb", "Huehuetla Tepehua": "tee", "Huetar": "cba-hue", "Huichol": "hch", "Huilliche": "huh", "Huitepec Mixtec": "mxs", "Huizhou": "czh", "Hukumina": "huw", "Hula": "hul", "Hulaulá": "huy", "Huli": "hui", "Hulung": "huk", "Humburi Senni": "hmb", "Humene": "huf", "Hun": "uth", "Hunde": "hke", "Hung": "hnu", "Hungana": "hum", "Hungarian": "hu", "Hungarian Sign Language": "hsh", "Hungworo": "nat", "Hunjara-Kaina Ke": "hkk", "Hunnic": "xhc", "Hunsrik": "hrx", "Hunzib": "huz", "Hupa": "hup", "Hupdë": "jup", "Hupla": "hap", "Hurrian": "xhu", "Hutterisch": "geh", "Hwana": "hwo", "Hya": "hya", "Hyam": "jab", "Hän": "haa", "Hértevin": "hrt", "I-Wak": "iwk", "Iaai": "iai", "Iamalele": "yml", "Iatmul": "ian", "Iau": "tmu", "Ibali Teke": "tek", "Ibaloi": "ibl", "Iban": "iba", "Ibanag": "ibg", "Ibani": "iby", "Ibatan": "ivb", "Iberian": "xib", "Ibibio": "ibb", "Ibino": "ibn", "Iboko": "bkp", "Ibu": "ibu", "Ibuoro": "ibr", "Icelandic": "is", "Icelandic Sign Language": "icl", "Iceve-Maci": "bec", "Ida'an": "dbj", "Idakho-Isukha-Tiriki": "ida", "Idaté": "idt", "Idere": "ide", "Idesa": "ids", "Idi": "idi", "Ido": "io", "Idoma": "idu", "Idon": "idc", "Idu": "clk", "Idun": "ldb", "Iduna": "viv", "Ifo": "iff", "Ifè": "ife", "Igala": "igl", "Igana": "igg", "Igbo": "ig", "Igede": "ige", "Ignaciano": "ign", "Igo": "ahl", "Iguta": "nar", "Igwe": "igw", "Iha": "ihp", "Ihievbe": "ihi", "Ija-Zuba": "vki", "Ik": "ikx", "Ika": "ikk", "Ikaranggal": "ikr", "Ikizu": "ikz", "Iko": "iki", "Ikobi-Mena": "meb", "Ikoma": "ntk", "Ikpeng": "txi", "Ikpeshi": "ikp", "Ikposo": "kpo", "Iku-Gora-Ankwa": "ikv", "Ikulu": "ikl", "Ikwere": "ikw", "Ikwo": "iqw", "Ila": "ilb", "Ile Ape": "ila", "Ilgar": "ilg", "Ili Turki": "ili", "Ili'uun": "ilu", "Ilianen Manobo": "mbi", "Illyrian": "xil", "Ilocano": "ilo", "Ilongot": "ilk", "Ilue": "ilv", "Ilwana": "mlk", "Imbongu": "imo", "Imonda": "imn", "Imroing": "imr", "Inabaknon": "abx", "Inapang": "mzu", "Inari Sami": "smn", "Indanga": "bnt-ind", "Indian Sign Language": "ins", "Indo-Portuguese": "idb", "Indonesian": "id", "Indonesian Bajau": "bdl", "Indonesian Sign Language": "inl", "Indri": "idr", "Indus Kohistani": "mvy", "Indus Valley Language": "xiv", "Inebu One": "oin", "Ineseño": "inz", "Inga": "inb", "Ingrian": "izh", "Ingush": "inh", "Inlaod Itneg": "iti", "Inoke-Yate": "ino", "Inonhan": "loc", "Inor": "ior", "Inpui Naga": "nkf", "Interlingua": "ia", "Interlingue": "ie", "International Sign": "ils", "Intha": "int", "Inuinnaqtun": "esx-inq", "Inuit Sign Language": "iks", "Inuktitut": "iu", "Inuktun": "esx-ink", "Inupiaq": "ik", "Inuvialuktun": "ikt", "Ipai": "nai-ipa", "Ipalapa Amuzgo": "azm", "Ipiko": "ipo", "Ipili": "ipi", "Ipulo": "ass", "Iquito": "iqu", "Ir": "irr", "Irantxe": "irn", "Iranun": "ill", "Iraqi Arabic": "acm", "Iraqw": "irk", "Irarutu": "irh", "Iraya": "iry", "Iresim": "ire", "Iriga Bicolano": "bto", "Irish": "ga", "Irish Sign Language": "isg", "Irula": "iru", "Isabi": "isa", "Isan": "tts", "Isanzu": "isn", "Isarog Agta": "agk", "Isaurian": "und-isa", "Isconahua": "isc", "Isebe": "igo", "Ishkashimi": "isk", "Isinai": "inn", "Isirawa": "srl", "Island Carib": "crb", "Islander Creole English": "icr", "Isnag": "isd", "Isoko": "iso", "Israeli Sign Language": "isr", "Isthmus Mixe": "mir", "Isthmus Zapotec": "zai", "Istriot": "ist", "Istro-Romanian": "ruo", "Isu": "isu", "Isubu": "szv", "Italian": "it", "Italian Sign Language": "ise", "Italiot Greek": "grk-ita", "Itawit": "itv", "Itelmen": "itl", "Itene": "ite", "Iteri": "itr", "Itik": "itx", "Ito": "itw", "Itonama": "ito", "Itsekiri": "its", "Itu Mbon Uzo": "itm", "Itundujia Mixtec": "mce", "Itzá": "itz", "Iu Mien": "ium", "Ivatan": "ivv", "Iwaidja": "ibd", "Iwal": "kbm", "Iwam": "iwm", "Iwur": "iwo", "Ixcatec": "ixc", "Ixcatlán Mazatec": "mzi", "Ixil": "ixl", "Ixtayutla Mixtec": "vmj", "Ixtenco Otomi": "otz", "Iyayu": "iya", "Iyive": "uiv", "Iyo": "nca", "Iyo'wujwa Chorote": "crq", "Iyojwa'ja Chorote": "crt", "Izere": "izr", "Izi": "izz", "Izi-Ezaa-Ikwo-Mgbo": "izi", "Izon": "ijc", "Izora": "cbo", "Iñapari": "inp", "Jabem": "jae", "Jabutí": "jbt", "Jad": "jda", "Jadgali": "jdg", "Jah Hut": "jah", "Jahanka": "jad", "Jair Awyu": "awv", "Jakaltek": "jac", "Jakati": "jat", "Jalapa de Díaz Mazatec": "maj", "Jalkunan": "bxl", "Jamaican Country Sign Language": "jcs", "Jamaican Creole": "jam", "Jamaican Sign Language": "jls", "Jamamadí": "jaa", "Jambi Malay": "jax", "Jamiltepec Mixtec": "mxt", "Jaminjung": "djd", "Jamsay": "djm", "Jamtish": "gmq-jmk", "Jandavra": "jnd", "Janday": "jan", "Jangkang": "djo", "Jangshung": "jna", "Janji": "jni", "Japanese": "ja", "Japanese Sign Language": "jsl", "Japhug": "sit-jap", "Japrería": "jru", "Jaqaru": "jqr", "Jara": "jaf", "Jarai": "jra", "Jarawa": "anq", "Jaru": "ddj", "Jassic": "ysc", "Jaunsari": "jns", "Javanese": "jv", "Javindo": "jvd", "Jawe": "jaz", "Jaya": "jyy", "Jebero": "jeb", "Jeh": "jeh", "Jehai": "jhi", "Jeikó": "sai-jko", "Jeju": "jje", "Jemez": "tow", "Jenaama Bozo": "bze", "Jeng": "jeg", "Jennu Kurumba": "xuj", "Jere": "jer", "Jeri Kuo": "jek", "Jersey Dutch": "gmw-jdt", "Jeru": "akj", "Jerung": "jee", "Jhankot Sign Language": "jhs", "Jiamao": "jio", "Jiba": "juo", "Jibu": "jib", "Jicarilla": "apj", "Jiiddu": "jii", "Jilbe": "jie", "Jili": "mgi", "Jilim": "jil", "Jimi": "jmi", "Jimjimen": "jim", "Jin": "cjy", "Jina": "jia", "Jingpho": "kac", "Jingulu": "jig", "Jiongnai Bunu": "pnu", "Jirajara": "sai-jrj", "Jirel": "jul", "Jiru": "jrr", "Jita": "jit", "Jju": "kaj", "Joba": "job", "Jofotek-Bromnya": "jbr", "Jola-Fonyi": "dyo", "Jola-Kasa": "csk", "Jonkor Bourmataguil": "jeu", "Jordanian Sign Language": "jos", "Jorá": "jor", "Jowulu": "jow", "Ju": "juu", "Juang": "jun", "Juba Arabic": "pga", "Judeo-Italian": "itk", "Judeo-Persian": "jpr", "Judeo-Tat": "jdt", "Jukun Takum": "jbu", "Jumaytepeque": "nai-jum", "Jumjum": "jum", "Jumla Sign Language": "jus", "Jumli": "jml", "Jungle Inga": "inj", "Juquila Mixe": "mxq", "Jur Modo": "bex", "Juray": "juy", "Jurchen": "juc", "Jurúna": "jur", "Jutiapa": "nai-jtp", "Jutish": "jut", "Juwal": "mwb", "Juxtlahuaca Mixtec": "vmc", "Juǀ'hoan": "ktz", "Jwira-Pepesa": "jwi", "Júma": "jua", "K'iche'": "quc", "Kaamba": "xku", "Kaan": "ldl", "Kaang Chin": "ckn", "Kaansa": "gna", "Kaapor Sign Language": "uks", "Kaba": "ksp", "Kabalai": "kvf", "Kabardian": "kbd", "Kabatei": "xkp", "Kabba-Laka": "lap", "Kabishiana": "tup-kab", "Kabiyé": "kbp", "Kabola": "klz", "Kabore One": "onk", "Kabras": "lkb", "Kaburi": "uka", "Kabutra": "kbu", "Kabuverdianu": "kea", "Kabwa": "cwa", "Kabwari": "kcw", "Kabyle": "kab", "Kachama-Ganjule": "kcx", "Kachari": "xac", "Kachchi": "kfr", "Kachi Koli": "gjk", "Kacipo-Balesi": "koe", "Kaco'": "xkk", "Kadai": "kzd", "Kadar": "kej", "Kadara": "kad", "Kadaru": "kdu", "Kadiwéu": "kbc", "Kado": "kdv", "Kadugli": "xtc", "Kaduo": "ktp", "Kaera": "jka", "Kafa": "kbr", "Kafoa": "kpu", "Kagan Kalagan": "kll", "Kagate": "syw", "Kagayanen": "cgc", "Kagoma": "kdm", "Kagoro": "xkg", "Kagulu": "kki", "Kahe": "hka", "Kahua": "agw", "Kaian": "kct", "Kaibobo": "kzb", "Kaidipang": "kzp", "Kaiep": "kbw", "Kaikadi": "kep", "Kaike": "kzq", "Kaiku": "kkq", "Kaimbulawa": "zka", "Kaimbé": "xai", "Kaingang": "kgp", "Kairak": "ckr", "Kairiru": "kxa", "Kairui-Midiki": "krd", "Kais": "kzm", "Kaivi": "kce", "Kaiwá": "kgk", "Kaiy": "tcq", "Kajakse": "ckq", "Kajali": "xkj", "Kajaman": "kag", "Kakabai": "kqf", "Kakabe": "kke", "Kakanda": "kka", "Kaki Ae": "tbd", "Kakihum": "kxe", "Kako": "kkj", "Kakwa": "keo", "Kala": "kcl", "Kala Lagaw Ya": "mwp", "Kalaamaya": "lkm", "Kalabakan": "kve", "Kalabari": "ijn", "Kalabra": "kzz", "Kalagan": "kqe", "Kalaktang Monpa": "kkf", "Kalam": "kmh", "Kalami": "gwc", "Kalamsé": "knz", "Kalanadi": "wkl", "Kalanga": "kck", "Kalao": "kly", "Kalapuya": "kyl", "Kalarko": "kba", "Kalasha": "kls", "Kalasuri": "xme-kls", "Kalenjin": "kln", "Kalkatungu": "ktg", "Kalkoti": "xka", "Kalmyk": "xal", "Kalo Finnish Romani": "rmf", "Kalou": "ywa", "Kaluli": "bco", "Kalumpang": "kli", "Kam": "kdx", "Kamakan": "vkm", "Kamang": "woi", "Kamano": "kbq", "Kamantan": "kci", "Kamar": "keq", "Kamara": "jmr", "Kamarian": "kzx", "Kamaru": "kgx", "Kamarupi Prakrit": "inc-kam", "Kamasa": "klp", "Kamasau": "kms", "Kamassian": "xas", "Kamayo": "kyk", "Kamayurá": "kay", "Kamba": "kam", "Kambaata": "ktb", "Kambaira": "kyy", "Kambera": "xbr", "Kamberataro": "kbv", "Kamberau": "irx", "Kambiwá": "xbw", "Kami": "kmi", "Kamkata-viri": "bsh", "Kamo": "kcq", "Kamoro": "kgq", "Kamta": "rkt", "Kamu": "xmu", "Kamula": "xla", "Kamwe": "hig", "Kanakanabu": "xnb", "Kanakuru": "kna", "Kanamari": "knm", "Kanashi": "xns", "Kanasi": "soq", "Kandas": "kqw", "Kandawo": "gam", "Kande": "kbs", "Kang": "kyp", "Kanga": "kcp", "Kangean": "kkv", "Kanggape": "igm", "Kangjia": "kxs", "Kango": "kty", "Kango-Sua": "kzy", "Kangri": "xnr", "Kaniet": "ktk", "Kanikkaran": "kev", "Kaningdon-Nindem": "kdp", "Kaningi": "kzo", "Kaningra": "knr", "Kaninuwa": "wat", "Kanite": "kmu", "Kanjari": "kft", "Kanju": "kbe", "Kankanaey": "kne", "Kannada": "kn", "Kannada Kurumba": "kfi", "Kannauji": "bjj", "Kanowit": "kxn", "Kanoé": "kxo", "Kansa": "ksk", "Kantosi": "xkt", "Kanu": "khx", "Kanufi": "kni", "Kanuri": "kr", "Kanyok": "kny", "Kao": "kax", "Kaonde": "kqn", "Kap": "ykm", "Kapampangan": "pam", "Kapauri": "khp", "Kapin": "tbx", "Kapinawá": "xpn", "Kapingamarangi": "kpg", "Kapriman": "dju", "Kaptiau": "kbi", "Kapya": "klo", "Kaqchikel": "cak", "Kara (New Guinea)": "leu", "Kara (Tanzania)": "reg", "Karachay-Balkar": "krc", "Karadjeri": "gbd", "Karaga Mandaya": "mry", "Karaim": "kdr", "Karajá": "kpj", "Karakalpak": "kaa", "Karakhanid": "xqa", "Karami": "xar", "Karamojong": "kdj", "Karang": "kzr", "Karanga": "kth", "Karankawa": "zkk", "Karao": "kyj", "Karas": "kgv", "Karata": "kpt", "Karawa": "xrw", "Karbi": "mjw", "Kare (Africa)": "kbn", "Kare (New Guinea)": "kmf", "Karekare": "kai", "Karelian": "krl", "Karey": "kyd", "Kari": "kbj", "Karingani": "kgn", "Karipuna": "kuq", "Karipúna": "kgm", "Karipúna Creole French": "kmv", "Kariri": "kzw", "Karitiâna": "ktn", "Kariya": "kil", "Kariyarra": "vka", "Karkar-Yuri": "yuj", "Karkin": "krb", "Karko": "kko", "Karnai": "bbv", "Karo": "kxh", "Karo Batak": "btx", "Karok": "kyh", "Karolanos": "kyn", "Karon": "krx", "Karon Dori": "kgw", "Karore": "xkx", "Karranga": "xrq", "Karuwali": "rxw", "Kasanga": "ccj", "Kasem": "xsm", "Kashaya": "kju", "Kashmiri": "ks", "Kashubian": "csb", "Kasiguranin": "ksn", "Kaska": "kkz", "Kaskean": "zsk", "Kaskihá": "gva", "Kassite": "und-kas", "Kassonke": "kao", "Kasua": "khs", "Kataang": "kgd", "Katabaga": "ktq", "Katawixi": "xat", "Katembri": "sai-kat", "Kathlamet": "nai-kat", "Kathoriya Tharu": "tkt", "Kathu": "ykt", "Katkari": "kfu", "Katla": "kcr", "Kato": "ktw", "Katso": "kaf", "Katua": "kta", "Katukina": "knt", "Kaulong": "pss", "Kaur": "vkk", "Kaure": "bpp", "Kaurna": "zku", "Kauwera": "xau", "Kavalan": "ckv", "Kavet": "krv", "Kawacha": "kcb", "Kawaiisu": "xaw", "Kawe": "kgb", "Kawishana": "awd-kaw", "Kawésqar": "alc", "Kaxararí": "ktx", "Kaxuyana": "kbb", "Kaya": "zra", "Kayabí": "kyz", "Kayagar": "kyt", "Kayan": "pdu", "Kayan Mahakam": "xay", "Kayan River Kayan": "xkn", "Kayapa Kallahan": "kak", "Kayapó": "txu", "Kayardild": "gyd", "Kayeli": "kzl", "Kayong": "kxy", "Kayort": "kyv", "Kaytetye": "gbb", "Kayupulau": "kzu", "Kazakh": "kk", "Kazukuru": "kzk", "Ke'o": "xxk", "Keak": "keh", "Keapara": "khz", "Kedah Malay": "meo", "Kedang": "ksx", "Keder": "kdy", "Kehu": "khh", "Kei": "kei", "Keiga": "kec", "Kein": "bmh", "Keiyo": "eyo", "Kela-Yela": "kel", "Kelabit": "kzi", "Keley-I Kallahan": "ify", "Keliko": "kbo", "Kelo": "xel", "Kelon": "kyo", "Kemak": "kem", "Kembayan": "xem", "Kemberano": "bzp", "Kembra": "xkw", "Kemezung": "dmo", "Kemi Sami": "sjk", "Kemiehua": "kfj", "Kemtuik": "kmt", "Kenaboi": "xbn", "Kenati": "gat", "Kendayan": "knx", "Kendeje": "klf", "Kendem": "kvm", "Kenga": "kyq", "Keningau Murut": "kxi", "Keninjal": "knl", "Kensiu": "kns", "Kenswei Nsei": "ndb", "Kenyan Sign Language": "xki", "Kenyang": "ken", "Kenyi": "lke", "Keoru-Ahia": "xeu", "Kepkiriwát": "kpn", "Kepo'": "kuk", "Kera": "ker", "Kerak": "hhr", "Kereho": "xke", "Kerek": "krk", "Kerewe": "ked", "Kerewo": "kxz", "Kerinci": "kvr", "Kermanic": "xme-ker", "Kesawai": "xes", "Ket": "ket", "Ketangalan": "kae", "Kete": "kcv", "Ketengban": "xte", "Ketum": "ktt", "Kewa": "kew", "Keyagana": "kyg", "Kgalagadi": "xkv", "Khakas": "kjh", "Khalaj": "klj", "Khaling": "klr", "Kham": "kjl", "Khamnigan Mongol": "ykh", "Khamti": "kht", "Khamyang": "ksu", "Khana": "ogo", "Khandeshi": "khn", "Khanty": "kca", "Khao": "xao", "Kharam Naga": "kfw", "Kharia": "khr", "Kharia Thar": "ksy", "Khasa Prakrit": "inc-kha", "Khasi": "kha", "Khayo": "lko", "Khazar": "zkz", "Khe": "kqg", "Khehek": "tlx", "Khengkha": "xkf", "Khetrani": "xhe", "Khezha Naga": "nkh", "Khiamniungan Naga": "kix", "Khinalug": "kjj", "Khirwar": "kwx", "Khisa": "kqm", "Khitan": "zkt", "Khlor": "llo", "Khlula": "ykl", "Khmer": "km", "Khmu": "kjg", "Khoekhoe": "naq", "Khoibu Naga": "nkb", "Khoini": "xkc", "Kholok": "ktc", "Kholosi": "inc-kho", "Khonso": "kxc", "Khorasani Turkish": "kmz", "Khorezmian Turkic": "zkh", "Khotanese": "kho", "Khowar": "khw", "Khroskyabs": "jiq", "Khua": "xhv", "Khuen": "khf", "Khumi Chin": "cnk", "Khvarshi": "khv", "Khwarezmian": "xco", "Khwe": "xuu", "Kháng": "kjm", "Khün": "kkh", "Kibala": "blv", "Kibena": "bez", "Kibet": "kie", "Kibiri": "prm", "Kichwa": "qwe-kch", "Kickapoo": "kic", "Kikai": "kzg", "Kikami": "kcu", "Kikuyu": "ki", "Kildin Sami": "sjd", "Kilit": "xme-klt", "Kilivila": "kij", "Kiliwa": "klb", "Kilmeri": "kih", "Kim": "kia", "Kim Mun": "mji", "Kimaama": "kig", "Kimaragang": "kqr", "Kimbu": "kiv", "Kimbundu": "kmb", "Kimki": "sbt", "Kimré": "kqp", "Kinabalian": "cbw", "Kinalakna": "kco", "Kinaray-a": "krj", "Kinga": "zga", "Kings River Yokuts": "nai-kry", "Kinikinao": "gqn", "Kinnauri": "kfk", "Kintaq": "knq", "Kinuku": "kkd", "Kioko": "ues", "Kiong": "kkm", "Kiorr": "xko", "Kiowa": "kio", "Kipchak": "qwm", "Kipfokomo": "pkb", "Kipsigis": "sgc", "Kiput": "kyi", "Kir-Balar": "kkr", "Kire": "geb", "Kirfi": "kks", "Kirike": "okr", "Kirikiri": "kiy", "Kirya-Konzel": "fkk", "Kis": "kis", "Kisa": "lks", "Kisan": "xis", "Kisankasa": "kqh", "Kisar": "kje", "Kisi": "kiz", "Kistane": "gru", "Kita Maninkakan": "mwk", "Kitanemuk": "azc-ktn", "Kitembo": "tbt", "Kitja": "gia", "Kitsai": "kii", "Kituba": "ktu", "Kiunum": "wei", "Kla": "lda", "Klallam": "clm", "Klamath-Modoc": "kla", "Klao": "klu", "Klias River Kadazan": "kqt", "Klingon": "tlh", "Knaanic": "czk", "Ko": "fuj", "Koalib": "kib", "Koasati": "cku", "Koba": "kpd", "Kobiana": "kcj", "Kobol": "kgu", "Kobon": "kpw", "Koch": "kdq", "Kochila Tharu": "thq", "Koda": "cdz", "Kodaku": "ksz", "Kodava": "kfa", "Kodeoha": "vko", "Kodi": "kod", "Kodia": "kwp", "Koenoem": "kcs", "Kofa": "kso", "Kofei": "kpi", "Kofyar": "kwl", "Kohin": "kkx", "Kohistani Shina": "plk", "Koho": "kpm", "Kohumono": "bcs", "Koi": "kkt", "Koibal": "zkb", "Koireng": "nkd", "Koitabu": "kqi", "Koiwat": "kxt", "Kok-Nar": "gko", "Kok-Paponk": "okg", "Kokata": "ktd", "Kokborok": "trp", "Koke": "kou", "Koko-Bera": "kkp", "Kokoda": "xod", "Kokola": "kzn", "Kokota": "kkk", "Kol (Cameroon)": "biw", "Kol (New Guinea)": "kol", "Kola": "kvv", "Kolami": "kfb", "Kolbila": "klc", "Kolhe": "ekl", "Kolibugan Subanon": "skn", "Kolom": "klm", "Koluwawa": "klx", "Kom (Cameroon)": "bkm", "Kom (India)": "kmm", "Koma": "kmy", "Komba": "kpf", "Kombai": "tyn", "Kombio": "xbi", "Komering": "kge", "Komi-Permyak": "koi", "Komi-Yazva": "urj-kya", "Komi-Zyrian": "kpv", "Kominimung": "xoi", "Komo": "xom", "Komodo": "kvh", "Kompane": "kvp", "Komyandaret": "kzv", "Kon Keu": "kkn", "Konabéré": "bbo", "Konai": "kxw", "Konda": "knd", "Konda-Dora": "kfc", "Kondekor": "gau", "Koneraw": "kdw", "Kongo": "kg", "Konkani": "kok", "Konkomba": "xon", "Konni": "kma", "Kono (Guinea)": "knu", "Kono (Nigeria)": "klk", "Kono (Sierra Leone)": "kno", "Konomala": "koa", "Konomihu": "nai-knm", "Konongo": "kcz", "Konyak Naga": "nbe", "Konyanka Maninka": "mku", "Konzo": "koo", "Koonzime": "ozm", "Koorete": "kqy", "Kopar": "xop", "Kopkaka": "opk", "Korafe-Yegha": "kpr", "Korak": "koz", "Korana": "kqz", "Korandje": "kcy", "Korean": "ko", "Korean Sign Language": "kvk", "Koreguaje": "coe", "Koresh-e Rostam": "okh", "Korku": "kfq", "Korlai Creole Portuguese": "vkp", "Koro (India)": "jkr", "Koro (New Guinea)": "kxr", "Koro (Vanuatu)": "krf", "Koro (West Africa)": "kfo", "Koromfé": "kfz", "Koromira": "kqj", "Koronadal Blaan": "bpr", "Koroni": "xkq", "Korop": "krp", "Koropó": "xxr", "Koroshi": "ktl", "Korowai": "khe", "Korra Koraga": "kfd", "Korubo": "xor", "Korupun-Sela": "kpq", "Korwa": "kfp", "Koryak": "kpy", "Kosadle": "kiq", "Kosarek Yale": "kkl", "Kosena": "kze", "Koshin": "kid", "Kosraean": "kos", "Kota (Gabon)": "koq", "Kota (India)": "kfe", "Kota Bangun Kutai Malay": "mqg", "Kota Marudu Talantang": "grm", "Kota Marudu Tinagas": "ktr", "Kotafon Gbe": "kqk", "Kotava": "avk", "Koti": "eko", "Kott": "zko", "Kou": "snz", "Kouya": "kyf", "Kovai": "kqb", "Kove": "kvc", "Kowaki": "xow", "Kowiai": "kwh", "Koy Sanjaq Surat": "kqd", "Koya": "kff", "Koyaga": "kga", "Koyo": "koh", "Koyra Chiini": "khq", "Koyraboro Senni": "ses", "Koyukon": "koy", "Kpagua": "kuw", "Kpala": "kpl", "Kpan": "kpk", "Kpasam": "pbn", "Kpati": "koc", "Kpatili": "kym", "Kpee": "cpo", "Kpelle": "kpe", "Kpessi": "kef", "Kplang": "kph", "Krache": "kye", "Krahô": "xra", "Kraol": "rka", "Krenak": "kqq", "Kresh": "krs", "Krevinian": "zkv", "Kreye": "xre", "Krikati-Timbira": "xri", "Krim": "krm", "Krio": "kri", "Kriol": "rop", "Krisa": "ksi", "Kristang": "mcm", "Krobu": "kxb", "Krongo": "kgo", "Kru'ng": "krr", "Krymchak": "jct", "Kryts": "kry", "Kua": "tyu", "Kua-nsi": "ykn", "Kuamasi": "yku", "Kuan": "uan", "Kuanhua": "xnh", "Kube": "kgf", "Kubi": "kof", "Kubo": "jko", "Kubu": "kvb", "Kucong": "lkc", "Kudiya": "kfg", "Kudmali": "kyw", "Kudu-Camo": "kov", "Kugama": "kow", "Kugbo": "kes", "Kugu-Muminh": "xmh", "Kui (India)": "kxu", "Kui (Indonesia)": "kvd", "Kuijau": "dkr", "Kuikúro": "kui", "Kujarge": "vkj", "Kuk": "kfn", "Kukatja": "kux", "Kukele": "kez", "Kukkuzi": "urj-kuk", "Kukna": "kex", "Kuku-Mangk": "xmq", "Kuku-Mu'inh": "xmp", "Kuku-Thaypan": "typ", "Kuku-Ugbanh": "ugb", "Kuku-Uwanh": "uwa", "Kuku-Yalanji": "gvn", "Kula": "tpg", "Kulaal": "glj", "Kulere": "kul", "Kulfa": "kxj", "Kulina": "xpk", "Kulisusu": "vkl", "Kullu Pahari": "kfx", "Kulon": "uon", "Kulon-Pazeh": "uun", "Kulung": "kle", "Kumak": "nee", "Kumalu": "ksl", "Kumam": "kdi", "Kuman": "kue", "Kumaoni": "kfy", "Kumarbhag Paharia": "kmj", "Kumba": "ksm", "Kumbainggar": "kgs", "Kumbaran": "wkb", "Kumbewaha": "xks", "Kumeyaay": "nai-kum", "Kumhali": "kra", "Kumu": "kmw", "Kumukio": "kuo", "Kumyk": "kum", "Kumzari": "zum", "Kuna": "cuk", "Kunama": "kun", "Kunbarlang": "wlg", "Kunda": "kdn", "Kundal Shahi": "shd", "Kunduvadi": "wku", "Kung": "kfl", "Kungarakany": "ggk", "Kungardutyi": "gdt", "Kunggari": "kgl", "Kungkari": "lku", "Kuni": "kse", "Kuni-Boazi": "kvg", "Kunigami": "xug", "Kunimaipa": "kup", "Kunja": "pep", "Kunjen": "kjn", "Kunyi": "njx", "Kunza": "kuz", "Kuo": "xuo", "Kuot": "kto", "Kupa": "kug", "Kupang Malay": "mkn", "Kupia": "key", "Kupsabiny": "kpz", "Kur": "kuv", "Kura Ede Nago": "nqk", "Kurama": "krh", "Kuranko": "knk", "Kuri": "nbn", "Kuria": "kuj", "Kurichiya": "kfh", "Kurmukar": "kfv", "Kurnai": "unn", "Kurrama": "vku", "Kurti": "ktm", "Kurtjar": "gdj", "Kurtöp": "xkz", "Kurudu": "kjr", "Kurukh": "kru", "Kuruáya": "kyr", "Kusaal": "kus", "Kusaghe": "ksg", "Kushi": "kuh", "Kustenau": "awd-kus", "Kusu": "ksv", "Kusunda": "kgg", "Kutang Ghale": "ght", "Kutenai": "kut", "Kutep": "kub", "Kuthant": "xut", "Kutto": "kpa", "Kutu": "kdc", "Kuturmi": "khj", "Kuuk Thaayorre": "thd", "Kuuk Yak": "uky", "Kuuku-Ya'u": "kuy", "Kuvale": "olu", "Kuvi": "kxv", "Kuwaa": "blh", "Kuwaataay": "cwt", "Kuwani": "paa-kwn", "Kuy": "kdt", "Kven": "fkv", "Kw'adza": "wka", "Kwa'": "bko", "Kwaami": "ksq", "Kwadi": "kwz", "Kwaio": "kwd", "Kwaja": "kdz", "Kwak": "kwq", "Kwak'wala": "kwk", "Kwakum": "kwu", "Kwalhioqua-Tlatskanai": "qwt", "Kwama": "kmq", "Kwambi": "kwm", "Kwamera": "tnk", "Kwami": "ktf", "Kwamtim One": "okk", "Kwang": "kvi", "Kwanga": "kwj", "Kwangali": "kwn", "Kwanja": "knp", "Kwanka": "bij", "Kwanyama": "kj", "Kwara'ae": "kwf", "Kwasio": "nmg", "Kwaya": "kya", "Kwaza": "xwa", "Kwegu": "xwg", "Kwer": "kwr", "Kwerba": "kwe", "Kwerba Mamberamo": "xwr", "Kwere": "cwe", "Kwerisa": "kkb", "Kwese": "kws", "Kwesten": "kwt", "Kwini": "gww", "Kwinsu": "kuc", "Kwinti": "kww", "Kwoma": "kmo", "Kwomtari": "kwo", "Kyak": "bka", "Kyaka": "kyc", "Kyakala": "tuw-kkl", "Kyan-Karyaw Naga": "nqq", "Kyenele": "kql", "Kyenga": "tye", "Kyerung": "kgy", "Kyrgyz": "ky", "Kâte": "kmg", "Kélé": "keb", "Kómnzo": "paa-kom", "La'bi": "lbi", "Laal": "gdm", "Laalaa": "cae", "Laba": "lau", "Label": "lbb", "Labir": "jku", "Labo": "mwi", "Labo Phowa": "ypb", "Laboya": "lmy", "Labu": "lbu", "Labuk-Kinabatangan Kadazan": "dtb", "Lacandon": "lac", "Lachi": "lbt", "Lachiguiri Zapotec": "zpa", "Lachixío Zapotec": "zpl", "Ladakhi": "lbj", "Ladin": "lld", "Ladino": "lad", "Ladji-Ladji": "llj", "Laeko-Libuat": "lkl", "Lafofa": "laf", "Laghu": "lgb", "Laghuu": "lgh", "Lagwan": "kot", "Laha (Indonesia)": "lhh", "Laha (Vietnam)": "lha", "Lahanan": "lhn", "Lahnda": "lah", "Lahta Karen": "kvt", "Lahu": "lhu", "Lahu Shi": "lhi", "Lahul Lohar": "lhl", "Lai": "cnh", "Laimbue": "lmx", "Laitu Chin": "clj", "Laiyolo": "lji", "Lak": "lbe", "Laka": "lak", "Lakalei": "lka", "Lake Miwok": "lmw", "Lakha": "lkh", "Laki": "lki", "Lakkia": "lbc", "Lakon": "lkn", "Lakondê": "lkd", "Lakota": "lkt", "Lakota Dida": "dic", "Lala (New Guinea)": "nrz", "Lala (South Africa)": "bnt-lal", "Lala-Bisa": "leb", "Lala-Roba": "lla", "Lalana Chinantec": "cnl", "Lama Bai": "lay", "Lamaholot": "slp", "Lamalera": "lmr", "Lamang": "hia", "Lamatuka": "lmq", "Lamba": "lam", "Lambadi": "lmn", "Lambichhong": "lmh", "Lambya": "lai", "Lame": "bma", "Lamenu": "lmu", "Lamet": "lbn", "Lamja-Dengsa-Tola": "ldh", "Lamkang": "lmk", "Lamma": "lev", "Lamnso'": "lns", "Lamogai": "lmg", "Lampung Api": "ljp", "Lamu": "llh", "Lamu-Lamu": "lby", "Lanas Lobu": "ruu", "Landoma": "ldm", "Lang'e": "yne", "Langam": "lnm", "Langbashe": "lna", "Langi": "lag", "Langnian Buyang": "yln", "Lango (Sudan)": "lno", "Lango (Uganda)": "laj", "Lanima": "lnw", "Lanoh": "lnh", "Lao": "lo", "Lao Naga": "nlq", "Laomian": "lwm", "Laopang": "lbg", "Laos Sign Language": "lso", "Lapaguía-Guivini Zapotec": "ztl", "Lapine": "art-lap", "Lapuyan Subanun": "laa", "Laragia": "lrg", "Larantuka Malay": "lrt", "Lardil": "lbz", "Larestani": "lrl", "Larevat": "lrv", "Larike-Wakasihu": "alo", "Laro": "lro", "Larteh": "lar", "Laru": "lan", "Lasalimu": "llm", "Lasgerdi": "lsa", "Lashi": "lsi", "Lasi": "lss", "Latgalian": "ltg", "Latin": "la", "Latu": "ltu", "Latundê": "ltn", "Latvian": "lv", "Latvian Sign Language": "lsl", "Lau": "llu", "Laua": "luf", "Lauan": "llx", "Lauje": "law", "Laura": "lur", "Laurentian": "lre", "Lautu Chin": "clt", "Lavatbura-Lamusong": "lbv", "Lave": "brb", "Laven": "lbo", "Lavukaleve": "lvk", "Lawangan": "lbx", "Lawi": "lvi", "Lawu": "lwu", "Lawunuia": "tgi", "Layakha": "lya", "Laz": "lzz", "Laze": "tbq-laz", "Lealao Chinantec": "cle", "Leco": "lec", "Ledo Kaili": "lew", "Leelau": "ldk", "Lefa": "lfa", "Lega-Mwenga": "lgm", "Lega-Shabunda": "lea", "Legbo": "agb", "Legenyem": "lcc", "Lehali": "tql", "Lehalurup": "urr", "Leinong Naga": "lzn", "Leipon": "lek", "Lela": "dri", "Lelak": "llk", "Lele (Chad)": "lln", "Lele (Congo)": "lel", "Lele (Guinea)": "llc", "Lele (New Guinea)": "lle", "Lelemi": "lef", "Lelepa": "lpa", "Lembena": "leq", "Lemerig": "lrz", "Lemio": "lei", "Lemnian": "xle", "Lemolang": "ley", "Lemoro": "ldj", "Lenakel": "tnl", "Lendu": "led", "Lengilu": "lgi", "Lengo": "lgr", "Lengola": "lej", "Lenje": "leh", "Lenkau": "ler", "Lenyima": "ldg", "Leonese": "roa-leo", "Lepcha": "lep", "Lepki": "lpe", "Lepontic": "xlp", "Lere": "gnh", "Lese": "les", "Lesing-Gelimi": "let", "Letemboi": "nms", "Leti (Cameroon)": "leo", "Leti (Indonesia)": "lti", "Levuka": "lvu", "Lewo": "lww", "Lewo Eleng": "lwe", "Lewotobi": "lwt", "Leyigha": "ayi", "Lezgi": "lez", "Lhao Vo": "mhx", "Lhokpu": "lhp", "Li'o": "ljl", "Liabuku": "lix", "Liana-Seti": "ste", "Liangmai Naga": "njn", "Liberia Kpelle": "xpe", "Liberian English": "lir", "Libido": "liq", "Libinza": "liz", "Libon Bikol": "lbl", "Liburnian": "xli", "Libyan Arabic": "ayl", "Libyan Sign Language": "lbs", "Ligbi": "lig", "Ligenza": "lgz", "Ligurian": "lij", "Lihir": "lih", "Lika": "lik", "Liki": "lio", "Likila": "lie", "Likuba": "kxx", "Likum": "lib", "Likwala": "kwc", "Lilau": "lll", "Lillooet": "lil", "Limassa": "bme", "Limbu": "lif", "Limbum": "lmp", "Limburgish": "li", "Limi": "ylm", "Limilngan": "lmc", "Limos Kalinga": "kmk", "Lindu": "klw", "Linear A": "lab", "Lingala": "ln", "Lingao": "onb", "Lingkhim": "lii", "Lingua Franca Nova": "lfn", "Linngithigh": "lnj", "Lipan": "apl", "Lipo": "lpo", "Lisabata-Nuniali": "lcs", "Lisela": "lcl", "Lish": "lsh", "Lishana Deni": "lsd", "Lishanid Noshan": "aij", "Lishán Didán": "trg", "Lisu": "lis", "Literary Chinese": "lzh", "Lithuanian": "lt", "Lithuanian Sign Language": "lls", "Little Swanport": "aus-lsw", "Litzlitz": "lzl", "Livonian": "liv", "Livvi": "olo", "Lizu": "sit-liz", "Lo-Toga": "lht", "Loarki": "lrk", "Lobala": "loq", "Lobi": "lob", "Lodhi": "lbm", "Logba": "lgq", "Logo": "log", "Logol": "lof", "Logooli": "rag", "Logorik": "liu", "Lojban": "jbo", "Lokaa": "yaz", "Loko": "lok", "Lokoya": "lky", "Lola": "lcd", "Lolak": "llq", "Lole": "llg", "Lolo": "llb", "Loloda": "loa", "Lolopo": "ycl", "Lomaiviti": "lmv", "Lomakka": "loi", "Lomavren": "rmi", "Lombard": "lmo", "Lombi": "lmi", "Lombo": "loo", "Lomwe": "ngl", "Loncong": "lce", "Long Phuri Naga": "lpn", "Long Wat": "ttw", "Longgu": "lgu", "Longto": "wok", "Longuda": "lnu", "Loniu": "los", "Lonwolwol": "crc", "Loo": "ldo", "Looma": "lom", "Lopa": "lop", "Lopi": "lov", "Lopit": "lpx", "Lorang": "lrn", "Lorediakarkar": "lnn", "Lorrain": "roa-lor", "Lote": "uvl", "Lotha Naga": "njh", "Lotud": "dtr", "Lotuko": "lot", "Lou": "loj", "Louisiana Creole": "lou", "Loun": "lox", "Loup A": "xlo", "Loup B": "xlb", "Lovono": "vnk", "Low German": "nds", "Lower Burdekin": "xbb", "Lower Chehalis": "cea", "Lower Grand Valley Dani": "dni", "Lower Nossob": "nsb", "Lower Sorbian": "dsb", "Lower Southern Aranda": "axl", "Lower Ta'oih": "tto", "Lower Tanana": "taa", "Lowland Oaxaca Chontal": "clo", "Lowland Tarahumara": "tac", "Loxicha Zapotec": "ztp", "Lozi": "loz", "Luang": "lex", "Luba-Kasai": "lua", "Luba-Katanga": "lu", "Lubila": "kcc", "Lubu": "lcf", "Lubuagan Kalinga": "knb", "Luchazi": "lch", "Lucumí": "luq", "Ludian": "lud", "Lufu": "ldq", "Luganda": "lg", "Lugbara": "lgg", "Luguru": "ruf", "Luhu": "lcq", "Luhya": "luy", "Luimbi": "lum", "Luiseño": "lui", "Lukpa": "dop", "Lule": "ule", "Lule Sami": "smj", "Lumba-Yakkha": "luu", "Lumbee": "lmz", "Lumbu": "lup", "Lumun": "lmd", "Lun Bawang": "lnd", "Luna": "luj", "Lunanakha": "luk", "Lunda": "lun", "Lungga": "lga", "Luo": "luo", "Luopohe Hmong": "hml", "Luri (Nigeria)": "ldd", "Lusengo": "lse", "Lushootseed": "lut", "Lusi": "khl", "Lusitanian": "xls", "Lutachoni": "lts", "Lutos": "ndy", "Luvale": "lue", "Luwati": "luv", "Luwian": "xlu", "Luwo": "lwo", "Luxembourgish": "lb", "Luyana": "lyn", "Lwalu": "lwa", "Lwel": "bnt-lwl", "Lycian": "xlc", "Lydian": "xld", "Lyngngam": "lyg", "Lyélé": "lee", "Láadan": "ldn", "Láá Láá Bwamu": "bwj", "Lü": "khb", "Ma": "msj", "Ma Manda": "skc", "Ma'anyan": "mhy", "Ma'di": "mhi", "Ma'ya": "slz", "Maa": "cma", "Maaka": "mew", "Maale": "mdy", "Maasai": "mas", "Maay": "ymm", "Maba": "mqa", "Mabaale": "mmz", "Mabaan": "mfz", "Mabaka Valley Kalinga": "kkg", "Mabire": "muj", "Maca": "mca", "Macaguaje": "mcl", "Macaguán": "mbn", "Macanese": "mzs", "Macau Pidgin Portuguese": "crp-mpp", "Macedonian": "mk", "Machame": "jmc", "Machiguenga": "mcb", "Machinere": "mpd", "Machinga": "mvw", "Macoris": "nai-mac", "Macuna": "myy", "Macushi": "mbc", "Mada (Cameroon)": "mxu", "Mada (Nigeria)": "mda", "Madagascar Sign Language": "mzc", "Madak": "mmx", "Maden": "xmx", "Madhi Madhi": "dmd", "Madi": "grg", "Madngele": "zml", "Madukayang Kalinga": "kmd", "Madurese": "mad", "Mae": "mme", "Maek": "hmk", "Maeng Itneg": "itt", "Mafa": "maf", "Mafea": "mkv", "Mag-Anchi Ayta": "sgb", "Mag-Indi Ayta": "blx", "Magadhi Prakrit": "inc-mgd", "Magahat": "mtw", "Magahi": "mag", "Magdalena Peñasco Mixtec": "xtm", "Magiyi": "gmg", "Magoma": "gmx", "Magori": "zgr", "Maguindanao": "mdh", "Magɨ": "gkd", "Mahali": "mjx", "Maharastri Prakrit": "pmh", "Mahasu Pahari": "bfz", "Mahican": "mjy", "Mahongwe": "mhb", "Mahou": "mxx", "Maia": "sks", "Maiadomu": "mzz", "Maiani": "tnh", "Maii": "mmm", "Mailu": "mgu", "Maindo": "cwb", "Mairasi": "zrs", "Maisin": "mbq", "Maithili": "mai", "Maiwa (Indonesia)": "wmm", "Maiwa (New Guinea)": "mti", "Maiwala": "mum", "Majang": "mpe", "Majera": "xmj", "Majhi": "mjz", "Majhwar": "mmj", "Mak (China)": "mkg", "Mak (Nigeria)": "pbl", "Makaa": "mcp", "Makah": "myh", "Makalero": "mjb", "Makasae": "mkz", "Makasar": "mak", "Makassar Malay": "mfp", "Makayam": "aup", "Makhuwa": "vmw", "Makhuwa-Marrevone": "xmc", "Makhuwa-Meetto": "mgh", "Makhuwa-Moniga": "mhm", "Makhuwa-Saka": "xsq", "Makhuwa-Shirima": "vmk", "Maklew": "mgf", "Makolkol": "zmh", "Makonde": "kde", "Maku": "xak", "Maku'a": "lva", "Makuri Naga": "jmn", "Makuráp": "mpu", "Makwe": "ymk", "Makyan Naga": "umn", "Mal": "mlf", "Mal Paharia": "mkb", "Mala (New Guinea)": "ped", "Mala (Nigeria)": "ruy", "Mala Malasar": "ima", "Malaccan Creole Malay": "ccm", "Malagasy": "mg", "Malalamai": "mmt", "Malalí": "sai-mal", "Malango": "mln", "Malankuravan": "mjo", "Malapandaram": "mjp", "Malaryan": "mjq", "Malas": "mkr", "Malasanga": "mqz", "Malasar": "ymr", "Malavedan": "mjr", "Malawi Lomwe": "lon", "Malawian Sign Language": "lws", "Malay": "ms", "Malayalam": "ml", "Malayic Dayak": "xdy", "Malaynon": "mlz", "Malaysian Sign Language": "xml", "Malba Birifor": "bfo", "Male": "mdc", "Malecite-Passamaquoddy": "pqm", "Maleng": "pkt", "Maleu-Kilenge": "mgl", "Malfaxal": "mlx", "Malgana": "vml", "Malgbe": "mxf", "Mali": "gcc", "Malibu": "sai-mlb", "Malila": "mgq", "Malimba": "mzd", "Malimpung": "mli", "Malinaltepec Tlapanec": "tcf", "Malol": "mbk", "Maltese": "mt", "Maltese Sign Language": "mdl", "Malua Bay": "mll", "Malvi": "mup", "Maléku Jaíka": "gut", "Mam": "mam", "Mama": "mma", "Mamaa": "mhf", "Mamaindé": "wmd", "Mamanwa": "mmn", "Mamara Senoufo": "myk", "Mamasa": "mqj", "Mambae": "mgm", "Mambai": "mcs", "Mamboru": "mvd", "Mambwe-Lungu": "mgr", "Mampruli": "maw", "Mamuju": "mqx", "Mamulique": "emm", "Mamusi": "kdf", "Mamvu": "mdi", "Man Met": "mml", "Manado Malay": "xmm", "Manam": "mva", "Manambu": "mle", "Manangba": "nmm", "Manangkari": "znk", "Manao": "awd-man", "Manchu": "mnc", "Manda (Australia)": "zma", "Manda (India)": "mha", "Manda (Tanzania)": "mgs", "Mandahuaca": "mht", "Mandaic": "mid", "Mandailing Batak": "btm", "Mandalorian": "art-man", "Mandan": "mhq", "Mandandanyi": "zmk", "Mandar": "mdr", "Mandara": "tbf", "Mandari": "mqu", "Mandarin": "cmn", "Mandeali": "mjl", "Mander": "mqr", "Mandingo": "man", "Mandinka": "mnk", "Mandjak": "mfv", "Mandobo Atas": "aax", "Mandobo Bawah": "bwp", "Manem": "jet", "Mang": "zng", "Mangala": "mem", "Mangarayi": "mpc", "Mangarevan": "mrv", "Mangas": "zns", "Mangayat": "myj", "Mangbetu": "mdj", "Mangbutu": "mdk", "Mangerr": "zme", "Mangga Buang": "mmo", "Manggarai": "mqy", "Mangghuer": "xgn-mgr", "Mango": "mge", "Mangole": "mqc", "Mangseng": "mbh", "Manigri-Kambolé Ede Nago": "xkb", "Manikion": "mnx", "Manipa": "mqp", "Manipuri": "mni", "Mankanya": "knf", "Mankiyali": "nlm", "Manna-Dora": "mju", "Mannan": "mjv", "Mano": "mev", "Manombai": "woo", "Mansaka": "msk", "Mansi": "mns", "Mansoanka": "msw", "Manta": "myg", "Mantsi": "nty", "Manumanaw Karen": "kxf", "Manusela": "wha", "Manx": "gv", "Manya": "mzj", "Manyawa": "mny", "Manza": "mzv", "Mao Naga": "nbi", "Maonan": "mmd", "Maore Comorian": "swb", "Maori": "mi", "Mape": "mlh", "Mapena": "mnm", "Mapia": "mpy", "Mapidian": "mpw", "Mapos Buang": "bzh", "Mapoyo": "mcg", "Mapudungun": "arn", "Mapun": "sjm", "Maquiritari": "mch", "Mara": "mec", "Mara Chin": "mrh", "Marachi": "lri", "Maraghei": "vmh", "Maragus": "mrs", "Maram Naga": "nma", "Marama": "lrm", "Maranao": "mrw", "Maranungku": "zmr", "Mararit": "mgb", "Marathi": "mr", "Maratino": "sai-mar", "Marau": "mvr", "Marawan": "awd-mar", "Marba": "mpg", "Marenje": "vmr", "Marfa": "mvu", "Margany": "zmc", "Marghi South": "mfm", "Margi": "mrt", "Margu": "mhg", "Maria": "mds", "Mariaté": "awd-mrt", "Maricopa": "mrc", "Maridan": "zmd", "Maridjabin": "zmj", "Marik": "dad", "Marimanindji": "zmm", "Marind": "mrz", "Maring": "mbw", "Maring Naga": "nng", "Maringarr": "zmt", "Marino": "mrb", "Mariri": "mqi", "Maritime Sign Language": "nsr", "Maritsauá": "msp", "Mariupol Greek": "grk-mar", "Mariyedi": "zmy", "Marka": "rkm", "Markweeta": "enb", "Marma": "rmz", "Maroon Spirit Language": "cpe-mar", "Marovo": "mvo", "Marriammu": "xru", "Marrithiyel": "mfr", "Marrucinian": "umc", "Marshallese": "mh", "Marsian": "ims", "Martha's Vineyard Sign Language": "mre", "Marti Ke": "zmg", "Martu Wangka": "mpj", "Martuthunira": "vma", "Marwari": "mwr", "Marúbo": "mzr", "Masaba": "myx", "Masadiit Itneg": "tis", "Masakará": "sai-msk", "Masalit": "mls", "Masana": "mcn", "Masbate Sorsogon": "bks", "Masbatenyo": "msb", "Mashco Piro": "cuj", "Mashi": "mho", "Masimasi": "ism", "Masiwang": "bnf", "Maskelynes": "klv", "Maslam": "msv", "Masmaje": "mes", "Massachusett": "wam", "Massalat": "mdg", "Massep": "mvs", "Matagalpa": "mtn", "Matal": "mfh", "Matanawi": "sai-mat", "Matbat": "xmt", "Matengo": "mgv", "Matepi": "mqe", "Matigsalug Manobo": "mbt", "Matipuhy": "mzo", "Matlatzinca": "mat", "Mato": "met", "Mato Grosso Arára": "axg", "Mator": "mtm", "Matsés": "mcf", "Mattole": "mvb", "Matukar": "mjk", "Matumbi": "mgw", "Matya Samo": "stj", "Matís": "mpq", "Maung": "mph", "Mauritian Creole": "mfe", "Mauritian Sign Language": "lsy", "Mauwake": "mhl", "Mawa": "mcw", "Mawak": "mjj", "Mawan": "mcz", "Mawayana": "mzx", "Mawchi": "mke", "Mawes": "mgk", "Maxakalí": "mbl", "Maxi Gbe": "mxl", "Maya Samo": "sym", "Mayaguduna": "xmy", "Mayangna": "yan", "Mayawali": "yxa", "Maybrat": "ayz", "Mayeka": "myc", "Mayi-Thakurti": "xyt", "Maykulan": "mnt", "Maynas": "sai-mys", "Mayo": "mfy", "Mayogo": "mdm", "Mayoyao Ifugao": "ifu", "Maypure": "awd-mpr", "Mazagway": "dkx", "Mazaltepec Zapotec": "zpy", "Mazanderani": "mzn", "Mazatlán Mazatec": "vmz", "Mazatlán Mixe": "mzl", "Mba": "mfc", "Mbabaram": "vmb", "Mbala": "mdp", "Mbalanhu": "lnb", "Mbandja": "zmz", "Mbangala": "mxg", "Mbangi": "mgn", "Mbangwe": "zmn", "Mbara (Australia)": "mvl", "Mbara (Chad)": "mpk", "Mbariman-Gudhinma": "zmv", "Mbati": "mdn", "Mbato": "gwa", "Mbay": "myb", "Mbe": "mfo", "Mbe'": "mtk", "Mbelime": "mql", "Mbere": "mdt", "Mbesa": "zms", "Mbiywom": "aus-mbi", "Mbo (Cameroon)": "mbo", "Mbo (Congo)": "zmw", "Mboi": "moi", "Mboko": "mdu", "Mbole": "mdq", "Mbonga": "xmb", "Mbongno": "bgu", "Mbosi": "mdw", "Mbowe": "mxo", "Mbre": "mka", "Mbu'": "muc", "Mbudum": "xmd", "Mbugu": "mhd", "Mbugwe": "mgz", "Mbuko": "mqb", "Mbukushu": "mhw", "Mbula": "mna", "Mbula-Bwazza": "mbu", "Mbule": "mlb", "Mbulungish": "mbv", "Mbum": "mdd", "Mbunda": "mck", "Mbunga": "mgy", "Mburku": "bbt", "Mbuun": "zmp", "Mbwela": "mfu", "Mbyá Guaraní": "gun", "Me'en": "mym", "Mea": "meg", "Mebu": "mjn", "Mecayapan Nahuatl": "nhx", "Medebur": "mjm", "Medefaidrin": "dmf", "Media Lengua": "mue", "Mednyj Aleut": "mud", "Medumba": "byv", "Mefele": "mfj", "Megam": "mef", "Megleno-Romanian": "ruq", "Mehek": "nux", "Mehináku": "mmh", "Mehri": "gdq", "Mekeo": "mek", "Mekmek": "mvk", "Mekwei": "msf", "Mel-Khaonh": "hkn", "Mele-Fila": "mxe", "Melo": "mfx", "Melpa": "med", "Memoni": "mby", "Mendalam Kayan": "xkd", "Mendankwe-Nkwen": "mfd", "Mende": "men", "Mengaka": "xmg", "Mengen": "mee", "Menien": "sai-men", "Menka": "mea", "Menominee": "mez", "Mentawai": "mwv", "Menya": "mcr", "Meoswar": "mvx", "Mer": "mnu", "Meramera": "mxm", "Merei": "lmb", "Merey": "meq", "Meriam": "ulk", "Merlav": "mrm", "Meroitic": "xmr", "Meru": "mer", "Mesaka": "iyo", "Mese": "mci", "Mesme": "zim", "Mesmes": "mys", "Mesqan": "mvz", "Messapic": "cms", "Meta'": "mgo", "Metlatónoc Mixtec": "mxv", "Mewari": "mtr", "Mewati": "wtm", "Mexican Sign Language": "mfs", "Meyah": "mej", "Mezontla Popoloca": "pbe", "Mezquital Otomi": "ote", "Meänkieli": "fit", "Mfinu": "zmf", "Mfumte": "nfu", "Mgbo": "gmz", "Mi'kmaq": "mic", "Miami": "mia", "Mian": "mpt", "Miani": "pla", "Michif": "crg", "Michigamea": "cmm", "Michoacán Mazahua": "mmc", "Michoacán Nahuatl": "ncl", "Mid Grand Valley Dani": "dnt", "Mid-Southern Banda": "bjo", "Middle Armenian": "axm", "मध्य असमिया": "inc-mas", "Middle Bengali": "inc-mbn", "Middle Breton": "xbm", "Middle Chinese": "ltc", "Middle Cornish": "cnx", "Middle Dutch": "dum", "Middle English": "enm", "Middle French": "frm", "Middle Gujarati": "inc-mgu", "Middle High German": "gmh", "Middle Irish": "mga", "Middle Kannada": "dra-mkn", "Middle Khmer": "xhm", "Middle Korean": "okm", "Middle Low German": "gml", "Middle Median": "xme-mid", "Middle Mon": "mkh-mmn", "Middle Mongol": "xng", "Middle Newar": "nwx", "Middle Norwegian": "gmq-mno", "Middle Oriya": "inc-mor", "Middle Persian": "pal", "Middle Vietnamese": "mkh-mvi", "Middle Watut": "mpl", "Middle Welsh": "wlm", "Midob": "mei", "Migaama": "mmy", "Migabac": "mpp", "Miji": "sjl", "Miju": "mxj", "Mikasuki": "mik", "Milang": "und-mil", "Mili": "ymh", "Millcayac": "sai-mil", "Miltu": "mlj", "Miluk": "iml", "Milyan": "imy", "Mimi of Decorse": "und-mmd", "Mimi of Nachtigal": "und-mmn", "Min Bei": "mnp", "Min Dong": "cdo", "Min Nan": "nan", "Min Zhong": "czo", "Mina": "hna", "Minaean": "inm", "Minang": "xrg", "Minangkabau": "min", "Minanibai": "mcv", "Minaveha": "mvn", "Minderico": "drc", "Mindiri": "mpn", "Mingang Doso": "mko", "Mingo": "iro-min", "Mingrelian": "xmf", "Minica Huitoto": "hto", "Minidien": "wii", "Minigir": "vmg", "Minjungbal": "xjb", "Minkin": "xxm", "Minoan": "omn", "Minokok": "mqq", "Minriq": "mnq", "Mintil": "mzt", "Miqie": "yiq", "Mirandese": "mwl", "Miraya Bikol": "rbl", "Mire": "mvh", "Mirgan": "zrg", "Miriti": "mmv", "Miriwoong Sign Language": "rsm", "Miriwung": "mep", "Mirpur Panjabi": "pmu", "Misantla Totonac": "tlc", "Miship": "mjs", "Misima-Paneati": "mpx", "Mising": "mrg", "Miskito": "miq", "Mitla Zapotec": "zaw", "Mitlatongo Mixtec": "vmm", "Mittu": "mwu", "Mituku": "zmq", "Miu": "mpo", "Miwa": "vmi", "Mixed Great Andamanese": "gac", "Mixifore": "mfg", "Mixtepec Mixtec": "mix", "Mixtepec Zapotec": "zpm", "Miya": "mkf", "Miyako": "mvi", "Miyobe": "soy", "Mizo": "lus", "Mlabri": "mra", "Mlahsö": "lhs", "Mlap": "kja", "Mlomp": "mlo", "Mmaala": "mmu", "Mmani": "buy", "Mmen": "bfm", "Mo": "wkd", "Mo'da": "gbn", "Moabite": "obm", "Moba": "mfq", "Mobilian": "mod", "Mobumrin Aizi": "ahm", "Mocana": "sai-mcn", "Mochi": "old", "Mochica": "omc", "Mocho": "mhc", "Mocoví": "moc", "Modang": "mxd", "Modole": "mqo", "Moere": "mvq", "Mofu-Gudur": "mif", "Mogholi": "mhj", "Mogum": "mou", "Mohawk": "moh", "Mohegan-Pequot": "xpq", "Moi (Congo)": "mow", "Moi (Indonesia)": "mxn", "Moikodi": "mkp", "Moingi": "mwz", "Mojave": "mov", "Moji": "ymi", "Mok": "mqt", "Moken": "mwt", "Mokerang": "mft", "Mokilese": "mkj", "Moklen": "mkm", "Mokole": "mkl", "Mokpwe": "bri", "Moksha": "mdf", "Molale": "mbe", "Molbog": "pwm", "Moldova Sign Language": "vsi", "Molengue": "bxc", "Molima": "mox", "Molmo One": "aun", "Molo": "zmo", "Molof": "msl", "Moloko": "mlw", "Mom Jango": "ver", "Moma": "myl", "Momare": "msz", "Mombo Dogon": "dmb", "Mombum": "mso", "Momina": "mmb", "Momuna": "mqf", "Mon": "mnw", "Monastic Sign Language": "mzg", "Mondropolon": "npn", "Mondé": "mnd", "Mongghul": "xgn-mgl", "Mongo": "lol", "Mongol": "mgt", "Mongolian": "mn", "Mongolian Sign Language": "msr", "Mongondow": "mog", "Moni": "mnz", "Monimbo": "mom", "Mono (California)": "mnr", "Mono (Cameroon)": "mru", "Mono (Congo)": "mnh", "Monom": "moo", "Monsang Naga": "nmh", "Montagnais": "moe", "Montana Salish": "fla", "Montol": "mtl", "Monumbo": "mxk", "Monzombo": "moj", "Moo": "gwg", "Moore": "mos", "Moose Cree": "crm", "Mopan Maya": "mop", "Mor (Austronesian)": "mhz", "Mor (Papuan)": "moq", "Moraid": "msg", "Moran": "sit-mor", "Morawa": "mze", "Morelos Nahuatl": "nhm", "Morerebi": "xmo", "Moresada": "msx", "Mori Atas": "mzq", "Mori Bawah": "xmz", "Morigi": "mdb", "Moro": "mor", "Moroccan Amazigh": "zgh", "Moroccan Arabic": "ary", "Moroccan Sign Language": "xms", "Morokodo": "mgc", "Morom": "bdo", "Moronene": "mqn", "Morori": "mok", "Morouas": "mrp", "Mortlockese": "mrl", "Moru": "mgd", "Mosimo": "mqv", "Moskona": "mtj", "Mota": "mtt", "Motembo": "tmv", "Motu": "meu", "Mouk-Aria": "mwh", "Mount Iraya Agta": "atl", "Mount Iriga Agta": "agz", "Mountain Koiari": "kpx", "Mouwase": "jmw", "Movima": "mzp", "Moyadan Itneg": "ity", "Moyon Naga": "nmo", "Mozambican Sign Language": "mzy", "Mozarabic": "mxi", "Mpade": "mpi", "Mpalitjanh": "xpj", "Mpi": "mpz", "Mpiemo": "mcx", "Mpiin": "bnt-mpi", "Mpinda": "pnd", "Mpongmpong": "mgg", "Mpoto": "mpa", "Mpotovoro": "mvt", "Mpuono": "bnt-mpu", "Mpur": "akc", "Mro Chin": "cmr", "Mru": "mro", "Mser": "kqx", "Muak Sa-aak": "ukk", "Mualang": "mtd", "Mubami": "tsx", "Mubi": "mub", "Mucuchí": "sai-muc", "Muda": "ymd", "Mudburra": "dmw", "Mudu Koraga": "vmd", "Muduapa": "wiv", "Muduga": "udg", "Muellama": "sai-mue", "Mufian": "aoj", "Muher": "sem-mhr", "Muinane": "bmr", "Mukha-Dora": "mmk", "Mukulu": "moz", "Mulaha": "mfw", "Mulam": "mlm", "Mulao": "giu", "Mullu Kurumba": "kpb", "Mullukmulluk": "mpb", "Muluridyi": "vmu", "Mum": "kqa", "Mumuye": "mzm", "Muna": "mnb", "Munda": "unx", "Mundabli": "boe", "Mundang": "mua", "Mundani": "mnf", "Mundari": "unr", "Mundat": "mmf", "Mundolinco": "art-mun", "Mundurukú": "myu", "Mungaka": "mhk", "Mungbam": "mij", "Munggui": "mth", "Mungkip": "mpv", "Muniche": "myr", "Munit": "mtc", "Munji": "mnj", "Munsee": "umu", "Muong": "mtq", "Mur Pano": "tkv", "Muratayak": "asx", "Murik (Malaysia)": "mxr", "Murik (New Guinea)": "mtf", "Murkim": "rmh", "Murle": "mur", "Murrinh-Patha": "mwf", "Mursi": "muz", "Murui Huitoto": "huu", "Murupi": "mqw", "Muruwari": "zmu", "Musan": "mmp", "Musar": "mmi", "Musasa": "smm", "Musey": "mse", "Musgu": "mug", "Musi": "mui", "Muskum": "mje", "Musom": "msu", "Mussau-Emira": "emi", "Muthuvan": "muv", "Mutu": "tuc", "Muya": "mvm", "Muyang": "muy", "Muyuw": "myw", "Muzi": "ymz", "Muzo": "sai-muz", "Mvanip": "mcj", "Mvuba": "mxh", "Mwaghavul": "sur", "Mwali Comorian": "wlc", "Mwan": "moa", "Mwani": "wmw", "Mwatebu": "mwa", "Mwera": "mwe", "Mwimbi-Muthambi": "mws", "Mwotlap": "mlv", "Mycenaean Greek": "gmy", "Myene": "mye", "Mysian": "yms", "Mzieme Naga": "nme", "Mághdì": "gmd", "Mòcheno": "mhn", "Mün Chin": "mwq", "Mündü": "muh", "N'Ko": "nqo", "Na": "nbt", "Na'vi": "art-nav", "Naaba": "nao", "Naba": "mne", "Nabak": "naf", "Nabi": "mty", "Nachering": "ncd", "Nadruvian": "ndf", "Nadëb": "mbj", "Nafaanra": "nfr", "Nafi": "srf", "Nafri": "nxx", "Naga Pidgin": "nag", "Nagarchal": "nbg", "Nage": "nxe", "Nagtipunan Agta": "phi-nag", "Nagu": "ngr", "Nagumi": "ngv", "Nahali": "nlx", "Nahari": "nhh", "Nahavaq": "sns", "Nahuatl": "nah", "Nai": "bio", "Najdi Arabic": "ars", "Naka'ela": "nae", "Nakai": "nkj", "Nakame": "nib", "Nakanai": "nak", "Nakara": "nck", "Nake": "nbk", "Naki": "mff", "Nakwi": "nax", "Nalca": "nlc", "Nali": "nss", "Nalik": "nal", "Nalu": "naj", "Naluo Yi": "ylo", "Nalögo": "nlz", "Namakura": "nmk", "Namat": "nkm", "Nambikwara": "nab", "Nambo": "ncm", "Nambya": "nmq", "Namia": "nnm", "Namiae": "nvm", "Namibian Sign Language": "nbs", "Namla": "naa", "Namo": "mxw", "Namonuito": "nmt", "Namosi-Naitasiri-Serua": "bwb", "Namuyi": "nmy", "Nanai": "gld", "Nancere": "nnc", "Nande": "nnb", "Nandi": "niq", "Nanerigé Sénoufo": "sen", "Nanga Dama Dogon": "nzz", "Nankina": "nnk", "Nanti": "cox", "Nanticoke": "nnt", "Nanubae": "afk", "Naolan": "nai-nao", "Napu": "npy", "Nar Phu": "npa", "Nara": "nrb", "Narak": "nac", "Narango": "nrg", "Narau": "nxu", "Narim": "loh", "Naro": "nhr", "Narom": "nrm", "Narragansett": "xnt", "Narua": "nru", "Narungga": "nnr", "Nasal": "nsy", "Nasarian": "nvh", "Nasioi": "nas", "Naskapi": "nsk", "Nasu": "ywq", "Natagaimas": "nts", "Natchez": "ncz", "Nateni": "ntm", "Nathembo": "nte", "Natioro": "nti", "Natú": "sai-nat", "Natügu": "ntu", "Nauete": "nxa", "Naukanski": "ynk", "Nauna": "ncn", "Nauo": "nwo", "Nauruan": "na", "Navajo": "nv", "Navarro-Aragonese": "roa-oan", "Navut": "nsw", "Nawaru": "nwr", "Nawathinehena": "nwa", "Nawdm": "nmz", "Nawuri": "naw", "Naxi": "nxq", "Nayi": "noz", "Ncane": "ncr", "Nchumbulu": "nlu", "Nda'nda'": "nnz", "Ndai": "gke", "Ndaka": "ndk", "Ndali": "ndh", "Ndam": "ndm", "Ndamba": "ndj", "Ndambomo": "nxo", "Ndasa": "nda", "Ndau": "ndc", "Nde-Gbite": "ned", "Nde-Nsele-Nta": "ndd", "Ndemli": "nml", "Ndendeule": "dne", "Ndengereko": "ndg", "Nding": "eli", "Ndjébbana": "djj", "Ndo": "ndp", "Ndobo": "ndw", "Ndoe": "nbb", "Ndogo": "ndz", "Ndolo": "ndl", "Ndom": "nqm", "Ndombe": "ndq", "Ndonga": "ng", "Ndoola": "ndr", "Ndrulo": "dno", "Nduga": "ndx", "Ndumu": "nmd", "Ndunda": "nuh", "Ndunga": "ndt", "Ndut": "ndv", "Ndyuka-Trio Pidgin": "njt", "Ndzwani Comorian": "wni", "Neapolitan": "nap", "Nedebang": "nec", "Nefamese": "nef", "Nefusa": "jbn", "Negerhollands": "dcr", "Negeri Sembilan Malay": "zmi", "Negidal": "neg", "Nehan": "nsn", "Nek": "nif", "Nekgini": "nkg", "Neko": "nej", "Neku": "nek", "Neme": "nex", "Nemi": "nem", "Nen": "nqn", "Nend": "anh", "Nengone": "nen", "Neo": "neu", "Nepalese Sign Language": "nsp", "Nepali": "ne", "Nepali Kurux": "kxl", "Nete": "net", "Neve'ei": "vnm", "Neverver": "lgk", "New Caledonian Javanese": "jas", "New River Shasta": "nai-nrs", "New Zealand Sign Language": "nzs", "Newar": "new", "Neyo": "ney", "Nez Perce": "nez", "Nga La": "hlt", "Ngaanyatjarra": "ntj", "Ngadha": "nxg", "Ngadjunmaya": "nju", "Ngadjuri": "jui", "Ngaing": "nnf", "Ngaju": "nij", "Ngala": "nud", "Ngalakan": "nig", "Ngalkbun": "ngk", "Ngalum": "szb", "Ngam": "nmc", "Ngamambo": "nbv", "Ngambay": "sba", "Ngamini": "nmv", "Ngamo": "nbh", "Ngan'gityemerri": "nam", "Nganakarti": "xnk", "Nganasan": "nio", "Ngandi": "nid", "Ngando (Central African Republic)": "ngd", "Ngando (Congo)": "nxd", "Ngandyera": "nne", "Ngangam": "gng", "Ngantangarra": "ntg", "Nganyaywana": "nyx", "Ngardi": "rxd", "Ngarigu": "xni", "Ngarinman": "nbj", "Ngarinyin": "ung", "Ngarla": "nrk", "Ngarluma": "nrl", "Ngarrindjeri": "nay", "Ngas": "anc", "Ngasa": "nsg", "Ngatik Men's Creole": "ngm", "Ngawn Chin": "cnw", "Ngawun": "nxn", "Ngazidja Comorian": "zdj", "Ngbaka": "nga", "Ngbaka Ma'bo": "nbm", "Ngbaka Manza": "ngg", "Ngbee": "jgb", "Ngbinda": "nbd", "Ngbundu": "nuu", "Ngelima": "agh", "Ngemba": "nge", "Ngen": "gnj", "Ngendelengo": "nql", "Ngeq": "ngt", "Ngete": "nnn", "Nggem": "nbq", "Nggwahyi": "ngx", "Ngie": "ngj", "Ngiemboon": "nnh", "Ngile": "jle", "Ngindo": "nnq", "Ngiti": "niy", "Ngiyambaa": "wyb", "Ngizim": "ngi", "Ngkoth": "aus-ngk", "Ngkâlmpw Kanum": "kcd", "Ngochang": "tbq-ngo", "Ngom": "nra", "Ngomba": "jgo", "Ngombale": "nla", "Ngombe (Central African Republic)": "nmj", "Ngombe (Congo)": "ngc", "Ngong": "nnx", "Ngongo": "noq", "Ngoni": "ngo", "Ngoreme": "ngq", "Ngoshie": "nsh", "Ngul": "nlo", "Ngulu": "ngp", "Nguluwan": "nuw", "Ngumbi": "nui", "Ngunawal": "xul", "Ngundi": "ndn", "Ngundu": "nue", "Ngungwel": "ngz", "Ngurmbur": "nrx", "Nguôn": "nuo", "Ngwaba": "ngw", "Ngwe": "nwe", "Ngwo": "ngn", "Ngäbere": "gym", "Nhanda": "nha", "Nheengatu": "yrl", "Nhirrpi": "hrp", "Nhuwala": "nhf", "Nias": "nia", "Nicaraguan Creole": "bzk", "Nicaraguan Sign Language": "ncs", "Nicola": "ath-nic", "Niellim": "nie", "Nigeria Mambila": "mzk", "Nigerian Pidgin": "pcm", "Nigerian Sign Language": "nsi", "Nihali": "nll", "Nii": "nii", "Niksek": "gbe", "Nila": "nil", "Nilamba": "nim", "Nimadi": "noe", "Nimanbur": "nmp", "Nimbari": "nmr", "Nimboran": "nir", "Nimi": "nis", "Nimo": "niw", "Nimoa": "nmw", "Ninam": "shb", "Nindi": "nxi", "Ningera": "nby", "Ninggerum": "nxr", "Ningil": "niz", "Ninia Yali": "nlk", "Ninzo": "nin", "Nipsan": "nps", "Nisa": "njs", "Nisenan": "nsz", "Nisga'a": "ncg", "Nisi": "yso", "Niuafo'ou": "num", "Niuatoputapu": "nkp", "Niuean": "niu", "Nivaclé": "cag", "Nivkh": "niv", "Niwer Mil": "hrc", "Niya Prakrit": "pra-niy", "Njalgulgule": "njl", "Njebi": "nzb", "Njen": "njj", "Njerep": "njr", "Njyem": "njy", "Nkami": "nkq", "Nkangala": "nkn", "Nkari": "nkz", "Nkem-Nkum": "isi", "Nkhumbi": "khu", "Nkongho": "nkc", "Nkonya": "nko", "Nkoroo": "nkx", "Nkoya": "nka", "Nkukoli": "nbo", "Nkutu": "nkw", "Nnam": "nbp", "Nobiin": "fia", "Nobonob": "gaw", "Nocamán": "nom", "Nocte Naga": "njb", "Nogai": "nog", "Noiri": "noi", "Nokuku": "nkk", "Nomaande": "lem", "Nomane": "nof", "Nomatsiguenga": "not", "Nomlaki": "nol", "Nomu": "noh", "Nong Zhuang": "zhn", "Nonuya": "noj", "Nooksack": "nok", "Noon": "snf", "Noone": "nhu", "Nootka": "nuk", "Nopala Chatino": "cya", "Noric": "nrc", "Norman": "nrf", "Norn": "nrn", "Norra": "nrr", "North Alaskan Inupiatun": "esi", "North Ambrym": "mmg", "North Asmat": "nks", "North Awyu": "yir", "North Babar": "bcd", "North Boma": "boh", "North Central Mixe": "neq", "North Efate": "llp", "North Fali": "fll", "North Frisian": "frr", "North Giziga": "gis", "North Levantine Arabic": "apc", "North Marquesan": "mrq", "North Mesopotamian Arabic": "ayp", "North Mofu": "mfk", "North Moluccan Malay": "max", "North Muyu": "kti", "North Nuaulu": "nni", "North Picene": "nrp", "North Slavey": "scs", "North Tairora": "tbg", "North Tanna": "tnn", "North Wahgi": "whg", "North Watut": "una", "Northeast Kiwai": "kiw", "Northeast Maidu": "nmu", "Northeast Pashayi": "aee", "Northeastern Dinka": "dip", "Northeastern Pomo": "pef", "Northern Alta": "aqn", "Northern Altai": "atv", "Northern Amami-Oshima": "ryn", "Northern Bai": "bfc", "Northern Bontoc": "rbk", "Northern Catanduanes Bicolano": "cts", "Northern Dagara": "dgi", "Northern East Cree": "crl", "Northern Emberá": "emp", "Northern Ghale": "ghh", "Northern Grebo": "gbo", "Northern Guiyang Hmong": "huj", "Northern Haida": "hdn", "Northern Hindko": "hno", "Northern Huishui Hmong": "hmi", "Northern Kalapuya": "nrt", "Northern Kam": "doc", "Northern Kankanay": "xnn", "Northern Khmer": "kxm", "Northern Kissi": "kqs", "Northern Kurdish": "kmr", "Northern Lorung": "lbr", "Northern Luri": "lrc", "Northern Mashan Hmong": "hmp", "Northern Muji": "ymx", "Northern Ndebele": "nd", "Northern Ngbandi": "ngb", "Northern Nisu": "yiv", "Northern Nuni": "nuv", "Northern Oaxaca Nahuatl": "nhy", "Northern Ohlone": "cst", "Northern One": "onr", "Northern Paiute": "pao", "Northern Pame": "pmq", "Northern Pomo": "pej", "Northern Puebla Nahuatl": "ncj", "Northern Pumi": "pmi", "Northern Pwo": "pww", "Northern Qiandong Miao": "hea", "Northern Qiang": "cng", "Northern Rengma Naga": "nnl", "Northern Roglai": "rog", "Northern Saharan Berber": "mzb", "Northern Sami": "se", "Northern Selkup": "sel-nor", "Northern Sierra Miwok": "nsq", "Northern Sotho": "nso", "Northern Subanen": "stb", "Northern Tarahumara": "thh", "Northern Tepehuan": "ntp", "Northern Thai": "nod", "Northern Tidong": "ntd", "Northern Tlaxiaco Mixtec": "xtn", "Northern Toussian": "tsp", "Northern Tujia": "tji", "Northern Tutchone": "ttm", "Northern Valley Yokuts": "nai-nvy", "Northern Yukaghir": "ykg", "Northwest Alaska Inupiatun": "esk", "Northwest Gbaya": "gya", "Northwest Maidu": "mjd", "Northwest Oaxaca Mixtec": "mxa", "Northwest Pashayi": "glh", "Northwestern Dinka": "diw", "Northwestern Fars": "faz", "Northwestern Ojibwa": "ojb", "Northwestern Tamang": "tmk", "Norwegian": "no", "Norwegian Bokmål": "nb", "Norwegian Nynorsk": "nn", "Norwegian Sign Language": "nsl", "Notre": "bly", "Notsi": "ncf", "Nottoway": "ntw", "Nottoway-Meherrin": "nwy", "Novial": "nov", "Noxilo": "art-nox", "Noy": "noy", "Nsari": "asj", "Nsenga": "nse", "Nshi": "nsc", "Nsong": "soo", "Nsongo": "nsx", "Ntcham": "bud", "Ntomba": "nto", "Ntra'ngith": "dgt", "Nubaca": "baf", "Nubi": "kcn", "Nuer": "nus", "Nuguria": "nur", "Nuk": "noc", "Nukak Makú": "mbr", "Nukna": "klt", "Nukuini": "nuc", "Nukumanu": "nuq", "Nukunu": "nnv", "Nukunul": "xnu", "Nukuoro": "nkr", "Numana": "nbr", "Numanggang": "nop", "Numbami": "sij", "Nume": "tgs", "Numee": "kdk", "Numidian": "nxm", "Nung": "nut", "Nungali": "nug", "Nunggubuyu": "nuy", "Nungon": "paa-nun", "Nungu": "rin", "Nupbikha": "npb", "Nupe": "nup", "Nusa Laut": "nul", "Nusu": "nuf", "Nutabe": "cba-nut", "Nyabwa": "nwb", "Nyah Kur": "cbn", "Nyaheun": "nev", "Nyakyusa": "nyy", "Nyali": "nlj", "Nyam": "nmi", "Nyamal": "nly", "Nyambo": "now", "Nyamusa-Molo": "nwm", "Nyamwanga": "mwn", "Nyamwezi": "nym", "Nyaneka": "nyk", "Nyang'i": "nyp", "Nyanga (Congo)": "nyj", "Nyanga (Togo)": "ayg", "Nyanga-li": "nyc", "Nyangatom": "nnj", "Nyangbo": "nyb", "Nyangga": "nny", "Nyangumarta": "nna", "Nyankole": "nyn", "Nyarafolo Senoufo": "sev", "Nyaturu": "rim", "Nyaw": "nyw", "Nyawaygi": "nyt", "Nyemba": "nba", "Nyengo": "nye", "Nyenkha": "neh", "Nyeu": "nyl", "Nyigina": "nyh", "Nyiha": "nih", "Nyika": "nkt", "Nyimang": "nyi", "Nyindrou": "lid", "Nyindu": "nyg", "Nyishi": "njz", "Nyiyaparli": "xny", "Nyokon": "nvo", "Nyole (Kenya)": "nyd", "Nyole (Uganda)": "nuj", "Nyong": "muo", "Nyoro": "nyo", "Nyulnyul": "nyv", "Nyunga": "nys", "Nyungwe": "nyu", "Nyâlayu": "yly", "Nzadi": "nzd", "Nzakambay": "nzy", "Nzakara": "nzk", "Nzanyi": "nja", "Nzima": "nzi", "Ná-Meo": "neo", "Nüpode Huitoto": "hux", "Nǀuu": "ngh", "O'chi'chi'": "xoc", "O'du": "tyh", "O'odham": "ood", "Obanliku": "bzy", "Obispeño": "obi", "Oblo": "obl", "Obo Manobo": "obo", "Obokuitai": "afz", "Obolo": "ann", "Obulom": "obu", "Ocaina": "oca", "Occitan": "oc", "Ocotepec Mixtec": "mie", "Ocotlán Zapotec": "zac", "Od": "odk", "Odiai": "bhf", "Odoodee": "kkc", "Odual": "odu", "Odut": "oda", "Ofayé": "opy", "Ofo": "ofo", "Ogbah": "ogc", "Ogbia": "ogb", "Ogbogolo": "ogg", "Ogbronuagum": "ogu", "Ogea": "eri", "Oirata": "oia", "Ojibwe": "oj", "Ojitlán Chinantec": "chj", "Okanagan": "oka", "Oki-No-Erabu": "okn", "Okiek": "oki", "Okinawan": "ryu", "Oko-Eni-Osayen": "oks", "Oko-Juwoi": "okj", "Okobo": "okb", "Okodia": "okd", "Okolod": "kqv", "Okpamheri": "opa", "Okpe (Northwestern Edo)": "okx", "Okpe (Southwestern Edo)": "oke", "Okpela": "atg", "Oksapmin": "opm", "Oku": "oku", "Okwanuchu": "nai-okw", "Old Anatolian Turkish": "trk-oat", "Old Armenian": "xcl", "Old Avar": "oav", "Old Bengali": "inc-obn", "Old Breton": "obt", "Old Burmese": "obr", "Old Catalan": "roa-oca", "Old Chinese": "och", "Old Church Slavonic": "cu", "Old Cornish": "oco", "Old Czech": "zlw-ocs", "Old Danish": "gmq-oda", "Old Dutch": "odt", "Old East Slavic": "orv", "Old English": "ang", "Old French": "fro", "Old Frisian": "ofs", "Old Galician-Portuguese": "roa-opt", "Old Georgian": "oge", "Old Gujarati": "inc-ogu", "Old High German": "goh", "पुरानी हिंदी": "inc-ohi", "Old Hungarian": "ohu", "Old Irish": "sga", "Old Japanese": "ojp", "Old Javanese": "kaw", "Old Kamta": "inc-ork", "Old Kannada": "dra-okn", "Old Kentish Sign Language": "okl", "Old Khmer": "okz", "Old Komi": "urj-koo", "Old Korean": "oko", "Old Leonese": "roa-ole", "Old Lithuanian": "olt", "Old Manipuri": "omp", "Old Marathi": "omr", "Old Median": "xme-old", "Old Mon": "omx", "Old Norse": "non", "Old Novgorodian": "zle-ono", "Old Nubian": "onw", "Old Occitan": "pro", "Old Oriya": "inc-oor", "Old Ossetic": "oos", "Old Persian": "peo", "Old Polish": "zlw-opl", "Old Prussian": "prg", "Old Punjabi": "inc-opa", "Old Ruthenian": "zle-ort", "Old Saxon": "osx", "Old South Arabian": "sem-srb", "Old Spanish": "osp", "Old Sundanese": "osn", "Old Swedish": "gmq-osw", "Old Tamil": "oty", "Old Tati": "xme-ott", "Old Telugu": "dra-ote", "Old Tibetan": "otb", "Old Tupi": "tpw", "Old Turkic": "otk", "Old Uyghur": "oui", "Old Welsh": "owl", "Olekha": "ole", "Ollari": "gdb", "Olo": "ong", "Oloma": "olm", "Olrat": "olr", "Olu'bo": "lul", "Olukumi": "ulb", "Olulumo-Ikom": "iko", "Oluta Popoluca": "plo", "Olutsotso": "lto", "Omagua": "omg", "Omaha-Ponca": "oma", "Omani Arabic": "acx", "Omba": "omb", "Ombamba": "mbm", "Ombo": "oml", "Ometepec Nahuatl": "nht", "Omi": "omi", "Omok": "omk", "Omotik": "omt", "Omurano": "omu", "Oneida": "one", "Ong": "oog", "Ongota": "bxe", "Onin": "oni", "Onjob": "onj", "Ono": "ons", "Onobasulu": "onn", "Onondaga": "ono", "Ontenu": "ont", "Ontong Java": "ojv", "Oorlams": "oor", "Opao": "opo", "Opata": "opt", "Opuuo": "lgn", "Opón": "sai-opo", "Oraon Sadri": "sdr", "Orejón": "ore", "Oring": "org", "Oriya": "or", "Orizaba Nahuatl": "nlv", "Orléanais": "roa-orl", "Ormu": "orz", "Ormuri": "oru", "Oro": "orx", "Oro Win": "orw", "Oroch": "oac", "Oroha": "ora", "Orok": "oaa", "Orokaiva": "okv", "Oroko": "bdu", "Orokolo": "oro", "Oromo": "om", "Oroqen": "orh", "Orowe": "bpk", "Oruma": "orr", "Orya": "ury", "Osage": "osa", "Osamayi": "syx", "Osatu": "ost", "Oscan": "osc", "Osing": "osi", "Ososo": "oso", "Ossetian": "os", "Ot Danum": "otd", "Otank": "uta", "Oti": "oti", "Otomaco": "sai-oto", "Otoro": "otr", "Ottawa": "otw", "Ottoman Turkish": "ota", "Otuke": "otu", "Ouma": "oum", "Oune": "oue", "Owa": "stn", "Owenia": "wsr", "Owiniga": "owi", "Oy": "oyb", "Oya'oya": "oyy", "Oyda": "oyd", "Ozolotepec Zapotec": "zao", "Ozumacín Chinantec": "chz", "Pa": "ppt", "Pa Di": "pdi", "Pa'a": "pqa", "Pa'o Karen": "blk", "Pa-Hng": "pha", "Paama": "pma", "Paasaal": "sig", "Pacahuara": "pcp", "Pacoh": "pac", "Padoe": "pdo", "Paelignian": "pgn", "Paeonian": "ine-pae", "Pagi": "pgi", "Pagibete": "pae", "Pagu": "pgu", "Pahanan Agta": "apf", "Pahari-Potwari": "phr", "Pahi": "lgt", "Pahlavani": "phv", "Pai Tavytera": "pta", "Pai-lang": "tbq-plg", "Paicî": "pri", "Paikoneka": "awd-pai", "Paipai": "ppi", "Paisaci Prakrit": "inc-psc", "Paite": "pck", "Paiwan": "pwn", "Pajapan Nahuatl": "nhp", "Pak-Tong": "pkg", "Pakanha": "pkn", "Pakistan Sign Language": "pks", "Paku": "pku", "Paku Karen": "kpp", "Pal": "abw", "Palaic": "plq", "Palaka Senoufo": "plr", "Palantla Chinantec": "cpa", "Palauan": "pau", "Palawan Batak": "bya", "Paleni": "pnl", "Palenquero": "pln", "Palewyami": "nai-ply", "Pali": "pi", "Palikur": "plu", "Paliyan": "pcf", "Pallanganmiddang": "pmd", "Palor": "fap", "Palta": "sai-pal", "Palu'e": "ple", "Paluan": "plz", "Palya Bareli": "bpx", "Pam": "pmn", "Pambia": "pmb", "Pamigua": "sai-pam", "Pamlico": "pmk", "Pamona": "pmf", "Pamosu": "hih", "Pamplona Atta": "att", "Pana (Central Africa)": "pnz", "Pana (West Africa)": "pnq", "Panamanian Sign Language": "lsp", "Panamint": "par", "Panare": "pbh", "Panará": "kre", "Panasuan": "psn", "Panawa": "pwb", "Pancana": "pnp", "Panchpargania": "tdb", "Pande": "bkj", "Pangasinan": "pag", "Pangseng": "pgs", "Pangutaran Sama": "slm", "Pangwa": "pbr", "Pangwali": "pgg", "Panim": "pnr", "Paniya": "pcg", "Pankararé": "pax", "Pankararú": "paz", "Pankhu": "pkh", "Pannei": "pnc", "Panobo": "pno", "Panyjima": "pnw", "Panzaleo": "sai-pnz", "Pao": "ppa", "Papantla Totonac": "top", "Papapana": "ppn", "Papar": "dpp", "Papasena": "pas", "Papel": "pbo", "Papi": "ppe", "Papiamentu": "pap", "Papitalai": "pat", "Papora": "ppu", "Papua New Guinean Sign Language": "pgz", "Papuan Malay": "pmy", "Papuma": "ppm", "Para Naga": "pzn", "Parachi": "prc", "Paraguayan Guaraní": "gug", "Paraguayan Sign Language": "pys", "Parakanã": "pak", "Paranan": "prf", "Paranawát": "paf", "Paratió": "sai-par", "Paraujano": "pbg", "Parauk": "prk", "Parawen": "prw", "Pardhan": "pch", "Pardhi": "pcl", "Pare": "asa", "Pareci": "pab", "Paredarerme": "xpd", "Parenga": "pcj", "Parkari Koli": "kvx", "Parthian": "xpr", "Parya": "paq", "Pará Arára": "aap", "Pará Gavião": "gvp", "Pashto": "ps", "Pasi": "psq", "Pass Valley Yali": "yac", "Passé": "awd-pas", "Patagón": "sai-ptg", "Patamona": "pbc", "Patani": "ptn", "Pataxó Hã-Ha-Hãe": "pth", "Patep": "ptp", "Pathiya": "pty", "Patpatar": "gfk", "Pattani": "lae", "Pattani Malay": "mfa", "Pattapu": "ptq", "Patwin": "pwi", "Paulohi": "plh", "Paumarí": "pad", "Paunaca": "pnk", "Pauri Bareli": "bfb", "Pauserna": "psm", "Pawaia": "pwa", "Pawnee": "paw", "Payaguá": "sai-pyg", "Paynamar": "pmr", "Pazeh": "pzh", "Pe": "pai", "Pear": "pcb", "Pech": "pay", "Pecheneg": "xpc", "Peerapper": "xpw", "Peere": "pfe", "Pei": "ppq", "Pekal": "pel", "Pela": "bxd", "Pele-Ata": "ata", "Pemon": "aoc", "Penang Sign Language": "psg", "Penchal": "pek", "Pendau": "ums", "Pengo": "peg", "Pennsylvania German": "pdc", "Penobscot": "aaq", "Penrhyn": "pnh", "Pentlatch": "ptw", "Perai": "wet", "Peranakan Indonesian": "pea", "Perema": "wom", "Pericú": "nai-per", "Pero": "pip", "Persian": "fa", "Persian Sign Language": "psc", "Peruvian Sign Language": "prl", "Petapa Zapotec": "zpe", "Petats": "pex", "Petjo": "pey", "Peñoles Mixtec": "mil", "Phai": "prt", "Phake": "phk", "Phala": "ypa", "Phalura": "phl", "Phana'": "phq", "Phangduwali": "phw", "Phende": "pem", "Philippine Sign Language": "psp", "Philistine": "und-phi", "Phimbi": "phm", "Phoenician": "phn", "Phola": "ypg", "Pholo": "yip", "Phom": "nph", "Phong-Kniang": "pnx", "Phrae Pwo": "kjt", "Phrygian": "xpg", "Phu Thai": "pht", "Phuan": "phu", "Phudagi": "phd", "Phuie": "pug", "Phukha": "phh", "Phuma": "ypm", "Phunoi": "pho", "Phuong": "phg", "Phupa": "ypp", "Phupha": "yph", "Phuthi": "bnt-phu", "Phuza": "ypz", "Piamatsina": "ptr", "Piame": "pin", "Piapoco": "pio", "Piaroa": "pid", "Picard": "pcd", "Pichinglis": "fpe", "Pichis Ashéninka": "cpu", "Pictish": "xpi", "Picuris": "nai-pic", "Pidgin Delaware": "dep", "Pidgin Iha": "ihb", "Pidgin Onin": "onx", "Piedmontese": "pms", "Pijao": "pij", "Pije": "piz", "Pijin": "pis", "Pilagá": "plg", "Pileni": "piv", "Pima Bajo": "pia", "Pimbwe": "piw", "Pinai-Hagahai": "pnn", "Pingelapese": "pif", "Pini": "pii", "Pinigura": "pnv", "Pinjarup": "pnj", "Pinji": "pic", "Pinotepa Nacional Mixtec": "mio", "Pintiini": "pti", "Pintupi-Luritja": "piu", "Pinyin": "pny", "Pipil": "ppl", "Pirahã": "myp", "Piratapuyo": "pir", "Pirlatapa": "bxi", "Piro": "pie", "Pirriya": "xpa", "Pisabo": "pig", "Pisaflores Tepehua": "tpp", "Piscataway": "psy", "Pisidian": "xps", "Pitcairn-Norfolk": "pih", "Pite Sami": "sje", "Piti": "pcn", "Pitjantjatjara": "pjt", "Pitta-Pitta": "pit", "Piu": "pix", "Piya-Kwonci": "piy", "Plains Apache": "apk", "Plains Cree": "crk", "Plains Indian Sign Language": "psd", "Plains Miwok": "pmw", "Plapo Krumen": "ktj", "Plautdietsch": "pdt", "Playero": "gob", "Pnar": "pbv", "Pochuri Naga": "npo", "Pochutec": "xpo", "Podoko": "pbi", "Pogolo": "poy", "Pohnpeian": "pon", "Poitevin-Saintongeais": "roa-poi", "Pokangá": "pok", "Poke": "pof", "Pol": "pmm", "Polabian": "pox", "Polci": "plj", "Polish": "pl", "Polish Sign Language": "pso", "Polonombauk": "plb", "Pom": "pmo", "Ponam": "ncc", "Pongu": "png", "Ponosakan": "pns", "Pontic Greek": "pnt", "Ponyo": "npg", "Poqomam": "poc", "Poqomchi'": "poh", "Porohanon": "prh", "Port Sandwich": "psw", "Port Sorell": "xpl", "Port Vato": "ptv", "Portuguese": "pt", "Portuguese Sign Language": "psr", "Potawatomi": "pot", "Potiguára": "pog", "Poumei Naga": "pmx", "Pouye": "bye", "Powari": "pwr", "Powhatan": "pim", "Poyanáwa": "pyn", "Prakrit": "inc-pra", "Prasuni": "prn", "Primitive Irish": "pgl", "Principense": "pre", "Proto-Abkhaz-Abaza": "cau-abz-pro", "Proto-Afroasiatic": "afa-pro", "Proto-Albanian": "sqj-pro", "Proto-Algic": "aql-pro", "Proto-Algonquian": "alg-pro", "Proto-Amuesha-Chamicuro": "awd-amc-pro", "Proto-Anatolian": "ine-ana-pro", "Proto-Apachean": "apa-pro", "Proto-Arawa": "auf-pro", "Proto-Arawak": "awd-pro", "Proto-Armenian": "hyx-pro", "Proto-Arnhem": "aus-arn-pro", "Proto-Aroid": "omv-aro-pro", "Proto-Aslian": "mkh-asl-pro", "Proto-Atayalic": "map-ata-pro", "Proto-Athabaskan": "ath-pro", "Proto-Atlantic-Congo": "alv-pro", "Proto-Austroasiatic": "aav-pro", "Proto-Austronesian": "map-pro", "Proto-Avaro-Andian": "cau-ava-pro", "Proto-Bahnaric": "mkh-ban-pro", "Proto-Balto-Slavic": "ine-bsl-pro", "Proto-Bantoid": "nic-bod-pro", "Proto-Bantu": "bnt-pro", "Proto-Basque": "euq-pro", "Proto-Batak": "btk-pro", "Proto-Be": "qfa-onb-pro", "Proto-Be-Tai": "qfa-bet-pro", "Proto-Benue-Congo": "nic-bco-pro", "Proto-Berber": "ber-pro", "Proto-Bodo-Garo": "tbq-bdg-pro", "Proto-Bongo-Bagirmi": "csu-bba-pro", "Proto-Boran": "sai-bor-pro", "Proto-Brythonic": "cel-bry-pro", "Proto-Bua": "alv-bua-pro", "Proto-Bungku-Tolaki": "poz-btk-pro", "Proto-Caddoan": "cdd-pro", "Proto-Cangin": "alv-cng-pro", "Proto-Cariban": "sai-car-pro", "Proto-Celtic": "cel-pro", "Proto-Central Chadic": "cdc-cbm-pro", "Proto-Central Indo-Aryan": "inc-cen-pro", "Proto-Central Jê": "sai-cje-pro", "Proto-Central New South Wales": "aus-cww-pro", "Proto-Central Sudanic": "csu-pro", "Proto-Central Togo": "alv-gtm-pro", "Proto-Central-Eastern Malayo-Polynesian": "poz-cet-pro", "Proto-Cerrado": "sai-cer-pro", "Proto-Chadic": "cdc-pro", "Proto-Chamic": "cmc-pro", "Proto-Chatino": "omq-cha-pro", "Proto-Chibchan": "cba-pro", "Proto-Chimakuan": "chi-pro", "Proto-Chinookan": "nai-ckn-pro", "Proto-Chukotko-Kamchatkan": "qfa-cka-pro", "Proto-Chumash": "nai-chu-pro", "Proto-Circassian": "cau-cir-pro", "Proto-Cupan": "azc-cup-pro", "Proto-Cushitic": "cus-pro", "Proto-Daju": "sdv-daj-pro", "Proto-Daly": "aus-dal-pro", "Proto-Dargwa": "cau-drg-pro", "Proto-Dizoid": "omv-diz-pro", "Proto-Dravidian": "dra-pro", "Proto-Eastern Jebel": "sdv-eje-pro", "Proto-Eastern Malayo-Polynesian": "pqe-pro", "Proto-Eastern Oti-Volta": "nic-eov-pro", "Proto-Eastern Polynesian": "poz-pep-pro", "Proto-Edekiri": "alv-edk-pro", "Proto-Edoid": "alv-edo-pro", "Proto-Eskimo": "esx-esk-pro", "Proto-Eskimo-Aleut": "esx-pro", "Proto-Fali": "alv-fli-pro", "Proto-Finnic": "urj-fin-pro", "Proto-Gbe": "alv-gbe-pro", "Proto-Georgian-Zan": "ccs-gzn-pro", "Proto-Germanic": "gem-pro", "Proto-Grassfields": "nic-grf-pro", "Proto-Great Andamanese": "qfa-adm-pro", "Proto-Guang": "alv-gng-pro", "Proto-Gur": "nic-gur-pro", "Proto-Gurunsi": "nic-gns-pro", "Proto-Halmahera-Cenderawasih": "poz-hce-pro", "Proto-Heiban": "alv-hei-pro", "Proto-Hellenic": "grk-pro", "Proto-Highland East Cushitic": "cus-hec-pro", "Proto-Hlai": "qfa-lic-pro", "Proto-Hmong": "hmn-pro", "Proto-Hmong-Mien": "hmx-pro", "Proto-Hrusish": "sit-hrs-pro", "Proto-Huitoto-Ocaina": "sai-hoc-pro", "Proto-Hurro-Urartian": "qfa-hur-pro", "Proto-Idomoid": "alv-ido-pro", "Proto-Igboid": "alv-igb-pro", "Proto-Ijoid": "ijo-pro", "Proto-Indo-Aryan": "inc-pro", "Proto-Indo-European": "ine-pro", "Proto-Indo-Iranian": "iir-pro", "Proto-Inuit": "esx-inu-pro", "Proto-Iranian": "ira-pro", "Proto-Iroquoian": "iro-pro", "Proto-Italic": "itc-pro", "Proto-Iwaidjan": "aus-wdj-pro", "Proto-Japonic": "jpx-pro", "Proto-Jukunoid": "nic-jkn-pro", "Proto-Jê": "sai-jee-pro", "Proto-Kadu": "qfa-kad-pro", "Proto-Kalamian": "phi-kal-pro", "Proto-Kalapuyan": "nai-klp-pro", "Proto-Kam-Sui": "qfa-kms-pro", "Proto-Kampa": "awd-kmp-pro", "Proto-Karen": "kar-pro", "Proto-Kartvelian": "ccs-pro", "Proto-Katuic": "mkh-kat-pro", "Proto-Kham": "sit-kha-pro", "Proto-Khasian": "aav-khs-pro", "Proto-Khmeric": "mkh-kmr-pro", "Proto-Khmuic": "mkh-khm-pro", "Proto-Khoe": "khi-kho-pro", "Proto-Koman": "ssa-kom-pro", "Proto-Komisenian": "ira-kms-pro", "Proto-Koreanic": "qfa-kor-pro", "Proto-Kra": "qfa-kra-pro", "Proto-Kra-Dai": "qfa-tak-pro", "Proto-Kru": "kro-pro", "Proto-Kuki-Chin": "tbq-kuk-pro", "Proto-Kuliak": "ssa-klk-pro", "Proto-Kurdish": "ku-pro", "Proto-Kwa": "alv-kwa-pro", "Proto-Lalo": "tbq-lal-pro", "Proto-Lampungic": "poz-lgx-pro", "Proto-Lezghian": "cau-lzg-pro", "Proto-Lolo-Burmese": "tbq-lob-pro", "Proto-Loloish": "tbq-lol-pro", "Proto-Lower Cross River": "nic-lcr-pro", "Proto-Luish": "sit-luu-pro", "Proto-Maidun": "nai-mdu-pro", "Proto-Malayic": "poz-mly-pro", "Proto-Malayo-Chamic": "poz-mcm-pro", "Proto-Malayo-Polynesian": "poz-pro", "Proto-Malayo-Sumbawan": "poz-msa-pro", "Proto-Mande": "dmn-pro", "Proto-Mangbetu": "csu-maa-pro", "Proto-Mari": "chm-pro", "Proto-Masa": "cdc-mas-pro", "Proto-Mayan": "myn-pro", "Proto-Mazatec": "omq-maz-pro", "Proto-Medo-Parthian": "ira-mpr-pro", "Proto-Mien": "hmx-mie-pro", "Proto-Min": "zhx-min-pro", "Proto-Mixe-Zoque": "nai-miz-pro", "Proto-Mixtec": "omq-mxt-pro", "Proto-Mixtecan": "omq-mix-pro", "Proto-Mon-Khmer": "mkh-pro", "Proto-Mongolic": "xgn-pro", "Proto-Monic": "mkh-mnc-pro", "Proto-Mordvinic": "urj-mdv-pro", "Proto-Mumuye": "alv-mum-pro", "Proto-Munda": "mun-pro", "Proto-Munji-Yidgha": "ira-mny-pro", "Proto-Muskogean": "nai-mus-pro", "Proto-Na-Dene": "xnd-pro", "Proto-Nahuan": "azc-nah-pro", "Proto-Nakh": "cau-nkh-pro", "Proto-Nawiki": "awd-nwk-pro", "Proto-Nguni": "bnt-ngu-pro", "Proto-Nicobarese": "aav-nic-pro", "Proto-Niger-Congo": "nic-pro", "Proto-Nilo-Saharan": "ssa-pro", "Proto-Nilotic": "sdv-nil-pro", "Proto-Norse": "gmq-pro", "Proto-North Caucasian": "ccn-pro", "Proto-North Halmahera": "paa-nha-pro", "Proto-North Iroquoian": "iro-nor-pro", "Proto-North Sarawak": "poz-swa-pro", "Proto-Northeast Caucasian": "cau-nec-pro", "Proto-Northern Jê": "sai-nje-pro", "Proto-Northwest Caucasian": "cau-nwc-pro", "Proto-Nubian": "nub-pro", "Proto-Nuclear Polynesian": "poz-pnp-pro", "Proto-Numic": "azc-num-pro", "Proto-Nupoid": "alv-nup-pro", "Proto-Nuristani": "iir-nur-pro", "Proto-Nyima": "sdv-nyi-pro", "Proto-Nyulnyulan": "aus-nyu-pro", "Proto-Oceanic": "poz-oce-pro", "Proto-Ogoni": "nic-ogo-pro", "Proto-Omotic": "omv-pro", "Proto-Ongan": "qfa-ong-pro", "Proto-Ossetic": "os-pro", "Proto-Oti-Volta": "nic-ovo-pro", "Proto-Oto-Manguean": "omq-pro", "Proto-Oto-Pamean": "omq-otp-pro", "Proto-Otomi": "oto-otm-pro", "Proto-Otomian": "oto-pro", "Proto-Pakanic": "mkh-pkn-pro", "Proto-Palaungic": "mkh-pal-pro", "Proto-Pama-Nyungan": "aus-pam-pro", "Proto-Paresi-Waura": "awd-prw-pro", "Proto-Pathan": "ira-pat-pro", "Proto-Pearic": "mkh-pea-pro", "Proto-Permic": "urj-prm-pro", "Proto-Philippine": "phi-pro", "Proto-Plateau": "nic-plt-pro", "Proto-Plateau Penutian": "nai-plp-pro", "Proto-Pnar-Khasi-Lyngngam": "aav-pkl-pro", "Proto-Polynesian": "poz-pol-pro", "Proto-Pomeranian": "zlw-pom-pro", "Proto-Pomo": "nai-pom-pro", "Proto-Rukai": "dru-pro", "Proto-Ryukyuan": "jpx-ryu-pro", "Proto-Saka": "xsc-sak-pro", "Proto-Saka-Wakhi": "xsc-skw-pro", "Proto-Salish": "sal-pro", "Proto-Samic": "smi-pro", "Proto-Samoyedic": "syd-pro", "Proto-Sanglechi-Ishkashimi": "ira-sgi-pro", "Proto-Sara": "csu-sar-pro", "Proto-Scythian": "xsc-pro", "Proto-Selkup": "sel-pro", "Proto-Semitic": "sem-pro", "Proto-Shughni-Roshani": "ira-shr-pro", "Proto-Shughni-Yazghulami": "ira-shy-pro", "Proto-Shughni-Yazghulami-Munji": "ira-sym-pro", "Proto-Sino-Tibetan": "sit-pro", "Proto-Siouan": "sio-pro", "Proto-Siouan-Catawban": "nai-sca-pro", "Proto-Slavic": "sla-pro", "Proto-Sogdic": "ira-sgc-pro", "Proto-Somaloid": "cus-som-pro", "Proto-Songhay": "son-pro", "Proto-Sotho-Tswana": "bnt-sts-pro", "Proto-South Cushitic": "cus-sou-pro", "Proto-South Sulawesi": "poz-ssw-pro", "Proto-Southern Jê": "sai-sje-pro", "Proto-Southwestern Tai": "tai-swe-pro", "Proto-Sunda-Sulawesi": "poz-sus-pro", "Proto-Ta-Arawak": "awd-taa-pro", "Proto-Tai": "tai-pro", "Proto-Takic": "azc-tak-pro", "Proto-Taman": "sdv-tmn-pro", "Proto-Tani": "sit-tan-pro", "Proto-Taranoan": "sai-tar-pro", "Proto-Tatic": "xme-ttc-pro", "Proto-Tocharian": "ine-toc-pro", "Proto-Totozoquean": "nai-tot-pro", "Proto-Trans-New Guinea": "ngf-pro", "Proto-Trique": "omq-tri-pro", "Proto-Tsezian": "cau-tsz-pro", "Proto-Tsimshianic": "nai-tsi-pro", "Proto-Tungusic": "tuw-pro", "Proto-Tupi-Guarani": "tup-gua-pro", "Proto-Tupian": "tup-pro", "Proto-Turkic": "trk-pro", "Proto-Ubangian": "nic-ubg-pro", "Proto-Ugric": "urj-ugr-pro", "Proto-Upper Cross River": "nic-ucr-pro", "Proto-Uralic": "urj-pro", "Proto-Utian": "nai-utn-pro", "Proto-Uto-Aztecan": "azc-pro", "Proto-Vietic": "mkh-vie-pro", "Proto-Volta-Congo": "nic-vco-pro", "Proto-Volta-Niger": "alv-von-pro", "Proto-West Germanic": "gmw-pro", "Proto-West Semitic": "sem-wes-pro", "Proto-Western Mande": "dmn-mdw-pro", "Proto-Witotoan": "sai-wit-pro", "Proto-Yeniseian": "qfa-yen-pro", "Proto-Yoruba": "alv-yor-pro", "Proto-Yoruboid": "alv-yrd-pro", "Proto-Yukaghir": "qfa-yuk-pro", "Proto-Yupik": "ypk-pro", "Proto-Zapotec": "omq-zpc-pro", "Proto-Zapotecan": "omq-zap-pro", "Proto-Zaza-Gorani": "ira-zgr-pro", "Providencia Sign Language": "prz", "Psikye": "kvj", "Puare": "pux", "Pudtol Atta": "atp", "Puebla Mazatec": "pbm", "Puelche": "pue", "Puerto Rican Sign Language": "psl", "Puimei Naga": "npu", "Puinave": "pui", "Puiron": "sit-prn", "Pukapukan": "pkp", "Pulabu": "pup", "Puluwat": "puw", "Puma": "pum", "Pumpokol": "xpm", "Pumé": "yae", "Punan Aput": "pud", "Punan Bah-Biau": "pna", "Punan Batu": "pnm", "Punan Merah": "puf", "Punan Merap": "puc", "Punan Tubu": "puj", "Punic": "xpu", "Punjabi": "pa", "Punu": "puu", "Puoc": "puo", "Puquina": "puq", "Puragi": "pru", "Purari": "iar", "Purepecha": "pua", "Puri": "prr", "Purik": "prx", "Purisimeño": "puy", "Puruborá": "pur", "Puruhá": "sai-prh", "Purukotó": "sai-pur", "Purum": "pub", "Putai": "mfl", "Putoh": "put", "Putukwam": "afe", "Puxian": "cpx", "Puyo-Paekche": "xpp", "Puyuma": "pyu", "Pwaamei": "pme", "Pwapwa": "pop", "Pyapun": "pcw", "Pye Krumen": "pye", "Pyemmairre": "xpb", "Pyen": "pyy", "Pykobjê": "sai-pyk", "Pyu": "pby", "Páez": "pbb", "Pááfang": "pfa", "Päri": "lkr", "Pémono": "pev", "Pévé": "lme", "Pökoot": "pko", "Q'anjob'al": "kjb", "Q'eqchi": "kek", "Qabiao": "laq", "Qaqet": "byx", "Qatabanian": "xqt", "Qau": "gqu", "Qila Muji": "ymq", "Qimant": "ahg", "Quapaw": "qua", "Quebec Sign Language": "fcs", "Quechua": "qu", "Quenya": "qya", "Querétaro Otomi": "otq", "Quetzaltepec Mixe": "pxm", "Queyu": "qvy", "Quiavicuzas Zapotec": "zpj", "Quileute": "qui", "Quimbaya": "sai-qmb", "Quinault": "qun", "Quinigua": "nai-qng", "Quinqui": "quq", "Quioquitani-Quierí Zapotec": "ztq", "Quiotepec Chinantec": "chq", "Quiripi": "qyp", "Quitemo": "sai-qtm", "Rabha": "rah", "Rabona": "sai-rab", "Rade": "rad", "Raetic": "xrr", "Raga": "lml", "Rahambuu": "raz", "Rajah Kabunsuwan Manobo": "mqk", "Rajasthani": "raj", "Rajbanshi": "rjs", "Raji": "rji", "Rajong": "rjg", "Rajput Garasia": "gra", "Rakahanga-Manihiki": "rkh", "Rakhine": "rki", "Ralte": "ral", "Rama": "rma", "Ramandi": "tks", "Ramanos": "sai-ram", "Ramoaaina": "rai", "Ramopa": "kjx", "Rampi": "lje", "Rana Tharu": "thr", "Rang": "rax", "Rangkas": "rgk", "Ranglong": "rnl", "Rao": "rao", "Rapa": "ray", "Rapa Nui": "rap", "Rapoisi": "kyx", "Rapting": "rpt", "Rara Bakati'": "lra", "Rarotongan": "rar", "Rasawa": "rac", "Ratagnon": "btn", "Ratahan": "rth", "Rathawi": "rtw", "Rathwi Bareli": "bgd", "Raute": "rau", "Ravula": "yea", "Rawa": "rwo", "Rawang": "raw", "Rawat": "jnl", "Rawo": "rwa", "Rayón Zoque": "zor", "Razajerdi": "rat", "Razihi": "rzh", "Reang": "ria", "Red Gelao": "gir", "Reel": "atu", "Rejang": "rej", "Rejang Kayan": "ree", "Reli": "rei", "Rema": "bow", "Rembarunga": "rmb", "Rembong": "reb", "Remo": "rem", "Remontado Agta": "agv", "Rempi": "rmp", "Remun": "lkj", "Rendille": "rel", "Rengao": "ren", "Rennellese": "mnv", "Repanbitip": "rpn", "Rer Bare": "rer", "Rerau": "rea", "Rerep": "pgk", "Reshe": "res", "Resígaro": "rgr", "Retta": "ret", "Reyesano": "rey", "Rhine Franconian": "gmw-rfr", "Riang": "ril", "Riantana": "ran", "Ribun": "rir", "Rigwe": "iri", "Rikbaktsa": "rkb", "Rincón Zapotec": "zar", "Ringgou": "rgu", "Ririo": "rri", "Ritarungo": "rit", "Riung": "riu", "Riverain Sango": "snj", "Rogo": "rod", "Rohingya": "rhg", "Roma": "rmm", "Romagnol": "rgn", "Romam": "rmx", "Romani": "rom", "Romani Greek": "rge", "Romanian": "ro", "Romanian Sign Language": "rms", "Romano-Serbian": "rsb", "Romanova": "rmv", "Romansch": "rm", "Romblomanon": "rol", "Rombo": "rof", "Romkun": "rmk", "Ron": "cla", "Ronga": "rng", "Rongga": "ror", "Rongmei Naga": "nbu", "Rongpo": "rnp", "Ronji": "roe", "Roon": "rnn", "Roria": "rga", "Roro": "rro", "Rotokas": "roo", "Rotuman": "rtm", "Rouran": "xgn-rou", "Roviana": "rug", "Ruching Palaung": "pce", "Rudbari": "rdb", "Rufiji": "rui", "Ruga": "ruh", "Rukai": "dru", "Rukiga": "cgg", "Ruma": "ruz", "Rumai Palaung": "rbb", "Rumu": "klq", "Runga": "rou", "Rungtu": "rtc", "Rungus": "drg", "Rungwa": "rnw", "Russenorsk": "crp-rsn", "Russian": "ru", "Russian Sign Language": "rsl", "Rusyn": "rue", "Rutul": "rut", "Ruuli": "ruc", "Ruwund": "rnd", "Rwa": "rwk", "Rwanda-Rundi": "rw", "Réunion Creole French": "rcf", "S'gaw Karen": "ksw", "Sa": "sax", "Sa'a": "apb", "Sa'ban": "snv", "Sa'och": "scq", "Saafi-Saafi": "sav", "Saam": "raq", "Saamia": "lsm", "Saanich": "str", "Saare": "uss", "Saaroa": "sxr", "Saba": "saa", "Sabaean": "xsa", "Sabah Bisaya": "bsy", "Sabah Malay": "msi", "Sabanê": "sae", "Sabaot": "spy", "Sabine": "sbv", "Sabir": "pml", "Sabu": "hvn", "Sabüm": "sbo", "Sacapulteco": "quv", "Sadri": "sck", "Saek": "skb", "Saep": "spd", "Safaitic": "sem-saf", "Safaliba": "saf", "Safeyoka": "apz", "Safwa": "sbk", "Sagala": "sbm", "Sagalla": "tga", "Sahaptin": "nai-spt", "Saho": "ssy", "Sahu": "saj", "Saisiyat": "xsy", "Sajau Basap": "sjb", "Sakachep": "sch", "Sakam": "skm", "Sakao": "sku", "Sakata": "skt", "Sake": "sak", "Sakirabiá": "skf", "Sakizaya": "szy", "Sala": "shq", "Salampasu": "slx", "Salar": "slr", "Salas": "sgu", "Salchuq": "slq", "Saleman": "sau", "Saliba (Colombia)": "slc", "Saliba (New Guinea)": "sbe", "Salinan": "sln", "Salt-Yui": "sll", "Saluan": "loe", "Salumá": "slj", "Salvadoran Lenca": "nai-sln", "Salvadoran Sign Language": "esn", "Sam": "snx", "Sama": "smd", "Samaritan Aramaic": "sam", "Samaritan Hebrew": "smp", "Samarokena": "tmj", "Samatao": "ysd", "Samba": "smx", "Sambali": "xsb", "Sambalpuri": "spv", "Sambe": "xab", "Samberigi": "ssx", "Samburu": "saq", "Samei": "smh", "Samo": "smq", "Samoan": "sm", "Samoan Plantation Pidgin": "cpe-spp", "Samogitian": "sgs", "Samosa": "swm", "Sampang": "rav", "Samre": "sxm", "Samtao": "stu", "Samvedi": "smv", "San Agustín Mixtepec Zapotec": "ztm", "San Baltazar Loxicha Zapotec": "zpx", "San Felipe Otlaltepec Popoloca": "pow", "San Jerónimo Tecóatl Mazatec": "maa", "San Juan Atzingo Popoloca": "poe", "San Juan Colorado Mixtec": "mjc", "San Juan Guelavía Zapotec": "zab", "San Juan Quiahije Chatino": "ctp-san", "San Juan Teita Mixtec": "xtj", "San Luís Temalacayuca Popoloca": "pps", "San Marcos Tlalcoyalco Popoloca": "pls", "San Martín Itunyoso Triqui": "trq", "San Miguel Creole French": "scf", "San Miguel Piedras Mixtec": "xtp", "San Miguel el Grande Mixtec": "mig", "San Pablo Güilá Zapotec": "ztu", "San Pedro Amuzgos Amuzgo": "azg", "San Pedro Quiatoni Zapotec": "zpf", "San Vicente Coatlán Zapotec": "zpt", "Sanapaná": "spn", "Sanaviron": "sai-san", "Sandawe": "sad", "Sanga (Congo)": "sng", "Sanga (Nigeria)": "xsn", "Sanggau": "scg", "Sangil": "snl", "Sangir": "sxn", "Sangisari": "sgr", "Sangkong": "sgk", "Sanglechi": "sgy", "Sango": "sg", "Sangtam Naga": "nsa", "Sangu (Gabon)": "snq", "Sangu (Tanzania)": "sbp", "Sani": "ysn", "Sanie": "ysy", "Saniyo-Hiyewe": "sny", "Sankaran Maninka": "msc", "Sansi": "ssi", "संस्कृत": "sa", "Santa Catarina Albarradas Zapotec": "ztn", "Santa Inés Ahuatempan Popoloca": "pca", "Santa Inés Yatzechi Zapotec": "zpn", "Santa Lucía Monteverde Mixtec": "mdv", "Santa María La Alta Nahuatl": "nhz", "Santa María Quiegolani Zapotec": "zpi", "Santa María Zacatepec Mixtec": "mza", "Santa Teresa Cora": "cok", "Santali": "sat", "Santiago Xanica Zapotec": "zpr", "Santo Domingo Albarradas Zapotec": "zas", "Sanumá": "xsu", "Sapa": "tys", "Saparua": "spr", "Sapará": "sai-sap", "Sapo": "krn", "Saponi": "spi", "Saposa": "sps", "Sapuan": "spu", "Sapé": "spc", "Sar": "mwm", "Sara": "sre", "Sara Kaba": "sbz", "Sara Kaba Deme": "kwg", "Sara Kaba Náà": "kwv", "Saraiki": "skr", "Saramaccan": "srm", "Sarangani Blaan": "bps", "Sarangani Manobo": "mbs", "Sarasira": "zsa", "Saraveca": "sar", "Sarcee": "srs", "Sardinian": "sc", "Sarikoli": "srh", "Sarli": "sdf", "Sartang": "onp", "Sarua": "swy", "Sarudu": "sdu", "Saruga": "sra", "Sasak": "sas", "Sasaru": "sxs", "Sassarese": "sdc", "Satawalese": "stw", "Saterland Frisian": "stq", "Sateré-Mawé": "mav", "Sathmar Swabian": "gmw-stm", "Saudi Arabian Sign Language": "sdl", "Sauraseni Apabhramsa": "inc-sap", "Sauraseni Prakrit": "psu", "Saurashtra": "saz", "Sauri": "srt", "Sause": "sao", "Sausi": "ssj", "Savi": "sdg", "Savosavo": "svs", "Sawai": "szw", "Saweru": "swr", "Sawi": "saw", "Sawila": "swt", "Sawriya Paharia": "mjt", "Saxwe Gbe": "sxw", "Saya": "say", "Sayula Popoluca": "pos", "Scanian": "gmq-scy", "Scots": "sco", "Scottish Gaelic": "gd", "Seba": "kdg", "Sebat Bet Gurage": "sgw", "Seberuang": "sbx", "Sebop": "sib", "Sebuyau": "snb", "Sechelt": "sec", "Sechura": "sai-sec", "Secoya": "sey", "Sedang": "sed", "Sedoa": "tvw", "Seenku": "sos", "Segai": "sge", "Segeju": "seg", "Seget": "sbg", "Sehwi": "sfw", "Seim": "sim", "Seimat": "ssg", "Seit-Kaitetu": "hik", "Sekani": "sek", "Sekapan": "skp", "Sekar": "skz", "Seke": "skj", "Sekele": "vaj", "Seki": "syi", "Seko Padang": "skx", "Seko Tengah": "sko", "Sekpele": "lip", "Selangor Sign Language": "kgi", "Selaru": "slu", "Selayar": "sly", "Selee": "snw", "Selepet": "spl", "Selk'nam": "ona", "Selonian": "sxl", "Selungai Murut": "slg", "Seluwasan": "sws", "Sema": "nsm", "Semai": "sea", "Semandang": "sdm", "Semaq Beri": "szc", "Sembakung Murut": "sbr", "Semelai": "sza", "Semimi": "etz", "Semnam": "ssm", "Semnani": "smy", "Sempan": "xse", "Sena": "seh", "Senara Sénoufo": "seq", "Senaya": "syn", "Sene": "sej", "Seneca": "see", "Sengele": "szg", "Senggi": "snu", "Sengo": "spk", "Sengseng": "ssz", "Senhaja De Srair": "sjs", "Sensi": "sni", "Sentani": "set", "Senthang Chin": "sez", "Sentinelese": "std", "Sepa (Indonesia)": "spb", "Sepa (New Guinea)": "spe", "Sepen": "spm", "Sepik Iwam": "iws", "Sepik Mari": "mbx", "Sera": "sry", "Serbo-Croatian": "sh", "Sere": "swf", "Serer": "srr", "Seri": "sei", "Serili": "sve", "Seroa": "kqu", "Serrano": "ser", "Seru": "szd", "Serua": "srw", "Serudung Murut": "srk", "Serui-Laut": "seu", "Seta": "stf", "Setaman": "stm", "Seti": "sbi", "Severn Ojibwa": "ojs", "Sewa Bay": "sew", "Seychellois Creole": "crs", "Seze": "sze", "Sha": "scw", "Shabak": "sdb", "Shabo": "sbf", "Shahmirzadi": "srz", "Shahrudi": "shm", "Shall-Zwall": "sha", "Shama-Sambuga": "sqa", "Shamang": "xsh", "Shambala": "ksb", "Shan": "shn", "Shanenawa": "swo", "Shanga": "sho", "Shangzhai": "jih", "Shaozhou Tuhua": "zhx-sht", "Sharanahua": "mcd", "Shark Bay": "ssv", "Sharwa": "swq", "Shasta": "sht", "Shatt": "shj", "Shau": "sqh", "Shawnee": "sjw", "She": "shx", "Shebayo": "awd-she", "Shehri": "shv", "Shekkacho": "moy", "Sheko": "she", "Shelta": "sth", "Shendu": "shl", "Sheni": "scv", "Sherbro": "bun", "Sherdukpen": "sdp", "Sherpa": "xsr", "Sheshi Kham": "kip", "Shi": "shr", "Shihhi Arabic": "ssh", "Shiki": "gua", "Shilluk": "shk", "Shina": "scl", "Shinasha": "bwo", "Shipibo-Conibo": "shp", "Shixing": "sxg", "Sholaga": "sle", "Shom Peng": "sii", "Shona": "sn", "Shoo-Minda-Nye": "bcv", "Shor": "cjs", "Shoshone": "shh", "Shua": "shg", "Shuar": "jiv", "Shuba": "cbq", "Shughni": "sgh", "Shumashti": "sts", "Shumcho": "scu", "Shuswap": "shs", "Shuwa-Zamani": "ksa", "Shwai": "shw", "Shwe Palaung": "pll", "Sialum": "slw", "Siamou": "sif", "Sian": "spg", "Siane": "snp", "Siang": "sya", "Siar-Lak": "sjr", "Sibe": "nco", "Siberian Tatar": "sty", "Sibu Melanau": "sdx", "Sicanian": "sxc", "Sicel": "scx", "Sichuan Yi": "ii", "Sicilian": "scn", "Siculo-Arabic": "sqr", "Sidamo": "sid", "Sidetic": "xsd", "Sie": "erg", "Sierra Leone Sign Language": "sgx", "Sierra Negra Nahuatl": "nsu", "Sierra de Juárez Zapotec": "zaa", "Sighu": "sxe", "Sihan": "snr", "Sika": "ski", "Sikaiana": "sky", "Sikaritai": "tty", "Sikiana": "sik", "Sikkimese": "sip", "Sikule": "skh", "Sila": "slt", "Silacayoapan Mixtec": "mks", "Sileibi": "sbq", "Silesian": "szl", "Silimo": "wul", "Siliput": "mkc", "Silopi": "xsp", "Silt'e": "stv", "Simaa": "sie", "Simalungun Batak": "bts", "Simba": "sbw", "Simbali": "smg", "Simbari": "smb", "Simbo": "sbb", "Simeku": "smz", "Simeulue": "smr", "Simte": "smt", "Sinacantán": "nai-sin", "Sinagen": "siu", "Sinasina": "sst", "Sinaugoro": "snc", "Sindarin": "sjn", "Sindhi": "sd", "Sindhi Bhil": "sbn", "Sindihui Mixtec": "xts", "Singa": "sgm", "Singapore Sign Language": "sls", "Singpho": "sgp", "Sinhalese": "si", "Sinicahua Mixtec": "xti", "Sininkere": "skq", "Sinte Romani": "rmo", "Sinyar": "sys", "Sinúfana": "sai-sin", "Sio": "xsi", "Siona": "snn", "Sipakapense": "qum", "Sira": "swj", "Siraya": "fos", "Sirenik": "ysr", "Siri": "sir", "Siriano": "sri", "Sirionó": "srq", "Sirmauri": "srx", "Siroi": "ssd", "Sissala": "sld", "Sissano": "sso", "Situ": "sit-sit", "Siuslaw": "sis", "Sivandi": "siy", "Siwai": "siw", "Siwi": "siz", "Siwu": "akp", "Siyin Chin": "csy", "Skagit": "ska", "Skalvian": "svx", "Ske": "ske", "Skepi Creole Dutch": "skw", "Skolt Sami": "sms", "Skou": "skv", "Slavey": "den", "Slavomolisano": "svm", "Slovak": "sk", "Slovakian Sign Language": "svk", "Slovene": "sl", "Slovincian": "zlw-slv", "Small Flowery Miao": "sfm", "Smärky Kanum": "kxq", "Snohomish": "sno", "So'a": "ssq", "Sobei": "sob", "Sochiapam Chinantec": "cso", "Soga": "xog", "Sogdian": "sog", "Sok": "skk", "Sokna": "swn", "Soko": "soc", "Sokoro": "sok", "Solano": "xso", "Soli": "sby", "Solon": "tuw-sol", "Solong": "aaw", "Solos": "sol", "Som": "smc", "Somali": "so", "Somba-Siawari": "bmu", "Somra": "ntx", "Somrai": "sor", "Somray": "smu", "Somyev": "kgt", "Sonaga": "ysg", "Sonde": "shc", "Songe": "sop", "Songlai Chin": "csj", "Songomeno": "soe", "Songoora": "sod", "Sonha": "soi", "Sonia": "siq", "Soninke": "snk", "Sonsorolese": "sov", "Soo": "teu", "Sop": "urw", "Soqotri": "sqt", "Sora": "srb", "Sori-Harengan": "sbh", "Sorkhei": "sqo", "Sorothaptic": "sxo", "Sorsogon Ayta": "ays", "Sos Kundi": "sdk", "Sota Kanum": "krz", "Sotho": "st", "Sou": "sqq", "South African Sign Language": "sfs", "South Awyu": "aws", "South Boma": "bnt-sbo", "South Central Banda": "lnl", "South Central Dinka": "dib", "South Efate": "erk", "South Fali": "fal", "South Giziga": "giz", "South Lembata": "lmf", "South Levantine Arabic": "ajp", "South Marquesan": "mqm", "South Muyu": "kts", "South Nuaulu": "nxl", "South Picene": "spx", "South Slavey": "xsl", "South Tairora": "omw", "South Ucayali Ashéninka": "cpy", "South Watut": "mcy", "Southeast Ambrym": "tvk", "Southeast Babar": "vbb", "Southeast Ijo": "ijs", "Southeast Pashayi": "psi", "Southeast Tasmanian": "xpf", "Southeastern Dinka": "dks", "Southeastern Ixtlán Zapotec": "zpd", "Southeastern Kolami": "nit", "Southeastern Nochixtlán Mixtec": "mxy", "Southeastern Pomo": "pom", "Southeastern Puebla Nahuatl": "npl", "Southeastern Tarahumara": "tcu", "Southeastern Tepehuan": "stp", "Southern Alta": "agy", "Southern Altai": "alt", "Southern Amami-Oshima": "ams", "Southern Bai": "bfs", "Southern Birifor": "biv", "Southern Bobo": "bwq", "Southern Bontoc": "obk", "Southern Carrier": "caf", "Southern Catanduanes Bicolano": "bln", "Southern Dagaare": "dga", "Southern East Cree": "crj", "Southern Ghale": "ghe", "Southern Grebo": "grj", "Southern Guiyang Hmong": "hmy", "Southern Haida": "hax", "Southern Hindko": "hnd", "Southern Kalapuya": "sxk", "Southern Kalinga": "ksc", "Southern Kam": "kmc", "Southern Kissi": "kss", "Southern Kiwai": "kjd", "Southern Kurdish": "sdh", "Southern Lolopo": "ysp", "Southern Lorung": "lrr", "Southern Luri": "luz", "Southern Ma'di": "snm", "Southern Mashan Hmong": "hma", "Southern Mnong": "mnn", "Southern Muji": "ymc", "Southern Ndebele": "nr", "Southern Ngbandi": "nbw", "Southern Nicobarese": "nik", "Southern Nisu": "nsd", "Southern Nuni": "nnw", "Southern Ohlone": "css", "Southern One": "osu", "Southern Pame": "pmz", "Southern Pomo": "peq", "Southern Puebla Mixtec": "mit", "Southern Puget Sound Salish": "slh", "Southern Pumi": "pmj", "Southern Qiandong Miao": "hms", "Southern Qiang": "qxs", "Southern Rengma Naga": "nre", "Southern Rincon Zapotec": "zsr", "Southern Roglai": "rgs", "Southern Sama": "ssb", "Southern Sami": "sma", "Southern Samo": "sbd", "Southern Selkup": "sel-sou", "Southern Sierra Miwok": "skd", "Southern Thai": "sou", "Southern Tidong": "itd", "Southern Tiwa": "tix", "Southern Toussian": "wib", "Southern Tujia": "tjs", "Southern Tutchone": "tce", "Southern Valley Yokuts": "nai-svy", "Southern Yukaghir": "yux", "Southwest Gbaya": "gso", "Southwest Palawano": "plv", "Southwest Pashayi": "psh", "Southwest Tanna": "nwi", "Southwestern Bontoc": "vbk", "Southwestern Dinka": "dik", "Southwestern Fars": "fay", "Southwestern Guiyang Hmong": "hmg", "Southwestern Huishui Hmong": "hmh", "Southwestern Nisu": "nsv", "Southwestern Tamang": "tsf", "Southwestern Tarahumara": "twr", "Southwestern Tepehuan": "tla", "Southwestern Tlaxiaco Mixtec": "meh", "Sowa": "sww", "Sowanda": "sow", "Soyaltepec Mazatec": "vmp", "Soyaltepec Mixtec": "vmq", "Spanish": "es", "Spanish Sign Language": "ssp", "Spiti Bhoti": "spt", "Spokane": "spo", "Squamish": "squ", "Sranan Tongo": "srn", "Sri Lankan Creole Malay": "sci", "Sri Lankan Sign Language": "sqs", "Stod Bhoti": "sbu", "Stoney": "sto", "Suabo": "szp", "Suarmin": "seo", "Suau": "swp", "Suba": "sxb", "Suba-Simbiti": "ssc", "Subi": "xsj", "Subiya": "sbs", "Subtiaba": "sut", "Sudanese Arabic": "apd", "Sudest": "tgo", "Sudovian": "xsv", "Suena": "sue", "Suga": "sgi", "Suganga": "sug", "Sugut Dusun": "kzs", "Sui": "swi", "Suki": "sui", "Suku": "sub", "Sukuma": "suk", "Sukur": "syk", "Sukurum": "zsu", "Sula": "szn", "Sulka": "sua", "Sulod": "srg", "Sulung": "suv", "Suma": "sqm", "Sumariup": "siv", "Sumau": "six", "Sumbawa": "smw", "Sumbwa": "suw", "Sumerian": "sux", "Sumtu Chin": "csv", "Sunam": "ssk", "Sundanese": "su", "Sunum": "ymn", "Sunwar": "suz", "Suoy": "syo", "Supyire": "spp", "Sur": "tdl", "Surbakhal": "sbj", "Suri": "suq", "Surigaonon": "sgd", "Surjapuri": "sjp", "Sursurunga": "sgz", "Suruahá": "swx", "Surubu": "sde", "Suruí": "sru", "Suruí Do Pará": "mdz", "Susquehannock": "sqn", "Susu": "sus", "Susuami": "ssu", "Suundi": "sdj", "Suwawa": "swu", "Suyá": "suy", "Svan": "sva", "Swabian": "swg", "Swahili": "sw", "Swampy Cree": "csw", "Swazi": "ss", "Swedish": "sv", "Swedish Sign Language": "swl", "Swiss-French Sign Language": "ssr", "Swiss-German Sign Language": "sgg", "Swiss-Italian Sign Language": "slf", "Swo": "sox", "Syenara Senoufo": "shz", "Sylheti": "syl", "Sácata": "sai-sac", "São Paulo Kaingáng": "zkp", "Sãotomense": "cri", "Sìcìté Sénoufo": "sep", "Sô": "sss", "T'en": "tct", "Taabwa": "tap", "Tabaa Zapotec": "zat", "Tabancale": "sai-tab", "Tabaru": "tby", "Tabasaran": "tab", "Tabasco Chontal": "chf", "Tabasco Nahuatl": "nhc", "Tabasco Zoque": "zoq", "Tabla": "tnm", "Tabo": "knv", "Tabriak": "tzx", "Tacahua Mixtec": "xtt", "Tacana": "tna", "Tachawit": "shy", "Tadaksahak": "dsq", "Tadyawan": "tdy", "Tae'": "rob", "Tafi": "tcd", "Tafreshi": "xme-taf", "Tagabawa": "bgs", "Tagakaulu Kalagan": "klg", "Tagal Murut": "mvv", "Tagalog": "tl", "Tagbanwa": "tbw", "Tagbu": "tbm", "Tagdal": "tda", "Tagish": "tgx", "Tagoi": "tag", "Tagwana Senoufo": "tgw", "Tahitian": "ty", "Tahltan": "tht", "Tai": "taw", "Tai Daeng": "tyr", "Tai Dam": "blt", "Tai Do": "tyj", "Tai Dón": "twh", "Tai Hang Tong": "thc", "Tai Hongjin": "tiz", "Tai Laing": "tjl", "Tai Loi": "tlq", "Tai Long": "thi", "Tai Nüa": "tdd", "Tai Pao": "tpo", "Tai Thanh": "tmm", "Tai Ya": "cuu", "Taiap": "gpn", "Taikat": "aos", "Taimyr Pidgin Russian": "crp-tpr", "Tainae": "ago", "Tairuma": "uar", "Taishanese": "zhx-tai", "Taita": "dav", "Taivoan": "tvx", "Taiwan Sign Language": "tss", "Taje": "pee", "Tajik": "tg", "Tajiki Arabic": "abh", "Tajio": "tdj", "Tajuasohn": "tja", "Takelma": "tkm", "Takia": "tbc", "Takka Apabhramsa": "inc-tak", "Takua": "tkz", "Takuu": "nho", "Takwane": "tke", "Tal": "tal", "Tala": "tak", "Talaud": "tld", "Taliabu": "tlv", "Talieng": "tdf", "Talinga-Bwisi": "tlj", "Talise": "tlr", "Tallán": "sai-tal", "Talodi": "tlo", "Taloki": "tlk", "Talondo'": "tln", "Talossan": "tzl", "Talu": "yta", "Talysh": "tly", "Tama (Chad)": "tma", "Tama (Colombia)": "ten", "Tamagario": "tcg", "Tamambo": "mla", "Taman (Indonesia)": "tmn", "Taman (Myanmar)": "tcl", "Tamanaku": "tmz", "Tamazola Mixtec": "vmx", "Tambas": "tdk", "Tambora": "xxt", "Tambotalo": "tls", "Tambunan Dusun": "kzt", "Tami": "tmy", "Tamil": "ta", "Tamki": "tax", "Tamnim Citak": "tml", "Tampias Lobu": "low", "Tampuan": "tpu", "Tampulma": "tpm", "Tanacross": "tcb", "Tanahmerah": "tcm", "Tanapag": "tpv", "Tandaganon": "tgn", "Tandia": "tni", "Tanema": "tnx", "Tangale": "tan", "Tangam": "sit-tgm", "Tangchangya": "tnv", "Tanggu": "tgu", "Tangkhul Naga": "nmf", "Tangko": "tkx", "Tanglang": "ytl", "Tangoa": "tgp", "Tangsa": "nst", "Tanguat": "tbs", "Tangut": "txg", "Tangwang": "crp-tnw", "Tanimbili": "tbe", "Tanimuca-Retuarã": "tnc", "Tanjijili": "uji", "Tanudan Kalinga": "kml", "Tanzanian Sign Language": "tza", "Taos": "twf", "Tapachultec": "nai-tap", "Taparita": "sai-tpr", "Tapayuna": "sai-tap", "Tapeba": "tbb", "Tapei": "afp", "Tapieté": "tpj", "Tapirapé": "taf", "Tar Gula": "kcm", "Tara Baka": "bdh", "Tarairiú": "sai-trr", "Tarantino": "roa-tar", "Tarao": "tro", "Taraon": "mhu", "Tareng": "tgr", "Tariana": "tae", "Tarifit": "rif", "Tarjumo": "txj", "Tarok": "yer", "Taroko": "trv", "Tarpia": "tpf", "Tartessian": "txr", "Taruma": "tdm", "Tasawaq": "twq", "Tashelhit": "shi", "Tasmanian": "xtz", "Tasmate": "tmt", "Tat": "ttt", "Tataltepec Chatino": "cta", "Tatana": "txx", "Tatar": "tt", "Tataviam": "azc-tat", "Tatuyo": "tav", "Tauade": "ttd", "Taulil": "tuh", "Taungyo": "tco", "Taupota": "tpa", "Tause": "tad", "Taushiro": "trr", "Tausug": "tsg", "Tauya": "tya", "Taveta": "tvs", "Tavoyan": "tvn", "Tavringer Romani": "rmu", "Tawala": "tbo", "Tawandê": "xtw", "Tawang Monpa": "twm", "Tawasa": "nai-taw", "Taworta": "tbp", "Tawoyan": "twy", "Tawr Chin": "tcp", "Tay Khang": "tnu", "Tayabas Ayta": "ayy", "Taymanitic": "sem-tay", "Tayo": "cks", "Taíno": "tnq", "Tboli": "tbl", "Tchitchege": "tck", "Tchumbuli": "bqa", "Te'un": "tve", "Teanu": "tkw", "Tebul Sign Language": "tsy", "Tebul Ure Dogon": "dtu", "Tecpatlán Totonac": "tcw", "Tedaga": "tuq", "Tedim Chin": "ctd", "Tee": "tkq", "Tefaro": "tfo", "Tegali": "ras", "Tehit": "kps", "Tehuelche": "teh", "Teiwa": "twe", "Tejalapan Zapotec": "ztt", "Teke-Fuumu": "ifm", "Teke-Kukuya": "kkw", "Teke-Laali": "lli", "Teke-Tege": "teg", "Teke-Tsaayi": "tyi", "Teke-Tyee": "tyx", "Tektiteko": "ttc", "Tela-Masbuar": "tvm", "Telefol": "tlf", "Telugu": "te", "Teluti": "tlt", "Tem": "kdh", "Temascaltepec Nahuatl": "nhv", "Tembé": "tqb", "Teme": "tdo", "Temein": "teq", "Temi": "soz", "Temiar": "tea", "Temne": "tem", "Temoaya Otomi": "ott", "Temoq": "tmo", "Tempasuk Dusun": "tdu", "Ten'edn": "tnz", "Tenango Otomi": "otn", "Tene Kan Dogon": "dtk", "Tenggarong Kutai Malay": "vkt", "Tengger": "tes", "Tenharim": "pah", "Tenino": "tqn", "Tenis": "tns", "Tennet": "tex", "Teochew": "zhx-teo", "Teojomulco Chatino": "omq-teo", "Teop": "tio", "Teor": "tev", "Tepecano": "tep", "Tepetotutla Chinantec": "cnt", "Tepeuxila Cuicatec": "cux", "Tepinapa Chinantec": "cte", "Tepo Krumen": "ted", "Teposcolula Mixtec": "omq-tel", "Tequistlatec": "nai-teq", "Ter Sami": "sjt", "Tera": "ttr", "Terebu": "trb", "Terei": "buo", "Tereno": "ter", "Teressa": "tef", "Tereweng": "twg", "Teribe": "tfr", "Terik": "tec", "Termanu": "twu", "Ternate": "tft", "Ternateño": "tmg", "Tese": "keg", "Teshenawa": "twc", "Tetela": "tll", "Tetelcingo Nahuatl": "nhg", "Tetete": "teb", "Tetserret": "tez", "Tetum": "tet", "Tetun Dili": "tdt", "Teushen": "sai-teu", "Teutila Cuicatec": "cut", "Tewa": "tew", "Texcatepec Otomi": "otx", "Texistepec Popoluca": "poq", "Texmelucan Zapotec": "zpz", "Tezoatlán Mixtec": "mxb", "Tha": "thy", "Thachanadan": "thn", "Thado Chin": "tcz", "Thai": "th", "Thai Mon": "mnw-tha", "Thai Sign Language": "tsq", "Thai Song": "soa", "Thaiphum Chin": "cth", "Thakali": "ths", "Thamudic": "sem-tha", "Thangal Naga": "nki", "Thangmi": "thf", "Thao": "ssf", "Tharaka": "thk", "Tharrgari": "dhr", "Thavung": "thm", "Thawa": "xtv", "Tho": "tou", "Thompson": "thp", "Thopho": "ytp", "Thracian": "txh", "Thu Lao": "tyl", "Thulung": "tdh", "Thurawal": "tbh", "Thuri": "thu", "Tiagbamrin Aizi": "ahi", "Tiale": "mnl", "Tiang": "tbj", "Tibea": "ngy", "Tibetan": "bo", "Ticuna": "tca", "Tidaá Mixtec": "mtx", "Tidore": "tvo", "Tiemacèwè Bozo": "boo", "Tiene": "tii", "Tifal": "tif", "Tigak": "tgc", "Tigon Mbembe": "nza", "Tigre": "tig", "Tigrinya": "ti", "Tii": "txq", "Tijaltepec Mixtec": "xtl", "Tikar": "tik", "Tikopia": "tkp", "Tilapa Otomi": "otl", "Tillamook": "til", "Tilquiapan Zapotec": "zts", "Tilung": "tij", "Tima": "tms", "Timbe": "tim", "Timor Pidgin": "tvy", "Timote": "sai-tim", "Timucua": "tjm", "Timugon Murut": "tih", "Tinani": "lbf", "Tindi": "tin", "Tingui-Boto": "tgv", "Tinigua": "tit", "Tinoc Kallahan": "tne", "Tinputz": "tpz", "Tipai": "nai-tip", "Tippera": "tpe", "Tira": "tic", "Tirahi": "tra", "Tiranige Diga Dogon": "tde", "Tircul": "pyx", "Tiri": "cir", "Tiruray": "tiy", "Tita": "tdq", "Titan": "ttv", "Tiv": "tiv", "Tiwa": "lax", "Tiwi": "tiw", "Tiéfo": "tiq", "Tiéyaxo Bozo": "boz", "Tjurruru": "tju", "Tlachichilco Tepehua": "tpt", "Tlacoapa Me'phaa": "tpl", "Tlacoatzintepec Chinantec": "ctl", "Tlacolulita Zapotec": "zpk", "Tlahuica": "ocu", "Tlahuitoltepec Mixe": "mxp", "Tlamacazapa Nahuatl": "nuz", "Tlazoyaltepec Mixtec": "mqh", "Tlingit": "tli", "To": "toz", "To'abaita": "mlu", "Toaripi": "tqo", "Toba": "tob", "Toba Batak": "bbc", "Toba-Maskoy": "tmf", "Tobagonian Creole English": "tgh", "Tobanga": "tng", "Tobati": "tti", "Tobelo": "tlb", "Tobian": "tox", "Tobilung": "tgb", "Tobo": "tbv", "Tocantins Asurini": "asu", "Tocharian A": "xto", "Tocharian B": "txb", "Tocho": "taz", "Toda": "tcx", "Todrah": "tdr", "Tofa": "kim", "Tofanma": "tlg", "Tofin Gbe": "tfi", "Togbo-Vara Banda": "tor", "Togoyo": "tgy", "Tojolabal": "toj", "Tok Pisin": "tpi", "Toka-Leya": "dov", "Tokano": "zuh", "Tokelauan": "tkl", "Toki Pona": "tok", "Toku-No-Shima": "tkn", "Tol": "jic", "Tolai": "ksd", "Tolaki": "lbw", "Tolomako": "tlm", "Tolowa": "tol", "Toma": "tod", "Tomadino": "tdi", "Tombelala": "ttp", "Tombonuo": "txa", "Tombulu": "tom", "Tomini": "txm", "Tommeginne": "xpv", "Tommo So": "dto", "Tomo Kan Dogon": "dtm", "Tomoip": "tqp", "Tondano": "tdn", "Tonga (Malawi)": "tog", "Tonga (Mozambique)": "toh", "Tonga (Zambia)": "toi", "Tongan": "to", "Tongwe": "tny", "Tonjon": "tjn", "Tonkawa": "tqw", "Tonsawang": "tnw", "Tonsea": "txs", "Tontemboan": "tnt", "Toogee": "xpx", "Tooro": "ttj", "Topoiyo": "toy", "Toposa": "toq", "Toraja-Sa'dan": "sda", "Toram": "trj", "Torau": "ttu", "Toro": "tdv", "Toro So Dogon": "dts", "Toro Tegu Dogon": "dtt", "Toromono": "tno", "Torona": "tqr", "Torres Strait Creole": "tcs", "Torricelli": "tei", "Torricelli Yau": "yyu", "Torwali": "trw", "Torá": "trz", "Tosu": "sit-tos", "Totela": "ttl", "Toto": "txo", "Totoli": "txe", "Totomachapan Zapotec": "zph", "Totontepec Mixe": "mto", "Totoro": "ttk", "Touo": "tqu", "Toura": "neb", "Tourangeau": "roa-tou", "Towei": "ttn", "Translingual": "mul", "Transylvanian Saxon": "gmw-tsx", "Traveller Danish": "rmd", "Traveller Norwegian": "rmg", "Traveller Scottish": "trl", "Tregami": "trm", "Tremembé": "tme", "Trieng": "stg", "Trimuris": "tip", "Tring": "tgq", "Tringgus": "trx", "Trinidad and Tobago Sign Language": "lst", "Trinidadian Creole English": "trf", "Trinitario": "trn", "Trió": "tri", "Truká": "tka", "Trumai": "tpy", "Ts'ün-Lao": "tsl", "Tsaangi": "tsa", "Tsafiki": "cof", "Tsakhur": "tkr", "Tsakonian": "tsd", "Tsakwambo": "kvz", "Tsamai": "tsb", "Tsat": "huq", "Tsetsaut": "txc", "Tsez": "ddo", "Tshangla": "tsj", "Tshobdun": "sit-tsh", "Tshwa": "hio", "Tsikimba": "kdl", "Tsimané": "cas", "Tsimshian": "tsi", "Tsishingini": "tsw", "Tso": "ldp", "Tsogo": "tsv", "Tsonga": "ts", "Tsotsitaal": "fly", "Tsou": "tsu", "Tsum": "ttz", "Tsuvadi": "tvd", "Tsuvan": "tsh", "Tswa": "tsc", "Tswana": "tn", "Tswapong": "two", "Tuamotuan": "pmt", "Tuareg": "tmh", "Tubar": "tbu", "Tucano": "tuo", "Tugen": "tuy", "Tugun": "tzn", "Tugutil": "tuj", "Tukang Besi North": "khc", "Tukang Besi South": "bhq", "Tuki": "bag", "Tukpa": "tpq", "Tukudede": "tkd", "Tukumanféd": "tkf", "Tula": "tul", "Tule-Kaweah Yokuts": "nai-tky", "Tulehu": "tlu", "Tulishi": "tey", "Tulu": "tcy", "Tulu-Bohuai": "rak", "Tulua": "aus-tul", "Tuma-Irumu": "iou", "Tumak": "tmc", "Tumbuka": "tum", "Tumi": "kku", "Tumleo": "tmq", "Tumshuqese": "xtq", "Tumtum": "tbr", "Tumulung Sisaala": "sil", "Tundra Enets": "enh", "Tundra Nenets": "yrk", "Tunen": "tvu", "Tungag": "lcm", "Tunggare": "trt", "Tunia": "tug", "Tunica": "tun", "Tunisian Arabic": "aeb", "Tunisian Berber": "sds", "Tunisian Sign Language": "tse", "Tunjung": "tjg", "Tunni": "tqq", "Tunumiisut": "esx-tut", "Tunzu": "dza", "Tuoba": "qfa-xgx-tuo", "Tuotomb": "ttf", "Tuparí": "tpr", "Tupinambá": "tpn", "Tupinikin": "tpk", "Tupuri": "tui", "Turaka": "trh", "Turi": "trd", "Turiwára": "twt", "Turka": "tuz", "Turkana": "tuv", "Turkish": "tr", "Turkish Sign Language": "tsm", "Turkmen": "tk", "Turks and Caicos Creole English": "tch", "Turoyo": "tru", "Turumsa": "tqm", "Turung": "try", "Tuscarora": "tus", "Tutelo": "tta", "Tutong": "ttg", "Tutsa Naga": "tvt", "Tutuba": "tmi", "Tututepec Mixtec": "mtu", "Tututni": "tuu", "Tuvaluan": "tvl", "Tuvan": "tyv", "Tuwali Ifugao": "ifk", "Tuwari": "tww", "Tuwuli": "bov", "Tuxináwa": "tux", "Tuxá": "tud", "Tuyuca": "tue", "Tuyuhun": "qfa-xgx-tuh", "Twana": "twa", "Twendi": "twn", "Tyap": "kcg", "Tyaraity": "woa", "Tyerrernotepanner": "xph", "Tz'utujil": "tzj", "Tzeltal": "tzh", "Tzotzil": "tzo", "Tày": "tyz", "Tày Tac": "tyt", "Tây Bồi": "tas", "Téén": "lor", "Tübatulabal": "tub", "U": "uuu", "Uab Meto": "aoz", "Uamué": "uam", "Uare": "ksj", "Ubaghara": "byc", "Ubang": "uba", "Ubi": "ubi", "Ubir": "ubr", "Ubykh": "uby", "Ucayali-Yurúa Ashéninka": "cpb", "Uda": "uda", "Udi": "udi", "Udihe": "ude", "Udmurt": "udm", "Uduk": "udu", "Ufim": "ufi", "Ugandan Sign Language": "ugn", "Ugaritic": "uga", "Ughele": "uge", "Uhami": "uha", "Uisai": "uis", "Ujir": "udj", "Ukaan": "kcf", "Ukhwejo": "ukh", "Ukit": "umi", "Ukpe-Bayobiri": "ukp", "Ukpet-Ehom": "akd", "Ukrainian": "uk", "Ukrainian Sign Language": "ukl", "Ukue": "uku", "Ukuriguma": "ukg", "Ukwa": "ukq", "Ukwuani-Aboh-Ndoni": "ukw", "Ulau-Suain": "svb", "Ulch": "ulc", "Uldeme": "udl", "Ulithian": "uli", "Ullatan": "ull", "Ulumanda'": "ulm", "Ulwa": "ulw", "Uma": "ppk", "Uma' Lasan": "xky", "Uma' Lung": "ulu", "Umanakaina": "gdn", "Umatilla": "uma", "Umbindhamu": "umd", "Umbrian": "xum", "Umbu-Ungu": "ubu", "Umbugarla": "umr", "Umbundu": "umb", "Umbuygamu": "umg", "Ume Sami": "sju", "Umeda": "upi", "Umiida": "xud", "Umiray Dumaget Agta": "due", "Umon": "umm", "Umotína": "umo", "Umpila": "ump", "Una": "mtg", "Unami": "unm", "Unas": "art-una", "Unde Kaili": "unz", "Undetermined": "und", "Uneapa": "bbn", "Uneme": "une", "Unggaranggu": "xun", "Unggumi": "xgu", "Unserdeutsch": "uln", "Unua": "onu", "Unubahe": "unu", "Uokha": "uok", "Upper Chehalis": "cjh", "Upper Grand Valley Dani": "dna", "Upper Kinabatangan": "dmg", "Upper Kuskokwim": "kuu", "Upper Necaxa Totonac": "tku", "Upper Sorbian": "hsb", "Upper Ta'oih": "tth", "Upper Tanana": "tau", "Upper Taromi": "tov", "Upper Umpqua": "xup", "Ura (New Guinea)": "uro", "Ura (Vanuatu)": "uur", "Uradhi": "urf", "Urak Lawoi'": "urk", "Urali": "url", "Urapmin": "urm", "Urarina": "ura", "Urartian": "xur", "Urat": "urt", "Urdu": "ur", "Urhobo": "urh", "Uri": "uvh", "Urigina": "urg", "Urim": "uri", "Urimo": "urx", "Uripiv-Wala-Rano-Atchin": "upv", "Urningangg": "urc", "Uru": "ure", "Uru-Eu-Wau-Wau": "urz", "Uru-Pa-In": "urp", "Uruangnirin": "urn", "Uruava": "urv", "Urubú-Kaapor": "urb", "Uruguayan Sign Language": "ugy", "Urum": "uum", "Urumi": "uru", "Usaghade": "usk", "Usan": "wnu", "Usarufa": "usa", "Ushojo": "ush", "Usila Chinantec": "cuc", "Uspanteco": "usp", "Usui": "usi", "Utarmbung": "omo", "Ute": "ute", "Utu": "utu", "Uvbie": "evh", "Uwinymil": "aus-uwi", "Uya": "usu", "Uyajitaya": "duk", "Uyghur": "ug", "Uzbek": "uz", "Uzbeki Arabic": "auz", "Uzekwe": "eze", "Vaagri Booli": "vaa", "Vaghri": "vgr", "Vaghua": "tva", "Vagla": "vag", "Vai": "vai", "Vaiphei": "vap", "Vale": "vae", "Valencian Sign Language": "vsv", "Valle Nacional Chinantec": "cvn", "Valley Maidu": "vmv", "Valman": "van", "Valpei": "vlp", "Vamale": "mkt", "Vame": "mlr", "Vandalic": "xvn", "Vangunu": "mpr", "Vanimo": "vam", "Vanji": "ira-wnj", "Vanuma": "vau", "Vao": "vao", "Varhadi": "vah", "Varisi": "vrs", "Varli": "vav", "Vasavi": "vas", "Vayu": "vay", "Veddah": "ved", "Vehes": "val", "Vemgo-Mabas": "vem", "Venda": "ve", "Venetian": "vec", "Venetic": "xve", "Venezuelan Sign Language": "vsl", "Ventureño": "veo", "Veps": "vep", "Vera'a": "vra", "Vestinian": "xvs", "Vidunda": "vid", "Viemo": "vig", "Vietnamese": "vi", "Vilamovian": "wym", "Vilela": "vil", "Vili": "vif", "Villa Viciosa Agta": "dyg", "Vincentian Creole English": "svc", "Virgin Islands Creole": "vic", "Vishavan": "vis", "Viti": "vit", "Vitou": "vto", "Viya": "gev", "Vlax Romani": "rmy", "Volapük": "vo", "Volga German": "gmw-vog", "Volscian": "xvo", "Vono": "kch", "Voro": "vor", "Votic": "vot", "Vracada Apabhramsa": "inc-vra", "Vumbu": "vum", "Vunapu": "vnp", "Vunjo": "vun", "Vurës": "msn", "Vute": "vut", "Võro": "vro", "Wa": "wbm", "Wa'ema": "wag", "Waama": "wwa", "Waamwang": "wmn", "Wab": "wab", "Wabo": "wbb", "Waboda": "kmx", "Waci Gbe": "wci", "Wadaginam": "wdg", "Waddar": "wbq", "Wadi Wadi": "xwd", "Wadiyara Koli": "kxp", "Wadjabangayi": "wdy", "Wadjiginy": "wdj", "Wadjigu": "wdu", "Wae Rana": "wrx", "Waffa": "waj", "Wagawaga": "wgb", "Wagaya": "wga", "Wagdi": "wbr", "Wageman": "waq", "Wagi": "fad", "Wahau Kayan": "whu", "Wahau Kenyah": "whk", "Wahgi": "wgi", "Waigali": "wbk", "Waigeo": "wgo", "Waikuri": "nai-wai", "Wailaki": "wlk", "Wailapa": "wlr", "Waima'a": "wmh", "Waimaha": "bao", "Waimiri-Atroari": "atr", "Wainumá": "awd-wai", "Waioli": "wli", "Waitaká": "sai-wai", "Waiwai": "waw", "Waja": "wja", "Wajarri": "wbv", "Wajuk": "xwj", "Waka": "wav", "Wakawaka": "wkw", "Wakhi": "wbl", "Wakoná": "waf", "Wala": "lgl", "Walak": "wlw", "Walangama": "nlw", "Wali (Ghana)": "wlx", "Wali (Sudan)": "wll", "Waling": "wly", "Walio": "wla", "Walla Walla": "waa", "Wallisian": "wls", "Walloon": "wa", "Walmajarri": "wmt", "Wam": "wmo", "Wamas": "wmc", "Wambaya": "wmb", "Wambon": "wms", "Wambule": "wme", "Wamey": "cou", "Wamin": "wmi", "Wampar": "lbq", "Wampur": "waz", "Wan": "wan", "Wanambre": "wnb", "Wanap": "wnp", "Wancho": "nnp", "Wanda": "wbh", "Wandala": "mfi", "Wandamen": "wad", "Wandarang": "wnd", "Wandji": "wdd", "Waneci": "wne", "Wanga": "lwg", "Wanggamala": "wnm", "Wangganguru": "wgg", "Wanggom": "wng", "Wangkayutyuru": "wky", "Wangkumara": "xwk", "Wanham": "sai-wnm", "Wanji": "wbi", "Wanman": "wbt", "Wannu": "jub", "Wano": "wno", "Wantoat": "wnc", "Wanukaka": "wnk", "Wanyi": "wny", "Wané": "hwa", "Wapan": "juk", "Wapishana": "wap", "Wappo": "wao", "War-Jaintia": "aml", "Wara": "wbf", "Warao": "wba", "Warapu": "wra", "Waray Sorsogon": "srv", "Waray-Waray": "war", "Wardaman": "wrr", "Wardandi": "wxw", "Warekena": "gae", "Warembori": "wsa", "Wari'": "pav", "Waris": "wrs", "Waritai": "wbe", "Wariyangga": "wri", "Warji": "wji", "Warkay-Bipim": "bgv", "Warlmanpa": "wrl", "Warlpiri": "wbp", "Warluwara": "wrb", "Warnang": "wrn", "Waropen": "wrp", "Warray": "wrz", "Warrgamay": "wgy", "Warrwa": "wwr", "Waru": "wru", "Warumungu": "wrm", "Waruna": "wrv", "Warungu": "wrg", "Warwar Feni": "hrw", "Wasa": "wss", "Wasco-Wishram": "wac", "Wasembo": "gsp", "Washo": "was", "Waskia": "wsk", "Wastek": "hus", "Wasu": "wsu", "Watakataui": "wtk", "Watam": "wax", "Wathaurong": "wth", "Watiwa": "wtf", "Watubela": "wah", "Waube": "kop", "Wauja": "wau", "Wauyai": "wuy", "Wawa": "www", "Wawonii": "wow", "Waxianghua": "wxa", "Wayampi": "oym", "Wayana": "way", "Wayanad Chetti": "ctt", "Wayoró": "wyr", "Wayumará": "sai-way", "Wayuu": "guc", "Wedau": "wed", "Weh": "weh", "Welaung": "weu", "Weliki": "klh", "Welsh": "cy", "Welsh Romani": "rmw", "Wemale": "weo", "Wemba-Wemba": "xww", "Weme Gbe": "wem", "Wendat": "wdt", "Weri": "wer", "Wersing": "kvw", "West Albay Bikol": "fbl", "West Ambae": "nnd", "West Central Banda": "bbp", "West Coast Bajau": "bdr", "West Damar": "drn", "West Flemish": "vls", "West Frisian": "fy", "West Greenlandic Pidgin": "crp-gep", "West Lembata": "lmj", "West Makian": "mqs", "West Masela": "mss", "West Tarangan": "txn", "West Uvean": "uve", "West-Central Limba": "lia", "Western Apache": "apw", "Western Arrernte": "are", "Western Bolivian Guaraní": "gnw", "Western Bru": "brv", "Western Bukidnon Manobo": "mbb", "Western Cham": "cja", "Western Dani": "dnw", "Western Durango Nahuatl": "azn", "Western Fijian": "wyy", "Western Gurung": "gvr", "Western Highland Chatino": "ctp", "Western Huasteca Nahuatl": "nhw", "Western Jicaque": "und-wji", "Western Juxtlahuaca Mixtec": "jmx", "Western Karaboro": "kza", "Western Katu": "kuf", "Western Kayah": "kyu", "Western Keres": "kjq", "Western Krahn": "krw", "Western Lalu": "ywl", "Western Lawa": "lcp", "Western Magar": "mrd", "Western Maninkakan": "mlq", "Western Mari": "mrj", "Western Mashan Hmong": "hmw", "Western Meohang": "raf", "Western Muria": "mut", "Western Neo-Aramaic": "amw", "Western Ojibwa": "ojw", "Western Panjabi": "pnb", "Western Penan": "pne", "Western Pwo": "pwo", "Western Sisaala": "ssl", "Western Subanon": "suc", "Western Tamang": "tdg", "Western Tawbuid": "twb", "Western Totonac": "tqt", "Western Tunebo": "tnb", "Western Xiangxi Miao": "mmr", "Western Xwla Gbe": "xwl", "Western Yugur": "ybe", "Wewaw": "wea", "Weyewa": "wew", "White Gelao": "giw", "White Hmong": "mww", "White Lachi": "lwh", "Whitesands": "tnp", "Wiarumus": "tua", "Wichita": "wic", "Wichí Lhamtés Güisnay": "mzh", "Wichí Lhamtés Nocten": "mtp", "Wichí Lhamtés Vejoz": "wlv", "Wik-Epa": "wie", "Wik-Iiyanh": "wij", "Wik-Keyangan": "wif", "Wik-Me'anha": "wih", "Wik-Mungkan": "wim", "Wik-Ngathana": "wig", "Wikalkan": "wik", "Wikngenchera": "wua", "Wilawila": "wil", "Winnebago": "win", "Wintu": "wnw", "Winyé": "kst", "Wipi": "gdr", "Wiradhuri": "wrh", "Wiraféd": "wir", "Wirangu": "wgu", "Wiru": "wiu", "Wirö": "wpc", "Wiwa": "mbp", "Wiyot": "wiy", "Woccon": "xwc", "Wogamusin": "wog", "Wogeo": "woc", "Woi": "wbw", "Woiwurrung": "wyi", "Wojenaka": "jod", "Wolane": "wle", "Wolani": "wod", "Wolaytta": "wal", "Woleaian": "woe", "Wolio": "wlo", "Wolof": "wo", "Womo": "wmx", "Wong-gie": "aus-won", "Wongo": "won", "Woods Cree": "cwd", "Woria": "wor", "Worimi": "kda", "Worodougou": "jud", "Worora": "wro", "Wotapuri-Katarqalai": "wsv", "Wotu": "wtw", "Woun Meu": "noa", "Written Oirat": "xwo", "Wu": "wuu", "Wudu": "wud", "Wuhuan": "qfa-xgx-wuh", "Wulguru": "aus-wul", "Wuliwuli": "wlu", "Wulna": "wux", "Wumboko": "bqm", "Wumbvu": "wum", "Wumeng Nasu": "ywu", "Wunai Bunu": "bwn", "Wunambal": "wub", "Wurrugu": "wur", "Wusa Nasu": "yig", "Wushi": "bse", "Wusi": "wsi", "Wutung": "wut", "Wutunhua": "wuh", "Wuvulu-Aua": "wuv", "Wyandot": "wya", "Wára": "tci", "Wãpha": "juw", "Wè Northern": "wob", "Wè Southern": "gxx", "Wè Western": "wec", "Xadani Zapotec": "zax", "Xakriabá": "xkr", "Xamtanga": "xan", "Xanaguía Zapotec": "ztg", "Xaragure": "axx", "Xavante": "xav", "Xerénte": "xer", "Xetá": "xet", "Xhosa": "xh", "Xianbei": "qfa-xgx-xbi", "Xiang": "hsn", "Xibe": "sjo", "Xicotepec de Juárez Totonac": "too", "Xinca": "xin", "Xingú Asuriní": "asn", "Xipaya": "xiy", "Xiri": "xii", "Xiriâna": "xir", "Xishanba Lalo": "ywt", "Xocó": "sai-xoc", "Xokleng": "xok", "Xukurú": "xoo", "Xwela Gbe": "xwe", "Xârâcùù": "ane", "Yaa": "iyx", "Yaaku": "muu", "Yabarana": "yar", "Yabaâna": "ybn", "Yaben": "ybm", "Yabong": "ybo", "Yabula Yabula": "yxy", "Yace": "ekr", "Yaeyama": "rys", "Yafi": "wfg", "Yagara": "yxg", "Yagaria": "ygr", "Yagnobi": "yai", "Yagomi": "ygm", "Yagua": "yad", "Yagwoia": "ygw", "Yahadian": "ner", "Yahang": "rhp", "Yahuna": "ynu", "Yaka": "yaf", "Yakaikeke": "ykk", "Yakan": "yka", "Yakima": "yak", "Yakkha": "ybh", "Yakoma": "yky", "Yakut": "sah", "Yala": "yba", "Yalahatan": "jal", "Yalakalore": "xyl", "Yalarnnga": "ylr", "Yale": "nce", "Yaleba": "ylb", "Yalunka": "yal", "Yalálag Zapotec": "zpu", "Yamap": "ymp", "Yamba": "yam", "Yambes": "ymb", "Yambeta": "yat", "Yamdena": "jmd", "Yameo": "yme", "Yami": "tao", "Yaminahua": "yaa", "Yamongeri": "ymg", "Yamphu": "ybi", "Yan-nhangu": "jay", "Yana": "ynn", "Yanda": "yda", "Yanda Dogon": "dym", "Yandjibara": "xyb", "Yandruwandha": "ynd", "Yanesha'": "ame", "Yangben": "yav", "Yangkaal": "aus-ynk", "Yangkam": "bsx", "Yangman": "jng", "Yango": "yng", "Yangulam": "ynl", "Yangum Dey": "yde", "Yangum Gel": "ygl", "Yangum Mon": "ymo", "Yankunytjatjara": "kdd", "Yanomamö": "guu", "Yanomámi": "wca", "Yansi": "yns", "Yanyuwa": "jao", "Yao": "yao", "Yao (South America)": "sai-yao", "Yaosakor Asmat": "asy", "Yaouré": "yre", "Yapese": "yap", "Yapunda": "yev", "Yaqay": "jaq", "Yaqui": "yaq", "Yarawata": "yrw", "Yareba": "yrb", "Yareni Zapotec": "zae", "Yarli": "yxl", "Yarluyandi": "yry", "Yaroamë": "yro", "Yarumá": "sai-yar", "Yarí": "yri", "Yasa": "yko", "Yatay": "yty", "Yatee Zapotec": "zty", "Yatzachi Zapotec": "zav", "Yaul": "yla", "Yaur": "jau", "Yautepec Zapotec": "zpb", "Yavitero": "yvt", "Yawa": "yva", "Yawalapití": "yaw", "Yawanawa": "ywn", "Yawarawarga": "yww", "Yaweyuha": "yby", "Yawijibaya": "jbw", "Yawiyo": "ybx", "Yawuru": "ywr", "Yaygir": "xya", "Yazghulami": "yah", "Yei": "jei", "Yekhee": "ets", "Yekora": "ykr", "Yele": "yle", "Yelmek": "jel", "Yelogu": "ylg", "Yemba": "ybb", "Yemeni Arabic": "ayn", "Yemsa": "jnj", "Yendang": "yen", "Yeni": "yei", "Yeniche": "yec", "Yerakai": "yra", "Yeretuar": "gop", "Yerong": "yrn", "Yerukula": "yeu", "Yeskwa": "yes", "Yessan-Mayo": "yss", "Yetfa": "yet", "Yevanic": "yej", "Yeyi": "yey", "Yiddish": "yi", "Yidgha": "ydg", "Yidiny": "yii", "Yil": "yll", "Yilan Creole": "ycr", "Yimas": "yee", "Yimchungru Naga": "yim", "Yinbaw Karen": "kvu", "Yinchia": "yin", "Yindjibarndi": "yij", "Yindjilandji": "yil", "Yine": "pib", "Yinggarda": "yia", "Yinhawangka": "ywg", "Yiningayi": "ygi", "Yintale Karen": "kvy", "Yinwum": "yxm", "Yir-Yoront": "yiy", "Yirandali": "ljw", "Yis": "yis", "Yitha Yitha": "xth", "Yoba": "yob", "Yocoboué Dida": "gud", "Yogad": "yog", "Yoidik": "ydk", "Yoke": "yki", "Yola": "yol", "Yolmo": "scp", "Yolngu Sign Language": "ygs", "Yoloxochitl Mixtec": "xty", "Yom": "pil", "Yombe": "yom", "Yonaguni": "yoi", "Yong": "yno", "Yongkom": "yon", "Yopno": "yut", "Yora": "mts", "Yoron": "yox", "Yorta Yorta": "xyy", "Yoruba": "yo", "Yosondúa Mixtec": "mpm", "Youle Jinuo": "jiu", "Younuo Bunu": "buh", "Yout Wam": "ytw", "Yoy": "yoy", "Yuaga": "nua", "Yucatec Maya": "yua", "Yucatec Maya Sign Language": "msd", "Yuchi": "yuc", "Yucuañe Mixtec": "mvg", "Yucuna": "ycn", "Yug": "yug", "Yugambal": "yub", "Yugoslavian Sign Language": "ysl", "Yugul": "ygu", "Yuhup": "yab", "Yuki": "yuk", "Yukpa": "yup", "Yukuben": "ybl", "Yulu": "yul", "Yuma": "yum", "Yumana": "awd-yum", "Yup'ik": "esu", "Yupiltepeque": "nai-yup", "Yupua": "sai-yup", "Yuqui": "yuq", "Yuracare": "yuz", "Yuri": "sai-yri", "Yurok": "yur", "Yuru": "ljx", "Yurumanguí": "sai-yur", "Yurutí": "yui", "Yutanduchi Mixtec": "mab", "Yuwana": "yau", "Yuyu": "yxu", "Yámana": "yag", "Zaachila Zapotec": "ztx", "Zabana": "kji", "Zacatepec Chatino": "ctz", "Zacatlán-Ahuacatlán-Tepetzintla Nahuatl": "nhi", "Zaghawa": "zag", "Zaiwa": "atb", "Zakhring": "zkr", "Zambian Sign Language": "zsl", "Zan Gula": "zna", "Zanaki": "zak", "Zande": "zne", "Zangskari": "zau", "Zangwal": "zah", "Zaniza Zapotec": "zpw", "Zapotec": "zap", "Zaramo": "zaj", "Zari": "zaz", "Zarma": "dje", "Zauzou": "zal", "Zay": "zwa", "Zayein Karen": "kxk", "Zayse-Zergulla": "zay", "Zazaki": "zza", "Zazao": "jaj", "Zbu": "sit-zbu", "Zealandic": "zea", "Zeem": "zua", "Zemba": "dhm", "Zeme Naga": "nzm", "Zemgalian": "xzm", "Zenag": "zeg", "Zenaga": "zen", "Zenzontepec Chatino": "czn", "Zhaba": "zhb", "Zhang-Zhung": "xzh", "Zhire": "zhi", "Zhoa": "zhw", "Zhuang": "za", "Zhár": "jjr", "Zia": "zia", "Zialo": "zil", "Zigula": "ziw", "Zimakani": "zik", "Zimba": "zmb", "Zimbabwe Sign Language": "zib", "Zinza": "zin", "Zipser German": "gmw-zps", "Zire": "sih", "Zirenkel": "zrn", "Ziriya": "zir", "Zizilivakan": "ziz", "Zo'é": "pto", "Zokhuo": "yzk", "Zoogocho Zapotec": "zpq", "Zotung Chin": "czt", "Zou": "zom", "Zulgo-Gemzek": "gnd", "Zulu": "zu", "Zumaya": "zuy", "Zumbun": "jmb", "Zuni": "zun", "Zuojiang Zhuang": "zzj", "Zuwara": "ber-zuw", "Zyphe": "zyp", "Záparo": "zro", "Àhàn": "ahn", "Áncá": "acb", "Ömie": "aom", "Önge": "oon", "ǀXam": "xam", "ǁAni": "hnh", "ǁGana": "gnk", "ǁXegwi": "xeg", "ǂHoan": "huc", "ǃKung": "khi-kun", "ǃXóõ": "nmn" } mxni5hnbpxf0opkjpcj0zg6678fp4v2 मॉड्यूल:wikimedia languages 828 304697 487858 477708 2026-09-02T20:55:17Z SM7 6218 updating... 487858 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 मॉड्यूल:wikimedia languages/data 828 304698 487859 477709 2026-09-02T20:55:51Z SM7 6218 updating... 487859 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 मॉड्यूल:writing systems/data 828 304772 487854 477919 2026-09-02T20:26:17Z SM7 6218 updating... 487854 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 साँचा:no deprecated lang param usage 10 304797 487751 478013 2026-09-02T15:06:23Z SM7 6218 487751 wikitext text/x-wiki <onlyinclude>{{{1|}}}</onlyinclude>{{documentation}} r4cd6eb8p4xjus4wmk4qvx6l1j575js मॉड्यूल:langues/data 828 304860 487881 478542 2026-09-03T10:15:55Z SM7 6218 updating... 487881 Scribunto text/plain -- Page de vérification : Wiktionnaire:Liste des langues/Liste automatique local l = {} -- Langues l['a’ou de Bigong'] = { nom = 'a’ou de Bigong' } l['a’ou de Hongfeng'] = { nom = 'a’ou de Hongfeng' } l['aa'] = { nom = 'afar', wiktionnaire = true } l['aaa'] = { nom = 'ghotuo' } l['aab'] = { nom = 'alumu-tesu' } l['aac'] = { nom = 'ari' } l['aad'] = { nom = 'amal' } l['aae'] = { nom = 'arbërisht' } l['aaf'] = { nom = 'aranadan' } l['aag'] = { nom = 'ambrak' } l['aah'] = { nom = 'abu’' } l['aai'] = { nom = 'arifama-miniafia' } l['aak'] = { nom = 'ankave' } l['aal'] = { nom = 'afade' } l['aam'] = { nom = 'aramanik' } l['aan'] = { nom = 'anambé' } l['aao'] = { nom = 'arabe saharien' } l['aap'] = { nom = 'arara' } l['aaq'] = { nom = 'abénaquis de l’Est' } l['aas'] = { nom = 'aasá' } l['aat'] = { nom = 'albanais arvanite' } l['aau'] = { nom = 'abau' } l['aav'] = { nom = 'langues austro-asiatiques', tri = 'austro asiatiques langues' } l['aaw'] = { nom = 'arawé' } l['aax'] = { nom = 'atas de Mandobo' } l['aaz'] = { nom = 'amarasi' } l['ab'] = { nom = 'abkhaze', wiktionnaire = true } l['aba'] = { nom = 'abé' } l['abai sembuak'] = { nom = 'abai sembuak' } l['abai tubu'] = { nom = 'abai tubu' } l['abb'] = { nom = 'bankon' } l['abc'] = { nom = 'ambala' } l['abd'] = { nom = 'manide' } l['abe'] = { nom = 'abénaquis de l’Ouest' } l['abf'] = { nom = 'abaï soungaï' } l['abg'] = { nom = 'abaga' } l['abh'] = { nom = 'arabe tadjik' } l['abi'] = { nom = 'abidji' } l['abj'] = { nom = 'aka-bea' } l['abl'] = { nom = 'abung' } l['abm'] = { nom = 'abanyom' } l['abn'] = { nom = 'abua' } l['abo'] = { nom = 'abon' } l['abp'] = { nom = 'abellen' } l['abq'] = { nom = 'abaza' } l['abr'] = { nom = 'abron' } l['abs'] = { nom = 'malais ambonais' } l['abt'] = { nom = 'ambulas' } l['abu'] = { nom = 'abouré' } l['abv'] = { nom = 'arabe baharna' } l['abx'] = { nom = 'abaknon' } l['aby'] = { nom = 'aneme wake' } l['abz'] = { nom = 'abui' } l['aca'] = { nom = 'achagua' } l['acd'] = { nom = 'gichode' } l['ace'] = { nom = 'achinais' } l['acf'] = { nom = 'créole sainte-lucien' } l['ach'] = { nom = 'acoli' } l['aci'] = { nom = 'aka-cari' } l['ack'] = { nom = 'aka-kora' } l['acl'] = { nom = 'akar-bale' } l['acm'] = { nom = 'arabe irakien' } l['acn'] = { nom = 'achang' } l['acp'] = { nom = 'acipa de l’Est' } l['acq'] = { nom = 'arabe Ta’izzi-Adeni' } l['acr'] = { nom = 'achi' } l['acs'] = { nom = 'acroá' } l['act'] = { nom = 'achterhooks' } l['acu'] = { nom = 'achuar' } l['acv'] = { nom = 'achumawi' } l['acy'] = { nom = 'arabe chypriote' } l['acz'] = { nom = 'acheron' } l['ada'] = { nom = 'adangmé' } l['add'] = { nom = 'dzodinka' } l['ade'] = { nom = 'adele' } l['adi'] = { nom = 'adi' } l['adj'] = { nom = 'adioukrou' } l['adl'] = { nom = 'galo' } l['adn'] = { nom = 'adang' } l['adp'] = { nom = 'adap' } l['adq'] = { nom = 'adangbé' } l['ads'] = { nom = 'langue des signes adamorobe', tri = 'signes adamorobe' } l['adt'] = { nom = 'adnyamathanha' } l['adu'] = { nom = 'aduge' } l['adw'] = { nom = 'amundava' } l['adx'] = { nom = 'amdo' } l['ady'] = { nom = 'adyghé' } l['adz'] = { nom = 'adzera' } l['ae'] = { nom = 'avestique' } l['aeb'] = { nom = 'arabe tunisien' } l['aec'] = { nom = 'arabe saïdi' } l['aek'] = { nom = 'haéké' } l['ael'] = { nom = 'ambele' } l['aem'] = { nom = 'arem' } l['aer'] = { nom = 'arrernte de l’Est' } l['aes'] = { nom = 'alsea' } l['aew'] = { nom = 'ambakich' } l['aey'] = { nom = 'amélé' } l['aez'] = { nom = 'aeka' } l['af'] = { nom = 'afrikaans', wiktionnaire = true } l['afa'] = { nom = 'langues afro-asiatiques', tri = 'afro asiatiques langues' } l['afb'] = { nom = 'arabe du Golfe', tri = 'arabe golfe' } l['afh'] = { nom = 'afrihili' } l['afi'] = { nom = 'akrukay' } l['afn'] = { nom = 'défaka' } l['afo'] = { nom = 'éloyi', tri = 'eloyi' } l['afp'] = { nom = 'tapei' } l['aft'] = { nom = 'afitti' } l['afz'] = { nom = 'obokuitai' } l['aga'] = { nom = 'aguano' } l['agc'] = { nom = 'agatu' } l['age'] = { nom = 'angal' } l['agg'] = { nom = 'angor' } l['agj'] = { nom = 'argobba' } l['agl'] = { nom = 'fembe' } l['agm'] = { nom = 'angaataha' } l['agn'] = { nom = 'agutaynen' } l['ago'] = { nom = 'tainae' } l['agq'] = { nom = 'aghem' } l['agr'] = { nom = 'aguaruna' } l['ags'] = { nom = 'ésimbi', tri = 'esimbi' } l['agt'] = { nom = 'agta du Cagayan central', tri = 'agta Cagayan central' } l['agta de Dinapigue'] = { nom = 'agta de Dinapigue', tri = 'agta Dinapigue' } l['agta de Nagtipunan'] = { nom = 'agta de Nagtipunan', tri = 'agta Nagtipunan' } l['agu'] = { nom = 'aguacatèque' } l['agx'] = { nom = 'aghoul' } l['agy'] = { nom = 'alta du Sud' } l['aha'] = { nom = 'ahanta' } l['ahb'] = { nom = 'axamb' } l['ahg'] = { nom = 'qimant' } l['ahi'] = { nom = 'aïzi de Tiagbamrin' } l['ahk'] = { nom = 'akha' } l['ahl'] = { nom = 'igo' } l['ahn'] = { nom = 'àhàn', tri = 'ahan' } l['aho'] = { nom = 'ahom' } l['ahp'] = { nom = 'aïzi d’Aproumu' } l['ahs'] = { nom = 'ashe' } l['aht'] = { nom = 'ahtna' } l['aia'] = { nom = 'arosi' } l['aib'] = { nom = 'aïnou (Chine)' } l['aid'] = { nom = 'alngith' } l['aie'] = { nom = 'amara' } l['aif'] = { nom = 'agi' } l['aig'] = { nom = 'créole anglais d’Antigua-et-Barbuda', tri = 'creole antigua et barbuda anglais' } l['aih'] = { nom = 'ai-cham' } l['aii'] = { nom = 'néo-araméen assyrien', tri = 'arameen neo assyrien' } l['aij'] = { nom = 'lishanid noshan' } l['aik'] = { nom = 'akyé' } l['ail'] = { nom = 'aimele' } l['aim'] = { nom = 'aimol' } l['ain'] = { nom = 'aïnou (Japon)' } l['air'] = { nom = 'airoran' } l['ais'] = { nom = 'nataoran' } l['ait'] = { nom = 'arikém' } l['aiw'] = { nom = 'aari' } l['aix'] = { nom = 'aighon' } l['aiy'] = { nom = 'ali' } l['aiz'] = { nom = 'aari-gayil' } l['aja'] = { nom = 'aja' } l['ajg'] = { nom = 'ajagbe' } l['aji'] = { nom = 'ajië' } l['ajt'] = { nom = 'judéo-tunisien' } l['aju'] = { nom = 'judéo-marocain' } l['ajw'] = { nom = 'ajawa' } l['ak'] = { nom = 'akan', wiktionnaire = true } l['akc'] = { nom = 'mpur' } l['ake'] = { nom = 'akawaïo' } l['akf'] = { nom = 'akpa' } l['aki'] = { nom = 'aiome' } l['akj'] = { nom = 'aka-jeru' } l['akk'] = { nom = 'akkadien' } l['akl'] = { nom = 'aklanon' } l['akm'] = { nom = 'aka-bo' } l['ako'] = { nom = 'akurio' } l['akp'] = { nom = 'siwu' } l['akr'] = { nom = 'araki' } l['aks'] = { nom = 'akaselem' } l['aku'] = { nom = 'akum' } l['akv'] = { nom = 'akhvakh' } l['akx'] = { nom = 'aka-kede' } l['aky'] = { nom = 'aka-kol' } l['akz'] = { nom = 'alabama' } l['ala'] = { nom = 'alago' } l['alc'] = { nom = 'kawésqar' } l['ald'] = { nom = 'alladian' } l['ale'] = { nom = 'aléoute' } l['alg'] = { nom = 'langues algonquiennes', tri = 'algonquiennes langues' } l['alh'] = { nom = 'alawa' } l['ali'] = { nom = 'amaimon' } l['alk'] = { nom = 'alak' } l['all'] = { nom = 'allar' } l['alm'] = { nom = 'amblong' } l['aln'] = { nom = 'guègue' } l['alo'] = { nom = 'larike-wakasihu' } l['alp'] = { nom = 'alune' } l['alq'] = { nom = 'algonquin' } l['alr'] = { nom = 'alioutor' } l['als'] = { nom = 'albanais tosk' } l['alt'] = { nom = 'altaï du Sud' } l['alu'] = { nom = '’are’are', tri = 'are are' } l['alv'] = { nom = 'langues atlantico-congolaises', tri = 'atlantico congolaises langues' } l['alx'] = { nom = 'amol' } l['aly'] = { nom = 'alyawarr' } l['am'] = { nom = 'amharique', wiktionnaire = true } l['ama'] = { nom = 'amanayé' } l['amb'] = { nom = 'ambo' } l['amc'] = { nom = 'amahuaca' } l['ame'] = { nom = 'yanesha' } l['amf'] = { nom = 'hamar' } l['amg'] = { nom = 'amurdak' } l['ami'] = { nom = 'amis' } l['amj'] = { nom = 'amdang' } l['amk'] = { nom = 'ambai' } l['aml'] = { nom = 'war-jaintia' } l['amm'] = { nom = 'ama (Papouasie-Nouvelle-Guinée)' } l['ammonite'] = { nom = 'ammonite' } l['amn'] = { nom = 'amanab' } l['amo'] = { nom = 'amo' } l['amp'] = { nom = 'alamblak' } l['amq'] = { nom = 'amahai' } l['amr'] = { nom = 'amarakaeri' } l['ams'] = { nom = 'amami du Sud' } l['amt'] = { nom = 'amto' } l['amu'] = { nom = 'amuzgo du Guerrero', tri = 'amuzgo Guerrero' } l['amw'] = { nom = 'néo-araméen occidental', tri = 'arameen neo occidental' } l['amx'] = { nom = 'anmatyerre' } l['amy'] = { nom = 'ami' } l['an'] = { nom = 'aragonais', wiktionnaire = true } l['ana'] = { nom = 'andaquí' } l['anauyá'] = { nom = 'anauyá' } l['anb'] = { nom = 'andoa' } l['anc'] = { nom = 'angas' } l['and'] = { nom = 'ansus' } l['ane'] = { nom = 'xârâcùù' } l['anf'] = { nom = 'animere' } l['ang'] = { nom = 'vieil anglais', wiktionnaire = true } l['angevin'] = { nom = 'angevin' } l['anggreso'] = { nom = 'anggreso' } l['anh'] = { nom = 'nend' } l['ani'] = { nom = 'andi' } l['ank'] = { nom = 'ankwé' } l['ann'] = { nom = 'obolo' } l['ano'] = { nom = 'andoque' } l['anp'] = { nom = 'angika' } l['anq'] = { nom = 'jarawa (îles Andaman)', tri = 'jarawa andaman' } l['ans'] = { nom = 'anserma' } l['ant'] = { nom = 'antakarinya' } l['anu'] = { nom = 'anyua' } l['anv'] = { nom = 'denya' } l['anw'] = { nom = 'anang' } l['any'] = { nom = 'agni' } l['aoa'] = { nom = 'angolar' } l['aob'] = { nom = 'abom' } l['aoc'] = { nom = 'pemon' } l['aof'] = { nom = 'bragat' } l['aog'] = { nom = 'angoram' } l['aoh'] = { nom = 'arma' } l['aoi'] = { nom = 'anindilyakwa' } l['aoj'] = { nom = 'mufian' } l['aom'] = { nom = 'ömie' } l['aor'] = { nom = 'aore' } l['ao mongsen'] = { nom = 'ao mongsen' } l['aos'] = { nom = 'taikat' } l['aot'] = { nom = 'a’tong' } l['aou'] = { nom = 'a’ou' } l['aoz'] = { nom = 'atoni' } l['apa'] = { nom = 'langues apaches', tri = 'apaches langues' } l['apb'] = { nom = 'sa’a' } l['apc'] = { nom = 'arabe levantin' } l['apd'] = { nom = 'arabe soudanais' } l['ape'] = { nom = 'bukiyip' } l['apf'] = { nom = 'agta de Pahanan', tri = 'agta Pahanan' } l['aph'] = { nom = 'athpariya' } l['api'] = { nom = 'apiaká' } l['apj'] = { nom = 'jicarilla' } l['apk'] = { nom = 'apache des Plaines' } l['apl'] = { nom = 'lipan' } l['apm'] = { nom = 'chiricahua' } l['apn'] = { nom = 'apinajé' } l['apo'] = { nom = 'apalik' } l['apolista'] = { nom = 'apolista' } l['app'] = { nom = 'apma' } l['apq'] = { nom = 'pucikwar' } l['apr'] = { nom = 'arop-lokep' } l['aps'] = { nom = 'arop-sissano' } l['apt'] = { nom = 'apatani' } l['apu'] = { nom = 'apurinã' } l['apw'] = { nom = 'apache de l’Ouest' } l['apx'] = { nom = 'aputai' } l['apy'] = { nom = 'apalai' } l['apz'] = { nom = 'safeyoka' } l['aqa'] = { nom = 'langues alacalufanes', tri = 'alacalufanes langues' } l['aqc'] = { nom = 'artchi' } l['aqd'] = { nom = 'ampari' } l['aql'] = { nom = 'langues algiques', tri = 'algiques langues' } l['aqn'] = { nom = 'alta du Nord' } l['aqp'] = { nom = 'atakapa' } l['aqt'] = { nom = 'angaité' } l['aqz'] = { nom = 'akuntsu' } l['ar'] = { nom = 'arabe', wiktionnaire = true } l['arb'] = { nom = 'arabe standard moderne' } l['arc'] = { nom = 'araméen' } l['ard'] = { nom = 'arabana' } l['are'] = { nom = 'arrernte de l’Ouest' } l['arh'] = { nom = 'arhuaco' } l['ari'] = { nom = 'arikara' } l['ark'] = { nom = 'arikapú' } l['arl'] = { nom = 'arabela' } l['arn'] = { nom = 'mapuche' } l['aro'] = { nom = 'araona' } l['arp'] = { nom = 'arapaho' } l['arq'] = { nom = 'arabe algérien' } l['arr'] = { nom = 'karo (Brésil)' } l['ars'] = { nom = 'arabe najdi' } l['art'] = { nom = 'langues artificielles', tri = 'artificielles langues' } l['aru'] = { nom = 'arawá' } l['arv'] = { nom = 'arbore' } l['arw'] = { nom = 'arawak' } l['arx'] = { nom = 'aruá' } l['ary'] = { nom = 'arabe marocain' } l['arz'] = { nom = 'arabe égyptien' } l['as'] = { nom = 'assamais', wiktionnaire = true } l['asa'] = { nom = 'asu (Tanzanie)' } l['asb'] = { nom = 'assiniboine' } l['asd'] = { nom = 'asas' } l['ase'] = { nom = 'langue des signes américaine', tri = 'signes americaine' } l['asf'] = { nom = 'langue des signes australienne', tri = 'signes australienne' } l['ash'] = { nom = 'abishira' } l['asi'] = { nom = 'buruwai' } l['asj'] = { nom = 'nsari' } l['ask'] = { nom = 'ashkun' } l['asl'] = { nom = 'asilulu' } l['asn'] = { nom = 'asuriní de Xingú', tri = 'asuriní Xingú' } l['aso'] = { nom = 'dano' } l['asp'] = { nom = 'langue des signes algérienne', tri = 'signes algerienne' } l['ass'] = { nom = 'ipulo' } l['ast'] = { nom = 'asturien', wiktionnaire = true } l['asu'] = { nom = 'asuriní du Tocantins', tri = 'asuriní Tocantins' } l['asv'] = { nom = 'asoa' } l['asx'] = { nom = 'muratayak' } l['ata'] = { nom = 'pele-ata' } l['atb'] = { nom = 'zaiwa' } l['atc'] = { nom = 'atsahuaca' } l['atd'] = { nom = 'manobo d’Ata', tri = 'manobo ata' } l['ate'] = { nom = 'atemble' } l['ath'] = { nom = 'langues athapascanes', tri = 'athapascanes langues' } l['ati'] = { nom = 'attié' } l['atj'] = { nom = 'atikamekw' } l['atl'] = { nom = 'agta du mont Iraya', tri = 'agta Iraya' } l['atm'] = { nom = 'ata' } l['ato'] = { nom = 'atong' } l['atp'] = { nom = 'atta de Pudtol' } l['atq'] = { nom = 'atohwaim' } l['atr'] = { nom = 'waimiri-atroari' } l['ats'] = { nom = 'atsina' } l['att'] = { nom = 'atta de Pamplona' } l['atu'] = { nom = 'reel' } l['atv'] = { nom = 'altaï du Nord' } l['atw'] = { nom = 'atsugewi' } l['atx'] = { nom = 'arutani' } l['aty'] = { nom = 'anejom' } l['atz'] = { nom = 'arta' } l['aua'] = { nom = 'asumboa' } l['auc'] = { nom = 'huaorani' } l['aud'] = { nom = 'anuta' } l['aue'] = { nom = 'kung-gobabis' } l['auf'] = { nom = 'langues arauanes', tri = 'arauanes langues' } l['aug'] = { nom = 'agouna' } l['auh'] = { nom = 'aushi' } l['aui'] = { nom = 'anuki' } l['auj'] = { nom = 'awjilah' } l['auk'] = { nom = 'heyo' } l['aul'] = { nom = 'aulua' } l['aum'] = { nom = 'asu (Nigeria)' } l['aun'] = { nom = 'one de Molmo', tri = 'one molmo' } l['aur'] = { nom = 'aruek' } l['aus'] = { nom = 'langues australiennes', tri = 'australiennes langues' } l['aut'] = { nom = 'austral' } l['auu'] = { nom = 'auye' } l['auw'] = { nom = 'awyi' } l['aux'] = { nom = 'aurá' } l['auy'] = { nom = 'auyana' } l['av'] = { nom = 'avar', wiktionnaire = true } l['avb'] = { nom = 'avau' } l['avd'] = { nom = 'alviri-vidari' } l['avi'] = { nom = 'avikam' } l['avk'] = { nom = 'kotava' } l['avl'] = { nom = 'arabe bedawi' } l['avn'] = { nom = 'avatime' } l['avo'] = { nom = 'agavotaguerra' } l['avok'] = { nom = 'avok' } l['avs'] = { nom = 'aushiri' } l['avt'] = { nom = 'au' } l['avu'] = { nom = 'avokaya' } l['avv'] = { nom = 'avá-canoeiro' } l['awa'] = { nom = 'awadhi' } l['awb'] = { nom = 'awa (papou)' } l['awc'] = { nom = 'cicipu' } l['awd'] = { nom = 'langues arawakes', tri = 'arawakes langues' } l['awe'] = { nom = 'aweti' } l['awg'] = { nom = 'anguthimri' } l['awh'] = { nom = 'awbono' } l['awi'] = { nom = 'aekyom' } l['awk'] = { nom = 'awabakal' } l['awm'] = { nom = 'arawum' } l['awn'] = { nom = 'awngi' } l['awo'] = { nom = 'awak' } l['awr'] = { nom = 'awera' } l['aws'] = { nom = 'aghu du Sud', tri = 'aghu Sud' } l['awt'] = { nom = 'araweté' } l['awu'] = { nom = 'aghu central' } l['awv'] = { nom = 'aghu de Jair', tri = 'aghu Jair' } l['aww'] = { nom = 'awun' } l['awx'] = { nom = 'awara' } l['awy'] = { nom = 'aghu d’Edera', tri = 'aghu Edera' } l['axb'] = { nom = 'abipón' } l['axe'] = { nom = 'ayerrerenge' } l['axg'] = { nom = 'arara de Mato Grosso' } l['axx'] = { nom = 'xaragure' } l['ay'] = { nom = 'aymara', wiktionnaire = true } l['aya'] = { nom = 'awar' } l['ayd'] = { nom = 'ayabadhu' } l['aye'] = { nom = 'ayere' } l['ayi'] = { nom = 'leyigha' } l['ayl'] = { nom = 'arabe libyen' } l['ayn'] = { nom = 'arabe sanaani' } l['ayo'] = { nom = 'ayoreo' } l['ayu'] = { nom = 'ayu' } l['ayz'] = { nom = 'mai brat' } l['az'] = { nom = 'azéri', wiktionnaire = true } l['aza'] = { nom = 'azha' } l['azb'] = { nom = 'azéri du Sud' } l['azb-afs'] = { nom = 'afchar' } l['azc'] = { nom = 'langues uto-aztèques', tri = 'uto azteques langues' } l['azg'] = { nom = 'amuzgo de San Pedro Amuzgos', tri = 'amuzgo San Pedro Amuzgos' } l['azj'] = { nom = 'azéri du Nord' } l['azo'] = { nom = 'awing' } l['azz'] = { nom = 'nahuatl du haut Puebla', tri = 'nahuatl Puebla haut' } l['ba'] = { nom = 'bachkir' } l['baa'] = { nom = 'babatana' } l['bac'] = { nom = 'baduy' } l['bad'] = { nom = 'langues bandas', tri = 'bandas langues' } l['bae'] = { nom = 'baré' } l['baf'] = { nom = 'nubaca' } l['bag'] = { nom = 'tuki' } l['bah'] = { nom = 'créole bahamien' } l['bai'] = { nom = 'langues bamilékées', tri = 'bamilekees langues' } l['baisha'] = { nom = 'baisha' } l['bal'] = { nom = 'baloutche' } l['ban'] = { nom = 'balinais' } l['bana'] = { nom = 'bana (Chine)' } l['bangru'] = { nom = 'bangru' } l['bao'] = { nom = 'bara' } l['baoting'] = { nom = 'baoting' } l['bap'] = { nom = 'bantawa' } l['bar'] = { nom = 'bavarois' } l['barngala'] = { nom = 'barngala' } l['barranbinya'] = { nom = 'barranbinya' } l['bas'] = { nom = 'bassa (Cameroun)' } l['basco-algonquin'] = { nom = 'basco-algonquin' } l['basco-islandais'] = { nom = 'basco-islandais' } l['bat'] = { nom = 'langues baltes', tri = 'baltes langues' } l['bav'] = { nom = 'babungo' } l['baw'] = { nom = 'bambili-bambui' } l['bax'] = { nom = 'bamoun' } l['bay'] = { nom = 'batuley' } l['bba'] = { nom = 'bariba' } l['bbb'] = { nom = 'barai' } l['bbc'] = { nom = 'batak toba' } l['bbd'] = { nom = 'bau' } l['bbf'] = { nom = 'baibai' } l['bbh'] = { nom = 'pakan' } l['bbi'] = { nom = 'barombi' } l['bbj'] = { nom = 'ghomala’' } l['bbl'] = { nom = 'bats' } l['bbo'] = { nom = 'konabéré' } l['bbp'] = { nom = 'banda central de l’Ouest' } l['bbr'] = { nom = 'girawa' } l['bbu'] = { nom = 'kulung (Nigeria)' } l['bbv'] = { nom = 'karnai' } l['bbw'] = { nom = 'baba' } l['bca'] = { nom = 'bai central' } l['bcb'] = { nom = 'baïnouk-samik' } l['bcc'] = { nom = 'baloutchi du Sud' } l['bcd'] = { nom = 'babar du Nord' } l['bce'] = { nom = 'mengambo' } l['bcf'] = { nom = 'bamu' } l['bcg'] = { nom = 'baga binari' } l['bch'] = { nom = 'bariai' } l['bci'] = { nom = 'baoulé' } l['bcj'] = { nom = 'bardi' } l['bck'] = { nom = 'bunuba' } l['bcl'] = { nom = 'bikol central', wiktionnaire = true } l['bcm'] = { nom = 'banoni' } l['bcn'] = { nom = 'bali' } l['bco'] = { nom = 'kaluli' } l['bcp'] = { nom = 'bali (République démocratique du Congo)', tri = 'bali congo' } l['bcq'] = { nom = 'gimira' } l['bcr'] = { nom = 'babine-witsuwit’en' } l['bcs'] = { nom = 'kohumono' } l['bct'] = { nom = 'bendi' } l['bcu'] = { nom = 'awad bing' } l['bcv'] = { nom = 'shoo-minda-nye' } l['bcw'] = { nom = 'bana (Cameroun)' } l['bcy'] = { nom = 'bacama' } l['bcz'] = { nom = 'baïnouk-gunyaamolo' } l['bda'] = { nom = 'bayot' } l['bdb'] = { nom = 'basap' } l['bdc'] = { nom = 'emberá-baudó' } l['bdd'] = { nom = 'bunama' } l['bde'] = { nom = 'bade' } l['bdf'] = { nom = 'biage' } l['bdg'] = { nom = 'bonggi' } l['bdh'] = { nom = 'baka (Soudan du Sud)', tri = 'baka soudan du sud' } l['bdj'] = { nom = 'bai (Soudan du Sud)', tri = 'bai soudan du sud' } l['bdk'] = { nom = 'boudoukh' } l['bdl'] = { nom = 'bajau indonésien' } l['bdm'] = { nom = 'boudouma' } l['bdn'] = { nom = 'baldamu' } l['bdo'] = { nom = 'morom' } l['bdp'] = { nom = 'bende' } l['bdq'] = { nom = 'bahnar' } l['bdr'] = { nom = 'bajau de la côte occidentale' } l['bds'] = { nom = 'burunge' } l['bdt'] = { nom = 'gbaya bokoto' } l['bdu'] = { nom = 'oroko' } l['bdw'] = { nom = 'baham' } l['bdy'] = { nom = 'bandjalang' } l['be'] = { nom = 'biélorusse', wiktionnaire = true } l['be-tarask'] = { nom = 'biélorusse (tarashkevitsa)' } l['bea'] = { nom = 'dunneza' } l['bec'] = { nom = 'iceve-maci' } l['bed'] = { nom = 'bedoanas' } l['bee'] = { nom = 'byangsi' } l['bef'] = { nom = 'benabena' } l['beg'] = { nom = 'belait' } l['beh'] = { nom = 'biali' } l['bei'] = { nom = 'bekati’' } l['bej'] = { nom = 'bedja' } l['bek'] = { nom = 'bebeli' } l['bem'] = { nom = 'bemba' } l['bengni'] = { nom = 'bengni' } l['beo'] = { nom = 'beami' } l['bep'] = { nom = 'besoa' } l['beq'] = { nom = 'beembe' } l['ber'] = { nom = 'langues berbères', tri = 'berberes langues' } l['berrichon'] = { nom = 'berrichon' } l['bes'] = { nom = 'besme' } l['bet'] = { nom = 'bété de Guiberoua' } l['bété'] = { nom = 'bété (Côte d’Ivoire)', tri = 'bete cote divoire' } l['betoi'] = { nom = 'betoi' } l['beu'] = { nom = 'blagar' } l['bew'] = { nom = 'betawi' } l['bey'] = { nom = 'beli (Papouasie-Nouvelle-Guinée)' } l['bex'] = { nom = 'modo' } l['bez'] = { nom = 'bena' } l['bfa'] = { nom = 'bari (Soudan du Sud)', tri = 'bari soudan du sud' } l['bfb'] = { nom = 'pauri bareli' } l['bfc'] = { nom = 'bai du Nord' } l['bfd'] = { nom = 'bafut' } l['bff'] = { nom = 'bofi' } l['bfg'] = { nom = 'busang' } l['bfi'] = { nom = 'langue des signes britannique', tri = 'signes britannique' } l['bfj'] = { nom = 'bafanji' } l['bfm'] = { nom = 'mmem' } l['bfn'] = { nom = 'bunaq' } l['bfo'] = { nom = 'birifor malba' } l['bfq'] = { nom = 'bagada' } l['bfr'] = { nom = 'bazigar' } l['bfs'] = { nom = 'bai du Sud' } l['bft'] = { nom = 'balti' } l['bfu'] = { nom = 'bunan' } l['bfw'] = { nom = 'remo' } l['bg'] = { nom = 'bulgare', wiktionnaire = true } l['bgb'] = { nom = 'bobongko' } l['bgf'] = { nom = 'bangando' } l['bgg'] = { nom = 'bugun' } l['bgj'] = { nom = 'bangolan' } l['bgk'] = { nom = 'khabit' } l['bgr'] = { nom = 'bawm' } l['bgu'] = { nom = 'mbongno' } l['bgv'] = { nom = 'warkay-bipim' } l['bgz'] = { nom = 'banggai' } l['bh'] = { nom = 'भोजपुरी', wiktionnaire = true } l['bha'] = { nom = 'bharia' } l['bhb'] = { nom = 'bhili' } l['bhc'] = { nom = 'biga' } l['bhf'] = { nom = 'odiai' } l['bhg'] = { nom = 'binandere' } l['bhi'] = { nom = 'bhilali' } l['bhj'] = { nom = 'bahing' } l['bhl'] = { nom = 'bimin' } l['bhm'] = { nom = 'bathari' } l['bhn'] = { nom = 'néo-araméen de Bohtan', tri = 'arameen neo bohtan' } l['bho'] = { nom = 'भोजपुरी' } l['bhq'] = { nom = 'tukang besi du Sud' } l['bhs'] = { nom = 'buwal' } l['bhv'] = { nom = 'bahau' } l['bhw'] = { nom = 'biak' } l['bhy'] = { nom = 'bhele' } l['bhz'] = { nom = 'bada (Indonésie)' } l['bi'] = { nom = 'bichlamar', wiktionnaire = true } l['bia'] = { nom = 'badimaya' } l['bib'] = { nom = 'bissa' } l['bic'] = { nom = 'bikaru' } l['bid'] = { nom = 'bidiyo' } l['bie'] = { nom = 'bepour' } l['bif'] = { nom = 'biafada' } l['big'] = { nom = 'biangai' } l['bij'] = { nom = 'vaghat-ya-bijim-legeri' } l['bik'] = { nom = 'bikol' } l['bil'] = { nom = 'bile' } l['bim'] = { nom = 'bimoba' } l['bin'] = { nom = 'édo', tri = 'edo' } l['bio'] = { nom = 'nai' } l['bip'] = { nom = 'bila' } l['bir'] = { nom = 'bisorio' } l['bisaya de Limbang'] = { nom = 'bisaya de Limbang' } l['biv'] = { nom = 'birifor du Sud' } l['biz'] = { nom = 'baloi' } l['bja'] = { nom = 'ebudza' } l['bjb'] = { nom = 'banggarla' } l['bjc'] = { nom = 'bariji' } l['bjg'] = { nom = 'bijogo' } l['bjh'] = { nom = 'bahinemo' } l['bji'] = { nom = 'burji' } l['bjj'] = { nom = 'kanauji' } l['bjm'] = { nom = 'bajelani' } l['bjn'] = { nom = 'banjar', wiktionnaire = true } l['bjp'] = { nom = 'fanamaket' } l['bjr'] = { nom = 'binumarien' } l['bjt'] = { nom = 'balante-ganja' } l['bjv'] = { nom = 'bedjond' } l['bjz'] = { nom = 'baruga' } l['bka'] = { nom = 'kyak' } l['bkc'] = { nom = 'baka (Cameroun-Gabon)', tri = 'baka cameroun gabon' } l['bkd'] = { nom = 'binukid' } l['bkh'] = { nom = 'bakoko' } l['bki'] = { nom = 'baki' } l['bkj'] = { nom = 'pande' } l['bkl'] = { nom = 'berik' } l['bkm'] = { nom = 'kom (Cameroun)' } l['bkn'] = { nom = 'beketan' } l['bkq'] = { nom = 'bakairí' } l['bkr'] = { nom = 'bakumpai' } l['bks'] = { nom = 'sorsoganon du Nord' } l['bkt'] = { nom = 'boloki' } l['bku'] = { nom = 'bouhid' } l['bkx'] = { nom = 'baikeno' } l['bky'] = { nom = 'bokyi' } l['bkz'] = { nom = 'bungku' } l['bla'] = { nom = 'pied-noir' } l['blb'] = { nom = 'bilua' } l['blc'] = { nom = 'nuxalk' } l['bld'] = { nom = 'bolango' } l['ble'] = { nom = 'balante-kentohe' } l['blf'] = { nom = 'buol' } l['bli'] = { nom = 'bolia' } l['blj'] = { nom = 'bolongan' } l['blk'] = { nom = 'pa’o' } l['bll'] = { nom = 'biloxi' } l['blm'] = { nom = 'beli (Soudan du Sud)', tri = 'beli soudan du sud' } l['bln'] = { nom = 'bikol du Sud de Catanduanes' } l['blo'] = { nom = 'anii' } l['blq'] = { nom = 'baluan-pam' } l['blr'] = { nom = 'blang' } l['bls'] = { nom = 'balaesang' } l['blt'] = { nom = 'tai dam' } l['blv'] = { nom = 'kibala' } l['blw'] = { nom = 'balangao' } l['bly'] = { nom = 'notre' } l['blz'] = { nom = 'balantak' } l['bm'] = { nom = 'bambara', wiktionnaire = true } l['bma'] = { nom = 'lame' } l['bmc'] = { nom = 'biem' } l['bmg'] = { nom = 'bamwe' } l['bmh'] = { nom = 'kein' } l['bmi'] = { nom = 'bagirmi' } l['bmj'] = { nom = 'bote-majhi' } l['bmk'] = { nom = 'ghayavi' } l['bmn'] = { nom = 'bina (Papouasie-Nouvelle-Guinée)' } l['bmr'] = { nom = 'muinane' } l['bmu'] = { nom = 'burum-mindik' } l['bmx'] = { nom = 'baimak' } l['bn'] = { nom = 'बंगाली', wiktionnaire = true } l['bnb'] = { nom = 'murut bookan' } l['bnc'] = { nom = 'bontok' } l['bne'] = { nom = 'bintauna' } l['bng'] = { nom = 'benga' } l['bni'] = { nom = 'bobangi' } l['bnk'] = { nom = 'bierebo' } l['bnm'] = { nom = 'batanga' } l['bnn'] = { nom = 'bunun' } l['bnp'] = { nom = 'bola (Papouasie-Nouvelle-Guinée)' } l['bnq'] = { nom = 'bantik' } l['bnr'] = { nom = 'butmas-tur' } l['bnt'] = { nom = 'langues bantoues', tri = 'bantoues langues' } l['bnv'] = { nom = 'bonerif' } l['bny'] = { nom = 'bintulu' } l['bnz'] = { nom = 'beezen' } l['bo'] = { nom = 'tibétain', wiktionnaire = true } l['boa'] = { nom = 'bora' } l['bob'] = { nom = 'aweer' } l['boe'] = { nom = 'mundabli' } l['bof'] = { nom = 'bolon' } l['bog'] = { nom = 'langue des signes malienne', tri = 'signes malienne' } l['boh'] = { nom = 'boma' } l['boi'] = { nom = 'barbareño' } l['boj'] = { nom = 'anjam' } l['bok'] = { nom = 'bonjo' } l['bokar'] = { nom = 'bokar' } l['bol'] = { nom = 'bole' } l['bolze'] = { nom = 'bolze' } l['bom'] = { nom = 'birom' } l['bon'] = { nom = 'bine' } l['bondska'] = { nom = 'bondska' } l['boo'] = { nom = 'bozo de Tiemacèwè' } l['boq'] = { nom = 'bogaya' } l['bor'] = { nom = 'bororo' } l['bot'] = { nom = 'bongo' } l['botnien'] = { nom = 'botnien' } l['bou'] = { nom = 'bondei' } l['bouhin'] = { nom = 'bouhin' } l['bourbonnais'] = { nom = 'bourbonnais' } l['bourguignon'] = { nom = 'bourguignon' } l['bov'] = { nom = 'tuwuli' } l['bow'] = { nom = 'rema' } l['box'] = { nom = 'buamu' } l['boy'] = { nom = 'bodo (République centrafricaine)', tri = 'bodo centrafrique' } l['boz'] = { nom = 'bozo-tigemaxoo' } l['bpa'] = { nom = 'daakaka' } l['bpg'] = { nom = 'bonggo' } l['bph'] = { nom = 'botlikh' } l['bpi'] = { nom = 'bagupi' } l['bpj'] = { nom = 'binji' } l['bpm'] = { nom = 'biyom' } l['bpn'] = { nom = 'dzao min' } l['bpp'] = { nom = 'kaure' } l['bpr'] = { nom = 'blaan de Koronadal' } l['bps'] = { nom = 'blaan de Sarangani' } l['bpu'] = { nom = 'bongu' } l['bpv'] = { nom = 'marind bian' } l['bpy'] = { nom = 'manipourî de Bishnupriya' } l['bqb'] = { nom = 'bagusa' } l['bqc'] = { nom = 'boko' } l['bqh'] = { nom = 'baima' } l['bqi'] = { nom = 'bakhtiari' } l['bqj'] = { nom = 'jóola banjal' } l['bqo'] = { nom = 'balo' } l['bqp'] = { nom = 'busa' } l['bqq'] = { nom = 'biritai' } l['bqr'] = { nom = 'bulusu' } l['br'] = { nom = 'breton', wiktionnaire = true } l['bra'] = { nom = 'braj' } l['brabançon'] = { nom = 'brabançon' } l['brb'] = { nom = 'lave' } l['brc'] = { nom = 'créole hollandais de Berbice', tri = 'creole berbice hollandais' } l['brd'] = { nom = 'baraadu' } l['brg'] = { nom = 'baure' } l['brh'] = { nom = 'brahui' } l['bri'] = { nom = 'mokpwe' } l['brm'] = { nom = 'barambu' } l['brn'] = { nom = 'boruca' } l['bro'] = { nom = 'brokkat' } l['brp'] = { nom = 'barapasi' } l['brt'] = { nom = 'bitare' } l['bru'] = { nom = 'bru de l’Est' } l['brv'] = { nom = 'bru de l’Ouest' } l['brw'] = { nom = 'bellari' } l['brx'] = { nom = 'bodo' } l['bry'] = { nom = 'burui' } l['bs'] = { nom = 'bosniaque', wiktionnaire = true } l['bsc'] = { nom = 'bassari' } l['bse'] = { nom = 'wushi' } l['bsg'] = { nom = 'bashkardi' } l['bsh'] = { nom = 'kati' } l['bsk'] = { nom = 'bourouchaski' } l['bsl'] = { nom = 'basa-gumna' } l['bsm'] = { nom = 'busami' } l['bsn'] = { nom = 'barasana' } l['bsr'] = { nom = 'bassa-kontagora' } l['bst'] = { nom = 'basketto' } l['bsu'] = { nom = 'bahonsuai' } l['bsw'] = { nom = 'baiso' } l['bsx'] = { nom = 'yangkam' } l['bsy'] = { nom = 'bisaya de Sabah' } l['bsz'] = { nom = 'souletin' } l['bta'] = { nom = 'bata' } l['btc'] = { nom = 'bati (Cameroun)' } l['btd'] = { nom = 'dairi' } l['btf'] = { nom = 'birguit' } l['bth'] = { nom = 'biatah bidayuh' } l['btk'] = { nom = 'langues batakes', tri = 'batakes langues' } l['btm'] = { nom = 'mandailing' } l['btp'] = { nom = 'budibud' } l['btr'] = { nom = 'baetora' } l['btu'] = { nom = 'batu' } l['btw'] = { nom = 'butuanon' } l['btx'] = { nom = 'batak karo' } l['btz'] = { nom = 'alas-kluet' } l['bua'] = { nom = 'bouriate' } l['bub'] = { nom = 'bua' } l['buc'] = { nom = 'kibushi' } l['bud'] = { nom = 'ntcham' } l['bue'] = { nom = 'béothuk' } l['buf'] = { nom = 'bushoong' } l['bug'] = { nom = 'bugis' } l['buh'] = { nom = 'younuo' } l['bui'] = { nom = 'bongili' } l['buk'] = { nom = 'bukawa' } l['bularnu'] = { nom = 'bularnu' } l['bum'] = { nom = 'boulou' } l['bun'] = { nom = 'sherbro' } l['burgonde'] = { nom = 'burgonde' } l['bus'] = { nom = 'bokobaru' } l['but'] = { nom = 'bungain' } l['buu'] = { nom = 'budu' } l['buw'] = { nom = 'bubi' } l['bux'] = { nom = 'boghom' } l['buy'] = { nom = 'bullom so' } l['buz'] = { nom = 'bukwen' } l['bva'] = { nom = 'baraïn' } l['bvb'] = { nom = 'bube' } l['bvj'] = { nom = 'ogoi' } l['bvk'] = { nom = 'bukat' } l['bvo'] = { nom = 'bolgo' } l['bvp'] = { nom = 'bumang' } l['bvq'] = { nom = 'birri' } l['bvt'] = { nom = 'bati (Indonésie)' } l['bvu'] = { nom = 'bukit' } l['bvv'] = { nom = 'baniva' } l['bvw'] = { nom = 'boga' } l['bvx'] = { nom = 'dibole' } l['bvy'] = { nom = 'utudnon' } l['bvz'] = { nom = 'bauzi' } l['bwa'] = { nom = 'bwatoo' } l['bwb'] = { nom = 'namosi-naitasiri-serua' } l['bwc'] = { nom = 'bwile' } l['bwd'] = { nom = 'bwaidoka' } l['bwe'] = { nom = 'bwe' } l['bwf'] = { nom = 'boselewa' } l['bwg'] = { nom = 'barwe' } l['bwh'] = { nom = 'bishuo' } l['bwi'] = { nom = 'baniwa' } l['bwj'] = { nom = 'bwamu laa' } l['bwk'] = { nom = 'bauwaki' } l['bwl'] = { nom = 'ebwela' } l['bwm'] = { nom = 'biwat' } l['bwn'] = { nom = 'wunai bunu' } l['bwo'] = { nom = 'shinasha' } l['bwp'] = { nom = 'bawah de Mandobo' } l['bwq'] = { nom = 'bobo madaré du Sud' } l['bwr'] = { nom = 'babur' } l['bws'] = { nom = 'bomboma' } l['bwt'] = { nom = 'bafaw-balong' } l['bwu'] = { nom = 'buli (Ghana)' } l['bww'] = { nom = 'bwa' } l['bwx'] = { nom = 'dongnu de Dahua' } l['bwx-bun'] = { nom = 'bunuo' } l['bwx-nao'] = { nom = 'naoklao' } l['bwx-num'] = { nom = 'numao' } l['bwx-nun'] = { nom = 'nunu de Lingyun' } l['bwy'] = { nom = 'bwamu cwi' } l['bwz'] = { nom = 'bwisi' } l['bxb'] = { nom = 'belanda boor' } l['bxd'] = { nom = 'bola (Chine)' } l['bxe'] = { nom = 'ongota' } l['bxf'] = { nom = 'bilur' } l['bxg'] = { nom = 'bangala' } l['bxi'] = { nom = 'pirlatapa' } l['bxj'] = { nom = 'bayungu' } l['bxk'] = { nom = 'bukusu' } l['bxl'] = { nom = 'jalkunan' } l['bxn'] = { nom = 'burduna' } l['bxq'] = { nom = 'beele' } l['bqx'] = { nom = 'bele' } l['bxr'] = { nom = 'bouriate de Russie' } l['bxs'] = { nom = 'busam' } l['bxu-bar'] = { nom = 'bargu' } l['bxw'] = { nom = 'bankagooma' } l['byd'] = { nom = 'benyadu’' } l['bye'] = { nom = 'pouye' } l['byf'] = { nom = 'bété (Nigeria)' } l['byn'] = { nom = 'bilen' } l['byo'] = { nom = 'biyo' } l['byq'] = { nom = 'basay' } l['byr'] = { nom = 'baruya' } l['byt'] = { nom = 'berti' } l['byv'] = { nom = 'medumba' } l['byz'] = { nom = 'banaro' } l['bza'] = { nom = 'bandi' } l['bzb'] = { nom = 'andio' } l['bzc'] = { nom = 'malgache betsimisaraka du Sud' } l['bzd'] = { nom = 'bribri' } l['bze'] = { nom = 'bozo-djenama' } l['bzf'] = { nom = 'boikin' } l['bzg'] = { nom = 'babuza' } l['bzh'] = { nom = 'buang mapos' } l['bzi'] = { nom = 'bisu' } l['bzj'] = { nom = 'créole bélizien' } l['bzk'] = { nom = 'créole anglais nicaraguayen', tri = 'creole nicaraguayen anglais' } l['bzl'] = { nom = 'boano (Sulawesi)' } l['bzn'] = { nom = 'boano (Maluku)' } l['bzp'] = { nom = 'kemberano' } l['bzq'] = { nom = 'buli (Indonésie)' } l['bzt'] = { nom = 'brithenig' } l['bzu'] = { nom = 'burmeso' } l['bzv'] = { nom = 'bebe' } l['bzw'] = { nom = 'basa' } l['bzx'] = { nom = 'bozo-kelengaxo' } l['bzz'] = { nom = 'evant' } l['ca'] = { nom = 'catalan', wiktionnaire = true } l['ca-valencia'] = { nom = 'valencien' } l['caa'] = { nom = 'ch’orti’' } l['cab'] = { nom = 'garifuna' } l['cac'] = { nom = 'chuj' } l['cad'] = { nom = 'caddo' } l['cae'] = { nom = 'léhar' } l['caf'] = { nom = 'porteur du Sud' } l['cag'] = { nom = 'nivaklé' } l['cai'] = { nom = 'langues centre-amérindiennes', tri = 'centre amerindiennes langues' } l['caj'] = { nom = 'chané' } l['cak'] = { nom = 'cakchiquel' } l['cal'] = { nom = 'carolinien' } l['calabrais centro-méridional'] = { nom = 'calabrais centro-méridional' } l['cam'] = { nom = 'cèmuhî' } l['can'] = { nom = 'chambri' } l['cao'] = { nom = 'chácobo' } l['cap'] = { nom = 'chipaya' } l['caq'] = { nom = 'car' } l['car'] = { nom = 'kali’na' } l['cas'] = { nom = 'tsimané' } l['catio ancien'] = { nom = 'catio ancien' } l['cau'] = { nom = 'langues caucasiennes', tri = 'caucasiennes langues' } l['cav'] = { nom = 'cavineña' } l['caw'] = { nom = 'kallawaya' } l['cax'] = { nom = 'chiquitano' } l['cay'] = { nom = 'cayuga' } l['caz'] = { nom = 'canichana' } l['cba'] = { nom = 'langues chibchas', tri = 'chibchas langues' } l['cbb'] = { nom = 'cabiyarí' } l['cbc'] = { nom = 'carapana' } l['cbd'] = { nom = 'carijona' } l['cbg'] = { nom = 'chimila' } l['cbi'] = { nom = 'cayapa' } l['cbk'] = { nom = 'chavacano' } l['cbk-zam'] = { nom = 'chavacano de Zamboanga' } l['cbn'] = { nom = 'nyahkur' } l['cbo'] = { nom = 'izora' } l['cbr'] = { nom = 'cashibo' } l['cbs'] = { nom = 'cashinahua' } l['cbt'] = { nom = 'chayahuita' } l['cbu'] = { nom = 'candoshi' } l['cbv'] = { nom = 'kakua' } l['cca'] = { nom = 'cauca' } l['ccc'] = { nom = 'chamicuro' } l['ccd'] = { nom = 'cafundó' } l['cch'] = { nom = 'atsam' } l['ccn'] = { nom = 'langues caucasiennes du Nord', tri = 'caucasiennes du nord langues' } l['cco'] = { nom = 'chinantèque de Comaltepec', tri = 'chinanteque Comaltepec' } l['ccp'] = { nom = 'changma kodha' } l['ccr'] = { nom = 'cacaopera' } l['ccs'] = { nom = 'langues caucasiennes du Sud', tri = 'caucasiennes du sud langues' } l['cdc'] = { nom = 'langues tchadiques', tri = 'tchadiques langues' } l['cdd'] = { nom = 'langues caddoanes', tri = 'caddoanes langues' } l['cde'] = { nom = 'chenchu' } l['cdf'] = { nom = 'chiru' } l['cdh'] = { nom = 'chambeali' } l['cdi'] = { nom = 'chodri' } l['cdm'] = { nom = 'chepang' } l['cdn'] = { nom = 'chaudangsi' } l['cdo'] = { nom = 'mindong' } l['cdr'] = { nom = 'kamuku' } l['cds'] = { nom = 'langue des signes tchadienne', tri = 'signes tchadienne' } l['cdy'] = { nom = 'chadong' } l['cdz'] = { nom = 'koda' } l['ce'] = { nom = 'tchétchène' } l['cea'] = { nom = 'chehalis inférieur' } l['ceb'] = { nom = 'cebuano' } l['ceg'] = { nom = 'chamacoco' } l['cel'] = { nom = 'langues celtiques', tri = 'celtiques langues' } l['celtique asturien'] = { nom = 'celtique asturien' } l['cet'] = { nom = 'jalaa' } l['cfa'] = { nom = 'dijim-bwilim' } l['cfd'] = { nom = 'cara' } l['cfm'] = { nom = 'falam' } l['cgc'] = { nom = 'kagayanen' } l['cgk'] = { nom = 'chocangacakha' } l['cgg'] = { nom = 'kiga' } l['ch'] = { nom = 'chamorro', wiktionnaire = true } l['chali'] = { nom = 'chali' } l['champenois'] = { nom = 'champenois' } l['chaná'] = { nom = 'chaná' } l['changjiang'] = { nom = 'changjiang' } l['charrúa'] = { nom = 'charrúa' } l['chb'] = { nom = 'muisca' } l['chc'] = { nom = 'catawba' } l['chd'] = { nom = 'chontal des hautes terres', tri = 'chontal hautes terres' } l['chf'] = { nom = 'chontal du Tabasco', tri = 'chontal Tabasco' } l['chg'] = { nom = 'tchaghataï' } l['chh'] = { nom = 'chinook' } l['chirino'] = { nom = 'chirino' } l['chj'] = { nom = 'chinantèque d’Ojitlán', tri = 'chinanteque Ojitlan' } l['chk'] = { nom = 'chuuk' } l['chl'] = { nom = 'cahuilla' } l['chm'] = { nom = 'mari' } l['chn'] = { nom = 'jargon chinook' } l['cho'] = { nom = 'choctaw' } l['chp'] = { nom = 'chipewyan' } l['chq'] = { nom = 'chinantèque de Quiotepec', tri = 'chinanteque Quiotepec' } l['chr'] = { nom = 'cherokee', wiktionnaire = true } l['chs'] = { nom = 'langues chumash', tri = 'chumash langues' } l['cht'] = { nom = 'cholón' } l['chw'] = { nom = 'echuwabo' } l['chy'] = { nom = 'cheyenne' } l['chz'] = { nom = 'chinantèque d’Ozumacín', tri = 'chinanteque Ozumacin' } l['cia'] = { nom = 'cia-cia' } l['cic'] = { nom = 'chickasaw' } l['cid'] = { nom = 'chimariko' } l['cie'] = { nom = 'cineni' } l['cilentain méridional'] = { nom = 'cilentain méridional' } l['cim'] = { nom = 'cimbre' } l['cin'] = { nom = 'cinta-larga' } l['cip'] = { nom = 'chiapanèque' } l['cir'] = { nom = 'tîrî' } l['ciw'] = { nom = 'chippewa' } l['ciy'] = { nom = 'chaima' } l['cja'] = { nom = 'cham occidental' } l['cje'] = { nom = 'chru' } l['cjh'] = { nom = 'chehalis supérieur' } l['cji'] = { nom = 'chamalal' } l['cjm'] = { nom = 'cham oriental' } l['cjp'] = { nom = 'cabécar' } l['cjs'] = { nom = 'chor' } l['cjv'] = { nom = 'chuave' } l['cjy'] = { nom = 'jinyu' } l['ckb'] = { nom = 'soranî', wiktionnaire = true } l['ckl'] = { nom = 'cibak' } l['ckn'] = { nom = 'kaang' } l['ckq'] = { nom = 'kadjakse' } l['cks'] = { nom = 'tayo' } l['ckt'] = { nom = 'tchouktche' } l['cku'] = { nom = 'koasati' } l['ckv'] = { nom = 'kavalan' } l['cky'] = { nom = 'cakfem-mushere' } l['cla'] = { nom = 'ron' } l['clc'] = { nom = 'chilcotin' } l['cld'] = { nom = 'néo-araméen chaldéen', tri = 'arameen neo chaldeen' } l['cle'] = { nom = 'chinantèque de San Juan Lealao', tri = 'chinanteque San Juan Lealao' } l['cli'] = { nom = 'chakali' } l['clk'] = { nom = 'idou' } l['clm'] = { nom = 'klallam' } l['clo'] = { nom = 'chontal des basses terres', tri = 'chontal basses terres' } l['clu'] = { nom = 'caluyanun' } l['cly'] = { nom = 'chatino de la Sierra orientale', tri = 'chatino sierra orientale' } l['cmc'] = { nom = 'langues chames', tri = 'chames langues' } l['cme'] = { nom = 'cerma' } l['cmg'] = { nom = 'mongol classique' } l['cmi'] = { nom = 'emberá chamí' } l['cmn'] = { nom = 'mandarin', wmlien = 'zh', wiktionnaire = true } l['cmr'] = { nom = 'mro' } l['cms'] = { nom = 'messapien' } l['cmt'] = { nom = 'camtho' } l['cnc'] = { nom = 'côông' } l['cng'] = { nom = 'qiang du Nord' } l['cnh'] = { nom = 'haka chin' } l['cni'] = { nom = 'asháninka' } l['cnk'] = { nom = 'khumi' } l['cnl'] = { nom = 'chinantèque de Lalana', tri = 'chinanteque Lalana' } l['cns'] = { nom = 'asmat central' } l['cnt'] = { nom = 'chinantèque de Tepetotutla', tri = 'chinanteque Tepetotutla' } l['cnx'] = { nom = 'moyen cornique', tri = 'cornique moyen' } l['co'] = { nom = 'corse', wiktionnaire = true } l['coa'] = { nom = 'malais des îles Cocos' } l['cob'] = { nom = 'chicomuceltec' } l['coc'] = { nom = 'cocopa' } l['cod'] = { nom = 'cocama-cocamilla' } l['coe'] = { nom = 'koreguaje' } l['cof'] = { nom = 'tsafiqui' } l['cog'] = { nom = 'chong' } l['coj'] = { nom = 'cochimi' } l['cok'] = { nom = 'cora de Santa Teresa' } l['col'] = { nom = 'salish wenatchi-columbian' } l['colac'] = { nom = 'colac' } l['com'] = { nom = 'comanche' } l['con'] = { nom = 'cofan' } l['conv'] = { nom = 'conventions internationales', wmlien = 'wikispecies', tri = '*conventions' } l['coo'] = { nom = 'comox' } l['cop'] = { nom = 'copte' } l['copallén'] = { nom = 'copallén' } l['coq'] = { nom = 'coquille' } l['cot'] = { nom = 'caquinte' } l['cou'] = { nom = 'coniagui' } l['cow'] = { nom = 'cowlitz' } l['cox'] = { nom = 'nanti' } l['coz'] = { nom = 'chocho' } l['cpa'] = { nom = 'chinantèque de Palantla', tri = 'chinanteque Palantla' } l['cpc'] = { nom = 'ajyíninka apurucayali' } l['cpe'] = { nom = 'créoles et pidgins basés sur l’anglais', tri = 'creoles et pidgins anglais' } l['cpe-spp'] = { nom = 'pidgin des plantations samoanes', tri = 'pidgin samoa plantations' } l['cpf'] = { nom = 'créoles et pidgins basés sur le français', tri = 'creoles et pidgins francais' } l['cpg'] = { nom = 'cappadocien' } l['cpi'] = { nom = 'anglais pidgin chinois', tri = 'pidgin chinois anglais' } l['cpo'] = { nom = 'kpeego' } l['cpp'] = { nom = 'créoles et pidgins basés sur le portugais', tri = 'creoles et pidgins portugais' } l['cpu'] = { nom = 'ashéninka de Pichis' } l['cpx'] = { nom = 'puxian' } l['cqd'] = { nom = 'miao chuanqiandian' } l['cr'] = { nom = 'cri', wiktionnaire = true } l['cra'] = { nom = 'chara' } l['crc'] = { nom = 'lonwolwol' } l['crd'] = { nom = 'cœur d’alène' } l['créole guadeloupéen'] = { nom = 'créole guadeloupéen' } l['créole dominiquais'] = { nom = 'créole dominiquais' } l['crf'] = { nom = 'caramanta' } l['crg'] = { nom = 'métchif' } l['crh'] = { nom = 'tatar de Crimée' } l['cri'] = { nom = 'forro' } l['crj'] = { nom = 'cri de l’Est, dialecte du Sud', tri = 'cri est dialecte sud' } l['crk'] = { nom = 'cri des plaines', tri = 'cri plaines' } l['crl'] = { nom = 'cri de l’Est, dialecte du Nord', tri = 'cri est dialecte nord' } l['crm'] = { nom = 'cri de Moose', tri = 'cri moose' } l['crn'] = { nom = 'cora d’El Nayar' } l['cro'] = { nom = 'crow' } l['crp'] = { nom = 'créoles et pidgins' } l['crq'] = { nom = 'chorote iyo’wujwa' } l['crr'] = { nom = 'algonquien de Caroline' } l['crs'] = { nom = 'créole seychellois' } l['crt'] = { nom = 'chorote iyojwa’ja' } l['crv'] = { nom = 'chaura' } l['crw'] = { nom = 'chrau' } l['crx'] = { nom = 'porteur' } l['cry'] = { nom = 'chori' } l['crz'] = { nom = 'cruzeño' } l['cs'] = { nom = 'tchèque', wiktionnaire = true } l['csa'] = { nom = 'chinantèque de Chiltepec', tri = 'chinanteque Chiltepec' } l['csb'] = { nom = 'kachoube', wiktionnaire = true } l['csc'] = { nom = 'langue des signes catalane', tri = 'signes catalane' } l['cse'] = { nom = 'langue des signes tchèque', tri = 'signes tcheque' } l['csg'] = { nom = 'langue des signes chilienne', tri = 'signes chilienne' } l['csh'] = { nom = 'asho' } l['csi'] = { nom = 'miwok de la côte', tri = 'miwok cote' } l['csk'] = { nom = 'jola-kasa' } l['csm'] = { nom = 'miwok central de la Sierra' } l['csn'] = { nom = 'langue des signes colombienne', tri = 'signes colombienne' } l['cso'] = { nom = 'chinantèque de Sochiapam', tri = 'chinanteque Sochiapam' } l['css'] = { nom = 'ohlone du Sud' } l['css-mut'] = { nom = 'mutsun' } l['css-rum'] = { nom = 'rumsen' } l['cst'] = { nom = 'awaswas' } l['cst-cha'] = { nom = 'chalon' } l['cst-cho'] = { nom = 'chochenyo' } l['csu'] = { nom = 'langues soudaniques centrales', tri = 'soudaniques centrales langues' } l['csv'] = { nom = 'sumtu chin' } l['csw'] = { nom = 'cri des marais', tri = 'cri marais' } l['csz'] = { nom = 'hanis' } l['cta'] = { nom = 'chatino de Tataltepec', tri = 'chatino Tataltepec' } l['ctc'] = { nom = 'chetco' } l['ctd'] = { nom = 'tedim' } l['cte'] = { nom = 'chinantèque de Tepinapa', tri = 'chinanteque Tepinapa' } l['ctl'] = { nom = 'chinantèque de Tlacoatzintepec', tri = 'chinanteque Tlacoatzintepec' } l['ctm'] = { nom = 'chitimacha' } l['ctn'] = { nom = 'chintang' } l['cto'] = { nom = 'emberá catío' } l['ctp'] = { nom = 'chatino de la Sierra occidentale', tri = 'chatino sierra occidentale' } l['cts'] = { nom = 'bikol du Nord de Catanduanes' } l['ctu'] = { nom = 'chol' } l['ctz'] = { nom = 'chatino de Zacatepec', tri = 'chatino Zacatepec' } l['cu'] = { nom = 'vieux slave', tri = 'slave vieux' } l['cua'] = { nom = 'cua' } l['cub'] = { nom = 'cubeo' } l['cuc'] = { nom = 'chinantèque d’Usila', tri = 'chinanteque Usila' } l['cug'] = { nom = 'cung' } l['cuh'] = { nom = 'chuka' } l['cui'] = { nom = 'cuiba' } l['cuj'] = { nom = 'mashco piro' } -- cujareño l['cuk'] = { nom = 'kuna de San Blas' } l['cul'] = { nom = 'culina' } l['culle'] = { nom = 'culle' } l['cum'] = { nom = 'cumeral' } l['cuo'] = { nom = 'cumanagoto' } l['cup'] = { nom = 'cupeño' } l['cuq'] = { nom = 'cun' } l['cus'] = { nom = 'langues couchitiques', tri = 'couchitiques langues' } l['cut'] = { nom = 'cuicatèque de Teutila', tri = 'cuicateque Teutila' } l['cuu'] = { nom = 'tay ya' } l['cuv'] = { nom = 'cuvok' } l['cux'] = { nom = 'cuicatèque de Tepeuxila', tri = 'cuicateque Tepeuxila' } l['cv'] = { nom = 'tchouvache' } l['cvg'] = { nom = 'chug' } l['cvn'] = { nom = 'chinantèque de Valle Nacional', tri = 'chinanteque Valle Nacional' } l['cwa'] = { nom = 'kabwa' } l['cwd'] = { nom = 'cri des bois', tri = 'cri bois' } l['cwe'] = { nom = 'kwere' } l['cwt'] = { nom = 'kwatay' } l['cy'] = { nom = 'gallois', wiktionnaire = true } l['cya'] = { nom = 'chatino de Nopala', tri = 'chatino Nopala' } l['cyb'] = { nom = 'cayubaba' } l['czh'] = { nom = 'huizhou' } l['czk'] = { nom = 'knaanique' } l['czn'] = { nom = 'chatino de Zenzontepec', tri = 'chatino Zenzontepec' } l['czo'] = { nom = 'minzhong' } l['da'] = { nom = 'danois', wiktionnaire = true } l['daa'] = { nom = 'dangaléat' } l['dac'] = { nom = 'dambi' } l['dad'] = { nom = 'marik' } l['dag'] = { nom = 'dagbani' } l['dah'] = { nom = 'gwahatike' } l['dai'] = { nom = 'day' } l['daj'] = { nom = 'dar fur daju' } l['dak'] = { nom = 'dakota' } l['dal'] = { nom = 'dahalo' } l['dalécarlien'] = { nom = 'dalécarlien' } l['dam'] = { nom = 'damakawa' } l['damu'] = { nom = 'damu' } l['dao'] = { nom = 'daai chin' } l['daq'] = { nom = 'maria dandami' } l['dar'] = { nom = 'dargwa' } l['dardanien'] = { nom = 'dardanien' } l['das'] = { nom = 'daho-doo' } l['dau'] = { nom = 'dadjo du Dar Sila' } l['dav'] = { nom = 'taita' } l['daw'] = { nom = 'davawenyo' } l['day'] = { nom = 'langues dayakes', tri = 'dayakes langues' } l['dba'] = { nom = 'bangeri me' } l['dbf'] = { nom = 'edopi' } l['dbg'] = { nom = 'dogul dom' } l['dbj'] = { nom = 'ida’an' } l['dbl'] = { nom = 'dyirbal' } l['dbm'] = { nom = 'duguri' } l['dbn'] = { nom = 'duriankere' } l['dbp'] = { nom = 'ɗuwai' } l['dbq'] = { nom = 'daba' } l['dbt'] = { nom = 'ben tey' } l['dbu'] = { nom = 'bondum dom' } l['dbw'] = { nom = 'bankan tey' } l['dby'] = { nom = 'dibiyaso' } l['dcr'] = { nom = 'negerhollands' } l['dda'] = { nom = 'dadi dadi' } l['ddd'] = { nom = 'dongotono' } l['dde'] = { nom = 'doondo' } l['ddg'] = { nom = 'fataluku' } l['ddi'] = { nom = 'goodenough de l’Ouest' } l['ddj'] = { nom = 'jaru' } l['ddo'] = { nom = 'tsez' } l['ddr'] = { nom = 'dhudhuroa' } l['ddw'] = { nom = 'dawera-daweloor' } l['de'] = { nom = 'allemand', portail = true, wiktionnaire = true } l['dec'] = { nom = 'dagik' } l['ded'] = { nom = 'dedua' } l['dee'] = { nom = 'dewoin' } l['def'] = { nom = 'defzuli' } l['deg'] = { nom = 'degema' } l['deh'] = { nom = 'dehwari' } l['dei'] = { nom = 'demisa' } l['del'] = { nom = 'langues delaware', tri = 'delaware langues' } l['dem'] = { nom = 'dem' } l['den'] = { nom = 'esclave' } l['dep'] = { nom = 'pidgin du Delaware', tri = 'pidgin Delaware' } l['der'] = { nom = 'deuri' } l['des'] = { nom = 'desano' } l['dev'] = { nom = 'domung' } l['dez'] = { nom = 'bondengese' } l['dga'] = { nom = 'dagaree du Sud' } l['dgb'] = { nom = 'bunoge' } l['dgc'] = { nom = 'agta de Casiguran', tri = 'agta Casiguran' } l['dgd'] = { nom = 'dagari dioula' } l['dge'] = { nom = 'degenan' } l['dgh'] = { nom = 'dghwede' } l['dgl'] = { nom = 'dongolawi' } l['dgo'] = { nom = 'dogri' } l['dgr'] = { nom = 'flanc-de-chien' } l['dgz'] = { nom = 'daga' } l['dhg'] = { nom = 'dhangu-djangu' } l['dhi'] = { nom = 'dhimal' } l['dhl'] = { nom = 'dhalandji' } l['dhr'] = { nom = 'dhargari' } l['dhs'] = { nom = 'dhaiso' } l['dhu'] = { nom = 'dhurga' } l['dhv'] = { nom = 'drehu' } l['dia'] = { nom = 'dia' } l['dib'] = { nom = 'dinka du Sud-Central' } l['dic'] = { nom = 'dida de Lakota' } l['did'] = { nom = 'didinga' } l['dif'] = { nom = 'dieri' } l['dig'] = { nom = 'digo' } l['dih'] = { nom = 'kumiai' } l['dii'] = { nom = 'dimbong' } l['dij'] = { nom = 'dai' } l['dik'] = { nom = 'dinka du Sud-Ouest' } l['dil'] = { nom = 'dilling' } l['dim'] = { nom = 'dime' } l['din'] = { nom = 'dinka' } l['dio'] = { nom = 'dibo' } l['dip'] = { nom = 'dinka du Nord-Est' } l['diq'] = { nom = 'dimli (zazaki du Sud)', wiktionnaire = true } l['dir'] = { nom = 'dirim' } l['dis'] = { nom = 'dimasa' } l['dit'] = { nom = 'dirari' } l['diu'] = { nom = 'diriku' } l['diw'] = { nom = 'dinka du Nord-Ouest' } l['dix'] = { nom = 'dixon reef' } l['diy'] = { nom = 'diuwe' } l['diz'] = { nom = 'dzing' } l['dja'] = { nom = 'djadjawurrung' } l['djb'] = { nom = 'djinba' } l['djc'] = { nom = 'dadjo' } l['djd'] = { nom = 'djamindjung' } l['dje'] = { nom = 'zarma' } l['dji'] = { nom = 'djinang' } l['djk'] = { nom = 'ndjuka' } l['djm'] = { nom = 'jamsay' } l['djr'] = { nom = 'djambarrpuyngu' } l['dju'] = { nom = 'kapriman' } l['dka'] = { nom = 'dakpakha' } l['dks'] = { nom = 'dinka du Sud-Est' } l['dlg'] = { nom = 'dolgane' } l['dlk'] = { nom = 'dahalik' } l['dlm'] = { nom = 'dalmate' } l['dma'] = { nom = 'duma' } l['dmb'] = { nom = 'mombo' } l['dmd'] = { nom = 'madhi madhi' } l['dme'] = { nom = 'dugwor' } l['dmk'] = { nom = 'domaaki' } l['dml'] = { nom = 'dameli' } l['dmn'] = { nom = 'langues mandées', tri = 'mandees langues' } l['dmo'] = { nom = 'kemedzung' } l['dmr'] = { nom = 'damar de l’Est' } l['dms'] = { nom = 'dampelas' } l['dmu'] = { nom = 'tebi' } l['dmv'] = { nom = 'dumpas' } l['dmy'] = { nom = 'demta' } l['dna'] = { nom = 'dani de Upper Grand Valley' } l['dng'] = { nom = 'doungane' } l['dni'] = { nom = 'dani de Lower Grand Valley' } l['dnj'] = { nom = 'dan' } l['dnk'] = { nom = 'dengka' } l['dnn'] = { nom = 'dzùùngoo' } l['dnr'] = { nom = 'danaru' } l['dnt'] = { nom = 'dani de Mid Grand Valley' } l['dnu'] = { nom = 'danau' } l['dnw'] = { nom = 'dani de l’Ouest' } l['dny'] = { nom = 'dení' } l['doa'] = { nom = 'dom' } l['dob'] = { nom = 'dobu' } l['doc'] = { nom = 'kam du Nord' } l['doe'] = { nom = 'doe' } l['dog'] = { nom = 'dogon' } l['doh'] = { nom = 'dong' } l['doi'] = { nom = 'dogri' } l['dok'] = { nom = 'dondo' } l['don'] = { nom = 'toura (austronésien)' } l['dongmeng'] = { nom = 'dongmeng' } l['dongnu de Du’an'] = { nom = 'dongnu de Du’an' } l['doo'] = { nom = 'dongo' } l['dor'] = { nom = 'dori’o' } l['dos'] = { nom = 'dogosé' } l['dow'] = { nom = 'dowayo' } l['dox'] = { nom = 'dobase' } l['doy'] = { nom = 'dompo' } l['doz'] = { nom = 'dorze' } l['dpp'] = { nom = 'papar' } l['dra'] = { nom = 'langues dravidiennes', tri = 'dravidiennes langues' } l['drc'] = { nom = 'minderico' } l['drd'] = { nom = 'darmiya' } l['dre'] = { nom = 'dolpo' } l['drg'] = { nom = 'rungus' } l['dri'] = { nom = 'c’lela' } l['drl'] = { nom = 'darling' } l['drn'] = { nom = 'damar de l’Ouest' } l['dro'] = { nom = 'melanau daro-matu' } l['drq'] = { nom = 'dura' } l['drs'] = { nom = 'gedeo' } l['drt'] = { nom = 'drents' } l['dru'] = { nom = 'rukai' } l['dry'] = { nom = 'darai' } l['dsb'] = { nom = 'bas-sorabe', tri = 'sorabe bas' } l['dse'] = { nom = 'langue des signes néerlandaise', tri = 'signes neerlandaise' } l['dsh'] = { nom = 'daasanach' } l['dsi'] = { nom = 'disa' } l['dsl'] = { nom = 'langue des signes danoise', tri = 'signes danoise' } l['dsn'] = { nom = 'dusner' } l['dso'] = { nom = 'desiya' } l['dsq'] = { nom = 'tadaksahak' } l['dta'] = { nom = 'daur' } l['dtb'] = { nom = 'kadazan de Labuk-Kinabatangan' } l['dtd'] = { nom = 'ditidaht' } l['dti'] = { nom = 'ana tinga' } l['dtk'] = { nom = 'tene kan' } l['dtm'] = { nom = 'tomo kan' } l['dtn'] = { nom = 'daatsʼíin' } l['dto'] = { nom = 'tommo so' } l['dtp'] = { nom = 'dusun central' } l['dtr'] = { nom = 'lotud' } l['dts'] = { nom = 'dogon toro so' } l['dtt'] = { nom = 'toro tegu' } l['dtu'] = { nom = 'tebul' } l['dty'] = { nom = 'doteli' } l['dua'] = { nom = 'douala' } l['dub'] = { nom = 'dubli' } l['duc'] = { nom = 'duna' } l['dud'] = { nom = 'hun-saare' } l['due'] = { nom = 'dumaget de l’Umiray' } l['duf'] = { nom = 'dumbéa' } l['dug'] = { nom = 'chiduruma' } l['dui'] = { nom = 'dumum' } l['duj'] = { nom = 'dhuwal' } l['duk'] = { nom = 'uyajitaya' } l['dum'] = { nom = 'moyen néerlandais', tri = 'neerlandais moyen' } l['dun'] = { nom = 'dusun deyah' } l['duo'] = { nom = 'agta de Dupaningan', tri = 'agta Dupaningan' } l['duoxu'] = { nom = 'duoxu' } l['duq'] = { nom = 'dusun malang' } l['dur'] = { nom = 'dii' } l['dus'] = { nom = 'dumi' } l['dusun du Brunéi'] = { nom = 'dusun du Brunéi', tri = 'dusun brunei' } l['dusun papar'] = { nom = 'dusun papar' } l['duu'] = { nom = 'drung' } l['duv'] = { nom = 'duvle' } l['duw'] = { nom = 'dusun witu' } l['dux'] = { nom = 'duungooma' } l['duy'] = { nom = 'agta de Dicamay', tri = 'agta Dicamay' } l['dv'] = { nom = 'divehi', wiktionnaire = true } l['dva'] = { nom = 'duau' } l['dwr'] = { nom = 'dawro' } l['dws'] = { nom = 'speedwords de Dutton' } l['dya'] = { nom = 'dyan' } l['dyd'] = { nom = 'dyugun' } l['dyi'] = { nom = 'djimini' } l['dym'] = { nom = 'yanda dom' } l['dyn'] = { nom = 'dyangadi' } l['dyo'] = { nom = 'jola-fonyi' } l['dyu'] = { nom = 'dioula' } l['dyy'] = { nom = 'tjapukai' } l['dz'] = { nom = 'dzongkha', wiktionnaire = true } l['dza'] = { nom = 'tunzu' } l['dze'] = { nom = 'djiwarli' } l['dzg'] = { nom = 'dazaga' } l['dzl'] = { nom = 'dzalakha' } l['ebg'] = { nom = 'ebughu' } l['ebk'] = { nom = 'bontok de l’Est' } l['ebo'] = { nom = 'teke-ebo' } l['ebr'] = { nom = 'ébrié' } l['ebu'] = { nom = 'kiembu' } l['ecr'] = { nom = 'étéocrétois' } l['ee'] = { nom = 'éwé' } l['eee'] = { nom = 'e' } l['efa'] = { nom = 'efai' } l['efe'] = { nom = 'efe' } l['efi'] = { nom = 'éfik', tri = 'efik' } l['ega'] = { nom = 'éga', tri = 'ega' } l['egl'] = { nom = 'émilien', wmlien = 'eml' } l['ego'] = { nom = 'eggon' } l['egx'] = { nom = 'langues égyptiennes', tri = 'egyptiennes langues' } l['egy'] = { nom = 'égyptien ancien' } l['eip'] = { nom = 'eipo' } l['eit'] = { nom = 'eitiep' } l['eja'] = { nom = 'ejamat' } l['eka'] = { nom = 'ékadjouk' } l['eke'] = { nom = 'eket' } l['ekg'] = { nom = 'ekari' } l['eki'] = { nom = 'eki' } l['ekl'] = { nom = 'kol (Bangladesh)' } l['ekm'] = { nom = 'elip' } l['eko'] = { nom = 'ekoti' } l['ekp'] = { nom = 'ekpeye' } l['ekr'] = { nom = 'yace' } l['eky'] = { nom = 'kayah li de l’Est' } l['el'] = { nom = 'grec', wiktionnaire = true } l['ele'] = { nom = 'elepi' } l['eli'] = { nom = 'nding' } l['elk'] = { nom = 'elkei' } l['elm'] = { nom = 'eleme' } l['elo'] = { nom = 'elmolo' } l['elu'] = { nom = 'elu' } l['elx'] = { nom = 'élamite' } l['ema'] = { nom = 'emai-iuleha-ora' } l['emb'] = { nom = 'embaloh' } l['eme'] = { nom = 'émérillon' } l['emg'] = { nom = 'meohang de l’Est' } l['emi'] = { nom = 'mussau' } l['emk'] = { nom = 'maninka oriental' } l['eml'] = { nom = 'émilien-romagnol', tri = 'emilien romagnol' } l['emo'] = { nom = 'emok' } l['emp'] = { nom = 'emberá darién' } l['ems'] = { nom = 'alutiiq' } l['emu'] = { nom = 'muria de l’Est' } l['emw'] = { nom = 'emplawas' } l['emx'] = { nom = 'erromintxela' } l['en'] = { nom = 'अंग्रेज़ी', wiktionnaire = true } l['ena'] = { nom = 'apali' } l['enb'] = { nom = 'markweta' } l['end'] = { nom = 'ende' } l['enf'] = { nom = 'énètse des forêts', tri = 'enetse forets' } l['enh'] = { nom = 'énètse de la toundra', tri = 'enetse toundra' } l['enl'] = { nom = 'enlhet' } l['enm'] = { nom = 'moyen anglais', tri = 'anglais moyen' } l['enn'] = { nom = 'engenni' } l['eno'] = { nom = 'enganno' } l['enq'] = { nom = 'enga' } l['enr'] = { nom = 'emumu' } l['enu'] = { nom = 'enu' } l['enw'] = { nom = 'enwan' } l['enx'] = { nom = 'enxet' } l['eo'] = { nom = 'espéranto', portail = true, wiktionnaire = true } l['eot'] = { nom = 'eotilé' } l['epi'] = { nom = 'epie' } l['èque'] = { nom = 'èque' } l['era'] = { nom = 'eravallan' } l['erg'] = { nom = 'sie' } l['eri'] = { nom = 'ogea' } l['erk'] = { nom = 'éfaté du Sud' } l['ero'] = { nom = 'horpa' } l['ers'] = { nom = 'ersu' } l['ert'] = { nom = 'eritai' } l['es'] = { nom = 'espagnol', portail = true, wiktionnaire = true } l['ese'] = { nom = 'ese ejja' } l['esh'] = { nom = 'eshtehardi' } l['esi'] = { nom = 'inupiaq d’Alaska du Nord' } l['esk'] = { nom = 'inupiaq d’Alaska du Nord-Ouest' } l['esl'] = { nom = 'langue des signes égyptienne', tri = 'signes egyptienne' } l['esm'] = { nom = 'essouma' } l['esmeraldeño'] = { nom = 'esmeraldeño' } l['eso'] = { nom = 'langue des signes estonienne', tri = 'signes estonienne' } l['esq'] = { nom = 'esselen' } l['ess'] = { nom = 'yupik sibérien central' } l['esu'] = { nom = 'yupik central' } l['esx'] = { nom = 'langues eskimo-aléoutes', tri = 'eskimo aleoutes langues' } l['et'] = { nom = 'estonien', wiktionnaire = true } l['etb'] = { nom = 'etebi' } l['etc'] = { nom = 'etchemin' } l['etn'] = { nom = 'eton (Vanuatu)' } l['eto'] = { nom = 'eton (bantou)' } l['etr'] = { nom = 'edolo' } l['ets'] = { nom = 'yekhee' } l['ett'] = { nom = 'étrusque' } l['etu'] = { nom = 'ejagham' } l['etx'] = { nom = 'eten' } l['etz'] = { nom = 'semimi' } l['eu'] = { nom = 'basque', wiktionnaire = true } l['eudeve'] = { nom = 'eudeve' } l['euq'] = { nom = 'langues basques', tri = 'basques langues' } l['eur'] = { nom = 'europanto' } l['eve'] = { nom = 'évène' } l['evn'] = { nom = 'evenki' } l['ewo'] = { nom = 'éwondo' } l['ext'] = { nom = 'estrémègne' } l['eya'] = { nom = 'eyak' } l['eyo'] = { nom = 'keyo' } l['fa'] = { nom = 'persan', wiktionnaire = true } l['faa'] = { nom = 'fasu' } l['fab'] = { nom = 'fá d’Ambô' } l['fad'] = { nom = 'wagi' } l['fag'] = { nom = 'finongan' } l['fai'] = { nom = 'faiwol' } l['faj'] = { nom = 'faita' } l['fak'] = { nom = 'fang (Cameroun)' } l['fam'] = { nom = 'fam' } l['fan'] = { nom = 'fang' } l['fap'] = { nom = 'palor' } l['far'] = { nom = 'fataleka' } l['fat'] = { nom = 'fanti' } l['fau'] = { nom = 'fayu' } l['fax'] = { nom = 'valicien' } l['fc'] = { nom = 'franc-comtois' } l['fcs'] = { nom = 'langue des signes québécoise', tri = 'signes quebecoise' } l['fer'] = { nom = 'feroge' } l['ff'] = { nom = 'peul' } l['ffg'] = { nom = 'bohurá' } l['ffi'] = { nom = 'foia foia' } l['ffm'] = { nom = 'peul du Maasina', tri = 'peul maasina' } l['fi'] = { nom = 'finnois', wiktionnaire = true } l['fia'] = { nom = 'nubien' } l['fie'] = { nom = 'fyer' } l['fil'] = { nom = 'filipino' } l['fingalien'] = { nom = 'fingalien' } l['fip'] = { nom = 'fipa' } l['fir'] = { nom = 'firan' } l['fit'] = { nom = 'finnois tornédalien' } l['fiu'] = { nom = 'langues finno-ougriennes', tri = 'finno ougriennes langues' } l['fj'] = { nom = 'fidjien', wiktionnaire = true } l['fkk'] = { nom = 'kirya-konzel' } l['fkv'] = { nom = 'kvène' } l['fla'] = { nom = 'kalispel' } l['flh'] = { nom = 'foau' } l['fln'] = { nom = 'flinders island' } l['flr'] = { nom = 'fuliiru' } l['fly'] = { nom = 'tsotsitaal' } l['fmp'] = { nom = 'fe’fe’' } l['fmu'] = { nom = 'muria occidental lointain' } l['fo'] = { nom = 'féroïen', wiktionnaire = true } l['foi'] = { nom = 'foi' } l['fon'] = { nom = 'fon' } l['for'] = { nom = 'fore' } l['fos'] = { nom = 'siraya' } l['fox'] = { nom = 'langues formosanes', tri = 'formosanes langues' } l['fpe'] = { nom = 'pichi' } l['fqs'] = { nom = 'fas' } l['fr'] = { nom = 'français', portail = true, wiktionnaire = true } l['francilien'] = { nom = 'francilien' } l['francique central'] = { nom = 'francique central' } l['francique méridional'] = { nom = 'francique méridional' } l['francique mosellan'] = { nom = 'francique mosellan' } l['francique rhénan'] = { nom = 'francique rhénan' } l['frc'] = { nom = 'français cadien' } l['frd'] = { nom = 'fordata' } l['frk'] = { nom = 'vieux-francique', tri = 'francique vieux' } l['frm'] = { nom = 'moyen français', tri = 'francais moyen' } l['fro'] = { nom = 'ancien français', tri = 'francais ancien', portail = true } l['frp'] = { nom = 'francoprovençal' } l['frq'] = { nom = 'forak' } l['frr'] = { nom = 'frison septentrional' } l['frs'] = { nom = 'bas saxon de Frise orientale', tri = 'saxon bas de frise orientale' } l['frt'] = { nom = 'fortsenal' } l['fry'] = { nom = 'frison occidental' } l['fse'] = { nom = 'langue des signes finnoise', tri = 'signes finnoise' } l['fsl'] = { nom = 'langue des signes française', tri = 'signes francaise' } l['fss'] = { nom = 'langue des signes finno-suédoise', tri = 'signes finno suedoise' } l['fub'] = { nom = 'peul de l’Adamaoua', tri = 'peul adamaoua' } l['fuc'] = { nom = 'pulaar' } l['fud'] = { nom = 'futunien' } l['fue'] = { nom = 'peul du Borgu', tri = 'peul borgu' } l['fuf'] = { nom = 'pular' } l['fuh'] = { nom = 'peul du Niger occidental', tri = 'peul niger occidental' } l['fun'] = { nom = 'fulniô' } l['fur'] = { nom = 'frioulan' } l['fut'] = { nom = 'futuna-aniwa' } l['fuu'] = { nom = 'bagiro' } l['fuy'] = { nom = 'fuyug' } l['fvr'] = { nom = 'four' } l['fwa'] = { nom = 'fwâi' } l['fwe'] = { nom = 'fwe' } l['fy'] = { nom = 'frison', wiktionnaire = true } l['ga'] = { nom = 'gaélique irlandais', wiktionnaire = true } l['gaa'] = { nom = 'ga' } l['gab'] = { nom = 'gabri' } l['gac'] = { nom = 'grand andamanais' } l['gad'] = { nom = 'gaddang' } l['gae'] = { nom = 'guarequena' } l['gaf'] = { nom = 'gende' } l['gag'] = { nom = 'gagaouze' } l['gah'] = { nom = 'alekano' } l['gai'] = { nom = 'borei' } l['gaj'] = { nom = 'gadsup' } l['gal'] = { nom = 'galoli' } l['galaïco-portugais'] = { nom = 'galaïco-portugais' } l['gallo'] = { nom = 'gallo' } l['gallo-italique de Sicile'] = { nom = 'gallo-italique de Sicile' } l['gan'] = { nom = 'gan' } l['gao'] = { nom = 'gants' } l['gao de Dongkou'] = { nom = 'gao de Dongkou' } l['gap'] = { nom = 'gal' } l['gaq'] = { nom = 'gta’' } l['gar'] = { nom = 'galeya' } l['gas'] = { nom = 'garasia des Adiwasi' } l['gat'] = { nom = 'kenati' } l['gau'] = { nom = 'gadaba mudhili' } l['gaulois'] = { nom = 'gaulois' } l['gaw'] = { nom = 'nobonob' } l['gax'] = { nom = 'borana' } l['gay'] = { nom = 'gayo' } l['gaz'] = { nom = 'oromo central de l’Ouest' } l['gba'] = { nom = 'gbaya' } l['gbb'] = { nom = 'kaytetye' } l['gbe'] = { nom = 'niksek' } l['gbf'] = { nom = 'gaikundi' } l['gbg'] = { nom = 'gbanziri' } l['gbi'] = { nom = 'galela' } l['gbj'] = { nom = 'gutob' } l['gbn'] = { nom = 'mo’da' } l['gbp'] = { nom = 'gbaya de Bossangoa', tri = 'gbaya Bossangoa' } l['gbq'] = { nom = 'gbaya bozom' } l['gbr'] = { nom = 'gbagyi' } l['gbu'] = { nom = 'gaagudju' } l['gbv'] = { nom = 'gbanu' } l['gby'] = { nom = 'gbari' } l['gbz'] = { nom = 'dari iranien' } l['gcc'] = { nom = 'mali' } l['gcd'] = { nom = 'ganggalida' } l['gce'] = { nom = 'galice' } l['gcf-mq'] = { nom = 'créole martiniquais' } l['gcl'] = { nom = 'créole grenadais' } l['gcr'] = { nom = 'créole guyanais' } l['gct'] = { nom = 'alemán coloniero' } l['gd'] = { nom = 'gaélique écossais', wiktionnaire = true } l['gdc'] = { nom = 'gugu badhun' } l['gdd'] = { nom = 'gedaged' } l['gde'] = { nom = 'gude' } l['gdf'] = { nom = 'guduf-gava' } l['gdg'] = { nom = 'ga’dang' } l['gdl'] = { nom = 'dirasha' } l['gdm'] = { nom = 'laal' } l['gdo'] = { nom = 'godoberi' } l['gdq'] = { nom = 'méhri' } l['gdr'] = { nom = 'wipi' } l['gds'] = { nom = 'langue des signes de Ghandruk', tri = 'signes ghandruk' } l['gea'] = { nom = 'geruma' } l['geb'] = { nom = 'kire' } l['geg'] = { nom = 'gengle' } l['geh'] = { nom = 'allemand huttérite' } l['gej'] = { nom = 'mina (Togo)' } l['gek'] = { nom = 'ywom' } l['gel'] = { nom = 'ut-ma’in' } l['gelao blanc de Diyingshao'] = { nom = 'gelao blanc de Diyingshao' } l['gelao blanc de Judu'] = { nom = 'gelao blanc de Judu' } l['gelao blanc de Moji'] = { nom = 'gelao blanc de Moji' } l['gelao blanc de Niupo'] = { nom = 'gelao blanc de Niupo' } l['gelao blanc de Pudi'] = { nom = 'gelao blanc de Pudi' } l['gelao blanc de Wantao'] = { nom = 'gelao blanc de Wantao' } l['gelao blanc de Yueliangwan'] = { nom = 'gelao blanc de Yueliangwan' } l['gelao rouge de Fanpo'] = { nom = 'gelao rouge de Fanpo' } l['gelao rouge de Longjia'] = { nom = 'gelao rouge de Longjia' } l['gelao rouge de Na Khê'] = { nom = 'gelao rouge de Na Khê' } l['gelao vert de Liangshui'] = { nom = 'gelao vert de Liangshui' } l['gelao vert de Qinglong'] = { nom = 'gelao vert de Qinglong' } l['gelao vert de Sanchong'] = { nom = 'gelao vert de Sanchong' } l['gelao vert de Zhenfeng'] = { nom = 'gelao vert de Zhenfeng' } l['gem'] = { nom = 'langues germaniques', tri = 'germaniques langues' } l['gépide'] = { nom = 'gépide' } l['ges'] = { nom = 'geser-gorom' } l['gète'] = { nom = 'gète' } l['gev'] = { nom = 'geviya' } l['gew'] = { nom = 'gera' } l['gex'] = { nom = 'garre' } l['gey'] = { nom = 'enya' } l['gez'] = { nom = 'guèze' } l['gfk'] = { nom = 'patpatar' } l['gft'] = { nom = 'gafat' } l['gga'] = { nom = 'gao' } l['ggb'] = { nom = 'gbii' } l['ggd'] = { nom = 'gugadj' } l['gge'] = { nom = 'gurr-goni' } l['ggl'] = { nom = 'ganglau' } l['ggo'] = { nom = 'gondî du Sud' } l['ggt'] = { nom = 'gitua' } l['ggu'] = { nom = 'gagou' } l['gha'] = { nom = 'ghadamès' } l['ghl'] = { nom = 'ghulfan' } l['gho'] = { nom = 'ghomari' } l['ghs'] = { nom = 'guhu-samane' } l['gia'] = { nom = 'kija' } l['gid'] = { nom = 'gidar' } l['gie'] = { nom = 'gabogbo' } l['gil'] = { nom = 'gilbertin' } l['gim'] = { nom = 'gimi' } l['gin'] = { nom = 'hinukh' } l['gio'] = { nom = 'gelao' } l['gip'] = { nom = 'gimi (Nouvelle-Bretagne occidentale)' } l['giq'] = { nom = 'gelao vert' } l['gir'] = { nom = 'gelao rouge' } l['girirra'] = { nom = 'girirra' } l['git'] = { nom = 'gitxsan' } l['giu'] = { nom = 'mulao' } l['giw'] = { nom = 'gelao blanc' } l['gix'] = { nom = 'gilima' } l['giz'] = { nom = 'giziga du Sud' } l['gji'] = { nom = 'geji' } l['gjn'] = { nom = 'gonja' } l['gju'] = { nom = 'gujari' } l['gkm'] = { nom = 'grec byzantin' } l['gkn'] = { nom = 'gokana' } l['gkp'] = { nom = 'kpellé de Guinée', tri = 'kpelle Guinee' } l['gku'] = { nom = 'ǂungkue' } l['gl'] = { nom = 'galicien', wiktionnaire = true } l['glc'] = { nom = 'bon goula' } l['gld'] = { nom = 'nanaï' } l['glk'] = { nom = 'gilaki' } l['gll'] = { nom = 'garlali' } l['glo'] = { nom = 'galambu' } l['glu'] = { nom = 'gula (Tchad)' } l['glw'] = { nom = 'glavda' } l['gme'] = { nom = 'langues germaniques orientales', tri = 'germaniques orientales langues' } l['gmh'] = { nom = 'moyen haut-allemand', tri = 'allemand haut moyen' } l['gml'] = { nom = 'moyen bas allemand', tri = 'allemand bas moyen' } l['gmm'] = { nom = 'gbaya-mbodomo' } l['gmo'] = { nom = 'gamo-gofa-dawro' } l['gmq'] = { nom = 'langues germaniques septentrionales', tri = 'germaniques septentrionales langues' } l['gmu'] = { nom = 'gumalu' } l['gmv'] = { nom = 'gamo' } l['gmw'] = { nom = 'langues germaniques occidentales', tri = 'germaniques occidentales langues' } l['gmx'] = { nom = 'magoma' } l['gmy'] = { nom = 'mycénien' } l['gn'] = { nom = 'guarani', wiktionnaire = true } l['gna'] = { nom = 'kaansa' } l['gnb'] = { nom = 'gangte' } l['gnc'] = { nom = 'guanche' } l['gnd'] = { nom = 'zulgo-gemzek' } l['gne'] = { nom = 'ganang' } l['gng'] = { nom = 'ngangam' } l['gni'] = { nom = 'gooniyandi' } l['gnk'] = { nom = 'gǁana' } l['gnn'] = { nom = 'gumatj' } l['gno'] = { nom = 'gondî du Nord' } l['gnq'] = { nom = 'gana' } l['gnu'] = { nom = 'gnau' } l['gnw'] = { nom = 'guaraní de Bolivie occidental' } l['goa'] = { nom = 'gouro' } l['gob'] = { nom = 'playero' } l['god'] = { nom = 'godié' } l['goe'] = { nom = 'gongduk' } l['gof'] = { nom = 'gofa' } l['gog'] = { nom = 'gogo' } l['goh'] = { nom = 'vieux haut allemand', tri = 'allemand haut vieux' } l['goi'] = { nom = 'gobasi' } l['goj'] = { nom = 'gowlan' } l['gokhy'] = { nom = 'gokhy' } l['gol'] = { nom = 'gola' } l['gom'] = { nom = 'konkani de Goa', wiktionnaire = true } l['gon'] = { nom = 'gond' } l['goo'] = { nom = 'gone dau' } l['gop'] = { nom = 'yeretuar' } l['gor'] = { nom = 'gorontalo' } l['gos'] = { nom = 'groningois' } l['got'] = { nom = 'gotique' } l['gotique de Crimée'] = { nom = 'gotique de Crimée' } l['gottscheerish'] = { nom = 'gottscheerish' } l['gou'] = { nom = 'gavar' } l['goy'] = { nom = 'goundo' } l['gpa'] = { nom = 'gupa-abawa' } l['gpe'] = { nom = 'pidgin anglais ghanéen' } l['gqa'] = { nom = 'ga’anda' } l['gqi'] = { nom = 'guiqiong' } l['gqn'] = { nom = 'kinikinao' } l['gqr'] = { nom = 'gor' } l['gqu'] = { nom = 'gao de Wanzi' } l['gra'] = { nom = 'rajput garasia' } l['grb'] = { nom = 'grébo' } l['grc'] = { nom = 'grec ancien', portail = true } l['grd'] = { nom = 'guruntum' } l['grec cargésien'] = { nom = 'grec cargésien' } l['grg'] = { nom = 'madi' } l['grh'] = { nom = 'gbiri-niragu' } l['gri'] = { nom = 'ghari' } l['griko'] = { nom = 'griko' } l['grk'] = { nom = 'langues grecques', tri = 'grecques langues' } l['gro'] = { nom = 'groma' } l['grr'] = { nom = 'taznatit' } l['grs'] = { nom = 'gresi' } l['grt'] = { nom = 'garo' } l['gru'] = { nom = 'kistane' } l['grz'] = { nom = 'guramalum' } l['gserpa'] = { nom = 'gserpa' } l['gsg'] = { nom = 'langue des signes allemande', tri = 'signes allemande' } l['gsl'] = { nom = 'gusilay' } l['gsm'] = { nom = 'langue des signes guatémaltèque', tri = 'signes guatemalteque' } l['gso'] = { nom = 'gbaya du Sud-Ouest', tri = 'gbaya sud ouest' } l['gsw'] = { nom = 'alémanique', wmlien = 'als' } l['gsw-fr'] = { nom = 'alémanique alsacien' } l['gta'] = { nom = 'guató' } l['gti'] = { nom = 'gbati-ri' } l['gu'] = { nom = 'gujarati', wiktionnaire = true } l['gub'] = { nom = 'guajajára' } l['guc'] = { nom = 'guajiro' } l['gud'] = { nom = 'dida de Yocoboué' } l['gudjal'] = { nom = 'gudjal' } l['gue'] = { nom = 'gurinji' } l['güenoa'] = { nom = 'güenoa' } l['guf'] = { nom = 'gupapuyngu' } l['gug'] = { nom = 'guarani paraguayen' } -- aussi nhd l['guh'] = { nom = 'guahibo' } l['gui'] = { nom = 'chiriguano' } l['guk'] = { nom = 'gumuz' } l['gul'] = { nom = 'gullah' } l['gum'] = { nom = 'guambiano' } l['gumuz du Sud'] = { nom = 'gumuz du Sud' } l['gun'] = { nom = 'mbyá' } l['guo'] = { nom = 'guayabero' } l['gup'] = { nom = 'gunwinggu' } l['guq'] = { nom = 'guayakí' } l['gur'] = { nom = 'gurenne' } l['gus'] = { nom = 'langue des signes guinéenne', tri = 'signes guineenne' } l['gut'] = { nom = 'maleku' } l['gutnisk'] = { nom = 'gutnisk' } l['guu'] = { nom = 'yanomamö' } l['guw'] = { nom = 'gungbe', wiktionnaire = true } l['gux'] = { nom = 'gourmanchéma' } l['guz'] = { nom = 'gusii' } l['gv'] = { nom = 'mannois', wiktionnaire = true } l['gva'] = { nom = 'guaná' } l['gvc'] = { nom = 'wanano' } l['gve'] = { nom = 'duwet' } l['gvf'] = { nom = 'golin' } l['gvj'] = { nom = 'guaja' } l['gvl'] = { nom = 'gulay' } l['gvn'] = { nom = 'kuku-yalanji' } l['gvo'] = { nom = 'gavião do Jiparaná' } l['gvp'] = { nom = 'parkatejê' } l['gvy'] = { nom = 'guyani' } l['gwara'] = { nom = 'gwara' } l['gwc'] = { nom = 'kohistani de Kalam' } l['gwd'] = { nom = 'gawwada' } l['gwe'] = { nom = 'gweno' } l['gwi'] = { nom = 'gwich’in' } l['gwj'] = { nom = 'gǀui', tri = 'gui' } l['gwn'] = { nom = 'gwandara' } l['gwr'] = { nom = 'gwere' } l['gwt'] = { nom = 'gawar-bati' } l['gwu'] = { nom = 'guwamu' } l['gwx'] = { nom = 'gua' } l['gya'] = { nom = 'gbaya du Nord-Ouest', tri = 'gbaya nord ouest' } l['gyb'] = { nom = 'garus' } l['gyd'] = { nom = 'kayardild' } l['gyg'] = { nom = 'gbayi' } l['gyl'] = { nom = 'gayil' } l['gym'] = { nom = 'guaymí' } l['gyo'] = { nom = 'gyalsumdo' } l['gyr'] = { nom = 'guarayo' } l['gyy'] = { nom = 'gunya' } l['gza'] = { nom = 'ganza' } l['gzi'] = { nom = 'gazi' } l['ha'] = { nom = 'haoussa', wiktionnaire = true } l['ha em'] = { nom = 'ha em' } l['haa'] = { nom = 'han' } l['hab'] = { nom = 'langue des signes de Hanoï', tri = 'signes hanoi' } l['hac'] = { nom = 'gurani' } l['had'] = { nom = 'hatam' } l['hag'] = { nom = 'hanga' } l['hai'] = { nom = 'haïda' } l['hak'] = { nom = 'hakka' } l['hal'] = { nom = 'halang' } l['ham'] = { nom = 'hewa' } l['han'] = { nom = 'hangaza' } l['haq'] = { nom = 'ha' } l['har'] = { nom = 'harari' } l['has'] = { nom = 'haisla' } l['hav'] = { nom = 'havu' } l['haw'] = { nom = 'hawaïen' } l['hax'] = { nom = 'haïda du Sud' } l['hay'] = { nom = 'haya' } l['haz'] = { nom = 'hazara' } l['hbn'] = { nom = 'heiban' } l['hbo'] = { nom = 'hébreu ancien' } l['hch'] = { nom = 'huichol' } l['hdn'] = { nom = 'haïda du Nord' } l['hdy'] = { nom = 'hadiyya' } l['he'] = { nom = 'hébreu', wiktionnaire = true } l['hea'] = { nom = 'hmu du Nord' } l['hed'] = { nom = 'herdé' } l['heh'] = { nom = 'hehe' } l['hei'] = { nom = 'heiltsuk' } l['hem'] = { nom = 'hemba' } l['hgm'] = { nom = 'haiǁom' } l['hhi'] = { nom = 'hoia hoia de Ukusi-Koparamio' } l['hhr'] = { nom = 'keerak' } l['hhy'] = { nom = 'hoia hoia de Matakaia' } l['hi'] = { nom = 'hindi', wiktionnaire = true } l['hia'] = { nom = 'lamang' } l['hib'] = { nom = 'hibito' } l['hid'] = { nom = 'hidatsa' } l['hif'] = { nom = 'hindi des Fidji', wiktionnaire = true } l['hig'] = { nom = 'kamwe' } l['hik'] = { nom = 'seit-kaitetu' } l['hil'] = { nom = 'hiligaynon' } l['him'] = { nom = 'himachali' } l['hio'] = { nom = 'tsoa' } l['hit'] = { nom = 'hittite' } l['hiw'] = { nom = 'hiw' } l['hix'] = { nom = 'hixkaryana' } l['hka'] = { nom = 'kahé' } l['hke'] = { nom = 'hunde' } l['hkk'] = { nom = 'hunjara-kaina ke' } l['hla'] = { nom = 'halia' } l['hlb'] = { nom = 'halbi' } l['hlu'] = { nom = 'louvite hiéroglyphique' } l['hma'] = { nom = 'miao mashan du Sud', tri = 'miao mashan sud' } l['hmb'] = { nom = 'songhaï humburi senni' } l['hmd'] = { nom = 'miao de Diandongbei', tri = 'miao diandongbei' } l['hme'] = { nom = 'hmong de Huishui de l’Est' } l['hmi'] = { nom = 'miao du Nord de Huishui', tri = 'miao huishi nord' } l['hmj'] = { nom = 'gejia' } l['hml'] = { nom = 'miao de Luobohe', tri = 'miao luobohe' } l['hmm'] = { nom = 'miao mashan central' } l['hmn'] = { nom = 'hmong' } l['hmr'] = { nom = 'hmar' } l['hms'] = { nom = 'miao du Qiandong du Sud', tri = 'miao qiandong sud' } l['hmt'] = { nom = 'hamtai' } l['hmu'] = { nom = 'hamap' } l['hmv'] = { nom = 'hmong dô' } l['hmx'] = { nom = 'langues hmong-mien', tri = 'hmong mien langues' } l['hna'] = { nom = 'mina' } l['hnd'] = { nom = 'hindko du Sud' } l['hnh'] = { nom = 'handa-khwe' } l['hni'] = { nom = 'hani' } l['hnj'] = { nom = 'hmong vert' } l['hnn'] = { nom = 'hanunóo' } l['hno'] = { nom = 'hindko du Nord' } l['hnu'] = { nom = 'pong' } l['ho'] = { nom = 'hiri motou' } l['hoa'] = { nom = 'hoava' } l['hoanya'] = { nom = 'hoanya' } l['hob'] = { nom = 'mari (Madang)' } l['hoc'] = { nom = 'ho' } l['hod'] = { nom = 'holma' } l['hoe'] = { nom = 'horom' } l['hoh'] = { nom = 'hobyot' } l['hoi'] = { nom = 'holikachuk' } l['hok'] = { nom = 'langues hokanes', tri = 'hokanes langues' } l['hol'] = { nom = 'holu' } l['hom'] = { nom = 'homa' } l['hoo'] = { nom = 'holoholo' } l['hop'] = { nom = 'hopi' } l['hor'] = { nom = 'horo' } l['hot'] = { nom = 'hote' } l['houma'] = { nom = 'houma' } l['hov'] = { nom = 'hovongan' } l['how'] = { nom = 'honi' } l['hoy'] = { nom = 'holiya' } l['hoz'] = { nom = 'hozo' } l['hr'] = { nom = 'croate', wiktionnaire = true } l['hra'] = { nom = 'hrangkhol' } l['hre'] = { nom = 'hrê' } l['hrk'] = { nom = 'haruku' } l['hro'] = { nom = 'haroi' } l['hrt'] = { nom = 'hertevin' } l['hru'] = { nom = 'hruso' } l['hrx'] = { nom = 'hunsrik' } l['hsb'] = { nom = 'haut-sorabe', tri = 'sorabe haut', wiktionnaire = true } l['hsn'] = { nom = 'xiang' } l['hss'] = { nom = 'harsusi' } l['ht'] = { nom = 'créole haïtien' } l['hto'] = { nom = 'witoto mɨnɨca' } l['hts'] = { nom = 'hadza' } l['htu'] = { nom = 'hitu' } l['hu'] = { nom = 'hongrois', wiktionnaire = true } l['hub'] = { nom = 'huambisa' } l['huc'] = { nom = 'ǂhoan', tri = 'hoan' } l['hue'] = { nom = 'huave de San Francisco del Mar' } l['hug'] = { nom = 'huachipaeri' } l['huh'] = { nom = 'huilliche' } l['hui'] = { nom = 'huli' } l['hum'] = { nom = 'hungana' } l['huo'] = { nom = 'hu' } l['hup'] = { nom = 'hupa' } l['huq'] = { nom = 'tsat' } l['hur'] = { nom = 'halkomelem' } l['hus'] = { nom = 'huastèque' } l['hut'] = { nom = 'humla' } l['huu'] = { nom = 'witoto murui' } l['huv'] = { nom = 'huave de San Mateo del Mar' } l['huw'] = { nom = 'hukumina' } l['hux'] = { nom = 'witoto nɨpode' } l['huy'] = { nom = 'hulaulá' } l['huz'] = { nom = 'hunzib' } l['hva'] = { nom = 'huastèque de San Luís Potosí' } l['hvk'] = { nom = 'haveke' } l['hvn'] = { nom = 'hawu' } l['hwc'] = { nom = 'créole hawaïen' } l['hy'] = { nom = 'arménien', wiktionnaire = true } l['hyx'] = { nom = 'langues arméniennes', tri = 'armeniennes langues' } l['hz'] = { nom = 'héréro' } l['ia'] = { nom = 'interlingua', wiktionnaire = true } l['iai'] = { nom = 'iaai' } l['ian'] = { nom = 'iatmul' } l['iar'] = { nom = 'purari' } l['iba'] = { nom = 'iban' } l['ibb'] = { nom = 'ibibio' } l['ibd'] = { nom = 'iwaidja' } l['ibe'] = { nom = 'akpès' } l['ibg'] = { nom = 'ibanag' } l['ibh'] = { nom = 'bih' } l['ibl'] = { nom = 'ibaloi' } l['ibm'] = { nom = 'agoi' } l['ibn'] = { nom = 'ibino' } l['ibr'] = { nom = 'ibuoro' } l['iby'] = { nom = 'ibani' } l['ich'] = { nom = 'etkywan' } l['icl'] = { nom = 'langue des signes islandaise', tri = 'signes islandaise' } l['id'] = { nom = 'indonésien', portail = true, wiktionnaire = true } l['ida'] = { nom = 'luidakho-luisukha-lutirichi' } l['idb'] = { nom = 'créole indo-portugais' } l['ide'] = { nom = 'idere' } l['idi'] = { nom = 'idi' } l['idu'] = { nom = 'idoma' } l['ie'] = { nom = 'interlingue', wiktionnaire = true } l['ifa'] = { nom = 'ifugao d’Amganad' } l['iff'] = { nom = 'ifo' } l['ifk'] = { nom = 'ifugao de Tuwali' } l['ify'] = { nom = 'keley-i kallahan' } l['ig'] = { nom = 'igbo', wiktionnaire = true } l['igb'] = { nom = 'ébira', tri = 'ebira' } l['ige'] = { nom = 'igede' } l['igl'] = { nom = 'igala' } l['ign'] = { nom = 'ignaciano' } l['igo'] = { nom = 'isebe' } l['igs'] = { nom = 'interglossa' } l['igs-gls'] = { nom = 'glosa' } l['ihp'] = { nom = 'iha' } l['ii'] = { nom = 'yi' } l['iii'] = { nom = 'yi nuosu' } l['iir'] = { nom = 'langues indo-iraniennes', tri = 'indo iraniennes langues' } l['ijc'] = { nom = 'izon' } l['ije'] = { nom = 'biseni' } l['ijn'] = { nom = 'kalabari' } l['ijo'] = { nom = 'langues ijos', tri = 'ijos langues' } l['ijs'] = { nom = 'ijo du Sud-Est' } l['ik'] = { nom = 'inupiaq', wiktionnaire = true } l['ike'] = { nom = 'inuttitut' } l['iki'] = { nom = 'iko' } l['iko'] = { nom = 'olulumo-ikom' } l['ikt'] = { nom = 'inuinnaqtun' } l['ikw'] = { nom = 'ikwere' } l['ikx'] = { nom = 'ik' } l['ikz'] = { nom = 'ikizu' } l['ila'] = { nom = 'ile ape' } l['ilb'] = { nom = 'ila' } l['ili'] = { nom = 'ili turki' } l['ill'] = { nom = 'iranun' } l['ilo'] = { nom = 'ilocano' } l['ilu'] = { nom = 'ili’uun' } l['ilv'] = { nom = 'ilue' } l['ilw'] = { nom = 'talur' } l['ima'] = { nom = 'malasar de Mala' } l['ime'] = { nom = 'imeraguen' } l['iml'] = { nom = 'miluk' } l['imn'] = { nom = 'imonda' } l['imo'] = { nom = 'imbongu' } l['imr'] = { nom = 'imroing' } l['ims'] = { nom = 'marse' } l['imy'] = { nom = 'milyen' } l['inb'] = { nom = 'inga' } l['inc'] = { nom = 'langues indo-aryennes', tri = 'indo aryennes langues' } l['indanga'] = { nom = 'indanga' } l['ine'] = { nom = 'langues indo-européennes', tri = 'indo europeennes langues' } l['ing'] = { nom = 'deg hit’an' } l['inh'] = { nom = 'ingouche' } l['inj'] = { nom = 'inga de la jungle' } l['inn'] = { nom = 'isinai' } l['ino'] = { nom = 'inoke-yate' } l['inp'] = { nom = 'iñapari' } l['ins'] = { nom = 'langue des signes indienne', tri = 'signes indienne' } l['int'] = { nom = 'intha' } l['inz'] = { nom = 'ineseño' } l['io'] = { nom = 'ido', wiktionnaire = true } l['ior'] = { nom = 'inor' } l['iow'] = { nom = 'iowa-oto' } l['ipi'] = { nom = 'ipili' } l['ipo'] = { nom = 'ipiko' } l['iqu'] = { nom = 'iquito' } l['ira'] = { nom = 'langues iraniennes', tri = 'iraniennes langues' } l['ire'] = { nom = 'iresim' } l['irh'] = { nom = 'irarutu' } l['iri'] = { nom = 'irigwe' } l['irk'] = { nom = 'iraqw' } l['irn'] = { nom = 'irántxe' } l['iro'] = { nom = 'langues iroquoiennes', tri = 'iroquoiennes langues' } l['irr'] = { nom = 'ir' } l['iru'] = { nom = 'irula' } l['irx'] = { nom = 'kamberau' } l['is'] = { nom = 'islandais', wiktionnaire = true } l['isa'] = { nom = 'isabi' } l['isc'] = { nom = 'isconahua' } l['isd'] = { nom = 'isnag' } l['ise'] = { nom = 'langue des signes italienne', tri = 'signes italienne' } l['isg'] = { nom = 'langue des signes irlandaise', tri = 'signes irlandaise' } l['ish'] = { nom = 'esan' } l['isi'] = { nom = 'nkem-nkum' } l['isk'] = { nom = 'ishkashimi' } l['ism'] = { nom = 'masimasi' } l['isn'] = { nom = 'isanzu' } l['iso'] = { nom = 'isoko' } l['isr'] = { nom = 'langue des signes israélienne', tri = 'signes israélienne' } l['ist'] = { nom = 'istriote' } l['isu'] = { nom = 'isu (Menchum)' } l['it'] = { nom = 'italien', portail = true, wiktionnaire = true } l['itb'] = { nom = 'itneg de Binongan', tri = 'itneg binongan' } l['itc'] = { nom = 'langues italiques', tri = 'italiques langues' } l['ite'] = { nom = 'itenez' } l['itl'] = { nom = 'itelmène' } l['itm'] = { nom = 'itu mbon uzo' } l['ito'] = { nom = 'itonama' } l['its'] = { nom = 'isekiri' } l['itt'] = { nom = 'itneg des Maeng', tri = 'itneg maeng' } l['itv'] = { nom = 'itawit' } l['itw'] = { nom = 'ito' } l['itx'] = { nom = 'itik' } l['ity'] = { nom = 'itneg du Moyadan', tri = 'itneg moyadan' } l['itz'] = { nom = 'itzá' } l['iu'] = { nom = 'inuktitut', wiktionnaire = true } l['ium'] = { nom = 'iu mien' } l['ivb'] = { nom = 'ibatan' } l['ivv'] = { nom = 'ivatan' } l['iwm'] = { nom = 'iwam' } l['iwo'] = { nom = 'iwur' } l['iws'] = { nom = 'sepik iwam' } l['ixc'] = { nom = 'ixcatèque' } l['ixl'] = { nom = 'ixil' } l['iyo'] = { nom = 'mesaka' } l['izh'] = { nom = 'ingrien' } l['izr'] = { nom = 'izere' } l['ja'] = { nom = 'japonais', portail = true, wiktionnaire = true } l['ja-kun'] = { nom = 'kun’yomi' } l['ja-on'] = { nom = 'on’yomi' } l['japhug'] = { nom = 'japhug' } l['jaa'] = { nom = 'jamamadí' } l['jab'] = { nom = 'hyam' } l['jac'] = { nom = 'jacaltèque' } l['jae'] = { nom = 'yabem' } l['jah'] = { nom = 'jah hut' } l['jak'] = { nom = 'jakun' } l['jal'] = { nom = 'fatamanue' } l['jam'] = { nom = 'créole jamaïcain' } l['jan'] = { nom = 'jandai' } l['jao'] = { nom = 'yanyuwa' } l['jaq'] = { nom = 'yaqay' } l['jas'] = { nom = 'javanais de Nouvelle-Calédonie' } l['jau'] = { nom = 'yaur' } l['jaz'] = { nom = 'jawe' } l['jbk'] = { nom = 'barikewa' } l['jbn'] = { nom = 'nafusi' } l['jbo'] = { nom = 'lojban', wiktionnaire = true } l['jbt'] = { nom = 'djeoromitxi' } l['jbw'] = { nom = 'mouwase' } l['jct'] = { nom = 'krymchak' } l['jdt'] = { nom = 'juhuri' } l['jeb'] = { nom = 'jebero' } l['jedek'] = { nom = 'jedek' } l['jeg'] = { nom = 'jeng' } l['jeh'] = { nom = 'jeh' } l['jei'] = { nom = 'yei' } l['jek'] = { nom = 'jeri kuo' } l['jel'] = { nom = 'yelmek' } l['jen'] = { nom = 'dza' } l['jet'] = { nom = 'manem' } l['jeu'] = { nom = 'djongor de Bourmataguil' } l['jge'] = { nom = 'judéo-géorgien' } l['jgk'] = { nom = 'gwak' } l['jgo'] = { nom = 'ngomba' } l['jhi'] = { nom = 'jehai' } l['jia'] = { nom = 'jina' } l['jib'] = { nom = 'jibu' } l['jic'] = { nom = 'jicaque de la Flor' } l['jicaque d’El Palmar'] = { nom = 'jicaque d’El Palmar' } l['jid'] = { nom = 'bu' } l['jig'] = { nom = 'djingili' } l['jih'] = { nom = 'shangzhai' } l['jil'] = { nom = 'jilim' } l['jim'] = { nom = 'jimi (Cameroun)' } l['jio'] = { nom = 'jiamao' } l['jiq'] = { nom = 'lavrung' } l['jit'] = { nom = 'jita' } l['jiu'] = { nom = 'jinuo de Youle' } l['jiv'] = { nom = 'shuar' } l['jiv-pal'] = { nom = 'palta' } l['jiy'] = { nom = 'jinuo de Buyuan' } l['jjr'] = { nom = 'bankal' } l['jka'] = { nom = 'kaera' } l['jko'] = { nom = 'kubo' } l['jkr'] = { nom = 'koro (Inde)' } l['jku'] = { nom = 'labir' } l['jle'] = { nom = 'ngile' } l['jmc'] = { nom = 'machame' } l['jms'] = { nom = 'mashi (Nigeria)' } l['jnj'] = { nom = 'yemsa' } l['job'] = { nom = 'joba' } l['jor'] = { nom = 'jora' } l['jos'] = { nom = 'langue des signes jordanienne', tri = 'signes jordanienne' } l['jow'] = { nom = 'jowulu' } l['jpr'] = { nom = 'judéo-persan' } l['jpx'] = { nom = 'langues japonaises', tri = 'japonaises langues' } l['jra'] = { nom = 'jaraï' } l['jrb'] = { nom = 'judéo-arabe' } l['jua'] = { nom = 'júma' } l['juc'] = { nom = 'jurchen' } l['juh'] = { nom = 'hõne' } l['jui'] = { nom = 'ngadjuri' } l['jum'] = { nom = 'jumjum' } l['jun'] = { nom = 'juang' } l['jup'] = { nom = 'hupda' } l['jur'] = { nom = 'juruna' } l['jus'] = { nom = 'langue des signes de Jumla', tri = 'signes jumla' } l['jut'] = { nom = 'jute' } l['juy'] = { nom = 'juray' } l['jv'] = { nom = 'javanais', wiktionnaire = true } l['jvn'] = { nom = 'javanais des Caraïbes' } l['jya'] = { nom = 'rgyalrong' } l['ka'] = { nom = 'géorgien', wiktionnaire = true } l['kaa'] = { nom = 'karakalpak' } l['kab'] = { nom = 'kabyle' } l['kac'] = { nom = 'kachin' } l['kae'] = { nom = 'ketangalan' } l['kaera'] = { nom = 'kaera' } l['kaf'] = { nom = 'katso' } l['kah'] = { nom = 'fer' } l['kai'] = { nom = 'karekare' } l['kaj'] = { nom = 'jju' } l['kak'] = { nom = 'ahin-kayapa kalanguya' } l['kakán'] = { nom = 'kakán' } l['kalis'] = { nom = 'kalis' } l['kam'] = { nom = 'kamba' } l['kao'] = { nom = 'khassonké' } l['kap'] = { nom = 'bezhta' } l['kaq'] = { nom = 'capanahua' } l['kar'] = { nom = 'langues karènes', tri = 'karenes langues' } l['kathlamet'] = { nom = 'kathlamet' } l['kaw'] = { nom = 'kawi' } l['kax'] = { nom = 'kao' } l['kay'] = { nom = 'kamayura' } l['kbb'] = { nom = 'kashuyana' } l['kbc'] = { nom = 'kadiwéu' } l['kbd'] = { nom = 'kabarde', wiktionnaire = true } l['kbh'] = { nom = 'camsá' } l['kbj'] = { nom = 'kari' } l['kbk'] = { nom = 'koiari grass' } l['kbl'] = { nom = 'kanembou' } l['kbn'] = { nom = 'kare (République centrafricaine)' } l['kbo'] = { nom = 'keliko' } l['kbp'] = { nom = 'kabiyè' } l['kbq'] = { nom = 'kamano' } l['kbs'] = { nom = 'kande' } l['kbt'] = { nom = 'abadi' } l['kbv'] = { nom = 'dera' } l['kbw'] = { nom = 'kaiep' } l['kby'] = { nom = 'kanuri de Manga' } l['kbz'] = { nom = 'duhwa' } l['kca'] = { nom = 'khanty' } l['kcb'] = { nom = 'kawacha' } l['kcg'] = { nom = 'tyap', wiktionnaire = true } l['kck'] = { nom = 'kalanga' } l['kcl'] = { nom = 'kala' } l['kcm'] = { nom = 'gula (République centrafricaine)', tri = 'gula centrafrique' } l['kcn'] = { nom = 'nubi' } l['kco'] = { nom = 'kinalakna' } l['kcp'] = { nom = 'kanga' } l['kcs'] = { nom = 'koenoem' } l['kcu'] = { nom = 'kami (Tanzanie)' } l['kcv'] = { nom = 'kete' } l['kcx'] = { nom = 'kachama-ganjule' } l['kcy'] = { nom = 'korandjé' } l['kcz'] = { nom = 'konongo' } l['kda'] = { nom = 'gathang' } l['kdd'] = { nom = 'yankunytjatjara' } l['kde'] = { nom = 'makonde' } l['kdh'] = { nom = 'tem' } l['kdi'] = { nom = 'kumam' } l['kdj'] = { nom = 'karimojong' } l['kdm'] = { nom = 'kagoma' } l['kdo'] = { nom = 'langues kordofaniennes', tri = 'kordofaniennes langues' } l['kdp'] = { nom = 'kaningdon-nindem' } l['kdq'] = { nom = 'koch' } l['kdr'] = { nom = 'karaïme' } l['kdt'] = { nom = 'kuy' } l['kdu'] = { nom = 'kadaru' } l['kdw'] = { nom = 'koneraw' } l['kea'] = { nom = 'créole du Cap-Vert', tri = 'creole cap vert' } l['keb'] = { nom = 'kélé (Gabon)', tri = 'kele gabon' } l['kec'] = { nom = 'keiga' } l['ked'] = { nom = 'kerewe' } l['kee'] = { nom = 'keres de l’Est' } l['kef'] = { nom = 'kpési' } l['keg'] = { nom = 'tese' } l['kei'] = { nom = 'kei' } l['kek'] = { nom = 'q’eqchi’' } l['kel'] = { nom = 'kela (République démocratique du Congo)', tri = 'kela congo' } l['kelabit long napir'] = { nom = 'kelabit long napir' } l['kem'] = { nom = 'kemak' } l['ken'] = { nom = 'kenyang' } l['kenyah long anap'] = { nom = 'kenyah long anap' } l['kenyah long dunin'] = { nom = 'kenyah long dunin' } l['kenyah long san'] = { nom = 'kenyah long san' } l['keo'] = { nom = 'kakwa' } l['ker'] = { nom = 'kera' } l['kes'] = { nom = 'kugbo' } l['ket'] = { nom = 'ket' } l['keu'] = { nom = 'akébou' } l['kew'] = { nom = 'kewa de l’Ouest' } l['key'] = { nom = 'kupia' } l['kfa'] = { nom = 'kodagu' } l['kfb'] = { nom = 'kolami du Nord-Ouest' } l['kfc'] = { nom = 'konda-dora' } l['kfd'] = { nom = 'koraga korra' } l['kff'] = { nom = 'koya' } l['kfh'] = { nom = 'kurichiya' } l['kfj'] = { nom = 'kemie' } l['kfk'] = { nom = 'kinnauri' } l['kfl'] = { nom = 'kung' } l['kfm'] = { nom = 'khunsari' } l['kfo'] = { nom = 'koro (Côte d’Ivoire)' } l['kfq'] = { nom = 'korku' } l['kfr'] = { nom = 'kutchi' } l['kfy'] = { nom = 'kumaoni' } l['kfz'] = { nom = 'koromfé' } l['kg'] = { nom = 'kikongo' } l['kgb'] = { nom = 'kawe' } l['kgd'] = { nom = 'kataang' } l['kge'] = { nom = 'komering' } l['kgf'] = { nom = 'kube' } l['kgg'] = { nom = 'kusunda' } l['kgj'] = { nom = 'kham gamale' } l['kgk'] = { nom = 'kaiwa' } l['kgl'] = { nom = 'kunggari' } l['kgo'] = { nom = 'krongo' } l['kgp'] = { nom = 'kaingang' } l['kgq'] = { nom = 'kamoro' } l['kgr'] = { nom = 'abun' } l['kgs'] = { nom = 'kumbainggar' } l['kgt'] = { nom = 'somyev' } l['kgv'] = { nom = 'karas' } l['kgw'] = { nom = 'karon dori' } l['kgy'] = { nom = 'kyirong' } l['kha'] = { nom = 'khasi' } l['khamnigan'] = { nom = 'khamnigan' } l['khb'] = { nom = 'tai lü' } l['khc'] = { nom = 'tukang besi du Nord' } l['khe'] = { nom = 'korowai' } l['khg'] = { nom = 'kham' } l['khh'] = { nom = 'keuw' } l['khi'] = { nom = 'langues khoïsanes', tri = 'khoisanes langues' } l['khiajari'] = { nom = 'khiajari' } l['khj'] = { nom = 'kuturmi' } l['kho'] = { nom = 'khotanais' } l['khoznini'] = { nom = 'khoznini' } l['khp'] = { nom = 'kapori' } l['khq'] = { nom = 'koyra chiini' } l['khr'] = { nom = 'kharia' } l['khs'] = { nom = 'kasua' } l['kht'] = { nom = 'khamti' } l['khv'] = { nom = 'khvarshi' } l['khw'] = { nom = 'khowar' } l['khy'] = { nom = 'kele (Congo)', tri = 'kele congo' } l['khz'] = { nom = 'keapara' } l['ki'] = { nom = 'kikuyu' } l['kia'] = { nom = 'kim' } l['kib'] = { nom = 'koalib' } l['kic'] = { nom = 'kickapoo' } l['kid'] = { nom = 'koshin' } l['kie'] = { nom = 'kibet' } l['kif'] = { nom = 'kham parbate de l’Est' } l['kig'] = { nom = 'kimaama' } l['kih'] = { nom = 'kilmeri' } l['kii'] = { nom = 'kitsai' } l['kij'] = { nom = 'kilivila' } l['kil'] = { nom = 'kariya' } l['kilen'] = { nom = 'kilen' } l['kim'] = { nom = 'tofalar' } l['kio'] = { nom = 'kiowa' } l['kip'] = { nom = 'kham sheshi' } l['kiptchak mamelouk'] = { nom = 'kiptchak mamelouk' } l['kis'] = { nom = 'kis' } l['kitanemuk'] = { nom = 'kitanemuk' } l['kiu'] = { nom = 'kirmancki' } l['kiv'] = { nom = 'kimbu' } l['kiw'] = { nom = 'kiwai du Nord-Est' } l['kiy'] = { nom = 'kirikiri' } l['kiz'] = { nom = 'kisi' } l['kj'] = { nom = 'kuanyama' } l['kja'] = { nom = 'mlap' } l['kjb'] = { nom = 'kanjobal' } l['kjc'] = { nom = 'konjo de la côte' } l['kjd'] = { nom = 'kiwai du Sud' } l['kje'] = { nom = 'kisar' } l['kjg'] = { nom = 'khmu' } l['kjh'] = { nom = 'khakasse' } l['kjh-fyk'] = { nom = 'kirghiz de Fu-Yu' } l['kjj'] = { nom = 'khinalug' } l['kjl'] = { nom = 'kham parbate de l’Ouest' } l['kjm'] = { nom = 'kháng' } l['kjn'] = { nom = 'kunjen' } l['kjp'] = { nom = 'pwo de l’Est' } l['kjq'] = { nom = 'keres de l’Ouest' } l['kjr'] = { nom = 'kurudu' } l['kjs'] = { nom = 'kewa de l’Est' } l['kju'] = { nom = 'kashaya' } l['kjz'] = { nom = 'bumthangkha' } l['kk'] = { nom = 'kazakh', wiktionnaire = true } l['kka'] = { nom = 'kakanda' } l['kkb'] = { nom = 'kwerisa' } l['kkc'] = { nom = 'odoodee' } l['kkd'] = { nom = 'kinuku' } l['kke'] = { nom = 'kakabé' } l['kkf'] = { nom = 'monpa de Kalaktang' } l['kki'] = { nom = 'kagulu' } l['kkk'] = { nom = 'kokota' } l['kkl'] = { nom = 'kosarek yale' } l['kko'] = { nom = 'karko' } l['kkr'] = { nom = 'kir-balar' } l['kks'] = { nom = 'giiwo' } l['kkt'] = { nom = 'koi' } l['kky'] = { nom = 'guugu yimidhirr' } l['kkz'] = { nom = 'kaska' } l['kl'] = { nom = 'kalaallisut', wiktionnaire = true } l['kla'] = { nom = 'klamath' } l['klb'] = { nom = 'kiliwa' } l['kld'] = { nom = 'kamilaroi' } l['kle'] = { nom = 'kulung (Népal)', tri = 'kulung nepal' } l['klg'] = { nom = 'kalagan de Tagakaulu' } l['klj'] = { nom = 'khalaj' } l['klk'] = { nom = 'kono (Nigeria)', tri = 'kono nigeria' } l['klm'] = { nom = 'migum' } l['kln'] = { nom = 'kalenjin' } l['klp'] = { nom = 'kamasa' } l['klq'] = { nom = 'rumu' } l['klr'] = { nom = 'khaling' } l['kls'] = { nom = 'kalasha' } l['klt'] = { nom = 'nukna' } l['klv'] = { nom = 'maskelynes' } l['km'] = { nom = 'khmer', wiktionnaire = true } l['kma'] = { nom = 'konni' } l['kmb'] = { nom = 'kimbundu' } l['kmc'] = { nom = 'kam' } l['kmf'] = { nom = 'kare (Papouasie-Nouvelle-Guinée)', tri = 'kare papouasie nouvelle guinee' } l['kmg'] = { nom = 'kâte' } l['kmh'] = { nom = 'kalam' } l['kmi'] = { nom = 'kami (Nigeria)', tri = 'kami nigeria' } l['kmk'] = { nom = 'kalinga de Limos' } l['kml'] = { nom = 'kalinga de Tanudan' } l['kmm'] = { nom = 'kom (Inde)' } l['kmn'] = { nom = 'awtuw' } l['kmo'] = { nom = 'kwoma' } l['kmq'] = { nom = 'gwama' } l['kmr'] = { nom = 'kurmandji' } l['kms'] = { nom = 'kamasau' } l['kmt'] = { nom = 'kemtuik' } l['kmv'] = { nom = 'karipúna' } l['kmw'] = { nom = 'komo (langue bantoue)', tri='komo bantou' } l['kmx'] = { nom = 'waboda' } l['kmz'] = { nom = 'turc du Khorassan' } l['kn'] = { nom = 'kannara', wiktionnaire = true } l['kna'] = { nom = 'kanakuru' } l['knb'] = { nom = 'kalinga de Lubuagan' } l['knc'] = { nom = 'kanouri central' } l['knd'] = { nom = 'konda' } l['kne'] = { nom = 'kankanaey' } l['kni'] = { nom = 'kanufi' } l['knj'] = { nom = 'acatèque' } l['knk'] = { nom = 'kuranko' } l['kno'] = { nom = 'kono (Sierra Leone)', tri = 'kono sierra leone' } l['knp'] = { nom = 'kwanja' } l['kns'] = { nom = 'kensiw' } l['knt'] = { nom = 'katukina' } l['knu'] = { nom = 'kono (Guinée)', tri = 'kono guinee' } l['knv'] = { nom = 'waia' } l['knw'] = { nom = 'kung-ekoka' } l['knx'] = { nom = 'kendayan' } l['kny'] = { nom = 'kanyok' } l['ko'] = { nom = 'coréen', wiktionnaire = true } l['koa'] = { nom = 'konomala' } l['kod'] = { nom = 'kodi' } l['koe'] = { nom = 'kacipo-balesi' } l['kof'] = { nom = 'kubi' } l['kog'] = { nom = 'kogui' } l['koh'] = { nom = 'koyo' } l['koi'] = { nom = 'komi-permyak' } l['kok'] = { nom = 'konkânî' } l['kol'] = { nom = 'kol (Papouasie-Nouvelle-Guinée)' } l['konomihu'] = { nom = 'konomihu' } l['koo'] = { nom = 'konjo' } l['kop'] = { nom = 'waube' } l['koq'] = { nom = 'kota (Gabon)' } l['kos'] = { nom = 'kosraéen' } l['kot'] = { nom = 'lagwan' } l['kotoxo'] = { nom = 'kotoxo' } l['kou'] = { nom = 'koke' } l['kow'] = { nom = 'kugama' } l['koy'] = { nom = 'koyukon' } l['koz'] = { nom = 'korak' } l['kpa'] = { nom = 'kupto' } l['kpc'] = { nom = 'curripaco' } l['kpe'] = { nom = 'kpellé' } l['kpf'] = { nom = 'komba' } l['kpg'] = { nom = 'kapingamarangi' } l['kpj'] = { nom = 'karajá' } l['kpk'] = { nom = 'kpan' } l['kpm'] = { nom = 'koho' } l['kpn'] = { nom = 'kepkiriwát' } l['kpo'] = { nom = 'ikposso' } l['kpq'] = { nom = 'korupun-sela' } l['kps'] = { nom = 'tehit' } l['kpt'] = { nom = 'karata' } l['kpw'] = { nom = 'kobon' } l['kpx'] = { nom = 'koiari des montagnes' } l['kpy'] = { nom = 'koryak' } l['kpz'] = { nom = 'sapiny' } l['kqc'] = { nom = 'doromu-koki' } l['kqd'] = { nom = 'néo-araméen de Koy Sandjaq', tri = 'arameen neo de koy sandjaq' } l['kqe'] = { nom = 'kalagan' } l['kql'] = { nom = 'kyenele' } l['kqp'] = { nom = 'kimré' } l['kqq'] = { nom = 'krenak' } l['kqr'] = { nom = 'kimaragang' } l['kqs'] = { nom = 'kisi septentrional' } l['kqt'] = { nom = 'kadazan klias' } l['kqu'] = { nom = 'seroa' } l['kqv'] = { nom = 'murut kolod' } l['kqx'] = { nom = 'mser' } l['kqy'] = { nom = 'koorete' } l['kr'] = { nom = 'kanouri' } l['krb'] = { nom = 'karkin' } l['krc'] = { nom = 'karatchaï-balkar' } l['kre'] = { nom = 'panará' } l['krf'] = { nom = 'koro (Vanuatu)' } l['kri'] = { nom = 'krio' } l['krj'] = { nom = 'kinaray-a' } l['krk'] = { nom = 'kerek' } l['krl'] = { nom = 'carélien' } l['kro'] = { nom = 'langues kroues', tri = 'kroues langues' } l['krp'] = { nom = 'korop' } l['krs'] = { nom = 'kresh' } l['krt'] = { nom = 'kanuri de Tumari' } l['kru'] = { nom = 'kurukh' } l['krx'] = { nom = 'karon' } l['kry'] = { nom = 'kryz' } l['ks'] = { nom = 'kashmiri', wiktionnaire = true } l['ksb'] = { nom = 'shambala' } l['ksd'] = { nom = 'kuanua' } l['kse'] = { nom = 'kuni' } l['ksf'] = { nom = 'bafia' } l['ksh'] = { nom = 'francique ripuaire' } l['ksi'] = { nom = 'i’saka' } l['ksk'] = { nom = 'kansa' } l['ksn'] = { nom = 'kasiguranin' } l['ksp'] = { nom = 'kabba' } l['ksq'] = { nom = 'kwaami' } l['ksr'] = { nom = 'borong' } l['kss'] = { nom = 'kisi méridional' } l['ksv'] = { nom = 'kusu' } l['ksw'] = { nom = 'sgaw' } l['ksx'] = { nom = 'kedang' } l['ktb'] = { nom = 'kambaata' } l['ktd'] = { nom = 'kokata' } l['kte'] = { nom = 'nubri' } l['ktg'] = { nom = 'kalkatungu' } l['kti'] = { nom = 'muyu du Nord' } l['ktl'] = { nom = 'koroshi' } l['ktn'] = { nom = 'karitiana' } l['kto'] = { nom = 'kuot' } l['ktp'] = { nom = 'kaduo' } l['kts'] = { nom = 'muyu du Sud' } l['ktt'] = { nom = 'ketum' } l['ktu'] = { nom = 'kituba' } l['ktw'] = { nom = 'kato' } l['ktx'] = { nom = 'kaxararí' } l['ktz'] = { nom = 'juǀ’hoan', tri = 'ju hoan' } l['ku'] = { nom = 'kurde', wiktionnaire = true } l['kub'] = { nom = 'kutep' } l['kuc'] = { nom = 'kwinsu' } l['kud'] = { nom = '’auhelawa', tri = 'auhelawa' } l['kue'] = { nom = 'kuman' } l['kuf'] = { nom = 'katu' } l['kug'] = { nom = 'kupa' } l['kuh'] = { nom = 'kushi' } l['kui'] = { nom = 'kuikuro' } l['kuj'] = { nom = 'kuria' } l['kuk'] = { nom = 'kepo’' } l['kul'] = { nom = 'kulere' } l['kum'] = { nom = 'koumyk' } l['kumaná'] = { nom = 'kumaná' } l['kun'] = { nom = 'kunama' } l['kuo'] = { nom = 'kumukio' } l['kus'] = { nom = 'kusaal' } l['kut'] = { nom = 'kutenai' } l['kuu'] = { nom = 'kolchan' } l['kuy'] = { nom = 'kuuku-ya’u' } l['kuz'] = { nom = 'kunza' } l['kv'] = { nom = 'komi' } l['kva'] = { nom = 'bagwalal' } l['kvc'] = { nom = 'kove' } l['kvd'] = { nom = 'kui (Indonésie)' } l['kve'] = { nom = 'murut kalabakan' } l['kvf'] = { nom = 'kabalai' } l['kvg'] = { nom = 'kuni-boazi' } l['kvi'] = { nom = 'kwang' } l['kvm'] = { nom = 'kendem' } l['kvn'] = { nom = 'kuna' } l['kvo'] = { nom = 'dobel' } l['kvq'] = { nom = 'geba' } l['kvr'] = { nom = 'kerinci' } l['kvt'] = { nom = 'lahta' } l['kvw'] = { nom = 'wersing' } l['kvz'] = { nom = 'tsaukambo' } l['kw'] = { nom = 'cornique', wiktionnaire = true } l['kwa'] = { nom = 'dâw' } l['kwd'] = { nom = 'kwaio' } l['kwe'] = { nom = 'kwerba' } l['kwf'] = { nom = 'kwara’ae' } l['kwg'] = { nom = 'démé' } l['kwh'] = { nom = 'kowiai' } l['kwi'] = { nom = 'awa pit' } l['kwj'] = { nom = 'kwanga' } l['kwk'] = { nom = 'kwak’wala' } l['kwn'] = { nom = 'kwangali' } l['kwo'] = { nom = 'kwomtari' } l['kwp'] = { nom = 'kodia' } l['kwr'] = { nom = 'kwer' } l['kws'] = { nom = 'kwese' } l['kwt'] = { nom = 'kwesten' } l['kwu'] = { nom = 'kwakum' } l['kwv'] = { nom = 'sara kaba náà' } l['kxa'] = { nom = 'kairiru' } l['kxc'] = { nom = 'konso' } l['kxd'] = { nom = 'malais de Brunei' } l['kxh'] = { nom = 'karo (Éthiopie)' } l['kxj'] = { nom = 'koulfa' } l['kxm'] = { nom = 'khmer du Nord' } l['kxn'] = { nom = 'melanau kanowit' } l['kxo'] = { nom = 'kanoê' } l['kxs'] = { nom = 'kangjia' } l['kxt'] = { nom = 'koiwat' } l['kxu'] = { nom = 'kui (Inde)' } l['kxv'] = { nom = 'kuvi' } l['kxw'] = { nom = 'konai' } l['kxz'] = { nom = 'kerewo' } l['ky'] = { nom = 'kirghiz', wiktionnaire = true } l['kya'] = { nom = 'kwaya' } l['kyc'] = { nom = 'kyaka' } l['kyf'] = { nom = 'sokuya' } l['kyh'] = { nom = 'karuk' } l['kyi'] = { nom = 'kiput' } l['kyj'] = { nom = 'karao' } l['kyl'] = { nom = 'kalapuya central' } l['kyo'] = { nom = 'klon' } l['kyq'] = { nom = 'kenga' } l['kyr'] = { nom = 'kuruáya' } l['kys'] = { nom = 'baram kayan' } l['kyt'] = { nom = 'kayagar' } l['kyu'] = { nom = 'kayah li de l’Ouest' } l['kyx'] = { nom = 'rapoisi' } l['kyz'] = { nom = 'kayabi' } l['kzf'] = { nom = 'kaili de Da’a', tri = 'kaili daa' } l['kzg'] = { nom = 'kikaï' } l['kzh'] = { nom = 'dongolawi-kenzi' } l['kzi'] = { nom = 'kelabit bario' } l['kzj'] = { nom = 'kadazan penampang' } l['kzl'] = { nom = 'kayeli' } l['kzm'] = { nom = 'kais' } l['kzr'] = { nom = 'karang' } l['kzt'] = { nom = 'dusun tambunan' } l['kzu'] = { nom = 'kayupulau' } l['kzv'] = { nom = 'komyandaret' } l['kzw'] = { nom = 'karirí-xocó' } l['kzz'] = { nom = 'kalabra' } l['la'] = { nom = 'latin', portail = true, wiktionnaire = true } l['laa'] = { nom = 'subanen du Sud', tri = 'subanen sud' } l['lab'] = { nom = 'linéaire A' } l['lac'] = { nom = 'lacandon' } l['lad'] = { nom = 'judéo-espagnol' } l['lae'] = { nom = 'pattani' } l['laf'] = { nom = 'lafofa' } l['lag'] = { nom = 'langi' } l['lah'] = { nom = 'lahnda' } l['lai'] = { nom = 'lambya' } l['laj'] = { nom = 'lango' } l['lak'] = { nom = 'laka (Nigeria)' } l['lala (Afrique du Sud)'] = { nom = 'lala (Afrique du Sud)' } l['lam'] = { nom = 'lamba' } l['lan'] = { nom = 'laru' } l['lap'] = { nom = 'laka' } l['laq'] = { nom = 'qabiao' } l['lar'] = { nom = 'larteh' } l['las'] = { nom = 'lama (Togo)' } l['lau'] = { nom = 'laba' } l['lauhut'] = { nom = 'lauhut' } l['law'] = { nom = 'lauje' } l['lawi'] = { nom = 'lawi' } l['lax'] = { nom = 'tiwa' } l['lay'] = { nom = 'lama (Birmanie)' } l['laz'] = { nom = 'aribwatsa' } l['lazé'] = { nom = 'lazé' } l['lb'] = { nom = 'luxembourgeois', wiktionnaire = true } l['lbc'] = { nom = 'lakkja' } l['lbe'] = { nom = 'lak' } l['lbj'] = { nom = 'ladakhi' } l['lbk'] = { nom = 'bontok central' } l['lbn'] = { nom = 'lamet' } l['lbo'] = { nom = 'laven' } l['lbq'] = { nom = 'wampar' } l['lbs'] = { nom = 'langue des signes libyennne', tri = 'signes libyenne' } l['lbt'] = { nom = 'lachi' } l['lbu'] = { nom = 'labu' } l['lbw'] = { nom = 'tolaki' } l['lbx'] = { nom = 'lawangan' } l['lby'] = { nom = 'lamu-lamu' } l['lbz'] = { nom = 'lardil' } l['lcc'] = { nom = 'legenyem' } l['lcd'] = { nom = 'lola' } l['lcl'] = { nom = 'lisela' } l['lcm'] = { nom = 'tungag' } l['lcp'] = { nom = 'lawa de l’Ouest' } l['lcq'] = { nom = 'luhu' } l['lda'] = { nom = 'kla-dan' } l['ldb'] = { nom = 'dũya' } l['ldd'] = { nom = 'luri' } l['ldi'] = { nom = 'laari' } l['ldn'] = { nom = 'láadan' } l['lea'] = { nom = 'lega de Shabunda' } l['leb'] = { nom = 'lala-bisa' } l['lec'] = { nom = 'leko' } l['led'] = { nom = 'lendu' } l['lee'] = { nom = 'lyélé' } l['lef'] = { nom = 'lelemi' } l['leg'] = { nom = 'lengua' } l['leh'] = { nom = 'lenje' } l['lei'] = { nom = 'lemio' } l['lek'] = { nom = 'leipon' } l['lel'] = { nom = 'lele (République démocratique du Congo)', tri = 'lele congo' } l['lem'] = { nom = 'nomaande' } l['len'] = { nom = 'lenca du Salvador' } l['leo'] = { nom = 'leti (Cameroun)' } l['lep'] = { nom = 'lepcha' } l['leq'] = { nom = 'lembena' } l['ler'] = { nom = 'lenkau' } l['les'] = { nom = 'lese' } l['let'] = { nom = 'amio-gelimi' } l['leu'] = { nom = 'kara (Papouasie-Nouvelle-Guinée)' } l['lev'] = { nom = 'pantar de l’Ouest' } l['lew'] = { nom = 'kaili de Ledo', tri = 'kaili ledo' } l['lex'] = { nom = 'luang' } l['ley'] = { nom = 'lemolang' } l['lez'] = { nom = 'lezghien' } l['lfn'] = { nom = 'lingua franca nova' } l['lg'] = { nom = 'ganda' } l['lga'] = { nom = 'lungga' } l['lgb'] = { nom = 'laghu' } l['lgg'] = { nom = 'lougbara' } l['lgh'] = { nom = 'laghuu' } l['lgi'] = { nom = 'lengilu’' } l['lgk'] = { nom = 'neverver' } l['lgl'] = { nom = 'wala' } l['lgm'] = { nom = 'lega-mwenga' } l['lgn'] = { nom = 'opuuo' } l['lgq'] = { nom = 'logba' } l['lgr'] = { nom = 'lengo' } l['lgt'] = { nom = 'pahi' } l['lgu'] = { nom = 'longgu' } l['lgz'] = { nom = 'ligenza' } l['lha'] = { nom = 'laha (Vietnam)' } l['lhh'] = { nom = 'laha (Indonésie)' } l['lhi'] = { nom = 'lahu shi' } l['lhm'] = { nom = 'lhomi' } l['lhn'] = { nom = 'lahanan' } l['lhp'] = { nom = 'lhokpu' } l['lhs'] = { nom = 'mlahso' } l['lht'] = { nom = 'lo-toga' } l['lhu'] = { nom = 'lahu' } l['li'] = { nom = 'limbourgeois', wiktionnaire = true } l['lia'] = { nom = 'limba central et de l’Ouest' } l['lib'] = { nom = 'likum' } l['liburnien'] = { nom = 'liburnien' } l['lic'] = { nom = 'hlaï' } l['lid'] = { nom = 'nyindrou' } l['lie'] = { nom = 'likila' } l['lif'] = { nom = 'limbou' } l['lig'] = { nom = 'ligbi' } l['light warlpiri'] = { nom = 'light warlpiri' } l['lih'] = { nom = 'lihir' } l['lii'] = { nom = 'limkhim' } l['lij-MC'] = { nom = 'monégasque' } l['lij-mc'] = { nom = 'monégasque' } l['lij'] = { nom = 'ligure' } l['lik'] = { nom = 'lika' } l['lil'] = { nom = 'lillooet' } l['lio'] = { nom = 'liki' } l['lip'] = { nom = 'sekpele' } l['liq'] = { nom = 'libido' } l['lir'] = { nom = 'anglais libérien' } l['lis'] = { nom = 'lisu' } l['lisum'] = { nom = 'lisum' } l['liu'] = { nom = 'logorik' } l['liv'] = { nom = 'livonien' } l['liw'] = { nom = 'col' } l['lix'] = { nom = 'liabuku' } l['liy'] = { nom = 'banda-bambari' } l['liz'] = { nom = 'libinza' } l['lizu'] = { nom = 'lizu' } l['lje'] = { nom = 'rampi' } l['lji'] = { nom = 'laiyolo' } l['ljl'] = { nom = 'li’o' } l['ljp'] = { nom = 'lampung' } l['lka'] = { nom = 'lakalei' } l['lkb'] = { nom = 'kabras' } l['lkc'] = { nom = 'kucong' } l['lkd'] = { nom = 'lakondê' } l['lke'] = { nom = 'kenyi' } l['lki'] = { nom = 'laki' } l['lkm'] = { nom = 'kalaamaya' } l['lkn'] = { nom = 'lakon' } l['lkt'] = { nom = 'lakota' } l['lku'] = { nom = 'kungkari' } l['lky'] = { nom = 'lokoya' } l['lla'] = { nom = 'lala-roba' } l['llb'] = { nom = 'lolo' } l['llc'] = { nom = 'lele (Guinée)' } l['lld'] = { nom = 'ladin' } l['lle'] = { nom = 'lele (Papouasie-Nouvelle-Guinée)' } l['llj'] = { nom = 'ladji ladji' } l['llk'] = { nom = 'lelak' } l['lln'] = { nom = 'lele (Tchad)' } l['llp'] = { nom = 'éfaté du Nord' } l['llq'] = { nom = 'lolak' } l['lls'] = { nom = 'langue des signes lituanienne', tri = 'signes lituanienne' } l['llu'] = { nom = 'lau' } l['lma'] = { nom = 'limba de l’Est' } l['lmb'] = { nom = 'merei' } l['lmc'] = { nom = 'limilngan' } l['lmd'] = { nom = 'lumun' } l['lme'] = { nom = 'lamé' } l['lmg'] = { nom = 'lamogai' } l['lmk'] = { nom = 'lamkang' } l['lml'] = { nom = 'raga' } l['lmn'] = { nom = 'lambadi' } l['lmo'] = { nom = 'lombard', wiktionnaire = true } l['lmp'] = { nom = 'limbum' } l['lmu'] = { nom = 'lamen' } l['lmw'] = { nom = 'miwok du lac', tri = 'miwok lac' } l['lmy'] = { nom = 'lamboya' } l['ln'] = { nom = 'lingala', wiktionnaire = true } l['lna'] = { nom = 'langbashe' } l['lnd'] = { nom = 'lundayeh' } l['lng'] = { nom = 'lombard (germanique)' } l['lnl'] = { nom = 'banda Sud central' } l['lnn'] = { nom = 'lorediakarkar' } l['lns'] = { nom = 'lamnso’' } l['lo'] = { nom = 'laotien', wiktionnaire = true } l['loa'] = { nom = 'loloda' } l['loc'] = { nom = 'inonhan' } l['loe'] = { nom = 'saluan' } l['log'] = { nom = 'logo' } l['loh'] = { nom = 'narim' } l['loi'] = { nom = 'loma (Côte d’Ivoire)' } l['loj'] = { nom = 'lou' } l['lok'] = { nom = 'loko' } l['lol'] = { nom = 'lomongo' } l['lom'] = { nom = 'loma' } l['lon'] = { nom = 'lomwe du Malawi' } l['lop'] = { nom = 'lopa' } l['lor'] = { nom = 'téén' } l['lorrain'] = { nom = 'lorrain' } l['los'] = { nom = 'loniu' } l['lot'] = { nom = 'otuho' } l['lou'] = { nom = 'créole louisianais' } l['low'] = { nom = 'tampias lobu' } l['loz'] = { nom = 'lozi' } l['lpa'] = { nom = 'lelepa' } l['lpe'] = { nom = 'lepki' } l['lpo'] = { nom = 'lipo' } l['lpx'] = { nom = 'lopit' } l['lra'] = { nom = 'rara bakati’' } l['lrc'] = { nom = 'lori du Nord' } l['lre'] = { nom = 'laurentien' } l['lrl'] = { nom = 'larestani' } l['lro'] = { nom = 'laro' } l['lrr'] = { nom = 'yamphu du Sud' } l['lrv'] = { nom = 'larevat' } l['lrz'] = { nom = 'lemerig' } l['lsa'] = { nom = 'lasguerdi' } l['lsd'] = { nom = 'lishana deni' } l['lse'] = { nom = 'lusengo' } l['lsh'] = { nom = 'lish' } l['lsi'] = { nom = 'lashi' } l['lsl'] = { nom = 'langue des signes lettonne', tri = 'signes lettonne' } l['lsm'] = { nom = 'saamia' } l['lsr'] = { nom = 'aruop' } l['lt'] = { nom = 'lituanien', wiktionnaire = true } l['ltc'] = { nom = 'chinois médiéval' } l['ltg'] = { nom = 'latgalien' } l['lti'] = { nom = 'leti (Indonésie)' } l['ltn'] = { nom = 'latundê' } l['lts'] = { nom = 'lutachoni' } l['lu'] = { nom = 'kiluba' } l['lua'] = { nom = 'luba-lulua' } l['luc'] = { nom = 'aringa' } l['lucanien'] = { nom = 'lucanien' } l['lud'] = { nom = 'ludien' } l['lue'] = { nom = 'luvale' } l['lui'] = { nom = 'luiseño' } l['lui-jua'] = { nom = 'juaneño' } l['lul'] = { nom = 'olu’bo' } l['lun'] = { nom = 'lunda' } l['luo'] = { nom = 'luo (Kenya, Tanzanie)' } l['lup'] = { nom = 'lumbu' } l['lur'] = { nom = 'laura' } l['lus'] = { nom = 'mizo' } l['lut'] = { nom = 'lushootseed' } l['luu'] = { nom = 'lumba-yakkha' } l['luv'] = { nom = 'luwati' } l['luw'] = { nom = 'luo (Cameroun)' } l['luy'] = { nom = 'luhya' } l['luz'] = { nom = 'lori du Sud' } l['lv'] = { nom = 'letton', wiktionnaire = true } l['lva'] = { nom = 'makuva' } l['lvk'] = { nom = 'lavukaleve' } l['lwg'] = { nom = 'wanga' } l['lwl'] = { nom = 'lawa de l’Est' } l['lwm'] = { nom = 'laomien' } l['lwo'] = { nom = 'luwo' } l['lww'] = { nom = 'lewo' } l['lyg'] = { nom = 'lyngngam' } l['lzh'] = { nom = 'chinois classique', wmlien = 'zh-classical' } l['lzl'] = { nom = 'litzlitz' } l['lzn'] = { nom = 'leinong' } l['lzz'] = { nom = 'laze' } l['ma pnaan'] = { nom = 'ma pnaan' } l['maa'] = { nom = 'mazatèque d’Eloxochitlán', tri = 'mazateque eloxochitlan' } l['mad'] = { nom = 'madourais' } l['mae'] = { nom = 'bo-rukul' } l['maf'] = { nom = 'mafa' } l['mag'] = { nom = 'magahi' } l['mai'] = { nom = 'maithili' } l['maj'] = { nom = 'mazatèque de Jalapa de Díaz', tri = 'mazateque jalapa diaz' } l['mak'] = { nom = 'makassar' } l['mam'] = { nom = 'mam' } l['man'] = { nom = 'mandingue' } l['map'] = { nom = 'langues austronésiennes', tri = 'austronesiennes langues' } l['map-bms'] = { nom = 'banyumasan' } l['maq'] = { nom = 'mazatèque de Chiquihuitlán', tri = 'mazateque chiquihuitlan' } l['mas'] = { nom = 'massaï' } l['mat'] = { nom = 'matlatzinca de San Francisco' } l['mau'] = { nom = 'mazatèque de Huautla', tri = 'mazateque huautla' } l['mav'] = { nom = 'mawé-sateré' } l['maw'] = { nom = 'mampruli' } l['max'] = { nom = 'malais de Ternate' } l['mayennais'] = { nom = 'mayennais' } l['maz'] = { nom = 'mazahua central' } l['mba'] = { nom = 'higaonon' } l['mbb'] = { nom = 'manobo de l’Ouest de Bukidnon', tri = 'manobo bukidnon ouest' } l['mbc'] = { nom = 'macushi' } l['mbd'] = { nom = 'manobo de Dibabawon', tri = 'manobo dibabawon' } l['mbe'] = { nom = 'molala' } l['mbh'] = { nom = 'mangseng' } l['mbi'] = { nom = 'manobo d’Ilianen', tri = 'manobo ilianen' } l['mbj'] = { nom = 'nadëb' } l['mbk'] = { nom = 'malol' } l['mbl'] = { nom = 'maxakalí' } l['mbn'] = { nom = 'macaguán' } l['mbp'] = { nom = 'damana' } l['mbq'] = { nom = 'maisin' } l['mbr'] = { nom = 'nukak' } l['mbs'] = { nom = 'manobo de Sarangani', tri = 'manobo sarangani' } l['mbt'] = { nom = 'manobo de Matigsalug', tri = 'manobo matigsalug' } l['mbu'] = { nom = 'mbula-bwazza' } l['mbw'] = { nom = 'maring' } l['mby'] = { nom = 'memoni' } l['mca'] = { nom = 'maká' } l['mcb'] = { nom = 'machiguenga' } l['mcd'] = { nom = 'marinahua' } l['mcf'] = { nom = 'matsés' } l['mcg'] = { nom = 'mapoyo' } l['mch'] = { nom = 'de’cuana' } l['mci'] = { nom = 'mesem' } l['mcj'] = { nom = 'mvanip' } l['mck'] = { nom = 'mbunda' } l['mcl'] = { nom = 'macaguaje' } l['mcm'] = { nom = 'kristang' } l['mcn'] = { nom = 'masa' } l['mco'] = { nom = 'mixe de Coatlán' } l['mcp'] = { nom = 'makaa' } l['mcr'] = { nom = 'menya' } l['mcs'] = { nom = 'mambai' } l['mct'] = { nom = 'manguissa' } l['mcu'] = { nom = 'ba mambila' } l['mcv'] = { nom = 'minanibai' } l['mcw'] = { nom = 'mawa' } l['mcx'] = { nom = 'mpiemo' } l['mcy'] = { nom = 'watut du Sud' } l['mcz'] = { nom = 'mawan' } l['mda'] = { nom = 'mada (Nigéria)' } l['mdb'] = { nom = 'morigi' } l['mdc'] = { nom = 'male' } l['mdd'] = { nom = 'mbum' } l['mde'] = { nom = 'maba (Tchad)' } l['mdf'] = { nom = 'mokcha' } l['mdg'] = { nom = 'massalat' } l['mdh'] = { nom = 'maguindanao' } l['mdi'] = { nom = 'mamvu' } l['mdk'] = { nom = 'mangbutu' } l['mdm'] = { nom = 'mayogo' } l['mdp'] = { nom = 'mbala' } l['mdr'] = { nom = 'mandar' } l['mds'] = { nom = 'maria (Papouasie-Nouvelle-Guinée)' } l['mdw'] = { nom = 'mbochi' } l['mdx'] = { nom = 'dizi' } l['mdy'] = { nom = 'maale' } l['mea'] = { nom = 'menka' } l['meb'] = { nom = 'ikobi' } l['mec'] = { nom = 'mara' } l['med'] = { nom = 'melpa' } l['mee'] = { nom = 'mengen' } l['mef'] = { nom = 'megam' } l['meh'] = { nom = 'mixtèque de Tlaxiaco du Sud-Ouest', tri = 'mixteque tlaxiaco sud ouest' } l['mei'] = { nom = 'midob' } l['mej'] = { nom = 'meyah' } l['mek'] = { nom = 'mekeo' } l['mel'] = { nom = 'melanau central' } l['mem'] = { nom = 'mangala' } l['men'] = { nom = 'mendé' } l['menien'] = { nom = 'menien' } l['meo'] = { nom = 'malais kedah' } l['me’phaa de Huehuetepec'] = { nom = 'me’phaa de Huehuetepec', tri = 'mephaa Huehuetepec' } l['me’phaa de Huitzapula'] = { nom = 'me’phaa de Huitzapula', tri = 'mephaa Huitzapula' } l['me’phaa de Nanzintla'] = { nom = 'me’phaa de Nanzintla', tri = 'mephaa Nanzintla' } l['me’phaa de Teocuitlapa'] = { nom = 'me’phaa de Teocuitlapa', tri = 'mephaa Teocuitlapa' } l['me’phaa de Zapotitlan Tablas'] = { nom = 'me’phaa de Zapotitlan Tablas', tri = 'mephaa Zapotitlan Tablas' } l['meq'] = { nom = 'mere' } l['mer'] = { nom = 'meru' } l['mes'] = { nom = 'masmaje' } l['met'] = { nom = 'mato' } l['meu'] = { nom = 'motou' } l['mev'] = { nom = 'mano' } l['mew'] = { nom = 'maaka' } l['mey'] = { nom = 'hassanya' } l['mez'] = { nom = 'menominee' } l['mfa'] = { nom = 'malais de Pattani' } l['mfe'] = { nom = 'créole mauricien' } l['mff'] = { nom = 'naki' } l['mfg'] = { nom = 'mogofin' } l['mfh'] = { nom = 'matal' } l['mfi'] = { nom = 'wandala' } l['mfj'] = { nom = 'mefele' } l['mfn'] = { nom = 'mbembe Cross River' } l['mfp'] = { nom = 'malais de Makassar' } l['mfr'] = { nom = 'marithiel' } l['mfv'] = { nom = 'manjak', tri = 'manjaque' } l['mfx'] = { nom = 'melo' } l['mfy'] = { nom = 'mayo' } l['mfz'] = { nom = 'mabaan' } l['mg'] = { nom = 'malgache', wiktionnaire = true } l['mga'] = { nom = 'moyen irlandais', tri = 'irlandais moyen' } l['mgc'] = { nom = 'morokodo' } l['mgd'] = { nom = 'moru' } l['mgf'] = { nom = 'maklew' } l['mgh'] = { nom = 'makhuwa-meetto' } l['mgi'] = { nom = 'lijili' } l['mgj'] = { nom = 'abureni' } l['mgk'] = { nom = 'mawes' } l['mgm'] = { nom = 'mambae' } l['mgo'] = { nom = 'meta’' } l['mgp'] = { nom = 'magar oriental' } l['mgq'] = { nom = 'malila' } l['mgr'] = { nom = 'mambwe-lungu' } l['mgs'] = { nom = 'manda (Tanzanie)' } l['mgv'] = { nom = 'matengo' } l['mgw'] = { nom = 'matumbi' } l['mgz'] = { nom = 'mbugwe' } l['mh'] = { nom = 'marshallais', wiktionnaire = true } l['mha'] = { nom = 'manda (Inde)' } l['mhb'] = { nom = 'mahongwe' } l['mhc'] = { nom = 'mocho' } l['mhe'] = { nom = 'mah meri' } l['mhi'] = { nom = 'ma’di' } l['mhj'] = { nom = 'moghol' } l['mhl'] = { nom = 'mauwake' } l['mhm'] = { nom = 'makhuwa-moniga' } l['mhn'] = { nom = 'mochène' } l['mho'] = { nom = 'mashi (Zambie)' } l['mhq'] = { nom = 'mandan' } l['mhr'] = { nom = 'mari de l’Est' } l['mhs'] = { nom = 'buru' } l['mht'] = { nom = 'mandahuaca' } l['mhu'] = { nom = 'digaro' } l['mhx'] = { nom = 'maru' } l['mhy'] = { nom = 'ma’anyan' } l['mhz'] = { nom = 'moor' } l['mi'] = { nom = 'maori', wiktionnaire = true } l['mia'] = { nom = 'miami' } l['miao de Xiaozhang'] = { nom = 'miao de Xiaozhang', tri = 'miao xiaozhang' } l['mib'] = { nom = 'mixtèque d’Atatláhuca', tri = 'mixteque atatlahuca' } l['mic'] = { nom = 'micmac' } l['mid'] = { nom = 'néo-mandéen', tri = 'mandeen neo' } l['mie'] = { nom = 'mixtèque d’Ocotepec', tri = 'mixteque ocotepec' } l['mif'] = { nom = 'mofu-gudur' } l['mig'] = { nom = 'mixtèque de San Miguel El Grande', tri = 'mixteque san miguel el grande' } l['mih'] = { nom = 'mixtèque de Chayuco', tri = 'mixteque chayuco' } l['mii'] = { nom = 'mixtèque de Chigmecatitlán', tri = 'mixteque chigmecatitlan' } l['mij'] = { nom = 'abar' } l['mik'] = { nom = 'mikasuki' } l['mik-hit'] = { nom = 'hitchiti' } l['mil'] = { nom = 'mixtèque de Peñoles', tri = 'mixteque penoles' } l['milang'] = { nom = 'milang' } l['mim'] = { nom = 'mixtèque d’Alacatlatzala', tri = 'mixteque alacatlatzala' } l['min'] = { nom = 'minangkabau', wiktionnaire = true } l['mio'] = { nom = 'mixtèque de Pinotepa Nacional', tri = 'mixteque pinotepa nacional' } l['mip'] = { nom = 'mixtèque d’Apasco-Apoala', tri = 'mixteque apasco apoala' } l['miq'] = { nom = 'miskito' } l['mir'] = { nom = 'mixe de l’Isthme', tri = 'mixe de isthme' } l['miri'] = { nom = 'miri' } l['mis'] = { nom = 'langues non codées', tri = '*non codees langues' } l['mit'] = { nom = 'mixtèque du sud de Puebla', tri = 'mixteque puebla sud' } l['mithaka'] = { nom = 'mithaka' } l['miw'] = { nom = 'akoye' } l['mix'] = { nom = 'mixtèque de Mixtepec', tri = 'mixteque mixtepec' } l['miy'] = { nom = 'mixtèque d’Ayutla', tri = 'mixteque ayutla' } l['miz'] = { nom = 'mixtèque de Coatzospan', tri = 'mixteque coatzospan' } l['mjc'] = { nom = 'mixtèque de San Juan Colorado', tri = 'mixteque san juan colorado' } l['mjd'] = { nom = 'konkow' } l['mje'] = { nom = 'muskum' } l['mjg'] = { nom = 'monguor' } l['mjh'] = { nom = 'mwera (Nyasa)' } l['mji'] = { nom = 'kim mun' } l['mjj'] = { nom = 'mawak' } l['mjm'] = { nom = 'medebur' } l['mjr'] = { nom = 'malavedan' } l['mjt'] = { nom = 'sauria pahahria' } l['mjv'] = { nom = 'mannan' } l['mjw'] = { nom = 'karbi' } l['mjx'] = { nom = 'mahali' } l['mjy'] = { nom = 'mohican' } l['mk'] = { nom = 'macédonien', wiktionnaire = true } l['mkc'] = { nom = 'siliput' } l['mkf'] = { nom = 'miya' } l['mkg'] = { nom = 'mak (Chine)' } l['mkh'] = { nom = 'langues môn-khmères', tri = 'mon khmeres langues' } l['mkj'] = { nom = 'mokil' } l['mkm'] = { nom = 'moklen' } l['mkn'] = { nom = 'malais de Kupang' } l['mkp'] = { nom = 'moikodi' } l['mkq'] = { nom = 'miwok de la baie', tri = 'miwok baie' } l['mks'] = { nom = 'mixtèque de Silacayoapan', tri = 'mixteque silacayoapan' } l['mku'] = { nom = 'konyanka' } l['mkv'] = { nom = 'mavea' } l['mkw'] = { nom = 'munukutuba' } l['mkx'] = { nom = 'quinamiguin' } l['mky'] = { nom = 'makian de l’Est' } l['mkz'] = { nom = 'makasae' } l['ml'] = { nom = 'malayalam', wiktionnaire = true } l['mla'] = { nom = 'tamambo' } l['mlc'] = { nom = 'cao lan' } l['mle'] = { nom = 'manambu' } l['mlf'] = { nom = 'mal' } l['mlh'] = { nom = 'mape' } l['mlj'] = { nom = 'milju' } l['mlk'] = { nom = 'ilwana' } l['mll'] = { nom = 'malua bay' } l['mlm'] = { nom = 'mulam' } l['mlp'] = { nom = 'bargam' } l['mlq'] = { nom = 'malinké occidental' } l['mlr'] = { nom = 'vamé' } l['mls'] = { nom = 'masalit' } l['mlu'] = { nom = 'toqabaqita' } l['mlv'] = { nom = 'mwotlap' } l['mlw'] = { nom = 'moloko' } l['mlx'] = { nom = 'naha’ai' } l['mma'] = { nom = 'mama' } l['mmb'] = { nom = 'momina' } l['mmc'] = { nom = 'mazahua du Michoacán' } l['mmd'] = { nom = 'maonan' } l['mme'] = { nom = 'mae' } l['mmf'] = { nom = 'mundat' } l['mmg'] = { nom = 'ambrym du Nord' } l['mmh'] = { nom = 'mehináku' } l['mmi'] = { nom = 'musar' } l['mmm'] = { nom = 'maii' } l['mmn'] = { nom = 'mamanwa' } l['mmp'] = { nom = 'siawi' } l['mmr'] = { nom = 'miao du Xiangxi occidental', tri = 'miao xiangxi occidental' } l['mmt'] = { nom = 'malalamai' } l['mmu'] = { nom = 'mmaala' } l['mmw'] = { nom = 'emae' } l['mmx'] = { nom = 'madak' } l['mmy'] = { nom = 'migaama' } l['mn'] = { nom = 'mongol', wiktionnaire = true } l['mna'] = { nom = 'mbula' } l['mnb'] = { nom = 'muna' } l['mnc'] = { nom = 'mandchou' } l['mnd'] = { nom = 'mondé' } l['mne'] = { nom = 'naba' } l['mnf'] = { nom = 'mundani' } l['mng'] = { nom = 'mnong de l’Est' } l['mnh'] = { nom = 'mono (République démocratique du Congo)', tri = 'mono congo' } l['mni'] = { nom = 'manipourî', wiktionnaire = true } l['mnj'] = { nom = 'munji' } l['mnk'] = { nom = 'mandinka' } l['mnl'] = { nom = 'tiale' } l['mno'] = { nom = 'langues manobos', tri = 'manobos langues' } l['mnp'] = { nom = 'minbei' } l['mnr'] = { nom = 'mono (États-Unis d’Amérique)', tri = 'mono etats unis damerique' } l['mns'] = { nom = 'mansi' } l['mnu'] = { nom = 'mer' } l['mnv'] = { nom = 'rennellais' } l['mnw'] = { nom = 'môn', wiktionnaire = true } l['mnx'] = { nom = 'manikion' } l['mnz'] = { nom = 'moni' } l['mo'] = { nom = 'moldave' } l['moa'] = { nom = 'mwan' } l['moc'] = { nom = 'mocoví' } l['mod'] = { nom = 'mobilien' } l['moe'] = { nom = 'innu' } l['moésien'] = { nom = 'moésien' } l['mof'] = { nom = 'mohegan-montauk-narragansett' } l['mog'] = { nom = 'mongondow' } l['moh'] = { nom = 'mohawk' } l['moi'] = { nom = 'mboi' } l['mok'] = { nom = 'morori' } l['mom'] = { nom = 'mangue' } l['monégasque'] = { nom = 'monégasque' } l['moo'] = { nom = 'monom' } l['mop'] = { nom = 'mopan' } l['mor'] = { nom = 'moro' } l['mos'] = { nom = 'moré' } l['mot'] = { nom = 'barí' } l['mou'] = { nom = 'mogum' } l['mov'] = { nom = 'mohave' } l['mow'] = { nom = 'moï (Congo)' } l['mox'] = { nom = 'molima' } l['moy'] = { nom = 'shakacho' } l['moyen danois'] = { nom = 'moyen danois', tri = 'danois moyen' } l['moyen écossais'] = { nom = 'moyen écossais', tri = 'ecossais moyen' } l['moyen khmer'] = { nom = 'moyen khmer', tri = 'khmer moyen' } l['moyen polonais'] = { nom = 'moyen polonais', tri = 'polonais moyen' } l['moyfaw'] = { nom = 'moyfaw' } l['moz'] = { nom = 'gergiko' } l['mpa'] = { nom = 'mpoto' } l['mpb'] = { nom = 'mullukmulluk' } l['mpc'] = { nom = 'mangarayi' } l['mpd'] = { nom = 'machineri' } l['mpe'] = { nom = 'majang' } l['mpg'] = { nom = 'marba' } l['mph'] = { nom = 'maung' } l['mpi'] = { nom = 'mpade' } l['mpj'] = { nom = 'martu wangka' } l['mpk'] = { nom = 'mbara (Tchad)' } l['mpl'] = { nom = 'watut central' } l['mpm'] = { nom = 'mixtèque de Yosondúa', tri = 'mixteque yosondua' } l['mpo'] = { nom = 'miu' } l['mpp'] = { nom = 'migabac' } l['mpq'] = { nom = 'matís' } l['mpr'] = { nom = 'vangunu' } l['mps'] = { nom = 'dadibi' } l['mpt'] = { nom = 'mian' } l['mpu'] = { nom = 'makuráp' } l['mpv'] = { nom = 'mungkip' } l['mpz'] = { nom = 'mpi' } l['mqb'] = { nom = 'mbuko' } l['mqe'] = { nom = 'matepi' } l['mqf'] = { nom = 'momuna' } l['mqj'] = { nom = 'mamasa' } l['mqm'] = { nom = 'marquisien du Sud' } l['mqn'] = { nom = 'moronene' } l['mqo'] = { nom = 'modole' } l['mqp'] = { nom = 'manipa' } l['mqq'] = { nom = 'minokok' } l['mqr'] = { nom = 'mander' } l['mqs'] = { nom = 'makian de l’Ouest' } l['mqu'] = { nom = 'mandari' } l['mqv'] = { nom = 'mosimo' } l['mqw'] = { nom = 'murupi' } l['mqx'] = { nom = 'mamuju' } l['mqy'] = { nom = 'manggarai' } l['mqz'] = { nom = 'pano-malasanga' } l['mr'] = { nom = 'marathe', wiktionnaire = true } l['mra'] = { nom = 'mlabri' } l['mrb'] = { nom = 'sungwadia' } l['mrc'] = { nom = 'maricopa' } l['mrd'] = { nom = 'magar de l’Ouest' } l['mre'] = { nom = 'langue des signes de Martha’s Vineyard', tri = 'signes Marthas Vineyard' } l['mrf'] = { nom = 'elseng' } l['mrg'] = { nom = 'mising' } l['mrh'] = { nom = 'mara chin' } l['mrj'] = { nom = 'mari de l’Ouest' } l['mrk'] = { nom = 'hmwaveke' } l['mrl'] = { nom = 'mortlock' } l['mrm'] = { nom = 'mwerlap' } l['mrn'] = { nom = 'cheke holo' } l['mro'] = { nom = 'mru' } l['mrp'] = { nom = 'morouas' } l['mrq'] = { nom = 'marquisien du Nord' } l['mrr'] = { nom = 'maria (Inde)' } l['mrs'] = { nom = 'maragus' } l['mrt'] = { nom = 'margi' } l['mru'] = { nom = 'mono (Cameroun)' } l['mrv'] = { nom = 'mangarévien' } l['mrw'] = { nom = 'maranao' } l['mrx'] = { nom = 'maremgi' } l['mry'] = { nom = 'mandaya' } l['mrz'] = { nom = 'marind' } l['ms'] = { nom = 'malais', wiktionnaire = true } l['msb'] = { nom = 'masbatenyo' } l['msc'] = { nom = 'sankaran' } l['msd'] = { nom = 'langue des signes maya de Yucatec' } l['mse'] = { nom = 'moussey' } l['msf'] = { nom = 'mekwei' } l['msg'] = { nom = 'moraid' } l['msj'] = { nom = 'ma (Congo-Kinshasa)', tri = 'ma congo' } l['msk'] = { nom = 'mansaka' } l['msl'] = { nom = 'molof' } l['msm'] = { nom = 'manobo agusan' } l['msn'] = { nom = 'vurës' } l['mso'] = { nom = 'mombum' } l['msq'] = { nom = 'caac' } l['msu'] = { nom = 'musom' } l['mt'] = { nom = 'maltais', wiktionnaire = true } l['mta'] = { nom = 'manobo de Cotabato', tri = 'manobo cotabato' } l['mtb'] = { nom = 'agni morofoué' } l['mtc'] = { nom = 'munit' } l['mtd'] = { nom = 'mualang' } l['mte'] = { nom = 'mono (Salomon)' } l['mtf'] = { nom = 'murik (Papouasie-Nouvelle-Guinée)' } l['mtg'] = { nom = 'una' } l['mth'] = { nom = 'munggui' } l['mti'] = { nom = 'maiwa (Papouasie-Nouvelle-Guinée)' } l['mtj'] = { nom = 'moskona' } l['mtl'] = { nom = 'montol' } l['mtn'] = { nom = 'matagalpa' } l['mto'] = { nom = 'mixe de Totontepec' } l['mtp'] = { nom = 'wichi' } l['mtq'] = { nom = 'muong' } l['mtt'] = { nom = 'mota' } l['mtu'] = { nom = 'mixtèque de Tututepec', tri = 'mixteque tututepec' } l['mtv'] = { nom = 'asaro’o' } l['mty'] = { nom = 'nabi' } l['mua'] = { nom = 'moundang' } l['mub'] = { nom = 'moubi' } l['muc'] = { nom = 'mbu’' } l['mud'] = { nom = 'aléoute de Medny' } l['mug'] = { nom = 'mousgoum' } l['muh'] = { nom = 'mündü' } l['mui'] = { nom = 'musi' } l['muj'] = { nom = 'mabire' } l['mul'] = { nom = 'langues multiples', tri = '*multiples langues' } l['mum'] = { nom = 'maiwala' } l['mun'] = { nom = 'langues moundas', tri = 'moundas langues' } l['mup'] = { nom = 'malvi' } l['mur'] = { nom = 'murle' } l['murut nabaay'] = { nom = 'murut nabaay' } l['mus'] = { nom = 'creek' } l['mus-sem'] = { nom = 'séminole' } l['mut'] = { nom = 'muria occidental' } l['muu'] = { nom = 'yaaku' } l['muv'] = { nom = 'muduva' } l['mux'] = { nom = 'bo-ung' } l['muy'] = { nom = 'muyang' } l['muz'] = { nom = 'mursi' } l['mva'] = { nom = 'manam' } l['mvb'] = { nom = 'mattole' } l['mvf'] = { nom = 'mongol de Chine' } l['mvi'] = { nom = 'miyako' } l['mvm'] = { nom = 'muya' } l['mvo'] = { nom = 'marovo' } l['mvp'] = { nom = 'duri' } l['mvr'] = { nom = 'marau' } l['mvt'] = { nom = 'mpotovoro' } l['mvv'] = { nom = 'murut tagol' } l['mvz'] = { nom = 'mesqan' } l['mwd'] = { nom = 'mudbura' } l['mwe'] = { nom = 'mwera (Chimwera)' } l['mwf'] = { nom = 'murrinh-patha' } l['mwg'] = { nom = 'aiklep' } l['mwi'] = { nom = 'ninde' } l['mwk'] = { nom = 'maninka de Kita' } l['mwl'] = { nom = 'mirandais' } l['mwm'] = { nom = 'sar' } l['mwo'] = { nom = 'maewo central' } l['mwp'] = { nom = 'kala lagaw ya' } l['mwr'] = { nom = 'marvari' } l['mwt'] = { nom = 'moken' } l['mww'] = { nom = 'hmong blanc' } l['mxb'] = { nom = 'mixtèque de Tezoatlán', tri = 'mixteque tezoatlan' } l['mxd'] = { nom = 'modang' } l['mxe'] = { nom = 'ifira-mele' } l['mxi'] = { nom = 'mozarabe' } l['mxj'] = { nom = 'miju' } l['mxk'] = { nom = 'monumbo' } l['mxn'] = { nom = 'moï (Indonésie)' } l['mxp'] = { nom = 'mixe de Tlahuitoltepec' } l['mxr'] = { nom = 'murik' } l['mxt'] = { nom = 'mixtèque de Jamiltepec', tri = 'mixteque jamiltepec' } l['mxx'] = { nom = 'mahou' } l['mxy'] = { nom = 'mixtèque de Nochixtlán du Sud-Est', tri = 'mixteque nochixtlan sud est' } l['mxz'] = { nom = 'masela central' } l['my'] = { nom = 'birman', wiktionnaire = true } l['myb'] = { nom = 'mbay' } l['mye'] = { nom = 'myènè' } l['myf'] = { nom = 'mao du Nord' } l['myg'] = { nom = 'manta' } l['myh'] = { nom = 'makah' } l['myk'] = { nom = 'mamara' } l['myl'] = { nom = 'moma' } l['mym'] = { nom = 'me’en' } l['myn'] = { nom = 'langues mayas', tri = 'mayas langues' } l['myp'] = { nom = 'pirahã' } l['myq'] = { nom = 'maninka de forêt' } l['myr'] = { nom = 'muniche' } l['mysien'] = { nom = 'mysien' } l['myu'] = { nom = 'mundurukú' } l['myv'] = { nom = 'erza' } l['myw'] = { nom = 'muyuw' } l['myx'] = { nom = 'masaba' } l['myy'] = { nom = 'macuna' } l['mza'] = { nom = 'mixtèque de Santa María Zacatepec', tri = 'mixteque santa maria zacatepec' } l['mzb'] = { nom = 'mozabite' } l['mzd'] = { nom = 'malimba' } l['mzh'] = { nom = 'wichí lhamtés güisnay' } l['mzi'] = { nom = 'mazatèque d’Ixcatlán', tri = 'mazateque ixcatlan' } l['mzj'] = { nom = 'manya' } l['mzk'] = { nom = 'mambila de l’Ouest' } l['mzm'] = { nom = 'mumuye' } l['mzn'] = { nom = 'mazandarani' } l['mzp'] = { nom = 'movima' } l['mzq'] = { nom = 'mori atas' } l['mzr'] = { nom = 'marúbo' } l['mzs'] = { nom = 'créole de Macao', tri = 'creole macao' } l['mzv'] = { nom = 'manza' } l['mzw'] = { nom = 'deg' } l['na'] = { nom = 'nauruan', wiktionnaire = true } l['naa'] = { nom = 'namla' } l['nab'] = { nom = 'nambikwara du Sud' } l['nac'] = { nom = 'narak' } l['nad'] = { nom = 'nijadali' } l['nadou'] = { nom = 'nadou' } l['nae'] = { nom = 'naka’ela' } l['naf'] = { nom = 'nabak' } l['nag'] = { nom = 'nagamais' } l['nah'] = { nom = 'nahuatl', wiktionnaire = true } l['nai'] = { nom = 'langues nord-amérindiennes', tri = 'nord amerindiennes langues' } l['nak'] = { nom = 'nakanai' } l['nal'] = { nom = 'nalik' } l['nam'] = { nom = 'ngan’gityemerri' } l['nan'] = { nom = 'minnan', wmlien = 'zh-min-nan', wiktionnaire = true } l['nanga ira’'] = { nom = 'nanga ira’' } l['nao'] = { nom = 'naaba' } l['nap'] = { nom = 'napolitain' } l['naq'] = { nom = 'nama (khoe)' } l['nar'] = { nom = 'iguta' } l['nas'] = { nom = 'naasioi' } l['nat'] = { nom = 'hungworo' } l['navarro-aragonais'] = { nom = 'navarro-aragonais' } l['na’vi'] = { nom = 'na’vi' } l['naw'] = { nom = 'nawuri' } l['nay'] = { nom = 'ngarrindjeri' } l['naz'] = { nom = 'nahuatl du Coatepec', tri = 'nahuatl Coatepec' } l['nb'] = { nom = 'norvégien (bokmål)', wmlien = 'no', wiktionnaire = true } l['nba'] = { nom = 'ngangela' } l['nbb'] = { nom = 'ndoe' } l['nbc'] = { nom = 'chang naga' } l['nbe'] = { nom = 'konyak' } l['nbh'] = { nom = 'ngamo' } l['nbi'] = { nom = 'mao' } l['nbk'] = { nom = 'nake' } l['nbn'] = { nom = 'kuri' } l['nbp'] = { nom = 'nnam' } l['nbr'] = { nom = 'numana-nunku-gbantu-numbu' } l['nbt'] = { nom = 'nah' } l['nbu'] = { nom = 'rongmei' } l['nbv'] = { nom = 'ngamambo' } l['nbw'] = { nom = 'ngbandi du Sud' } l['nca'] = { nom = 'iyo' } l['ncb'] = { nom = 'nicobarais central' } l['ncd'] = { nom = 'nachering' } l['nce'] = { nom = 'yale' } l['ncg'] = { nom = 'nisga’a' } l['nch'] = { nom = 'nahuatl de la Huasteca central', tri = 'nahuatl Huasteca central' } l['nci'] = { nom = 'nahuatl classique' } l['ncj'] = { nom = 'nahuatl du Puebla du Nord', tri = 'nahuatl Puebla nord' } l['nck'] = { nom = 'nakara' } l['ncl'] = { nom = 'nahuatl du Michoacán', tri = 'nahuatl Michoacan' } l['ncr'] = { nom = 'ncane' } l['nct'] = { nom = 'naga des Chothe', tri = 'naga chothe' } l['ncx'] = { nom = 'nahuatl du Puebla central', tri = 'nahuatl Puebla central' } l['ncz'] = { nom = 'natchez' } l['nd'] = { nom = 'ndébélé du Nord' } l['nda'] = { nom = 'ndasa' } l['ndc'] = { nom = 'ndau' } l['ndd'] = { nom = 'nde-nsele-nta' } l['ndg'] = { nom = 'ndengereko' } l['ndh'] = { nom = 'ndali' } l['ndi'] = { nom = 'samba leko' } l['ndj'] = { nom = 'ndamba' } l['ndm'] = { nom = 'ndam' } l['ndp'] = { nom = 'ndo' } l['ndr'] = { nom = 'ndoola' } l['nds'] = { nom = 'bas allemand', tri = 'allemand bas', wiktionnaire = true } l['nds-nl'] = { nom = 'bas-saxon néerlandais', tri = 'saxon bas neerlandais' } l['ndt'] = { nom = 'ndunga' } l['ndu'] = { nom = 'dugun' } l['ndv'] = { nom = 'ndut' } l['ndy'] = { nom = 'luto' } l['ndz'] = { nom = 'ndogo' } l['ne'] = { nom = 'népalais', wiktionnaire = true } l['nea'] = { nom = 'ngadha de l’Est' } l['neb'] = { nom = 'toura (Côte d’Ivoire)', tri = 'toura cote divoire' } l['nec'] = { nom = 'nedebang' } l['ned'] = { nom = 'nde-gbite' } l['nee'] = { nom = 'nêlêmwa-nixumwak' } l['nef'] = { nom = 'néfamais' } l['neg'] = { nom = 'neguidal' } l['neh'] = { nom = 'nyenkha' } l['nei'] = { nom = 'néo-hittite', tri = 'hittite neo' } l['nej'] = { nom = 'neko' } l['nek'] = { nom = 'neku' } l['nem'] = { nom = 'nemi' } l['nen'] = { nom = 'nengone' } l['neo'] = { nom = 'ná-meo' } l['ner'] = { nom = 'yahadian' } l['nes'] = { nom = 'kinnauri de Bhoti' } l['net'] = { nom = 'nete' } l['neu'] = { nom = 'neo' } l['nev'] = { nom = 'nyaheun' } l['new'] = { nom = 'newari' } l['newari du Dolakha'] = { nom = 'newari du Dolakha', tri = 'newari dolakha' } l['nex'] = { nom = 'neme' } l['ney'] = { nom = 'néyo' } l['nez'] = { nom = 'nez-percé' } l['nfa'] = { nom = 'dhao' } l['nfd'] = { nom = 'ahwaï' } l['nfl'] = { nom = 'äiwoo' } l['nfr'] = { nom = 'nafaanra' } l['ng'] = { nom = 'ndonga' } l['nga'] = { nom = 'ngbaka minagende' } l['ngadjuri'] = { nom = 'ngadjuri' } l['ngb'] = { nom = 'ngbandi du Nord' } l['ngc'] = { nom = 'ngombe (République démocratique du Congo)', tri = 'ngombe congo' } l['ngd'] = { nom = 'ngando (République centrafricaine)', tri = 'ngando centrafrique' } l['nge'] = { nom = 'mankon' } l['ngf'] = { nom = 'langues trans-néo-guinéennes', tri = 'guineennes trans neo langues' } l['ngg'] = { nom = 'ngbaka manza' } l['ngh'] = { nom = 'nǀu', tri = 'nu' } l['ngi'] = { nom = 'ngizim' } l['ngj'] = { nom = 'ngie' } l['ngk'] = { nom = 'dalabon' } l['ngl'] = { nom = 'elomwe' } l['ngn'] = { nom = 'ngwo' } l['ngo'] = { nom = 'ngoni' } l['ngp'] = { nom = 'nguu' } l['ngr'] = { nom = 'engdewu' } l['ngs'] = { nom = 'gvoko' } l['ngt'] = { nom = 'ngeq' } l['ngu'] = { nom = 'nahuatl de Guerrero', tri = 'nahuatl Guerrero' } l['ngv'] = { nom = 'nagumi' } l['nha'] = { nom = 'nhanda' } l['nhb'] = { nom = 'beng' } l['nhc'] = { nom = 'nahuatl du Tabasco', tri = 'nahuatl Tabasco' } l['nhd'] = { nom = 'guarani paraguayen' } -- aussi gug l['nhe'] = { nom = 'nahuatl de la Huasteca oriental', tri = 'nahuatl Huasteca oriental' } l['nhg'] = { nom = 'nahuatl de Tetelcingo', tri = 'nahuatl Tetelcingo' } l['nhi'] = { nom = 'nahuatl de Zacatlán', tri = 'nahuatl Zacatlan' } l['nhk'] = { nom = 'nahuatl de l’isthme de Cosoleacaque', tri = 'nahuatl Cosoleacaque isthme' } l['nhm'] = { nom = 'nahuatl du Morelos', tri = 'nahuatl Morelos' } l['nhn'] = { nom = 'nahuatl central' } l['nho'] = { nom = 'takuu' } l['nhp'] = { nom = 'nahuatl de l’isthme de Pajapan', tri = 'nahuatl Pajapan isthme' } l['nhq'] = { nom = 'nahuatl de Huaxcaleca', tri = 'nahuatl Huaxcaleca' } l['nhr'] = { nom = 'naro' } l['nht'] = { nom = 'nahuatl de l’Ometepec', tri = 'nahuatl Ometepec' } l['nhu'] = { nom = 'noone' } l['nhv'] = { nom = 'nahuatl du Temascaltepec', tri = 'nahuatl Temascaltepec' } l['nhw'] = { nom = 'nahuatl de la Huasteca occidental', tri = 'nahuatl Huasteca occidental' } l['nhx'] = { nom = 'nahuatl de l’isthme de Mecayapan', tri = 'nahuatl Mecayapan isthme' } l['nhy'] = { nom = 'nahuatl de l’Oaxaca du Nord', tri = 'nahuatl Oaxaca nord' } l['nhz'] = { nom = 'nahuatl de Santa María la Alta', tri = 'nahuatl Santa Maria la Alta' } l['nia'] = { nom = 'nias', wiktionnaire = true } l['nib'] = { nom = 'nakame' } l['nic'] = { nom = 'langues nigéro-kordofaniennes', tri = 'nigero kordofaniennes langues' } l['nid'] = { nom = 'ngandi' } l['nie'] = { nom = 'niellim' } l['nif'] = { nom = 'nek' } l['nig'] = { nom = 'ngalakan' } l['nih'] = { nom = 'nyiha (Tanzanie)' } l['nii'] = { nom = 'nii' } l['nij'] = { nom = 'ngaju dayak' } l['nik'] = { nom = 'grand nicobar' } l['nil'] = { nom = 'nila' } l['nim'] = { nom = 'nilamba' } l['nin'] = { nom = 'ninzo' } l['nio'] = { nom = 'nganassan' } l['nipissing'] = { nom = 'nipissing' } l['niq'] = { nom = 'nandi' } l['nir'] = { nom = 'nimboran' } l['nis'] = { nom = 'nimi' } l['nit'] = { nom = 'kolami du Sud-Est' } l['niu'] = { nom = 'niuéen' } l['niv'] = { nom = 'nivkh' } l['niw'] = { nom = 'nimo' } l['niy'] = { nom = 'ngiti' } l['niz'] = { nom = 'ningil' } l['nja'] = { nom = 'nzanyi' } l['njh'] = { nom = 'lotha' } l['nji'] = { nom = 'gudanji' } l['njj'] = { nom = 'njen' } l['njl'] = { nom = 'njalgulgule' } l['njm'] = { nom = 'angami' } l['njn'] = { nom = 'liangmai' } l['njo'] = { nom = 'ao' } l['njr'] = { nom = 'njerep' } l['njs'] = { nom = 'nisa' } l['njt'] = { nom = 'pidgin ndyuka-trio' } l['nkd'] = { nom = 'koireng' } l['nkg'] = { nom = 'nekgini' } l['nkh'] = { nom = 'khezha' } l['nki'] = { nom = 'thangal'} l['nkj'] = { nom = 'nakai' } l['nkk'] = { nom = 'nokuku' } l['nkm'] = { nom = 'namat' } l['nko'] = { nom = 'nkonya' } l['nkp'] = { nom = 'niuatoputapu' } l['nkr'] = { nom = 'nukuoro' } l['nkx'] = { nom = 'nkoroo' } l['nkz'] = { nom = 'nkari' } l['nl'] = { nom = 'néerlandais', portail = true, wiktionnaire = true } l['nla'] = { nom = 'ngombale' } l['nlc'] = { nom = 'nalca' } l['nld'] = { nom = 'flamand oriental' } l['nle'] = { nom = 'nyala de l’Est' } l['nlg'] = { nom = 'gela' } l['nll'] = { nom = 'nihali' } l['nln'] = { nom = 'nahuatl du Durango', tri = 'nahuatl Durango' } l['nlu'] = { nom = 'nchumbulu' } l['nlv'] = { nom = 'nahuatl de l’Orizaba', tri = 'nahuatl Orizaba' } l['nly'] = { nom = 'nyamal' } l['nlz'] = { nom = 'nalögo' } l['nma'] = { nom = 'maram naga' } l['nmb'] = { nom = 'big nambas' } l['nme'] = { nom = 'mzieme naga' } l['nmf'] = { nom = 'tangkhul naga' } l['nmk'] = { nom = 'namakura' } l['nml'] = { nom = 'ndemli' } l['nmm'] = { nom = 'manangba' } l['nmn'] = { nom = 'ǃxóõ', tri = 'xoo' } l['nmq'] = { nom = 'nambya' } l['nms'] = { nom = 'letemboi' } l['nmu'] = { nom = 'maidu du Nord-Est' } l['nmv'] = { nom = 'ngamini' } l['nmx'] = { nom = 'nama (papou)' } l['nmy'] = { nom = 'namuyi' } l['nmz'] = { nom = 'nawdm' } l['nn'] = { nom = 'norvégien (nynorsk)', wmlien = 'no', wiktionnaire = true } l['nna'] = { nom = 'nyangumarta' } l['nnb'] = { nom = 'kinande' } l['nnc'] = { nom = 'nancere' } l['nne'] = { nom = 'ngandyera' } l['nnf'] = { nom = 'ngaing' } l['nng'] = { nom = 'maring naga' } l['nnh'] = { nom = 'ngiemboon' } l['nnj'] = { nom = 'nyangatom' } l['nnm'] = { nom = 'namia' } l['nnn'] = { nom = 'ngueté' } l['nnp'] = { nom = 'naga wancho' } l['nnq'] = { nom = 'ngindo' } l['nnr'] = { nom = 'narungga' } l['nns'] = { nom = 'ningye' } l['nnt'] = { nom = 'nanticoke' } l['nnv'] = { nom = 'nugunu (Australie)' } l['nnw'] = { nom = 'nuni du Sud' } l['no'] = { nom = 'norvégien', wiktionnaire = true } l['noa'] = { nom = 'wounaan' } l['noc'] = { nom = 'nuk' } l['nod'] = { nom = 'thaï du Nord' } l['noe'] = { nom = 'nimadi' } l['nog'] = { nom = 'nogaï' } l['noi'] = { nom = 'noiri' } l['noj'] = { nom = 'nonuya' } l['nok'] = { nom = 'nooksack' } l['nol'] = { nom = 'nomlaki' } l['nom'] = { nom = 'nokamán' } l['non'] = { nom = 'vieux norrois', tri = 'norrois vieux' } l['noo'] = { nom = 'nootka' } l['nop'] = { nom = 'numanggang' } l['nordique commun'] = { nom = 'nordique commun' } l['normand'] = { nom = 'normand', wmlien = 'nrm' } l['nos'] = { nom = 'yi oriental' } l['not'] = { nom = 'nomatsiguenga' } l['nou'] = { nom = 'ewage-notu' } l['nov'] = { nom = 'novial' } l['now'] = { nom = 'nyambo' } l['noz'] = { nom = 'nayi' } l['npa'] = { nom = 'nar phu' } l['nph'] = { nom = 'phom' } l['npl'] = { nom = 'nahuatl du Puebla du Sud-Est', tri = 'nahuatl Puebla sud-est' } l['npn'] = { nom = 'mondropolon' } l['npy'] = { nom = 'napu' } l['nqm'] = { nom = 'ndom' } l['nqo'] = { nom = 'n’ko' } l['nr'] = { nom = 'ndébélé du Sud' } l['nra'] = { nom = 'ngom' } l['nrb'] = { nom = 'nara' } l['nrc'] = { nom = 'norique' } l['nre'] = { nom = 'naga des Rengma du Sud', tri = 'naga rengma sud' } l['nrg'] = { nom = 'narango' } l['nri'] = { nom = 'chokri' } l['nrk'] = { nom = 'ngarla' } l['nrl'] = { nom = 'ngarluma' } l['nrm'] = { nom = 'narum' } l['nrn'] = { nom = 'norne' } l['nrp'] = { nom = 'picène du Nord' } l['nrr'] = { nom = 'nora' } l['nrt'] = { nom = 'kalapuya du Nord', tri = 'kalapuya nord' } l['nru'] = { nom = 'mosuo' } l['nrx'] = { nom = 'ngurmbur' } l['nrz'] = { nom = 'lala' } l['nsa'] = { nom = 'naga de Sangtam', tri = 'naga sangtam' } l['nsc'] = { nom = 'nshi' } l['nsf'] = { nom = 'nisu du Nord-Ouest' } l['nsg'] = { nom = 'ongamo' } l['nsh'] = { nom = 'ngoshie' } l['nsk'] = { nom = 'naskapi' } l['nsm'] = { nom = 'sema' } l['nsn'] = { nom = 'nehan' } l['nso'] = { nom = 'sotho du Nord' } l['nsq'] = { nom = 'miwok de la Sierra du Nord', tri = 'miwok sierra nord' } l['nst'] = { nom = 'tangsa' } l['nsu'] = { nom = 'nahuatl de la Sierra Negra', tri = 'nahuatl Sierra Negra' } l['nsw'] = { nom = 'navut' } l['nsy'] = { nom = 'nasal' } l['nsz'] = { nom = 'nisenan' } l['nte'] = { nom = 'nathembo' } l['nti'] = { nom = 'natioro' } l['ntj'] = { nom = 'ngaanyatjarra' } l['ntk'] = { nom = 'ikoma-nata-isenye' } l['ntm'] = { nom = 'naténi' } l['ntp'] = { nom = 'tepehuan du Nord' } l['ntu'] = { nom = 'natügu' } l['ntw'] = { nom = 'nottoway' } l['ntz'] = { nom = 'natanzi' } l['nua'] = { nom = 'yuanga' } l['nub'] = { nom = 'langues nubiennes', tri = 'nubiennes langues' } l['nuc'] = { nom = 'nukuini' } l['nud'] = { nom = 'ngala' } l['nue'] = { nom = 'ngundu' } l['nuf'] = { nom = 'nusu' } l['nug'] = { nom = 'nungali' } l['nuh'] = { nom = 'ndunda' } l['nui'] = { nom = 'ngumbi' } l['nuj'] = { nom = 'nyole' } l['nuk'] = { nom = 'nuu-chah-nulth' } l['nul'] = { nom = 'nusa laut' } l['num'] = { nom = 'niuafo’ou' } l['nun'] = { nom = 'anong' } l['nunu de Bama'] = { nom = 'nunu de Bama' } l['nuo'] = { nom = 'nguôn' } l['nup'] = { nom = 'nupe-nupe-tako' } l['nuq'] = { nom = 'nukumanu' } l['nur'] = { nom = 'nukuria' } l['nus'] = { nom = 'naath' } l['nut'] = { nom = 'nung (Viêt Nam)' } l['nutabe'] = { nom = 'nutabe' } l['nuu'] = { nom = 'ngbundu' } l['nuv'] = { nom = 'nuni du Nord' } l['nuw'] = { nom = 'nguluwan' } l['nux'] = { nom = 'mehek' } l['nuy'] = { nom = 'nunggubuyu' } l['nuz'] = { nom = 'nahuatl de Tlamacazapa', tri = 'nahuatl Tlamacazapa' } l['nv'] = { nom = 'navajo' } l['nvh'] = { nom = 'nasarian' } l['nvo'] = { nom = 'nyokon' } l['nwa'] = { nom = 'nawathinehena' } l['nwc'] = { nom = 'newari classique' } l['nwg'] = { nom = 'ngayawang' } l['nwi'] = { nom = 'tanna du Sud-Ouest' } l['nwm'] = { nom = 'nyamusa-molo' } l['nwr'] = { nom = 'nawaru' } l['nwy'] = { nom = 'nottoway-meherrin' } l['nxa'] = { nom = 'naueti' } l['nxd'] = { nom = 'ngando (République démocratique du Congo)', tri = 'ngando congo' } l['nxe'] = { nom = 'nage' } l['nxg'] = { nom = 'ngadha' } l['nxq'] = { nom = 'naxi' } l['nxr'] = { nom = 'ninggerum' } l['nxu'] = { nom = 'narau' } l['nxx'] = { nom = 'nafri' } l['ny'] = { nom = 'nyanja' } l['nya'] = { nom = 'chichewa' } l['nyb'] = { nom = 'nyangbo' } l['nye'] = { nom = 'nyengo' } l['nyh'] = { nom = 'nyigina' } l['nyi'] = { nom = 'ama (Soudan)' } l['nyk'] = { nom = 'nyaneka' } l['nyl'] = { nom = 'nyeu' } l['nym'] = { nom = 'nyamwezi' } l['nyn'] = { nom = 'nyankore' } l['nyo'] = { nom = 'nyoro' } l['nyp'] = { nom = 'nyangi' } l['nyr'] = { nom = 'nyiha (Malawi)' } l['nys'] = { nom = 'noongar' } l['nyt'] = { nom = 'nyawaygi' } l['nyu'] = { nom = 'nyungwe' } l['nyx'] = { nom = 'nganyaywana' } l['nyy'] = { nom = 'nyakyusa-ngonde' } l['nzb'] = { nom = 'nzèbi' } l['nzi'] = { nom = 'nzéma' } l['nzz'] = { nom = 'nanga' } l['oaa'] = { nom = 'orok' } l['oac'] = { nom = 'orotch' } l['oar'] = { nom = 'araméen ancien' } l['oav'] = { nom = 'avar ancien' } l['obi'] = { nom = 'obispeño' } l['obk'] = { nom = 'bontok du Sud' } l['obl'] = { nom = 'oblo' } l['obm'] = { nom = 'moabite' } l['obo'] = { nom = 'obo' } l['obr'] = { nom = 'vieux birman', tri = 'birman vieux' } l['obt'] = { nom = 'vieux breton', tri = 'breton vieux' } l['obu'] = { nom = 'obulom' } l['oc'] = { nom = 'occitan', wiktionnaire = true } l['oca'] = { nom = 'ocaina' } l['och'] = { nom = 'chinois archaïque' } l['oco'] = { nom = 'vieux cornique', tri = 'cornique vieux' } l['ocu'] = { nom = 'matlatzinca d’Atzingo' } l['oda'] = { nom = 'odut' } l['odt'] = { nom = 'vieux néerlandais', tri = 'neerlandais vieux' } l['odu'] = { nom = 'odual' } l['ofo'] = { nom = 'ofo' } l['ofs'] = { nom = 'vieux frison', tri = 'frison vieux' } l['ofu'] = { nom = 'efutop' } l['ogb'] = { nom = 'ogbia' } l['ogc'] = { nom = 'ogba' } l['oge'] = { nom = 'ancien géorgien', tri = 'georgien ancien' } l['ogg'] = { nom = 'ogbogolo' } l['ogo'] = { nom = 'khana' } l['ogu'] = { nom = 'ogbronuagum' } l['ohu'] = { nom = 'ancien hongrois', tri = 'hongrois ancien' } l['oia'] = { nom = 'oirata' } l['oin'] = { nom = 'one d’Inebu', tri = 'one inebu' } l['oj'] = { nom = 'ojibwa' } l['ojb'] = { nom = 'ojibwa du Nord-Ouest' } l['ojc'] = { nom = 'ojibwa central' } l['ojg'] = { nom = 'ojibwa de l’Est' } l['ojp'] = { nom = 'ancien japonais', tri = 'japonais ancien' } l['ojs'] = { nom = 'oji-cri' } l['ojv'] = { nom = 'luangiua' } l['ojw'] = { nom = 'saulteaux' } l['oka'] = { nom = 'colville-okanagan' } l['okb'] = { nom = 'okobo' } l['okd'] = { nom = 'okodia' } l['oke'] = { nom = 'okpe (langue édoïde du Sud-Ouest)', tri = 'okpe edoide sud ouest' } l['oki'] = { nom = 'okiek' } l['okm'] = { nom = 'moyen coréen', tri = 'coreen moyen' } l['okn'] = { nom = 'oki-no-erabu' } l['oko'] = { nom = 'ancien coréen', tri = 'coreen ancien' } l['okr'] = { nom = 'kirike' } l['oku'] = { nom = 'oku' } l['okx'] = { nom = 'okpe (langue édoïde du Nord-Ouest)', tri = 'okpe edoide nord ouest' } l['ola'] = { nom = 'walungge' } l['old'] = { nom = 'mochi' } l['ole'] = { nom = 'olekha' } l['olk'] = { nom = 'olkol' } l['olm'] = { nom = 'oloma' } l['olo'] = { nom = 'olonetsien' } l['olr'] = { nom = 'olrat' } l['olt'] = { nom = 'vieux lituanien', tri = 'lituanien vieux' } l['olu'] = { nom = 'kuvale' } l['om'] = { nom = 'oromo', wiktionnaire = true } l['oma'] = { nom = 'omaha-ponca' } l['omb'] = { nom = 'ambae de l’Est' } l['omc'] = { nom = 'mochica' } l['ome'] = { nom = 'omejes' } l['omg'] = { nom = 'omagua' } l['omi'] = { nom = 'omi' } l['oml'] = { nom = 'ombo' } l['omn'] = { nom = 'minoéen' } l['omo'] = { nom = 'utarmbung' } l['omp'] = { nom = 'ancien manipouri', tri = 'manipouri ancien' } l['omq'] = { nom = 'langues otomangues', tri = 'otomangues langues' } l['omr'] = { nom = 'vieux marathi', tri = 'marathi vieux' } l['omt'] = { nom = 'omotik' } l['omu'] = { nom = 'omurana' } l['omv'] = { nom = 'langues omotiques', tri = 'omotiques langues' } l['omx'] = { nom = 'vieux môn', tri = 'mon vieux' } l['ona'] = { nom = 'selknam' } l['onb'] = { nom = 'lingao' } l['one'] = { nom = 'oneida' } l['ong'] = { nom = 'olo' } l['oni'] = { nom = 'onin' } l['onk'] = { nom = 'one de Kabore', tri = 'one kabore' } l['onn'] = { nom = 'onobasulu' } l['ono'] = { nom = 'onondaga' } l['onom'] = { nom = 'onomatopée', tri = '*onomatopee' } l['onp'] = { nom = 'sartang' } l['ons'] = { nom = 'ono' } l['ont'] = { nom = 'ontena' } l['onu'] = { nom = 'unua' } l['onw'] = { nom = 'ancien nubien', tri = 'nubien ancien' } l['ood'] = { nom = 'tohono o’odham' } l['oog'] = { nom = 'ong' } l['oon'] = { nom = 'onge' } l['oos'] = { nom = 'ossète ancien' } l['opa'] = { nom = 'okpamheri' } l['opm'] = { nom = 'oksapmin' } l['opo'] = { nom = 'opao' } l['opt'] = { nom = 'opata' } l['opy'] = { nom = 'ofayé' } l['or'] = { nom = 'oriya', wiktionnaire = true } l['ora'] = { nom = 'oroha' } l['orc'] = { nom = 'orma' } l['ore'] = { nom = 'orejón' } l['org'] = { nom = 'oring' } l['orh'] = { nom = 'oroqen' } l['orléanais'] = { nom = 'orléanais' } l['oro'] = { nom = 'orokolo' } l['orr'] = { nom = 'oruma' } l['ors'] = { nom = 'orang seletar' } l['ort'] = { nom = 'oriya kotia' } l['oru'] = { nom = 'ormuri' } l['orv'] = { nom = 'vieux russe', tri = 'russe vieux' } l['orx'] = { nom = 'oro' } l['orz'] = { nom = 'ormu' } l['os'] = { nom = 'ossète' } l['osa'] = { nom = 'osage' } l['osc'] = { nom = 'osque' } l['osi'] = { nom = 'osing' } l['osp'] = { nom = 'vieil espagnol', tri = 'espagnol vieil' } l['ost'] = { nom = 'osatu' } l['osx'] = { nom = 'vieux saxon', tri = 'saxon vieux' } l['ota'] = { nom = 'turc ottoman' } l['otb'] = { nom = 'tibétain ancien' } l['otd'] = { nom = 'dohoi' } l['ote'] = { nom = 'otomi de la vallée de Mezquital', tri = 'otomi mezquital vallee' } l['otk'] = { nom = 'vieux turc', tri = 'turc vieux' } l['otl'] = { nom = 'otomi de Tilapa', tri = 'otomi tilapa' } l['otm'] = { nom = 'otomi de la Sierra', tri = 'otomi sierra' } l['otn'] = { nom = 'otomi de Tenango', tri = 'otomi tenango' } l['oto'] = { nom = 'langues otomies', tri = 'otomies langues' } l['otq'] = { nom = 'otomi de Querétaro', tri = 'otomi queretaro' } l['otr'] = { nom = 'otoro' } l['ots'] = { nom = 'otomi de l’état de Mexico', tri = 'otomi mexico etat' } l['ott'] = { nom = 'otomi de Temoaya', tri = 'otomi temoaya' } l['otw'] = { nom = 'ottawa' } l['otx'] = { nom = 'otomi de Texcatepec', tri = 'otomi texcatepec' } l['otz'] = { nom = 'otomi d’Ixtenco', tri = 'otomi ixtenco' } l['oua'] = { nom = 'tagargrent' } l['oue'] = { nom = 'oune' } l['oui'] = { nom = 'vieil-ouïghour', tri = 'ouighour vieil' } l['oum'] = { nom = 'ouma' } l['oun'] = { nom = '’o’ung', tri = 'o ung' } l['ovd'] = { nom = 'elfdalien' } l['owi'] = { nom = 'owiniga' } l['owl'] = { nom = 'vieux gallois', tri = 'gallois vieux' } l['oyb'] = { nom = 'oy' } l['oyd'] = { nom = 'oyda' } l['oym'] = { nom = 'wayampi' } l['ozm'] = { nom = 'koonzime' } l['pa'] = { nom = 'pendjabi', wiktionnaire = true } l['paa'] = { nom = 'langues papoues', tri = 'papoues langues' } l['pab'] = { nom = 'parecís' } l['pac'] = { nom = 'pacoh' } l['pad'] = { nom = 'paumarí' } l['pae'] = { nom = 'pagibete' } l['paf'] = { nom = 'paranawát' } l['pag'] = { nom = 'pangasinan' } l['pah'] = { nom = 'parintintin' } l['pai'] = { nom = 'pe' } l['paikoneka'] = { nom = 'paikoneka' } l['pak'] = { nom = 'parakanã' } l['pal'] = { nom = 'pehlevi' } l['pam'] = { nom = 'kapampangan' } l['pandunia'] = { nom = 'pandunia' } l['pannonien'] = { nom = 'pannonien' } l['pao'] = { nom = 'paiute du Nord' } l['pap'] = { nom = 'papiamento' } l['par'] = { nom = 'timbisha' } l['pas'] = { nom = 'papasena' } l['pat'] = { nom = 'papitalai' } l['patagón de Bagua'] = { nom = 'patagón de Bagua' } l['patagón de Perico'] = { nom = 'patagón de Perico' } l['patwin du Sud'] = { nom = 'patwin du Sud' } l['pau'] = { nom = 'palau' } l['pav'] = { nom = 'wari’' } l['paw'] = { nom = 'pawnee' } l['pax'] = { nom = 'pankararé' } l['pay'] = { nom = 'pech' } l['paz'] = { nom = 'pankararú' } l['pbb'] = { nom = 'paez' } l['pbf'] = { nom = 'popoloca de Coyotepec' } l['pbh'] = { nom = 'e’ñepa' } l['pbi'] = { nom = 'parkwa' } l['pbl'] = { nom = 'mak (Nigeria)' } l['pbn'] = { nom = 'kpasam' } l['pbr'] = { nom = 'pangwa' } l['pbs'] = { nom = 'pame central' } l['pbt'] = { nom = 'pachto du Sud' } l['pbu'] = { nom = 'pachto du Nord' } l['pbv'] = { nom = 'pnar' } l['pby'] = { nom = 'pyu (Papouasie Nouvelle-Guinée)' } l['pca'] = { nom = 'popoloca de Santa Inés Ahuatempan' } l['pcb'] = { nom = 'pear' } l['pcc'] = { nom = 'bouyei' } l['pcd'] = { nom = 'picard' } l['pce'] = { nom = 'palaung ruching' } l['pcf'] = { nom = 'paliyan' } l['pcg'] = { nom = 'paniya' } l['pch'] = { nom = 'pardhan' } l['pci'] = { nom = 'duruwa' } l['pcj'] = { nom = 'gorum' } l['pck'] = { nom = 'paite' } l['pcl'] = { nom = 'pardhi' } l['pcm'] = { nom = 'pidgin nigérian' } l['pcn'] = { nom = 'piti' } l['pcp'] = { nom = 'pacahuara' } l['pcw'] = { nom = 'pyapun' } l['pda'] = { nom = 'anam' } l['pdc'] = { nom = 'pennsilfaanisch' } l['pdn'] = { nom = 'fedan' } l['pdo'] = { nom = 'padoe' } l['pdt'] = { nom = 'plautdietsch' } l['pea'] = { nom = 'peranakan' } l['peb'] = { nom = 'pomo de l’Est' } l['pef'] = { nom = 'pomo du Nord-Est' } l['peh'] = { nom = 'bonan' } l['pei'] = { nom = 'chichimeca-jonaz' } l['pej'] = { nom = 'pomo du Nord' } l['pel'] = { nom = 'pekal' } l['penan benalui'] = { nom = 'penan benalui' } l['penange'] = { nom = 'penange' } l['peo'] = { nom = 'vieux-perse', tri = 'perse vieux' } l['pep'] = { nom = 'kunja' } l['peq'] = { nom = 'pomo du Sud' } l['percheron'] = { nom = 'percheron' } l['pes'] = { nom = 'persan iranien' } l['pez'] = { nom = 'penan de l’Est' } l['pfa'] = { nom = 'pááfang' } l['pfe'] = { nom = 'peere' } l['pfl'] = { nom = 'palatin' } l['pgk'] = { nom = 'rerep' } l['pgl'] = { nom = 'irlandais primitif' } l['pgn'] = { nom = 'pélignien' } l['pgs'] = { nom = 'pangseng' } l['pgu'] = { nom = 'pagu' } l['pha'] = { nom = 'baheng' } l['phi'] = { nom = 'langues philippines', tri = 'philippines langues' } l['phk'] = { nom = 'phake' } l['phl'] = { nom = 'phalura' } l['phn'] = { nom = 'phénicien' } l['pho'] = { nom = 'phunoi' } l['phr'] = { nom = 'potwari' } l['pi'] = { nom = 'pali', wiktionnaire = true } l['pia'] = { nom = 'pima bajo' } l['pib'] = { nom = 'yine' } l['pic'] = { nom = 'apindji' } l['picuris'] = { nom = 'picuris' } l['pid'] = { nom = 'piaroa' } l['pie'] = { nom = 'tompiro' } l['pif'] = { nom = 'pingelap' } l['pig'] = { nom = 'pisabo' } l['pih'] = { nom = 'pitcairnais' } l['pii'] = { nom = 'pini' } l['pij'] = { nom = 'pijao' } l['pil'] = { nom = 'yom' } l['pim'] = { nom = 'powhatan' } l['pin'] = { nom = 'piame' } l['pio'] = { nom = 'piapoco' } l['pip'] = { nom = 'pero' } l['pir'] = { nom = 'piratapuya' } l['pis'] = { nom = 'pidgin des îles Salomon', tri = 'pidgin salomon' } l['pit'] = { nom = 'pitta-pitta' } l['piu'] = { nom = 'pintupi' } l['piv'] = { nom = 'vaeakau-taumako' } l['piw'] = { nom = 'pimbwe' } l['pix'] = { nom = 'piu' } l['piz'] = { nom = 'pije' } l['pjt'] = { nom = 'pitjantjatjara' } l['pkc'] = { nom = 'baekje' } l['pkn'] = { nom = 'pakanha' } l['pko'] = { nom = 'pökot' } l['pkp'] = { nom = 'pakupaku' } l['pkr'] = { nom = 'kurumba d’Attapady' } l['pkt'] = { nom = 'malieng' } l['pku'] = { nom = 'paku' } l['pl'] = { nom = 'polonais', wiktionnaire = true } l['plb'] = { nom = 'polonombauk' } l['plc'] = { nom = 'palawano central' } l['pld'] = { nom = 'polari' } l['ple'] = { nom = 'palu’e' } l['plf'] = { nom = 'langues malayo-polynésiennes centrales', tri = 'malayo polynesiennes centrales langues' } l['plg'] = { nom = 'pilagá' } l['plj'] = { nom = 'polci' } l['pll'] = { nom = 'palaung doré' } l['pln'] = { nom = 'palenquero' } l['plo'] = { nom = 'popoluca d’Oluta' } l['plodarisch'] = { nom = 'plodarisch' } l['plq'] = { nom = 'palaïte' } l['plr'] = { nom = 'palaka' } l['pls'] = { nom = 'popoloca de San Marcos Tlacoyalco' } l['plt'] = { nom = 'malgache du plateau' } l['plu'] = { nom = 'palikur' } l['plw'] = { nom = 'palawano de Brooke’s Point' } l['ply'] = { nom = 'palyu' } l['plz'] = { nom = 'murut paluan' } l['pma'] = { nom = 'paama' } l['pmb'] = { nom = 'pambia' } l['pmc'] = { nom = 'palumata' } l['pmd'] = { nom = 'pallanganmiddang' } l['pme'] = { nom = 'pwaamèi' } l['pmf'] = { nom = 'pomona' } l['pmh'] = { nom = 'prakrit maharashtri' } l['pmi'] = { nom = 'primi du Nord' } l['pmj'] = { nom = 'primi du Sud' } l['pmk'] = { nom = 'pamlico' } l['pml'] = { nom = 'lingua franca' } l['pmm'] = { nom = 'pomo' } l['pmn'] = { nom = 'pam' } l['pmo'] = { nom = 'pom' } l['pmq'] = { nom = 'pame du Nord' } l['pmr'] = { nom = 'paynamar' } l['pms'] = { nom = 'piémontais' } l['pmt'] = { nom = 'paumotu' } l['pmu'] = { nom = 'panjabi de Mirpur' } l['pmw'] = { nom = 'miwok des plaines', tri = 'miwok plaines' } l['pmx'] = { nom = 'naga poumei' } l['pmy'] = { nom = 'malais papou' } l['pmz'] = { nom = 'pame du Sud' } l['pnb'] = { nom = 'pendjabi de l’Ouest', wiktionnaire = true } l['png'] = { nom = 'pongu' } l['pnh'] = { nom = 'tongareva' } l['pni'] = { nom = 'aoheng' } l['pnk'] = { nom = 'paunaka' } l['pnn'] = { nom = 'pinai-hagahai' } l['pno'] = { nom = 'huariapano' } l['pnq'] = { nom = 'pana (Burkina Faso)' } l['pnr'] = { nom = 'panim' } l['pns'] = { nom = 'ponosakan' } l['pnt'] = { nom = 'pontique' } l['pnu'] = { nom = 'jiongnai' } l['pnv'] = { nom = 'pinigura' } l['pnw'] = { nom = 'panytyima' } l['pnx'] = { nom = 'phong-kniang' } l['pny'] = { nom = 'pinyin' } l['pnz'] = { nom = 'pana (République centrafricaine)' } l['poc'] = { nom = 'pokomam' } l['pod'] = { nom = 'ponares' } l['poe'] = { nom = 'popoloca de San Juan Atzingo' } l['pof'] = { nom = 'poke' } l['pog'] = { nom = 'potiguára' } l['poh'] = { nom = 'poqomchi’' } l['poi'] = { nom = 'popoluca de la Sierra' } l['poitevin-saintongeais'] = { nom = 'poitevin-saintongeais' } l['pom'] = { nom = 'pomo du Sud-Est' } l['pon'] = { nom = 'pohnpei' } l['poo'] = { nom = 'pomo central' } l['pop'] = { nom = 'pwapwâ' } l['poq'] = { nom = 'popoluca de Texistepec' } l['pos'] = { nom = 'popoluca de Sayula' } l['pot'] = { nom = 'potawatomi' } l['pov'] = { nom = 'créole de Guinée-Bissau', tri = 'creole guinee bissau' } l['pow'] = { nom = 'popoloca otlaltepec de San Felipe' } l['pox'] = { nom = 'polabe' } l['poy'] = { nom = 'pogoro' } l['poz'] = { nom = 'langues malayo-polynésiennes', tri = 'malayo polynesiennes langues' } l['ppa'] = { nom = 'pao' } l['ppe'] = { nom = 'papi' } l['ppi'] = { nom = 'paipai' } l['ppk'] = { nom = 'uma' } l['ppl'] = { nom = 'pipil' } l['ppm'] = { nom = 'papuma' } l['ppn'] = { nom = 'papapana' } l['ppo'] = { nom = 'folopa' } l['ppp'] = { nom = 'pelende' } l['ppt'] = { nom = 'pare' } l['ppu'] = { nom = 'papora' } l['pqa'] = { nom = 'pa’a' } l['pqe'] = { nom = 'langues malayo-polynésiennes orientales', tri = 'malayo polynesiennes orientales langues' } l['pqm'] = { nom = 'malécite-passamaquoddy' } l['pqw'] = { nom = 'langues malayo-polynésiennes occidentales', tri = 'malayo polynesiennes occidentales langues' } l['pra'] = { nom = 'langues prâkrites', tri = 'prakrites langues' } l['prb'] = { nom = 'lua’' } l['prc'] = { nom = 'parachi' } l['prd'] = { nom = 'persan dari' } l['pre'] = { nom = 'principense' } l['prf'] = { nom = 'paranan' } l['prg'] = { nom = 'vieux prussien', tri = 'prussien vieux' } l['pri'] = { nom = 'paicî' } l['prk'] = { nom = 'parauk' } l['prm'] = { nom = 'porome' } l['pro'] = { nom = 'ancien occitan', tri = 'occitan ancien' } l['prq'] = { nom = 'perené' } l['prs'] = { nom = 'dari' } l['prt'] = { nom = 'phai' } l['pru'] = { nom = 'puragi' } l['prx'] = { nom = 'purki' } l['ps'] = { nom = 'pachto', wiktionnaire = true } l['psa'] = { nom = 'aghu d’Asue', tri = 'aghu Asue' } l['psd'] = { nom = 'langue des signes des Indiens des plaines', tri = 'signes indiens plaines' } l['pse'] = { nom = 'malais central' } l['psi'] = { nom = 'pashayi du Sud-Est' } l['psl'] = { nom = 'langue des signes de Porto Rico', tri = 'signes porto rico' } l['pso'] = { nom = 'langue des signes polonaise', tri = 'signes polonaise' } l['psr'] = { nom = 'langue des signes portugaise', tri = 'signes portugaise' } l['pss'] = { nom = 'kaulong' } l['pst'] = { nom = 'pachto central' } l['psw'] = { nom = 'port Sandwich' } l['psy'] = { nom = 'piscataway' } l['pt'] = { nom = 'portugais', wiktionnaire = true } l['pth'] = { nom = 'pataxó hã-ha-hãe' } l['pti'] = { nom = 'pintiini' } l['ptq'] = { nom = 'pattapu' } l['ptr'] = { nom = 'piamatsina' } l['ptt'] = { nom = 'enrekang' } l['ptv'] = { nom = 'port vato' } l['pua'] = { nom = 'purépecha des hauts-plateaux de l’Ouest' } l['pub'] = { nom = 'purum' } l['puc'] = { nom = 'punan merap' } l['pud'] = { nom = 'punan aput' } l['pue'] = { nom = 'gününa yajich' } l['puf'] = { nom = 'punan merah' } l['pug'] = { nom = 'phuie' } l['pui'] = { nom = 'puinave' } l['puj'] = { nom = 'punan tubu’' } l['pum'] = { nom = 'puma' } l['pup'] = { nom = 'pulabu' } l['puq'] = { nom = 'puquina' } l['pur'] = { nom = 'puruborá' } l['put'] = { nom = 'putoh' } l['puu'] = { nom = 'pounou' } l['puw'] = { nom = 'puluwat' } l['puy'] = { nom = 'purisimeño' } l['pwb'] = { nom = 'panawa' } l['pwg'] = { nom = 'gapapaiwa' } l['pwi'] = { nom = 'patwin' } l['pwm'] = { nom = 'molbog' } l['pwn'] = { nom = 'paiwan' } l['pwo'] = { nom = 'pwo de l’Ouest' } l['pxm'] = { nom = 'mixe de Quetzaltepec' } l['pym'] = { nom = 'fyam' } l['pyn'] = { nom = 'poyanáwa' } l['pyu'] = { nom = 'puyuma' } l['pyx'] = { nom = 'pyu (Birmanie)' } l['pyy'] = { nom = 'pyen' } l['pzn'] = { nom = 'para naga' } l['qcx'] = { nom = 'mucuchí' } l['qdh'] = { nom = 'chapakura' } l['qij'] = { nom = 'maypure' } l['qlz'] = { nom = 'masacara' } l['qok'] = { nom = 'vieux khmer', tri = 'khmer vieux' } l['qpj'] = { nom = 'timote' } l['qpl'] = { nom = 'pamigua' } l['qu'] = { nom = 'quechua', wiktionnaire = true } l['qua'] = { nom = 'quapaw' } l['qub'] = { nom = 'quechua de Huallaga Huánuco', tri = 'quechua Huallaga Huanuco' } l['quc'] = { nom = 'quiché' } l['qud'] = { nom = 'quichua de Calderón', tri = 'quichua Calderon' } l['quf'] = { nom = 'quechua de Lambayeque', tri = 'quechua Lambayeque' } l['qug'] = { nom = 'quichua du Chimborazo', tri = 'quichua Chimborazo' } l['quh'] = { nom = 'quechua de la Bolivie du Sud', tri = 'quechua Bolivie Sud' } l['qui'] = { nom = 'quileute' } l['quk'] = { nom = 'quechua de Chachapoyas', tri = 'quechua Chachapoyas' } l['qum'] = { nom = 'sipakapense' } l['qun'] = { nom = 'quinault' } l['qur'] = { nom = 'quechua de Yanahuanca Pasco', tri = 'quechua Yanahuanca Pasco' } l['qus'] = { nom = 'quechua de Santiago del Estero', tri = 'quechua Santiago del Estero' } l['quv'] = { nom = 'sakapultèque' } l['quy'] = { nom = 'quechua d’Ayacucho', tri = 'quechua Ayacucho' } l['quz'] = { nom = 'quechua de Cuzco', tri = 'quechua Cuzco' } l['qva'] = { nom = 'quechua d’Ambo-Pasco', tri = 'quechua Ambo Pasco' } l['qvc'] = { nom = 'quechua de Cajamarca', tri = 'quechua Cajamarca' } l['qvi'] = { nom = 'quichua d’Imbabura', tri = 'quichua Imbabura' } l['qvn'] = { nom = 'quechua du Junín du Nord', tri = 'quechua Junin Nord' } l['qvo'] = { nom = 'quechua de Napo', tri = 'quechua Napo' } l['qvp'] = { nom = 'quechua de Pacaraos', tri = 'quechua Pacaraos' } l['qvs'] = { nom = 'quechua de San Martín', tri = 'quechua San Martin' } l['qvw'] = { nom = 'quechua de Huaylla Wanca', tri = 'quechua Huaylla Wanca' } l['qvy'] = { nom = 'queyu' } l['qwa'] = { nom = 'quechua de Corongo Ancash', tri = 'quechua Corongo Ancash' } l['qwc'] = { nom = 'quechua classique' } l['qwe'] = { nom = 'langues quechuas', tri = 'quechuas langues' } l['qwm'] = { nom = 'couman' } l['qwt'] = { nom = 'kwalhioqua-tlatskanai' } l['qxh'] = { nom = 'quechua de Panao Huánuco', tri = 'quechua Panao Huanuco' } l['qxl'] = { nom = 'quichua de Salasaca', tri = 'quichua Salasaca' } l['qxq'] = { nom = 'kachkaï' } l['qxs'] = { nom = 'qiang du Sud' } l['qxu'] = { nom = 'quechua d’Arequipa-La Unión', tri = 'quechua Arequipa la union' } l['qya'] = { nom = 'quenya' } l['qyp'] = { nom = 'quiripi' } l['rab'] = { nom = 'camling' } l['rac'] = { nom = 'rasawa' } l['rad'] = { nom = 'rhade' } l['rag'] = { nom = 'logoli' } l['rah'] = { nom = 'rabha' } l['raj'] = { nom = 'rajasthani' } l['rak'] = { nom = 'bohuai' } l['ral'] = { nom = 'ralte' } l['ram'] = { nom = 'canela' } l['ran'] = { nom = 'riantana' } l['rao'] = { nom = 'rao' } l['rap'] = { nom = 'rapanui' } l['rar'] = { nom = 'rarotongien' } l['ras'] = { nom = 'tegali' } l['rat'] = { nom = 'razajerdi' } l['rau'] = { nom = 'raute' } l['rav'] = { nom = 'sampang' } l['raw'] = { nom = 'rawang' } l['rax'] = { nom = 'rang' } l['ray'] = { nom = 'rapa' } l['raz'] = { nom = 'rahambuu' } l['rbb'] = { nom = 'rumai' } l['rcf'] = { nom = 'créole réunionnais' } l['rea'] = { nom = 'rerau' } l['reb'] = { nom = 'rembong' } l['ree'] = { nom = 'rejang kayan' } l['reg'] = { nom = 'kara (Tanzanie)' } l['rei'] = { nom = 'reli' } l['rej'] = { nom = 'rejang' } l['rel'] = { nom = 'rendille' } l['ren'] = { nom = 'rengao' } l['rer'] = { nom = 'rer bare' } l['res'] = { nom = 'reshe' } l['ret'] = { nom = 'retta' } l['rey'] = { nom = 'reyesano' } l['rga'] = { nom = 'roria' } l['rge'] = { nom = 'romano-grec' } l['rgn'] = { nom = 'romagnol' } l['rgr'] = { nom = 'resigaro' } l['rhg'] = { nom = 'rohingya' } l['rhp'] = { nom = 'yahang' } l['ria'] = { nom = 'riang (Inde)' } l['rif'] = { nom = 'rifain' } l['ril'] = { nom = 'riang (Birmanie)' } l['rim'] = { nom = 'nyaturu' } l['rin'] = { nom = 'nungu' } l['rir'] = { nom = 'ribun' } l['rit'] = { nom = 'ritarungo' } l['rji'] = { nom = 'raji' } l['rkb'] = { nom = 'rikbaktsa' } l['rkm'] = { nom = 'marka' } l['rm'] = { nom = 'romanche', wiktionnaire = true } l['rma'] = { nom = 'rama' } l['rmb'] = { nom = 'rembarunga' } l['rmc'] = { nom = 'romani des Carpates' } l['rme'] = { nom = 'angloromani' } l['rmf'] = { nom = 'kalo finnois' } l['rmg'] = { nom = 'voyageur norvégien' } l['rmh'] = { nom = 'murkim' } l['rmi'] = { nom = 'lomavren' } l['rml'] = { nom = 'romani balte' } l['rmm'] = { nom = 'roma' } l['rmn'] = { nom = 'romani balkanique' } l['rmo'] = { nom = 'sinte' } l['rmp'] = { nom = 'rempi' } l['rmq'] = { nom = 'caló' } l['rms'] = { nom = 'langue des signes roumaine', tri = 'signes roumaine' } l['rmt'] = { nom = 'domari' } l['rmu'] = { nom = 'tavringer' } l['rmv'] = { nom = 'romanova' } l['rmw'] = { nom = 'romani gallois' } l['rmy'] = { nom = 'vlax' } l['rmz'] = { nom = 'marma' } l['rn'] = { nom = 'kirundi', wiktionnaire = true } l['rna'] = { nom = 'runa' } l['rnd'] = { nom = 'ruund' } l['rng'] = { nom = 'ronga' } l['rnn'] = { nom = 'roon' } l['rnp'] = { nom = 'rongpo' } l['rnr'] = { nom = 'nari nari' } l['rnw'] = { nom = 'rungwa' } l['ro'] = { nom = 'roumain', wiktionnaire = true } l['roa'] = { nom = 'langues romanes', tri = 'romanes langues' } l['roa-leo'] = { nom = 'léonais' } l['roa-opt'] = { nom = 'galaïco-portugais' } l['roa-tara'] = { nom = 'tarentin' } l['rob'] = { nom = 'tae’' } l['roc'] = { nom = 'roglai de Cac Gia' } l['rod'] = { nom = 'rogo' } l['roe'] = { nom = 'ronji' } l['rof'] = { nom = 'rombo' } l['rog'] = { nom = 'roglai du Nord' } l['rol'] = { nom = 'romblomanon' } l['rom'] = { nom = 'romani' } l['romanica'] = { nom = 'romanica' } l['roo'] = { nom = 'rotokas' } l['rop'] = { nom = 'kriol' } l['ror'] = { nom = 'rongga' } l['rou'] = { nom = 'rounga' } l['rouran'] = { nom = 'rouran' } l['row'] = { nom = 'dela-oenale' } l['rpn'] = { nom = 'repanbitip' } l['rpt'] = { nom = 'rapting' } l['rro'] = { nom = 'roro' } l['rsi'] = { nom = 'langue des signes rennellaise', tri = 'signes rennellaise' } l['rsl'] = { nom = 'langue des signes russe', tri = 'signes russe' } l['rtc'] = { nom = 'rungtu chin' } l['rth'] = { nom = 'ratahan' } l['rtm'] = { nom = 'rotuman' } l['ru'] = { nom = 'russe', portail = true, wiktionnaire = true } l['rub'] = { nom = 'gungu' } l['rue'] = { nom = 'ruthène' } l['ruf'] = { nom = 'luguru' } l['rug'] = { nom = 'roviana' } l['ruh'] = { nom = 'ruga' } l['rui'] = { nom = 'rufiji' } l['ruk'] = { nom = 'rukuba' } l['ruo'] = { nom = 'istro-roumain' } l['rup'] = { nom = 'aroumain', wmlien = 'roa-rup', wiktionnaire = true } l['ruq'] = { nom = 'mégléno-roumain' } l['russenorsk'] = { nom = 'russenorsk' } l['ruthène ancien'] = { nom = 'ruthène ancien' } l['rut'] = { nom = 'rutul' } l['rw'] = { nom = 'kinyarwanda', wiktionnaire = true } l['rwa'] = { nom = 'rawo' } l['rwk'] = { nom = 'rwa' } l['rxd'] = { nom = 'ngardi' } l['rxw'] = { nom = 'karuwali' } l['ryn'] = { nom = 'amami du Nord' } l['rys'] = { nom = 'yaeyama' } l['ryu'] = { nom = 'okinawaïen' } l['sa'] = { nom = 'संस्कृत', wiktionnaire = true } l['saa'] = { nom = 'saba' } l['sab'] = { nom = 'buglere' } l['sac'] = { nom = 'mesquakie' } l['sacata'] = { nom = 'sacata' } l['sad'] = { nom = 'sandawe' } l['sae'] = { nom = 'sabanê' } l['saf'] = { nom = 'safaliba' } l['sagz-âbâdi'] = { nom = 'sagz-âbâdi' } l['sah'] = { nom = 'iakoute' } l['sai'] = { nom = 'langues sud-amérindiennes', tri = 'sud amerindiennes langues' } l['saj'] = { nom = 'sahu' } l['sak'] = { nom = 'sake' } l['sal'] = { nom = 'langues salish', tri = 'salish langues' } l['salentin'] = { nom = 'salentin' } l['sam'] = { nom = 'araméen samaritain' } l['samnite'] = { nom = 'samnite' } l['sao'] = { nom = 'sause' } l['sap'] = { nom = 'sanapaná' } l['saq'] = { nom = 'samburu' } l['sar'] = { nom = 'saraveca' } l['sarthois'] = { nom = 'sarthois' } l['sas'] = { nom = 'sassak' } l['sat'] = { nom = 'santal' } l['sau'] = { nom = 'saleman' } l['saurano'] = { nom = 'saurano' } l['sav'] = { nom = 'saafi' } l['saw'] = { nom = 'sawi' } l['sax'] = { nom = 'sa' } l['say'] = { nom = 'saya' } l['saynawa'] = { nom = 'saynawa' } l['saz'] = { nom = 'saurachtra' } l['sba'] = { nom = 'ngambay' } l['sbc'] = { nom = 'kele (Papouasie-Nouvelle-Guinée)', tri = 'kele papouasie nouvelle guinee' } l['sbd'] = { nom = 'san du Sud' } l['sbf'] = { nom = 'shabo' } l['sbg'] = { nom = 'seget' } l['sbh'] = { nom = 'sori-harengan' } l['sbi'] = { nom = 'seti' } l['sbk'] = { nom = 'safwa' } l['sbl'] = { nom = 'sambal de Botolan' } l['sbn'] = { nom = 'sindhi bhil' } l['sbo'] = { nom = 'sabüm' } l['sbp'] = { nom = 'sangu' } l['sbq'] = { nom = 'sirva' } l['sbr'] = { nom = 'murut sembakung' } l['sbs'] = { nom = 'subiya' } l['sbt'] = { nom = 'kimki' } l['sbv'] = { nom = 'sabin' } l['sbw'] = { nom = 'himba' } l['sby'] = { nom = 'soli' } l['sc'] = { nom = 'sarde', wiktionnaire = true } l['scb'] = { nom = 'chut' } l['sce'] = { nom = 'dongxiang' } l['sch'] = { nom = 'sakachep' } l['sci'] = { nom = 'malais du Sri Lanka' } l['scl'] = { nom = 'shina' } l['scn'] = { nom = 'sicilien', wiktionnaire = true } l['sco'] = { nom = 'scots' } l['scp'] = { nom = 'yolmo' } l['scq'] = { nom = 'saoch' } l['scs'] = { nom = 'esclave du Nord' } l['scw'] = { nom = 'sha' } l['scx'] = { nom = 'sicule' } l['sd'] = { nom = 'sindhi', wiktionnaire = true } l['sdc'] = { nom = 'sassarais' } l['sde'] = { nom = 'surubu' } l['sdf'] = { nom = 'sarli' } l['sdg'] = { nom = 'savi' } l['sdh'] = { nom = 'kurde du Sud' } l['sdk'] = { nom = 'sos kundi' } l['sdm'] = { nom = 'semandang' } l['sdn'] = { nom = 'gallurais' } l['sdo'] = { nom = 'bukar sadong bidayuh' } l['sdp'] = { nom = 'sherdukpen' } l['sds'] = { nom = 'sened' } l['sdv'] = { nom = 'langues soudaniques orientales', tri = 'soudaniques orientales langues' } l['sdz'] = { nom = 'sallands' } l['se'] = { nom = 'same du Nord', tri = 'same nord' } l['sea'] = { nom = 'semai' } l['seb'] = { nom = 'shempire' } l['sec'] = { nom = 'sechelt' } l['sed'] = { nom = 'sedang' } l['see'] = { nom = 'seneca' } l['sef'] = { nom = 'tyébara' } l['seh'] = { nom = 'cisena' } l['sei'] = { nom = 'seri' } l['sek'] = { nom = 'sekani' } l['sel'] = { nom = 'selkoupe' } l['sem'] = { nom = 'langues sémitiques', tri = 'semitiques langues' } l['sen'] = { nom = 'nanerge' } l['seo'] = { nom = 'suarmin' } l['sep'] = { nom = 'sucite' } l['seputan'] = { nom = 'seputan' } l['seq'] = { nom = 'senara' } l['ser'] = { nom = 'serrano' } l['ses'] = { nom = 'songhaï koyraboro senni' } l['set'] = { nom = 'sentani' } l['seu'] = { nom = 'serui-laut' } l['sev'] = { nom = 'sénoufo de Nyarafolo' } l['sew'] = { nom = 'sewa bay' } l['sey'] = { nom = 'secoya' } l['sez'] = { nom = 'senthang chin' } l['sfb'] = { nom = 'langue des signes de Belgique francophone' } l['sfe'] = { nom = 'subanen de l’Est', tri = 'subanen est' } l['sfw'] = { nom = 'sehwi' } l['sg'] = { nom = 'sango', wiktionnaire = true } l['sga'] = { nom = 'vieil irlandais', tri = 'irlandais vieil' } l['sgb'] = { nom = 'ayta mag-antsi' } l['sgc'] = { nom = 'kipsigis' } l['sge'] = { nom = 'punan kelai' } l['sgh'] = { nom = 'shughni' } l['sgi'] = { nom = 'suga' } l['sgk'] = { nom = 'sangkong' } l['sgn'] = { nom = 'langues des signes', tri = 'signes langues' } l['sgr'] = { nom = 'sangesari' } l['sgs'] = { nom = 'samogitien', wmlien = 'bat-smg' } l['sgt'] = { nom = 'brokpake' } l['sgw'] = { nom = 'sebat bet gurage' } l['sgy'] = { nom = 'sangletchi' } l['sgz'] = { nom = 'sursurunga' } l['sh'] = { nom = 'serbo-croate', wiktionnaire = true } l['sha'] = { nom = 'shall-zwall' } l['shang'] = { nom = 'shang' } l['shb'] = { nom = 'ninam' } l['she'] = { nom = 'sheko' } l['shg'] = { nom = 'shua' } l['shh'] = { nom = 'shoshone' } l['shi'] = { nom = 'chleuh' } l['shj'] = { nom = 'caning' } l['shinman'] = { nom = 'shinman' } l['shk'] = { nom = 'shilluk' } l['shn'] = { nom = 'shan', wiktionnaire = true } l['sho'] = { nom = 'shanga' } l['shp'] = { nom = 'shipibo-conibo' } l['shr'] = { nom = 'mashi (République démocratique du Congo)', tri = 'mashi congo' } l['shs'] = { nom = 'shuswap' } l['sht'] = { nom = 'shasta' } l['shu'] = { nom = 'arabe tchadien' } l['shv'] = { nom = 'shehri' } l['shw'] = { nom = 'shwai' } l['shx'] = { nom = 'ho-nte' } l['shy'] = { nom = 'chaoui', wiktionnaire = true } l['shz'] = { nom = 'syenara' } l['si'] = { nom = 'cingalais', wiktionnaire = true } l['sia'] = { nom = 'same d’Akkala', tri = 'same akkala' } l['sib'] = { nom = 'sebop' } l['sic'] = { nom = 'malinguat' } l['sid'] = { nom = 'sidamo' } l['sie'] = { nom = 'simaa' } l['sii'] = { nom = 'shompen' } l['sij'] = { nom = 'numbami' } l['sik'] = { nom = 'sikiana' } l['sil'] = { nom = 'sisaala des Tumulung', tri = 'sisaala tumulung' } l['sim'] = { nom = 'mende (Papouasie-Nouvelle-Guinée)' } l['sio'] = { nom = 'langues siouanes', tri = 'siouanes langues' } l['sip'] = { nom = 'sikkimais' } l['siq'] = { nom = 'sonia' } l['sir'] = { nom = 'siri' } l['sis'] = { nom = 'siuslaw' } l['sit'] = { nom = 'langues sino-tibétaines', tri = 'sino tibetaines langues' } l['situ'] = { nom = 'situ' } l['siu'] = { nom = 'sinagen' } l['siw'] = { nom = 'siwai' } l['six'] = { nom = 'sumau' } l['siy'] = { nom = 'sivandi' } l['siz'] = { nom = 'siwi' } l['sja'] = { nom = 'epena saija' } l['sjd'] = { nom = 'same de Kildin', tri = 'same kildin' } l['sje'] = { nom = 'same de Pite', tri = 'same pite' } l['sjk'] = { nom = 'same de Kemi', tri = 'same kemi' } l['sjl'] = { nom = 'miji' } l['sjm'] = { nom = 'mapun' } l['sjn'] = { nom = 'sindarin' } l['sjo'] = { nom = 'xibe' } l['sjr'] = { nom = 'siar' } l['sjt'] = { nom = 'same de Ter', tri = 'same ter' } l['sju'] = { nom = 'same d’Ume', tri = 'same ume' } l['sjw'] = { nom = 'shawnee' } l['sk'] = { nom = 'slovaque', wiktionnaire = true } l['ska'] = { nom = 'skagit' } l['skb'] = { nom = 'saek' } l['skc'] = { nom = 'ma manda' } l['skd'] = { nom = 'miwok méridional de la Sierra' } l['ske'] = { nom = 'seke (Vanuatu)' } l['skf'] = { nom = 'mekens' } l['ski'] = { nom = 'sika' } l['skj'] = { nom = 'seke (Népal)' } l['skr'] = { nom = 'saraiki', wiktionnaire = true } l['sks'] = { nom = 'maia' } l['sku'] = { nom = 'sakao' } l['skv'] = { nom = 'skou' } l['skx'] = { nom = 'seko padang' } l['sky'] = { nom = 'sikaiana' } l['sl'] = { nom = 'slovène', wiktionnaire = true } l['sla'] = { nom = 'langues slaves', tri = 'slaves langues' } l['slc'] = { nom = 'sáliva' } l['sld'] = { nom = 'sisaali' } l['sle'] = { nom = 'sholega' } l['slg'] = { nom = 'murut selungai' } l['slh'] = { nom = 'lushootseed du Sud' } l['sli'] = { nom = 'bas-silésien', tri = 'silesien bas' } l['slm'] = { nom = 'sama pangutaran' } l['sln'] = { nom = 'antoniaño' } l['slovince'] = { nom = 'slovince' } l['slovio'] = { nom = 'slovio' } l['slp'] = { nom = 'lamaholot' } l['slr'] = { nom = 'salar' } l['slt'] = { nom = 'sila' } l['slu'] = { nom = 'selaru' } l['sly'] = { nom = 'selayar' } l['slz'] = { nom = 'ma’ya' } l['sm'] = { nom = 'samoan', wiktionnaire = true } l['sma'] = { nom = 'same du Sud', tri = 'same sud' } l['smb'] = { nom = 'simbari' } l['smc'] = { nom = 'som' } l['smh'] = { nom = 'samei' } l['smi'] = { nom = 'langues sames', tri = 'sames langues' } l['smj'] = { nom = 'same de Lule', tri = 'same lule' } l['smk'] = { nom = 'bolinao' } l['smn'] = { nom = 'same d’Inari', tri = 'same inari' } l['smp'] = { nom = 'samaritain' } l['smq'] = { nom = 'samo (Papouasie-Nouvelle-Guinée)' } l['smr'] = { nom = 'simeulue' } l['sms'] = { nom = 'same skolt' } l['smt'] = { nom = 'simte' } l['smu'] = { nom = 'somray' } l['smy'] = { nom = 'semnani' } l['sn'] = { nom = 'shona', wiktionnaire = true } l['snc'] = { nom = 'sinaugoro' } l['sne'] = { nom = 'bau bidayuh' } l['snf'] = { nom = 'noon' } l['snj'] = { nom = 'sango riverain' } l['snk'] = { nom = 'soninké' } l['snl'] = { nom = 'sangil' } l['snm'] = { nom = 'ma’di du Sud' } l['snn'] = { nom = 'siona' } l['sno'] = { nom = 'snohomish' } l['snp'] = { nom = 'siane' } l['snq'] = { nom = 'massango' } l['snr'] = { nom = 'sihan' } l['sns'] = { nom = 'nahavaq' } l['snu'] = { nom = 'senggi' } l['snv'] = { nom = 'sa’ban' } l['snw'] = { nom = 'selee' } l['snx'] = { nom = 'sam' } l['sny'] = { nom = 'saniyo-hiyewe' } l['snz'] = { nom = 'sinsauru' } l['so'] = { nom = 'somali', wiktionnaire = true } l['sob'] = { nom = 'sobei' } l['soc'] = { nom = 'so (République démocratique du Congo)', tri = 'so congo' } l['sod'] = { nom = 'songoora' } l['sog'] = { nom = 'sogdien' } l['soi'] = { nom = 'sonha' } l['soj'] = { nom = 'soi' } l['sok'] = { nom = 'sokoro' } l['sol'] = { nom = 'solos' } l['solrésol'] = { nom = 'solrésol' } l['son'] = { nom = 'langues songhaïes', tri = 'songhaies langues' } l['sonqor'] = { nom = 'sonqor' } l['soo'] = { nom = 'songo' } l['sor'] = { nom = 'somrai' } l['sorbung'] = { nom = 'sorbung' } l['sos'] = { nom = 'sembla' } l['sou'] = { nom = 'thaï du Sud' } l['sov'] = { nom = 'sonsorolais' } l['sow'] = { nom = 'sowanda' } l['sox'] = { nom = 'swo' } l['soy'] = { nom = 'miyobe' } l['soz'] = { nom = 'temi' } l['spb'] = { nom = 'sepa (Indonésie)' } l['spd'] = { nom = 'saep' } l['spe'] = { nom = 'sepa (Papouasie-Nouvelle-Guinée)' } l['spi'] = { nom = 'saponi' } l['spk'] = { nom = 'sengo' } l['spl'] = { nom = 'selepet' } l['spn'] = { nom = 'sanapaná' } l['spo'] = { nom = 'spokane' } l['spp'] = { nom = 'supyiré' } l['spr'] = { nom = 'saparua' } l['spu'] = { nom = 'sapuan' } l['spx'] = { nom = 'picène du Sud' } l['spy'] = { nom = 'sabaot' } l['sq'] = { nom = 'albanais', wiktionnaire = true } l['sqa'] = { nom = 'shama' } l['sqh'] = { nom = 'shau' } l['sqj'] = { nom = 'langues albanaises', tri = 'albanaises langues' } l['sqk'] = { nom = 'langue des signes albanaise', tri = 'signes albanaise' } l['sqm'] = { nom = 'suma' } l['sqn'] = { nom = 'susquehannock' } l['sqo'] = { nom = 'sourkhei' } l['sqq'] = { nom = 'sou' } l['sqr'] = { nom = 'arabe sicilien' } l['sqs'] = { nom = 'langue des signes sri-lankaise', tri = 'signes sri lankaise' } l['sqt'] = { nom = 'soqotri' } l['squ'] = { nom = 'squamish' } l['sr'] = { nom = 'serbe', wiktionnaire = true } l['sra'] = { nom = 'saruga' } l['srb'] = { nom = 'sora' } l['src'] = { nom = 'logudorais' } l['sre'] = { nom = 'sara' } l['srf'] = { nom = 'nafi' } l['srh'] = { nom = 'sariqoli' } l['sri'] = { nom = 'siriano' } l['srk'] = { nom = 'murut serudung' } l['srl'] = { nom = 'isirawa' } l['srm'] = { nom = 'saramaccan' } l['srn'] = { nom = 'sranan' } l['sro'] = { nom = 'campidanais' } l['srq'] = { nom = 'siriono' } l['srr'] = { nom = 'sérère' } l['srs'] = { nom = 'sarsi' } l['sru'] = { nom = 'suruí' } l['srw'] = { nom = 'serua' } l['sry'] = { nom = 'sera' } l['ss'] = { nom = 'swazi', wiktionnaire = true } l['ssa'] = { nom = 'langues nilo-sahariennes', tri = 'nilo sahariennes langues' } l['ssb'] = { nom = 'sama méridional' } l['ssc'] = { nom = 'suba-simbiti' } l['ssd'] = { nom = 'siroi' } l['sse'] = { nom = 'sama balangingi' } l['ssf'] = { nom = 'thao' } l['ssg'] = { nom = 'seimat' } l['ssh'] = { nom = 'arabe shihhi' } l['ssj'] = { nom = 'sausi' } l['ssl'] = { nom = 'sisaala de l’Ouest', tri = 'sisaala ouest' } l['ssm'] = { nom = 'semnam' } l['ssn'] = { nom = 'waata' } l['sso'] = { nom = 'sissano' } l['ssp'] = { nom = 'langue des signes espagnole', tri = 'signes espagnole' } l['ssr'] = { nom = 'langue des signes suisse romande', tri = 'signes suisse romande' } l['sss'] = { nom = 'sô' } l['sst'] = { nom = 'sinasina' } l['ssu'] = { nom = 'susuami' } l['ssv'] = { nom = 'shark bay' } l['ssx'] = { nom = 'samberigi' } l['ssy'] = { nom = 'saho' } l['st'] = { nom = 'sotho du Sud', wiktionnaire = true } l['sta'] = { nom = 'settla' } l['stb'] = { nom = 'subanen du Nord', tri = 'subanen nord' } l['ste'] = { nom = 'liana-seti' } l['stf'] = { nom = 'seta' } l['stg'] = { nom = 'trieng' } l['sth'] = { nom = 'shelta' } l['sti'] = { nom = 'stieng' } l['stj'] = { nom = 'san matya' } l['stl'] = { nom = 'stellingwarfs' } l['stm'] = { nom = 'setaman' } l['stn'] = { nom = 'owa' } l['sto'] = { nom = 'stoney' } l['stp'] = { nom = 'tepehuan du Sud-Est' } l['stq'] = { nom = 'frison saterlandais' } l['str'] = { nom = 'salish des détroits' } l['sts'] = { nom = 'shumashti' } l['stu'] = { nom = 'samtao' } l['stv'] = { nom = 'silt’e' } l['stw'] = { nom = 'satawalais' } l['sty'] = { nom = 'tatar de Sibérie' } l['su'] = { nom = 'soundanais', wiktionnaire = true } l['sua'] = { nom = 'sulka' } l['sub'] = { nom = 'suku' } l['suc'] = { nom = 'subanen de l’Ouest', tri = 'subanen ouest' } l['sue'] = { nom = 'suena' } l['sui'] = { nom = 'suki' } l['suj'] = { nom = 'shubi' } l['suk'] = { nom = 'soukouma' } l['sul'] = { nom = 'surigaonon' } l['suq'] = { nom = 'suri' } l['sur'] = { nom = 'mwaghavul' } l['sus'] = { nom = 'soussou' } l['sut'] = { nom = 'subtiaba' } l['suv'] = { nom = 'sulung' } l['suw'] = { nom = 'sumbwa' } l['sux'] = { nom = 'sumérien' } l['suy'] = { nom = 'suyá' } l['suz'] = { nom = 'sunwar' } l['sv'] = { nom = 'suédois', wiktionnaire = true } l['sva'] = { nom = 'svane' } l['svb'] = { nom = 'ulau-suain' } l['sve'] = { nom = 'serili' } l['svm'] = { nom = 'slave molisan' } l['svs'] = { nom = 'savosavo' } l['sw'] = { nom = 'swahili', wiktionnaire = true } l['swb'] = { nom = 'shimaoré', tri = 'shimaore' } l['swc'] = { nom = 'swahili du Congo' } l['swg'] = { nom = 'souabe' } l['swi'] = { nom = 'sui' } l['swj'] = { nom = 'shira' } l['swl'] = { nom = 'langue des signes suédoise', tri = 'signes suedoise' } l['swm'] = { nom = 'samosa' } l['swn'] = { nom = 'sawknah' } l['swo'] = { nom = 'shanenawa' } l['swq'] = { nom = 'sharwa' } l['swr'] = { nom = 'saweru' } l['swt'] = { nom = 'sawila' } l['sww'] = { nom = 'sowa' } l['swx'] = { nom = 'suruwahá' } l['swy'] = { nom = 'sarua' } l['sxb'] = { nom = 'suba' } l['sxc'] = { nom = 'sicanien' } l['sxg'] = { nom = 'shixing' } l['sxk'] = { nom = 'kalapuya du Sud', tri = 'kalapuya sud' } l['sxm'] = { nom = 'samre' } l['sxn'] = { nom = 'sangir' } l['sxr'] = { nom = 'saaroa' } l['sxu'] = { nom = 'haut-saxon', tri = 'saxon haut' } l['sya'] = { nom = 'siang' } l['syb'] = { nom = 'subanen central' } l['syc'] = { nom = 'syriaque classique' } l['syd'] = { nom = 'langues samoyèdes', tri = 'samoyedes langues' } l['syi'] = { nom = 'seki' } l['syk'] = { nom = 'sukur' } l['syl'] = { nom = 'sylheti' } l['sym'] = { nom = 'san maya' } l['syn'] = { nom = 'senaya' } l['syr'] = { nom = 'syriaque' } l['syw'] = { nom = 'syuba' } l['sza'] = { nom = 'semelai' } l['szb'] = { nom = 'ngalum' } l['szc'] = { nom = 'semaq beri' } l['sze'] = { nom = 'seze' } l['szg'] = { nom = 'sengele' } l['szl'] = { nom = 'silésien' } l['szp'] = { nom = 'inanwatan' } l['szw'] = { nom = 'sawai' } l['szy'] = { nom = 'sakizaya' } l['ta'] = { nom = 'tamoul', wiktionnaire = true } l['taa'] = { nom = 'bas tanana', tri = 'tanana bas' } l['tab'] = { nom = 'tabassaran' } l['tabancale'] = { nom = 'tabancale' } l['tac'] = { nom = 'tarahumara occidental' } l['tad'] = { nom = 'tause' } l['tae'] = { nom = 'tariana' } l['taf'] = { nom = 'tapirapé' } l['tag'] = { nom = 'tagoi' } l['tai'] = { nom = 'langues taïes', tri = 'taies langues' } l['taïfale'] = { nom = 'taïfale' } l['taj'] = { nom = 'tamang oriental' } l['tak'] = { nom = 'tala' } l['tal'] = { nom = 'tal' } l['tan'] = { nom = 'tangale' } l['tangam'] = { nom = 'tangam' } l['tao'] = { nom = 'yami' } l['taokas'] = { nom = 'taokas' } l['tap'] = { nom = 'taabwa' } l['taq'] = { nom = 'tamasheq' } l['tar'] = { nom = 'tarahumara central' } l['tas'] = { nom = 'tây bồi' } l['tau'] = { nom = 'haut tanana', tri = 'tanana haut' } l['tav'] = { nom = 'tatuyo' } l['tax'] = { nom = 'tamki' } l['tay'] = { nom = 'atayal' } l['taz'] = { nom = 'tocho' } l['tba'] = { nom = 'aikanã' } l['tbc'] = { nom = 'takia' } l['tbd'] = { nom = 'kaki ae' } l['tbf'] = { nom = 'mandara' } l['tbi'] = { nom = 'gaahmg' } l['tbj'] = { nom = 'tiang' } l['tbk'] = { nom = 'tagbanwa de Calamian' } l['tbl'] = { nom = 'tboli' } l['tbm'] = { nom = 'tagbu' } l['tbo'] = { nom = 'tawala' } l['tbp'] = { nom = 'taworta' } l['tbq'] = { nom = 'langues tibéto-birmanes', tri = 'tibeto birmanes langues' } l['tbr'] = { nom = 'tumtum' } l['tbu'] = { nom = 'tubar' } l['tbv'] = { nom = 'tobo' } l['tby'] = { nom = 'tabaru' } l['tca'] = { nom = 'ticuna' } l['tcb'] = { nom = 'tanacross' } l['tcc'] = { nom = 'datooga' } l['tcd'] = { nom = 'tafi' } l['tce'] = { nom = 'tutchone du Sud' } l['tcf'] = { nom = 'me’phaa de Malinaltepec', tri = 'mephaa Malinaltepec' } l['tcg'] = { nom = 'tamagario' } l['tch'] = { nom = 'créole anglais des îles Turques-et-Caïques', tri = 'creole turques et caiques anglais' } l['tcp'] = { nom = 'tawr' } l['tcq'] = { nom = 'kaiy' } l['tcs'] = { nom = 'créole du détroit de Torrès', tri = 'creole torres detroit' } l['tct'] = { nom = 'then' } l['tcx'] = { nom = 'toda' } l['tcy'] = { nom = 'toulou' } l['tda'] = { nom = 'tagdal' } l['tdc'] = { nom = 'emberá tadó' } l['tdd'] = { nom = 'tai nua' } l['tde'] = { nom = 'tiranige diga' } l['tdf'] = { nom = 'talieng' } l['tdh'] = { nom = 'thulung' } l['tdi'] = { nom = 'tomadino' } l['tdj'] = { nom = 'tajio' } l['tdk'] = { nom = 'tambas' } l['tdl'] = { nom = 'sur' } l['tdm'] = { nom = 'taruma' } l['tdn'] = { nom = 'tondano' } l['tds'] = { nom = 'doutai' } l['tdt'] = { nom = 'tetun dili' } l['tdu'] = { nom = 'tindal dusun' } l['tdv'] = { nom = 'toro' } l['te'] = { nom = 'télougou', wiktionnaire = true } l['tea'] = { nom = 'temiar' } l['tec'] = { nom = 'terik' } l['ted'] = { nom = 'kroumen tépo' } l['tee'] = { nom = 'tepehua de Huehuetla' } l['tef'] = { nom = 'teressa' } l['teh'] = { nom = 'tehuelche' } l['tei'] = { nom = 'torricelli' } l['tem'] = { nom = 'temné' } l['ten'] = { nom = 'tama (Colombie)' } l['teo'] = { nom = 'teso' } l['tep'] = { nom = 'tepecano' } l['tep (Nigeria)'] = { nom = 'tep (Nigeria)' } l['teq'] = { nom = 'temein' } l['ter'] = { nom = 'téréno' } l['tes'] = { nom = 'tengger' } l['tet'] = { nom = 'tétoum' } l['teu'] = { nom = 'soo' } l['tev'] = { nom = 'teor' } l['tew'] = { nom = 'tewa' } l['tex'] = { nom = 'tennet' } l['tey'] = { nom = 'tulishi' } l['tez'] = { nom = 'tetserret' } l['tfn'] = { nom = 'dena’ina' } l['tfr'] = { nom = 'teribe' } l['tft'] = { nom = 'ternate' } l['tg'] = { nom = 'tadjik', wiktionnaire = true } l['tgb'] = { nom = 'tobilung' } l['tgc'] = { nom = 'tigak' } l['tgf'] = { nom = 'chalikha' } l['tgo'] = { nom = 'sudest' } l['tgp'] = { nom = 'tangoa' } l['tgq'] = { nom = 'tring' } l['tgs'] = { nom = 'nume' } l['tgt'] = { nom = 'tagbanwa central' } l['tgv'] = { nom = 'tingui-boto' } l['tgw'] = { nom = 'tagbana' } l['tgx'] = { nom = 'tagish' } l['th'] = { nom = 'thaï', wiktionnaire = true } l['thd'] = { nom = 'thayore' } l['the'] = { nom = 'chitwania' } l['thf'] = { nom = 'thangmi' } l['thh'] = { nom = 'tarahumara du Nord' } l['thi'] = { nom = 'tai long' } l['thk'] = { nom = 'tharaka' } l['thm'] = { nom = 'thavung' } l['thp'] = { nom = 'thompson' } l['thr'] = { nom = 'rana tharu' } l['ths'] = { nom = 'thakali' } l['tht'] = { nom = 'tahltan' } l['thu'] = { nom = 'thuri' } l['thv'] = { nom = 'tamahaq' } l['thx'] = { nom = 'thaé' } l['thy'] = { nom = 'tha' } l['thz'] = { nom = 'tayart tamajeq' } l['ti'] = { nom = 'tigrigna', wiktionnaire = true } l['tia'] = { nom = 'tamazight de Tidikelt', tri = 'tamazight Tidikelt' } l['tic'] = { nom = 'tira' } l['tid'] = { nom = 'tidong' } l['tiefo de Nyafogo'] = { nom = 'tiefo de Nyafogo' } l['tif'] = { nom = 'tifal' } l['tig'] = { nom = 'tigré' } l['tih'] = { nom = 'murut timugon' } l['tii'] = { nom = 'tiene' } l['tij'] = { nom = 'tilung' } l['tik'] = { nom = 'tikar' } l['til'] = { nom = 'tillamook' } l['tim'] = { nom = 'timbe' } l['tin'] = { nom = 'tindi' } l['tingalan'] = { nom = 'tingalan' } l['tio'] = { nom = 'teop' } l['tip'] = { nom = 'trimuris' } l['tiq'] = { nom = 'tiefo de Daramandugu' } l['tis'] = { nom = 'itneg des Masadiit', tri = 'itneg masadiit' } l['tischlbongarisch'] = { nom = 'tischlbongarisch' } l['tit'] = { nom = 'tinigua' } l['tiv'] = { nom = 'tiv' } l['tiw'] = { nom = 'tiwi' } l['tix'] = { nom = 'tiwa du Sud' } l['tiy'] = { nom = 'tiruray' } l['tiz'] = { nom = 'tai hongjin' } l['tjg'] = { nom = 'tunjung' } l['tji'] = { nom = 'tujia du Nord' } l['tjm'] = { nom = 'timucua' } l['tjs'] = { nom = 'tujia du Sud' } l['tju'] = { nom = 'tjurruru' } l['tjw'] = { nom = 'djabwurrung' } l['tk'] = { nom = 'turkmène', wiktionnaire = true } l['tkd'] = { nom = 'tukudede' } l['tke'] = { nom = 'takwane' } l['tkl'] = { nom = 'tokelauien' } l['tkn'] = { nom = 'toku-no-shima' } l['tkp'] = { nom = 'tikopia' } l['tkq'] = { nom = 'tèè' } l['tkr'] = { nom = 'tsakhur' } l['tks'] = { nom = 'takestani' } l['tkt'] = { nom = 'tharu de Kathoriya' } l['tku'] = { nom = 'totonaque du haut Necaxa', tri = 'totonaque Necaxa haut' } l['tkw'] = { nom = 'teanu' } l['tkx'] = { nom = 'tangko' } l['tl'] = { nom = 'tagalog', wiktionnaire = true } l['tla'] = { nom = 'tepehuan du Sud-Ouest' } l['tlb'] = { nom = 'tobelo' } l['tlc'] = { nom = 'totonaque de Misantla', tri = 'totonaque Misantla' } l['tlf'] = { nom = 'telefol' } l['tlg'] = { nom = 'tofanma' } l['tlh'] = { nom = 'klingon' } l['tli'] = { nom = 'tlingit' } l['tlj'] = { nom = 'kitalinga' } l['tlk'] = { nom = 'taloki' } l['tll'] = { nom = 'tetela' } l['tlm'] = { nom = 'tolomako' } l['tlo'] = { nom = 'talodi' } l['tlq'] = { nom = 'tai loi' } l['tls'] = { nom = 'tambotalo' } l['tlt'] = { nom = 'teluti' } l['tlu'] = { nom = 'tulehu' } l['tlv'] = { nom = 'taliabu' } l['tlx'] = { nom = 'khehek' } l['tly'] = { nom = 'talysh' } l['tma'] = { nom = 'tama (Tchad)' } l['tmb'] = { nom = 'avava' } l['tmc'] = { nom = 'tumak' } l['tmd'] = { nom = 'haruai' } l['tmf'] = { nom = 'toba mascoy' } l['tmh'] = { nom = 'tamasheq (macrolangue)' } l['tmi'] = { nom = 'tutuba' } l['tmj'] = { nom = 'samarokena' } l['tmn'] = { nom = 'taman' } l['tmo'] = { nom = 'temoq' } l['tmp'] = { nom = 'tai mène' } l['tmq'] = { nom = 'tumleo' } l['tmr'] = { nom = 'judéo-araméen babylonien' } l['tms'] = { nom = 'tima' } l['tmt'] = { nom = 'tasmate' } l['tmu'] = { nom = 'iau' } l['tmw'] = { nom = 'temuan' } l['tmz'] = { nom = 'tamanaku' } l['tn'] = { nom = 'tswana', wiktionnaire = true } l['tna'] = { nom = 'tacana' } l['tnc'] = { nom = 'tanimuca' } l['tni'] = { nom = 'tandia' } l['tnk'] = { nom = 'kwamera' } l['tnl'] = { nom = 'lenakel' } l['tnm'] = { nom = 'tabla' } l['tnn'] = { nom = 'tanna du Nord' } l['tnp'] = { nom = 'whitesands' } l['tnq'] = { nom = 'taïno' } l['tnr'] = { nom = 'bédik' } l['tnt'] = { nom = 'tontemboan' } l['tnw'] = { nom = 'tonsawang' } l['tnx'] = { nom = 'tanema' } l['to'] = { nom = 'tongien', wiktionnaire = true } l['tob'] = { nom = 'toba' } l['toc'] = { nom = 'totonaque de Coyutla', tri = 'totonaque Coyutla' } l['toe'] = { nom = 'tomedes' } l['tog'] = { nom = 'tonga (Malawi)' } l['toi'] = { nom = 'tonga (Zambie)' } l['toj'] = { nom = 'tojolabal' } l['tok'] = { nom = 'toki pona' } l['tol'] = { nom = 'tolowa' } l['tom'] = { nom = 'tombulu' } l['tongzha'] = { nom = 'tongzha' } l['too'] = { nom = 'totonaque de Xicotepec de Juárez', tri = 'totonaque Xicotepec Juarez' } l['top'] = { nom = 'totonaque de Papantla', tri = 'totonaque Papantla' } l['tor'] = { nom = 'banda togbo-vara' } l['tos'] = { nom = 'totonaque de la sierra', tri = 'totonaque Sierra' } l['tou'] = { nom = 'tho' } l['tourangeau'] = { nom = 'tourangeau' } l['tow'] = { nom = 'jemez' } l['tox'] = { nom = 'tobi' } l['toy'] = { nom = 'topoiyo' } l['toz'] = { nom = 'to' } l['tpa'] = { nom = 'taupota' } l['tpc'] = { nom = 'me’phaa d’Azoyu', tri = 'mephaa Azoyu' } l['tpe'] = { nom = 'tippera' } l['tpf'] = { nom = 'tarpia' } l['tpg'] = { nom = 'kula' } l['tpi'] = { nom = 'tok pisin', wiktionnaire = true } l['tpj'] = { nom = 'tapieté' } l['tpl'] = { nom = 'me’phaa de Tlacoapa', tri = 'mephaa Tlacoapa' } l['tpm'] = { nom = 'tampulma' } l['tpn'] = { nom = 'tupinambá' } l['tpp'] = { nom = 'tepehua de Pisaflores' } l['tpr'] = { nom = 'tupari' } l['tpt'] = { nom = 'tepehua de Tlachichilco' } l['tpu'] = { nom = 'tampuan' } l['tpv'] = { nom = 'tanapag' } l['tpw'] = { nom = 'tupi' } l['tpx'] = { nom = 'me’phaa d’Acatepec', tri = 'mephaa Acatepec' } l['tpy'] = { nom = 'trumai' } l['tqb'] = { nom = 'tembé' } l['tql'] = { nom = 'lehali' } l['tqn'] = { nom = 'tenino' } l['tqo'] = { nom = 'toaripi' } l['tqr'] = { nom = 'torona' } l['tqt'] = { nom = 'totonaque de l’Ouest', tri = 'totonaque Ouest' } l['tqu'] = { nom = 'touo' } l['tqw'] = { nom = 'tonkawa' } l['tr'] = { nom = 'turc', wiktionnaire = true } l['tra'] = { nom = 'tirahi' } l['trb'] = { nom = 'terebu' } l['trc'] = { nom = 'trique de Copala' } l['trd'] = { nom = 'turi' } l['tre'] = { nom = 'tarangan oriental' } l['trf'] = { nom = 'créole trinidadien' } l['trg'] = { nom = 'lishán didán' } l['trh'] = { nom = 'turaka' } l['tri'] = { nom = 'trio' } l['trj'] = { nom = 'toram' } l['trk'] = { nom = 'langues turques', tri = 'turques langues' } l['trl'] = { nom = 'cryptolecte écossais' } l['trm'] = { nom = 'tregami' } l['trn'] = { nom = 'trinitario' } l['tro'] = { nom = 'tarao' } l['trp'] = { nom = 'kokborok' } l['trq'] = { nom = 'trique de San Martín Itunyoso' } l['trr'] = { nom = 'taushiro' } l['trs'] = { nom = 'trique de Chicahuaxtla' } l['trt'] = { nom = 'tunggare' } l['tru'] = { nom = 'turoyo' } l['trv'] = { nom = 'seediq' } l['trw'] = { nom = 'torwali' } l['trx'] = { nom = 'tringgus-sembaan bidayuh' } l['try'] = { nom = 'turung' } l['trz'] = { nom = 'torá' } l['ts'] = { nom = 'tsonga', wiktionnaire = true } l['tsa'] = { nom = 'tsaangi' } l['tsb'] = { nom = 'tsamai' } l['tsc'] = { nom = 'tswa' } l['tsd'] = { nom = 'tsakonien' } l['tse'] = { nom = 'langue des signes tunisienne', tri = 'signes tunisienne' } l['tsg'] = { nom = 'tausug' } l['tsh'] = { nom = 'tsuvan' } l['tshobdun'] = { nom = 'tshobdun' } l['tsi'] = { nom = 'tsimshian' } l['tsj'] = { nom = 'tshangla' } l['tsk'] = { nom = 'tseku' } l['tsm'] = { nom = 'langue des signes turque', tri = 'signes turque' } l['tsolyáni'] = { nom = 'tsolyáni', tri = 'tsolyani' } l['tsr'] = { nom = 'akei' } l['tss'] = { nom = 'langue des signes taïwanaise', tri = 'signes taiwanaise' } l['tst'] = { nom = 'tondi songway kiini' } l['tsu'] = { nom = 'tsou' } l['tsv'] = { nom = 'tsogo' } l['tsx'] = { nom = 'mubami' } l['tsz'] = { nom = 'purépecha' } l['tt'] = { nom = 'tatare', wiktionnaire = true } l['tta'] = { nom = 'tutelo' } l['ttb'] = { nom = 'gaa' } l['ttc'] = { nom = 'tectitèque' } l['ttd'] = { nom = 'tauade' } l['tte'] = { nom = 'bwanabwana' } l['ttf'] = { nom = 'tuotomb' } l['tth'] = { nom = 'haut ta’oih' } l['tti'] = { nom = 'tobati' } l['ttj'] = { nom = 'tooro' } l['ttk'] = { nom = 'totoró' } l['ttl'] = { nom = 'totela' } l['ttm'] = { nom = 'tutchone du Nord' } l['ttn'] = { nom = 'towei' } l['ttq'] = { nom = 'tamajaq' } l['ttr'] = { nom = 'tera' } l['tts'] = { nom = 'isan' } l['ttt'] = { nom = 'tat' } l['ttu'] = { nom = 'torau' } l['ttw'] = { nom = 'long wat' } l['tty'] = { nom = 'sikaritai' } l['ttz'] = { nom = 'tsum' } l['tub'] = { nom = 'tubatulabal' } l['tuc'] = { nom = 'mutu' } l['tud'] = { nom = 'tuxá' } l['tue'] = { nom = 'tuyuca' } l['tuf'] = { nom = 'tunebo' } l['tug'] = { nom = 'tunia' } l['tuh'] = { nom = 'taulil' } l['tui'] = { nom = 'toupouri' } l['tum'] = { nom = 'tumbuka' } l['tun'] = { nom = 'tunica' } l['tuo'] = { nom = 'tucano' } l['tup'] = { nom = 'langues tupies', tri = 'tupies langues' } l['tuq'] = { nom = 'tedaga' } l['tus'] = { nom = 'tuscarora' } l['tussentaal'] = { nom = 'tussentaal' } l['tut'] = { nom = 'langues altaïques', tri = 'altaiques langues' } l['tuu'] = { nom = 'tututni' } l['tuv'] = { nom = 'turkana' } l['tuw'] = { nom = 'langues toungouses', tri = 'toungouses langues' } l['tux'] = { nom = 'tuxinawa' } l['tuy'] = { nom = 'tuken' } l['tuz'] = { nom = 'tchourama' } l['tva'] = { nom = 'vaghua' } l['tvd'] = { nom = 'tsuvadi' } l['tve'] = { nom = 'te’un' } l['tvk'] = { nom = 'ambrym du Sud-Est' } l['tvl'] = { nom = 'tuvalu' } l['tvm'] = { nom = 'tela-masbuar' } l['tvo'] = { nom = 'tidore' } l['tvu'] = { nom = 'tunen' } l['tvw'] = { nom = 'sedoa' } l['tw'] = { nom = 'twi', wiktionnaire = true } l['twa'] = { nom = 'twana' } l['twd'] = { nom = 'tweants' } l['twe'] = { nom = 'teiwa' } l['twf'] = { nom = 'tiwa du Nord' } l['twm'] = { nom = 'monba' } l['two'] = { nom = 'tswapong' } l['twq'] = { nom = 'tasawaq' } l['twt'] = { nom = 'turiwara' } l['twu'] = { nom = 'termanu' } l['twy'] = { nom = 'taboyan' } l['txa'] = { nom = 'tombonuwo' } l['txb'] = { nom = 'tokharien B' } l['txc'] = { nom = 'tsetsaut' } l['txe'] = { nom = 'totoli' } l['txg'] = { nom = 'tangoute' } l['txh'] = { nom = 'thrace' } l['txi'] = { nom = 'ikpeng' } l['txm'] = { nom = 'tomini' } l['txn'] = { nom = 'tarangan de l’Ouest' } l['txo'] = { nom = 'toto' } l['txq'] = { nom = 'tii' } l['txr'] = { nom = 'tartessien' } l['txs'] = { nom = 'tonsea' } l['txt'] = { nom = 'citak' } l['txu'] = { nom = 'kayapó' } l['txx'] = { nom = 'tatana' } l['txy'] = { nom = 'antanosy' } l['ty'] = { nom = 'tahitien' } l['tya'] = { nom = 'tauya' } l['tye'] = { nom = 'kyanga' } l['typ'] = { nom = 'thaypan' } l['tyt'] = { nom = 'tày tac' } l['tyv'] = { nom = 'touvain' } l['tyz'] = { nom = 'tày' } l['tza'] = { nom = 'langue des signes tanzanienne', tri = 'signes tanzanienne' } l['tzh'] = { nom = 'tzeltal' } l['tzj'] = { nom = 'tz’utujil' } l['tzl'] = { nom = 'talossan' } l['tzm'] = { nom = 'tamazight du Maroc central', tri = 'tamazight Maroc central' } l['tzn'] = { nom = 'tugun' } l['tzo'] = { nom = 'tzotzil' } l['uam'] = { nom = 'uamué' } l['uar'] = { nom = 'tairuma' } l['ubi'] = { nom = 'ubi' } l['ubl'] = { nom = 'buhi’non' } l['ubr'] = { nom = 'ubir' } l['ubu'] = { nom = 'umbu-ungu' } l['uby'] = { nom = 'oubykh' } l['uda'] = { nom = 'uda' } l['ude'] = { nom = 'oudégué' } l['udg'] = { nom = 'muduga' } l['udi'] = { nom = 'oudi' } l['udj'] = { nom = 'ujir' } l['udl'] = { nom = 'wuzlam' } l['udm'] = { nom = 'oudmourte' } l['udu'] = { nom = 'uduk' } l['ug'] = { nom = 'ouïghour', wiktionnaire = true } l['uga'] = { nom = 'ougaritique' } l['uge'] = { nom = 'ughele' } l['ugo'] = { nom = 'ugong' } l['uhn'] = { nom = 'damal' } l['uis'] = { nom = 'uisai' } l['uiv'] = { nom = 'iyive' } l['uji'] = { nom = 'tanjijili' } l['uk'] = { nom = 'ukrainien', wiktionnaire = true } l['ukk'] = { nom = 'muak sa-aak' } l['ukq'] = { nom = 'ukwa' } l['ula'] = { nom = 'fungwa' } l['ulc'] = { nom = 'oultch' } l['ule'] = { nom = 'lule' } l['ulf'] = { nom = 'usku' } l['uli'] = { nom = 'ulithi' } l['ulk'] = { nom = 'meriam' } l['ull'] = { nom = 'ullatan' } l['ulm'] = { nom = 'ulumanda’' } l['uln'] = { nom = 'unserdeutsch' } l['ulu'] = { nom = 'oma longh' } l['ulw'] = { nom = 'ulwa' } l['uma'] = { nom = 'umatilla' } l['umb'] = { nom = 'oumboundou' } l['umc'] = { nom = 'marrucin' } l['umd'] = { nom = 'umbindhamu' } l['umg'] = { nom = 'umbuygamu' } l['umi'] = { nom = 'ukit' } l['umo'] = { nom = 'umotina' } l['ump'] = { nom = 'umpila' } l['ums'] = { nom = 'pendau' } l['umu'] = { nom = 'munsee' } l['una'] = { nom = 'watut du Nord' } l['und'] = { nom = 'langue indéterminée', tri = '*indeterminee' } l['une'] = { nom = 'uneme' } l['ung'] = { nom = 'ngarinyin' } l['unm'] = { nom = 'unami' } l['unn'] = { nom = 'kurnai' } l['unr'] = { nom = 'mundari' } l['unz'] = { nom = 'kaili d’Unde', tri = 'kaili unde' } l['upv'] = { nom = 'uripiv-wala-rano-atchin' } l['ur'] = { nom = 'ourdou', wiktionnaire = true } l['ura'] = { nom = 'urarina' } l['urb'] = { nom = 'kaapor' } l['ure'] = { nom = 'uru' } l['urf'] = { nom = 'uradhi' } l['urg'] = { nom = 'urigina' } l['urh'] = { nom = 'urhobo' } l['uri'] = { nom = 'urim' } l['urj'] = { nom = 'langues ouraliennes', tri = 'ouraliennes langues' } l['urk'] = { nom = 'urak lawoi’' } l['url'] = { nom = 'urali' } l['urn'] = { nom = 'uruangnirin' } l['uro'] = { nom = 'ura (Papouasie-Nouvelle-Guinée)' } l['urp'] = { nom = 'uru-pa-in' } l['urr'] = { nom = 'löyöp' } l['urt'] = { nom = 'urat' } l['uru'] = { nom = 'urumi' } l['urv'] = { nom = 'uruava' } l['urw'] = { nom = 'sop' } l['ury'] = { nom = 'orya' } l['usi'] = { nom = 'usui' } l['usk'] = { nom = 'usakade' } l['usp'] = { nom = 'uspantèque' } l['uss'] = { nom = 'us-saare' } l['usu'] = { nom = 'uya' } l['ute'] = { nom = 'ute' } l['ute-che'] = { nom = 'chemehuevi' } l['ute-sou'] = { nom = 'paiute du Sud' } l['uth'] = { nom = 'ut-hun' } l['utr'] = { nom = 'etulo' } l['utu'] = { nom = 'utu' } l['uum'] = { nom = 'urum' } l['uun'] = { nom = 'pazeh' } l['uur'] = { nom = 'ura (Vanuatu)' } l['uuu'] = { nom = 'u' } l['uve'] = { nom = 'fagauvea' } l['uvh'] = { nom = 'uri' } l['uwa'] = { nom = 'kuku-uwanh' } l['uz'] = { nom = 'ouzbek', wiktionnaire = true } l['vaa'] = { nom = 'vaagri booli' } l['vae'] = { nom = 'vale' } l['vaf'] = { nom = 'vafsi' } l['vag'] = { nom = 'vagla' } l['vai'] = { nom = 'vaï' } l['vaj'] = { nom = 'vasekele' } l['vam'] = { nom = 'vanimo' } l['van'] = { nom = 'valman' } l['vao'] = { nom = 'vao' } l['vap'] = { nom = 'vaiphei' } l['var'] = { nom = 'guarijio' } l['vas'] = { nom = 'vasavi' } l['vay'] = { nom = 'wayu' } l['vbb'] = { nom = 'babar du Sud-Est' } l['ve'] = { nom = 'venda' } l['vec'] = { nom = 'vénitien', wiktionnaire = true } l['ved'] = { nom = 'veddah' } l['vel'] = { nom = 'veluws' } l['vem'] = { nom = 'vemgo-mabas' } l['veo'] = { nom = 'ventureño' } l['vep'] = { nom = 'vepse' } l['ver'] = { nom = 'mom jango' } l['vi'] = { nom = 'vietnamien', wiktionnaire = true } l['vic'] = { nom = 'créole des Îles Vierges', tri = 'creole vierges' } l['vid'] = { nom = 'vidunda' } l['vieil écossais'] = { nom = 'vieil écossais', tri = 'ecossais vieil' } l['vieil okinawaïen'] = { nom = 'vieil okinawaïen', tri = 'okinawaien vieux' } l['vieux brittonique'] = { nom = 'vieux brittonique', tri = 'brittonique vieux' } l['vieux danois'] = { nom = 'vieux danois', tri = 'danois vieux' } l['vieux khmer pré-angkorien'] = { nom = 'vieux khmer pré-angkorien', tri = 'khmer vieux pre angkorien' } l['vieux norvégien'] = { nom = 'vieux norvégien', tri = 'norvégien vieux' } l['vieux novgorodien'] = { nom = 'vieux novgorodien', tri = 'novgorodien vieux' } l['vieux polonais'] = { nom = 'vieux polonais', tri = 'polonais vieux' } l['vieux suédois'] = { nom = 'vieux suédois', tri = 'suedois vieux' } l['vif'] = { nom = 'vili' } l['vig'] = { nom = 'viemo' } l['vil'] = { nom = 'vilela' } l['vin'] = { nom = 'vinza' } l['vis'] = { nom = 'vishavan' } l['vit'] = { nom = 'viti' } l['viv'] = { nom = 'iduna' } l['vka'] = { nom = 'kariyarra' } l['vkl'] = { nom = 'kulisusu' } l['vkm'] = { nom = 'kamakan' } l['vko'] = { nom = 'kodeoha' } l['vkp'] = { nom = 'korlai' } l['vlp'] = { nom = 'valpei' } l['vls'] = { nom = 'flamand occidental' } l['vma'] = { nom = 'martuthunira' } l['vmb'] = { nom = 'mbabaram' } l['vme'] = { nom = 'masela de l’Est' } l['vmf'] = { nom = 'francique oriental' } l['vmj'] = { nom = 'mixtèque d’Ixtayutla', tri = 'mixteque ixtayutla' } l['vml'] = { nom = 'malgana' } l['vmp'] = { nom = 'mazatèque de Soyaltepec', tri = 'mazateque soyaltepec' } l['vmw'] = { nom = 'makhuwa' } l['vmy'] = { nom = 'mazatèque de San Bartolomé Ayautla', tri = 'mazateque san bartolome ayautla' } l['vmz'] = { nom = 'mazatèque de Mazatlán', tri = 'mazateque mazatlan' } l['vnk'] = { nom = 'lovono' } l['vnm'] = { nom = 'neve’ei' } l['vnp'] = { nom = 'vunapu' } l['vo'] = { nom = 'volapük', wiktionnaire = true } l['volow'] = { nom = 'volow' } l['volsque'] = { nom = 'volsque' } l['vor'] = { nom = 'voro' } l['vot'] = { nom = 'vote' } l['vra'] = { nom = 'vera’a' } l['vro'] = { nom = 'võro', wmlien = 'fiu-vro' } l['vrt'] = { nom = 'banam bay' } l['vun'] = { nom = 'wunjo' } l['vut'] = { nom = 'vute' } l['vwa'] = { nom = 'awa (môn-khmer)' } l['wa'] = { nom = 'wallon', wiktionnaire = true } l['waa'] = { nom = 'walla walla' } l['wab'] = { nom = 'wab' } l['wac'] = { nom = 'wasco-wishram' } l['wad'] = { nom = 'wandamen' } l['wae'] = { nom = 'walser' } l['wah'] = { nom = 'watubela' } l['wai'] = { nom = 'wares' } l['waj'] = { nom = 'waffa' } l['wak'] = { nom = 'langues wakashennes', tri = 'wakashennes langues' } l['wal'] = { nom = 'wolaytta' } l['wam'] = { nom = 'massachusett' } l['wan'] = { nom = 'wan' } l['wañám'] = { nom = 'wañám' } l['wao'] = { nom = 'wappo' } l['wap'] = { nom = 'wapishana' } l['waq'] = { nom = 'wageman' } l['war'] = { nom = 'waray (Philippines)' } l['was'] = { nom = 'washo' } l['wat'] = { nom = 'kaninuwa' } l['wau'] = { nom = 'waurá' } l['wav'] = { nom = 'waka' } l['waw'] = { nom = 'waiwai' } l['wax'] = { nom = 'marangis' } l['way'] = { nom = 'wayana' } l['waz'] = { nom = 'wampur' } l['wba'] = { nom = 'warao' } l['wbb'] = { nom = 'wabo' } l['wbe'] = { nom = 'waritai' } l['wbf'] = { nom = 'wara' } l['wbh'] = { nom = 'wanda' } l['wbi'] = { nom = 'wanji' } l['wbj'] = { nom = 'alagwa' } l['wbk'] = { nom = 'waigali' } l['wbl'] = { nom = 'wakhi' } l['wbm'] = { nom = 'vo' } l['wbp'] = { nom = 'warlpiri' } l['wbt'] = { nom = 'warnman' } l['wbv'] = { nom = 'wajarri' } l['wbw'] = { nom = 'woi' } l['wca'] = { nom = 'yanomámi' } l['wdj'] = { nom = 'wadjiginy' } l['wdk'] = { nom = 'wadikali' } l['wea'] = { nom = 'wewaw' } l['wec'] = { nom = 'wé occidental' } l['wed'] = { nom = 'wedau' } l['weg'] = { nom = 'wergaia' } l['weh'] = { nom = 'weh' } l['wei'] = { nom = 'kiunum' } l['wem'] = { nom = 'gbe weme' } l['wen'] = { nom = 'langues sorabes', tri = 'sorabes langues' } l['weo'] = { nom = 'wemale' } l['wep'] = { nom = 'westphalien' } l['wer'] = { nom = 'weri' } l['wes'] = { nom = 'pidgin camerounais' } l['wet'] = { nom = 'perai' } l['weu'] = { nom = 'rawngtu' } l['wew'] = { nom = 'wejewa' } l['wfg'] = { nom = 'zorop' } l['wga'] = { nom = 'wagaya' } l['wgg'] = { nom = 'wangganguru' } l['wgi'] = { nom = 'wahgi' } l['wgo'] = { nom = 'waigeo' } l['wgu'] = { nom = 'wirangu' } l['wgy'] = { nom = 'warrgamay' } l['whg'] = { nom = 'wahgi du Nord' } l['whk'] = { nom = 'lebu’ kulit' } l['wic'] = { nom = 'wichita' } l['wie'] = { nom = 'wik-epa' } l['wif'] = { nom = 'wik-keyangan' } l['wig'] = { nom = 'wik-ngathan' } l['wih'] = { nom = 'wik-me’anha' } l['wii'] = { nom = 'minidien' } l['wij'] = { nom = 'wik-iiyanh' } l['wim'] = { nom = 'wik-mungkan' } l['win'] = { nom = 'winnebago' } l['wir'] = { nom = 'wiraféd' } l['wiu'] = { nom = 'wiru' } l['wiv'] = { nom = 'vitu' } l['wiy'] = { nom = 'wiyot' } l['wji'] = { nom = 'warji' } l['wku'] = { nom = 'kunduvadi' } l['wkw'] = { nom = 'wakawaka' } l['wlc'] = { nom = 'shimwali' } l['wle'] = { nom = 'wolane' } l['wlk'] = { nom = 'wailaki' } l['wll'] = { nom = 'wali (Soudan)' } l['wlm'] = { nom = 'moyen gallois', tri = 'gallois moyen' } l['wlo'] = { nom = 'wolio' } l['wlr'] = { nom = 'wailapa' } l['wls'] = { nom = 'wallisien' } l['wlv'] = { nom = 'wichí lhamtés vejoz' } l['wmb'] = { nom = 'wambaya' } l['wmc'] = { nom = 'wamas' } l['wmd'] = { nom = 'mamaindé' } l['wme'] = { nom = 'wambule' } l['wmg'] = { nom = 'muya de l’Ouest' } l['wmh'] = { nom = 'waimaha' } l['wms'] = { nom = 'wambon' } l['wmt'] = { nom = 'walmajarri' } l['wmw'] = { nom = 'mwani' } l['wnc'] = { nom = 'wantoat' } l['wnd'] = { nom = 'wandarang' } l['wne'] = { nom = 'waneci' } l['wng'] = { nom = 'wanggom' } l['wni'] = { nom = 'shindzuani' } l['wnk'] = { nom = 'wanokaka' } l['wno'] = { nom = 'wano' } l['wnp'] = { nom = 'wanap' } l['wnu'] = { nom = 'usan' } l['wnw'] = { nom = 'wintu' } l['wny'] = { nom = 'wanyi' } l['wo'] = { nom = 'wolof', wiktionnaire = true } l['woc'] = { nom = 'wogeo' } l['wod'] = { nom = 'wolani' } l['woe'] = { nom = 'woléaïen' } l['wog'] = { nom = 'wogamusin' } l['woi'] = { nom = 'kamang' } l['wom'] = { nom = 'wom (Nigeria)' } l['won'] = { nom = 'wongo' } l['wor'] = { nom = 'woria' } l['wos'] = { nom = 'hanga hundi' } l['wow'] = { nom = 'wawonii' } l['wpc'] = { nom = 'maco' } l['wra'] = { nom = 'warapu' } l['wrb'] = { nom = 'warluwara' } l['wrg'] = { nom = 'warungu' } l['wrh'] = { nom = 'wiradjuri' } l['wrk'] = { nom = 'garrwa' } l['wrm'] = { nom = 'warumungu' } l['wro'] = { nom = 'worrorra' } l['wrp'] = { nom = 'waropen' } l['wrr'] = { nom = 'wardaman' } l['wrs'] = { nom = 'waris' } l['wru'] = { nom = 'waru' } l['wrw'] = { nom = 'gugu warra' } l['wrx'] = { nom = 'wae rana' } l['wry'] = { nom = 'merwari' } l['wrz'] = { nom = 'waray (Australie)' } l['wsa'] = { nom = 'warembori' } l['wsi'] = { nom = 'wusi' } l['wsk'] = { nom = 'waskia' } l['wss'] = { nom = 'wasa' } l['wsv'] = { nom = 'wotapuri-katarqala' } l['wtf'] = { nom = 'watiwa' } l['wth'] = { nom = 'wathawurrung' } l['wti'] = { nom = 'berta' } l['wtw'] = { nom = 'wotu' } l['wuh'] = { nom = 'wutunhua' } l['wul'] = { nom = 'silimo' } l['wulguru'] = { nom = 'wulguru' } l['wun'] = { nom = 'bungu' } l['wut'] = { nom = 'wutung' } l['wuu'] = { nom = 'wu' } l['wuy'] = { nom = 'wauyai' } l['wwo'] = { nom = 'dorig' } l['wwr'] = { nom = 'warrwa' } l['www'] = { nom = 'wawa' } l['wya'] = { nom = 'wyandot' } l['wya-hur'] = { nom = 'huron' } l['wyb'] = { nom = 'wangaaybuwan-ngiyambaa' } l['wyi'] = { nom = 'woiwurrung' } l['wym'] = { nom = 'wilamowicien' } l['wyr'] = { nom = 'ayuru' } l['wyy'] = { nom = 'fidjien de l’Ouest' } l['xaa'] = { nom = 'arabe andalou' } l['xab'] = { nom = 'sambe' } l['xad'] = { nom = 'adai' } l['xag'] = { nom = 'albanien' } l['xal'] = { nom = 'kalmouk' } l['xam'] = { nom = 'ǀxam', tri = 'xam' } l['xan'] = { nom = 'xamtanga' } l['xap'] = { nom = 'apalachee' } l['xaq'] = { nom = 'aquitain' } l['xas'] = { nom = 'kamasse' } l['xat'] = { nom = 'katawixi' } l['xau'] = { nom = 'kauwera' } l['xav'] = { nom = 'xavante' } l['xaw'] = { nom = 'kawaiisu' } l['xay'] = { nom = 'kayan de Mahakam' } l['xbc'] = { nom = 'bactrien' } l['xbg'] = { nom = 'bunganditj' } l['xbi'] = { nom = 'kombio' } l['xbm'] = { nom = 'moyen breton', tri = 'breton moyen' } l['xbr'] = { nom = 'kambera' } l['xcb'] = { nom = 'cambrien' } l['xce'] = { nom = 'celtibère' } l['xch'] = { nom = 'chimakum' } l['xcl'] = { nom = 'arménien ancien' } l['xco'] = { nom = 'chorasmien' } l['xcm'] = { nom = 'comecrudo' } l['xcn'] = { nom = 'cotoname' } l['xcr'] = { nom = 'carien' } l['xct'] = { nom = 'tibétain classique' } l['xcu'] = { nom = 'couronien' } l['xcw'] = { nom = 'coahuilteco' } l['xdc'] = { nom = 'dace' } l['xdk'] = { nom = 'dharug' } l['xdm'] = { nom = 'édomite' } l['xdo'] = { nom = 'kwandu' } l['xdy'] = { nom = 'malais dayak' } l['xeb'] = { nom = 'éblaïte' } l['xed'] = { nom = 'hdi' } l['xeg'] = { nom = 'ǁxegwi', tri = 'xegwi' } l['xem'] = { nom = 'kembayan' } l['xer'] = { nom = 'xerénte' } l['xes'] = { nom = 'kesawai' } l['xet'] = { nom = 'xéta' } l['xeu'] = { nom = 'keoru-ahia' } l['xfa'] = { nom = 'falisque' } l['xga'] = { nom = 'galate' } l['xgf'] = { nom = 'gabrielino-fernandeño' } l['xgm'] = { nom = 'dharumbal' } l['xgn'] = { nom = 'langues mongoles', tri = 'mongoles langues' } l['xh'] = { nom = 'xhosa', wiktionnaire = true } l['xha'] = { nom = 'harami' } l['xhc'] = { nom = 'hunnique' } l['xia'] = { nom = 'xiandao' } l['xib'] = { nom = 'ibère' } l['xii'] = { nom = 'xiri' } l['xil'] = { nom = 'illyrien' } l['xin'] = { nom = 'xinca' } l['xiy'] = { nom = 'xipaya' } l['xkc'] = { nom = 'kho’ini' } l['xke'] = { nom = 'kereho' } l['xkf'] = { nom = 'khengkha' } l['xkg'] = { nom = 'kagoro' } l['xkj'] = { nom = 'kajali' } l['xkq'] = { nom = 'koroni' } l['xkr'] = { nom = 'xakriabá' } l['xku'] = { nom = 'kaamba' } l['xkw'] = { nom = 'kembra' } l['xky'] = { nom = 'uma’ lasan' } l['xkz'] = { nom = 'kurtokha' } l['xla'] = { nom = 'kamula' } l['xlc'] = { nom = 'lycien' } l['xld'] = { nom = 'lydien' } l['xlg'] = { nom = 'ligure ancien' } l['xln'] = { nom = 'alain' } l['xlo'] = { nom = 'loup A' } l['xlp'] = { nom = 'lépontique' } l['xls'] = { nom = 'lusitain' } l['xlu'] = { nom = 'louvite' } l['xma'] = { nom = 'mushungulu' } l['xmb'] = { nom = 'mboa' } l['xmc'] = { nom = 'emakhuwa emarevoni' } l['xmd'] = { nom = 'mbudum' } l['xme'] = { nom = 'mède' } l['xmf'] = { nom = 'mingrélien' } l['xmk'] = { nom = 'ancien macédonien', tri = 'macedonien ancien' } l['xmm'] = { nom = 'malais de Manado' } l['xmr'] = { nom = 'méroïtique' } l['xmt'] = { nom = 'matbat' } l['xmz'] = { nom = 'mori bawah' } l['xna'] = { nom = 'ancien arabe du Nord', tri = 'arabe du nord ancien' } l['xnb'] = { nom = 'kanakanabu' } l['xnd'] = { nom = 'langues na-dénées', tri = 'na denees langues' } l['xng'] = { nom = 'moyen mongol', tri = 'mongol moyen' } l['xni'] = { nom = 'ngarigu' } l['xno'] = { nom = 'anglo-normand' } l['xnr'] = { nom = 'kangri' } l['xns'] = { nom = 'kanashi' } l['xnt'] = { nom = 'narragansett' } l['xny'] = { nom = 'nyiyaparli' } l['xnz'] = { nom = 'kenzi' } l['xoc'] = { nom = 'o’chi’chi’' } l['xod'] = { nom = 'kokoda' } l['xom'] = { nom = 'komo' } l['xon'] = { nom = 'konkomba' } l['xoo'] = { nom = 'xukuru' } l['xop'] = { nom = 'kopar' } l['xpe'] = { nom = 'kpellé du Liberia', tri = 'kpelle Liberia' } l['xpi'] = { nom = 'picte' } l['xpg'] = { nom = 'phrygien' } l['xpm'] = { nom = 'pumpokol' } l['xpq'] = { nom = 'mohegan' } l['xpr'] = { nom = 'parthe' } l['xps'] = { nom = 'pisidien' } l['xpu'] = { nom = 'punique' } l['xpy'] = { nom = 'puyo' } l['xra'] = { nom = 'krahô' } l['xrb'] = { nom = 'karaboro de l’Est' } l['xre'] = { nom = 'kreye' } l['xrn'] = { nom = 'arin' } l['xrr'] = { nom = 'rhétique' } l['xrt'] = { nom = 'aranama' } l['xrw'] = { nom = 'karawa' } l['xsa'] = { nom = 'sabéen' } l['xsb'] = { nom = 'sambal' } l['xsc'] = { nom = 'scythe' } l['xsd'] = { nom = 'sidétique' } l['xse'] = { nom = 'sempan' } l['xsi'] = { nom = 'sio' } l['xsl'] = { nom = 'esclave du Sud' } l['xsm'] = { nom = 'kassem' } l['xso'] = { nom = 'solano' } l['xsp'] = { nom = 'silopi' } l['xsq'] = { nom = 'makhuwa-saka' } l['xsr'] = { nom = 'sherpa' } l['xss'] = { nom = 'assane' } l['xsu'] = { nom = 'sanumá' } l['xsv'] = { nom = 'sudovien' } l['xsy'] = { nom = 'saisiyat' } l['xta'] = { nom = 'mixtèque de Xochapa', tri = 'mixteque xochapa' } l['xtc'] = { nom = 'katcha-kadugli-miri' } l['xtd'] = { nom = 'mixtèque de Diuxi-Tilantongo', tri = 'mixteque diuxi tilantongo' } l['xtm'] = { nom = 'mixtèque de Magdalena Peñasco', tri = 'mixteque magdalena penasco' } l['xto'] = { nom = 'tokharien A' } l['xtw'] = { nom = 'tawandê' } l['xty'] = { nom = 'mixtèque de Yoloxochitl', tri = 'mixteque yoloxochitl' } l['xtz'] = { nom = 'tasmanien' } l['xua'] = { nom = 'alu kurumba' } l['xub'] = { nom = 'bettu kurumba' } l['xud'] = { nom = 'umiida' } l['xug'] = { nom = 'kunigami' } l['xuj'] = { nom = 'jennu kurumba' } l['xul'] = { nom = 'ngunawal' } l['xum'] = { nom = 'ombrien' } l['xun'] = { nom = 'unggarranggu' } l['xup'] = { nom = 'haut umpqua', tri = 'umpqua haut' } l['xur'] = { nom = 'urartéen' } l['xuu'] = { nom = 'kxoe' } l['xve'] = { nom = 'vénète' } l['xvi'] = { nom = 'kamviri' } l['xvn'] = { nom = 'vandale' } l['xvs'] = { nom = 'vestinien' } l['xwa'] = { nom = 'kwaza' } l['xwc'] = { nom = 'woccon' } l['xwd'] = { nom = 'wadi wadi' } l['xwg'] = { nom = 'kwegu' } l['xwk'] = { nom = 'wangkumara' } l['xwo'] = { nom = 'oïrate' } l['xww'] = { nom = 'wemba wemba' } l['xxb'] = { nom = 'boro' } l['xxk'] = { nom = 'keo' } l['xxt'] = { nom = 'tambora' } l['xyy'] = { nom = 'yorta yorta' } l['xzh'] = { nom = 'zhang-zhung' } l['yaa'] = { nom = 'yaminahua' } l['yab'] = { nom = 'yuhup' } l['yac'] = { nom = 'yali de Pass Valley' } l['yad'] = { nom = 'yagua' } l['yae'] = { nom = 'pumé' } l['yaf'] = { nom = 'kiyaka' } l['yag'] = { nom = 'yagan' } l['yah'] = { nom = 'yazgulami' } l['yai'] = { nom = 'yaghnobi' } l['yaj'] = { nom = 'banda-yangere' } l['yak'] = { nom = 'yakama' } l['yal'] = { nom = 'dialonké' } l['yam'] = { nom = 'yamba' } l['yan'] = { nom = 'mayangna' } l['yao'] = { nom = 'yao' } l['yap'] = { nom = 'yapois' } l['yar'] = { nom = 'yabarana' } l['yaq'] = { nom = 'yaqui' } l['yas'] = { nom = 'nugunu (Cameroun)' } l['yat'] = { nom = 'yambeta' } l['yau'] = { nom = 'yuwana' } l['yav'] = { nom = 'yangben' } l['yaw'] = { nom = 'yawalapití' } l['yax'] = { nom = 'yauma' } l['yay'] = { nom = 'agwagwune' } l['yba'] = { nom = 'yala' } l['ybb'] = { nom = 'yemba' } l['ybe'] = { nom = 'yugur occidental' } l['ybh'] = { nom = 'yakha' } l['ybj'] = { nom = 'hasha' } l['ybo'] = { nom = 'yabong' } l['yby'] = { nom = 'yaweyuha' } l['ycn'] = { nom = 'yucuna' } l['ydd'] = { nom = 'yiddish de l’Est' } l['ydg'] = { nom = 'yidgha' } l['ydk'] = { nom = 'yoidik' } l['yea'] = { nom = 'ravula' } l['yec'] = { nom = 'yéniche' } l['yee'] = { nom = 'yimas' } l['yei'] = { nom = 'yeni' } l['yej'] = { nom = 'yévanique' } l['yel'] = { nom = 'yela' } l['yer'] = { nom = 'tarok' } l['yes'] = { nom = 'nyankpa' } l['yet'] = { nom = 'yetfa' } l['yeu'] = { nom = 'yerukala' } l['yev'] = { nom = 'yapunda' } l['yey'] = { nom = 'yeyi' } l['yga'] = { nom = 'malyangapa' } l['ygp'] = { nom = 'gepo' } l['ygr'] = { nom = 'yagaria' } l['ygw'] = { nom = 'yagwoia' } l['yha'] = { nom = 'buyang baha' } l['yhl'] = { nom = 'hlepho' } l['yi'] = { nom = 'yiddish', wiktionnaire = true } l['yia'] = { nom = 'yinggarda' } l['yif'] = { nom = 'ache' } l['yig'] = { nom = 'nasu wusa' } l['yih'] = { nom = 'yiddish de l’Ouest' } l['yii'] = { nom = 'yidiny' } l['yij'] = { nom = 'yindjibarndi' } l['yik'] = { nom = 'lalo de l’Est' } l['yil'] = { nom = 'yindjilandji' } l['yim'] = { nom = 'yimchungru' } l['yiq'] = { nom = 'miqie' } l['yis'] = { nom = 'yis' } l['yir'] = { nom = 'aghu du Nord', tri = 'aghu Nord' } l['yiu'] = { nom = 'awu' } l['yix'] = { nom = 'ahi' } l['yiy'] = { nom = 'yir yoront' } l['yiz'] = { nom = 'azhe' } l['yka'] = { nom = 'yakan' } l['ykg'] = { nom = 'youkaguir de la toundra' } l['yki'] = { nom = 'yoke' } l['ykm'] = { nom = 'yakamul' } l['yko'] = { nom = 'yasa' } l['yky'] = { nom = 'yakoma' } l['yla'] = { nom = 'ulwa (Papouasie-Nouvelle-Guinée)' } l['ylg'] = { nom = 'yelogu' } l['yli'] = { nom = 'yali d’Angguruk' } l['yll'] = { nom = 'yil' } l['yln'] = { nom = 'buyang langjia' } l['ylo'] = { nom = 'naluo yi' } l['ylr'] = { nom = 'yalarnnga' } l['ylu'] = { nom = 'aribwaung' } l['yly'] = { nom = 'nyelâyu' } l['ymc'] = { nom = 'muji du Sud' } l['yme'] = { nom = 'yameo' } l['ymg'] = { nom = 'yamongeri' } l['yml'] = { nom = 'iamalele' } l['ymo'] = { nom = 'yangum mon' } l['ymt'] = { nom = 'karagasse' } l['ynd'] = { nom = 'yandruwandha' } l['ynl'] = { nom = 'yangulam' } l['ynn'] = { nom = 'yana' } l['ynq'] = { nom = 'yendang' } l['yns'] = { nom = 'yansi' } l['yo'] = { nom = 'yoruba', wiktionnaire = true } l['yob'] = { nom = 'yoba' } l['yoi'] = { nom = 'yonaguni' } l['yok-chk'] = { nom = 'chukchansi' } l['yok-chw'] = { nom = 'chawchila' } l['yok-chy'] = { nom = 'choynimni' } l['yok-dum'] = { nom = 'dumna' } l['yok-gas'] = { nom = 'gashowu' } l['yok-hom'] = { nom = 'hometwoli' } l['yok-lsj'] = { nom = 'san joaquin inférieur' } l['yok-nut'] = { nom = 'tachi' } l['yok-pos'] = { nom = 'palewyami' } l['yok-tul'] = { nom = 'tulamni' } l['yok-wik'] = { nom = 'wikchamni' } l['yok-yaw'] = { nom = 'yawelmani' } l['yok-ywd'] = { nom = 'yawdanchi' } l['yol'] = { nom = 'yola' } l['yom'] = { nom = 'yombe' } l['yon'] = { nom = 'yongkom' } l['yot'] = { nom = 'yotti' } l['yoy'] = { nom = 'yoy' } l['yox'] = { nom = 'yoron' } l['ypa'] = { nom = 'phala' } l['ypg'] = { nom = 'phola' } l['ypk'] = { nom = 'langues youpikes', tri = 'youpikes langues' } l['ypz'] = { nom = 'phuza' } l['yrb'] = { nom = 'yareba' } l['yre'] = { nom = 'yaouré' } l['yrk'] = { nom = 'nénètse' } l['yrl'] = { nom = 'nheengatu' } l['yrn'] = { nom = 'yerong' } l['yro'] = { nom = 'yaroamë' } l['yrs'] = { nom = 'yarsun' } l['yry'] = { nom = 'yarluyandi' } l['ysd'] = { nom = 'samu' } l['ysl'] = { nom = 'langue des signes yougoslave', tri = 'signes yougoslave' } l['ysn'] = { nom = 'sani' } l['ysr'] = { nom = 'sirenik' } l['yss'] = { nom = 'yessan-mayo' } l['ysy'] = { nom = 'sanie' } l['yta'] = { nom = 'talu' } l['ytl'] = { nom = 'tanglang' } l['yua'] = { nom = 'maya yucatèque' } l['yuanmen'] = { nom = 'yuanmen' } l['yuc'] = { nom = 'yuchi' } l['yud'] = { nom = 'arabe judéo-tripolitain' } l['yue'] = { nom = 'cantonais', wmlien = 'zh-yue', portail = true, wiktionnaire = true } l['yuf-hav'] = { nom = 'havasupai' } l['yuf-wal'] = { nom = 'hualapai' } l['yuf-yav'] = { nom = 'yavapai' } l['yug'] = { nom = 'yug' } l['yui'] = { nom = 'yuriti' } l['yuj'] = { nom = 'karkar-yuri' } l['yuk'] = { nom = 'yuki' } l['yul'] = { nom = 'yulu' } l['yulparija'] = { nom = 'yulparija' } l['yum'] = { nom = 'quechan' } l['yun'] = { nom = 'bena (Nigeria)' } l['yup'] = { nom = 'yukpa' } l['yuq'] = { nom = 'yuqui' } l['yur'] = { nom = 'yurok' } l['yurumanguí'] = { nom = 'yurumanguí' } l['yut'] = { nom = 'yopno' } l['yux'] = { nom = 'youkaguir de la Kolyma' } l['yuy'] = { nom = 'yugur oriental' } l['yuz'] = { nom = 'yuracaré' } l['yva'] = { nom = 'yawa' } l['yvt'] = { nom = 'yavitero' } l['ywl'] = { nom = 'lalo de l’Ouest' } l['ywr'] = { nom = 'yawuru' } l['ywt'] = { nom = 'lalo central' } l['yww'] = { nom = 'yawarawarga' } l['yxl'] = { nom = 'yardliyawarra' } l['yxu'] = { nom = 'yuyu' } l['yyu'] = { nom = 'yau (province de Sandaun)' } l['yzg'] = { nom = 'buyang ecun' } l['za'] = { nom = 'zhuang', wiktionnaire = true } l['zaa'] = { nom = 'zapotèque de la Sierra de Juárez', tri = 'zapotèque Juarez Sierra' } l['zab'] = { nom = 'zapotèque de San Juan Guelavía', tri = 'zapotèque San Juan Guelavia' } l['zac'] = { nom = 'zapotèque d’Ocotlán', tri = 'zapotèque Ocotlan' } l['zad'] = { nom = 'zapotèque de Cajonos', tri = 'zapotèque Cajonos' } l['zae'] = { nom = 'zapotèque de Yareni', tri = 'zapotèque Yareni' } l['zaf'] = { nom = 'zapotèque d’Ayoquesco', tri = 'zapotèque Ayoquesco' } l['zag'] = { nom = 'zaghawa' } l['zai'] = { nom = 'zapotèque de l’Isthme', tri = 'zapotèque Isthme' } l['zaj'] = { nom = 'zaramo' } l['zak'] = { nom = 'zanaki' } l['zal'] = { nom = 'zauzou' } l['zam'] = { nom = 'zapotèque de Miahuatlán', tri = 'zapotèque Miahuatlan' } l['zandui'] = { nom = 'zandui' } l['zao'] = { nom = 'zapotèque d’Ozolotepec', tri = 'zapotèque Ozolotepec' } l['zap'] = { nom = 'zapotèque' } l['zaq'] = { nom = 'zapotèque d’Aloápam', tri = 'zapotèque Aloapam' } l['zar'] = { nom = 'zapotèque de Rincón', tri = 'zapotèque Rincon' } l['zas'] = { nom = 'zapotèque de Santo Domingo Albarradas', tri = 'zapotèque Santo DOmingo Albarradas' } l['zat'] = { nom = 'zapotèque de Tabaa', tri = 'zapotèque Tabaa' } l['zav'] = { nom = 'zapotèque de Yatzachi', tri = 'zapotèque Yatzachi' } l['zaw'] = { nom = 'zapotèque de Mitla', tri = 'zapotèque Mitla' } l['zax'] = { nom = 'zapotèque de Xadani', tri = 'zapotèque Xadani' } l['zay'] = { nom = 'zayse-zergulla' } l['zbc'] = { nom = 'batu belah' } l['zbe'] = { nom = 'berawan long jegan' } l['zbl'] = { nom = 'bliss' } l['zbt'] = { nom = 'batui' } l['zbu'] = { nom = 'zbu' } l['zbw'] = { nom = 'berawan long terawan' } l['zca'] = { nom = 'zapotèque de Coatecas Altas', tri = 'zapotèque Coatecas Altas' } l['zdj'] = { nom = 'shingazidja' } l['zea'] = { nom = 'zélandais' } l['zeg'] = { nom = 'zenag' } l['zen'] = { nom = 'zénaga' } l['zga'] = { nom = 'kinga' } l['zgb'] = { nom = 'zhuang de Guibei' } l['zgh'] = { nom = 'amazighe standard marocain' } l['zgr'] = { nom = 'magori' } l['zh'] = { nom = 'chinois', portail = true, wiktionnaire = true } l['zhb'] = { nom = 'zhaba' } l['zhd'] = { nom = 'dai zhuang' } l['zhn'] = { nom = 'nong zhuang' } l['zhx'] = { nom = 'langues chinoises', tri = 'chinoises langues' } l['zia'] = { nom = 'zia' } l['zik'] = { nom = 'zimakani' } l['zil'] = { nom = 'zialo' } l['zin'] = { nom = 'zinza' } l['ziw'] = { nom = 'zigua' } l['zkb'] = { nom = 'koibale' } l['zkg'] = { nom = 'koguryo' } l['zkk'] = { nom = 'karankawa' } l['zko'] = { nom = 'kott' } l['zkr'] = { nom = 'zakhring' } l['zkt'] = { nom = 'khitan' } l['zku'] = { nom = 'kaurna' } l['zkz'] = { nom = 'khazar' } l['zle'] = { nom = 'langues slaves orientales', tri = 'slaves orientales langues' } l['zls'] = { nom = 'langues slaves méridionales', tri = 'slaves meridionales langues' } l['zlw'] = { nom = 'langues slaves occidentales', tri = 'slaves occidentales langues' } l['zma'] = { nom = 'manda' } l['zmb'] = { nom = 'zimba' } l['zmc'] = { nom = 'margany' } l['zme'] = { nom = 'mangerr' } l['zmf'] = { nom = 'mfinu' } l['zml'] = { nom = 'madngele' } l['zmp'] = { nom = 'mpuono' } l['zmr'] = { nom = 'maranunggu' } l['zms'] = { nom = 'mbesa' } l['zmu'] = { nom = 'muruwari' } l['zmz'] = { nom = 'mbandja' } l['znd'] = { nom = 'langues zandées', tri = 'zandees langues' } l['zne'] = { nom = 'zandé' } l['zng'] = { nom = 'mang' } l['znk'] = { nom = 'manangkari' } l['zns'] = { nom = 'mangas' } l['zoc'] = { nom = 'zoque de Copainalá' } l['zoh'] = { nom = 'zoque de Chimalapa' } l['zom'] = { nom = 'zou' } l['zoo'] = { nom = 'zapotèque d’Asunción Mixtepec', tri = 'zapotèque Asuncion Mixtepec' } l['zoq'] = { nom = 'ayapaneco' } l['zor'] = { nom = 'zoque de Rayón' } l['zos'] = { nom = 'zoque de Francisco León' } l['zpa'] = { nom = 'zapotèque de Lachiguiri', tri = 'zapotèque Lachiguiri' } l['zpb'] = { nom = 'zapotèque de Yautepec', tri = 'zapotèque Yautepec' } l['zpc'] = { nom = 'zapotèque de Choapan', tri = 'zapotèque Choapan' } l['zpd'] = { nom = 'zapotèque de l’Ixtlán du Sud-Est', tri = 'zapotèque Ixtlan Sud Est' } l['zpe'] = { nom = 'zapotèque de Petapa', tri = 'zapotèque Petapa' } l['zpf'] = { nom = 'zapotèque de San Pedro Quiatoni', tri = 'zapotèque San Pedro Quiatoni' } l['zpg'] = { nom = 'zapotèque de Guevea De Humboldt', tri = 'zapotèque Guevea de Humboldt' } l['zph'] = { nom = 'zapotèque de Totomachapan', tri = 'zapotèque Totomachapan' } l['zpi'] = { nom = 'zapotèque de Santa María Quiegolani', tri = 'zapotèque Santa Maria Quiegolani' } l['zpj'] = { nom = 'zapotèque de Quiavicuzas', tri = 'zapotèque Quiavicuzas' } l['zpk'] = { nom = 'zapotèque de Tlacolulita', tri = 'zapotèque Tlacolulita' } l['zpl'] = { nom = 'zapotèque de Lachixío', tri = 'zapotèque Lachixio' } l['zpm'] = { nom = 'zapotèque de Mixtepec', tri = 'zapotèque Mixtepec' } l['zpn'] = { nom = 'zapotèque de Santa Inés Yatzechi', tri = 'zapotèque Santa Inez Yatzechi' } l['zpo'] = { nom = 'zapotèque d’Amatlán', tri = 'zapotèque Amatlan' } l['zpp'] = { nom = 'zapotèque d’El Alto', tri = 'zapotèque El Alto' } l['zpq'] = { nom = 'zapotèque de San Bartolomé Zoogocho', tri = 'zapotèque San Bartolome Zoogocho' } l['zpr'] = { nom = 'zapotèque de Xanica', tri = 'zapotèque Xanica' } l['zps'] = { nom = 'zapotèque de Coatlán', tri = 'zapotèque Coatlan' } l['zpt'] = { nom = 'zapotèque de San Vicente Coatlán', tri = 'zapotèque San Vicente Coatlan' } l['zpu'] = { nom = 'zapotèque de Yalálag', tri = 'zapotèque Yalalag' } l['zpv'] = { nom = 'zapotèque de San Baltazar Chichicápam', tri = 'zapotèque San Baltazar Chichicapam' } l['zpw'] = { nom = 'zapotèque de Zaniza', tri = 'zapotèque Zaniza' } l['zpx'] = { nom = 'zapotèque de San Baltazar Loxicha', tri = 'zapotèque San Baltazar Loxicha' } l['zpy'] = { nom = 'zapotèque de Mazaltepec', tri = 'zapotèque Mazaltepec' } l['zpz'] = { nom = 'zapotèque de Texmelucan', tri = 'zapotèque Texmelucan' } l['zra'] = { nom = 'gaya' } l['zrn'] = { nom = 'zirenkel' } l['zro'] = { nom = 'záparo' } l['zrp'] = { nom = 'sarphatique' } l['zrs'] = { nom = 'mairasi' } l['zsa'] = { nom = 'sarasira' } l['zsr'] = { nom = 'zapotèque de Rincón du Sud', tri = 'zapotèque Rincon Sud' } l['zsu'] = { nom = 'sukurum' } l['zte'] = { nom = 'zapotèque d’Elotepec', tri = 'zapotèque Elotepec' } l['ztg'] = { nom = 'zapotèque de San Francisco Ozolotepec', tri = 'zapotèque San Francisco Ozolotepec' } l['ztl'] = { nom = 'zapotèque de Lapaguía-Guivini', tri = 'zapotèque Lapaguia Guivini' } l['ztm'] = { nom = 'zapotèque de San Agustín Mixtepec', tri = 'zapotèque San Agustin Mixtepec' } l['ztn'] = { nom = 'zapotèque de Santa Catarina Albarradas', tri = 'zapotèque Santa Catarina Albarradas' } l['ztp'] = { nom = 'zapotèque de Loxicha', tri = 'zapotèque Loxicha' } l['ztq'] = { nom = 'zapotèque de Quioquitani-Quierí', tri = 'zapotèque Quioquitani Quieri' } l['zts'] = { nom = 'zapotèque de Tilquiapan', tri = 'zapotèque Tilquiapan' } l['ztt'] = { nom = 'zapotèque de Tejalapan', tri = 'zapotèque Tejalapan' } l['ztu'] = { nom = 'zapotèque de Güilá', tri = 'zapotèque Guila' } l['ztx'] = { nom = 'zapotèque de Zaachila', tri = 'zapotèque Zaachila' } l['zty'] = { nom = 'zapotèque de Yateé', tri = 'zapotèque Yatee' } l['zu'] = { nom = 'zoulou', wiktionnaire = true } l['zum'] = { nom = 'kumzari' } l['zun'] = { nom = 'zuni' } l['zwa'] = { nom = 'zay' } l['zyb'] = { nom = 'zhuang de Yongbei' } l['zyg'] = { nom = 'zhuang de Deqing' } l['zyj'] = { nom = 'zhuang de Youjiang' } l['zyn'] = { nom = 'zhuang de Yongnan' } l['zza'] = { nom = 'zazaki' } l['zzj'] = { nom = 'zhuang de Zuojiang' } -- Fin langues -- Redirections de langues l['abk'] = l['ab'] l['aka'] = l['ak'] l['ancien danois'] = l['vieux danois'] l['ancien suédois'] = l['vieux suédois'] l['anglo-saxon'] = l['ang'] l['arb'] = l['ar'] l['ava'] = l['av'] l['bel'] = l['be'] l['ben'] = l['bn'] l['be-x-old'] = l['be-tarask'] l['bih'] = l['bh'] l['ca-val'] = l['ca-valencia'] l['calabrais central et méridional'] = l['calabrais centro-méridional'] l['celtique cisalpin'] = l['xlp'] l['cha'] = l['ch'] l['chu'] = l['cu'] l['chv'] = l['cv'] l['cym'] = l['cy'] l['dan'] = l['da'] l['dzo'] = l['dz'] l['erse'] = l['gd'] l['fas'] = l['fa'] l['fra-jer'] = l['normand'] l['fra-nor'] = l['normand'] l['gaul'] = l['gaulois'] l['gaumais'] = l['lorrain'] l['gcf'] = l['créole guadeloupéen'] l['gla'] = l['gd'] l['gle'] = l['ga'] l['glg'] = l['gl'] l['guj'] = l['gu'] l['hat'] = l['ht'] l['hau'] = l['ha'] l['hb'] = l['he'] l['hbs'] = l['sh'] l['heb'] = l['he'] l['ibo'] = l['ig'] l['insubre'] = l['xlp'] l['ipk'] = l['ik'] l['kal'] = l['kl'] l['kau'] = l['kr'] l['kaz'] = l['kk'] l['ko-Hani'] = l['ko'] l['ko-hanja'] = l['ko'] l['kur'] = l['ku'] l['lim'] = l['li'] l['lin'] = l['ln'] l['lit'] = l['lt'] l['lusitanien'] = l['xls'] l['mah'] = l['mh'] l['mal'] = l['ml'] l['manxois'] = l['gv'] l['mon'] = l['mn'] l['moyen scots'] = l['moyen écossais'] l['nrf'] = l['normand'] l['mri'] = l['mi'] l['nav'] = l['nv'] l['nde'] = l['nd'] l['nep'] = l['ne'] l['npi'] = l['ne'] l['nob'] = l['nb'] l['nno'] = l['nn'] l['orm'] = l['om'] l['per'] = l['fa'] l['poitevin'] = l['poitevin-saintongeais'] l['prv'] = l['oc'] l['roa-rup'] = l['rup'] l['roh'] = l['rm'] l['ron'] = l['ro'] l['run'] = l['rn'] l['rus'] = l['ru'] l['saintongeais'] = l['poitevin-saintongeais'] l['sicilo-calabrais'] = l['calabrais centro-méridional'] l['slk'] = l['sk'] l['slo'] = l['sk'] l['slv'] = l['sl'] l['smo'] = l['sm'] l['srd'] = l['sc'] l['srp'] = l['sr'] l['sud-picène'] = l['spx'] l['tir'] = l['ti'] l['tokipona'] = { nom = 'toki pona' } l['ton'] = l['to'] l['tso'] = l['ts'] l['ukr'] = l['uk'] l['ven'] = l['ve'] l['vi-chunho'] = l['vi'] l['vi-chunom'] = l['vi'] l['vi-Hani'] = l['vi'] l['vieux curonien'] = l['xcu'] l['vieux néerlandais'] = l['vieux bas francique'] l['vieux scots'] = l['vieil écossais'] l['wel'] = l['cy'] l['xtg'] = l['gaulois'] l['yid'] = l['yi'] l['zahrar sproche'] = l['saurano'] l['zh-classical'] = l['lzh'] l['zh-min-nan'] = l['nan'] l['zh-yue'] = l['yue'] -- Fin redirections de langues -- Proto-langues l['indo-européen commun'] = { nom = 'indo-européen commun' } l['proto-afro-asiatique'] = { nom = 'proto-afro-asiatique', tri = 'afro asiatique proto' } l['proto-albanais'] = { nom = 'proto-albanais', tri = 'albanais proto' } l['proto-algonquien'] = { nom = 'proto-algonquien', tri = 'algonquien proto' } l['proto-altaïque'] = { nom = 'proto-altaïque', tri = 'altaique proto' } l['proto-athapascan'] = { nom = 'proto-athapascan', tri = 'athapascan proto' } l['proto-austroasiatique'] = { nom = 'proto-austroasiatique', tri = 'austroasiatique proto' } l['proto-austronésien'] = { nom = 'proto-austronésien', tri = 'austronesien proto' } l['proto-bahnarique'] = { nom = 'proto-bahnarique', tri = 'bahnarique proto' } l['proto-bahnarique central'] = { nom = 'proto-bahnarique central', tri = 'bahnarique central proto' } l['proto-bahnarique de l’Ouest'] = { nom = 'proto-bahnarique de l’Ouest', tri = 'bahnarique ouest proto' } l['proto-bahnarique du Nord'] = { nom = 'proto-bahnarique du Nord', tri = 'bahnarique nord proto' } l['proto-bahnarique du Sud'] = { nom = 'proto-bahnarique du Sud', tri = 'bahnarique sud proto' } l['proto-balte'] = { nom = 'proto-balte', tri = 'balte proto' } l['proto-balto-slave'] = { nom = 'proto-balto-slave', tri = 'balto slave proto' } l['proto-bantou'] = { nom = 'proto-bantou', tri = 'bantou proto' } l['proto-basque'] = { nom = 'proto-basque', tri = 'basque proto' } l['proto-bodique oriental'] = { nom = 'proto-bodique oriental', tri = 'bodique oriental proto' } l['proto-brittonique'] = { nom = 'proto-brittonique', tri = 'brittonique proto' } l['proto-caribe'] = { nom = 'proto-caribe', tri = 'caribe proto' } l['proto-celtique'] = { nom = 'proto-celtique', tri = 'celtique proto' } l['proto-coréen'] = { nom = 'proto-coréen', tri = 'coréen proto' } l['proto-costanoan'] = { nom = 'proto-costanoan', tri = 'costanoan proto' } l['proto-dravidien'] = { nom = 'proto-dravidien', tri = 'dravidien proto' } l['proto-dura'] = { nom = 'proto-dura', tri = 'dura proto' } l['proto-fennique'] = { nom = 'proto-fennique', tri = 'fennique proto' } l['proto-finno-ougrien'] = { nom = 'proto-finno-ougrien', tri = 'finno ougrien proto' } l['proto-germanique'] = { nom = 'proto-germanique', tri = 'germanique proto' } l['proto-germanique occidental'] = { nom = 'proto-germanique occidental', tri = 'germanique occidental proto' } l['proto-grec'] = { nom = 'proto-grec', tri = 'grec proto' } l['proto-hlai'] = { nom = 'proto-hlai', tri = 'hlai proto' } l['proto-hrusique'] = { nom = 'proto-hrusique', tri = 'hrusique proto' } l['proto-ienisseïen'] = { nom = 'proto-ienisseïen', tri = 'ienisseien proto' } l['proto-indo-aryen'] = { nom = 'proto-indo-aryen', tri = 'indo aryen proto' } l['proto-indo-iranien'] = { nom = 'proto-indo-iranien', tri = 'indo iranien proto' } l['proto-iranien'] = { nom = 'proto-iranien', tri = 'iranien proto' } l['proto-italique'] = { nom = 'proto-italique', tri = 'italique proto' } l['proto-japonique'] = { nom = 'proto-japonique', tri = 'japonique proto' } l['proto-japonique insulaire'] = { nom = 'proto-japonique insulaire', tri = 'japonique insulaire proto' } l['proto-katuique'] = { nom = 'proto-katuique', tri = 'katuique proto' } l['proto-keresan'] = { nom = 'proto-keresan', tri = 'keresan proto' } l['proto-khasique'] = { nom = 'proto-khasique', tri = 'khasique proto' } l['proto-khmer'] = { nom = 'proto-khmer', tri = 'khmer proto' } l['proto-kiowa-tanoan'] = { nom = 'proto-kiowa-tanoan', tri = 'kiowa tanoan proto' } l['proto-kiranti'] = { nom = 'proto-kiranti', tri = 'kiranti proto' } l['proto-lolo'] = { nom = 'proto-lolo', tri = 'lolo proto' } l['proto-lower cross'] = { nom = 'proto-lower cross', tri = 'lower cross proto' } l['proto-malais'] = { nom = 'proto-malais', tri = 'malais proto' } l['proto-malaïque'] = { nom = 'proto-malaïque', tri = 'malaique proto' } l['proto-malayo-chamique'] = { nom = 'proto-malayo-chamique', tri = 'malayo chamique proto' } l['proto-malayo-polynésien'] = { nom = 'proto-malayo-polynésien', tri = 'malayo polynesien proto' } l['proto-malayo-sumbawien'] = { nom = 'proto-malayo-sumbawien', tri = 'malayo sumbawien proto' } l['proto-masa'] = { nom = 'proto-masa', tri = 'masa proto' } l['proto-maya'] = { nom = 'proto-maya', tri = 'maya proto' } l['proto-micronésien'] = { nom = 'proto-micronésien', tri = 'micronesien proto' } l['proto-miwok'] = { nom = 'proto-miwok', tri = 'miwok proto' } l['proto-mongol'] = { nom = 'proto-mongol', tri = 'mongol proto' } l['proto-môn-khmer'] = { nom = 'proto-môn-khmer', tri = 'mon khmer proto' } l['proto-mônique'] = { nom = 'proto-mônique', tri = 'mônique proto' } l['proto-murutique'] = { nom = 'proto-murutique', tri = 'murutique proto' } l['proto-muskogéen'] = { nom = 'proto-muskogéen', tri = 'muskogeen proto' } l['proto-nahuatl'] = { nom = 'proto-nahuatl', tri = 'nahuatl proto' } l['proto-nguni'] = { nom = 'proto-nguni', tri = 'nguni proto' } l['proto-nhanda-kartu'] = { nom = 'proto-nhanda-kartu', tri = 'nhanda kartu proto' } l['proto-nivkh'] = { nom = 'proto-nivkh', tri = 'nivkh proto' } l['proto-norrois'] = { nom = 'proto-norrois', tri = 'norrois proto' } l['proto-numique'] = { nom = 'proto-numique', tri = 'numique proto' } l['proto-océanien'] = { nom = 'proto-océanien', tri = 'oceanien proto' } l['proto-one'] = { nom = 'proto-one', tri = 'one proto' } l['proto-otomi'] = { nom = 'proto-otomi', tri = 'otomi proto' } l['proto-ougrien'] = { nom = 'proto-ougrien', tri = 'ougrien proto' } l['proto-ouralien'] = { nom = 'proto-ouralien', tri = 'ouralien proto' } l['proto-palaungique'] = { nom = 'proto-palaungique', tri = 'palaungique proto' } l['proto-pama-nyungan'] = { nom = 'proto-pama-nyungan', tri = 'pama nyungan proto' } l['proto-paman'] = { nom = 'proto-paman', tri = 'paman proto' } l['proto-polynésien'] = { nom = 'proto-polynésien', tri = 'polynesien proto' } l['proto-pomo'] = { nom = 'proto-pomo', tri = 'pomo proto' } l['proto-pong'] = { nom = 'proto-pong', tri = 'pong proto' } l['proto-pwo'] = { nom = 'proto-pwo', tri = 'pwo proto' } l['proto-ryūkyū'] = { nom = 'proto-ryūkyū', tri = 'ryukyu proto' } l['proto-ryūkyū du Nord'] = { nom = 'proto-ryūkyū du Nord', tri = 'ryukyu nord proto' } l['proto-ryūkyū du Sud'] = { nom = 'proto-ryūkyū méridional', tri = 'ryukyu sud proto' } l['proto-Sabah du Sud-Ouest'] = { nom = 'proto-Sabah du Sud-Ouest', tri = 'sabah sud ouest proto' } l['proto-same'] = { nom = 'proto-same', tri = 'same proto' } l['proto-sangirien'] = { nom = 'proto-sangirien', tri = 'sangirien proto' } l['proto-sarawak du Nord'] = { nom = 'proto-sarawak du Nord', tri = 'sarawak du nord proto' } l['proto-sémitique'] = { nom = 'proto-sémitique', tri = 'semitique proto' } l['proto-sérère-peul'] = { nom = 'proto-sérère-peul', tri = 'serere peul proto' } l['proto-sino-tibétain'] = { nom = 'proto-sino-tibétain', tri = 'sino tibetain proto' } l['proto-siouan'] = { nom = 'proto-siouan', tri = 'siouan proto' } l['proto-slave'] = { nom = 'proto-slave', tri = 'slave proto' } l['proto-subanen'] = { nom = 'proto-subanen', tri = 'subanen proto' } l['proto-sunda-sulawesi'] = { nom = 'proto-sunda-sulawesi', tri = 'sunda sulawesi proto' } l['proto-talodi'] = { nom = 'proto-talodi', tri = 'talodi proto' } l['proto-tangkique'] = { nom = 'proto-tangkique', tri = 'tangkique proto' } l['proto-tchadique central'] = { nom = 'proto-tchadique central', tri = 'tchadique central proto' } l['proto-tibéto-birman'] = { nom = 'proto-tibéto-birman', tri = 'tibeto birman proto' } l['proto-thaï'] = { nom = 'proto-thaï', tri = 'thai proto' } l['proto-toungouse'] = { nom = 'proto-toungouse', tri = 'toungouse proto' } l['proto-trans-néo-guinéen'] = { nom = 'proto-trans-néo-guinéen', tri = 'trans neo guineen proto' } l['proto-tupi-guarani'] = { nom = 'proto-tupi-guarani', tri = 'tupi guarani proto' } l['proto-turc'] = { nom = 'proto-turc', tri = 'turc proto' } l['proto-vanuatu Nord-Central'] = { nom = 'proto-vanuatu Nord-Central', tri = 'vanuatu nord central proto' } l['proto-viétique'] = { nom = 'proto-viétique', tri = 'vietique proto' } l['proto-viêt-muong'] = { nom = 'proto-viêt-muong', tri = 'viet muong proto' } l['proto-wa-lawa'] = { nom = 'proto-wa-lawa', tri = 'wa-lawa proto' } l['proto-waïque'] = { nom = 'proto-waïque', tri = 'waique proto' } l['proto-wintuan'] = { nom = 'proto-wintuan', tri = 'wintuan proto' } -- Fin protolangues -- Redirections de proto-langues l['alg-pro'] = l['proto-algonquien'] l['ath-pro'] = l['proto-athapascan'] l['cel-pro'] = l['proto-celtique'] l['cost-pro'] = l['proto-costanoan'] l['fiu-pro'] = l['proto-finno-ougrien'] l['gem-pro'] = l['proto-germanique'] l['grk-pro'] = l['proto-grec'] l['ine-pie'] = l['indo-européen commun'] l['kere-pro'] = l['proto-keresan'] l['kita-pro'] = l['proto-kiowa-tanoan'] l['mus-pro'] = l['proto-muskogéen'] l['ougrien commun'] = l['proto-ougrien'] l['proto-chamito-sémitique'] = l['proto-afro-asiatique'] l['proto-indo-européen'] = l['indo-européen commun'] l['pomo-pro'] = l['proto-pomo'] l['sem-pro'] = l['proto-sémitique'] l['siou-pro'] = l['proto-siouan'] l['sit-pro'] = l['proto-sino-tibétain'] l['sla-pro'] = l['proto-slave'] l['trk-pro'] = l['proto-turc'] l['tupi-guarani'] = l['proto-tupi-guarani'] l['wint-pro'] = l['proto-wintuan'] -- Fin redirections de proto-langues return l 0flz3xmgwlqejh09lcbbjuvtaj4vf06 मॉड्यूल:labels/data/lang/en 828 305032 487765 479859 2026-09-02T16:26:08Z SM7 6218 localization... 487765 Scribunto text/plain local labels = {} ------------------------------------ North America ------------------------------------ labels["उत्तर अमेरिकी"] = { aliases = {"उत्तर अमेरिकी"}, display = "[[कनाडा]], [[अमेरिकी अंग्रेज़ी|अमे.]]", regional_categories = {"कनाडाई", "अमेरिकी"}, } labels["caricature Black"] = { display = "caricatures of Black speech", def = "any of various caricatures of Black speech by non-Black writers", aliases = {"caricature black", "a caricature of Black speech", "caricatures of Black speech"}, plain_categories = "Caricatures of Black English", form_of_display = "a caricature of Black" -- for use in T:pronunciation spelling of. use in T:altform and T:altspell is not intended and looks bad. } ------------- Canada ------------- labels["Canada"] = { aliases = {"CA", "Canadian", "CanE", "Canadian English"}, Wikipedia = "Canadian English", regional_categories = "Canadian", parent = "rawposcat:North American English,Commonwealth", } labels["Acadia"] = { region = "colonial [[Acadia]]", aliases = {"Acadian"}, Wikipedia = true, regional_categories = "Acadian", parent = "Canada", } labels["Alberta"] = { Wikipedia = true, regional_categories = true, parent = "Canadian Prairies", } labels["Atlantic Canada"] = { Wikipedia = "Atlantic Canadian English", regional_categories = "Atlantic Canadian", parent = "Canada", } labels["British Columbia"] = { Wikipedia = true, regional_categories = true, parent = "Canada", } labels["Canadian Prairies"] = { the = true, Wikipedia = true, regional_categories = true, parent = "Canada", } labels["Labrador"] = { Wikipedia = true, regional_categories = true, parent = "Atlantic Canada", } labels["Manitoba"] = { Wikipedia = true, regional_categories = true, parent = "Canadian Prairies", } labels["Multicultural Toronto English"] = { def = "the {{w|multiethnolect|multi-ethnic dialect}} of {{catlink|Canadian English}} used in the {{w|Greater Toronto Area}}, particularly among young non-white working-class speakers", aliases = {"MTE"}, display = "MTE", Wikipedia = true, plain_categories = true, parent = "Ontario", } labels["New Brunswick"] = { Wikipedia = "Atlantic Canadian English", regional_categories = true, parent = "Atlantic Canada", } labels["Newfoundland"] = { Wikipedia = "Newfoundland English", regional_categories = true, parent = "Atlantic Canada", } labels["Northwest Territories"] = { region = "the [[Northwest Territories]] of [[Canada]]", Wikipedia = true, regional_categories = true, parent = "Canada", } labels["Northwestern Ontario"] = { aliases = {"northwestern Ontario", "Northwest Ontario", "northwest Ontario"}, Wikipedia = true, regional_categories = true, parent = "Ontario", } labels["Nova Scotia"] = { Wikipedia = "Atlantic Canadian English", regional_categories = true, parent = "Atlantic Canada", } labels["Nunavut"] = { Wikipedia = true, regional_categories = true, parent = "Canada", } labels["Ontario"] = { Wikipedia = true, regional_categories = true, parent = "Canada", } labels["Prince Edward Island"] = { Wikipedia = true, regional_categories = true, parent = "Atlantic Canada", } labels["Quebec"] = { aliases = {"Québec"}, Wikipedia = "Quebec English", regional_categories = true, parent = "Canada", } labels["Saskatchewan"] = { Wikipedia = true, regional_categories = true, parent = "Canadian Prairies", } labels["Yukon"] = { Wikipedia = true, regional_categories = true, parent = "Canada", } ------------- US ------------- labels["अमे."] = { region = "[[अमेरिका]]", aliases = {"U.S.", "United States", "United States of America", "USA", "US English", "U.S. English", "America", "American", "American English"}, Wikipedia = "अमेरिकी अंग्रेज़ी", regional_categories = "अमेरिकी", parent = "rawposcat:उत्तर अमेरिकी अंग्रेज़ी", } labels["African-American Vernacular"] = { def = "the variety of [[English]] spoken, especially in urban communities, by most working-class and some middle-class [[African-American]]s", addl = "It is a [[sociolect]] with significantly different grammatical characteristics from {{w|Standard English}}, especially in {{w|tense-aspect}} and [[negation]] constructions. Many African-American communities maintain [[diglossia]] between African-American Vernacular English (AAVE) and Standard English.", aliases = {"AAVE", "African American Vernacular", "African American Vernacular English", "African-American Vernacular English", "BVE"}, Wikipedia = "African-American Vernacular English", regional_categories = true, parent = "African-American", } labels["African-American"] = { prep = "by", region = "[[African-American]]s in the [[United States]]", aliases = {"AA", "African-American English", "African American", "African American English", "AAE"}, Wikipedia = "African-American English", regional_categories = true, parent = "US", } labels["Alabama"] = { Wikipedia = true, regional_categories = true, parent = "Southern US", } labels["Alaska"] = { Wikipedia = true, regional_categories = true, parent = "Northwestern US", } labels["Appalachia"] = { aliases = {"Appalachian"}, Wikipedia = "Appalachian English", regional_categories = "Appalachian", parent = "US", } labels["Arizona"] = { Wikipedia = true, regional_categories = true, parent = "Southwestern US", } labels["Arkansas"] = { Wikipedia = true, regional_categories = "Arkansan", parent = "South Midland US", } labels["Baltimore"] = { Wikipedia = "Baltimore accent", regional_categories = true, parent = "Maryland", } labels["Boston"] = { Wikipedia = "Boston accent", regional_categories = true, parent = "Massachusetts", } labels["Cajun"] = { prep = "by", region = "[[Cajun]]s in {{w|Acadiana|Southern Louisiana}}", Wikipedia = "Cajun English", regional_categories = true, parent = "Louisiana", } labels["California"] = { Wikipedia = "California English", regional_categories = true, parent = "Western US", } labels["Chicago"] = { Wikipedia = {"Inland Northern American English", true}, regional_categories = true, parent = "Illinois", } labels["Cincinnati"] = { Wikipedia = "Midland American English#Cincinnati", regional_categories = true, parent = "Ohio,Kentucky", } labels["Colorado"] = { Wikipedia = true, regional_categories = true, parent = "Southwestern US", } labels["Connecticut"] = { Wikipedia = true, regional_categories = true, parent = "New England", } labels["District of Columbia"] = { region = "Washington, D.C.", aliases = {"DC", "Washington, DC"}, Wikipedia = true, regional_categories = "DC", parent = "Mid-Atlantic US", } labels["Eastern New England"] = { Wikipedia = "Eastern New England English", regional_categories = true, parent = "New England", } labels["Florida"] = { Wikipedia = true, regional_categories = true, parent = "Southern US", } labels["Georgia (US)"] = { region = "the state of [[Georgia]] in the [[United States]]", display = "Georgia", Wikipedia = "Georgia (U.S. state)", regional_categories = true, parent = "Southern US", } labels["Hawaii"] = { Wikipedia = true, regional_categories = "Hawaiian", parent = "Western US", } labels["Illinois"] = { Wikipedia = true, regional_categories = true, parent = "Midland US,Northern US", } labels["Indiana"] = { Wikipedia = true, regional_categories = true, parent = "Midland US,Northern US", } labels["Kentucky"] = { Wikipedia = true, regional_categories = true, parent = "South Midland US", } labels["Louisiana"] = { Wikipedia = true, regional_categories = true, parent = "Southern US", } labels["Maine"] = { Wikipedia = "Maine accent", regional_categories = true, parent = "New England", } labels["Maryland"] = { Wikipedia = true, regional_categories = true, parent = "Mid-Atlantic US", } labels["Massachusetts"] = { Wikipedia = true, regional_categories = true, parent = "New England", } labels["Memphis"] = { regional_categories = true, parent = "Southern US", } labels["Michigan"] = { Wikipedia = true, regional_categories = true, parent = "Upper Midwestern US", } labels["Mid-Atlantic US"] = { region = "the [[Mid-Atlantic]] United States", Wikipedia = "Mid-Atlantic American English", regional_categories = true, parent = "US", } labels["Midland US"] = { region = "the American [[Midland]]", Wikipedia = "Midland American English", regional_categories = true, parent = "Midwestern US", } labels["Midwestern US"] = { region = "the [[Midwest]] of the [[United States]]", aliases = {"Midwest US"}, Wikipedia = "Midwestern American English", regional_categories = true, parent = "US", } labels["Mississippi"] = { Wikipedia = true, regional_categories = true, parent = "Southern US", } labels["Missouri"] = { Wikipedia = true, regional_categories = true, parent = "Midland US", } labels["New England"] = { Wikipedia = "New England English", regional_categories = true, parent = "Northeastern US", } labels["New Jersey"] = { Wikipedia = "New Jersey English", regional_categories = true, parent = "Northeastern US", } labels["New Mexico"] = { Wikipedia = "Western American English#New Mexico", regional_categories = true, parent = "Southwestern US", } labels["New Orleans"] = { Wikipedia = "New Orleans English", regional_categories = true, parent = "Louisiana", } labels["New York City"] = { aliases = {"NYC"}, Wikipedia = "New York City English", regional_categories = true, parent = "New York", } labels["New York"] = { region = "the [[United States]] state of [[New York]]", aliases = {"NY"}, Wikipedia = "New York English (disambiguation)", regional_categories = true, parent = "Northeastern US", } labels["North Carolina"] = { Wikipedia = true, regional_categories = true, parent = "Southern US", } -- can be split off if enough entries in it arise; group with Midland US for now labels["North Midland US"] = { aliases = {"Northern Midland US"}, Wikipedia = "Midland American English", regional_categories = "Midland US", } labels["Northeastern US"] = { region = "the {{w|Northeastern United States}}", aliases = {"Northeast US"}, Wikipedia = {"Northern American English#Northeastern American English"}, regional_categories = true, parent = "Northern US", } -- can be split off if enough entries in it arise; group with California for now labels["Northern California"] = { Wikipedia = "California English", regional_categories = "California", } labels["Northwestern US"] = { region = "the {{w|Northwestern United States}}", aliases = {"Northwest US", "Pacific Northwest"}, Wikipedia = {"Pacific Northwest English", "Northwestern United States"}, regional_categories = true, parent = "Western US", } labels["Ohio"] = { Wikipedia = true, regional_categories = true, parent = "Midland US,Northern US", } labels["Oklahoma"] = { Wikipedia = true, regional_categories = true, parent = "South Midland US", } labels["Pennsylvania Dutch English"] = { prep = "by", region = "{{w|Pennsylvania Dutch}} people in south-central [[Pennsylvania]]", Wikipedia = true, plain_categories = true, parent = "Pennsylvania", } labels["Pennsylvania"] = { Wikipedia = true, regional_categories = true, parent = "Northeastern US", } -- can be split off if enough entries in it arise; group with Pennsylvania for now labels["Philadelphia"] = { Wikipedia = "Philadelphia English", regional_categories = true, parent = "Pennsylvania,Mid-Atlantic US", } -- can be split off if enough entries in it arise; group with Western Pennsylvania for now labels["Pittsburgh"] = { Wikipedia = "Western Pennsylvania English", regional_categories = "Western Pennsylvania", parent = "Pennsylvania", } labels["Pittsburghese"] = { Wikipedia = "Western Pennsylvania English", regional_categories = "Western Pennsylvania", parent = "Pennsylvania", } labels["Rhode Island"] = { Wikipedia = true, regional_categories = true, parent = "New England", } labels["South Carolina"] = { Wikipedia = true, regional_categories = true, parent = "Southern US", } -- can be split off if enough entries in it arise; group with Midland US for now labels["South Midland US"] = { aliases = {"Southern Midland US"}, Wikipedia = "Midland American English", regional_categories = "Midland US", } -- can be split off if enough entries in it arise; group with California for now labels["Southern California"] = { Wikipedia = "California English", regional_categories = "California", } labels["Southern US"] = { region = "the {{w|Southern United States}}", aliases = {"Southern American English", "southern US", "US South"}, Wikipedia = "Southern American English", regional_categories = true, parent = "US", } labels["Southwestern US"] = { region = "the {{w|Southwestern United States}}", aliases = {"southwestern US", "Southwest US", "southwest US"}, Wikipedia = {"Western American English", "Southwestern United States"}, regional_categories = true, parent = "Western US", } labels["St. Louis"] = { Wikipedia = "St. Louis dialect", regional_categories = true, parent = "Missouri,Illinois", } labels["St. Vincent"] = { Wikipedia = "Saint Vincent (Saint Vincent and the Grenadines)", regional_categories = "Saint Vincentian", parent = "Caribbean", } labels["Texas"] = { Wikipedia = "Texan English", regional_categories = true, parent = "Southern US,Southwestern US", } labels["Upper Midwestern US"] = { region = "the {{w|Upper Midwest}} of the [[United States]]", aliases = {"Upper Midwest US"}, Wikipedia = {"North-Central American English", "Upper Midwest"}, regional_categories = true, parent = "Midwestern US,Northern US", } labels["Vermont"] = { Wikipedia = {"New England English", "Vermont"}, regional_categories = true, parent = "New England", } labels["Virginia"] = { Wikipedia = true, regional_categories = true, parent = "Southern US", } labels["Western Pennsylvania"] = { aliases = {"Western Pennsylvania English"}, Wikipedia = "Western Pennsylvania English", regional_categories = true, parent = "Pennsylvania", } labels["Western US"] = { region = "the {{w|Western United States}}", aliases = {"western US"}, Wikipedia = {"Western American English", "Western United States"}, regional_categories = true, parent = "US", } labels["Wisconsin"] = { Wikipedia = true, regional_categories = true, parent = "Upper Midwestern US", } ------------------------------------ Australia and New Zealand ------------------------------------ labels["Australian Aboriginal"] = { prep = "by", region = "[[Aboriginal]] people in [[Australia]]", aliases = {"Australian aboriginal", "Australian Aboriginal English", "Australian aboriginal English", "Aboriginal Australian", "aboriginal Australian", "Aboriginal Australian English", "aboriginal Australian English"}, Wikipedia = "Australian Aboriginal English", regional_categories = true, parent = "Australia", } labels["Australia"] = { aliases = {"Australian", "AU", "AuE", "Aus", "AusE"}, Wikipedia = "Australian English", accent_Wikipedia = "Australian English phonology", regional_categories = "Australian", parent = "Oceania,Commonwealth", } labels["Canberra"] = { region = "the [[Australian Capital Territory]] ([[Canberra]])", Wikipedia = {"Variation in Australian English#Regional variation", true}, regional_categories = true, parent = "Australia", } labels["New South Wales"] = { aliases = {"NSW"}, Wikipedia = {"Variation in Australian English#Regional variation", true}, regional_categories = true, parent = "Australia", } labels["New Zealand"] = { aliases = {"NZ", "NZE"}, Wikipedia = "New Zealand English", accent_Wikipedia = "New Zealand English phonology", regional_categories = true, parent = "Oceania,Commonwealth", } labels["Northern Territory"] = { aliases = {"NT"}, Wikipedia = {"Variation in Australian English#Regional variation", true}, regional_categories = true, parent = "Australia", } labels["Northern US"] = { region = "the {{w|Northern United States}}", aliases = {"Northern American English", "northern US", "US North"}, Wikipedia = "Northern American English", regional_categories = true, parent = "US", } labels["Queensland"] = { Wikipedia = {"Variation in Australian English#Regional variation", true}, regional_categories = true, parent = "Australia", } labels["South Australia"] = { Wikipedia = "South Australian English", regional_categories = "South Australian", parent = "Australia", } labels["Tasmania"] = { Wikipedia = {"Variation in Australian English#Regional variation", true}, regional_categories = "Tasmanian", parent = "Australia", } labels["Victoria"] = { Wikipedia = {"Variation in Australian English#Regional variation", "Victoria (state)"}, regional_categories = true, parent = "Australia", } labels["Western Australia"] = { Wikipedia = "Western Australian English", regional_categories = "Western Australian", parent = "Australia", } ------------------------------------ Ireland ------------------------------------ labels["Cork"] = { Wikipedia = {"South-West Irish English", "Cork (city)"}, regional_categories = "Munster", } labels["Dublin"] = { Wikipedia = {"Dublin English", "Dublin", "DE"}, regional_categories = true, parent = "Ireland", } labels["Ireland"] = { aliases = {"Irish", "IE"}, Wikipedia = "Hiberno-English", regional_categories = "Irish", parent = "Europe", } labels["Munster"] = { Wikipedia = {"South-West Irish English", "Munster"}, regional_categories = true, parent = "Ireland", } ------------------------------------ United Kingdom ------------------------------------ labels["यूके"] = { addl = "Not to be confused with [[:Category:British English forms|British spellings]], a spelling system used in some English-speaking countries of the world.", aliases = {"United Kingdom", "British", "Britain", "Great Britain"}, Wikipedia = "ब्रिटिश अंग्रेज़ी", regional_categories = "ब्रिटिश", parent = "Europe,Commonwealth", country = "यूनाइटेड किंगडम", } labels["Antrim"] = { Wikipedia = "County Antrim", regional_categories = "Northern Irish", } labels["Bedfordshire"] = { Wikipedia = "Bedfordshire dialect", regional_categories = true, parent = "Southern England", } labels["Berkshire"] = { Wikipedia = true, regional_categories = true, parent = "Southern England", } labels["Birmingham"] = { Wikipedia = "Brummie dialect", regional_categories = true, parent = "West Midlands", } labels["Bristol"] = { region = "[[Bristol]], [[England]]", aliases = {"Bristolian"}, Wikipedia = "Bristolian dialect", regional_categories = "Bristolian", parent = "West Country", } labels["Caithness"] = { Wikipedia = true, regional_categories = true, parent = "Scotland", } labels["Cambridge University"] = { prep = "at", region = "{{w|Cambridge University}} in [[Cambridge]]", aliases = {"University of Cambridge", "Cantab"}, Wikipedia = "University of Cambridge", regional_categories = true, parent = "East Anglia", othercat = "en:Universities", } labels["Channel Islands"] = { the = true, Wikipedia = "Channel Island English", regional_categories = true, parent = "Europe,Commonwealth", } labels["Cockney"] = { prep = "by", region = "working-class [[Londoner]]s, especially in the [[East End]]", Wikipedia = "Cockney#Speech", regional_categories = true, parent = "London", } labels["Cornwall"] = { aliases = {"Cornish"}, Wikipedia = "Cornish dialect", regional_categories = "Cornish", parent = "West Country", } labels["Cumbria"] = { aliases = {"Cumbrian"}, Wikipedia = "Cumbrian dialect", regional_categories = "Cumbrian", parent = "Northern England", } labels["Derbyshire"] = { region = "[[Derbyshire]], which is geographically in the East Midlands but whose dialect is sometimes classified as West Midlands", Wikipedia = "Derbyshire dialect", regional_categories = true, parent = "East Midlands,West Midlands", } labels["Devon"] = { aliases = {"Devonshire"}, Wikipedia = {"West Country English", true}, regional_categories = "Devonian", parent = "West Country", } labels["Dorset"] = { Wikipedia = "Dorset dialect", regional_categories = true, parent = "West Country", } labels["Dundee"] = { Wikipedia = true, regional_categories = true, parent = "Scotland", } labels["Durham University"] = { prep = "at", region = "{{w|Durham University}} in [[Durham]]", Wikipedia = true, regional_categories = true, parent = "Durham", othercat = "en:Universities", } labels["Durham"] = { Wikipedia = "County Durham", regional_categories = true, parent = "Northumbria", } labels["East Anglia"] = { Wikipedia = "East Anglian English", regional_categories = "East Anglian", parent = "England", } labels["East Midlands"] = { region = "the [[East Midlands]] of [[England]]", Wikipedia = "East Midlands English", regional_categories = true, parent = "Midlands", } labels["England"] = { aliases = {"English"}, Wikipedia = "English language in England", regional_categories = "English", parent = "British", } labels["England and Wales"] = { aliases = {"E&W"}, Wikipedia = true, regional_categories = {"English", "Welsh"}, } labels["Essex"] = { Wikipedia = "Essex dialect", regional_categories = true, parent = "Southern England", } labels["Exmoor"] = { Wikipedia = true, regional_categories = {"Devonian", "Somerset"}, } labels["Geordie"] = { region = "Tyneside", aliases = {"Geordie English", "Tyneside"}, Wikipedia = true, plain_categories = true, parent = "Northumbria", } labels["Gloucestershire"] = { Wikipedia = {"West Country English", true}, regional_categories = true, parent = "West Country", } labels["Guernsey"] = { prep = "on", Wikipedia = "Channel Island English#Guernsey English", regional_categories = true, parent = "Channel Islands", } labels["Hartlepool"] = { Wikipedia = "Smoggie", regional_categories = "Teesside", } labels["Herefordshire"] = { Wikipedia = true, regional_categories = true, parent = "West Country", } labels["Isle of Man"] = { prep = "on", the = true, aliases = {"Manx"}, Wikipedia = "Manx English", regional_categories = "Manx", parent = "British", } labels["Isle of Wight"] = { prep = "on", the = true, Wikipedia = true, regional_categories = true, parent = "Southern England", } labels["Jersey"] = { prep = "on", Wikipedia = "Channel Island English#Jersey English", regional_categories = true, parent = "Channel Islands", } labels["Kent"] = { aliases = {"Kentish"}, Wikipedia = "Kentish dialect", regional_categories = "Kentish", parent = "Southern England", } labels["Lancashire"] = { Wikipedia = "Lancashire dialect", regional_categories = true, parent = "Northern England", } labels["Lewis"] = { prep = "on", region = "the [[Isle of Lewis]]", aliases = {"Isle of Lewis"}, Wikipedia = "Isle of Lewis", regional_categories = true, parent = "Scotland", } labels["Lincolnshire"] = { Wikipedia = "Lincolnshire dialect", regional_categories = true, parent = "East Midlands", } labels["Liverpool"] = { region = "the {{w|Liverpool City Region}}, comprising the [[metropolitan county]] of [[Merseyside]] and the [[Cheshire]] [[unitary authority]] of [[Halton]]", aliases = {"Scouse"}, Wikipedia = "Scouse", regional_categories = "Liverpudlian", parent = "Northern England", } labels["London"] = { Wikipedia = "Estuary English", regional_categories = true, parent = "Southern England", } labels["Manchester"] = { aliases = {"Mancunian"}, Wikipedia = "Manchester dialect", regional_categories = "Mancunian", parent = "Northern England", } labels["Mid-Ulster"] = { region = "central [[Ulster]]", aliases = {"Mid-Ulster English"}, Wikipedia = "Mid-Ulster English", regional_categories = true, parent = "Ulster,Northern Ireland", } labels["Midlands"] = { region = "the [[Midlands]] of [[England]]", aliases = {"English Midlands", "South Midlands"}, Wikipedia = "Midlands English", regional_categories = true, parent = "England", } labels["Multicultural London English"] = { prep = "by", region = "young, working-class people in multicultural parts of [[London]]", aliases = {"MLE"}, display = "MLE", Wikipedia = true, plain_categories = true, parent = "London", } labels["Norfolk"] = { Wikipedia = "Norfolk dialect", regional_categories = true, parent = "East Anglia", } labels["North Wales"] = { Wikipedia = {"Welsh English", true}, regional_categories = true, parent = "Wales", } labels["Northern England"] = { aliases = {"northern England", "North England", "north England"}, Wikipedia = "English language in Northern England", regional_categories = true, parent = "England", } labels["Northern Ireland"] = { aliases = {"Northern Irish", "NI"}, Wikipedia = "Ulster English", regional_categories = "Northern Irish", parent = "Ulster", } labels["Northern Isles"] = { display = "[[w:Orkney|Orkney]], [[w:Shetland|Shetland]]", regional_categories = {"Orkney", "Shetland"}, } labels["Northumberland"] = { Wikipedia = {"Northumberland"}, regional_categories = true, parent = "Northumbria", } labels["Northumbria"] = { aliases = {"Northumbrian", "Northeast England", "North-East England", "North East England"}, Wikipedia = {"Northumbrian dialect", "Northumbria (modern)"}, regional_categories = "Northumbrian", parent = "Northern England", } labels["Nottinghamshire"] = { Wikipedia = "Nottinghamshire dialect", regional_categories = true, parent = "East Midlands", } labels["Orkney"] = { prep = "on", aliases = {"Orcadian"}, Wikipedia = {true, "Highland English"}, regional_categories = true, parent = "Scotland", } labels["Oxbridge"] = { Wikipedia = true, regional_categories = {"Cambridge University", "Oxford University"}, } labels["Oxford City"] = { region = "the city of [[Oxford]] in [[England]]", Wikipedia = true, regional_categories = "Oxford", parent = "Oxfordshire", } labels["Oxford University"] = { prep = "at", aliases = {"University of Oxford", "Oxon"}, Wikipedia = "University of Oxford", regional_categories = true, parent = "Oxford City", othercat = "en:Universities", } labels["Oxfordshire"] = { Wikipedia = true, regional_categories = true, parent = "Southern England", } labels["Pitmatic"] = { Wikipedia = true, regional_categories = true, parent = "Northumbria", } labels["Potteries"] = { region = "Stoke-on-Trent", Wikipedia = "Potteries dialect", regional_categories = true, parent = "West Midlands", } labels["Scotland"] = { aliases = {"Scottish", "Scottish English", "ScE"}, Wikipedia = "Scottish English", regional_categories = "Scottish", parent = "British", } labels["Shetland"] = { region = "the [[Shetland Islands]]", aliases = {"Shetland Islands", "Shetlands"}, Wikipedia = {true, "Highland English"}, regional_categories = true, parent = "Scotland", } labels["Shropshire"] = { Wikipedia = true, regional_categories = true, parent = "West Midlands", } labels["Somerset"] = { Wikipedia = {"West Country English", true}, regional_categories = true, parent = "West Country", } -- eventually maybe break this out into its own category labels["South Midlands"] = { Wikipedia = {"Midlands English", "South Midlands"}, regional_categories = "Midlands", } labels["South Wales"] = { Wikipedia = {"Welsh English", true}, regional_categories = true, parent = "Wales", } labels["Southern England"] = { aliases = {"southern England", "South England", "south England", "Southern English"}, Wikipedia = "English in southern England", regional_categories = true, parent = "England", } labels["Suffolk"] = { Wikipedia = "Suffolk dialect", regional_categories = true, parent = "East Anglia", } labels["Sussex"] = { Wikipedia = "Sussex dialect", regional_categories = true, parent = "Southern England", } labels["Teesside"] = { Wikipedia = "Smoggie", regional_categories = true, parent = "Northumbria", } -- Tyneside: see Geordie labels["Ulster"] = { Wikipedia = "Ulster English", regional_categories = true, parent = "Ireland", } labels["Wales"] = { aliases = {"Welsh"}, Wikipedia = "Welsh English", regional_categories = "Welsh", parent = "British", } labels["Wearside"] = { Wikipedia = {"Mackem", true}, regional_categories = true, parent = "Northumbria", } labels["West Country"] = { the = true, aliases = {"West England", "west England"}, Wikipedia = "West Country English", regional_categories = true, parent = "England", } -- can be split off if enough entries in it arise; group with Cumbria for now labels["West Cumbria"] = { Wikipedia = "Cumbrian dialect", regional_categories = "Cumbrian", } labels["West Midlands"] = { region = "the [[West Midlands]] of [[England]]", Wikipedia = "West Midlands English", regional_categories = true, parent = "Midlands", } labels["Wiltshire"] = { Wikipedia = {"West Country English", true}, regional_categories = true, parent = "West Country", } labels["Yorkshire"] = { Wikipedia = "Yorkshire dialect", regional_categories = true, parent = "Northern England", } -------------------------------- South Asia -------------------------------- labels["South Asia"] = { aliases = {"Indic", "South Asian"}, Wikipedia = "South Asian English", regional_categories = "South Asian", parent = "Asia", } labels["Afghanistan"] = { Wikipedia = true, regional_categories = "Afghan", parent = "South Asia", } labels["Bangladesh"] = { Wikipedia = "Bangladeshi English", regional_categories = "Bangladeshi", parent = "South Asia,Commonwealth", } labels["Nepal"] = { Wikipedia = "Nepalese English", regional_categories = "Nepali", parent = "South Asia,Commonwealth", } labels["Sri Lanka"] = { aliases = {"Sri Lankan"}, Wikipedia = "Sri Lankan English", regional_categories = "Sri Lankan", parent = "South Asia,Commonwealth", } labels["Pakistan"] = { aliases = {"Pakistani"}, Wikipedia = "Pakistani English", regional_categories = "Pakistani", parent = "South Asia,Commonwealth", } labels["British Pakistani"] = { prep = "by", region = "{{w|British Pakistanis}}, i.e. [[British]] citizens of [[Pakistani]] origin", Wikipedia = "British Pakistanis", regional_categories = true, parent = "South Asia,British", } labels["British India"] = { fulldef = "Anglo-Indian terms or senses in English as used formerly by Britishers in {{w|British India}}", Wikipedia = "Indian English", -- The WP articles are strictly divided by geography, not historical period regional_categories = true, parent = "South Asia,British", othercat = "English terms with historical senses", } labels["भारत"] = { aliases = {"भारतीय", "भारतीय अंग्रेज़ी", "InE"}, Wikipedia = "भारतीय अंग्रेज़ी", accent_Wikipedia = "Indian English#Phonology", regional_categories = "भारतीय", parent = "दक्षिण एशिया,कॉमनवेल्थ", } labels["North India"] = { Wikipedia = true, regional_categories = "North Indian", parent = "India", } labels["South India"] = { aliases = {"South Indian"}, Wikipedia = true, regional_categories = "South Indian", parent = "India", } labels["West Bengal"] = { Wikipedia = true, accent_Wikipedia = "Regional differences and dialects in Indian English#Bengali English", regional_categories = true, parent = "India", } labels["हिंग्लिश"] = { def = "[[हिंग्लिश]], an English-based [[creole]] incorporating many [[Hindi]] words; used informally in [[India]]", Wikipedia = true, plain_categories = true, parent = "North India", } labels["Tamil Nadu"] = { aliases = {"TN", "Tamilnadu"}, accent_Wikipedia = "Regional differences and dialects in Indian English#Southern Indian English", parent="South India" } labels["Kerala"] = { accent_Wikipedia = "Regional differences and dialects in Indian English#Malayali", aliases = { "Malayalam", "Mallu" }, parent = "South India" } ------------------------------------ World ------------------------------------ labels["Africa"] = { aliases = {"African"}, Wikipedia = "African English", regional_categories = "African", parent = true, } labels["Antarctica"] = { Wikipedia = "Antarctic English", regional_categories = "Antarctic", parent = true, } labels["Asia"] = { Wikipedia = "Asian English", regional_categories = "Asian", parent = true, } labels["Bahamas"] = { the = true, Wikipedia = "Bahamian English", regional_categories = "Bahaman", parent = "Caribbean", } labels["Barbados"] = { Wikipedia = "English in Barbados", regional_categories = "Barbadian", parent = "Caribbean", } labels["Belize"] = { Wikipedia = "Belizean English", regional_categories = "Belizean", parent = "Caribbean,Central America", } labels["Benglish"] = { def = "[[Benglish]], an English-based [[creole]] incorporating many [[Bengali]] words; used informally in [[Bangladesh]] and [[West Bengal]]", aliases = {"Banglish"}, Wikipedia = true, plain_categories = true, parent = "Bangladesh,West Bengal", } labels["Bermuda"] = { Wikipedia = "Bermudian English", regional_categories = "Bermudian", parent = "Caribbean,rawposcat:North American English,British", } labels["Botswana"] = { Wikipedia = "Botswana English", regional_categories = "Botswanan", parent = "Africa", } labels["Brunei"] = { Wikipedia = "Brunei English", regional_categories = "Bruneian", parent = "Southeast Asia", } labels["Cameroon"] = { aliases = {"CM", "Cameroonian", "Cameroonian English", "en-CM"}, Wikipedia = "Cameroonian English", regional_categories = "Cameroonian", parent = "Africa", } labels["Caribbean"] = { the = true, aliases = {"West Indies"}, Wikipedia = "Caribbean English", regional_categories = true, parent = true, } labels["Cebu"] = { Wikipedia = true, regional_categories = true, parent = "Philippines", } labels["Central America"] = { Wikipedia = true, regional_categories = "Central American", parent = "rawposcat:North American English", } labels["Ceylon"] = { Wikipedia = true, regional_categories = "Sri Lankan", } labels["China"] = { Wikipedia = true, regional_categories = "Chinese", parent = "East Asia", } labels["Chinese Filipino"] = { verb = "used", prep = "by", region = "Chinese Filipinos", aliases = {"Chinese-Filipino"}, -- Sociolect subset to Philippine English -- may also see "Hokaglish" in Wikipedia, although Hokaglish is the codeswitching form with a Hokkien or Tagalog base, just like Philippine English to "Conyo" (English-based) and "Taglish" (Tagalog-based), whereas this is the English variant itself subset to Philippine English. Wikipedia = "Chinese Filipino#Language", regional_categories = true, parent = "Philippines", } labels["Chinglish"] = { def = "[[English]] that has been influenced by [[Chinese]]", Wikipedia = true, plain_categories = true, parent = "China", } labels["Commonwealth"] = { region = "the [[Commonwealth of Nations]]", Wikipedia = "English in the Commonwealth of Nations", regional_categories = true, parent = true, } labels["Cuba"] = { Wikipedia = true, regional_categories = "Cuban", parent = "Caribbean", } labels["East Africa"] = { Wikipedia = true, regional_categories = "East African", parent = "Africa", } labels["East Asia"] = { Wikipedia = true, regional_categories = "East Asian", parent = "Asia", } labels["Egypt"] = { Wikipedia = true, regional_categories = "Egyptian", parent = "Africa,Middle East", } labels["Europe"] = { aliases = {"European"}, Wikipedia = "English language in Europe", regional_categories = "European", parent = true, } labels["Fiji"] = { Wikipedia = "Fijian English", regional_categories = "Fijian", parent = "Oceania,Commonwealth", } labels["Ghana"] = { Wikipedia = "Ghanaian English", regional_categories = "Ghanaian", parent = "West Africa", } labels["Guyana"] = { Wikipedia = {"Guyanese English", "Guyana"}, regional_categories = "Guyanese", parent = "Caribbean,South America", } labels["Hong Kong"] = { aliases = {"HK"}, Wikipedia = "Hong Kong English", regional_categories = true, parent = "China", } labels["Hungary"] = { Wikipedia = true, regional_categories = "Hungarian", parent = "Europe", } labels["Indonesia"] = { Wikipedia = "Indonesian English", regional_categories = "Indonesian", parent = "Southeast Asia", } labels["Israel"] = { Wikipedia = "Israeli English", regional_categories = "Israeli", parent = "Middle East", } labels["Japan"] = { Wikipedia = true, regional_categories = "Japanese", parent = "East Asia", } labels["Jamaica"] = { aliases = {"Jamaican English", "Jamaican"}, Wikipedia = "Jamaican English", regional_categories = "Jamaican", parent = "Caribbean,Commonwealth", } labels["Kenya"] = { Wikipedia = "Kenyan English", regional_categories = "Kenyan", parent = "East Africa", } labels["Liberia"] = { Wikipedia = "Liberian English", regional_categories = "Liberian", parent = "West Africa", } labels["Libya"] = { Wikipedia = true, regional_categories = "Libyan", parent = "Africa", } labels["Macau"] = { Wikipedia = true, regional_categories = "Macanese", parent = "China", } labels["Mainland China"] = { aliases = {"Mainland", "mainland", "mainland China"}, Wikipedia = true, regional_categories = true, parent = "China", } labels["Malaysia"] = { aliases = {"Malaysian"}, Wikipedia = "Malaysian English", regional_categories = "Malaysian", parent = "Southeast Asia,Commonwealth", } labels["Malta"] = { Wikipedia = "Maltese English", regional_categories = "Maltese", parent = "Europe", } labels["Manglish"] = { def = "[[Manglish]], an English-based [[creole]] incorporating [[Malay]], [[Chinese]], and [[Tamil]] words; used informally in [[Malaysia]]", Wikipedia = true, plain_categories = true, parent = "Malaysia", } labels["Mexico"] = { Wikipedia = {"Mexican English", "Mexico"}, regional_categories = "Mexican", parent = "rawposcat:North American English", } labels["Middle East"] = { the = true, Wikipedia = true, regional_categories = "Middle Eastern", parent = true, } labels["Myanmar"] = { aliases = {"Burma"}, Wikipedia = "Myanmar English", regional_categories = true, parent = "Southeast Asia", } labels["Namibia"] = { Wikipedia = "Namibian English", regional_categories = "Namibian", parent = "Africa", } labels["Natal"] = { Wikipedia = "KwaZulu-Natal", regional_categories = true, parent = "South Africa", } labels["Nigeria"] = { aliases = {"Nigerian"}, Wikipedia = "Nigerian English", regional_categories = "Nigerian", parent = "West Africa", } labels["Oceania"] = { Wikipedia = "Oceanian English", regional_categories = "Oceanian", parent = true, } labels["Palestine"] = { Wikipedia = true, regional_categories = "Palestinian", parent = "Middle East", } labels["Papua New Guinea"] = { Wikipedia = "Papua New Guinean English", regional_categories = "Papua New Guinean", parent = "Oceania,Commonwealth", } labels["Philippines"] = { the = true, aliases = {"Philippine", "Philippine English"}, Wikipedia = "Philippine English", regional_categories = "Philippine", parent = "Southeast Asia", } labels["Baguio"] = { Wikipedia = true, regional_categories = true, parent = "Philippines", } labels["Réunion"] = { Wikipedia = true, regional_categories = true, parent = "Africa", } labels["Rhodesia"] = { region = "the historical state of [[Rhodesia]]", Wikipedia = "Zimbabwean English", regional_categories = "Rhodesian", parent = "Africa", } labels["Rwanda"] = { Wikipedia = true, regional_categories = "Rwandan", parent = "Africa", } labels["Singapore"] = { aliases = {"SG", "Singaporean"}, Wikipedia = "Singapore English", regional_categories = true, parent = "Southeast Asia,Commonwealth", } labels["Singlish"] = { def = "[[Singlish]], an English-based [[creole]] incorporating many words of [[Chinese]], [[Malay]] and [[Indian]] origin; used informally in [[Singapore]]", Wikipedia = true, plain_categories = true, parent = "Singapore", } labels["Solomon Islands"] = { the = true, Wikipedia = "Solomon Islands English", regional_categories = true, parent = "Oceania", } labels["South Africa"] = { aliases = {"South African", "South African English", "ZA"}, Wikipedia = "South African English", accent_Wikipedia = "South African English phonology", accent_display = "General South African", regional_categories = "South African", parent = "Africa,Commonwealth", } labels["South America"] = { aliases = {"South American"}, Wikipedia = "South American English", regional_categories = "South American", parent = true, } labels["South Korea"] = { Wikipedia = "Korean English", regional_categories = "South Korean", parent = "East Asia", } labels["Southeast Asia"] = { aliases = {"Southeast Asian", "South-East Asia", "South-East Asian", "South-east Asia", "South-east Asian", "SEA"}, Wikipedia = "Southeast Asian English", regional_categories = "Southeast Asian", parent = "Asia", } labels["Taiwan"] = { aliases = {"Taiwanese"}, Wikipedia = true, regional_categories = "Taiwanese", parent = "East Asia", } labels["Tanzania"] = { aliases = {"Tanzanian"}, Wikipedia = true, regional_categories = "Tanzanian", parent = "East Africa", } labels["Thailand"] = { Wikipedia = "Tinglish", regional_categories = "Thai", parent = "Southeast Asia", } labels["Trinidad and Tobago"] = { aliases = {"Trinidad", "Tobago", "Trinidadian"}, Wikipedia = "Trinidadian and Tobagonian English", regional_categories = true, parent = "Caribbean", } labels["Uganda"] = { Wikipedia = "Ugandan English", regional_categories = "Ugandan", parent = "Africa", } labels["Vanuatu"] = { Wikipedia = "Vanuatuan English", regional_categories = true, parent = "Oceania", } labels["Vietnam"] = { Wikipedia = "Vietglish", regional_categories = "Vietnamese", parent = "Southeast Asia", } labels["West Africa"] = { aliases = {"West African"}, Wikipedia = true, regional_categories = "West African", parent = "Africa", } labels["Zimbabwe"] = { Wikipedia = "Zimbabwean English", regional_categories = true, parent = "Africa", } ------------------------------------ non-regional ------------------------------------ labels["DoggoLingo"] = { def = "[[DoggoLingo]]", display = "[[DoggoLingo]]", noreg = true, plain_categories = true, othercat = "English internet slang", parent = "internet slang", } labels["Early Modern"] = { prep = "from", region = "the late 15th to the mid-17th centuries", noreg = true, nolink = true, aliases = {"Early Modern English", "EME", "EMnE", "EModE"}, Wikipedia = "Early Modern English", regional_categories = true, parent = true, } labels["Late Modern"] = { prep = "from", region = "the mid-17th to the end of the 19th centuries", noreg = true, nolink = true, aliases = {"Late Modern English", "LME"}, Wikipedia = "Late Modern English", regional_categories = true, parent = true, } -- for French terms used in French contexts labels["Gallicism"] = { noreg = true, aliases = {"French", "Frenchism"}, plain_categories = true, Wikipedia = "Glossary of French words and expressions in English", othercat = "English terms by usage,English terms by orthographic property", } -- ideally this would sit at [[Module:category tree/pragmatic properties]] so it can be used for all languages, but those cats needs to begin with the language name... labels["non-native speakers' English"] = { display = "[[non-native speaker]]s' English", noreg = true, aliases = {"NNES", "NNSE"}, regional_categories = "Non-native speakers'", Wikipedia = "English as a second or foreign language", accent_Wikipedia = "Non-native pronunciations of English", othercat = "English nonstandard terms,English terms by usage,English terms by orthographic property", } labels["Polari"] = { def = "a form of cant slang used in [[Britain]] by some actors, circus and fairground showmen, professional wrestlers, merchant navy sailors, criminals, prostitutes, and the gay subculture", noreg = true, country = "the United Kingdom", Wikipedia = true, plain_categories = true, othercat = "British slang,English cant,English gay slang", parent = true, } -- Thieves' Cant is English-only, for other languages, use "criminal slang" labels["thieves' cant"] = { fulldef = "A secret language formerly used by thieves, beggars and hustlers of various kinds in [[Great Britain]] and to a lesser extent in other English-speaking countries", noreg = true, aliases = {"Thieves' Cant", "Thieves' cant", "thieves cant", "thieves'", "thieves"}, Wikipedia = true, -- FIXME: Currently pos_categories aren't recognized. -- pos_categories = "Thieves' Cant", plain_categories = "English Thieves' Cant", parent = true, othercat = "English cant", } ------------------------------------ English-specific qualifier labels ------------------------------------ labels["attributive"] = { display = "[[Appendix:English nouns#Attributive|attributive]]", } labels["attributively"] = { display = "[[Appendix:English nouns#Attributive|attributively]]", } ------------------------------------ supporting [[Template:standard spelling of]] et al. ------------------------------------ labels["American spelling"] = { aliases = {"American form", "US spelling", "US form", -- As in "color" vs. "colour" "or form", "-or form", "or spelling", "-or spelling", -- As in "meter" vs. "metre" "er form", "-er form", "er spelling", "-er spelling" }, Wikipedia = "American and British English spelling differences", form_of_display = "American", plain_categories = "American English forms", } labels["Australian spelling"] = { aliases = {"Australian form"}, Wikipedia = "Australian English#Spelling and style", form_of_display = "Australian", plain_categories = "Australian English forms", } labels["British spelling"] = { aliases = {"British form", "UK spelling", "UK form"}, Wikipedia = "American and British English spelling differences", form_of_display = "British", plain_categories = "British English forms", } labels["Commonwealth spelling"] = { aliases = {"Commonwealth form", -- As in "color" vs. "colour" "our form", "-our form", "our spelling", "-our spelling", -- As in "meter" vs. "metre" "re form", "-re form", "re spelling", "-re spelling" }, Wikipedia = "American and British English spelling differences", form_of_display = "Commonwealth", plain_categories = {"British English forms", "Canadian English forms", "Australian English forms"}, } labels["Canadian spelling"] = { aliases = {"Canadian form"}, Wikipedia = true, form_of_display = "Canadian", plain_categories = "Canadian English forms", } labels["Oxford British spelling"] = { aliases = {"Oxford", "Oxford form", "Oxford spelling", "en-GB-oxendict",}, display = "[[w:Oxford spelling|Oxford]] [[British English]]", plain_categories = "Oxford spellings", } labels["non-Oxford British spelling"] = { aliases = {"Non-Oxford British spelling", "non-Oxford British form", "Non-Oxford British form", "non-Oxford form", "Non-Oxford form", "non-Oxford", "Non-Oxford", "not Oxford", "Not Oxford"}, display = "non-[[w:Oxford spelling|Oxford]] [[British English]]", plain_categories = "British English forms", } labels["ise spelling"] = { aliases = { "ise", "-ise", "ise form", "-ise form", "-ise spelling", "isation", "-isation", "isation form", "-isation form", "isation spelling", "-isation spelling", "ise-form" -- backwards compatability }, display = "non-[[w:Oxford spelling|Oxford]] [[w:American and British English spelling differences|British spelling]]", form_of_display = "non-[[w:Oxford spelling|Oxford]] [[w:American and British English spelling differences|British]]", plain_categories = "British English forms", } labels["ize spelling"] = { aliases = { "ize", "-ize", "ize form", "-ize form", "-ize spelling", "ization", "-ization", "ization form", "-ization form", "ization spelling", "-ization spelling", "ize-form" -- backwards compatability }, display = "[[w:American and British English spelling differences|American]] and [[w:Oxford spelling|Oxford]] [[British English|British spelling]]", form_of_display = "[[w:American and British English spelling differences|American]] and [[w:Oxford spelling|Oxford]] [[British English|British]]", plain_categories = {"American English forms", "Oxford spellings"}, } ------------------------------------ supporting [[Template:inflection of]] ------------------------------------ -- This is added to an inflection line when something like {{infl of|en|make||th-form}} is used. Specifically, the form-of -- tag 'th-form' is a shortcut for '3-th|s|spres|ind' (see [[Module:form of/lang-data/en]]); the tag '3-th' displays as -- "third-person" (see [[Module:form of/lang-data/en]]) and attaches the following label (see [[Module:form of/cats]]). labels["archaic third singular"] = { display = "archaic", Wikipedia = "English verbs#Archaic forms", pos_categories = "archaic third-person singular forms", } -- This is added to an inflection line when something like {{infl of|en|make||st-form}} is used. See above. labels["archaic second singular present"] = { display = "archaic", Wikipedia = "English verbs#Archaic forms", pos_categories = "second-person singular forms", } -- This is added to an inflection line when something like {{infl of|en|make||st-past-form}} is used. See above. labels["archaic second singular past"] = { display = "archaic", Wikipedia = "English verbs#Archaic forms", pos_categories = "second-person singular past tense forms", } ------------------------------------ accent qualifiers ------------------------------------ -- Generate the inverse of a sound change. In general, we should do this for sound changes that are either -- extremely common (e.g. 'cot-caught') or dominant ('horse-hoarse', 'wine-whine') or are at least locally -- dominant (e.g. 'cheer-chair'). The idea is that when presenting the pronunciation of an area with a locally -- dominant pronunciation, we may want to also present the alternative pronunciation lacking the change, as long -- as it is found at least somewhere in the area. Hence, for New Zealand, which typically has the cheer-chair -- merger, we might might to present the non-merger pronunciation as well; but for a change like card-cord that -- is recessive everywhere, it's unlikely we'll need to specifically highlight the inverse pronunciation (which -- would be the standard, already covered elsewhere), and we can save memory and time by omitting the label. local function generate_non(key, display) if not labels[key] then error(("Internal error: No label definition for key '%s'"):format(key)) end local labval = mw.clone(labels[key]) labels["non-" .. key] = labval if labval.aliases then for i, alias in ipairs(labval.aliases) do labval.aliases[i] = "non-" .. alias end end if not display then display = labval.display or key if display:find("ing$") or display:find("[st]ion$") then -- e.g. "Canadian raising", "t-glottalization" display = "without " .. display else -- e.g. "cot-caught merger" display = "without the " .. display end end labval.display = display end labels["Anglicised"] = { aliases = {"Anglicized"}, Wikipedia = "Anglicisation#Anglicisation of non-English-language vocabulary and names", } labels["bad-lad split"] = { Wikipedia = true, display = "''bad''–''lad'' split", } labels["Canadian raising"] = { aliases = {"North American raising"}, Wikipedia = true, } generate_non("Canadian raising") labels["Canadian Shift"] = { aliases = {"Canadian Vowel Shift", "Canadian shift", "Canadian vowel shift"}, Wikipedia = true, display = "Canadian Vowel Shift", } generate_non("Canadian Shift") labels["card-cord"] = { Wikipedia = "Card-cord merger", display = "''card''–''cord'' merger", } labels["cheer-chair"] = { aliases = {"near-square"}, Wikipedia = "near-square merger", display = "''cheer''–''chair'' merger", } generate_non("cheer-chair") labels["cot-caught"] = { aliases = {"caught-cot"}, Wikipedia = "Cot–caught merger", display = "''cot''–''caught'' merger", } generate_non("cot-caught") labels["cure-fir"] = { aliases = {"cure-nurse"}, Wikipedia = "Cure-nurse merger", display = "''cure''–''fir'' merger", } generate_non("cure-fir") labels["doll-dole"] = { Wikipedia = "Doll-dole merger", display = "''doll''–''dole'' merger", } labels["dough-door"] = { Wikipedia = "Dough-door merger", display = "''dough''–''door'' merger", } generate_non("dough-door") labels["Estuary English"] = { Wikipedia = true, } labels["fair-fur"] = { aliases = {"square-nurse"}, Wikipedia = "Square-nurse merger", display = "''fair''–''fur'' merger", } generate_non("fair-fur") labels["father-bother"] = { Wikipedia = "Father–bother merger", display = "''father''-''bother'' merger", } generate_non("father-bother") labels["fern-fir-fur"] = { aliases = {"nurse merger"}, Wikipedia = "Fern-fir-fur merger", display = "''fern''–''fir''–''fur'' merger", } generate_non("fern-fir-fur") labels["fool-fall"] = { Wikipedia = "English-language vowel changes before historic /l/#Fool–fall_merger", display = "''fool''–''fall'' merger", } labels["foot-goose"] = { Wikipedia = "Foot-goose merger", display = "''foot''-''goose'' merger", } -- Most labels of the form 'foo-bar' are mergers. Since this is rather a split, include the word "split" -- for clarity. labels["foot-strut split"] = { Wikipedia = "Phonological history of English close back vowels#FOOT–STRUT split", display = "''foot''-''strut'' split", } generate_non("foot-strut split") labels["full-fool"] = { Wikipedia = "English-language vowel changes before historic /l/#Full–fool_merger", display = "''full''–''fool'' merger", } labels["g-dropping"] = { aliases = {"g dropping"}, Wikipedia = "G-dropping", display = "''g''-dropping", } generate_non("g-dropping") labels["General American"] = { aliases = {"GenAm", "GA"}, Wikipedia = "General American English", } labels["glottalized"] = { aliases = {"glottalization", "glottalised", "glottalisation"}, Wikipedia = "Phonological history of English consonant clusters#Glottalization", } labels["goose split"] = { -- Phonemic split in some Southeastern England English variants. Wikipedia = "English-language vowel changes before historic /l/#Goose_split", display = "''goose'' split", } labels["gulf-golf"] = { Wikipedia = "English-language vowel changes before historic /l/#Gulf-golf merger", display = "''gulf''-''golf'' merger", } labels["h-dropping"] = { Wikipedia = "H-dropping", display = "''h''-dropping", } generate_non("h-dropping") labels["happy-tensing"] = { aliases = {"happy tensing"}, Wikipedia = "Happy tensing", display = "''happy''-tensing", } generate_non("happy-tensing") labels["horse-hoarse"] = { Wikipedia = "horse–hoarse merger", display = "''horse''–''hoarse'' merger", } generate_non("horse-hoarse") labels["hurry-furry"] = { Wikipedia = "hurry-furry merger", display = "''hurry''–''furry'' merger", } generate_non("hurry-furry") labels["Inland Northern US"] = { aliases = {"Great Lakes", "Inland Northern", "Inland North", "Inland Northern American", "Inland Northern American English", "Inland Northern English", "Northern Cities Vowel Shift", "US Inland North", "northern cities vowel shift"}, Wikipedia = "Inland Northern American English", display = "Inland Northern American", } labels["intrusive r"] = { Wikipedia = "Intrusive r", display = "intrusive R", } generate_non("intrusive r", "without intrusive R") labels["laxing"] = { Wikipedia = "Trisyllabic laxing" } generate_non("laxing") labels["linking w"] = { Wiktionary = "Appendix:English_pronunciation#Linking_semivowels", display="linking W" } labels["linking y"] = { Wiktionary = "Appendix:English_pronunciation#Linking_semivowels", display="linking Y" } labels["l-vocalization"] = { aliases = {"l-vocalisation"}, Wikipedia = "L-vocalization#Modern English", display = "''l''-vocalization", } generate_non("l-vocalization") labels["Latinate"] = { Wikipedia = "Latin#Phonology", } labels["lot-cloth split"] = { Wikipedia = true, display = "''lot''–''cloth'' split", } generate_non("lot-cloth split") labels["low-back-merger shift"] = { aliases = {"LBMS", "low back merger shift"}, Wikipedia = "Low-back-merger shift", display = "''low-back-merger shift", } labels["Mary-marry-merry"] = { aliases = {"Mmmm"}, Wikipedia = "Mary–marry–merry merger", display = "''Mary''–''marry''–''merry'' merger", } generate_non("Mary-marry-merry") table.insert(labels["non-Mary-marry-merry"].aliases, "nMmmm") labels["merry-Murray"] = { aliases = {"Merry-Murray"}, Wikipedia = "Merry–Murray merger", display = "''merry''–''Murray'' merger", } labels["mirror-nearer"] = { aliases = {"Sirius-serious"}, Wikipedia = "Mirror-nearer merger", display = "''mirror''–''nearer'' merger", } generate_non("mirror-nearer") labels["nt-flapping"] = { Wikipedia = "Flapping#Distribution", display = "''nt''-flapping", } generate_non("nt-flapping") labels["pane-pain"] = { Wikipedia = "Pane–pain merger", display = "''pane''–''pain'' merger" } generate_non("pane-pain") labels["paw-poor"] = { Wikipedia = "Rhoticity in English#/ɔː/–/ʊər/ merger", display = "''paw''–''poor'' merger", } labels["pin-pen"] = { aliases = {"pen-pin"}, Wikipedia = "pin–pen merger", display = "''pin''–''pen'' merger", } labels["pour-poor"] = { aliases = {"poor-pour", "cure-force"}, Wikipedia = "Cure–force merger", display = "''pour''–''poor'' merger", } generate_non("pour-poor") labels["r-dissimilation"] = { Wikipedia = "Dissimilation", display = "''r''-dissimilation", } labels["rhotic"] = { Wikipedia = "Rhoticity in English", } labels["non-rhotic"] = { aliases = {"nonrhotic"}, Wikipedia = "Rhoticity in English", } labels["Received Pronunciation"] = { aliases = {"RP"}, Wikipedia = true, } labels["salary-celery"] = { Wikipedia = "Salary–celery merger", display = "''salary''–''celery'' merger", } labels["show-sure"] = { Wikipedia = "Show-sure merger", display = "''show''–''sure'' merger", } labels["Standard Southern British English"] = { aliases = {"SSB", "SSBE", "Standard Southern British"}, Wikipedia = "Standard Southern British", display = "Standard Southern British", } labels["stressed"] = { Wikipedia = "Stress and vowel reduction in English#Weak and strong forms of function words", display = "stressed form", } labels["tar-tire"] = { Wikipedia = "/aɪər/–/ɑr/ merger", display = "tar-tire merger", } labels["tar-tire-tower"] = { Wikipedia = "English-language vowel changes before historic /r/#/aɪə/–/aʊə/–/ɑː/ merger", display = "tar-tire-tower merger", } labels["t-flapping"] = { Wikipedia = "t-flapping", } generate_non("t-flapping") labels["t-glottalization"] = { aliases = {"t-glottaling", "t-glottalisation"}, Wikipedia = "T-glottalization", display = "''t''-glottalization", } generate_non("t-glottalization") labels["th-fronting"] = { Wikipedia = true, display = "''th''-fronting", } labels["th-stopping"] = { Wikipedia = true, display = "''th''-stopping", } labels['toe-tow'] = { Wikipedia = "Phonological history of English diphthongs#Toe–tow merger", display = "''toe''–''tow'' merger" } generate_non("toe-tow") labels["trap-bath split"] = { Wikipedia = "trap–bath split", display = "''trap''–''bath'' split", } generate_non("trap-bath split") labels["triphthong smoothing"] = { Wikipedia = "Triphthong smoothing", display = "triphthong smoothing", } generate_non("triphthong smoothing") labels["unstressed"] = { Wikipedia = "Stress and vowel reduction in English#Weak and strong forms of function words", display = "unstressed form", } labels["weak vowel"] = { aliases = {"weak vowel merger"}, Wikipedia = "Weak vowel merger", display = "weak vowel merger", } generate_non("weak vowel", "weak vowel distinction") labels["wine-whine"] = { Wikipedia = "wine–whine merger", display = "''wine''–''whine'' merger", } generate_non("wine-whine") labels["yod-coalescence"] = { aliases = {"yod coalescence"}, Wikipedia = "yod-coalescence", } generate_non("yod-coalescence") labels["yod-dropping"] = { aliases = {"yod dropping"}, Wikipedia = "yod-dropping", } generate_non("yod-dropping") labels["NG-coalescence"] = { aliases = {"NG coalescence","ng-coalescence","ng coalescence"}, Wikipedia = "Ng coalescence", } generate_non("NG-coalescence") labels["æ-raising"] = { aliases = {"æ-tensing", "/æ/ raising", "/æ/ tensing", "ae-raising", "ae-tensing"}, Wikipedia = "/æ/ raising", } generate_non("æ-raising") return require("Module:labels").finalize_data(labels) ekfqk5f8cijpy7lmork6n258y0h4ch5 मॉड्यूल:etymology/specialized 828 305063 487879 480034 2026-09-03T10:11:32Z SM7 6218 updating... 487879 Scribunto text/plain local export = {} local m_str_utils = require("Module:string utilities") local en_utilities_module = "Module:en-utilities" local etymology_module = "Module:etymology" local gsub = m_str_utils.gsub local insert = table.insert local pluralize = require(en_utilities_module).pluralize local upper = m_str_utils.upper -- This function handles all the messiness of different types of specialized borrowings. It should insert any -- borrowing-type-specific categories into `categories` unless `nocat` is given, and return the text to display -- before the source + term (or "" for no text). local function get_specialized_borrowing_text_insert_cats(data) local bortype, categories, lang, terms, source, nocap, nocat, senseid = data.bortype, data.categories, data.lang, data.terms, data.source, data.nocap, data.nocat, data.senseid local function inscat(cat) if not nocat then local display, sourcedisp = require(etymology_module).get_display_and_cat_name(source, "raw") if cat:find("DISPLAY") then cat = cat:gsub("DISPLAY", display) elseif cat:find("SOURCE") then cat = cat:gsub("SOURCE", sourcedisp) else cat = cat .. " " .. sourcedisp end insert(categories, lang:getFullName() .. " " .. cat) end end -- `text` is the display text for the borrowing type, which gets converted -- into a link. -- `appendix` is a the glossary anchor, which defaults to `text` -- `prep` is the preposition between the borrowing type and the language -- name (e.g. "of", "from") -- `pos` is the part of speech for the borrowing type ("noun" or -- "adjective"; defaults to "noun") -- `plural` is the plural form of the borrowing type; if not specified, -- the pluralize function is used local text, appendix, prep, pos, plural if bortype == "calque" then text, prep = "calque", "of" inscat("terms calqued from") elseif bortype == "partial-calque" then text, prep = "partial calque", "of" inscat("terms partially calqued from") elseif bortype == "semantic-loan" then text, prep = "semantic loan", "from" inscat("semantic loans from") elseif bortype == "transliteration" then text, prep = "transliteration", "of" inscat("terms borrowed from") inscat("transliterations of DISPLAY terms") elseif bortype == "phono-semantic-matching" then text, prep = "phono-semantic matching", "of" inscat("phono-semantic matchings from") else local langcode = lang:getCode() local lang_is_source = langcode == source:getCode() if lang_is_source then -- Track, because this shouldn't be happening. A language can only have itself as a source further up the chain after a borrowing, which is always "derived". require("Module:debug/track"){ "etymology/specialized/self-as-source", "etymology/specialized/self-as-source/" .. langcode } inscat("terms borrowed back into") else inscat("terms borrowed from") if bortype ~= "borrowing" then inscat(bortype .. " borrowings from") end end if bortype == "borrowing" then text, appendix, prep, pos = "borrowed", "loanword", "from", "adjective" elseif ( bortype == "learned" or bortype == "semi-learned" or bortype == "orthographic" or bortype == "unadapted" ) then text, prep = bortype .. " borrowing", "from" elseif bortype == "adapted" then text, prep = bortype .. " borrowing", "of" else error("Internal error: Unrecognized bortype: " .. bortype) end end -- If the term is suppressed, the preposition should always be "from": -- "Calque of Chinese 中國". -- "Calque from Chinese" (not "Calque of Chinese"). if terms[1].term == "-" then prep = "from" end appendix = "Appendix:Glossary#" .. (appendix or text) if senseid then local senseids, output = mw.text.split(senseid, '!!'), {} for i, id in ipairs(senseids) do -- FIXME: This should be done via a function. insert(output, mw.getCurrentFrame():preprocess('{{senseno|' .. lang:getCode() .. '|' .. id .. (i == 1 and not nocap and "|uc=1" or "") .. '}}')) end local link if senseid:find('!!') then link, text = "are", pos == "adjective" and text or plural or pluralize(text) else link = pos == "adjective" and "is" or "is a" end text = mw.text.listToText(output) .. " " .. link .. " " .. '[[' .. appendix .. '|' .. text .. ']]' else text = "[[" .. appendix .. "|" .. (nocap and text or gsub(text, "^.", upper)) .. "]]" end return text .. " " .. prep .. " " end function export.specialized_borrowing(data) local lang, sources, terms = data.lang, data.sources, data.terms local categories = {} local text for _, source in ipairs(sources) do text = get_specialized_borrowing_text_insert_cats { bortype = data.bortype, categories = categories, lang = lang, terms = terms, source = source, nocap = data.nocap, nocat = data.nocat, senseid = data.senseid, } end text = data.notext and "" or text local sourcetext = require(etymology_module).format_sources { lang = lang, sources = sources, terms = terms, sort_key = data.sort_key, categories = categories, nocat = data.nocat, sourceconj = data.sourceconj, } return text .. require(etymology_module).format_links(terms, data.conj, "etymology/specialized", sourcetext) end return export bvgt9bjaugs1kua7m5g9pj20a0vngnq मॉड्यूल:zh/data/ts 828 306746 487887 487137 2026-09-03T10:35:27Z SM7 6218 updating... 487887 Scribunto text/plain return { ["「"]="“", ["」"]="”", ["『"]="‘", ["』"]="’", ["㑮"]="𫝈", ["㑯"]="㑔", ["㑳"]="㑇", ["㑶"]="㐹", ["㑺"]="俊", ["㒓"]="𠉂", ["㒖"]="𮯵", ["㒜"]="𠇐", ["㒥"]="仹", ["㒧"]="𠌯", ["㒯"]="𱏩", ["㒿"]="𰖩", ["㓄"]="𪠟", ["㓖"]="𰃻", ["㓨"]="刾", ["㔃"]="𫦌", ["㔅"]="𫦅", ["㔋"]="𪟎", ["㔝"]="𫦩", ["㔢"]="𫦳", ["㔤"]="𱐳", ["㔶"]="𱑉", ["㕒"]="𰆕", ["㕢"]="𰇀", ["㖦"]="𰇎", ["㖮"]="𪠵", ["㗙"]="𫩩", ["㗢"]="𰇖", ["㗣"]="𫪺", ["㗰"]="𫩛", ["㗲"]="𠵾", ["㗶"]="𭇜", ["㗻"]="𫪀", ["㗼"]="𫩤", ["㗿"]="𪡛", ["㘉"]="𠰱", ["㘓"]="𪢌", ["㘔"]="𫬐", ["㘖"]="𰉁", ["㘙"]="𫪂", ["㘚"]="㘎", ["㙔"]="𰉘", ["㙡"]="𭎂", ["㙢"]="𰊟", ["㙬"]="𫮜", ["㙺"]="𰊛", ["㙾"]="𰉽", ["㛍"]="𮰿", ["㛝"]="𫝦", ["㜄"]="㚯", ["㜏"]="㛣", ["㜐"]="𫝧", ["㜕"]="𮱇", ["㜗"]="𡞋", ["㜞"]="𰌆", ["㜢"]="𡞱", ["㜥"]="𫰨", ["㜭"]="𫰠", ["㜮"]="𫱕", ["㜰"]="𮰽", ["㜷"]="𡝠", ["㜺"]="𫲗", ["㝞"]="𫳃", ["㞞"]="𪨊", ["㟦"]="𮱩", ["㟺"]="𪩇", ["㠁"]="𫶅", ["㠆"]="𮱯", ["㠏"]="㟆", ["㠘"]="𱛇", ["㠠"]="𰎐", ["㠣"]="𫵷", ["㡓"]="𫷅", ["㡞"]="𰏜", ["㢗"]="𪪑", ["㢝"]="𢋈", ["㤲"]="𫺁", ["㥮"]="㤘", ["㥷"]="𰑸", ["㦊"]="𫺆", ["㦎"]="𢛯", ["㦖"]="𫺓", ["㦛"]="𢗓", ["㦞"]="𪫷", ["㦡"]="𮲃", ["㦦"]="𫻁", ["㦬"]="𰑫", ["㦭"]="𭝋", ["㨛"]="𰓔", ["㨟"]="𫼥", ["㨥"]="𫽀", ["㨻"]="𪮃", ["㩇"]="𫽇", ["㩋"]="𪮋", ["㩌"]="𫽧", ["㩜"]="㨫", ["㩣"]="𫾉", ["㩦"]="携", ["㩭"]="𫽊", ["㩳"]="㧐", ["㩵"]="擜", ["㩷"]="𰔲", ["㪎"]="𪯋", ["㪹"]="𬖠", ["㪻"]="𫿳", ["㬙"]="𱡼", ["㬢"]="𮲛", ["㬣"]="𬀮", ["㬮"]="𰖠", ["㮣"]="概", ["㮧"]="𱣂", ["㮲"]="𰗙", ["㮿"]="𮲰", ["㯂"]="𰘀", ["㯆"]="𰗡", ["㯗"]="𱣡", ["㯤"]="𣘐", ["㯸"]="𰗦", ["㯺"]="𰗘", ["㰂"]="𰗵", ["㰄"]="𮲶", ["㰍"]="𬺜", ["㰙"]="𣗙", ["㰚"]="樆", ["㰰"]="𬅢", ["㰳"]="𭭈", ["㲯"]="𰚪", ["㲰"]="𰚔", ["㴸"]="𰛛", ["㴿"]="𰛽", ["㵍"]="𬇰", ["㵑"]="𰜢", ["㵒"]="𬈕", ["㵗"]="𣳆", ["㵤"]="𬉇", ["㵾"]="𪷍", ["㶆"]="𫞛", ["㶍"]="𰝟", ["㶏"]="𰝋", ["㶒"]="𰛩", ["㶕"]="𰝗", ["㷃"]="𰝾", ["㷍"]="𤆢", ["㷲"]="𰞉", ["㷶"]="𰞲", ["㷻"]="𭴊", ["㷿"]="𤈷", ["㸄"]="𱫅", ["㸅"]="𰞍", ["㸇"]="𤎺", ["㸊"]="𬋍", ["㸐"]="𬊾", ["㹂"]="𬌛", ["㹓"]="𰠴", ["㹙"]="𪺴", ["㹚"]="𱭰", ["㹽"]="𫞣", ["㺏"]="𤠋", ["㺑"]="𬌷", ["㺜"]="𪺻", ["㻶"]="𪼋", ["㼀"]="𮴘", ["㼁"]="𮴂", ["㼆"]="𬎆", ["㼈"]="𭹜", ["㼻"]="𬎧", ["㾵"]="𬏟", ["㾺"]="𬏜", ["㿉"]="𰣶", ["㿎"]="𬏷", ["㿖"]="𪽮", ["㿗"]="𤻊", ["㿧"]="𤽯", ["㿹"]="𰤨", ["䀉"]="𥁢", ["䀍"]="𰥊", ["䀴"]="𬑏", ["䀹"]="𥅴", ["䁑"]="𱲥", ["䁝"]="𰥞", ["䁪"]="𥇢", ["䁱"]="𬑒", ["䁺"]="𱲮", ["䁻"]="䀥", ["䂎"]="𥎝", ["䂓"]="𰦔", ["䂻"]="𱳱", ["䂾"]="𱴄", ["䃁"]="𰦴", ["䃕"]="𰦷", ["䃖"]="𱳳", ["䃘"]="𬒎", ["䃢"]="𰧎", ["䃣"]="𰦨", ["䃤"]="𬒕", ["䃮"]="鿎", ["䃴"]="𰧘", ["䅐"]="𫀨", ["䅘"]="𥟂", ["䅳"]="𫀬", ["䆅"]="𰨳", ["䆉"]="𫁂", ["䇓"]="𰩧", ["䈟"]="𱷸", ["䉅"]="𱷷", ["䉆"]="𮵮", ["䉍"]="𬕊", ["䉐"]="𬕛", ["䉑"]="𫁲", ["䉔"]="𱸐", ["䉙"]="𥬀", ["䉩"]="𱸂", ["䉬"]="𫂈", ["䉱"]="𬕦", ["䉲"]="𥮜", ["䉶"]="𫁷", ["䊛"]="𰪻", ["䊜"]="𰪫", ["䊟"]="𰫋", ["䊪"]="𥸯", ["䊭"]="𥺅", ["䊯"]="𰪩", ["䊲"]="𬡻", ["䊵"]="𮉠", ["䊷"]="䌶", ["䊹"]="纤", ["䊺"]="𫄚", ["䋃"]="𫄜", ["䋄"]="纲", ["䋆"]="𰬁", ["䋋"]="𱺘", ["䋍"]="𰬂", ["䋎"]="𬘜", ["䋏"]="𮉣", ["䋐"]="𬘙", ["䋑"]="𰬃", ["䋓"]="绉", ["䋔"]="𫄞", ["䋘"]="𱺛", ["䋙"]="䌺", ["䋚"]="䌻", ["䋝"]="𰬕", ["䋞"]="𮉦", ["䋦"]="𫄩", ["䋫"]="𰬑", ["䋱"]="𱺜", ["䋲"]="绳", ["䋹"]="䌿", ["䋺"]="𬘴", ["䋻"]="䌾", ["䋼"]="𫄮", ["䋽"]="𰬭", ["䋾"]="𬘲", ["䋿"]="𦈓", ["䌁"]="𬘱", ["䌇"]="𰬱", ["䌈"]="𦈖", ["䌋"]="𦈘", ["䌌"]="𰬶", ["䌏"]="𱺫", ["䌐"]="𬘮", ["䌖"]="𦈜", ["䌝"]="𦈟", ["䌞"]="𬘪", ["䌟"]="𦈞", ["䌥"]="𦈠", ["䌨"]="𱺯", ["䌪"]="𬙁", ["䌬"]="𱺕", ["䌰"]="𦈙", ["䍤"]="𫅅", ["䍦"]="䍠", ["䍷"]="𬙭", ["䍽"]="𦍠", ["䎘"]="𬚄", ["䎙"]="𫅭", ["䎱"]="䎬", ["䏊"]="𰭹", ["䐢"]="𰮙", ["䐣"]="𬁽", ["䐷"]="𬂅", ["䐹"]="𰮲", ["䐽"]="𰯎", ["䑗"]="𬛹", ["䑺"]="𱼸", ["䑼"]="𰰌", ["䓣"]="𬜯", ["䔇"]="𰰴", ["䔈"]="𰱀", ["䔡"]="𬝁", ["䕏"]="𮶝", ["䕠"]="𱽱", ["䕡"]="𰱩", ["䕤"]="𫟕", ["䕳"]="𦰴", ["䕵"]="𱾎", ["䕼"]="𬝴", ["䖀"]="𰲖", ["䖅"]="𫟑", ["䖚"]="𰲟", ["䗃"]="𰲳", ["䗅"]="𫊪", ["䗥"]="𰲯", ["䗯"]="𱿩", ["䗻"]="𮔂", ["䗽"]="𰳚", ["䗿"]="𧉞", ["䘇"]="蚉", ["䘉"]="蚕", ["䙔"]="𫋲", ["䙝"]="亵", ["䙡"]="䙌", ["䙰"]="褵", ["䙱"]="𧜭", ["䙼"]="𰴖", ["䚀"]="舰", ["䚆"]="𬢑", ["䚉"]="𬢐", ["䚕"]="𰴗", ["䚞"]="𰴤", ["䚩"]="𫌯", ["䚳"]="𬣛", ["䚵"]="𬣟", ["䚽"]="𬣜", ["䛀"]="𰵐", ["䛄"]="𫍠", ["䛅"]="𲂆", ["䛊"]="识", ["䛌"]="𰵜", ["䛍"]="𬣧", ["䛔"]="𲂈", ["䛘"]="𬣯", ["䛛"]="𬣬", ["䛞"]="𬣸", ["䛟"]="𰵢", ["䛠"]="𰵫", ["䛤"]="𬣹", ["䛩"]="𲂉", ["䛬"]="𬤁", ["䛭"]="𰵰", ["䛳"]="𫍫", ["䛴"]="𮷈", ["䛽"]="𬤌", ["䛿"]="𬤑", ["䜀"]="䜧", ["䜄"]="𰶈", ["䜉"]="𬤘", ["䜊"]="𲂓", ["䜋"]="𬤉", ["䜍"]="𬤟", ["䜎"]="𬣿", ["䜏"]="𰶇", ["䜒"]="𬤡", ["䜖"]="𫟢", ["䜚"]="𬤪", ["䜝"]="𬤬", ["䝏"]="𰶬", ["䝕"]="𬥄", ["䝡"]="𬥊", ["䝨"]="贤", ["䝭"]="𫎧", ["䝯"]="𬥵", ["䝲"]="赆", ["䝻"]="𧹕", ["䝼"]="䞍", ["䞀"]="𬥽", ["䞁"]="𬥺", ["䞂"]="𬥻", ["䞈"]="𧹑", ["䞉"]="𰷩", ["䞋"]="𫎪", ["䞓"]="𫎭", ["䟃"]="𫎺", ["䟄"]="𲃏", ["䟆"]="𫎳", ["䟇"]="𧺋", ["䟏"]="𰷴", ["䟐"]="𫎱", ["䟺"]="𬦥", ["䠆"]="𫏃", ["䠟"]="𰸈", ["䠠"]="𰸛", ["䠩"]="𰸊", ["䠮"]="𬧃", ["䠱"]="𨅛", ["䡁"]="𬧢", ["䡄"]="𮷖", ["䡅"]="𰹳", ["䡇"]="𰹷", ["䡊"]="𰹺", ["䡐"]="𫟤", ["䡓"]="𲀝", ["䡗"]="𬨆", ["䡘"]="𬨉", ["䡝"]="𰺑", ["䡟"]="𬨌", ["䡦"]="𬨑", ["䡩"]="𫟥", ["䡰"]="𰺘", ["䡴"]="𰺝", ["䡵"]="𫟦", ["䡶"]="𬨔", ["䡷"]="𰺡", ["䡹"]="𬨕", ["䡻"]="𰺤", ["䡾"]="𰺠", ["䢈"]="𰺭", ["䢙"]="𲅑", ["䢨"]="𨑹", ["䤌"]="𮠞", ["䤍"]="𰼑", ["䤝"]="𲇳", ["䤠"]="𰽠", ["䤤"]="𫟺", ["䤥"]="𰽺", ["䤨"]="𰽸", ["䤩"]="𬭈", ["䤪"]="𬭆", ["䤬"]="𰾈", ["䤭"]="𮸌", ["䤵"]="𰾐", ["䤸"]="𰾦", ["䤻"]="𰾖", ["䤼"]="𬭣", ["䥄"]="𫠀", ["䥇"]="䦂", ["䥊"]="𲈄", ["䥑"]="鿏", ["䥓"]="𮸞", ["䥔"]="𲈙", ["䥕"]="𬭯", ["䥖"]="𰾻", ["䥗"]="𫔋", ["䥛"]="𬭴", ["䥝"]="𰿁", ["䥞"]="𬭻", ["䥥"]="镰", ["䥩"]="𨱖", ["䥯"]="𫔆", ["䥱"]="䥾", ["䥴"]="𰿅", ["䥶"]="𰽝", ["䥷"]="𰿇", ["䥸"]="𨧮", ["䦌"]="𮤬", ["䦎"]="𰿨", ["䦖"]="𮸥", ["䦘"]="𨸄", ["䦛"]="䦶", ["䦜"]="𲈽", ["䦝"]="𬮨", ["䦟"]="䦷", ["䦣"]="𮸦", ["䦧"]="阋", ["䦪"]="𰿴", ["䦯"]="𫔵", ["䦱"]="𰿫", ["䦳"]="𨷿", ["䧞"]="𬮺", ["䧢"]="𨸟", ["䨴"]="𱁒", ["䩤"]="𮸮", ["䩫"]="𬰥", ["䪊"]="𫖅", ["䪍"]="𱁽", ["䪏"]="𩏼", ["䪐"]="𱂅", ["䪓"]="𬰳", ["䪗"]="𩐀", ["䪘"]="𩏿", ["䪜"]="𬰷", ["䪝"]="𱂌", ["䪥"]="𱂎", ["䪴"]="𫖫", ["䪼"]="𱂢", ["䪾"]="𫖬", ["䫀"]="𫖱", ["䫂"]="𫖰", ["䫈"]="𬱣", ["䫉"]="𬥈", ["䫌"]="𱂮", ["䫏"]="𬱦", ["䫐"]="𬃲", ["䫖"]="𲊾", ["䫜"]="𬱮", ["䫟"]="𫖲", ["䫠"]="𬱰", ["䫥"]="𱆚", ["䫩"]="𬱬", ["䫫"]="𲋀", ["䫲"]="𲋃", ["䫴"]="𩖗", ["䫶"]="𫖺", ["䫺"]="𲋎", ["䫻"]="𫗇", ["䫼"]="𬱷", ["䫽"]="𲋏", ["䫾"]="𫠈", ["䬀"]="𱃖", ["䬂"]="𬱸", ["䬅"]="𱃚", ["䬍"]="𬲀", ["䬎"]="𬱿", ["䬐"]="𱃜", ["䬓"]="𫗊", ["䬔"]="𱃞", ["䬘"]="𩙮", ["䬝"]="𩙯", ["䬞"]="𩙧", ["䬟"]="𱃙", ["䬣"]="𱃱", ["䬧"]="𫗟", ["䬪"]="𱃳", ["䬫"]="𬲮", ["䬬"]="𱃵", ["䬯"]="𬲫", ["䬰"]="𲋤", ["䬲"]="𬲯", ["䬳"]="𱃷", ["䬶"]="𬲷", ["䬹"]="𱃸", ["䬾"]="𬲻", ["䭀"]="𩠇", ["䭃"]="𩠈", ["䭅"]="𬲾", ["䭇"]="𬳀", ["䭈"]="𱄃", ["䭉"]="𬳅", ["䭑"]="𫗱", ["䭒"]="𬳋", ["䭓"]="𱃹", ["䭔"]="𫗰", ["䭕"]="𬲕", ["䭘"]="𬳑", ["䭞"]="𬲳", ["䭡"]="𱄉", ["䭢"]="𬲲", ["䭣"]="𬲶", ["䭭"]="𬱯", ["䭿"]="𩧭", ["䮂"]="𱅄", ["䮄"]="𫠊", ["䮈"]="𬳾", ["䮗"]="𬴁", ["䮝"]="𩧰", ["䮞"]="𩨁", ["䮠"]="𩧿", ["䮧"]="𱅠", ["䮫"]="𩨇", ["䮰"]="𫘮", ["䮲"]="𱅦", ["䮳"]="𩨏", ["䮴"]="𲌋", ["䮸"]="𬳸", ["䮽"]="𬴍", ["䮾"]="𩧪", ["䮿"]="𬴏", ["䯀"]="䯅", ["䯤"]="𩩈", ["䰎"]="𱆃", ["䰐"]="𱆅", ["䰖"]="𱆈", ["䰫"]="𱆙", ["䰲"]="𱇍", ["䰶"]="𲍈", ["䰷"]="𬶆", ["䰻"]="𱇕", ["䰽"]="𱇑", ["䰾"]="鲃", ["䱀"]="𫚐", ["䱁"]="𫚏", ["䱂"]="𱇤", ["䱅"]="𱇚", ["䱇"]="𱇞", ["䱊"]="𲍐", ["䱋"]="𲍎", ["䱌"]="𱇬", ["䱍"]="𬶊", ["䱎"]="𱇥", ["䱐"]="𱇲", ["䱒"]="𱇰", ["䱓"]="𬶓", ["䱗"]="𮬞", ["䱙"]="𩾈", ["䱚"]="𮬠", ["䱛"]="𮬟", ["䱜"]="𱇷", ["䱝"]="𲍕", ["䱟"]="𱈀", ["䱡"]="𱇽", ["䱤"]="𱇻", ["䱥"]="𱇹", ["䱧"]="𫚠", ["䱬"]="𩾊", ["䱭"]="𱈇", ["䱰"]="𩾋", ["䱱"]="𬶤", ["䱴"]="𱈈", ["䱵"]="𮬢", ["䱷"]="䲣", ["䱸"]="𫠑", ["䱹"]="𬶣", ["䱻"]="𮬡", ["䱽"]="䲝", ["䱾"]="𱈆", ["䲁"]="鳚", ["䲅"]="𫚜", ["䲉"]="𱈒", ["䲎"]="𲍙", ["䲏"]="𬶗", ["䲑"]="𲍇", ["䲕"]="𬶴", ["䲖"]="𩾂", ["䲗"]="𮬣", ["䲘"]="鳤", ["䲙"]="𬶎", ["䲚"]="𱈖", ["䲛"]="𱈛", ["䲨"]="𬷾", ["䲰"]="𪉂", ["䲸"]="𮭡", ["䲹"]="𱉖", ["䲼"]="𬸆", ["䳂"]="𲍲", ["䳄"]="𲍵", ["䳅"]="𱉙", ["䳇"]="𱉞", ["䳍"]="𮭥", ["䳏"]="𱉤", ["䳑"]="𲍳", ["䳒"]="𱉧", ["䳓"]="𱉦", ["䳕"]="𱉺", ["䳚"]="𱉶", ["䳜"]="𫛬", ["䳟"]="𱊂", ["䳡"]="𲍾", ["䳢"]="𫛰", ["䳤"]="𫛮", ["䳥"]="𮹗", ["䳧"]="𫛺", ["䳨"]="𬸛", ["䳫"]="𫛼", ["䳭"]="𱉼", ["䳮"]="𱊓", ["䳲"]="𱊙", ["䳺"]="𱊣", ["䳽"]="𮹙", ["䴇"]="𱊪", ["䴈"]="𬸩", ["䴉"]="鹮", ["䴋"]="𫜅", ["䴌"]="𲎈", ["䴏"]="𮹜", ["䴚"]="𮭰", ["䴝"]="𱊼", ["䴬"]="𪎈", ["䴭"]="𬹅", ["䴮"]="𱋆", ["䴱"]="𫜒", ["䴲"]="𱋊", ["䴳"]="𱋎", ["䴴"]="𪎋", ["䴵"]="𱋔", ["䴷"]="𬹉", ["䴸"]="𱋗", ["䴹"]="𱋙", ["䴺"]="𱋝", ["䴽"]="𫜔", ["䴾"]="𱋧", ["䵂"]="𱋪", ["䵃"]="𱋫", ["䵆"]="𱋮", ["䵐"]="𱋴", ["䵖"]="𬹔", ["䵘"]="𬓸", ["䵳"]="𪑅", ["䵴"]="𫜙", ["䵶"]="𱌁", ["䵷"]="𱌃", ["䶕"]="𫜨", ["䶗"]="𮯙", ["䶢"]="𬺍", ["䶣"]="𬺃", ["䶦"]="𬺉", ["䶧"]="𱌰", ["䶨"]="𱌵", ["䶪"]="𬺕", ["䶱"]="𱍇", ["䶲"]="𫜳", ["丟"]="丢", ["並"]="并", ["乾"]="干", ["亂"]="乱", ["亙"]="亘", ["亞"]="亚", ["佇"]="伫", ["佈"]="布", ["佔"]="占", ["併"]="并", ["來"]="来", ["侖"]="仑", ["侶"]="侣", ["俁"]="俣", ["係"]="系", ["俓"]="𠇹", ["俔"]="伣", ["俛"]="俯", ["俠"]="侠", ["俥"]="伡", ["俴"]="𠈙", ["俹"]="𱎫", ["倀"]="伥", ["倃"]="咱", ["倆"]="俩", ["倈"]="俫", ["倉"]="仓", ["個"]="个", ["們"]="们", ["倖"]="幸", ["倣"]="仿", ["倫"]="伦", ["倲"]="㑈", ["偉"]="伟", ["偑"]="㐽", ["偒"]="𱎟", ["偩"]="𰁾", ["側"]="侧", ["偵"]="侦", ["偺"]="咱", ["偽"]="伪", ["傌"]="㐷", ["傑"]="杰", ["傖"]="伧", ["傘"]="伞", ["備"]="备", ["傢"]="家", ["傪"]="𫢺", ["傭"]="佣", ["傯"]="偬", ["傱"]="𰁧", ["傳"]="传", ["傴"]="伛", ["債"]="债", ["傷"]="伤", ["傾"]="倾", ["僀"]="𰂗", ["僂"]="偻", ["僅"]="仅", ["僆"]="𫢪", ["僉"]="佥", ["僊"]="仙", ["働"]="动", ["僑"]="侨", ["僓"]="𰂜", ["僕"]="仆", ["僗"]="𫢬", ["僞"]="伪", ["僟"]="仉", ["僤"]="𫢸", ["僥"]="侥", ["僨"]="偾", ["僩"]="𰂎", ["僫"]="𱏀", ["僱"]="雇", ["僴"]="𰂋", ["僶"]="𠊟", ["價"]="价", ["僾"]="𫣊", ["儀"]="仪", ["儁"]="俊", ["儂"]="侬", ["億"]="亿", ["儅"]="𰁸", ["儈"]="侩", ["儉"]="俭", ["儌"]="侥", ["儎"]="傤", ["儐"]="傧", ["儔"]="俦", ["儕"]="侪", ["儖"]="𫣉", ["儗"]="拟", ["儘"]="尽", ["儜"]="佇", ["償"]="偿", ["儢"]="𰂦", ["儣"]="𠆲", ["儥"]="𰂏", ["儩"]="𰂭", ["優"]="优", ["儭"]="𠋆", ["儮"]="𮯸", ["儰"]="𫢭", ["儱"]="𫢒", ["儲"]="储", ["儵"]="倏", ["儷"]="俪", ["儸"]="㑩", ["儹"]="𰃆", ["儺"]="傩", ["儻"]="傥", ["儼"]="俨", ["兇"]="凶", ["兌"]="兑", ["兒"]="儿", ["兗"]="兖", ["兠"]="兜", ["內"]="内", ["兩"]="两", ["冊"]="册", ["冪"]="幂", ["凈"]="净", ["凍"]="冻", ["凔"]="𰃷", ["凙"]="𪞝", ["凜"]="凛", ["凟"]="𰃿", ["凱"]="凯", ["凴"]="凭", ["別"]="别", ["刪"]="删", ["刼"]="劫", ["剄"]="刭", ["則"]="则", ["剋"]="克", ["剎"]="刹", ["剏"]="创", ["剗"]="刬", ["剙"]="创", ["剛"]="刚", ["剝"]="剥", ["剮"]="剐", ["剳"]="札", ["剴"]="剀", ["創"]="创", ["剷"]="铲", ["剸"]="𰄞", ["剹"]="戮", ["剼"]="𱐠", ["剾"]="𠛅", ["劃"]="划", ["劇"]="剧", ["劉"]="刘", ["劊"]="刽", ["劌"]="刿", ["劍"]="剑", ["劏"]="㓥", ["劑"]="剂", ["劗"]="𭄛", ["劚"]="㔉", ["勁"]="劲", ["勌"]="倦", ["勑"]="敕", ["動"]="动", ["勗"]="勖", ["務"]="务", ["勛"]="勋", ["勝"]="胜", ["勞"]="劳", ["勢"]="势", ["勣"]="𪟝", ["勦"]="剿", ["勩"]="勚", ["勱"]="劢", ["勳"]="勋", ["勴"]="𰅔", ["勵"]="励", ["勸"]="劝", ["勻"]="匀", ["匭"]="匦", ["匯"]="汇", ["匰"]="𰅦", ["匱"]="匮", ["匳"]="奁", ["匵"]="𰅥", ["區"]="区", ["協"]="协", ["卨"]="𫧯", ["卻"]="却", ["厙"]="厍", ["厠"]="厕", ["厭"]="厌", ["厱"]="𰆚", ["厲"]="厉", ["厴"]="厣", ["參"]="参", ["叡"]="睿", ["叢"]="丛", ["吳"]="吴", ["吶"]="呐", ["呂"]="吕", ["咲"]="笑", ["咼"]="呙", ["員"]="员", ["哯"]="𠯟", ["哶"]="咩", ["唄"]="呗", ["唊"]="𰇕", ["唓"]="𪠳", ["唚"]="吣", ["唸"]="念", ["唻"]="𫪁", ["問"]="问", ["啓"]="启", ["啞"]="哑", ["啟"]="启", ["啢"]="唡", ["啣"]="衔", ["啺"]="𱒂", ["喎"]="㖞", ["喒"]="咱", ["喚"]="唤", ["喡"]="𮰔", ["喪"]="丧", ["喫"]="吃", ["喬"]="乔", ["單"]="单", ["喲"]="哟", ["嗁"]="啼", ["嗆"]="呛", ["嗇"]="啬", ["嗊"]="唝", ["嗎"]="吗", ["嗚"]="呜", ["嗧"]="𰇠", ["嗩"]="唢", ["嗶"]="哔", ["嗹"]="𪡏", ["嗿"]="𰇲", ["嘄"]="𫪧", ["嘆"]="叹", ["嘇"]="𰇼", ["嘍"]="喽", ["嘑"]="呼", ["嘓"]="啯", ["嘔"]="呕", ["嘖"]="啧", ["嘗"]="尝", ["嘜"]="唛", ["嘩"]="哗", ["嘪"]="𪡃", ["嘮"]="唠", ["嘯"]="啸", ["嘰"]="叽", ["嘳"]="𪡞", ["嘵"]="哓", ["嘸"]="呒", ["嘺"]="𪡀", ["嘽"]="啴", ["噁"]="𫫇", ["噅"]="𠯠", ["噓"]="嘘", ["噚"]="㖊", ["噝"]="咝", ["噞"]="𪡋", ["噠"]="哒", ["噥"]="哝", ["噦"]="哕", ["噧"]="𱒀", ["噯"]="嗳", ["噲"]="哙", ["噴"]="喷", ["噸"]="吨", ["噹"]="当", ["嚀"]="咛", ["嚂"]="𰈓", ["嚇"]="吓", ["嚈"]="𫩫", ["嚋"]="𱒦", ["嚌"]="哜", ["嚍"]="𫩺", ["嚐"]="尝", ["嚕"]="噜", ["嚙"]="啮", ["嚛"]="𪠸", ["嚝"]="𫩕", ["嚥"]="咽", ["嚦"]="呖", ["嚧"]="𠰷", ["嚨"]="咙", ["嚩"]="𰈶", ["嚪"]="𫫦", ["嚫"]="𰈍", ["嚬"]="𫫾", ["嚮"]="向", ["嚲"]="亸", ["嚳"]="喾", ["嚴"]="严", ["嚶"]="嘤", ["嚽"]="𪢕", ["囀"]="啭", ["囁"]="嗫", ["囂"]="嚣", ["囅"]="冁", ["囈"]="呓", ["囉"]="啰", ["囋"]="𰉄", ["囌"]="苏", ["囐"]="𰈯", ["囑"]="嘱", ["囒"]="𪢠", ["囓"]="啮", ["囕"]="𰈆", ["囖"]="𱕌", ["囪"]="囱", ["囧"]="冏", ["圇"]="囵", ["國"]="国", ["圍"]="围", ["園"]="园", ["圓"]="圆", ["圖"]="图", ["團"]="团", ["圞"]="𪢮", ["垷"]="𰉚", ["垻"]="坝", ["埉"]="𰉥", ["埡"]="垭", ["埨"]="𫭢", ["埬"]="𪣆", ["執"]="执", ["堅"]="坚", ["堈"]="𰉙", ["堊"]="垩", ["堖"]="垴", ["堚"]="𪣒", ["堝"]="埚", ["堦"]="阶", ["堯"]="尧", ["報"]="报", ["場"]="场", ["塊"]="块", ["塋"]="茔", ["塏"]="垲", ["塒"]="埘", ["塗"]="涂", ["塚"]="冢", ["塟"]="葬", ["塢"]="坞", ["塤"]="埙", ["塵"]="尘", ["塸"]="𫭟", ["塹"]="堑", ["塼"]="砖", ["塿"]="𪣻", ["墆"]="𰊂", ["墊"]="垫", ["墋"]="𫮅", ["墏"]="𰊈", ["墜"]="坠", ["墝"]="𫭪", ["墠"]="𫮃", ["墢"]="𫭨", ["墧"]="𰉩", ["墮"]="堕", ["墲"]="𪢸", ["墳"]="坟", ["墵"]="坛", ["墶"]="垯", ["墷"]="𰉪", ["墻"]="墙", ["墾"]="垦", ["墿"]="𰉣", ["壇"]="坛", ["壈"]="𡒄", ["壋"]="垱", ["壍"]="𰊢", ["壏"]="𰊑", ["壐"]="𱖚", ["壓"]="压", ["壔"]="𭎜", ["壘"]="垒", ["壙"]="圹", ["壚"]="垆", ["壛"]="𰊡", ["壜"]="坛", ["壝"]="𭏸", ["壞"]="坏", ["壟"]="垄", ["壠"]="垅", ["壢"]="坜", ["壧"]="𫭲", ["壩"]="坝", ["壪"]="塆", ["壯"]="壮", ["壺"]="壶", ["壼"]="壸", ["壽"]="寿", ["夠"]="够", ["夢"]="梦", ["夥"]="伙", ["夾"]="夹", ["奐"]="奂", ["奧"]="奥", ["奩"]="奁", ["奪"]="夺", ["奬"]="奖", ["奮"]="奋", ["奯"]="𫯥", ["奲"]="𫰂", ["奼"]="姹", ["妝"]="妆", ["妬"]="妒", ["妳"]="你", ["妷"]="侄", ["姉"]="姊", ["姍"]="姗", ["姙"]="妊", ["姦"]="奸", ["姪"]="侄", ["娙"]="𫰛", ["娛"]="娱", ["婁"]="娄", ["婜"]="𫰐", ["婡"]="𫝫", ["婣"]="姻", ["婦"]="妇", ["婨"]="𱙇", ["婬"]="淫", ["婭"]="娅", ["婸"]="𰋸", ["媁"]="𫰍", ["媈"]="𫝨", ["媜"]="𰌂", ["媧"]="娲", ["媮"]="偷", ["媯"]="妫", ["媰"]="㛀", ["媼"]="媪", ["媽"]="妈", ["媿"]="愧", ["嫈"]="𰌀", ["嫋"]="袅", ["嫗"]="妪", ["嫢"]="𫰹", ["嫥"]="𰋹", ["嫧"]="𰌇", ["嫰"]="嫩", ["嫵"]="妩", ["嫺"]="娴", ["嫻"]="娴", ["嫿"]="婳", ["嬀"]="妫", ["嬂"]="𡛰", ["嬃"]="媭", ["嬅"]="𫰡", ["嬇"]="𫝬", ["嬈"]="娆", ["嬋"]="婵", ["嬌"]="娇", ["嬐"]="𫰰", ["嬒"]="𫰢", ["嬙"]="嫱", ["嬝"]="袅", ["嬟"]="𮰸", ["嬡"]="嫒", ["嬣"]="𪥰", ["嬤"]="嬷", ["嬦"]="𫝩", ["嬧"]="𮱁", ["嬩"]="𱙄", ["嬪"]="嫔", ["嬭"]="奶", ["嬮"]="𰋽", ["嬰"]="婴", ["嬸"]="婶", ["嬻"]="𪥿", ["嬾"]="懒", ["孃"]="娘", ["孄"]="𫝮", ["孆"]="𫝭", ["孇"]="𪥫", ["孋"]="㛤", ["孌"]="娈", ["孍"]="𱙔", ["孎"]="𡠟", ["孫"]="孙", ["孭"]="𱙷", ["孲"]="𰌦", ["學"]="学", ["孻"]="𡥧", ["孾"]="𪧀", ["孿"]="孪", ["宂"]="冗", ["宮"]="宫", ["寀"]="采", ["寏"]="𡨡", ["寑"]="寝", ["寠"]="𪧘", ["寢"]="寝", ["實"]="实", ["寧"]="宁", ["審"]="审", ["寪"]="𰌷", ["寫"]="写", ["寬"]="宽", ["寳"]="宝", ["寴"]="𡩁", ["寵"]="宠", ["寶"]="宝", ["寷"]="𫲸", ["將"]="将", ["專"]="专", ["尋"]="寻", ["對"]="对", ["導"]="导", ["尠"]="鲜", ["尷"]="尴", ["屆"]="届", ["屍"]="尸", ["屓"]="屃", ["屜"]="屉", ["屢"]="屡", ["層"]="层", ["屨"]="屦", ["屩"]="𪨗", ["屬"]="属", ["屭"]="屃", ["岅"]="坂", ["岡"]="冈", ["峴"]="岘", ["島"]="岛", ["峽"]="峡", ["崍"]="崃", ["崐"]="昆", ["崑"]="昆", ["崗"]="岗", ["崘"]="仑", ["崙"]="仑", ["崠"]="𰎏", ["崢"]="峥", ["崬"]="岽", ["崱"]="𰎖", ["崵"]="𫵵", ["嵐"]="岚", ["嵒"]="岩", ["嵷"]="𰎌", ["嵸"]="𡵝", ["嵼"]="𡶴", ["嵽"]="𫶇", ["嵾"]="㟥", ["嶁"]="嵝", ["嶄"]="崭", ["嶇"]="岖", ["嶈"]="𡺃", ["嶔"]="嵚", ["嶗"]="崂", ["嶘"]="𡺄", ["嶠"]="峤", ["嶢"]="峣", ["嶤"]="𰎔", ["嶧"]="峄", ["嶨"]="峃", ["嶩"]="𰎞", ["嶪"]="𰎑", ["嶮"]="崄", ["嶴"]="岙", ["嶸"]="嵘", ["嶹"]="𫝵", ["嶺"]="岭", ["嶼"]="屿", ["嶽"]="岳", ["巃"]="𰎎", ["巄"]="𱛓", ["巆"]="𫶕", ["巊"]="𪩎", ["巋"]="岿", ["巑"]="𰏁", ["巒"]="峦", ["巔"]="巅", ["巖"]="岩", ["巗"]="岩", ["巘"]="𪩘", ["巠"]="𢀖", ["巰"]="巯", ["帥"]="帅", ["師"]="师", ["帳"]="帐", ["帴"]="𰏕", ["帶"]="带", ["幀"]="帧", ["幃"]="帏", ["幓"]="㡎", ["幗"]="帼", ["幘"]="帻", ["幝"]="𪩷", ["幟"]="帜", ["幠"]="𭘓", ["幣"]="币", ["幩"]="𪩸", ["幫"]="帮", ["幬"]="帱", ["幱"]="𰏟", ["幷"]="并", ["幹"]="干", ["幾"]="几", ["庫"]="库", ["庲"]="𫷬", ["庽"]="寓", ["廁"]="厕", ["廂"]="厢", ["廄"]="厩", ["廈"]="厦", ["廎"]="庼", ["廐"]="厩", ["廔"]="𫷹", ["廕"]="荫", ["廗"]="𰏼", ["廚"]="厨", ["廝"]="厮", ["廞"]="𫷷", ["廟"]="庙", ["廠"]="厂", ["廡"]="庑", ["廢"]="废", ["廣"]="广", ["廥"]="𰏶", ["廧"]="𪪞", ["廩"]="廪", ["廬"]="庐", ["廮"]="𫷾", ["廳"]="厅", ["弒"]="弑", ["弔"]="吊", ["弳"]="弪", ["張"]="张", ["強"]="强", ["彃"]="𪪼", ["彄"]="𫸩", ["彆"]="别", ["彈"]="弹", ["彊"]="强", ["彌"]="弥", ["彍"]="𭚦", ["彎"]="弯", ["彙"]="汇", ["彞"]="彝", ["彠"]="彟", ["彥"]="彦", ["彫"]="雕", ["彲"]="彨", ["彿"]="佛", ["後"]="后", ["徑"]="径", ["從"]="从", ["徠"]="徕", ["復"]="复", ["徵"]="征", ["徹"]="彻", ["徿"]="𪫌", ["恆"]="恒", ["恥"]="耻", ["悅"]="悦", ["悏"]="𫺂", ["悓"]="𮲁", ["悞"]="悮", ["悵"]="怅", ["悶"]="闷", ["悽"]="凄", ["惀"]="𰑄", ["惡"]="恶", ["惱"]="恼", ["惲"]="恽", ["惻"]="恻", ["愇"]="𫹴", ["愌"]="𢚾", ["愓"]="𰐿", ["愛"]="爱", ["愜"]="惬", ["愨"]="悫", ["愩"]="𫺌", ["愴"]="怆", ["愷"]="恺", ["愻"]="𢙏", ["愽"]="博", ["愾"]="忾", ["慄"]="栗", ["慇"]="殷", ["態"]="态", ["慍"]="愠", ["慐"]="𰑟", ["慖"]="𮲇", ["慘"]="惨", ["慙"]="惭", ["慚"]="惭", ["慟"]="恸", ["慣"]="惯", ["慤"]="悫", ["慪"]="怄", ["慫"]="怂", ["慮"]="虑", ["慯"]="𫹽", ["慱"]="𰑁", ["慲"]="𰒆", ["慳"]="悭", ["慴"]="慑", ["慶"]="庆", ["慸"]="𰑵", ["慹"]="𰑔", ["慺"]="㥪", ["慼"]="戚", ["慾"]="欲", ["憂"]="忧", ["憅"]="𮲄", ["憊"]="惫", ["憌"]="𱞲", ["憍"]="㤭", ["憐"]="怜", ["憑"]="凭", ["憒"]="愦", ["憖"]="慭", ["憚"]="惮", ["憢"]="𢙒", ["憤"]="愤", ["憦"]="𫺘", ["憪"]="𰑥", ["憫"]="悯", ["憮"]="怃", ["憲"]="宪", ["憳"]="𱞕", ["憴"]="𰑪", ["憶"]="忆", ["憸"]="𪫺", ["憹"]="𢙐", ["懀"]="𢙓", ["懃"]="勤", ["懇"]="恳", ["應"]="应", ["懌"]="怿", ["懍"]="懔", ["懓"]="𭞄", ["懕"]="𰑕", ["懘"]="𰒒", ["懙"]="𫹮", ["懞"]="蒙", ["懟"]="怼", ["懠"]="𫺊", ["懣"]="懑", ["懤"]="㤽", ["懧"]="㤖", ["懨"]="恹", ["懫"]="𰑬", ["懭"]="𰐾", ["懰"]="𰑙", ["懲"]="惩", ["懶"]="懒", ["懷"]="怀", ["懸"]="悬", ["懺"]="忏", ["懼"]="惧", ["懽"]="欢", ["懾"]="慑", ["戀"]="恋", ["戁"]="𫺷", ["戃"]="𰑿", ["戇"]="戆", ["戔"]="戋", ["戧"]="戗", ["戩"]="戬", ["戰"]="战", ["戲"]="戏", ["戶"]="户", ["拋"]="抛", ["拏"]="拿", ["拕"]="拖", ["挩"]="捝", ["挾"]="挟", ["捨"]="舍", ["捫"]="扪", ["捲"]="卷", ["掁"]="𰓄", ["掃"]="扫", ["掄"]="抡", ["掆"]="㧏", ["掗"]="挜", ["掙"]="挣", ["掚"]="𪭵", ["掛"]="挂", ["採"]="采", ["掽"]="碰", ["揀"]="拣", ["揁"]="𱟸", ["揚"]="扬", ["換"]="换", ["揫"]="揪", ["揮"]="挥", ["揹"]="背", ["搆"]="构", ["搇"]="揿", ["搊"]="𫼝", ["損"]="损", ["搎"]="𰓧", ["搖"]="摇", ["搗"]="捣", ["搥"]="捶", ["搨"]="拓", ["搵"]="揾", ["搶"]="抢", ["搾"]="榨", ["摀"]="𰓆", ["摃"]="𫼱", ["摋"]="𢫬", ["摌"]="𫼪", ["摐"]="𪭢", ["摑"]="掴", ["摕"]="𰔇", ["摙"]="𫽁", ["摜"]="掼", ["摟"]="搂", ["摥"]="𫼟", ["摪"]="𫽣", ["摫"]="𰓻", ["摯"]="挚", ["摲"]="𰓼", ["摳"]="抠", ["摶"]="抟", ["摺"]="折", ["摻"]="掺", ["摼"]="𰓱", ["撈"]="捞", ["撊"]="𪭾", ["撋"]="𰓷", ["撌"]="𰔋", ["撏"]="挦", ["撐"]="撑", ["撓"]="挠", ["撝"]="㧑", ["撟"]="挢", ["撡"]="操", ["撣"]="掸", ["撥"]="拨", ["撧"]="𪮖", ["撫"]="抚", ["撲"]="扑", ["撳"]="揿", ["撶"]="𫼧", ["撹"]="搅", ["撻"]="挞", ["撾"]="挝", ["撿"]="捡", ["擁"]="拥", ["擃"]="𫼮", ["擄"]="掳", ["擇"]="择", ["擊"]="击", ["擋"]="挡", ["擓"]="㧟", ["擔"]="担", ["據"]="据", ["擠"]="挤", ["擡"]="抬", ["擣"]="捣", ["擥"]="㧛", ["擧"]="举", ["擪"]="𰓙", ["擫"]="𢬍", ["擬"]="拟", ["擯"]="摈", ["擰"]="拧", ["擱"]="搁", ["擲"]="掷", ["擳"]="𰓜", ["擴"]="扩", ["擷"]="撷", ["擺"]="摆", ["擻"]="擞", ["擼"]="撸", ["擽"]="㧰", ["擾"]="扰", ["攄"]="摅", ["攆"]="撵", ["攋"]="𪮶", ["攎"]="𢫘", ["攏"]="拢", ["攑"]="𫽥", ["攔"]="拦", ["攖"]="撄", ["攙"]="搀", ["攛"]="撺", ["攜"]="携", ["攝"]="摄", ["攞"]="𫽋", ["攡"]="摛", ["攢"]="攒", ["攣"]="挛", ["攤"]="摊", ["攦"]="𰓬", ["攧"]="𭣇", ["攩"]="挡", ["攪"]="搅", ["攬"]="揽", ["攳"]="𰕁", ["敎"]="教", ["敗"]="败", ["敘"]="叙", ["敭"]="扬", ["敳"]="𮲔", ["敵"]="敌", ["數"]="数", ["敺"]="驱", ["敿"]="𰕈", ["斁"]="𭣧", ["斂"]="敛", ["斃"]="毙", ["斄"]="𭤎", ["斅"]="𢽾", ["斆"]="敩", ["斕"]="斓", ["斬"]="斩", ["斵"]="斫", ["斷"]="断", ["斸"]="𣃁", ["於"]="于", ["旂"]="旗", ["旝"]="𰕭", ["旟"]="𭤰", ["昇"]="升", ["昜"]="𠃓", ["時"]="时", ["晉"]="晋", ["晛"]="𬀪", ["晝"]="昼", ["晻"]="暗", ["暈"]="晕", ["暉"]="晖", ["暊"]="𮲟", ["暎"]="映", ["暐"]="𬀩", ["暘"]="旸", ["暟"]="𬀱", ["暢"]="畅", ["暣"]="𣅠", ["暫"]="暂", ["暱"]="昵", ["曄"]="晔", ["曆"]="历", ["曇"]="昙", ["曉"]="晓", ["曊"]="𪰶", ["曏"]="向", ["曖"]="暧", ["曠"]="旷", ["曥"]="𣆐", ["曨"]="昽", ["曫"]="𬁢", ["曬"]="晒", ["曭"]="𭧋", ["曮"]="𰖈", ["書"]="书", ["會"]="会", ["朢"]="望", ["朥"]="𦛨", ["朧"]="胧", ["朮"]="术", ["東"]="东", ["枒"]="丫", ["柵"]="栅", ["桱"]="𣐕", ["桿"]="杆", ["梔"]="栀", ["梖"]="𪱷", ["梘"]="枧", ["梜"]="𬂩", ["條"]="条", ["梟"]="枭", ["梲"]="棁", ["棄"]="弃", ["棆"]="𰗖", ["棖"]="枨", ["棗"]="枣", ["棟"]="栋", ["棡"]="㭎", ["棧"]="栈", ["棲"]="栖", ["棶"]="梾", ["椉"]="乘", ["椏"]="桠", ["椚"]="𭩛", ["椲"]="㭏", ["椶"]="棕", ["楇"]="𣒌", ["楊"]="杨", ["楎"]="𰗢", ["楓"]="枫", ["楨"]="桢", ["業"]="业", ["極"]="极", ["榝"]="𬂮", ["榦"]="干", ["榪"]="杩", ["榮"]="荣", ["榯"]="𰗨", ["榲"]="榅", ["榿"]="桤", ["構"]="构", ["槍"]="枪", ["槓"]="杠", ["槤"]="梿", ["槧"]="椠", ["槨"]="椁", ["槩"]="概", ["槫"]="𣏢", ["槮"]="椮", ["槳"]="桨", ["槶"]="椢", ["槻"]="𬃀", ["槼"]="规", ["樁"]="桩", ["樂"]="乐", ["樅"]="枞", ["樌"]="𱣱", ["樑"]="梁", ["樓"]="楼", ["標"]="标", ["樞"]="枢", ["樠"]="𣗊", ["樢"]="㭤", ["樣"]="样", ["樤"]="𣔌", ["樫"]="㭴", ["樲"]="𬃘", ["樳"]="桪", ["樴"]="枳", ["樸"]="朴", ["樹"]="树", ["樺"]="桦", ["樻"]="𭫀", ["樿"]="椫", ["橃"]="𭩰", ["橅"]="𬂠", ["橈"]="桡", ["橋"]="桥", ["橒"]="枟", ["橚"]="𰗹", ["機"]="机", ["橢"]="椭", ["橤"]="蕊", ["橨"]="𰗺", ["橫"]="横", ["橯"]="𣓿", ["橺"]="𱣤", ["檁"]="檩", ["檂"]="𬂰", ["檇"]="槜", ["檉"]="柽", ["檋"]="𰘈", ["檏"]="𱣇", ["檒"]="𮨴", ["檔"]="档", ["檛"]="𭪆", ["檜"]="桧", ["檝"]="楫", ["檟"]="槚", ["檡"]="𰗛", ["檢"]="检", ["檣"]="樯", ["檥"]="𭩚", ["檭"]="𣘴", ["檮"]="梼", ["檯"]="台", ["檰"]="𰘣", ["檳"]="槟", ["檷"]="𪱾", ["檸"]="柠", ["檻"]="槛", ["檾"]="𰘓", ["檿"]="𰗜", ["櫂"]="棹", ["櫃"]="柜", ["櫅"]="𪲎", ["櫍"]="𬃊", ["櫎"]="𰗓", ["櫏"]="𰗬", ["櫓"]="橹", ["櫚"]="榈", ["櫛"]="栉", ["櫝"]="椟", ["櫞"]="橼", ["櫟"]="栎", ["櫠"]="𪲮", ["櫢"]="𰘸", ["櫥"]="橱", ["櫧"]="槠", ["櫨"]="栌", ["櫩"]="𰘠", ["櫪"]="枥", ["櫫"]="橥", ["櫬"]="榇", ["櫯"]="𰘶", ["櫱"]="蘖", ["櫳"]="栊", ["櫴"]="𰘳", ["櫸"]="榉", ["櫹"]="𰘩", ["櫺"]="棂", ["櫻"]="樱", ["櫽"]="𬄩", ["欄"]="栏", ["欆"]="𮲮", ["欇"]="𪳍", ["權"]="权", ["欏"]="椤", ["欐"]="𪲔", ["欑"]="𪴙", ["欒"]="栾", ["欓"]="𣗋", ["欖"]="榄", ["欗"]="𬅉", ["欘"]="𣚚", ["欝"]="郁", ["欞"]="棂", ["欵"]="款", ["欽"]="钦", ["歄"]="𬅥", ["歍"]="𰙋", ["歎"]="叹", ["歐"]="欧", ["歕"]="𬅫", ["歗"]="𰙑", ["歛"]="敛", ["歟"]="欤", ["歡"]="欢", ["歲"]="岁", ["歴"]="历", ["歷"]="历", ["歸"]="归", ["歿"]="殁", ["殀"]="夭", ["殘"]="残", ["殞"]="殒", ["殢"]="𣨼", ["殤"]="殇", ["殨"]="㱮", ["殫"]="殚", ["殭"]="僵", ["殮"]="殓", ["殯"]="殡", ["殰"]="㱩", ["殲"]="歼", ["殺"]="杀", ["殻"]="壳", ["殼"]="壳", ["殽"]="淆", ["毀"]="毁", ["毄"]="𬆦", ["毆"]="殴", ["毊"]="𪵑", ["毘"]="毗", ["毬"]="球", ["毿"]="毵", ["氀"]="𰚦", ["氂"]="牦", ["氈"]="毡", ["氌"]="氇", ["氣"]="气", ["氫"]="氢", ["氬"]="氩", ["氭"]="𣱝", ["氳"]="氲", ["汎"]="泛", ["汙"]="污", ["汚"]="污", ["決"]="决", ["沒"]="没", ["沖"]="冲", ["況"]="况", ["泝"]="溯", ["泞"]="𰛑", ["洩"]="泄", ["洶"]="汹", ["浹"]="浃", ["浿"]="𬇙", ["涇"]="泾", ["涷"]="𰛒", ["涼"]="凉", ["淒"]="凄", ["淚"]="泪", ["淥"]="渌", ["淨"]="净", ["淩"]="凌", ["淪"]="沦", ["淵"]="渊", ["淶"]="涞", ["淺"]="浅", ["渙"]="涣", ["減"]="减", ["渢"]="沨", ["渦"]="涡", ["測"]="测", ["渾"]="浑", ["湊"]="凑", ["湋"]="𣲗", ["湞"]="浈", ["湧"]="涌", ["湯"]="汤", ["溈"]="沩", ["準"]="准", ["溝"]="沟", ["溡"]="𪶄", ["溤"]="𰛊", ["溫"]="温", ["溮"]="浉", ["溰"]="𰛥", ["溳"]="涢", ["溼"]="湿", ["滄"]="沧", ["滅"]="灭", ["滌"]="涤", ["滎"]="荥", ["滬"]="沪", ["滭"]="𰛡", ["滯"]="滞", ["滲"]="渗", ["滷"]="卤", ["滸"]="浒", ["滻"]="浐", ["滾"]="滚", ["滿"]="满", ["漁"]="渔", ["漊"]="溇", ["漍"]="𬇹", ["漎"]="𰛏", ["漐"]="𰛣", ["漙"]="𬇘", ["漚"]="沤", ["漢"]="汉", ["漣"]="涟", ["漬"]="渍", ["漲"]="涨", ["漸"]="渐", ["漿"]="浆", ["潁"]="颍", ["潑"]="泼", ["潔"]="洁", ["潕"]="𣲘", ["潙"]="沩", ["潚"]="㴋", ["潛"]="潜", ["潣"]="𫞗", ["潤"]="润", ["潬"]="𬈁", ["潯"]="浔", ["潰"]="溃", ["潷"]="滗", ["潿"]="涠", ["澀"]="涩", ["澅"]="𣶩", ["澆"]="浇", ["澇"]="涝", ["澐"]="沄", ["澒"]="𭱊", ["澕"]="𮳆", ["澖"]="𰛵", ["澗"]="涧", ["澠"]="渑", ["澢"]="𭰎", ["澤"]="泽", ["澦"]="滪", ["澩"]="泶", ["澫"]="𬇕", ["澬"]="𫞚", ["澮"]="浍", ["澰"]="𰛲", ["澱"]="淀", ["澾"]="㳠", ["濁"]="浊", ["濃"]="浓", ["濄"]="㳡", ["濆"]="𣸣", ["濇"]="涩", ["濊"]="𰛦", ["濔"]="沵", ["濕"]="湿", ["濘"]="泞", ["濙"]="𣸨", ["濚"]="溁", ["濛"]="蒙", ["濜"]="浕", ["濟"]="济", ["濤"]="涛", ["濧"]="㳔", ["濫"]="滥", ["濰"]="潍", ["濱"]="滨", ["濴"]="𬈜", ["濺"]="溅", ["濼"]="泺", ["濾"]="滤", ["濿"]="𪵱", ["瀂"]="澛", ["瀃"]="𣽷", ["瀄"]="𰛤", ["瀅"]="滢", ["瀆"]="渎", ["瀇"]="㲿", ["瀈"]="𰝍", ["瀉"]="泻", ["瀋"]="沈", ["瀏"]="浏", ["瀕"]="濒", ["瀘"]="泸", ["瀙"]="𰜜", ["瀝"]="沥", ["瀟"]="潇", ["瀠"]="潆", ["瀢"]="𬉋", ["瀦"]="潴", ["瀧"]="泷", ["瀨"]="濑", ["瀩"]="𬉏", ["瀭"]="𮳗", ["瀯"]="𰝅", ["瀰"]="弥", ["瀲"]="潋", ["瀳"]="𰜨", ["瀴"]="𰜳", ["瀾"]="澜", ["灃"]="沣", ["灄"]="滠", ["灆"]="𱩪", ["灍"]="𫞝", ["灑"]="洒", ["灒"]="𪷽", ["灓"]="𰛪", ["灕"]="漓", ["灘"]="滩", ["灙"]="𣺼", ["灝"]="灏", ["灟"]="𭲫", ["灠"]="𰜐", ["灡"]="𬉠", ["灣"]="湾", ["灤"]="滦", ["灧"]="滟", ["灩"]="滟", ["災"]="灾", ["炤"]="照", ["為"]="为", ["烏"]="乌", ["烖"]="灾", ["烱"]="炯", ["烴"]="烃", ["焛"]="𬮟", ["無"]="无", ["煇"]="辉", ["煈"]="𮳠", ["煉"]="炼", ["煑"]="煮", ["煒"]="炜", ["煖"]="暖", ["煗"]="暖", ["煙"]="烟", ["煢"]="茕", ["煥"]="焕", ["煩"]="烦", ["煬"]="炀", ["煱"]="㶽", ["煼"]="𬊂", ["熂"]="𪸕", ["熅"]="煴", ["熈"]="熙", ["熉"]="𤈶", ["熌"]="𤇄", ["熒"]="荧", ["熕"]="𬊎", ["熗"]="炝", ["熚"]="𤇹", ["熞"]="𰞤", ["熡"]="𤋏", ["熰"]="𬉼", ["熱"]="热", ["熲"]="颎", ["熾"]="炽", ["燀"]="𬊤", ["燁"]="烨", ["燄"]="焰", ["燆"]="𮳧", ["燈"]="灯", ["燉"]="炖", ["燌"]="𰞻", ["燐"]="磷", ["燒"]="烧", ["燖"]="𬊈", ["燘"]="𬊖", ["燙"]="烫", ["燜"]="焖", ["營"]="营", ["燡"]="𰞇", ["燦"]="灿", ["燬"]="毁", ["燭"]="烛", ["燰"]="𬊺", ["燴"]="烩", ["燵"]="𬊉", ["燶"]="㶶", ["燻"]="熏", ["燼"]="烬", ["燽"]="𬊍", ["燾"]="焘", ["燿"]="耀", ["爁"]="𬊶", ["爃"]="𫞡", ["爄"]="𤇃", ["爌"]="𤆓", ["爍"]="烁", ["爏"]="𱪪", ["爐"]="炉", ["爓"]="𰟘", ["爕"]="燮", ["爖"]="𤇭", ["爗"]="烨", ["爛"]="烂", ["爣"]="𬊵", ["爥"]="𪹳", ["爧"]="𫞠", ["爭"]="争", ["爲"]="为", ["爺"]="爷", ["爾"]="尔", ["牆"]="墙", ["牋"]="笺", ["牐"]="闸", ["牓"]="榜", ["牘"]="牍", ["牠"]="它", ["牴"]="抵", ["牼"]="𰠲", ["牽"]="牵", ["犅"]="𰠫", ["犇"]="奔", ["犓"]="𬌝", ["犖"]="荦", ["犛"]="牦", ["犞"]="𪺭", ["犢"]="犊", ["犤"]="𰠹", ["犧"]="牺", ["狀"]="状", ["狹"]="狭", ["狽"]="狈", ["猌"]="𪺽", ["猍"]="𰡎", ["猙"]="狰", ["猧"]="𰡏", ["猶"]="犹", ["猻"]="狲", ["獁"]="犸", ["獄"]="狱", ["獅"]="狮", ["獃"]="呆", ["獊"]="𪺷", ["獎"]="奖", ["獑"]="𰡔", ["獖"]="𰡞", ["獘"]="毙", ["獟"]="𬌮", ["獢"]="𰡊", ["獨"]="独", ["獩"]="𤞃", ["獪"]="狯", ["獫"]="猃", ["獮"]="狝", ["獰"]="狞", ["獱"]="㺍", ["獲"]="获", ["獵"]="猎", ["獷"]="犷", ["獸"]="兽", ["獹"]="𰡄", ["獺"]="獭", ["獻"]="献", ["獼"]="猕", ["玀"]="猡", ["玁"]="𤞤", ["玂"]="𰡩", ["珮"]="佩", ["珼"]="𫞥", ["現"]="现", ["琖"]="盏", ["琜"]="𱮾", ["琱"]="雕", ["琺"]="珐", ["琿"]="珲", ["瑋"]="玮", ["瑍"]="𤥺", ["瑒"]="玚", ["瑣"]="琐", ["瑤"]="瑶", ["瑩"]="莹", ["瑪"]="玛", ["瑯"]="琅", ["瑲"]="玱", ["瑻"]="𪻲", ["瑽"]="𪻐", ["璉"]="琏", ["璊"]="𫞩", ["璍"]="𮴔", ["璕"]="𬍤", ["璗"]="𬍡", ["璛"]="𰢄", ["璝"]="𪻺", ["璡"]="琎", ["璣"]="玑", ["璦"]="瑷", ["璫"]="珰", ["璯"]="㻅", ["環"]="环", ["璵"]="玙", ["璸"]="瑸", ["璹"]="𰡽", ["璼"]="𫞨", ["璽"]="玺", ["璾"]="𫞦", ["璿"]="璇", ["瓄"]="𪻨", ["瓅"]="𬍛", ["瓈"]="璃", ["瓊"]="琼", ["瓏"]="珑", ["瓐"]="𰡵", ["瓓"]="𬎑", ["瓔"]="璎", ["瓕"]="𤦀", ["瓚"]="瓒", ["瓛"]="𤩽", ["甊"]="𰢦", ["甌"]="瓯", ["甎"]="砖", ["甒"]="𰢢", ["甕"]="瓮", ["甖"]="罂", ["產"]="产", ["産"]="产", ["甦"]="苏", ["畝"]="亩", ["畢"]="毕", ["畫"]="画", ["異"]="异", ["當"]="当", ["畼"]="𪽈", ["疇"]="畴", ["疊"]="叠", ["痙"]="痉", ["痮"]="𪽪", ["痲"]="痳", ["痺"]="痹", ["痾"]="疴", ["瘂"]="痖", ["瘉"]="愈", ["瘋"]="疯", ["瘍"]="疡", ["瘑"]="𬏮", ["瘓"]="痪", ["瘞"]="瘗", ["瘡"]="疮", ["瘧"]="疟", ["瘮"]="瘆", ["瘱"]="𪽷", ["瘲"]="疭", ["瘺"]="瘘", ["瘻"]="瘘", ["療"]="疗", ["癆"]="痨", ["癇"]="痫", ["癈"]="废", ["癉"]="瘅", ["癎"]="𰣯", ["癐"]="𤶊", ["癒"]="愈", ["癘"]="疠", ["癟"]="瘪", ["癠"]="𰣬", ["癡"]="痴", ["癢"]="痒", ["癤"]="疖", ["癥"]="症", ["癧"]="疬", ["癩"]="癞", ["癬"]="癣", ["癭"]="瘿", ["癮"]="瘾", ["癰"]="痈", ["癱"]="瘫", ["癲"]="癫", ["癴"]="𰣽", ["發"]="发", ["皁"]="皂", ["皚"]="皑", ["皟"]="𤾀", ["皪"]="𰤕", ["皰"]="疱", ["皸"]="皲", ["皺"]="皱", ["皾"]="𰤬", ["盃"]="杯", ["盋"]="钵", ["盜"]="盗", ["盞"]="盏", ["盡"]="尽", ["監"]="监", ["盤"]="盘", ["盧"]="卢", ["盨"]="𪾔", ["盪"]="荡", ["眝"]="𪾣", ["眞"]="真", ["眡"]="视", ["眥"]="眦", ["眾"]="众", ["睍"]="𪾢", ["睏"]="困", ["睔"]="𬑆", ["睜"]="睁", ["睞"]="睐", ["睪"]="睾", ["睴"]="𬑕", ["瞇"]="眯", ["瞓"]="𰥛", ["瞘"]="眍", ["瞛"]="𰥒", ["瞜"]="䁖", ["瞞"]="瞒", ["瞡"]="𰥪", ["瞤"]="𥆧", ["瞭"]="了", ["瞯"]="𰥨", ["瞱"]="𬑓", ["瞴"]="𱲦", ["瞶"]="瞆", ["瞷"]="𬑗", ["瞼"]="睑", ["矃"]="眝", ["矇"]="蒙", ["矉"]="𪾸", ["矊"]="𬑧", ["矑"]="𪾦", ["矓"]="眬", ["矕"]="𰥠", ["矖"]="𰥢", ["矘"]="𰥹", ["矙"]="瞰", ["矚"]="瞩", ["矯"]="矫", ["矲"]="𰦜", ["砦"]="寨", ["砲"]="炮", ["硃"]="朱", ["硜"]="硁", ["硤"]="硖", ["硨"]="砗", ["硯"]="砚", ["碊"]="𥒎", ["碖"]="𱳯", ["碙"]="𥐻", ["碢"]="𰦿", ["碩"]="硕", ["碪"]="砧", ["碭"]="砀", ["碸"]="砜", ["確"]="确", ["碼"]="码", ["碽"]="䂵", ["磑"]="硙", ["磒"]="𬒍", ["磚"]="砖", ["磟"]="碌", ["磠"]="硵", ["磣"]="碜", ["磧"]="碛", ["磯"]="矶", ["磱"]="𮀤", ["磵"]="𰧃", ["磽"]="硗", ["磾"]="䃅", ["礄"]="硚", ["礆"]="硷", ["礋"]="𰦰", ["礎"]="础", ["礏"]="𬒆", ["礐"]="𬒈", ["礑"]="𱳹", ["礒"]="𥐟", ["礙"]="碍", ["礛"]="𰧔", ["礥"]="𰧇", ["礦"]="矿", ["礩"]="𰧉", ["礪"]="砺", ["礫"]="砾", ["礬"]="矾", ["礮"]="炮", ["礰"]="𰦦", ["礱"]="砻", ["礲"]="𰦭", ["礹"]="𰦾", ["祕"]="秘", ["祿"]="禄", ["禍"]="祸", ["禎"]="祯", ["禓"]="𰧰", ["禕"]="祎", ["禜"]="𰱈", ["禡"]="祃", ["禦"]="御", ["禨"]="𥘌", ["禪"]="禅", ["禬"]="𰧻", ["禮"]="礼", ["禰"]="祢", ["禱"]="祷", ["禵"]="𰨖", ["禿"]="秃", ["秈"]="籼", ["秌"]="秋", ["稅"]="税", ["稈"]="秆", ["稏"]="䅉", ["稜"]="棱", ["稟"]="禀", ["稦"]="𮵠", ["稭"]="秸", ["種"]="种", ["稱"]="称", ["穀"]="谷", ["穅"]="糠", ["穇"]="䅟", ["穌"]="稣", ["積"]="积", ["穎"]="颖", ["穖"]="𬓠", ["穠"]="秾", ["穡"]="穑", ["穢"]="秽", ["穧"]="𰨦", ["穨"]="颓", ["穩"]="稳", ["穫"]="获", ["穬"]="𰨜", ["穭"]="稆", ["穽"]="阱", ["窓"]="窗", ["窩"]="窝", ["窪"]="洼", ["窮"]="穷", ["窯"]="窑", ["窰"]="窑", ["窱"]="𰩏", ["窵"]="窎", ["窶"]="窭", ["窺"]="窥", ["窻"]="窗", ["竀"]="𰩓", ["竄"]="窜", ["竅"]="窍", ["竇"]="窦", ["竈"]="灶", ["竉"]="𰩅", ["竊"]="窃", ["竢"]="俟", ["竪"]="竖", ["竱"]="𫁟", ["競"]="竞", ["筆"]="笔", ["筍"]="笋", ["筧"]="笕", ["筩"]="筒", ["筯"]="箸", ["筴"]="策", ["箂"]="𮵱", ["箇"]="个", ["箋"]="笺", ["箏"]="筝", ["箒"]="帚", ["箠"]="棰", ["箹"]="𰩺", ["節"]="节", ["範"]="范", ["築"]="筑", ["篋"]="箧", ["篔"]="筼", ["篘"]="𥬠", ["篛"]="箬", ["篠"]="筱", ["篢"]="𬕂", ["篤"]="笃", ["篩"]="筛", ["篳"]="筚", ["篸"]="𥮾", ["篿"]="𰩮", ["簀"]="箦", ["簂"]="𫂆", ["簍"]="篓", ["簑"]="蓑", ["簒"]="篡", ["簜"]="𰩹", ["簞"]="箪", ["簡"]="简", ["簢"]="𫂃", ["簣"]="篑", ["簥"]="𰩸", ["簩"]="𱸇", ["簫"]="箫", ["簵"]="𰪏", ["簷"]="檐", ["簹"]="筜", ["簻"]="𰩻", ["簽"]="签", ["簾"]="帘", ["籃"]="篮", ["籅"]="𥫣", ["籋"]="𥬞", ["籌"]="筹", ["籐"]="藤", ["籑"]="馔", ["籔"]="䉤", ["籙"]="箓", ["籚"]="𰩲", ["籛"]="篯", ["籜"]="箨", ["籟"]="籁", ["籠"]="笼", ["籣"]="𮆏", ["籤"]="签", ["籩"]="笾", ["籪"]="簖", ["籫"]="𬖃", ["籬"]="篱", ["籭"]="𬕄", ["籮"]="箩", ["籯"]="𰪣", ["籲"]="吁", ["粃"]="秕", ["粦"]="磷", ["粧"]="妆", ["粯"]="𬖑", ["粵"]="粤", ["粺"]="稗", ["粻"]="𰪭", ["糉"]="粽", ["糝"]="糁", ["糞"]="粪", ["糧"]="粮", ["糮"]="𬖮", ["糰"]="团", ["糲"]="粝", ["糴"]="籴", ["糶"]="粜", ["糷"]="𰫖", ["糹"]="纟", ["糺"]="纠", ["糽"]="𰫼", ["糾"]="纠", ["紀"]="纪", ["紁"]="𮵿", ["紂"]="纣", ["紃"]="𬘓", ["約"]="约", ["紅"]="红", ["紆"]="纡", ["紇"]="纥", ["紈"]="纨", ["紉"]="纫", ["紋"]="纹", ["紌"]="𬘕", ["納"]="纳", ["紐"]="纽", ["紑"]="𰫽", ["紒"]="𰬀", ["紓"]="纾", ["純"]="纯", ["紕"]="纰", ["紖"]="纼", ["紗"]="纱", ["紘"]="纮", ["紙"]="纸", ["級"]="级", ["紛"]="纷", ["紜"]="纭", ["紝"]="纴", ["紞"]="𬘘", ["紟"]="𫄛", ["紡"]="纺", ["紨"]="𰬅", ["紩"]="𮉢", ["紬"]="绸", ["紭"]="𰬋", ["紮"]="扎", ["細"]="细", ["紱"]="绂", ["紲"]="绁", ["紳"]="绅", ["紵"]="纻", ["紶"]="𬘛", ["紸"]="𰬇", ["紹"]="绍", ["紺"]="绀", ["紼"]="绋", ["紽"]="𰬉", ["紾"]="𬘝", ["紿"]="绐", ["絀"]="绌", ["絁"]="𫄟", ["終"]="终", ["絃"]="弦", ["組"]="组", ["絅"]="䌹", ["絆"]="绊", ["絃"]="弦", ["絇"]="𰬆", ["絍"]="𫟃", ["絎"]="绗", ["絏"]="绁", ["結"]="结", ["絑"]="𰬏", ["絓"]="𮉤", ["絕"]="绝", ["絖"]="𬘢", ["絘"]="𰬒", ["絙"]="𫄠", ["絚"]="𰬌", ["絛"]="绦", ["絝"]="绔", ["絞"]="绞", ["絟"]="𬘥", ["絠"]="𬘠", ["絡"]="络", ["絢"]="绚", ["絣"]="𰬔", ["絤"]="𬘟", ["絥"]="𫄢", ["給"]="给", ["絧"]="𫄡", ["絨"]="绒", ["絪"]="𬘡", ["絯"]="𰬓", ["絰"]="绖", ["統"]="统", ["絲"]="丝", ["絳"]="绛", ["絶"]="绝", ["絸"]="𬘖", ["絹"]="绢", ["絺"]="𫄨", ["絻"]="𰬜", ["絼"]="𰬛", ["絽"]="𬘤", ["絾"]="𰬖", ["絿"]="𰬗", ["綀"]="𦈌", ["綁"]="绑", ["綃"]="绡", ["綄"]="𬘫", ["綅"]="𰬞", ["綆"]="绠", ["綈"]="绨", ["綉"]="绣", ["綊"]="𰬍", ["綋"]="𫟄", ["綌"]="绤", ["綍"]="𰬘", ["綎"]="𬘩", ["綏"]="绥", ["綐"]="䌼", ["綑"]="捆", ["經"]="经", ["綕"]="𬘨", ["綖"]="𫄧", ["綘"]="𮶂", ["綜"]="综", ["綝"]="𬘭", ["綞"]="缍", ["綟"]="𫄫", ["綠"]="绿", ["綡"]="𫟅", ["綢"]="绸", ["綣"]="绻", ["綧"]="𬘯", ["綪"]="𬘬", ["綫"]="线", ["綬"]="绶", ["維"]="维", ["綯"]="绹", ["綰"]="绾", ["綱"]="纲", ["網"]="网", ["綳"]="绷", ["綴"]="缀", ["綵"]="彩", ["綷"]="𮉬", ["綸"]="纶", ["綹"]="绺", ["綺"]="绮", ["綻"]="绽", ["綼"]="𰬤", ["綽"]="绰", ["綾"]="绫", ["綿"]="绵", ["緀"]="𰬢", ["緁"]="𰬡", ["緂"]="𰬧", ["緄"]="绲", ["緅"]="𮉪", ["緆"]="𰬣", ["緇"]="缁", ["緉"]="𮉧", ["緊"]="紧", ["緋"]="绯", ["緌"]="𮉫", ["緍"]="𦈏", ["緎"]="𰬟", ["総"]="𰬥", ["緐"]="繁", ["緑"]="绿", ["緒"]="绪", ["緓"]="绬", ["緔"]="绱", ["緗"]="缃", ["緘"]="缄", ["緙"]="缂", ["線"]="线", ["緛"]="𬘰", ["緜"]="绵", ["緝"]="缉", ["緞"]="缎", ["緟"]="𫟆", ["締"]="缔", ["緡"]="缗", ["緢"]="𰬬", ["緣"]="缘", ["緤"]="𫄬", ["緥"]="褓", ["緦"]="缌", ["緧"]="𬘶", ["編"]="编", ["緩"]="缓", ["緬"]="缅", ["緮"]="𫄭", ["緯"]="纬", ["緰"]="𦈕", ["緱"]="缑", ["緲"]="缈", ["練"]="练", ["緵"]="𰬯", ["緶"]="缏", ["緷"]="𦈉", ["緸"]="𦈑", ["緹"]="缇", ["緺"]="𮉨", ["緻"]="致", ["緼"]="缊", ["緾"]="𱺦", ["縆"]="𬘵", ["縈"]="萦", ["縉"]="缙", ["縊"]="缢", ["縋"]="缒", ["縌"]="𰬳", ["縍"]="𫄰", ["縎"]="𦈔", ["縐"]="绉", ["縑"]="缣", ["縒"]="𬘷", ["縓"]="𰬲", ["縕"]="缊", ["縖"]="𬘻", ["縗"]="缞", ["縚"]="绦", ["縛"]="缚", ["縜"]="𰬚", ["縝"]="缜", ["縞"]="缟", ["縟"]="缛", ["縡"]="𰬴", ["縣"]="县", ["縧"]="绦", ["縩"]="𮉯", ["縪"]="𰬎", ["縫"]="缝", ["縬"]="𦈚", ["縭"]="缡", ["縮"]="缩", ["縯"]="𬙂", ["縰"]="𫄳", ["縱"]="纵", ["縲"]="缧", ["縳"]="䌸", ["縴"]="纤", ["縵"]="缦", ["縶"]="絷", ["縷"]="缕", ["縸"]="𫄲", ["縹"]="缥", ["縺"]="𦈐", ["縼"]="𰬵", ["總"]="总", ["績"]="绩", ["縿"]="𰬪", ["繀"]="𮉮", ["繂"]="𫄴", ["繃"]="绷", ["繅"]="缫", ["繆"]="缪", ["繈"]="襁", ["繎"]="𬙇", ["繏"]="𦈝", ["繐"]="𰬸", ["繑"]="𰬐", ["繒"]="缯", ["繓"]="𦈛", ["織"]="织", ["繕"]="缮", ["繖"]="伞", ["繗"]="𬙈", ["繘"]="𰬻", ["繙"]="𬙆", ["繚"]="缭", ["繜"]="𰬺", ["繞"]="绕", ["繟"]="𦈎", ["繡"]="绣", ["繢"]="缋", ["繣"]="𰬠", ["繦"]="襁", ["繧"]="纭", ["繨"]="𫄤", ["繩"]="绳", ["繪"]="绘", ["繫"]="系", ["繬"]="𫄱", ["繭"]="茧", ["繮"]="缰", ["繯"]="缳", ["繰"]="缲", ["繲"]="𰬽", ["繳"]="缴", ["繵"]="𬙉", ["繶"]="𫄷", ["繷"]="𫄣", ["繸"]="䍁", ["繹"]="绎", ["繻"]="𦈡", ["繼"]="继", ["繽"]="缤", ["繾"]="缱", ["繿"]="䍀", ["纀"]="𰬿", ["纁"]="𫄸", ["纆"]="𬙊", ["纇"]="颣", ["纈"]="缬", ["纊"]="纩", ["纋"]="𰭀", ["續"]="续", ["纍"]="累", ["纏"]="缠", ["纑"]="𮉡", ["纓"]="缨", ["纔"]="才", ["纕"]="𬙋", ["纖"]="纤", ["纗"]="𫄹", ["纘"]="缵", ["纚"]="𫄥", ["纜"]="缆", ["缽"]="钵", ["缾"]="瓶", ["罃"]="䓨", ["罆"]="𰭄", ["罇"]="樽", ["罈"]="坛", ["罌"]="罂", ["罎"]="坛", ["罏"]="𬙎", ["罰"]="罚", ["罵"]="骂", ["罷"]="罢", ["罼"]="𬙝", ["羂"]="𰭔", ["羅"]="罗", ["羆"]="罴", ["羈"]="羁", ["羋"]="芈", ["羗"]="羌", ["羜"]="𬙯", ["羥"]="羟", ["羨"]="羡", ["義"]="义", ["羵"]="𫅗", ["翄"]="翅", ["習"]="习", ["翜"]="𰭢", ["翫"]="玩", ["翬"]="翚", ["翸"]="𱻞", ["翹"]="翘", ["翺"]="翱", ["翽"]="翙", ["翿"]="𰭣", ["耡"]="锄", ["耫"]="𱻴", ["耬"]="耧", ["耮"]="耢", ["聖"]="圣", ["聞"]="闻", ["聯"]="联", ["聰"]="聪", ["聲"]="声", ["聳"]="耸", ["聵"]="聩", ["聶"]="聂", ["職"]="职", ["聹"]="聍", ["聻"]="𫆏", ["聽"]="听", ["聾"]="聋", ["肅"]="肃", ["肧"]="胚", ["脃"]="脆", ["脅"]="胁", ["脇"]="胁", ["脈"]="脉", ["脗"]="吻", ["脛"]="胫", ["脣"]="唇", ["脥"]="𣍰", ["脫"]="脱", ["脹"]="胀", ["腎"]="肾", ["腖"]="胨", ["腡"]="脶", ["腦"]="脑", ["腪"]="𣍯", ["腫"]="肿", ["腳"]="脚", ["腸"]="肠", ["膃"]="腽", ["膋"]="䒿", ["膒"]="𬁵", ["膓"]="肠", ["膕"]="腘", ["膚"]="肤", ["膞"]="䏝", ["膠"]="胶", ["膢"]="𦝼", ["膩"]="腻", ["膭"]="𱼏", ["膮"]="𰮝", ["膱"]="胑", ["膴"]="𰮇", ["膶"]="𬂀", ["膷"]="𰮅", ["膹"]="𪱥", ["膽"]="胆", ["膾"]="脍", ["膿"]="脓", ["臈"]="腊", ["臉"]="脸", ["臍"]="脐", ["臏"]="膑", ["臓"]="脏", ["臕"]="膘", ["臗"]="𣎑", ["臘"]="腊", ["臙"]="胭", ["臚"]="胪", ["臝"]="裸", ["臟"]="脏", ["臠"]="脔", ["臡"]="𰯋", ["臢"]="臜", ["臥"]="卧", ["臨"]="临", ["臺"]="台", ["與"]="与", ["興"]="兴", ["舉"]="举", ["舊"]="旧", ["舖"]="铺", ["舩"]="船", ["艙"]="舱", ["艛"]="𰰑", ["艜"]="𰰏", ["艢"]="樯", ["艣"]="橹", ["艤"]="舣", ["艦"]="舰", ["艫"]="舻", ["艭"]="𰰋", ["艱"]="艰", ["艷"]="艳", ["芻"]="刍", ["苧"]="苎", ["茘"]="荔", ["茲"]="兹", ["荊"]="荆", ["荍"]="荞", ["荳"]="豆", ["莊"]="庄", ["莖"]="茎", ["莢"]="荚", ["莧"]="苋", ["菓"]="果", ["菕"]="𰰨", ["菣"]="𬜤", ["菫"]="堇", ["華"]="华", ["菴"]="庵", ["菸"]="烟", ["萇"]="苌", ["萊"]="莱", ["萬"]="万", ["萯"]="𰰷", ["萲"]="萱", ["萴"]="荝", ["萵"]="莴", ["葉"]="叶", ["葒"]="荭", ["葝"]="𫈎", ["葠"]="参", ["葤"]="荮", ["葦"]="苇", ["葯"]="药", ["葷"]="荤", ["葻"]="𬜥", ["蒍"]="𫇭", ["蒒"]="𰰳", ["蒓"]="莼", ["蒔"]="莳", ["蒕"]="蒀", ["蒞"]="莅", ["蒭"]="𫇴", ["蒳"]="𰱌", ["蒶"]="𰱍", ["蒼"]="苍", ["蓀"]="荪", ["蓆"]="席", ["蓋"]="盖", ["蓡"]="参", ["蓧"]="𦰏", ["蓮"]="莲", ["蓯"]="苁", ["蓲"]="𰰤", ["蓳"]="堇", ["蓴"]="莼", ["蓻"]="𱽜", ["蓽"]="荜", ["蔄"]="𬜬", ["蔆"]="菱", ["蔎"]="𰰺", ["蔔"]="卜", ["蔕"]="蒂", ["蔘"]="𦲞", ["蔞"]="蒌", ["蔠"]="𰱛", ["蔣"]="蒋", ["蔥"]="葱", ["蔦"]="茑", ["蔪"]="𰱑", ["蔭"]="荫", ["蔮"]="𬜿", ["蔯"]="𫈟", ["蔱"]="𰰵", ["蔴"]="麻", ["蔾"]="藜", ["蔿"]="𫇭", ["蕁"]="荨", ["蕄"]="𰱉", ["蕆"]="蒇", ["蕋"]="蕊", ["蕎"]="荞", ["蕑"]="𰱇", ["蕒"]="荬", ["蕓"]="芸", ["蕕"]="莸", ["蕘"]="荛", ["蕚"]="萼", ["蕝"]="𫈵", ["蕟"]="𬜧", ["蕡"]="𰱟", ["蕢"]="蒉", ["蕩"]="荡", ["蕪"]="芜", ["蕭"]="萧", ["蕳"]="𫈉", ["蕷"]="蓣", ["薀"]="蕰", ["薆"]="𫉁", ["薈"]="荟", ["薉"]="𬜨", ["薊"]="蓟", ["薋"]="𰱱", ["薌"]="芗", ["薑"]="姜", ["薔"]="蔷", ["薖"]="𰰾", ["薘"]="荙", ["薙"]="剃", ["薟"]="莶", ["薠"]="𮐚", ["薦"]="荐", ["薩"]="萨", ["薱"]="𰰱", ["薲"]="𬝯", ["薴"]="苧", ["薵"]="䓓", ["薺"]="荠", ["薾"]="𦬼", ["藇"]="𰰠", ["藉"]="借", ["藍"]="蓝", ["藎"]="荩", ["藖"]="𬜾", ["藘"]="𰱮", ["藚"]="𰱐", ["藝"]="艺", ["藣"]="𰱯", ["藥"]="药", ["藪"]="薮", ["藬"]="𬞘", ["藭"]="䓖", ["藰"]="𰰹", ["藴"]="蕴", ["藶"]="苈", ["藷"]="薯", ["藹"]="蔼", ["藺"]="蔺", ["藼"]="萱", ["藾"]="𰱾", ["蘀"]="萚", ["蘂"]="蕊", ["蘄"]="蕲", ["蘆"]="芦", ["蘇"]="苏", ["蘈"]="𰲁", ["蘊"]="蕴", ["蘋"]="苹", ["蘐"]="萱", ["蘓"]="苏", ["蘚"]="藓", ["蘞"]="蔹", ["蘟"]="𦻕", ["蘡"]="𮐨", ["蘢"]="茏", ["蘤"]="花", ["蘫"]="𬞫", ["蘬"]="𰰮", ["蘭"]="兰", ["蘱"]="𰲒", ["蘴"]="䒠", ["蘵"]="𰱲", ["蘺"]="蓠", ["蘿"]="萝", ["虅"]="𰲂", ["虉"]="𬟁", ["處"]="处", ["虖"]="呼", ["虛"]="虚", ["虜"]="虏", ["號"]="号", ["虦"]="𰲠", ["虧"]="亏", ["虯"]="虬", ["蛵"]="𰲶", ["蛺"]="蛱", ["蛻"]="蜕", ["蛼"]="𰲬", ["蜆"]="蚬", ["蜦"]="𰲰", ["蜸"]="𰲮", ["蜽"]="𮔊", ["蝀"]="𬟽", ["蝁"]="𰲸", ["蝕"]="蚀", ["蝜"]="𮔅", ["蝟"]="猬", ["蝡"]="蠕", ["蝦"]="虾", ["蝨"]="虱", ["蝱"]="虻", ["蝸"]="蜗", ["螄"]="蛳", ["螘"]="𰲹", ["螞"]="蚂", ["螢"]="萤", ["螮"]="䗖", ["螴"]="𰳄", ["螹"]="𰳂", ["螻"]="蝼", ["螿"]="螀", ["蟂"]="𫋇", ["蟄"]="蛰", ["蟈"]="蝈", ["蟎"]="螨", ["蟘"]="𫋌", ["蟙"]="𧊄", ["蟜"]="𫊸", ["蟡"]="𰲲", ["蟣"]="虮", ["蟦"]="𰳊", ["蟧"]="𮔚", ["蟬"]="蝉", ["蟯"]="蛲", ["蟲"]="虫", ["蟳"]="𫊻", ["蟶"]="蛏", ["蟷"]="𬠅", ["蟻"]="蚁", ["蠀"]="𧏗", ["蠁"]="蚃", ["蠅"]="蝇", ["蠆"]="虿", ["蠈"]="𬠠", ["蠌"]="𰲵", ["蠍"]="蝎", ["蠏"]="蟹", ["蠐"]="蛴", ["蠑"]="蝾", ["蠔"]="蚝", ["蠙"]="𧏖", ["蠟"]="蜡", ["蠣"]="蛎", ["蠦"]="𫊮", ["蠨"]="蟏", ["蠪"]="𰲴", ["蠭"]="蜂", ["蠱"]="蛊", ["蠳"]="𰳗", ["蠶"]="蚕", ["蠻"]="蛮", ["蠾"]="𧑏", ["衂"]="衄", ["衆"]="众", ["衊"]="蔑", ["術"]="术", ["衕"]="同", ["衚"]="胡", ["衛"]="卫", ["衞"]="卫", ["衝"]="冲", ["衹"]="只", ["袞"]="衮", ["袵"]="衽", ["裊"]="袅", ["裌"]="夹", ["裏"]="里", ["補"]="补", ["裝"]="装", ["裡"]="里", ["裲"]="𮖁", ["製"]="制", ["複"]="复", ["褌"]="裈", ["褘"]="袆", ["褭"]="袅", ["褲"]="裤", ["褳"]="裢", ["褸"]="褛", ["褺"]="𬡓", ["褻"]="亵", ["襀"]="𫌀", ["襂"]="𰴂", ["襆"]="幞", ["襇"]="裥", ["襌"]="褝", ["襏"]="袯", ["襓"]="𫋹", ["襖"]="袄", ["襗"]="𫋷", ["襘"]="𫋻", ["襛"]="𰳺", ["襝"]="裣", ["襠"]="裆", ["襤"]="褴", ["襪"]="袜", ["襬"]="摆", ["襭"]="𮖱", ["襯"]="衬", ["襰"]="𧝝", ["襱"]="𰳲", ["襲"]="袭", ["襴"]="襕", ["襵"]="𫌇", ["襸"]="𬡷", ["襹"]="𰳼", ["襼"]="𰳵", ["覇"]="霸", ["見"]="见", ["覎"]="觃", ["規"]="规", ["覒"]="𬆾", ["覓"]="觅", ["覔"]="觅", ["覕"]="𰴕", ["視"]="视", ["覗"]="𬢊", ["覘"]="觇", ["覙"]="𫌨", ["覚"]="觉", ["覛"]="𫌪", ["覟"]="𬢌", ["覠"]="𰴙", ["覡"]="觋", ["覢"]="𬊦", ["覤"]="𬟪", ["覥"]="觍", ["覦"]="觎", ["覩"]="睹", ["親"]="亲", ["覫"]="𲁙", ["覬"]="觊", ["覭"]="𬢒", ["覮"]="𲁖", ["覯"]="觏", ["覰"]="𰴜", ["覲"]="觐", ["覴"]="𬢔", ["覶"]="𰴝", ["覷"]="觑", ["覸"]="𰴘", ["覹"]="𫌭", ["覺"]="觉", ["覻"]="𰴞", ["覼"]="𫌨", ["覽"]="览", ["覿"]="觌", ["觀"]="观", ["觔"]="斤", ["觕"]="粗", ["觝"]="抵", ["觴"]="觞", ["觶"]="觯", ["觷"]="𰴣", ["觸"]="触", ["觻"]="𰴢", ["訁"]="讠", ["訂"]="订", ["訃"]="讣", ["訆"]="𰵊", ["計"]="计", ["訉"]="𲂂", ["訊"]="讯", ["訌"]="讧", ["訍"]="𲂃", ["討"]="讨", ["訏"]="𬣙", ["訐"]="讦", ["訑"]="𫍙", ["訒"]="讱", ["訓"]="训", ["訕"]="讪", ["訖"]="讫", ["託"]="托", ["記"]="记", ["訛"]="讹", ["訜"]="𫍛", ["訝"]="讶", ["訞"]="𫍚", ["訟"]="讼", ["訢"]="䜣", ["訣"]="诀", ["訥"]="讷", ["訦"]="𰵒", ["訧"]="𰵎", ["訨"]="𫟞", ["訩"]="讻", ["訪"]="访", ["訬"]="𰵏", ["設"]="设", ["訰"]="𰵍", ["許"]="许", ["訴"]="诉", ["訶"]="诃", ["訸"]="𰵝", ["訹"]="𰵓", ["診"]="诊", ["註"]="注", ["訽"]="𰵛", ["詀"]="𧮪", ["詁"]="诂", ["詃"]="𬣤", ["詄"]="𰵙", ["詅"]="𰵚", ["詆"]="诋", ["詇"]="𰵗", ["詉"]="𰵠", ["詊"]="𫟟", ["詌"]="𬣠", ["詍"]="𰵔", ["詎"]="讵", ["詏"]="𬣦", ["詐"]="诈", ["詑"]="𫍡", ["詒"]="诒", ["詓"]="𫍜", ["詔"]="诏", ["評"]="评", ["詖"]="诐", ["詗"]="诇", ["詘"]="诎", ["詛"]="诅", ["詜"]="𬣥", ["詝"]="𬣞", ["詞"]="词", ["詠"]="咏", ["詡"]="诩", ["詢"]="询", ["詣"]="诣", ["詥"]="𰵣", ["試"]="试", ["詨"]="𰵦", ["詩"]="诗", ["詪"]="𬣳", ["詫"]="诧", ["詬"]="诟", ["詭"]="诡", ["詮"]="诠", ["詯"]="𬣰", ["詰"]="诘", ["話"]="话", ["該"]="该", ["詳"]="详", ["詴"]="𬣩", ["詵"]="诜", ["詶"]="酬", ["詷"]="𫍣", ["詺"]="𬣮", ["詻"]="𰵤", ["詼"]="诙", ["詿"]="诖", ["誁"]="𬣲", ["誂"]="𫍥", ["誃"]="𰵥", ["誄"]="诔", ["誅"]="诛", ["誆"]="诓", ["誇"]="夸", ["誋"]="𫍪", ["誌"]="志", ["認"]="认", ["誎"]="𬣷", ["誏"]="𬣼", ["誐"]="𰵮", ["誑"]="诳", ["誒"]="诶", ["誔"]="𬣻", ["誕"]="诞", ["誗"]="𰵭", ["誘"]="诱", ["誙"]="𰵡", ["誚"]="诮", ["誜"]="𰵯", ["語"]="语", ["誠"]="诚", ["誡"]="诫", ["誣"]="诬", ["誤"]="误", ["誥"]="诰", ["誦"]="诵", ["誧"]="𰵩", ["誨"]="诲", ["誩"]="𲂍", ["說"]="说", ["誫"]="𫍨", ["説"]="说", ["誰"]="谁", ["課"]="课", ["誳"]="𫍮", ["誴"]="𫟡", ["誶"]="谇", ["誷"]="𫍬", ["誹"]="诽", ["誺"]="𫍧", ["誻"]="𰵸", ["誼"]="谊", ["誽"]="𰵵", ["誾"]="訚", ["調"]="调", ["諁"]="𰵷", ["諂"]="谄", ["諃"]="𰵱", ["諄"]="谆", ["諆"]="𰵲", ["談"]="谈", ["諈"]="𰵶", ["諉"]="诿", ["請"]="请", ["諌"]="𮷅", ["諍"]="诤", ["諎"]="𬣾", ["諏"]="诹", ["諑"]="诼", ["諒"]="谅", ["諓"]="𬣡", ["諔"]="𰵴", ["諕"]="𬤀", ["論"]="论", ["諗"]="谂", ["諘"]="𲂏", ["諛"]="谀", ["諜"]="谍", ["諝"]="谞", ["諞"]="谝", ["諟"]="𬤊", ["諠"]="喧", ["諡"]="谥", ["諢"]="诨", ["諣"]="𫍩", ["諤"]="谔", ["諥"]="𫍳", ["諦"]="谛", ["諧"]="谐", ["諫"]="谏", ["諭"]="谕", ["諮"]="谘", ["諯"]="𫍱", ["諰"]="𫍰", ["諱"]="讳", ["諲"]="𬤇", ["諳"]="谙", ["諴"]="𫍯", ["諵"]="𲂐", ["諶"]="谌", ["諷"]="讽", ["諸"]="诸", ["諹"]="𰵌", ["諺"]="谚", ["諻"]="𬤍", ["諼"]="谖", ["諾"]="诺", ["謀"]="谋", ["謁"]="谒", ["謂"]="谓", ["謄"]="誊", ["謅"]="诌", ["謆"]="𫍸", ["謉"]="𫍷", ["謊"]="谎", ["謋"]="𰵼", ["謌"]="歌", ["謍"]="𰴯", ["謎"]="谜", ["謏"]="𫍲", ["謐"]="谧", ["謑"]="𰵾", ["謔"]="谑", ["謖"]="谡", ["謗"]="谤", ["謙"]="谦", ["謚"]="谥", ["講"]="讲", ["謜"]="𰵺", ["謝"]="谢", ["謞"]="𰵿", ["謟"]="𰵽", ["謠"]="谣", ["謡"]="谣", ["謣"]="𰶀", ["謥"]="𰶂", ["謨"]="谟", ["謫"]="谪", ["謬"]="谬", ["謭"]="谫", ["謯"]="𫍹", ["謰"]="𬣽", ["謱"]="𫍴", ["謲"]="𬤄", ["謳"]="讴", ["謵"]="𰶃", ["謶"]="𲂔", ["謸"]="𫍵", ["謹"]="谨", ["謻"]="𰶁", ["謼"]="呼", ["謾"]="谩", ["譀"]="𰶆", ["譁"]="哗", ["譂"]="𫟠", ["譄"]="𬤤", ["譅"]="𰶎", ["譆"]="嘻", ["譇"]="𰶄", ["譈"]="𬤣", ["證"]="证", ["譊"]="𫍢", ["譌"]="𰵑", ["譎"]="谲", ["譏"]="讥", ["譐"]="𬤢", ["譑"]="𫍤", ["譒"]="𮷊", ["譓"]="𬤝", ["譔"]="撰", ["譖"]="谮", ["識"]="识", ["譙"]="谯", ["譚"]="谭", ["譜"]="谱", ["譞"]="𫍽", ["譟"]="噪", ["譠"]="𰶉", ["譡"]="𬣭", ["譢"]="𲂖", ["譧"]="𲂕", ["譨"]="𫍦", ["譩"]="𰶊", ["譫"]="谵", ["譭"]="毁", ["譯"]="译", ["議"]="议", ["譳"]="𰶌", ["譴"]="谴", ["護"]="护", ["譸"]="诪", ["譹"]="𬤫", ["譺"]="𬤩", ["譻"]="𬢯", ["譼"]="䛓", ["譽"]="誉", ["譾"]="谫", ["譿"]="𬤭", ["讀"]="读", ["讁"]="谪", ["讂"]="𰶍", ["讅"]="谉", ["讆"]="𬣀", ["讇"]="𬤛", ["讉"]="𬤦", ["變"]="变", ["讋"]="詟", ["讌"]="宴", ["讎"]="雠", ["讑"]="𰶏", ["讒"]="谗", ["讓"]="让", ["讔"]="𮙊", ["讕"]="谰", ["讖"]="谶", ["讘"]="𰵹", ["讙"]="欢", ["讚"]="赞", ["讛"]="𰵖", ["讜"]="谠", ["讝"]="𰵨", ["讞"]="谳", ["讟"]="𮙋", ["豄"]="𰶔", ["豅"]="𰶑", ["豈"]="岂", ["豎"]="竖", ["豐"]="丰", ["豔"]="艳", ["豬"]="猪", ["豵"]="𫎆", ["豶"]="豮", ["貍"]="狸", ["貓"]="猫", ["貗"]="𫎌", ["貙"]="䝙", ["貛"]="獾", ["貝"]="贝", ["貞"]="贞", ["貟"]="贠", ["負"]="负", ["財"]="财", ["貢"]="贡", ["貣"]="𰷞", ["貤"]="𰷠", ["貦"]="𰷡", ["貧"]="贫", ["貨"]="货", ["販"]="贩", ["貪"]="贪", ["貫"]="贯", ["責"]="责", ["貯"]="贮", ["貰"]="贳", ["貱"]="𬥶", ["貲"]="赀", ["貳"]="贰", ["貴"]="贵", ["貶"]="贬", ["買"]="买", ["貸"]="贷", ["貺"]="贶", ["費"]="费", ["貼"]="贴", ["貽"]="贻", ["貾"]="𰷢", ["貿"]="贸", ["賀"]="贺", ["賁"]="贲", ["賂"]="赂", ["賃"]="赁", ["賄"]="贿", ["賅"]="赅", ["資"]="资", ["賈"]="贾", ["賊"]="贼", ["賍"]="赃", ["賏"]="𲂻", ["賑"]="赈", ["賒"]="赊", ["賓"]="宾", ["賕"]="赇", ["賗"]="𬥸", ["賙"]="赒", ["賚"]="赉", ["賛"]="赞", ["賜"]="赐", ["賝"]="𫎩", ["賞"]="赏", ["賟"]="𧹖", ["賠"]="赔", ["賡"]="赓", ["賢"]="贤", ["賣"]="卖", ["賤"]="贱", ["賥"]="𰷤", ["賦"]="赋", ["賧"]="赕", ["賨"]="𰷥", ["質"]="质", ["賫"]="赍", ["賬"]="账", ["賭"]="赌", ["賮"]="𰷧", ["賰"]="䞐", ["賲"]="𲃄", ["賴"]="赖", ["賵"]="赗", ["賷"]="赍", ["賸"]="剩", ["賹"]="𰷪", ["賺"]="赚", ["賻"]="赙", ["購"]="购", ["賽"]="赛", ["賾"]="赜", ["贃"]="𧹗", ["贄"]="贽", ["贅"]="赘", ["贆"]="𰷫", ["贇"]="赟", ["贈"]="赠", ["贉"]="𫎫", ["贊"]="赞", ["贋"]="赝", ["贍"]="赡", ["贏"]="赢", ["贐"]="赆", ["贑"]="赣", ["贓"]="赃", ["贔"]="赑", ["贕"]="𫧿", ["贖"]="赎", ["贗"]="赝", ["贙"]="𰷮", ["贚"]="𫎦", ["贛"]="赣", ["贜"]="赃", ["赬"]="赪", ["趕"]="赶", ["趙"]="赵", ["趨"]="趋", ["趫"]="𰷶", ["趬"]="𰷵", ["趰"]="趂", ["趲"]="趱", ["跡"]="迹", ["踁"]="胫", ["踐"]="践", ["踚"]="𬦧", ["踰"]="逾", ["踴"]="踊", ["踼"]="𰸄", ["蹌"]="跄", ["蹏"]="蹄", ["蹔"]="暂", ["蹕"]="跸", ["蹛"]="𰸚", ["蹟"]="迹", ["蹡"]="𬧀", ["蹣"]="蹒", ["蹤"]="踪", ["蹥"]="𰸔", ["蹪"]="𰸞", ["蹳"]="𫏆", ["蹺"]="跷", ["蹻"]="跷", ["躀"]="𬦻", ["躂"]="跶", ["躉"]="趸", ["躊"]="踌", ["躋"]="跻", ["躍"]="跃", ["躎"]="䟢", ["躑"]="踯", ["躒"]="跞", ["躓"]="踬", ["躕"]="蹰", ["躘"]="𨀁", ["躚"]="跹", ["躝"]="𨅬", ["躡"]="蹑", ["躥"]="蹿", ["躦"]="躜", ["躧"]="𰸐", ["躪"]="躏", ["躭"]="耽", ["躳"]="躬", ["躶"]="裸", ["躼"]="𲄚", ["軀"]="躯", ["軁"]="𲄧", ["軂"]="𬧤", ["軃"]="𰹀", ["軇"]="𮜶", ["車"]="车", ["軋"]="轧", ["軌"]="轨", ["軍"]="军", ["軎"]="𰹲", ["軏"]="𫐄", ["軑"]="轪", ["軒"]="轩", ["軓"]="𰹴", ["軔"]="轫", ["軖"]="𰹶", ["軗"]="𨐅", ["軘"]="𰹸", ["軚"]="𮷗", ["軛"]="轭", ["軜"]="𫐇", ["軝"]="𬨂", ["軞"]="𬨁", ["軟"]="软", ["軤"]="轷", ["軥"]="𰺁", ["軧"]="𰺀", ["軨"]="𫐉", ["軫"]="轸", ["軬"]="𫐊", ["軮"]="𬨄", ["軯"]="𰹽", ["軱"]="𮝴", ["軲"]="轱", ["軳"]="𰺂", ["軵"]="𰹿", ["軷"]="𫐈", ["軸"]="轴", ["軹"]="轵", ["軺"]="轺", ["軻"]="轲", ["軼"]="轶", ["軾"]="轼", ["軿"]="𫐌", ["輀"]="𮝵", ["輁"]="𰺄", ["輂"]="𰺅", ["較"]="较", ["輄"]="𨐈", ["輅"]="辂", ["輆"]="𬨇", ["輇"]="辁", ["輈"]="辀", ["載"]="载", ["輊"]="轾", ["輋"]="𪨶", ["輐"]="𰺇", ["輑"]="𰺈", ["輒"]="辄", ["輓"]="挽", ["輔"]="辅", ["輕"]="轻", ["輖"]="𫐏", ["輗"]="𫐐", ["輘"]="𰺊", ["輙"]="辄", ["輚"]="𰹼", ["輛"]="辆", ["輜"]="辎", ["輝"]="辉", ["輞"]="辋", ["輟"]="辍", ["輠"]="𰺍", ["輡"]="𰺐", ["輢"]="𫐎", ["輣"]="𰺏", ["輤"]="𰺉", ["輥"]="辊", ["輦"]="辇", ["輨"]="𫐑", ["輩"]="辈", ["輪"]="轮", ["輫"]="𰺎", ["輬"]="辌", ["輭"]="软", ["輮"]="𫐓", ["輯"]="辑", ["輲"]="𰺒", ["輳"]="辏", ["輴"]="𮝸", ["輵"]="𬨍", ["輶"]="𬨎", ["輷"]="𫐒", ["輸"]="输", ["輹"]="𰺓", ["輻"]="辐", ["輼"]="辒", ["輾"]="辗", ["輿"]="舆", ["轀"]="辒", ["轁"]="𮷝", ["轂"]="毂", ["轃"]="𰺖", ["轄"]="辖", ["轅"]="辕", ["轆"]="辘", ["轇"]="𫐖", ["轈"]="𬨓", ["轉"]="转", ["轊"]="𫐕", ["轍"]="辙", ["轎"]="轿", ["轏"]="𰺞", ["轐"]="𫐗", ["轑"]="𰺛", ["轒"]="𮝷", ["轓"]="𰺜", ["轔"]="辚", ["轕"]="𮝺", ["轖"]="𰺙", ["轗"]="𫐘", ["轘"]="𮝹", ["轙"]="𰹵", ["轚"]="𰺟", ["轛"]="𰺃", ["轞"]="𰺗", ["轟"]="轰", ["轠"]="𫐙", ["轡"]="辔", ["轢"]="轹", ["轣"]="𫐆", ["轤"]="轳", ["轥"]="𰺣", ["辦"]="办", ["辭"]="辞", ["辮"]="辫", ["辯"]="辩", ["農"]="农", ["辳"]="农", ["迴"]="回", ["迻"]="移", ["逈"]="迥", ["逕"]="迳", ["這"]="这", ["連"]="连", ["逩"]="奔", ["週"]="周", ["進"]="进", ["逿"]="𰺲", ["遉"]="侦", ["遊"]="游", ["運"]="运", ["過"]="过", ["達"]="达", ["違"]="违", ["遙"]="遥", ["遜"]="逊", ["遞"]="递", ["遠"]="远", ["遡"]="溯", ["遤"]="𲅎", ["適"]="适", ["遯"]="遁", ["遰"]="𰻆", ["遱"]="𫐷", ["遲"]="迟", ["遶"]="绕", ["遷"]="迁", ["選"]="选", ["遺"]="遗", ["遼"]="辽", ["邁"]="迈", ["還"]="还", ["邇"]="迩", ["邊"]="边", ["邏"]="逻", ["邐"]="逦", ["郟"]="郏", ["郲"]="𬩾", ["郵"]="邮", ["鄆"]="郓", ["鄉"]="乡", ["鄒"]="邹", ["鄔"]="邬", ["鄖"]="郧", ["鄟"]="𫑘", ["鄡"]="𰻮", ["鄦"]="𰻡", ["鄧"]="邓", ["鄩"]="𬩽", ["鄪"]="𰻳", ["鄬"]="𰻦", ["鄭"]="郑", ["鄮"]="𬪍", ["鄰"]="邻", ["鄲"]="郸", ["鄳"]="𫑡", ["鄴"]="邺", ["鄶"]="郐", ["鄺"]="邝", ["酇"]="酂", ["酈"]="郦", ["酖"]="鸩", ["酧"]="酬", ["醃"]="腌", ["醆"]="盏", ["醖"]="酝", ["醜"]="丑", ["醞"]="酝", ["醟"]="蒏", ["醣"]="糖", ["醦"]="𮠳", ["醧"]="𬪧", ["醫"]="医", ["醬"]="酱", ["醱"]="酦", ["醲"]="𬪩", ["醳"]="𰼅", ["醶"]="𫑷", ["醻"]="酬", ["醼"]="宴", ["釀"]="酿", ["釁"]="衅", ["釃"]="酾", ["釅"]="酽", ["釋"]="释", ["釒"]="钅", ["釓"]="钆", ["釔"]="钇", ["釕"]="钌", ["釗"]="钊", ["釘"]="钉", ["釙"]="钋", ["釚"]="𫟲", ["針"]="针", ["釟"]="𫓥", ["釣"]="钓", ["釤"]="钐", ["釥"]="𰽛", ["釦"]="扣", ["釧"]="钏", ["釨"]="𫓦", ["釩"]="钒", ["釪"]="𰽗", ["釫"]="𬬨", ["釬"]="焊", ["釭"]="𮣲", ["釮"]="𲇭", ["釰"]="𲇰", ["釱"]="𰽘", ["釲"]="𫟳", ["釳"]="𨰿", ["釴"]="𬬩", ["釵"]="钗", ["釷"]="钍", ["釹"]="钕", ["釺"]="钎", ["釽"]="𬬲", ["釾"]="䥺", ["釿"]="𬬱", ["鈀"]="钯", ["鈁"]="钫", ["鈂"]="𬬵", ["鈃"]="钘", ["鈄"]="钭", ["鈅"]="钥", ["鈆"]="铅", ["鈇"]="𫓧", ["鈈"]="钚", ["鈉"]="钠", ["鈊"]="𲇴", ["鈋"]="𨱂", ["鈌"]="𰽤", ["鈍"]="钝", ["鈎"]="钩", ["鈏"]="𰽣", ["鈐"]="钤", ["鈑"]="钣", ["鈒"]="钑", ["鈓"]="𬬯", ["鈔"]="钞", ["鈕"]="钮", ["鈖"]="𫟴", ["鈗"]="𫟵", ["鈘"]="𲇱", ["鈚"]="𬬫", ["鈜"]="𮣳", ["鈞"]="钧", ["鈠"]="𨱁", ["鈡"]="钟", ["鈣"]="钙", ["鈤"]="𰽡", ["鈥"]="钬", ["鈦"]="钛", ["鈧"]="钪", ["鈨"]="𮷸", ["鈪"]="𰽞", ["鈮"]="铌", ["鈯"]="𨱄", ["鈰"]="铈", ["鈱"]="𲇸", ["鈲"]="𨱃", ["鈳"]="钶", ["鈴"]="铃", ["鈵"]="𰽥", ["鈶"]="𬭀", ["鈷"]="钴", ["鈸"]="钹", ["鈹"]="铍", ["鈺"]="钰", ["鈼"]="𬬽", ["鈽"]="钸", ["鈾"]="铀", ["鈿"]="钿", ["鉀"]="钾", ["鉁"]="𨱅", ["鉅"]="巨", ["鉆"]="钻", ["鉈"]="铊", ["鉉"]="铉", ["鉊"]="𬬿", ["鉋"]="刨", ["鉌"]="𰽬", ["鉍"]="铋", ["鉎"]="𰽫", ["鉏"]="锄", ["鉐"]="𬬷", ["鉑"]="铂", ["鉒"]="𰽯", ["鉔"]="𫓬", ["鉕"]="钷", ["鉗"]="钳", ["鉘"]="𰽱", ["鉚"]="铆", ["鉛"]="铅", ["鉜"]="𰽮", ["鉝"]="𫟷", ["鉞"]="钺", ["鉟"]="𰽧", ["鉠"]="𫓭", ["鉡"]="𰽰", ["鉢"]="钵", ["鉤"]="钩", ["鉥"]="𬬸", ["鉦"]="钲", ["鉧"]="𬭁", ["鉨"]="鿭", ["鉬"]="钼", ["鉭"]="钽", ["鉮"]="𬬹", ["鉲"]="𰽩", ["鉵"]="𰽶", ["鉶"]="铏", ["鉷"]="𫟹", ["鉸"]="铰", ["鉹"]="𰽹", ["鉺"]="铒", ["鉻"]="铬", ["鉼"]="𰽼", ["鉽"]="𫟸", ["鉾"]="𫓴", ["鉿"]="铪", ["銀"]="银", ["銁"]="𫓲", ["銂"]="𫟻", ["銃"]="铳", ["銅"]="铜", ["銈"]="𫓯", ["銊"]="𫓰", ["銋"]="𰽻", ["銌"]="𲇻", ["銍"]="铚", ["銏"]="𫟶", ["銑"]="铣", ["銓"]="铨", ["銔"]="𬭃", ["銖"]="铢", ["銗"]="𬭅", ["銘"]="铭", ["銙"]="𰽴", ["銚"]="铫", ["銛"]="铦", ["銜"]="衔", ["銠"]="铑", ["銡"]="𰽲", ["銣"]="铷", ["銥"]="铱", ["銦"]="铟", ["銧"]="𰽵", ["銨"]="铵", ["銩"]="铥", ["銪"]="铕", ["銫"]="铯", ["銬"]="铐", ["銱"]="铞", ["銲"]="焊", ["銳"]="锐", ["銶"]="𨱇", ["銷"]="销", ["銸"]="𰽿", ["銹"]="锈", ["銻"]="锑", ["銼"]="锉", ["銾"]="𰾁", ["鋁"]="铝", ["鋂"]="𰾄", ["鋃"]="锒", ["鋅"]="锌", ["鋇"]="钡", ["鋉"]="𨱈", ["鋊"]="𰾆", ["鋋"]="𮣴", ["鋌"]="铤", ["鋍"]="𰾀", ["鋏"]="铗", ["鋐"]="𬭎", ["鋑"]="𮸏", ["鋒"]="锋", ["鋓"]="𮸊", ["鋕"]="𲇽", ["鋗"]="𫓶", ["鋘"]="𬭌", ["鋙"]="铻", ["鋜"]="𰾃", ["鋝"]="锊", ["鋟"]="锓", ["鋠"]="𫓵", ["鋡"]="𰾅", ["鋣"]="铘", ["鋤"]="锄", ["鋥"]="锃", ["鋦"]="锔", ["鋧"]="𰽢", ["鋨"]="锇", ["鋩"]="铓", ["鋪"]="铺", ["鋭"]="锐", ["鋮"]="铖", ["鋯"]="锆", ["鋰"]="锂", ["鋱"]="铽", ["鋲"]="𲇿", ["鋶"]="锍", ["鋸"]="锯", ["鋹"]="𬬮", ["鋼"]="钢", ["鋾"]="𰾏", ["鋿"]="𲈆", ["錀"]="𬬭", ["錁"]="锞", ["錂"]="𨱋", ["錄"]="录", ["錆"]="锖", ["錇"]="锫", ["錈"]="锩", ["錋"]="𬭖", ["錍"]="𰾎", ["錏"]="铔", ["錐"]="锥", ["錑"]="𬭜", ["錒"]="锕", ["錔"]="𰾓", ["錕"]="锟", ["錗"]="𬭗", ["錘"]="锤", ["錙"]="锱", ["錚"]="铮", ["錛"]="锛", ["錜"]="𫓻", ["錝"]="𫓽", ["錞"]="𬭚", ["錟"]="锬", ["錠"]="锭", ["錡"]="锜", ["錢"]="钱", ["錣"]="𮣵", ["錤"]="𫓹", ["錥"]="𫓾", ["錦"]="锦", ["錧"]="𰾒", ["錨"]="锚", ["錩"]="锠", ["錪"]="𬭓", ["錫"]="锡", ["錬"]="𲇷", ["錭"]="𬭕", ["錮"]="锢", ["錯"]="错", ["録"]="录", ["錳"]="锰", ["錴"]="𲈁", ["錶"]="表", ["錸"]="铼", ["錺"]="𮸐", ["錽"]="𫓸", ["鍀"]="锝", ["鍁"]="锨", ["鍂"]="𰾑", ["鍃"]="锪", ["鍄"]="𨱉", ["鍆"]="钔", ["鍇"]="锴", ["鍈"]="锳", ["鍉"]="𫔂", ["鍊"]="炼", ["鍋"]="锅", ["鍍"]="镀", ["鍏"]="𬬬", ["鍐"]="𰾞", ["鍑"]="𰾟", ["鍒"]="𫔄", ["鍔"]="锷", ["鍕"]="𮸈", ["鍖"]="𰾘", ["鍘"]="铡", ["鍚"]="钖", ["鍛"]="锻", ["鍜"]="𰾤", ["鍝"]="𰾙", ["鍟"]="𰾝", ["鍠"]="锽", ["鍡"]="𰾚", ["鍢"]="𮸕", ["鍣"]="𬭡", ["鍤"]="锸", ["鍥"]="锲", ["鍦"]="𰾢", ["鍧"]="𰾡", ["鍨"]="𰾥", ["鍩"]="锘", ["鍫"]="锹", ["鍬"]="锹", ["鍭"]="𬭤", ["鍮"]="𨱎", ["鍰"]="锾", ["鍱"]="𰾕", ["鍳"]="鉴", ["鍴"]="𰾜", ["鍵"]="键", ["鍶"]="锶", ["鍷"]="𲈌", ["鍸"]="𲈋", ["鍹"]="𲈎", ["鍺"]="锗", ["鍼"]="针", ["鍾"]="钟", ["鎁"]="𲈍", ["鎂"]="镁", ["鎄"]="锿", ["鎅"]="𰾛", ["鎇"]="镅", ["鎈"]="𫟿", ["鎉"]="𰾬", ["鎊"]="镑", ["鎋"]="𬭪", ["鎌"]="镰", ["鎍"]="𫔅", ["鎑"]="𰾩", ["鎒"]="𬭦", ["鎓"]="𬭩", ["鎔"]="镕", ["鎕"]="𰾯", ["鎖"]="锁", ["鎗"]="枪", ["鎘"]="镉", ["鎙"]="𫔈", ["鎚"]="锤", ["鎛"]="镈", ["鎝"]="𨱏", ["鎞"]="𫔇", ["鎡"]="镃", ["鎢"]="钨", ["鎣"]="蓥", ["鎤"]="𲈒", ["鎦"]="镏", ["鎧"]="铠", ["鎩"]="铩", ["鎪"]="锼", ["鎬"]="镐", ["鎭"]="镇", ["鎮"]="镇", ["鎯"]="𨱍", ["鎰"]="镒", ["鎲"]="镋", ["鎳"]="镍", ["鎵"]="镓", ["鎶"]="鿔", ["鎷"]="𨰾", ["鎸"]="镌", ["鎻"]="锁", ["鎿"]="镎", ["鏁"]="𬭲", ["鏂"]="𰽜", ["鏃"]="镞", ["鏄"]="𲇲", ["鏆"]="𨱌", ["鏇"]="旋", ["鏈"]="链", ["鏉"]="𨱒", ["鏋"]="𬭮", ["鏌"]="镆", ["鏍"]="镙", ["鏏"]="𬭬", ["鏐"]="镠", ["鏑"]="镝", ["鏒"]="𬭝", ["鏓"]="𰾱", ["鏔"]="𬭰", ["鏕"]="𰾲", ["鏗"]="铿", ["鏘"]="锵", ["鏙"]="𰾰", ["鏚"]="𬭭", ["鏛"]="𮸟", ["鏜"]="镗", ["鏝"]="镘", ["鏞"]="镛", ["鏟"]="铲", ["鏡"]="镜", ["鏢"]="镖", ["鏤"]="镂", ["鏦"]="𫓩", ["鏨"]="錾", ["鏩"]="𰾌", ["鏰"]="镚", ["鏱"]="𲈗", ["鏳"]="𲈜", ["鏴"]="𲈝", ["鏵"]="铧", ["鏷"]="镤", ["鏸"]="𰾶", ["鏹"]="镪", ["鏺"]="䥽", ["鏻"]="𬭸", ["鏽"]="锈", ["鏾"]="𫔌", ["鐀"]="𬭢", ["鐁"]="𰾴", ["鐃"]="铙", ["鐄"]="𨱑", ["鐇"]="𫔍", ["鐈"]="𫓱", ["鐉"]="𰾼", ["鐋"]="铴", ["鐍"]="𫔎", ["鐎"]="𨱓", ["鐏"]="𨱔", ["鐐"]="镣", ["鐒"]="铹", ["鐓"]="镦", ["鐔"]="镡", ["鐕"]="𰾷", ["鐖"]="𰽕", ["鐘"]="钟", ["鐙"]="镫", ["鐛"]="𲈚", ["鐝"]="镢", ["鐠"]="镨", ["鐤"]="𰾸", ["鐥"]="䦅", ["鐦"]="锎", ["鐧"]="锏", ["鐨"]="镄", ["鐩"]="𬭼", ["鐪"]="𫓺", ["鐫"]="镌", ["鐬"]="𰽷", ["鐮"]="镰", ["鐯"]="䦃", ["鐰"]="𲈞", ["鐱"]="𲈀", ["鐲"]="镯", ["鐳"]="镭", ["鐴"]="𬭽", ["鐵"]="铁", ["鐶"]="镮", ["鐸"]="铎", ["鐹"]="𰽾", ["鐺"]="铛", ["鐻"]="𮣷", ["鐼"]="𫔁", ["鐽"]="𫟼", ["鐿"]="镱", ["鑀"]="𰾭", ["鑄"]="铸", ["鑇"]="𬭉", ["鑈"]="鿭", ["鑉"]="𫠁", ["鑊"]="镬", ["鑋"]="𰼻", ["鑌"]="镔", ["鑍"]="𲇑", ["鑏"]="𬬾", ["鑐"]="𰿂", ["鑑"]="鉴", ["鑒"]="鉴", ["鑔"]="镲", ["鑕"]="锧", ["鑖"]="𰿃", ["鑘"]="𰿄", ["鑛"]="矿", ["鑞"]="镴", ["鑠"]="铄", ["鑡"]="𬭔", ["鑢"]="𮣶", ["鑣"]="镳", ["鑤"]="刨", ["鑥"]="镥", ["鑧"]="𮸠", ["鑨"]="𰽦", ["鑪"]="𬬻", ["鑭"]="镧", ["鑮"]="𬮁", ["鑯"]="𰿈", ["鑰"]="钥", ["鑱"]="镵", ["鑲"]="镶", ["鑴"]="𫔔", ["鑵"]="罐", ["鑷"]="镊", ["鑸"]="𰿉", ["鑹"]="镩", ["鑼"]="锣", ["鑽"]="钻", ["鑾"]="銮", ["鑿"]="凿", ["钀"]="𰾾", ["钁"]="䦆", ["钂"]="镋", ["钃"]="𰾽", ["長"]="长", ["門"]="门", ["閂"]="闩", ["閃"]="闪", ["閅"]="𮤫", ["閆"]="闫", ["閈"]="闬", ["閉"]="闭", ["開"]="开", ["閌"]="闶", ["閍"]="𨸂", ["閎"]="闳", ["閏"]="闰", ["閐"]="𨸃", ["閑"]="闲", ["閒"]="闲", ["間"]="间", ["閔"]="闵", ["閕"]="𰿩", ["閖"]="𲈵", ["閗"]="𫔯", ["閘"]="闸", ["閙"]="闹", ["閛"]="𰿬", ["閜"]="𬮠", ["閝"]="𫠂", ["閞"]="𫔰", ["閟"]="𮤲", ["閡"]="阂", ["閣"]="阁", ["閤"]="合", ["閥"]="阀", ["閦"]="𬮥", ["閧"]="哄", ["閨"]="闺", ["閩"]="闽", ["閪"]="𲈹", ["閫"]="阃", ["閬"]="阆", ["閭"]="闾", ["閱"]="阅", ["閲"]="阅", ["閵"]="𫔴", ["閶"]="阊", ["閷"]="𰿳", ["閹"]="阉", ["閻"]="阎", ["閼"]="阏", ["閽"]="阍", ["閾"]="阈", ["閿"]="阌", ["闀"]="𲉁", ["闃"]="阒", ["闄"]="𬮲", ["闆"]="板", ["闇"]="暗", ["闈"]="闱", ["闉"]="𬮱", ["闊"]="阔", ["闋"]="阕", ["闌"]="阑", ["闍"]="阇", ["闐"]="阗", ["闑"]="𫔶", ["闒"]="阘", ["闓"]="闿", ["闔"]="阖", ["闕"]="阙", ["闖"]="闯", ["闚"]="窥", ["闛"]="𰿺", ["關"]="关", ["闞"]="阚", ["闟"]="𰿻", ["闠"]="阓", ["闡"]="阐", ["闢"]="辟", ["闤"]="阛", ["闥"]="闼", ["阬"]="坑", ["陘"]="陉", ["陝"]="陕", ["陞"]="升", ["陣"]="阵", ["陯"]="𲉉", ["陰"]="阴", ["陳"]="陈", ["陸"]="陆", ["陻"]="堙", ["陽"]="阳", ["隉"]="陧", ["隊"]="队", ["階"]="阶", ["隑"]="𬮿", ["隕"]="陨", ["隖"]="坞", ["際"]="际", ["隣"]="邻", ["隤"]="𬯎", ["隨"]="随", ["險"]="险", ["隫"]="𱀡", ["隮"]="𬯀", ["隯"]="陦", ["隱"]="隐", ["隴"]="陇", ["隷"]="隶", ["隸"]="隶", ["隻"]="只", ["雋"]="隽", ["雖"]="虽", ["雙"]="双", ["雛"]="雏", ["雜"]="杂", ["雝"]="雍", ["雞"]="鸡", ["離"]="离", ["難"]="难", ["雰"]="氛", ["雲"]="云", ["電"]="电", ["霑"]="沾", ["霢"]="霡", ["霣"]="𫕥", ["霧"]="雾", ["霼"]="𪵣", ["霽"]="霁", ["靂"]="雳", ["靄"]="霭", ["靅"]="𰷦", ["靆"]="叇", ["靈"]="灵", ["靉"]="叆", ["靑"]="青", ["靚"]="靓", ["靜"]="静", ["靝"]="靔", ["靦"]="䩄", ["靧"]="𫖃", ["靨"]="靥", ["靭"]="韧", ["鞀"]="鼗", ["鞏"]="巩", ["鞝"]="绱", ["鞦"]="秋", ["鞸"]="𱁴", ["鞻"]="𱁺", ["鞼"]="𱁹", ["鞽"]="鞒", ["鞾"]="靴", ["鞿"]="𩉜", ["韁"]="缰", ["韃"]="鞑", ["韆"]="千", ["韇"]="𱁷", ["韈"]="袜", ["韉"]="鞯", ["韊"]="𱁾", ["韋"]="韦", ["韌"]="韧", ["韍"]="韨", ["韏"]="𱂇", ["韐"]="𱂆", ["韒"]="𱂉", ["韓"]="韩", ["韔"]="𮧴", ["韗"]="𱂈", ["韘"]="𱂊", ["韙"]="韪", ["韚"]="𫠅", ["韛"]="𫖔", ["韜"]="韬", ["韝"]="𫖕", ["韞"]="韫", ["韠"]="𫖒", ["韡"]="𮧵", ["韢"]="𬰶", ["韣"]="𱂋", ["韮"]="韭", ["韻"]="韵", ["響"]="响", ["頁"]="页", ["頂"]="顶", ["頃"]="顷", ["頄"]="𬱓", ["項"]="项", ["順"]="顺", ["頇"]="顸", ["須"]="须", ["頊"]="顼", ["頌"]="颂", ["頍"]="𫠆", ["頎"]="颀", ["頏"]="颃", ["預"]="预", ["頑"]="顽", ["頒"]="颁", ["頓"]="顿", ["頔"]="𬱖", ["頕"]="𬱗", ["頖"]="𬱙", ["頗"]="颇", ["領"]="领", ["頙"]="𲊺", ["頛"]="𬱜", ["頜"]="颌", ["頞"]="𱂨", ["頟"]="额", ["頠"]="𬱟", ["頡"]="颉", ["頢"]="𬱠", ["頤"]="颐", ["頦"]="颏", ["頩"]="𱂦", ["頪"]="𱂧", ["頫"]="𫖯", ["頭"]="头", ["頮"]="颒", ["頯"]="𱂬", ["頰"]="颊", ["頲"]="颋", ["頳"]="𲊼", ["頴"]="颖", ["頵"]="𫖳", ["頷"]="颔", ["頸"]="颈", ["頹"]="颓", ["頻"]="频", ["頽"]="颓", ["顀"]="𱂭", ["顁"]="𬱫", ["顃"]="𩖖", ["顄"]="𱂰", ["顅"]="𫖶", ["顆"]="颗", ["顇"]="悴", ["顉"]="𰽳", ["顊"]="𬱪", ["顋"]="腮", ["題"]="题", ["額"]="额", ["顎"]="颚", ["顏"]="颜", ["顐"]="𬱢", ["顑"]="𱂱", ["顒"]="颙", ["顓"]="颛", ["顔"]="颜", ["顖"]="𱂶", ["顗"]="𫖮", ["願"]="愿", ["顙"]="颡", ["顛"]="颠", ["顜"]="𱂴", ["顝"]="𱂵", ["類"]="类", ["顠"]="𱂺", ["顢"]="颟", ["顣"]="𫖹", ["顤"]="𱂣", ["顥"]="颢", ["顦"]="憔", ["顧"]="顾", ["顩"]="𱂫", ["顪"]="𱂤", ["顫"]="颤", ["顬"]="颥", ["顮"]="𱂸", ["顯"]="显", ["顰"]="颦", ["顱"]="颅", ["顳"]="颞", ["顴"]="颧", ["風"]="风", ["颩"]="𱃔", ["颬"]="𱃕", ["颭"]="飐", ["颮"]="飑", ["颯"]="飒", ["颰"]="𩙥", ["颱"]="台", ["颲"]="𱃘", ["颳"]="刮", ["颴"]="𬱽", ["颶"]="飓", ["颷"]="𩙪", ["颸"]="飔", ["颹"]="𬱵", ["颺"]="飏", ["颻"]="飖", ["颼"]="飕", ["颽"]="𬱼", ["颾"]="𩙫", ["颿"]="帆", ["飀"]="飗", ["飁"]="𱃟", ["飂"]="𮨵", ["飃"]="飘", ["飄"]="飘", ["飆"]="飙", ["飇"]="𱃠", ["飈"]="飚", ["飉"]="𬲅", ["飊"]="𮸼", ["飋"]="𫗋", ["飍"]="𱃝", ["飛"]="飞", ["飠"]="饣", ["飢"]="饥", ["飣"]="饤", ["飥"]="饦", ["飦"]="𫗞", ["飩"]="饨", ["飪"]="饪", ["飫"]="饫", ["飭"]="饬", ["飯"]="饭", ["飱"]="飧", ["飲"]="饮", ["飴"]="饴", ["飵"]="𫗢", ["飶"]="𫗣", ["飷"]="𬲭", ["飼"]="饲", ["飽"]="饱", ["飾"]="饰", ["飿"]="饳", ["餀"]="𮩜", ["餂"]="𱃺", ["餃"]="饺", ["餄"]="饸", ["餅"]="饼", ["餈"]="糍", ["餉"]="饷", ["養"]="养", ["餌"]="饵", ["餎"]="饹", ["餏"]="饻", ["餑"]="饽", ["餒"]="馁", ["餓"]="饿", ["餔"]="𫗦", ["餕"]="馂", ["餖"]="饾", ["餗"]="𫗧", ["餘"]="余", ["餚"]="肴", ["餛"]="馄", ["餜"]="馃", ["餞"]="饯", ["餟"]="𬳂", ["餡"]="馅", ["餣"]="𬲼", ["餤"]="𱃿", ["餦"]="𫗠", ["餧"]="喂", ["館"]="馆", ["餩"]="𱃽", ["餪"]="𫗬", ["餫"]="𫗥", ["餬"]="糊", ["餭"]="𫗮", ["餯"]="𱄄", ["餰"]="𬳆", ["餱"]="糇", ["餲"]="𮩝", ["餳"]="饧", ["餴"]="𱃼", ["餵"]="喂", ["餶"]="馉", ["餷"]="馇", ["餸"]="𩠌", ["餹"]="糖", ["餺"]="馎", ["餻"]="糕", ["餼"]="饩", ["餽"]="馈", ["餾"]="馏", ["餿"]="馊", ["饀"]="𬳊", ["饁"]="馌", ["饃"]="馍", ["饅"]="馒", ["饆"]="𮩛", ["饇"]="𱃲", ["饈"]="馐", ["饉"]="馑", ["饊"]="馓", ["饋"]="馈", ["饌"]="馔", ["饍"]="膳", ["饎"]="𱄆", ["饐"]="𮩞", ["饑"]="饥", ["饒"]="饶", ["饗"]="飨", ["饘"]="𫗴", ["饙"]="𱄀", ["饛"]="𱄈", ["饜"]="餍", ["饝"]="馍", ["饞"]="馋", ["饟"]="饷", ["饠"]="𫗩", ["饡"]="𱄊", ["饢"]="馕", ["馩"]="𬳟", ["馪"]="𮹀", ["馬"]="马", ["馭"]="驭", ["馮"]="冯", ["馯"]="𫘛", ["馱"]="驮", ["馲"]="𱄽", ["馳"]="驰", ["馴"]="驯", ["馵"]="𱄼", ["馹"]="驲", ["馺"]="𱅂", ["馼"]="𫘜", ["馽"]="𱅁", ["駁"]="驳", ["駂"]="𱅀", ["駃"]="𫘝", ["駉"]="𬳶", ["駊"]="𫘟", ["駍"]="𬳴", ["駎"]="𩧨", ["駏"]="𱅃", ["駐"]="驻", ["駑"]="驽", ["駒"]="驹", ["駓"]="𬳵", ["駔"]="驵", ["駕"]="驾", ["駖"]="𲌅", ["駗"]="𱅇", ["駘"]="骀", ["駙"]="驸", ["駚"]="𩧫", ["駛"]="驶", ["駜"]="𱅈", ["駝"]="驼", ["駞"]="驼", ["駟"]="驷", ["駡"]="骂", ["駢"]="骈", ["駣"]="𱅏", ["駤"]="𫘠", ["駥"]="𱅉", ["駦"]="𱅑", ["駧"]="𩧲", ["駩"]="𩧴", ["駪"]="𬳽", ["駫"]="𫘡", ["駬"]="𱅋", ["駭"]="骇", ["駮"]="驳", ["駰"]="骃", ["駱"]="骆", ["駴"]="𮪢", ["駶"]="𩧺", ["駷"]="𱅔", ["駸"]="骎", ["駹"]="𮪡", ["駺"]="𬴀", ["駻"]="𫘣", ["駼"]="𬳿", ["駽"]="𱅖", ["駾"]="𱅙", ["駿"]="骏", ["騀"]="𱅗", ["騁"]="骋", ["騂"]="骍", ["騃"]="𫘤", ["騄"]="𫘧", ["騅"]="骓", ["騆"]="𮹋", ["騇"]="𱅚", ["騉"]="𫘥", ["騊"]="𫘦", ["騋"]="𱅕", ["騌"]="鬃", ["騍"]="骒", ["騎"]="骑", ["騏"]="骐", ["騐"]="验", ["騑"]="𬴂", ["騔"]="𩨀", ["騕"]="𱅜", ["騖"]="骛", ["騗"]="𱅝", ["騙"]="骗", ["騚"]="𩨊", ["騜"]="𫘩", ["騝"]="𩨃", ["騞"]="𬴃", ["騟"]="𩨈", ["騠"]="𫘨", ["騢"]="𱅞", ["騣"]="鬃", ["騤"]="骙", ["騥"]="𱅟", ["騧"]="䯄", ["騩"]="𱅡", ["騪"]="𩨄", ["騫"]="骞", ["騬"]="𱅢", ["騭"]="骘", ["騮"]="骝", ["騯"]="𬴅", ["騰"]="腾", ["騱"]="𫘬", ["騲"]="𮪤", ["騳"]="𱄿", ["騴"]="𫘫", ["騵"]="𫘪", ["騶"]="驺", ["騷"]="骚", ["騸"]="骟", ["騹"]="𬴆", ["騺"]="𱅊", ["騻"]="𫘭", ["騼"]="𫠋", ["騽"]="𱅩", ["騾"]="骡", ["驀"]="蓦", ["驁"]="骜", ["驂"]="骖", ["驃"]="骠", ["驄"]="骢", ["驅"]="驱", ["驈"]="𱅫", ["驉"]="𱅧", ["驊"]="骅", ["驋"]="𩧯", ["驌"]="骕", ["驍"]="骁", ["驎"]="𬴊", ["驏"]="骣", ["驐"]="𮪥", ["驒"]="𱅛", ["驓"]="𫘯", ["驔"]="𱅪", ["驕"]="骄", ["驖"]="𬴋", ["驗"]="验", ["驘"]="骡", ["驙"]="𫘰", ["驚"]="惊", ["驛"]="驿", ["驞"]="𱅤", ["驟"]="骤", ["驠"]="𱅬", ["驡"]="𱅅", ["驢"]="驴", ["驤"]="骧", ["驥"]="骥", ["驦"]="骦", ["驨"]="𫘱", ["驩"]="欢", ["驪"]="骊", ["驫"]="骉", ["骯"]="肮", ["骽"]="腿", ["骾"]="鲠", ["髈"]="膀", ["髏"]="髅", ["髐"]="𱅮", ["髒"]="脏", ["體"]="体", ["髕"]="髌", ["髖"]="髋", ["髪"]="发", ["髮"]="发", ["鬆"]="松", ["鬉"]="鬃", ["鬍"]="胡", ["鬖"]="𩭹", ["鬗"]="𱆆", ["鬚"]="须", ["鬜"]="𱆁", ["鬞"]="𬴩", ["鬠"]="𫘽", ["鬡"]="𮫂", ["鬢"]="鬓", ["鬥"]="斗", ["鬧"]="闹", ["鬨"]="哄", ["鬩"]="阋", ["鬭"]="斗", ["鬮"]="阄", ["鬱"]="郁", ["鬹"]="鬶", ["鬺"]="𱆌", ["魎"]="魉", ["魗"]="𱆛", ["魘"]="魇", ["魚"]="鱼", ["魛"]="鱽", ["魜"]="𬶁", ["魝"]="𬶀", ["魟"]="𫚉", ["魠"]="𱇏", ["魡"]="𬶄", ["魢"]="鱾", ["魣"]="𮬛", ["魥"]="𩽹", ["魦"]="𫚌", ["魧"]="𱇘", ["魨"]="鲀", ["魪"]="𬶇", ["魫"]="𱇙", ["魬"]="𱇖", ["魭"]="𱇐", ["魮"]="𱇒", ["魯"]="鲁", ["魱"]="𱇓", ["魴"]="鲂", ["魵"]="𫚍", ["魶"]="𱇔", ["魷"]="鱿", ["魺"]="鲄", ["魻"]="𱇟", ["魼"]="𱇜", ["魽"]="𫠐", ["魾"]="𱇝", ["鮀"]="𬶍", ["鮁"]="鲅", ["鮂"]="𱇠", ["鮃"]="鲆", ["鮄"]="𫚒", ["鮅"]="𫚑", ["鮆"]="𫚖", ["鮇"]="𱇛", ["鮈"]="𬶋", ["鮊"]="鲌", ["鮋"]="鲉", ["鮌"]="𱇢", ["鮍"]="鲏", ["鮎"]="鲇", ["鮏"]="𱇡", ["鮐"]="鲐", ["鮑"]="鲍", ["鮒"]="鲋", ["鮓"]="鲊", ["鮕"]="𲍌", ["鮗"]="鿴", ["鮘"]="𬶌", ["鮚"]="鲒", ["鮛"]="𱇨", ["鮜"]="鲘", ["鮝"]="鲞", ["鮞"]="鲕", ["鮟"]="𩽾", ["鮠"]="𬶏", ["鮡"]="𬶐", ["鮣"]="䲟", ["鮤"]="𫚓", ["鮥"]="𱇪", ["鮦"]="鲖", ["鮧"]="𱇧", ["鮨"]="𮬜", ["鮪"]="鲔", ["鮫"]="鲛", ["鮬"]="𱇦", ["鮭"]="鲑", ["鮮"]="鲜", ["鮯"]="𫚗", ["鮰"]="𫚔", ["鮳"]="鲓", ["鮵"]="𫚛", ["鮶"]="鲪", ["鮷"]="𬶕", ["鮸"]="𩾃", ["鮹"]="𱇯", ["鮺"]="鲝", ["鮿"]="𫚚", ["鯀"]="鲧", ["鯁"]="鲠", ["鯄"]="𩾁", ["鯅"]="𱈁", ["鯆"]="𫚙", ["鯇"]="鲩", ["鯈"]="𱇱", ["鯉"]="鲤", ["鯊"]="鲨", ["鯒"]="鲬", ["鯔"]="鲻", ["鯕"]="鲯", ["鯖"]="鲭", ["鯗"]="鲞", ["鯚"]="𱇺", ["鯛"]="鲷", ["鯝"]="鲴", ["鯞"]="𫚡", ["鯠"]="𱇭", ["鯡"]="鲱", ["鯢"]="鲵", ["鯤"]="鲲", ["鯥"]="𱇶", ["鯦"]="𱇼", ["鯧"]="鲳", ["鯨"]="鲸", ["鯩"]="𱇗", ["鯪"]="鲮", ["鯫"]="鲰", ["鯬"]="𫚞", ["鯮"]="𱇾", ["鯰"]="鲶", ["鯱"]="𩾇", ["鯴"]="鲺", ["鯶"]="𩽼", ["鯷"]="鳀", ["鯸"]="𱈄", ["鯻"]="𬶟", ["鯼"]="𱈅", ["鯽"]="鲫", ["鯾"]="𫚣", ["鯿"]="鳊", ["鰁"]="鳈", ["鰂"]="鲗", ["鰃"]="鳂", ["鰅"]="𱈂", ["鰆"]="䲠", ["鰇"]="𬶧", ["鰈"]="鲽", ["鰉"]="鳇", ["鰊"]="𬶠", ["鰋"]="𫚢", ["鰌"]="鳅", ["鰍"]="鳅", ["鰏"]="鲾", ["鰐"]="鳄", ["鰑"]="𫚊", ["鰒"]="鳆", ["鰓"]="鳃", ["鰕"]="𫚥", ["鰗"]="𬶞", ["鰛"]="鳁", ["鰜"]="鳒", ["鰝"]="𱈋", ["鰟"]="鳑", ["鰠"]="鳋", ["鰡"]="𱈊", ["鰣"]="鲥", ["鰤"]="𫚕", ["鰥"]="鳏", ["鰦"]="𫚤", ["鰧"]="䲢", ["鰨"]="鳎", ["鰩"]="鳐", ["鰫"]="𫚦", ["鰬"]="𱈉", ["鰭"]="鳍", ["鰮"]="鳁", ["鰯"]="𱈍", ["鰱"]="鲢", ["鰲"]="鳌", ["鰳"]="鳓", ["鰴"]="𱈑", ["鰵"]="鳘", ["鰶"]="𬶭", ["鰷"]="鲦", ["鰹"]="鲣", ["鰺"]="鲹", ["鰻"]="鳗", ["鰼"]="鳛", ["鰽"]="𫚧", ["鰾"]="鳔", ["鰿"]="𱇵", ["鱀"]="𬶨", ["鱁"]="𱈏", ["鱂"]="鳉", ["鱃"]="𱈌", ["鱄"]="𫚋", ["鱅"]="鳙", ["鱆"]="𫠒", ["鱇"]="𩾌", ["鱈"]="鳕", ["鱉"]="鳖", ["鱊"]="𫚪", ["鱋"]="𬶬", ["鱌"]="𬶲", ["鱍"]="𱇣", ["鱎"]="𱇩", ["鱏"]="𱈓", ["鱐"]="𱇿", ["鱑"]="𬶫", ["鱒"]="鳟", ["鱓"]="鳝", ["鱔"]="鳝", ["鱕"]="𱈕", ["鱖"]="鳜", ["鱗"]="鳞", ["鱘"]="鲟", ["鱙"]="𲍑", ["鱚"]="𬶮", ["鱝"]="鲼", ["鱞"]="𬶵", ["鱟"]="鲎", ["鱠"]="鲙", ["鱢"]="𫚫", ["鱣"]="鳣", ["鱤"]="鳡", ["鱥"]="𮬝", ["鱦"]="𱇸", ["鱧"]="鳢", ["鱨"]="鲿", ["鱬"]="𱈗", ["鱭"]="鲚", ["鱮"]="𫚈", ["鱯"]="鳠", ["鱲"]="𫚭", ["鱴"]="𱈙", ["鱵"]="𮬤", ["鱷"]="鳄", ["鱸"]="鲈", ["鱹"]="𬶺", ["鱺"]="鲡", ["鱻"]="鲜", ["鳥"]="鸟", ["鳦"]="𱉇", ["鳧"]="凫", ["鳩"]="鸠", ["鳬"]="凫", ["鳭"]="𱉈", ["鳱"]="𱉊", ["鳲"]="鸤", ["鳳"]="凤", ["鳴"]="鸣", ["鳶"]="鸢", ["鳷"]="𫛛", ["鳸"]="𱉓", ["鳺"]="𱉎", ["鳻"]="𱉑", ["鳼"]="𪉃", ["鳽"]="𫛚", ["鳾"]="䴓", ["鳿"]="𱉍", ["鴀"]="𫛜", ["鴁"]="𮭢", ["鴂"]="𱉔", ["鴃"]="𫛞", ["鴅"]="𫛝", ["鴆"]="鸩", ["鴇"]="鸨", ["鴉"]="鸦", ["鴋"]="𲍮", ["鴍"]="𬸀", ["鴐"]="𫛤", ["鴒"]="鸰", ["鴓"]="𮭤", ["鴔"]="𫛡", ["鴕"]="鸵", ["鴗"]="𫁡", ["鴘"]="𱉡", ["鴙"]="𱉛", ["鴚"]="𱉕", ["鴛"]="鸳", ["鴝"]="鸲", ["鴞"]="鸮", ["鴟"]="鸱", ["鴠"]="𱉗", ["鴡"]="𱉘", ["鴢"]="𱉢", ["鴣"]="鸪", ["鴥"]="𫛣", ["鴦"]="鸯", ["鴨"]="鸭", ["鴩"]="𱉚", ["鴫"]="𮴿", ["鴬"]="鸴", ["鴮"]="𫛦", ["鴯"]="鸸", ["鴰"]="鸹", ["鴱"]="𱉪", ["鴲"]="𪉆", ["鴳"]="𫛩", ["鴴"]="鸻", ["鴶"]="𱉥", ["鴷"]="䴕", ["鴸"]="𱉫", ["鴹"]="𱉯", ["鴺"]="𱉩", ["鴻"]="鸿", ["鴽"]="𫛪", ["鴾"]="𱉲", ["鴿"]="鸽", ["鵀"]="𬸊", ["鵁"]="䴔", ["鵂"]="鸺", ["鵃"]="鸼", ["鵄"]="𬸈", ["鵅"]="𱉮", ["鵉"]="鸾", ["鵊"]="𫛥", ["鵋"]="𱉽", ["鵌"]="𱉸", ["鵎"]="𱉻", ["鵏"]="𬷕", ["鵐"]="鹀", ["鵑"]="鹃", ["鵒"]="鹆", ["鵓"]="鹁", ["鵔"]="𱉿", ["鵕"]="𱉾", ["鵖"]="𱉝", ["鵗"]="𱉹", ["鵙"]="𱉐", ["鵚"]="𪉍", ["鵛"]="𱉠", ["鵜"]="鹈", ["鵝"]="鹅", ["鵞"]="鹅", ["鵟"]="𫛭", ["鵠"]="鹄", ["鵡"]="鹉", ["鵧"]="𫛨", ["鵩"]="𫛳", ["鵪"]="鹌", ["鵫"]="𫛱", ["鵬"]="鹏", ["鵮"]="鹐", ["鵯"]="鹎", ["鵰"]="雕", ["鵱"]="𱊀", ["鵲"]="鹊", ["鵳"]="𱊋", ["鵴"]="𱊇", ["鵵"]="𱊆", ["鵶"]="鸦", ["鵷"]="鹓", ["鵸"]="𱊁", ["鵹"]="𱊃", ["鵻"]="𱊅", ["鵼"]="𱊊", ["鵽"]="𱊍", ["鵾"]="鹍", ["鶀"]="𬸒", ["鶂"]="𱊈", ["鶃"]="𱊄", ["鶄"]="䴖", ["鶅"]="𱊎", ["鶆"]="𱉵", ["鶇"]="鸫", ["鶉"]="鹑", ["鶊"]="鹒", ["鶋"]="𱊌", ["鶌"]="𫛵", ["鶒"]="𫛶", ["鶓"]="鹋", ["鶔"]="𱊗", ["鶖"]="鹙", ["鶗"]="𫛸", ["鶘"]="鹕", ["鶙"]="𱊕", ["鶚"]="鹗", ["鶛"]="𱊐", ["鶝"]="𱊏", ["鶞"]="𱊑", ["鶟"]="𱊖", ["鶠"]="𬸘", ["鶡"]="鹖", ["鶢"]="𱊒", ["鶣"]="𬸜", ["鶤"]="𱉱", ["鶥"]="鹛", ["鶦"]="𫛷", ["鶧"]="𲎀", ["鶨"]="𱊘", ["鶩"]="鹜", ["鶪"]="䴗", ["鶬"]="鸧", ["鶭"]="𫛯", ["鶯"]="莺", ["鶰"]="𫛫", ["鶱"]="𬸣", ["鶲"]="鹟", ["鶴"]="鹤", ["鶵"]="𬸅", ["鶶"]="𱊝", ["鶷"]="𱊟", ["鶹"]="鹠", ["鶺"]="鹡", ["鶻"]="鹘", ["鶼"]="鹣", ["鶽"]="𱊛", ["鶿"]="鹚", ["鷀"]="鹚", ["鷁"]="鹢", ["鷂"]="鹞", ["鷃"]="𮭨", ["鷄"]="鸡", ["鷅"]="𫛽", ["鷇"]="𬆮", ["鷉"]="䴘", ["鷊"]="鹝", ["鷋"]="𱊠", ["鷌"]="𲍬", ["鷎"]="𬸢", ["鷏"]="𱊚", ["鷐"]="𫜀", ["鷑"]="𱊢", ["鷒"]="𱉏", ["鷓"]="鹧", ["鷔"]="𪉑", ["鷕"]="𱊡", ["鷖"]="鹥", ["鷗"]="鸥", ["鷙"]="鸷", ["鷚"]="鹨", ["鷛"]="𱊤", ["鷜"]="𬸞", ["鷝"]="𲍴", ["鷞"]="𮭪", ["鷟"]="𬸦", ["鷢"]="𱊧", ["鷣"]="𫜃", ["鷤"]="𫛴", ["鷥"]="鸶", ["鷦"]="鹪", ["鷨"]="𪉊", ["鷩"]="𫜁", ["鷫"]="鹔", ["鷭"]="𬸪", ["鷮"]="𱉬", ["鷯"]="鹩", ["鷰"]="燕", ["鷲"]="鹫", ["鷳"]="鹇", ["鷴"]="鹇", ["鷵"]="𱊩", ["鷶"]="𱉳", ["鷷"]="𫜄", ["鷸"]="鹬", ["鷹"]="鹰", ["鷺"]="鹭", ["鷼"]="𲍻", ["鷽"]="鸴", ["鷾"]="𱊰", ["鷿"]="䴙", ["鸀"]="𱊬", ["鸁"]="𱊮", ["鸂"]="㶉", ["鸃"]="𱉌", ["鸄"]="𱊯", ["鸅"]="𱉟", ["鸆"]="𱊫", ["鸇"]="鹯", ["鸉"]="𱉴", ["鸊"]="䴙", ["鸋"]="𫛢", ["鸌"]="鹱", ["鸍"]="𲍰", ["鸎"]="莺", ["鸏"]="鹲", ["鸐"]="𱊱", ["鸑"]="𬸚", ["鸓"]="𱊳", ["鸕"]="鸬", ["鸗"]="𫛟", ["鸘"]="鹴", ["鸙"]="𱊵", ["鸚"]="鹦", ["鸛"]="鹳", ["鸜"]="𬸱", ["鸝"]="鹂", ["鸞"]="鸾", ["鹵"]="卤", ["鹹"]="咸", ["鹺"]="鹾", ["鹼"]="碱", ["鹽"]="盐", ["麐"]="麟", ["麗"]="丽", ["麞"]="獐", ["麡"]="𬸾", ["麥"]="麦", ["麧"]="𱋇", ["麨"]="𪎊", ["麩"]="麸", ["麪"]="面", ["麫"]="面", ["麬"]="𤿲", ["麭"]="𮮆", ["麮"]="𱋋", ["麯"]="曲", ["麰"]="𮮇", ["麱"]="𱋖", ["麳"]="𪎌", ["麴"]="曲", ["麵"]="面", ["麷"]="𫜑", ["麼"]="么", ["麽"]="么", ["黂"]="𱋱", ["黃"]="黄", ["黌"]="黉", ["點"]="点", ["黨"]="党", ["黲"]="黪", ["黴"]="霉", ["黶"]="黡", ["黷"]="黩", ["黸"]="𱋶", ["黽"]="黾", ["黿"]="鼋", ["鼀"]="𱋾", ["鼁"]="𱋿", ["鼂"]="鼌", ["鼄"]="𬹣", ["鼅"]="𱌄", ["鼆"]="𱌆", ["鼇"]="鳌", ["鼈"]="鳖", ["鼉"]="鼍", ["鼊"]="𱌉", ["鼕"]="冬", ["鼚"]="𱌊", ["鼲"]="𱌏", ["鼴"]="鼹", ["齈"]="𱌖", ["齊"]="齐", ["齋"]="斋", ["齌"]="𱌗", ["齍"]="𱌘", ["齎"]="赍", ["齏"]="齑", ["齒"]="齿", ["齔"]="龀", ["齕"]="龁", ["齖"]="𬹺", ["齗"]="龂", ["齘"]="𬹼", ["齙"]="龅", ["齚"]="𱌬", ["齜"]="龇", ["齝"]="𱌯", ["齞"]="𱌫", ["齟"]="龃", ["齠"]="龆", ["齡"]="龄", ["齣"]="出", ["齤"]="𱌲", ["齥"]="𱌱", ["齦"]="龈", ["齧"]="啮", ["齩"]="咬", ["齪"]="龊", ["齬"]="龉", ["齭"]="𫜭", ["齮"]="𬺈", ["齯"]="𫠜", ["齰"]="𫜬", ["齱"]="𱌶", ["齲"]="龋", ["齳"]="𱌳", ["齴"]="𫜮", ["齵"]="𱌹", ["齶"]="腭", ["齷"]="龌", ["齸"]="𱌽", ["齹"]="𬺎", ["齺"]="𱌭", ["齻"]="𱌺", ["齼"]="𬺓", ["齽"]="𬺔", ["齾"]="𫜰", ["龍"]="龙", ["龎"]="厐", ["龏"]="𱍁", ["龐"]="庞", ["龑"]="䶮", ["龓"]="𫜲", ["龔"]="龚", ["龕"]="龛", ["龖"]="𱍂", ["龘"]="𮹝", ["龜"]="龟", ["龝"]="秋", ["龞"]="𱍈", ["龥"]="𬱳", ["龭"]="𩨎", ["龯"]="𨱆", ["龲"]="𰾋", ["龻"]="𰁜", ["龽"]="𰞳", ["鿁"]="䜤", ["鿂"]="𮷙", ["鿐"]="䲤", ["鿓"]="鿒", ["鿠"]="鿟", ["鿳"]="鿸", ["𠁞"]="𠀾", ["𠅀"]="𮲐", ["𠌥"]="𠆿", ["𠏄"]="𮯻", ["𠐊"]="𫝋", ["𠐮"]="𬾣", ["𠖥"]="𮰄", ["𠙦"]="䒮", ["𠠜"]="𫦕", ["𠠫"]="𰄭", ["𠼤"]="𫪄", ["𠼮"]="𫩳", ["𡂿"]="𫪘", ["𡃈"]="𰈮", ["𡃤"]="𪢐", ["𡅘"]="𭊸", ["𡑍"]="𫭼", ["𡑑"]="𮰠", ["𡔖"]="𡍣", ["𡞵"]="㛟", ["𡟫"]="𫝪", ["𡠪"]="𮱔", ["𡠹"]="㛿", ["𡡤"]="𡚫", ["𡢃"]="㛠", ["𡢄"]="𮱆", ["𡢅"]="妘", ["𡢿"]="𭑸", ["𡣙"]="𱙑", ["𡤅"]="媇", ["𡤢"]="𮱊", ["𡤶"]="𮱐", ["𡷨"]="𫵸", ["𡷹"]="𱛊", ["𡺨"]="𫵶", ["𡽳"]="𫶊", ["𢄋"]="𦭬", ["𢅡"]="𫷌", ["𢍰"]="𪪴", ["𢊃"]="𰏽", ["𢐟"]="𮱵", ["𢜟"]="𰑂", ["𢞁"]="𮲂", ["𢡠"]="怾", ["𢯩"]="𫼤", ["𢰸"]="𱟽", ["𢲩"]="𫼾", ["𢲸"]="𫼵", ["𢳂"]="𫼣", ["𢷮"]="𢫊", ["𢺳"]="𪮳", ["𣂈"]="𦮜", ["𣋪"]="𮲨", ["𣍐"]="𫧃", ["𣎟"]="𫞅", ["𣞁"]="㮠", ["𣠩"]="𣞎", ["𣫒"]="𫶲", ["𣯩"]="𣯣", ["𣵾"]="𮳅", ["𣷣"]="𱥵", ["𣼼"]="𮳈", ["𣾷"]="㳢", ["𣿭"]="𮳃", ["𤁐"]="𮳍", ["𤃡"]="𱩂", ["𤄙"]="𰝞", ["𤅊"]="𮳖", ["𤅶"]="𣷷", ["𤅷"]="𰛻", ["𤆼"]="𮳢", ["𤇾"]="𫇦", ["𤋮"]="熙", ["𤎤"]="𬝃", ["𤎽"]="𱫜", ["𤏩"]="𮳯", ["𤏪"]="𱫊", ["𤏳"]="𮳱", ["𤑚"]="𮳶", ["𤑳"]="𤎻", ["𤒎"]="𤊀", ["𤒨"]="𮳸", ["𤓓"]="𬊜", ["𤓩"]="𤊰", ["𤚴"]="𮳺", ["𤛮"]="𤙯", ["𤛱"]="𫞢", ["𤜆"]="𪺪", ["𤢟"]="𤝢", ["𤥵"]="𮴑", ["𤦎"]="𮴅", ["𤦩"]="𮴏", ["𤦹"]="𱮺", ["𤧑"]="𮴆", ["𤧸"]="𮴒", ["𤩂"]="𫞧", ["𤩊"]="𮴗", ["𤩑"]="𮴥", ["𤩝"]="𮴓", ["𤪤"]="𪛞", ["𤪥"]="𬍜", ["𤪺"]="㻘", ["𤫎"]="𮴶", ["𤫟"]="𮴠", ["𤫩"]="㻏", ["𤬏"]="𱰆", ["𤸫"]="𤶧", ["𤾉"]="𰤓", ["𥀬"]="𪠏", ["𥂸"]="𬐠", ["𥉸"]="𰥣", ["𥋟"]="𮵅", ["𥔬"]="𮵊", ["𥕥"]="𥐰", ["𥖏"]="𮀪", ["𥗽"]="𬒗", ["𥚗"]="𮵙", ["𥢶"]="𫞷", ["𥣻"]="𦼖", ["𥯤"]="𫁳", ["𥲻"]="纂", ["𥵃"]="𥱔", ["𥺼"]="𮇔", ["𥼶"]="𬖘", ["𥼽"]="𥹥", ["𥿑"]="𮶁", ["𥿡"]="𱺙", ["𦆭"]="𱺖", ["𦆲"]="𫟇", ["𦜖"]="𬁺", ["𦝛"]="𮶔", ["𦠅"]="𫞅", ["𦠜"]="𱼇", ["𦡶"]="𰯂", ["𦢈"]="𣍨", ["𦣇"]="𬂂", ["𦥯"]="𰃮", ["𦦗"]="栄", ["𦧺"]="𫇘", ["𦳝"]="𰰢", ["𦻖"]="𱽾", ["𦾉"]="莺", ["𦾵"]="𦴇", ["𦿭"]="𮶷", ["𧀀"]="𮶩", ["𧂂"]="𮶬", ["𧐱"]="𬟺", ["𧒄"]="𱿧", ["𧖦"]="𬠱", ["𧜘"]="𮷁", ["𧜵"]="䙊", ["𧜶"]="𮖃", ["𧝞"]="䘛", ["𧞅"]="𰳻", ["𧞫"]="𫌋", ["𧟌"]="𬡠", ["𧠳"]="𮷄", ["𧢝"]="𲁔", ["𧥺"]="𬣝", ["𧦵"]="𮷆", ["𧧝"]="𬣨", ["𧧸"]="𰵬", ["𧨊"]="𬣶", ["𧨾"]="𬤂", ["𧩎"]="𮷉", ["𧩙"]="䜥", ["𧭈"]="𲂇", ["𧭥"]="𮷇", ["𧰎"]="鿲", ["𧵳"]="䞌", ["𧶄"]="𬥷", ["𧶽"]="𰷟", ["𧸦"]="𬥾", ["𧼮"]="𬦅", ["𨂐"]="𫏌", ["𨆅"]="𬦫", ["𨆉"]="𮛗", ["𨆪"]="𫏕", ["𨇗"]="𬦣", ["𨈆"]="𬧛", ["𨈇"]="𬦾", ["𨈊"]="𨂺", ["𨈌"]="𨄄", ["𨉖"]="𰿰", ["𨊛"]="𲄙", ["𨊸"]="䢁", ["𨋢"]="䢂", ["𨎮"]="𨐉", ["𨌄"]="𬨋", ["𨍶"]="荤", ["𨏊"]="𰹾", ["𨘀"]="𮷥", ["𨞪"]="𫜷", ["𨞺"]="𫟫", ["𨟊"]="𫟬", ["𨟑"]="𮷨", ["𨣃"]="𰼋", ["𨣨"]="𰼏", ["𨤋"]="𬪯", ["𨤡"]="𬪺", ["𨥈"]="𮷵", ["𨥉"]="𲇯", ["𨥕"]="𮷹", ["𨥤"]="𮷽", ["𨥭"]="𮸃", ["𨥮"]="𮷿", ["𨦍"]="𮸅", ["𨦡"]="𰽽", ["𨦫"]="䦀", ["𨧀"]="𬭊", ["𨧜"]="䦁", ["𨧰"]="𫟽", ["𨨏"]="𬭛", ["𨨩"]="𲈅", ["𨩃"]="𮸔", ["𨩎"]="𮸘", ["𨩰"]="𫟾", ["𨪃"]="𲈏", ["𨪜"]="𮸚", ["𨪦"]="𮸙", ["𨫀"]="𬭫", ["𨫋"]="𮸉", ["𨫼"]="𰾧", ["𨬫"]="𮸢", ["𨭆"]="𬭶", ["𨭌"]="𬭵", ["𨭎"]="𬭳", ["𨭐"]="𬭙", ["𨭥"]="𬬼", ["𨮪"]="𮷯", ["𨯂"]="𮸣", ["𨯅"]="䥿", ["𨯗"]="𮸝", ["𨯵"]="𬮀", ["𨰃"]="𫔉", ["𨰘"]="𮷷", ["𨰲"]="𫔃", ["𨰹"]="𰿀", ["𨳒"]="𮤭", ["𨽻"]="隶", ["𩉍"]="𬰣", ["𩋬"]="𱁱", ["𩍜"]="𱁳", ["𩏪"]="𩏽", ["𩐳"]="𮸷", ["𩓐"]="脖", ["𩓥"]="𫖵", ["𩔐"]="𮸶", ["𩖰"]="𫠇", ["𩗗"]="飓", ["𩗩"]="𮷻", ["𩗴"]="𫗉", ["𩗺"]="𮸻", ["𩛩"]="𩠃", ["𩛲"]="𬲹", ["𩜠"]="𬲿", ["𩞃"]="𬲰", ["𩞘"]="𬳏", ["𩟗"]="𫗚", ["𩢀"]="𮹄", ["𩢖"]="𮹅", ["𩣑"]="䯃", ["𩣺"]="𩧼", ["𩤅"]="𲌉", ["𩥅"]="𱅣", ["𩥇"]="𩨍", ["𩥈"]="𮹌", ["𩥉"]="𩧱", ["𩦠"]="𫠌", ["𩧉"]="𱄾", ["𩭙"]="𩬣", ["𩰹"]="𩰰", ["𩴵"]="𩴌", ["𩵚"]="𬶂", ["𩵦"]="𫠏", ["𩵩"]="𩽺", ["𩵳"]="𮹓", ["𩶘"]="䲞", ["𩷓"]="鿵", ["𩷕"]="鿶", ["𩷶"]="𱇮", ["𩸆"]="𬶖", ["𩹎"]="鿷", ["𩿅"]="𫠖", ["𩿞"]="𲍱", ["𪀦"]="𪉅", ["𪁎"]="𲍸", ["𪁜"]="𬸏", ["𪂇"]="𲍽", ["𪄳"]="鿺", ["𪆫"]="𱊨", ["𪆰"]="𬸭", ["𪆴"]="𬸮", ["𪇖"]="𬸡", ["𪈔"]="𱊉", ["𪋿"]="𫧮", ["𪍑"]="𱋢", ["𪕣"]="𬹭", ["𪗋"]="𱌙", ["𪗪"]="𬹿", ["𪗳"]="𬹾", ["𪗽"]="𬺄", ["𪘁"]="𲎨", ["𪘥"]="𱌸", ["𪘨"]="𱌴", ["𪘬"]="𱌷", ["𪘯"]="𪚐", ["𪘲"]="𬺌", ["𪙉"]="𱌼", ["𪚅"]="𬺖", ["𪝼"]="𱏆", ["𪣷"]="𮰥", ["𪦯"]="𮱕", ["𪳷"]="𬂱", ["𪼑"]="𮴚", ["𪼞"]="𮴉", ["𪾳"]="𮵆", ["𫃑"]="𰪿", ["𫃻"]="𮶅", ["𫒊"]="𮷷", ["𫒋"]="𮷺", ["𫒟"]="𮸋", ["𫓔"]="𮷶", ["𫘋"]="𮹉", ["𫝑"]="势", ["𫟰"]="铛", ["𫣴"]="𫢲", ["𫦸"]="𫦰", ["𫶦"]="𫶄", ["𫺤"]="𮲅", ["𬅁"]="𮲺", ["𬉧"]="鿰", ["𬊿"]="𮳬", ["𬎟"]="𮴹", ["𬕜"]="𮵭", ["𬗈"]="𮶀", ["𬞼"]="𮶳", ["𬠰"]="蛍", ["𬣘"]="𬤗", ["𬫉"]="𮸂", ["𬫍"]="𮸄", ["𬮍"]="𮤷", ["𬵨"]="鿹", ["𬷈"]="𮹕", ["𭃶"]="𰄝", ["𭜼"]="𮲀", ["𭶙"]="𤇻", ["𮌲"]="𭨶", ["𮚫"]="𮷍", ["𮢅"]="𮸑", ["𮢆"]="𮸒", ["𮢽"]="𮸝", ["𮰮"]="𪣑", ["𮱚"]="𱙋", ["𮱣"]="𪨇", ["𮸾"]="𲋢", ["𰯲"]="𰀢", ["𰻞"]="𰻝", ["𱆥"]="鿕", ["𱇋"]="𬶥", ["𱵭"]="𮵚", ["吿"]="告", ["𩒺"]="𱂩", ["𥍉"]="𱳅", ["轝"]="𬛼", ["𫙱"]="𲍘", ["壗"]="𡋤", ["𰔫"]="𫽫", } idcrp1g5ryqtbwuy0ncqibbst1e4sfl मॉड्यूल:zh/data/st 828 306747 487888 487138 2026-09-03T10:36:15Z SM7 6218 updating... 487888 Scribunto text/plain return { ["㐷"]="傌", ["㐽"]="偑", ["㑇"]="㑳", ["㑈"]="倲", ["㑔"]="㑯", ["㑩"]="儸", ["㓥"]="劏", ["㔉"]="劚", ["㖊"]="噚", ["㖞"]="喎", ["㘎"]="㘚", ["㚯"]="㜄", ["㛀"]="媰", ["㛟"]="𡞵", ["㛠"]="𡢃", ["㛣"]="㜏", ["㛤"]="孋", ["㛿"]="𡠹", ["㟆"]="㠏", ["㟥"]="嵾", ["㡎"]="幓", ["㤖"]="懧", ["㤘"]="㥮", ["㤭"]="憍", ["㤽"]="懤", ["㥪"]="慺", ["㧏"]="掆", ["㧐"]="㩳", ["㧑"]="撝", ["㧛"]="擥", ["㧟"]="擓", ["㧰"]="擽", ["㨫"]="㩜", ["㭎"]="棡", ["㭏"]="椲", ["㭤"]="樢", ["㭴"]="樫", ["㮠"]="𣞁", ["㱩"]="殰", ["㱮"]="殨", ["㲿"]="瀇", ["㳔"]="濧", ["㳠"]="澾", ["㳡"]="濄", ["㳢"]="𣾷", ["㴋"]="潚", ["㶉"]="鸂", ["㶶"]="燶", ["㶽"]="煱", ["㺍"]="獱", ["㻅"]="璯", ["㻏"]="𤫩", ["㻘"]="𤪺", ["䀥"]="䁻", ["䁖"]="瞜", ["䂵"]="碽", ["䃅"]="磾", ["䅉"]="稏", ["䅟"]="穇", ["䇲"]="筴", ["䉤"]="籔", ["䌶"]="䊷", ["䌷"]="紬", ["䌸"]="縳", ["䌹"]="絅", ["䌺"]="䋙", ["䌻"]="䋚", ["䌼"]="綐", ["䌽"]="綵", ["䌾"]="䋻", ["䌿"]="䋹", ["䍀"]="繿", ["䍁"]="繸", ["䎬"]="䎱", ["䏝"]="膞", ["䒠"]="蘴", ["䒮"]="𠙦", ["䒿"]="膋", ["䓓"]="薵", ["䓖"]="藭", ["䓨"]="罃", ["䗖"]="螮", ["䘛"]="𧝞", ["䙊"]="𧜵", ["䙌"]="䙡", ["䙓"]="襬", ["䛓"]="譼", ["䜣"]="訢", ["䜤"]="鿁", ["䜥"]="𧩙", ["䜧"]="䜀", ["䜩"]="讌", ["䝙"]="貙", ["䞌"]="𧵳", ["䞍"]="䝼", ["䞐"]="賰", ["䟢"]="躎", ["䢁"]="𨊸", ["䢂"]="𨋢", ["䥺"]="釾", ["䥽"]="鏺", ["䥾"]="䥱", ["䥿"]="𨯅", ["䦀"]="𨦫", ["䦁"]="𨧜", ["䦂"]="䥇", ["䦃"]="鐯", ["䦅"]="鐥", ["䦆"]="钁", ["䦶"]="䦛", ["䦷"]="䦟", ["䯃"]="𩣑", ["䯄"]="騧", ["䯅"]="䯀", ["䲝"]="䱽", ["䲞"]="𩶘", ["䲟"]="鮣", ["䲠"]="鰆", ["䲡"]="鰌", ["䲢"]="鰧", ["䲣"]="䱷", ["䲤"]="鿐", ["䴓"]="鳾", ["䴔"]="鵁", ["䴕"]="鴷", ["䴖"]="鶄", ["䴗"]="鶪", ["䴘"]="鷉", ["䴙"]="鷿", ["䶮"]="龑", ["万"]="萬", ["与"]="與", ["专"]="專", ["业"]="業", ["丛"]="叢", ["东"]="東", ["丝"]="絲", ["丢"]="丟", ["两"]="兩", ["严"]="嚴", ["丧"]="喪", ["个"]="個", ["丰"]="豐", ["临"]="臨", ["为"]="為", ["丽"]="麗", ["举"]="舉", ["么"]="麼", ["义"]="義", ["乌"]="烏", ["乐"]="樂", ["乔"]="喬", ["习"]="習", ["乡"]="鄉", ["书"]="書", ["买"]="買", ["乱"]="亂", ["争"]="爭", ["于"]="於", ["亏"]="虧", ["云"]="雲", ["亘"]="亙", ["亚"]="亞", ["产"]="產", ["亩"]="畝", ["亲"]="親", ["亵"]="褻", ["亸"]="嚲", ["亿"]="億", ["仅"]="僅", ["仆"]="僕", ["仉"]="僟", ["从"]="從", ["仑"]="侖", ["仓"]="倉", ["仪"]="儀", ["们"]="們", ["价"]="價", ["众"]="眾", ["优"]="優", ["伙"]="夥", ["会"]="會", ["伛"]="傴", ["伞"]="傘", ["伟"]="偉", ["传"]="傳", ["伡"]="俥", ["伣"]="俔", ["伤"]="傷", ["伥"]="倀", ["伦"]="倫", ["伧"]="傖", ["伪"]="偽", ["伫"]="佇", ["佇"]="儜", ["体"]="體", ["余"]="餘", ["佣"]="傭", ["佥"]="僉", ["侄"]="姪", ["侠"]="俠", ["侣"]="侶", ["侥"]="僥", ["侦"]="偵", ["侧"]="側", ["侨"]="僑", ["侩"]="儈", ["侪"]="儕", ["侬"]="儂", ["侭"]="儘", ["俣"]="俁", ["俦"]="儔", ["俨"]="儼", ["俩"]="倆", ["俪"]="儷", ["俫"]="倈", ["俭"]="儉", ["债"]="債", ["倾"]="傾", ["偬"]="傯", ["偻"]="僂", ["偾"]="僨", ["偿"]="償", ["傤"]="儎", ["傥"]="儻", ["傧"]="儐", ["储"]="儲", ["傩"]="儺", ["儿"]="兒", ["兑"]="兌", ["兖"]="兗", ["党"]="黨", ["兰"]="蘭", ["关"]="關", ["兴"]="興", ["兹"]="茲", ["养"]="養", ["兽"]="獸", ["冁"]="囅", ["内"]="內", ["冈"]="岡", ["册"]="冊", ["写"]="寫", ["军"]="軍", ["农"]="農", ["冯"]="馮", ["冲"]="沖", ["决"]="決", ["况"]="況", ["冻"]="凍", ["净"]="淨", ["凄"]="淒", ["准"]="準", ["凉"]="涼", ["凌"]="淩", ["减"]="減", ["凑"]="湊", ["凛"]="凜", ["几"]="幾", ["凤"]="鳳", ["凫"]="鳧", ["凭"]="憑", ["凯"]="凱", ["凶"]="兇", ["击"]="擊", ["凿"]="鑿", ["刍"]="芻", ["划"]="劃", ["刘"]="劉", ["则"]="則", ["刚"]="剛", ["创"]="創", ["删"]="刪", ["别"]="別", ["刬"]="剗", ["刭"]="剄", ["刹"]="剎", ["刽"]="劊", ["刾"]="㓨", ["刿"]="劌", ["剀"]="剴", ["剂"]="劑", ["剐"]="剮", ["剑"]="劍", ["剥"]="剝", ["剧"]="劇", ["剿"]="勦", ["劝"]="勸", ["办"]="辦", ["务"]="務", ["劢"]="勱", ["动"]="動", ["励"]="勵", ["劲"]="勁", ["劳"]="勞", ["势"]="勢", ["勋"]="勛", ["勚"]="勩", ["匀"]="勻", ["匦"]="匭", ["匮"]="匱", ["区"]="區", ["医"]="醫", ["华"]="華", ["协"]="協", ["单"]="單", ["卖"]="賣", ["占"]="佔", ["卢"]="盧", ["卤"]="鹵", ["卧"]="臥", ["卫"]="衛", ["却"]="卻", ["厂"]="廠", ["厅"]="廳", ["历"]="歷", ["厉"]="厲", ["压"]="壓", ["厌"]="厭", ["厍"]="厙", ["厐"]="龎", ["厕"]="廁", ["厢"]="廂", ["厣"]="厴", ["厦"]="廈", ["厨"]="廚", ["厩"]="廄", ["厮"]="廝", ["县"]="縣", ["参"]="參", ["叆"]="靉", ["叇"]="靆", ["双"]="雙", ["发"]="發", ["变"]="變", ["叙"]="敘", ["叠"]="疊", ["台"]="臺", ["叶"]="葉", ["号"]="號", ["叹"]="嘆", ["叽"]="嘰", ["吁"]="籲", ["后"]="後", ["吓"]="嚇", ["吕"]="呂", ["吗"]="嗎", ["吣"]="唚", ["吨"]="噸", ["听"]="聽", ["启"]="啟", ["吴"]="吳", ["呐"]="吶", ["呒"]="嘸", ["呓"]="囈", ["呕"]="嘔", ["呖"]="嚦", ["呗"]="唄", ["员"]="員", ["呙"]="咼", ["呛"]="嗆", ["呜"]="嗚", ["咏"]="詠", ["咙"]="嚨", ["咛"]="嚀", ["咝"]="噝", ["咸"]="鹹", ["响"]="響", ["哑"]="啞", ["哒"]="噠", ["哓"]="嘵", ["哔"]="嗶", ["哕"]="噦", ["哗"]="嘩", ["哙"]="噲", ["哜"]="嚌", ["哝"]="噥", ["哟"]="喲", ["唛"]="嘜", ["唝"]="嗊", ["唠"]="嘮", ["唡"]="啢", ["唢"]="嗩", ["唤"]="喚", ["啧"]="嘖", ["啬"]="嗇", ["啭"]="囀", ["啮"]="嚙", ["啯"]="嘓", ["啰"]="囉", ["啴"]="嘽", ["啸"]="嘯", ["喂"]="餵", ["喧"]="諠", ["喷"]="噴", ["喽"]="嘍", ["喾"]="嚳", ["嗫"]="囁", ["嗳"]="噯", ["嘘"]="噓", ["嘤"]="嚶", ["嘱"]="囑", ["嘻"]="譆", ["噜"]="嚕", ["嚣"]="囂", ["团"]="團", ["园"]="園", ["囱"]="囪", ["围"]="圍", ["囵"]="圇", ["国"]="國", ["图"]="圖", ["圆"]="圓", ["圣"]="聖", ["圹"]="壙", ["场"]="場", ["坏"]="壞", ["块"]="塊", ["坚"]="堅", ["坛"]="壇", ["坜"]="壢", ["坝"]="壩", ["坞"]="塢", ["坟"]="墳", ["坠"]="墜", ["垄"]="壟", ["垅"]="壠", ["垆"]="壚", ["垒"]="壘", ["垦"]="墾", ["垩"]="堊", ["垫"]="墊", ["垭"]="埡", ["垯"]="墶", ["垱"]="壋", ["垲"]="塏", ["垴"]="堖", ["埘"]="塒", ["埙"]="塤", ["埚"]="堝", ["堑"]="塹", ["堕"]="墮", ["塆"]="壪", ["墙"]="牆", ["壮"]="壯", ["声"]="聲", ["壳"]="殼", ["壶"]="壺", ["壸"]="壼", ["处"]="處", ["备"]="備", ["复"]="復", ["够"]="夠", ["头"]="頭", ["夸"]="誇", ["夹"]="夾", ["夺"]="奪", ["奁"]="奩", ["奂"]="奐", ["奋"]="奮", ["奖"]="獎", ["奥"]="奧", ["奸"]="姦", ["妆"]="妝", ["妇"]="婦", ["妈"]="媽", ["妩"]="嫵", ["妪"]="嫗", ["妫"]="媯", ["姗"]="姍", ["姹"]="奼", ["娄"]="婁", ["娅"]="婭", ["娆"]="嬈", ["娇"]="嬌", ["娈"]="孌", ["娱"]="娛", ["娲"]="媧", ["娴"]="嫻", ["婳"]="嫿", ["婴"]="嬰", ["婵"]="嬋", ["婶"]="嬸", ["媪"]="媼", ["媭"]="嬃", ["嫒"]="嬡", ["嫔"]="嬪", ["嫱"]="嬙", ["嬷"]="嬤", ["孙"]="孫", ["学"]="學", ["孪"]="孿", ["宁"]="寧", ["宝"]="寶", ["实"]="實", ["宠"]="寵", ["审"]="審", ["宪"]="憲", ["宫"]="宮", ["宽"]="寬", ["宾"]="賓", ["寝"]="寢", ["对"]="對", ["寻"]="尋", ["导"]="導", ["寿"]="壽", ["将"]="將", ["尔"]="爾", ["尘"]="塵", ["尝"]="嘗", ["尧"]="堯", ["尴"]="尷", ["尸"]="屍", ["尽"]="盡", ["层"]="層", ["屃"]="屭", ["屉"]="屜", ["届"]="屆", ["属"]="屬", ["屡"]="屢", ["屦"]="屨", ["屿"]="嶼", ["岁"]="歲", ["岂"]="豈", ["岖"]="嶇", ["岗"]="崗", ["岘"]="峴", ["岙"]="嶴", ["岚"]="嵐", ["岛"]="島", ["岭"]="嶺", ["岽"]="崬", ["岿"]="巋", ["峃"]="嶨", ["峄"]="嶧", ["峡"]="峽", ["峣"]="嶢", ["峤"]="嶠", ["峥"]="崢", ["峦"]="巒", ["崂"]="嶗", ["崃"]="崍", ["崄"]="嶮", ["崭"]="嶄", ["嵘"]="嶸", ["嵚"]="嶔", ["嵝"]="嶁", ["巅"]="巔", ["巩"]="鞏", ["巯"]="巰", ["币"]="幣", ["帅"]="帥", ["师"]="師", ["帏"]="幃", ["帐"]="帳", ["帘"]="簾", ["帜"]="幟", ["带"]="帶", ["帧"]="幀", ["帮"]="幫", ["帱"]="幬", ["帻"]="幘", ["帼"]="幗", ["幂"]="冪", ["幞"]="襆", ["干"]="乾", ["并"]="並", ["广"]="廣", ["庄"]="莊", ["庆"]="慶", ["庐"]="廬", ["庑"]="廡", ["库"]="庫", ["应"]="應", ["庙"]="廟", ["庞"]="龐", ["废"]="廢", ["庼"]="廎", ["廪"]="廩", ["开"]="開", ["异"]="異", ["弃"]="棄", ["弑"]="弒", ["张"]="張", ["弥"]="彌", ["弪"]="弳", ["弯"]="彎", ["弹"]="彈", ["强"]="強", ["归"]="歸", ["当"]="當", ["录"]="錄", ["彝"]="彞", ["彟"]="彠", ["彦"]="彥", ["彨"]="彲", ["彻"]="徹", ["征"]="徵", ["径"]="徑", ["徕"]="徠", ["忆"]="憶", ["忏"]="懺", ["忧"]="憂", ["忾"]="愾", ["怀"]="懷", ["态"]="態", ["怂"]="慫", ["怃"]="憮", ["怄"]="慪", ["怅"]="悵", ["怆"]="愴", ["怜"]="憐", ["总"]="總", ["怼"]="懟", ["怿"]="懌", ["恋"]="戀", ["恒"]="恆", ["恳"]="懇", ["恶"]="惡", ["恸"]="慟", ["恹"]="懨", ["恺"]="愷", ["恻"]="惻", ["恼"]="惱", ["恽"]="惲", ["悦"]="悅", ["悫"]="愨", ["悬"]="懸", ["悭"]="慳", ["悮"]="悞", ["悯"]="憫", ["惊"]="驚", ["惧"]="懼", ["惨"]="慘", ["惩"]="懲", ["惫"]="憊", ["惬"]="愜", ["惭"]="慚", ["惮"]="憚", ["惯"]="慣", ["愠"]="慍", ["愤"]="憤", ["愦"]="憒", ["愿"]="願", ["慑"]="懾", ["慭"]="憖", ["懑"]="懣", ["懒"]="懶", ["懔"]="懍", ["戆"]="戇", ["戋"]="戔", ["戏"]="戲", ["戗"]="戧", ["战"]="戰", ["戬"]="戩", ["户"]="戶", ["扎"]="紮", ["扑"]="撲", ["执"]="執", ["扩"]="擴", ["扪"]="捫", ["扫"]="掃", ["扬"]="揚", ["扰"]="擾", ["抚"]="撫", ["抛"]="拋", ["抟"]="摶", ["抠"]="摳", ["抡"]="掄", ["抢"]="搶", ["护"]="護", ["报"]="報", ["担"]="擔", ["拟"]="擬", ["拢"]="攏", ["拣"]="揀", ["拥"]="擁", ["拦"]="攔", ["拧"]="擰", ["拨"]="撥", ["择"]="擇", ["挂"]="掛", ["挚"]="摯", ["挛"]="攣", ["挜"]="掗", ["挝"]="撾", ["挞"]="撻", ["挟"]="挾", ["挠"]="撓", ["挡"]="擋", ["挢"]="撟", ["挣"]="掙", ["挤"]="擠", ["挥"]="揮", ["挦"]="撏", ["捆"]="綑", ["捝"]="挩", ["捞"]="撈", ["损"]="損", ["捡"]="撿", ["换"]="換", ["捣"]="搗", ["据"]="據", ["掳"]="擄", ["掴"]="摑", ["掷"]="擲", ["掸"]="撣", ["掺"]="摻", ["掼"]="摜", ["揽"]="攬", ["揾"]="搵", ["揿"]="撳", ["搀"]="攙", ["搁"]="擱", ["搂"]="摟", ["搅"]="攪", ["携"]="攜", ["摄"]="攝", ["摅"]="攄", ["摆"]="擺", ["摇"]="搖", ["摈"]="擯", ["摊"]="攤", ["撄"]="攖", ["撑"]="撐", ["撰"]="譔", ["撵"]="攆", ["撷"]="擷", ["撸"]="擼", ["撺"]="攛", ["擜"]="㩵", ["擞"]="擻", ["攒"]="攢", ["敌"]="敵", ["敛"]="斂", ["敩"]="斆", ["数"]="數", ["斋"]="齋", ["斓"]="斕", ["斩"]="斬", ["断"]="斷", ["无"]="無", ["旧"]="舊", ["时"]="時", ["旷"]="曠", ["旸"]="暘", ["昙"]="曇", ["昵"]="暱", ["昼"]="晝", ["昽"]="曨", ["显"]="顯", ["晋"]="晉", ["晒"]="曬", ["晓"]="曉", ["晔"]="曄", ["晕"]="暈", ["晖"]="暉", ["暂"]="暫", ["暧"]="曖", ["术"]="術", ["朴"]="樸", ["机"]="機", ["杀"]="殺", ["杂"]="雜", ["权"]="權", ["杆"]="桿", ["杠"]="槓", ["条"]="條", ["来"]="來", ["杨"]="楊", ["杩"]="榪", ["杰"]="傑", ["极"]="極", ["构"]="構", ["枞"]="樅", ["枢"]="樞", ["枣"]="棗", ["枥"]="櫪", ["枧"]="梘", ["枨"]="棖", ["枪"]="槍", ["枫"]="楓", ["枭"]="梟", ["柜"]="櫃", ["柠"]="檸", ["柽"]="檉", ["栀"]="梔", ["栄"]="𦦗", ["栅"]="柵", ["标"]="標", ["栈"]="棧", ["栉"]="櫛", ["栊"]="櫳", ["栋"]="棟", ["栌"]="櫨", ["栎"]="櫟", ["栏"]="欄", ["树"]="樹", ["栖"]="棲", ["样"]="樣", ["栾"]="欒", ["桠"]="椏", ["桡"]="橈", ["桢"]="楨", ["档"]="檔", ["桤"]="榿", ["桥"]="橋", ["桦"]="樺", ["桧"]="檜", ["桨"]="槳", ["桩"]="樁", ["桪"]="樳", ["梦"]="夢", ["梼"]="檮", ["梾"]="棶", ["梿"]="槤", ["检"]="檢", ["棁"]="梲", ["棂"]="櫺", ["棹"]="櫂", ["椁"]="槨", ["椝"]="槼", ["椟"]="櫝", ["椠"]="槧", ["椢"]="槶", ["椤"]="欏", ["椫"]="樿", ["椭"]="橢", ["椮"]="槮", ["楼"]="樓", ["榄"]="欖", ["榅"]="榲", ["榇"]="櫬", ["榈"]="櫚", ["榉"]="櫸", ["榨"]="搾", ["槚"]="檟", ["槛"]="檻", ["槜"]="檇", ["槟"]="檳", ["槠"]="櫧", ["横"]="橫", ["樯"]="檣", ["樱"]="櫻", ["橥"]="櫫", ["橱"]="櫥", ["橹"]="櫓", ["橼"]="櫞", ["檩"]="檁", ["欢"]="歡", ["欤"]="歟", ["欧"]="歐", ["歼"]="殲", ["殁"]="歿", ["殇"]="殤", ["残"]="殘", ["殒"]="殞", ["殓"]="殮", ["殚"]="殫", ["殡"]="殯", ["殴"]="毆", ["殷"]="慇", ["毁"]="毀", ["毂"]="轂", ["毕"]="畢", ["毙"]="斃", ["毡"]="氈", ["毵"]="毿", ["氇"]="氌", ["气"]="氣", ["氢"]="氫", ["氩"]="氬", ["氲"]="氳", ["汇"]="匯", ["汉"]="漢", ["汤"]="湯", ["汹"]="洶", ["沄"]="澐", ["沈"]="瀋", ["沟"]="溝", ["没"]="沒", ["沣"]="灃", ["沤"]="漚", ["沥"]="瀝", ["沦"]="淪", ["沧"]="滄", ["沨"]="渢", ["沩"]="溈", ["沪"]="滬", ["沵"]="濔", ["泄"]="洩", ["泞"]="濘", ["泪"]="淚", ["泶"]="澩", ["泷"]="瀧", ["泸"]="瀘", ["泺"]="濼", ["泻"]="瀉", ["泼"]="潑", ["泽"]="澤", ["泾"]="涇", ["洁"]="潔", ["洒"]="灑", ["洼"]="窪", ["浃"]="浹", ["浄"]="淨", ["浅"]="淺", ["浆"]="漿", ["浇"]="澆", ["浈"]="湞", ["浉"]="溮", ["浊"]="濁", ["测"]="測", ["浍"]="澮", ["济"]="濟", ["浏"]="瀏", ["浐"]="滻", ["浑"]="渾", ["浒"]="滸", ["浓"]="濃", ["浔"]="潯", ["浕"]="濜", ["涂"]="塗", ["涌"]="湧", ["涛"]="濤", ["涝"]="澇", ["涞"]="淶", ["涟"]="漣", ["涠"]="潿", ["涡"]="渦", ["涢"]="溳", ["涣"]="渙", ["涤"]="滌", ["润"]="潤", ["涧"]="澗", ["涨"]="漲", ["涩"]="澀", ["淀"]="澱", ["渊"]="淵", ["渌"]="淥", ["渍"]="漬", ["渎"]="瀆", ["渐"]="漸", ["渑"]="澠", ["渔"]="漁", ["渖"]="瀋", ["渗"]="滲", ["温"]="溫", ["湾"]="灣", ["湿"]="濕", ["溁"]="濚", ["溃"]="潰", ["溅"]="濺", ["溇"]="漊", ["滗"]="潷", ["滚"]="滾", ["滞"]="滯", ["滟"]="灩", ["滠"]="灄", ["满"]="滿", ["滢"]="瀅", ["滤"]="濾", ["滥"]="濫", ["滦"]="灤", ["滨"]="濱", ["滩"]="灘", ["滪"]="澦", ["潆"]="瀠", ["潇"]="瀟", ["潋"]="瀲", ["潍"]="濰", ["潜"]="潛", ["潴"]="瀦", ["澛"]="瀂", ["澜"]="瀾", ["濑"]="瀨", ["濒"]="瀕", ["灏"]="灝", ["灭"]="滅", ["灯"]="燈", ["灵"]="靈", ["灾"]="災", ["灿"]="燦", ["炀"]="煬", ["炉"]="爐", ["炖"]="燉", ["炜"]="煒", ["炝"]="熗", ["点"]="點", ["炼"]="煉", ["炽"]="熾", ["烁"]="爍", ["烂"]="爛", ["烃"]="烴", ["烛"]="燭", ["烟"]="煙", ["烦"]="煩", ["烧"]="燒", ["烨"]="燁", ["烩"]="燴", ["烫"]="燙", ["烬"]="燼", ["热"]="熱", ["焕"]="煥", ["焖"]="燜", ["焘"]="燾", ["煴"]="熅", ["熏"]="燻", ["爱"]="愛", ["爷"]="爺", ["牍"]="牘", ["牦"]="氂", ["牵"]="牽", ["牺"]="犧", ["犊"]="犢", ["状"]="狀", ["犷"]="獷", ["犸"]="獁", ["犹"]="猶", ["狈"]="狽", ["狝"]="獮", ["狞"]="獰", ["独"]="獨", ["狭"]="狹", ["狮"]="獅", ["狯"]="獪", ["狰"]="猙", ["狱"]="獄", ["狲"]="猻", ["猃"]="獫", ["猎"]="獵", ["猕"]="獼", ["猡"]="玀", ["猪"]="豬", ["猫"]="貓", ["猬"]="蝟", ["献"]="獻", ["獭"]="獺", ["玑"]="璣", ["玙"]="璵", ["玚"]="瑒", ["玛"]="瑪", ["玮"]="瑋", ["环"]="環", ["现"]="現", ["玱"]="瑲", ["玺"]="璽", ["珐"]="琺", ["珑"]="瓏", ["珰"]="璫", ["珲"]="琿", ["琎"]="璡", ["琏"]="璉", ["琐"]="瑣", ["琼"]="瓊", ["瑶"]="瑤", ["瑷"]="璦", ["瑸"]="璸", ["璎"]="瓔", ["瓒"]="瓚", ["瓮"]="甕", ["瓯"]="甌", ["电"]="電", ["画"]="畫", ["畅"]="暢", ["畴"]="疇", ["疖"]="癤", ["疗"]="療", ["疟"]="瘧", ["疠"]="癘", ["疡"]="瘍", ["疬"]="癧", ["疭"]="瘲", ["疮"]="瘡", ["疯"]="瘋", ["疱"]="皰", ["痈"]="癰", ["痉"]="痙", ["痒"]="癢", ["痖"]="瘂", ["痨"]="癆", ["痪"]="瘓", ["痫"]="癇", ["痹"]="痺", ["瘅"]="癉", ["瘆"]="瘮", ["瘗"]="瘞", ["瘘"]="瘺", ["瘪"]="癟", ["瘫"]="癱", ["瘾"]="癮", ["瘿"]="癭", ["癞"]="癩", ["癣"]="癬", ["癫"]="癲", ["皑"]="皚", ["皱"]="皺", ["皲"]="皸", ["盏"]="盞", ["盐"]="鹽", ["监"]="監", ["盖"]="蓋", ["盗"]="盜", ["盘"]="盤", ["眍"]="瞘", ["眝"]="矃", ["眦"]="眥", ["眬"]="矓", ["眯"]="瞇", ["着"]="著", ["睁"]="睜", ["睐"]="睞", ["睑"]="瞼", ["睾"]="睪", ["睿"]="叡", ["瞆"]="瞶", ["瞒"]="瞞", ["瞩"]="矚", ["矫"]="矯", ["矶"]="磯", ["矾"]="礬", ["矿"]="礦", ["砀"]="碭", ["码"]="碼", ["砖"]="磚", ["砗"]="硨", ["砚"]="硯", ["砜"]="碸", ["砺"]="礪", ["砻"]="礱", ["砾"]="礫", ["础"]="礎", ["硁"]="硜", ["硕"]="碩", ["硖"]="硤", ["硗"]="磽", ["硙"]="磑", ["硚"]="礄", ["确"]="確", ["硵"]="磠", ["硷"]="鹼", ["碍"]="礙", ["碛"]="磧", ["碜"]="磣", ["碱"]="鹼", ["礼"]="禮", ["祃"]="禡", ["祎"]="禕", ["祢"]="禰", ["祯"]="禎", ["祷"]="禱", ["祸"]="禍", ["禀"]="稟", ["禄"]="祿", ["禅"]="禪", ["离"]="離", ["秃"]="禿", ["秆"]="稈", ["种"]="種", ["积"]="積", ["称"]="稱", ["秽"]="穢", ["秾"]="穠", ["稆"]="穭", ["税"]="稅", ["稣"]="穌", ["稳"]="穩", ["穑"]="穡", ["穞"]="穭", ["穷"]="窮", ["窃"]="竊", ["窍"]="竅", ["窎"]="窵", ["窑"]="窯", ["窜"]="竄", ["窝"]="窩", ["窥"]="窺", ["窦"]="竇", ["窭"]="窶", ["竖"]="豎", ["竞"]="競", ["笃"]="篤", ["笋"]="筍", ["笔"]="筆", ["笕"]="筧", ["笺"]="箋", ["笼"]="籠", ["笾"]="籩", ["筚"]="篳", ["筛"]="篩", ["筜"]="簹", ["筝"]="箏", ["筹"]="籌", ["筼"]="篔", ["签"]="簽", ["筿"]="篠", ["简"]="簡", ["箓"]="籙", ["箦"]="簀", ["箧"]="篋", ["箨"]="籜", ["箩"]="籮", ["箪"]="簞", ["箫"]="簫", ["篑"]="簣", ["篓"]="簍", ["篮"]="籃", ["篯"]="籛", ["篱"]="籬", ["簖"]="籪", ["籁"]="籟", ["籴"]="糴", ["类"]="類", ["籼"]="秈", ["粜"]="糶", ["粝"]="糲", ["粤"]="粵", ["粪"]="糞", ["粮"]="糧", ["糁"]="糝", ["糇"]="餱", ["紧"]="緊", ["絷"]="縶", ["纟"]="糹", ["纠"]="糾", ["纡"]="紆", ["红"]="紅", ["纣"]="紂", ["纤"]="纖", ["纥"]="紇", ["约"]="約", ["级"]="級", ["纨"]="紈", ["纩"]="纊", ["纪"]="紀", ["纫"]="紉", ["纬"]="緯", ["纭"]="紜", ["纮"]="紘", ["纯"]="純", ["纰"]="紕", ["纱"]="紗", ["纲"]="綱", ["纳"]="納", ["纴"]="紝", ["纵"]="縱", ["纶"]="綸", ["纷"]="紛", ["纸"]="紙", ["纹"]="紋", ["纺"]="紡", ["纻"]="紵", ["纼"]="紖", ["纽"]="紐", ["纾"]="紓", ["线"]="線", ["绀"]="紺", ["绁"]="紲", ["绂"]="紱", ["练"]="練", ["组"]="組", ["绅"]="紳", ["细"]="細", ["织"]="織", ["终"]="終", ["绉"]="縐", ["绊"]="絆", ["绋"]="紼", ["绌"]="絀", ["绍"]="紹", ["绎"]="繹", ["经"]="經", ["绐"]="紿", ["绑"]="綁", ["绒"]="絨", ["结"]="結", ["绔"]="絝", ["绕"]="繞", ["绖"]="絰", ["绗"]="絎", ["绘"]="繪", ["给"]="給", ["绚"]="絢", ["绛"]="絳", ["络"]="絡", ["绝"]="絕", ["绞"]="絞", ["统"]="統", ["绠"]="綆", ["绡"]="綃", ["绢"]="絹", ["绣"]="繡", ["绤"]="綌", ["绥"]="綏", ["绦"]="絛", ["继"]="繼", ["绨"]="綈", ["绩"]="績", ["绪"]="緒", ["绫"]="綾", ["绬"]="緓", ["续"]="續", ["绮"]="綺", ["绯"]="緋", ["绰"]="綽", ["绱"]="鞝", ["绲"]="緄", ["绳"]="繩", ["维"]="維", ["绵"]="綿", ["绶"]="綬", ["绷"]="繃", ["绸"]="綢", ["绹"]="綯", ["绺"]="綹", ["绻"]="綣", ["综"]="綜", ["绽"]="綻", ["绾"]="綰", ["绿"]="綠", ["缀"]="綴", ["缁"]="緇", ["缂"]="緙", ["缃"]="緗", ["缄"]="緘", ["缅"]="緬", ["缆"]="纜", ["缇"]="緹", ["缈"]="緲", ["缉"]="緝", ["缊"]="縕", ["缋"]="繢", ["缌"]="緦", ["缍"]="綞", ["缎"]="緞", ["缏"]="緶", ["缐"]="線", ["缑"]="緱", ["缒"]="縋", ["缓"]="緩", ["缔"]="締", ["缕"]="縷", ["编"]="編", ["缗"]="緡", ["缘"]="緣", ["缙"]="縉", ["缚"]="縛", ["缛"]="縟", ["缜"]="縝", ["缝"]="縫", ["缞"]="縗", ["缟"]="縞", ["缠"]="纏", ["缡"]="縭", ["缢"]="縊", ["缣"]="縑", ["缤"]="繽", ["缥"]="縹", ["缦"]="縵", ["缧"]="縲", ["缨"]="纓", ["缩"]="縮", ["缪"]="繆", ["缫"]="繅", ["缬"]="纈", ["缭"]="繚", ["缮"]="繕", ["缯"]="繒", ["缰"]="韁", ["缱"]="繾", ["缲"]="繰", ["缳"]="繯", ["缴"]="繳", ["缵"]="纘", ["罂"]="罌", ["网"]="網", ["罗"]="羅", ["罚"]="罰", ["罢"]="罷", ["罴"]="羆", ["羁"]="羈", ["羟"]="羥", ["羡"]="羨", ["翘"]="翹", ["翙"]="翽", ["翚"]="翬", ["耢"]="耮", ["耧"]="耬", ["耸"]="聳", ["耻"]="恥", ["聂"]="聶", ["聋"]="聾", ["职"]="職", ["聍"]="聹", ["联"]="聯", ["聩"]="聵", ["聪"]="聰", ["肃"]="肅", ["肠"]="腸", ["肤"]="膚", ["肮"]="骯", ["肴"]="餚", ["肾"]="腎", ["肿"]="腫", ["胀"]="脹", ["胁"]="脅", ["胆"]="膽", ["胑"]="膱", ["胜"]="勝", ["胧"]="朧", ["胨"]="腖", ["胪"]="臚", ["胫"]="脛", ["胶"]="膠", ["脉"]="脈", ["脍"]="膾", ["脏"]="髒", ["脐"]="臍", ["脑"]="腦", ["脓"]="膿", ["脔"]="臠", ["脚"]="腳", ["脱"]="脫", ["脶"]="腡", ["脸"]="臉", ["腊"]="臘", ["腌"]="醃", ["腘"]="膕", ["腭"]="齶", ["腻"]="膩", ["腼"]="靦", ["腽"]="膃", ["腾"]="騰", ["膑"]="臏", ["臜"]="臢", ["舆"]="輿", ["舣"]="艤", ["舰"]="艦", ["舱"]="艙", ["舻"]="艫", ["艰"]="艱", ["艳"]="豔", ["艺"]="藝", ["节"]="節", ["芈"]="羋", ["芗"]="薌", ["芜"]="蕪", ["芦"]="蘆", ["苁"]="蓯", ["苇"]="葦", ["苈"]="藶", ["苋"]="莧", ["苌"]="萇", ["苍"]="蒼", ["苎"]="苧", ["苏"]="蘇", ["苧"]="薴", ["苹"]="蘋", ["范"]="範", ["茎"]="莖", ["茏"]="蘢", ["茑"]="蔦", ["茔"]="塋", ["茕"]="煢", ["茧"]="繭", ["荆"]="荊", ["荐"]="薦", ["荙"]="薘", ["荚"]="莢", ["荛"]="蕘", ["荜"]="蓽", ["荝"]="萴", ["荞"]="蕎", ["荟"]="薈", ["荠"]="薺", ["荡"]="蕩", ["荣"]="榮", ["荤"]="葷", ["荥"]="滎", ["荦"]="犖", ["荧"]="熒", ["荨"]="蕁", ["荩"]="藎", ["荪"]="蓀", ["荫"]="蔭", ["荬"]="蕒", ["荭"]="葒", ["荮"]="葤", ["药"]="藥", ["莅"]="蒞", ["莱"]="萊", ["莲"]="蓮", ["莳"]="蒔", ["莴"]="萵", ["莶"]="薟", ["获"]="獲", ["莸"]="蕕", ["莹"]="瑩", ["莺"]="鶯", ["莼"]="蓴", ["萚"]="蘀", ["萝"]="蘿", ["萤"]="螢", ["营"]="營", ["萦"]="縈", ["萧"]="蕭", ["萨"]="薩", ["葱"]="蔥", ["蒀"]="蒕", ["蒇"]="蕆", ["蒉"]="蕢", ["蒋"]="蔣", ["蒌"]="蔞", ["蒏"]="醟", ["蓝"]="藍", ["蓟"]="薊", ["蓠"]="蘺", ["蓣"]="蕷", ["蓥"]="鎣", ["蓦"]="驀", ["蔷"]="薔", ["蔹"]="蘞", ["蔺"]="藺", ["蔼"]="藹", ["蕰"]="薀", ["蕲"]="蘄", ["蕴"]="蘊", ["薮"]="藪", ["藓"]="蘚", ["蘖"]="櫱", ["虏"]="虜", ["虑"]="慮", ["虚"]="虛", ["虫"]="蟲", ["虬"]="虯", ["虮"]="蟣", ["虱"]="蝨", ["虽"]="雖", ["虾"]="蝦", ["虿"]="蠆", ["蚀"]="蝕", ["蚁"]="蟻", ["蚂"]="螞", ["蚃"]="蠁", ["蚕"]="蠶", ["蚝"]="蠔", ["蚬"]="蜆", ["蛊"]="蠱", ["蛍"]="𬠰", ["蛎"]="蠣", ["蛏"]="蟶", ["蛮"]="蠻", ["蛰"]="蟄", ["蛱"]="蛺", ["蛲"]="蟯", ["蛳"]="螄", ["蛴"]="蠐", ["蜕"]="蛻", ["蜗"]="蝸", ["蜡"]="蠟", ["蝇"]="蠅", ["蝈"]="蟈", ["蝉"]="蟬", ["蝎"]="蠍", ["蝼"]="螻", ["蝾"]="蠑", ["螀"]="螿", ["螨"]="蟎", ["蟏"]="蠨", ["衅"]="釁", ["衔"]="銜", ["补"]="補", ["衬"]="襯", ["衮"]="袞", ["袄"]="襖", ["袅"]="裊", ["袆"]="褘", ["袜"]="襪", ["袭"]="襲", ["袯"]="襏", ["装"]="裝", ["裆"]="襠", ["裈"]="褌", ["裢"]="褳", ["裣"]="襝", ["裤"]="褲", ["裥"]="襇", ["褛"]="褸", ["褝"]="襌", ["褴"]="襤", ["襕"]="襴", ["见"]="見", ["观"]="觀", ["觃"]="覎", ["规"]="規", ["觅"]="覓", ["视"]="視", ["觇"]="覘", ["览"]="覽", ["觉"]="覺", ["觊"]="覬", ["觋"]="覡", ["觌"]="覿", ["觍"]="覥", ["觎"]="覦", ["觏"]="覯", ["觐"]="覲", ["觑"]="覷", ["觞"]="觴", ["触"]="觸", ["觯"]="觶", ["訚"]="誾", ["詟"]="讋", ["誉"]="譽", ["誊"]="謄", ["讠"]="訁", ["计"]="計", ["订"]="訂", ["讣"]="訃", ["认"]="認", ["讥"]="譏", ["讦"]="訐", ["讧"]="訌", ["讨"]="討", ["让"]="讓", ["讪"]="訕", ["讫"]="訖", ["讬"]="託", ["训"]="訓", ["议"]="議", ["讯"]="訊", ["记"]="記", ["讱"]="訒", ["讲"]="講", ["讳"]="諱", ["讴"]="謳", ["讵"]="詎", ["讶"]="訝", ["讷"]="訥", ["许"]="許", ["讹"]="訛", ["论"]="論", ["讻"]="訩", ["讼"]="訟", ["讽"]="諷", ["设"]="設", ["访"]="訪", ["诀"]="訣", ["证"]="證", ["诂"]="詁", ["诃"]="訶", ["评"]="評", ["诅"]="詛", ["识"]="識", ["诇"]="詗", ["诈"]="詐", ["诉"]="訴", ["诊"]="診", ["诋"]="詆", ["诌"]="謅", ["词"]="詞", ["诎"]="詘", ["诏"]="詔", ["诐"]="詖", ["译"]="譯", ["诒"]="詒", ["诓"]="誆", ["诔"]="誄", ["试"]="試", ["诖"]="詿", ["诗"]="詩", ["诘"]="詰", ["诙"]="詼", ["诚"]="誠", ["诛"]="誅", ["诜"]="詵", ["话"]="話", ["诞"]="誕", ["诟"]="詬", ["诠"]="詮", ["诡"]="詭", ["询"]="詢", ["诣"]="詣", ["诤"]="諍", ["该"]="該", ["详"]="詳", ["诧"]="詫", ["诨"]="諢", ["诩"]="詡", ["诪"]="譸", ["诫"]="誡", ["诬"]="誣", ["语"]="語", ["诮"]="誚", ["误"]="誤", ["诰"]="誥", ["诱"]="誘", ["诲"]="誨", ["诳"]="誑", ["说"]="說", ["诵"]="誦", ["诶"]="誒", ["请"]="請", ["诸"]="諸", ["诹"]="諏", ["诺"]="諾", ["读"]="讀", ["诼"]="諑", ["诽"]="誹", ["课"]="課", ["诿"]="諉", ["谀"]="諛", ["谁"]="誰", ["谂"]="諗", ["调"]="調", ["谄"]="諂", ["谅"]="諒", ["谆"]="諄", ["谇"]="誶", ["谈"]="談", ["谉"]="讅", ["谊"]="誼", ["谋"]="謀", ["谌"]="諶", ["谍"]="諜", ["谎"]="謊", ["谏"]="諫", ["谐"]="諧", ["谑"]="謔", ["谒"]="謁", ["谓"]="謂", ["谔"]="諤", ["谕"]="諭", ["谖"]="諼", ["谗"]="讒", ["谘"]="諮", ["谙"]="諳", ["谚"]="諺", ["谛"]="諦", ["谜"]="謎", ["谝"]="諞", ["谞"]="諝", ["谟"]="謨", ["谠"]="讜", ["谡"]="謖", ["谢"]="謝", ["谣"]="謠", ["谤"]="謗", ["谥"]="謚", ["谦"]="謙", ["谧"]="謐", ["谨"]="謹", ["谩"]="謾", ["谪"]="謫", ["谫"]="譾", ["谬"]="謬", ["谭"]="譚", ["谮"]="譖", ["谯"]="譙", ["谰"]="讕", ["谱"]="譜", ["谲"]="譎", ["谳"]="讞", ["谴"]="譴", ["谵"]="譫", ["谶"]="讖", ["豮"]="豶", ["贝"]="貝", ["贞"]="貞", ["负"]="負", ["贠"]="貟", ["贡"]="貢", ["财"]="財", ["责"]="責", ["贤"]="賢", ["败"]="敗", ["账"]="賬", ["货"]="貨", ["质"]="質", ["贩"]="販", ["贪"]="貪", ["贫"]="貧", ["贬"]="貶", ["购"]="購", ["贮"]="貯", ["贯"]="貫", ["贰"]="貳", ["贱"]="賤", ["贲"]="賁", ["贳"]="貰", ["贴"]="貼", ["贵"]="貴", ["贶"]="貺", ["贷"]="貸", ["贸"]="貿", ["费"]="費", ["贺"]="賀", ["贻"]="貽", ["贼"]="賊", ["贽"]="贄", ["贾"]="賈", ["贿"]="賄", ["赀"]="貲", ["赁"]="賃", ["赂"]="賂", ["赃"]="贓", ["资"]="資", ["赅"]="賅", ["赆"]="贐", ["赇"]="賕", ["赈"]="賑", ["赉"]="賚", ["赊"]="賒", ["赋"]="賦", ["赌"]="賭", ["赍"]="齎", ["赎"]="贖", ["赏"]="賞", ["赐"]="賜", ["赑"]="贔", ["赒"]="賙", ["赓"]="賡", ["赔"]="賠", ["赕"]="賧", ["赖"]="賴", ["赗"]="賵", ["赘"]="贅", ["赙"]="賻", ["赚"]="賺", ["赛"]="賽", ["赜"]="賾", ["赝"]="贗", ["赞"]="贊", ["赟"]="贇", ["赠"]="贈", ["赡"]="贍", ["赢"]="贏", ["赣"]="贛", ["赪"]="赬", ["赵"]="趙", ["赶"]="趕", ["趋"]="趨", ["趱"]="趲", ["趸"]="躉", ["跃"]="躍", ["跄"]="蹌", ["跞"]="躒", ["践"]="踐", ["跶"]="躂", ["跷"]="蹺", ["跸"]="蹕", ["跹"]="躚", ["跻"]="躋", ["踊"]="踴", ["踌"]="躊", ["踪"]="蹤", ["踬"]="躓", ["踯"]="躑", ["蹑"]="躡", ["蹒"]="蹣", ["蹰"]="躕", ["蹿"]="躥", ["躏"]="躪", ["躜"]="躦", ["躯"]="軀", ["车"]="車", ["轧"]="軋", ["轨"]="軌", ["轩"]="軒", ["轪"]="軑", ["轫"]="軔", ["转"]="轉", ["轭"]="軛", ["轮"]="輪", ["软"]="軟", ["轰"]="轟", ["轱"]="軲", ["轲"]="軻", ["轳"]="轤", ["轴"]="軸", ["轵"]="軹", ["轶"]="軼", ["轷"]="軤", ["轸"]="軫", ["轹"]="轢", ["轺"]="軺", ["轻"]="輕", ["轼"]="軾", ["载"]="載", ["轾"]="輊", ["轿"]="轎", ["辀"]="輈", ["辁"]="輇", ["辂"]="輅", ["较"]="較", ["辄"]="輒", ["辅"]="輔", ["辆"]="輛", ["辇"]="輦", ["辈"]="輩", ["辉"]="輝", ["辊"]="輥", ["辋"]="輞", ["辌"]="輬", ["辍"]="輟", ["辎"]="輜", ["辏"]="輳", ["辐"]="輻", ["辑"]="輯", ["辒"]="轀", ["输"]="輸", ["辔"]="轡", ["辕"]="轅", ["辖"]="轄", ["辗"]="輾", ["辘"]="轆", ["辙"]="轍", ["辚"]="轔", ["辞"]="辭", ["辟"]="闢", ["辩"]="辯", ["辫"]="辮", ["边"]="邊", ["辽"]="遼", ["达"]="達", ["迁"]="遷", ["过"]="過", ["迈"]="邁", ["运"]="運", ["还"]="還", ["这"]="這", ["进"]="進", ["远"]="遠", ["违"]="違", ["连"]="連", ["迟"]="遲", ["迩"]="邇", ["迳"]="逕", ["迹"]="跡", ["适"]="適", ["选"]="選", ["逊"]="遜", ["递"]="遞", ["逦"]="邐", ["逻"]="邏", ["遗"]="遺", ["遥"]="遙", ["邓"]="鄧", ["邝"]="鄺", ["邬"]="鄔", ["邮"]="郵", ["邹"]="鄒", ["邺"]="鄴", ["邻"]="鄰", ["郁"]="鬱", ["郏"]="郟", ["郐"]="鄶", ["郑"]="鄭", ["郓"]="鄆", ["郦"]="酈", ["郧"]="鄖", ["郸"]="鄲", ["酂"]="酇", ["酝"]="醞", ["酦"]="醱", ["酱"]="醬", ["酽"]="釅", ["酾"]="釃", ["酿"]="釀", ["释"]="釋", ["里"]="裡", ["鉴"]="鑒", ["銮"]="鑾", ["錾"]="鏨", ["钅"]="釒", ["钆"]="釓", ["钇"]="釔", ["针"]="針", ["钉"]="釘", ["钊"]="釗", ["钋"]="釙", ["钌"]="釕", ["钍"]="釷", ["钎"]="釺", ["钏"]="釧", ["钐"]="釤", ["钑"]="鈒", ["钒"]="釩", ["钓"]="釣", ["钔"]="鍆", ["钕"]="釹", ["钖"]="鍚", ["钗"]="釵", ["钘"]="鈃", ["钙"]="鈣", ["钚"]="鈈", ["钛"]="鈦", ["钜"]="鉅", ["钝"]="鈍", ["钞"]="鈔", ["钟"]="鐘", ["钠"]="鈉", ["钡"]="鋇", ["钢"]="鋼", ["钣"]="鈑", ["钤"]="鈐", ["钥"]="鑰", ["钦"]="欽", ["钧"]="鈞", ["钨"]="鎢", ["钩"]="鉤", ["钪"]="鈧", ["钫"]="鈁", ["钬"]="鈥", ["钭"]="鈄", ["钮"]="鈕", ["钯"]="鈀", ["钰"]="鈺", ["钱"]="錢", ["钲"]="鉦", ["钳"]="鉗", ["钴"]="鈷", ["钵"]="缽", ["钶"]="鈳", ["钷"]="鉕", ["钸"]="鈽", ["钹"]="鈸", ["钺"]="鉞", ["钻"]="鑽", ["钼"]="鉬", ["钽"]="鉭", ["钾"]="鉀", ["钿"]="鈿", ["铀"]="鈾", ["铁"]="鐵", ["铂"]="鉑", ["铃"]="鈴", ["铄"]="鑠", ["铅"]="鉛", ["铆"]="鉚", ["铇"]="鉋", ["铈"]="鈰", ["铉"]="鉉", ["铊"]="鉈", ["铋"]="鉍", ["铌"]="鈮", ["铍"]="鈹", ["铎"]="鐸", ["铏"]="鉶", ["铐"]="銬", ["铑"]="銠", ["铒"]="鉺", ["铓"]="鋩", ["铔"]="錏", ["铕"]="銪", ["铖"]="鋮", ["铗"]="鋏", ["铘"]="鋣", ["铙"]="鐃", ["铚"]="銍", ["铛"]="鐺", ["铜"]="銅", ["铝"]="鋁", ["铞"]="銱", ["铟"]="銦", ["铠"]="鎧", ["铡"]="鍘", ["铢"]="銖", ["铣"]="銑", ["铤"]="鋌", ["铥"]="銩", ["铦"]="銛", ["铧"]="鏵", ["铨"]="銓", ["铩"]="鎩", ["铪"]="鉿", ["铫"]="銚", ["铬"]="鉻", ["铭"]="銘", ["铮"]="錚", ["铯"]="銫", ["铰"]="鉸", ["铱"]="銥", ["铲"]="鏟", ["铳"]="銃", ["铴"]="鐋", ["铵"]="銨", ["银"]="銀", ["铷"]="銣", ["铸"]="鑄", ["铹"]="鐒", ["铺"]="鋪", ["铻"]="鋙", ["铼"]="錸", ["铽"]="鋱", ["链"]="鏈", ["铿"]="鏗", ["销"]="銷", ["锁"]="鎖", ["锂"]="鋰", ["锃"]="鋥", ["锄"]="鋤", ["锅"]="鍋", ["锆"]="鋯", ["锇"]="鋨", ["锈"]="鏽", ["锉"]="銼", ["锊"]="鋝", ["锋"]="鋒", ["锌"]="鋅", ["锍"]="鋶", ["锎"]="鐦", ["锏"]="鐧", ["锐"]="銳", ["锑"]="銻", ["锒"]="鋃", ["锓"]="鋟", ["锔"]="鋦", ["锕"]="錒", ["锖"]="錆", ["锗"]="鍺", ["锘"]="鍩", ["错"]="錯", ["锚"]="錨", ["锛"]="錛", ["锜"]="錡", ["锝"]="鍀", ["锞"]="錁", ["锟"]="錕", ["锠"]="錩", ["锡"]="錫", ["锢"]="錮", ["锣"]="鑼", ["锤"]="錘", ["锥"]="錐", ["锦"]="錦", ["锧"]="鑕", ["锨"]="鍁", ["锩"]="錈", ["锪"]="鍃", ["锫"]="錇", ["锬"]="錟", ["锭"]="錠", ["键"]="鍵", ["锯"]="鋸", ["锰"]="錳", ["锱"]="錙", ["锲"]="鍥", ["锳"]="鍈", ["锴"]="鍇", ["锵"]="鏘", ["锶"]="鍶", ["锷"]="鍔", ["锸"]="鍤", ["锹"]="鍬", ["锺"]="鍾", ["锻"]="鍛", ["锼"]="鎪", ["锽"]="鍠", ["锾"]="鍰", ["锿"]="鎄", ["镀"]="鍍", ["镁"]="鎂", ["镂"]="鏤", ["镃"]="鎡", ["镄"]="鐨", ["镅"]="鎇", ["镆"]="鏌", ["镇"]="鎮", ["镈"]="鎛", ["镉"]="鎘", ["镊"]="鑷", ["镋"]="钂", ["镌"]="鐫", ["镍"]="鎳", ["镎"]="鎿", ["镏"]="鎦", ["镐"]="鎬", ["镑"]="鎊", ["镒"]="鎰", ["镓"]="鎵", ["镔"]="鑌", ["镕"]="鎔", ["镖"]="鏢", ["镗"]="鏜", ["镘"]="鏝", ["镙"]="鏍", ["镚"]="鏰", ["镛"]="鏞", ["镜"]="鏡", ["镝"]="鏑", ["镞"]="鏃", ["镟"]="鏇", ["镠"]="鏐", ["镡"]="鐔", ["镢"]="鐝", ["镣"]="鐐", ["镤"]="鏷", ["镥"]="鑥", ["镦"]="鐓", ["镧"]="鑭", ["镨"]="鐠", ["镩"]="鑹", ["镪"]="鏹", ["镫"]="鐙", ["镬"]="鑊", ["镭"]="鐳", ["镮"]="鐶", ["镯"]="鐲", ["镰"]="鐮", ["镱"]="鐿", ["镲"]="鑔", ["镳"]="鑣", ["镴"]="鑞", ["镵"]="鑱", ["镶"]="鑲", ["长"]="長", ["门"]="門", ["闩"]="閂", ["闪"]="閃", ["闫"]="閆", ["闬"]="閈", ["闭"]="閉", ["问"]="問", ["闯"]="闖", ["闰"]="閏", ["闱"]="闈", ["闲"]="閒", ["闳"]="閎", ["间"]="間", ["闵"]="閔", ["闶"]="閌", ["闷"]="悶", ["闸"]="閘", ["闹"]="鬧", ["闺"]="閨", ["闻"]="聞", ["闼"]="闥", ["闽"]="閩", ["闾"]="閭", ["闿"]="闓", ["阀"]="閥", ["阁"]="閣", ["阂"]="閡", ["阃"]="閫", ["阄"]="鬮", ["阅"]="閱", ["阆"]="閬", ["阇"]="闍", ["阈"]="閾", ["阉"]="閹", ["阊"]="閶", ["阋"]="鬩", ["阌"]="閿", ["阍"]="閽", ["阎"]="閻", ["阏"]="閼", ["阐"]="闡", ["阑"]="闌", ["阒"]="闃", ["阓"]="闠", ["阔"]="闊", ["阕"]="闋", ["阖"]="闔", ["阗"]="闐", ["阘"]="闒", ["阙"]="闕", ["阚"]="闞", ["阛"]="闤", ["队"]="隊", ["阳"]="陽", ["阴"]="陰", ["阵"]="陣", ["阶"]="階", ["际"]="際", ["陆"]="陸", ["陇"]="隴", ["陈"]="陳", ["陉"]="陘", ["陕"]="陝", ["陦"]="隯", ["陧"]="隉", ["陨"]="隕", ["险"]="險", ["随"]="隨", ["隐"]="隱", ["隶"]="隸", ["隽"]="雋", ["难"]="難", ["雇"]="僱", ["雍"]="雝", ["雏"]="雛", ["雠"]="讎", ["雳"]="靂", ["雾"]="霧", ["霁"]="霽", ["霉"]="黴", ["霡"]="霢", ["霭"]="靄", ["靓"]="靚", ["靔"]="靝", ["静"]="靜", ["靥"]="靨", ["鞑"]="韃", ["鞒"]="鞽", ["鞯"]="韉", ["韦"]="韋", ["韧"]="韌", ["韨"]="韍", ["韩"]="韓", ["韪"]="韙", ["韫"]="韞", ["韬"]="韜", ["韵"]="韻", ["页"]="頁", ["顶"]="頂", ["顷"]="頃", ["顸"]="頇", ["项"]="項", ["顺"]="順", ["须"]="須", ["顼"]="頊", ["顽"]="頑", ["顾"]="顧", ["顿"]="頓", ["颀"]="頎", ["颁"]="頒", ["颂"]="頌", ["颃"]="頏", ["预"]="預", ["颅"]="顱", ["领"]="領", ["颇"]="頗", ["颈"]="頸", ["颉"]="頡", ["颊"]="頰", ["颋"]="頲", ["颌"]="頜", ["颍"]="潁", ["颎"]="熲", ["颏"]="頦", ["颐"]="頤", ["频"]="頻", ["颒"]="頮", ["颓"]="頹", ["颔"]="頷", ["颕"]="頴", ["颖"]="穎", ["颗"]="顆", ["题"]="題", ["颙"]="顒", ["颚"]="顎", ["颛"]="顓", ["颜"]="顏", ["额"]="額", ["颞"]="顳", ["颟"]="顢", ["颠"]="顛", ["颡"]="顙", ["颢"]="顥", ["颣"]="纇", ["颤"]="顫", ["颥"]="顬", ["颦"]="顰", ["颧"]="顴", ["风"]="風", ["飏"]="颺", ["飐"]="颭", ["飑"]="颮", ["飒"]="颯", ["飓"]="颶", ["飔"]="颸", ["飕"]="颼", ["飖"]="颻", ["飗"]="飀", ["飘"]="飄", ["飙"]="飆", ["飚"]="飈", ["飞"]="飛", ["飨"]="饗", ["餍"]="饜", ["饣"]="飠", ["饤"]="飣", ["饥"]="飢", ["饦"]="飥", ["饧"]="餳", ["饨"]="飩", ["饩"]="餼", ["饪"]="飪", ["饫"]="飫", ["饬"]="飭", ["饭"]="飯", ["饮"]="飲", ["饯"]="餞", ["饰"]="飾", ["饱"]="飽", ["饲"]="飼", ["饳"]="飿", ["饴"]="飴", ["饵"]="餌", ["饶"]="饒", ["饷"]="餉", ["饸"]="餄", ["饹"]="餎", ["饺"]="餃", ["饻"]="餏", ["饼"]="餅", ["饽"]="餑", ["饾"]="餖", ["饿"]="餓", ["馁"]="餒", ["馂"]="餕", ["馃"]="餜", ["馄"]="餛", ["馅"]="餡", ["馆"]="館", ["馇"]="餷", ["馈"]="饋", ["馉"]="餶", ["馊"]="餿", ["馋"]="饞", ["馌"]="饁", ["馍"]="饃", ["馎"]="餺", ["馏"]="餾", ["馐"]="饈", ["馑"]="饉", ["馒"]="饅", ["馓"]="饊", ["馔"]="饌", ["馕"]="饢", ["马"]="馬", ["驭"]="馭", ["驮"]="馱", ["驯"]="馴", ["驰"]="馳", ["驱"]="驅", ["驲"]="馹", ["驳"]="駁", ["驴"]="驢", ["驵"]="駔", ["驶"]="駛", ["驷"]="駟", ["驸"]="駙", ["驹"]="駒", ["驺"]="騶", ["驻"]="駐", ["驼"]="駝", ["驽"]="駑", ["驾"]="駕", ["驿"]="驛", ["骀"]="駘", ["骁"]="驍", ["骂"]="罵", ["骃"]="駰", ["骄"]="驕", ["骅"]="驊", ["骆"]="駱", ["骇"]="駭", ["骈"]="駢", ["骉"]="驫", ["骊"]="驪", ["骋"]="騁", ["验"]="驗", ["骍"]="騂", ["骎"]="駸", ["骏"]="駿", ["骐"]="騏", ["骑"]="騎", ["骒"]="騍", ["骓"]="騅", ["骔"]="騌", ["骕"]="驌", ["骖"]="驂", ["骗"]="騙", ["骘"]="騭", ["骙"]="騤", ["骚"]="騷", ["骛"]="騖", ["骜"]="驁", ["骝"]="騮", ["骞"]="騫", ["骟"]="騸", ["骠"]="驃", ["骡"]="騾", ["骢"]="驄", ["骣"]="驏", ["骤"]="驟", ["骥"]="驥", ["骦"]="驦", ["骧"]="驤", ["髅"]="髏", ["髋"]="髖", ["髌"]="髕", ["鬓"]="鬢", ["鬶"]="鬹", ["魇"]="魘", ["魉"]="魎", ["鱼"]="魚", ["鱽"]="魛", ["鱾"]="魢", ["鱿"]="魷", ["鲀"]="魨", ["鲁"]="魯", ["鲂"]="魴", ["鲃"]="䰾", ["鲄"]="魺", ["鲅"]="鮁", ["鲆"]="鮃", ["鲇"]="鮎", ["鲈"]="鱸", ["鲉"]="鮋", ["鲊"]="鮓", ["鲋"]="鮒", ["鲌"]="鮊", ["鲍"]="鮑", ["鲎"]="鱟", ["鲏"]="鮍", ["鲐"]="鮐", ["鲑"]="鮭", ["鲒"]="鮚", ["鲓"]="鮳", ["鲔"]="鮪", ["鲕"]="鮞", ["鲖"]="鮦", ["鲗"]="鰂", ["鲘"]="鮜", ["鲙"]="鱠", ["鲚"]="鱭", ["鲛"]="鮫", ["鲜"]="鮮", ["鲝"]="鮺", ["鲞"]="鯗", ["鲟"]="鱘", ["鲠"]="鯁", ["鲡"]="鱺", ["鲢"]="鰱", ["鲣"]="鰹", ["鲤"]="鯉", ["鲥"]="鰣", ["鲦"]="鰷", ["鲧"]="鯀", ["鲨"]="鯊", ["鲩"]="鯇", ["鲪"]="鮶", ["鲫"]="鯽", ["鲬"]="鯒", ["鲭"]="鯖", ["鲮"]="鯪", ["鲯"]="鯕", ["鲰"]="鯫", ["鲱"]="鯡", ["鲲"]="鯤", ["鲳"]="鯧", ["鲴"]="鯝", ["鲵"]="鯢", ["鲶"]="鯰", ["鲷"]="鯛", ["鲸"]="鯨", ["鲹"]="鰺", ["鲺"]="鯴", ["鲻"]="鯔", ["鲼"]="鱝", ["鲽"]="鰈", ["鲾"]="鰏", ["鲿"]="鱨", ["鳀"]="鯷", ["鳁"]="鰮", ["鳂"]="鰃", ["鳃"]="鰓", ["鳄"]="鱷", ["鳅"]="鰍", ["鳆"]="鰒", ["鳇"]="鰉", ["鳈"]="鰁", ["鳉"]="鱂", ["鳊"]="鯿", ["鳋"]="鰠", ["鳌"]="鰲", ["鳍"]="鰭", ["鳎"]="鰨", ["鳏"]="鰥", ["鳐"]="鰩", ["鳑"]="鰟", ["鳒"]="鰜", ["鳓"]="鰳", ["鳔"]="鰾", ["鳕"]="鱈", ["鳖"]="鱉", ["鳗"]="鰻", ["鳘"]="鰵", ["鳙"]="鱅", ["鳚"]="䲁", ["鳛"]="鰼", ["鳜"]="鱖", ["鳝"]="鱔", ["鳞"]="鱗", ["鳟"]="鱒", ["鳠"]="鱯", ["鳡"]="鱤", ["鳢"]="鱧", ["鳣"]="鱣", ["鳤"]="䲘", ["鸟"]="鳥", ["鸠"]="鳩", ["鸡"]="雞", ["鸢"]="鳶", ["鸣"]="鳴", ["鸤"]="鳲", ["鸥"]="鷗", ["鸦"]="鴉", ["鸧"]="鶬", ["鸨"]="鴇", ["鸩"]="鴆", ["鸪"]="鴣", ["鸫"]="鶇", ["鸬"]="鸕", ["鸭"]="鴨", ["鸮"]="鴞", ["鸯"]="鴦", ["鸰"]="鴒", ["鸱"]="鴟", ["鸲"]="鴝", ["鸳"]="鴛", ["鸴"]="鷽", ["鸵"]="鴕", ["鸶"]="鷥", ["鸷"]="鷙", ["鸸"]="鴯", ["鸹"]="鴰", ["鸺"]="鵂", ["鸻"]="鴴", ["鸼"]="鵃", ["鸽"]="鴿", ["鸾"]="鸞", ["鸿"]="鴻", ["鹀"]="鵐", ["鹁"]="鵓", ["鹂"]="鸝", ["鹃"]="鵑", ["鹄"]="鵠", ["鹅"]="鵝", ["鹆"]="鵒", ["鹇"]="鷳", ["鹈"]="鵜", ["鹉"]="鵡", ["鹊"]="鵲", ["鹋"]="鶓", ["鹌"]="鵪", ["鹍"]="鵾", ["鹎"]="鵯", ["鹏"]="鵬", ["鹐"]="鵮", ["鹑"]="鶉", ["鹒"]="鶊", ["鹓"]="鵷", ["鹔"]="鷫", ["鹕"]="鶘", ["鹖"]="鶡", ["鹗"]="鶚", ["鹘"]="鶻", ["鹙"]="鶖", ["鹚"]="鶿", ["鹛"]="鶥", ["鹜"]="鶩", ["鹝"]="鷊", ["鹞"]="鷂", ["鹟"]="鶲", ["鹠"]="鶹", ["鹡"]="鶺", ["鹢"]="鷁", ["鹣"]="鶼", ["鹤"]="鶴", ["鹥"]="鷖", ["鹦"]="鸚", ["鹧"]="鷓", ["鹨"]="鷚", ["鹩"]="鷯", ["鹪"]="鷦", ["鹫"]="鷲", ["鹬"]="鷸", ["鹭"]="鷺", ["鹮"]="䴉", ["鹯"]="鸇", ["鹰"]="鷹", ["鹱"]="鸌", ["鹲"]="鸏", ["鹳"]="鸛", ["鹴"]="鸘", ["鹾"]="鹺", ["麦"]="麥", ["麸"]="麩", ["麹"]="麴", ["黄"]="黃", ["黉"]="黌", ["黡"]="黶", ["黩"]="黷", ["黪"]="黲", ["黾"]="黽", ["鼋"]="黿", ["鼌"]="鼂", ["鼍"]="鼉", ["鼗"]="鞀", ["鼹"]="鼴", ["齐"]="齊", ["齑"]="齏", ["齿"]="齒", ["龀"]="齔", ["龁"]="齕", ["龂"]="齗", ["龃"]="齟", ["龄"]="齡", ["龅"]="齙", ["龆"]="齠", ["龇"]="齜", ["龈"]="齦", ["龉"]="齬", ["龊"]="齪", ["龋"]="齲", ["龌"]="齷", ["龙"]="龍", ["龚"]="龔", ["龛"]="龕", ["龟"]="龜", ["鿎"]="䃮", ["鿏"]="䥑", ["鿒"]="鿓", ["鿔"]="鎶", ["鿕"]="𱆥", ["鿟"]="鿠", ["鿭"]="鉨", ["鿰"]="𬉧", ["鿲"]="𧰎", ["鿴"]="鮗", ["鿵"]="𩷓", ["鿶"]="𩷕", ["鿷"]="𩹎", ["鿸"]="鿳", ["鿹"]="𬵨", ["鿺"]="𪄳", ["𠀾"]="𠁞", ["𠃓"]="昜", ["𠆲"]="儣", ["𠆿"]="𠌥", ["𠇐"]="㒜", ["𠇹"]="俓", ["𠈙"]="俴", ["𠉂"]="㒓", ["𠊟"]="僶", ["𠋆"]="儭", ["𠛅"]="剾", ["𠡠"]="勑", ["𠬤"]="睪", ["𠯟"]="哯", ["𠯠"]="噅", ["𠰱"]="㘉", ["𠰷"]="嚧", ["𠵾"]="㗲", ["𡍣"]="𡔖", ["𡒄"]="壈", ["𡛰"]="嬂", ["𡝠"]="㜷", ["𡞋"]="㜗", ["𡞱"]="㜢", ["𡠟"]="孎", ["𡥧"]="孻", ["𡨡"]="寏", ["𡩁"]="寴", ["𡵝"]="嵸", ["𡶴"]="嵼", ["𡺃"]="嶈", ["𡺄"]="嶘", ["𢀖"]="巠", ["𢋈"]="㢝", ["𢗓"]="㦛", ["𢙏"]="愻", ["𢙐"]="憹", ["𢙒"]="憢", ["𢙓"]="懀", ["𢚾"]="愌", ["𢛯"]="㦎", ["𢧐"]="戰", ["𢪓"]="擧", ["𢫊"]="𢷮", ["𢫘"]="攎", ["𢫬"]="摋", ["𢬍"]="擫", ["𢭏"]="擣", ["𢽾"]="斅", ["𣃁"]="斸", ["𣆐"]="曥", ["𣍨"]="𦢈", ["𣍯"]="腪", ["𣍰"]="脥", ["𣎑"]="臗", ["𣏢"]="槫", ["𣐕"]="桱", ["𣒌"]="楇", ["𣓿"]="橯", ["𣔌"]="樤", ["𣗊"]="樠", ["𣗋"]="欓", ["𣗙"]="㰙", ["𣘐"]="㯤", ["𣘴"]="檭", ["𣚚"]="欘", ["𣞎"]="𣠩", ["𣨼"]="殢", ["𣯣"]="𣯩", ["𣱝"]="氭", ["𣲗"]="湋", ["𣲘"]="潕", ["𣳆"]="㵗", ["𣶇"]="灑", ["𣶩"]="澅", ["𣷷"]="𤅶", ["𣸣"]="濆", ["𣸨"]="濙", ["𣺼"]="灙", ["𣽷"]="瀃", ["𤆓"]="爌", ["𤆢"]="㷍", ["𤇃"]="爄", ["𤇄"]="熌", ["𤇭"]="爖", ["𤇹"]="熚", ["𤇻"]="𭶙", ["𤈶"]="熉", ["𤈷"]="㷿", ["𤊀"]="𤒎", ["𤊰"]="𤓩", ["𤋏"]="熡", ["𤎺"]="㸇", ["𤎻"]="𤑳", ["𤙯"]="𤛮", ["𤝢"]="𤢟", ["𤞃"]="獩", ["𤞤"]="玁", ["𤠋"]="㺏", ["𤥺"]="瑍", ["𤦀"]="瓕", ["𤩽"]="瓛", ["𤶊"]="癐", ["𤶧"]="𤸫", ["𤻊"]="㿗", ["𤽯"]="㿧", ["𤾀"]="皟", ["𤿲"]="麬", ["𥁢"]="䀉", ["𥅴"]="䀹", ["𥆧"]="瞤", ["𥇢"]="䁪", ["𥎝"]="䂎", ["𥐟"]="礒", ["𥐰"]="𥕥", ["𥐻"]="碙", ["𥒎"]="碊", ["𥘌"]="禨", ["𥟂"]="䅘", ["𥫣"]="籅", ["𥬞"]="籋", ["𥬠"]="篘", ["𥮜"]="䉲", ["𥮾"]="篸", ["𥱔"]="𥵃", ["𥸯"]="䊪", ["𥹥"]="𥼽", ["𥺅"]="䊭", ["𦈉"]="緷", ["𦈌"]="綀", ["𦈎"]="繟", ["𦈏"]="緍", ["𦈐"]="縺", ["𦈑"]="緸", ["𦈓"]="䋿", ["𦈔"]="縎", ["𦈕"]="緰", ["𦈖"]="䌈", ["𦈘"]="䌋", ["𦈙"]="䌰", ["𦈚"]="縬", ["𦈛"]="繓", ["𦈜"]="䌖", ["𦈝"]="繏", ["𦈞"]="䌟", ["𦈟"]="䌝", ["𦈠"]="䌥", ["𦈡"]="繻", ["𦍠"]="䍽", ["𦛨"]="朥", ["𦝼"]="膢", ["𦬼"]="薾", ["𦭬"]="𢄋", ["𦮜"]="𣂈", ["𦰏"]="蓧", ["𦰴"]="䕳", ["𦲞"]="蔘", ["𦴇"]="𦾵", ["𦻕"]="蘟", ["𦼖"]="𥣻", ["𧉞"]="䗿", ["𧊄"]="蟙", ["𧏖"]="蠙", ["𧏗"]="蠀", ["𧑏"]="蠾", ["𧜭"]="䙱", ["𧝝"]="襰", ["𧮪"]="詀", ["𧹑"]="䞈", ["𧹒"]="買", ["𧹕"]="䝻", ["𧹖"]="賟", ["𧹗"]="贃", ["𨀁"]="躘", ["𨂺"]="𨈊", ["𨄄"]="𨈌", ["𨅛"]="䠱", ["𨅬"]="躝", ["𨐅"]="軗", ["𨐈"]="輄", ["𨐉"]="𨎮", ["𨑹"]="䢨", ["𨧮"]="䥸", ["𨰾"]="鎷", ["𨰿"]="釳", ["𨱁"]="鈠", ["𨱂"]="鈋", ["𨱃"]="鈲", ["𨱄"]="鈯", ["𨱅"]="鉁", ["𨱆"]="龯", ["𨱇"]="銶", ["𨱈"]="鋉", ["𨱉"]="鍄", ["𨱋"]="錂", ["𨱌"]="鏆", ["𨱍"]="鎯", ["𨱎"]="鍮", ["𨱏"]="鎝", ["𨱑"]="鐄", ["𨱒"]="鏉", ["𨱓"]="鐎", ["𨱔"]="鐏", ["𨱖"]="䥩", ["𨷿"]="䦳", ["𨸂"]="閍", ["𨸃"]="閐", ["𨸄"]="䦘", ["𨸟"]="䧢", ["𩉜"]="鞿", ["𩏼"]="䪏", ["𩏽"]="𩏪", ["𩏿"]="䪘", ["𩐀"]="䪗", ["𩖖"]="顃", ["𩖗"]="䫴", ["𩙥"]="颰", ["𩙧"]="䬞", ["𩙪"]="颷", ["𩙫"]="颾", ["𩙮"]="䬘", ["𩙯"]="䬝", ["𩠃"]="𩛩", ["𩠇"]="䭀", ["𩠈"]="䭃", ["𩠌"]="餸", ["𩧨"]="駎", ["𩧪"]="䮾", ["𩧫"]="駚", ["𩧭"]="䭿", ["𩧯"]="驋", ["𩧰"]="䮝", ["𩧱"]="𩥉", ["𩧲"]="駧", ["𩧴"]="駩", ["𩧺"]="駶", ["𩧼"]="𩣺", ["𩧿"]="䮠", ["𩨀"]="騔", ["𩨁"]="䮞", ["𩨃"]="騝", ["𩨄"]="騪", ["𩨇"]="䮫", ["𩨈"]="騟", ["𩨊"]="騚", ["𩨍"]="𩥇", ["𩨎"]="龭", ["𩨏"]="䮳", ["𩩈"]="䯤", ["𩬣"]="𩭙", ["𩭹"]="鬖", ["𩰰"]="𩰹", ["𩴌"]="𩴵", ["𩽹"]="魥", ["𩽺"]="𩵩", ["𩽼"]="鯶", ["𩽾"]="鮟", ["𩾁"]="鯄", ["𩾂"]="䲖", ["𩾃"]="鮸", ["𩾇"]="鯱", ["𩾈"]="䱙", ["𩾊"]="䱬", ["𩾋"]="䱰", ["𩾌"]="鱇", ["𪉂"]="䲰", ["𪉃"]="鳼", ["𪉅"]="𪀦", ["𪉆"]="鴲", ["𪉊"]="鷨", ["𪉍"]="鵚", ["𪉑"]="鷔", ["𪎈"]="䴬", ["𪎊"]="麨", ["𪎋"]="䴴", ["𪎌"]="麳", ["𪑅"]="䵳", ["𪚐"]="𪘯", ["𪛞"]="𤪤", ["𪞝"]="凙", ["𪟎"]="㔋", ["𪟝"]="勣", ["𪠏"]="𥀬", ["𪠟"]="㓄", ["𪠳"]="唓", ["𪠵"]="㖮", ["𪠸"]="嚛", ["𪠽"]="噹", ["𪡀"]="嘺", ["𪡃"]="嘪", ["𪡋"]="噞", ["𪡏"]="嗹", ["𪡛"]="㗿", ["𪡞"]="嘳", ["𪢌"]="㘓", ["𪢐"]="𡃤", ["𪢕"]="嚽", ["𪢠"]="囒", ["𪢮"]="圞", ["𪢸"]="墲", ["𪣆"]="埬", ["𪣑"]="𮰮", ["𪣒"]="堚", ["𪣻"]="塿", ["𪥫"]="孇", ["𪥰"]="嬣", ["𪥿"]="嬻", ["𪧀"]="孾", ["𪧘"]="寠", ["𪨇"]="𮱣", ["𪨊"]="㞞", ["𪨗"]="屩", ["𪨧"]="崙", ["𪨶"]="輋", ["𪨷"]="巗", ["𪩇"]="㟺", ["𪩎"]="巊", ["𪩘"]="巘", ["𪩷"]="幝", ["𪩸"]="幩", ["𪪏"]="廬", ["𪪑"]="㢗", ["𪪞"]="廧", ["𪪴"]="𢍰", ["𪪼"]="彃", ["𪫌"]="徿", ["𪫷"]="㦞", ["𪫺"]="憸", ["𪭢"]="摐", ["𪭵"]="掚", ["𪭾"]="撊", ["𪮃"]="㨻", ["𪮋"]="㩋", ["𪮖"]="撧", ["𪮳"]="𢺳", ["𪮶"]="攋", ["𪯋"]="㪎", ["𪰶"]="曊", ["𪱥"]="膹", ["𪱷"]="梖", ["𪱾"]="檷", ["𪲎"]="櫅", ["𪲔"]="欐", ["𪲮"]="櫠", ["𪳍"]="欇", ["𪵑"]="毊", ["𪵣"]="霼", ["𪵱"]="濿", ["𪶄"]="溡", ["𪷍"]="㵾", ["𪷽"]="灒", ["𪸕"]="熂", ["𪸩"]="煇", ["𪹳"]="爥", ["𪺪"]="𤜆", ["𪺭"]="犞", ["𪺴"]="㹙", ["𪺷"]="獊", ["𪺻"]="㺜", ["𪺽"]="猌", ["𪻐"]="瑽", ["𪻨"]="瓄", ["𪻲"]="瑻", ["𪻺"]="璝", ["𪼋"]="㻶", ["𪽈"]="畼", ["𪽪"]="痮", ["𪽮"]="㿖", ["𪽷"]="瘱", ["𪾔"]="盨", ["𪾢"]="睍", ["𪾣"]="眝", ["𪾦"]="矑", ["𪾸"]="矉", ["𪿫"]="礮", ["𫀨"]="䅐", ["𫀬"]="䅳", ["𫁂"]="䆉", ["𫁟"]="竱", ["𫁡"]="鴗", ["𫁲"]="䉑", ["𫁳"]="𥯤", ["𫁷"]="䉶", ["𫂃"]="簢", ["𫂆"]="簂", ["𫂈"]="䉬", ["𫄚"]="䊺", ["𫄛"]="紟", ["𫄜"]="䋃", ["𫄞"]="䋔", ["𫄟"]="絁", ["𫄠"]="絙", ["𫄡"]="絧", ["𫄢"]="絥", ["𫄣"]="繷", ["𫄤"]="繨", ["𫄥"]="纚", ["𫄧"]="綖", ["𫄨"]="絺", ["𫄩"]="䋦", ["𫄫"]="綟", ["𫄬"]="緤", ["𫄭"]="緮", ["𫄮"]="䋼", ["𫄰"]="縍", ["𫄱"]="繬", ["𫄲"]="縸", ["𫄳"]="縰", ["𫄴"]="繂", ["𫄶"]="繈", ["𫄷"]="繶", ["𫄸"]="纁", ["𫄹"]="纗", ["𫅅"]="䍤", ["𫅗"]="羵", ["𫅭"]="䎙", ["𫆏"]="聻", ["𫇘"]="𦧺", ["𫇦"]="𤇾", ["𫇭"]="蒍", ["𫇴"]="蒭", ["𫈉"]="蕳", ["𫈎"]="葝", ["𫈟"]="蔯", ["𫈵"]="蕝", ["𫉁"]="薆", ["𫉄"]="藷", ["𫊪"]="䗅", ["𫊮"]="蠦", ["𫊸"]="蟜", ["𫊻"]="蟳", ["𫋇"]="蟂", ["𫋌"]="蟘", ["𫋲"]="䙔", ["𫋷"]="襗", ["𫋹"]="襓", ["𫋻"]="襘", ["𫌀"]="襀", ["𫌇"]="襵", ["𫌋"]="𧞫", ["𫌨"]="覼", ["𫌪"]="覛", ["𫌭"]="覹", ["𫌯"]="䚩", ["𫍙"]="訑", ["𫍚"]="訞", ["𫍛"]="訜", ["𫍜"]="詓", ["𫍠"]="䛄", ["𫍡"]="詑", ["𫍢"]="譊", ["𫍣"]="詷", ["𫍤"]="譑", ["𫍥"]="誂", ["𫍦"]="譨", ["𫍧"]="誺", ["𫍨"]="誫", ["𫍩"]="諣", ["𫍪"]="誋", ["𫍫"]="䛳", ["𫍬"]="誷", ["𫍮"]="誳", ["𫍯"]="諴", ["𫍰"]="諰", ["𫍱"]="諯", ["𫍲"]="謏", ["𫍳"]="諥", ["𫍴"]="謱", ["𫍵"]="謸", ["𫍷"]="謉", ["𫍸"]="謆", ["𫍹"]="謯", ["𫍻"]="譆", ["𫍽"]="譞", ["𫍿"]="譾", ["𫎆"]="豵", ["𫎌"]="貗", ["𫎦"]="贚", ["𫎧"]="䝭", ["𫎩"]="賝", ["𫎪"]="䞋", ["𫎫"]="贉", ["𫎬"]="贑", ["𫎭"]="䞓", ["𫎱"]="䟐", ["𫎳"]="䟆", ["𫎺"]="䟃", ["𫏃"]="䠆", ["𫏆"]="蹳", ["𫏋"]="蹻", ["𫏌"]="𨂐", ["𫏐"]="蹔", ["𫏕"]="𨆪", ["𫐄"]="軏", ["𫐆"]="轣", ["𫐇"]="軜", ["𫐈"]="軷", ["𫐉"]="軨", ["𫐊"]="軬", ["𫐌"]="軿", ["𫐎"]="輢", ["𫐏"]="輖", ["𫐐"]="輗", ["𫐑"]="輨", ["𫐒"]="輷", ["𫐓"]="輮", ["𫐕"]="轊", ["𫐖"]="轇", ["𫐗"]="轐", ["𫐘"]="轗", ["𫐙"]="轠", ["𫐷"]="遱", ["𫑘"]="鄟", ["𫑡"]="鄳", ["𫑷"]="醶", ["𫓥"]="釟", ["𫓦"]="釨", ["𫓧"]="鈇", ["𫓩"]="鏦", ["𫓪"]="鈆", ["𫓬"]="鉔", ["𫓭"]="鉠", ["𫓯"]="銈", ["𫓰"]="銊", ["𫓱"]="鐈", ["𫓲"]="銁", ["𫓴"]="鉾", ["𫓵"]="鋠", ["𫓶"]="鋗", ["𫓸"]="錽", ["𫓹"]="錤", ["𫓺"]="鐪", ["𫓻"]="錜", ["𫓽"]="錝", ["𫓾"]="錥", ["𫔁"]="鐼", ["𫔂"]="鍉", ["𫔃"]="𨰲", ["𫔄"]="鍒", ["𫔅"]="鎍", ["𫔆"]="䥯", ["𫔇"]="鎞", ["𫔈"]="鎙", ["𫔉"]="𨰃", ["𫔋"]="䥗", ["𫔌"]="鏾", ["𫔍"]="鐇", ["𫔎"]="鐍", ["𫔔"]="鑴", ["𫔭"]="開", ["𫔯"]="閗", ["𫔰"]="閞", ["𫔴"]="閵", ["𫔵"]="䦯", ["𫔶"]="闑", ["𫕥"]="霣", ["𫖃"]="靧", ["𫖅"]="䪊", ["𫖇"]="鞾", ["𫖒"]="韠", ["𫖔"]="韛", ["𫖕"]="韝", ["𫖫"]="䪴", ["𫖬"]="䪾", ["𫖮"]="顗", ["𫖯"]="頫", ["𫖰"]="䫂", ["𫖱"]="䫀", ["𫖲"]="䫟", ["𫖳"]="頵", ["𫖵"]="𩓥", ["𫖶"]="顅", ["𫖸"]="願", ["𫖹"]="顣", ["𫖺"]="䫶", ["𫗇"]="䫻", ["𫗉"]="𩗴", ["𫗊"]="䬓", ["𫗋"]="飋", ["𫗚"]="𩟗", ["𫗞"]="飦", ["𫗟"]="䬧", ["𫗠"]="餦", ["𫗢"]="飵", ["𫗣"]="飶", ["𫗥"]="餫", ["𫗦"]="餔", ["𫗧"]="餗", ["𫗩"]="饠", ["𫗪"]="餧", ["𫗫"]="餬", ["𫗬"]="餪", ["𫗮"]="餭", ["𫗰"]="䭔", ["𫗱"]="䭑", ["𫗴"]="饘", ["𫗵"]="饟", ["𫘛"]="馯", ["𫘜"]="馼", ["𫘝"]="駃", ["𫘞"]="駞", ["𫘟"]="駊", ["𫘠"]="駤", ["𫘡"]="駫", ["𫘣"]="駻", ["𫘤"]="騃", ["𫘥"]="騉", ["𫘦"]="騊", ["𫘧"]="騄", ["𫘨"]="騠", ["𫘩"]="騜", ["𫘪"]="騵", ["𫘫"]="騴", ["𫘬"]="騱", ["𫘭"]="騻", ["𫘮"]="䮰", ["𫘯"]="驓", ["𫘰"]="驙", ["𫘱"]="驨", ["𫘽"]="鬠", ["𫚈"]="鱮", ["𫚉"]="魟", ["𫚊"]="鰑", ["𫚋"]="鱄", ["𫚌"]="魦", ["𫚍"]="魵", ["𫚏"]="䱁", ["𫚐"]="䱀", ["𫚑"]="鮅", ["𫚒"]="鮄", ["𫚓"]="鮤", ["𫚔"]="鮰", ["𫚕"]="鰤", ["𫚖"]="鮆", ["𫚗"]="鮯", ["𫚙"]="鯆", ["𫚚"]="鮿", ["𫚛"]="鮵", ["𫚜"]="䲅", ["𫚞"]="鯬", ["𫚠"]="䱧", ["𫚡"]="鯞", ["𫚢"]="鰋", ["𫚣"]="鯾", ["𫚤"]="鰦", ["𫚥"]="鰕", ["𫚦"]="鰫", ["𫚧"]="鰽", ["𫚪"]="鱊", ["𫚫"]="鱢", ["𫚭"]="鱲", ["𫛚"]="鳽", ["𫛛"]="鳷", ["𫛜"]="鴀", ["𫛝"]="鴅", ["𫛞"]="鴃", ["𫛟"]="鸗", ["𫛡"]="鴔", ["𫛢"]="鸋", ["𫛣"]="鴥", ["𫛤"]="鴐", ["𫛥"]="鵊", ["𫛦"]="鴮", ["𫛨"]="鵧", ["𫛩"]="鴳", ["𫛪"]="鴽", ["𫛫"]="鶰", ["𫛬"]="䳜", ["𫛭"]="鵟", ["𫛮"]="䳤", ["𫛯"]="鶭", ["𫛰"]="䳢", ["𫛱"]="鵫", ["𫛳"]="鵩", ["𫛴"]="鷤", ["𫛵"]="鶌", ["𫛶"]="鶒", ["𫛷"]="鶦", ["𫛸"]="鶗", ["𫛺"]="䳧", ["𫛼"]="䳫", ["𫛽"]="鷅", ["𫜀"]="鷐", ["𫜁"]="鷩", ["𫜃"]="鷣", ["𫜄"]="鷷", ["𫜅"]="䴋", ["𫜑"]="麷", ["𫜒"]="䴱", ["𫜔"]="䴽", ["𫜙"]="䵴", ["𫜨"]="䶕", ["𫜪"]="齩", ["𫜬"]="齰", ["𫜭"]="齭", ["𫜮"]="齴", ["𫜰"]="齾", ["𫜲"]="龓", ["𫜳"]="䶲", ["𫜷"]="𨞪", ["𫝈"]="㑮", ["𫝋"]="𠐊", ["𫝦"]="㛝", ["𫝧"]="㜐", ["𫝨"]="媈", ["𫝩"]="嬦", ["𫝪"]="𡟫", ["𫝫"]="婡", ["𫝬"]="嬇", ["𫝭"]="孆", ["𫝮"]="孄", ["𫝵"]="嶹", ["𫞅"]="𣎟", ["𫞗"]="潣", ["𫞚"]="澬", ["𫞛"]="㶆", ["𫞝"]="灍", ["𫞠"]="爧", ["𫞡"]="爃", ["𫞢"]="𤛱", ["𫞣"]="㹽", ["𫞥"]="珼", ["𫞦"]="璾", ["𫞧"]="𤩂", ["𫞨"]="璼", ["𫞩"]="璊", ["𫞷"]="𥢶", ["𫟃"]="絍", ["𫟄"]="綋", ["𫟅"]="綡", ["𫟆"]="緟", ["𫟇"]="𦆲", ["𫟑"]="䖅", ["𫟕"]="䕤", ["𫟞"]="訨", ["𫟟"]="詊", ["𫟠"]="譂", ["𫟡"]="誴", ["𫟢"]="䜖", ["𫟤"]="䡐", ["𫟥"]="䡩", ["𫟦"]="䡵", ["𫟫"]="𨞺", ["𫟬"]="𨟊", ["𫟲"]="釚", ["𫟳"]="釲", ["𫟴"]="鈖", ["𫟵"]="鈗", ["𫟶"]="銏", ["𫟷"]="鉝", ["𫟸"]="鉽", ["𫟹"]="鉷", ["𫟺"]="䤤", ["𫟻"]="銂", ["𫟼"]="鐽", ["𫟽"]="𨧰", ["𫟾"]="𨩰", ["𫟿"]="鎈", ["𫠀"]="䥄", ["𫠁"]="鑉", ["𫠂"]="閝", ["𫠅"]="韚", ["𫠆"]="頍", ["𫠇"]="𩖰", ["𫠈"]="䫾", ["𫠊"]="䮄", ["𫠋"]="騼", ["𫠌"]="𩦠", ["𫠏"]="𩵦", ["𫠐"]="魽", ["𫠑"]="䱸", ["𫠒"]="鱆", ["𫠖"]="𩿅", ["𫠜"]="齯", ["𫢒"]="儱", ["𫢙"]="働", ["𫢪"]="僆", ["𫢬"]="僗", ["𫢭"]="儰", ["𫢲"]="𫣴", ["𫢸"]="僤", ["𫢺"]="傪", ["𫣉"]="儖", ["𫣊"]="僾", ["𫦅"]="㔅", ["𫦌"]="㔃", ["𫦕"]="𠠜", ["𫦩"]="㔝", ["𫦰"]="𫦸", ["𫦳"]="㔢", ["𫧃"]="𣍐", ["𫧮"]="𪋿", ["𫧯"]="卨", ["𫧿"]="贕", ["𫩕"]="嚝", ["𫩛"]="㗰", ["𫩤"]="㗼", ["𫩩"]="㗙", ["𫩫"]="嚈", ["𫩳"]="𠼮", ["𫩺"]="嚍", ["𫪀"]="㗻", ["𫪁"]="唻", ["𫪂"]="㘙", ["𫪄"]="𠼤", ["𫪘"]="𡂿", ["𫪧"]="嘄", ["𫪺"]="㗣", ["𫫇"]="噁", ["𫫦"]="嚪", ["𫫾"]="嚬", ["𫬐"]="㘔", ["𫭞"]="塼", ["𫭟"]="塸", ["𫭢"]="埨", ["𫭨"]="墢", ["𫭪"]="墝", ["𫭲"]="壧", ["𫭼"]="𡑍", ["𫮃"]="墠", ["𫮅"]="墋", ["𫮜"]="㙬", ["𫯥"]="奯", ["𫰂"]="奲", ["𫰍"]="媁", ["𫰐"]="婜", ["𫰛"]="娙", ["𫰠"]="㜭", ["𫰡"]="嬅", ["𫰢"]="嬒", ["𫰨"]="㜥", ["𫰰"]="嬐", ["𫰹"]="嫢", ["𫱕"]="㜮", ["𫲗"]="㜺", ["𫳃"]="㝞", ["𫵵"]="崵", ["𫵶"]="𡺨", ["𫵷"]="㠣", ["𫵸"]="𡷨", ["𫶄"]="𫶦", ["𫶅"]="㠁", ["𫶇"]="嵽", ["𫶊"]="𡽳", ["𫶕"]="巆", ["𫶲"]="𣫒", ["𫷅"]="㡓", ["𫷌"]="𢅡", ["𫷬"]="庲", ["𫷮"]="廕", ["𫷷"]="廞", ["𫷹"]="廔", ["𫷾"]="廮", ["𫸩"]="彄", ["𫹮"]="懙", ["𫹴"]="愇", ["𫹽"]="慯", ["𫺁"]="㤲", ["𫺂"]="悏", ["𫺆"]="㦊", ["𫺊"]="懠", ["𫺌"]="愩", ["𫺓"]="㦖", ["𫺘"]="憦", ["𫺷"]="戁", ["𫻁"]="㦦", ["𫼝"]="搊", ["𫼟"]="摥", ["𫼣"]="𢳂", ["𫼤"]="𢯩", ["𫼥"]="㨟", ["𫼧"]="撶", ["𫼪"]="摌", ["𫼮"]="擃", ["𫼱"]="摃", ["𫼵"]="𢲸", ["𫼾"]="𢲩", ["𫽀"]="㨥", ["𫽁"]="摙", ["𫽇"]="㩇", ["𫽊"]="㩭", ["𫽋"]="攞", ["𫽣"]="摪", ["𫽥"]="攑", ["𫽧"]="㩌", ["𫽮"]="攩", ["𫾉"]="㩣", ["𫿳"]="㪻", ["𬀩"]="暐", ["𬀪"]="晛", ["𬀮"]="㬣", ["𬀱"]="暟", ["𬁢"]="曫", ["𬁵"]="膒", ["𬁺"]="𦜖", ["𬁽"]="䐣", ["𬂀"]="膶", ["𬂂"]="𦣇", ["𬂅"]="䐷", ["𬂉"]="賸", ["𬂠"]="橅", ["𬂩"]="梜", ["𬂮"]="榝", ["𬂰"]="檂", ["𬂱"]="𪳷", ["𬃀"]="槻", ["𬃊"]="櫍", ["𬃘"]="樲", ["𬃲"]="䫐", ["𬄩"]="櫽", ["𬅉"]="欗", ["𬅢"]="㰰", ["𬅥"]="歄", ["𬅫"]="歕", ["𬆦"]="毄", ["𬆮"]="鷇", ["𬆾"]="覒", ["𬇕"]="澫", ["𬇘"]="漙", ["𬇙"]="浿", ["𬇰"]="㵍", ["𬇹"]="漍", ["𬈁"]="潬", ["𬈕"]="㵒", ["𬈜"]="濴", ["𬈧"]="濇", ["𬉇"]="㵤", ["𬉋"]="瀢", ["𬉏"]="瀩", ["𬉠"]="灡", ["𬉼"]="熰", ["𬊂"]="煼", ["𬊈"]="燖", ["𬊉"]="燵", ["𬊍"]="燽", ["𬊎"]="熕", ["𬊖"]="燘", ["𬊜"]="𤓓", ["𬊤"]="燀", ["𬊦"]="覢", ["𬊵"]="爣", ["𬊶"]="爁", ["𬊺"]="燰", ["𬊾"]="㸐", ["𬋍"]="㸊", ["𬌛"]="㹂", ["𬌝"]="犓", ["𬌮"]="獟", ["𬌷"]="㺑", ["𬍙"]="琖", ["𬍛"]="瓅", ["𬍜"]="𤪥", ["𬍡"]="璗", ["𬍤"]="璕", ["𬎆"]="㼆", ["𬎑"]="瓓", ["𬎧"]="㼻", ["𬏜"]="㾺", ["𬏟"]="㾵", ["𬏦"]="癈", ["𬏮"]="瘑", ["𬏷"]="㿎", ["𬐠"]="𥂸", ["𬑆"]="睔", ["𬑏"]="䀴", ["𬑒"]="䁱", ["𬑓"]="瞱", ["𬑕"]="睴", ["𬑗"]="瞷", ["𬑧"]="矊", ["𬒆"]="礏", ["𬒈"]="礐", ["𬒍"]="磒", ["𬒎"]="䃘", ["𬒕"]="䃤", ["𬒗"]="𥗽", ["𬓠"]="穖", ["𬓸"]="䵘", ["𬓼"]="穨", ["𬕂"]="篢", ["𬕄"]="籭", ["𬕊"]="䉍", ["𬕛"]="䉐", ["𬕦"]="䉱", ["𬖃"]="籫", ["𬖑"]="粯", ["𬖘"]="𥼶", ["𬖠"]="㪹", ["𬖮"]="糮", ["𬘓"]="紃", ["𬘕"]="紌", ["𬘖"]="絸", ["𬘘"]="紞", ["𬘙"]="䋐", ["𬘛"]="紶", ["𬘜"]="䋎", ["𬘝"]="紾", ["𬘟"]="絤", ["𬘠"]="絠", ["𬘡"]="絪", ["𬘢"]="絖", ["𬘤"]="絽", ["𬘥"]="絟", ["𬘨"]="綕", ["𬘩"]="綎", ["𬘪"]="䌞", ["𬘫"]="綄", ["𬘬"]="綪", ["𬘭"]="綝", ["𬘮"]="䌐", ["𬘯"]="綧", ["𬘰"]="緛", ["𬘱"]="䌁", ["𬘲"]="䋾", ["𬘴"]="䋺", ["𬘵"]="縆", ["𬘶"]="緧", ["𬘷"]="縒", ["𬘺"]="縚", ["𬘻"]="縖", ["𬙁"]="䌪", ["𬙂"]="縯", ["𬙆"]="繙", ["𬙇"]="繎", ["𬙈"]="繗", ["𬙉"]="繵", ["𬙊"]="纆", ["𬙋"]="纕", ["𬙎"]="罏", ["𬙝"]="罼", ["𬙭"]="䍷", ["𬙯"]="羜", ["𬚄"]="䎘", ["𬛹"]="䑗", ["𬛼"]="轝", ["𬜤"]="菣", ["𬜥"]="葻", ["𬜧"]="蕟", ["𬜨"]="薉", ["𬜬"]="蔄", ["𬜯"]="䓣", ["𬜾"]="藖", ["𬜿"]="蔮", ["𬝁"]="䔡", ["𬝃"]="𤎤", ["𬝯"]="薲", ["𬝴"]="䕼", ["𬞕"]="蘭", ["𬞘"]="藬", ["𬞟"]="蘋", ["𬞫"]="蘫", ["𬟁"]="虉", ["𬟪"]="覤", ["𬟺"]="𧐱", ["𬟽"]="蝀", ["𬠅"]="蟷", ["𬠠"]="蠈", ["𬠱"]="𧖦", ["𬡇"]="褭", ["𬡒"]="裌", ["𬡓"]="褺", ["𬡠"]="𧟌", ["𬡷"]="襸", ["𬡻"]="䊲", ["𬢊"]="覗", ["𬢋"]="覜", ["𬢌"]="覟", ["𬢎"]="覩", ["𬢐"]="䚉", ["𬢑"]="䚆", ["𬢒"]="覭", ["𬢔"]="覴", ["𬢯"]="譻", ["𬣀"]="讆", ["𬣙"]="訏", ["𬣛"]="䚳", ["𬣜"]="䚽", ["𬣝"]="𧥺", ["𬣞"]="詝", ["𬣟"]="䚵", ["𬣠"]="詌", ["𬣡"]="諓", ["𬣤"]="詃", ["𬣥"]="詜", ["𬣦"]="詏", ["𬣧"]="䛍", ["𬣨"]="𧧝", ["𬣩"]="詴", ["𬣬"]="䛛", ["𬣭"]="譡", ["𬣮"]="詺", ["𬣯"]="䛘", ["𬣰"]="詯", ["𬣱"]="詶", ["𬣲"]="誁", ["𬣳"]="詪", ["𬣶"]="𧨊", ["𬣷"]="誎", ["𬣸"]="䛞", ["𬣹"]="䛤", ["𬣻"]="誔", ["𬣼"]="誏", ["𬣽"]="謰", ["𬣾"]="諎", ["𬣿"]="䜎", ["𬤀"]="諕", ["𬤁"]="䛬", ["𬤂"]="𧨾", ["𬤄"]="謲", ["𬤇"]="諲", ["𬤉"]="䜋", ["𬤊"]="諟", ["𬤌"]="䛽", ["𬤍"]="諻", ["𬤎"]="諠", ["𬤐"]="謌", ["𬤑"]="䛿", ["𬤗"]="𬣘", ["𬤘"]="䜉", ["𬤙"]="謼", ["𬤛"]="讇", ["𬤝"]="譓", ["𬤟"]="䜍", ["𬤡"]="䜒", ["𬤢"]="譐", ["𬤣"]="譈", ["𬤤"]="譄", ["𬤥"]="譔", ["𬤦"]="讉", ["𬤨"]="譟", ["𬤩"]="譺", ["𬤪"]="䜚", ["𬤫"]="譹", ["𬤬"]="䜝", ["𬤭"]="譿", ["𬤰"]="讙", ["𬥄"]="䝕", ["𬥈"]="䫉", ["𬥊"]="䝡", ["𬥵"]="䝯", ["𬥶"]="貱", ["𬥷"]="𧶄", ["𬥸"]="賗", ["𬥺"]="䞁", ["𬥻"]="䞂", ["𬥽"]="䞀", ["𬥾"]="𧸦", ["𬦅"]="𧼮", ["𬦥"]="䟺", ["𬦣"]="𨇗", ["𬦧"]="踚", ["𬦫"]="𨆅", ["𬦻"]="躀", ["𬦾"]="𨈇", ["𬧀"]="蹡", ["𬧃"]="䠮", ["𬧛"]="𨈆", ["𬧢"]="䡁", ["𬧤"]="軂", ["𬨁"]="軞", ["𬨂"]="軝", ["𬨄"]="軮", ["𬨆"]="䡗", ["𬨇"]="輆", ["𬨈"]="輓", ["𬨉"]="䡘", ["𬨋"]="𨌄", ["𬨌"]="䡟", ["𬨍"]="輵", ["𬨎"]="輶", ["𬨑"]="䡦", ["𬨓"]="轈", ["𬨔"]="䡶", ["𬨕"]="䡹", ["𬨨"]="過", ["𬩽"]="鄩", ["𬩾"]="郲", ["𬪍"]="鄮", ["𬪧"]="醧", ["𬪨"]="醆", ["𬪩"]="醲", ["𬪯"]="𨤋", ["𬪺"]="𨤡", ["𬬧"]="釬", ["𬬨"]="釫", ["𬬩"]="釴", ["𬬫"]="鈚", ["𬬬"]="鍏", ["𬬭"]="錀", ["𬬮"]="鋹", ["𬬯"]="鈓", ["𬬰"]="鎗", ["𬬱"]="釿", ["𬬲"]="釽", ["𬬵"]="鈂", ["𬬷"]="鉐", ["𬬸"]="鉥", ["𬬹"]="鉮", ["𬬺"]="鉏", ["𬬻"]="鑪", ["𬬼"]="𨭥", ["𬬽"]="鈼", ["𬬾"]="鑏", ["𬬿"]="鉊", ["𬭀"]="鈶", ["𬭁"]="鉧", ["𬭃"]="銔", ["𬭅"]="銗", ["𬭆"]="䤪", ["𬭈"]="䤩", ["𬭉"]="鑇", ["𬭊"]="𨧀", ["𬭌"]="鋘", ["𬭍"]="銲", ["𬭎"]="鋐", ["𬭓"]="錪", ["𬭔"]="鑡", ["𬭕"]="錭", ["𬭖"]="錋", ["𬭗"]="錗", ["𬭙"]="𨭐", ["𬭚"]="錞", ["𬭛"]="𨨏", ["𬭜"]="錑", ["𬭝"]="鏒", ["𬭡"]="鍣", ["𬭢"]="鐀", ["𬭣"]="䤼", ["𬭤"]="鍭", ["𬭦"]="鎒", ["𬭨"]="鎚", ["𬭩"]="鎓", ["𬭪"]="鎋", ["𬭫"]="𨫀", ["𬭬"]="鏏", ["𬭭"]="鏚", ["𬭮"]="鏋", ["𬭯"]="䥕", ["𬭰"]="鏔", ["𬭲"]="鏁", ["𬭳"]="𨭎", ["𬭴"]="䥛", ["𬭵"]="𨭌", ["𬭶"]="𨭆", ["𬭸"]="鏻", ["𬭻"]="䥞", ["𬭼"]="鐩", ["𬭽"]="鐴", ["𬮀"]="𨯵", ["𬮁"]="鑮", ["𬮟"]="焛", ["𬮠"]="閜", ["𬮢"]="閧", ["𬮥"]="閦", ["𬮨"]="䦝", ["𬮭"]="闚", ["𬮱"]="闉", ["𬮲"]="闄", ["𬮳"]="闆", ["𬮴"]="闇", ["𬮺"]="䧞", ["𬮻"]="隖", ["𬮿"]="隑", ["𬯀"]="隮", ["𬯎"]="隤", ["𬰣"]="𩉍", ["𬰥"]="䩫", ["𬰳"]="䪓", ["𬰶"]="韢", ["𬰷"]="䪜", ["𬱓"]="頄", ["𬱖"]="頔", ["𬱗"]="頕", ["𬱙"]="頖", ["𬱜"]="頛", ["𬱟"]="頠", ["𬱠"]="頢", ["𬱢"]="顐", ["𬱣"]="䫈", ["𬱦"]="䫏", ["𬱪"]="顊", ["𬱫"]="顁", ["𬱬"]="䫩", ["𬱮"]="䫜", ["𬱯"]="䭭", ["𬱰"]="䫠", ["𬱳"]="龥", ["𬱵"]="颹", ["𬱷"]="䫼", ["𬱸"]="䬂", ["𬱼"]="颽", ["𬱽"]="颴", ["𬱿"]="䬎", ["𬲀"]="䬍", ["𬲅"]="飉", ["𬲕"]="䭕", ["𬲫"]="䬯", ["𬲭"]="飷", ["𬲮"]="䬫", ["𬲯"]="䬲", ["𬲰"]="𩞃", ["𬲲"]="䭢", ["𬲳"]="䭞", ["𬲶"]="䭣", ["𬲷"]="䬶", ["𬲹"]="𩛲", ["𬲻"]="䬾", ["𬲼"]="餣", ["𬲾"]="䭅", ["𬲿"]="𩜠", ["𬳀"]="䭇", ["𬳂"]="餟", ["𬳅"]="䭉", ["𬳆"]="餰", ["𬳊"]="饀", ["𬳋"]="䭒", ["𬳍"]="餹", ["𬳏"]="𩞘", ["𬳑"]="䭘", ["𬳟"]="馩", ["𬳳"]="颿", ["𬳴"]="駍", ["𬳵"]="駓", ["𬳶"]="駉", ["𬳸"]="䮸", ["𬳽"]="駪", ["𬳾"]="䮈", ["𬳿"]="駼", ["𬴀"]="駺", ["𬴁"]="䮗", ["𬴂"]="騑", ["𬴃"]="騞", ["𬴅"]="騯", ["𬴆"]="騹", ["𬴊"]="驎", ["𬴋"]="驖", ["𬴍"]="䮽", ["𬴏"]="䮿", ["𬴐"]="驩", ["𬴩"]="鬞", ["𬶀"]="魝", ["𬶁"]="魜", ["𬶂"]="𩵚", ["𬶄"]="魡", ["𬶆"]="䰷", ["𬶇"]="魪", ["𬶊"]="䱍", ["𬶋"]="鮈", ["𬶌"]="鮘", ["𬶍"]="鮀", ["𬶎"]="䲙", ["𬶏"]="鮠", ["𬶐"]="鮡", ["𬶓"]="䱓", ["𬶕"]="鮷", ["𬶖"]="𩸆", ["𬶗"]="䲏", ["𬶛"]="鱓", ["𬶞"]="鰗", ["𬶟"]="鯻", ["𬶠"]="鰊", ["𬶣"]="䱹", ["𬶤"]="䱱", ["𬶥"]="𱇋", ["𬶧"]="鰇", ["𬶨"]="鱀", ["𬶫"]="鱑", ["𬶬"]="鱋", ["𬶭"]="鰶", ["𬶮"]="鱚", ["𬶲"]="鱌", ["𬶴"]="䲕", ["𬶵"]="鱞", ["𬶺"]="鱹", ["𬷕"]="鵏", ["𬷾"]="䲨", ["𬸀"]="鴍", ["𬸅"]="鶵", ["𬸆"]="䲼", ["𬸈"]="鵄", ["𬸊"]="鵀", ["𬸏"]="𪁜", ["𬸒"]="鶀", ["𬸕"]="鸎", ["𬸘"]="鶠", ["𬸚"]="鸑", ["𬸛"]="䳨", ["𬸜"]="鶣", ["𬸞"]="鷜", ["𬸡"]="𪇖", ["𬸢"]="鷎", ["𬸣"]="鶱", ["𬸦"]="鷟", ["𬸧"]="鷰", ["𬸩"]="䴈", ["𬸪"]="鷭", ["𬸭"]="𪆰", ["𬸮"]="𪆴", ["𬸯"]="鷿", ["𬸱"]="鸜", ["𬸾"]="麡", ["𬹅"]="䴭", ["𬹉"]="䴷", ["𬹔"]="䵖", ["𬹣"]="鼄", ["𬹭"]="𪕣", ["𬹺"]="齖", ["𬹼"]="齘", ["𬹾"]="𪗳", ["𬹿"]="𪗪", ["𬺃"]="䶣", ["𬺄"]="𪗽", ["𬺈"]="齮", ["𬺉"]="䶦", ["𬺌"]="𪘲", ["𬺍"]="䶢", ["𬺎"]="齹", ["𬺓"]="齼", ["𬺔"]="齽", ["𬺕"]="䶪", ["𬺖"]="𪚅", ["𬺜"]="㰍", ["𬾣"]="𠐮", ["𭄛"]="劗", ["𭇜"]="㗶", ["𭊸"]="𡅘", ["𭎂"]="㙡", ["𭎜"]="壔", ["𭏸"]="壝", ["𭑸"]="𡢿", ["𭘓"]="幠", ["𭚦"]="彍", ["𭝋"]="㦭", ["𭞄"]="懓", ["𭣇"]="攧", ["𭣧"]="斁", ["𭤎"]="斄", ["𭤰"]="旟", ["𭧋"]="曭", ["𭨶"]="𮌲", ["𭩚"]="檥", ["𭩛"]="椚", ["𭩰"]="橃", ["𭪆"]="檛", ["𭫀"]="樻", ["𭭈"]="㰳", ["𭰎"]="澢", ["𭱊"]="澒", ["𭲫"]="灟", ["𭴊"]="㷻", ["𭹜"]="㼈", ["𮀤"]="磱", ["𮀪"]="𥖏", ["𮆏"]="籣", ["𮇔"]="𥺼", ["𮉠"]="䊵", ["𮉡"]="纑", ["𮉢"]="紩", ["𮉣"]="䋏", ["𮉤"]="絓", ["𮉦"]="䋞", ["𮉧"]="緉", ["𮉨"]="緺", ["𮉪"]="緅", ["𮉫"]="緌", ["𮉬"]="綷", ["𮉮"]="繀", ["𮉯"]="縩", ["𮐚"]="薠", ["𮐨"]="蘡", ["𮔂"]="䗻", ["𮔅"]="蝜", ["𮔊"]="蜽", ["𮔚"]="蟧", ["𮖁"]="裲", ["𮖃"]="𧜶", ["𮖱"]="襭", ["𮙊"]="讔", ["𮙋"]="讟", ["𮛗"]="𨆉", ["𮜶"]="軇", ["𮝴"]="軱", ["𮝵"]="輀", ["𮝷"]="轒", ["𮝸"]="輴", ["𮝹"]="轘", ["𮝺"]="轕", ["𮠞"]="䤌", ["𮠳"]="醦", ["𮣲"]="釭", ["𮣳"]="鈜", ["𮣴"]="鋋", ["𮣵"]="錣", ["𮣶"]="鑢", ["𮣷"]="鐻", ["𮤫"]="閅", ["𮤬"]="䦌", ["𮤭"]="𨳒", ["𮤲"]="閟", ["𮤷"]="𬮍", ["𮧴"]="韔", ["𮧵"]="韡", ["𮨴"]="檒", ["𮨵"]="飂", ["𮩛"]="饆", ["𮩜"]="餀", ["𮩝"]="餲", ["𮩞"]="饐", ["𮪡"]="駹", ["𮪢"]="駴", ["𮪣"]="騣", ["𮪤"]="騲", ["𮪥"]="驐", ["𮫂"]="鬡", ["𮬛"]="魣", ["𮬜"]="鮨", ["𮬝"]="鱥", ["𮬞"]="䱗", ["𮬟"]="䱛", ["𮬠"]="䱚", ["𮬡"]="䱻", ["𮬢"]="䱵", ["𮬣"]="䲗", ["𮬤"]="鱵", ["𮭡"]="䲸", ["𮭢"]="鴁", ["𮭤"]="鴓", ["𮭥"]="䳍", ["𮭨"]="鷃", ["𮭪"]="鷞", ["𮭰"]="䴚", ["𮮆"]="麭", ["𮮇"]="麰", ["𮯙"]="䶗", ["𮯵"]="㒖", ["𮯸"]="儮", ["𮯻"]="𠏄", ["𮰄"]="𠖥", ["𮰉"]="凴", ["𮰔"]="喡", ["𮰠"]="𡑑", ["𮰥"]="𪣷", ["𮰸"]="嬟", ["𮰽"]="㜰", ["𮰿"]="㛍", ["𮱁"]="嬧", ["𮱆"]="𡢄", ["𮱇"]="㜕", ["𮱊"]="𡤢", ["𮱐"]="𡤶", ["𮱒"]="嬝", ["𮱔"]="𡠪", ["𮱕"]="𪦯", ["𮱩"]="㟦", ["𮱯"]="㠆", ["𮱵"]="𢐟", ["𮲀"]="𭜼", ["𮲁"]="悓", ["𮲂"]="𢞁", ["𮲃"]="㦡", ["𮲄"]="憅", ["𮲅"]="𫺤", ["𮲇"]="慖", ["𮲐"]="𠅀", ["𮲔"]="敳", ["𮲛"]="㬢", ["𮲟"]="暊", ["𮲨"]="𣋪", ["𮲮"]="欆", ["𮲰"]="㮿", ["𮲶"]="㰄", ["𮲺"]="𬅁", ["𮳃"]="𣿭", ["𮳅"]="𣵾", ["𮳆"]="澕", ["𮳈"]="𣼼", ["𮳍"]="𤁐", ["𮳖"]="𤅊", ["𮳗"]="瀭", ["𮳠"]="煈", ["𮳢"]="𤆼", ["𮳧"]="燆", ["𮳬"]="𬊿", ["𮳯"]="𤏩", ["𮳱"]="𤏳", ["𮳴"]="爗", ["𮳶"]="𤑚", ["𮳸"]="𤒨", ["𮳺"]="𤚴", ["𮴂"]="㼁", ["𮴅"]="𤦎", ["𮴆"]="𤧑", ["𮴏"]="𤦩", ["𮴑"]="𤥵", ["𮴒"]="𤧸", ["𮴓"]="𤩝", ["𮴔"]="璍", ["𮴗"]="𤩊", ["𮴘"]="㼀", ["𮴚"]="𪼑", ["𮴠"]="𤫟", ["𮴥"]="𤩑", ["𮴶"]="𤫎", ["𮴹"]="𬎟", ["𮴿"]="鴫", ["𮵅"]="𥋟", ["𮵆"]="𪾳", ["𮵊"]="𥔬", ["𮵙"]="𥚗", ["𮵚"]="𱵭", ["𮵠"]="稦", ["𮵭"]="𬕜", ["𮵮"]="䉆", ["𮵱"]="箂", ["𮵿"]="紁", ["𮶀"]="𬗈", ["𮶁"]="𥿑", ["𮶂"]="綘", ["𮶃"]="縧", ["𮶅"]="𫃻", ["𮶔"]="𦝛", ["𮶙"]="艦", ["𮶝"]="䕏", ["𮶩"]="𧀀", ["𮶬"]="𧂂", ["𮶳"]="𬞼", ["𮶷"]="𦿭", ["𮷁"]="𧜘", ["𮷄"]="𧠳", ["𮷅"]="諌", ["𮷆"]="𧦵", ["𮷇"]="𧭥", ["𮷈"]="䛴", ["𮷉"]="𧩎", ["𮷊"]="譒", ["𮷍"]="𮚫", ["𮷖"]="䡄", ["𮷗"]="軚", ["𮷙"]="鿂", ["𮷛"]="轟", ["𮷝"]="轁", ["𮷥"]="𨘀", ["𮷨"]="𨟑", ["𮷯"]="𨮪", ["𮷵"]="𨥈", ["𮷶"]="𫓔", ["𮷸"]="鈨", ["𮷺"]="𫒋", ["𮷻"]="𩗩", ["𮷽"]="𨥤", ["𮷿"]="𨥮", ["𮸂"]="𬫉", ["𮸃"]="𨥭", ["𮸄"]="𬫍", ["𮸅"]="𨦍", ["𮸈"]="鍕", ["𮸉"]="𨫋", ["𮸊"]="鋓", ["𮸋"]="𫒟", ["𮸌"]="䤭", ["𮸏"]="鋑", ["𮸐"]="錺", ["𮸑"]="𮢅", ["𮸒"]="𮢆", ["𮸔"]="𨩃", ["𮸕"]="鍢", ["𮸘"]="𨩎", ["𮸙"]="𨪦", ["𮸚"]="𨪜", ["𮸛"]="鎧", ["𮸝"]="𨯗", ["𮸞"]="䥓", ["𮸟"]="鏛", ["𮸠"]="鑧", ["𮸢"]="𨬫", ["𮸣"]="𨯂", ["𮸥"]="䦖", ["𮸦"]="䦣", ["𮸮"]="䩤", ["𮸶"]="𩔐", ["𮸷"]="𩐳", ["𮸹"]="顧", ["𮸻"]="𩗺", ["𮸼"]="飊", ["𮹀"]="馪", ["𮹄"]="𩢀", ["𮹅"]="𩢖", ["𮹉"]="𫘋", ["𮹋"]="騆", ["𮹌"]="𩥈", ["𮹓"]="𩵳", ["𮹕"]="𬷈", ["𮹗"]="䳥", ["𮹘"]="鶯", ["𮹙"]="䳽", ["𮹜"]="䴏", ["𮹝"]="龘", ["𰀡"]="臤", ["𰀢"]="𰯲", ["𰁜"]="龻", ["𰁧"]="傱", ["𰁸"]="儅", ["𰁾"]="偩", ["𰂋"]="僴", ["𰂎"]="僩", ["𰂏"]="儥", ["𰂗"]="僀", ["𰂜"]="僓", ["𰂦"]="儢", ["𰂭"]="儩", ["𰃆"]="儹", ["𰃮"]="𦥯", ["𰃷"]="凔", ["𰃻"]="㓖", ["𰃿"]="凟", ["𰄝"]="𭃶", ["𰄞"]="剸", ["𰄭"]="𠠫", ["𰅔"]="勴", ["𰅥"]="匵", ["𰅦"]="匰", ["𰆕"]="㕒", ["𰆚"]="厱", ["𰇀"]="㕢", ["𰇎"]="㖦", ["𰇕"]="唊", ["𰇖"]="㗢", ["𰇠"]="嗧", ["𰇲"]="嗿", ["𰇼"]="嘇", ["𰈆"]="囕", ["𰈇"]="嚐", ["𰈍"]="嚫", ["𰈓"]="嚂", ["𰈮"]="𡃈", ["𰈯"]="囐", ["𰈶"]="嚩", ["𰉁"]="㘖", ["𰉄"]="囋", ["𰉘"]="㙔", ["𰉙"]="堈", ["𰉚"]="垷", ["𰉣"]="墿", ["𰉥"]="埉", ["𰉩"]="墧", ["𰉪"]="墷", ["𰉽"]="㙾", ["𰊂"]="墆", ["𰊈"]="墏", ["𰊑"]="壏", ["𰊛"]="㙺", ["𰊟"]="㙢", ["𰊡"]="壛", ["𰊢"]="壍", ["𰋸"]="婸", ["𰋹"]="嫥", ["𰋽"]="嬮", ["𰌀"]="嫈", ["𰌂"]="媜", ["𰌆"]="㜞", ["𰌇"]="嫧", ["𰌙"]="嬾", ["𰌦"]="孲", ["𰌷"]="寪", ["𰎌"]="嵷", ["𰎎"]="巃", ["𰎏"]="崠", ["𰎐"]="㠠", ["𰎑"]="嶪", ["𰎔"]="嶤", ["𰎖"]="崱", ["𰎞"]="嶩", ["𰏁"]="巑", ["𰏕"]="帴", ["𰏜"]="㡞", ["𰏟"]="幱", ["𰏶"]="廥", ["𰏼"]="廗", ["𰏽"]="𢊃", ["𰐾"]="懭", ["𰐿"]="愓", ["𰑁"]="慱", ["𰑂"]="𢜟", ["𰑄"]="惀", ["𰑔"]="慹", ["𰑕"]="懕", ["𰑙"]="懰", ["𰑟"]="慐", ["𰑥"]="憪", ["𰑧"]="慙", ["𰑪"]="憴", ["𰑫"]="㦬", ["𰑬"]="懫", ["𰑵"]="慸", ["𰑸"]="㥷", ["𰑿"]="戃", ["𰒆"]="慲", ["𰒒"]="懘", ["𰓄"]="掁", ["𰓆"]="摀", ["𰓔"]="㨛", ["𰓙"]="擪", ["𰓜"]="擳", ["𰓧"]="搎", ["𰓬"]="攦", ["𰓱"]="摼", ["𰓷"]="撋", ["𰓻"]="摫", ["𰓼"]="摲", ["𰔇"]="摕", ["𰔋"]="撌", ["𰔲"]="㩷", ["𰕁"]="攳", ["𰕅"]="敺", ["𰕈"]="敿", ["𰕭"]="旝", ["𰖈"]="曮", ["𰖠"]="㬮", ["𰗓"]="櫎", ["𰗖"]="棆", ["𰗘"]="㯺", ["𰗙"]="㮲", ["𰗛"]="檡", ["𰗜"]="檿", ["𰗡"]="㯆", ["𰗢"]="楎", ["𰗦"]="㯸", ["𰗨"]="榯", ["𰗬"]="櫏", ["𰗵"]="㰂", ["𰗹"]="橚", ["𰗺"]="橨", ["𰘀"]="㯂", ["𰘈"]="檋", ["𰘓"]="檾", ["𰘠"]="櫩", ["𰘣"]="檰", ["𰘩"]="櫹", ["𰘳"]="櫴", ["𰘶"]="櫯", ["𰘸"]="櫢", ["𰙋"]="歍", ["𰙎"]="歛", ["𰙑"]="歗", ["𰚔"]="㲰", ["𰚦"]="氀", ["𰚪"]="㲯", ["𰛊"]="溤", ["𰛏"]="漎", ["𰛑"]="泞", ["𰛒"]="涷", ["𰛛"]="㴸", ["𰛡"]="滭", ["𰛣"]="漐", ["𰛤"]="瀄", ["𰛥"]="溰", ["𰛦"]="濊", ["𰛩"]="㶒", ["𰛪"]="灓", ["𰛮"]="滷", ["𰛲"]="澰", ["𰛵"]="澖", ["𰛻"]="𤅷", ["𰛽"]="㴿", ["𰜐"]="灠", ["𰜜"]="瀙", ["𰜢"]="㵑", ["𰜨"]="瀳", ["𰜳"]="瀴", ["𰝅"]="瀯", ["𰝋"]="㶏", ["𰝍"]="瀈", ["𰝗"]="㶕", ["𰝞"]="𤄙", ["𰝟"]="㶍", ["𰝾"]="㷃", ["𰞇"]="燡", ["𰞉"]="㷲", ["𰞍"]="㸅", ["𰞤"]="熞", ["𰞲"]="㷶", ["𰞳"]="龽", ["𰞻"]="燌", ["𰟘"]="爓", ["𰠛"]="牋", ["𰠫"]="犅", ["𰠲"]="牼", ["𰠴"]="㹓", ["𰠹"]="犤", ["𰡄"]="獹", ["𰡊"]="獢", ["𰡎"]="猍", ["𰡏"]="猧", ["𰡔"]="獑", ["𰡞"]="獖", ["𰡩"]="玂", ["𰡵"]="瓐", ["𰡽"]="璹", ["𰢄"]="璛", ["𰢢"]="甒", ["𰢤"]="甖", ["𰢦"]="甊", ["𰣬"]="癠", ["𰣯"]="癎", ["𰣶"]="㿉", ["𰣽"]="癴", ["𰤓"]="𤾉", ["𰤕"]="皪", ["𰤨"]="㿹", ["𰤬"]="皾", ["𰥊"]="䀍", ["𰥒"]="瞛", ["𰥛"]="瞓", ["𰥞"]="䁝", ["𰥠"]="矕", ["𰥢"]="矖", ["𰥣"]="𥉸", ["𰥨"]="瞯", ["𰥪"]="瞡", ["𰥹"]="矘", ["𰦔"]="䂓", ["𰦜"]="矲", ["𰦦"]="礰", ["𰦨"]="䃣", ["𰦭"]="礲", ["𰦰"]="礋", ["𰦴"]="䃁", ["𰦷"]="䃕", ["𰦾"]="礹", ["𰦿"]="碢", ["𰧃"]="磵", ["𰧇"]="礥", ["𰧉"]="礩", ["𰧎"]="䃢", ["𰧔"]="礛", ["𰧘"]="䃴", ["𰧰"]="禓", ["𰧻"]="禬", ["𰨖"]="禵", ["𰨜"]="穬", ["𰨦"]="穧", ["𰨳"]="䆅", ["𰩅"]="竉", ["𰩏"]="窱", ["𰩓"]="竀", ["𰩧"]="䇓", ["𰩮"]="篿", ["𰩲"]="籚", ["𰩸"]="簥", ["𰩹"]="簜", ["𰩺"]="箹", ["𰩻"]="簻", ["𰪏"]="簵", ["𰪣"]="籯", ["𰪩"]="䊯", ["𰪫"]="䊜", ["𰪭"]="粻", ["𰪻"]="䊛", ["𰪿"]="𫃑", ["𰫋"]="䊟", ["𰫖"]="糷", ["𰫼"]="糽", ["𰫽"]="紑", ["𰬀"]="紒", ["𰬁"]="䋆", ["𰬂"]="䋍", ["𰬃"]="䋑", ["𰬅"]="紨", ["𰬆"]="絇", ["𰬇"]="紸", ["𰬈"]="絃", ["𰬉"]="紽", ["𰬋"]="紭", ["𰬌"]="絚", ["𰬍"]="綊", ["𰬎"]="縪", ["𰬏"]="絑", ["𰬐"]="繑", ["𰬑"]="䋫", ["𰬒"]="絘", ["𰬓"]="絯", ["𰬔"]="絣", ["𰬕"]="䋝", ["𰬖"]="絾", ["𰬗"]="絿", ["𰬘"]="綍", ["𰬚"]="縜", ["𰬛"]="絼", ["𰬜"]="絻", ["𰬞"]="綅", ["𰬟"]="緎", ["𰬠"]="繣", ["𰬡"]="緁", ["𰬢"]="緀", ["𰬣"]="緆", ["𰬤"]="綼", ["𰬥"]="総", ["𰬧"]="緂", ["𰬪"]="縿", ["𰬫"]="緻", ["𰬬"]="緢", ["𰬭"]="䋽", ["𰬯"]="緵", ["𰬱"]="䌇", ["𰬲"]="縓", ["𰬳"]="縌", ["𰬴"]="縡", ["𰬵"]="縼", ["𰬶"]="䌌", ["𰬷"]="繖", ["𰬸"]="繐", ["𰬺"]="繜", ["𰬻"]="繘", ["𰬽"]="繲", ["𰬿"]="纀", ["𰭀"]="纋", ["𰭄"]="罆", ["𰭔"]="羂", ["𰭢"]="翜", ["𰭣"]="翿", ["𰭹"]="䏊", ["𰮅"]="膷", ["𰮇"]="膴", ["𰮙"]="䐢", ["𰮝"]="膮", ["𰮲"]="䐹", ["𰯂"]="𦡶", ["𰯋"]="臡", ["𰯎"]="䐽", ["𰰋"]="艭", ["𰰌"]="䑼", ["𰰏"]="艜", ["𰰑"]="艛", ["𰰠"]="藇", ["𰰢"]="𦳝", ["𰰤"]="蓲", ["𰰨"]="菕", ["𰰮"]="蘬", ["𰰱"]="薱", ["𰰳"]="蒒", ["𰰴"]="䔇", ["𰰵"]="蔱", ["𰰷"]="萯", ["𰰹"]="藰", ["𰰺"]="蔎", ["𰰾"]="薖", ["𰱀"]="䔈", ["𰱇"]="蕑", ["𰱈"]="禜", ["𰱉"]="蕄", ["𰱌"]="蒳", ["𰱍"]="蒶", ["𰱐"]="藚", ["𰱑"]="蔪", ["𰱛"]="蔠", ["𰱟"]="蕡", ["𰱩"]="䕡", ["𰱮"]="藘", ["𰱯"]="藣", ["𰱱"]="薋", ["𰱲"]="蘵", ["𰱾"]="藾", ["𰲁"]="蘈", ["𰲂"]="虅", ["𰲒"]="蘱", ["𰲖"]="䖀", ["𰲟"]="䖚", ["𰲠"]="虦", ["𰲬"]="蛼", ["𰲮"]="蜸", ["𰲯"]="䗥", ["𰲰"]="蜦", ["𰲲"]="蟡", ["𰲳"]="䗃", ["𰲴"]="蠪", ["𰲵"]="蠌", ["𰲶"]="蛵", ["𰲸"]="蝁", ["𰲹"]="螘", ["𰳂"]="螹", ["𰳄"]="螴", ["𰳊"]="蟦", ["𰳗"]="蠳", ["𰳚"]="䗽", ["𰳲"]="襱", ["𰳵"]="襼", ["𰳺"]="襛", ["𰳻"]="𧞅", ["𰳼"]="襹", ["𰴂"]="襂", ["𰴕"]="覕", ["𰴖"]="䙼", ["𰴗"]="䚕", ["𰴘"]="覸", ["𰴙"]="覠", ["𰴜"]="覰", ["𰴝"]="覶", ["𰴞"]="覻", ["𰴢"]="觻", ["𰴣"]="觷", ["𰴤"]="䚞", ["𰴯"]="謍", ["𰵊"]="訆", ["𰵌"]="諹", ["𰵍"]="訰", ["𰵎"]="訧", ["𰵏"]="訬", ["𰵐"]="䛀", ["𰵑"]="譌", ["𰵒"]="訦", ["𰵓"]="訹", ["𰵔"]="詍", ["𰵖"]="讛", ["𰵗"]="詇", ["𰵙"]="詄", ["𰵚"]="詅", ["𰵛"]="訽", ["𰵜"]="䛌", ["𰵝"]="訸", ["𰵠"]="詉", ["𰵡"]="誙", ["𰵢"]="䛟", ["𰵣"]="詥", ["𰵤"]="詻", ["𰵥"]="誃", ["𰵦"]="詨", ["𰵨"]="讝", ["𰵩"]="誧", ["𰵫"]="䛠", ["𰵬"]="𧧸", ["𰵭"]="誗", ["𰵮"]="誐", ["𰵯"]="誜", ["𰵰"]="䛭", ["𰵱"]="諃", ["𰵲"]="諆", ["𰵴"]="諔", ["𰵵"]="誽", ["𰵶"]="諈", ["𰵷"]="諁", ["𰵸"]="誻", ["𰵹"]="讘", ["𰵺"]="謜", ["𰵼"]="謋", ["𰵽"]="謟", ["𰵾"]="謑", ["𰵿"]="謞", ["𰶀"]="謣", ["𰶁"]="謻", ["𰶂"]="謥", ["𰶃"]="謵", ["𰶄"]="譇", ["𰶆"]="譀", ["𰶇"]="䜏", ["𰶈"]="䜄", ["𰶉"]="譠", ["𰶊"]="譩", ["𰶌"]="譳", ["𰶍"]="讂", ["𰶎"]="譅", ["𰶏"]="讑", ["𰶑"]="豅", ["𰶔"]="豄", ["𰶬"]="䝏", ["𰷞"]="貣", ["𰷟"]="𧶽", ["𰷠"]="貤", ["𰷡"]="貦", ["𰷢"]="貾", ["𰷤"]="賥", ["𰷥"]="賨", ["𰷦"]="靅", ["𰷧"]="賮", ["𰷩"]="䞉", ["𰷪"]="賹", ["𰷫"]="贆", ["𰷮"]="贙", ["𰷴"]="䟏", ["𰷵"]="趬", ["𰷶"]="趫", ["𰸄"]="踼", ["𰸈"]="䠟", ["𰸊"]="䠩", ["𰸐"]="躧", ["𰸔"]="蹥", ["𰸚"]="蹛", ["𰸛"]="䠠", ["𰸞"]="蹪", ["𰹀"]="軃", ["𰹲"]="軎", ["𰹳"]="䡅", ["𰹴"]="軓", ["𰹵"]="轙", ["𰹶"]="軖", ["𰹷"]="䡇", ["𰹸"]="軘", ["𰹺"]="䡊", ["𰹼"]="輚", ["𰹽"]="軯", ["𰹾"]="𨏊", ["𰹿"]="軵", ["𰺀"]="軧", ["𰺁"]="軥", ["𰺂"]="軳", ["𰺃"]="轛", ["𰺄"]="輁", ["𰺅"]="輂", ["𰺇"]="輐", ["𰺈"]="輑", ["𰺉"]="輤", ["𰺊"]="輘", ["𰺋"]="輙", ["𰺍"]="輠", ["𰺎"]="輫", ["𰺏"]="輣", ["𰺐"]="輡", ["𰺑"]="䡝", ["𰺒"]="輲", ["𰺓"]="輹", ["𰺖"]="轃", ["𰺗"]="轞", ["𰺘"]="䡰", ["𰺙"]="轖", ["𰺛"]="轑", ["𰺜"]="轓", ["𰺝"]="䡴", ["𰺞"]="轏", ["𰺟"]="轚", ["𰺠"]="䡾", ["𰺡"]="䡷", ["𰺣"]="轥", ["𰺤"]="䡻", ["𰺭"]="䢈", ["𰺲"]="逿", ["𰺷"]="遶", ["𰻆"]="遰", ["𰻝"]="𰻞", ["𰻡"]="鄦", ["𰻦"]="鄬", ["𰻮"]="鄡", ["𰻳"]="鄪", ["𰼅"]="醳", ["𰼋"]="𨣃", ["𰼏"]="𨣨", ["𰼑"]="䤍", ["𰼻"]="鑋", ["𰽕"]="鐖", ["𰽗"]="釪", ["𰽘"]="釱", ["𰽚"]="鑛", ["𰽛"]="釥", ["𰽜"]="鏂", ["𰽝"]="䥶", ["𰽞"]="鈪", ["𰽠"]="䤠", ["𰽡"]="鈤", ["𰽢"]="鋧", ["𰽣"]="鈏", ["𰽤"]="鈌", ["𰽥"]="鈵", ["𰽦"]="鑨", ["𰽧"]="鉟", ["𰽩"]="鉲", ["𰽫"]="鉎", ["𰽬"]="鉌", ["𰽮"]="鉜", ["𰽯"]="鉒", ["𰽰"]="鉡", ["𰽱"]="鉘", ["𰽲"]="銡", ["𰽳"]="顉", ["𰽴"]="銙", ["𰽵"]="銧", ["𰽶"]="鉵", ["𰽷"]="鐬", ["𰽸"]="䤨", ["𰽹"]="鉹", ["𰽺"]="䤥", ["𰽻"]="銋", ["𰽼"]="鉼", ["𰽽"]="𨦡", ["𰽾"]="鐹", ["𰽿"]="銸", ["𰾀"]="鋍", ["𰾁"]="銾", ["𰾃"]="鋜", ["𰾄"]="鋂", ["𰾅"]="鋡", ["𰾆"]="鋊", ["𰾈"]="䤬", ["𰾋"]="龲", ["𰾌"]="鏩", ["𰾍"]="錶", ["𰾎"]="錍", ["𰾏"]="鋾", ["𰾐"]="䤵", ["𰾑"]="鍂", ["𰾒"]="錧", ["𰾓"]="錔", ["𰾕"]="鍱", ["𰾖"]="䤻", ["𰾗"]="鍼", ["𰾘"]="鍖", ["𰾙"]="鍝", ["𰾚"]="鍡", ["𰾛"]="鎅", ["𰾜"]="鍴", ["𰾝"]="鍟", ["𰾞"]="鍐", ["𰾟"]="鍑", ["𰾡"]="鍧", ["𰾢"]="鍦", ["𰾤"]="鍜", ["𰾥"]="鍨", ["𰾦"]="䤸", ["𰾧"]="𨫼", ["𰾩"]="鎑", ["𰾫"]="鑑", ["𰾬"]="鎉", ["𰾭"]="鑀", ["𰾮"]="鎌", ["𰾯"]="鎕", ["𰾰"]="鏙", ["𰾱"]="鏓", ["𰾲"]="鏕", ["𰾴"]="鐁", ["𰾶"]="鏸", ["𰾷"]="鐕", ["𰾸"]="鐤", ["𰾻"]="䥖", ["𰾼"]="鐉", ["𰾽"]="钃", ["𰾾"]="钀", ["𰿀"]="𨰹", ["𰿁"]="䥝", ["𰿂"]="鑐", ["𰿃"]="鑖", ["𰿄"]="鑘", ["𰿅"]="䥴", ["𰿆"]="鑽", ["𰿇"]="䥷", ["𰿈"]="鑯", ["𰿉"]="鑸", ["𰿨"]="䦎", ["𰿩"]="閕", ["𰿫"]="䦱", ["𰿬"]="閛", ["𰿰"]="𨉖", ["𰿳"]="閷", ["𰿴"]="䦪", ["𰿺"]="闛", ["𰿻"]="闟", ["𰿾"]="闢", ["𱀡"]="隫", ["𱁒"]="䨴", ["𱁱"]="𩋬", ["𱁳"]="𩍜", ["𱁴"]="鞸", ["𱁶"]="韆", ["𱁷"]="韇", ["𱁹"]="鞼", ["𱁺"]="鞻", ["𱁽"]="䪍", ["𱁾"]="韊", ["𱂅"]="䪐", ["𱂆"]="韐", ["𱂇"]="韏", ["𱂈"]="韗", ["𱂉"]="韒", ["𱂊"]="韘", ["𱂋"]="韣", ["𱂌"]="䪝", ["𱂎"]="䪥", ["𱂢"]="䪼", ["𱂣"]="顤", ["𱂤"]="顪", ["𱂥"]="頟", ["𱂦"]="頩", ["𱂧"]="頪", ["𱂨"]="頞", ["𱂫"]="顩", ["𱂬"]="頯", ["𱂭"]="顀", ["𱂮"]="䫌", ["𱂯"]="顇", ["𱂰"]="顄", ["𱂱"]="顑", ["𱂲"]="顋", ["𱂴"]="顜", ["𱂵"]="顝", ["𱂶"]="顖", ["𱂸"]="顮", ["𱂺"]="顠", ["𱂻"]="顦", ["𱃔"]="颩", ["𱃕"]="颬", ["𱃖"]="䬀", ["𱃗"]="颱", ["𱃘"]="颲", ["𱃙"]="䬟", ["𱃚"]="䬅", ["𱃜"]="䬐", ["𱃝"]="飍", ["𱃞"]="䬔", ["𱃟"]="飁", ["𱃠"]="飇", ["𱃱"]="䬣", ["𱃲"]="饇", ["𱃳"]="䬪", ["𱃵"]="䬬", ["𱃷"]="䬳", ["𱃸"]="䬹", ["𱃹"]="䭓", ["𱃺"]="餂", ["𱃼"]="餴", ["𱃽"]="餩", ["𱃿"]="餤", ["𱄀"]="饙", ["𱄃"]="䭈", ["𱄄"]="餯", ["𱄆"]="饎", ["𱄈"]="饛", ["𱄉"]="䭡", ["𱄊"]="饡", ["𱄼"]="馵", ["𱄽"]="馲", ["𱄾"]="𩧉", ["𱄿"]="騳", ["𱅀"]="駂", ["𱅁"]="馽", ["𱅂"]="馺", ["𱅃"]="駏", ["𱅄"]="䮂", ["𱅅"]="驡", ["𱅇"]="駗", ["𱅈"]="駜", ["𱅉"]="駥", ["𱅊"]="騺", ["𱅋"]="駬", ["𱅏"]="駣", ["𱅐"]="駮", ["𱅑"]="駦", ["𱅔"]="駷", ["𱅕"]="騋", ["𱅖"]="駽", ["𱅗"]="騀", ["𱅙"]="駾", ["𱅚"]="騇", ["𱅛"]="驒", ["𱅜"]="騕", ["𱅝"]="騗", ["𱅞"]="騢", ["𱅟"]="騥", ["𱅠"]="䮧", ["𱅡"]="騩", ["𱅢"]="騬", ["𱅣"]="𩥅", ["𱅤"]="驞", ["𱅦"]="䮲", ["𱅧"]="驉", ["𱅩"]="騽", ["𱅪"]="驔", ["𱅫"]="驈", ["𱅬"]="驠", ["𱅮"]="髐", ["𱆁"]="鬜", ["𱆃"]="䰎", ["𱆅"]="䰐", ["𱆆"]="鬗", ["𱆈"]="䰖", ["𱆌"]="鬺", ["𱆙"]="䰫", ["𱆚"]="䫥", ["𱆛"]="魗", ["𱇍"]="䰲", ["𱇏"]="魠", ["𱇐"]="魭", ["𱇑"]="䰽", ["𱇒"]="魮", ["𱇓"]="魱", ["𱇔"]="魶", ["𱇕"]="䰻", ["𱇖"]="魬", ["𱇗"]="鯩", ["𱇘"]="魧", ["𱇙"]="魫", ["𱇚"]="䱅", ["𱇛"]="鮇", ["𱇜"]="魼", ["𱇝"]="魾", ["𱇞"]="䱇", ["𱇟"]="魻", ["𱇠"]="鮂", ["𱇡"]="鮏", ["𱇢"]="鮌", ["𱇣"]="鱍", ["𱇤"]="䱂", ["𱇥"]="䱎", ["𱇦"]="鮬", ["𱇧"]="鮧", ["𱇨"]="鮛", ["𱇩"]="鱎", ["𱇪"]="鮥", ["𱇬"]="䱌", ["𱇭"]="鯠", ["𱇮"]="𩷶", ["𱇯"]="鮹", ["𱇰"]="䱒", ["𱇱"]="鯈", ["𱇲"]="䱐", ["𱇵"]="鰿", ["𱇶"]="鯥", ["𱇷"]="䱜", ["𱇸"]="鱦", ["𱇹"]="䱥", ["𱇺"]="鯚", ["𱇻"]="䱤", ["𱇼"]="鯦", ["𱇽"]="䱡", ["𱇾"]="鯮", ["𱇿"]="鱐", ["𱈀"]="䱟", ["𱈁"]="鯅", ["𱈂"]="鰅", ["𱈄"]="鯸", ["𱈅"]="鯼", ["𱈆"]="䱾", ["𱈇"]="䱭", ["𱈈"]="䱴", ["𱈉"]="鰬", ["𱈊"]="鰡", ["𱈋"]="鰝", ["𱈌"]="鱃", ["𱈍"]="鰯", ["𱈏"]="鱁", ["𱈐"]="鱄", ["𱈑"]="鰴", ["𱈒"]="䲉", ["𱈓"]="鱏", ["𱈕"]="鱕", ["𱈖"]="䲚", ["𱈗"]="鱬", ["𱈙"]="鱴", ["𱈛"]="䲛", ["𱈜"]="鱻", ["𱉇"]="鳦", ["𱉈"]="鳭", ["𱉊"]="鳱", ["𱉌"]="鸃", ["𱉍"]="鳿", ["𱉎"]="鳺", ["𱉏"]="鷒", ["𱉐"]="鵙", ["𱉑"]="鳻", ["𱉓"]="鳸", ["𱉔"]="鴂", ["𱉕"]="鴚", ["𱉖"]="䲹", ["𱉗"]="鴠", ["𱉘"]="鴡", ["𱉙"]="䳅", ["𱉚"]="鴩", ["𱉛"]="鴙", ["𱉝"]="鵖", ["𱉞"]="䳇", ["𱉟"]="鸅", ["𱉠"]="鵛", ["𱉡"]="鴘", ["𱉢"]="鴢", ["𱉤"]="䳏", ["𱉥"]="鴶", ["𱉦"]="䳓", ["𱉧"]="䳒", ["𱉨"]="鵶", ["𱉩"]="鴺", ["𱉪"]="鴱", ["𱉫"]="鴸", ["𱉬"]="鷮", ["𱉮"]="鵅", ["𱉯"]="鴹", ["𱉱"]="鶤", ["𱉲"]="鴾", ["𱉳"]="鷶", ["𱉴"]="鸉", ["𱉵"]="鶆", ["𱉶"]="䳚", ["𱉸"]="鵌", ["𱉹"]="鵗", ["𱉺"]="䳕", ["𱉻"]="鵎", ["𱉼"]="䳭", ["𱉽"]="鵋", ["𱉾"]="鵕", ["𱉿"]="鵔", ["𱊀"]="鵱", ["𱊁"]="鵸", ["𱊂"]="䳟", ["𱊃"]="鵹", ["𱊄"]="鶃", ["𱊅"]="鵻", ["𱊆"]="鵵", ["𱊇"]="鵴", ["𱊈"]="鶂", ["𱊉"]="𪈔", ["𱊊"]="鵼", ["𱊋"]="鵳", ["𱊌"]="鶋", ["𱊍"]="鵽", ["𱊎"]="鶅", ["𱊏"]="鶝", ["𱊐"]="鶛", ["𱊑"]="鶞", ["𱊒"]="鶢", ["𱊓"]="䳮", ["𱊕"]="鶙", ["𱊖"]="鶟", ["𱊗"]="鶔", ["𱊘"]="鶨", ["𱊙"]="䳲", ["𱊚"]="鷏", ["𱊛"]="鶽", ["𱊝"]="鶶", ["𱊟"]="鶷", ["𱊠"]="鷋", ["𱊡"]="鷕", ["𱊢"]="鷑", ["𱊣"]="䳺", ["𱊤"]="鷛", ["𱊧"]="鷢", ["𱊨"]="𪆫", ["𱊩"]="鷵", ["𱊪"]="䴇", ["𱊫"]="鸆", ["𱊬"]="鸀", ["𱊭"]="鸒", ["𱊮"]="鸁", ["𱊯"]="鸄", ["𱊰"]="鷾", ["𱊱"]="鸐", ["𱊳"]="鸓", ["𱊵"]="鸙", ["𱊼"]="䴝", ["𱋆"]="䴮", ["𱋇"]="麧", ["𱋊"]="䴲", ["𱋋"]="麮", ["𱋎"]="䴳", ["𱋐"]="麴", ["𱋔"]="䴵", ["𱋖"]="麱", ["𱋗"]="䴸", ["𱋙"]="䴹", ["𱋝"]="䴺", ["𱋢"]="𪍑", ["𱋧"]="䴾", ["𱋪"]="䵂", ["𱋫"]="䵃", ["𱋮"]="䵆", ["𱋱"]="黂", ["𱋴"]="䵐", ["𱋶"]="黸", ["𱋾"]="鼀", ["𱋿"]="鼁", ["𱌁"]="䵶", ["𱌃"]="䵷", ["𱌄"]="鼅", ["𱌆"]="鼆", ["𱌇"]="鼈", ["𱌉"]="鼊", ["𱌊"]="鼚", ["𱌏"]="鼲", ["𱌖"]="齈", ["𱌗"]="齌", ["𱌘"]="齍", ["𱌙"]="𪗋", ["𱌫"]="齞", ["𱌬"]="齚", ["𱌭"]="齺", ["𱌮"]="齣", ["𱌯"]="齝", ["𱌰"]="䶧", ["𱌱"]="齥", ["𱌲"]="齤", ["𱌳"]="齳", ["𱌴"]="𪘨", ["𱌵"]="䶨", ["𱌶"]="齱", ["𱌷"]="𪘬", ["𱌸"]="𪘥", ["𱌹"]="齵", ["𱌺"]="齻", ["𱌼"]="𪙉", ["𱌽"]="齸", ["𱍁"]="龏", ["𱍂"]="龖", ["𱍇"]="䶱", ["𱍈"]="龞", ["𱎟"]="偒", ["𱎫"]="俹", ["𱏀"]="僫", ["𱏆"]="𪝼", ["𱏩"]="㒯", ["𱐠"]="剼", ["𱐳"]="㔤", ["𱑉"]="㔶", ["𱒀"]="噧", ["𱒂"]="啺", ["𱒦"]="嚋", ["𱕌"]="囖", ["𱖚"]="壐", ["𱙄"]="嬩", ["𱙇"]="婨", ["𱙋"]="𮱚", ["𱙑"]="𡣙", ["𱙔"]="孍", ["𱙷"]="孭", ["𱛇"]="㠘", ["𱛊"]="𡷹", ["𱛓"]="巄", ["𱞕"]="憳", ["𱞲"]="憌", ["𱟸"]="揁", ["𱟽"]="𢰸", ["𱡼"]="㬙", ["𱣂"]="㮧", ["𱣇"]="檏", ["𱣡"]="㯗", ["𱣤"]="橺", ["𱣱"]="樌", ["𱥵"]="𣷣", ["𱩂"]="𤃡", ["𱩪"]="灆", ["𱪪"]="爏", ["𱫅"]="㸄", ["𱫊"]="𤏪", ["𱫜"]="𤎽", ["𱭰"]="㹚", ["𱮺"]="𤦹", ["𱮾"]="琜", ["𱰆"]="𤬏", ["𱲥"]="䁑", ["𱲦"]="瞴", ["𱲮"]="䁺", ["𱳯"]="碖", ["𱳱"]="䂻", ["𱳳"]="䃖", ["𱳹"]="礑", ["𱴄"]="䂾", ["𱷷"]="䉅", ["𱷸"]="䈟", ["𱸂"]="䉩", ["𱸇"]="簩", ["𱸐"]="䉔", ["𱺕"]="䌬", ["𱺖"]="𦆭", ["𱺘"]="䋋", ["𱺙"]="𥿡", ["𱺛"]="䋘", ["𱺜"]="䋱", ["𱺦"]="緾", ["𱺫"]="䌏", ["𱺯"]="䌨", ["𱻞"]="翸", ["𱻴"]="耫", ["𱼇"]="𦠜", ["𱼏"]="膭", ["𱼸"]="䑺", ["𱽜"]="蓻", ["𱽱"]="䕠", ["𱽾"]="𦻖", ["𱾎"]="䕵", ["𱿧"]="𧒄", ["𱿩"]="䗯", ["𲀝"]="䡓", ["𲁑"]="覔", ["𲁔"]="𧢝", ["𲁖"]="覮", ["𲁙"]="覫", ["𲂂"]="訉", ["𲂃"]="訍", ["𲂆"]="䛅", ["𲂇"]="𧭈", ["𲂈"]="䛔", ["𲂉"]="䛩", ["𲂍"]="誩", ["𲂏"]="諘", ["𲂐"]="諵", ["𲂓"]="䜊", ["𲂔"]="謶", ["𲂕"]="譧", ["𲂖"]="譢", ["𲂻"]="賏", ["𲃄"]="賲", ["𲃏"]="䟄", ["𲄙"]="𨊛", ["𲄚"]="躼", ["𲄧"]="軁", ["𲅎"]="遤", ["𲅑"]="䢙", ["𲇑"]="鑍", ["𲇭"]="釮", ["𲇯"]="𨥉", ["𲇰"]="釰", ["𲇱"]="鈘", ["𲇲"]="鏄", ["𲇳"]="䤝", ["𲇴"]="鈊", ["𲇷"]="錬", ["𲇸"]="鈱", ["𲇻"]="銌", ["𲇽"]="鋕", ["𲇿"]="鋲", ["𲈀"]="鐱", ["𲈁"]="錴", ["𲈄"]="䥊", ["𲈅"]="𨨩", ["𲈆"]="鋿", ["𲈋"]="鍸", ["𲈌"]="鍷", ["𲈍"]="鎁", ["𲈎"]="鍹", ["𲈏"]="𨪃", ["𲈒"]="鎤", ["𲈗"]="鏱", ["𲈙"]="䥔", ["𲈚"]="鐛", ["𲈜"]="鏳", ["𲈝"]="鏴", ["𲈞"]="鐰", ["𲈵"]="閖", ["𲈹"]="閪", ["𲈽"]="䦜", ["𲉁"]="闀", ["𲉉"]="陯", ["𲊺"]="頙", ["𲊼"]="頳", ["𲊾"]="䫖", ["𲋀"]="䫫", ["𲋃"]="䫲", ["𲋎"]="䫺", ["𲋏"]="䫽", ["𲋢"]="𮸾", ["𲋤"]="䬰", ["𲌅"]="駖", ["𲌉"]="𩤅", ["𲌋"]="䮴", ["𲍇"]="䲑", ["𲍈"]="䰶", ["𲍌"]="鮕", ["𲍎"]="䱋", ["𲍐"]="䱊", ["𲍑"]="鱙", ["𲍕"]="䱝", ["𲍙"]="䲎", ["𲍬"]="鷌", ["𲍮"]="鴋", ["𲍰"]="鸍", ["𲍱"]="𩿞", ["𲍲"]="䳂", ["𲍳"]="䳑", ["𲍴"]="鷝", ["𲍵"]="䳄", ["𲍸"]="𪁎", ["𲍻"]="鷼", ["𲍽"]="𪂇", ["𲍾"]="䳡", ["𲎀"]="鶧", ["𲎈"]="䴌", ["𲎨"]="𪘁", ["𱂩"]="𩒺", ["𱳅"]="𥍉", ["𲍘"]="𫙱", ["𡋤"]="壗", ["𫽫"]="𰔫", } 1ahjmoyi0lvdqulrasmuwbqwkpmtrna বাউঁ 0 306847 487738 487711 2026-09-02T14:08:24Z अजीत कुमार तिवारी 4887 487738 wikitext text/x-wiki =={{-as-}}== ===विशेषण=== {{as-adj}} #[[वाम]] === प्रकाशित कोशों से अर्थ === ==== हिंदी-असमिया-अंग्रेजी त्रिभाषा कोश ==== # बायाँ, दाहिना या दक्षिण का विपर्याय; # प्रतिकूल, विरुद्ध; # दुष्ट बुरा। [[श्रेणी: हिन्दी-प्रकाशितकोशों से अर्थ-हिंदी-असमिया-अंग्रेजी त्रिभाषा कोश]] ocfnbb4hcmg2ry7pvn839mo7ei0w0vc 487776 487738 2026-09-02T17:06:09Z अजीत कुमार तिवारी 4887 अनावश्यक साँचा जिसके कारण अनुभाग संपादनीय नहीं. 487776 wikitext text/x-wiki ==असमिया== ===विशेषण=== {{as-adj}} #[[वाम]] === प्रकाशित कोशों से अर्थ === ==== हिंदी-असमिया-अंग्रेजी त्रिभाषा कोश ==== # बायाँ, दाहिना या दक्षिण का विपर्याय; # प्रतिकूल, विरुद्ध; # दुष्ट बुरा। [[श्रेणी: हिन्दी-प्रकाशितकोशों से अर्थ-हिंदी-असमिया-अंग्रेजी त्रिभाषा कोश]] ee0p8lkjy8yl9yfc9ixp3ied7z4gmpn অন্তৰ্ভুক্ত 0 306854 487740 487709 2026-09-02T14:11:35Z अजीत कुमार तिवारी 4887 487740 wikitext text/x-wiki =={{-as-}}== ===विशेषण=== {{as-adj}} # [[अंतर्भूत]] === प्रकाशित कोशों से अर्थ === ==== हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश ==== भीतर समाया हुआ, अंतर्गत। [[श्रेणी: हिन्दी-प्रकाशितकोशों से अर्थ-हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश]] 3om38ohgvp2xatbnnslrbgb5guq8h3j 487741 487740 2026-09-02T14:12:09Z अजीत कुमार तिवारी 4887 487741 wikitext text/x-wiki {{-as-}} ===विशेषण=== {{as-adj}} # [[अंतर्भूत]] === प्रकाशित कोशों से अर्थ === ==== हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश ==== भीतर समाया हुआ, अंतर्गत। [[श्रेणी: हिन्दी-प्रकाशितकोशों से अर्थ-हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश]] qyud61sq6c8ksvzak1ee105pyef1g54 487742 487741 2026-09-02T14:12:34Z अजीत कुमार तिवारी 4887 487742 wikitext text/x-wiki =={{-as-}}== ===विशेषण=== {{as-adj}} # [[अंतर्भूत]] === प्रकाशित कोशों से अर्थ === ==== हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश ==== भीतर समाया हुआ, अंतर्गत। [[श्रेणी: हिन्दी-प्रकाशितकोशों से अर्थ-हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश]] 3om38ohgvp2xatbnnslrbgb5guq8h3j 487769 487742 2026-09-02T16:37:29Z अजीत कुमार तिवारी 4887 अनावश्यक साँचा जिसके कारण अनुभाग संपादनीय नहीं. 487769 wikitext text/x-wiki ==असमिया== ===विशेषण=== {{as-adj}} # [[अंतर्भूत]] === प्रकाशित कोशों से अर्थ === ==== हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश ==== भीतर समाया हुआ, अंतर्गत। [[श्रेणी: हिन्दी-प्रकाशितकोशों से अर्थ-हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश]] ciyp18d20kwcliit5y7wkle26dbwneo অন্ত্যজ 0 306857 487739 487710 2026-09-02T14:10:44Z अजीत कुमार तिवारी 4887 487739 wikitext text/x-wiki =={{-as-}}== ===विशेषण=== {{as-adj}} # [[अंत्यज]] === प्रकाशित कोशों से अर्थ === ==== हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश ==== अंतिम वर्ण से उत्पन्न। (विशेषण) #शूद्र वर्ण; #अछूत या अस्पृश्य जाति। (पुल्लिंग) [[श्रेणी: हिन्दी-प्रकाशितकोशों से अर्थ-हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश]] 5cetg7atip7feuuk1mmk06n7k8tzkjx 487775 487739 2026-09-02T17:02:34Z अजीत कुमार तिवारी 4887 अनावश्यक साँचा जिसके कारण अनुभाग संपादनीय नहीं. 487775 wikitext text/x-wiki ==असमिया== ===विशेषण=== {{as-adj}} # [[अंत्यज]] === प्रकाशित कोशों से अर्थ === ==== हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश ==== अंतिम वर्ण से उत्पन्न। (विशेषण) #शूद्र वर्ण; #अछूत या अस्पृश्य जाति। (पुल्लिंग) [[श्रेणी: हिन्दी-प्रकाशितकोशों से अर्थ-हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश]] o5821tth20eddzctb8abtv7vtz5i43u साँचा:as-noun 10 306860 487797 487570 2026-09-02T17:47:38Z SM7 6218 सुधार 487797 wikitext text/x-wiki {{#invoke:checkparams|warn}}<!-- Validate template parameters -->{{head|as|संज्ञाएँ|sort={{{sort|}}}|head={{{head|}}}|tr={{{tr|}}}|{{#if:{{{cl|}}}|classifier|}}|{{{cl|}}}}}<!-- --><noinclude>{{documentation}}</noinclude> 1u0vv8w4c0omivhkzkgxkwzv0h4kg03 487800 487797 2026-09-02T18:12:20Z SM7 6218 टेम्परेरी परीक्षण वापस 487800 wikitext text/x-wiki {{#invoke:checkparams|warn}}<!-- Validate template parameters -->{{head|as|noun|sort={{{sort|}}}|head={{{head|}}}|tr={{{tr|}}}|{{#if:{{{cl|}}}|classifier|}}|{{{cl|}}}}}<!-- --><noinclude>{{documentation}}</noinclude> 5d16s4jpu3jnav440i4bqd6wthv706z অন্ধবিশ্বাস 0 306861 487737 487712 2026-09-02T14:07:56Z अजीत कुमार तिवारी 4887 साँचा सुधार. 487737 wikitext text/x-wiki =={{-as-}}== ===संज्ञा=== {{as-noun}} # [[अंधविश्वास]] === प्रकाशित कोशों से अर्थ === ==== हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश ==== बिना सोचे समझे किसी बात को मान लेना, विवेकरहित धारणा। (पुल्लिंग) [[श्रेणी: हिन्दी-प्रकाशितकोशों से अर्थ-हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश]] bo313evpi4nvkhedwv444a7t22ugg8s 487779 487737 2026-09-02T17:08:00Z अजीत कुमार तिवारी 4887 अनावश्यक साँचा जिसके कारण अनुभाग संपादनीय नहीं. 487779 wikitext text/x-wiki ==असमिया== ===संज्ञा=== {{as-noun}} # [[अंधविश्वास]] === प्रकाशित कोशों से अर्थ === ==== हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश ==== बिना सोचे समझे किसी बात को मान लेना, विवेकरहित धारणा। (पुल्लिंग) [[श्रेणी: हिन्दी-प्रकाशितकोशों से अर्थ-हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश]] 8tzyq2fy4f0i13adz6ci1eepmnt8qpi मॉड्यूल:headword/page 828 306870 487793 487583 2026-09-02T17:37:39Z SM7 6218 localization... 487793 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("पृष्ठ प्रविष्टियों के साथ")) insert(cats, get_category(format("पृष्ठ %s प्रविष्टि%s", L2_list_len, L2_list_len == 1 and "" or "यों" .. " के साथ"))) 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 a1l7cagb139m4lkrsl6pdggcmmktq8o 487794 487793 2026-09-02T17:40:01Z SM7 6218 मामूली सुधार 487794 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("पृष्ठ प्रविष्टियों के साथ")) insert(cats, get_category(format("पृष्ठ %s प्रविष्टि%s", L2_list_len, L2_list_len == 1 and " के साथ" or "यों के साथ"))) 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("पृष्ठ टैब कैरेक्टर के साथ")) 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 qvh2ct7wn444crx7pma3fsfn0yeb6am 487798 487794 2026-09-02T17:51:07Z SM7 6218 localization... 487798 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["ग़लत क्रम वाली भाषा हेडिंग वाले पृष्ठ"] = true L2_wrong_order = true end -- Check it's a canonical language name. if not (langnames or get_langnames())[name] then new_cats["गैर-स्टैंडर्ड भाषा हेडिंग वाले पृष्ठ"] = 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("पृष्ठ प्रविष्टियों के साथ")) insert(cats, get_category(format("पृष्ठ %s प्रविष्टि%s", L2_list_len, L2_list_len == 1 and " के साथ" or "यों के साथ"))) 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("पृष्ठ टैब कैरेक्टर के साथ")) 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 dxh2g9itj73w44syru1ihxeicpw86q9 साँचा:as-adj 10 306922 487795 487674 2026-09-02T17:40:51Z SM7 6218 सुधार 487795 wikitext text/x-wiki {{#invoke:checkparams|warn}}<!-- Validate template parameters -->{{head|as|विशेषण|sort={{{sort|}}}|head={{{head|}}}|tr={{{tr|}}}<!-- -->|{{#ifeq:{{{c}}}|+|comparative}}<!-- -->|[[আৰু]] {{pagename}}<!-- -->|{{#ifeq:{{{c}}}|+|superlative}}<!-- -->|[[আটাইতকৈ]] {{pagename}}<!-- -->}}<!-- --><noinclude>{{documentation}}</noinclude> 577gicgqb9ldo0g49xix7aqgkar7a51 मॉड्यूल:category tree/परिवार 828 306935 487812 487720 2026-09-02T19:15:06Z SM7 6218 SM7 ने पृष्ठ [[मॉड्यूल:category tree/families]] को [[मॉड्यूल:category tree/परिवार]] पर स्थानांतरित किया 487720 Scribunto text/plain local raw_categories = {} local raw_handlers = {} local concat = table.concat local insert = table.insert ----------------------------------------------------------------------------- -- -- -- RAW CATEGORIES -- -- -- ----------------------------------------------------------------------------- raw_categories["सभी भाषा परिवार"] = { topright = "{{commonscat|Languages by family}}\n{{wp|Language family,List of language families}}", description = "This category lists all [[language family|language families]].", parents = {"मूलभूत"}, } raw_categories["भाषाएँ परिवार अनुसार"] = { topright = "{{commonscat|Languages by family}}\n{{wp|Language family,List of language families}}", description = "This category contains all languages categorized hierarchically according to the [[language family]] they belong to.", additional = "Only top-level language families are shown here. For a full list of all language families, see [[:Category:All language families]] or [[Wiktionary:List of families]].", parents = { {name = "All languages", sort = " "}, {name = "All language families", sort = " "}, }, } raw_categories["Unassigned languages"] = { description = "Languages that have not yet been assigned to any family by Wiktionary editors, usually due to oversight.", additional = [=[This should be distinguished from: * [[:Category:Unclassifiable languages]] (languages that cannot be confidently assigned to any family, typically because the language is extinct or unresearched and has little available data on it); * [[:Category:Language isolates]] (where there is general agreement that the language has no relatives); and * [[:Category:Languages of disputed affiliation]] (languages where there is no consensus concerning which family, if any, they belong to).]=], parents = { {name = "भाषा परिवार अनुसार", sort = "*"}, "सभी भाषा परिवार", }, } ----------------------------------------------------------------------------- -- -- -- RAW HANDLERS -- -- -- ----------------------------------------------------------------------------- local function family_is_not_a_family(fam) if not fam then return false elseif fam:getCode() == "qfa-not" then return true else local family_parent = fam:getFamily() local parent_code = family_parent and family_parent:getCode() or nil -- Some families have no parent, some are in the pseudo-family sgn (sign languages), some are given as -- qfa-dis (disputed) or potentially qfa-unc (unclassifiable), but are not themselves pseudo-families. if not parent_code or parent_code == "sgn" or parent_code == "qfa-dis" or parent_code == "qfa-unc" then return false end return family_is_not_a_family(family_parent) end end local function family_has_no_category(fam) local famcode = fam:getCode() if famcode == "paa" then return false -- Papuan languages are not a family but have a category elseif famcode == "qfa-iso" or famcode == "qfa-not" then return true else local parfam = fam:getFamily() if parfam and parfam:getCode() == "qfa-not" then -- Constructed languages, sign languages, etc.; no category for them return true end end return false end -- Currently all Papuan families begin with "paa" or "ngf", local function family_is_papuan(fam) local famcode = fam:getCode() return famcode ~= "paa" and (famcode:find("^paa") or famcode:find("^ngf")) end local function infobox(fam) local ret = {} insert(ret, "<table class=\"wikitable\">\n") insert(ret, "<tr>\n<th colspan=\"2\" class=\"plainlinks\">[//en.wiktionary.org/w/index.php?title=Module:families/data&action=edit Edit family data]</th>\n</tr>\n") insert(ret, "<tr>\n<th>Canonical name</th><td>" .. fam:getCanonicalName() .. "</td>\n</tr>\n") local otherNames = fam: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>अन्य नाम</th><td><ul>" .. concat(names, "\n") .. "</ul></td>\n</tr>\n") end end local aliases = fam: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>उपनाम</th><td><ul>" .. concat(names, "\n") .. "</ul></td>\n</tr>\n") end end local varieties = fam: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:Families|Family code]]</th><td><code>" .. fam:getCode() .. "</code></td>\n</tr>\n") insert(ret, "<tr>\n<th>[[w:Proto-language|Common ancestor]]</th><td>") local protoLanguage = fam:getProtoLanguage() if protoLanguage then insert(ret, "[[:श्रेणी:" .. protoLanguage:getCategoryName() .. "|" .. protoLanguage:getCanonicalName() .. "]]") else insert(ret, "none") end insert(ret, "</td>\n") insert(ret, "\n</tr>\n") local parent = fam:getFamily() if not parent then insert(ret, "<tr>\n<th>[[Wiktionary:Families|Parent family]]</th>\n<td>") insert(ret, "unassigned") elseif parent:getCode() == "qfa-not" then insert(ret, "<tr>\n<th>[[Wiktionary:Families|Parent family]]</th>\n<td>") insert(ret, "not a family") else local chain = {} while parent do if family_has_no_category(parent) then break end insert(chain, "[[:श्रेणी:" .. parent:getCategoryName() .. "|" .. parent:getCanonicalName() .. "]]") parent = parent:getFamily() end if #chain == 0 then insert(ret, "<tr>\n<th>[[Wiktionary:परिवार|पूर्वज परिवार]]</th>\n<td>") insert(ret, "no parents") else insert(ret, "<tr>\n<th>[[Wiktionary:परिवार|Parent famil" .. (#chain == 1 and "y" or "ies") .. "]]</th>\n<td>") for i = #chain, 1, -1 do insert(ret, "<ul><li>" .. chain[i]) end insert(ret, string.rep("</li></ul>", #chain)) end end insert(ret, "</td>\n</tr>\n") if fam:getWikidataItem() and mw.wikibase then local link = '[' .. mw.wikibase.getEntityUrl(fam:getWikidataItem()) .. ' ' .. fam:getWikidataItem() .. ']' insert(ret, "<tr><th>Wikidata</th><td>" .. link .. "</td></tr>") end insert(ret, "</table>") return concat(ret) end local function NavFrame_for_family_tree(content, title) return '<div class="NavFrame"><div class="NavHead">' .. (title or '{{{title}}}') .. '</div>' .. '<div class="NavContent" style="text-align: left; font-size: calc(1em / 0.95); padding: 0.3em">' .. content .. '</div></div>' end local additional_information = { ["qfa-dis"] = "These are languages where there is no consensus concerning which family, if any, they belong to.", ["qfa-iso"] = "These are languages where there is general agreement that the language has no known relatives.", ["qfa-mix"] = "A [[mixed language]] is a language which is composed of two different languages.", ["qfa-unc"] = "These are languages that cannot be confidently assigned to a family due to lack of sufficient linguistic data. " .. "They are also commonly called {{w|unclassified language|unclassified languages}}, but this is ambiguous between " .. "languages that cannot be classified (due to insufficient data) and those that merely have not been classified " .. "(due to insufficient research).", } local preceding_information = { ["qfa-dis"] = "{{also|Category:Unclassifiable languages|Category:Unassigned languages|Category:Language isolates}}", ["qfa-iso"] = "{{also|Category:Languages of disputed affiliation|Category:Unclassifiable languages|Category:Unassigned languages}}", ["qfa-unc"] = "{{also|Category:Languages of disputed affiliation|Category:Unassigned languages|Category:Language isolates}}", ["qfa-mix"] = "{{also|Category:Creole or pidgin languages}}", ["crp"] = "{{also|Category:Mixed languages}}", } local specially_named_families = { ["Languages of disputed affiliation"] = "qfa-dis", ["Language isolates"] = "qfa-iso", } local specially_named_family_sort_keys = { ["Languages of disputed affiliation"] = "Disputed affiliation", ["Language isolates"] = "Isolate", } insert(raw_handlers, function(data) local family = require("Module:families").getByCategoryName(data.category) if not family then local special_code = specially_named_families[data.category] if special_code then family = require("Module:families").getByCode(special_code) if not family then error(("Internal error: Family code '%s' is an invalid family code."):format(special_code)) end end end if not family then return nil end local parent_fam = family:getFamily() local first_parent, parent_sort_key, first_parent_sort_key if not parent_fam or family_has_no_category(parent_fam) then first_parent = "भाषाएँ परिवार अनुसार" parent_sort_key = specially_named_family_sort_keys[data.category] first_parent_sort_key = "*" .. (parent_sort_key or "") else first_parent = parent_fam:getCategoryName() end local description, additional = "", "" local topright local preceding = preceding_information[family:getCode()] local additional_preface = additional_information[family:getCode()] if additional_preface then additional_preface = additional_preface .. "\n\n" else additional_preface = "" end if family_is_not_a_family(family) then additional_preface = additional_preface .. "This is a pseudo-family, used for grouping purposes but not forming a linguistically valid [[clade]] " .. "(i.e. a set of linguistically related languages descending from a common parent).\n\n" .. "Information about this family:\n\n" else additional_preface = "Information about " .. family:getCanonicalName() .. ":\n\n" end if not data.called_from_inside then topright = {} local wikipedia_art = family:getWikipediaArticle("noCategoryFallback") if wikipedia_art then insert(topright, "{{wp|" .. wikipedia_art .. "}}") end local commons_cat = family:getCommonsCategory() if commons_cat then insert(topright, "{{commonscat|" .. commons_cat:gsub("^श्रेणी:", "") .. "}}") end topright = #topright > 0 and concat(topright, "\n") or nil description = "This is the main category of the '''" .. family:getDisplayForm() .. "'''." additional = additional_preface .. infobox(family) end local ok, tree_of_descendants = pcall( require("Module:family tree").print_children, family:getCode(), { protolanguage_under_family = true, must_have_descendants = true }) if ok then if tree_of_descendants then additional = additional .. NavFrame_for_family_tree( tree_of_descendants, "परिवार वृक्ष") else additional = additional .. "\n\n" .. ucfirst(family: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 local parents = { {name = first_parent, sort = first_parent_sort_key}, {name = "सभी भाषा परिवार", sort = parent_sort_key}, } if parent_fam and parent_fam:getCode() == "sgn" then insert(parents, "All sign languages") end if family_is_papuan(family) then insert(parents, "Papuan languages") end return { preceding = preceding, topright = topright, description = description, additional = additional, parents = parents, breadcrumb = family:getCanonicalName(), can_be_empty = true, } end) return {RAW_CATEGORIES = raw_categories, RAW_HANDLERS = raw_handlers} 9eksalu5otlpo6m1zl5s2f089221ybt 487814 487812 2026-09-02T19:16:16Z SM7 6218 सुधार 487814 Scribunto text/plain local raw_categories = {} local raw_handlers = {} local concat = table.concat local insert = table.insert ----------------------------------------------------------------------------- -- -- -- RAW CATEGORIES -- -- -- ----------------------------------------------------------------------------- raw_categories["सभी भाषा परिवार"] = { topright = "{{commonscat|Languages by family}}\n{{wp|Language family,List of language families}}", description = "This category lists all [[language family|language families]].", parents = {"मूलभूत श्रेणी"}, } raw_categories["भाषाएँ परिवार अनुसार"] = { topright = "{{commonscat|Languages by family}}\n{{wp|Language family,List of language families}}", description = "This category contains all languages categorized hierarchically according to the [[language family]] they belong to.", additional = "Only top-level language families are shown here. For a full list of all language families, see [[:Category:All language families]] or [[Wiktionary:List of families]].", parents = { {name = "All languages", sort = " "}, {name = "सभी भाषा परिवार", sort = " "}, }, } raw_categories["Unassigned languages"] = { description = "Languages that have not yet been assigned to any family by Wiktionary editors, usually due to oversight.", additional = [=[This should be distinguished from: * [[:Category:Unclassifiable languages]] (languages that cannot be confidently assigned to any family, typically because the language is extinct or unresearched and has little available data on it); * [[:Category:Language isolates]] (where there is general agreement that the language has no relatives); and * [[:Category:Languages of disputed affiliation]] (languages where there is no consensus concerning which family, if any, they belong to).]=], parents = { {name = "भाषा परिवार अनुसार", sort = "*"}, "सभी भाषा परिवार", }, } ----------------------------------------------------------------------------- -- -- -- RAW HANDLERS -- -- -- ----------------------------------------------------------------------------- local function family_is_not_a_family(fam) if not fam then return false elseif fam:getCode() == "qfa-not" then return true else local family_parent = fam:getFamily() local parent_code = family_parent and family_parent:getCode() or nil -- Some families have no parent, some are in the pseudo-family sgn (sign languages), some are given as -- qfa-dis (disputed) or potentially qfa-unc (unclassifiable), but are not themselves pseudo-families. if not parent_code or parent_code == "sgn" or parent_code == "qfa-dis" or parent_code == "qfa-unc" then return false end return family_is_not_a_family(family_parent) end end local function family_has_no_category(fam) local famcode = fam:getCode() if famcode == "paa" then return false -- Papuan languages are not a family but have a category elseif famcode == "qfa-iso" or famcode == "qfa-not" then return true else local parfam = fam:getFamily() if parfam and parfam:getCode() == "qfa-not" then -- Constructed languages, sign languages, etc.; no category for them return true end end return false end -- Currently all Papuan families begin with "paa" or "ngf", local function family_is_papuan(fam) local famcode = fam:getCode() return famcode ~= "paa" and (famcode:find("^paa") or famcode:find("^ngf")) end local function infobox(fam) local ret = {} insert(ret, "<table class=\"wikitable\">\n") insert(ret, "<tr>\n<th colspan=\"2\" class=\"plainlinks\">[//en.wiktionary.org/w/index.php?title=Module:families/data&action=edit Edit family data]</th>\n</tr>\n") insert(ret, "<tr>\n<th>Canonical name</th><td>" .. fam:getCanonicalName() .. "</td>\n</tr>\n") local otherNames = fam: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>अन्य नाम</th><td><ul>" .. concat(names, "\n") .. "</ul></td>\n</tr>\n") end end local aliases = fam: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>उपनाम</th><td><ul>" .. concat(names, "\n") .. "</ul></td>\n</tr>\n") end end local varieties = fam: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:Families|Family code]]</th><td><code>" .. fam:getCode() .. "</code></td>\n</tr>\n") insert(ret, "<tr>\n<th>[[w:Proto-language|Common ancestor]]</th><td>") local protoLanguage = fam:getProtoLanguage() if protoLanguage then insert(ret, "[[:श्रेणी:" .. protoLanguage:getCategoryName() .. "|" .. protoLanguage:getCanonicalName() .. "]]") else insert(ret, "none") end insert(ret, "</td>\n") insert(ret, "\n</tr>\n") local parent = fam:getFamily() if not parent then insert(ret, "<tr>\n<th>[[Wiktionary:Families|Parent family]]</th>\n<td>") insert(ret, "unassigned") elseif parent:getCode() == "qfa-not" then insert(ret, "<tr>\n<th>[[Wiktionary:Families|Parent family]]</th>\n<td>") insert(ret, "not a family") else local chain = {} while parent do if family_has_no_category(parent) then break end insert(chain, "[[:श्रेणी:" .. parent:getCategoryName() .. "|" .. parent:getCanonicalName() .. "]]") parent = parent:getFamily() end if #chain == 0 then insert(ret, "<tr>\n<th>[[Wiktionary:परिवार|पूर्वज परिवार]]</th>\n<td>") insert(ret, "no parents") else insert(ret, "<tr>\n<th>[[Wiktionary:परिवार|Parent famil" .. (#chain == 1 and "y" or "ies") .. "]]</th>\n<td>") for i = #chain, 1, -1 do insert(ret, "<ul><li>" .. chain[i]) end insert(ret, string.rep("</li></ul>", #chain)) end end insert(ret, "</td>\n</tr>\n") if fam:getWikidataItem() and mw.wikibase then local link = '[' .. mw.wikibase.getEntityUrl(fam:getWikidataItem()) .. ' ' .. fam:getWikidataItem() .. ']' insert(ret, "<tr><th>Wikidata</th><td>" .. link .. "</td></tr>") end insert(ret, "</table>") return concat(ret) end local function NavFrame_for_family_tree(content, title) return '<div class="NavFrame"><div class="NavHead">' .. (title or '{{{title}}}') .. '</div>' .. '<div class="NavContent" style="text-align: left; font-size: calc(1em / 0.95); padding: 0.3em">' .. content .. '</div></div>' end local additional_information = { ["qfa-dis"] = "These are languages where there is no consensus concerning which family, if any, they belong to.", ["qfa-iso"] = "These are languages where there is general agreement that the language has no known relatives.", ["qfa-mix"] = "A [[mixed language]] is a language which is composed of two different languages.", ["qfa-unc"] = "These are languages that cannot be confidently assigned to a family due to lack of sufficient linguistic data. " .. "They are also commonly called {{w|unclassified language|unclassified languages}}, but this is ambiguous between " .. "languages that cannot be classified (due to insufficient data) and those that merely have not been classified " .. "(due to insufficient research).", } local preceding_information = { ["qfa-dis"] = "{{also|Category:Unclassifiable languages|Category:Unassigned languages|Category:Language isolates}}", ["qfa-iso"] = "{{also|Category:Languages of disputed affiliation|Category:Unclassifiable languages|Category:Unassigned languages}}", ["qfa-unc"] = "{{also|Category:Languages of disputed affiliation|Category:Unassigned languages|Category:Language isolates}}", ["qfa-mix"] = "{{also|Category:Creole or pidgin languages}}", ["crp"] = "{{also|Category:Mixed languages}}", } local specially_named_families = { ["Languages of disputed affiliation"] = "qfa-dis", ["Language isolates"] = "qfa-iso", } local specially_named_family_sort_keys = { ["Languages of disputed affiliation"] = "Disputed affiliation", ["Language isolates"] = "Isolate", } insert(raw_handlers, function(data) local family = require("Module:families").getByCategoryName(data.category) if not family then local special_code = specially_named_families[data.category] if special_code then family = require("Module:families").getByCode(special_code) if not family then error(("Internal error: Family code '%s' is an invalid family code."):format(special_code)) end end end if not family then return nil end local parent_fam = family:getFamily() local first_parent, parent_sort_key, first_parent_sort_key if not parent_fam or family_has_no_category(parent_fam) then first_parent = "भाषाएँ परिवार अनुसार" parent_sort_key = specially_named_family_sort_keys[data.category] first_parent_sort_key = "*" .. (parent_sort_key or "") else first_parent = parent_fam:getCategoryName() end local description, additional = "", "" local topright local preceding = preceding_information[family:getCode()] local additional_preface = additional_information[family:getCode()] if additional_preface then additional_preface = additional_preface .. "\n\n" else additional_preface = "" end if family_is_not_a_family(family) then additional_preface = additional_preface .. "This is a pseudo-family, used for grouping purposes but not forming a linguistically valid [[clade]] " .. "(i.e. a set of linguistically related languages descending from a common parent).\n\n" .. "Information about this family:\n\n" else additional_preface = "Information about " .. family:getCanonicalName() .. ":\n\n" end if not data.called_from_inside then topright = {} local wikipedia_art = family:getWikipediaArticle("noCategoryFallback") if wikipedia_art then insert(topright, "{{wp|" .. wikipedia_art .. "}}") end local commons_cat = family:getCommonsCategory() if commons_cat then insert(topright, "{{commonscat|" .. commons_cat:gsub("^श्रेणी:", "") .. "}}") end topright = #topright > 0 and concat(topright, "\n") or nil description = "This is the main category of the '''" .. family:getDisplayForm() .. "'''." additional = additional_preface .. infobox(family) end local ok, tree_of_descendants = pcall( require("Module:family tree").print_children, family:getCode(), { protolanguage_under_family = true, must_have_descendants = true }) if ok then if tree_of_descendants then additional = additional .. NavFrame_for_family_tree( tree_of_descendants, "परिवार वृक्ष") else additional = additional .. "\n\n" .. ucfirst(family: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 local parents = { {name = first_parent, sort = first_parent_sort_key}, {name = "सभी भाषा परिवार", sort = parent_sort_key}, } if parent_fam and parent_fam:getCode() == "sgn" then insert(parents, "All sign languages") end if family_is_papuan(family) then insert(parents, "Papuan languages") end return { preceding = preceding, topright = topright, description = description, additional = additional, parents = parents, breadcrumb = family:getCanonicalName(), can_be_empty = true, } end) return {RAW_CATEGORIES = raw_categories, RAW_HANDLERS = raw_handlers} 6c0ywzwqj0mc8fgvtgg05763i0q9zww কিন্নৰ 0 306938 487736 487723 2026-09-02T14:07:23Z अजीत कुमार तिवारी 4887 साँचा सुधार. 487736 wikitext text/x-wiki =={{-as-}}== ===संज्ञा=== {{as-noun}} # [[किन्नर]] # देवलोक का एक उपदेवता जो एक प्रकार का गायक था और उसका मुँह घोड़े के समान होता था। # बाजा जो बीन जैसा होता है लेकिन इस की लकड़ी इस से कुछ ज़्यादा लंबी होती है और इस में तीन कद्दू और दो तार होते हैं। # वर्तमान समय में 'हिजड़ा' के लिए शिष्टोक्ति। === प्रकाशित कोशों से अर्थ === ==== हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश ==== # पुराणानुसार देवलोक या स्वर्ग के एक प्रकार के गायक-उपदेवता; (पुल्लिंग) # आजकल गाने-बजाने का पेशा करने वाली एक जाति। [[श्रेणी: हिन्दी-प्रकाशितकोशों से अर्थ-हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश]] ekeoj98bf0fr86ar9m47qzwn7l8io39 487778 487736 2026-09-02T17:07:27Z अजीत कुमार तिवारी 4887 अनावश्यक साँचा जिसके कारण अनुभाग संपादनीय नहीं. 487778 wikitext text/x-wiki ==असमिया== ===संज्ञा=== {{as-noun}} # [[किन्नर]] # देवलोक का एक उपदेवता जो एक प्रकार का गायक था और उसका मुँह घोड़े के समान होता था। # बाजा जो बीन जैसा होता है लेकिन इस की लकड़ी इस से कुछ ज़्यादा लंबी होती है और इस में तीन कद्दू और दो तार होते हैं। # वर्तमान समय में 'हिजड़ा' के लिए शिष्टोक्ति। === प्रकाशित कोशों से अर्थ === ==== हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश ==== # पुराणानुसार देवलोक या स्वर्ग के एक प्रकार के गायक-उपदेवता; (पुल्लिंग) # आजकल गाने-बजाने का पेशा करने वाली एक जाति। [[श्रेणी: हिन्दी-प्रकाशितकोशों से अर्थ-हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश]] 3q40lqzc202mmcowqyrud8cg7cuy5rb অখন্ড 0 306939 487724 2026-09-02T13:54:55Z अजीत कुमार तिवारी 4887 +असमिया से शब्द. 487724 wikitext text/x-wiki ==असमिया== ===विशेषण=== {{as-adj}} # [[अखंड]] === प्रकाशित कोशों से अर्थ === ==== हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश ==== # जिसके खंड न हुए हों, समूचा, पूरा। [[श्रेणी: हिन्दी-प्रकाशितकोशों से अर्थ-हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश]] c2byragnpzmdyi00dsfab50hj3c76w0 487735 487724 2026-09-02T14:06:19Z अजीत कुमार तिवारी 4887 साँचा सुधार. 487735 wikitext text/x-wiki =={{-as-}}== ===विशेषण=== {{as-adj}} # [[अखंड]] === प्रकाशित कोशों से अर्थ === ==== हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश ==== # जिसके खंड न हुए हों, समूचा, पूरा। [[श्रेणी: हिन्दी-प्रकाशितकोशों से अर्थ-हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश]] fcf4elwtf42o6zkrv6heg3eiwt7tsk8 487777 487735 2026-09-02T17:06:58Z अजीत कुमार तिवारी 4887 अनावश्यक साँचा जिसके कारण अनुभाग संपादनीय नहीं. 487777 wikitext text/x-wiki ==असमिया== ===विशेषण=== {{as-adj}} # [[अखंड]] === प्रकाशित कोशों से अर्थ === ==== हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश ==== # जिसके खंड न हुए हों, समूचा, पूरा। [[श्रेणी: हिन्दी-प्रकाशितकोशों से अर्थ-हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश]] c2byragnpzmdyi00dsfab50hj3c76w0 अखण्ड़नीय 0 306940 487726 2026-09-02T13:56:18Z अजीत कुमार तिवारी 4887 अजीत कुमार तिवारी ने पृष्ठ [[अखण्ड़नीय]] को [[अखण्डनीय]] पर स्थानांतरित किया: शीर्षक में गलत वर्तनी 487726 wikitext text/x-wiki #पुनर्प्रेषित [[अखण्डनीय]] 533qeyz69xntcq5jnhd80s0uwn7tpue अखण्ड़ 0 306941 487729 2026-09-02T13:58:48Z अजीत कुमार तिवारी 4887 अजीत कुमार तिवारी ने पृष्ठ [[अखण्ड़]] को [[अखंड]] पर स्थानांतरित किया: शीर्षक में गलत वर्तनी 487729 wikitext text/x-wiki #पुनर्प्रेषित [[अखंड]] 06k4cqem75qhdjr2njfmqjyod8tfdb8 आसामी 0 306942 487734 2026-09-02T14:03:44Z अजीत कुमार तिवारी 4887 अजीत कुमार तिवारी ने पृष्ठ [[आसामी]] को [[असमिया]] पर स्थानांतरित किया: अधिक प्रचलित नाम. 487734 wikitext text/x-wiki #पुनर्प्रेषित [[असमिया]] bc0omf0p5x5mtndsin4wlzl8322wwj5 मॉड्यूल:rhymes/data 828 306943 487756 2026-09-02T15:18:16Z SM7 6218 अंग्रेजी विक्षनरी से आयातित 487756 Scribunto text/plain local export = {} -- List of languages which do not have entries in the Rhymes -- namespace and link to the automatic category instead. export.link_to_category_langs = { ["izh"] = true, ["mt"] = true, ["sq"] = true, } return export 88uttm5ad5u5las70bryawduhf0aqug मॉड्यूल:labels/data/qualifiers 828 306944 487757 2026-09-02T15:54:49Z SM7 6218 अंग्रेजी विक्षनरी से आयातित 487757 Scribunto text/plain local labels = {} -- Qualifiers and similar labels. -- NOTE: This module is loaded both by [[Module:labels]] and by [[Module:accent qualifier]]. -- Helper labels labels["_"] = { display = "", omit_preComma = true, omit_postComma = true, } labels[","] = { -- forced comma omit_preComma = true, omit_postComma = true, omit_preSpace = true, } labels[";"] = { omit_preComma = true, omit_postComma = true, omit_preSpace = true, } labels[":"] = { omit_preComma = true, omit_postComma = true, omit_preSpace = true, } labels["?"] = { omit_preComma = true, omit_postComma = true, omit_preSpace = true, } labels["(?)"] = { omit_preComma = true, omit_postComma = true, omit_preSpace = true, } labels["-"] = { -- hyphen omit_preComma = true, omit_postComma = true, omit_preSpace = true, omit_postSpace = true, } labels["–"] = { -- en dash omit_preComma = true, omit_postComma = true, omit_preSpace = true, omit_postSpace = true, } labels["—"] = { -- em dash omit_preComma = true, omit_postComma = true, omit_preSpace = true, omit_postSpace = true, } labels["also"] = { omit_postComma = true, } labels["and"] = { aliases = {"&"}, omit_preComma = true, omit_postComma = true, } -- e.g. "informal, but formal in Louisiana" labels["but"] = { omit_postComma = true, } labels["by"] = { omit_preComma = true, omit_postComma = true, } -- e.g. "except in", "except with" etc. labels["except"] = { omit_preComma = true, omit_postComma = true, } labels["or"] = { omit_preComma = true, omit_postComma = true, } labels["outside"] = { aliases = {"except in"}, omit_preComma = true, omit_postComma = true, } labels["with"] = { aliases = {"+"}, omit_preComma = true, omit_postComma = true, } -- Qualifier labels labels["attested in"] = { omit_postComma = true, } labels["chiefly"] = { aliases = {"mainly", "mostly", "primarily", "Chiefly"}, omit_postComma = true, } labels["especially"] = { omit_postComma = true, } labels["excluding"] = { omit_postComma = true, } labels["exclusively"] = { aliases = {"strictly"}, omit_postComma = true, } labels["extremely"] = { omit_postComma = true, } labels["formerly"] = { omit_postComma = true, } labels["frequently"] = { omit_postComma = true, } -- e.g. "highly nonstandard" labels["highly"] = { omit_postComma = true, } labels["in"] = { omit_postComma = true, } labels["in a"] = { omit_postComma = true, } labels["in an"] = { omit_postComma = true, } labels["in the"] = { omit_postComma = true, } labels["including"] = { omit_postComma = true, } -- e.g. "less common" labels["less"] = { omit_postComma = true, } -- e.g. "many dialects" labels["many"] = { omit_postComma = true, } labels["markedly"] = { omit_postComma = true, } labels["mildly"] = { omit_postComma = true, } -- e.g. "more common" labels["more"] = { omit_postComma = true, } labels["now"] = { aliases = {"nowadays"}, omit_postComma = true, } labels["occasionally"] = { omit_postComma = true, } labels["of"] = { omit_postComma = true, } labels["of a"] = { omit_postComma = true, } labels["of an"] = { omit_postComma = true, } labels["of the"] = { omit_postComma = true, } labels["often"] = { aliases = {"commonly"}, omit_postComma = true, } labels["originally"] = { omit_postComma = true, } -- e.g. "law, otherwise archaic" labels["otherwise"] = { omit_postComma = true, } labels["particularly"] = { omit_postComma = true, } labels["possibly"] = { -- aliases = {"perhaps"}, omit_postComma = true, } labels["predominantly"] = { omit_postComma = true, } labels["rarely"] = { omit_postComma = true, } labels["rather"] = { omit_postComma = true, } labels["relatively"] = { omit_postComma = true, } labels["slightly"] = { omit_postComma = true, } labels["sometimes"] = { omit_postComma = true, } labels["somewhat"] = { omit_postComma = true, } labels["strongly"] = { omit_postComma = true, } labels["the"] = { omit_postComma = true, } -- e.g. "then colloquial, now dated" labels["then"] = { omit_postComma = true, } labels["typically"] = { omit_postComma = true, } labels["usually"] = { omit_postComma = true, } labels["very"] = { omit_postComma = true, } labels["with a"] = { omit_postComma = true, } labels["with an"] = { omit_postComma = true, } labels["with the"] = { omit_postComma = true, } labels["with respect to"] = { aliases = {"wrt"}, omit_postComma = true, } return require("Module:labels").finalize_data(labels) ow7lz65j1yqeur8mu3w2vng38trdiut मॉड्यूल:pron qualifier 828 306945 487760 2026-09-02T15:59:45Z SM7 6218 अंग्रेजी विक्षनरी से आयातित 487760 Scribunto text/plain -- TODO: this module is now used for more than just pronunciations and should be renamed. local export = {} local labels_module = "Module:labels" local qualifier_module = "Module:qualifier" local references_module = "Module:references" local function track(page) require("Module:debug/track")("pron qualifier/" .. page) return true end --[==[ This function is used by any module that wants to add support for (some subset of) left and right regular and accent qualifiers, labels and references to a template, e.g. for pronunciations. It is currently used by [[Module:IPA]], [[Module:rhymes]], [[Module:hyphenation]], [[Module:homophones]], [[Module:affix]] and various lang-specific modules such as [[Module:es-pronunc]] (for specifying pronunciation, rhymes, hyphenation, homophones and audio in {{tl|es-pr}}). It should potentially also be used in {{tl|audio}}. To reduce memory usage, the caller should check that any qualifiers exist before loading the module. `data` is a structure containing the following fields: * `q`: List of left regular qualifiers, each a string. * `qq`: List of right regular qualifiers, each a string. * `qualifiers`: List of qualifiers, each a string, for compatibility. If `qualifiers_right` is given, these are right qualifiers, otherwise left qualifiers. If both `qualifiers` and `q`/`qq` (depending on the value of `qualifiers_right`) are non-{nil}, `qualifiers` is ignored. * `qualifiers_right`: If specified, qualifiers in `qualifiers` are placed to the right, otherwise the left. See above. * `a`: List of left accent qualifiers, each a string. * `aa`: List of right accent qualifiers, each a string. * `l`: List of left labels, each a string. * `ll`: List of right labels, each a string. * `refs`: {nil} or a list of references or reference specs to add directly after the text; the value of a list item is either a string containing the reference text (typically a call to a citation template such as {{tl|cite-book}}, or a template wrapping such a call), or an object with fields `text` (the reference text), `name` (the name of the reference, as in {{cd|<nowiki><ref name="foo">...</ref></nowiki>}} or {{cd|<nowiki><ref name="foo" /></nowiki>}}) and/or `group` (the group of the reference, as in {{cd|<nowiki><ref name="foo" group="bar">...</ref></nowiki>}} or {{cd|<nowiki><ref name="foo" group="bar"/></nowiki>}}); this uses a parser function to format the reference appropriately and insert a footnote number that hyperlinks to the actual reference, located in the {{cd|<nowiki><references /></nowiki>}} section. * `lang`: Language object for accent qualifiers. * `text`: The text to wrap with qualifiers. *` raw`: Don't do any CSS wrapping of the formatted text. The order of qualifiers and labels, on both the left and right, is (1) labels, (2) accent qualifiers, (3) regular qualifiers. This goes in order of relative importance. ]==] function export.format_qualifiers(data) if not data.text then error("Missing `data.text`; did you try to pass `text` or `qualifiers_right` as separate params?") end if not data.lang then track("nolang") end local text = data.text -- Format the qualifiers and labels that go either before or after the main text. They are ordered as follows, on -- both the left and the right: (1) labels, (2) accent qualifiers, (3) regular qualifiers. This puts the different -- types of qualifiers/labels in order of relative importance. Return nil if no qualifiers or labels, otherwise -- a string containing all formatted qualifiers and labels surrounded by parens. local function format_qualifier_like(labels, accent_qualifiers, qualifiers) local has_qualifiers = qualifiers and qualifiers[1] local has_accent_qualifiers = accent_qualifiers and accent_qualifiers[1] local has_labels = labels and labels[1] if not has_qualifiers and not has_accent_qualifiers and not has_labels then return nil end local qualifier_like_parts = {} local function ins(part) table.insert(qualifier_like_parts, part) end local function format_label_like(labels, mode) return require(labels_module).show_labels { lang = data.lang, labels = labels, nocat = true, mode = mode, open = false, close = false, no_ib_content = true, no_track_already_seen = true, ok_to_destructively_modify = true, -- doesn't apply to `labels` raw = data.raw, } end local m_qualifier = require(qualifier_module) if has_labels then ins(format_label_like(labels)) end if has_accent_qualifiers then ins(format_label_like(accent_qualifiers, "accent")) end if has_qualifiers then ins(m_qualifier.format_qualifiers { qualifiers = qualifiers, open = false, close = false, no_ib_content = true, raw = data.raw, }) end local qualifier_inside local function wrap_qualifier_css(txt, suffix) if data.raw then return txt else return m_qualifier.wrap_qualifier_css(txt, suffix) end end if qualifier_like_parts[2] then qualifier_inside = table.concat(qualifier_like_parts, wrap_qualifier_css(",", "comma") .. " ") else qualifier_inside = qualifier_like_parts[1] end qualifier_like_parts = {} ins(wrap_qualifier_css("(", "brac")) ins(wrap_qualifier_css(qualifier_inside, "content")) ins(wrap_qualifier_css(")", "brac")) return table.concat(qualifier_like_parts) end if data.refs then text = text .. require(references_module).format_references(data.refs) end local leftq = format_qualifier_like(data.l, data.a, data.q or not data.qualifiers_right and data.qualifiers) local rightq = format_qualifier_like(data.ll, data.aa, data.qq or data.qualifiers_right and data.qualifiers) if leftq then text = leftq .. " " .. text end if rightq then text = text .. " " .. rightq end return text end return export nkakbwx2we31h7ak7pqnd0ng4a55308 मॉड्यूल:template parser/templates 828 306946 487768 2026-09-02T16:36:17Z SM7 6218 अंग्रेजी विक्षनरी से आयातित 487768 Scribunto text/plain -- Prevent substitution. if mw.isSubsting() then return require("Module:unsubst") end local export = {} local m_template_parser = require("Module:template parser") local display_parameter = m_template_parser.displayParameter local process_params = require("Module:parameters").process local template_link = m_template_parser.templateLink local unpack = unpack or table.unpack -- Lua 5.2 compatibility local wikitag_link = m_template_parser.wikitagLink local function get_offset_template_args(frame) -- Process parameters with the return_unknown flag set. `title` contains -- the title at key 1; everything else goes in `args`. local title, args = process_params(frame:getParent().args, { [1] = {required = true, allow_empty = true, no_trim = true} }, true) title = title[1] -- Shift all implicit arguments down by 1. Non-sequential numbered -- parameters don't get shifted; however, this offset means that if the -- input contains (e.g.) {{tl|l|en|3=alt}}, representing {{l|en|3=alt}}, -- the parameter at 3= is instead treated as sequential by this module, -- because it's indistinguishable from {{tl|l|en|alt}}, which represents -- {{l|en|alt}}. On the other hand, {{tl|l|en|4=tr}} is handled correctly, -- because there's still a gap before 4=. -- Unfortunately, there's no way to know the original input, so -- there's no clear way to fix this; the only difference is that explicit -- parameters have whitespace trimmed from their values while implicit ones -- don't, but we can't assume that every input with no whitespace was given -- with explicit numbering. -- This also causes bigger problems for any parser functions which treat -- their inputs as arrays, or in some other nonstandard way (e.g. -- {{#IF:foo|bar=baz|qux}} treats "bar=baz" as parameter 1). Without -- knowing the original input, these can't be reconstructed accurately. -- The way around this is to use <nowiki> tags in the input, since this -- module won't unstrip them by design. local i = 2 repeat local arg = args[i] args[i - 1] = arg i = i + 1 until arg == nil return title, args end function export.template_link_t(frame) local iargs = process_params(frame.args, { ["annotate"] = true, ["nolink"] = {type = "boolean"}, }) -- iargs.annotate allows a template to specify the title, so the input -- arguments will match the output. local title = iargs.annotate if title then return template_link(title, frame:getParent().args, iargs.nolink) end -- Otherwise, get template arguments offset by 1. local args title, args = get_offset_template_args(frame) return template_link(title, args, iargs.nolink) end function export.template_demo_t(frame) local title, args = get_offset_template_args(frame) return template_link(title, args) .. " ⇒<br style=\"line-height: 200%;\" />" .. frame:expandTemplate{title = title, args = args} end function export.parameter_t(frame) return display_parameter(unpack(process_params(frame:getParent().args, { [1] = {required = true, allow_empty = true, no_trim = true}, [2] = {allow_empty = true, no_trim = true}, }))) end function export.wikitag_link_t(frame) return wikitag_link(process_params(frame:getParent().args, { [1] = {required = true, allow_empty = true, no_trim = true} })[1]) end return export gmu9dpbh2ydrhfx4p61dfx6c72aig0i मॉड्यूल:table/length 828 306947 487771 2026-09-02T16:39:00Z SM7 6218 अंग्रेजी विक्षनरी से आयातित 487771 Scribunto text/plain local ipairs_default_iter = ipairs{} return function(t, raw) local n = 0 if raw then for i in ipairs_default_iter, t, 0 do n = i end return n end repeat n = n + 1 until t[n] == nil return n - 1 end tryk70hxgidgdgqrb7utnj2sub9w656 मॉड्यूल:code 828 306948 487772 2026-09-02T16:40:29Z SM7 6218 अंग्रेजी विक्षनरी से आयातित 487772 Scribunto text/plain local decode_entities = require("Module:string utilities").decode_entities local gsub = string.gsub local insert = table.insert local match = string.match local process_params = require("Module:parameters").process local tonumber = tonumber local unstripNoWiki = mw.text.unstripNoWiki local yesno = require("Module:yesno") local export = {} local function get_args(frame) local params = { [1] = {required = true, default = "code"}, [""] = {alias_of = 1}, ["line"] = true, ["highlight"] = true, ["inline"] = {type = "boolean"}, ["class"] = true, ["style"] = true, } local lang = process_params(frame.args, { ["lang"] = true }).lang local args = frame:getParent().args -- Specialised language templates (e.g. {{lua}}). if lang then args = process_params(args, params) return args, lang, args[1] end params["lang"] = {default = "text"} -- If 2= or "=..." are given, treat 1= as an alias of lang=. if args[2] or args[""] then insert(params, 1, {alias_of = "lang"}) params[""].alias_of = 2 args = process_params(args, params) return args, args.lang, args[2] end -- Otherwise, 1= is just the input text. args = process_params(args, params) return args, args.lang, args[1] end function export.show(frame) local args, lang, text = get_args(frame) local inline, line, start, highlight = args.inline if not inline then -- If `line` is a boolean, start at line 1; otherwise, if it's a number, -- start at that line. line = args.line if line then start = match(line, "^%d+$") if start == nil then line = yesno(line) or nil end end -- Offset `highlight` based on `start`. highlight = args.highlight if highlight and start then local offset = tonumber(start) - 1 highlight = gsub(highlight, "%d+", function(n) return tonumber(n) - offset end) end -- If `inline` isn't specified, default to false if `line` or -- `highlight` are given; otherwise, default to true. inline = inline == nil and not (line or highlight) or nil end -- Unstrip nowiki tags and decode any HTML entities, because -- syntaxhighlight won't decode them on display. return frame:extensionTag( "syntaxhighlight", decode_entities(unstripNoWiki(text)), { lang = lang, line = line, start = start, highlight = highlight, inline = inline, class = args.class, style = args.style or inline and "white-space:pre-wrap;" or nil }) end return export nwb4osef670b9grczjn0ua50bnmbng5 অখাদ্য 0 306949 487780 2026-09-02T17:12:25Z अजीत कुमार तिवारी 4887 +असमिया से शब्द. 487780 wikitext text/x-wiki ==असमिया== ===विशेषण=== {{as-adj}} # [[अखाद्य]] # [[अभक्ष्य]] === प्रकाशित कोशों से अर्थ === ==== हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश ==== न खाने योग्य, अभक्ष्य। [[श्रेणी: हिन्दी-प्रकाशितकोशों से अर्थ-हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश]] tviwd95l4iiahpkbv8mgzs44o0vyreh অখিল 0 306950 487783 2026-09-02T17:14:18Z अजीत कुमार तिवारी 4887 +असमिया से शब्द. 487783 wikitext text/x-wiki ==असमिया== ===विशेषण=== {{as-adj}} # [[अखिल]] === प्रकाशित कोशों से अर्थ === ==== हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश ==== संपूर्ण, सारा। [[श्रेणी: हिन्दी-प्रकाशितकोशों से अर्थ-हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश]] 7myd3h3ew58qwgki68te7f1tgaeqksq साँचा:pagename 10 306951 487784 2026-09-02T17:14:43Z SM7 6218 अंग्रेजी विक्षनरी से आयातित 487784 wikitext text/x-wiki <includeonly>{{safesubst:<noinclude/>#invoke:pages/templates|pagename_t}}</includeonly><noinclude><!-- -->{{documentation}}</noinclude> 5eyxwd521bez42cgt9zhe8dipmghpbi অগম্য 0 306952 487786 2026-09-02T17:18:20Z अजीत कुमार तिवारी 4887 +असमिया से शब्द. 487786 wikitext text/x-wiki ==असमिया== ===विशेषण=== {{as-adj}} # [[अगम्य]] # [[अगम]] === प्रकाशित कोशों से अर्थ === ==== हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश ==== # पहुँच के बाहर, दुर्गम; # अप्राप्य; # अज्ञेय; # जिससे सहवास न किया जा सके। [[श्रेणी: हिन्दी-प्रकाशितकोशों से अर्थ-हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश]] fmaeramwkpyy602gjetmblo61ytgqll मॉड्यूल:pages/templates 828 306953 487790 2026-09-02T17:21:39Z SM7 6218 अंग्रेजी विक्षनरी से आयातित 487790 Scribunto text/plain -- Prevent substitution. if mw.isSubsting() then return require("Module:unsubst") end local export = {} local en_utilities_module = "Module:en-utilities" local headword_data_module = "Module:headword/data" local headword_page_module = "Module:headword/page" local languages_module = "Module:languages" local scripts_module = "Module:scripts" local links_module = "Module:links" local pages_module = "Module:pages" local parameters_module = "Module:parameters" --[==[ Implementation of {{tl|pagename}}. ]==] function export.pagename_t(frame) local args = require(parameters_module).process(frame:getParent().args, { ["title"] = true, }) local title = args.title if not title then return mw.loadData(headword_data_module).pagename end return require(headword_page_module).process_page(title, "no_fetch_content").pagename end --[==[ Implementation of {{tl|pagetype}}. ]==] function export.pagetype_t(frame) local args = require(parameters_module).process(frame:getParent().args, { ["article"] = {type = "boolean"}, ["pagename"] = {demo = true}, }) local pagename = args.pagename local pagetype = require(pages_module).get_pagetype( pagename == nil and mw.title.getCurrentTitle() or mw.title.new(pagename) or error(("%s is not a valid page name"):format(mw.dumpObject(pagename))) ) return args.article and ( pagetype:match("^user%f[%W]") and "a " .. pagetype or -- avoids "an user" require(en_utilities_module).add_indefinite_article(pagetype) ) or pagetype end --[==[ Implementation of {{tl|page is large}}. ]==] function export.page_is_large_t(frame) local args = require(parameters_module).process(frame:getParent().args, { [1] = true, }) local pagename = args[1] or mw.loadData(headword_data_module).pagename return require(headword_data_module).large_pages[pagename] and "true" or "" end --[==[ Implementation of {{tl|page exists}}. ]==] function export.page_exists_t(frame) local args = require(parameters_module).process(frame:getParent().args, { [1] = {required = true, template_default = "a"}, use_exists = {type = "boolean"}, }) -- Here, we convert logical to physical not directly by calling logicalToPhysical(), which will not handle -- non-mainspace pages correctly, but get_link_page(), which will do the same handling as full_link() does. -- This will strip italics, bold, HTML comments, strip markers and soft hyphens (FIXME: this may or may not -- be what we want), and normally will do diacritic stripping, but we turn this off by specifying Translingual -- with script None. Specifying Translingual also has the effect that mammoth pages return the base page rather -- than one of the splits. local mul = require(languages_module).getByCode("mul", true) local None = require(scripts_module).getByCode("None", true) local physical_page = require(links_module).get_link_page(args[1], mul, None) if not physical_page then -- weird cases like a triple-brace parameter in the pagename return "" end local title = mw.title.new(physical_page) return title and (args.use_exists and title.exists or title:getContent()) and "true" or "" end --[==[ Adapted from [[Module:ugly hacks]], which will be going away. Meant to be invoked directly. Returns the string {"valid"} if the page name in {{para|1}} is a valid pagename, otherwise a blank string. ]==] function export.is_valid_pagename(frame) local iargs = require(parameters_module).process(frame.args, { [1] = true, }) return require(pages_module).is_valid_page_name(iargs[1]) and "valid" or "" end --[==[ Alternative entry point for {{cd|is_valid_pagename}}. ]==] function export.is_valid_page_name(frame) return export.is_valid_pagename(frame) end return export 6d98vkd0tevo098gptnbvy7put65ui8 অঘোন 0 306954 487791 2026-09-02T17:25:00Z अजीत कुमार तिवारी 4887 +असमिया से शब्द. 487791 wikitext text/x-wiki ==असमिया== ===संज्ञा=== {{as-noun}} # [[अगहन]] # कार्तिक के बाद, वर्ष का नौवाँ महीना। === प्रकाशित कोशों से अर्थ === ==== हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश ==== कार्तिक और पोस [पौष] के बीच का महीना, मार्गशीर्ष, अग्रहायण। [[श्रेणी: हिन्दी-प्रकाशितकोशों से अर्थ-हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश]] omzd50dwa5eswmqxkwgapry54vxaez6 অদাহ্য 0 306955 487792 2026-09-02T17:27:46Z अजीत कुमार तिवारी 4887 +असमिया से शब्द. 487792 wikitext text/x-wiki ==असमिया== ===विशेषण=== {{as-adj}} # [[अग्निसह]] # [[अदाह्य]] === प्रकाशित कोशों से अर्थ === ==== हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश ==== जो अग्नि में पड़कर भी न जलता हो, आग के प्रभाव से रहित। [[श्रेणी: हिन्दी-प्रकाशितकोशों से अर्थ-हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश]] gtkssvexpgydiz5gkwib6zv6wrdrpzt श्रेणी:ग़लत क्रम वाली भाषा हेडिंग वाले पृष्ठ 14 306956 487799 2026-09-02T17:54:15Z SM7 6218 नई रखरखाव श्रेणी निर्मित 487799 wikitext text/x-wiki [[श्रेणी:विक्षनरी रखरखाव|हेड]] 3s3o5nuw7ujc2gijt5sylwksr67nnbr मॉड्यूल:category tree/entry maintenance 828 306957 487806 2026-09-02T19:09:04Z SM7 6218 अंग्रेजी विक्षनरी से आयातित 487806 Scribunto text/plain local labels = {} local raw_categories = {} local raw_handlers = {} local functions_module = "Module:fun" local languages_module = "Module:languages" local scripts_module = "Module:scripts" local string_pattern_escape_module = "Module:string/patternEscape" local string_replacement_escape_module = "Module:string/replacementEscape" local table_module = "Module:table" local extend = require(table_module).extend local is_callable = require(functions_module).is_callable local pattern_escape = require(string_pattern_escape_module) local replacement_escape = require(string_replacement_escape_module) local unpack = unpack or table.unpack -- Lua 5.2 compatibility ----------------------------------------------------------------------------- -- -- -- LABELS -- -- -- ----------------------------------------------------------------------------- labels["प्रविष्टि रखरखाव"] = { description = "{{{langname}}} entries, or entries in other languages containing {{{langname}}} terms, that are being tracked for attention and improvement by editors.", parents = {{name = "{{{langcat}}}", raw = true}}, umbrella_parents = "मूलभूत श्रेणी", } labels["entries with incorrect language header"] = { description = "{{{langname}}} entries that have been placed under the wrong language header.", additional = "This can happen for several reasons:\n" .. "* Typos.\n" .. "* Vandalism.\n" .. "* Using the wrong language code.\n" .. "* Using an alternative name for the language.\n" .. "* Using special characters which haven't been used in the name given in the language data modules.", parents = {"entry maintenance"}, can_be_empty = true, hidden = true, } labels["entries without References header"] = { description = "{{{langname}}} entries without a References header.", parents = {"entry maintenance"}, can_be_empty = true, hidden = true, } labels["entries without References or Further reading header"] = { description = "{{{langname}}} entries without a References or Further reading header.", parents = {"entry maintenance"}, can_be_empty = true, hidden = true, } labels["entries that don't exist"] = { description = "{{{langname}}} terms that do not meet the [[Wiktionary:Criteria for inclusion|criteria for inclusion]] (CFI). They are added to the category with the template {{tl|no entry|{{{langcode}}}}}.", parents = {"entry maintenance"}, umbrella_parents = "Fundamental", } labels["entries with etymology trees"] = { description = "{{{langname}}} entries that display an etymology tree generated by the template {{tl|etymon}}.", parents = {"entry maintenance"}, can_be_empty = true, hidden = true, } labels["entries with etymology texts"] = { description = "{{{langname}}} entries that display an etymology generated by the template {{tl|etymon}}.", parents = {"entry maintenance"}, can_be_empty = true, hidden = true, } labels["entries with etymon"] = { description = "{{{langname}}} entries that use the template {{tl|etymon}}.", parents = {"entry maintenance"}, can_be_empty = true, hidden = true, } labels["entries with etymology text stop language not in chain"] = { description = "{{{langname}}} entries where {{tl|etymon}} is used with {{para|text}} set to stop at a language but that language never appears in the rendered etymology chain.", parents = {"entry maintenance"}, can_be_empty = true, hidden = true, } labels["entries referencing missing etymons"] = { description = "Entries which use the {{tl|etymon}} template to reference an etymon that cannot be found, either because the target page does not exist (redlink) or because it has no {{tl|etymon}} template.", parents = {"entry maintenance"}, can_be_empty = true, hidden = true, } labels["entries referencing ambiguous etymons"] = { description = "Entries which use the {{tl|etymon}} template to reference an etymon without the ID, when the target page contains multiple {{tl|etymon}} templates, and an ID is therefore required to select the correct {{tl|etymon}}.", parents = {"entry maintenance"}, can_be_empty = true, hidden = true, } labels["entries referencing etymons with mismatched IDs"] = { description = "Entries which use the {{tl|etymon}} template with a mismatched ID. For example, {{code|lang:entry<id:mismatched ID>}}", parents = {"entry maintenance"}, can_be_empty = true, hidden = true, } labels["entries referencing pages with multiple etymons missing IDs"] = { description = "Entries which use the {{tl|etymon}} template to link to a page that has more than one {{tl|etymon}} template for the same language, where at least one of those templates has no {{para|id}}. When several {{tl|etymon}} templates share a language section, each must have a distinct {{para|id}} so that links and descendants logic can tell them apart.", parents = {"entry maintenance"}, can_be_empty = true, hidden = true, } labels["entries referencing pages with etymology sections missing etymons"] = { description = "Entries which use the {{tl|etymon}} template to link to a page that has more than one etymology section for the same language, where at least one section contains a {{tl|etymon}} template for that language and at least one other etymology section does not.", parents = {"entry maintenance"}, can_be_empty = true, hidden = true, } labels["entries referencing etymons without Descendants sections"] = { description = "Entries which use the {{tl|etymon}} template to reference an etymon whose source entry has no Descendants section.", parents = {"entry maintenance"}, can_be_empty = true, hidden = true, } labels["entries referencing etymons without this term in Descendants sections"] = { description = "Entries which use the {{tl|etymon}} template to reference an etymon whose source entry has a Descendants section, but does not list the current term there.", parents = {"entry maintenance"}, can_be_empty = true, hidden = true, } labels["entries with language name categories using raw markup"] = { description = "{{{langname}}} entries that have been placed in a language name category using raw wiki markup (i.e. {{code|[[<nowiki/>Category:{{{langname}}} ...]]}}). They should be added using {{tl|cln|{{{langcode}}}|...}} instead.", parents = {"entry maintenance"}, can_be_empty = true, hidden = true, } labels["entries with topic categories using raw markup"] = { description = "{{{langname}}} entries that have been placed in a topic category using raw wiki markup (i.e. {{code|[[<nowiki/>Category:{{{langcode}}}:...]]}}). They should be added using {{tl|C|{{{langcode}}}|...}} instead.", parents = {"entry maintenance"}, can_be_empty = true, hidden = true, } labels["entries with outdated source"] = { description = "{{{langname}}} entries that have been partly or fully imported from an outdated source.", parents = {"entry maintenance"}, } labels["entries with inflection not matching pagename"] = { description = "{{{langname}}} entries which have an inflection table whose lemma form does not match the page name.", additional = "This is usually the result of incorrect or missing parameters.", breadcrumb_and_first_sort_key = "inflection not matching pagename", parents = {"entry maintenance"}, hidden = true, can_be_empty = true, } labels["undefined derivations"] = { description = "{{{langname}}} etymologies using {{tl|undefined derivation}}, where a more specific template such as {{tl|borrowed}} or {{tl|inherited}} should be used instead.", parents = {"entry maintenance"}, can_be_empty = true, hidden = true, } labels["descendants to be fixed in desctree"] = { description = "Entries that use {{tl|desctree}} to link to {{{langname}}} entries with no Descendants section.", parents = {"entry maintenance"}, can_be_empty = true, hidden = true, } labels["term requests"] = { description = "Entries with [[Template:der]], [[Template:inh]], [[Template:m]] and similar templates lacking the parameter for linking to {{{langname}}} terms.", parents = {"entry maintenance"}, can_be_empty = true, hidden = true, } labels["redlinks"] = { description = "Links to {{{langname}}} entries that have not been created yet.", parents = {"entry maintenance"}, catfix = false, can_be_empty = true, hidden = true, } labels["terms with IPA pronunciation"] = { description = "{{{langname}}} terms that include the pronunciation in the form of IPA.", additional = "For requests related to this category, see [[:Category:Requests for pronunciation in {{{langname}}} entries]].", parents = {"entry maintenance"}, } labels["terms with enPR pronunciation"] = { description = "{{{langname}}} terms that include the pronunciation in the form of enPR.", additional = "For requests related to this category, see [[:Category:Requests for pronunciation in {{{langname}}} entries]].", parents = {"entry maintenance"}, } labels["terms with Indic pronunciation"] = { description = "{{langname}} terms that include the pronunciation in the form of ISO 15919.", additional = "For requests related to this category, see [[:Category:Requests for pronunciation in {{{langname}}} entries]].", parents = {"entry maintenance"}, } labels["IPA pronunciations with invalid separators"] = { description = "{{{langname}}} terms with IPA using invalid separators such as /.ˈ/, /.ˌ/, a dot followed by primary or secondary stress; or /ˈ / or /ˌ /, primary or secondary stress followed by a space.", parents = {"entry maintenance"}, can_be_empty = true, hidden = true, } labels["terms with hyphenation"] = { description = "{{{langname}}} terms that include hyphenation.", parents = {"entry maintenance"}, } labels["terms with audio pronunciation"] = { description = "{{{langname}}} terms that include the pronunciation in the form of an audio file.", additional = "For requests related to this category, see [[:Category:Requests for audio pronunciation in {{{langname}}} entries]].", parents = {"entry maintenance"}, } labels["terms with nonstandard or incorrect audio pronunciations"] = { description = "{{{langname}}} terms which have been tagged as having pronunciations which are nonstandard or incorrect.", parents = {"terms with audio pronunciation"}, can_be_empty = true, hidden = true, } labels["entries missing Template:reconstructed"] = { description = "Reconstructed {{{langname}}} entries which do not have the {{tl|reconstructed}} template.", parents = {"entry maintenance"}, can_be_empty = true, hidden = true, } local function add_manual_param_category(label, desc, addl_intro, include_addl_continuation) labels[label] = { description = desc or "Pages containing {{{langname}}} " .. label .. ".", additional = addl_intro .. (not include_addl_continuation and "" or "\n\n" .. "Note that the pages in this category are not necessarily the same as the actual term in question. This " .. "frequently happens, for example, with English pages with translation sections, where the term that " .. "triggers the addition of the category is one of the translations."), parents = {"entry maintenance"}, -- Set catfix = false because the page will have a mixture of native-language and -- non-native-language pages, but include the normal native-language table of contents headers -- because most pages are in the native language. catfix = false, toc_template = "{{{langcode}}}-categoryTOC", toc_template_full = "{{{langcode}}}-categoryTOC/full", can_be_empty = true, hidden = true, } end add_manual_param_category("terms in nonstandard scripts", nil, "Pages are placed here if they contain terms written in a script that isn't in the language's " .. "list of scripts in the language data. This may mean the script should be added to the list, or that the wrong language code has been used.", true) add_manual_param_category("terms with non-redundant manual transliterations", nil, "Pages are placed here if they contain terms whose transliteration has been specified manually using " .. "{{para|tr}} or a similar parameter and is different from the transliteration which is automatically generated.", true) add_manual_param_category("terms with redundant transliterations", nil, "Pages are placed here if they contain terms whose transliteration has been specified manually using " .. "{{para|tr}} or a similar parameter and is the same as the transliteration which is automatically generated.", true) add_manual_param_category("terms with non-redundant manual script codes", nil, "Pages are placed here if they contain terms whose script code has been specified manually using " .. "{{para|sc}} or a similar parameter and is different from the script code which is automatically generated.", true) add_manual_param_category("terms with redundant script codes", nil, "Pages are placed here if they contain terms whose script code has been specified manually using " .. "{{para|sc}} or a similar parameter and is the same as the script code which is automatically generated.", true) add_manual_param_category("terms with non-redundant non-automated sortkeys", "{{{langname}}} terms with non-redundant non-automated sortkeys.", "Terms are placed here if they have been sorted using a sortkey other than the one which is automatically " .. "generated. This can happen for two reasons:\n# A different sortkey has been specified using the {{para|sort}} " .. "parameter.\n# One or more categories have been added using raw wikitext, which means the page's default " .. "sortkey is used for that category. If that default sortkey is different from the automatic sortkey, then the " .. "page will also be added here.") add_manual_param_category("terms with redundant sortkeys", "{{{langname}}} terms with redundant sortkeys.", "Terms are placed here if their sortkey has been specified using the {{para|sort}} parameter, and it the same " .. "as the one which is automatically generated.") add_manual_param_category("links with redundant target parameters", "Pages containing {{{langname}}} links where the alt text could replace the link target, instead of being given " .. "separately.", "This occurs when the only difference between the link target and the alt text is that the alt text contains " .. "diacritics (or other characters) which would have been ignored anyway had they been included in the link " .. "target. For example, {{tl|l|la|amo|amō}} ({{l|la|amo|amō}}) is exactly the same as {{tl|l|la|amō}} " .. "({{l|la|amō}}), because macrons are automatically stripped from Latin link targets, even though they're still " .. "displayed.") add_manual_param_category("links with ignored alt parameters", "Pages containing {{{langname}}} links where the {{para|alt}} parameter has been ignored.", "This occurs when the main linked text includes a wikilink.") add_manual_param_category("links with redundant alt parameters", "Pages containing {{{langname}}} links where the {{para|alt}} parameter is redundant.", "This occurs when the alt text makes no difference to the output. For example, {{tl|l|en|foo|foo}} " .. "({{l|en|foo|foo}}) is exactly the same as {{tl|l|en|foo}} ({{l|en|foo}}).") add_manual_param_category("links with ignored id parameters", "Pages containing {{{langname}}} links where the {{para|id}} parameter has been ignored.", "This occurs when the main linked text includes a wikilink.") add_manual_param_category("links with redundant wikilinks", "Pages containing {{{langname}}} links which contain a redundant wikilink.", "This occurs if link target consists of a single wikilink, which should instead be entered in the " .. "conventional manner without link brackets. For example, {{tl|l|en|<nowiki>[[foo]]</nowiki>}} " .. "is the same as {{tl|l|en|foo}}, and {{tl|l|en|<nowiki>[[foo|bar]]</nowiki>}} is the same as " .. "{{tl|l|en|foo|bar}}.\n\nThis also occurs when link templates are nested inside each other " .. "unnecessarily: e.g. {{tl|l|en|{{tl|l|en|foo}}}}") add_manual_param_category("links with manual fragments", "Pages containing {{{langname}}} links where a manual link fragment has been given.", "This occurs when the link fragment has been specified using {{code|#}} after the term, " .. "which overrides the normal fragment generated by link templates that points to the relevant " .. "language section.\n\nLink fragments are used to point to a specific section on a target page, and " .. "it is preferable to use the {{para|id}} parameter to do this, since it is less likely to break if " .. "additional content is added to the target page: for example, the fragment {{code|#Adjective}} " .. "will start pointing to the wrong section if another language with an adjective section is added above " .. "the intended language.") labels["descendant hubs"] = { description = "{{{langname}}} terms that do not mean more than the sum of their parts but exist for listing two or more inclusion-worthy descendants.", parents = {"entry maintenance"}, } labels["terms needing to be assigned to a sense"] = { description = "{{{langname}}} entries that have terms under headers such as \"Synonyms\" or \"Antonyms\" not assigned to a specific sense of the entry in which they appear. Use [[Template:syn]] or [[Template:ant]] to fix these.", parents = {"entry maintenance"}, can_be_empty = true, hidden = true, } --[=[ labels["terms with inflection tables"] = { description = "{{{langname}}} entries that contain inflection tables.". additional = "For requests related to this category," see [[:Category:Requests for inflections in {{{langname}}} entries]].", parents = {"entry maintenance"}, } ]=] labels["terms with collocations"] = { description = "{{{langname}}} entries that contain [[collocation]]s that were added using templates such as {{tl|co}}.", additional = "For requests related to this category, see [[:Category:Requests for collocations in {{{langname}}}]]. See also [[:Category:Requests for quotations in {{{langname}}}]] and [[:Category:Requests for example sentences in {{{langname}}}]].", parents = {"entry maintenance"}, umbrella_parents = "Collocation maintenance", } labels["terms with usage examples"] = { description = "{{{langname}}} entries that contain usage examples that were added using templates such as {{tl|ux}}.", additional = "For requests related to this category, see [[:Category:Requests for example sentences in {{{langname}}}]]. See also [[:Category:Requests for collocations in {{{langname}}}]] and [[:Category:Requests for quotations in {{{langname}}}]].", parents = {"entry maintenance"}, umbrella_parents = "Usage example maintenance", } labels["terms with quotations"] = { description = "{{{langname}}} entries that contain quotes that were added using templates such as {{tl|quote}}, {{tl|quote-book}}, {{tl|quote-journal}}, etc.", additional = "For requests related to this category, see [[:Category:Requests for quotations in {{{langname}}}]]. See also [[:Category:Requests for example sentences in {{{langname}}}]].", parents = {"entry maintenance"}, umbrella_parents = "Quotation maintenance", } labels["terms with interlinear glossed text"] = { description = "{{{langname}}} entries that contain interlinear glossed text added using {{tl|interlinear}}.", parents = {"entry maintenance"}, } labels["terms with redundant head parameter"] = { description = "{{{langname}}} terms that contain a redundant head= parameter in their headword (called using {{tl|head}} or a language-specific equivalent).", additional = "Individual languages can prevent terms from being added to this category by setting `data.no_redundant_head_cat`.", parents = {"entry maintenance"}, can_be_empty = true, hidden = true, } labels["terms with red links in their headword lines"] = { description = "{{{langname}}} terms that contain red links (i.e. uncreated forms) in their headword lines.", parents = {"redlinks"}, can_be_empty = true, hidden = true, } labels["terms with red links in their inflection tables"] = { description = "{{{langname}}} terms that contain red links (i.e. uncreated forms) in their inflection tables.", parents = {"redlinks"}, can_be_empty = true, hidden = true, } labels["requests for English equivalent term"] = { description = "{{{langname}}} entries with definitions that have been tagged with {{tl|rfeq}}. Read the documentation of the template for more information.", parents = {"entry maintenance"}, can_be_empty = true, hidden = true, } for _, quot_type in ipairs { "quotations", "usage examples" } do local umbrella_parent = quot_type == "quotations" and "Quotation maintenance" or "Usage example maintenance" labels[quot_type .. " with omitted translation"] = { description = "{{{langname}}} " .. quot_type .. " where a translation would normally be required but the translation has explicitly been omitted by specifying {{code|-}}. The translation should be supplied instead.", parents = {"entry maintenance"}, umbrella = { parents = {name = umbrella_parent, sort = "omitted translation"}, breadcrumb = "with omitted translation", }, can_be_empty = true, hidden = true, } end for _, pos in ipairs({"nouns", "proper nouns", "verbs", "adjectives", "adverbs", "participles", "determiners", "pronouns", "numerals", "suffixes", "contractions"}) do labels[pos .. " with red links in their headword lines"] = { description = "{{{langname}}} " .. pos .. " that contain red links (i.e. uncreated forms) in their headword lines.", parents = {"terms with red links in their headword lines"}, breadcrumb = pos, can_be_empty = true, hidden = true, } labels[pos .. " with red links in their inflection tables"] = { description = "{{{langname}}} " .. pos .. " that contain red links (i.e. uncreated forms) in their inflection tables.", parents = {"terms with red links in their inflection tables"}, breadcrumb = pos, can_be_empty = true, hidden = true, } end for _, pos in ipairs { "nouns", "proper nouns", "pronouns" } do local label = pos .. " with unknown or uncertain plurals" labels[label] = { description = "{{{langname}}} " .. label .. ".", additional = "Terms are usually added to this category by specifying {{code|?}} as the plural. As much " .. "is possible, a plural should be added or, if the noun is uncountable, indicated appropriately (usually " .. "using {{code|-}} in place of the plural). Some languages support the value {{code|!}} to indicate " .. "that a plural cannot be attested but the noun is theoretically countable.", breadcrumb = "with unknown or uncertain plurals", parents = { {name = pos, sort = "unknown or uncertain plurals"}, "entry maintenance", }, } end -- Add 'umbrella_parents' key if not already present. for _, data in pairs(labels) do if data.umbrella == nil and data.umbrella_parents == nil then data.umbrella_parents = "Entry maintenance subcategories by language" end end ----------------------------------------------------------------------------- -- -- -- RAW CATEGORIES -- -- -- ----------------------------------------------------------------------------- raw_categories["Entry maintenance subcategories by language"] = { description = "Umbrella categories covering topics related to entry maintenance.", additional = "{{{umbrella_meta_msg}}}", parents = { "Umbrella metacategories", {name = "entry maintenance", is_label = true, sort = " "}, }, } raw_categories["Citation maintenance"] = { description = "Categories for maintaining citations specified using {{tl|cite-*}}.", parents = {"Wiktionary maintenance"}, breadcrumb = "citations", } raw_categories["Collocation maintenance"] = { description = "Categories for maintaining collocations specified using {{tl|co}}, {{tl|coi}} or {{tl|coa}}.", parents = {"Wiktionary maintenance"}, breadcrumb = "collocations", } raw_categories["Quotation maintenance"] = { description = "Categories for maintaining quotations specified using {{tl|quote-*}}.", parents = {"Wiktionary maintenance"}, breadcrumb = "quotations", } raw_categories["Usage example maintenance"] = { description = "Categories for maintaining usage examples specified using {{tl|ux}}, {{tl|uxi}} or {{tl|uxa}}.", parents = {"Wiktionary maintenance"}, breadcrumb = "usage examples", } raw_categories["Citations using nocat parameter"] = { description = "Instances of {{tl|cite-*}} templates using the {{para|nocat}} parameter, which should be eliminated (?).", parents = {{name = "Citation maintenance", sort = "nocat"}}, breadcrumb = "using nocat parameter", can_be_empty = true, hidden = true, } raw_categories["Quotation templates to be cleaned"] = { description = "Instances of quotations using {{tl|quote-text}}.", additional = "They should be converted to other '''[[:Category:Citation templates|quotation templates]]''' if relevant.", parents = {"Quotation maintenance"}, breadcrumb_base = "to be cleaned", can_be_empty = true, hidden = true, } raw_categories["Quotations using nocat parameter"] = { description = "Instances of {{tl|quote-*}} templates using the {{para|nocat}} parameter, which should be eliminated (?).", parents = {{name = "Quotation maintenance", sort = "nocat"}}, breadcrumb = "using nocat parameter", can_be_empty = true, hidden = true, } raw_categories["Quotations using quoted-in parameter"] = { description = "Instances of {{tl|quote-*}} templates using the {{para|quoted_in}} parameter.", additional = "It is recommended to restructure these template calls using the {{para|newversion}} parameter along with associated parameters {{para|2ndauthor}}, {{para|title2}}, {{para|year2}}, {{para|publisher2}} and the like, as described in the documentation for {{tl|quote-book}}.", parents = {{name = "Quotation maintenance", sort = "quoted-in"}}, breadcrumb = "using quoted-in parameter", can_be_empty = true, hidden = true, } raw_categories["Requests"] = { topright = "{{shortcut|WT:CR|WT:RQ}}", description = "A parent category for the various request categories.", parents = {"Category:Wiktionary"}, } raw_categories["Requests by language"] = { description = "Categories with requests in various specific languages.", additional = "{{{umbrella_msg}}}", parents = { {name = "Request subcategories by language", sort = " "}, {name = "Requests", sort = " "}, }, breadcrumb = "By language", } raw_categories["Request subcategories by language"] = { description = "Umbrella categories covering topics related to requests.", additional = "{{{umbrella_meta_msg}}}", parents = { "Umbrella metacategories", {name = "Requests", sort = " "}, }, } raw_categories["Requests for quotations by source"] = { description = "Categories with requests for quotation, broken out by the source of the quotation.", additional = "Some abbreviated names of sources are explained at [[Wiktionary:Abbreviated Authorities in Webster]].", parents = {{name = "Requests for quotations", sort = "source"}}, breadcrumb = "By source", } raw_categories["Requests for quotations"] = { -- FIXME description = "Words are added to this category by the inclusion in their entries of {{tl|rfv-quote}}.", parents = {{name = "Requests", sort = "quotations"}, "Quotation maintenance"}, breadcrumb = "Quotations", } raw_categories["Requests for date"] = { description = "Requests for a date to be added to a quotation.", additional = "To add an article to this category, use {{tl|rfdate}} or {{tl|rfdatek}} to include the author. " .. "Please remove the template from the article once the date has been provided.", parents = {{name = "Requests", sort = "date"}, "Quotation maintenance"}, breadcrumb = "Date", } raw_categories["Requests for translations in user-competency categories by number of users"] = { description = "Requests for translations to be added to user-competency categories, sorted by number of users with that competency.", parents = {{name = "Requests", sort = "translations in user-competency categories by number of users"}}, breadcrumb = "Translations in user-competency categories by number of users", } raw_categories["Requests for translations in user-competency categories by language"] = { description = "Requests for translations to be added to user-competency categories, sorted by language.", parents = {{name = "Requests", sort = "translations in user-competency categories by language"}}, breadcrumb = "Translations in user-competency categories by language", hidden = true, } raw_categories["Terms with translations by language"] = { description = "Terms with translations, sorted by language.", parents = {{name = "Entry maintenance subcategories by language", sort = "translations by language"}}, breadcrumb = "Translations", } raw_categories["Entries using missing taxonomic names"] = { description = "Entries that link to wikispecies because there is no corresponding Wiktionary entry for the taxonomic name in the template {{tl|taxlink}}.", additional = "The missing name is one or more of those enclosed in {{tl|taxlink}}. The entries are sorted by the missing taxonomic name." .. "\n\nSee [[:Category:mul:Taxonomic names]].", parents = {{name = "entry maintenance", is_label = true, lang = "mul", sort = "missing taxonomic names"}}, breadcrumb = "Missing taxonomic names", hidden = true, } ----------------------------------------------------------------------------- -- -- -- RAW HANDLERS -- -- -- ----------------------------------------------------------------------------- local function script_name_to_code(name) local sc = require(scripts_module).getByCanonicalName(name) if not sc then error("Unrecognized script name '" .. name .. "'") end return sc:getCode() end --[=[ This array consists of category match specs. Each spec contains one or more properties, whose values are (a) strings that may contain references to other properties using the {{{PROPERTY}}} syntax; (b) functions of one argument, an `items` table of the same properties that are accessible using the {{{PROPERTY}} syntax. Each such spec should have at least a `regex` property that matches the name of the category. Capturing groups in this regex can be referenced in other properties using {{{1}}} for the first group, {{{2}}} for the second group, etc. (or using keys "1", "2", etc. in functions). Property expansion happens recursively if needed (i.e. a property can reference another property, which in turn references a third property). If there is a `language_name` propery, it specifies the language name (and will typically be a reference to a capturing group from the `regex` property); if not specified, it defaults to "{{{1}}}" unless the `nolang` property is set, in which case there is no language name associated with the category name. The language name must be the canonical name of a recognized full language, or an error is thrown; however, if the `allow_etym_lang` property is set, the language name may also be the canonical name of an etymology-only language. Based on the language name, the `language_code` and `language_object` properties are automatically filled in. If `language_name` is an etymology-only language, additional properties `parent_language_name`, `parent_language_code` and `parent_language_object` are set for the parent full language of the etymology-only language. If the `regex` values of multiple category specs match, the first one takes precedence. Recognized or predefined properties: `pagename`: Current pagename. `regex`: See above. `1`, `2`, `3`, ...: See above. `language_name`, `language_code`, `language_object`: See above. `parent_language_name`, `parent_language_code`, `parent_language_object`: See above. `nolang`: See above. `allow_etym_lang`: Language names may be etymology-only languages. See above. `description`: Override the description (normally taken directly from the pagename). `template_name`: Name of template which generates this category. `template_sample_call`: Syntax for calling the template. Defaults to "{{{template_name}}}|{{{language_code}}}". Used to display an example template call and the output of this call. `template_actual_sample_call`: Syntax for calling the template. Takes precedence over `template_sample_call` when generating example template output (but not when displaying an example template call) and is intended for a template call that uses the |nocat=1 parameter. `template_example_output`: Override the text that displays example template output (see `template_sample_call`). `additional_template_description`: Extra text to be displayed after the example template output. `parents`: Parent categories. Should be a list of elements, each of which is an object containing at least a name= and sort= field (same format as parents= for regular raw categories, except that the name= and sort= field will have {{{PROPERTY}}} references expanded). If no parents are specified, and the pagename is of the form "Requests for FOO by language", the parents will be "Request subcategories by language" with FOO as the sort key, along with any parents specified in `additional_umbrella_parents`. Otherwise, the `language_name` property must exist, and the parent will be "Requests concerning LANGNAME", with the pagename minus any initial "Requests for " as the sort key. Note that this does *NOT* apply if an etymology-only language is associated with the category, in which case `etym_parents` is used instead. `etym_parents`: Parent categories for categories with associated etymology-only languages. The format is the same as `parents`. If omitted, there are two parents by default: (1) The pagename (i.e. category name) with the language name replaced by the corresponding parent language name, with the value of `language_name` as the sort key; (2) "Requests concerning LANGNAME", with the pagename minus any initial "Requests for " as the sort key. `umbrella`: Parent all-language category. Sort key is based on the language name. This applies *ONLY* if a full language is associated with the category name (i.e. not if `nolang` is set or if `allow_etym_lang` is set and the associated language is an etymology-only language); otherwise there will be no umbrella category. `additional_umbrella_parents`: Additional parents to add to the umbrella (all-language) category along with "Request subcategories by language". `breadcrumb`: Specify the breadcrumb. If `parents` is given, there is no default (i.e. it will end up being the pagename). Otherwise, if the pagename is of the form "Requests for FOO by language", the default breadcrumb will be "FOO". Otherwise it is computed by removing the language name from the pagename and chopping out "Requests for" from the beginning and "in entries" and "for terms" from the end. Note that this does *NOT* apply if an etymology-only language is associated with the category, in which case `etym_breadcrumb` is used instead. `etym_breadcrumb`: Specify the breadcrumb for categories with associated etymology-only languages. Defaults to the value of `language_name`. `not_hidden_category`: Don't hide the category. `catfix`: Same as `catfix` in regular labels and raw categories, except that request-specific {{{PROPERTY}}} syntax is expanded. `toc_template`, `toc_template_full`: Same as the corresponding fields in regular labels and raw categories, except that request-specific {{{PROPERTY}}} syntax is expanded. In general, properties can contain references to templates (e.g. {{tl}} and {{para}}), which will be appropriately expanded (this expansion happens in the poscatboiler code, not in this module). The major exception is in the `template_sample_call` and `template_actual_sample_call` properties, which are surrounded by <pre>...</pre> when inserted, so template references are not expanded. Triple-brace property references are still expanded in these properties; but beware that if any of those property references contain template references, they won't be expanded. (This actually happens in the handlers for 'Request for SCRIPT script for LANG terms'; the sample call references {{{script_code}}}, whose definition therefore cannot contain template references. The solution is to define this property using a function.) ]=] local requests_categories = { { regex = "^Requests concerning (.+)$", allow_etym_lang = true, description = "Categories with {{{1}}} entries that need the attention of experienced editors.", parents = {{name = "entry maintenance", is_label = true, sort = "requests"}}, etym_parents = {{name = "Requests concerning {{{parent_language_name}}}", sort = "{{{1}}}"}, {name = "{{{1}}}", sort = "Requests"}}, umbrella = "Requests by language", breadcrumb = "Requests", not_hidden_category = true, }, { regex = "^Requests for etymologies in (.+) entries$", allow_etym_lang = true, umbrella = "Requests for etymologies by language", template_name = "rfe", }, { regex = "^Requests for expansion of etymologies in (.+) entries$", umbrella = "Requests for expansion of etymologies by language", template_name = "etystub", }, { regex = "^Requests for pronunciation in (.+) entries$", umbrella = "Requests for pronunciation by language", template_name = "rfp", }, { regex = "^Requests for audio pronunciation in (.+) entries$", umbrella = "Requests for audio pronunciation by language", template_name = "rfap", }, { regex = "^Requests for definitions in (.+) entries$", umbrella = "Requests for definitions by language", template_name = "rfdef", }, { regex = "^Requests for clarification of definitions in (.+) entries$", umbrella = "Requests for clarification of definitions by language", template_name = "rfclarify", }, } for _, spec_with_pos in ipairs { {"inflections", "rfinfl"}, {"plural forms"}, {"tone", "rftone"}, {"accents"}, {"aspect", "rfaspect"}, {"animacy"}, {"gender", "rfgender"}, {"noun class"}, } do local property, rftemplate = unpack(spec_with_pos) table.insert(requests_categories, { -- This is for part-of-speech-specific categories such as -- "Requests for inflections in Northern Ndebele noun entries" or -- "Requests for accents in Ukrainian proper noun entries". -- Here and below, we assume that the part of speech is begins with -- a lowercase letter, while the preceding language name ends in a -- capitalized word. Note that this entry comes before the -- following one and takes precedence over it. regex = ("^Requests for %s in (.-) ([a-z]+[a-z ]*) entries$"):format(property), parents = {{name = ("Requests for %s in {{{language_name}}} entries"):format(property), sort = "{{{2}}}"}}, umbrella = ("Requests for %s of {{pluralize|{{{2}}}}} by language"):format(property), breadcrumb = "{{{2}}}", template_name = rftemplate, template_sample_call = rftemplate and ("{{%s|{{{language_code}}}|{{{2}}}}}"):format(rftemplate) or nil, } ) table.insert(requests_categories, { regex = ("^Requests for %s in (.+) entries$"):format(property), umbrella = ("Requests for %s by language"):format(property), template_name = rftemplate, } ) table.insert(requests_categories, { regex = ("^Requests for %s of (.+) by language$"):format(property), nolang = true, } ) end extend(requests_categories, { { regex = "^Requests for example sentences in (.+)$", umbrella = "Requests for example sentences by language", template_name = "rfex", }, { regex = "^Requests for quotations in (.+)$", umbrella = "Requests for quotations by language", additional_umbrella_parents = {"Quotation maintenance"}, template_name = "rfquote", }, { regex = "^Requests for translations into (.+)$", allow_etym_lang = true, umbrella = "Requests for translations by language", template_name = "t-needed", catfix = "en", }, { regex = "^Requests for translations of (.+) usage examples$", allow_etym_lang = true, umbrella = "Requests for translations of usage examples by language", additional_umbrella_parents = {"Usage example maintenance"}, template_name = "t-needed", template_sample_call = "{{t-needed|{{{language_code}}}|usex}}", template_actual_sample_call = "{{t-needed|{{{language_code}}}|usex|nocat=1}}", additional_template_description = "The {{tl|ux}}, {{tl|uxi}}, {{tl|ja-usex}} and {{tl|zh-x}} templates automatically add the page to this category if the example is in a foreign language and the translation is missing." }, { regex = "^Requests for translations of (.+) quotations$", allow_etym_lang = true, umbrella = "Requests for translations of quotations by language", additional_umbrella_parents = {"Quotation maintenance"}, template_name = "t-needed", template_sample_call = "{{t-needed|{{{language_code}}}|quote}}", template_actual_sample_call = "{{t-needed|{{{language_code}}}|quote|nocat=1}}", additional_template_description = "The {{tl|quote}}, and {{tl|Q}} templates automatically add the page to this category if the example is in a foreign language and the translation is missing." }, { regex = "^Requests for review of (.+) translations$", allow_etym_lang = true, umbrella = "Requests for review of translations by language", template_name = "t-check", template_sample_call = "{{t-check|{{{language_code}}}|example}}", template_example_output = "", catfix = "en", }, { regex = "^Requests for transliteration of (.+) terms$", umbrella = "Requests for transliteration by language", template_name = "rftranslit", additional_template_description = "The {{tl|head}} template, and the large number of language-specific variants of it, automatically add " .. "the page to this category if the example is in a foreign language and no transliteration can be generated (particularly in languages without " .. "automated transliteration, such as Hebrew and Persian).", }, { regex = "^Requests for transliteration of (.+) usage examples$", umbrella = "Requests for transliteration of usage examples by language", additional_umbrella_parents = {"Usage example maintenance"}, template_name = "rftranslit", template_sample_call = "{{rftranslit|{{{language_code}}}}}", template_actual_sample_call = "{{rftranslit|{{{language_code}}}|nocat=1}}", catfix = false, additional_template_description = "The {{tl|ux}} and {{tl|uxi}} templates automatically add the page to this category if the example " .. "is in a foreign language and no transliteration can be generated (particularly in languages without automated transliteration, such as " .. "Hebrew and Persian).", }, { regex = "^Requests for transliteration of (.+) quotations$", umbrella = "Requests for transliteration of quotations by language", additional_umbrella_parents = {"Quotation maintenance"}, catfix = false, additional_template_description = "The {{tl|quote}} and {{code|<nowiki>{{quote-*}}</nowiki>}} templates automatically add the page to this category if the quotation " .. "is in a foreign language and no transliteration can be generated (particularly in languages without automated transliteration, such as " .. "Hebrew and Persian).", }, { regex = "^Requests for native script for (.+) terms$", allow_etym_lang = true, etym_parents = { {name = "Requests for native script for {{{parent_language_name}}} terms", sort = "{{{1}}}"}, {name = "Requests concerning {{{language_name}}}", sort = "native script"}, }, umbrella = "Requests for native script by language", template_name = "rfscript", template_actual_sample_call = "{{rfscript|{{{language_code}}}|nocat=1}}", catfix = false, additional_template_description = "Many templates such as {{tl|l}}, {{tl|m}} and {{tl|t}} automatically place the page in this category when they are missing the term but have been provided with a transliteration." }, { regex = "^Requests for native script in (.+) usage examples$", umbrella = "Requests for native script in usage examples by language", additional_umbrella_parents = {"Usage example maintenance"}, template_name = "rfscript", template_sample_call = "{{rfscript|{{{language_code}}}|usex=1}}", template_actual_sample_call = "{{rfscript|{{{language_code}}}|usex=1|nocat=1}}", catfix = false, additional_template_description = "The {{tl|ux}} and {{tl|uxi}} templates automatically add the page to this category if the example itself is missing but the translation is supplied." }, { regex = "^Requests for native script in (.+) quotations$", umbrella = "Requests for native script in quotations by language", additional_umbrella_parents = {"Quotation maintenance"}, template_name = "rfscript", template_sample_call = "{{rfscript|{{{language_code}}}|quote=1}}", template_actual_sample_call = "{{rfscript|{{{language_code}}}|quote=1|nocat=1}}", catfix = false, additional_template_description = "The {{tl|quote}} and {{code|<nowiki>{{quote-*}}</nowiki>}} templates automatically add the page to this category if the quotation itself is missing but the translation is supplied." }, { regex = "^Requests for (.+) script for (.+) terms$", language_name = "{{{2}}}", allow_etym_lang = true, parents = {{name = "Requests for native script for {{{language_name}}} terms", sort = "{{{1}}}"}}, etym_parents = { {name = "Requests for native script for {{{language_name}}} terms", sort = "{{{1}}}"}, {name = "Requests for {{{1}}} script for {{{parent_language_name}}} terms", sort = "{{{language_name}}}"}, {name = "Requests concerning {{{language_name}}}", sort = "{{{1}}} script"}, }, umbrella = "Requests for {{{1}}} script by language", breadcrumb = "{{{1}}}", etym_breadcrumb = "{{{1}}}", template_name = "rfscript", -- NOTE: The following is used in `template_sample_call` and `template_actual_sample_call`, meaning the -- conversion of script name to script code needs to be done using an inline function like this, instead of -- a {{#invoke:...}} template call. script_code = function(items) return script_name_to_code(items["1"]) end, template_sample_call = "{{rfscript|{{{language_code}}}|sc={{{script_code}}}}}", template_actual_sample_call = "{{rfscript|{{{language_code}}}|sc={{{script_code}}}|nocat=1}}", catfix = false, additional_template_description = "Many templates such as {{tl|l}}, {{tl|m}} and {{tl|t}} automatically place the page in this category when they are missing the term but have been provided with a transliteration." }, { regex = "^Requests for (.+) script by language$", parents = {{name = "Requests for script by language", sort = "{{{1}}}"}}, breadcrumb = "{{{1}}}", nolang = true, }, { regex = "^Requests for script by language$", nolang = true, }, { regex = "^Requests for images in (.+) entries$", umbrella = "Requests for images by language", template_name = "rfi", }, { regex = "^Requests for references for (.+) terms$", umbrella = "Requests for references by language", template_name = "rfref", }, { regex = "^Requests for references for etymologies in (.+) entries$", parents = {{name = "Requests for references for {{{language_name}}} terms", sort = "etymologies"}}, umbrella = "Requests for references for etymologies by language", breadcrumb = "Etymologies", template_name = "rfv-etym", }, { regex = "^Requests for references for pronunciations in (.+) entries$", parents = {{name = "Requests for references for {{{language_name}}} terms", sort = "pronunciations"}}, umbrella = "Requests for references for pronunciations by language", breadcrumb = "Pronunciations", template_name = "rfv-pron", }, { regex = "^Requests for attention concerning (.+)$", umbrella = "Requests for attention by language", breadcrumb = "Attention", template_name = "attention", template_sample_call = "{{attention|{{{language_code}}}|insert a brief description of the request here}}", template_example_output = "This template does not generate any text in entries, but can be visualised by enabling the Catch My Attention gadget. See {{section link|Template:attention#Visibility}}.", -- These pages typically contain a mixture of English and native-language entries, so disable catfix. catfix = false, -- Setting catfix = false will normally trigger the English table of contents template. -- We still want the native-language table of contents template, though. toc_template = "{{{language_code}}}-categoryTOC", toc_template_full = "{{{language_code}}}-categoryTOC/full", }, { regex = "^Requests for cleanup in (.+) entries$", umbrella = "Requests for cleanup by language", template_name = "rfc", template_actual_sample_call = "{{rfc|{{{language_code}}}|nocat=1}}", }, { regex = "^Requests for cleanup of Pronunciation N headers in (.+) entries$", umbrella = "Requests for cleanup of Pronunciation N headers by language", template_name = "rfc-pron-n", template_actual_sample_call = "{{rfc-pron-n|{{{language_code}}}|nocat=1}}", template_example_output = "This template does not generate any text in entries.", additional_template_description = [=[ The purpose of this category is to tag entries that use headers with "Pronunciation" and a number. While these headers and structure are sometimes used, they are not specifically prescribed by [[WT:ELE]]. No complete proposal has yet been made on how they should work, what the semantics are, or how they interact with multiple etymologies. As a result they should generally be avoided. Instead, merge the entries (possibly under multiple Etymology sections, if appropriate), and list all pronunciations, appropriately tagged, under a Pronunciation header. [[User:KassadBot|KassadBot]] tags these entries (or used to tag these entries, when the bot was operational). At some point if a proposal is made and adopted as policy, these entries should be reviewed. This category is hidden.]=], }, { regex = "^Requests for deletion in (.+) entries$", umbrella = "Requests for deletion by language", template_name = "rfd", template_actual_sample_call = "{{rfd|{{{language_code}}}|nocat=1}}", }, { regex = "^Requests for verification in (.+) entries$", umbrella = "Requests for verification by language", template_name = "rfv", }, { regex = "^Requests for attention in (.+) etymologies$", umbrella = "Requests for attention by language" }, { regex = "^Requests for quotations/(.+)$", description = "Requests for a quotation or for quotations from {{{1}}}.", parents = {{name = "Requests for quotations by source", sort = "{{{1}}}"}}, breadcrumb = "{{{1}}}", nolang = true, template_name = "rfquotek", template_sample_call = "{{rfquotek|LANGCODE|{{{1}}}}}", template_example_output = "\n(where LANGCODE is the language code of the entry)\n\nIt results in the message below:\n\n{{rfquotek|und|{{{1}}}}}", }, { regex = "^Requests for date in (.+) entries$", umbrella = "Requests for date by language", additional_umbrella_parents = {"Quotation maintenance"}, template_name = "rfdate", additional_template_description = "The quotation templates, such as {{tl|quote-book}} and {{tl|quote-journal}}, " .. "automatically add the page to this category if neither {{para|date}} nor {{para|year}} is provided. Providing the " .. "parameter in each case on the page automatically removes the article from this category. See " .. "[[Wiktionary:Quotations]] for information about formatting dates and quotations.", }, { regex = "^Requests for date/(.+)$", description = "{{rfd|section=Category:Requests for date by source}}Requests for a date for a quotation or quotations from {{{1}}}.", parents = {{name = "Requests for date by source", sort = "{{{1}}}"}}, breadcrumb = "{{{1}}}", nolang = true, template_name = "rfdatek", template_sample_call = "{{rfdatek|LANGCODE|{{{1}}}}}", template_example_output = "\n(where LANGCODE is the language code of the entry)\n\nIt results in the message below:\n\n{{rfdatek|und|{{{1}}}}}", }, { regex = "^Requests for attestation of (.+) terms$", umbrella = "Requests for attestation of terms by language", breadcrumb = "Attestation", additional_template_description = "The {{tl|LDL}} template adds this category when a language code is supplied in {{para|1}} (as it should be)." }, }) local user_competency_additional_template_description = "This is added by user-competency categories such as " .. "[[:Category:User fr-4]], which groups users who speak French at level 4 (near-native proficiency), when " .. "the native-language text indicating this fact is missing. The appropriate translation should mirror the " .. "English text also displayed (e.g. in this case \"These users speak French at a '''near native''' " .. "level.\"), and should be supplied to {{tl|auto cat}} using the {{para|text}} parameter. The mention of the " .. "language in the text should be surrounded by double angle brackets, e.g. \"&lt;&lt;français>>\", which " .. "causes it to be automatically linked to the appropriate parent category." local user_competency_parents = {{name = "Requests for translations in user-competency categories by number of users", sort = function(items) return " " .. ("%010d"):format(items["1"]) end, }} extend(requests_categories, { { regex = "^Requests for translations in user%-competency categories with ([0-9]+)%-([0-9]+) users$", description = "Requests for translation of phrases indicating user competencies for specific languages and specific competency levels, for categories with {{{1}}}-{{{2}}} users.", additional_template_description = user_competency_additional_template_description, parents = user_competency_parents, breadcrumb = "{{{1}}}-{{{2}}}", nolang = true, }, { regex = "^Requests for translations in user%-competency categories with ([0-9]+) (users?)$", description = "Requests for translation of phrases indicating user competencies for specific languages and specific competency levels, for categories with {{{1}}} {{{2}}}.", additional_template_description = user_competency_additional_template_description, parents = user_competency_parents, breadcrumb = "{{{1}}}", nolang = true, } }) table.insert(raw_handlers, function(data) local items local function init_items() items = {pagename = data.category} end local function expand_value(item, val) if not val then return val elseif is_callable(val) then return expand_value(item .. " ⇒ function", val(items)) elseif type(val) == "table" then for k, v in pairs(val) do val[k] = expand_value(item .. " ⇒ " .. k, v) end return val elseif type(val) == "number" then val = tostring(val) end if type(val) ~= "string" then error(("The item '%s' on page %s is of type %s and can't be concatenated"):format( item, items.pagename, type(val))) end -- Replaces pseudo-template code {{{ }}} with the corresponding member of the "items" table. Has to be done -- recursively, since some of the items are nested: -- {{{template_sample_call_with_temp}}} -- ⇓ -- {{{{{template_name}}}|{{{language_code}}}}} -- ⇓ -- {{attention|en}} if val:find("{{{") then val = mw.ustring.gsub(val, "{{{([^%}%{]+)}}}", function(prop) local propval = items[prop] if not propval then error(("The item '%s' (expanded from property '%s' on page %s) was not found in the 'items' table"): format(prop, item, items.pagename)) end return expand_value(item .. " ⇒ " .. prop, propval) end ) end return val end local function expand_items_value(item) return expand_value(item, items[item]) end local function convert_items_to_category_data(items) if not items.nolang then items.language_name = items.language_name or "{{{1}}}" items.language_name = expand_items_value("language_name") items.language_object = require(languages_module).getByCanonicalName(items.language_name, true, items.allow_etym_lang) items.language_code = items.language_object:getCode() items.is_etym_lang = items.language_object:hasType("etymology-only") if items.is_etym_lang then items.parent_language_object = items.language_object:getFull() -- Reject weird cases where etymology language has no parent. if not items.parent_language_object then return nil end items.parent_language_code = items.parent_language_object:getCode() items.parent_language_name = items.parent_language_object:getCanonicalName() -- Reject weird cases where the parent language has the same name as the child etymology language. In -- that case, we'll get an infinite parent-category loop. This actually happens, e.g. with Rudbari and -- Bashkardi. if items.parent_language_name == items.language_name then return nil end else end end if items.template_name then items.template_sample_call = items.template_sample_call or "{{{{{template_name}}}|{{{language_code}}}}}" items.full_text_about_the_template = "To make this request, in this specific language, use this code in the entry (see also the documentation at [[Template:{{{template_name}}}]]):\n\n<pre>{{{template_sample_call}}}</pre>" if items.template_example_output then items.full_text_about_the_template = items.full_text_about_the_template .. " " .. items.template_example_output else items.template_actual_sample_call = items.template_actual_sample_call or items.template_sample_call items.full_text_about_the_template = items.full_text_about_the_template .. "\nIt results in the message below:\n\n{{{template_actual_sample_call}}}" end if items.additional_template_description then items.full_text_about_the_template = items.full_text_about_the_template .. "\n\n" .. items.additional_template_description end else items.full_text_about_the_template = items.additional_template_description end local parents, breadcrumb if items.is_etym_lang then parents = items.etym_parents breadcrumb = expand_items_value("etym_breadcrumb") or items.language_name else parents = items.parents breadcrumb = expand_items_value("breadcrumb") end if parents then for _, parent in ipairs(parents) do parent.name = expand_value("parent.name", parent.name) parent.sort = {sort_base = expand_value("parent.sort", parent.sort), lang = "en"} end else local umbrella_type = items.pagename:match("^Requests for (.+) by language$") if umbrella_type then breadcrumb = breadcrumb or umbrella_type parents = {{name = "Request subcategories by language", sort = umbrella_type}} if items.additional_umbrella_parents then extend(parents, items.additional_umbrella_parents) end elseif not items.language_name then error("Internal error: Don't know how to compute parents for non-language-specific category '" .. items.pagename .. "'") else local requests_concerning_breadcrumb = items.pagename:gsub(" " .. pattern_escape(items.language_name), "") requests_concerning_breadcrumb = requests_concerning_breadcrumb:gsub("^Requests for ", ""):gsub(" in entries$", ""):gsub(" for terms$", "") local requests_concerning_parent = { name = "Requests concerning " .. items.language_name, sort = {sort_base = requests_concerning_breadcrumb, lang = "en"} } if items.is_etym_lang then local parent_lang_cat = items.pagename:gsub(pattern_escape(items.language_name), replacement_escape(items.parent_language_name)) parents = { {name = parent_lang_cat, sort = {sort_base = items.language_name, lang = "en"}}, requests_concerning_parent } else breadcrumb = breadcrumb or requests_concerning_breadcrumb parents = {requests_concerning_parent} end end end if not items.nolang and not items.is_etym_lang and items.umbrella ~= false then table.insert(parents, { name = expand_items_value("umbrella"), sort = {sort_base = items.language_name, lang = "en"} }) end local additional = expand_items_value("full_text_about_the_template") if items.pagename:find(" by language$") then additional = "{{{umbrella_msg}}}" .. (additional and "\n\n" .. additional or "") end return { description = expand_items_value("description") or items.pagename .. ".", lang = items.parent_language_code or items.language_code, additional = additional, parents = parents, -- If no breadcrumb= and not an etym-only language, it will default to the category name breadcrumb = breadcrumb, catfix = expand_items_value("catfix"), toc_template = expand_items_value("toc_template"), toc_template_full = expand_items_value("toc_template_full"), hidden = not items.nolang and not items.not_hidden_category, can_be_empty = true, } end -- First look for a regular (usually language or script-specific) category. for _, category in ipairs(requests_categories) do local matchvals = {mw.ustring.match(data.category, category.regex)} if #matchvals > 0 then init_items() for key, value in pairs(category) do items[key] = value end for key, value in ipairs(matchvals) do items["" .. key] = value end local catdata = convert_items_to_category_data(items) if catdata then return catdata end end end -- Now look for umbrella categories. for _, category in ipairs(requests_categories) do if data.category == category.umbrella then init_items() items.nolang = true items.additional_umbrella_parents = category.additional_umbrella_parents local catdata = convert_items_to_category_data(items) if catdata then return catdata end end end return nil end) table.insert(raw_handlers, function(data) local langname = data.category:match("^Terms with (.+) translations$") local lang = langname and require(languages_module).getByCanonicalName(langname, true, true) if lang then local langcode = lang:getCode() local parents, breadcrumb_and_first_sort_key if lang:hasType("etymology-only") then parents = { "Terms with " .. lang:getFullName() .. " translations", {name = langname, sort = "Translations"}, } breadcrumb_and_first_sort_key = lang:getCanonicalName() else parents = { {name = "entry maintenance", is_label = true, lang = langcode}, { name = "Terms with translations by language", sort = {sort_base = langname, lang = "en"} }, } breadcrumb_and_first_sort_key = "Translations" end return { description = "Entries that contain translations into " .. langname .. " which were added using one of the translation templates, such as {{tl|t|" .. langcode .. "|...}}, {{tl|t+|" .. langcode .. "|...}}, etc.", parents = parents, breadcrumb_and_first_sort_key = breadcrumb_and_first_sort_key, catfix = false, can_be_empty = true, hidden = true, } end end) local recognized_taxtypes = require(table_module).listToSet { "ambiguous", "binomial", "branch", "clade", "cladus", "class", "cohort", "convariety", "cultivar group", "cultivar", "division", "empire", "epifamily", "epithet", "family", "form taxon", "form", "genus", "grade", "grandorder", "group", "hybrid", "informal group", "infraclass", "infracohort", "infrakingdom", "infraorder", "infraphylum", "infraspecies", "kingdom", "magnorder", "megacohort", "mirorder", "morph", "nothogenus", "nothospecies", "nothosubspecies", "nothovariety", "obsolete", "oofamily", "order", "parvclass", "parvorder", "phylum", "section", "series", "serovar", "species group", "species", "stem", "stirps", "strain", "subclass", "subcohort", "subdivision", "subfamily", "subgenus", "subgroup", "subinfraorder", "subkingdom", "suborder", "subphylum", "subsection", "subspecies", "subterclass", "subtribe", "superclass", "supercohort", "superfamily", "supergroup", "superorder", "superphylum", "supertribe", "taxon", "tribe", "trinomial", "undescribed species", "unknown", "unranked group", "variety", "virus complex", } table.insert(raw_handlers, function(data) local taxtype = data.category:match("^Entries using missing taxonomic name %((.*)%)$") if taxtype and recognized_taxtypes[taxtype] then return { description = "Entries that link to wikispecies because there is no corresponding Wiktionary entry for the taxonomic name in the template {{tl|taxlink}}.", additional = "The missing name is one or more of those enclosed in {{tl|taxlink}}. The entries are sorted by the missing taxonomic name.", parents = {{name = "Entries using missing taxonomic names", sort = {sort_base = taxtype, lang = "en"}}}, breadcrumb = taxtype, hidden = true, } end end) return {LABELS = labels, RAW_CATEGORIES = raw_categories, RAW_HANDLERS = raw_handlers} ovy8bjegcqic9ds39g3cox2dyck130i 487807 487806 2026-09-02T19:09:31Z SM7 6218 SM7 ने पृष्ठ [[मॉड्यूल:category tree/प्रविष्टि रखरखाव]] को [[मॉड्यूल:category tree/entry maintenance]] पर स्थानांतरित किया 487806 Scribunto text/plain local labels = {} local raw_categories = {} local raw_handlers = {} local functions_module = "Module:fun" local languages_module = "Module:languages" local scripts_module = "Module:scripts" local string_pattern_escape_module = "Module:string/patternEscape" local string_replacement_escape_module = "Module:string/replacementEscape" local table_module = "Module:table" local extend = require(table_module).extend local is_callable = require(functions_module).is_callable local pattern_escape = require(string_pattern_escape_module) local replacement_escape = require(string_replacement_escape_module) local unpack = unpack or table.unpack -- Lua 5.2 compatibility ----------------------------------------------------------------------------- -- -- -- LABELS -- -- -- ----------------------------------------------------------------------------- labels["प्रविष्टि रखरखाव"] = { description = "{{{langname}}} entries, or entries in other languages containing {{{langname}}} terms, that are being tracked for attention and improvement by editors.", parents = {{name = "{{{langcat}}}", raw = true}}, umbrella_parents = "मूलभूत श्रेणी", } labels["entries with incorrect language header"] = { description = "{{{langname}}} entries that have been placed under the wrong language header.", additional = "This can happen for several reasons:\n" .. "* Typos.\n" .. "* Vandalism.\n" .. "* Using the wrong language code.\n" .. "* Using an alternative name for the language.\n" .. "* Using special characters which haven't been used in the name given in the language data modules.", parents = {"entry maintenance"}, can_be_empty = true, hidden = true, } labels["entries without References header"] = { description = "{{{langname}}} entries without a References header.", parents = {"entry maintenance"}, can_be_empty = true, hidden = true, } labels["entries without References or Further reading header"] = { description = "{{{langname}}} entries without a References or Further reading header.", parents = {"entry maintenance"}, can_be_empty = true, hidden = true, } labels["entries that don't exist"] = { description = "{{{langname}}} terms that do not meet the [[Wiktionary:Criteria for inclusion|criteria for inclusion]] (CFI). They are added to the category with the template {{tl|no entry|{{{langcode}}}}}.", parents = {"entry maintenance"}, umbrella_parents = "Fundamental", } labels["entries with etymology trees"] = { description = "{{{langname}}} entries that display an etymology tree generated by the template {{tl|etymon}}.", parents = {"entry maintenance"}, can_be_empty = true, hidden = true, } labels["entries with etymology texts"] = { description = "{{{langname}}} entries that display an etymology generated by the template {{tl|etymon}}.", parents = {"entry maintenance"}, can_be_empty = true, hidden = true, } labels["entries with etymon"] = { description = "{{{langname}}} entries that use the template {{tl|etymon}}.", parents = {"entry maintenance"}, can_be_empty = true, hidden = true, } labels["entries with etymology text stop language not in chain"] = { description = "{{{langname}}} entries where {{tl|etymon}} is used with {{para|text}} set to stop at a language but that language never appears in the rendered etymology chain.", parents = {"entry maintenance"}, can_be_empty = true, hidden = true, } labels["entries referencing missing etymons"] = { description = "Entries which use the {{tl|etymon}} template to reference an etymon that cannot be found, either because the target page does not exist (redlink) or because it has no {{tl|etymon}} template.", parents = {"entry maintenance"}, can_be_empty = true, hidden = true, } labels["entries referencing ambiguous etymons"] = { description = "Entries which use the {{tl|etymon}} template to reference an etymon without the ID, when the target page contains multiple {{tl|etymon}} templates, and an ID is therefore required to select the correct {{tl|etymon}}.", parents = {"entry maintenance"}, can_be_empty = true, hidden = true, } labels["entries referencing etymons with mismatched IDs"] = { description = "Entries which use the {{tl|etymon}} template with a mismatched ID. For example, {{code|lang:entry<id:mismatched ID>}}", parents = {"entry maintenance"}, can_be_empty = true, hidden = true, } labels["entries referencing pages with multiple etymons missing IDs"] = { description = "Entries which use the {{tl|etymon}} template to link to a page that has more than one {{tl|etymon}} template for the same language, where at least one of those templates has no {{para|id}}. When several {{tl|etymon}} templates share a language section, each must have a distinct {{para|id}} so that links and descendants logic can tell them apart.", parents = {"entry maintenance"}, can_be_empty = true, hidden = true, } labels["entries referencing pages with etymology sections missing etymons"] = { description = "Entries which use the {{tl|etymon}} template to link to a page that has more than one etymology section for the same language, where at least one section contains a {{tl|etymon}} template for that language and at least one other etymology section does not.", parents = {"entry maintenance"}, can_be_empty = true, hidden = true, } labels["entries referencing etymons without Descendants sections"] = { description = "Entries which use the {{tl|etymon}} template to reference an etymon whose source entry has no Descendants section.", parents = {"entry maintenance"}, can_be_empty = true, hidden = true, } labels["entries referencing etymons without this term in Descendants sections"] = { description = "Entries which use the {{tl|etymon}} template to reference an etymon whose source entry has a Descendants section, but does not list the current term there.", parents = {"entry maintenance"}, can_be_empty = true, hidden = true, } labels["entries with language name categories using raw markup"] = { description = "{{{langname}}} entries that have been placed in a language name category using raw wiki markup (i.e. {{code|[[<nowiki/>Category:{{{langname}}} ...]]}}). They should be added using {{tl|cln|{{{langcode}}}|...}} instead.", parents = {"entry maintenance"}, can_be_empty = true, hidden = true, } labels["entries with topic categories using raw markup"] = { description = "{{{langname}}} entries that have been placed in a topic category using raw wiki markup (i.e. {{code|[[<nowiki/>Category:{{{langcode}}}:...]]}}). They should be added using {{tl|C|{{{langcode}}}|...}} instead.", parents = {"entry maintenance"}, can_be_empty = true, hidden = true, } labels["entries with outdated source"] = { description = "{{{langname}}} entries that have been partly or fully imported from an outdated source.", parents = {"entry maintenance"}, } labels["entries with inflection not matching pagename"] = { description = "{{{langname}}} entries which have an inflection table whose lemma form does not match the page name.", additional = "This is usually the result of incorrect or missing parameters.", breadcrumb_and_first_sort_key = "inflection not matching pagename", parents = {"entry maintenance"}, hidden = true, can_be_empty = true, } labels["undefined derivations"] = { description = "{{{langname}}} etymologies using {{tl|undefined derivation}}, where a more specific template such as {{tl|borrowed}} or {{tl|inherited}} should be used instead.", parents = {"entry maintenance"}, can_be_empty = true, hidden = true, } labels["descendants to be fixed in desctree"] = { description = "Entries that use {{tl|desctree}} to link to {{{langname}}} entries with no Descendants section.", parents = {"entry maintenance"}, can_be_empty = true, hidden = true, } labels["term requests"] = { description = "Entries with [[Template:der]], [[Template:inh]], [[Template:m]] and similar templates lacking the parameter for linking to {{{langname}}} terms.", parents = {"entry maintenance"}, can_be_empty = true, hidden = true, } labels["redlinks"] = { description = "Links to {{{langname}}} entries that have not been created yet.", parents = {"entry maintenance"}, catfix = false, can_be_empty = true, hidden = true, } labels["terms with IPA pronunciation"] = { description = "{{{langname}}} terms that include the pronunciation in the form of IPA.", additional = "For requests related to this category, see [[:Category:Requests for pronunciation in {{{langname}}} entries]].", parents = {"entry maintenance"}, } labels["terms with enPR pronunciation"] = { description = "{{{langname}}} terms that include the pronunciation in the form of enPR.", additional = "For requests related to this category, see [[:Category:Requests for pronunciation in {{{langname}}} entries]].", parents = {"entry maintenance"}, } labels["terms with Indic pronunciation"] = { description = "{{langname}} terms that include the pronunciation in the form of ISO 15919.", additional = "For requests related to this category, see [[:Category:Requests for pronunciation in {{{langname}}} entries]].", parents = {"entry maintenance"}, } labels["IPA pronunciations with invalid separators"] = { description = "{{{langname}}} terms with IPA using invalid separators such as /.ˈ/, /.ˌ/, a dot followed by primary or secondary stress; or /ˈ / or /ˌ /, primary or secondary stress followed by a space.", parents = {"entry maintenance"}, can_be_empty = true, hidden = true, } labels["terms with hyphenation"] = { description = "{{{langname}}} terms that include hyphenation.", parents = {"entry maintenance"}, } labels["terms with audio pronunciation"] = { description = "{{{langname}}} terms that include the pronunciation in the form of an audio file.", additional = "For requests related to this category, see [[:Category:Requests for audio pronunciation in {{{langname}}} entries]].", parents = {"entry maintenance"}, } labels["terms with nonstandard or incorrect audio pronunciations"] = { description = "{{{langname}}} terms which have been tagged as having pronunciations which are nonstandard or incorrect.", parents = {"terms with audio pronunciation"}, can_be_empty = true, hidden = true, } labels["entries missing Template:reconstructed"] = { description = "Reconstructed {{{langname}}} entries which do not have the {{tl|reconstructed}} template.", parents = {"entry maintenance"}, can_be_empty = true, hidden = true, } local function add_manual_param_category(label, desc, addl_intro, include_addl_continuation) labels[label] = { description = desc or "Pages containing {{{langname}}} " .. label .. ".", additional = addl_intro .. (not include_addl_continuation and "" or "\n\n" .. "Note that the pages in this category are not necessarily the same as the actual term in question. This " .. "frequently happens, for example, with English pages with translation sections, where the term that " .. "triggers the addition of the category is one of the translations."), parents = {"entry maintenance"}, -- Set catfix = false because the page will have a mixture of native-language and -- non-native-language pages, but include the normal native-language table of contents headers -- because most pages are in the native language. catfix = false, toc_template = "{{{langcode}}}-categoryTOC", toc_template_full = "{{{langcode}}}-categoryTOC/full", can_be_empty = true, hidden = true, } end add_manual_param_category("terms in nonstandard scripts", nil, "Pages are placed here if they contain terms written in a script that isn't in the language's " .. "list of scripts in the language data. This may mean the script should be added to the list, or that the wrong language code has been used.", true) add_manual_param_category("terms with non-redundant manual transliterations", nil, "Pages are placed here if they contain terms whose transliteration has been specified manually using " .. "{{para|tr}} or a similar parameter and is different from the transliteration which is automatically generated.", true) add_manual_param_category("terms with redundant transliterations", nil, "Pages are placed here if they contain terms whose transliteration has been specified manually using " .. "{{para|tr}} or a similar parameter and is the same as the transliteration which is automatically generated.", true) add_manual_param_category("terms with non-redundant manual script codes", nil, "Pages are placed here if they contain terms whose script code has been specified manually using " .. "{{para|sc}} or a similar parameter and is different from the script code which is automatically generated.", true) add_manual_param_category("terms with redundant script codes", nil, "Pages are placed here if they contain terms whose script code has been specified manually using " .. "{{para|sc}} or a similar parameter and is the same as the script code which is automatically generated.", true) add_manual_param_category("terms with non-redundant non-automated sortkeys", "{{{langname}}} terms with non-redundant non-automated sortkeys.", "Terms are placed here if they have been sorted using a sortkey other than the one which is automatically " .. "generated. This can happen for two reasons:\n# A different sortkey has been specified using the {{para|sort}} " .. "parameter.\n# One or more categories have been added using raw wikitext, which means the page's default " .. "sortkey is used for that category. If that default sortkey is different from the automatic sortkey, then the " .. "page will also be added here.") add_manual_param_category("terms with redundant sortkeys", "{{{langname}}} terms with redundant sortkeys.", "Terms are placed here if their sortkey has been specified using the {{para|sort}} parameter, and it the same " .. "as the one which is automatically generated.") add_manual_param_category("links with redundant target parameters", "Pages containing {{{langname}}} links where the alt text could replace the link target, instead of being given " .. "separately.", "This occurs when the only difference between the link target and the alt text is that the alt text contains " .. "diacritics (or other characters) which would have been ignored anyway had they been included in the link " .. "target. For example, {{tl|l|la|amo|amō}} ({{l|la|amo|amō}}) is exactly the same as {{tl|l|la|amō}} " .. "({{l|la|amō}}), because macrons are automatically stripped from Latin link targets, even though they're still " .. "displayed.") add_manual_param_category("links with ignored alt parameters", "Pages containing {{{langname}}} links where the {{para|alt}} parameter has been ignored.", "This occurs when the main linked text includes a wikilink.") add_manual_param_category("links with redundant alt parameters", "Pages containing {{{langname}}} links where the {{para|alt}} parameter is redundant.", "This occurs when the alt text makes no difference to the output. For example, {{tl|l|en|foo|foo}} " .. "({{l|en|foo|foo}}) is exactly the same as {{tl|l|en|foo}} ({{l|en|foo}}).") add_manual_param_category("links with ignored id parameters", "Pages containing {{{langname}}} links where the {{para|id}} parameter has been ignored.", "This occurs when the main linked text includes a wikilink.") add_manual_param_category("links with redundant wikilinks", "Pages containing {{{langname}}} links which contain a redundant wikilink.", "This occurs if link target consists of a single wikilink, which should instead be entered in the " .. "conventional manner without link brackets. For example, {{tl|l|en|<nowiki>[[foo]]</nowiki>}} " .. "is the same as {{tl|l|en|foo}}, and {{tl|l|en|<nowiki>[[foo|bar]]</nowiki>}} is the same as " .. "{{tl|l|en|foo|bar}}.\n\nThis also occurs when link templates are nested inside each other " .. "unnecessarily: e.g. {{tl|l|en|{{tl|l|en|foo}}}}") add_manual_param_category("links with manual fragments", "Pages containing {{{langname}}} links where a manual link fragment has been given.", "This occurs when the link fragment has been specified using {{code|#}} after the term, " .. "which overrides the normal fragment generated by link templates that points to the relevant " .. "language section.\n\nLink fragments are used to point to a specific section on a target page, and " .. "it is preferable to use the {{para|id}} parameter to do this, since it is less likely to break if " .. "additional content is added to the target page: for example, the fragment {{code|#Adjective}} " .. "will start pointing to the wrong section if another language with an adjective section is added above " .. "the intended language.") labels["descendant hubs"] = { description = "{{{langname}}} terms that do not mean more than the sum of their parts but exist for listing two or more inclusion-worthy descendants.", parents = {"entry maintenance"}, } labels["terms needing to be assigned to a sense"] = { description = "{{{langname}}} entries that have terms under headers such as \"Synonyms\" or \"Antonyms\" not assigned to a specific sense of the entry in which they appear. Use [[Template:syn]] or [[Template:ant]] to fix these.", parents = {"entry maintenance"}, can_be_empty = true, hidden = true, } --[=[ labels["terms with inflection tables"] = { description = "{{{langname}}} entries that contain inflection tables.". additional = "For requests related to this category," see [[:Category:Requests for inflections in {{{langname}}} entries]].", parents = {"entry maintenance"}, } ]=] labels["terms with collocations"] = { description = "{{{langname}}} entries that contain [[collocation]]s that were added using templates such as {{tl|co}}.", additional = "For requests related to this category, see [[:Category:Requests for collocations in {{{langname}}}]]. See also [[:Category:Requests for quotations in {{{langname}}}]] and [[:Category:Requests for example sentences in {{{langname}}}]].", parents = {"entry maintenance"}, umbrella_parents = "Collocation maintenance", } labels["terms with usage examples"] = { description = "{{{langname}}} entries that contain usage examples that were added using templates such as {{tl|ux}}.", additional = "For requests related to this category, see [[:Category:Requests for example sentences in {{{langname}}}]]. See also [[:Category:Requests for collocations in {{{langname}}}]] and [[:Category:Requests for quotations in {{{langname}}}]].", parents = {"entry maintenance"}, umbrella_parents = "Usage example maintenance", } labels["terms with quotations"] = { description = "{{{langname}}} entries that contain quotes that were added using templates such as {{tl|quote}}, {{tl|quote-book}}, {{tl|quote-journal}}, etc.", additional = "For requests related to this category, see [[:Category:Requests for quotations in {{{langname}}}]]. See also [[:Category:Requests for example sentences in {{{langname}}}]].", parents = {"entry maintenance"}, umbrella_parents = "Quotation maintenance", } labels["terms with interlinear glossed text"] = { description = "{{{langname}}} entries that contain interlinear glossed text added using {{tl|interlinear}}.", parents = {"entry maintenance"}, } labels["terms with redundant head parameter"] = { description = "{{{langname}}} terms that contain a redundant head= parameter in their headword (called using {{tl|head}} or a language-specific equivalent).", additional = "Individual languages can prevent terms from being added to this category by setting `data.no_redundant_head_cat`.", parents = {"entry maintenance"}, can_be_empty = true, hidden = true, } labels["terms with red links in their headword lines"] = { description = "{{{langname}}} terms that contain red links (i.e. uncreated forms) in their headword lines.", parents = {"redlinks"}, can_be_empty = true, hidden = true, } labels["terms with red links in their inflection tables"] = { description = "{{{langname}}} terms that contain red links (i.e. uncreated forms) in their inflection tables.", parents = {"redlinks"}, can_be_empty = true, hidden = true, } labels["requests for English equivalent term"] = { description = "{{{langname}}} entries with definitions that have been tagged with {{tl|rfeq}}. Read the documentation of the template for more information.", parents = {"entry maintenance"}, can_be_empty = true, hidden = true, } for _, quot_type in ipairs { "quotations", "usage examples" } do local umbrella_parent = quot_type == "quotations" and "Quotation maintenance" or "Usage example maintenance" labels[quot_type .. " with omitted translation"] = { description = "{{{langname}}} " .. quot_type .. " where a translation would normally be required but the translation has explicitly been omitted by specifying {{code|-}}. The translation should be supplied instead.", parents = {"entry maintenance"}, umbrella = { parents = {name = umbrella_parent, sort = "omitted translation"}, breadcrumb = "with omitted translation", }, can_be_empty = true, hidden = true, } end for _, pos in ipairs({"nouns", "proper nouns", "verbs", "adjectives", "adverbs", "participles", "determiners", "pronouns", "numerals", "suffixes", "contractions"}) do labels[pos .. " with red links in their headword lines"] = { description = "{{{langname}}} " .. pos .. " that contain red links (i.e. uncreated forms) in their headword lines.", parents = {"terms with red links in their headword lines"}, breadcrumb = pos, can_be_empty = true, hidden = true, } labels[pos .. " with red links in their inflection tables"] = { description = "{{{langname}}} " .. pos .. " that contain red links (i.e. uncreated forms) in their inflection tables.", parents = {"terms with red links in their inflection tables"}, breadcrumb = pos, can_be_empty = true, hidden = true, } end for _, pos in ipairs { "nouns", "proper nouns", "pronouns" } do local label = pos .. " with unknown or uncertain plurals" labels[label] = { description = "{{{langname}}} " .. label .. ".", additional = "Terms are usually added to this category by specifying {{code|?}} as the plural. As much " .. "is possible, a plural should be added or, if the noun is uncountable, indicated appropriately (usually " .. "using {{code|-}} in place of the plural). Some languages support the value {{code|!}} to indicate " .. "that a plural cannot be attested but the noun is theoretically countable.", breadcrumb = "with unknown or uncertain plurals", parents = { {name = pos, sort = "unknown or uncertain plurals"}, "entry maintenance", }, } end -- Add 'umbrella_parents' key if not already present. for _, data in pairs(labels) do if data.umbrella == nil and data.umbrella_parents == nil then data.umbrella_parents = "Entry maintenance subcategories by language" end end ----------------------------------------------------------------------------- -- -- -- RAW CATEGORIES -- -- -- ----------------------------------------------------------------------------- raw_categories["Entry maintenance subcategories by language"] = { description = "Umbrella categories covering topics related to entry maintenance.", additional = "{{{umbrella_meta_msg}}}", parents = { "Umbrella metacategories", {name = "entry maintenance", is_label = true, sort = " "}, }, } raw_categories["Citation maintenance"] = { description = "Categories for maintaining citations specified using {{tl|cite-*}}.", parents = {"Wiktionary maintenance"}, breadcrumb = "citations", } raw_categories["Collocation maintenance"] = { description = "Categories for maintaining collocations specified using {{tl|co}}, {{tl|coi}} or {{tl|coa}}.", parents = {"Wiktionary maintenance"}, breadcrumb = "collocations", } raw_categories["Quotation maintenance"] = { description = "Categories for maintaining quotations specified using {{tl|quote-*}}.", parents = {"Wiktionary maintenance"}, breadcrumb = "quotations", } raw_categories["Usage example maintenance"] = { description = "Categories for maintaining usage examples specified using {{tl|ux}}, {{tl|uxi}} or {{tl|uxa}}.", parents = {"Wiktionary maintenance"}, breadcrumb = "usage examples", } raw_categories["Citations using nocat parameter"] = { description = "Instances of {{tl|cite-*}} templates using the {{para|nocat}} parameter, which should be eliminated (?).", parents = {{name = "Citation maintenance", sort = "nocat"}}, breadcrumb = "using nocat parameter", can_be_empty = true, hidden = true, } raw_categories["Quotation templates to be cleaned"] = { description = "Instances of quotations using {{tl|quote-text}}.", additional = "They should be converted to other '''[[:Category:Citation templates|quotation templates]]''' if relevant.", parents = {"Quotation maintenance"}, breadcrumb_base = "to be cleaned", can_be_empty = true, hidden = true, } raw_categories["Quotations using nocat parameter"] = { description = "Instances of {{tl|quote-*}} templates using the {{para|nocat}} parameter, which should be eliminated (?).", parents = {{name = "Quotation maintenance", sort = "nocat"}}, breadcrumb = "using nocat parameter", can_be_empty = true, hidden = true, } raw_categories["Quotations using quoted-in parameter"] = { description = "Instances of {{tl|quote-*}} templates using the {{para|quoted_in}} parameter.", additional = "It is recommended to restructure these template calls using the {{para|newversion}} parameter along with associated parameters {{para|2ndauthor}}, {{para|title2}}, {{para|year2}}, {{para|publisher2}} and the like, as described in the documentation for {{tl|quote-book}}.", parents = {{name = "Quotation maintenance", sort = "quoted-in"}}, breadcrumb = "using quoted-in parameter", can_be_empty = true, hidden = true, } raw_categories["Requests"] = { topright = "{{shortcut|WT:CR|WT:RQ}}", description = "A parent category for the various request categories.", parents = {"Category:Wiktionary"}, } raw_categories["Requests by language"] = { description = "Categories with requests in various specific languages.", additional = "{{{umbrella_msg}}}", parents = { {name = "Request subcategories by language", sort = " "}, {name = "Requests", sort = " "}, }, breadcrumb = "By language", } raw_categories["Request subcategories by language"] = { description = "Umbrella categories covering topics related to requests.", additional = "{{{umbrella_meta_msg}}}", parents = { "Umbrella metacategories", {name = "Requests", sort = " "}, }, } raw_categories["Requests for quotations by source"] = { description = "Categories with requests for quotation, broken out by the source of the quotation.", additional = "Some abbreviated names of sources are explained at [[Wiktionary:Abbreviated Authorities in Webster]].", parents = {{name = "Requests for quotations", sort = "source"}}, breadcrumb = "By source", } raw_categories["Requests for quotations"] = { -- FIXME description = "Words are added to this category by the inclusion in their entries of {{tl|rfv-quote}}.", parents = {{name = "Requests", sort = "quotations"}, "Quotation maintenance"}, breadcrumb = "Quotations", } raw_categories["Requests for date"] = { description = "Requests for a date to be added to a quotation.", additional = "To add an article to this category, use {{tl|rfdate}} or {{tl|rfdatek}} to include the author. " .. "Please remove the template from the article once the date has been provided.", parents = {{name = "Requests", sort = "date"}, "Quotation maintenance"}, breadcrumb = "Date", } raw_categories["Requests for translations in user-competency categories by number of users"] = { description = "Requests for translations to be added to user-competency categories, sorted by number of users with that competency.", parents = {{name = "Requests", sort = "translations in user-competency categories by number of users"}}, breadcrumb = "Translations in user-competency categories by number of users", } raw_categories["Requests for translations in user-competency categories by language"] = { description = "Requests for translations to be added to user-competency categories, sorted by language.", parents = {{name = "Requests", sort = "translations in user-competency categories by language"}}, breadcrumb = "Translations in user-competency categories by language", hidden = true, } raw_categories["Terms with translations by language"] = { description = "Terms with translations, sorted by language.", parents = {{name = "Entry maintenance subcategories by language", sort = "translations by language"}}, breadcrumb = "Translations", } raw_categories["Entries using missing taxonomic names"] = { description = "Entries that link to wikispecies because there is no corresponding Wiktionary entry for the taxonomic name in the template {{tl|taxlink}}.", additional = "The missing name is one or more of those enclosed in {{tl|taxlink}}. The entries are sorted by the missing taxonomic name." .. "\n\nSee [[:Category:mul:Taxonomic names]].", parents = {{name = "entry maintenance", is_label = true, lang = "mul", sort = "missing taxonomic names"}}, breadcrumb = "Missing taxonomic names", hidden = true, } ----------------------------------------------------------------------------- -- -- -- RAW HANDLERS -- -- -- ----------------------------------------------------------------------------- local function script_name_to_code(name) local sc = require(scripts_module).getByCanonicalName(name) if not sc then error("Unrecognized script name '" .. name .. "'") end return sc:getCode() end --[=[ This array consists of category match specs. Each spec contains one or more properties, whose values are (a) strings that may contain references to other properties using the {{{PROPERTY}}} syntax; (b) functions of one argument, an `items` table of the same properties that are accessible using the {{{PROPERTY}} syntax. Each such spec should have at least a `regex` property that matches the name of the category. Capturing groups in this regex can be referenced in other properties using {{{1}}} for the first group, {{{2}}} for the second group, etc. (or using keys "1", "2", etc. in functions). Property expansion happens recursively if needed (i.e. a property can reference another property, which in turn references a third property). If there is a `language_name` propery, it specifies the language name (and will typically be a reference to a capturing group from the `regex` property); if not specified, it defaults to "{{{1}}}" unless the `nolang` property is set, in which case there is no language name associated with the category name. The language name must be the canonical name of a recognized full language, or an error is thrown; however, if the `allow_etym_lang` property is set, the language name may also be the canonical name of an etymology-only language. Based on the language name, the `language_code` and `language_object` properties are automatically filled in. If `language_name` is an etymology-only language, additional properties `parent_language_name`, `parent_language_code` and `parent_language_object` are set for the parent full language of the etymology-only language. If the `regex` values of multiple category specs match, the first one takes precedence. Recognized or predefined properties: `pagename`: Current pagename. `regex`: See above. `1`, `2`, `3`, ...: See above. `language_name`, `language_code`, `language_object`: See above. `parent_language_name`, `parent_language_code`, `parent_language_object`: See above. `nolang`: See above. `allow_etym_lang`: Language names may be etymology-only languages. See above. `description`: Override the description (normally taken directly from the pagename). `template_name`: Name of template which generates this category. `template_sample_call`: Syntax for calling the template. Defaults to "{{{template_name}}}|{{{language_code}}}". Used to display an example template call and the output of this call. `template_actual_sample_call`: Syntax for calling the template. Takes precedence over `template_sample_call` when generating example template output (but not when displaying an example template call) and is intended for a template call that uses the |nocat=1 parameter. `template_example_output`: Override the text that displays example template output (see `template_sample_call`). `additional_template_description`: Extra text to be displayed after the example template output. `parents`: Parent categories. Should be a list of elements, each of which is an object containing at least a name= and sort= field (same format as parents= for regular raw categories, except that the name= and sort= field will have {{{PROPERTY}}} references expanded). If no parents are specified, and the pagename is of the form "Requests for FOO by language", the parents will be "Request subcategories by language" with FOO as the sort key, along with any parents specified in `additional_umbrella_parents`. Otherwise, the `language_name` property must exist, and the parent will be "Requests concerning LANGNAME", with the pagename minus any initial "Requests for " as the sort key. Note that this does *NOT* apply if an etymology-only language is associated with the category, in which case `etym_parents` is used instead. `etym_parents`: Parent categories for categories with associated etymology-only languages. The format is the same as `parents`. If omitted, there are two parents by default: (1) The pagename (i.e. category name) with the language name replaced by the corresponding parent language name, with the value of `language_name` as the sort key; (2) "Requests concerning LANGNAME", with the pagename minus any initial "Requests for " as the sort key. `umbrella`: Parent all-language category. Sort key is based on the language name. This applies *ONLY* if a full language is associated with the category name (i.e. not if `nolang` is set or if `allow_etym_lang` is set and the associated language is an etymology-only language); otherwise there will be no umbrella category. `additional_umbrella_parents`: Additional parents to add to the umbrella (all-language) category along with "Request subcategories by language". `breadcrumb`: Specify the breadcrumb. If `parents` is given, there is no default (i.e. it will end up being the pagename). Otherwise, if the pagename is of the form "Requests for FOO by language", the default breadcrumb will be "FOO". Otherwise it is computed by removing the language name from the pagename and chopping out "Requests for" from the beginning and "in entries" and "for terms" from the end. Note that this does *NOT* apply if an etymology-only language is associated with the category, in which case `etym_breadcrumb` is used instead. `etym_breadcrumb`: Specify the breadcrumb for categories with associated etymology-only languages. Defaults to the value of `language_name`. `not_hidden_category`: Don't hide the category. `catfix`: Same as `catfix` in regular labels and raw categories, except that request-specific {{{PROPERTY}}} syntax is expanded. `toc_template`, `toc_template_full`: Same as the corresponding fields in regular labels and raw categories, except that request-specific {{{PROPERTY}}} syntax is expanded. In general, properties can contain references to templates (e.g. {{tl}} and {{para}}), which will be appropriately expanded (this expansion happens in the poscatboiler code, not in this module). The major exception is in the `template_sample_call` and `template_actual_sample_call` properties, which are surrounded by <pre>...</pre> when inserted, so template references are not expanded. Triple-brace property references are still expanded in these properties; but beware that if any of those property references contain template references, they won't be expanded. (This actually happens in the handlers for 'Request for SCRIPT script for LANG terms'; the sample call references {{{script_code}}}, whose definition therefore cannot contain template references. The solution is to define this property using a function.) ]=] local requests_categories = { { regex = "^Requests concerning (.+)$", allow_etym_lang = true, description = "Categories with {{{1}}} entries that need the attention of experienced editors.", parents = {{name = "entry maintenance", is_label = true, sort = "requests"}}, etym_parents = {{name = "Requests concerning {{{parent_language_name}}}", sort = "{{{1}}}"}, {name = "{{{1}}}", sort = "Requests"}}, umbrella = "Requests by language", breadcrumb = "Requests", not_hidden_category = true, }, { regex = "^Requests for etymologies in (.+) entries$", allow_etym_lang = true, umbrella = "Requests for etymologies by language", template_name = "rfe", }, { regex = "^Requests for expansion of etymologies in (.+) entries$", umbrella = "Requests for expansion of etymologies by language", template_name = "etystub", }, { regex = "^Requests for pronunciation in (.+) entries$", umbrella = "Requests for pronunciation by language", template_name = "rfp", }, { regex = "^Requests for audio pronunciation in (.+) entries$", umbrella = "Requests for audio pronunciation by language", template_name = "rfap", }, { regex = "^Requests for definitions in (.+) entries$", umbrella = "Requests for definitions by language", template_name = "rfdef", }, { regex = "^Requests for clarification of definitions in (.+) entries$", umbrella = "Requests for clarification of definitions by language", template_name = "rfclarify", }, } for _, spec_with_pos in ipairs { {"inflections", "rfinfl"}, {"plural forms"}, {"tone", "rftone"}, {"accents"}, {"aspect", "rfaspect"}, {"animacy"}, {"gender", "rfgender"}, {"noun class"}, } do local property, rftemplate = unpack(spec_with_pos) table.insert(requests_categories, { -- This is for part-of-speech-specific categories such as -- "Requests for inflections in Northern Ndebele noun entries" or -- "Requests for accents in Ukrainian proper noun entries". -- Here and below, we assume that the part of speech is begins with -- a lowercase letter, while the preceding language name ends in a -- capitalized word. Note that this entry comes before the -- following one and takes precedence over it. regex = ("^Requests for %s in (.-) ([a-z]+[a-z ]*) entries$"):format(property), parents = {{name = ("Requests for %s in {{{language_name}}} entries"):format(property), sort = "{{{2}}}"}}, umbrella = ("Requests for %s of {{pluralize|{{{2}}}}} by language"):format(property), breadcrumb = "{{{2}}}", template_name = rftemplate, template_sample_call = rftemplate and ("{{%s|{{{language_code}}}|{{{2}}}}}"):format(rftemplate) or nil, } ) table.insert(requests_categories, { regex = ("^Requests for %s in (.+) entries$"):format(property), umbrella = ("Requests for %s by language"):format(property), template_name = rftemplate, } ) table.insert(requests_categories, { regex = ("^Requests for %s of (.+) by language$"):format(property), nolang = true, } ) end extend(requests_categories, { { regex = "^Requests for example sentences in (.+)$", umbrella = "Requests for example sentences by language", template_name = "rfex", }, { regex = "^Requests for quotations in (.+)$", umbrella = "Requests for quotations by language", additional_umbrella_parents = {"Quotation maintenance"}, template_name = "rfquote", }, { regex = "^Requests for translations into (.+)$", allow_etym_lang = true, umbrella = "Requests for translations by language", template_name = "t-needed", catfix = "en", }, { regex = "^Requests for translations of (.+) usage examples$", allow_etym_lang = true, umbrella = "Requests for translations of usage examples by language", additional_umbrella_parents = {"Usage example maintenance"}, template_name = "t-needed", template_sample_call = "{{t-needed|{{{language_code}}}|usex}}", template_actual_sample_call = "{{t-needed|{{{language_code}}}|usex|nocat=1}}", additional_template_description = "The {{tl|ux}}, {{tl|uxi}}, {{tl|ja-usex}} and {{tl|zh-x}} templates automatically add the page to this category if the example is in a foreign language and the translation is missing." }, { regex = "^Requests for translations of (.+) quotations$", allow_etym_lang = true, umbrella = "Requests for translations of quotations by language", additional_umbrella_parents = {"Quotation maintenance"}, template_name = "t-needed", template_sample_call = "{{t-needed|{{{language_code}}}|quote}}", template_actual_sample_call = "{{t-needed|{{{language_code}}}|quote|nocat=1}}", additional_template_description = "The {{tl|quote}}, and {{tl|Q}} templates automatically add the page to this category if the example is in a foreign language and the translation is missing." }, { regex = "^Requests for review of (.+) translations$", allow_etym_lang = true, umbrella = "Requests for review of translations by language", template_name = "t-check", template_sample_call = "{{t-check|{{{language_code}}}|example}}", template_example_output = "", catfix = "en", }, { regex = "^Requests for transliteration of (.+) terms$", umbrella = "Requests for transliteration by language", template_name = "rftranslit", additional_template_description = "The {{tl|head}} template, and the large number of language-specific variants of it, automatically add " .. "the page to this category if the example is in a foreign language and no transliteration can be generated (particularly in languages without " .. "automated transliteration, such as Hebrew and Persian).", }, { regex = "^Requests for transliteration of (.+) usage examples$", umbrella = "Requests for transliteration of usage examples by language", additional_umbrella_parents = {"Usage example maintenance"}, template_name = "rftranslit", template_sample_call = "{{rftranslit|{{{language_code}}}}}", template_actual_sample_call = "{{rftranslit|{{{language_code}}}|nocat=1}}", catfix = false, additional_template_description = "The {{tl|ux}} and {{tl|uxi}} templates automatically add the page to this category if the example " .. "is in a foreign language and no transliteration can be generated (particularly in languages without automated transliteration, such as " .. "Hebrew and Persian).", }, { regex = "^Requests for transliteration of (.+) quotations$", umbrella = "Requests for transliteration of quotations by language", additional_umbrella_parents = {"Quotation maintenance"}, catfix = false, additional_template_description = "The {{tl|quote}} and {{code|<nowiki>{{quote-*}}</nowiki>}} templates automatically add the page to this category if the quotation " .. "is in a foreign language and no transliteration can be generated (particularly in languages without automated transliteration, such as " .. "Hebrew and Persian).", }, { regex = "^Requests for native script for (.+) terms$", allow_etym_lang = true, etym_parents = { {name = "Requests for native script for {{{parent_language_name}}} terms", sort = "{{{1}}}"}, {name = "Requests concerning {{{language_name}}}", sort = "native script"}, }, umbrella = "Requests for native script by language", template_name = "rfscript", template_actual_sample_call = "{{rfscript|{{{language_code}}}|nocat=1}}", catfix = false, additional_template_description = "Many templates such as {{tl|l}}, {{tl|m}} and {{tl|t}} automatically place the page in this category when they are missing the term but have been provided with a transliteration." }, { regex = "^Requests for native script in (.+) usage examples$", umbrella = "Requests for native script in usage examples by language", additional_umbrella_parents = {"Usage example maintenance"}, template_name = "rfscript", template_sample_call = "{{rfscript|{{{language_code}}}|usex=1}}", template_actual_sample_call = "{{rfscript|{{{language_code}}}|usex=1|nocat=1}}", catfix = false, additional_template_description = "The {{tl|ux}} and {{tl|uxi}} templates automatically add the page to this category if the example itself is missing but the translation is supplied." }, { regex = "^Requests for native script in (.+) quotations$", umbrella = "Requests for native script in quotations by language", additional_umbrella_parents = {"Quotation maintenance"}, template_name = "rfscript", template_sample_call = "{{rfscript|{{{language_code}}}|quote=1}}", template_actual_sample_call = "{{rfscript|{{{language_code}}}|quote=1|nocat=1}}", catfix = false, additional_template_description = "The {{tl|quote}} and {{code|<nowiki>{{quote-*}}</nowiki>}} templates automatically add the page to this category if the quotation itself is missing but the translation is supplied." }, { regex = "^Requests for (.+) script for (.+) terms$", language_name = "{{{2}}}", allow_etym_lang = true, parents = {{name = "Requests for native script for {{{language_name}}} terms", sort = "{{{1}}}"}}, etym_parents = { {name = "Requests for native script for {{{language_name}}} terms", sort = "{{{1}}}"}, {name = "Requests for {{{1}}} script for {{{parent_language_name}}} terms", sort = "{{{language_name}}}"}, {name = "Requests concerning {{{language_name}}}", sort = "{{{1}}} script"}, }, umbrella = "Requests for {{{1}}} script by language", breadcrumb = "{{{1}}}", etym_breadcrumb = "{{{1}}}", template_name = "rfscript", -- NOTE: The following is used in `template_sample_call` and `template_actual_sample_call`, meaning the -- conversion of script name to script code needs to be done using an inline function like this, instead of -- a {{#invoke:...}} template call. script_code = function(items) return script_name_to_code(items["1"]) end, template_sample_call = "{{rfscript|{{{language_code}}}|sc={{{script_code}}}}}", template_actual_sample_call = "{{rfscript|{{{language_code}}}|sc={{{script_code}}}|nocat=1}}", catfix = false, additional_template_description = "Many templates such as {{tl|l}}, {{tl|m}} and {{tl|t}} automatically place the page in this category when they are missing the term but have been provided with a transliteration." }, { regex = "^Requests for (.+) script by language$", parents = {{name = "Requests for script by language", sort = "{{{1}}}"}}, breadcrumb = "{{{1}}}", nolang = true, }, { regex = "^Requests for script by language$", nolang = true, }, { regex = "^Requests for images in (.+) entries$", umbrella = "Requests for images by language", template_name = "rfi", }, { regex = "^Requests for references for (.+) terms$", umbrella = "Requests for references by language", template_name = "rfref", }, { regex = "^Requests for references for etymologies in (.+) entries$", parents = {{name = "Requests for references for {{{language_name}}} terms", sort = "etymologies"}}, umbrella = "Requests for references for etymologies by language", breadcrumb = "Etymologies", template_name = "rfv-etym", }, { regex = "^Requests for references for pronunciations in (.+) entries$", parents = {{name = "Requests for references for {{{language_name}}} terms", sort = "pronunciations"}}, umbrella = "Requests for references for pronunciations by language", breadcrumb = "Pronunciations", template_name = "rfv-pron", }, { regex = "^Requests for attention concerning (.+)$", umbrella = "Requests for attention by language", breadcrumb = "Attention", template_name = "attention", template_sample_call = "{{attention|{{{language_code}}}|insert a brief description of the request here}}", template_example_output = "This template does not generate any text in entries, but can be visualised by enabling the Catch My Attention gadget. See {{section link|Template:attention#Visibility}}.", -- These pages typically contain a mixture of English and native-language entries, so disable catfix. catfix = false, -- Setting catfix = false will normally trigger the English table of contents template. -- We still want the native-language table of contents template, though. toc_template = "{{{language_code}}}-categoryTOC", toc_template_full = "{{{language_code}}}-categoryTOC/full", }, { regex = "^Requests for cleanup in (.+) entries$", umbrella = "Requests for cleanup by language", template_name = "rfc", template_actual_sample_call = "{{rfc|{{{language_code}}}|nocat=1}}", }, { regex = "^Requests for cleanup of Pronunciation N headers in (.+) entries$", umbrella = "Requests for cleanup of Pronunciation N headers by language", template_name = "rfc-pron-n", template_actual_sample_call = "{{rfc-pron-n|{{{language_code}}}|nocat=1}}", template_example_output = "This template does not generate any text in entries.", additional_template_description = [=[ The purpose of this category is to tag entries that use headers with "Pronunciation" and a number. While these headers and structure are sometimes used, they are not specifically prescribed by [[WT:ELE]]. No complete proposal has yet been made on how they should work, what the semantics are, or how they interact with multiple etymologies. As a result they should generally be avoided. Instead, merge the entries (possibly under multiple Etymology sections, if appropriate), and list all pronunciations, appropriately tagged, under a Pronunciation header. [[User:KassadBot|KassadBot]] tags these entries (or used to tag these entries, when the bot was operational). At some point if a proposal is made and adopted as policy, these entries should be reviewed. This category is hidden.]=], }, { regex = "^Requests for deletion in (.+) entries$", umbrella = "Requests for deletion by language", template_name = "rfd", template_actual_sample_call = "{{rfd|{{{language_code}}}|nocat=1}}", }, { regex = "^Requests for verification in (.+) entries$", umbrella = "Requests for verification by language", template_name = "rfv", }, { regex = "^Requests for attention in (.+) etymologies$", umbrella = "Requests for attention by language" }, { regex = "^Requests for quotations/(.+)$", description = "Requests for a quotation or for quotations from {{{1}}}.", parents = {{name = "Requests for quotations by source", sort = "{{{1}}}"}}, breadcrumb = "{{{1}}}", nolang = true, template_name = "rfquotek", template_sample_call = "{{rfquotek|LANGCODE|{{{1}}}}}", template_example_output = "\n(where LANGCODE is the language code of the entry)\n\nIt results in the message below:\n\n{{rfquotek|und|{{{1}}}}}", }, { regex = "^Requests for date in (.+) entries$", umbrella = "Requests for date by language", additional_umbrella_parents = {"Quotation maintenance"}, template_name = "rfdate", additional_template_description = "The quotation templates, such as {{tl|quote-book}} and {{tl|quote-journal}}, " .. "automatically add the page to this category if neither {{para|date}} nor {{para|year}} is provided. Providing the " .. "parameter in each case on the page automatically removes the article from this category. See " .. "[[Wiktionary:Quotations]] for information about formatting dates and quotations.", }, { regex = "^Requests for date/(.+)$", description = "{{rfd|section=Category:Requests for date by source}}Requests for a date for a quotation or quotations from {{{1}}}.", parents = {{name = "Requests for date by source", sort = "{{{1}}}"}}, breadcrumb = "{{{1}}}", nolang = true, template_name = "rfdatek", template_sample_call = "{{rfdatek|LANGCODE|{{{1}}}}}", template_example_output = "\n(where LANGCODE is the language code of the entry)\n\nIt results in the message below:\n\n{{rfdatek|und|{{{1}}}}}", }, { regex = "^Requests for attestation of (.+) terms$", umbrella = "Requests for attestation of terms by language", breadcrumb = "Attestation", additional_template_description = "The {{tl|LDL}} template adds this category when a language code is supplied in {{para|1}} (as it should be)." }, }) local user_competency_additional_template_description = "This is added by user-competency categories such as " .. "[[:Category:User fr-4]], which groups users who speak French at level 4 (near-native proficiency), when " .. "the native-language text indicating this fact is missing. The appropriate translation should mirror the " .. "English text also displayed (e.g. in this case \"These users speak French at a '''near native''' " .. "level.\"), and should be supplied to {{tl|auto cat}} using the {{para|text}} parameter. The mention of the " .. "language in the text should be surrounded by double angle brackets, e.g. \"&lt;&lt;français>>\", which " .. "causes it to be automatically linked to the appropriate parent category." local user_competency_parents = {{name = "Requests for translations in user-competency categories by number of users", sort = function(items) return " " .. ("%010d"):format(items["1"]) end, }} extend(requests_categories, { { regex = "^Requests for translations in user%-competency categories with ([0-9]+)%-([0-9]+) users$", description = "Requests for translation of phrases indicating user competencies for specific languages and specific competency levels, for categories with {{{1}}}-{{{2}}} users.", additional_template_description = user_competency_additional_template_description, parents = user_competency_parents, breadcrumb = "{{{1}}}-{{{2}}}", nolang = true, }, { regex = "^Requests for translations in user%-competency categories with ([0-9]+) (users?)$", description = "Requests for translation of phrases indicating user competencies for specific languages and specific competency levels, for categories with {{{1}}} {{{2}}}.", additional_template_description = user_competency_additional_template_description, parents = user_competency_parents, breadcrumb = "{{{1}}}", nolang = true, } }) table.insert(raw_handlers, function(data) local items local function init_items() items = {pagename = data.category} end local function expand_value(item, val) if not val then return val elseif is_callable(val) then return expand_value(item .. " ⇒ function", val(items)) elseif type(val) == "table" then for k, v in pairs(val) do val[k] = expand_value(item .. " ⇒ " .. k, v) end return val elseif type(val) == "number" then val = tostring(val) end if type(val) ~= "string" then error(("The item '%s' on page %s is of type %s and can't be concatenated"):format( item, items.pagename, type(val))) end -- Replaces pseudo-template code {{{ }}} with the corresponding member of the "items" table. Has to be done -- recursively, since some of the items are nested: -- {{{template_sample_call_with_temp}}} -- ⇓ -- {{{{{template_name}}}|{{{language_code}}}}} -- ⇓ -- {{attention|en}} if val:find("{{{") then val = mw.ustring.gsub(val, "{{{([^%}%{]+)}}}", function(prop) local propval = items[prop] if not propval then error(("The item '%s' (expanded from property '%s' on page %s) was not found in the 'items' table"): format(prop, item, items.pagename)) end return expand_value(item .. " ⇒ " .. prop, propval) end ) end return val end local function expand_items_value(item) return expand_value(item, items[item]) end local function convert_items_to_category_data(items) if not items.nolang then items.language_name = items.language_name or "{{{1}}}" items.language_name = expand_items_value("language_name") items.language_object = require(languages_module).getByCanonicalName(items.language_name, true, items.allow_etym_lang) items.language_code = items.language_object:getCode() items.is_etym_lang = items.language_object:hasType("etymology-only") if items.is_etym_lang then items.parent_language_object = items.language_object:getFull() -- Reject weird cases where etymology language has no parent. if not items.parent_language_object then return nil end items.parent_language_code = items.parent_language_object:getCode() items.parent_language_name = items.parent_language_object:getCanonicalName() -- Reject weird cases where the parent language has the same name as the child etymology language. In -- that case, we'll get an infinite parent-category loop. This actually happens, e.g. with Rudbari and -- Bashkardi. if items.parent_language_name == items.language_name then return nil end else end end if items.template_name then items.template_sample_call = items.template_sample_call or "{{{{{template_name}}}|{{{language_code}}}}}" items.full_text_about_the_template = "To make this request, in this specific language, use this code in the entry (see also the documentation at [[Template:{{{template_name}}}]]):\n\n<pre>{{{template_sample_call}}}</pre>" if items.template_example_output then items.full_text_about_the_template = items.full_text_about_the_template .. " " .. items.template_example_output else items.template_actual_sample_call = items.template_actual_sample_call or items.template_sample_call items.full_text_about_the_template = items.full_text_about_the_template .. "\nIt results in the message below:\n\n{{{template_actual_sample_call}}}" end if items.additional_template_description then items.full_text_about_the_template = items.full_text_about_the_template .. "\n\n" .. items.additional_template_description end else items.full_text_about_the_template = items.additional_template_description end local parents, breadcrumb if items.is_etym_lang then parents = items.etym_parents breadcrumb = expand_items_value("etym_breadcrumb") or items.language_name else parents = items.parents breadcrumb = expand_items_value("breadcrumb") end if parents then for _, parent in ipairs(parents) do parent.name = expand_value("parent.name", parent.name) parent.sort = {sort_base = expand_value("parent.sort", parent.sort), lang = "en"} end else local umbrella_type = items.pagename:match("^Requests for (.+) by language$") if umbrella_type then breadcrumb = breadcrumb or umbrella_type parents = {{name = "Request subcategories by language", sort = umbrella_type}} if items.additional_umbrella_parents then extend(parents, items.additional_umbrella_parents) end elseif not items.language_name then error("Internal error: Don't know how to compute parents for non-language-specific category '" .. items.pagename .. "'") else local requests_concerning_breadcrumb = items.pagename:gsub(" " .. pattern_escape(items.language_name), "") requests_concerning_breadcrumb = requests_concerning_breadcrumb:gsub("^Requests for ", ""):gsub(" in entries$", ""):gsub(" for terms$", "") local requests_concerning_parent = { name = "Requests concerning " .. items.language_name, sort = {sort_base = requests_concerning_breadcrumb, lang = "en"} } if items.is_etym_lang then local parent_lang_cat = items.pagename:gsub(pattern_escape(items.language_name), replacement_escape(items.parent_language_name)) parents = { {name = parent_lang_cat, sort = {sort_base = items.language_name, lang = "en"}}, requests_concerning_parent } else breadcrumb = breadcrumb or requests_concerning_breadcrumb parents = {requests_concerning_parent} end end end if not items.nolang and not items.is_etym_lang and items.umbrella ~= false then table.insert(parents, { name = expand_items_value("umbrella"), sort = {sort_base = items.language_name, lang = "en"} }) end local additional = expand_items_value("full_text_about_the_template") if items.pagename:find(" by language$") then additional = "{{{umbrella_msg}}}" .. (additional and "\n\n" .. additional or "") end return { description = expand_items_value("description") or items.pagename .. ".", lang = items.parent_language_code or items.language_code, additional = additional, parents = parents, -- If no breadcrumb= and not an etym-only language, it will default to the category name breadcrumb = breadcrumb, catfix = expand_items_value("catfix"), toc_template = expand_items_value("toc_template"), toc_template_full = expand_items_value("toc_template_full"), hidden = not items.nolang and not items.not_hidden_category, can_be_empty = true, } end -- First look for a regular (usually language or script-specific) category. for _, category in ipairs(requests_categories) do local matchvals = {mw.ustring.match(data.category, category.regex)} if #matchvals > 0 then init_items() for key, value in pairs(category) do items[key] = value end for key, value in ipairs(matchvals) do items["" .. key] = value end local catdata = convert_items_to_category_data(items) if catdata then return catdata end end end -- Now look for umbrella categories. for _, category in ipairs(requests_categories) do if data.category == category.umbrella then init_items() items.nolang = true items.additional_umbrella_parents = category.additional_umbrella_parents local catdata = convert_items_to_category_data(items) if catdata then return catdata end end end return nil end) table.insert(raw_handlers, function(data) local langname = data.category:match("^Terms with (.+) translations$") local lang = langname and require(languages_module).getByCanonicalName(langname, true, true) if lang then local langcode = lang:getCode() local parents, breadcrumb_and_first_sort_key if lang:hasType("etymology-only") then parents = { "Terms with " .. lang:getFullName() .. " translations", {name = langname, sort = "Translations"}, } breadcrumb_and_first_sort_key = lang:getCanonicalName() else parents = { {name = "entry maintenance", is_label = true, lang = langcode}, { name = "Terms with translations by language", sort = {sort_base = langname, lang = "en"} }, } breadcrumb_and_first_sort_key = "Translations" end return { description = "Entries that contain translations into " .. langname .. " which were added using one of the translation templates, such as {{tl|t|" .. langcode .. "|...}}, {{tl|t+|" .. langcode .. "|...}}, etc.", parents = parents, breadcrumb_and_first_sort_key = breadcrumb_and_first_sort_key, catfix = false, can_be_empty = true, hidden = true, } end end) local recognized_taxtypes = require(table_module).listToSet { "ambiguous", "binomial", "branch", "clade", "cladus", "class", "cohort", "convariety", "cultivar group", "cultivar", "division", "empire", "epifamily", "epithet", "family", "form taxon", "form", "genus", "grade", "grandorder", "group", "hybrid", "informal group", "infraclass", "infracohort", "infrakingdom", "infraorder", "infraphylum", "infraspecies", "kingdom", "magnorder", "megacohort", "mirorder", "morph", "nothogenus", "nothospecies", "nothosubspecies", "nothovariety", "obsolete", "oofamily", "order", "parvclass", "parvorder", "phylum", "section", "series", "serovar", "species group", "species", "stem", "stirps", "strain", "subclass", "subcohort", "subdivision", "subfamily", "subgenus", "subgroup", "subinfraorder", "subkingdom", "suborder", "subphylum", "subsection", "subspecies", "subterclass", "subtribe", "superclass", "supercohort", "superfamily", "supergroup", "superorder", "superphylum", "supertribe", "taxon", "tribe", "trinomial", "undescribed species", "unknown", "unranked group", "variety", "virus complex", } table.insert(raw_handlers, function(data) local taxtype = data.category:match("^Entries using missing taxonomic name %((.*)%)$") if taxtype and recognized_taxtypes[taxtype] then return { description = "Entries that link to wikispecies because there is no corresponding Wiktionary entry for the taxonomic name in the template {{tl|taxlink}}.", additional = "The missing name is one or more of those enclosed in {{tl|taxlink}}. The entries are sorted by the missing taxonomic name.", parents = {{name = "Entries using missing taxonomic names", sort = {sort_base = taxtype, lang = "en"}}}, breadcrumb = taxtype, hidden = true, } end end) return {LABELS = labels, RAW_CATEGORIES = raw_categories, RAW_HANDLERS = raw_handlers} ovy8bjegcqic9ds39g3cox2dyck130i 487851 487807 2026-09-02T20:16:51Z SM7 6218 "Fundamental" 487851 Scribunto text/plain local labels = {} local raw_categories = {} local raw_handlers = {} local functions_module = "Module:fun" local languages_module = "Module:languages" local scripts_module = "Module:scripts" local string_pattern_escape_module = "Module:string/patternEscape" local string_replacement_escape_module = "Module:string/replacementEscape" local table_module = "Module:table" local extend = require(table_module).extend local is_callable = require(functions_module).is_callable local pattern_escape = require(string_pattern_escape_module) local replacement_escape = require(string_replacement_escape_module) local unpack = unpack or table.unpack -- Lua 5.2 compatibility ----------------------------------------------------------------------------- -- -- -- LABELS -- -- -- ----------------------------------------------------------------------------- labels["प्रविष्टि रखरखाव"] = { description = "{{{langname}}} entries, or entries in other languages containing {{{langname}}} terms, that are being tracked for attention and improvement by editors.", parents = {{name = "{{{langcat}}}", raw = true}}, umbrella_parents = "मूलभूत श्रेणी", } labels["entries with incorrect language header"] = { description = "{{{langname}}} entries that have been placed under the wrong language header.", additional = "This can happen for several reasons:\n" .. "* Typos.\n" .. "* Vandalism.\n" .. "* Using the wrong language code.\n" .. "* Using an alternative name for the language.\n" .. "* Using special characters which haven't been used in the name given in the language data modules.", parents = {"entry maintenance"}, can_be_empty = true, hidden = true, } labels["entries without References header"] = { description = "{{{langname}}} entries without a References header.", parents = {"entry maintenance"}, can_be_empty = true, hidden = true, } labels["entries without References or Further reading header"] = { description = "{{{langname}}} entries without a References or Further reading header.", parents = {"entry maintenance"}, can_be_empty = true, hidden = true, } labels["entries that don't exist"] = { description = "{{{langname}}} terms that do not meet the [[Wiktionary:Criteria for inclusion|criteria for inclusion]] (CFI). They are added to the category with the template {{tl|no entry|{{{langcode}}}}}.", parents = {"entry maintenance"}, umbrella_parents = "मूलभूत श्रेणी", } labels["entries with etymology trees"] = { description = "{{{langname}}} entries that display an etymology tree generated by the template {{tl|etymon}}.", parents = {"entry maintenance"}, can_be_empty = true, hidden = true, } labels["entries with etymology texts"] = { description = "{{{langname}}} entries that display an etymology generated by the template {{tl|etymon}}.", parents = {"entry maintenance"}, can_be_empty = true, hidden = true, } labels["entries with etymon"] = { description = "{{{langname}}} entries that use the template {{tl|etymon}}.", parents = {"entry maintenance"}, can_be_empty = true, hidden = true, } labels["entries with etymology text stop language not in chain"] = { description = "{{{langname}}} entries where {{tl|etymon}} is used with {{para|text}} set to stop at a language but that language never appears in the rendered etymology chain.", parents = {"entry maintenance"}, can_be_empty = true, hidden = true, } labels["entries referencing missing etymons"] = { description = "Entries which use the {{tl|etymon}} template to reference an etymon that cannot be found, either because the target page does not exist (redlink) or because it has no {{tl|etymon}} template.", parents = {"entry maintenance"}, can_be_empty = true, hidden = true, } labels["entries referencing ambiguous etymons"] = { description = "Entries which use the {{tl|etymon}} template to reference an etymon without the ID, when the target page contains multiple {{tl|etymon}} templates, and an ID is therefore required to select the correct {{tl|etymon}}.", parents = {"entry maintenance"}, can_be_empty = true, hidden = true, } labels["entries referencing etymons with mismatched IDs"] = { description = "Entries which use the {{tl|etymon}} template with a mismatched ID. For example, {{code|lang:entry<id:mismatched ID>}}", parents = {"entry maintenance"}, can_be_empty = true, hidden = true, } labels["entries referencing pages with multiple etymons missing IDs"] = { description = "Entries which use the {{tl|etymon}} template to link to a page that has more than one {{tl|etymon}} template for the same language, where at least one of those templates has no {{para|id}}. When several {{tl|etymon}} templates share a language section, each must have a distinct {{para|id}} so that links and descendants logic can tell them apart.", parents = {"entry maintenance"}, can_be_empty = true, hidden = true, } labels["entries referencing pages with etymology sections missing etymons"] = { description = "Entries which use the {{tl|etymon}} template to link to a page that has more than one etymology section for the same language, where at least one section contains a {{tl|etymon}} template for that language and at least one other etymology section does not.", parents = {"entry maintenance"}, can_be_empty = true, hidden = true, } labels["entries referencing etymons without Descendants sections"] = { description = "Entries which use the {{tl|etymon}} template to reference an etymon whose source entry has no Descendants section.", parents = {"entry maintenance"}, can_be_empty = true, hidden = true, } labels["entries referencing etymons without this term in Descendants sections"] = { description = "Entries which use the {{tl|etymon}} template to reference an etymon whose source entry has a Descendants section, but does not list the current term there.", parents = {"entry maintenance"}, can_be_empty = true, hidden = true, } labels["entries with language name categories using raw markup"] = { description = "{{{langname}}} entries that have been placed in a language name category using raw wiki markup (i.e. {{code|[[<nowiki/>Category:{{{langname}}} ...]]}}). They should be added using {{tl|cln|{{{langcode}}}|...}} instead.", parents = {"entry maintenance"}, can_be_empty = true, hidden = true, } labels["entries with topic categories using raw markup"] = { description = "{{{langname}}} entries that have been placed in a topic category using raw wiki markup (i.e. {{code|[[<nowiki/>Category:{{{langcode}}}:...]]}}). They should be added using {{tl|C|{{{langcode}}}|...}} instead.", parents = {"entry maintenance"}, can_be_empty = true, hidden = true, } labels["entries with outdated source"] = { description = "{{{langname}}} entries that have been partly or fully imported from an outdated source.", parents = {"entry maintenance"}, } labels["entries with inflection not matching pagename"] = { description = "{{{langname}}} entries which have an inflection table whose lemma form does not match the page name.", additional = "This is usually the result of incorrect or missing parameters.", breadcrumb_and_first_sort_key = "inflection not matching pagename", parents = {"entry maintenance"}, hidden = true, can_be_empty = true, } labels["undefined derivations"] = { description = "{{{langname}}} etymologies using {{tl|undefined derivation}}, where a more specific template such as {{tl|borrowed}} or {{tl|inherited}} should be used instead.", parents = {"entry maintenance"}, can_be_empty = true, hidden = true, } labels["descendants to be fixed in desctree"] = { description = "Entries that use {{tl|desctree}} to link to {{{langname}}} entries with no Descendants section.", parents = {"entry maintenance"}, can_be_empty = true, hidden = true, } labels["term requests"] = { description = "Entries with [[Template:der]], [[Template:inh]], [[Template:m]] and similar templates lacking the parameter for linking to {{{langname}}} terms.", parents = {"entry maintenance"}, can_be_empty = true, hidden = true, } labels["redlinks"] = { description = "Links to {{{langname}}} entries that have not been created yet.", parents = {"entry maintenance"}, catfix = false, can_be_empty = true, hidden = true, } labels["terms with IPA pronunciation"] = { description = "{{{langname}}} terms that include the pronunciation in the form of IPA.", additional = "For requests related to this category, see [[:Category:Requests for pronunciation in {{{langname}}} entries]].", parents = {"entry maintenance"}, } labels["terms with enPR pronunciation"] = { description = "{{{langname}}} terms that include the pronunciation in the form of enPR.", additional = "For requests related to this category, see [[:Category:Requests for pronunciation in {{{langname}}} entries]].", parents = {"entry maintenance"}, } labels["terms with Indic pronunciation"] = { description = "{{langname}} terms that include the pronunciation in the form of ISO 15919.", additional = "For requests related to this category, see [[:Category:Requests for pronunciation in {{{langname}}} entries]].", parents = {"entry maintenance"}, } labels["IPA pronunciations with invalid separators"] = { description = "{{{langname}}} terms with IPA using invalid separators such as /.ˈ/, /.ˌ/, a dot followed by primary or secondary stress; or /ˈ / or /ˌ /, primary or secondary stress followed by a space.", parents = {"entry maintenance"}, can_be_empty = true, hidden = true, } labels["terms with hyphenation"] = { description = "{{{langname}}} terms that include hyphenation.", parents = {"entry maintenance"}, } labels["terms with audio pronunciation"] = { description = "{{{langname}}} terms that include the pronunciation in the form of an audio file.", additional = "For requests related to this category, see [[:Category:Requests for audio pronunciation in {{{langname}}} entries]].", parents = {"entry maintenance"}, } labels["terms with nonstandard or incorrect audio pronunciations"] = { description = "{{{langname}}} terms which have been tagged as having pronunciations which are nonstandard or incorrect.", parents = {"terms with audio pronunciation"}, can_be_empty = true, hidden = true, } labels["entries missing Template:reconstructed"] = { description = "Reconstructed {{{langname}}} entries which do not have the {{tl|reconstructed}} template.", parents = {"entry maintenance"}, can_be_empty = true, hidden = true, } local function add_manual_param_category(label, desc, addl_intro, include_addl_continuation) labels[label] = { description = desc or "Pages containing {{{langname}}} " .. label .. ".", additional = addl_intro .. (not include_addl_continuation and "" or "\n\n" .. "Note that the pages in this category are not necessarily the same as the actual term in question. This " .. "frequently happens, for example, with English pages with translation sections, where the term that " .. "triggers the addition of the category is one of the translations."), parents = {"entry maintenance"}, -- Set catfix = false because the page will have a mixture of native-language and -- non-native-language pages, but include the normal native-language table of contents headers -- because most pages are in the native language. catfix = false, toc_template = "{{{langcode}}}-categoryTOC", toc_template_full = "{{{langcode}}}-categoryTOC/full", can_be_empty = true, hidden = true, } end add_manual_param_category("terms in nonstandard scripts", nil, "Pages are placed here if they contain terms written in a script that isn't in the language's " .. "list of scripts in the language data. This may mean the script should be added to the list, or that the wrong language code has been used.", true) add_manual_param_category("terms with non-redundant manual transliterations", nil, "Pages are placed here if they contain terms whose transliteration has been specified manually using " .. "{{para|tr}} or a similar parameter and is different from the transliteration which is automatically generated.", true) add_manual_param_category("terms with redundant transliterations", nil, "Pages are placed here if they contain terms whose transliteration has been specified manually using " .. "{{para|tr}} or a similar parameter and is the same as the transliteration which is automatically generated.", true) add_manual_param_category("terms with non-redundant manual script codes", nil, "Pages are placed here if they contain terms whose script code has been specified manually using " .. "{{para|sc}} or a similar parameter and is different from the script code which is automatically generated.", true) add_manual_param_category("terms with redundant script codes", nil, "Pages are placed here if they contain terms whose script code has been specified manually using " .. "{{para|sc}} or a similar parameter and is the same as the script code which is automatically generated.", true) add_manual_param_category("terms with non-redundant non-automated sortkeys", "{{{langname}}} terms with non-redundant non-automated sortkeys.", "Terms are placed here if they have been sorted using a sortkey other than the one which is automatically " .. "generated. This can happen for two reasons:\n# A different sortkey has been specified using the {{para|sort}} " .. "parameter.\n# One or more categories have been added using raw wikitext, which means the page's default " .. "sortkey is used for that category. If that default sortkey is different from the automatic sortkey, then the " .. "page will also be added here.") add_manual_param_category("terms with redundant sortkeys", "{{{langname}}} terms with redundant sortkeys.", "Terms are placed here if their sortkey has been specified using the {{para|sort}} parameter, and it the same " .. "as the one which is automatically generated.") add_manual_param_category("links with redundant target parameters", "Pages containing {{{langname}}} links where the alt text could replace the link target, instead of being given " .. "separately.", "This occurs when the only difference between the link target and the alt text is that the alt text contains " .. "diacritics (or other characters) which would have been ignored anyway had they been included in the link " .. "target. For example, {{tl|l|la|amo|amō}} ({{l|la|amo|amō}}) is exactly the same as {{tl|l|la|amō}} " .. "({{l|la|amō}}), because macrons are automatically stripped from Latin link targets, even though they're still " .. "displayed.") add_manual_param_category("links with ignored alt parameters", "Pages containing {{{langname}}} links where the {{para|alt}} parameter has been ignored.", "This occurs when the main linked text includes a wikilink.") add_manual_param_category("links with redundant alt parameters", "Pages containing {{{langname}}} links where the {{para|alt}} parameter is redundant.", "This occurs when the alt text makes no difference to the output. For example, {{tl|l|en|foo|foo}} " .. "({{l|en|foo|foo}}) is exactly the same as {{tl|l|en|foo}} ({{l|en|foo}}).") add_manual_param_category("links with ignored id parameters", "Pages containing {{{langname}}} links where the {{para|id}} parameter has been ignored.", "This occurs when the main linked text includes a wikilink.") add_manual_param_category("links with redundant wikilinks", "Pages containing {{{langname}}} links which contain a redundant wikilink.", "This occurs if link target consists of a single wikilink, which should instead be entered in the " .. "conventional manner without link brackets. For example, {{tl|l|en|<nowiki>[[foo]]</nowiki>}} " .. "is the same as {{tl|l|en|foo}}, and {{tl|l|en|<nowiki>[[foo|bar]]</nowiki>}} is the same as " .. "{{tl|l|en|foo|bar}}.\n\nThis also occurs when link templates are nested inside each other " .. "unnecessarily: e.g. {{tl|l|en|{{tl|l|en|foo}}}}") add_manual_param_category("links with manual fragments", "Pages containing {{{langname}}} links where a manual link fragment has been given.", "This occurs when the link fragment has been specified using {{code|#}} after the term, " .. "which overrides the normal fragment generated by link templates that points to the relevant " .. "language section.\n\nLink fragments are used to point to a specific section on a target page, and " .. "it is preferable to use the {{para|id}} parameter to do this, since it is less likely to break if " .. "additional content is added to the target page: for example, the fragment {{code|#Adjective}} " .. "will start pointing to the wrong section if another language with an adjective section is added above " .. "the intended language.") labels["descendant hubs"] = { description = "{{{langname}}} terms that do not mean more than the sum of their parts but exist for listing two or more inclusion-worthy descendants.", parents = {"entry maintenance"}, } labels["terms needing to be assigned to a sense"] = { description = "{{{langname}}} entries that have terms under headers such as \"Synonyms\" or \"Antonyms\" not assigned to a specific sense of the entry in which they appear. Use [[Template:syn]] or [[Template:ant]] to fix these.", parents = {"entry maintenance"}, can_be_empty = true, hidden = true, } --[=[ labels["terms with inflection tables"] = { description = "{{{langname}}} entries that contain inflection tables.". additional = "For requests related to this category," see [[:Category:Requests for inflections in {{{langname}}} entries]].", parents = {"entry maintenance"}, } ]=] labels["terms with collocations"] = { description = "{{{langname}}} entries that contain [[collocation]]s that were added using templates such as {{tl|co}}.", additional = "For requests related to this category, see [[:Category:Requests for collocations in {{{langname}}}]]. See also [[:Category:Requests for quotations in {{{langname}}}]] and [[:Category:Requests for example sentences in {{{langname}}}]].", parents = {"entry maintenance"}, umbrella_parents = "Collocation maintenance", } labels["terms with usage examples"] = { description = "{{{langname}}} entries that contain usage examples that were added using templates such as {{tl|ux}}.", additional = "For requests related to this category, see [[:Category:Requests for example sentences in {{{langname}}}]]. See also [[:Category:Requests for collocations in {{{langname}}}]] and [[:Category:Requests for quotations in {{{langname}}}]].", parents = {"entry maintenance"}, umbrella_parents = "Usage example maintenance", } labels["terms with quotations"] = { description = "{{{langname}}} entries that contain quotes that were added using templates such as {{tl|quote}}, {{tl|quote-book}}, {{tl|quote-journal}}, etc.", additional = "For requests related to this category, see [[:Category:Requests for quotations in {{{langname}}}]]. See also [[:Category:Requests for example sentences in {{{langname}}}]].", parents = {"entry maintenance"}, umbrella_parents = "Quotation maintenance", } labels["terms with interlinear glossed text"] = { description = "{{{langname}}} entries that contain interlinear glossed text added using {{tl|interlinear}}.", parents = {"entry maintenance"}, } labels["terms with redundant head parameter"] = { description = "{{{langname}}} terms that contain a redundant head= parameter in their headword (called using {{tl|head}} or a language-specific equivalent).", additional = "Individual languages can prevent terms from being added to this category by setting `data.no_redundant_head_cat`.", parents = {"entry maintenance"}, can_be_empty = true, hidden = true, } labels["terms with red links in their headword lines"] = { description = "{{{langname}}} terms that contain red links (i.e. uncreated forms) in their headword lines.", parents = {"redlinks"}, can_be_empty = true, hidden = true, } labels["terms with red links in their inflection tables"] = { description = "{{{langname}}} terms that contain red links (i.e. uncreated forms) in their inflection tables.", parents = {"redlinks"}, can_be_empty = true, hidden = true, } labels["requests for English equivalent term"] = { description = "{{{langname}}} entries with definitions that have been tagged with {{tl|rfeq}}. Read the documentation of the template for more information.", parents = {"entry maintenance"}, can_be_empty = true, hidden = true, } for _, quot_type in ipairs { "quotations", "usage examples" } do local umbrella_parent = quot_type == "quotations" and "Quotation maintenance" or "Usage example maintenance" labels[quot_type .. " with omitted translation"] = { description = "{{{langname}}} " .. quot_type .. " where a translation would normally be required but the translation has explicitly been omitted by specifying {{code|-}}. The translation should be supplied instead.", parents = {"entry maintenance"}, umbrella = { parents = {name = umbrella_parent, sort = "omitted translation"}, breadcrumb = "with omitted translation", }, can_be_empty = true, hidden = true, } end for _, pos in ipairs({"nouns", "proper nouns", "verbs", "adjectives", "adverbs", "participles", "determiners", "pronouns", "numerals", "suffixes", "contractions"}) do labels[pos .. " with red links in their headword lines"] = { description = "{{{langname}}} " .. pos .. " that contain red links (i.e. uncreated forms) in their headword lines.", parents = {"terms with red links in their headword lines"}, breadcrumb = pos, can_be_empty = true, hidden = true, } labels[pos .. " with red links in their inflection tables"] = { description = "{{{langname}}} " .. pos .. " that contain red links (i.e. uncreated forms) in their inflection tables.", parents = {"terms with red links in their inflection tables"}, breadcrumb = pos, can_be_empty = true, hidden = true, } end for _, pos in ipairs { "nouns", "proper nouns", "pronouns" } do local label = pos .. " with unknown or uncertain plurals" labels[label] = { description = "{{{langname}}} " .. label .. ".", additional = "Terms are usually added to this category by specifying {{code|?}} as the plural. As much " .. "is possible, a plural should be added or, if the noun is uncountable, indicated appropriately (usually " .. "using {{code|-}} in place of the plural). Some languages support the value {{code|!}} to indicate " .. "that a plural cannot be attested but the noun is theoretically countable.", breadcrumb = "with unknown or uncertain plurals", parents = { {name = pos, sort = "unknown or uncertain plurals"}, "entry maintenance", }, } end -- Add 'umbrella_parents' key if not already present. for _, data in pairs(labels) do if data.umbrella == nil and data.umbrella_parents == nil then data.umbrella_parents = "Entry maintenance subcategories by language" end end ----------------------------------------------------------------------------- -- -- -- RAW CATEGORIES -- -- -- ----------------------------------------------------------------------------- raw_categories["Entry maintenance subcategories by language"] = { description = "Umbrella categories covering topics related to entry maintenance.", additional = "{{{umbrella_meta_msg}}}", parents = { "Umbrella metacategories", {name = "entry maintenance", is_label = true, sort = " "}, }, } raw_categories["Citation maintenance"] = { description = "Categories for maintaining citations specified using {{tl|cite-*}}.", parents = {"Wiktionary maintenance"}, breadcrumb = "citations", } raw_categories["Collocation maintenance"] = { description = "Categories for maintaining collocations specified using {{tl|co}}, {{tl|coi}} or {{tl|coa}}.", parents = {"Wiktionary maintenance"}, breadcrumb = "collocations", } raw_categories["Quotation maintenance"] = { description = "Categories for maintaining quotations specified using {{tl|quote-*}}.", parents = {"Wiktionary maintenance"}, breadcrumb = "quotations", } raw_categories["Usage example maintenance"] = { description = "Categories for maintaining usage examples specified using {{tl|ux}}, {{tl|uxi}} or {{tl|uxa}}.", parents = {"Wiktionary maintenance"}, breadcrumb = "usage examples", } raw_categories["Citations using nocat parameter"] = { description = "Instances of {{tl|cite-*}} templates using the {{para|nocat}} parameter, which should be eliminated (?).", parents = {{name = "Citation maintenance", sort = "nocat"}}, breadcrumb = "using nocat parameter", can_be_empty = true, hidden = true, } raw_categories["Quotation templates to be cleaned"] = { description = "Instances of quotations using {{tl|quote-text}}.", additional = "They should be converted to other '''[[:Category:Citation templates|quotation templates]]''' if relevant.", parents = {"Quotation maintenance"}, breadcrumb_base = "to be cleaned", can_be_empty = true, hidden = true, } raw_categories["Quotations using nocat parameter"] = { description = "Instances of {{tl|quote-*}} templates using the {{para|nocat}} parameter, which should be eliminated (?).", parents = {{name = "Quotation maintenance", sort = "nocat"}}, breadcrumb = "using nocat parameter", can_be_empty = true, hidden = true, } raw_categories["Quotations using quoted-in parameter"] = { description = "Instances of {{tl|quote-*}} templates using the {{para|quoted_in}} parameter.", additional = "It is recommended to restructure these template calls using the {{para|newversion}} parameter along with associated parameters {{para|2ndauthor}}, {{para|title2}}, {{para|year2}}, {{para|publisher2}} and the like, as described in the documentation for {{tl|quote-book}}.", parents = {{name = "Quotation maintenance", sort = "quoted-in"}}, breadcrumb = "using quoted-in parameter", can_be_empty = true, hidden = true, } raw_categories["Requests"] = { topright = "{{shortcut|WT:CR|WT:RQ}}", description = "A parent category for the various request categories.", parents = {"Category:Wiktionary"}, } raw_categories["Requests by language"] = { description = "Categories with requests in various specific languages.", additional = "{{{umbrella_msg}}}", parents = { {name = "Request subcategories by language", sort = " "}, {name = "Requests", sort = " "}, }, breadcrumb = "By language", } raw_categories["Request subcategories by language"] = { description = "Umbrella categories covering topics related to requests.", additional = "{{{umbrella_meta_msg}}}", parents = { "Umbrella metacategories", {name = "Requests", sort = " "}, }, } raw_categories["Requests for quotations by source"] = { description = "Categories with requests for quotation, broken out by the source of the quotation.", additional = "Some abbreviated names of sources are explained at [[Wiktionary:Abbreviated Authorities in Webster]].", parents = {{name = "Requests for quotations", sort = "source"}}, breadcrumb = "By source", } raw_categories["Requests for quotations"] = { -- FIXME description = "Words are added to this category by the inclusion in their entries of {{tl|rfv-quote}}.", parents = {{name = "Requests", sort = "quotations"}, "Quotation maintenance"}, breadcrumb = "Quotations", } raw_categories["Requests for date"] = { description = "Requests for a date to be added to a quotation.", additional = "To add an article to this category, use {{tl|rfdate}} or {{tl|rfdatek}} to include the author. " .. "Please remove the template from the article once the date has been provided.", parents = {{name = "Requests", sort = "date"}, "Quotation maintenance"}, breadcrumb = "Date", } raw_categories["Requests for translations in user-competency categories by number of users"] = { description = "Requests for translations to be added to user-competency categories, sorted by number of users with that competency.", parents = {{name = "Requests", sort = "translations in user-competency categories by number of users"}}, breadcrumb = "Translations in user-competency categories by number of users", } raw_categories["Requests for translations in user-competency categories by language"] = { description = "Requests for translations to be added to user-competency categories, sorted by language.", parents = {{name = "Requests", sort = "translations in user-competency categories by language"}}, breadcrumb = "Translations in user-competency categories by language", hidden = true, } raw_categories["Terms with translations by language"] = { description = "Terms with translations, sorted by language.", parents = {{name = "Entry maintenance subcategories by language", sort = "translations by language"}}, breadcrumb = "Translations", } raw_categories["Entries using missing taxonomic names"] = { description = "Entries that link to wikispecies because there is no corresponding Wiktionary entry for the taxonomic name in the template {{tl|taxlink}}.", additional = "The missing name is one or more of those enclosed in {{tl|taxlink}}. The entries are sorted by the missing taxonomic name." .. "\n\nSee [[:Category:mul:Taxonomic names]].", parents = {{name = "entry maintenance", is_label = true, lang = "mul", sort = "missing taxonomic names"}}, breadcrumb = "Missing taxonomic names", hidden = true, } ----------------------------------------------------------------------------- -- -- -- RAW HANDLERS -- -- -- ----------------------------------------------------------------------------- local function script_name_to_code(name) local sc = require(scripts_module).getByCanonicalName(name) if not sc then error("Unrecognized script name '" .. name .. "'") end return sc:getCode() end --[=[ This array consists of category match specs. Each spec contains one or more properties, whose values are (a) strings that may contain references to other properties using the {{{PROPERTY}}} syntax; (b) functions of one argument, an `items` table of the same properties that are accessible using the {{{PROPERTY}} syntax. Each such spec should have at least a `regex` property that matches the name of the category. Capturing groups in this regex can be referenced in other properties using {{{1}}} for the first group, {{{2}}} for the second group, etc. (or using keys "1", "2", etc. in functions). Property expansion happens recursively if needed (i.e. a property can reference another property, which in turn references a third property). If there is a `language_name` propery, it specifies the language name (and will typically be a reference to a capturing group from the `regex` property); if not specified, it defaults to "{{{1}}}" unless the `nolang` property is set, in which case there is no language name associated with the category name. The language name must be the canonical name of a recognized full language, or an error is thrown; however, if the `allow_etym_lang` property is set, the language name may also be the canonical name of an etymology-only language. Based on the language name, the `language_code` and `language_object` properties are automatically filled in. If `language_name` is an etymology-only language, additional properties `parent_language_name`, `parent_language_code` and `parent_language_object` are set for the parent full language of the etymology-only language. If the `regex` values of multiple category specs match, the first one takes precedence. Recognized or predefined properties: `pagename`: Current pagename. `regex`: See above. `1`, `2`, `3`, ...: See above. `language_name`, `language_code`, `language_object`: See above. `parent_language_name`, `parent_language_code`, `parent_language_object`: See above. `nolang`: See above. `allow_etym_lang`: Language names may be etymology-only languages. See above. `description`: Override the description (normally taken directly from the pagename). `template_name`: Name of template which generates this category. `template_sample_call`: Syntax for calling the template. Defaults to "{{{template_name}}}|{{{language_code}}}". Used to display an example template call and the output of this call. `template_actual_sample_call`: Syntax for calling the template. Takes precedence over `template_sample_call` when generating example template output (but not when displaying an example template call) and is intended for a template call that uses the |nocat=1 parameter. `template_example_output`: Override the text that displays example template output (see `template_sample_call`). `additional_template_description`: Extra text to be displayed after the example template output. `parents`: Parent categories. Should be a list of elements, each of which is an object containing at least a name= and sort= field (same format as parents= for regular raw categories, except that the name= and sort= field will have {{{PROPERTY}}} references expanded). If no parents are specified, and the pagename is of the form "Requests for FOO by language", the parents will be "Request subcategories by language" with FOO as the sort key, along with any parents specified in `additional_umbrella_parents`. Otherwise, the `language_name` property must exist, and the parent will be "Requests concerning LANGNAME", with the pagename minus any initial "Requests for " as the sort key. Note that this does *NOT* apply if an etymology-only language is associated with the category, in which case `etym_parents` is used instead. `etym_parents`: Parent categories for categories with associated etymology-only languages. The format is the same as `parents`. If omitted, there are two parents by default: (1) The pagename (i.e. category name) with the language name replaced by the corresponding parent language name, with the value of `language_name` as the sort key; (2) "Requests concerning LANGNAME", with the pagename minus any initial "Requests for " as the sort key. `umbrella`: Parent all-language category. Sort key is based on the language name. This applies *ONLY* if a full language is associated with the category name (i.e. not if `nolang` is set or if `allow_etym_lang` is set and the associated language is an etymology-only language); otherwise there will be no umbrella category. `additional_umbrella_parents`: Additional parents to add to the umbrella (all-language) category along with "Request subcategories by language". `breadcrumb`: Specify the breadcrumb. If `parents` is given, there is no default (i.e. it will end up being the pagename). Otherwise, if the pagename is of the form "Requests for FOO by language", the default breadcrumb will be "FOO". Otherwise it is computed by removing the language name from the pagename and chopping out "Requests for" from the beginning and "in entries" and "for terms" from the end. Note that this does *NOT* apply if an etymology-only language is associated with the category, in which case `etym_breadcrumb` is used instead. `etym_breadcrumb`: Specify the breadcrumb for categories with associated etymology-only languages. Defaults to the value of `language_name`. `not_hidden_category`: Don't hide the category. `catfix`: Same as `catfix` in regular labels and raw categories, except that request-specific {{{PROPERTY}}} syntax is expanded. `toc_template`, `toc_template_full`: Same as the corresponding fields in regular labels and raw categories, except that request-specific {{{PROPERTY}}} syntax is expanded. In general, properties can contain references to templates (e.g. {{tl}} and {{para}}), which will be appropriately expanded (this expansion happens in the poscatboiler code, not in this module). The major exception is in the `template_sample_call` and `template_actual_sample_call` properties, which are surrounded by <pre>...</pre> when inserted, so template references are not expanded. Triple-brace property references are still expanded in these properties; but beware that if any of those property references contain template references, they won't be expanded. (This actually happens in the handlers for 'Request for SCRIPT script for LANG terms'; the sample call references {{{script_code}}}, whose definition therefore cannot contain template references. The solution is to define this property using a function.) ]=] local requests_categories = { { regex = "^Requests concerning (.+)$", allow_etym_lang = true, description = "Categories with {{{1}}} entries that need the attention of experienced editors.", parents = {{name = "entry maintenance", is_label = true, sort = "requests"}}, etym_parents = {{name = "Requests concerning {{{parent_language_name}}}", sort = "{{{1}}}"}, {name = "{{{1}}}", sort = "Requests"}}, umbrella = "Requests by language", breadcrumb = "Requests", not_hidden_category = true, }, { regex = "^Requests for etymologies in (.+) entries$", allow_etym_lang = true, umbrella = "Requests for etymologies by language", template_name = "rfe", }, { regex = "^Requests for expansion of etymologies in (.+) entries$", umbrella = "Requests for expansion of etymologies by language", template_name = "etystub", }, { regex = "^Requests for pronunciation in (.+) entries$", umbrella = "Requests for pronunciation by language", template_name = "rfp", }, { regex = "^Requests for audio pronunciation in (.+) entries$", umbrella = "Requests for audio pronunciation by language", template_name = "rfap", }, { regex = "^Requests for definitions in (.+) entries$", umbrella = "Requests for definitions by language", template_name = "rfdef", }, { regex = "^Requests for clarification of definitions in (.+) entries$", umbrella = "Requests for clarification of definitions by language", template_name = "rfclarify", }, } for _, spec_with_pos in ipairs { {"inflections", "rfinfl"}, {"plural forms"}, {"tone", "rftone"}, {"accents"}, {"aspect", "rfaspect"}, {"animacy"}, {"gender", "rfgender"}, {"noun class"}, } do local property, rftemplate = unpack(spec_with_pos) table.insert(requests_categories, { -- This is for part-of-speech-specific categories such as -- "Requests for inflections in Northern Ndebele noun entries" or -- "Requests for accents in Ukrainian proper noun entries". -- Here and below, we assume that the part of speech is begins with -- a lowercase letter, while the preceding language name ends in a -- capitalized word. Note that this entry comes before the -- following one and takes precedence over it. regex = ("^Requests for %s in (.-) ([a-z]+[a-z ]*) entries$"):format(property), parents = {{name = ("Requests for %s in {{{language_name}}} entries"):format(property), sort = "{{{2}}}"}}, umbrella = ("Requests for %s of {{pluralize|{{{2}}}}} by language"):format(property), breadcrumb = "{{{2}}}", template_name = rftemplate, template_sample_call = rftemplate and ("{{%s|{{{language_code}}}|{{{2}}}}}"):format(rftemplate) or nil, } ) table.insert(requests_categories, { regex = ("^Requests for %s in (.+) entries$"):format(property), umbrella = ("Requests for %s by language"):format(property), template_name = rftemplate, } ) table.insert(requests_categories, { regex = ("^Requests for %s of (.+) by language$"):format(property), nolang = true, } ) end extend(requests_categories, { { regex = "^Requests for example sentences in (.+)$", umbrella = "Requests for example sentences by language", template_name = "rfex", }, { regex = "^Requests for quotations in (.+)$", umbrella = "Requests for quotations by language", additional_umbrella_parents = {"Quotation maintenance"}, template_name = "rfquote", }, { regex = "^Requests for translations into (.+)$", allow_etym_lang = true, umbrella = "Requests for translations by language", template_name = "t-needed", catfix = "en", }, { regex = "^Requests for translations of (.+) usage examples$", allow_etym_lang = true, umbrella = "Requests for translations of usage examples by language", additional_umbrella_parents = {"Usage example maintenance"}, template_name = "t-needed", template_sample_call = "{{t-needed|{{{language_code}}}|usex}}", template_actual_sample_call = "{{t-needed|{{{language_code}}}|usex|nocat=1}}", additional_template_description = "The {{tl|ux}}, {{tl|uxi}}, {{tl|ja-usex}} and {{tl|zh-x}} templates automatically add the page to this category if the example is in a foreign language and the translation is missing." }, { regex = "^Requests for translations of (.+) quotations$", allow_etym_lang = true, umbrella = "Requests for translations of quotations by language", additional_umbrella_parents = {"Quotation maintenance"}, template_name = "t-needed", template_sample_call = "{{t-needed|{{{language_code}}}|quote}}", template_actual_sample_call = "{{t-needed|{{{language_code}}}|quote|nocat=1}}", additional_template_description = "The {{tl|quote}}, and {{tl|Q}} templates automatically add the page to this category if the example is in a foreign language and the translation is missing." }, { regex = "^Requests for review of (.+) translations$", allow_etym_lang = true, umbrella = "Requests for review of translations by language", template_name = "t-check", template_sample_call = "{{t-check|{{{language_code}}}|example}}", template_example_output = "", catfix = "en", }, { regex = "^Requests for transliteration of (.+) terms$", umbrella = "Requests for transliteration by language", template_name = "rftranslit", additional_template_description = "The {{tl|head}} template, and the large number of language-specific variants of it, automatically add " .. "the page to this category if the example is in a foreign language and no transliteration can be generated (particularly in languages without " .. "automated transliteration, such as Hebrew and Persian).", }, { regex = "^Requests for transliteration of (.+) usage examples$", umbrella = "Requests for transliteration of usage examples by language", additional_umbrella_parents = {"Usage example maintenance"}, template_name = "rftranslit", template_sample_call = "{{rftranslit|{{{language_code}}}}}", template_actual_sample_call = "{{rftranslit|{{{language_code}}}|nocat=1}}", catfix = false, additional_template_description = "The {{tl|ux}} and {{tl|uxi}} templates automatically add the page to this category if the example " .. "is in a foreign language and no transliteration can be generated (particularly in languages without automated transliteration, such as " .. "Hebrew and Persian).", }, { regex = "^Requests for transliteration of (.+) quotations$", umbrella = "Requests for transliteration of quotations by language", additional_umbrella_parents = {"Quotation maintenance"}, catfix = false, additional_template_description = "The {{tl|quote}} and {{code|<nowiki>{{quote-*}}</nowiki>}} templates automatically add the page to this category if the quotation " .. "is in a foreign language and no transliteration can be generated (particularly in languages without automated transliteration, such as " .. "Hebrew and Persian).", }, { regex = "^Requests for native script for (.+) terms$", allow_etym_lang = true, etym_parents = { {name = "Requests for native script for {{{parent_language_name}}} terms", sort = "{{{1}}}"}, {name = "Requests concerning {{{language_name}}}", sort = "native script"}, }, umbrella = "Requests for native script by language", template_name = "rfscript", template_actual_sample_call = "{{rfscript|{{{language_code}}}|nocat=1}}", catfix = false, additional_template_description = "Many templates such as {{tl|l}}, {{tl|m}} and {{tl|t}} automatically place the page in this category when they are missing the term but have been provided with a transliteration." }, { regex = "^Requests for native script in (.+) usage examples$", umbrella = "Requests for native script in usage examples by language", additional_umbrella_parents = {"Usage example maintenance"}, template_name = "rfscript", template_sample_call = "{{rfscript|{{{language_code}}}|usex=1}}", template_actual_sample_call = "{{rfscript|{{{language_code}}}|usex=1|nocat=1}}", catfix = false, additional_template_description = "The {{tl|ux}} and {{tl|uxi}} templates automatically add the page to this category if the example itself is missing but the translation is supplied." }, { regex = "^Requests for native script in (.+) quotations$", umbrella = "Requests for native script in quotations by language", additional_umbrella_parents = {"Quotation maintenance"}, template_name = "rfscript", template_sample_call = "{{rfscript|{{{language_code}}}|quote=1}}", template_actual_sample_call = "{{rfscript|{{{language_code}}}|quote=1|nocat=1}}", catfix = false, additional_template_description = "The {{tl|quote}} and {{code|<nowiki>{{quote-*}}</nowiki>}} templates automatically add the page to this category if the quotation itself is missing but the translation is supplied." }, { regex = "^Requests for (.+) script for (.+) terms$", language_name = "{{{2}}}", allow_etym_lang = true, parents = {{name = "Requests for native script for {{{language_name}}} terms", sort = "{{{1}}}"}}, etym_parents = { {name = "Requests for native script for {{{language_name}}} terms", sort = "{{{1}}}"}, {name = "Requests for {{{1}}} script for {{{parent_language_name}}} terms", sort = "{{{language_name}}}"}, {name = "Requests concerning {{{language_name}}}", sort = "{{{1}}} script"}, }, umbrella = "Requests for {{{1}}} script by language", breadcrumb = "{{{1}}}", etym_breadcrumb = "{{{1}}}", template_name = "rfscript", -- NOTE: The following is used in `template_sample_call` and `template_actual_sample_call`, meaning the -- conversion of script name to script code needs to be done using an inline function like this, instead of -- a {{#invoke:...}} template call. script_code = function(items) return script_name_to_code(items["1"]) end, template_sample_call = "{{rfscript|{{{language_code}}}|sc={{{script_code}}}}}", template_actual_sample_call = "{{rfscript|{{{language_code}}}|sc={{{script_code}}}|nocat=1}}", catfix = false, additional_template_description = "Many templates such as {{tl|l}}, {{tl|m}} and {{tl|t}} automatically place the page in this category when they are missing the term but have been provided with a transliteration." }, { regex = "^Requests for (.+) script by language$", parents = {{name = "Requests for script by language", sort = "{{{1}}}"}}, breadcrumb = "{{{1}}}", nolang = true, }, { regex = "^Requests for script by language$", nolang = true, }, { regex = "^Requests for images in (.+) entries$", umbrella = "Requests for images by language", template_name = "rfi", }, { regex = "^Requests for references for (.+) terms$", umbrella = "Requests for references by language", template_name = "rfref", }, { regex = "^Requests for references for etymologies in (.+) entries$", parents = {{name = "Requests for references for {{{language_name}}} terms", sort = "etymologies"}}, umbrella = "Requests for references for etymologies by language", breadcrumb = "Etymologies", template_name = "rfv-etym", }, { regex = "^Requests for references for pronunciations in (.+) entries$", parents = {{name = "Requests for references for {{{language_name}}} terms", sort = "pronunciations"}}, umbrella = "Requests for references for pronunciations by language", breadcrumb = "Pronunciations", template_name = "rfv-pron", }, { regex = "^Requests for attention concerning (.+)$", umbrella = "Requests for attention by language", breadcrumb = "Attention", template_name = "attention", template_sample_call = "{{attention|{{{language_code}}}|insert a brief description of the request here}}", template_example_output = "This template does not generate any text in entries, but can be visualised by enabling the Catch My Attention gadget. See {{section link|Template:attention#Visibility}}.", -- These pages typically contain a mixture of English and native-language entries, so disable catfix. catfix = false, -- Setting catfix = false will normally trigger the English table of contents template. -- We still want the native-language table of contents template, though. toc_template = "{{{language_code}}}-categoryTOC", toc_template_full = "{{{language_code}}}-categoryTOC/full", }, { regex = "^Requests for cleanup in (.+) entries$", umbrella = "Requests for cleanup by language", template_name = "rfc", template_actual_sample_call = "{{rfc|{{{language_code}}}|nocat=1}}", }, { regex = "^Requests for cleanup of Pronunciation N headers in (.+) entries$", umbrella = "Requests for cleanup of Pronunciation N headers by language", template_name = "rfc-pron-n", template_actual_sample_call = "{{rfc-pron-n|{{{language_code}}}|nocat=1}}", template_example_output = "This template does not generate any text in entries.", additional_template_description = [=[ The purpose of this category is to tag entries that use headers with "Pronunciation" and a number. While these headers and structure are sometimes used, they are not specifically prescribed by [[WT:ELE]]. No complete proposal has yet been made on how they should work, what the semantics are, or how they interact with multiple etymologies. As a result they should generally be avoided. Instead, merge the entries (possibly under multiple Etymology sections, if appropriate), and list all pronunciations, appropriately tagged, under a Pronunciation header. [[User:KassadBot|KassadBot]] tags these entries (or used to tag these entries, when the bot was operational). At some point if a proposal is made and adopted as policy, these entries should be reviewed. This category is hidden.]=], }, { regex = "^Requests for deletion in (.+) entries$", umbrella = "Requests for deletion by language", template_name = "rfd", template_actual_sample_call = "{{rfd|{{{language_code}}}|nocat=1}}", }, { regex = "^Requests for verification in (.+) entries$", umbrella = "Requests for verification by language", template_name = "rfv", }, { regex = "^Requests for attention in (.+) etymologies$", umbrella = "Requests for attention by language" }, { regex = "^Requests for quotations/(.+)$", description = "Requests for a quotation or for quotations from {{{1}}}.", parents = {{name = "Requests for quotations by source", sort = "{{{1}}}"}}, breadcrumb = "{{{1}}}", nolang = true, template_name = "rfquotek", template_sample_call = "{{rfquotek|LANGCODE|{{{1}}}}}", template_example_output = "\n(where LANGCODE is the language code of the entry)\n\nIt results in the message below:\n\n{{rfquotek|und|{{{1}}}}}", }, { regex = "^Requests for date in (.+) entries$", umbrella = "Requests for date by language", additional_umbrella_parents = {"Quotation maintenance"}, template_name = "rfdate", additional_template_description = "The quotation templates, such as {{tl|quote-book}} and {{tl|quote-journal}}, " .. "automatically add the page to this category if neither {{para|date}} nor {{para|year}} is provided. Providing the " .. "parameter in each case on the page automatically removes the article from this category. See " .. "[[Wiktionary:Quotations]] for information about formatting dates and quotations.", }, { regex = "^Requests for date/(.+)$", description = "{{rfd|section=Category:Requests for date by source}}Requests for a date for a quotation or quotations from {{{1}}}.", parents = {{name = "Requests for date by source", sort = "{{{1}}}"}}, breadcrumb = "{{{1}}}", nolang = true, template_name = "rfdatek", template_sample_call = "{{rfdatek|LANGCODE|{{{1}}}}}", template_example_output = "\n(where LANGCODE is the language code of the entry)\n\nIt results in the message below:\n\n{{rfdatek|und|{{{1}}}}}", }, { regex = "^Requests for attestation of (.+) terms$", umbrella = "Requests for attestation of terms by language", breadcrumb = "Attestation", additional_template_description = "The {{tl|LDL}} template adds this category when a language code is supplied in {{para|1}} (as it should be)." }, }) local user_competency_additional_template_description = "This is added by user-competency categories such as " .. "[[:Category:User fr-4]], which groups users who speak French at level 4 (near-native proficiency), when " .. "the native-language text indicating this fact is missing. The appropriate translation should mirror the " .. "English text also displayed (e.g. in this case \"These users speak French at a '''near native''' " .. "level.\"), and should be supplied to {{tl|auto cat}} using the {{para|text}} parameter. The mention of the " .. "language in the text should be surrounded by double angle brackets, e.g. \"&lt;&lt;français>>\", which " .. "causes it to be automatically linked to the appropriate parent category." local user_competency_parents = {{name = "Requests for translations in user-competency categories by number of users", sort = function(items) return " " .. ("%010d"):format(items["1"]) end, }} extend(requests_categories, { { regex = "^Requests for translations in user%-competency categories with ([0-9]+)%-([0-9]+) users$", description = "Requests for translation of phrases indicating user competencies for specific languages and specific competency levels, for categories with {{{1}}}-{{{2}}} users.", additional_template_description = user_competency_additional_template_description, parents = user_competency_parents, breadcrumb = "{{{1}}}-{{{2}}}", nolang = true, }, { regex = "^Requests for translations in user%-competency categories with ([0-9]+) (users?)$", description = "Requests for translation of phrases indicating user competencies for specific languages and specific competency levels, for categories with {{{1}}} {{{2}}}.", additional_template_description = user_competency_additional_template_description, parents = user_competency_parents, breadcrumb = "{{{1}}}", nolang = true, } }) table.insert(raw_handlers, function(data) local items local function init_items() items = {pagename = data.category} end local function expand_value(item, val) if not val then return val elseif is_callable(val) then return expand_value(item .. " ⇒ function", val(items)) elseif type(val) == "table" then for k, v in pairs(val) do val[k] = expand_value(item .. " ⇒ " .. k, v) end return val elseif type(val) == "number" then val = tostring(val) end if type(val) ~= "string" then error(("The item '%s' on page %s is of type %s and can't be concatenated"):format( item, items.pagename, type(val))) end -- Replaces pseudo-template code {{{ }}} with the corresponding member of the "items" table. Has to be done -- recursively, since some of the items are nested: -- {{{template_sample_call_with_temp}}} -- ⇓ -- {{{{{template_name}}}|{{{language_code}}}}} -- ⇓ -- {{attention|en}} if val:find("{{{") then val = mw.ustring.gsub(val, "{{{([^%}%{]+)}}}", function(prop) local propval = items[prop] if not propval then error(("The item '%s' (expanded from property '%s' on page %s) was not found in the 'items' table"): format(prop, item, items.pagename)) end return expand_value(item .. " ⇒ " .. prop, propval) end ) end return val end local function expand_items_value(item) return expand_value(item, items[item]) end local function convert_items_to_category_data(items) if not items.nolang then items.language_name = items.language_name or "{{{1}}}" items.language_name = expand_items_value("language_name") items.language_object = require(languages_module).getByCanonicalName(items.language_name, true, items.allow_etym_lang) items.language_code = items.language_object:getCode() items.is_etym_lang = items.language_object:hasType("etymology-only") if items.is_etym_lang then items.parent_language_object = items.language_object:getFull() -- Reject weird cases where etymology language has no parent. if not items.parent_language_object then return nil end items.parent_language_code = items.parent_language_object:getCode() items.parent_language_name = items.parent_language_object:getCanonicalName() -- Reject weird cases where the parent language has the same name as the child etymology language. In -- that case, we'll get an infinite parent-category loop. This actually happens, e.g. with Rudbari and -- Bashkardi. if items.parent_language_name == items.language_name then return nil end else end end if items.template_name then items.template_sample_call = items.template_sample_call or "{{{{{template_name}}}|{{{language_code}}}}}" items.full_text_about_the_template = "To make this request, in this specific language, use this code in the entry (see also the documentation at [[Template:{{{template_name}}}]]):\n\n<pre>{{{template_sample_call}}}</pre>" if items.template_example_output then items.full_text_about_the_template = items.full_text_about_the_template .. " " .. items.template_example_output else items.template_actual_sample_call = items.template_actual_sample_call or items.template_sample_call items.full_text_about_the_template = items.full_text_about_the_template .. "\nIt results in the message below:\n\n{{{template_actual_sample_call}}}" end if items.additional_template_description then items.full_text_about_the_template = items.full_text_about_the_template .. "\n\n" .. items.additional_template_description end else items.full_text_about_the_template = items.additional_template_description end local parents, breadcrumb if items.is_etym_lang then parents = items.etym_parents breadcrumb = expand_items_value("etym_breadcrumb") or items.language_name else parents = items.parents breadcrumb = expand_items_value("breadcrumb") end if parents then for _, parent in ipairs(parents) do parent.name = expand_value("parent.name", parent.name) parent.sort = {sort_base = expand_value("parent.sort", parent.sort), lang = "en"} end else local umbrella_type = items.pagename:match("^Requests for (.+) by language$") if umbrella_type then breadcrumb = breadcrumb or umbrella_type parents = {{name = "Request subcategories by language", sort = umbrella_type}} if items.additional_umbrella_parents then extend(parents, items.additional_umbrella_parents) end elseif not items.language_name then error("Internal error: Don't know how to compute parents for non-language-specific category '" .. items.pagename .. "'") else local requests_concerning_breadcrumb = items.pagename:gsub(" " .. pattern_escape(items.language_name), "") requests_concerning_breadcrumb = requests_concerning_breadcrumb:gsub("^Requests for ", ""):gsub(" in entries$", ""):gsub(" for terms$", "") local requests_concerning_parent = { name = "Requests concerning " .. items.language_name, sort = {sort_base = requests_concerning_breadcrumb, lang = "en"} } if items.is_etym_lang then local parent_lang_cat = items.pagename:gsub(pattern_escape(items.language_name), replacement_escape(items.parent_language_name)) parents = { {name = parent_lang_cat, sort = {sort_base = items.language_name, lang = "en"}}, requests_concerning_parent } else breadcrumb = breadcrumb or requests_concerning_breadcrumb parents = {requests_concerning_parent} end end end if not items.nolang and not items.is_etym_lang and items.umbrella ~= false then table.insert(parents, { name = expand_items_value("umbrella"), sort = {sort_base = items.language_name, lang = "en"} }) end local additional = expand_items_value("full_text_about_the_template") if items.pagename:find(" by language$") then additional = "{{{umbrella_msg}}}" .. (additional and "\n\n" .. additional or "") end return { description = expand_items_value("description") or items.pagename .. ".", lang = items.parent_language_code or items.language_code, additional = additional, parents = parents, -- If no breadcrumb= and not an etym-only language, it will default to the category name breadcrumb = breadcrumb, catfix = expand_items_value("catfix"), toc_template = expand_items_value("toc_template"), toc_template_full = expand_items_value("toc_template_full"), hidden = not items.nolang and not items.not_hidden_category, can_be_empty = true, } end -- First look for a regular (usually language or script-specific) category. for _, category in ipairs(requests_categories) do local matchvals = {mw.ustring.match(data.category, category.regex)} if #matchvals > 0 then init_items() for key, value in pairs(category) do items[key] = value end for key, value in ipairs(matchvals) do items["" .. key] = value end local catdata = convert_items_to_category_data(items) if catdata then return catdata end end end -- Now look for umbrella categories. for _, category in ipairs(requests_categories) do if data.category == category.umbrella then init_items() items.nolang = true items.additional_umbrella_parents = category.additional_umbrella_parents local catdata = convert_items_to_category_data(items) if catdata then return catdata end end end return nil end) table.insert(raw_handlers, function(data) local langname = data.category:match("^Terms with (.+) translations$") local lang = langname and require(languages_module).getByCanonicalName(langname, true, true) if lang then local langcode = lang:getCode() local parents, breadcrumb_and_first_sort_key if lang:hasType("etymology-only") then parents = { "Terms with " .. lang:getFullName() .. " translations", {name = langname, sort = "Translations"}, } breadcrumb_and_first_sort_key = lang:getCanonicalName() else parents = { {name = "entry maintenance", is_label = true, lang = langcode}, { name = "Terms with translations by language", sort = {sort_base = langname, lang = "en"} }, } breadcrumb_and_first_sort_key = "Translations" end return { description = "Entries that contain translations into " .. langname .. " which were added using one of the translation templates, such as {{tl|t|" .. langcode .. "|...}}, {{tl|t+|" .. langcode .. "|...}}, etc.", parents = parents, breadcrumb_and_first_sort_key = breadcrumb_and_first_sort_key, catfix = false, can_be_empty = true, hidden = true, } end end) local recognized_taxtypes = require(table_module).listToSet { "ambiguous", "binomial", "branch", "clade", "cladus", "class", "cohort", "convariety", "cultivar group", "cultivar", "division", "empire", "epifamily", "epithet", "family", "form taxon", "form", "genus", "grade", "grandorder", "group", "hybrid", "informal group", "infraclass", "infracohort", "infrakingdom", "infraorder", "infraphylum", "infraspecies", "kingdom", "magnorder", "megacohort", "mirorder", "morph", "nothogenus", "nothospecies", "nothosubspecies", "nothovariety", "obsolete", "oofamily", "order", "parvclass", "parvorder", "phylum", "section", "series", "serovar", "species group", "species", "stem", "stirps", "strain", "subclass", "subcohort", "subdivision", "subfamily", "subgenus", "subgroup", "subinfraorder", "subkingdom", "suborder", "subphylum", "subsection", "subspecies", "subterclass", "subtribe", "superclass", "supercohort", "superfamily", "supergroup", "superorder", "superphylum", "supertribe", "taxon", "tribe", "trinomial", "undescribed species", "unknown", "unranked group", "variety", "virus complex", } table.insert(raw_handlers, function(data) local taxtype = data.category:match("^Entries using missing taxonomic name %((.*)%)$") if taxtype and recognized_taxtypes[taxtype] then return { description = "Entries that link to wikispecies because there is no corresponding Wiktionary entry for the taxonomic name in the template {{tl|taxlink}}.", additional = "The missing name is one or more of those enclosed in {{tl|taxlink}}. The entries are sorted by the missing taxonomic name.", parents = {{name = "Entries using missing taxonomic names", sort = {sort_base = taxtype, lang = "en"}}}, breadcrumb = taxtype, hidden = true, } end end) return {LABELS = labels, RAW_CATEGORIES = raw_categories, RAW_HANDLERS = raw_handlers} o9abg0jm6bkj96u0bwk4596n3rvss1w मॉड्यूल:category tree/प्रविष्टि रखरखाव 828 306958 487808 2026-09-02T19:09:31Z SM7 6218 SM7 ने पृष्ठ [[मॉड्यूल:category tree/प्रविष्टि रखरखाव]] को [[मॉड्यूल:category tree/entry maintenance]] पर स्थानांतरित किया 487808 Scribunto text/plain return require [[मॉड्यूल:category tree/entry maintenance]] dmh2vp7oun97u03hqgbcmiz6wjjht27 मॉड्यूल:category tree/व्युत्पत्ति 828 306959 487809 2026-09-02T19:13:20Z SM7 6218 अंग्रेजी विक्षनरी से आयातित 487809 Scribunto text/plain local labels = {} local raw_categories = {} local handlers = {} local raw_handlers = {} local en_utilities_module = "Module:en-utilities" local m_str_utils = require("Module:string utilities") local add_indefinite_article = require(en_utilities_module).add_indefinite_article local full_link = require("Module:links").full_link local get_lang_by_name = require("Module:languages").getByCanonicalName local insert = table.insert local pattern_escape = m_str_utils.pattern_escape local plain_gsub = m_str_utils.plain_gsub local pluralize_pos = require("Module:headword").pluralize_pos local pos_lemma_or_nonlemma = require("Module:headword").pos_lemma_or_nonlemma local serial_comma_join = require("Module:table").serialCommaJoin local tag_text = require("Module:script utilities").tag_text local umatch = mw.ustring.match local unpack = unpack or table.unpack -- Lua 5.2 compatibility ----------------------------------------------------------------------------- -- -- -- LABELS -- -- -- ----------------------------------------------------------------------------- labels["टर्म व्युत्पत्ति अनुसार"] = { description = "{{{langname}}} terms categorized by their etymologies.", umbrella_parents = "मूलभूत श्रेणी", parents = {{name = "{{{langcat}}}", raw = true}}, } labels["AABB-type reduplications"] = { description = "{{{langname}}} terms that underwent [[reduplication]] in an AABB pattern.", breadcrumb = "AABB-type", parents = {"reduplications"}, } labels["apophonic reduplications"] = { description = "{{{langname}}} terms that underwent [[reduplication]] with only a change in a vowel sound.", breadcrumb = "apophonic", parents = {"reduplications"}, } labels["back-formations"] = { description = "{{{langname}}} terms formed by reversing a supposed regular formation, removing part of an older term.", parents = {"terms by etymology"}, } labels["blends"] = { description = "{{{langname}}} terms formed by combinations of other words.", parents = {"terms by etymology"}, } labels["borrowed terms"] = { description = "{{{langname}}} terms that are loanwords, i.e. terms that were directly incorporated from another language.", parents = {"terms by etymology"}, } labels["catachreses"] = { description = "{{{langname}}} terms derived from misuses or misapplications of other terms.", parents = {"terms by etymology"}, } labels["coinages"] = { description = "{{{langname}}} terms coined by an identifiable person, organization or other such entity.", parents = {"terms attributed to a specific source"}, umbrella_parents = {name = "terms attributed to a specific source", is_label = true, sort = " "}, } labels["coordinated pairs"] = { description = "Terms in {{{langname}}} consisting of a pair of terms joined by a [[coordinating conjunction]].", parents = {"terms by etymology"}, } labels["coordinated triples"] = { description = "Terms in {{{langname}}} consisting of three terms joined by one or more [[coordinating conjunction]]s.", parents = {"terms by etymology"}, } labels["coordinated quadruples"] = { description = "Terms in {{{langname}}} consisting of four terms joined by one or more [[coordinating conjunction]]s.", parents = {"terms by etymology"}, } labels["coordinated quintuples"] = { description = "Terms in {{{langname}}} consisting of five terms joined by one or more [[coordinating conjunction]]s.", parents = {"terms by etymology"}, } labels["denominals"] = { description = "{{{langname}}} terms derived from a noun.", parents = {"terms by etymology"}, } labels["deverbals"] = { description = "{{{langname}}} terms derived from a verb.", parents = {"terms by etymology"}, } labels["doublets"] = { description = "{{{langname}}} terms that trace their etymology from ultimately the same source as other terms in the same language, but by different routes, and often with subtly or substantially different meanings.", parents = {"terms by etymology"}, } labels["elongated forms"] = { description = "{{{langname}}} terms where one or more letters or sounds is repeated for emphasis or effect.", parents = {"terms by etymology"}, } labels["eponyms"] = { description = "{{{langname}}} terms derived from names of real or fictitious individuals.", parents = {"terms by etymology"}, } labels["genericized trademarks"] = { description = "{{{langname}}} terms that originate from [[trademark]]s, [[brand]]s and company names which have become [[genericized]]; that is, fallen into common usage in the target market's [[vernacular]], even when referring to other competing brands.", parents = {"terms by etymology", "trademarks"}, } labels["ghost words"] = { description = "{{{langname}}} terms that were originally erroneous or fictitious, published in a reference work as if they were genuine as a result of typographical error, misreading, or misinterpretation, or as [[:w:Fictitious entry|fictitious entries]], jokes, or hoaxes.", parents = {"terms by etymology"}, } labels["gramograms"] = { description = "{{{langname}}} [[gramogram]]s &ndash; terms that are partially or completely spelled with [[homophone|homophonous]] letters.", parents = {"rebuses"}, } labels["haplological words"] = { description = "{{{langname}}} words that underwent [[haplology]]: thus, their origin involved a loss or omission of a repeated sequence of sounds.", parents = {"terms by etymology"}, } labels["homophonic translations"] = { description = "{{{langname}}} terms that were borrowed by matching the etymon phonetically, without regard for the sense; compare [[phono-semantic matching]] and [[Hobson-Jobson]].", parents = {"terms by etymology"} } labels["hybridisms"] = { description = "{{{langname}}} terms formed by elements of different linguistic origins.", parents = {"terms by etymology"}, } labels["inherited terms"] = { description = "{{{langname}}} terms that were inherited from an earlier stage of the language.", parents = {"terms by etymology"}, } labels["internationalisms"] = { description = "{{{langname}}} loanwords which also exist in many other languages with the same or similar etymology.", additional = "Terms should be here preferably only if the immediate source language is not known for certain. Entries are added into this category by [[Template:internationalism]]; see it for more information.", parents = {"terms by etymology"}, } labels["legal doublets"] = { description = "{{{langname}}} legal [[doublet]]s &ndash; a legal doublet is a standardized phrase commonly used in legal documents, proceedings etc. which includes two words that are near synonyms.", parents = {"coordinated pairs"}, } labels["legal triplets"] = { description = "{{{langname}}} legal [[triplet]]s &ndash; a legal triplet is a standardized phrase commonly used in legal documents, proceedings etc which includes three words that are near synonyms.", parents = {"coordinated triples"}, } labels["LLM coinages"] = { description = "{{{langname}}} terms that have been coined by {{w|large language models}} rather than humans.", parents = {"terms by etymology"}, } labels["merisms"] = { description = "{{{langname}}} [[merism]]s &ndash; terms that are [[coordinate]]s that, combined, are a synonym for a totality.", parents = {"coordinated pairs"}, } labels["metonyms"] = { description = "{{{langname}}} terms whose origin involves calling a thing or concept not by its own name, but by the name of something intimately associated with that thing or concept.", parents = {"terms by etymology"}, } labels["neologisms"] = { description = "{{{langname}}} terms that have been only recently acknowledged.", parents = {"terms by etymology"}, } labels["nominalizations"] = { description = "{{{langname}}} terms formed by nominalization, a process where a word from another part of speech becomes a noun.", parents = {"terms by etymology"}, } labels["nonce terms"] = { description = "{{{langname}}} terms that have been invented for a single occasion.", parents = {"terms by etymology"}, } labels["number homophones"] = { description = "{{{langname}}} terms that are partially or completely spelled with [[homophone|homophonous]] numbers.", parents = {"rebuses", "terms spelled with numbers"}, } labels["numerical contractions"] = { description = "{{{langname}}} numerical contractions. In these, the number either denotes omitted characters ({{m+|en|globalization}} → {{m|en|g11n}}) or duplication ({{m+|kne|Kankanaey}} → {{m|kne|Kan2aey}}).", parents = {"contractions", "rebuses", "terms spelled with numbers"}, } labels["onomatopoeias"] = { description = "{{{langname}}} terms that were coined to sound like what they represent.", parents = {"terms by etymology"}, } labels["piecewise doublets"] = { description = "{{{langname}}} terms that are [[Appendix:Glossary#piecewise doublet|piecewise doublets]].", parents = {"terms by etymology"}, } for _, ism_and_langname in ipairs({ {"anglicisms", "English"}, {"Arabisms", "Arabic"}, {"Gallicisms", "French"}, {"Germanisms", "German"}, {"Hispanisms", "Spanish"}, {"Italianisms", "Italian"}, {"Latinisms", "Latin"}, {"Japonisms", "Japanese"}, }) do local ism, langname = unpack(ism_and_langname) labels["pseudo-" .. ism] = { description = "{{{langname}}} terms that appear to be " .. langname .. ", but are not used or have an unrelated meaning in " .. langname .. " itself.", parents = {"pseudo-loans"}, umbrella_parents = {name = "pseudo-loans", is_label = true, sort = " "}, } end labels["rebracketings"] = { description = "{{{langname}}} terms that have interacted with another word in such a way that the boundary between the words has been modified.", parents = {"terms by etymology"} } labels["rebuses"] = { description = "{{{langname}}} [[rebus]]es &ndash; terms that are partially or completely represented by images, symbols or numbers, often as a form of wordplay.", parents = {"terms by etymology"}, } labels["reconstructed terms"] = { description = "{{{langname}}} terms that are not directly attested, but have been reconstructed through other evidence.", parents = {"terms by etymology"} } labels["reduplicated coordinated pairs"] = { description = "{{{langname}}} reduplicated coordinated pairs.", breadcrumb = "reduplicated", parents = {"coordinated pairs", "reduplications"}, } labels["reduplicated coordinated triples"] = { description = "{{{langname}}} reduplicated coordinated triples.", breadcrumb = "reduplicated", parents = {"coordinated triples", "reduplications"}, } labels["reduplicated coordinated quadruples"] = { description = "{{{langname}}} reduplicated coordinated quadruples.", breadcrumb = "reduplicated", parents = {"coordinated quadruples", "reduplications"}, } labels["reduplicated coordinated quintuples"] = { description = "{{{langname}}} reduplicated coordinated quintuples.", breadcrumb = "reduplicated", parents = {"coordinated quintuples", "reduplications"}, } labels["reduplications"] = { description = "{{{langname}}} terms that underwent [[reduplication]], so their origin involved a repetition of roots or stems.", parents = {"terms by etymology"}, } labels["retronyms"] = { description = "{{{langname}}} terms that serve as new unique names for older objects or concepts whose previous names became ambiguous.", parents = {"terms by etymology"}, } labels["roots"] = { description = "Basic morphemes from which {{{langname}}} words are formed.", parents = {"terms by etymology", "morphemes"}, } labels["Sanskritic formations"] = { description = "{{{langname}}} terms coined from [[tatsama]] [[word]]s and/or [[affix]]es.", parents = {"terms by etymology", "terms derived from Sanskrit"}, } labels["sound-symbolic terms"] = { description = "{{{langname}}} terms that use {{w|sound symbolism}} to express ideas but which are not necessarily strictly speaking [[onomatopoeic]].", parents = {"terms by etymology"}, } labels["spelled-out initialisms"] = { description = "{{{langname}}} initialisms in which the letter names are spelled out.", parents = {"terms by etymology"}, } labels["spelling pronunciations"] = { description = "{{{langname}}} terms whose pronunciation was historically or presently affected by their spelling.", parents = {"terms by etymology"}, } labels["spoonerisms"] = { description = "{{{langname}}} terms in which the initial sounds of component parts have been exchanged, as in \"crook and nanny\" for \"nook and cranny\".", parents = {"terms by etymology"}, } labels["taxonomic eponyms"] = { description = "{{{langname}}} terms derived from names of real or fictitious people, used for [[taxonomy]].", parents = {"eponyms"}, } labels["terms attributed to a specific source"] = { description = "{{{langname}}} terms coined by an identifiable person or deriving from a known work.", parents = {"terms by etymology"}, } labels["terms coined ex nihilo"] = { description = "{{{langname}}} terms fabricated ''[[ex nihilo]]'', i.e. made up entirely rather than being derived from an existing source.", parents = {"terms by etymology"}, } labels["terms containing fossilized case endings"] = { description = "{{{langname}}} terms which preserve case morphology which is no longer analyzable within the contemporary grammatical system or which has been entirely lost from the language.", parents = {"terms by etymology"}, } labels["terms derived from area codes"] = { description = "{{{langname}}} terms derived from [[area code]]s.", parents = {"terms by etymology"}, } labels["terms derived from the shape of letters"] = { description = "{{{langname}}} terms derived from the shape of letters. This can include terms derived from the shape of any letter in any alphabet.", parents = {"terms by etymology"}, } labels["terms by root"] = { description = "{{{langname}}} terms categorized by the root they originate from.", parents = {"terms by etymology", {name = "roots", sort = " "}}, } labels["terms by word"] = { description = "{{{langname}}} terms categorized by the word they originate from.", parents = {"terms by etymology"}, } labels["terms derived from fiction"] = { description = "{{{langname}}} terms that originate from works of [[fiction]].", breadcrumb = "fiction", parents = {{name = "terms attributed to a specific source", sort = "fiction"}}, } for _, data in ipairs { {source="Dickensian works", desc="the works of [[w:Charles Dickens|Charles Dickens]]", topic_parent="Charles Dickens"}, {source="DC Comics", desc="[[w:DC Comics|DC Comics]]"}, {source="Doraemon", desc="[[w:Fujiko F. Fujio|Fujiko F. Fujio]]'s ''[[w:Doraemon|Doraemon]]''", displaytitle="''Doraemon''"}, {source="Dragon Ball", desc="[[w:Akira Toriyama|Akira Toriyama]]'s ''[[w:Dragon Ball|Dragon Ball]]''", displaytitle="''Dragon Ball''"}, {source="Duckburg and Mouseton", desc="[[w:The Walt Disney Company|Disney]]'s [[w:Duck universe|Duckburg]] and [[w:Mickey Mouse universe|Mouseton]] universe", topic_parent="Disney"}, {source="Futurama", desc="the animated television series ''{{w|Futurama}}''", displaytitle = "''Futurama''"}, {source="Harry Potter", desc="the ''[[w:Harry Potter|Harry Potter]]'' series", displaytitle="''Harry Potter''", topic_parent="Harry Potter"}, {source="Looney Tunes and Merrie Melodies", desc="''{{w|Looney Tunes}}'' and/or ''{{w|Merrie Melodies}}'', by {{w|Warner Bros. Animation}}", displaytitle = "''Looney Tunes'' and ''Merrie Melodies''"}, {source="Nineteen Eighty-Four", desc="[[w:George Orwell|George Orwell]]'s ''[[w:Nineteen Eighty-Four|Nineteen Eighty-Four]]''", displaytitle="''Nineteen Eighty-Four''"}, {source="Seinfeld", desc="the American television sitcom ''{{w|Seinfeld}}'' (1989–1998)", displaytitle="''Seinfeld''"}, {source="Seussian works", desc="the works of [[w:Dr. Seuss|Dr. Seuss]]"}, {source="South Park", desc="the animated television series ''[[w:South Park|South Park]]''", displaytitle="''South Park''"}, {source="Star Trek", desc="''[[w:Star Trek|Star Trek]]''", displaytitle="''Star Trek''", topic_parent="Star Trek"}, {source="Star Wars", desc="''[[w:Star Wars|Star Wars]]''", displaytitle="''Star Wars''", topic_parent="Star Wars"}, {source="The Simpsons", desc="''[[w:The Simpsons|The Simpsons]]''", displaytitle="''The Simpsons''", topic_parent="The Simpsons", sort="Simpsons"}, {source="Tolkien's legendarium", desc="the [[legendarium]] of [[w:J. R. R. Tolkien|J. R. R. Tolkien]]", topic_parent="J. R. R. Tolkien"}, } do local parents = {{name = "terms derived from fiction", sort = data.sort or data.source}} local umbrella_parents = {"Terms by etymology subcategories by language"} if data.topic_parent then insert(parents, {name = "{{{langcode}}}:" .. data.topic_parent, raw = true}) insert(umbrella_parents, {name = data.topic_parent, raw = true}) end labels["terms derived from " .. data.source] = { description = "{{{langname}}} terms that originate from " .. data.desc .. ".", breadcrumb = data.displaytitle or data.source, parents = parents, umbrella = { parents = umbrella_parents, displaytitle = data.displaytitle and "Terms derived from " .. data.displaytitle .. " by language" or nil, breadcrumb = data.displaytitle and "Terms derived from " .. data.displaytitle, }, displaytitle = data.displaytitle and "{{{langname}}} terms derived from " .. data.displaytitle or nil, } end labels["terms derived from Greek mythology"] = { description = "{{{langname}}} terms derived from Greek mythology which have acquired an idiomatic meaning.", breadcrumb = "Greek mythology", parents = {{name = "terms attributed to a specific source", sort = "Greek mythology"}}, } labels["terms derived from occupations"] = { description = "{{{langname}}} terms derived from names of occupations.", parents = {"terms by etymology"}, } labels["terms derived from other languages"] = { description = "{{{langname}}} terms that originate from other languages.", parents = {"terms by etymology"}, } labels["terms derived from the Bible"] = { description = "{{{langname}}} terms that originate from the [[Bible]].", breadcrumb = {name = "the Bible", nocap = true}, parents = {{name = "terms attributed to a specific source", sort = "Bible"}}, } labels["terms derived from Aesop's Fables"] = { description = "{{{langname}}} terms that originate from [[Aesop]]'s Fables.", breadcrumb = "Aesop's Fables", parents = {{name = "terms attributed to a specific source", sort = "Aesop's Fables"}}, } labels["terms derived from toponyms"] = { description = "{{{langname}}} terms derived from names of real or fictitious places.", parents = {"terms by etymology"}, } labels["terms derived through romanized wordplay"] = { description = "{{{langname}}} terms derived through romanized wordplay.", parents = {"terms by etymology"}, } labels["terms making reference to character shapes"] = { description = "{{{langname}}} terms making reference to character shapes.", parents = {"terms by etymology"}, } labels["terms derived from sports"] = { description = "{{{langname}}} terms that originate from sports.", breadcrumb = "sports", parents = {{name = "terms attributed to a specific source", sort = "sports"}}, } labels["terms derived from baseball"] = { description = "{{{langname}}} terms that originate from baseball.", breadcrumb = "baseball", parents = {{name = "terms derived from sports", sort = "baseball"}}, } labels["terms with Indo-Aryan extensions"] = { description = "{{{langname}}} terms extended with particular [[Indo-Aryan]] [[pleonastic]] affixes.", parents = {"terms by etymology"}, } labels["terms with lemma and non-lemma form etymologies"] = { description = "{{{langname}}} terms consisting of both a lemma and non-lemma form, of different origins.", breadcrumb = "lemma and non-lemma form", parents = {"terms with multiple etymologies"}, } labels["terms with multiple etymologies"] = { description = "{{{langname}}} terms that are derived from multiple origins.", parents = {"terms by etymology"}, } labels["terms with multiple lemma etymologies"] = { description = "{{{langname}}} lemmas that are derived from multiple origins.", breadcrumb = "multiple lemmas", parents = {"terms with multiple etymologies"}, } labels["terms with multiple non-lemma form etymologies"] = { description = "{{{langname}}} non-lemma forms that are derived from multiple origins.", breadcrumb = "multiple non-lemma forms", parents = {"terms with multiple etymologies"}, } labels["terms with unknown etymologies"] = { description = "{{{langname}}} terms whose etymologies have not yet been established.", parents = {{name = "terms by etymology", sort = "unknown etymology"}}, } labels["univerbations"] = { description = "{{{langname}}} terms that result from the agglutination of two or more words.", parents = {"terms by etymology"}, } labels["words derived through corruption"] = { description = "{{{langname}}} words that result from a non-specific or sporadic change.", parents = {{name = "terms by etymology", sort = "corruption"}}, } labels["words derived through metathesis"] = { description = "{{{langname}}} words that were created through [[metathesis]] from another word.", parents = {{name = "terms by etymology", sort = "metathesis"}}, } labels["words that have undergone semantic shift"] = { description = "{{{langname}}} words that show senses explained by [[semantic shift]].", parents = {{name = "terms by etymology", sort = "semantic shift"}}, } labels["words that have undergone semantic broadening"] = { description = "{{{langname}}} words that show senses explained by [[semantic]] [[broadening]].", parents = {{name = "words that have undergone semantic shift", sort = "semantic broadening"}}, } labels["words that have undergone semantic narrowing"] = { description = "{{{langname}}} words that show senses explained by [[semantic]] [[narrowing]].", parents = {{name = "words that have undergone semantic shift", sort = "semantic narrowing"}}, } labels["words that have undergone amelioration"] = { description = "{{{langname}}} words that have gained a positive [[connotation]] over time.", parents = {{name = "words that have undergone semantic shift", sort = "amelioration"}}, } labels["words that have undergone pejoration"] = { description = "{{{langname}}} words that have gained a negative [[connotation]] over time.", parents = {{name = "words that have undergone semantic shift", sort = "pejoration"}}, } labels["terms with origins in folklore"] = { description = "{{{langname}}} terms that have an etymology rooted in folklore.", breadcrumb = "Folklore", parents = {{name = "terms by etymology", sort = "folklore"}, {name = "{{{langcode}}}:Folklore", raw = true}}, umbrella_parents = {{name = "Terms by etymology subcategories by language", raw = true}, {name = "Folklore", raw = true, sort = " "}} } -- Add 'umbrella_parents' key if not already present. for _, data in pairs(labels) do -- NOTE: umbrella.parents overrides umbrella_parents if both are given. if not data.umbrella_parents then data.umbrella_parents = "Terms by etymology subcategories by language" end end ----------------------------------------------------------------------------- -- -- -- RAW CATEGORIES -- -- -- ----------------------------------------------------------------------------- raw_categories["Terms by etymology subcategories by language"] = { description = "Umbrella categories covering topics related to terms categorized by their etymologies, such as types of compounds or borrowings.", additional = "{{{umbrella_meta_msg}}}", parents = { "Umbrella metacategories", {name = "terms by etymology", is_label = true, sort = " "}, }, } raw_categories["Borrowed terms subcategories by language"] = { description = "Umbrella categories covering topics related to borrowed terms.", additional = "{{{umbrella_meta_msg}}}", parents = { "Umbrella metacategories", {name = "borrowed terms", is_label = true, sort = " "}, {name = "Terms by etymology subcategories by language", sort = " "}, }, } raw_categories["Inherited terms subcategories by language"] = { description = "Umbrella categories covering topics related to inherited terms.", additional = "{{{umbrella_meta_msg}}}", parents = { "Umbrella metacategories", {name = "inherited terms", is_label = true, sort = " "}, {name = "Terms by etymology subcategories by language", sort = " "}, }, } raw_categories["Indo-Aryan extensions"] = { description = "Umbrella categories covering terms extended with particular [[Indo-Aryan]] [[pleonastic]] affixes.", additional = "{{{umbrella_meta_msg}}}", parents = { "Umbrella metacategories", {name = "Terms by etymology subcategories by language", sort = " "}, }, } raw_categories["Multiple etymology subcategories by language"] = { description = "Umbrella categories covering topics related to terms with multiple etymologies.", additional = "{{{umbrella_meta_msg}}}", parents = { "Umbrella metacategories", {name = "Terms by etymology subcategories by language", sort = " "}, }, } raw_categories["Terms borrowed back into the same language"] = { description = "Categories with terms in specific languages that were borrowed from a second language that previously borrowed the term from the first language.", additional = "A well-known example is {{m+|en|salaryman}}, a term borrowed from Japanese which in turn was borrowed from the English words [[salary]] and [[man]].\n\n{{{umbrella_msg}}}", parents = "Terms by etymology subcategories by language", } ----------------------------------------------------------------------------- -- -- -- HANDLERS -- -- -- ----------------------------------------------------------------------------- local function get_source(source_name, allow_family, name_type) local source = get_lang_by_name(source_name, nil, true, allow_family) if source == nil then return nil end -- Check that the source name matches the expected form (e.g. getCanonicalName, getDisplayForm etc). if source[name_type](source) == source_name then return source end end local function get_source_and_type_desc(source, term_type) if source:getCode() == "ine-pro" and term_type:find("^roots?$") then return "[[w:Proto-Indo-European root|Proto-Indo-European " .. term_type .. "]]" end return "[[w:" .. source:getWikipediaArticle() .. "|" .. source:getCanonicalName() .. "]] " .. term_type end local function get_source_and_source_desc(source_name) -- HACK! Map 'taxonomic names', as generated by [[Module:etymology]], back to its canonical name -- before calling getByCanonicalName(). We need a more general solution here. local source_desc if source_name == "taxonomic names" then source_name = "taxonomic name" source_desc = "[[w:taxonomic nomenclature|taxonomic names]]" end local source = get_source(source_name, true, "getDisplayForm") if source == nil then return end source_desc = source_desc or source:makeCategoryLink() if source:hasType("family") then source_desc = "one of the " .. source_desc end return source, source_desc end ----------------------------------------------------------------------------- ------------------------------- word handlers ------------------------------- ----------------------------------------------------------------------------- -- Handlers for 'terms derived from the SOURCE word word' must go *BEFORE* the -- more general 'terms derived from SOURCE' handler. -- Root data from [[Module:roots]], which owns the separator, link target and -- romanization for each language. Required on demand so that category pages -- unrelated to roots do not load it. local function get_root_data(lang) return lang and require("Module:roots").get_data(lang:getCode()) or nil end -- Languages such as Hebrew have no automatic transliteration, but their root data -- defines one; this keeps the category description matching the root entry. local function root_translit(rdata, root) if not (rdata and rdata.romanization) then return nil end return require("Module:roots").transliterate(root, rdata.romanization) end -- Raises on a root that is not well-formed for its language. A language without root -- data declares no radical structure, so nothing is checked. local function assert_valid_root(lang, root) return require("Module:roots").assert_root(lang, root) end -- Whether a language's roots live at `Appendix:<language> roots/<root>`. The root data -- is the only authority: a language that does not declare `appendix_subpage` links to -- the root in mainspace. local function lang_uses_appendix_roots(lang) local rdata = get_root_data(lang) return rdata ~= nil and rdata.link_target == "appendix_subpage" end insert(handlers, function(data) local labelpref, word_and_id = data.label:match("^(terms belonging to the word )(.+)$") if not word_and_id then return end local word, id = word_and_id:match("^(.+) %((.-)%)$") if not word then word = word_and_id end local is_semitic = data.lang:inFamily("sem") local word_desc = is_semitic and "[[w:Semitic word|word]]" or "word" local parents = {} if id then insert(parents, {name = labelpref .. word, sort = id}) end insert(parents, {name = "terms by word", sort = word_and_id}) local separators = "־ %-" local separator_c = "[" .. separators .. "]" local not_separator_c = "[^" .. separators .. "]" -- remove any leading or trailing separators (e.g. in PIE-style words) local word_no_prefix_suffix = mw.ustring.gsub(mw.ustring.gsub(word, separator_c .. "$", ""), "^" .. separator_c, "") local num_sep = mw.ustring.len(mw.ustring.gsub(word_no_prefix_suffix, not_separator_c, "")) local linked_word = data.lang and full_link({ term = word, lang = data.lang, gloss = id, id = id }, "term") or word if num_sep > 0 then insert(parents, {name = "" .. (num_sep + 1) .. "-letter words", sort = word_and_id}) end -- Italicize the word/word in the title. local function displaytitle(title, lang) return plain_gsub(title, word, tag_text(word, lang, nil, "term")) end local breadcrumb = tag_text(word, data.lang, nil, "term") .. (id and " (" .. id .. ")" or "") return { description = "{{{langname}}} terms that belong to the " .. word_desc .. " " .. linked_word .. ".", displaytitle = displaytitle, breadcrumb = breadcrumb, parents = parents, umbrella = false, } end) insert(handlers, function(data) local source_name = data.label:match("^terms by (.+) word$") if not source_name then return end local source = get_source(source_name, false, "getCanonicalName") if not source then return end local parents = {"terms by etymology"} -- In [[:Category:Proto-Indo-Iranian terms by Proto-Indo-Iranian word]], -- don't add parent [[:Category:Proto-Indo-Iranian terms derived from Proto-Indo-Iranian]]. if not data.lang or data.lang:getCode() ~= source:getCode() then insert(parents, "terms derived from " .. source:getDisplayForm()) end return { description = "{{{langname}}} terms categorized by the " .. get_source_and_type_desc(source, "word") .. " they originate from.", parents = parents, umbrella_parents = "Terms by etymology subcategories by language", } end) ----------------------------------------------------------------------------- ------------------------------- Root handlers ------------------------------- ----------------------------------------------------------------------------- -- Handlers for 'terms derived from the SOURCE root ROOT' must go *BEFORE* the -- more general 'terms derived from SOURCE' handler. -- Handler for e.g. [[:Category:Yola terms derived from the Proto-Indo-European root *h₂el- (grow)]] and -- [[:Category:Russian terms derived from the Proto-Indo-European word *swé]], and corresponding umbrella -- categories [[:Category:Terms derived from the Proto-Indo-European root *h₂el- (grow)]] and -- [[:Category:Terms derived from the Proto-Indo-European word *swé]]. Replaces the former -- [[Module:category tree/PIE root cat]], [[Module:category tree/root cat]] and [[Template:PIE word cat]]. insert(handlers, function(data) local source_name, term_type, term_and_id for _, tt in ipairs{"root", "word", "term"} do source_name, term_and_id = data.label:match("^terms derived from the (.+) " .. tt .. " (.+)$") if source_name then term_type = tt break end end if not source_name then return end local term, id = term_and_id:match("^(.+) %((.-)%)$") if not term then term = term_and_id end local source = get_source(source_name, false, "getCanonicalName") if not source then return end local parents = { { name = "terms by " .. source_name .. " " .. term_type, sort = (source:makeSortKey(term)), } } local umbrella_parents = { { name = "Terms derived from " .. source_name .. " " .. term_type .. "s", sort = (source:makeSortKey(term)), } } if id then insert(parents, { name = "terms derived from the " .. source_name .. " " .. term_type .. " " .. term, sort = " " }) insert(umbrella_parents, { name = "terms derived from the " .. source_name .. " " .. term_type .. " " .. term, is_label = true, sort = " " }) end -- Italicize the word/word in the title. local function displaytitle(title, lang) return plain_gsub(title, term, tag_text(term, source, nil, "term")) end local breadcrumb = tag_text(term, source, nil, "term") .. (id and " (" .. id .. ")" or "") local term_page, alt_form, term_tr if term_type == "root" then assert_valid_root(source, term) local rdata = get_root_data(source) term_tr = root_translit(rdata, term) if lang_uses_appendix_roots(source) then term_page = ("Appendix:%s roots/%s"):format(source:getCanonicalName(), term) alt_form = term end end term_page = term_page or term return { description = "{{{langname}}} terms that originate ultimately from the " .. get_source_and_type_desc(source, term_type) .. " " .. full_link({ term = term_page, alt = alt_form, tr = term_tr, lang = source, gloss = id, id = id }, "term") .. ".", displaytitle = displaytitle, breadcrumb = breadcrumb, parents = parents, umbrella = { no_by_language = true, displaytitle = displaytitle, breadcrumb = breadcrumb, parents = umbrella_parents, } } end) insert(handlers, function(data) local labelpref, root_and_id = data.label:match("^(terms belonging to the root )(.+)$") if not root_and_id then return end local root, id = root_and_id:match("^(.+) %((.-)%)$") if not root then root = root_and_id end local is_semitic = data.lang:inFamily("sem") local root_desc = is_semitic and "[[w:Semitic root|root]]" or "root" local parents = {} if id then insert(parents, {name = labelpref .. root, sort = id}) end insert(parents, {name = "terms by root", sort = root_and_id}) if data.lang then assert_valid_root(data.lang, root) end local rdata = get_root_data(data.lang) local separators = rdata and rdata.separator and pattern_escape(rdata.separator) or "־ %-" local separator_c = "[" .. separators .. "]" local not_separator_c = "[^" .. separators .. "]" -- remove any leading or trailing separators (e.g. in PIE-style roots) local root_no_prefix_suffix = mw.ustring.gsub(mw.ustring.gsub(root, separator_c .. "$", ""), "^" .. separator_c, "") local num_sep = mw.ustring.len(mw.ustring.gsub(root_no_prefix_suffix, not_separator_c, "")) local root_page, alt_form if lang_uses_appendix_roots(data.lang) then root_page = ("Appendix:%s roots/%s"):format(data.lang:getCanonicalName(), root) alt_form = root else root_page = root end local linked_root = data.lang and full_link( { term = root_page, alt = alt_form, tr = root_translit(rdata, root), lang = data.lang, gloss = id, id = id, }, "term") or root_page if num_sep > 0 then insert(parents, {name = "" .. (num_sep + 1) .. "-letter roots", sort = root_and_id}) end -- Italicize the root/word in the title. local function displaytitle(title, lang) return plain_gsub(title, root, tag_text(root, lang, nil, "term")) end local breadcrumb = tag_text(root, data.lang, nil, "term") .. (id and " (" .. id .. ")" or "") return { description = "{{{langname}}} terms that belong to the " .. root_desc .. " " .. linked_root .. ".", displaytitle = displaytitle, breadcrumb = breadcrumb, parents = parents, umbrella = false, } end) insert(handlers, function(data) local source_name = data.label:match("^terms by (.+) root$") if not source_name then return end local source = get_source(source_name, false, "getCanonicalName") if not source then return end local parents = {"terms by etymology"} -- In [[:Category:Proto-Indo-Iranian terms by Proto-Indo-Iranian root]], -- don't add parent [[:Category:Proto-Indo-Iranian terms derived from Proto-Indo-Iranian]]. if not data.lang or data.lang:getCode() ~= source:getCode() then insert(parents, "terms derived from " .. source_name) end return { description = "{{{langname}}} terms categorized by the " .. get_source_and_type_desc(source, "root") .. " they originate from.", parents = parents, umbrella_parents = "Terms by etymology subcategories by language", } end) insert(handlers, function(data) local root_shape, post, additional = data.label:match("^(.+)([ -])shaped roots$") if not root_shape then return elseif data.lang and data.lang:getCode() == "ine-pro" then additional = [=[ * '''e''' stands for the vowel of the root. * '''C''' stands for any stop or ''s''. * '''R''' stands for any resonant. * '''H''' stands for any laryngeal. * '''M''' stands for ''m'' or ''w'', when followed by a resonant. * '''s''' stands for ''s'', when next to a stop.]=] end if root_shape == "irregularly" and post == " " then return { breadcrumb = "irregular", description = "{{{langname}}} roots with a shape that violates the {{w|Proto-Indo-European root#Shape of a root|known rules on root shapes}}.", additional = additional, parents = {{name = "roots by shape", sort = "*"}}, umbrella = false, } elseif post == " " then return end return { breadcrumb = root_shape, description = "{{{langname}}} roots with the shape ''" .. root_shape .. "''.", additional = additional, parents = {{name = "roots by shape", sort = root_shape}}, umbrella = false, } end) ----------------------------------------------------------------------------- -------------------- Derived/inherited/borrowed handlers -------------------- ----------------------------------------------------------------------------- -- Handler for categories of the form "LANG terms derived from SOURCE", where SOURCE is a language, etymology language -- or family (e.g. "Indo-European languages"), along with corresponding umbrella categories of the form -- "Terms derived from SOURCE". insert(handlers, function(data) local source_name = data.label:match("^terms derived from (.+)$") if not source_name then return end local source, source_desc = get_source_and_source_desc(source_name) if not source then return end -- Compute description. local desc = "{{{langname}}} terms that originate from " .. source_desc .. "." local additional if source:hasType("family") then additional = "This category should, ideally, contain only other categories. Entries can be categorized here, too, when the proper subcategory is unclear. " .. "If you know the exact language from which an entry categorized here is derived, please edit its respective entry." end -- Compute parents. local derived_from_variety_of_self = false local parent local sortkey = source:getDisplayForm() if source:hasType("etymology-only") then -- By default, `parent` is the source's parent. parent = source:getParent() -- Check if the source is a variety (or subvariety) of the language. if data.lang and source:hasParent(data.lang) then derived_from_variety_of_self = true end -- If the language is the direct parent of the source or the parent is "und", then we use the family of the source as `parent` instead. if data.lang and (parent:getCode() == data.lang:getCode() or parent:getCode() == "und") then parent = source:getFamily() end -- Regular language or family. else local fam = source:getFamily() if fam then parent = fam end end -- If `parent` does not exist, is the same as `source`, or would be "isolate languages" or "not a family", then we discard it. if (not parent) or parent:getCode() == source:getCode() or parent:getCode() == "qfa-iso" or parent:getCode() == "qfa-not" or parent:getCode() == "qfa-unc" then parent = nil derived_from_variety_of_self = false -- Otherwise, get the display form. else parent = parent:getDisplayForm() end parent = parent and "terms derived from " .. parent or "terms derived from other languages" local parents = {{name = parent, sort = sortkey}} if derived_from_variety_of_self then insert(parents, "Category:Categories for terms in a language derived from a term in a subvariety of that language") end -- Compute umbrella parents. local cat_name = source:getCode() == "mul-tax" and "Taxonomic names" or source:getCategoryName() -- If the source is etymology-only, its category will be handled by the lect handler in -- [[Module:category tree/lects]]. If it has a nonstandard name like 'Kölsch' (i.e. not a name like -- 'American English' that has a language name in it), the lect handler won't handle it unless we tell it to do so -- through the following call; this is an optimization to avoid expensive processing work on all manner of randomly -- named categories. if source:hasType("etymology-only") then require("Module:category tree/lects").export.register_likely_lect_parent_cat(cat_name) end local umbrella_parents = { (source:hasType("family") or source:getCode() == "mul-tax") and {name = cat_name, raw = true, sort = " "} or {name = cat_name, raw = true, sort = "terms derived from"} } -- Without the following, the breadcrumb trail for e.g. [[Category:Javanese terms derived from French]] looks like -- Fundamental » All languages » Javanese » Terms by etymology » Terms derived from other languages » -- Indo-European languages » Italic languages » Romance languages » Italo-Western Romance languages » -- Western Romance languages » Gallo-Romance languages » Gallo-Rhaetian languages » Oïl languages » French -- To reduce the length, we truncate the "languages" part of the breadcrumbs as long as this does not create -- ambiguity (i.e. unless there is a language with the same name as the family). Hence, for the Category -- [[Category:Javanese terms derived from Arabic]], we end up with -- Fundamental » All languages » Javanese » Terms by etymology » Terms derived from other languages » Afroasiatic » -- Semitic » West Semitic » Central Semitic » Arabic languages » Arabic -- because "Arabic" is ambiguous between family and language (and script, for that matter). local breadcrumb = source_name if source:hasType("family") and breadcrumb:find(" languages$") then local truncated_breadcrumb = breadcrumb:gsub(" languages$", "") if not get_lang_by_name(truncated_breadcrumb, nil, "allow etym") then breadcrumb = truncated_breadcrumb end end return { description = desc, additional = additional, breadcrumb = breadcrumb, parents = parents, umbrella = { description = "Categories with terms that originate from " .. source_desc .. ".", parents = umbrella_parents, }, } end) -- Handler for categories of the form "LANG terms inherited/borrowed from SOURCE", where SOURCE is a language, -- etymology language or family (e.g. "Indo-European languages"). Also handles umbrella categories of the form -- "Terms inherited/borrowed from SOURCE". local function inherited_borrowed_handler(etymtype) return function(data) local source_name = data.label:match("^terms " .. etymtype .. " from (.+)$") if not source_name then return end local source, source_desc = get_source_and_source_desc(source_name) if not source then return end return { description = "{{{langname}}} terms " .. etymtype .. " from " .. source_desc .. ".", breadcrumb = source_name, parents = { {name = etymtype .. " terms", sort = source_name}, {name = "terms derived from " .. source_name, sort = " "}, }, umbrella = { parents = { { name = "terms derived from " .. source_name, is_label = true, sort = " " }, etymtype == "inherited" and { name = "Inherited terms subcategories by language", sort = source_name } -- There are several types of borrowings mixed into the following holding category, -- so keep these ones sorted under 'Terms borrowed from SOURCE_NAME' instead of just -- 'SOURCE_NAME'. or "Borrowed terms subcategories by language", } }, } end end insert(handlers, inherited_borrowed_handler("borrowed")) insert(handlers, inherited_borrowed_handler("inherited")) ----------------------------------------------------------------------------- ------------------------ Borrowing subtype handlers ------------------------- ----------------------------------------------------------------------------- -- General handler for specific borrowing subtypes, such as learned borrowings, calques and phono-semantic matchings. local function borrowing_subtype_handler(dest, source_name, parent_cat, spec) local source, source_desc = get_source_and_source_desc(source_name) if not source then return end -- normally uses of UNKNOWN should not show up to the end user local dest_name = dest and dest:getCanonicalName() or "UNKNOWN" local additional, umbrella_additional if spec.additional then if dest then additional = spec.additional(source, dest) else umbrella_additional = spec.umbrella_additional(source) end else if not spec.categorizing_templates then error("Internal error: Must specify either `categorizing_templates` or the combination of `additional` and `umbrella_additional` in each borrowing subtype spec") end local extra_templates = {} local extra_template_text for i, template in ipairs(spec.categorizing_templates) do if i > 1 then insert(extra_templates, ("{{tl|%s|...}}"):format(template)) end end if #extra_templates > 0 then extra_template_text = (" (or %s, using the same syntax)"):format( serial_comma_join(extra_templates, {conj = "or"})) else extra_template_text = "" end if dest then additional = ("To categorize a term into this category, use {{tl|%s|%s|%s|<var>source_term</var>}}%s, " .. "where <code><var>source_term</var></code> is the %s term that the term in question " .. "was borrowed from."):format( spec.categorizing_templates[1], dest:getCode(), source:getCode(), extra_template_text, source_name) else umbrella_additional = ("To categorize a term into a language-specific subcategory, use " .. "{{tl|%s|<var>destcode</var>|%s|<var>source_term</var>}}%s, where <code><var>destcode</var></code> " .. "is the language code of the language in question (see [[Wiktionary:List of languages]]), and " .. "<code><var>source_term</var></code> is the %s term that the term in question was " .. "borrowed from."):format(spec.categorizing_templates[1], source:getCode(), extra_template_text, source_name) end end return { description = "{{{langname}}} " .. spec.from_source_desc:gsub("SOURCE", source_desc):gsub("DEST", dest_name), additional = additional, breadcrumb = source_name, parents = { { name = parent_cat, sort = source_name }, { name = "terms borrowed from " .. source_name, sort = " " }, }, umbrella = { additional = umbrella_additional, parents = { { name = "terms borrowed from " .. source_name, is_label = true, sort = " " }, "Borrowed terms subcategories by language", } }, } end -- Specs describing types of borrowings. -- `from_source_desc` is the English description used in categories of the form "LANGUAGE BORTYPE from SOURCE", -- e.g. "Arabic semantic loans from English". "SOURCE" in the description is replaced by the source language. -- `umbrella_desc` is the English description used in categories of the form "LANGUAGE BORTYPE", e.g. -- "Arabic semantic loans". This is an umbrella category grouping all the source-language-specific categories. -- `uses_subtype_handler`, if true, means that the handler for "LANGUAGE BORTYPE from SOURCE" categories is -- implemented by a generic "TYPE borrowings" handler (at the bottom of this section), so we don't need to -- create a BORTYPE-specific handler. -- `umbrella_parent`, if given, is the parent category of the umbrella categories of the form "LANGUAGE BORTYPE". -- By default it is "borrowed terms". Some borrowing types replace this with "terms by etymology". (FIXME: -- Review whether this is correct.) -- `label_pattern`, if given, is a Lua pattern that matches the category name minus the language at the beginning. -- It should have one capture, which is the source language. An example is "^terms partially calqued from (.+)$". -- If omitted, it is generated from BORTYPE. -- `categorizing_templates`, if given, is the list of templates that categorize into this category. They are assumed to -- follow the syntax of {{bor}}. The first template in the list should be the preferred alias. The specified -- templates are used to form the `additional` text displayed on the language-specific category page and -- corresponding umbrella category page describing how to categorize into the category in question. In more complex -- cases, you can omit this field and instead supply the `additional` and `umbrella_additional` fields (as is done -- with adapted borrowings). You must either specify `categorizing_templates` or the combination of `additional` and -- `umbrella_additional`. -- `additional`, if given, is a function of two arguments (source and destination language objects) that will generate -- the `additional` text displayed on the language-specific category page that describes how to categorize into the -- category in question. This is an alternative to specifying `categorizing_templates`, used in more complex cases -- (currently, with adapted borrowings). -- `umbrella_additional`, if given, is a function of one argument (source language object) that will generate the -- `additional` text displayed on the umbrella category page that describes how to categorize into the category in -- question. This is an alternative to specifying `categorizing_templates`, used in more complex cases (currently, -- with adapted borrowings). local borrowing_specs = { ["learned borrowings"] = { from_source_desc = "terms that are learned [[loanword]]s from SOURCE, that is, terms that were directly incorporated from SOURCE instead of through normal language contact.", umbrella_desc = "terms that are learned [[loanword]]s, that is, terms that were directly incorporated from another language instead of through normal language contact.", uses_subtype_handler = true, categorizing_templates = {"lbor", "learned borrowing"}, }, ["semi-learned borrowings"] = { from_source_desc = "terms that are [[semi-learned borrowing|semi-learned]] [[loanword]]s from SOURCE, that is, terms borrowed from SOURCE (a [[classical language]]) into DEST (a modern language) and partly reshaped based on later [[sound change]]s or by analogy with [[inherit]]ed terms in the language.", umbrella_desc = "terms that are [[semi-learned borrowing|semi-learned]] [[loanword]]s, that is, terms borrowed from a [[classical language]] into a modern language and partly reshaped based on later [[sound change]]s or by analogy with [[inherit]]ed terms in the language.", uses_subtype_handler = true, categorizing_templates = {"slbor", "semi-learned borrowing"}, }, ["orthographic borrowings"] = { from_source_desc = "orthographic loans from SOURCE, i.e. terms that were borrowed from SOURCE in their script forms, not their pronunciations.", umbrella_desc = "orthographic loans, i.e. terms that were borrowed in their script forms, not their pronunciations.", uses_subtype_handler = true, categorizing_templates = {"obor", "orthographic borrowing"}, }, ["unadapted borrowings"] = { from_source_desc = "[[loanword]]s from SOURCE that have not been conformed to the morpho-syntactic, phonological and/or phonotactical rules of DEST.", umbrella_desc = "[[loanword]]s that have not been conformed to the morpho-syntactic, phonological and/or phonotactical rules of the target language.", uses_subtype_handler = true, categorizing_templates = {"ubor", "unadapted borrowing"}, }, ["adapted borrowings"] = { from_source_desc = "[[loanwords]] from SOURCE formed with the addition of an affix to conform the term to the normal morphology of DEST.", umbrella_desc = "[[loanword]]s formed with the addition of an affix to conform the term to the normal morphology of the target language.", uses_subtype_handler = true, additional = function(source, dest) return ("To categorize a term into this category, use {{tl|af|%s|3=type=adap|4=%s:<var>source_term</var>|5=-<var>affix</var>}} " .. "(or {{tl|af|%s|3=type=abor|4=...}}, using the same syntax), where <code><var>source_term</var></code> is " .. "the %s term that the term in question was borrowed from and <code><var>affix</var></code> " .. "is the %s affix used to adapt the %s term. An example is " .. "{{m+|pl|adresować||to address}}, which would use {{tl|af|pl|3=type=adap|4=fr:adresser|5=-ować}} to indicate " .. "that is was formed from {{m+|fr|adresser}} with the addition of the Polish verb-forming affix " .. "{{m|pl|-ować}}."):format(dest:getCode(), source:getCode(), dest:getCode(), source:getCanonicalName(), dest:getCanonicalName(), source:getCanonicalName()) end, umbrella_additional = function(source) return ("To categorize a term into a language-specific subcategory, use {{tl|af|<var>destcode</var>|3=type=adap|4=%s:<var>source_term</var>|5=-<var>affix</var>}} " .. "(or {{tl|af|<var>destcode</var>|3=type=abor|4=...}}, using the same syntax), where " .. "<code><var>destcode</var></code> is the language code of the target language in question (see " .. "[[Wiktionary:List of languages]]); <code><var>source_term</var></code> is the %s term " .. "that the term in question was borrowed from; and <code><var>affix</var></code> is the target-language " .. "affix used to adapt the %s term. An example is {{m+|pl|adresować||to address}}, which " .. "would use {{tl|af|pl|3=type=adap|4=fr:adresser|5=-ować}} to indicate that is was formed from " .. "{{m+|fr|adresser}} with the addition of the Polish verb-forming affix {{m|pl|-ować}}."):format( source:getCode(), source:getCanonicalName(), source:getCanonicalName()) end, }, ["semantic loans"] = { from_source_desc = "[[Appendix:Glossary#semantic loan|semantic loans]] from SOURCE, i.e. terms one or more of whose definitions was borrowed from a term in SOURCE.", umbrella_desc = "[[Appendix:Glossary#semantic loan|semantic loans]], i.e. terms one or more of whose definitions was borrowed from a term in another language.", umbrella_parent = "terms by etymology", categorizing_templates = {"sl", "semantic loan"}, }, ["partial calques"] = { from_source_desc = "terms that were [[Appendix:Glossary#partial calque|partially calqued]] from SOURCE, i.e. terms formed partly by piece-by-piece translations of SOURCE terms and partly by direct borrowing.", umbrella_desc = "[[Appendix:Glossary#partial calque|partial calques]], i.e. terms formed partly by piece-by-piece translations of terms from other languages and partly by direct borrowing.", umbrella_parent = "terms by etymology", label_pattern = "^terms partially calqued from (.+)$", categorizing_templates = {"pcal", "pclq", "partial calque"}, }, ["calques"] = { from_source_desc = "terms that were [[Appendix:Glossary#calque|calqued]] from SOURCE, i.e. terms formed by piece-by-piece translations of SOURCE terms.", umbrella_desc = "[[Appendix:Glossary#calque|calques]], i.e. terms formed by piece-by-piece translations of terms from other languages.", umbrella_parent = "terms by etymology", label_pattern = "^terms calqued from (.+)$", categorizing_templates = {"cal", "clq", "calque"}, }, ["phono-semantic matchings"] = { from_source_desc = "[[Appendix:Glossary#phono-semantic matching|phono-semantic matchings]] from SOURCE, i.e. terms that were borrowed by matching the etymon phonetically and semantically.", umbrella_desc = "[[Appendix:Glossary#phono-semantic matching|phono-semantic matchings]], i.e. terms that were borrowed by matching the etymon phonetically and semantically.", categorizing_templates = {"psm", "phono-semantic matching"}, }, ["pseudo-loans"] = { from_source_desc = "[[Appendix:Glossary#pseudo-loan|pseudo-loans]] from SOURCE, i.e. terms that appear to be SOURCE, but are not used or have an unrelated meaning in SOURCE itself.", umbrella_desc = "[[Appendix:Glossary#pseudo-loan|pseudo-loans]], i.e. terms that appear to be derived from another language, but are not used or have an unrelated meaning in that language itself.", categorizing_templates = {"pl", "pseudo-loan"}, }, } for bortype, spec in pairs(borrowing_specs) do labels[bortype] = { description = "{{{langname}}} " .. spec.umbrella_desc, parents = {spec.umbrella_parent or "borrowed terms"}, umbrella_parents = "Terms by etymology subcategories by language", } if not spec.uses_subtype_handler then -- If the label pattern isn't specifically given, generate it from the `bortype`; but make sure to -- escape hyphens in the pattern. local label_pattern = spec.label_pattern or "^" .. pattern_escape(bortype) .. " from (.+)$" insert(handlers, function(data) local source_name = data.label:match(label_pattern) if source_name then return borrowing_subtype_handler(data.lang, source_name, bortype, spec) end end) end end insert(handlers, function(data) local borrowing_type, source_name = data.label:match("^(.+ borrowings) from (.+)$") if borrowing_type then local spec = borrowing_specs[borrowing_type] return borrowing_subtype_handler(data.lang, source_name, borrowing_type, spec) end end) ----------------------------------------------------------------------------- ---------------------- Indo-Aryan extension handlers ------------------------ ----------------------------------------------------------------------------- -- FIXME: Put this in a family-specific module. insert(handlers, function(data) local labelpref, extension = data.label:match("^(terms extended with Indo%-Aryan )(.+)$") if not extension then return end local lang_inc_ash = require("Module:languages").getByCode("inc-ash") local linked_term = full_link({lang = lang_inc_ash, term = extension}, "term") local tagged_term = tag_text(extension, lang_inc_ash, nil, "term") return { description = "{{{langname}}} terms extended with the [[Indo-Aryan]] [[pleonastic]] affix " .. linked_term .. ".", displaytitle = "{{{langname}}} " .. labelpref .. tagged_term, breadcrumb = tagged_term, parents = {{name = "terms with Indo-Aryan extensions", sort = extension}}, umbrella = { no_by_language = true, parents = "Indo-Aryan extensions", displaytitle = "Terms extended with Indo-Aryan " .. tagged_term, } } end) ----------------------------------------------------------------------------- ---------------------------- Coined-by handlers ----------------------------- ----------------------------------------------------------------------------- insert(handlers, function(data) local coiner = data.label:match("^terms coined by (.+)$") if not coiner then return end -- Sort by last name per request from [[User:Metaknowledge]] local last_name = umatch(coiner, ".-%s(%S+)$") return { description = "{{{langname}}} terms coined by " .. coiner .. ".", breadcrumb = coiner, parents = {{ name = "coinages", sort = last_name and last_name .. ", " .. coiner or coiner, }}, umbrella = false, } end) ----------------------------------------------------------------------------- ------------------------ Multiple etymology handlers ------------------------ ----------------------------------------------------------------------------- insert(handlers, function(data) local pos = data.label:match("^terms with multiple (.+) etymologies$") if not pos then return end local plpos = pluralize_pos(pos) local postype = pos_lemma_or_nonlemma(plpos) if not postype then return end return { description = "{{{langname}}} " .. plpos .. " that are derived from multiple origins.", umbrella_parents = "Multiple etymology subcategories by language", breadcrumb = "multiple " .. plpos, parents = {{ name = "terms with multiple " .. postype .. " etymologies", sort = pos, }}, } end) insert(handlers, function(data) local pos1, pos2 = data.label:match("^terms with (.+) and (.+) etymologies$") if not pos1 then return end local pos1type = pos_lemma_or_nonlemma(pluralize_pos(pos1)) local pos2type = pos_lemma_or_nonlemma(pluralize_pos(pos2)) if not (pos1type and pos2type) then return end return { description = "{{{langname}}} terms consisting of " .. add_indefinite_article(pos1) .." of one origin and " .. add_indefinite_article(pos2) .. " of a different origin.", umbrella_parents = "Multiple etymology subcategories by language", breadcrumb = pos1 .. " and " .. pos2, parents = {{ name = pos1type == pos2type and "terms with multiple " .. pos1type .. " etymologies" or "terms with lemma and non-lemma form etymologies", sort = pos1 .. " and " .. pos2, }}, } end) ----------------------------------------------------------------------------- --------------------------- Borrowed-back handlers -------------------------- ----------------------------------------------------------------------------- -- Handler for categories of the form e.g. [[:Category:English terms borrowed back into English]]. We need to use a handler -- because the category's language occurs inside the label itself. For the same reason, the umbrella category has a -- nonstandard name "Terms borrowed back into the same language", so we handle it as a regular parent and disable the -- built-in umbrella mechanism. insert(handlers, function(data) local lang = data.lang if not lang then return end local source_name = data.label:match("^terms borrowed back into (.+)$") if not (source_name and source_name == lang:getDisplayForm()) then return end return { description = "{{{langname}}} terms that were borrowed from another language that originally borrowed the term from " .. source_name .. ".", parents = {"terms by etymology", "borrowed terms", { name = "Terms borrowed back into the same language", raw = true, sort = "{{{langname}}}" }}, umbrella = false, -- Umbrella has a nonstandard name so we treat it as a raw category } end) ----------------------------------------------------------------------------- -- -- -- RAW HANDLERS -- -- -- ----------------------------------------------------------------------------- -- Handler for umbrella metacategories of the form e.g. [[:Category:Terms derived from Proto-Indo-Iranian roots]] -- and [[:Category:Terms derived from Proto-Indo-European words]]. Replaces the former -- [[Module:category tree/PIE root cat]], [[Module:category tree/root cat]] and [[Template:PIE word cat]]. insert(raw_handlers, function(data) local source_name, terms_type for _, tt in ipairs{"roots", "words", "terms"} do source_name = data.category:match("^Terms derived from (.+) " .. tt .. "$") if source_name then terms_type = tt break end end if not source_name then return end local source = get_source(source_name, false, "getCanonicalName") if not source then return end return { description = "Umbrella categories covering terms derived from particular " .. get_source_and_type_desc(source, terms_type) .. ".", additional = "{{{umbrella_meta_msg}}}", parents = { "Umbrella metacategories", { name = terms_type == "roots" and "roots" or "lemmas", is_label = true, lang = source:getCode(), sort = " " }, { name = "terms derived from " .. source_name, is_label = true, sort = " " .. terms_type }, }, } end) return {LABELS = labels, RAW_CATEGORIES = raw_categories, HANDLERS = handlers, RAW_HANDLERS = raw_handlers} amspenxva9ysxyafikht7w0t3hcmpvg 487810 487809 2026-09-02T19:13:37Z SM7 6218 SM7 ने पृष्ठ [[मॉड्यूल:category tree/etymology]] को [[मॉड्यूल:category tree/व्युत्पत्ति]] पर स्थानांतरित किया 487809 Scribunto text/plain local labels = {} local raw_categories = {} local handlers = {} local raw_handlers = {} local en_utilities_module = "Module:en-utilities" local m_str_utils = require("Module:string utilities") local add_indefinite_article = require(en_utilities_module).add_indefinite_article local full_link = require("Module:links").full_link local get_lang_by_name = require("Module:languages").getByCanonicalName local insert = table.insert local pattern_escape = m_str_utils.pattern_escape local plain_gsub = m_str_utils.plain_gsub local pluralize_pos = require("Module:headword").pluralize_pos local pos_lemma_or_nonlemma = require("Module:headword").pos_lemma_or_nonlemma local serial_comma_join = require("Module:table").serialCommaJoin local tag_text = require("Module:script utilities").tag_text local umatch = mw.ustring.match local unpack = unpack or table.unpack -- Lua 5.2 compatibility ----------------------------------------------------------------------------- -- -- -- LABELS -- -- -- ----------------------------------------------------------------------------- labels["टर्म व्युत्पत्ति अनुसार"] = { description = "{{{langname}}} terms categorized by their etymologies.", umbrella_parents = "मूलभूत श्रेणी", parents = {{name = "{{{langcat}}}", raw = true}}, } labels["AABB-type reduplications"] = { description = "{{{langname}}} terms that underwent [[reduplication]] in an AABB pattern.", breadcrumb = "AABB-type", parents = {"reduplications"}, } labels["apophonic reduplications"] = { description = "{{{langname}}} terms that underwent [[reduplication]] with only a change in a vowel sound.", breadcrumb = "apophonic", parents = {"reduplications"}, } labels["back-formations"] = { description = "{{{langname}}} terms formed by reversing a supposed regular formation, removing part of an older term.", parents = {"terms by etymology"}, } labels["blends"] = { description = "{{{langname}}} terms formed by combinations of other words.", parents = {"terms by etymology"}, } labels["borrowed terms"] = { description = "{{{langname}}} terms that are loanwords, i.e. terms that were directly incorporated from another language.", parents = {"terms by etymology"}, } labels["catachreses"] = { description = "{{{langname}}} terms derived from misuses or misapplications of other terms.", parents = {"terms by etymology"}, } labels["coinages"] = { description = "{{{langname}}} terms coined by an identifiable person, organization or other such entity.", parents = {"terms attributed to a specific source"}, umbrella_parents = {name = "terms attributed to a specific source", is_label = true, sort = " "}, } labels["coordinated pairs"] = { description = "Terms in {{{langname}}} consisting of a pair of terms joined by a [[coordinating conjunction]].", parents = {"terms by etymology"}, } labels["coordinated triples"] = { description = "Terms in {{{langname}}} consisting of three terms joined by one or more [[coordinating conjunction]]s.", parents = {"terms by etymology"}, } labels["coordinated quadruples"] = { description = "Terms in {{{langname}}} consisting of four terms joined by one or more [[coordinating conjunction]]s.", parents = {"terms by etymology"}, } labels["coordinated quintuples"] = { description = "Terms in {{{langname}}} consisting of five terms joined by one or more [[coordinating conjunction]]s.", parents = {"terms by etymology"}, } labels["denominals"] = { description = "{{{langname}}} terms derived from a noun.", parents = {"terms by etymology"}, } labels["deverbals"] = { description = "{{{langname}}} terms derived from a verb.", parents = {"terms by etymology"}, } labels["doublets"] = { description = "{{{langname}}} terms that trace their etymology from ultimately the same source as other terms in the same language, but by different routes, and often with subtly or substantially different meanings.", parents = {"terms by etymology"}, } labels["elongated forms"] = { description = "{{{langname}}} terms where one or more letters or sounds is repeated for emphasis or effect.", parents = {"terms by etymology"}, } labels["eponyms"] = { description = "{{{langname}}} terms derived from names of real or fictitious individuals.", parents = {"terms by etymology"}, } labels["genericized trademarks"] = { description = "{{{langname}}} terms that originate from [[trademark]]s, [[brand]]s and company names which have become [[genericized]]; that is, fallen into common usage in the target market's [[vernacular]], even when referring to other competing brands.", parents = {"terms by etymology", "trademarks"}, } labels["ghost words"] = { description = "{{{langname}}} terms that were originally erroneous or fictitious, published in a reference work as if they were genuine as a result of typographical error, misreading, or misinterpretation, or as [[:w:Fictitious entry|fictitious entries]], jokes, or hoaxes.", parents = {"terms by etymology"}, } labels["gramograms"] = { description = "{{{langname}}} [[gramogram]]s &ndash; terms that are partially or completely spelled with [[homophone|homophonous]] letters.", parents = {"rebuses"}, } labels["haplological words"] = { description = "{{{langname}}} words that underwent [[haplology]]: thus, their origin involved a loss or omission of a repeated sequence of sounds.", parents = {"terms by etymology"}, } labels["homophonic translations"] = { description = "{{{langname}}} terms that were borrowed by matching the etymon phonetically, without regard for the sense; compare [[phono-semantic matching]] and [[Hobson-Jobson]].", parents = {"terms by etymology"} } labels["hybridisms"] = { description = "{{{langname}}} terms formed by elements of different linguistic origins.", parents = {"terms by etymology"}, } labels["inherited terms"] = { description = "{{{langname}}} terms that were inherited from an earlier stage of the language.", parents = {"terms by etymology"}, } labels["internationalisms"] = { description = "{{{langname}}} loanwords which also exist in many other languages with the same or similar etymology.", additional = "Terms should be here preferably only if the immediate source language is not known for certain. Entries are added into this category by [[Template:internationalism]]; see it for more information.", parents = {"terms by etymology"}, } labels["legal doublets"] = { description = "{{{langname}}} legal [[doublet]]s &ndash; a legal doublet is a standardized phrase commonly used in legal documents, proceedings etc. which includes two words that are near synonyms.", parents = {"coordinated pairs"}, } labels["legal triplets"] = { description = "{{{langname}}} legal [[triplet]]s &ndash; a legal triplet is a standardized phrase commonly used in legal documents, proceedings etc which includes three words that are near synonyms.", parents = {"coordinated triples"}, } labels["LLM coinages"] = { description = "{{{langname}}} terms that have been coined by {{w|large language models}} rather than humans.", parents = {"terms by etymology"}, } labels["merisms"] = { description = "{{{langname}}} [[merism]]s &ndash; terms that are [[coordinate]]s that, combined, are a synonym for a totality.", parents = {"coordinated pairs"}, } labels["metonyms"] = { description = "{{{langname}}} terms whose origin involves calling a thing or concept not by its own name, but by the name of something intimately associated with that thing or concept.", parents = {"terms by etymology"}, } labels["neologisms"] = { description = "{{{langname}}} terms that have been only recently acknowledged.", parents = {"terms by etymology"}, } labels["nominalizations"] = { description = "{{{langname}}} terms formed by nominalization, a process where a word from another part of speech becomes a noun.", parents = {"terms by etymology"}, } labels["nonce terms"] = { description = "{{{langname}}} terms that have been invented for a single occasion.", parents = {"terms by etymology"}, } labels["number homophones"] = { description = "{{{langname}}} terms that are partially or completely spelled with [[homophone|homophonous]] numbers.", parents = {"rebuses", "terms spelled with numbers"}, } labels["numerical contractions"] = { description = "{{{langname}}} numerical contractions. In these, the number either denotes omitted characters ({{m+|en|globalization}} → {{m|en|g11n}}) or duplication ({{m+|kne|Kankanaey}} → {{m|kne|Kan2aey}}).", parents = {"contractions", "rebuses", "terms spelled with numbers"}, } labels["onomatopoeias"] = { description = "{{{langname}}} terms that were coined to sound like what they represent.", parents = {"terms by etymology"}, } labels["piecewise doublets"] = { description = "{{{langname}}} terms that are [[Appendix:Glossary#piecewise doublet|piecewise doublets]].", parents = {"terms by etymology"}, } for _, ism_and_langname in ipairs({ {"anglicisms", "English"}, {"Arabisms", "Arabic"}, {"Gallicisms", "French"}, {"Germanisms", "German"}, {"Hispanisms", "Spanish"}, {"Italianisms", "Italian"}, {"Latinisms", "Latin"}, {"Japonisms", "Japanese"}, }) do local ism, langname = unpack(ism_and_langname) labels["pseudo-" .. ism] = { description = "{{{langname}}} terms that appear to be " .. langname .. ", but are not used or have an unrelated meaning in " .. langname .. " itself.", parents = {"pseudo-loans"}, umbrella_parents = {name = "pseudo-loans", is_label = true, sort = " "}, } end labels["rebracketings"] = { description = "{{{langname}}} terms that have interacted with another word in such a way that the boundary between the words has been modified.", parents = {"terms by etymology"} } labels["rebuses"] = { description = "{{{langname}}} [[rebus]]es &ndash; terms that are partially or completely represented by images, symbols or numbers, often as a form of wordplay.", parents = {"terms by etymology"}, } labels["reconstructed terms"] = { description = "{{{langname}}} terms that are not directly attested, but have been reconstructed through other evidence.", parents = {"terms by etymology"} } labels["reduplicated coordinated pairs"] = { description = "{{{langname}}} reduplicated coordinated pairs.", breadcrumb = "reduplicated", parents = {"coordinated pairs", "reduplications"}, } labels["reduplicated coordinated triples"] = { description = "{{{langname}}} reduplicated coordinated triples.", breadcrumb = "reduplicated", parents = {"coordinated triples", "reduplications"}, } labels["reduplicated coordinated quadruples"] = { description = "{{{langname}}} reduplicated coordinated quadruples.", breadcrumb = "reduplicated", parents = {"coordinated quadruples", "reduplications"}, } labels["reduplicated coordinated quintuples"] = { description = "{{{langname}}} reduplicated coordinated quintuples.", breadcrumb = "reduplicated", parents = {"coordinated quintuples", "reduplications"}, } labels["reduplications"] = { description = "{{{langname}}} terms that underwent [[reduplication]], so their origin involved a repetition of roots or stems.", parents = {"terms by etymology"}, } labels["retronyms"] = { description = "{{{langname}}} terms that serve as new unique names for older objects or concepts whose previous names became ambiguous.", parents = {"terms by etymology"}, } labels["roots"] = { description = "Basic morphemes from which {{{langname}}} words are formed.", parents = {"terms by etymology", "morphemes"}, } labels["Sanskritic formations"] = { description = "{{{langname}}} terms coined from [[tatsama]] [[word]]s and/or [[affix]]es.", parents = {"terms by etymology", "terms derived from Sanskrit"}, } labels["sound-symbolic terms"] = { description = "{{{langname}}} terms that use {{w|sound symbolism}} to express ideas but which are not necessarily strictly speaking [[onomatopoeic]].", parents = {"terms by etymology"}, } labels["spelled-out initialisms"] = { description = "{{{langname}}} initialisms in which the letter names are spelled out.", parents = {"terms by etymology"}, } labels["spelling pronunciations"] = { description = "{{{langname}}} terms whose pronunciation was historically or presently affected by their spelling.", parents = {"terms by etymology"}, } labels["spoonerisms"] = { description = "{{{langname}}} terms in which the initial sounds of component parts have been exchanged, as in \"crook and nanny\" for \"nook and cranny\".", parents = {"terms by etymology"}, } labels["taxonomic eponyms"] = { description = "{{{langname}}} terms derived from names of real or fictitious people, used for [[taxonomy]].", parents = {"eponyms"}, } labels["terms attributed to a specific source"] = { description = "{{{langname}}} terms coined by an identifiable person or deriving from a known work.", parents = {"terms by etymology"}, } labels["terms coined ex nihilo"] = { description = "{{{langname}}} terms fabricated ''[[ex nihilo]]'', i.e. made up entirely rather than being derived from an existing source.", parents = {"terms by etymology"}, } labels["terms containing fossilized case endings"] = { description = "{{{langname}}} terms which preserve case morphology which is no longer analyzable within the contemporary grammatical system or which has been entirely lost from the language.", parents = {"terms by etymology"}, } labels["terms derived from area codes"] = { description = "{{{langname}}} terms derived from [[area code]]s.", parents = {"terms by etymology"}, } labels["terms derived from the shape of letters"] = { description = "{{{langname}}} terms derived from the shape of letters. This can include terms derived from the shape of any letter in any alphabet.", parents = {"terms by etymology"}, } labels["terms by root"] = { description = "{{{langname}}} terms categorized by the root they originate from.", parents = {"terms by etymology", {name = "roots", sort = " "}}, } labels["terms by word"] = { description = "{{{langname}}} terms categorized by the word they originate from.", parents = {"terms by etymology"}, } labels["terms derived from fiction"] = { description = "{{{langname}}} terms that originate from works of [[fiction]].", breadcrumb = "fiction", parents = {{name = "terms attributed to a specific source", sort = "fiction"}}, } for _, data in ipairs { {source="Dickensian works", desc="the works of [[w:Charles Dickens|Charles Dickens]]", topic_parent="Charles Dickens"}, {source="DC Comics", desc="[[w:DC Comics|DC Comics]]"}, {source="Doraemon", desc="[[w:Fujiko F. Fujio|Fujiko F. Fujio]]'s ''[[w:Doraemon|Doraemon]]''", displaytitle="''Doraemon''"}, {source="Dragon Ball", desc="[[w:Akira Toriyama|Akira Toriyama]]'s ''[[w:Dragon Ball|Dragon Ball]]''", displaytitle="''Dragon Ball''"}, {source="Duckburg and Mouseton", desc="[[w:The Walt Disney Company|Disney]]'s [[w:Duck universe|Duckburg]] and [[w:Mickey Mouse universe|Mouseton]] universe", topic_parent="Disney"}, {source="Futurama", desc="the animated television series ''{{w|Futurama}}''", displaytitle = "''Futurama''"}, {source="Harry Potter", desc="the ''[[w:Harry Potter|Harry Potter]]'' series", displaytitle="''Harry Potter''", topic_parent="Harry Potter"}, {source="Looney Tunes and Merrie Melodies", desc="''{{w|Looney Tunes}}'' and/or ''{{w|Merrie Melodies}}'', by {{w|Warner Bros. Animation}}", displaytitle = "''Looney Tunes'' and ''Merrie Melodies''"}, {source="Nineteen Eighty-Four", desc="[[w:George Orwell|George Orwell]]'s ''[[w:Nineteen Eighty-Four|Nineteen Eighty-Four]]''", displaytitle="''Nineteen Eighty-Four''"}, {source="Seinfeld", desc="the American television sitcom ''{{w|Seinfeld}}'' (1989–1998)", displaytitle="''Seinfeld''"}, {source="Seussian works", desc="the works of [[w:Dr. Seuss|Dr. Seuss]]"}, {source="South Park", desc="the animated television series ''[[w:South Park|South Park]]''", displaytitle="''South Park''"}, {source="Star Trek", desc="''[[w:Star Trek|Star Trek]]''", displaytitle="''Star Trek''", topic_parent="Star Trek"}, {source="Star Wars", desc="''[[w:Star Wars|Star Wars]]''", displaytitle="''Star Wars''", topic_parent="Star Wars"}, {source="The Simpsons", desc="''[[w:The Simpsons|The Simpsons]]''", displaytitle="''The Simpsons''", topic_parent="The Simpsons", sort="Simpsons"}, {source="Tolkien's legendarium", desc="the [[legendarium]] of [[w:J. R. R. Tolkien|J. R. R. Tolkien]]", topic_parent="J. R. R. Tolkien"}, } do local parents = {{name = "terms derived from fiction", sort = data.sort or data.source}} local umbrella_parents = {"Terms by etymology subcategories by language"} if data.topic_parent then insert(parents, {name = "{{{langcode}}}:" .. data.topic_parent, raw = true}) insert(umbrella_parents, {name = data.topic_parent, raw = true}) end labels["terms derived from " .. data.source] = { description = "{{{langname}}} terms that originate from " .. data.desc .. ".", breadcrumb = data.displaytitle or data.source, parents = parents, umbrella = { parents = umbrella_parents, displaytitle = data.displaytitle and "Terms derived from " .. data.displaytitle .. " by language" or nil, breadcrumb = data.displaytitle and "Terms derived from " .. data.displaytitle, }, displaytitle = data.displaytitle and "{{{langname}}} terms derived from " .. data.displaytitle or nil, } end labels["terms derived from Greek mythology"] = { description = "{{{langname}}} terms derived from Greek mythology which have acquired an idiomatic meaning.", breadcrumb = "Greek mythology", parents = {{name = "terms attributed to a specific source", sort = "Greek mythology"}}, } labels["terms derived from occupations"] = { description = "{{{langname}}} terms derived from names of occupations.", parents = {"terms by etymology"}, } labels["terms derived from other languages"] = { description = "{{{langname}}} terms that originate from other languages.", parents = {"terms by etymology"}, } labels["terms derived from the Bible"] = { description = "{{{langname}}} terms that originate from the [[Bible]].", breadcrumb = {name = "the Bible", nocap = true}, parents = {{name = "terms attributed to a specific source", sort = "Bible"}}, } labels["terms derived from Aesop's Fables"] = { description = "{{{langname}}} terms that originate from [[Aesop]]'s Fables.", breadcrumb = "Aesop's Fables", parents = {{name = "terms attributed to a specific source", sort = "Aesop's Fables"}}, } labels["terms derived from toponyms"] = { description = "{{{langname}}} terms derived from names of real or fictitious places.", parents = {"terms by etymology"}, } labels["terms derived through romanized wordplay"] = { description = "{{{langname}}} terms derived through romanized wordplay.", parents = {"terms by etymology"}, } labels["terms making reference to character shapes"] = { description = "{{{langname}}} terms making reference to character shapes.", parents = {"terms by etymology"}, } labels["terms derived from sports"] = { description = "{{{langname}}} terms that originate from sports.", breadcrumb = "sports", parents = {{name = "terms attributed to a specific source", sort = "sports"}}, } labels["terms derived from baseball"] = { description = "{{{langname}}} terms that originate from baseball.", breadcrumb = "baseball", parents = {{name = "terms derived from sports", sort = "baseball"}}, } labels["terms with Indo-Aryan extensions"] = { description = "{{{langname}}} terms extended with particular [[Indo-Aryan]] [[pleonastic]] affixes.", parents = {"terms by etymology"}, } labels["terms with lemma and non-lemma form etymologies"] = { description = "{{{langname}}} terms consisting of both a lemma and non-lemma form, of different origins.", breadcrumb = "lemma and non-lemma form", parents = {"terms with multiple etymologies"}, } labels["terms with multiple etymologies"] = { description = "{{{langname}}} terms that are derived from multiple origins.", parents = {"terms by etymology"}, } labels["terms with multiple lemma etymologies"] = { description = "{{{langname}}} lemmas that are derived from multiple origins.", breadcrumb = "multiple lemmas", parents = {"terms with multiple etymologies"}, } labels["terms with multiple non-lemma form etymologies"] = { description = "{{{langname}}} non-lemma forms that are derived from multiple origins.", breadcrumb = "multiple non-lemma forms", parents = {"terms with multiple etymologies"}, } labels["terms with unknown etymologies"] = { description = "{{{langname}}} terms whose etymologies have not yet been established.", parents = {{name = "terms by etymology", sort = "unknown etymology"}}, } labels["univerbations"] = { description = "{{{langname}}} terms that result from the agglutination of two or more words.", parents = {"terms by etymology"}, } labels["words derived through corruption"] = { description = "{{{langname}}} words that result from a non-specific or sporadic change.", parents = {{name = "terms by etymology", sort = "corruption"}}, } labels["words derived through metathesis"] = { description = "{{{langname}}} words that were created through [[metathesis]] from another word.", parents = {{name = "terms by etymology", sort = "metathesis"}}, } labels["words that have undergone semantic shift"] = { description = "{{{langname}}} words that show senses explained by [[semantic shift]].", parents = {{name = "terms by etymology", sort = "semantic shift"}}, } labels["words that have undergone semantic broadening"] = { description = "{{{langname}}} words that show senses explained by [[semantic]] [[broadening]].", parents = {{name = "words that have undergone semantic shift", sort = "semantic broadening"}}, } labels["words that have undergone semantic narrowing"] = { description = "{{{langname}}} words that show senses explained by [[semantic]] [[narrowing]].", parents = {{name = "words that have undergone semantic shift", sort = "semantic narrowing"}}, } labels["words that have undergone amelioration"] = { description = "{{{langname}}} words that have gained a positive [[connotation]] over time.", parents = {{name = "words that have undergone semantic shift", sort = "amelioration"}}, } labels["words that have undergone pejoration"] = { description = "{{{langname}}} words that have gained a negative [[connotation]] over time.", parents = {{name = "words that have undergone semantic shift", sort = "pejoration"}}, } labels["terms with origins in folklore"] = { description = "{{{langname}}} terms that have an etymology rooted in folklore.", breadcrumb = "Folklore", parents = {{name = "terms by etymology", sort = "folklore"}, {name = "{{{langcode}}}:Folklore", raw = true}}, umbrella_parents = {{name = "Terms by etymology subcategories by language", raw = true}, {name = "Folklore", raw = true, sort = " "}} } -- Add 'umbrella_parents' key if not already present. for _, data in pairs(labels) do -- NOTE: umbrella.parents overrides umbrella_parents if both are given. if not data.umbrella_parents then data.umbrella_parents = "Terms by etymology subcategories by language" end end ----------------------------------------------------------------------------- -- -- -- RAW CATEGORIES -- -- -- ----------------------------------------------------------------------------- raw_categories["Terms by etymology subcategories by language"] = { description = "Umbrella categories covering topics related to terms categorized by their etymologies, such as types of compounds or borrowings.", additional = "{{{umbrella_meta_msg}}}", parents = { "Umbrella metacategories", {name = "terms by etymology", is_label = true, sort = " "}, }, } raw_categories["Borrowed terms subcategories by language"] = { description = "Umbrella categories covering topics related to borrowed terms.", additional = "{{{umbrella_meta_msg}}}", parents = { "Umbrella metacategories", {name = "borrowed terms", is_label = true, sort = " "}, {name = "Terms by etymology subcategories by language", sort = " "}, }, } raw_categories["Inherited terms subcategories by language"] = { description = "Umbrella categories covering topics related to inherited terms.", additional = "{{{umbrella_meta_msg}}}", parents = { "Umbrella metacategories", {name = "inherited terms", is_label = true, sort = " "}, {name = "Terms by etymology subcategories by language", sort = " "}, }, } raw_categories["Indo-Aryan extensions"] = { description = "Umbrella categories covering terms extended with particular [[Indo-Aryan]] [[pleonastic]] affixes.", additional = "{{{umbrella_meta_msg}}}", parents = { "Umbrella metacategories", {name = "Terms by etymology subcategories by language", sort = " "}, }, } raw_categories["Multiple etymology subcategories by language"] = { description = "Umbrella categories covering topics related to terms with multiple etymologies.", additional = "{{{umbrella_meta_msg}}}", parents = { "Umbrella metacategories", {name = "Terms by etymology subcategories by language", sort = " "}, }, } raw_categories["Terms borrowed back into the same language"] = { description = "Categories with terms in specific languages that were borrowed from a second language that previously borrowed the term from the first language.", additional = "A well-known example is {{m+|en|salaryman}}, a term borrowed from Japanese which in turn was borrowed from the English words [[salary]] and [[man]].\n\n{{{umbrella_msg}}}", parents = "Terms by etymology subcategories by language", } ----------------------------------------------------------------------------- -- -- -- HANDLERS -- -- -- ----------------------------------------------------------------------------- local function get_source(source_name, allow_family, name_type) local source = get_lang_by_name(source_name, nil, true, allow_family) if source == nil then return nil end -- Check that the source name matches the expected form (e.g. getCanonicalName, getDisplayForm etc). if source[name_type](source) == source_name then return source end end local function get_source_and_type_desc(source, term_type) if source:getCode() == "ine-pro" and term_type:find("^roots?$") then return "[[w:Proto-Indo-European root|Proto-Indo-European " .. term_type .. "]]" end return "[[w:" .. source:getWikipediaArticle() .. "|" .. source:getCanonicalName() .. "]] " .. term_type end local function get_source_and_source_desc(source_name) -- HACK! Map 'taxonomic names', as generated by [[Module:etymology]], back to its canonical name -- before calling getByCanonicalName(). We need a more general solution here. local source_desc if source_name == "taxonomic names" then source_name = "taxonomic name" source_desc = "[[w:taxonomic nomenclature|taxonomic names]]" end local source = get_source(source_name, true, "getDisplayForm") if source == nil then return end source_desc = source_desc or source:makeCategoryLink() if source:hasType("family") then source_desc = "one of the " .. source_desc end return source, source_desc end ----------------------------------------------------------------------------- ------------------------------- word handlers ------------------------------- ----------------------------------------------------------------------------- -- Handlers for 'terms derived from the SOURCE word word' must go *BEFORE* the -- more general 'terms derived from SOURCE' handler. -- Root data from [[Module:roots]], which owns the separator, link target and -- romanization for each language. Required on demand so that category pages -- unrelated to roots do not load it. local function get_root_data(lang) return lang and require("Module:roots").get_data(lang:getCode()) or nil end -- Languages such as Hebrew have no automatic transliteration, but their root data -- defines one; this keeps the category description matching the root entry. local function root_translit(rdata, root) if not (rdata and rdata.romanization) then return nil end return require("Module:roots").transliterate(root, rdata.romanization) end -- Raises on a root that is not well-formed for its language. A language without root -- data declares no radical structure, so nothing is checked. local function assert_valid_root(lang, root) return require("Module:roots").assert_root(lang, root) end -- Whether a language's roots live at `Appendix:<language> roots/<root>`. The root data -- is the only authority: a language that does not declare `appendix_subpage` links to -- the root in mainspace. local function lang_uses_appendix_roots(lang) local rdata = get_root_data(lang) return rdata ~= nil and rdata.link_target == "appendix_subpage" end insert(handlers, function(data) local labelpref, word_and_id = data.label:match("^(terms belonging to the word )(.+)$") if not word_and_id then return end local word, id = word_and_id:match("^(.+) %((.-)%)$") if not word then word = word_and_id end local is_semitic = data.lang:inFamily("sem") local word_desc = is_semitic and "[[w:Semitic word|word]]" or "word" local parents = {} if id then insert(parents, {name = labelpref .. word, sort = id}) end insert(parents, {name = "terms by word", sort = word_and_id}) local separators = "־ %-" local separator_c = "[" .. separators .. "]" local not_separator_c = "[^" .. separators .. "]" -- remove any leading or trailing separators (e.g. in PIE-style words) local word_no_prefix_suffix = mw.ustring.gsub(mw.ustring.gsub(word, separator_c .. "$", ""), "^" .. separator_c, "") local num_sep = mw.ustring.len(mw.ustring.gsub(word_no_prefix_suffix, not_separator_c, "")) local linked_word = data.lang and full_link({ term = word, lang = data.lang, gloss = id, id = id }, "term") or word if num_sep > 0 then insert(parents, {name = "" .. (num_sep + 1) .. "-letter words", sort = word_and_id}) end -- Italicize the word/word in the title. local function displaytitle(title, lang) return plain_gsub(title, word, tag_text(word, lang, nil, "term")) end local breadcrumb = tag_text(word, data.lang, nil, "term") .. (id and " (" .. id .. ")" or "") return { description = "{{{langname}}} terms that belong to the " .. word_desc .. " " .. linked_word .. ".", displaytitle = displaytitle, breadcrumb = breadcrumb, parents = parents, umbrella = false, } end) insert(handlers, function(data) local source_name = data.label:match("^terms by (.+) word$") if not source_name then return end local source = get_source(source_name, false, "getCanonicalName") if not source then return end local parents = {"terms by etymology"} -- In [[:Category:Proto-Indo-Iranian terms by Proto-Indo-Iranian word]], -- don't add parent [[:Category:Proto-Indo-Iranian terms derived from Proto-Indo-Iranian]]. if not data.lang or data.lang:getCode() ~= source:getCode() then insert(parents, "terms derived from " .. source:getDisplayForm()) end return { description = "{{{langname}}} terms categorized by the " .. get_source_and_type_desc(source, "word") .. " they originate from.", parents = parents, umbrella_parents = "Terms by etymology subcategories by language", } end) ----------------------------------------------------------------------------- ------------------------------- Root handlers ------------------------------- ----------------------------------------------------------------------------- -- Handlers for 'terms derived from the SOURCE root ROOT' must go *BEFORE* the -- more general 'terms derived from SOURCE' handler. -- Handler for e.g. [[:Category:Yola terms derived from the Proto-Indo-European root *h₂el- (grow)]] and -- [[:Category:Russian terms derived from the Proto-Indo-European word *swé]], and corresponding umbrella -- categories [[:Category:Terms derived from the Proto-Indo-European root *h₂el- (grow)]] and -- [[:Category:Terms derived from the Proto-Indo-European word *swé]]. Replaces the former -- [[Module:category tree/PIE root cat]], [[Module:category tree/root cat]] and [[Template:PIE word cat]]. insert(handlers, function(data) local source_name, term_type, term_and_id for _, tt in ipairs{"root", "word", "term"} do source_name, term_and_id = data.label:match("^terms derived from the (.+) " .. tt .. " (.+)$") if source_name then term_type = tt break end end if not source_name then return end local term, id = term_and_id:match("^(.+) %((.-)%)$") if not term then term = term_and_id end local source = get_source(source_name, false, "getCanonicalName") if not source then return end local parents = { { name = "terms by " .. source_name .. " " .. term_type, sort = (source:makeSortKey(term)), } } local umbrella_parents = { { name = "Terms derived from " .. source_name .. " " .. term_type .. "s", sort = (source:makeSortKey(term)), } } if id then insert(parents, { name = "terms derived from the " .. source_name .. " " .. term_type .. " " .. term, sort = " " }) insert(umbrella_parents, { name = "terms derived from the " .. source_name .. " " .. term_type .. " " .. term, is_label = true, sort = " " }) end -- Italicize the word/word in the title. local function displaytitle(title, lang) return plain_gsub(title, term, tag_text(term, source, nil, "term")) end local breadcrumb = tag_text(term, source, nil, "term") .. (id and " (" .. id .. ")" or "") local term_page, alt_form, term_tr if term_type == "root" then assert_valid_root(source, term) local rdata = get_root_data(source) term_tr = root_translit(rdata, term) if lang_uses_appendix_roots(source) then term_page = ("Appendix:%s roots/%s"):format(source:getCanonicalName(), term) alt_form = term end end term_page = term_page or term return { description = "{{{langname}}} terms that originate ultimately from the " .. get_source_and_type_desc(source, term_type) .. " " .. full_link({ term = term_page, alt = alt_form, tr = term_tr, lang = source, gloss = id, id = id }, "term") .. ".", displaytitle = displaytitle, breadcrumb = breadcrumb, parents = parents, umbrella = { no_by_language = true, displaytitle = displaytitle, breadcrumb = breadcrumb, parents = umbrella_parents, } } end) insert(handlers, function(data) local labelpref, root_and_id = data.label:match("^(terms belonging to the root )(.+)$") if not root_and_id then return end local root, id = root_and_id:match("^(.+) %((.-)%)$") if not root then root = root_and_id end local is_semitic = data.lang:inFamily("sem") local root_desc = is_semitic and "[[w:Semitic root|root]]" or "root" local parents = {} if id then insert(parents, {name = labelpref .. root, sort = id}) end insert(parents, {name = "terms by root", sort = root_and_id}) if data.lang then assert_valid_root(data.lang, root) end local rdata = get_root_data(data.lang) local separators = rdata and rdata.separator and pattern_escape(rdata.separator) or "־ %-" local separator_c = "[" .. separators .. "]" local not_separator_c = "[^" .. separators .. "]" -- remove any leading or trailing separators (e.g. in PIE-style roots) local root_no_prefix_suffix = mw.ustring.gsub(mw.ustring.gsub(root, separator_c .. "$", ""), "^" .. separator_c, "") local num_sep = mw.ustring.len(mw.ustring.gsub(root_no_prefix_suffix, not_separator_c, "")) local root_page, alt_form if lang_uses_appendix_roots(data.lang) then root_page = ("Appendix:%s roots/%s"):format(data.lang:getCanonicalName(), root) alt_form = root else root_page = root end local linked_root = data.lang and full_link( { term = root_page, alt = alt_form, tr = root_translit(rdata, root), lang = data.lang, gloss = id, id = id, }, "term") or root_page if num_sep > 0 then insert(parents, {name = "" .. (num_sep + 1) .. "-letter roots", sort = root_and_id}) end -- Italicize the root/word in the title. local function displaytitle(title, lang) return plain_gsub(title, root, tag_text(root, lang, nil, "term")) end local breadcrumb = tag_text(root, data.lang, nil, "term") .. (id and " (" .. id .. ")" or "") return { description = "{{{langname}}} terms that belong to the " .. root_desc .. " " .. linked_root .. ".", displaytitle = displaytitle, breadcrumb = breadcrumb, parents = parents, umbrella = false, } end) insert(handlers, function(data) local source_name = data.label:match("^terms by (.+) root$") if not source_name then return end local source = get_source(source_name, false, "getCanonicalName") if not source then return end local parents = {"terms by etymology"} -- In [[:Category:Proto-Indo-Iranian terms by Proto-Indo-Iranian root]], -- don't add parent [[:Category:Proto-Indo-Iranian terms derived from Proto-Indo-Iranian]]. if not data.lang or data.lang:getCode() ~= source:getCode() then insert(parents, "terms derived from " .. source_name) end return { description = "{{{langname}}} terms categorized by the " .. get_source_and_type_desc(source, "root") .. " they originate from.", parents = parents, umbrella_parents = "Terms by etymology subcategories by language", } end) insert(handlers, function(data) local root_shape, post, additional = data.label:match("^(.+)([ -])shaped roots$") if not root_shape then return elseif data.lang and data.lang:getCode() == "ine-pro" then additional = [=[ * '''e''' stands for the vowel of the root. * '''C''' stands for any stop or ''s''. * '''R''' stands for any resonant. * '''H''' stands for any laryngeal. * '''M''' stands for ''m'' or ''w'', when followed by a resonant. * '''s''' stands for ''s'', when next to a stop.]=] end if root_shape == "irregularly" and post == " " then return { breadcrumb = "irregular", description = "{{{langname}}} roots with a shape that violates the {{w|Proto-Indo-European root#Shape of a root|known rules on root shapes}}.", additional = additional, parents = {{name = "roots by shape", sort = "*"}}, umbrella = false, } elseif post == " " then return end return { breadcrumb = root_shape, description = "{{{langname}}} roots with the shape ''" .. root_shape .. "''.", additional = additional, parents = {{name = "roots by shape", sort = root_shape}}, umbrella = false, } end) ----------------------------------------------------------------------------- -------------------- Derived/inherited/borrowed handlers -------------------- ----------------------------------------------------------------------------- -- Handler for categories of the form "LANG terms derived from SOURCE", where SOURCE is a language, etymology language -- or family (e.g. "Indo-European languages"), along with corresponding umbrella categories of the form -- "Terms derived from SOURCE". insert(handlers, function(data) local source_name = data.label:match("^terms derived from (.+)$") if not source_name then return end local source, source_desc = get_source_and_source_desc(source_name) if not source then return end -- Compute description. local desc = "{{{langname}}} terms that originate from " .. source_desc .. "." local additional if source:hasType("family") then additional = "This category should, ideally, contain only other categories. Entries can be categorized here, too, when the proper subcategory is unclear. " .. "If you know the exact language from which an entry categorized here is derived, please edit its respective entry." end -- Compute parents. local derived_from_variety_of_self = false local parent local sortkey = source:getDisplayForm() if source:hasType("etymology-only") then -- By default, `parent` is the source's parent. parent = source:getParent() -- Check if the source is a variety (or subvariety) of the language. if data.lang and source:hasParent(data.lang) then derived_from_variety_of_self = true end -- If the language is the direct parent of the source or the parent is "und", then we use the family of the source as `parent` instead. if data.lang and (parent:getCode() == data.lang:getCode() or parent:getCode() == "und") then parent = source:getFamily() end -- Regular language or family. else local fam = source:getFamily() if fam then parent = fam end end -- If `parent` does not exist, is the same as `source`, or would be "isolate languages" or "not a family", then we discard it. if (not parent) or parent:getCode() == source:getCode() or parent:getCode() == "qfa-iso" or parent:getCode() == "qfa-not" or parent:getCode() == "qfa-unc" then parent = nil derived_from_variety_of_self = false -- Otherwise, get the display form. else parent = parent:getDisplayForm() end parent = parent and "terms derived from " .. parent or "terms derived from other languages" local parents = {{name = parent, sort = sortkey}} if derived_from_variety_of_self then insert(parents, "Category:Categories for terms in a language derived from a term in a subvariety of that language") end -- Compute umbrella parents. local cat_name = source:getCode() == "mul-tax" and "Taxonomic names" or source:getCategoryName() -- If the source is etymology-only, its category will be handled by the lect handler in -- [[Module:category tree/lects]]. If it has a nonstandard name like 'Kölsch' (i.e. not a name like -- 'American English' that has a language name in it), the lect handler won't handle it unless we tell it to do so -- through the following call; this is an optimization to avoid expensive processing work on all manner of randomly -- named categories. if source:hasType("etymology-only") then require("Module:category tree/lects").export.register_likely_lect_parent_cat(cat_name) end local umbrella_parents = { (source:hasType("family") or source:getCode() == "mul-tax") and {name = cat_name, raw = true, sort = " "} or {name = cat_name, raw = true, sort = "terms derived from"} } -- Without the following, the breadcrumb trail for e.g. [[Category:Javanese terms derived from French]] looks like -- Fundamental » All languages » Javanese » Terms by etymology » Terms derived from other languages » -- Indo-European languages » Italic languages » Romance languages » Italo-Western Romance languages » -- Western Romance languages » Gallo-Romance languages » Gallo-Rhaetian languages » Oïl languages » French -- To reduce the length, we truncate the "languages" part of the breadcrumbs as long as this does not create -- ambiguity (i.e. unless there is a language with the same name as the family). Hence, for the Category -- [[Category:Javanese terms derived from Arabic]], we end up with -- Fundamental » All languages » Javanese » Terms by etymology » Terms derived from other languages » Afroasiatic » -- Semitic » West Semitic » Central Semitic » Arabic languages » Arabic -- because "Arabic" is ambiguous between family and language (and script, for that matter). local breadcrumb = source_name if source:hasType("family") and breadcrumb:find(" languages$") then local truncated_breadcrumb = breadcrumb:gsub(" languages$", "") if not get_lang_by_name(truncated_breadcrumb, nil, "allow etym") then breadcrumb = truncated_breadcrumb end end return { description = desc, additional = additional, breadcrumb = breadcrumb, parents = parents, umbrella = { description = "Categories with terms that originate from " .. source_desc .. ".", parents = umbrella_parents, }, } end) -- Handler for categories of the form "LANG terms inherited/borrowed from SOURCE", where SOURCE is a language, -- etymology language or family (e.g. "Indo-European languages"). Also handles umbrella categories of the form -- "Terms inherited/borrowed from SOURCE". local function inherited_borrowed_handler(etymtype) return function(data) local source_name = data.label:match("^terms " .. etymtype .. " from (.+)$") if not source_name then return end local source, source_desc = get_source_and_source_desc(source_name) if not source then return end return { description = "{{{langname}}} terms " .. etymtype .. " from " .. source_desc .. ".", breadcrumb = source_name, parents = { {name = etymtype .. " terms", sort = source_name}, {name = "terms derived from " .. source_name, sort = " "}, }, umbrella = { parents = { { name = "terms derived from " .. source_name, is_label = true, sort = " " }, etymtype == "inherited" and { name = "Inherited terms subcategories by language", sort = source_name } -- There are several types of borrowings mixed into the following holding category, -- so keep these ones sorted under 'Terms borrowed from SOURCE_NAME' instead of just -- 'SOURCE_NAME'. or "Borrowed terms subcategories by language", } }, } end end insert(handlers, inherited_borrowed_handler("borrowed")) insert(handlers, inherited_borrowed_handler("inherited")) ----------------------------------------------------------------------------- ------------------------ Borrowing subtype handlers ------------------------- ----------------------------------------------------------------------------- -- General handler for specific borrowing subtypes, such as learned borrowings, calques and phono-semantic matchings. local function borrowing_subtype_handler(dest, source_name, parent_cat, spec) local source, source_desc = get_source_and_source_desc(source_name) if not source then return end -- normally uses of UNKNOWN should not show up to the end user local dest_name = dest and dest:getCanonicalName() or "UNKNOWN" local additional, umbrella_additional if spec.additional then if dest then additional = spec.additional(source, dest) else umbrella_additional = spec.umbrella_additional(source) end else if not spec.categorizing_templates then error("Internal error: Must specify either `categorizing_templates` or the combination of `additional` and `umbrella_additional` in each borrowing subtype spec") end local extra_templates = {} local extra_template_text for i, template in ipairs(spec.categorizing_templates) do if i > 1 then insert(extra_templates, ("{{tl|%s|...}}"):format(template)) end end if #extra_templates > 0 then extra_template_text = (" (or %s, using the same syntax)"):format( serial_comma_join(extra_templates, {conj = "or"})) else extra_template_text = "" end if dest then additional = ("To categorize a term into this category, use {{tl|%s|%s|%s|<var>source_term</var>}}%s, " .. "where <code><var>source_term</var></code> is the %s term that the term in question " .. "was borrowed from."):format( spec.categorizing_templates[1], dest:getCode(), source:getCode(), extra_template_text, source_name) else umbrella_additional = ("To categorize a term into a language-specific subcategory, use " .. "{{tl|%s|<var>destcode</var>|%s|<var>source_term</var>}}%s, where <code><var>destcode</var></code> " .. "is the language code of the language in question (see [[Wiktionary:List of languages]]), and " .. "<code><var>source_term</var></code> is the %s term that the term in question was " .. "borrowed from."):format(spec.categorizing_templates[1], source:getCode(), extra_template_text, source_name) end end return { description = "{{{langname}}} " .. spec.from_source_desc:gsub("SOURCE", source_desc):gsub("DEST", dest_name), additional = additional, breadcrumb = source_name, parents = { { name = parent_cat, sort = source_name }, { name = "terms borrowed from " .. source_name, sort = " " }, }, umbrella = { additional = umbrella_additional, parents = { { name = "terms borrowed from " .. source_name, is_label = true, sort = " " }, "Borrowed terms subcategories by language", } }, } end -- Specs describing types of borrowings. -- `from_source_desc` is the English description used in categories of the form "LANGUAGE BORTYPE from SOURCE", -- e.g. "Arabic semantic loans from English". "SOURCE" in the description is replaced by the source language. -- `umbrella_desc` is the English description used in categories of the form "LANGUAGE BORTYPE", e.g. -- "Arabic semantic loans". This is an umbrella category grouping all the source-language-specific categories. -- `uses_subtype_handler`, if true, means that the handler for "LANGUAGE BORTYPE from SOURCE" categories is -- implemented by a generic "TYPE borrowings" handler (at the bottom of this section), so we don't need to -- create a BORTYPE-specific handler. -- `umbrella_parent`, if given, is the parent category of the umbrella categories of the form "LANGUAGE BORTYPE". -- By default it is "borrowed terms". Some borrowing types replace this with "terms by etymology". (FIXME: -- Review whether this is correct.) -- `label_pattern`, if given, is a Lua pattern that matches the category name minus the language at the beginning. -- It should have one capture, which is the source language. An example is "^terms partially calqued from (.+)$". -- If omitted, it is generated from BORTYPE. -- `categorizing_templates`, if given, is the list of templates that categorize into this category. They are assumed to -- follow the syntax of {{bor}}. The first template in the list should be the preferred alias. The specified -- templates are used to form the `additional` text displayed on the language-specific category page and -- corresponding umbrella category page describing how to categorize into the category in question. In more complex -- cases, you can omit this field and instead supply the `additional` and `umbrella_additional` fields (as is done -- with adapted borrowings). You must either specify `categorizing_templates` or the combination of `additional` and -- `umbrella_additional`. -- `additional`, if given, is a function of two arguments (source and destination language objects) that will generate -- the `additional` text displayed on the language-specific category page that describes how to categorize into the -- category in question. This is an alternative to specifying `categorizing_templates`, used in more complex cases -- (currently, with adapted borrowings). -- `umbrella_additional`, if given, is a function of one argument (source language object) that will generate the -- `additional` text displayed on the umbrella category page that describes how to categorize into the category in -- question. This is an alternative to specifying `categorizing_templates`, used in more complex cases (currently, -- with adapted borrowings). local borrowing_specs = { ["learned borrowings"] = { from_source_desc = "terms that are learned [[loanword]]s from SOURCE, that is, terms that were directly incorporated from SOURCE instead of through normal language contact.", umbrella_desc = "terms that are learned [[loanword]]s, that is, terms that were directly incorporated from another language instead of through normal language contact.", uses_subtype_handler = true, categorizing_templates = {"lbor", "learned borrowing"}, }, ["semi-learned borrowings"] = { from_source_desc = "terms that are [[semi-learned borrowing|semi-learned]] [[loanword]]s from SOURCE, that is, terms borrowed from SOURCE (a [[classical language]]) into DEST (a modern language) and partly reshaped based on later [[sound change]]s or by analogy with [[inherit]]ed terms in the language.", umbrella_desc = "terms that are [[semi-learned borrowing|semi-learned]] [[loanword]]s, that is, terms borrowed from a [[classical language]] into a modern language and partly reshaped based on later [[sound change]]s or by analogy with [[inherit]]ed terms in the language.", uses_subtype_handler = true, categorizing_templates = {"slbor", "semi-learned borrowing"}, }, ["orthographic borrowings"] = { from_source_desc = "orthographic loans from SOURCE, i.e. terms that were borrowed from SOURCE in their script forms, not their pronunciations.", umbrella_desc = "orthographic loans, i.e. terms that were borrowed in their script forms, not their pronunciations.", uses_subtype_handler = true, categorizing_templates = {"obor", "orthographic borrowing"}, }, ["unadapted borrowings"] = { from_source_desc = "[[loanword]]s from SOURCE that have not been conformed to the morpho-syntactic, phonological and/or phonotactical rules of DEST.", umbrella_desc = "[[loanword]]s that have not been conformed to the morpho-syntactic, phonological and/or phonotactical rules of the target language.", uses_subtype_handler = true, categorizing_templates = {"ubor", "unadapted borrowing"}, }, ["adapted borrowings"] = { from_source_desc = "[[loanwords]] from SOURCE formed with the addition of an affix to conform the term to the normal morphology of DEST.", umbrella_desc = "[[loanword]]s formed with the addition of an affix to conform the term to the normal morphology of the target language.", uses_subtype_handler = true, additional = function(source, dest) return ("To categorize a term into this category, use {{tl|af|%s|3=type=adap|4=%s:<var>source_term</var>|5=-<var>affix</var>}} " .. "(or {{tl|af|%s|3=type=abor|4=...}}, using the same syntax), where <code><var>source_term</var></code> is " .. "the %s term that the term in question was borrowed from and <code><var>affix</var></code> " .. "is the %s affix used to adapt the %s term. An example is " .. "{{m+|pl|adresować||to address}}, which would use {{tl|af|pl|3=type=adap|4=fr:adresser|5=-ować}} to indicate " .. "that is was formed from {{m+|fr|adresser}} with the addition of the Polish verb-forming affix " .. "{{m|pl|-ować}}."):format(dest:getCode(), source:getCode(), dest:getCode(), source:getCanonicalName(), dest:getCanonicalName(), source:getCanonicalName()) end, umbrella_additional = function(source) return ("To categorize a term into a language-specific subcategory, use {{tl|af|<var>destcode</var>|3=type=adap|4=%s:<var>source_term</var>|5=-<var>affix</var>}} " .. "(or {{tl|af|<var>destcode</var>|3=type=abor|4=...}}, using the same syntax), where " .. "<code><var>destcode</var></code> is the language code of the target language in question (see " .. "[[Wiktionary:List of languages]]); <code><var>source_term</var></code> is the %s term " .. "that the term in question was borrowed from; and <code><var>affix</var></code> is the target-language " .. "affix used to adapt the %s term. An example is {{m+|pl|adresować||to address}}, which " .. "would use {{tl|af|pl|3=type=adap|4=fr:adresser|5=-ować}} to indicate that is was formed from " .. "{{m+|fr|adresser}} with the addition of the Polish verb-forming affix {{m|pl|-ować}}."):format( source:getCode(), source:getCanonicalName(), source:getCanonicalName()) end, }, ["semantic loans"] = { from_source_desc = "[[Appendix:Glossary#semantic loan|semantic loans]] from SOURCE, i.e. terms one or more of whose definitions was borrowed from a term in SOURCE.", umbrella_desc = "[[Appendix:Glossary#semantic loan|semantic loans]], i.e. terms one or more of whose definitions was borrowed from a term in another language.", umbrella_parent = "terms by etymology", categorizing_templates = {"sl", "semantic loan"}, }, ["partial calques"] = { from_source_desc = "terms that were [[Appendix:Glossary#partial calque|partially calqued]] from SOURCE, i.e. terms formed partly by piece-by-piece translations of SOURCE terms and partly by direct borrowing.", umbrella_desc = "[[Appendix:Glossary#partial calque|partial calques]], i.e. terms formed partly by piece-by-piece translations of terms from other languages and partly by direct borrowing.", umbrella_parent = "terms by etymology", label_pattern = "^terms partially calqued from (.+)$", categorizing_templates = {"pcal", "pclq", "partial calque"}, }, ["calques"] = { from_source_desc = "terms that were [[Appendix:Glossary#calque|calqued]] from SOURCE, i.e. terms formed by piece-by-piece translations of SOURCE terms.", umbrella_desc = "[[Appendix:Glossary#calque|calques]], i.e. terms formed by piece-by-piece translations of terms from other languages.", umbrella_parent = "terms by etymology", label_pattern = "^terms calqued from (.+)$", categorizing_templates = {"cal", "clq", "calque"}, }, ["phono-semantic matchings"] = { from_source_desc = "[[Appendix:Glossary#phono-semantic matching|phono-semantic matchings]] from SOURCE, i.e. terms that were borrowed by matching the etymon phonetically and semantically.", umbrella_desc = "[[Appendix:Glossary#phono-semantic matching|phono-semantic matchings]], i.e. terms that were borrowed by matching the etymon phonetically and semantically.", categorizing_templates = {"psm", "phono-semantic matching"}, }, ["pseudo-loans"] = { from_source_desc = "[[Appendix:Glossary#pseudo-loan|pseudo-loans]] from SOURCE, i.e. terms that appear to be SOURCE, but are not used or have an unrelated meaning in SOURCE itself.", umbrella_desc = "[[Appendix:Glossary#pseudo-loan|pseudo-loans]], i.e. terms that appear to be derived from another language, but are not used or have an unrelated meaning in that language itself.", categorizing_templates = {"pl", "pseudo-loan"}, }, } for bortype, spec in pairs(borrowing_specs) do labels[bortype] = { description = "{{{langname}}} " .. spec.umbrella_desc, parents = {spec.umbrella_parent or "borrowed terms"}, umbrella_parents = "Terms by etymology subcategories by language", } if not spec.uses_subtype_handler then -- If the label pattern isn't specifically given, generate it from the `bortype`; but make sure to -- escape hyphens in the pattern. local label_pattern = spec.label_pattern or "^" .. pattern_escape(bortype) .. " from (.+)$" insert(handlers, function(data) local source_name = data.label:match(label_pattern) if source_name then return borrowing_subtype_handler(data.lang, source_name, bortype, spec) end end) end end insert(handlers, function(data) local borrowing_type, source_name = data.label:match("^(.+ borrowings) from (.+)$") if borrowing_type then local spec = borrowing_specs[borrowing_type] return borrowing_subtype_handler(data.lang, source_name, borrowing_type, spec) end end) ----------------------------------------------------------------------------- ---------------------- Indo-Aryan extension handlers ------------------------ ----------------------------------------------------------------------------- -- FIXME: Put this in a family-specific module. insert(handlers, function(data) local labelpref, extension = data.label:match("^(terms extended with Indo%-Aryan )(.+)$") if not extension then return end local lang_inc_ash = require("Module:languages").getByCode("inc-ash") local linked_term = full_link({lang = lang_inc_ash, term = extension}, "term") local tagged_term = tag_text(extension, lang_inc_ash, nil, "term") return { description = "{{{langname}}} terms extended with the [[Indo-Aryan]] [[pleonastic]] affix " .. linked_term .. ".", displaytitle = "{{{langname}}} " .. labelpref .. tagged_term, breadcrumb = tagged_term, parents = {{name = "terms with Indo-Aryan extensions", sort = extension}}, umbrella = { no_by_language = true, parents = "Indo-Aryan extensions", displaytitle = "Terms extended with Indo-Aryan " .. tagged_term, } } end) ----------------------------------------------------------------------------- ---------------------------- Coined-by handlers ----------------------------- ----------------------------------------------------------------------------- insert(handlers, function(data) local coiner = data.label:match("^terms coined by (.+)$") if not coiner then return end -- Sort by last name per request from [[User:Metaknowledge]] local last_name = umatch(coiner, ".-%s(%S+)$") return { description = "{{{langname}}} terms coined by " .. coiner .. ".", breadcrumb = coiner, parents = {{ name = "coinages", sort = last_name and last_name .. ", " .. coiner or coiner, }}, umbrella = false, } end) ----------------------------------------------------------------------------- ------------------------ Multiple etymology handlers ------------------------ ----------------------------------------------------------------------------- insert(handlers, function(data) local pos = data.label:match("^terms with multiple (.+) etymologies$") if not pos then return end local plpos = pluralize_pos(pos) local postype = pos_lemma_or_nonlemma(plpos) if not postype then return end return { description = "{{{langname}}} " .. plpos .. " that are derived from multiple origins.", umbrella_parents = "Multiple etymology subcategories by language", breadcrumb = "multiple " .. plpos, parents = {{ name = "terms with multiple " .. postype .. " etymologies", sort = pos, }}, } end) insert(handlers, function(data) local pos1, pos2 = data.label:match("^terms with (.+) and (.+) etymologies$") if not pos1 then return end local pos1type = pos_lemma_or_nonlemma(pluralize_pos(pos1)) local pos2type = pos_lemma_or_nonlemma(pluralize_pos(pos2)) if not (pos1type and pos2type) then return end return { description = "{{{langname}}} terms consisting of " .. add_indefinite_article(pos1) .." of one origin and " .. add_indefinite_article(pos2) .. " of a different origin.", umbrella_parents = "Multiple etymology subcategories by language", breadcrumb = pos1 .. " and " .. pos2, parents = {{ name = pos1type == pos2type and "terms with multiple " .. pos1type .. " etymologies" or "terms with lemma and non-lemma form etymologies", sort = pos1 .. " and " .. pos2, }}, } end) ----------------------------------------------------------------------------- --------------------------- Borrowed-back handlers -------------------------- ----------------------------------------------------------------------------- -- Handler for categories of the form e.g. [[:Category:English terms borrowed back into English]]. We need to use a handler -- because the category's language occurs inside the label itself. For the same reason, the umbrella category has a -- nonstandard name "Terms borrowed back into the same language", so we handle it as a regular parent and disable the -- built-in umbrella mechanism. insert(handlers, function(data) local lang = data.lang if not lang then return end local source_name = data.label:match("^terms borrowed back into (.+)$") if not (source_name and source_name == lang:getDisplayForm()) then return end return { description = "{{{langname}}} terms that were borrowed from another language that originally borrowed the term from " .. source_name .. ".", parents = {"terms by etymology", "borrowed terms", { name = "Terms borrowed back into the same language", raw = true, sort = "{{{langname}}}" }}, umbrella = false, -- Umbrella has a nonstandard name so we treat it as a raw category } end) ----------------------------------------------------------------------------- -- -- -- RAW HANDLERS -- -- -- ----------------------------------------------------------------------------- -- Handler for umbrella metacategories of the form e.g. [[:Category:Terms derived from Proto-Indo-Iranian roots]] -- and [[:Category:Terms derived from Proto-Indo-European words]]. Replaces the former -- [[Module:category tree/PIE root cat]], [[Module:category tree/root cat]] and [[Template:PIE word cat]]. insert(raw_handlers, function(data) local source_name, terms_type for _, tt in ipairs{"roots", "words", "terms"} do source_name = data.category:match("^Terms derived from (.+) " .. tt .. "$") if source_name then terms_type = tt break end end if not source_name then return end local source = get_source(source_name, false, "getCanonicalName") if not source then return end return { description = "Umbrella categories covering terms derived from particular " .. get_source_and_type_desc(source, terms_type) .. ".", additional = "{{{umbrella_meta_msg}}}", parents = { "Umbrella metacategories", { name = terms_type == "roots" and "roots" or "lemmas", is_label = true, lang = source:getCode(), sort = " " }, { name = "terms derived from " .. source_name, is_label = true, sort = " " .. terms_type }, }, } end) return {LABELS = labels, RAW_CATEGORIES = raw_categories, HANDLERS = handlers, RAW_HANDLERS = raw_handlers} amspenxva9ysxyafikht7w0t3hcmpvg 487883 487810 2026-09-03T10:18:52Z SM7 6218 लोकलाइजेशन... 487883 Scribunto text/plain local labels = {} local raw_categories = {} local handlers = {} local raw_handlers = {} local en_utilities_module = "Module:en-utilities" local m_str_utils = require("Module:string utilities") local add_indefinite_article = require(en_utilities_module).add_indefinite_article local full_link = require("Module:links").full_link local get_lang_by_name = require("Module:languages").getByCanonicalName local insert = table.insert local pattern_escape = m_str_utils.pattern_escape local plain_gsub = m_str_utils.plain_gsub local pluralize_pos = require("Module:headword").pluralize_pos local pos_lemma_or_nonlemma = require("Module:headword").pos_lemma_or_nonlemma local serial_comma_join = require("Module:table").serialCommaJoin local tag_text = require("Module:script utilities").tag_text local umatch = mw.ustring.match local unpack = unpack or table.unpack -- Lua 5.2 compatibility ----------------------------------------------------------------------------- -- -- -- LABELS -- -- -- ----------------------------------------------------------------------------- labels["टर्म व्युत्पत्ति अनुसार"] = { description = "{{{langname}}} terms categorized by their etymologies.", umbrella_parents = "मूलभूत श्रेणी", parents = {{name = "{{{langcat}}}", raw = true}}, } labels["AABB-type reduplications"] = { description = "{{{langname}}} terms that underwent [[reduplication]] in an AABB pattern.", breadcrumb = "AABB-type", parents = {"reduplications"}, } labels["apophonic reduplications"] = { description = "{{{langname}}} terms that underwent [[reduplication]] with only a change in a vowel sound.", breadcrumb = "apophonic", parents = {"reduplications"}, } labels["back-formations"] = { description = "{{{langname}}} terms formed by reversing a supposed regular formation, removing part of an older term.", parents = {"terms by etymology"}, } labels["blends"] = { description = "{{{langname}}} terms formed by combinations of other words.", parents = {"terms by etymology"}, } labels["आहरित टर्म"] = { description = "{{{langname}}} terms that are loanwords, i.e. terms that were directly incorporated from another language.", parents = {"टर्म व्युत्पत्ति अनुसार"}, } labels["catachreses"] = { description = "{{{langname}}} terms derived from misuses or misapplications of other terms.", parents = {"terms by etymology"}, } labels["coinages"] = { description = "{{{langname}}} terms coined by an identifiable person, organization or other such entity.", parents = {"terms attributed to a specific source"}, umbrella_parents = {name = "terms attributed to a specific source", is_label = true, sort = " "}, } labels["coordinated pairs"] = { description = "Terms in {{{langname}}} consisting of a pair of terms joined by a [[coordinating conjunction]].", parents = {"terms by etymology"}, } labels["coordinated triples"] = { description = "Terms in {{{langname}}} consisting of three terms joined by one or more [[coordinating conjunction]]s.", parents = {"terms by etymology"}, } labels["coordinated quadruples"] = { description = "Terms in {{{langname}}} consisting of four terms joined by one or more [[coordinating conjunction]]s.", parents = {"terms by etymology"}, } labels["coordinated quintuples"] = { description = "Terms in {{{langname}}} consisting of five terms joined by one or more [[coordinating conjunction]]s.", parents = {"terms by etymology"}, } labels["denominals"] = { description = "{{{langname}}} terms derived from a noun.", parents = {"terms by etymology"}, } labels["deverbals"] = { description = "{{{langname}}} terms derived from a verb.", parents = {"terms by etymology"}, } labels["doublets"] = { description = "{{{langname}}} terms that trace their etymology from ultimately the same source as other terms in the same language, but by different routes, and often with subtly or substantially different meanings.", parents = {"terms by etymology"}, } labels["elongated forms"] = { description = "{{{langname}}} terms where one or more letters or sounds is repeated for emphasis or effect.", parents = {"terms by etymology"}, } labels["eponyms"] = { description = "{{{langname}}} terms derived from names of real or fictitious individuals.", parents = {"terms by etymology"}, } labels["genericized trademarks"] = { description = "{{{langname}}} terms that originate from [[trademark]]s, [[brand]]s and company names which have become [[genericized]]; that is, fallen into common usage in the target market's [[vernacular]], even when referring to other competing brands.", parents = {"terms by etymology", "trademarks"}, } labels["ghost words"] = { description = "{{{langname}}} terms that were originally erroneous or fictitious, published in a reference work as if they were genuine as a result of typographical error, misreading, or misinterpretation, or as [[:w:Fictitious entry|fictitious entries]], jokes, or hoaxes.", parents = {"terms by etymology"}, } labels["gramograms"] = { description = "{{{langname}}} [[gramogram]]s &ndash; terms that are partially or completely spelled with [[homophone|homophonous]] letters.", parents = {"rebuses"}, } labels["haplological words"] = { description = "{{{langname}}} words that underwent [[haplology]]: thus, their origin involved a loss or omission of a repeated sequence of sounds.", parents = {"terms by etymology"}, } labels["homophonic translations"] = { description = "{{{langname}}} terms that were borrowed by matching the etymon phonetically, without regard for the sense; compare [[phono-semantic matching]] and [[Hobson-Jobson]].", parents = {"terms by etymology"} } labels["hybridisms"] = { description = "{{{langname}}} terms formed by elements of different linguistic origins.", parents = {"terms by etymology"}, } labels["inherited terms"] = { description = "{{{langname}}} terms that were inherited from an earlier stage of the language.", parents = {"terms by etymology"}, } labels["internationalisms"] = { description = "{{{langname}}} loanwords which also exist in many other languages with the same or similar etymology.", additional = "Terms should be here preferably only if the immediate source language is not known for certain. Entries are added into this category by [[Template:internationalism]]; see it for more information.", parents = {"terms by etymology"}, } labels["legal doublets"] = { description = "{{{langname}}} legal [[doublet]]s &ndash; a legal doublet is a standardized phrase commonly used in legal documents, proceedings etc. which includes two words that are near synonyms.", parents = {"coordinated pairs"}, } labels["legal triplets"] = { description = "{{{langname}}} legal [[triplet]]s &ndash; a legal triplet is a standardized phrase commonly used in legal documents, proceedings etc which includes three words that are near synonyms.", parents = {"coordinated triples"}, } labels["LLM coinages"] = { description = "{{{langname}}} terms that have been coined by {{w|large language models}} rather than humans.", parents = {"terms by etymology"}, } labels["merisms"] = { description = "{{{langname}}} [[merism]]s &ndash; terms that are [[coordinate]]s that, combined, are a synonym for a totality.", parents = {"coordinated pairs"}, } labels["metonyms"] = { description = "{{{langname}}} terms whose origin involves calling a thing or concept not by its own name, but by the name of something intimately associated with that thing or concept.", parents = {"terms by etymology"}, } labels["neologisms"] = { description = "{{{langname}}} terms that have been only recently acknowledged.", parents = {"terms by etymology"}, } labels["nominalizations"] = { description = "{{{langname}}} terms formed by nominalization, a process where a word from another part of speech becomes a noun.", parents = {"terms by etymology"}, } labels["nonce terms"] = { description = "{{{langname}}} terms that have been invented for a single occasion.", parents = {"terms by etymology"}, } labels["number homophones"] = { description = "{{{langname}}} terms that are partially or completely spelled with [[homophone|homophonous]] numbers.", parents = {"rebuses", "terms spelled with numbers"}, } labels["numerical contractions"] = { description = "{{{langname}}} numerical contractions. In these, the number either denotes omitted characters ({{m+|en|globalization}} → {{m|en|g11n}}) or duplication ({{m+|kne|Kankanaey}} → {{m|kne|Kan2aey}}).", parents = {"contractions", "rebuses", "terms spelled with numbers"}, } labels["onomatopoeias"] = { description = "{{{langname}}} terms that were coined to sound like what they represent.", parents = {"terms by etymology"}, } labels["piecewise doublets"] = { description = "{{{langname}}} terms that are [[Appendix:Glossary#piecewise doublet|piecewise doublets]].", parents = {"terms by etymology"}, } for _, ism_and_langname in ipairs({ {"anglicisms", "English"}, {"Arabisms", "Arabic"}, {"Gallicisms", "French"}, {"Germanisms", "German"}, {"Hispanisms", "Spanish"}, {"Italianisms", "Italian"}, {"Latinisms", "Latin"}, {"Japonisms", "Japanese"}, }) do local ism, langname = unpack(ism_and_langname) labels["pseudo-" .. ism] = { description = "{{{langname}}} terms that appear to be " .. langname .. ", but are not used or have an unrelated meaning in " .. langname .. " itself.", parents = {"pseudo-loans"}, umbrella_parents = {name = "pseudo-loans", is_label = true, sort = " "}, } end labels["rebracketings"] = { description = "{{{langname}}} terms that have interacted with another word in such a way that the boundary between the words has been modified.", parents = {"terms by etymology"} } labels["rebuses"] = { description = "{{{langname}}} [[rebus]]es &ndash; terms that are partially or completely represented by images, symbols or numbers, often as a form of wordplay.", parents = {"terms by etymology"}, } labels["reconstructed terms"] = { description = "{{{langname}}} terms that are not directly attested, but have been reconstructed through other evidence.", parents = {"terms by etymology"} } labels["reduplicated coordinated pairs"] = { description = "{{{langname}}} reduplicated coordinated pairs.", breadcrumb = "reduplicated", parents = {"coordinated pairs", "reduplications"}, } labels["reduplicated coordinated triples"] = { description = "{{{langname}}} reduplicated coordinated triples.", breadcrumb = "reduplicated", parents = {"coordinated triples", "reduplications"}, } labels["reduplicated coordinated quadruples"] = { description = "{{{langname}}} reduplicated coordinated quadruples.", breadcrumb = "reduplicated", parents = {"coordinated quadruples", "reduplications"}, } labels["reduplicated coordinated quintuples"] = { description = "{{{langname}}} reduplicated coordinated quintuples.", breadcrumb = "reduplicated", parents = {"coordinated quintuples", "reduplications"}, } labels["reduplications"] = { description = "{{{langname}}} terms that underwent [[reduplication]], so their origin involved a repetition of roots or stems.", parents = {"terms by etymology"}, } labels["retronyms"] = { description = "{{{langname}}} terms that serve as new unique names for older objects or concepts whose previous names became ambiguous.", parents = {"terms by etymology"}, } labels["roots"] = { description = "Basic morphemes from which {{{langname}}} words are formed.", parents = {"terms by etymology", "morphemes"}, } labels["Sanskritic formations"] = { description = "{{{langname}}} terms coined from [[tatsama]] [[word]]s and/or [[affix]]es.", parents = {"terms by etymology", "terms derived from Sanskrit"}, } labels["sound-symbolic terms"] = { description = "{{{langname}}} terms that use {{w|sound symbolism}} to express ideas but which are not necessarily strictly speaking [[onomatopoeic]].", parents = {"terms by etymology"}, } labels["spelled-out initialisms"] = { description = "{{{langname}}} initialisms in which the letter names are spelled out.", parents = {"terms by etymology"}, } labels["spelling pronunciations"] = { description = "{{{langname}}} terms whose pronunciation was historically or presently affected by their spelling.", parents = {"terms by etymology"}, } labels["spoonerisms"] = { description = "{{{langname}}} terms in which the initial sounds of component parts have been exchanged, as in \"crook and nanny\" for \"nook and cranny\".", parents = {"terms by etymology"}, } labels["taxonomic eponyms"] = { description = "{{{langname}}} terms derived from names of real or fictitious people, used for [[taxonomy]].", parents = {"eponyms"}, } labels["terms attributed to a specific source"] = { description = "{{{langname}}} terms coined by an identifiable person or deriving from a known work.", parents = {"terms by etymology"}, } labels["terms coined ex nihilo"] = { description = "{{{langname}}} terms fabricated ''[[ex nihilo]]'', i.e. made up entirely rather than being derived from an existing source.", parents = {"terms by etymology"}, } labels["terms containing fossilized case endings"] = { description = "{{{langname}}} terms which preserve case morphology which is no longer analyzable within the contemporary grammatical system or which has been entirely lost from the language.", parents = {"terms by etymology"}, } labels["terms derived from area codes"] = { description = "{{{langname}}} terms derived from [[area code]]s.", parents = {"terms by etymology"}, } labels["terms derived from the shape of letters"] = { description = "{{{langname}}} terms derived from the shape of letters. This can include terms derived from the shape of any letter in any alphabet.", parents = {"terms by etymology"}, } labels["terms by root"] = { description = "{{{langname}}} terms categorized by the root they originate from.", parents = {"terms by etymology", {name = "roots", sort = " "}}, } labels["terms by word"] = { description = "{{{langname}}} terms categorized by the word they originate from.", parents = {"terms by etymology"}, } labels["terms derived from fiction"] = { description = "{{{langname}}} terms that originate from works of [[fiction]].", breadcrumb = "fiction", parents = {{name = "terms attributed to a specific source", sort = "fiction"}}, } for _, data in ipairs { {source="Dickensian works", desc="the works of [[w:Charles Dickens|Charles Dickens]]", topic_parent="Charles Dickens"}, {source="DC Comics", desc="[[w:DC Comics|DC Comics]]"}, {source="Doraemon", desc="[[w:Fujiko F. Fujio|Fujiko F. Fujio]]'s ''[[w:Doraemon|Doraemon]]''", displaytitle="''Doraemon''"}, {source="Dragon Ball", desc="[[w:Akira Toriyama|Akira Toriyama]]'s ''[[w:Dragon Ball|Dragon Ball]]''", displaytitle="''Dragon Ball''"}, {source="Duckburg and Mouseton", desc="[[w:The Walt Disney Company|Disney]]'s [[w:Duck universe|Duckburg]] and [[w:Mickey Mouse universe|Mouseton]] universe", topic_parent="Disney"}, {source="Futurama", desc="the animated television series ''{{w|Futurama}}''", displaytitle = "''Futurama''"}, {source="Harry Potter", desc="the ''[[w:Harry Potter|Harry Potter]]'' series", displaytitle="''Harry Potter''", topic_parent="Harry Potter"}, {source="Looney Tunes and Merrie Melodies", desc="''{{w|Looney Tunes}}'' and/or ''{{w|Merrie Melodies}}'', by {{w|Warner Bros. Animation}}", displaytitle = "''Looney Tunes'' and ''Merrie Melodies''"}, {source="Nineteen Eighty-Four", desc="[[w:George Orwell|George Orwell]]'s ''[[w:Nineteen Eighty-Four|Nineteen Eighty-Four]]''", displaytitle="''Nineteen Eighty-Four''"}, {source="Seinfeld", desc="the American television sitcom ''{{w|Seinfeld}}'' (1989–1998)", displaytitle="''Seinfeld''"}, {source="Seussian works", desc="the works of [[w:Dr. Seuss|Dr. Seuss]]"}, {source="South Park", desc="the animated television series ''[[w:South Park|South Park]]''", displaytitle="''South Park''"}, {source="Star Trek", desc="''[[w:Star Trek|Star Trek]]''", displaytitle="''Star Trek''", topic_parent="Star Trek"}, {source="Star Wars", desc="''[[w:Star Wars|Star Wars]]''", displaytitle="''Star Wars''", topic_parent="Star Wars"}, {source="The Simpsons", desc="''[[w:The Simpsons|The Simpsons]]''", displaytitle="''The Simpsons''", topic_parent="The Simpsons", sort="Simpsons"}, {source="Tolkien's legendarium", desc="the [[legendarium]] of [[w:J. R. R. Tolkien|J. R. R. Tolkien]]", topic_parent="J. R. R. Tolkien"}, } do local parents = {{name = "terms derived from fiction", sort = data.sort or data.source}} local umbrella_parents = {"Terms by etymology subcategories by language"} if data.topic_parent then insert(parents, {name = "{{{langcode}}}:" .. data.topic_parent, raw = true}) insert(umbrella_parents, {name = data.topic_parent, raw = true}) end labels["terms derived from " .. data.source] = { description = "{{{langname}}} terms that originate from " .. data.desc .. ".", breadcrumb = data.displaytitle or data.source, parents = parents, umbrella = { parents = umbrella_parents, displaytitle = data.displaytitle and "Terms derived from " .. data.displaytitle .. " by language" or nil, breadcrumb = data.displaytitle and "Terms derived from " .. data.displaytitle, }, displaytitle = data.displaytitle and "{{{langname}}} terms derived from " .. data.displaytitle or nil, } end labels["terms derived from Greek mythology"] = { description = "{{{langname}}} terms derived from Greek mythology which have acquired an idiomatic meaning.", breadcrumb = "Greek mythology", parents = {{name = "terms attributed to a specific source", sort = "Greek mythology"}}, } labels["terms derived from occupations"] = { description = "{{{langname}}} terms derived from names of occupations.", parents = {"terms by etymology"}, } labels["terms derived from other languages"] = { description = "{{{langname}}} terms that originate from other languages.", parents = {"terms by etymology"}, } labels["terms derived from the Bible"] = { description = "{{{langname}}} terms that originate from the [[Bible]].", breadcrumb = {name = "the Bible", nocap = true}, parents = {{name = "terms attributed to a specific source", sort = "Bible"}}, } labels["terms derived from Aesop's Fables"] = { description = "{{{langname}}} terms that originate from [[Aesop]]'s Fables.", breadcrumb = "Aesop's Fables", parents = {{name = "terms attributed to a specific source", sort = "Aesop's Fables"}}, } labels["terms derived from toponyms"] = { description = "{{{langname}}} terms derived from names of real or fictitious places.", parents = {"terms by etymology"}, } labels["terms derived through romanized wordplay"] = { description = "{{{langname}}} terms derived through romanized wordplay.", parents = {"terms by etymology"}, } labels["terms making reference to character shapes"] = { description = "{{{langname}}} terms making reference to character shapes.", parents = {"terms by etymology"}, } labels["terms derived from sports"] = { description = "{{{langname}}} terms that originate from sports.", breadcrumb = "sports", parents = {{name = "terms attributed to a specific source", sort = "sports"}}, } labels["terms derived from baseball"] = { description = "{{{langname}}} terms that originate from baseball.", breadcrumb = "baseball", parents = {{name = "terms derived from sports", sort = "baseball"}}, } labels["terms with Indo-Aryan extensions"] = { description = "{{{langname}}} terms extended with particular [[Indo-Aryan]] [[pleonastic]] affixes.", parents = {"terms by etymology"}, } labels["terms with lemma and non-lemma form etymologies"] = { description = "{{{langname}}} terms consisting of both a lemma and non-lemma form, of different origins.", breadcrumb = "lemma and non-lemma form", parents = {"terms with multiple etymologies"}, } labels["terms with multiple etymologies"] = { description = "{{{langname}}} terms that are derived from multiple origins.", parents = {"terms by etymology"}, } labels["terms with multiple lemma etymologies"] = { description = "{{{langname}}} lemmas that are derived from multiple origins.", breadcrumb = "multiple lemmas", parents = {"terms with multiple etymologies"}, } labels["terms with multiple non-lemma form etymologies"] = { description = "{{{langname}}} non-lemma forms that are derived from multiple origins.", breadcrumb = "multiple non-lemma forms", parents = {"terms with multiple etymologies"}, } labels["terms with unknown etymologies"] = { description = "{{{langname}}} terms whose etymologies have not yet been established.", parents = {{name = "terms by etymology", sort = "unknown etymology"}}, } labels["univerbations"] = { description = "{{{langname}}} terms that result from the agglutination of two or more words.", parents = {"terms by etymology"}, } labels["words derived through corruption"] = { description = "{{{langname}}} words that result from a non-specific or sporadic change.", parents = {{name = "terms by etymology", sort = "corruption"}}, } labels["words derived through metathesis"] = { description = "{{{langname}}} words that were created through [[metathesis]] from another word.", parents = {{name = "terms by etymology", sort = "metathesis"}}, } labels["words that have undergone semantic shift"] = { description = "{{{langname}}} words that show senses explained by [[semantic shift]].", parents = {{name = "terms by etymology", sort = "semantic shift"}}, } labels["words that have undergone semantic broadening"] = { description = "{{{langname}}} words that show senses explained by [[semantic]] [[broadening]].", parents = {{name = "words that have undergone semantic shift", sort = "semantic broadening"}}, } labels["words that have undergone semantic narrowing"] = { description = "{{{langname}}} words that show senses explained by [[semantic]] [[narrowing]].", parents = {{name = "words that have undergone semantic shift", sort = "semantic narrowing"}}, } labels["words that have undergone amelioration"] = { description = "{{{langname}}} words that have gained a positive [[connotation]] over time.", parents = {{name = "words that have undergone semantic shift", sort = "amelioration"}}, } labels["words that have undergone pejoration"] = { description = "{{{langname}}} words that have gained a negative [[connotation]] over time.", parents = {{name = "words that have undergone semantic shift", sort = "pejoration"}}, } labels["terms with origins in folklore"] = { description = "{{{langname}}} terms that have an etymology rooted in folklore.", breadcrumb = "Folklore", parents = {{name = "terms by etymology", sort = "folklore"}, {name = "{{{langcode}}}:Folklore", raw = true}}, umbrella_parents = {{name = "Terms by etymology subcategories by language", raw = true}, {name = "Folklore", raw = true, sort = " "}} } -- Add 'umbrella_parents' key if not already present. for _, data in pairs(labels) do -- NOTE: umbrella.parents overrides umbrella_parents if both are given. if not data.umbrella_parents then data.umbrella_parents = "Terms by etymology subcategories by language" end end ----------------------------------------------------------------------------- -- -- -- RAW CATEGORIES -- -- -- ----------------------------------------------------------------------------- raw_categories["Terms by etymology subcategories by language"] = { description = "Umbrella categories covering topics related to terms categorized by their etymologies, such as types of compounds or borrowings.", additional = "{{{umbrella_meta_msg}}}", parents = { "Umbrella metacategories", {name = "terms by etymology", is_label = true, sort = " "}, }, } raw_categories["Borrowed terms subcategories by language"] = { description = "Umbrella categories covering topics related to borrowed terms.", additional = "{{{umbrella_meta_msg}}}", parents = { "Umbrella metacategories", {name = "borrowed terms", is_label = true, sort = " "}, {name = "Terms by etymology subcategories by language", sort = " "}, }, } raw_categories["Inherited terms subcategories by language"] = { description = "Umbrella categories covering topics related to inherited terms.", additional = "{{{umbrella_meta_msg}}}", parents = { "Umbrella metacategories", {name = "inherited terms", is_label = true, sort = " "}, {name = "Terms by etymology subcategories by language", sort = " "}, }, } raw_categories["Indo-Aryan extensions"] = { description = "Umbrella categories covering terms extended with particular [[Indo-Aryan]] [[pleonastic]] affixes.", additional = "{{{umbrella_meta_msg}}}", parents = { "Umbrella metacategories", {name = "Terms by etymology subcategories by language", sort = " "}, }, } raw_categories["Multiple etymology subcategories by language"] = { description = "Umbrella categories covering topics related to terms with multiple etymologies.", additional = "{{{umbrella_meta_msg}}}", parents = { "Umbrella metacategories", {name = "Terms by etymology subcategories by language", sort = " "}, }, } raw_categories["Terms borrowed back into the same language"] = { description = "Categories with terms in specific languages that were borrowed from a second language that previously borrowed the term from the first language.", additional = "A well-known example is {{m+|en|salaryman}}, a term borrowed from Japanese which in turn was borrowed from the English words [[salary]] and [[man]].\n\n{{{umbrella_msg}}}", parents = "Terms by etymology subcategories by language", } ----------------------------------------------------------------------------- -- -- -- HANDLERS -- -- -- ----------------------------------------------------------------------------- local function get_source(source_name, allow_family, name_type) local source = get_lang_by_name(source_name, nil, true, allow_family) if source == nil then return nil end -- Check that the source name matches the expected form (e.g. getCanonicalName, getDisplayForm etc). if source[name_type](source) == source_name then return source end end local function get_source_and_type_desc(source, term_type) if source:getCode() == "ine-pro" and term_type:find("^roots?$") then return "[[w:Proto-Indo-European root|Proto-Indo-European " .. term_type .. "]]" end return "[[w:" .. source:getWikipediaArticle() .. "|" .. source:getCanonicalName() .. "]] " .. term_type end local function get_source_and_source_desc(source_name) -- HACK! Map 'taxonomic names', as generated by [[Module:etymology]], back to its canonical name -- before calling getByCanonicalName(). We need a more general solution here. local source_desc if source_name == "taxonomic names" then source_name = "taxonomic name" source_desc = "[[w:taxonomic nomenclature|taxonomic names]]" end local source = get_source(source_name, true, "getDisplayForm") if source == nil then return end source_desc = source_desc or source:makeCategoryLink() if source:hasType("family") then source_desc = "one of the " .. source_desc end return source, source_desc end ----------------------------------------------------------------------------- ------------------------------- word handlers ------------------------------- ----------------------------------------------------------------------------- -- Handlers for 'terms derived from the SOURCE word word' must go *BEFORE* the -- more general 'terms derived from SOURCE' handler. -- Root data from [[Module:roots]], which owns the separator, link target and -- romanization for each language. Required on demand so that category pages -- unrelated to roots do not load it. local function get_root_data(lang) return lang and require("Module:roots").get_data(lang:getCode()) or nil end -- Languages such as Hebrew have no automatic transliteration, but their root data -- defines one; this keeps the category description matching the root entry. local function root_translit(rdata, root) if not (rdata and rdata.romanization) then return nil end return require("Module:roots").transliterate(root, rdata.romanization) end -- Raises on a root that is not well-formed for its language. A language without root -- data declares no radical structure, so nothing is checked. local function assert_valid_root(lang, root) return require("Module:roots").assert_root(lang, root) end -- Whether a language's roots live at `Appendix:<language> roots/<root>`. The root data -- is the only authority: a language that does not declare `appendix_subpage` links to -- the root in mainspace. local function lang_uses_appendix_roots(lang) local rdata = get_root_data(lang) return rdata ~= nil and rdata.link_target == "appendix_subpage" end insert(handlers, function(data) local labelpref, word_and_id = data.label:match("^(terms belonging to the word )(.+)$") if not word_and_id then return end local word, id = word_and_id:match("^(.+) %((.-)%)$") if not word then word = word_and_id end local is_semitic = data.lang:inFamily("sem") local word_desc = is_semitic and "[[w:Semitic word|word]]" or "word" local parents = {} if id then insert(parents, {name = labelpref .. word, sort = id}) end insert(parents, {name = "terms by word", sort = word_and_id}) local separators = "־ %-" local separator_c = "[" .. separators .. "]" local not_separator_c = "[^" .. separators .. "]" -- remove any leading or trailing separators (e.g. in PIE-style words) local word_no_prefix_suffix = mw.ustring.gsub(mw.ustring.gsub(word, separator_c .. "$", ""), "^" .. separator_c, "") local num_sep = mw.ustring.len(mw.ustring.gsub(word_no_prefix_suffix, not_separator_c, "")) local linked_word = data.lang and full_link({ term = word, lang = data.lang, gloss = id, id = id }, "term") or word if num_sep > 0 then insert(parents, {name = "" .. (num_sep + 1) .. "-letter words", sort = word_and_id}) end -- Italicize the word/word in the title. local function displaytitle(title, lang) return plain_gsub(title, word, tag_text(word, lang, nil, "term")) end local breadcrumb = tag_text(word, data.lang, nil, "term") .. (id and " (" .. id .. ")" or "") return { description = "{{{langname}}} terms that belong to the " .. word_desc .. " " .. linked_word .. ".", displaytitle = displaytitle, breadcrumb = breadcrumb, parents = parents, umbrella = false, } end) insert(handlers, function(data) local source_name = data.label:match("^terms by (.+) word$") if not source_name then return end local source = get_source(source_name, false, "getCanonicalName") if not source then return end local parents = {"terms by etymology"} -- In [[:Category:Proto-Indo-Iranian terms by Proto-Indo-Iranian word]], -- don't add parent [[:Category:Proto-Indo-Iranian terms derived from Proto-Indo-Iranian]]. if not data.lang or data.lang:getCode() ~= source:getCode() then insert(parents, "terms derived from " .. source:getDisplayForm()) end return { description = "{{{langname}}} terms categorized by the " .. get_source_and_type_desc(source, "word") .. " they originate from.", parents = parents, umbrella_parents = "Terms by etymology subcategories by language", } end) ----------------------------------------------------------------------------- ------------------------------- Root handlers ------------------------------- ----------------------------------------------------------------------------- -- Handlers for 'terms derived from the SOURCE root ROOT' must go *BEFORE* the -- more general 'terms derived from SOURCE' handler. -- Handler for e.g. [[:Category:Yola terms derived from the Proto-Indo-European root *h₂el- (grow)]] and -- [[:Category:Russian terms derived from the Proto-Indo-European word *swé]], and corresponding umbrella -- categories [[:Category:Terms derived from the Proto-Indo-European root *h₂el- (grow)]] and -- [[:Category:Terms derived from the Proto-Indo-European word *swé]]. Replaces the former -- [[Module:category tree/PIE root cat]], [[Module:category tree/root cat]] and [[Template:PIE word cat]]. insert(handlers, function(data) local source_name, term_type, term_and_id for _, tt in ipairs{"root", "word", "term"} do source_name, term_and_id = data.label:match("^terms derived from the (.+) " .. tt .. " (.+)$") if source_name then term_type = tt break end end if not source_name then return end local term, id = term_and_id:match("^(.+) %((.-)%)$") if not term then term = term_and_id end local source = get_source(source_name, false, "getCanonicalName") if not source then return end local parents = { { name = "terms by " .. source_name .. " " .. term_type, sort = (source:makeSortKey(term)), } } local umbrella_parents = { { name = "Terms derived from " .. source_name .. " " .. term_type .. "s", sort = (source:makeSortKey(term)), } } if id then insert(parents, { name = "terms derived from the " .. source_name .. " " .. term_type .. " " .. term, sort = " " }) insert(umbrella_parents, { name = "terms derived from the " .. source_name .. " " .. term_type .. " " .. term, is_label = true, sort = " " }) end -- Italicize the word/word in the title. local function displaytitle(title, lang) return plain_gsub(title, term, tag_text(term, source, nil, "term")) end local breadcrumb = tag_text(term, source, nil, "term") .. (id and " (" .. id .. ")" or "") local term_page, alt_form, term_tr if term_type == "root" then assert_valid_root(source, term) local rdata = get_root_data(source) term_tr = root_translit(rdata, term) if lang_uses_appendix_roots(source) then term_page = ("Appendix:%s roots/%s"):format(source:getCanonicalName(), term) alt_form = term end end term_page = term_page or term return { description = "{{{langname}}} terms that originate ultimately from the " .. get_source_and_type_desc(source, term_type) .. " " .. full_link({ term = term_page, alt = alt_form, tr = term_tr, lang = source, gloss = id, id = id }, "term") .. ".", displaytitle = displaytitle, breadcrumb = breadcrumb, parents = parents, umbrella = { no_by_language = true, displaytitle = displaytitle, breadcrumb = breadcrumb, parents = umbrella_parents, } } end) insert(handlers, function(data) local labelpref, root_and_id = data.label:match("^(terms belonging to the root )(.+)$") if not root_and_id then return end local root, id = root_and_id:match("^(.+) %((.-)%)$") if not root then root = root_and_id end local is_semitic = data.lang:inFamily("sem") local root_desc = is_semitic and "[[w:Semitic root|root]]" or "root" local parents = {} if id then insert(parents, {name = labelpref .. root, sort = id}) end insert(parents, {name = "terms by root", sort = root_and_id}) if data.lang then assert_valid_root(data.lang, root) end local rdata = get_root_data(data.lang) local separators = rdata and rdata.separator and pattern_escape(rdata.separator) or "־ %-" local separator_c = "[" .. separators .. "]" local not_separator_c = "[^" .. separators .. "]" -- remove any leading or trailing separators (e.g. in PIE-style roots) local root_no_prefix_suffix = mw.ustring.gsub(mw.ustring.gsub(root, separator_c .. "$", ""), "^" .. separator_c, "") local num_sep = mw.ustring.len(mw.ustring.gsub(root_no_prefix_suffix, not_separator_c, "")) local root_page, alt_form if lang_uses_appendix_roots(data.lang) then root_page = ("Appendix:%s roots/%s"):format(data.lang:getCanonicalName(), root) alt_form = root else root_page = root end local linked_root = data.lang and full_link( { term = root_page, alt = alt_form, tr = root_translit(rdata, root), lang = data.lang, gloss = id, id = id, }, "term") or root_page if num_sep > 0 then insert(parents, {name = "" .. (num_sep + 1) .. "-letter roots", sort = root_and_id}) end -- Italicize the root/word in the title. local function displaytitle(title, lang) return plain_gsub(title, root, tag_text(root, lang, nil, "term")) end local breadcrumb = tag_text(root, data.lang, nil, "term") .. (id and " (" .. id .. ")" or "") return { description = "{{{langname}}} terms that belong to the " .. root_desc .. " " .. linked_root .. ".", displaytitle = displaytitle, breadcrumb = breadcrumb, parents = parents, umbrella = false, } end) insert(handlers, function(data) local source_name = data.label:match("^terms by (.+) root$") if not source_name then return end local source = get_source(source_name, false, "getCanonicalName") if not source then return end local parents = {"terms by etymology"} -- In [[:Category:Proto-Indo-Iranian terms by Proto-Indo-Iranian root]], -- don't add parent [[:Category:Proto-Indo-Iranian terms derived from Proto-Indo-Iranian]]. if not data.lang or data.lang:getCode() ~= source:getCode() then insert(parents, "terms derived from " .. source_name) end return { description = "{{{langname}}} terms categorized by the " .. get_source_and_type_desc(source, "root") .. " they originate from.", parents = parents, umbrella_parents = "Terms by etymology subcategories by language", } end) insert(handlers, function(data) local root_shape, post, additional = data.label:match("^(.+)([ -])shaped roots$") if not root_shape then return elseif data.lang and data.lang:getCode() == "ine-pro" then additional = [=[ * '''e''' stands for the vowel of the root. * '''C''' stands for any stop or ''s''. * '''R''' stands for any resonant. * '''H''' stands for any laryngeal. * '''M''' stands for ''m'' or ''w'', when followed by a resonant. * '''s''' stands for ''s'', when next to a stop.]=] end if root_shape == "irregularly" and post == " " then return { breadcrumb = "irregular", description = "{{{langname}}} roots with a shape that violates the {{w|Proto-Indo-European root#Shape of a root|known rules on root shapes}}.", additional = additional, parents = {{name = "roots by shape", sort = "*"}}, umbrella = false, } elseif post == " " then return end return { breadcrumb = root_shape, description = "{{{langname}}} roots with the shape ''" .. root_shape .. "''.", additional = additional, parents = {{name = "roots by shape", sort = root_shape}}, umbrella = false, } end) ----------------------------------------------------------------------------- -------------------- Derived/inherited/borrowed handlers -------------------- ----------------------------------------------------------------------------- -- Handler for categories of the form "LANG terms derived from SOURCE", where SOURCE is a language, etymology language -- or family (e.g. "Indo-European languages"), along with corresponding umbrella categories of the form -- "Terms derived from SOURCE". insert(handlers, function(data) local source_name = data.label:match("^terms derived from (.+)$") if not source_name then return end local source, source_desc = get_source_and_source_desc(source_name) if not source then return end -- Compute description. local desc = "{{{langname}}} terms that originate from " .. source_desc .. "." local additional if source:hasType("family") then additional = "This category should, ideally, contain only other categories. Entries can be categorized here, too, when the proper subcategory is unclear. " .. "If you know the exact language from which an entry categorized here is derived, please edit its respective entry." end -- Compute parents. local derived_from_variety_of_self = false local parent local sortkey = source:getDisplayForm() if source:hasType("etymology-only") then -- By default, `parent` is the source's parent. parent = source:getParent() -- Check if the source is a variety (or subvariety) of the language. if data.lang and source:hasParent(data.lang) then derived_from_variety_of_self = true end -- If the language is the direct parent of the source or the parent is "und", then we use the family of the source as `parent` instead. if data.lang and (parent:getCode() == data.lang:getCode() or parent:getCode() == "und") then parent = source:getFamily() end -- Regular language or family. else local fam = source:getFamily() if fam then parent = fam end end -- If `parent` does not exist, is the same as `source`, or would be "isolate languages" or "not a family", then we discard it. if (not parent) or parent:getCode() == source:getCode() or parent:getCode() == "qfa-iso" or parent:getCode() == "qfa-not" or parent:getCode() == "qfa-unc" then parent = nil derived_from_variety_of_self = false -- Otherwise, get the display form. else parent = parent:getDisplayForm() end parent = parent and "terms derived from " .. parent or "terms derived from other languages" local parents = {{name = parent, sort = sortkey}} if derived_from_variety_of_self then insert(parents, "Category:Categories for terms in a language derived from a term in a subvariety of that language") end -- Compute umbrella parents. local cat_name = source:getCode() == "mul-tax" and "Taxonomic names" or source:getCategoryName() -- If the source is etymology-only, its category will be handled by the lect handler in -- [[Module:category tree/lects]]. If it has a nonstandard name like 'Kölsch' (i.e. not a name like -- 'American English' that has a language name in it), the lect handler won't handle it unless we tell it to do so -- through the following call; this is an optimization to avoid expensive processing work on all manner of randomly -- named categories. if source:hasType("etymology-only") then require("Module:category tree/lects").export.register_likely_lect_parent_cat(cat_name) end local umbrella_parents = { (source:hasType("family") or source:getCode() == "mul-tax") and {name = cat_name, raw = true, sort = " "} or {name = cat_name, raw = true, sort = "terms derived from"} } -- Without the following, the breadcrumb trail for e.g. [[Category:Javanese terms derived from French]] looks like -- Fundamental » All languages » Javanese » Terms by etymology » Terms derived from other languages » -- Indo-European languages » Italic languages » Romance languages » Italo-Western Romance languages » -- Western Romance languages » Gallo-Romance languages » Gallo-Rhaetian languages » Oïl languages » French -- To reduce the length, we truncate the "languages" part of the breadcrumbs as long as this does not create -- ambiguity (i.e. unless there is a language with the same name as the family). Hence, for the Category -- [[Category:Javanese terms derived from Arabic]], we end up with -- Fundamental » All languages » Javanese » Terms by etymology » Terms derived from other languages » Afroasiatic » -- Semitic » West Semitic » Central Semitic » Arabic languages » Arabic -- because "Arabic" is ambiguous between family and language (and script, for that matter). local breadcrumb = source_name if source:hasType("family") and breadcrumb:find(" languages$") then local truncated_breadcrumb = breadcrumb:gsub(" languages$", "") if not get_lang_by_name(truncated_breadcrumb, nil, "allow etym") then breadcrumb = truncated_breadcrumb end end return { description = desc, additional = additional, breadcrumb = breadcrumb, parents = parents, umbrella = { description = "Categories with terms that originate from " .. source_desc .. ".", parents = umbrella_parents, }, } end) -- Handler for categories of the form "LANG terms inherited/borrowed from SOURCE", where SOURCE is a language, -- etymology language or family (e.g. "Indo-European languages"). Also handles umbrella categories of the form -- "Terms inherited/borrowed from SOURCE". local function inherited_borrowed_handler(etymtype) return function(data) local source_name = data.label:match("^terms " .. etymtype .. " from (.+)$") if not source_name then return end local source, source_desc = get_source_and_source_desc(source_name) if not source then return end return { description = "{{{langname}}} terms " .. etymtype .. " from " .. source_desc .. ".", breadcrumb = source_name, parents = { {name = etymtype .. " terms", sort = source_name}, {name = "terms derived from " .. source_name, sort = " "}, }, umbrella = { parents = { { name = "terms derived from " .. source_name, is_label = true, sort = " " }, etymtype == "inherited" and { name = "Inherited terms subcategories by language", sort = source_name } -- There are several types of borrowings mixed into the following holding category, -- so keep these ones sorted under 'Terms borrowed from SOURCE_NAME' instead of just -- 'SOURCE_NAME'. or "Borrowed terms subcategories by language", } }, } end end insert(handlers, inherited_borrowed_handler("borrowed")) insert(handlers, inherited_borrowed_handler("inherited")) ----------------------------------------------------------------------------- ------------------------ Borrowing subtype handlers ------------------------- ----------------------------------------------------------------------------- -- General handler for specific borrowing subtypes, such as learned borrowings, calques and phono-semantic matchings. local function borrowing_subtype_handler(dest, source_name, parent_cat, spec) local source, source_desc = get_source_and_source_desc(source_name) if not source then return end -- normally uses of UNKNOWN should not show up to the end user local dest_name = dest and dest:getCanonicalName() or "UNKNOWN" local additional, umbrella_additional if spec.additional then if dest then additional = spec.additional(source, dest) else umbrella_additional = spec.umbrella_additional(source) end else if not spec.categorizing_templates then error("Internal error: Must specify either `categorizing_templates` or the combination of `additional` and `umbrella_additional` in each borrowing subtype spec") end local extra_templates = {} local extra_template_text for i, template in ipairs(spec.categorizing_templates) do if i > 1 then insert(extra_templates, ("{{tl|%s|...}}"):format(template)) end end if #extra_templates > 0 then extra_template_text = (" (or %s, using the same syntax)"):format( serial_comma_join(extra_templates, {conj = "or"})) else extra_template_text = "" end if dest then additional = ("To categorize a term into this category, use {{tl|%s|%s|%s|<var>source_term</var>}}%s, " .. "where <code><var>source_term</var></code> is the %s term that the term in question " .. "was borrowed from."):format( spec.categorizing_templates[1], dest:getCode(), source:getCode(), extra_template_text, source_name) else umbrella_additional = ("To categorize a term into a language-specific subcategory, use " .. "{{tl|%s|<var>destcode</var>|%s|<var>source_term</var>}}%s, where <code><var>destcode</var></code> " .. "is the language code of the language in question (see [[Wiktionary:List of languages]]), and " .. "<code><var>source_term</var></code> is the %s term that the term in question was " .. "borrowed from."):format(spec.categorizing_templates[1], source:getCode(), extra_template_text, source_name) end end return { description = "{{{langname}}} " .. spec.from_source_desc:gsub("SOURCE", source_desc):gsub("DEST", dest_name), additional = additional, breadcrumb = source_name, parents = { { name = parent_cat, sort = source_name }, { name = "terms borrowed from " .. source_name, sort = " " }, }, umbrella = { additional = umbrella_additional, parents = { { name = "terms borrowed from " .. source_name, is_label = true, sort = " " }, "Borrowed terms subcategories by language", } }, } end -- Specs describing types of borrowings. -- `from_source_desc` is the English description used in categories of the form "LANGUAGE BORTYPE from SOURCE", -- e.g. "Arabic semantic loans from English". "SOURCE" in the description is replaced by the source language. -- `umbrella_desc` is the English description used in categories of the form "LANGUAGE BORTYPE", e.g. -- "Arabic semantic loans". This is an umbrella category grouping all the source-language-specific categories. -- `uses_subtype_handler`, if true, means that the handler for "LANGUAGE BORTYPE from SOURCE" categories is -- implemented by a generic "TYPE borrowings" handler (at the bottom of this section), so we don't need to -- create a BORTYPE-specific handler. -- `umbrella_parent`, if given, is the parent category of the umbrella categories of the form "LANGUAGE BORTYPE". -- By default it is "borrowed terms". Some borrowing types replace this with "terms by etymology". (FIXME: -- Review whether this is correct.) -- `label_pattern`, if given, is a Lua pattern that matches the category name minus the language at the beginning. -- It should have one capture, which is the source language. An example is "^terms partially calqued from (.+)$". -- If omitted, it is generated from BORTYPE. -- `categorizing_templates`, if given, is the list of templates that categorize into this category. They are assumed to -- follow the syntax of {{bor}}. The first template in the list should be the preferred alias. The specified -- templates are used to form the `additional` text displayed on the language-specific category page and -- corresponding umbrella category page describing how to categorize into the category in question. In more complex -- cases, you can omit this field and instead supply the `additional` and `umbrella_additional` fields (as is done -- with adapted borrowings). You must either specify `categorizing_templates` or the combination of `additional` and -- `umbrella_additional`. -- `additional`, if given, is a function of two arguments (source and destination language objects) that will generate -- the `additional` text displayed on the language-specific category page that describes how to categorize into the -- category in question. This is an alternative to specifying `categorizing_templates`, used in more complex cases -- (currently, with adapted borrowings). -- `umbrella_additional`, if given, is a function of one argument (source language object) that will generate the -- `additional` text displayed on the umbrella category page that describes how to categorize into the category in -- question. This is an alternative to specifying `categorizing_templates`, used in more complex cases (currently, -- with adapted borrowings). local borrowing_specs = { ["learned borrowings"] = { from_source_desc = "terms that are learned [[loanword]]s from SOURCE, that is, terms that were directly incorporated from SOURCE instead of through normal language contact.", umbrella_desc = "terms that are learned [[loanword]]s, that is, terms that were directly incorporated from another language instead of through normal language contact.", uses_subtype_handler = true, categorizing_templates = {"lbor", "learned borrowing"}, }, ["semi-learned borrowings"] = { from_source_desc = "terms that are [[semi-learned borrowing|semi-learned]] [[loanword]]s from SOURCE, that is, terms borrowed from SOURCE (a [[classical language]]) into DEST (a modern language) and partly reshaped based on later [[sound change]]s or by analogy with [[inherit]]ed terms in the language.", umbrella_desc = "terms that are [[semi-learned borrowing|semi-learned]] [[loanword]]s, that is, terms borrowed from a [[classical language]] into a modern language and partly reshaped based on later [[sound change]]s or by analogy with [[inherit]]ed terms in the language.", uses_subtype_handler = true, categorizing_templates = {"slbor", "semi-learned borrowing"}, }, ["orthographic borrowings"] = { from_source_desc = "orthographic loans from SOURCE, i.e. terms that were borrowed from SOURCE in their script forms, not their pronunciations.", umbrella_desc = "orthographic loans, i.e. terms that were borrowed in their script forms, not their pronunciations.", uses_subtype_handler = true, categorizing_templates = {"obor", "orthographic borrowing"}, }, ["unadapted borrowings"] = { from_source_desc = "[[loanword]]s from SOURCE that have not been conformed to the morpho-syntactic, phonological and/or phonotactical rules of DEST.", umbrella_desc = "[[loanword]]s that have not been conformed to the morpho-syntactic, phonological and/or phonotactical rules of the target language.", uses_subtype_handler = true, categorizing_templates = {"ubor", "unadapted borrowing"}, }, ["adapted borrowings"] = { from_source_desc = "[[loanwords]] from SOURCE formed with the addition of an affix to conform the term to the normal morphology of DEST.", umbrella_desc = "[[loanword]]s formed with the addition of an affix to conform the term to the normal morphology of the target language.", uses_subtype_handler = true, additional = function(source, dest) return ("To categorize a term into this category, use {{tl|af|%s|3=type=adap|4=%s:<var>source_term</var>|5=-<var>affix</var>}} " .. "(or {{tl|af|%s|3=type=abor|4=...}}, using the same syntax), where <code><var>source_term</var></code> is " .. "the %s term that the term in question was borrowed from and <code><var>affix</var></code> " .. "is the %s affix used to adapt the %s term. An example is " .. "{{m+|pl|adresować||to address}}, which would use {{tl|af|pl|3=type=adap|4=fr:adresser|5=-ować}} to indicate " .. "that is was formed from {{m+|fr|adresser}} with the addition of the Polish verb-forming affix " .. "{{m|pl|-ować}}."):format(dest:getCode(), source:getCode(), dest:getCode(), source:getCanonicalName(), dest:getCanonicalName(), source:getCanonicalName()) end, umbrella_additional = function(source) return ("To categorize a term into a language-specific subcategory, use {{tl|af|<var>destcode</var>|3=type=adap|4=%s:<var>source_term</var>|5=-<var>affix</var>}} " .. "(or {{tl|af|<var>destcode</var>|3=type=abor|4=...}}, using the same syntax), where " .. "<code><var>destcode</var></code> is the language code of the target language in question (see " .. "[[Wiktionary:List of languages]]); <code><var>source_term</var></code> is the %s term " .. "that the term in question was borrowed from; and <code><var>affix</var></code> is the target-language " .. "affix used to adapt the %s term. An example is {{m+|pl|adresować||to address}}, which " .. "would use {{tl|af|pl|3=type=adap|4=fr:adresser|5=-ować}} to indicate that is was formed from " .. "{{m+|fr|adresser}} with the addition of the Polish verb-forming affix {{m|pl|-ować}}."):format( source:getCode(), source:getCanonicalName(), source:getCanonicalName()) end, }, ["semantic loans"] = { from_source_desc = "[[Appendix:Glossary#semantic loan|semantic loans]] from SOURCE, i.e. terms one or more of whose definitions was borrowed from a term in SOURCE.", umbrella_desc = "[[Appendix:Glossary#semantic loan|semantic loans]], i.e. terms one or more of whose definitions was borrowed from a term in another language.", umbrella_parent = "terms by etymology", categorizing_templates = {"sl", "semantic loan"}, }, ["partial calques"] = { from_source_desc = "terms that were [[Appendix:Glossary#partial calque|partially calqued]] from SOURCE, i.e. terms formed partly by piece-by-piece translations of SOURCE terms and partly by direct borrowing.", umbrella_desc = "[[Appendix:Glossary#partial calque|partial calques]], i.e. terms formed partly by piece-by-piece translations of terms from other languages and partly by direct borrowing.", umbrella_parent = "terms by etymology", label_pattern = "^terms partially calqued from (.+)$", categorizing_templates = {"pcal", "pclq", "partial calque"}, }, ["calques"] = { from_source_desc = "terms that were [[Appendix:Glossary#calque|calqued]] from SOURCE, i.e. terms formed by piece-by-piece translations of SOURCE terms.", umbrella_desc = "[[Appendix:Glossary#calque|calques]], i.e. terms formed by piece-by-piece translations of terms from other languages.", umbrella_parent = "terms by etymology", label_pattern = "^terms calqued from (.+)$", categorizing_templates = {"cal", "clq", "calque"}, }, ["phono-semantic matchings"] = { from_source_desc = "[[Appendix:Glossary#phono-semantic matching|phono-semantic matchings]] from SOURCE, i.e. terms that were borrowed by matching the etymon phonetically and semantically.", umbrella_desc = "[[Appendix:Glossary#phono-semantic matching|phono-semantic matchings]], i.e. terms that were borrowed by matching the etymon phonetically and semantically.", categorizing_templates = {"psm", "phono-semantic matching"}, }, ["pseudo-loans"] = { from_source_desc = "[[Appendix:Glossary#pseudo-loan|pseudo-loans]] from SOURCE, i.e. terms that appear to be SOURCE, but are not used or have an unrelated meaning in SOURCE itself.", umbrella_desc = "[[Appendix:Glossary#pseudo-loan|pseudo-loans]], i.e. terms that appear to be derived from another language, but are not used or have an unrelated meaning in that language itself.", categorizing_templates = {"pl", "pseudo-loan"}, }, } for bortype, spec in pairs(borrowing_specs) do labels[bortype] = { description = "{{{langname}}} " .. spec.umbrella_desc, parents = {spec.umbrella_parent or "borrowed terms"}, umbrella_parents = "Terms by etymology subcategories by language", } if not spec.uses_subtype_handler then -- If the label pattern isn't specifically given, generate it from the `bortype`; but make sure to -- escape hyphens in the pattern. local label_pattern = spec.label_pattern or "^" .. pattern_escape(bortype) .. " from (.+)$" insert(handlers, function(data) local source_name = data.label:match(label_pattern) if source_name then return borrowing_subtype_handler(data.lang, source_name, bortype, spec) end end) end end insert(handlers, function(data) local borrowing_type, source_name = data.label:match("^(.+ borrowings) from (.+)$") if borrowing_type then local spec = borrowing_specs[borrowing_type] return borrowing_subtype_handler(data.lang, source_name, borrowing_type, spec) end end) ----------------------------------------------------------------------------- ---------------------- Indo-Aryan extension handlers ------------------------ ----------------------------------------------------------------------------- -- FIXME: Put this in a family-specific module. insert(handlers, function(data) local labelpref, extension = data.label:match("^(terms extended with Indo%-Aryan )(.+)$") if not extension then return end local lang_inc_ash = require("Module:languages").getByCode("inc-ash") local linked_term = full_link({lang = lang_inc_ash, term = extension}, "term") local tagged_term = tag_text(extension, lang_inc_ash, nil, "term") return { description = "{{{langname}}} terms extended with the [[Indo-Aryan]] [[pleonastic]] affix " .. linked_term .. ".", displaytitle = "{{{langname}}} " .. labelpref .. tagged_term, breadcrumb = tagged_term, parents = {{name = "terms with Indo-Aryan extensions", sort = extension}}, umbrella = { no_by_language = true, parents = "Indo-Aryan extensions", displaytitle = "Terms extended with Indo-Aryan " .. tagged_term, } } end) ----------------------------------------------------------------------------- ---------------------------- Coined-by handlers ----------------------------- ----------------------------------------------------------------------------- insert(handlers, function(data) local coiner = data.label:match("^terms coined by (.+)$") if not coiner then return end -- Sort by last name per request from [[User:Metaknowledge]] local last_name = umatch(coiner, ".-%s(%S+)$") return { description = "{{{langname}}} terms coined by " .. coiner .. ".", breadcrumb = coiner, parents = {{ name = "coinages", sort = last_name and last_name .. ", " .. coiner or coiner, }}, umbrella = false, } end) ----------------------------------------------------------------------------- ------------------------ Multiple etymology handlers ------------------------ ----------------------------------------------------------------------------- insert(handlers, function(data) local pos = data.label:match("^terms with multiple (.+) etymologies$") if not pos then return end local plpos = pluralize_pos(pos) local postype = pos_lemma_or_nonlemma(plpos) if not postype then return end return { description = "{{{langname}}} " .. plpos .. " that are derived from multiple origins.", umbrella_parents = "Multiple etymology subcategories by language", breadcrumb = "multiple " .. plpos, parents = {{ name = "terms with multiple " .. postype .. " etymologies", sort = pos, }}, } end) insert(handlers, function(data) local pos1, pos2 = data.label:match("^terms with (.+) and (.+) etymologies$") if not pos1 then return end local pos1type = pos_lemma_or_nonlemma(pluralize_pos(pos1)) local pos2type = pos_lemma_or_nonlemma(pluralize_pos(pos2)) if not (pos1type and pos2type) then return end return { description = "{{{langname}}} terms consisting of " .. add_indefinite_article(pos1) .." of one origin and " .. add_indefinite_article(pos2) .. " of a different origin.", umbrella_parents = "Multiple etymology subcategories by language", breadcrumb = pos1 .. " and " .. pos2, parents = {{ name = pos1type == pos2type and "terms with multiple " .. pos1type .. " etymologies" or "terms with lemma and non-lemma form etymologies", sort = pos1 .. " and " .. pos2, }}, } end) ----------------------------------------------------------------------------- --------------------------- Borrowed-back handlers -------------------------- ----------------------------------------------------------------------------- -- Handler for categories of the form e.g. [[:Category:English terms borrowed back into English]]. We need to use a handler -- because the category's language occurs inside the label itself. For the same reason, the umbrella category has a -- nonstandard name "Terms borrowed back into the same language", so we handle it as a regular parent and disable the -- built-in umbrella mechanism. insert(handlers, function(data) local lang = data.lang if not lang then return end local source_name = data.label:match("^terms borrowed back into (.+)$") if not (source_name and source_name == lang:getDisplayForm()) then return end return { description = "{{{langname}}} terms that were borrowed from another language that originally borrowed the term from " .. source_name .. ".", parents = {"terms by etymology", "borrowed terms", { name = "Terms borrowed back into the same language", raw = true, sort = "{{{langname}}}" }}, umbrella = false, -- Umbrella has a nonstandard name so we treat it as a raw category } end) ----------------------------------------------------------------------------- -- -- -- RAW HANDLERS -- -- -- ----------------------------------------------------------------------------- -- Handler for umbrella metacategories of the form e.g. [[:Category:Terms derived from Proto-Indo-Iranian roots]] -- and [[:Category:Terms derived from Proto-Indo-European words]]. Replaces the former -- [[Module:category tree/PIE root cat]], [[Module:category tree/root cat]] and [[Template:PIE word cat]]. insert(raw_handlers, function(data) local source_name, terms_type for _, tt in ipairs{"roots", "words", "terms"} do source_name = data.category:match("^Terms derived from (.+) " .. tt .. "$") if source_name then terms_type = tt break end end if not source_name then return end local source = get_source(source_name, false, "getCanonicalName") if not source then return end return { description = "Umbrella categories covering terms derived from particular " .. get_source_and_type_desc(source, terms_type) .. ".", additional = "{{{umbrella_meta_msg}}}", parents = { "Umbrella metacategories", { name = terms_type == "roots" and "roots" or "lemmas", is_label = true, lang = source:getCode(), sort = " " }, { name = "terms derived from " .. source_name, is_label = true, sort = " " .. terms_type }, }, } end) return {LABELS = labels, RAW_CATEGORIES = raw_categories, HANDLERS = handlers, RAW_HANDLERS = raw_handlers} 4t8q02abya6knepuy5kmp0bu0k21en3 487884 487883 2026-09-03T10:21:43Z SM7 6218 लोकलाइजेशन... 487884 Scribunto text/plain local labels = {} local raw_categories = {} local handlers = {} local raw_handlers = {} local en_utilities_module = "Module:en-utilities" local m_str_utils = require("Module:string utilities") local add_indefinite_article = require(en_utilities_module).add_indefinite_article local full_link = require("Module:links").full_link local get_lang_by_name = require("Module:languages").getByCanonicalName local insert = table.insert local pattern_escape = m_str_utils.pattern_escape local plain_gsub = m_str_utils.plain_gsub local pluralize_pos = require("Module:headword").pluralize_pos local pos_lemma_or_nonlemma = require("Module:headword").pos_lemma_or_nonlemma local serial_comma_join = require("Module:table").serialCommaJoin local tag_text = require("Module:script utilities").tag_text local umatch = mw.ustring.match local unpack = unpack or table.unpack -- Lua 5.2 compatibility ----------------------------------------------------------------------------- -- -- -- LABELS -- -- -- ----------------------------------------------------------------------------- labels["टर्म व्युत्पत्ति अनुसार"] = { description = "{{{langname}}} terms categorized by their etymologies.", umbrella_parents = "मूलभूत श्रेणी", parents = {{name = "{{{langcat}}}", raw = true}}, } labels["AABB-type reduplications"] = { description = "{{{langname}}} terms that underwent [[reduplication]] in an AABB pattern.", breadcrumb = "AABB-type", parents = {"reduplications"}, } labels["apophonic reduplications"] = { description = "{{{langname}}} terms that underwent [[reduplication]] with only a change in a vowel sound.", breadcrumb = "apophonic", parents = {"reduplications"}, } labels["back-formations"] = { description = "{{{langname}}} terms formed by reversing a supposed regular formation, removing part of an older term.", parents = {"terms by etymology"}, } labels["blends"] = { description = "{{{langname}}} terms formed by combinations of other words.", parents = {"terms by etymology"}, } labels["आहरित टर्म"] = { description = "{{{langname}}} terms that are loanwords, i.e. terms that were directly incorporated from another language.", parents = {"टर्म व्युत्पत्ति अनुसार"}, } labels["catachreses"] = { description = "{{{langname}}} terms derived from misuses or misapplications of other terms.", parents = {"terms by etymology"}, } labels["coinages"] = { description = "{{{langname}}} terms coined by an identifiable person, organization or other such entity.", parents = {"terms attributed to a specific source"}, umbrella_parents = {name = "terms attributed to a specific source", is_label = true, sort = " "}, } labels["coordinated pairs"] = { description = "Terms in {{{langname}}} consisting of a pair of terms joined by a [[coordinating conjunction]].", parents = {"terms by etymology"}, } labels["coordinated triples"] = { description = "Terms in {{{langname}}} consisting of three terms joined by one or more [[coordinating conjunction]]s.", parents = {"terms by etymology"}, } labels["coordinated quadruples"] = { description = "Terms in {{{langname}}} consisting of four terms joined by one or more [[coordinating conjunction]]s.", parents = {"terms by etymology"}, } labels["coordinated quintuples"] = { description = "Terms in {{{langname}}} consisting of five terms joined by one or more [[coordinating conjunction]]s.", parents = {"terms by etymology"}, } labels["denominals"] = { description = "{{{langname}}} terms derived from a noun.", parents = {"terms by etymology"}, } labels["deverbals"] = { description = "{{{langname}}} terms derived from a verb.", parents = {"terms by etymology"}, } labels["doublets"] = { description = "{{{langname}}} terms that trace their etymology from ultimately the same source as other terms in the same language, but by different routes, and often with subtly or substantially different meanings.", parents = {"terms by etymology"}, } labels["elongated forms"] = { description = "{{{langname}}} terms where one or more letters or sounds is repeated for emphasis or effect.", parents = {"terms by etymology"}, } labels["eponyms"] = { description = "{{{langname}}} terms derived from names of real or fictitious individuals.", parents = {"terms by etymology"}, } labels["genericized trademarks"] = { description = "{{{langname}}} terms that originate from [[trademark]]s, [[brand]]s and company names which have become [[genericized]]; that is, fallen into common usage in the target market's [[vernacular]], even when referring to other competing brands.", parents = {"terms by etymology", "trademarks"}, } labels["ghost words"] = { description = "{{{langname}}} terms that were originally erroneous or fictitious, published in a reference work as if they were genuine as a result of typographical error, misreading, or misinterpretation, or as [[:w:Fictitious entry|fictitious entries]], jokes, or hoaxes.", parents = {"terms by etymology"}, } labels["gramograms"] = { description = "{{{langname}}} [[gramogram]]s &ndash; terms that are partially or completely spelled with [[homophone|homophonous]] letters.", parents = {"rebuses"}, } labels["haplological words"] = { description = "{{{langname}}} words that underwent [[haplology]]: thus, their origin involved a loss or omission of a repeated sequence of sounds.", parents = {"terms by etymology"}, } labels["homophonic translations"] = { description = "{{{langname}}} terms that were borrowed by matching the etymon phonetically, without regard for the sense; compare [[phono-semantic matching]] and [[Hobson-Jobson]].", parents = {"terms by etymology"} } labels["hybridisms"] = { description = "{{{langname}}} terms formed by elements of different linguistic origins.", parents = {"terms by etymology"}, } labels["inherited terms"] = { description = "{{{langname}}} terms that were inherited from an earlier stage of the language.", parents = {"terms by etymology"}, } labels["internationalisms"] = { description = "{{{langname}}} loanwords which also exist in many other languages with the same or similar etymology.", additional = "Terms should be here preferably only if the immediate source language is not known for certain. Entries are added into this category by [[Template:internationalism]]; see it for more information.", parents = {"terms by etymology"}, } labels["legal doublets"] = { description = "{{{langname}}} legal [[doublet]]s &ndash; a legal doublet is a standardized phrase commonly used in legal documents, proceedings etc. which includes two words that are near synonyms.", parents = {"coordinated pairs"}, } labels["legal triplets"] = { description = "{{{langname}}} legal [[triplet]]s &ndash; a legal triplet is a standardized phrase commonly used in legal documents, proceedings etc which includes three words that are near synonyms.", parents = {"coordinated triples"}, } labels["LLM coinages"] = { description = "{{{langname}}} terms that have been coined by {{w|large language models}} rather than humans.", parents = {"terms by etymology"}, } labels["merisms"] = { description = "{{{langname}}} [[merism]]s &ndash; terms that are [[coordinate]]s that, combined, are a synonym for a totality.", parents = {"coordinated pairs"}, } labels["metonyms"] = { description = "{{{langname}}} terms whose origin involves calling a thing or concept not by its own name, but by the name of something intimately associated with that thing or concept.", parents = {"terms by etymology"}, } labels["neologisms"] = { description = "{{{langname}}} terms that have been only recently acknowledged.", parents = {"terms by etymology"}, } labels["nominalizations"] = { description = "{{{langname}}} terms formed by nominalization, a process where a word from another part of speech becomes a noun.", parents = {"terms by etymology"}, } labels["nonce terms"] = { description = "{{{langname}}} terms that have been invented for a single occasion.", parents = {"terms by etymology"}, } labels["number homophones"] = { description = "{{{langname}}} terms that are partially or completely spelled with [[homophone|homophonous]] numbers.", parents = {"rebuses", "terms spelled with numbers"}, } labels["numerical contractions"] = { description = "{{{langname}}} numerical contractions. In these, the number either denotes omitted characters ({{m+|en|globalization}} → {{m|en|g11n}}) or duplication ({{m+|kne|Kankanaey}} → {{m|kne|Kan2aey}}).", parents = {"contractions", "rebuses", "terms spelled with numbers"}, } labels["onomatopoeias"] = { description = "{{{langname}}} terms that were coined to sound like what they represent.", parents = {"terms by etymology"}, } labels["piecewise doublets"] = { description = "{{{langname}}} terms that are [[Appendix:Glossary#piecewise doublet|piecewise doublets]].", parents = {"terms by etymology"}, } for _, ism_and_langname in ipairs({ {"anglicisms", "English"}, {"Arabisms", "Arabic"}, {"Gallicisms", "French"}, {"Germanisms", "German"}, {"Hispanisms", "Spanish"}, {"Italianisms", "Italian"}, {"Latinisms", "Latin"}, {"Japonisms", "Japanese"}, }) do local ism, langname = unpack(ism_and_langname) labels["pseudo-" .. ism] = { description = "{{{langname}}} terms that appear to be " .. langname .. ", but are not used or have an unrelated meaning in " .. langname .. " itself.", parents = {"pseudo-loans"}, umbrella_parents = {name = "pseudo-loans", is_label = true, sort = " "}, } end labels["rebracketings"] = { description = "{{{langname}}} terms that have interacted with another word in such a way that the boundary between the words has been modified.", parents = {"terms by etymology"} } labels["rebuses"] = { description = "{{{langname}}} [[rebus]]es &ndash; terms that are partially or completely represented by images, symbols or numbers, often as a form of wordplay.", parents = {"terms by etymology"}, } labels["reconstructed terms"] = { description = "{{{langname}}} terms that are not directly attested, but have been reconstructed through other evidence.", parents = {"terms by etymology"} } labels["reduplicated coordinated pairs"] = { description = "{{{langname}}} reduplicated coordinated pairs.", breadcrumb = "reduplicated", parents = {"coordinated pairs", "reduplications"}, } labels["reduplicated coordinated triples"] = { description = "{{{langname}}} reduplicated coordinated triples.", breadcrumb = "reduplicated", parents = {"coordinated triples", "reduplications"}, } labels["reduplicated coordinated quadruples"] = { description = "{{{langname}}} reduplicated coordinated quadruples.", breadcrumb = "reduplicated", parents = {"coordinated quadruples", "reduplications"}, } labels["reduplicated coordinated quintuples"] = { description = "{{{langname}}} reduplicated coordinated quintuples.", breadcrumb = "reduplicated", parents = {"coordinated quintuples", "reduplications"}, } labels["reduplications"] = { description = "{{{langname}}} terms that underwent [[reduplication]], so their origin involved a repetition of roots or stems.", parents = {"terms by etymology"}, } labels["retronyms"] = { description = "{{{langname}}} terms that serve as new unique names for older objects or concepts whose previous names became ambiguous.", parents = {"terms by etymology"}, } labels["roots"] = { description = "Basic morphemes from which {{{langname}}} words are formed.", parents = {"terms by etymology", "morphemes"}, } labels["संस्कृत निर्मितियाँ"] = { description = "{{{langname}}} के टर्म जो तत्सम संस्कृत शब्दों अथवा/एवं संयोजनों ([[affix]]es) से बने हैं।", parents = {"टर्म व्युत्पत्ति अनुसार", "टर्म संस्कृत से निर्मित"}, } labels["sound-symbolic terms"] = { description = "{{{langname}}} terms that use {{w|sound symbolism}} to express ideas but which are not necessarily strictly speaking [[onomatopoeic]].", parents = {"terms by etymology"}, } labels["spelled-out initialisms"] = { description = "{{{langname}}} initialisms in which the letter names are spelled out.", parents = {"terms by etymology"}, } labels["spelling pronunciations"] = { description = "{{{langname}}} terms whose pronunciation was historically or presently affected by their spelling.", parents = {"terms by etymology"}, } labels["spoonerisms"] = { description = "{{{langname}}} terms in which the initial sounds of component parts have been exchanged, as in \"crook and nanny\" for \"nook and cranny\".", parents = {"terms by etymology"}, } labels["taxonomic eponyms"] = { description = "{{{langname}}} terms derived from names of real or fictitious people, used for [[taxonomy]].", parents = {"eponyms"}, } labels["terms attributed to a specific source"] = { description = "{{{langname}}} terms coined by an identifiable person or deriving from a known work.", parents = {"terms by etymology"}, } labels["terms coined ex nihilo"] = { description = "{{{langname}}} terms fabricated ''[[ex nihilo]]'', i.e. made up entirely rather than being derived from an existing source.", parents = {"terms by etymology"}, } labels["terms containing fossilized case endings"] = { description = "{{{langname}}} terms which preserve case morphology which is no longer analyzable within the contemporary grammatical system or which has been entirely lost from the language.", parents = {"terms by etymology"}, } labels["terms derived from area codes"] = { description = "{{{langname}}} terms derived from [[area code]]s.", parents = {"terms by etymology"}, } labels["terms derived from the shape of letters"] = { description = "{{{langname}}} terms derived from the shape of letters. This can include terms derived from the shape of any letter in any alphabet.", parents = {"terms by etymology"}, } labels["terms by root"] = { description = "{{{langname}}} terms categorized by the root they originate from.", parents = {"terms by etymology", {name = "roots", sort = " "}}, } labels["terms by word"] = { description = "{{{langname}}} terms categorized by the word they originate from.", parents = {"terms by etymology"}, } labels["terms derived from fiction"] = { description = "{{{langname}}} terms that originate from works of [[fiction]].", breadcrumb = "fiction", parents = {{name = "terms attributed to a specific source", sort = "fiction"}}, } for _, data in ipairs { {source="Dickensian works", desc="the works of [[w:Charles Dickens|Charles Dickens]]", topic_parent="Charles Dickens"}, {source="DC Comics", desc="[[w:DC Comics|DC Comics]]"}, {source="Doraemon", desc="[[w:Fujiko F. Fujio|Fujiko F. Fujio]]'s ''[[w:Doraemon|Doraemon]]''", displaytitle="''Doraemon''"}, {source="Dragon Ball", desc="[[w:Akira Toriyama|Akira Toriyama]]'s ''[[w:Dragon Ball|Dragon Ball]]''", displaytitle="''Dragon Ball''"}, {source="Duckburg and Mouseton", desc="[[w:The Walt Disney Company|Disney]]'s [[w:Duck universe|Duckburg]] and [[w:Mickey Mouse universe|Mouseton]] universe", topic_parent="Disney"}, {source="Futurama", desc="the animated television series ''{{w|Futurama}}''", displaytitle = "''Futurama''"}, {source="Harry Potter", desc="the ''[[w:Harry Potter|Harry Potter]]'' series", displaytitle="''Harry Potter''", topic_parent="Harry Potter"}, {source="Looney Tunes and Merrie Melodies", desc="''{{w|Looney Tunes}}'' and/or ''{{w|Merrie Melodies}}'', by {{w|Warner Bros. Animation}}", displaytitle = "''Looney Tunes'' and ''Merrie Melodies''"}, {source="Nineteen Eighty-Four", desc="[[w:George Orwell|George Orwell]]'s ''[[w:Nineteen Eighty-Four|Nineteen Eighty-Four]]''", displaytitle="''Nineteen Eighty-Four''"}, {source="Seinfeld", desc="the American television sitcom ''{{w|Seinfeld}}'' (1989–1998)", displaytitle="''Seinfeld''"}, {source="Seussian works", desc="the works of [[w:Dr. Seuss|Dr. Seuss]]"}, {source="South Park", desc="the animated television series ''[[w:South Park|South Park]]''", displaytitle="''South Park''"}, {source="Star Trek", desc="''[[w:Star Trek|Star Trek]]''", displaytitle="''Star Trek''", topic_parent="Star Trek"}, {source="Star Wars", desc="''[[w:Star Wars|Star Wars]]''", displaytitle="''Star Wars''", topic_parent="Star Wars"}, {source="The Simpsons", desc="''[[w:The Simpsons|The Simpsons]]''", displaytitle="''The Simpsons''", topic_parent="The Simpsons", sort="Simpsons"}, {source="Tolkien's legendarium", desc="the [[legendarium]] of [[w:J. R. R. Tolkien|J. R. R. Tolkien]]", topic_parent="J. R. R. Tolkien"}, } do local parents = {{name = "terms derived from fiction", sort = data.sort or data.source}} local umbrella_parents = {"Terms by etymology subcategories by language"} if data.topic_parent then insert(parents, {name = "{{{langcode}}}:" .. data.topic_parent, raw = true}) insert(umbrella_parents, {name = data.topic_parent, raw = true}) end labels["terms derived from " .. data.source] = { description = "{{{langname}}} terms that originate from " .. data.desc .. ".", breadcrumb = data.displaytitle or data.source, parents = parents, umbrella = { parents = umbrella_parents, displaytitle = data.displaytitle and "Terms derived from " .. data.displaytitle .. " by language" or nil, breadcrumb = data.displaytitle and "Terms derived from " .. data.displaytitle, }, displaytitle = data.displaytitle and "{{{langname}}} terms derived from " .. data.displaytitle or nil, } end labels["terms derived from Greek mythology"] = { description = "{{{langname}}} terms derived from Greek mythology which have acquired an idiomatic meaning.", breadcrumb = "Greek mythology", parents = {{name = "terms attributed to a specific source", sort = "Greek mythology"}}, } labels["terms derived from occupations"] = { description = "{{{langname}}} terms derived from names of occupations.", parents = {"terms by etymology"}, } labels["terms derived from other languages"] = { description = "{{{langname}}} terms that originate from other languages.", parents = {"terms by etymology"}, } labels["terms derived from the Bible"] = { description = "{{{langname}}} terms that originate from the [[Bible]].", breadcrumb = {name = "the Bible", nocap = true}, parents = {{name = "terms attributed to a specific source", sort = "Bible"}}, } labels["terms derived from Aesop's Fables"] = { description = "{{{langname}}} terms that originate from [[Aesop]]'s Fables.", breadcrumb = "Aesop's Fables", parents = {{name = "terms attributed to a specific source", sort = "Aesop's Fables"}}, } labels["terms derived from toponyms"] = { description = "{{{langname}}} terms derived from names of real or fictitious places.", parents = {"terms by etymology"}, } labels["terms derived through romanized wordplay"] = { description = "{{{langname}}} terms derived through romanized wordplay.", parents = {"terms by etymology"}, } labels["terms making reference to character shapes"] = { description = "{{{langname}}} terms making reference to character shapes.", parents = {"terms by etymology"}, } labels["terms derived from sports"] = { description = "{{{langname}}} terms that originate from sports.", breadcrumb = "sports", parents = {{name = "terms attributed to a specific source", sort = "sports"}}, } labels["terms derived from baseball"] = { description = "{{{langname}}} terms that originate from baseball.", breadcrumb = "baseball", parents = {{name = "terms derived from sports", sort = "baseball"}}, } labels["terms with Indo-Aryan extensions"] = { description = "{{{langname}}} terms extended with particular [[Indo-Aryan]] [[pleonastic]] affixes.", parents = {"terms by etymology"}, } labels["terms with lemma and non-lemma form etymologies"] = { description = "{{{langname}}} terms consisting of both a lemma and non-lemma form, of different origins.", breadcrumb = "lemma and non-lemma form", parents = {"terms with multiple etymologies"}, } labels["terms with multiple etymologies"] = { description = "{{{langname}}} terms that are derived from multiple origins.", parents = {"terms by etymology"}, } labels["terms with multiple lemma etymologies"] = { description = "{{{langname}}} lemmas that are derived from multiple origins.", breadcrumb = "multiple lemmas", parents = {"terms with multiple etymologies"}, } labels["terms with multiple non-lemma form etymologies"] = { description = "{{{langname}}} non-lemma forms that are derived from multiple origins.", breadcrumb = "multiple non-lemma forms", parents = {"terms with multiple etymologies"}, } labels["terms with unknown etymologies"] = { description = "{{{langname}}} terms whose etymologies have not yet been established.", parents = {{name = "terms by etymology", sort = "unknown etymology"}}, } labels["univerbations"] = { description = "{{{langname}}} terms that result from the agglutination of two or more words.", parents = {"terms by etymology"}, } labels["words derived through corruption"] = { description = "{{{langname}}} words that result from a non-specific or sporadic change.", parents = {{name = "terms by etymology", sort = "corruption"}}, } labels["words derived through metathesis"] = { description = "{{{langname}}} words that were created through [[metathesis]] from another word.", parents = {{name = "terms by etymology", sort = "metathesis"}}, } labels["words that have undergone semantic shift"] = { description = "{{{langname}}} words that show senses explained by [[semantic shift]].", parents = {{name = "terms by etymology", sort = "semantic shift"}}, } labels["words that have undergone semantic broadening"] = { description = "{{{langname}}} words that show senses explained by [[semantic]] [[broadening]].", parents = {{name = "words that have undergone semantic shift", sort = "semantic broadening"}}, } labels["words that have undergone semantic narrowing"] = { description = "{{{langname}}} words that show senses explained by [[semantic]] [[narrowing]].", parents = {{name = "words that have undergone semantic shift", sort = "semantic narrowing"}}, } labels["words that have undergone amelioration"] = { description = "{{{langname}}} words that have gained a positive [[connotation]] over time.", parents = {{name = "words that have undergone semantic shift", sort = "amelioration"}}, } labels["words that have undergone pejoration"] = { description = "{{{langname}}} words that have gained a negative [[connotation]] over time.", parents = {{name = "words that have undergone semantic shift", sort = "pejoration"}}, } labels["terms with origins in folklore"] = { description = "{{{langname}}} terms that have an etymology rooted in folklore.", breadcrumb = "Folklore", parents = {{name = "terms by etymology", sort = "folklore"}, {name = "{{{langcode}}}:Folklore", raw = true}}, umbrella_parents = {{name = "Terms by etymology subcategories by language", raw = true}, {name = "Folklore", raw = true, sort = " "}} } -- Add 'umbrella_parents' key if not already present. for _, data in pairs(labels) do -- NOTE: umbrella.parents overrides umbrella_parents if both are given. if not data.umbrella_parents then data.umbrella_parents = "Terms by etymology subcategories by language" end end ----------------------------------------------------------------------------- -- -- -- RAW CATEGORIES -- -- -- ----------------------------------------------------------------------------- raw_categories["Terms by etymology subcategories by language"] = { description = "Umbrella categories covering topics related to terms categorized by their etymologies, such as types of compounds or borrowings.", additional = "{{{umbrella_meta_msg}}}", parents = { "Umbrella metacategories", {name = "terms by etymology", is_label = true, sort = " "}, }, } raw_categories["Borrowed terms subcategories by language"] = { description = "Umbrella categories covering topics related to borrowed terms.", additional = "{{{umbrella_meta_msg}}}", parents = { "Umbrella metacategories", {name = "borrowed terms", is_label = true, sort = " "}, {name = "Terms by etymology subcategories by language", sort = " "}, }, } raw_categories["Inherited terms subcategories by language"] = { description = "Umbrella categories covering topics related to inherited terms.", additional = "{{{umbrella_meta_msg}}}", parents = { "Umbrella metacategories", {name = "inherited terms", is_label = true, sort = " "}, {name = "Terms by etymology subcategories by language", sort = " "}, }, } raw_categories["Indo-Aryan extensions"] = { description = "Umbrella categories covering terms extended with particular [[Indo-Aryan]] [[pleonastic]] affixes.", additional = "{{{umbrella_meta_msg}}}", parents = { "Umbrella metacategories", {name = "Terms by etymology subcategories by language", sort = " "}, }, } raw_categories["Multiple etymology subcategories by language"] = { description = "Umbrella categories covering topics related to terms with multiple etymologies.", additional = "{{{umbrella_meta_msg}}}", parents = { "Umbrella metacategories", {name = "Terms by etymology subcategories by language", sort = " "}, }, } raw_categories["Terms borrowed back into the same language"] = { description = "Categories with terms in specific languages that were borrowed from a second language that previously borrowed the term from the first language.", additional = "A well-known example is {{m+|en|salaryman}}, a term borrowed from Japanese which in turn was borrowed from the English words [[salary]] and [[man]].\n\n{{{umbrella_msg}}}", parents = "Terms by etymology subcategories by language", } ----------------------------------------------------------------------------- -- -- -- HANDLERS -- -- -- ----------------------------------------------------------------------------- local function get_source(source_name, allow_family, name_type) local source = get_lang_by_name(source_name, nil, true, allow_family) if source == nil then return nil end -- Check that the source name matches the expected form (e.g. getCanonicalName, getDisplayForm etc). if source[name_type](source) == source_name then return source end end local function get_source_and_type_desc(source, term_type) if source:getCode() == "ine-pro" and term_type:find("^roots?$") then return "[[w:Proto-Indo-European root|Proto-Indo-European " .. term_type .. "]]" end return "[[w:" .. source:getWikipediaArticle() .. "|" .. source:getCanonicalName() .. "]] " .. term_type end local function get_source_and_source_desc(source_name) -- HACK! Map 'taxonomic names', as generated by [[Module:etymology]], back to its canonical name -- before calling getByCanonicalName(). We need a more general solution here. local source_desc if source_name == "taxonomic names" then source_name = "taxonomic name" source_desc = "[[w:taxonomic nomenclature|taxonomic names]]" end local source = get_source(source_name, true, "getDisplayForm") if source == nil then return end source_desc = source_desc or source:makeCategoryLink() if source:hasType("family") then source_desc = "one of the " .. source_desc end return source, source_desc end ----------------------------------------------------------------------------- ------------------------------- word handlers ------------------------------- ----------------------------------------------------------------------------- -- Handlers for 'terms derived from the SOURCE word word' must go *BEFORE* the -- more general 'terms derived from SOURCE' handler. -- Root data from [[Module:roots]], which owns the separator, link target and -- romanization for each language. Required on demand so that category pages -- unrelated to roots do not load it. local function get_root_data(lang) return lang and require("Module:roots").get_data(lang:getCode()) or nil end -- Languages such as Hebrew have no automatic transliteration, but their root data -- defines one; this keeps the category description matching the root entry. local function root_translit(rdata, root) if not (rdata and rdata.romanization) then return nil end return require("Module:roots").transliterate(root, rdata.romanization) end -- Raises on a root that is not well-formed for its language. A language without root -- data declares no radical structure, so nothing is checked. local function assert_valid_root(lang, root) return require("Module:roots").assert_root(lang, root) end -- Whether a language's roots live at `Appendix:<language> roots/<root>`. The root data -- is the only authority: a language that does not declare `appendix_subpage` links to -- the root in mainspace. local function lang_uses_appendix_roots(lang) local rdata = get_root_data(lang) return rdata ~= nil and rdata.link_target == "appendix_subpage" end insert(handlers, function(data) local labelpref, word_and_id = data.label:match("^(terms belonging to the word )(.+)$") if not word_and_id then return end local word, id = word_and_id:match("^(.+) %((.-)%)$") if not word then word = word_and_id end local is_semitic = data.lang:inFamily("sem") local word_desc = is_semitic and "[[w:Semitic word|word]]" or "word" local parents = {} if id then insert(parents, {name = labelpref .. word, sort = id}) end insert(parents, {name = "terms by word", sort = word_and_id}) local separators = "־ %-" local separator_c = "[" .. separators .. "]" local not_separator_c = "[^" .. separators .. "]" -- remove any leading or trailing separators (e.g. in PIE-style words) local word_no_prefix_suffix = mw.ustring.gsub(mw.ustring.gsub(word, separator_c .. "$", ""), "^" .. separator_c, "") local num_sep = mw.ustring.len(mw.ustring.gsub(word_no_prefix_suffix, not_separator_c, "")) local linked_word = data.lang and full_link({ term = word, lang = data.lang, gloss = id, id = id }, "term") or word if num_sep > 0 then insert(parents, {name = "" .. (num_sep + 1) .. "-letter words", sort = word_and_id}) end -- Italicize the word/word in the title. local function displaytitle(title, lang) return plain_gsub(title, word, tag_text(word, lang, nil, "term")) end local breadcrumb = tag_text(word, data.lang, nil, "term") .. (id and " (" .. id .. ")" or "") return { description = "{{{langname}}} terms that belong to the " .. word_desc .. " " .. linked_word .. ".", displaytitle = displaytitle, breadcrumb = breadcrumb, parents = parents, umbrella = false, } end) insert(handlers, function(data) local source_name = data.label:match("^terms by (.+) word$") if not source_name then return end local source = get_source(source_name, false, "getCanonicalName") if not source then return end local parents = {"terms by etymology"} -- In [[:Category:Proto-Indo-Iranian terms by Proto-Indo-Iranian word]], -- don't add parent [[:Category:Proto-Indo-Iranian terms derived from Proto-Indo-Iranian]]. if not data.lang or data.lang:getCode() ~= source:getCode() then insert(parents, "terms derived from " .. source:getDisplayForm()) end return { description = "{{{langname}}} terms categorized by the " .. get_source_and_type_desc(source, "word") .. " they originate from.", parents = parents, umbrella_parents = "Terms by etymology subcategories by language", } end) ----------------------------------------------------------------------------- ------------------------------- Root handlers ------------------------------- ----------------------------------------------------------------------------- -- Handlers for 'terms derived from the SOURCE root ROOT' must go *BEFORE* the -- more general 'terms derived from SOURCE' handler. -- Handler for e.g. [[:Category:Yola terms derived from the Proto-Indo-European root *h₂el- (grow)]] and -- [[:Category:Russian terms derived from the Proto-Indo-European word *swé]], and corresponding umbrella -- categories [[:Category:Terms derived from the Proto-Indo-European root *h₂el- (grow)]] and -- [[:Category:Terms derived from the Proto-Indo-European word *swé]]. Replaces the former -- [[Module:category tree/PIE root cat]], [[Module:category tree/root cat]] and [[Template:PIE word cat]]. insert(handlers, function(data) local source_name, term_type, term_and_id for _, tt in ipairs{"root", "word", "term"} do source_name, term_and_id = data.label:match("^terms derived from the (.+) " .. tt .. " (.+)$") if source_name then term_type = tt break end end if not source_name then return end local term, id = term_and_id:match("^(.+) %((.-)%)$") if not term then term = term_and_id end local source = get_source(source_name, false, "getCanonicalName") if not source then return end local parents = { { name = "terms by " .. source_name .. " " .. term_type, sort = (source:makeSortKey(term)), } } local umbrella_parents = { { name = "Terms derived from " .. source_name .. " " .. term_type .. "s", sort = (source:makeSortKey(term)), } } if id then insert(parents, { name = "terms derived from the " .. source_name .. " " .. term_type .. " " .. term, sort = " " }) insert(umbrella_parents, { name = "terms derived from the " .. source_name .. " " .. term_type .. " " .. term, is_label = true, sort = " " }) end -- Italicize the word/word in the title. local function displaytitle(title, lang) return plain_gsub(title, term, tag_text(term, source, nil, "term")) end local breadcrumb = tag_text(term, source, nil, "term") .. (id and " (" .. id .. ")" or "") local term_page, alt_form, term_tr if term_type == "root" then assert_valid_root(source, term) local rdata = get_root_data(source) term_tr = root_translit(rdata, term) if lang_uses_appendix_roots(source) then term_page = ("Appendix:%s roots/%s"):format(source:getCanonicalName(), term) alt_form = term end end term_page = term_page or term return { description = "{{{langname}}} terms that originate ultimately from the " .. get_source_and_type_desc(source, term_type) .. " " .. full_link({ term = term_page, alt = alt_form, tr = term_tr, lang = source, gloss = id, id = id }, "term") .. ".", displaytitle = displaytitle, breadcrumb = breadcrumb, parents = parents, umbrella = { no_by_language = true, displaytitle = displaytitle, breadcrumb = breadcrumb, parents = umbrella_parents, } } end) insert(handlers, function(data) local labelpref, root_and_id = data.label:match("^(terms belonging to the root )(.+)$") if not root_and_id then return end local root, id = root_and_id:match("^(.+) %((.-)%)$") if not root then root = root_and_id end local is_semitic = data.lang:inFamily("sem") local root_desc = is_semitic and "[[w:Semitic root|root]]" or "root" local parents = {} if id then insert(parents, {name = labelpref .. root, sort = id}) end insert(parents, {name = "terms by root", sort = root_and_id}) if data.lang then assert_valid_root(data.lang, root) end local rdata = get_root_data(data.lang) local separators = rdata and rdata.separator and pattern_escape(rdata.separator) or "־ %-" local separator_c = "[" .. separators .. "]" local not_separator_c = "[^" .. separators .. "]" -- remove any leading or trailing separators (e.g. in PIE-style roots) local root_no_prefix_suffix = mw.ustring.gsub(mw.ustring.gsub(root, separator_c .. "$", ""), "^" .. separator_c, "") local num_sep = mw.ustring.len(mw.ustring.gsub(root_no_prefix_suffix, not_separator_c, "")) local root_page, alt_form if lang_uses_appendix_roots(data.lang) then root_page = ("Appendix:%s roots/%s"):format(data.lang:getCanonicalName(), root) alt_form = root else root_page = root end local linked_root = data.lang and full_link( { term = root_page, alt = alt_form, tr = root_translit(rdata, root), lang = data.lang, gloss = id, id = id, }, "term") or root_page if num_sep > 0 then insert(parents, {name = "" .. (num_sep + 1) .. "-letter roots", sort = root_and_id}) end -- Italicize the root/word in the title. local function displaytitle(title, lang) return plain_gsub(title, root, tag_text(root, lang, nil, "term")) end local breadcrumb = tag_text(root, data.lang, nil, "term") .. (id and " (" .. id .. ")" or "") return { description = "{{{langname}}} terms that belong to the " .. root_desc .. " " .. linked_root .. ".", displaytitle = displaytitle, breadcrumb = breadcrumb, parents = parents, umbrella = false, } end) insert(handlers, function(data) local source_name = data.label:match("^terms by (.+) root$") if not source_name then return end local source = get_source(source_name, false, "getCanonicalName") if not source then return end local parents = {"terms by etymology"} -- In [[:Category:Proto-Indo-Iranian terms by Proto-Indo-Iranian root]], -- don't add parent [[:Category:Proto-Indo-Iranian terms derived from Proto-Indo-Iranian]]. if not data.lang or data.lang:getCode() ~= source:getCode() then insert(parents, "terms derived from " .. source_name) end return { description = "{{{langname}}} terms categorized by the " .. get_source_and_type_desc(source, "root") .. " they originate from.", parents = parents, umbrella_parents = "Terms by etymology subcategories by language", } end) insert(handlers, function(data) local root_shape, post, additional = data.label:match("^(.+)([ -])shaped roots$") if not root_shape then return elseif data.lang and data.lang:getCode() == "ine-pro" then additional = [=[ * '''e''' stands for the vowel of the root. * '''C''' stands for any stop or ''s''. * '''R''' stands for any resonant. * '''H''' stands for any laryngeal. * '''M''' stands for ''m'' or ''w'', when followed by a resonant. * '''s''' stands for ''s'', when next to a stop.]=] end if root_shape == "irregularly" and post == " " then return { breadcrumb = "irregular", description = "{{{langname}}} roots with a shape that violates the {{w|Proto-Indo-European root#Shape of a root|known rules on root shapes}}.", additional = additional, parents = {{name = "roots by shape", sort = "*"}}, umbrella = false, } elseif post == " " then return end return { breadcrumb = root_shape, description = "{{{langname}}} roots with the shape ''" .. root_shape .. "''.", additional = additional, parents = {{name = "roots by shape", sort = root_shape}}, umbrella = false, } end) ----------------------------------------------------------------------------- -------------------- Derived/inherited/borrowed handlers -------------------- ----------------------------------------------------------------------------- -- Handler for categories of the form "LANG terms derived from SOURCE", where SOURCE is a language, etymology language -- or family (e.g. "Indo-European languages"), along with corresponding umbrella categories of the form -- "Terms derived from SOURCE". insert(handlers, function(data) local source_name = data.label:match("^terms derived from (.+)$") if not source_name then return end local source, source_desc = get_source_and_source_desc(source_name) if not source then return end -- Compute description. local desc = "{{{langname}}} terms that originate from " .. source_desc .. "." local additional if source:hasType("family") then additional = "This category should, ideally, contain only other categories. Entries can be categorized here, too, when the proper subcategory is unclear. " .. "If you know the exact language from which an entry categorized here is derived, please edit its respective entry." end -- Compute parents. local derived_from_variety_of_self = false local parent local sortkey = source:getDisplayForm() if source:hasType("etymology-only") then -- By default, `parent` is the source's parent. parent = source:getParent() -- Check if the source is a variety (or subvariety) of the language. if data.lang and source:hasParent(data.lang) then derived_from_variety_of_self = true end -- If the language is the direct parent of the source or the parent is "und", then we use the family of the source as `parent` instead. if data.lang and (parent:getCode() == data.lang:getCode() or parent:getCode() == "und") then parent = source:getFamily() end -- Regular language or family. else local fam = source:getFamily() if fam then parent = fam end end -- If `parent` does not exist, is the same as `source`, or would be "isolate languages" or "not a family", then we discard it. if (not parent) or parent:getCode() == source:getCode() or parent:getCode() == "qfa-iso" or parent:getCode() == "qfa-not" or parent:getCode() == "qfa-unc" then parent = nil derived_from_variety_of_self = false -- Otherwise, get the display form. else parent = parent:getDisplayForm() end parent = parent and "terms derived from " .. parent or "terms derived from other languages" local parents = {{name = parent, sort = sortkey}} if derived_from_variety_of_self then insert(parents, "Category:Categories for terms in a language derived from a term in a subvariety of that language") end -- Compute umbrella parents. local cat_name = source:getCode() == "mul-tax" and "Taxonomic names" or source:getCategoryName() -- If the source is etymology-only, its category will be handled by the lect handler in -- [[Module:category tree/lects]]. If it has a nonstandard name like 'Kölsch' (i.e. not a name like -- 'American English' that has a language name in it), the lect handler won't handle it unless we tell it to do so -- through the following call; this is an optimization to avoid expensive processing work on all manner of randomly -- named categories. if source:hasType("etymology-only") then require("Module:category tree/lects").export.register_likely_lect_parent_cat(cat_name) end local umbrella_parents = { (source:hasType("family") or source:getCode() == "mul-tax") and {name = cat_name, raw = true, sort = " "} or {name = cat_name, raw = true, sort = "terms derived from"} } -- Without the following, the breadcrumb trail for e.g. [[Category:Javanese terms derived from French]] looks like -- Fundamental » All languages » Javanese » Terms by etymology » Terms derived from other languages » -- Indo-European languages » Italic languages » Romance languages » Italo-Western Romance languages » -- Western Romance languages » Gallo-Romance languages » Gallo-Rhaetian languages » Oïl languages » French -- To reduce the length, we truncate the "languages" part of the breadcrumbs as long as this does not create -- ambiguity (i.e. unless there is a language with the same name as the family). Hence, for the Category -- [[Category:Javanese terms derived from Arabic]], we end up with -- Fundamental » All languages » Javanese » Terms by etymology » Terms derived from other languages » Afroasiatic » -- Semitic » West Semitic » Central Semitic » Arabic languages » Arabic -- because "Arabic" is ambiguous between family and language (and script, for that matter). local breadcrumb = source_name if source:hasType("family") and breadcrumb:find(" languages$") then local truncated_breadcrumb = breadcrumb:gsub(" languages$", "") if not get_lang_by_name(truncated_breadcrumb, nil, "allow etym") then breadcrumb = truncated_breadcrumb end end return { description = desc, additional = additional, breadcrumb = breadcrumb, parents = parents, umbrella = { description = "Categories with terms that originate from " .. source_desc .. ".", parents = umbrella_parents, }, } end) -- Handler for categories of the form "LANG terms inherited/borrowed from SOURCE", where SOURCE is a language, -- etymology language or family (e.g. "Indo-European languages"). Also handles umbrella categories of the form -- "Terms inherited/borrowed from SOURCE". local function inherited_borrowed_handler(etymtype) return function(data) local source_name = data.label:match("^terms " .. etymtype .. " from (.+)$") if not source_name then return end local source, source_desc = get_source_and_source_desc(source_name) if not source then return end return { description = "{{{langname}}} terms " .. etymtype .. " from " .. source_desc .. ".", breadcrumb = source_name, parents = { {name = etymtype .. " terms", sort = source_name}, {name = "terms derived from " .. source_name, sort = " "}, }, umbrella = { parents = { { name = "terms derived from " .. source_name, is_label = true, sort = " " }, etymtype == "inherited" and { name = "Inherited terms subcategories by language", sort = source_name } -- There are several types of borrowings mixed into the following holding category, -- so keep these ones sorted under 'Terms borrowed from SOURCE_NAME' instead of just -- 'SOURCE_NAME'. or "Borrowed terms subcategories by language", } }, } end end insert(handlers, inherited_borrowed_handler("borrowed")) insert(handlers, inherited_borrowed_handler("inherited")) ----------------------------------------------------------------------------- ------------------------ Borrowing subtype handlers ------------------------- ----------------------------------------------------------------------------- -- General handler for specific borrowing subtypes, such as learned borrowings, calques and phono-semantic matchings. local function borrowing_subtype_handler(dest, source_name, parent_cat, spec) local source, source_desc = get_source_and_source_desc(source_name) if not source then return end -- normally uses of UNKNOWN should not show up to the end user local dest_name = dest and dest:getCanonicalName() or "UNKNOWN" local additional, umbrella_additional if spec.additional then if dest then additional = spec.additional(source, dest) else umbrella_additional = spec.umbrella_additional(source) end else if not spec.categorizing_templates then error("Internal error: Must specify either `categorizing_templates` or the combination of `additional` and `umbrella_additional` in each borrowing subtype spec") end local extra_templates = {} local extra_template_text for i, template in ipairs(spec.categorizing_templates) do if i > 1 then insert(extra_templates, ("{{tl|%s|...}}"):format(template)) end end if #extra_templates > 0 then extra_template_text = (" (or %s, using the same syntax)"):format( serial_comma_join(extra_templates, {conj = "or"})) else extra_template_text = "" end if dest then additional = ("To categorize a term into this category, use {{tl|%s|%s|%s|<var>source_term</var>}}%s, " .. "where <code><var>source_term</var></code> is the %s term that the term in question " .. "was borrowed from."):format( spec.categorizing_templates[1], dest:getCode(), source:getCode(), extra_template_text, source_name) else umbrella_additional = ("To categorize a term into a language-specific subcategory, use " .. "{{tl|%s|<var>destcode</var>|%s|<var>source_term</var>}}%s, where <code><var>destcode</var></code> " .. "is the language code of the language in question (see [[Wiktionary:List of languages]]), and " .. "<code><var>source_term</var></code> is the %s term that the term in question was " .. "borrowed from."):format(spec.categorizing_templates[1], source:getCode(), extra_template_text, source_name) end end return { description = "{{{langname}}} " .. spec.from_source_desc:gsub("SOURCE", source_desc):gsub("DEST", dest_name), additional = additional, breadcrumb = source_name, parents = { { name = parent_cat, sort = source_name }, { name = "terms borrowed from " .. source_name, sort = " " }, }, umbrella = { additional = umbrella_additional, parents = { { name = "terms borrowed from " .. source_name, is_label = true, sort = " " }, "Borrowed terms subcategories by language", } }, } end -- Specs describing types of borrowings. -- `from_source_desc` is the English description used in categories of the form "LANGUAGE BORTYPE from SOURCE", -- e.g. "Arabic semantic loans from English". "SOURCE" in the description is replaced by the source language. -- `umbrella_desc` is the English description used in categories of the form "LANGUAGE BORTYPE", e.g. -- "Arabic semantic loans". This is an umbrella category grouping all the source-language-specific categories. -- `uses_subtype_handler`, if true, means that the handler for "LANGUAGE BORTYPE from SOURCE" categories is -- implemented by a generic "TYPE borrowings" handler (at the bottom of this section), so we don't need to -- create a BORTYPE-specific handler. -- `umbrella_parent`, if given, is the parent category of the umbrella categories of the form "LANGUAGE BORTYPE". -- By default it is "borrowed terms". Some borrowing types replace this with "terms by etymology". (FIXME: -- Review whether this is correct.) -- `label_pattern`, if given, is a Lua pattern that matches the category name minus the language at the beginning. -- It should have one capture, which is the source language. An example is "^terms partially calqued from (.+)$". -- If omitted, it is generated from BORTYPE. -- `categorizing_templates`, if given, is the list of templates that categorize into this category. They are assumed to -- follow the syntax of {{bor}}. The first template in the list should be the preferred alias. The specified -- templates are used to form the `additional` text displayed on the language-specific category page and -- corresponding umbrella category page describing how to categorize into the category in question. In more complex -- cases, you can omit this field and instead supply the `additional` and `umbrella_additional` fields (as is done -- with adapted borrowings). You must either specify `categorizing_templates` or the combination of `additional` and -- `umbrella_additional`. -- `additional`, if given, is a function of two arguments (source and destination language objects) that will generate -- the `additional` text displayed on the language-specific category page that describes how to categorize into the -- category in question. This is an alternative to specifying `categorizing_templates`, used in more complex cases -- (currently, with adapted borrowings). -- `umbrella_additional`, if given, is a function of one argument (source language object) that will generate the -- `additional` text displayed on the umbrella category page that describes how to categorize into the category in -- question. This is an alternative to specifying `categorizing_templates`, used in more complex cases (currently, -- with adapted borrowings). local borrowing_specs = { ["learned borrowings"] = { from_source_desc = "terms that are learned [[loanword]]s from SOURCE, that is, terms that were directly incorporated from SOURCE instead of through normal language contact.", umbrella_desc = "terms that are learned [[loanword]]s, that is, terms that were directly incorporated from another language instead of through normal language contact.", uses_subtype_handler = true, categorizing_templates = {"lbor", "learned borrowing"}, }, ["semi-learned borrowings"] = { from_source_desc = "terms that are [[semi-learned borrowing|semi-learned]] [[loanword]]s from SOURCE, that is, terms borrowed from SOURCE (a [[classical language]]) into DEST (a modern language) and partly reshaped based on later [[sound change]]s or by analogy with [[inherit]]ed terms in the language.", umbrella_desc = "terms that are [[semi-learned borrowing|semi-learned]] [[loanword]]s, that is, terms borrowed from a [[classical language]] into a modern language and partly reshaped based on later [[sound change]]s or by analogy with [[inherit]]ed terms in the language.", uses_subtype_handler = true, categorizing_templates = {"slbor", "semi-learned borrowing"}, }, ["orthographic borrowings"] = { from_source_desc = "orthographic loans from SOURCE, i.e. terms that were borrowed from SOURCE in their script forms, not their pronunciations.", umbrella_desc = "orthographic loans, i.e. terms that were borrowed in their script forms, not their pronunciations.", uses_subtype_handler = true, categorizing_templates = {"obor", "orthographic borrowing"}, }, ["unadapted borrowings"] = { from_source_desc = "[[loanword]]s from SOURCE that have not been conformed to the morpho-syntactic, phonological and/or phonotactical rules of DEST.", umbrella_desc = "[[loanword]]s that have not been conformed to the morpho-syntactic, phonological and/or phonotactical rules of the target language.", uses_subtype_handler = true, categorizing_templates = {"ubor", "unadapted borrowing"}, }, ["adapted borrowings"] = { from_source_desc = "[[loanwords]] from SOURCE formed with the addition of an affix to conform the term to the normal morphology of DEST.", umbrella_desc = "[[loanword]]s formed with the addition of an affix to conform the term to the normal morphology of the target language.", uses_subtype_handler = true, additional = function(source, dest) return ("To categorize a term into this category, use {{tl|af|%s|3=type=adap|4=%s:<var>source_term</var>|5=-<var>affix</var>}} " .. "(or {{tl|af|%s|3=type=abor|4=...}}, using the same syntax), where <code><var>source_term</var></code> is " .. "the %s term that the term in question was borrowed from and <code><var>affix</var></code> " .. "is the %s affix used to adapt the %s term. An example is " .. "{{m+|pl|adresować||to address}}, which would use {{tl|af|pl|3=type=adap|4=fr:adresser|5=-ować}} to indicate " .. "that is was formed from {{m+|fr|adresser}} with the addition of the Polish verb-forming affix " .. "{{m|pl|-ować}}."):format(dest:getCode(), source:getCode(), dest:getCode(), source:getCanonicalName(), dest:getCanonicalName(), source:getCanonicalName()) end, umbrella_additional = function(source) return ("To categorize a term into a language-specific subcategory, use {{tl|af|<var>destcode</var>|3=type=adap|4=%s:<var>source_term</var>|5=-<var>affix</var>}} " .. "(or {{tl|af|<var>destcode</var>|3=type=abor|4=...}}, using the same syntax), where " .. "<code><var>destcode</var></code> is the language code of the target language in question (see " .. "[[Wiktionary:List of languages]]); <code><var>source_term</var></code> is the %s term " .. "that the term in question was borrowed from; and <code><var>affix</var></code> is the target-language " .. "affix used to adapt the %s term. An example is {{m+|pl|adresować||to address}}, which " .. "would use {{tl|af|pl|3=type=adap|4=fr:adresser|5=-ować}} to indicate that is was formed from " .. "{{m+|fr|adresser}} with the addition of the Polish verb-forming affix {{m|pl|-ować}}."):format( source:getCode(), source:getCanonicalName(), source:getCanonicalName()) end, }, ["semantic loans"] = { from_source_desc = "[[Appendix:Glossary#semantic loan|semantic loans]] from SOURCE, i.e. terms one or more of whose definitions was borrowed from a term in SOURCE.", umbrella_desc = "[[Appendix:Glossary#semantic loan|semantic loans]], i.e. terms one or more of whose definitions was borrowed from a term in another language.", umbrella_parent = "terms by etymology", categorizing_templates = {"sl", "semantic loan"}, }, ["partial calques"] = { from_source_desc = "terms that were [[Appendix:Glossary#partial calque|partially calqued]] from SOURCE, i.e. terms formed partly by piece-by-piece translations of SOURCE terms and partly by direct borrowing.", umbrella_desc = "[[Appendix:Glossary#partial calque|partial calques]], i.e. terms formed partly by piece-by-piece translations of terms from other languages and partly by direct borrowing.", umbrella_parent = "terms by etymology", label_pattern = "^terms partially calqued from (.+)$", categorizing_templates = {"pcal", "pclq", "partial calque"}, }, ["calques"] = { from_source_desc = "terms that were [[Appendix:Glossary#calque|calqued]] from SOURCE, i.e. terms formed by piece-by-piece translations of SOURCE terms.", umbrella_desc = "[[Appendix:Glossary#calque|calques]], i.e. terms formed by piece-by-piece translations of terms from other languages.", umbrella_parent = "terms by etymology", label_pattern = "^terms calqued from (.+)$", categorizing_templates = {"cal", "clq", "calque"}, }, ["phono-semantic matchings"] = { from_source_desc = "[[Appendix:Glossary#phono-semantic matching|phono-semantic matchings]] from SOURCE, i.e. terms that were borrowed by matching the etymon phonetically and semantically.", umbrella_desc = "[[Appendix:Glossary#phono-semantic matching|phono-semantic matchings]], i.e. terms that were borrowed by matching the etymon phonetically and semantically.", categorizing_templates = {"psm", "phono-semantic matching"}, }, ["pseudo-loans"] = { from_source_desc = "[[Appendix:Glossary#pseudo-loan|pseudo-loans]] from SOURCE, i.e. terms that appear to be SOURCE, but are not used or have an unrelated meaning in SOURCE itself.", umbrella_desc = "[[Appendix:Glossary#pseudo-loan|pseudo-loans]], i.e. terms that appear to be derived from another language, but are not used or have an unrelated meaning in that language itself.", categorizing_templates = {"pl", "pseudo-loan"}, }, } for bortype, spec in pairs(borrowing_specs) do labels[bortype] = { description = "{{{langname}}} " .. spec.umbrella_desc, parents = {spec.umbrella_parent or "borrowed terms"}, umbrella_parents = "Terms by etymology subcategories by language", } if not spec.uses_subtype_handler then -- If the label pattern isn't specifically given, generate it from the `bortype`; but make sure to -- escape hyphens in the pattern. local label_pattern = spec.label_pattern or "^" .. pattern_escape(bortype) .. " from (.+)$" insert(handlers, function(data) local source_name = data.label:match(label_pattern) if source_name then return borrowing_subtype_handler(data.lang, source_name, bortype, spec) end end) end end insert(handlers, function(data) local borrowing_type, source_name = data.label:match("^(.+ borrowings) from (.+)$") if borrowing_type then local spec = borrowing_specs[borrowing_type] return borrowing_subtype_handler(data.lang, source_name, borrowing_type, spec) end end) ----------------------------------------------------------------------------- ---------------------- Indo-Aryan extension handlers ------------------------ ----------------------------------------------------------------------------- -- FIXME: Put this in a family-specific module. insert(handlers, function(data) local labelpref, extension = data.label:match("^(terms extended with Indo%-Aryan )(.+)$") if not extension then return end local lang_inc_ash = require("Module:languages").getByCode("inc-ash") local linked_term = full_link({lang = lang_inc_ash, term = extension}, "term") local tagged_term = tag_text(extension, lang_inc_ash, nil, "term") return { description = "{{{langname}}} terms extended with the [[Indo-Aryan]] [[pleonastic]] affix " .. linked_term .. ".", displaytitle = "{{{langname}}} " .. labelpref .. tagged_term, breadcrumb = tagged_term, parents = {{name = "terms with Indo-Aryan extensions", sort = extension}}, umbrella = { no_by_language = true, parents = "Indo-Aryan extensions", displaytitle = "Terms extended with Indo-Aryan " .. tagged_term, } } end) ----------------------------------------------------------------------------- ---------------------------- Coined-by handlers ----------------------------- ----------------------------------------------------------------------------- insert(handlers, function(data) local coiner = data.label:match("^terms coined by (.+)$") if not coiner then return end -- Sort by last name per request from [[User:Metaknowledge]] local last_name = umatch(coiner, ".-%s(%S+)$") return { description = "{{{langname}}} terms coined by " .. coiner .. ".", breadcrumb = coiner, parents = {{ name = "coinages", sort = last_name and last_name .. ", " .. coiner or coiner, }}, umbrella = false, } end) ----------------------------------------------------------------------------- ------------------------ Multiple etymology handlers ------------------------ ----------------------------------------------------------------------------- insert(handlers, function(data) local pos = data.label:match("^terms with multiple (.+) etymologies$") if not pos then return end local plpos = pluralize_pos(pos) local postype = pos_lemma_or_nonlemma(plpos) if not postype then return end return { description = "{{{langname}}} " .. plpos .. " that are derived from multiple origins.", umbrella_parents = "Multiple etymology subcategories by language", breadcrumb = "multiple " .. plpos, parents = {{ name = "terms with multiple " .. postype .. " etymologies", sort = pos, }}, } end) insert(handlers, function(data) local pos1, pos2 = data.label:match("^terms with (.+) and (.+) etymologies$") if not pos1 then return end local pos1type = pos_lemma_or_nonlemma(pluralize_pos(pos1)) local pos2type = pos_lemma_or_nonlemma(pluralize_pos(pos2)) if not (pos1type and pos2type) then return end return { description = "{{{langname}}} terms consisting of " .. add_indefinite_article(pos1) .." of one origin and " .. add_indefinite_article(pos2) .. " of a different origin.", umbrella_parents = "Multiple etymology subcategories by language", breadcrumb = pos1 .. " and " .. pos2, parents = {{ name = pos1type == pos2type and "terms with multiple " .. pos1type .. " etymologies" or "terms with lemma and non-lemma form etymologies", sort = pos1 .. " and " .. pos2, }}, } end) ----------------------------------------------------------------------------- --------------------------- Borrowed-back handlers -------------------------- ----------------------------------------------------------------------------- -- Handler for categories of the form e.g. [[:Category:English terms borrowed back into English]]. We need to use a handler -- because the category's language occurs inside the label itself. For the same reason, the umbrella category has a -- nonstandard name "Terms borrowed back into the same language", so we handle it as a regular parent and disable the -- built-in umbrella mechanism. insert(handlers, function(data) local lang = data.lang if not lang then return end local source_name = data.label:match("^terms borrowed back into (.+)$") if not (source_name and source_name == lang:getDisplayForm()) then return end return { description = "{{{langname}}} terms that were borrowed from another language that originally borrowed the term from " .. source_name .. ".", parents = {"terms by etymology", "borrowed terms", { name = "Terms borrowed back into the same language", raw = true, sort = "{{{langname}}}" }}, umbrella = false, -- Umbrella has a nonstandard name so we treat it as a raw category } end) ----------------------------------------------------------------------------- -- -- -- RAW HANDLERS -- -- -- ----------------------------------------------------------------------------- -- Handler for umbrella metacategories of the form e.g. [[:Category:Terms derived from Proto-Indo-Iranian roots]] -- and [[:Category:Terms derived from Proto-Indo-European words]]. Replaces the former -- [[Module:category tree/PIE root cat]], [[Module:category tree/root cat]] and [[Template:PIE word cat]]. insert(raw_handlers, function(data) local source_name, terms_type for _, tt in ipairs{"roots", "words", "terms"} do source_name = data.category:match("^Terms derived from (.+) " .. tt .. "$") if source_name then terms_type = tt break end end if not source_name then return end local source = get_source(source_name, false, "getCanonicalName") if not source then return end return { description = "Umbrella categories covering terms derived from particular " .. get_source_and_type_desc(source, terms_type) .. ".", additional = "{{{umbrella_meta_msg}}}", parents = { "Umbrella metacategories", { name = terms_type == "roots" and "roots" or "lemmas", is_label = true, lang = source:getCode(), sort = " " }, { name = "terms derived from " .. source_name, is_label = true, sort = " " .. terms_type }, }, } end) return {LABELS = labels, RAW_CATEGORIES = raw_categories, HANDLERS = handlers, RAW_HANDLERS = raw_handlers} ovuk2ym75trp1uty87zwvqzjehpta9e मॉड्यूल:category tree/etymology 828 306960 487811 2026-09-02T19:13:37Z SM7 6218 SM7 ने पृष्ठ [[मॉड्यूल:category tree/etymology]] को [[मॉड्यूल:category tree/व्युत्पत्ति]] पर स्थानांतरित किया 487811 Scribunto text/plain return require [[मॉड्यूल:category tree/व्युत्पत्ति]] 06b4mrqdlmnssmtldmolsfs84wbhrxo मॉड्यूल:category tree/families 828 306961 487813 2026-09-02T19:15:06Z SM7 6218 SM7 ने पृष्ठ [[मॉड्यूल:category tree/families]] को [[मॉड्यूल:category tree/परिवार]] पर स्थानांतरित किया 487813 Scribunto text/plain return require [[मॉड्यूल:category tree/परिवार]] n2mfug66h11588kmv7abh4mplggry84 मॉड्यूल:category tree/भाषाएँ 828 306962 487815 2026-09-02T19:20:50Z SM7 6218 अंग्रेजी विक्षनरी से आयातित+ अल्पस्थानीयकृत 487815 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["सभी भाषाएँ"] = { 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 = { "मूलभूत श्रेणी", }, } raw_categories["All extinct languages"] = { description = "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 = { "सभी भाषाएँ", }, } raw_categories["Unwritten languages"] = { description = "Categories for every [[unwritten]] [[language]] on Wiktionary.", additional = "Do not confuse this category with [[:Category:Unspecified script languages]], which contains categories for languages that may be written but where the appropriate script has not yet been specified in the language data.", parents = { "सभी भाषाएँ", }, } raw_categories["Languages by country"] = { topright = "{{commonscat|Languages by continent}}", description = "Categories that group languages by country.", additional = "{{{umbrella_meta_msg}}}", parents = { "All languages", }, } 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 for template in require("Module:template parser").find_templates(contents) do -- The template parser automatically handles redirects and -- canonicalizes them. 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 bare_location_parts = split(bare_location, ", ") for i, part in ipairs(bare_location_parts) do bare_location_parts[i] = ("[[%s]]"):format(part) end local 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(true) setwiki = not wikipediaArticle and "-" 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 -- Avoid showing Wiktionary links section for reconstructed languages, -- as they are ineligible for Wiktionary editions local wiktionarylinks_chunk = concat{ [=[|- | style="vertical-align: top; height: 35px; width: 40px; border-bottom: 1px solid var(--wikt-palette-grey-4, lightgray);" | [[File:Wiktionary-logo-v2.svg|35px|none|Wiktionary]] |style="border-bottom: 1px solid var(--wikt-palette-grey-4, lightgray);" | '''Wiktionary edition''']=], wikt_plural, [=[ written in ]=], canonicalName, [=[: <div style="padding: 5px 10px">]=], wiktionarylinks, [=[</div> ]=]} if lang:hasType('reconstructed') then wiktionarylinks_chunk = '' 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{ -- FIXME: Bare wikicode [=[<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 var(--wikt-palette-grey-4, lightgray);" | [[File:Wikipedia-logo.png|35px|none|Wikipedia]] | style="border-bottom: 1px solid var(--wikt-palette-grey-4, 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 var(--wikt-palette-grey-4, lightgray);" | [[File:Commons-logo.svg|35px|none|Wikimedia Commons]] | style="border-bottom: 1px solid var(--wikt-palette-grey-4, 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> ]=], wiktionarylinks_chunk, [=[ |- | style="vertical-align: top; height: 35px; border-bottom: 1px solid var(--wikt-palette-grey-4, lightgray);" | [[File:Codex icon articles color-placeholder (v2.6).svg|35px|none|Entry]] | style="border-bottom: 1px solid var(--wikt-palette-grey-4, 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:Codex icon book color-placeholder (v2.6).svg|35px|none|Resources]] || '''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> |} </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('"', "&quot;") -- & in attributes is automatically escaped. -- :gsub("&", "&amp;") :gsub("<", "&lt;") :gsub(">", "&gt;") 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>[[:Category:Unassigned languages|unassigned]]</td>") elseif famCode == "qfa-dis" then insert(ret, "<td>[[:Category:Languages of disputed affiliation|disputed affiliation]]</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 == "qfa-unc" then insert(ret, "<td>[[:Category:Unclassifiable languages|unclassifiable 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' })) local sc_catlink if code == "Zxxx" then sc_catlink = "[[:Category:Unwritten languages|unwritten]]" else sc_catlink = sc:makeCategoryLink(lang) end return sc_catlink .. ' (<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 = '[[d:' .. wikidataItem .. '|' .. 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_for_family_tree(content, title) return '<div class="NavFrame"><div class="NavHead">' .. (title or '{{{title}}}') .. '</div>' .. '<div class="NavContent" style="text-align: left; font-size: calc(1em / 0.95); padding: 0.3em">' .. 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 entry_guidelines_page = "Wiktionary:" .. canonicalName .. " entry guidelines" local entry_guidelines = new_title(entry_guidelines_page) if entry_guidelines.exists then add = add .. "\n\n" .. "Please see '''[[" .. entry_guidelines_page .. "]]''' 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_for_family_tree( 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 = "en"} local ret = {{name = "All languages", 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:Unassigned languages", sort = sortkey}) elseif famCode == "qfa-dis" then insert(ret, {name = "Category:Languages of disputed affiliation", 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 == "qfa-unc" then insert(ret, {name = "Category:Unclassifiable 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 = "श्रेणी:" .. fam:getCategoryName(), sort = sortkey}) if lang:hasType("reconstructed") then insert(ret, { name = "श्रेणी:Reconstructed languages", sort = {sort_base = canonicalName:gsub("^Proto%-", ""), lang = "en"} }) end end local function add_sc_cat(sc) local catname if sc:getCode() == "Zxxx" then catname = "Unwritten languages" else catname = sc:getCategoryName(false, lang) .. " भाषाएँ" end insert(ret, {name = "श्रेणी:" .. catname, 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:find("[Ll]anguage$") or category:find("[Ll]ect$")) then return nil end local lang = m_languages.getByCanonicalName(category) if not lang then local langname = category:match("^(.*) भाषाएँ$") 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 = "श्रेणी:" .. locationcat, sort = " भाषाएँ"}) end else local location_cat = ("श्रेणी:%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 = "भाषाएँ"}) 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 } ltzxlammj6zoj8zwoc0pe25y12a351k 487816 487815 2026-09-02T19:21:13Z SM7 6218 SM7 ने पृष्ठ [[मॉड्यूल:category tree/languages]] को [[मॉड्यूल:category tree/भाषाएँ]] पर स्थानांतरित किया 487815 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["सभी भाषाएँ"] = { 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 = { "मूलभूत श्रेणी", }, } raw_categories["All extinct languages"] = { description = "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 = { "सभी भाषाएँ", }, } raw_categories["Unwritten languages"] = { description = "Categories for every [[unwritten]] [[language]] on Wiktionary.", additional = "Do not confuse this category with [[:Category:Unspecified script languages]], which contains categories for languages that may be written but where the appropriate script has not yet been specified in the language data.", parents = { "सभी भाषाएँ", }, } raw_categories["Languages by country"] = { topright = "{{commonscat|Languages by continent}}", description = "Categories that group languages by country.", additional = "{{{umbrella_meta_msg}}}", parents = { "All languages", }, } 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 for template in require("Module:template parser").find_templates(contents) do -- The template parser automatically handles redirects and -- canonicalizes them. 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 bare_location_parts = split(bare_location, ", ") for i, part in ipairs(bare_location_parts) do bare_location_parts[i] = ("[[%s]]"):format(part) end local 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(true) setwiki = not wikipediaArticle and "-" 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 -- Avoid showing Wiktionary links section for reconstructed languages, -- as they are ineligible for Wiktionary editions local wiktionarylinks_chunk = concat{ [=[|- | style="vertical-align: top; height: 35px; width: 40px; border-bottom: 1px solid var(--wikt-palette-grey-4, lightgray);" | [[File:Wiktionary-logo-v2.svg|35px|none|Wiktionary]] |style="border-bottom: 1px solid var(--wikt-palette-grey-4, lightgray);" | '''Wiktionary edition''']=], wikt_plural, [=[ written in ]=], canonicalName, [=[: <div style="padding: 5px 10px">]=], wiktionarylinks, [=[</div> ]=]} if lang:hasType('reconstructed') then wiktionarylinks_chunk = '' 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{ -- FIXME: Bare wikicode [=[<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 var(--wikt-palette-grey-4, lightgray);" | [[File:Wikipedia-logo.png|35px|none|Wikipedia]] | style="border-bottom: 1px solid var(--wikt-palette-grey-4, 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 var(--wikt-palette-grey-4, lightgray);" | [[File:Commons-logo.svg|35px|none|Wikimedia Commons]] | style="border-bottom: 1px solid var(--wikt-palette-grey-4, 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> ]=], wiktionarylinks_chunk, [=[ |- | style="vertical-align: top; height: 35px; border-bottom: 1px solid var(--wikt-palette-grey-4, lightgray);" | [[File:Codex icon articles color-placeholder (v2.6).svg|35px|none|Entry]] | style="border-bottom: 1px solid var(--wikt-palette-grey-4, 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:Codex icon book color-placeholder (v2.6).svg|35px|none|Resources]] || '''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> |} </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('"', "&quot;") -- & in attributes is automatically escaped. -- :gsub("&", "&amp;") :gsub("<", "&lt;") :gsub(">", "&gt;") 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>[[:Category:Unassigned languages|unassigned]]</td>") elseif famCode == "qfa-dis" then insert(ret, "<td>[[:Category:Languages of disputed affiliation|disputed affiliation]]</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 == "qfa-unc" then insert(ret, "<td>[[:Category:Unclassifiable languages|unclassifiable 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' })) local sc_catlink if code == "Zxxx" then sc_catlink = "[[:Category:Unwritten languages|unwritten]]" else sc_catlink = sc:makeCategoryLink(lang) end return sc_catlink .. ' (<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 = '[[d:' .. wikidataItem .. '|' .. 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_for_family_tree(content, title) return '<div class="NavFrame"><div class="NavHead">' .. (title or '{{{title}}}') .. '</div>' .. '<div class="NavContent" style="text-align: left; font-size: calc(1em / 0.95); padding: 0.3em">' .. 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 entry_guidelines_page = "Wiktionary:" .. canonicalName .. " entry guidelines" local entry_guidelines = new_title(entry_guidelines_page) if entry_guidelines.exists then add = add .. "\n\n" .. "Please see '''[[" .. entry_guidelines_page .. "]]''' 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_for_family_tree( 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 = "en"} local ret = {{name = "All languages", 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:Unassigned languages", sort = sortkey}) elseif famCode == "qfa-dis" then insert(ret, {name = "Category:Languages of disputed affiliation", 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 == "qfa-unc" then insert(ret, {name = "Category:Unclassifiable 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 = "श्रेणी:" .. fam:getCategoryName(), sort = sortkey}) if lang:hasType("reconstructed") then insert(ret, { name = "श्रेणी:Reconstructed languages", sort = {sort_base = canonicalName:gsub("^Proto%-", ""), lang = "en"} }) end end local function add_sc_cat(sc) local catname if sc:getCode() == "Zxxx" then catname = "Unwritten languages" else catname = sc:getCategoryName(false, lang) .. " भाषाएँ" end insert(ret, {name = "श्रेणी:" .. catname, 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:find("[Ll]anguage$") or category:find("[Ll]ect$")) then return nil end local lang = m_languages.getByCanonicalName(category) if not lang then local langname = category:match("^(.*) भाषाएँ$") 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 = "श्रेणी:" .. locationcat, sort = " भाषाएँ"}) end else local location_cat = ("श्रेणी:%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 = "भाषाएँ"}) 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 } ltzxlammj6zoj8zwoc0pe25y12a351k मॉड्यूल:category tree/languages 828 306963 487817 2026-09-02T19:21:13Z SM7 6218 SM7 ने पृष्ठ [[मॉड्यूल:category tree/languages]] को [[मॉड्यूल:category tree/भाषाएँ]] पर स्थानांतरित किया 487817 Scribunto text/plain return require [[मॉड्यूल:category tree/भाषाएँ]] 4anad9goztj9z7agrp6fp7gquqljih7 मॉड्यूल:category tree/लेम्मा 828 306964 487818 2026-09-02T19:24:28Z SM7 6218 अंग्रेजी विक्षनरी से आयातित+ अल्प स्थानीयकृत 487818 Scribunto text/plain local labels = {} local raw_categories = {} local handlers = {} local ucfirst = require("Module:string utilities").ucfirst ----------------------------------------------------------------------------- -- -- -- LABELS -- -- -- ----------------------------------------------------------------------------- local diminutive_augmentative_poses = { "विशेषण", "क्रियाविशेषण", "डेटरमाइनर", "विस्मयादिबोधक", "संज्ञाएँ", "अंक", "उपसर्ग", "नामवाचक संज्ञाएँ", "सर्वनाम", "परसर्ग", "क्रियाएँ" } labels["लेम्मा"] = { description = "{{{langname}}} [[Wiktionary:Lemmas|lemmas]], categorized by their part of speech.", umbrella_parents = "मूलभूत श्रेणी", parents = {{name = "{{{langcat}}}", raw = true, sort = " "}}, } labels["action nouns"] = { description = "{{{langname}}} nouns denoting action of a verb or verbal root that it is derived from.", parents = {"nouns"}, } labels["act-related adverbs"] = { description = "{{{langname}}} adverbs that indicate the motive or other background information for an action.", parents = {"adverbs"}, } labels["adjective concords"] = { description = "{{{langname}}} concords that are prefixed to adjective stems.", parents = {"concords"}, } labels["विशेषण"] = { description = "{{{langname}}} terms that give attributes to nouns, extending their definitions.", parents = {"लेम्मा"}, } labels["adjectivized participles"] = { description = "{{{langname}}} participles that are used as adjectives.", parents = {"participles", "adjectives"}, } labels["adjectivized past participles"] = { description = "{{{langname}}} past participles that are used as adjectives.", parents = {"past participles", "adjectivized participles", "adjectives"}, } labels["adjectivized present participles"] = { description = "{{{langname}}} present participles that are used as adjectives.", parents = {"present participles", "adjectivized participles", "adjectives"}, } labels["adverbial accusatives"] = { description = "Accusative case-forms in {{{langname}}} used as adverbs.", parents = {"adverbs"}, } labels["adverbs"] = { description = "{{{langname}}} terms that modify clauses, sentences and phrases directly.", parents = {"lemmas"}, } labels["affixes"] = { description = "Morphemes attached to existing {{{langname}}} words.", parents = {"morphemes"}, } labels["agent nouns"] = { description = "{{{langname}}} nouns that denote an agent that performs the action denoted by the verb from which the noun is derived.", parents = {"nouns"}, } labels["ambipositions"] = { description = "{{{langname}}} adpositions that can occur either before or after their objects.", parents = {"lemmas"}, } labels["ambitransitive verbs"] = { description = "{{{langname}}} verbs that may or may not direct actions, occurrences or states to grammatical objects.", parents = {"verbs", "transitive verbs", "intransitive verbs"}, } labels["animal commands"] = { description = "{{{langname}}} words used to communicate with animals.", parents = {"interjections"}, } labels["articles"] = { description = "{{{langname}}} terms that indicate and specify nouns.", parents = {"determiners"}, } labels["aspect adverbs"] = { description = "{{{langname}}} adverbs that express [[w:Grammatical aspect|grammatical aspect]], describing the flow of time in relation to a statement.", parents = {"adverbs"}, } for _, pos in ipairs(diminutive_augmentative_poses) do labels["augmentative " .. pos] = { description = "{{{langname}}} " .. pos .. " that are derived from a base word to convey big size or big intensity.", parents = {pos}, } end labels["attenuative verbs"] = { description = "{{{langname}}} verbs that indicate that an action or event is performed or takes place gently, lightly, partially, perfunctorily or to an otherwise reduced extent.", parents = {"verbs"}, } labels["autobenefactive verbs"] = { description = "{{{langname}}} verbs that indicate that the agent of an action is also its benefactor.", parents = {"verbs"}, } labels["automative verbs"] = { description = "{{{langname}}} verbs that indicate actions directed at or a change of state of the grammatical subject.", parents = {"verbs"}, } labels["auxiliary verbs"] = { description = "{{{langname}}} verbs that provide additional conjugations for other verbs.", parents = {"verbs"}, } labels["biaspectual verbs"] = { description = "{{{langname}}} verbs that can be both imperfective and perfective.", parents = {"verbs"}, } labels["causative verbs"] = { description = "{{{langname}}} verbs that express causing actions or states rather than performing or being them directly.", parents = {"verbs"}, } labels["circumfixes"] = { description = "Affixes attached to both the beginning and the end of {{{langname}}} words, functioning together as single units.", parents = {"morphemes"}, } labels["circumpositions"] = { description = "{{{langname}}} adpositions that appear on both sides of their objects.", parents = {"lemmas"}, } labels["classifiers"] = { description = "{{{langname}}} terms that classify nouns according to their meanings.", parents = {"lemmas"}, } labels["clitics"] = { description = "{{{langname}}} morphemes that function as independent words, but are always attached to another word.", parents = {"morphemes"}, } for _, pos in ipairs { "nouns", "suffixes" } do labels["collective " .. pos] = { description = "{{{langname}}} " .. pos .. " that indicate groups of related things or beings, without the need of grammatical pluralization.", parents = {pos}, } end labels["combining forms"] = { description = "Forms of {{{langname}}} words that do not occur independently, but are used when joined with other words.", parents = {"morphemes"}, } labels["comparable adjectives"] = { description = "{{{langname}}} adjectives that can be inflected to display different degrees of comparison.", parents = {"adjectives"}, } labels["comparable adverbs"] = { description = "{{{langname}}} adverbs that can be inflected to display different degrees of comparison.", parents = {"adverbs"}, } labels["completive verbs"] = { description = "{{{langname}}} verbs which refer to the completion of an action which has already commenced or which has already been performed upon a subset of the entities which it affects.", parents = {"verbs"}, } labels["concords"] = { description = "{{{langname}}} prefixes attached to words to show agreement with a noun or pronoun.", parents = {"prefixes"}, } labels["conjunctions"] = { description = "{{{langname}}} terms that connect words, phrases or clauses together.", parents = {"lemmas"}, } labels["conjunctive adverbs"] = { description = "{{{langname}}} adverbs that connect two independent clauses together.", parents = {"adverbs"}, } labels["continuative verbs"] = { description = "{{{langname}}} verbs that express continuing action.", parents = {"imperfective verbs", "verbs"}, } labels["control verbs"] = { description = "{{{langname}}} verbs that take multiple arguments, one of which is another verb. One of the control verb's arguments is syntactically both an argument of the control verb and an argument of the other verb.", parents = {"verbs"}, } labels["cooperative verbs"] = { description = "{{{langname}}} verbs that indicate cooperation", parents = {"verbs"}, } labels["coordinating conjunctions"] = { description = "{{{langname}}} conjunctions that indicate equal syntactic importance between connected items.", parents = {"conjunctions"}, } labels["copulative verbs"] = { description = "{{{langname}}} verbs that may take adjectives as their complement.", parents = {"verbs"}, } for _, pos in ipairs { "nouns", "proper nouns" } do labels["countable " .. pos] = { description = "{{{langname}}} " .. pos .. " that can be quantified directly by numerals.", parents = {pos}, } end labels["countable numerals"] = { description = "{{{langname}}} numerals that can be quantified directly by other numerals.", parents = {"numerals"}, } labels["countable suffixes"] = { description = "{{{langname}}} suffixes that can be used to form nouns that can be quantified directly by numerals.", parents = {"suffixes"}, } labels["counters"] = { description = "{{{langname}}} terms that combine with numerals to express quantity of nouns.", parents = {"lemmas"}, } labels["cumulative verbs"] = { description = "{{{langname}}} verbs which indicate that an action or event gradually yields a certain or significant quantity or effect.", parents = {"verbs"}, } labels["degree adverbs"] = { description = "{{{langname}}} adverbs that express a particular degree to which the word they modify applies.", parents = {"adverbs"}, } labels["delimitative verbs"] = { description = "{{{langname}}} verbs which indicate that an action or event is performed or takes place briefly or to an otherwise reduced extent.", parents = {"imperfective verbs", "verbs"}, } labels["demonstrative adjectives"] = { description = "{{{langname}}} adjectives that refer to nouns, comparing them to external references.", parents = {"adjectives", {name = "demonstrative pro-forms", sort = "adjectives"}}, } labels["demonstrative adverbs"] = { description = "{{{langname}}} adverbs that refer to other adverbs, comparing them to external references.", parents = {"adverbs", {name = "demonstrative pro-forms", sort = "adverbs"}}, } labels["denominal verbs"] = { -- in [[Appendix:Glossary]]; "denominative" more frequent? description = "{{{langname}}} verbs that derive from nouns.", parents = { "verbs" }, } labels["demonstrative determiners"] = { description = "{{{langname}}} determiners that refer to nouns, comparing them to external references.", parents = {"determiners", {name = "demonstrative pro-forms", sort = "determiners"}}, } labels["demonstrative pronouns"] = { description = "{{{langname}}} pronouns that refer to nouns, comparing them to external references.", parents = {"pronouns", {name = "demonstrative pro-forms", sort = "pronouns"}}, } labels["deponent verbs"] = { description = "{{{langname}}} verbs that have active meanings but are not conjugated in the {{w|active voice}}.", parents = {"verbs"}, } labels["derivational prefixes"] = { description = "{{{langname}}} prefixes that are used to create new words.", parents = {"prefixes"}, } labels["derivational suffixes"] = { description = "{{{langname}}} suffixes that are used to create new words.", parents = {"suffixes"}, } labels["derivative verbs"] = { description = "{{{langname}}} verbs that are derived from nouns and adjectives.", parents = {"verbs"}, } labels["desiderative verbs"] = { description = "{{{langname}}} verbs with the following morphology: verbal root xxx + [[desiderative]] affix, and the following semantics: to wish to do the action xxx.", parents = {"verbs"}, } labels["determinatives"] = { description = "{{{langname}}} terms that indicate the general class to which the following logogram belongs.", parents = {"lemmas"}, } labels["determiners"] = { description = "{{{langname}}} terms that narrow down, within the conversational context, the referent of the modified noun.", parents = {"lemmas"}, } labels["diminutiva tantum"] = { description = "{{{langname}}} nouns or noun senses that are mostly or exclusively used in the diminutive form.", parents = {"nouns"}, } for _, pos in ipairs(diminutive_augmentative_poses) do labels["diminutive " .. pos] = { description = "{{{langname}}} " .. pos .. " that are derived from a base word to convey endearment, small size or small intensity.", parents = {pos}, } end labels["discourse particles"] = { description = "{{{langname}}} particles that manage the flow and structure of discourse.", parents = {"particles"}, } labels["distributive verbs"] = { description = "{{{langname}}} verbs which indicate that an action or event involves multiple participants or a large quantity of an uncountable mass, usually as the grammatical subject in the case of intransitive verbs and as the grammatical object in the case of transitive verbs.", parents = {"imperfective verbs", "verbs"}, } labels["ditransitive verbs"] = { description = "{{{langname}}} verbs that indicate actions, occurrences or states of two grammatical objects simultaneously, one direct and one indirect.", parents = {"verbs", "transitive verbs"}, } labels["dualia tantum"] = { description = "{{{langname}}} nouns that are mostly or exclusively used in the dual form.", parents = {"nouns"}, } labels["duration adverbs"] = { description = "{{{langname}}} adverbs that express duration in time, such as (in English) [[always]], [[all night]] and [[ever since]].", parents = {"time adverbs"}, } labels["ergative verbs"] = { description = "{{{langname}}} [[Appendix:Glossary#ergative|ergative verb]]s: intransitive verbs that become causatives when used transitively.", parents = {"verbs", "intransitive verbs", "transitive verbs"}, } labels["excessive verbs"] = { description = "{{{langname}}} verbs that indicate that an action is performed to an excessive extent.", parents = {"verbs"}, } labels["enclitics"] = { description = "{{{langname}}} clitics that attach to the preceding word.", parents = {"clitics"}, } labels["nouns with other-gender equivalents"] = { description = "{{{langname}}} nouns that refer to gendered concepts (e.g. [[actor]] vs. [[actress]], [[king]] vs. [[queen]]) and have corresponding other-gender equivalent terms.", parents = {"nouns"}, } labels["female equivalent nouns"] = { description = "{{{langname}}} nouns that refer to female beings with the same characteristics as the base noun.", parents = {"nouns with other-gender equivalents"}, } labels["neuter equivalent nouns"] = { description = "{{{langname}}} nouns that refer to neuter beings with the same characteristics as the base noun.", parents = {"nouns with other-gender equivalents"}, } labels["female equivalent suffixes"] = { description = "{{{langname}}} suffixes that refer to female beings with the same characteristics as the base suffix.", parents = {"noun-forming suffixes"}, } labels["focus adverbs"] = { description = "{{{langname}}} adverbs that indicate [[w:Focus (linguistics)|focus]] within the sentence.", parents = {"adverbs"}, } labels["frequency adverbs"] = { description = "{{{langname}}} adverbs that express repetition with a certain frequency or interval, such as (in English) [[monthly]], [[continually]] and [[once in a while]].", parents = {"time adverbs"}, } labels["frequentative verbs"] = { description = "{{{langname}}} verbs that express repeated action.", parents = {"imperfective verbs", "verbs"}, } labels["general pronouns"] = { description = "{{{langname}}} pronouns that refer to all persons, things, abstract ideas and their characteristics.", parents = {"pronouns"}, } labels["generational moieties"] = { description = "{{{langname}}} moieties that alternate every generation.", parents = {"moieties"}, } labels["ideophones"] = { description = "{{{langname}}} terms that evoke an idea, especially a sensation or impression, with a sound.", parents = {"lemmas"}, } labels["imperfective verbs"] = { description = "{{{langname}}} verbs that express actions considered as ongoing or continuous, as opposed to completed events.", parents = {"verbs"}, } labels["impersonal verbs"] = { description = "{{{langname}}} verbs that do not indicate actions, occurrences or states of any specific grammatical subject.", parents = {"verbs"}, } labels["inchoative verbs"] = { description = "{{{langname}}} verbs that indicate the beginning of an action or event.", parents = {"verbs"}, } labels["indefinite adjectives"] = { description = "{{{langname}}} adjectives that refer to unspecified adjective meanings.", parents = {"adjectives", {name = "indefinite pro-forms", sort = "adjectives"}}, } labels["indefinite adverbs"] = { description = "{{{langname}}} adverbs that refer to unspecified adverbial meanings.", parents = {"adverbs", {name = "indefinite pro-forms", sort = "adverbs"}}, } labels["indefinite determiners"] = { description = "{{{langname}}} determiners that designate an unidentified noun.", parents = {"determiners", {name = "indefinite pro-forms", sort = "determiners"}}, } labels["indefinite pronouns"] = { description = "{{{langname}}} pronouns that refer to unspecified nouns.", parents = {"pronouns", {name = "indefinite pro-forms", sort = "pronouns"}}, } labels["infixes"] = { description = "Affixes inserted inside {{{langname}}} words.", parents = {"morphemes"}, } labels["inflectional prefixes"] = { description = "{{{langname}}} prefixes that are used as inflectional beginnings in noun, adjective or verb paradigms.", parents = {"prefixes"}, } labels["inflectional suffixes"] = { description = "{{{langname}}} suffixes that are used as inflectional endings in noun, adjective or verb paradigms.", parents = {"suffixes"}, } labels["intensive verbs"] = { description = "{{{langname}}} verbs which indicate that an action is performed vigorously, enthusiastically, forcefully or to an otherwise enlarged extent.", parents = {"verbs"}, } labels["interfixes"] = { description = "Affixes used to join two {{{langname}}} words or morphemes together.", parents = {"morphemes"}, } labels["interjections"] = { description = "{{{langname}}} terms that express emotions, sounds, etc. as exclamations.", parents = {"lemmas"}, } labels["interrogative adjectives"] = { description = "{{{langname}}} adjectives that indicate questions.", parents = {"adjectives", {name = "interrogative pro-forms", sort = "adjectives"}}, } labels["interrogative adverbs"] = { description = "{{{langname}}} adverbs that indicate questions.", parents = {"adverbs", {name = "interrogative pro-forms", sort = "adverbs"}}, } labels["interrogative determiners"] = { description = "{{{langname}}} determiners that indicate questions.", parents = {"determiners", {name = "interrogative pro-forms", sort = "determiners"}}, } labels["interrogative particles"] = { description = "{{{langname}}} particles that indicate questions.", parents = {"particles", {name = "interrogative pro-forms", sort = "particles"}}, } labels["interrogative pronouns"] = { description = "{{{langname}}} pronouns that indicate questions.", parents = {"pronouns", {name = "interrogative pro-forms", sort = "pronouns"}}, } labels["intransitive verbs"] = { description = "{{{langname}}} verbs that don't require any grammatical objects.", parents = {"verbs"}, } labels["iterative verbs"] = { description = "{{{langname}}} verbs that express the repetition of an event.", parents = {"imperfective verbs", "verbs"}, } labels["location adverbs"] = { description = "{{{langname}}} adverbs that indicate location.", parents = {"adverbs"}, } labels["male equivalent nouns"] = { description = "{{{langname}}} nouns that refer to male beings with the same characteristics as the base noun.", parents = {"nouns with other-gender equivalents"}, } labels["manner adverbs"] = { description = "{{{langname}}} adverbs that indicate the manner, way or style in which an action is performed.", parents = {"adverbs"}, } labels["modal adverbs"] = { description = "{{{langname}}} adverbs that express [[w:Linguistic modality|linguistic modality]], indicating the mood or attitude of the speaker with respect to what is being said.", parents = {"sentence adverbs"}, } labels["modal particles"] = { description = "{{{langname}}} particles that reflect the mood or attitude of the speaker, without changing the basic meaning of the sentence.", parents = {"particles"}, } labels["modal verbs"] = { description = "{{{langname}}} verbs that indicate [[grammatical mood]].", parents = {"auxiliary verbs"}, } labels["moieties"] = { description = "{{{langname}}} pairs of abstract categories separating people and the environment.", parents = {"lemmas"}, } labels["momentane verbs"] = { description = "{{{langname}}} verbs that express a sudden and brief action.", parents = {"perfective verbs", "verbs"}, } labels["morphemes"] = { description = "{{{langname}}} word-elements used to form full words.", parents = {"lemmas"}, } labels["movement adverbs"] = { description = "{{{langname}}} adverbs that express movement in space, such as (in English) [[hither]], [[that way]], [[down]] and [[eastwards]].", additional = "Compare [[:Category:{{{langname}}} position adverbs]].", parents = {"location adverbs"}, umbrella = { additional = "Compare [[:Category:Position adverbs by language]].", }, } labels["multiword terms"] = { description = "{{{langname}}} lemmas that are a combination of multiple words, including [[WT:CFI#Idiomaticity|idiomatic]] combinations.", parents = {"lemmas"}, } labels["negative verbs"] = { description = "{{{langname}}} verbs that indicate the lack of an action.", parents = {"verbs"}, } labels["negative particles"] = { description = "{{{langname}}} particles that indicate negation.", parents = {"particles"}, } labels["negative pronouns"] = { description = "{{{langname}}} pronouns that refer to negative or non-existent references.", parents = {"pronouns"}, } labels["nominalized adjectives"] = { description = "{{{langname}}} adjectives that are used as nouns.", parents = {"nouns", "adjectives"}, } labels["nominalized present participles"] = { description = "{{{langname}}} present participles that are used as nouns.", parents = {"nouns", "present participles"}, } labels["non-constituents"] = { description = "{{{langname}}} terms that are not grammatical [[constituent#Noun|constituents]], and therefore need to be combined with additional terms to form a complete phrase.", parents = {"phrases"}, } labels["noun prefixes"] = { description = "{{{langname}}} prefixes attached to a noun that display its noun class.", parents = {"prefixes"}, } labels["nouns"] = { description = "{{{langname}}} terms that indicate people, beings, things, places, phenomena, qualities or ideas.", parents = {"lemmas"}, } labels["nouns by classifier"] = { description = "{{{langname}}} nouns organized by the classifier they are used with.", parents = {{name = "nouns", sort = "classifier"}}, } labels["numerals"] = { description = "{{{langname}}} terms that quantify nouns.", parents = {"lemmas"}, } labels["object concords"] = { description = "{{{langname}}} concords used to show the grammatical object.", parents = {"concords"}, } labels["object pronouns"] = { description = "{{{langname}}} pronouns that refer to grammatical objects.", parents = {"pronouns"}, } labels["particles"] = { description = "{{{langname}}} terms that do not belong to any of the inflected grammatical word classes, often lacking their own grammatical functions and forming other parts of speech or expressing the relationship between clauses.", parents = {"lemmas"}, } labels["perfective verbs"] = { description = "{{{langname}}} verbs that express actions considered as completed events, as opposed to ongoing or continuous.", parents = {"verbs"}, } labels["personal pronouns"] = { description = "{{{langname}}} pronouns that are used as substitutes for known nouns.", parents = {"pronouns"}, } labels["phrasal verbs"] = { description = "{{{langname}}} verbs accompanied by particles, such as prepositions and adverbs.", parents = {"verbs", "phrases"}, } labels["phrasal prepositions"] = { description = "{{{langname}}} prepositions formed with combinations of other terms.", parents = {"prepositions", "phrases"}, } labels["pluralia tantum"] = { description = "{{{langname}}} nouns that are mostly or exclusively used in the plural form.", parents = {"nouns"}, } labels["point-in-time adverbs"] = { description = "{{{langname}}} adverbs that reference a specific point in time, e.g. {{m|en|yesterday}}, {{m+|es|anoche||last night}} or {{m+|hu|egykor||at one o'clock}}.", parents = {"time adverbs"}, } labels["position adverbs"] = { description = "{{{langname}}} adverbs that express position in space, such as (in English) [[here]], [[next door]], [[cater-corner]] and [[on deck]].", additional = "Compare [[:Category:{{{langname}}} movement adverbs]].", parents = {"location adverbs"}, umbrella = { additional = "Compare [[:Category:Movement adverbs by language]].", }, } labels["possessable nouns"] = { description = "{{{langname}}} nouns that can have their possession indicated directly by possessive pronouns.", parents = {"nouns"}, umbrella = { description = "Categories with nouns that can have their possession indicated directly by possessive pronouns and, in some languages, be transformed into adjectives.", }, } labels["possessional adjectives"] = { description = "{{{langname}}} adjectives that indicate that a noun is in possession of something.", parents = {"adjectives"}, } labels["possessive adjectives"] = { description = "{{{langname}}} adjectives that indicate ownership.", parents = {"adjectives"}, } labels["possessive concords"] = { description = "{{{langname}}} concords used to show possession.", parents = {"concords"}, } labels["possessive determiners"] = { description = "{{{langname}}} determiners that indicate ownership.", parents = {"determiners"}, } labels["possessive pronouns"] = { description = "{{{langname}}} pronouns that indicate ownership.", parents = {"pronouns"}, } labels["postpositional phrases"] = { description = "{{{langname}}} phrases headed by a postposition.", parents = {"phrases", "postpositions"}, } labels["postpositions"] = { description = "{{{langname}}} adpositions that are placed after their objects.", parents = {"lemmas"}, } labels["predicatives"] = { description = "{{{langname}}} elements of the predicate that supplement the subject or object of a sentence via the verb.", parents = {"lemmas"}, } labels["prefixes"] = { description = "Affixes attached to the beginning of {{{langname}}} words.", parents = {"morphemes"}, } labels["prepositional phrases"] = { description = "{{{langname}}} phrases headed by a preposition.", parents = {"phrases", "prepositions"}, } labels["prepositions"] = { description = "{{{langname}}} adpositions that are placed before their objects.", parents = {"lemmas"}, } labels["matrilineal moieties"] = { description = "{{{langname}}} moieties inherited from an individual's mother.", parents = {"moieties"}, } labels["patrilineal moieties"] = { description = "{{{langname}}} moieties inherited from an individual's father.", parents = {"moieties"}, } labels["pejorative suffixes"] = { description = "{{{langname}}} suffixes that [[belittle]] (lessen in value).", parents = {"suffixes"}, } labels["prenouns"] = { description = "{{{langname}}} prefixes of various kinds that are attached to nouns.", parents = {"prefixes"}, } labels["preverbs"] = { description = "{{{langname}}} prefixes of various kinds that are attached to verbs.", parents = {"prefixes"}, } labels["privative verbs"] = { description = "{{{langname}}} verbs that indicate that the grammatical object is deprived of something or that something is removed from the object.", parents = {"verbs"}, } labels["pronominal adverbs"] = { description = "{{{langname}}} adverbs that are formed by combining a pronoun with a preposition.", parents = {"adverbs", "prepositions", "pronouns"}, } labels["pronominal concords"] = { description = "{{{langname}}} concords that are prefixed to pronominal stems.", parents = {"concords"}, } labels["pronouns"] = { description = "{{{langname}}} terms that refer to and substitute nouns.", parents = {"lemmas"}, } labels["proper nouns"] = { description = "{{{langname}}} nouns that indicate individual entities, such as names of persons, places or organizations.", parents = {"nouns"}, } labels["raising verbs"] = { description = "{{{langname}}} verbs that, in a matrix or main clause, take an argument from an embedded or subordinate clause; in other words, a raising verb appears with a syntactic argument that is not its semantic argument, but is rather the semantic argument of an embedded predicate.", parents = {"verbs"}, } labels["reciprocal pronouns"] = { description = "{{{langname}}} pronouns that refer back to a plural subject and express an action done in two or more directions.", parents = {"pronouns", "personal pronouns"}, } labels["reciprocal verbs"] = { description = "{{{langname}}} verbs that indicate actions, occurrences or states directed from multiple subjects to each other.", parents = {"verbs"}, } labels["reflexive pronouns"] = { description = "{{{langname}}} pronouns that refer back to the subject.", parents = {"pronouns", "personal pronouns"}, } labels["reflexive verbs"] = { description = "{{{langname}}} verbs that indicate actions, occurrences or states directed from the grammatical subjects to themselves.", parents = {"verbs"}, } labels["relational adjectives"] = { description = "{{{langname}}} adjectives that stand in place of a noun when modifying another noun.", parents = {"adjectives"}, } labels["relational nouns"] = { description = "{{{langname}}} nouns used to indicate a relation between other two nouns by means of possession.", parents = {"nouns"}, } labels["relative adjectives"] = { description = "{{{langname}}} adjectives used to indicate [[relative clause]]s.", parents = {"adjectives", {name = "relative pro-forms", sort = "adjectives"}}, } labels["relative adverbs"] = { description = "{{{langname}}} adverbs used to indicate [[relative clause]]s.", parents = {"adverbs", {name = "relative pro-forms", sort = "adverbs"}}, } labels["relative determiners"] = { description = "{{{langname}}} determiners used to indicate [[relative clause]]s.", parents = {"determiners", {name = "relative pro-forms", sort = "determiners"}}, } labels["relative concords"] = { description = "{{{langname}}} concords that are prefixed to relative stems.", parents = {"concords"}, } labels["relative pronouns"] = { description = "{{{langname}}} pronouns used to indicate [[relative clause]]s.", parents = {"pronouns", {name = "relative pro-forms", sort = "pronouns"}}, } labels["relatives"] = { description = "{{{langname}}} terms that give attributes to nouns, acting grammatically as relative clauses.", parents = {"lemmas"}, } labels["repetitive verbs"] = { description = "{{{langname}}} verbs that indicate actions or events which are performed or occur again, anew or differently.", parents = {"verbs"}, } labels["resultative verbs"] = { description = "{{{langname}}} verbs that indicate a result of some action", parents = {"verbs"}, } labels["reversative verbs"] = { description = "{{{langname}}} verbs that indicate that the reversal or undoing of an action, event or state.", parents = {"verbs"}, } labels["saturative verbs"] = { description = "{{{langname}}} verbs which indicate that an action is performed to the point of saturation or satisfaction.", parents = {"verbs"}, } labels["semelfactive verbs"] = { description = "{{{langname}}} verbs that are punctual (instantaneous, momentive), perfective (treated as a unitary whole with no explicit internal temporal structure), and telic (having a boundary out of which the activity cannot be said to have taken place or continue).", parents = {"perfective verbs", "verbs"}, } labels["sentence adverbs"] = { description = "{{{langname}}} adverbs that modify an entire clause or sentence.", parents = {"adverbs"}, } labels["sequence adverbs"] = { description = "{{{langname}}} conjunctive adverbs that express sequence in space or time.", parents = {"conjunctive adverbs"}, } labels["simulfixes"] = { description = "Affixes replacing positions in {{{langname}}} words.", parents = {"morphemes"}, } labels["singulative nouns"] = { description = "{{{langname}}} nouns that indicate a single item of a group of related things or beings.", parents = {"nouns"}, } labels["singularia tantum"] = { description = "{{{langname}}} nouns that are mostly or exclusively used in the singular form.", parents = {"nouns"}, } labels["solitary pronouns"] = { description = "{{{langname}}} pronouns that refer to specific people in particular and sets them apart from anyone else.", parents = {"pronouns", "personal pronouns"}, } labels["stative verbs"] = { description = "{{{langname}}} verbs that define a state with no or insignificant internal dynamics.", parents = {"verbs"}, } labels["stems"] = { description = "Morphemes from which {{{langname}}} words are formed.", parents = {"morphemes"}, } labels["subordinating conjunctions"] = { description = "{{{langname}}} conjunctions that indicate relations of syntactic dependence between connected items.", parents = {"conjunctions"}, } labels["subject concords"] = { description = "{{{langname}}} concords used to show the grammatical subject.", parents = {"concords"}, } labels["subject pronouns"] = { description = "{{{langname}}} pronouns that refer to grammatical subjects.", parents = {"pronouns"}, } labels["suffixes"] = { description = "Affixes attached to the end of {{{langname}}} words.", parents = {"morphemes"}, } labels["splitting verbs"] = { description = "{{{langname}}} bisyllabic verbs that obligatorily split around a direct object or pronoun.", parents = {"verbs"}, } labels["terminative verbs"] = { description = "{{{langname}}} verbs that indicate that an action or event ceases.", parents = {"verbs"}, } labels["time adverbs"] = { description = "{{{langname}}} adverbs that indicate time, expressing either [[duration]], [[frequency]] or a [[point]] in [[time]].", parents = {"adverbs"}, } labels["transfixes"] = { description = "Discontinuous affixes inserted within a word root.", parents = {"morphemes"}, } labels["transformative verbs"] = { description = "{{{langname}}} verbs that indicate a change of state or nature, in the subject for intransitive verbs and in the object for transitive verbs.", parents = {"verbs"}, } labels["transitive verbs"] = { description = "{{{langname}}} verbs that indicate actions, occurrences or states directed to one or more grammatical objects.", parents = {"verbs"}, } labels["uncomparable adjectives"] = { description = "{{{langname}}} adjectives that are not inflected to display different degrees of comparison.", parents = {"adjectives"}, } labels["uncomparable adverbs"] = { description = "{{{langname}}} adverbs that are not inflected to display different degrees of comparison.", parents = {"adverbs"}, } labels["uncountable nouns"] = { description = "{{{langname}}} nouns that indicate qualities, ideas, unbounded mass or other abstract concepts that cannot be quantified directly by numerals.", parents = {"nouns"}, } labels["uncountable numerals"] = { description = "{{{langname}}} numerals that cannot be quantified directly by other numerals.", parents = {"numerals"}, } labels["uncountable proper nouns"] = { description = "{{{langname}}} proper nouns that cannot be quantified directly by numerals.", parents = {"proper nouns"}, } labels["uncountable suffixes"] = { description = "{{{langname}}} suffixes that can be used to form nouns that cannot be quantified directly by numerals.", parents = {"suffixes"}, } labels["unpossessable nouns"] = { description = "{{{langname}}} nouns that cannot have their possession indicated directly by possessive pronouns.", parents = {"nouns"}, umbrella = { description = "Categories with nouns that cannot have their possession indicated directly by possessive pronouns or, in some languages, be transformed into adjectives.", }, } labels["verbal nouns"] = { description = "{{{langname}}} nouns morphologically related to a verb and similar to it in meaning.", parents = {"nouns"}, } labels["verbal adjectives"] = { description = "{{{langname}}} adjectives describing the condition or state resulting from the action of the corresponding verb.", parents = {"adjectives"}, } ----------------------------------------------------------------------------- labels["verbs"] = { description = "{{{langname}}} terms that indicate actions, occurrences or states.", parents = {"lemmas"}, } for _, voice in pairs{ "active", "middle", "passive", } do labels[voice .. " verbs"] = { description = "{{{langname}}} verbs that are predominantly used in the {{w|" .. voice .. " voice}}.", parents = {"verbs"}, } local voice_only = voice .. "-only" labels[voice_only .. " verbs"] = { breadcrumb = voice_only, description = "{{{langname}}} verbs that can only be used in the {{w|" .. voice .. " voice}}.", parents = {voice .. " verbs", "verbs"}, } end labels["verbs of movement"] = { description = "{{{langname}}} verbs that indicate physical movement of the grammatical subject across a trajectory, with a starting point and an endpoint.", parents = {"verbs"}, } ----------------------------------------------------------------------------- for pos, desc in pairs{ ["prepositions"] = "following", ["postpositions"] = "preceding" } do for _, case in ipairs{ "ablative", "accusative", "dative", "genitive", "instrumental", "locative", "nominative", "prepositional", "vocative", } do labels[pos .. " governing the " .. case] = { breadcrumb = ucfirst(case), description = ("{{{langname}}} %s that cause the %s noun to be in the %s case."):format(pos, desc, case), parents = {pos}, } end end -- Add "X-only categories for degrees. for _, pos in pairs{ "adjectives", "adverbs", "determiners", "pronouns", } do for _, degree in pairs{ "comparative", "superlative", "elative", "exaggerated", "excessive", "equative", } do local degree_only = degree .. "-only" labels[degree_only .. " " .. pos] = { breadcrumb = degree_only, description = "{{{langname}}} " .. pos .. " that are only used in the " .. degree .. " degree.", parents = {pos}, } end end -- Add "POS-forming suffixes". for _, pos in pairs{ "adjective", "adverb", "noun", "numeral", "participle", "pronoun", "proper noun", "verb", } do labels[pos .. "-forming suffixes"] = { description = "{{{langname}}} suffixes that are used to derive " .. pos .. "s from other words.", parents = {"derivational suffixes"}, } end -- Add 'umbrella_parents' key if not already present. for key, data in pairs(labels) do if not data.umbrella_parents then data.umbrella_parents = "Lemmas subcategories by language" end end ----------------------------------------------------------------------------- -- -- -- RAW CATEGORIES -- -- -- ----------------------------------------------------------------------------- raw_categories["Lemmas subcategories by language"] = { description = "Umbrella categories covering topics related to lemmas.", additional = "{{{umbrella_meta_msg}}}", parents = { "Umbrella metacategories", {name = "lemmas", is_label = true, sort = " "}, }, } ----------------------------------------------------------------------------- -- -- -- HANDLERS -- -- -- ----------------------------------------------------------------------------- -- Handler for e.g. [[:Category:English phrasal verbs formed with "aback"]]. table.insert(handlers, function(data) local particle = data.label:match("^phrasal verbs formed with \"(.-)\"$") if particle then local tagged_text = require("Module:script utilities").tag_text(particle, data.lang, nil, "term") local link = require("Module:links").full_link({ term = particle, lang = data.lang }, "term") return { description = "{{{langname}}} {{w|phrasal verb}}s formed with the adverb or preposition " .. link .. ".", displaytitle = '{{{langname}}} phrasal verbs formed with "' .. particle .. '"', breadcrumb = tagged_text, parents = {{ name = "phrasal verbs", sort = particle }}, umbrella = false, } end end) return {LABELS = labels, RAW_CATEGORIES = raw_categories, HANDLERS = handlers} m71et4r44t927l9rcq6ntu20wlgkf10 487819 487818 2026-09-02T19:24:51Z SM7 6218 SM7 ने पृष्ठ [[मॉड्यूल:category tree/lemmas]] को [[मॉड्यूल:category tree/लेम्मा]] पर स्थानांतरित किया 487818 Scribunto text/plain local labels = {} local raw_categories = {} local handlers = {} local ucfirst = require("Module:string utilities").ucfirst ----------------------------------------------------------------------------- -- -- -- LABELS -- -- -- ----------------------------------------------------------------------------- local diminutive_augmentative_poses = { "विशेषण", "क्रियाविशेषण", "डेटरमाइनर", "विस्मयादिबोधक", "संज्ञाएँ", "अंक", "उपसर्ग", "नामवाचक संज्ञाएँ", "सर्वनाम", "परसर्ग", "क्रियाएँ" } labels["लेम्मा"] = { description = "{{{langname}}} [[Wiktionary:Lemmas|lemmas]], categorized by their part of speech.", umbrella_parents = "मूलभूत श्रेणी", parents = {{name = "{{{langcat}}}", raw = true, sort = " "}}, } labels["action nouns"] = { description = "{{{langname}}} nouns denoting action of a verb or verbal root that it is derived from.", parents = {"nouns"}, } labels["act-related adverbs"] = { description = "{{{langname}}} adverbs that indicate the motive or other background information for an action.", parents = {"adverbs"}, } labels["adjective concords"] = { description = "{{{langname}}} concords that are prefixed to adjective stems.", parents = {"concords"}, } labels["विशेषण"] = { description = "{{{langname}}} terms that give attributes to nouns, extending their definitions.", parents = {"लेम्मा"}, } labels["adjectivized participles"] = { description = "{{{langname}}} participles that are used as adjectives.", parents = {"participles", "adjectives"}, } labels["adjectivized past participles"] = { description = "{{{langname}}} past participles that are used as adjectives.", parents = {"past participles", "adjectivized participles", "adjectives"}, } labels["adjectivized present participles"] = { description = "{{{langname}}} present participles that are used as adjectives.", parents = {"present participles", "adjectivized participles", "adjectives"}, } labels["adverbial accusatives"] = { description = "Accusative case-forms in {{{langname}}} used as adverbs.", parents = {"adverbs"}, } labels["adverbs"] = { description = "{{{langname}}} terms that modify clauses, sentences and phrases directly.", parents = {"lemmas"}, } labels["affixes"] = { description = "Morphemes attached to existing {{{langname}}} words.", parents = {"morphemes"}, } labels["agent nouns"] = { description = "{{{langname}}} nouns that denote an agent that performs the action denoted by the verb from which the noun is derived.", parents = {"nouns"}, } labels["ambipositions"] = { description = "{{{langname}}} adpositions that can occur either before or after their objects.", parents = {"lemmas"}, } labels["ambitransitive verbs"] = { description = "{{{langname}}} verbs that may or may not direct actions, occurrences or states to grammatical objects.", parents = {"verbs", "transitive verbs", "intransitive verbs"}, } labels["animal commands"] = { description = "{{{langname}}} words used to communicate with animals.", parents = {"interjections"}, } labels["articles"] = { description = "{{{langname}}} terms that indicate and specify nouns.", parents = {"determiners"}, } labels["aspect adverbs"] = { description = "{{{langname}}} adverbs that express [[w:Grammatical aspect|grammatical aspect]], describing the flow of time in relation to a statement.", parents = {"adverbs"}, } for _, pos in ipairs(diminutive_augmentative_poses) do labels["augmentative " .. pos] = { description = "{{{langname}}} " .. pos .. " that are derived from a base word to convey big size or big intensity.", parents = {pos}, } end labels["attenuative verbs"] = { description = "{{{langname}}} verbs that indicate that an action or event is performed or takes place gently, lightly, partially, perfunctorily or to an otherwise reduced extent.", parents = {"verbs"}, } labels["autobenefactive verbs"] = { description = "{{{langname}}} verbs that indicate that the agent of an action is also its benefactor.", parents = {"verbs"}, } labels["automative verbs"] = { description = "{{{langname}}} verbs that indicate actions directed at or a change of state of the grammatical subject.", parents = {"verbs"}, } labels["auxiliary verbs"] = { description = "{{{langname}}} verbs that provide additional conjugations for other verbs.", parents = {"verbs"}, } labels["biaspectual verbs"] = { description = "{{{langname}}} verbs that can be both imperfective and perfective.", parents = {"verbs"}, } labels["causative verbs"] = { description = "{{{langname}}} verbs that express causing actions or states rather than performing or being them directly.", parents = {"verbs"}, } labels["circumfixes"] = { description = "Affixes attached to both the beginning and the end of {{{langname}}} words, functioning together as single units.", parents = {"morphemes"}, } labels["circumpositions"] = { description = "{{{langname}}} adpositions that appear on both sides of their objects.", parents = {"lemmas"}, } labels["classifiers"] = { description = "{{{langname}}} terms that classify nouns according to their meanings.", parents = {"lemmas"}, } labels["clitics"] = { description = "{{{langname}}} morphemes that function as independent words, but are always attached to another word.", parents = {"morphemes"}, } for _, pos in ipairs { "nouns", "suffixes" } do labels["collective " .. pos] = { description = "{{{langname}}} " .. pos .. " that indicate groups of related things or beings, without the need of grammatical pluralization.", parents = {pos}, } end labels["combining forms"] = { description = "Forms of {{{langname}}} words that do not occur independently, but are used when joined with other words.", parents = {"morphemes"}, } labels["comparable adjectives"] = { description = "{{{langname}}} adjectives that can be inflected to display different degrees of comparison.", parents = {"adjectives"}, } labels["comparable adverbs"] = { description = "{{{langname}}} adverbs that can be inflected to display different degrees of comparison.", parents = {"adverbs"}, } labels["completive verbs"] = { description = "{{{langname}}} verbs which refer to the completion of an action which has already commenced or which has already been performed upon a subset of the entities which it affects.", parents = {"verbs"}, } labels["concords"] = { description = "{{{langname}}} prefixes attached to words to show agreement with a noun or pronoun.", parents = {"prefixes"}, } labels["conjunctions"] = { description = "{{{langname}}} terms that connect words, phrases or clauses together.", parents = {"lemmas"}, } labels["conjunctive adverbs"] = { description = "{{{langname}}} adverbs that connect two independent clauses together.", parents = {"adverbs"}, } labels["continuative verbs"] = { description = "{{{langname}}} verbs that express continuing action.", parents = {"imperfective verbs", "verbs"}, } labels["control verbs"] = { description = "{{{langname}}} verbs that take multiple arguments, one of which is another verb. One of the control verb's arguments is syntactically both an argument of the control verb and an argument of the other verb.", parents = {"verbs"}, } labels["cooperative verbs"] = { description = "{{{langname}}} verbs that indicate cooperation", parents = {"verbs"}, } labels["coordinating conjunctions"] = { description = "{{{langname}}} conjunctions that indicate equal syntactic importance between connected items.", parents = {"conjunctions"}, } labels["copulative verbs"] = { description = "{{{langname}}} verbs that may take adjectives as their complement.", parents = {"verbs"}, } for _, pos in ipairs { "nouns", "proper nouns" } do labels["countable " .. pos] = { description = "{{{langname}}} " .. pos .. " that can be quantified directly by numerals.", parents = {pos}, } end labels["countable numerals"] = { description = "{{{langname}}} numerals that can be quantified directly by other numerals.", parents = {"numerals"}, } labels["countable suffixes"] = { description = "{{{langname}}} suffixes that can be used to form nouns that can be quantified directly by numerals.", parents = {"suffixes"}, } labels["counters"] = { description = "{{{langname}}} terms that combine with numerals to express quantity of nouns.", parents = {"lemmas"}, } labels["cumulative verbs"] = { description = "{{{langname}}} verbs which indicate that an action or event gradually yields a certain or significant quantity or effect.", parents = {"verbs"}, } labels["degree adverbs"] = { description = "{{{langname}}} adverbs that express a particular degree to which the word they modify applies.", parents = {"adverbs"}, } labels["delimitative verbs"] = { description = "{{{langname}}} verbs which indicate that an action or event is performed or takes place briefly or to an otherwise reduced extent.", parents = {"imperfective verbs", "verbs"}, } labels["demonstrative adjectives"] = { description = "{{{langname}}} adjectives that refer to nouns, comparing them to external references.", parents = {"adjectives", {name = "demonstrative pro-forms", sort = "adjectives"}}, } labels["demonstrative adverbs"] = { description = "{{{langname}}} adverbs that refer to other adverbs, comparing them to external references.", parents = {"adverbs", {name = "demonstrative pro-forms", sort = "adverbs"}}, } labels["denominal verbs"] = { -- in [[Appendix:Glossary]]; "denominative" more frequent? description = "{{{langname}}} verbs that derive from nouns.", parents = { "verbs" }, } labels["demonstrative determiners"] = { description = "{{{langname}}} determiners that refer to nouns, comparing them to external references.", parents = {"determiners", {name = "demonstrative pro-forms", sort = "determiners"}}, } labels["demonstrative pronouns"] = { description = "{{{langname}}} pronouns that refer to nouns, comparing them to external references.", parents = {"pronouns", {name = "demonstrative pro-forms", sort = "pronouns"}}, } labels["deponent verbs"] = { description = "{{{langname}}} verbs that have active meanings but are not conjugated in the {{w|active voice}}.", parents = {"verbs"}, } labels["derivational prefixes"] = { description = "{{{langname}}} prefixes that are used to create new words.", parents = {"prefixes"}, } labels["derivational suffixes"] = { description = "{{{langname}}} suffixes that are used to create new words.", parents = {"suffixes"}, } labels["derivative verbs"] = { description = "{{{langname}}} verbs that are derived from nouns and adjectives.", parents = {"verbs"}, } labels["desiderative verbs"] = { description = "{{{langname}}} verbs with the following morphology: verbal root xxx + [[desiderative]] affix, and the following semantics: to wish to do the action xxx.", parents = {"verbs"}, } labels["determinatives"] = { description = "{{{langname}}} terms that indicate the general class to which the following logogram belongs.", parents = {"lemmas"}, } labels["determiners"] = { description = "{{{langname}}} terms that narrow down, within the conversational context, the referent of the modified noun.", parents = {"lemmas"}, } labels["diminutiva tantum"] = { description = "{{{langname}}} nouns or noun senses that are mostly or exclusively used in the diminutive form.", parents = {"nouns"}, } for _, pos in ipairs(diminutive_augmentative_poses) do labels["diminutive " .. pos] = { description = "{{{langname}}} " .. pos .. " that are derived from a base word to convey endearment, small size or small intensity.", parents = {pos}, } end labels["discourse particles"] = { description = "{{{langname}}} particles that manage the flow and structure of discourse.", parents = {"particles"}, } labels["distributive verbs"] = { description = "{{{langname}}} verbs which indicate that an action or event involves multiple participants or a large quantity of an uncountable mass, usually as the grammatical subject in the case of intransitive verbs and as the grammatical object in the case of transitive verbs.", parents = {"imperfective verbs", "verbs"}, } labels["ditransitive verbs"] = { description = "{{{langname}}} verbs that indicate actions, occurrences or states of two grammatical objects simultaneously, one direct and one indirect.", parents = {"verbs", "transitive verbs"}, } labels["dualia tantum"] = { description = "{{{langname}}} nouns that are mostly or exclusively used in the dual form.", parents = {"nouns"}, } labels["duration adverbs"] = { description = "{{{langname}}} adverbs that express duration in time, such as (in English) [[always]], [[all night]] and [[ever since]].", parents = {"time adverbs"}, } labels["ergative verbs"] = { description = "{{{langname}}} [[Appendix:Glossary#ergative|ergative verb]]s: intransitive verbs that become causatives when used transitively.", parents = {"verbs", "intransitive verbs", "transitive verbs"}, } labels["excessive verbs"] = { description = "{{{langname}}} verbs that indicate that an action is performed to an excessive extent.", parents = {"verbs"}, } labels["enclitics"] = { description = "{{{langname}}} clitics that attach to the preceding word.", parents = {"clitics"}, } labels["nouns with other-gender equivalents"] = { description = "{{{langname}}} nouns that refer to gendered concepts (e.g. [[actor]] vs. [[actress]], [[king]] vs. [[queen]]) and have corresponding other-gender equivalent terms.", parents = {"nouns"}, } labels["female equivalent nouns"] = { description = "{{{langname}}} nouns that refer to female beings with the same characteristics as the base noun.", parents = {"nouns with other-gender equivalents"}, } labels["neuter equivalent nouns"] = { description = "{{{langname}}} nouns that refer to neuter beings with the same characteristics as the base noun.", parents = {"nouns with other-gender equivalents"}, } labels["female equivalent suffixes"] = { description = "{{{langname}}} suffixes that refer to female beings with the same characteristics as the base suffix.", parents = {"noun-forming suffixes"}, } labels["focus adverbs"] = { description = "{{{langname}}} adverbs that indicate [[w:Focus (linguistics)|focus]] within the sentence.", parents = {"adverbs"}, } labels["frequency adverbs"] = { description = "{{{langname}}} adverbs that express repetition with a certain frequency or interval, such as (in English) [[monthly]], [[continually]] and [[once in a while]].", parents = {"time adverbs"}, } labels["frequentative verbs"] = { description = "{{{langname}}} verbs that express repeated action.", parents = {"imperfective verbs", "verbs"}, } labels["general pronouns"] = { description = "{{{langname}}} pronouns that refer to all persons, things, abstract ideas and their characteristics.", parents = {"pronouns"}, } labels["generational moieties"] = { description = "{{{langname}}} moieties that alternate every generation.", parents = {"moieties"}, } labels["ideophones"] = { description = "{{{langname}}} terms that evoke an idea, especially a sensation or impression, with a sound.", parents = {"lemmas"}, } labels["imperfective verbs"] = { description = "{{{langname}}} verbs that express actions considered as ongoing or continuous, as opposed to completed events.", parents = {"verbs"}, } labels["impersonal verbs"] = { description = "{{{langname}}} verbs that do not indicate actions, occurrences or states of any specific grammatical subject.", parents = {"verbs"}, } labels["inchoative verbs"] = { description = "{{{langname}}} verbs that indicate the beginning of an action or event.", parents = {"verbs"}, } labels["indefinite adjectives"] = { description = "{{{langname}}} adjectives that refer to unspecified adjective meanings.", parents = {"adjectives", {name = "indefinite pro-forms", sort = "adjectives"}}, } labels["indefinite adverbs"] = { description = "{{{langname}}} adverbs that refer to unspecified adverbial meanings.", parents = {"adverbs", {name = "indefinite pro-forms", sort = "adverbs"}}, } labels["indefinite determiners"] = { description = "{{{langname}}} determiners that designate an unidentified noun.", parents = {"determiners", {name = "indefinite pro-forms", sort = "determiners"}}, } labels["indefinite pronouns"] = { description = "{{{langname}}} pronouns that refer to unspecified nouns.", parents = {"pronouns", {name = "indefinite pro-forms", sort = "pronouns"}}, } labels["infixes"] = { description = "Affixes inserted inside {{{langname}}} words.", parents = {"morphemes"}, } labels["inflectional prefixes"] = { description = "{{{langname}}} prefixes that are used as inflectional beginnings in noun, adjective or verb paradigms.", parents = {"prefixes"}, } labels["inflectional suffixes"] = { description = "{{{langname}}} suffixes that are used as inflectional endings in noun, adjective or verb paradigms.", parents = {"suffixes"}, } labels["intensive verbs"] = { description = "{{{langname}}} verbs which indicate that an action is performed vigorously, enthusiastically, forcefully or to an otherwise enlarged extent.", parents = {"verbs"}, } labels["interfixes"] = { description = "Affixes used to join two {{{langname}}} words or morphemes together.", parents = {"morphemes"}, } labels["interjections"] = { description = "{{{langname}}} terms that express emotions, sounds, etc. as exclamations.", parents = {"lemmas"}, } labels["interrogative adjectives"] = { description = "{{{langname}}} adjectives that indicate questions.", parents = {"adjectives", {name = "interrogative pro-forms", sort = "adjectives"}}, } labels["interrogative adverbs"] = { description = "{{{langname}}} adverbs that indicate questions.", parents = {"adverbs", {name = "interrogative pro-forms", sort = "adverbs"}}, } labels["interrogative determiners"] = { description = "{{{langname}}} determiners that indicate questions.", parents = {"determiners", {name = "interrogative pro-forms", sort = "determiners"}}, } labels["interrogative particles"] = { description = "{{{langname}}} particles that indicate questions.", parents = {"particles", {name = "interrogative pro-forms", sort = "particles"}}, } labels["interrogative pronouns"] = { description = "{{{langname}}} pronouns that indicate questions.", parents = {"pronouns", {name = "interrogative pro-forms", sort = "pronouns"}}, } labels["intransitive verbs"] = { description = "{{{langname}}} verbs that don't require any grammatical objects.", parents = {"verbs"}, } labels["iterative verbs"] = { description = "{{{langname}}} verbs that express the repetition of an event.", parents = {"imperfective verbs", "verbs"}, } labels["location adverbs"] = { description = "{{{langname}}} adverbs that indicate location.", parents = {"adverbs"}, } labels["male equivalent nouns"] = { description = "{{{langname}}} nouns that refer to male beings with the same characteristics as the base noun.", parents = {"nouns with other-gender equivalents"}, } labels["manner adverbs"] = { description = "{{{langname}}} adverbs that indicate the manner, way or style in which an action is performed.", parents = {"adverbs"}, } labels["modal adverbs"] = { description = "{{{langname}}} adverbs that express [[w:Linguistic modality|linguistic modality]], indicating the mood or attitude of the speaker with respect to what is being said.", parents = {"sentence adverbs"}, } labels["modal particles"] = { description = "{{{langname}}} particles that reflect the mood or attitude of the speaker, without changing the basic meaning of the sentence.", parents = {"particles"}, } labels["modal verbs"] = { description = "{{{langname}}} verbs that indicate [[grammatical mood]].", parents = {"auxiliary verbs"}, } labels["moieties"] = { description = "{{{langname}}} pairs of abstract categories separating people and the environment.", parents = {"lemmas"}, } labels["momentane verbs"] = { description = "{{{langname}}} verbs that express a sudden and brief action.", parents = {"perfective verbs", "verbs"}, } labels["morphemes"] = { description = "{{{langname}}} word-elements used to form full words.", parents = {"lemmas"}, } labels["movement adverbs"] = { description = "{{{langname}}} adverbs that express movement in space, such as (in English) [[hither]], [[that way]], [[down]] and [[eastwards]].", additional = "Compare [[:Category:{{{langname}}} position adverbs]].", parents = {"location adverbs"}, umbrella = { additional = "Compare [[:Category:Position adverbs by language]].", }, } labels["multiword terms"] = { description = "{{{langname}}} lemmas that are a combination of multiple words, including [[WT:CFI#Idiomaticity|idiomatic]] combinations.", parents = {"lemmas"}, } labels["negative verbs"] = { description = "{{{langname}}} verbs that indicate the lack of an action.", parents = {"verbs"}, } labels["negative particles"] = { description = "{{{langname}}} particles that indicate negation.", parents = {"particles"}, } labels["negative pronouns"] = { description = "{{{langname}}} pronouns that refer to negative or non-existent references.", parents = {"pronouns"}, } labels["nominalized adjectives"] = { description = "{{{langname}}} adjectives that are used as nouns.", parents = {"nouns", "adjectives"}, } labels["nominalized present participles"] = { description = "{{{langname}}} present participles that are used as nouns.", parents = {"nouns", "present participles"}, } labels["non-constituents"] = { description = "{{{langname}}} terms that are not grammatical [[constituent#Noun|constituents]], and therefore need to be combined with additional terms to form a complete phrase.", parents = {"phrases"}, } labels["noun prefixes"] = { description = "{{{langname}}} prefixes attached to a noun that display its noun class.", parents = {"prefixes"}, } labels["nouns"] = { description = "{{{langname}}} terms that indicate people, beings, things, places, phenomena, qualities or ideas.", parents = {"lemmas"}, } labels["nouns by classifier"] = { description = "{{{langname}}} nouns organized by the classifier they are used with.", parents = {{name = "nouns", sort = "classifier"}}, } labels["numerals"] = { description = "{{{langname}}} terms that quantify nouns.", parents = {"lemmas"}, } labels["object concords"] = { description = "{{{langname}}} concords used to show the grammatical object.", parents = {"concords"}, } labels["object pronouns"] = { description = "{{{langname}}} pronouns that refer to grammatical objects.", parents = {"pronouns"}, } labels["particles"] = { description = "{{{langname}}} terms that do not belong to any of the inflected grammatical word classes, often lacking their own grammatical functions and forming other parts of speech or expressing the relationship between clauses.", parents = {"lemmas"}, } labels["perfective verbs"] = { description = "{{{langname}}} verbs that express actions considered as completed events, as opposed to ongoing or continuous.", parents = {"verbs"}, } labels["personal pronouns"] = { description = "{{{langname}}} pronouns that are used as substitutes for known nouns.", parents = {"pronouns"}, } labels["phrasal verbs"] = { description = "{{{langname}}} verbs accompanied by particles, such as prepositions and adverbs.", parents = {"verbs", "phrases"}, } labels["phrasal prepositions"] = { description = "{{{langname}}} prepositions formed with combinations of other terms.", parents = {"prepositions", "phrases"}, } labels["pluralia tantum"] = { description = "{{{langname}}} nouns that are mostly or exclusively used in the plural form.", parents = {"nouns"}, } labels["point-in-time adverbs"] = { description = "{{{langname}}} adverbs that reference a specific point in time, e.g. {{m|en|yesterday}}, {{m+|es|anoche||last night}} or {{m+|hu|egykor||at one o'clock}}.", parents = {"time adverbs"}, } labels["position adverbs"] = { description = "{{{langname}}} adverbs that express position in space, such as (in English) [[here]], [[next door]], [[cater-corner]] and [[on deck]].", additional = "Compare [[:Category:{{{langname}}} movement adverbs]].", parents = {"location adverbs"}, umbrella = { additional = "Compare [[:Category:Movement adverbs by language]].", }, } labels["possessable nouns"] = { description = "{{{langname}}} nouns that can have their possession indicated directly by possessive pronouns.", parents = {"nouns"}, umbrella = { description = "Categories with nouns that can have their possession indicated directly by possessive pronouns and, in some languages, be transformed into adjectives.", }, } labels["possessional adjectives"] = { description = "{{{langname}}} adjectives that indicate that a noun is in possession of something.", parents = {"adjectives"}, } labels["possessive adjectives"] = { description = "{{{langname}}} adjectives that indicate ownership.", parents = {"adjectives"}, } labels["possessive concords"] = { description = "{{{langname}}} concords used to show possession.", parents = {"concords"}, } labels["possessive determiners"] = { description = "{{{langname}}} determiners that indicate ownership.", parents = {"determiners"}, } labels["possessive pronouns"] = { description = "{{{langname}}} pronouns that indicate ownership.", parents = {"pronouns"}, } labels["postpositional phrases"] = { description = "{{{langname}}} phrases headed by a postposition.", parents = {"phrases", "postpositions"}, } labels["postpositions"] = { description = "{{{langname}}} adpositions that are placed after their objects.", parents = {"lemmas"}, } labels["predicatives"] = { description = "{{{langname}}} elements of the predicate that supplement the subject or object of a sentence via the verb.", parents = {"lemmas"}, } labels["prefixes"] = { description = "Affixes attached to the beginning of {{{langname}}} words.", parents = {"morphemes"}, } labels["prepositional phrases"] = { description = "{{{langname}}} phrases headed by a preposition.", parents = {"phrases", "prepositions"}, } labels["prepositions"] = { description = "{{{langname}}} adpositions that are placed before their objects.", parents = {"lemmas"}, } labels["matrilineal moieties"] = { description = "{{{langname}}} moieties inherited from an individual's mother.", parents = {"moieties"}, } labels["patrilineal moieties"] = { description = "{{{langname}}} moieties inherited from an individual's father.", parents = {"moieties"}, } labels["pejorative suffixes"] = { description = "{{{langname}}} suffixes that [[belittle]] (lessen in value).", parents = {"suffixes"}, } labels["prenouns"] = { description = "{{{langname}}} prefixes of various kinds that are attached to nouns.", parents = {"prefixes"}, } labels["preverbs"] = { description = "{{{langname}}} prefixes of various kinds that are attached to verbs.", parents = {"prefixes"}, } labels["privative verbs"] = { description = "{{{langname}}} verbs that indicate that the grammatical object is deprived of something or that something is removed from the object.", parents = {"verbs"}, } labels["pronominal adverbs"] = { description = "{{{langname}}} adverbs that are formed by combining a pronoun with a preposition.", parents = {"adverbs", "prepositions", "pronouns"}, } labels["pronominal concords"] = { description = "{{{langname}}} concords that are prefixed to pronominal stems.", parents = {"concords"}, } labels["pronouns"] = { description = "{{{langname}}} terms that refer to and substitute nouns.", parents = {"lemmas"}, } labels["proper nouns"] = { description = "{{{langname}}} nouns that indicate individual entities, such as names of persons, places or organizations.", parents = {"nouns"}, } labels["raising verbs"] = { description = "{{{langname}}} verbs that, in a matrix or main clause, take an argument from an embedded or subordinate clause; in other words, a raising verb appears with a syntactic argument that is not its semantic argument, but is rather the semantic argument of an embedded predicate.", parents = {"verbs"}, } labels["reciprocal pronouns"] = { description = "{{{langname}}} pronouns that refer back to a plural subject and express an action done in two or more directions.", parents = {"pronouns", "personal pronouns"}, } labels["reciprocal verbs"] = { description = "{{{langname}}} verbs that indicate actions, occurrences or states directed from multiple subjects to each other.", parents = {"verbs"}, } labels["reflexive pronouns"] = { description = "{{{langname}}} pronouns that refer back to the subject.", parents = {"pronouns", "personal pronouns"}, } labels["reflexive verbs"] = { description = "{{{langname}}} verbs that indicate actions, occurrences or states directed from the grammatical subjects to themselves.", parents = {"verbs"}, } labels["relational adjectives"] = { description = "{{{langname}}} adjectives that stand in place of a noun when modifying another noun.", parents = {"adjectives"}, } labels["relational nouns"] = { description = "{{{langname}}} nouns used to indicate a relation between other two nouns by means of possession.", parents = {"nouns"}, } labels["relative adjectives"] = { description = "{{{langname}}} adjectives used to indicate [[relative clause]]s.", parents = {"adjectives", {name = "relative pro-forms", sort = "adjectives"}}, } labels["relative adverbs"] = { description = "{{{langname}}} adverbs used to indicate [[relative clause]]s.", parents = {"adverbs", {name = "relative pro-forms", sort = "adverbs"}}, } labels["relative determiners"] = { description = "{{{langname}}} determiners used to indicate [[relative clause]]s.", parents = {"determiners", {name = "relative pro-forms", sort = "determiners"}}, } labels["relative concords"] = { description = "{{{langname}}} concords that are prefixed to relative stems.", parents = {"concords"}, } labels["relative pronouns"] = { description = "{{{langname}}} pronouns used to indicate [[relative clause]]s.", parents = {"pronouns", {name = "relative pro-forms", sort = "pronouns"}}, } labels["relatives"] = { description = "{{{langname}}} terms that give attributes to nouns, acting grammatically as relative clauses.", parents = {"lemmas"}, } labels["repetitive verbs"] = { description = "{{{langname}}} verbs that indicate actions or events which are performed or occur again, anew or differently.", parents = {"verbs"}, } labels["resultative verbs"] = { description = "{{{langname}}} verbs that indicate a result of some action", parents = {"verbs"}, } labels["reversative verbs"] = { description = "{{{langname}}} verbs that indicate that the reversal or undoing of an action, event or state.", parents = {"verbs"}, } labels["saturative verbs"] = { description = "{{{langname}}} verbs which indicate that an action is performed to the point of saturation or satisfaction.", parents = {"verbs"}, } labels["semelfactive verbs"] = { description = "{{{langname}}} verbs that are punctual (instantaneous, momentive), perfective (treated as a unitary whole with no explicit internal temporal structure), and telic (having a boundary out of which the activity cannot be said to have taken place or continue).", parents = {"perfective verbs", "verbs"}, } labels["sentence adverbs"] = { description = "{{{langname}}} adverbs that modify an entire clause or sentence.", parents = {"adverbs"}, } labels["sequence adverbs"] = { description = "{{{langname}}} conjunctive adverbs that express sequence in space or time.", parents = {"conjunctive adverbs"}, } labels["simulfixes"] = { description = "Affixes replacing positions in {{{langname}}} words.", parents = {"morphemes"}, } labels["singulative nouns"] = { description = "{{{langname}}} nouns that indicate a single item of a group of related things or beings.", parents = {"nouns"}, } labels["singularia tantum"] = { description = "{{{langname}}} nouns that are mostly or exclusively used in the singular form.", parents = {"nouns"}, } labels["solitary pronouns"] = { description = "{{{langname}}} pronouns that refer to specific people in particular and sets them apart from anyone else.", parents = {"pronouns", "personal pronouns"}, } labels["stative verbs"] = { description = "{{{langname}}} verbs that define a state with no or insignificant internal dynamics.", parents = {"verbs"}, } labels["stems"] = { description = "Morphemes from which {{{langname}}} words are formed.", parents = {"morphemes"}, } labels["subordinating conjunctions"] = { description = "{{{langname}}} conjunctions that indicate relations of syntactic dependence between connected items.", parents = {"conjunctions"}, } labels["subject concords"] = { description = "{{{langname}}} concords used to show the grammatical subject.", parents = {"concords"}, } labels["subject pronouns"] = { description = "{{{langname}}} pronouns that refer to grammatical subjects.", parents = {"pronouns"}, } labels["suffixes"] = { description = "Affixes attached to the end of {{{langname}}} words.", parents = {"morphemes"}, } labels["splitting verbs"] = { description = "{{{langname}}} bisyllabic verbs that obligatorily split around a direct object or pronoun.", parents = {"verbs"}, } labels["terminative verbs"] = { description = "{{{langname}}} verbs that indicate that an action or event ceases.", parents = {"verbs"}, } labels["time adverbs"] = { description = "{{{langname}}} adverbs that indicate time, expressing either [[duration]], [[frequency]] or a [[point]] in [[time]].", parents = {"adverbs"}, } labels["transfixes"] = { description = "Discontinuous affixes inserted within a word root.", parents = {"morphemes"}, } labels["transformative verbs"] = { description = "{{{langname}}} verbs that indicate a change of state or nature, in the subject for intransitive verbs and in the object for transitive verbs.", parents = {"verbs"}, } labels["transitive verbs"] = { description = "{{{langname}}} verbs that indicate actions, occurrences or states directed to one or more grammatical objects.", parents = {"verbs"}, } labels["uncomparable adjectives"] = { description = "{{{langname}}} adjectives that are not inflected to display different degrees of comparison.", parents = {"adjectives"}, } labels["uncomparable adverbs"] = { description = "{{{langname}}} adverbs that are not inflected to display different degrees of comparison.", parents = {"adverbs"}, } labels["uncountable nouns"] = { description = "{{{langname}}} nouns that indicate qualities, ideas, unbounded mass or other abstract concepts that cannot be quantified directly by numerals.", parents = {"nouns"}, } labels["uncountable numerals"] = { description = "{{{langname}}} numerals that cannot be quantified directly by other numerals.", parents = {"numerals"}, } labels["uncountable proper nouns"] = { description = "{{{langname}}} proper nouns that cannot be quantified directly by numerals.", parents = {"proper nouns"}, } labels["uncountable suffixes"] = { description = "{{{langname}}} suffixes that can be used to form nouns that cannot be quantified directly by numerals.", parents = {"suffixes"}, } labels["unpossessable nouns"] = { description = "{{{langname}}} nouns that cannot have their possession indicated directly by possessive pronouns.", parents = {"nouns"}, umbrella = { description = "Categories with nouns that cannot have their possession indicated directly by possessive pronouns or, in some languages, be transformed into adjectives.", }, } labels["verbal nouns"] = { description = "{{{langname}}} nouns morphologically related to a verb and similar to it in meaning.", parents = {"nouns"}, } labels["verbal adjectives"] = { description = "{{{langname}}} adjectives describing the condition or state resulting from the action of the corresponding verb.", parents = {"adjectives"}, } ----------------------------------------------------------------------------- labels["verbs"] = { description = "{{{langname}}} terms that indicate actions, occurrences or states.", parents = {"lemmas"}, } for _, voice in pairs{ "active", "middle", "passive", } do labels[voice .. " verbs"] = { description = "{{{langname}}} verbs that are predominantly used in the {{w|" .. voice .. " voice}}.", parents = {"verbs"}, } local voice_only = voice .. "-only" labels[voice_only .. " verbs"] = { breadcrumb = voice_only, description = "{{{langname}}} verbs that can only be used in the {{w|" .. voice .. " voice}}.", parents = {voice .. " verbs", "verbs"}, } end labels["verbs of movement"] = { description = "{{{langname}}} verbs that indicate physical movement of the grammatical subject across a trajectory, with a starting point and an endpoint.", parents = {"verbs"}, } ----------------------------------------------------------------------------- for pos, desc in pairs{ ["prepositions"] = "following", ["postpositions"] = "preceding" } do for _, case in ipairs{ "ablative", "accusative", "dative", "genitive", "instrumental", "locative", "nominative", "prepositional", "vocative", } do labels[pos .. " governing the " .. case] = { breadcrumb = ucfirst(case), description = ("{{{langname}}} %s that cause the %s noun to be in the %s case."):format(pos, desc, case), parents = {pos}, } end end -- Add "X-only categories for degrees. for _, pos in pairs{ "adjectives", "adverbs", "determiners", "pronouns", } do for _, degree in pairs{ "comparative", "superlative", "elative", "exaggerated", "excessive", "equative", } do local degree_only = degree .. "-only" labels[degree_only .. " " .. pos] = { breadcrumb = degree_only, description = "{{{langname}}} " .. pos .. " that are only used in the " .. degree .. " degree.", parents = {pos}, } end end -- Add "POS-forming suffixes". for _, pos in pairs{ "adjective", "adverb", "noun", "numeral", "participle", "pronoun", "proper noun", "verb", } do labels[pos .. "-forming suffixes"] = { description = "{{{langname}}} suffixes that are used to derive " .. pos .. "s from other words.", parents = {"derivational suffixes"}, } end -- Add 'umbrella_parents' key if not already present. for key, data in pairs(labels) do if not data.umbrella_parents then data.umbrella_parents = "Lemmas subcategories by language" end end ----------------------------------------------------------------------------- -- -- -- RAW CATEGORIES -- -- -- ----------------------------------------------------------------------------- raw_categories["Lemmas subcategories by language"] = { description = "Umbrella categories covering topics related to lemmas.", additional = "{{{umbrella_meta_msg}}}", parents = { "Umbrella metacategories", {name = "lemmas", is_label = true, sort = " "}, }, } ----------------------------------------------------------------------------- -- -- -- HANDLERS -- -- -- ----------------------------------------------------------------------------- -- Handler for e.g. [[:Category:English phrasal verbs formed with "aback"]]. table.insert(handlers, function(data) local particle = data.label:match("^phrasal verbs formed with \"(.-)\"$") if particle then local tagged_text = require("Module:script utilities").tag_text(particle, data.lang, nil, "term") local link = require("Module:links").full_link({ term = particle, lang = data.lang }, "term") return { description = "{{{langname}}} {{w|phrasal verb}}s formed with the adverb or preposition " .. link .. ".", displaytitle = '{{{langname}}} phrasal verbs formed with "' .. particle .. '"', breadcrumb = tagged_text, parents = {{ name = "phrasal verbs", sort = particle }}, umbrella = false, } end end) return {LABELS = labels, RAW_CATEGORIES = raw_categories, HANDLERS = handlers} m71et4r44t927l9rcq6ntu20wlgkf10 मॉड्यूल:category tree/lemmas 828 306965 487820 2026-09-02T19:24:51Z SM7 6218 SM7 ने पृष्ठ [[मॉड्यूल:category tree/lemmas]] को [[मॉड्यूल:category tree/लेम्मा]] पर स्थानांतरित किया 487820 Scribunto text/plain return require [[मॉड्यूल:category tree/लेम्मा]] j8wt9eokef7m2zzpx9itaykjnw3rp5a मॉड्यूल:category tree/नाम 828 306966 487821 2026-09-02T19:26:38Z SM7 6218 अंग्रेजी विक्षनरी से आयातित 487821 Scribunto text/plain local labels = {} local raw_categories = {} local handlers = {} local names_module = "Module:names" local en_utilities_module = "Module:en-utilities" local pluralize = require(en_utilities_module).pluralize ----------------------------------------------------------------------------- -- -- -- LABELS -- -- -- ----------------------------------------------------------------------------- labels["names"] = { description = "{{{langname}}} terms that are used to refer to specific individuals or groups.", additional = "Place names, demonyms and other kinds of names can be found in [[:Category:Names]].", umbrella_parents = {name = "terms by semantic function", is_label = true, sort = " "}, parents = {"terms by semantic function", "proper nouns"}, } ------------------------------------------- given names ------------------------------------------- local human_genders = { ["male"] = "to male individuals", ["female"] = "to female individuals", ["unisex"] = "either to male or to female individuals", } for gender, props in pairs(require(names_module).given_name_genders) do if gender ~= "unknown-gender" then local is_animal = props.type == "animal" local cat = is_animal and gender .. " names" or gender .. " given names" local desc = is_animal and " given to [[" .. gender .. "|" .. pluralize(gender) .. "]]" or " given " .. human_genders[gender] local function do_cat(cat, desc, breadcrumb, parents) labels[cat] = { description = "{{{langname}}} " .. desc .. ".", breadcrumb = breadcrumb, parents = parents, } end for _, dimaug in ipairs { "diminutive", "augmentative" } do do_cat(dimaug .. "s of " .. cat, dimaug .. " names " .. desc, dimaug, {gender .. " given names", dimaug .. " nouns"}) end do_cat(cat, "names " .. desc, gender, is_animal and (gender == "animal" and "names" or is_animal and "animal names") or "given names") if not is_animal then do_cat(gender .. " skin names", "skin names " .. desc, gender, {"skin names"}) end end end labels["given names"] = { description = "{{{langname}}} names given to individuals.", parents = {"names"}, } labels["skin names"] = { description = "{{{langname}}} terms given at birth that are used to refer to individuals from specific marital classes.", parents = {"proper nouns", "names"}, } ------------------------------------------- surnames ------------------------------------------- labels["common-gender surnames"] = { description = "{{{langname}}} names shared by both male and female family members, in languages that distinguish male and female surnames.", breadcrumb = "common-gender", parents = {"surnames"}, } labels["female surnames"] = { description = "{{{langname}}} names shared by female family members.", breadcrumb = "female", parents = {"surnames"}, } labels["male surnames"] = { description = "{{{langname}}} names shared by male family members.", breadcrumb = "male", parents = {"surnames"}, } labels["surnames"] = { description = "{{{langname}}} names shared by family members.", parents = {"names"}, } for _, nymics in ipairs { "matronymics", "patronymics" } do local ancestor = nymics == "matronymics" and "mother, grandmother or earlier female ancestor" or "father, grandfather or earlier male ancestor" labels["common-gender " .. nymics] = { description = ("{{{langname}}} names used by both men and women to indicate their %s, in languages that distinguish male and female %s."): format(ancestor, nymics), breadcrumb = "common-gender", parents = {nymics}, } labels["female " .. nymics] = { description = ("{{{langname}}} names used by women to indicate their %s."): format(ancestor, nymics), breadcrumb = "female", parents = {nymics}, } labels["male " .. nymics] = { description = ("{{{langname}}} names used by men to indicate their %s."): format(ancestor, nymics), breadcrumb = "male", parents = {nymics}, } labels[nymics] = { description = ("{{{langname}}} names indicating a person's %s."):format(ancestor), parents = {"names"}, } end labels["nomina gentilia"] = { description = "{{{langname}}} \"[[family name]]s\" (singular ''[[nomen gentile]]'') in a [[w:Roman naming convention|convential Roman name]].", parents = {"names"}, } ------------------------------------------- misc ------------------------------------------- labels["exonyms"] = { description = "{{{langname}}} [[exonym]]s, i.e. terms for toponyms whose name in {{{langname}}} is different from the name in the source language.", parents = {"names"}, } labels["renderings of foreign personal names"] = { description = "{{{langname}}} transliterations, respellings or other renderings of foreign personal names.", parents = {"names"}, } -- Add 'umbrella_parents' key if not already present. for key, data in pairs(labels) do if not data.umbrella_parents then data.umbrella_parents = "Names subcategories by language" end end ----------------------------------------------------------------------------- -- -- -- RAW CATEGORIES -- -- -- ----------------------------------------------------------------------------- raw_categories["Names subcategories by language"] = { description = "Umbrella categories covering topics related to names.", additional = "{{{umbrella_meta_msg}}}", parents = { "Umbrella metacategories", {name = "names", is_label = true, sort = " "}, }, } ----------------------------------------------------------------------------- -- -- -- HANDLERS -- -- -- ----------------------------------------------------------------------------- local function source_name_to_source(nametype, source_name) local special_sources if nametype:find("given names") then special_sources = require("Module:table").listToSet { "surnames", "place names", "coinages", "the Bible", "month names" } elseif nametype:find("surnames") then special_sources = require("Module:table").listToSet { "given names", "place names", "occupations", "patronymics", "matronymics", "common nouns", "nicknames", "ethnonyms" } else special_sources = {} end if special_sources[source_name] then return source_name else return require("Module:languages").getByCanonicalName(source_name, nil, "allow etym langs", "allow families") end end local function get_source_text(source) if type(source) == "table" then return source:getDisplayForm() else return source end end local function get_description(lang, nametype, source) local origintext, addltext if source == "surnames" then origintext = "transferred from surnames" elseif source == "given names" then origintext = "transferred from given names" elseif source == "nicknames" then origintext = "transferred from nicknames" elseif source == "place names" then origintext = "transferred from place names" addltext = " For place names that are also surnames, see " .. ( lang and "[[:Category:{{{langname}}} " .. nametype .. " from surnames]]" or "[[:Category:" .. mw.getContentLanguage():ucfirst(nametype) .. " from surnames by language]]" ) .. "." elseif source == "common nouns" then origintext = "transferred from common nouns" elseif source == "month names" then origintext = "transferred from month names" elseif source == "coinages" then origintext = "originating as coinages" addltext = " These are names of artificial origin, names based on fictional characters, combinations of two words or names or backward spellings. Names of uncertain origin can also be placed here if there is a strong suspicion that they are coinages." elseif source == "occupations" then origintext = "originating as occupations" elseif source == "patronymics" then origintext = "originating as patronymics" elseif source == "matronymics" then origintext = "originating as matronymics" elseif source == "ethnonyms" then origintext = "originating as ethnonyms" elseif source == "the Bible" then -- Hack esp. for Hawaiian names. We should consider changing them to -- have the source as Biblical Hebrew and mention the derivation from -- the Bible some other way. origintext = "originating from the Bible" elseif type(source) == "string" then error("Internal error: Unrecognized string source \"" .. source .. "\", should be special-cased") else origintext = "of " .. source:makeCategoryLink() .. " origin" if lang and source:getCode() == lang:getCode() then addltext = " These are names derived from common nouns, local mythology, etc." end end local introtext if lang then introtext = "{{{langname}}} " else introtext = "Categories with " end return introtext .. nametype .. " " .. origintext .. ". (This includes names derived at an older stage of the language.)" .. (addltext or "") end -- If one of the following families occurs in any of the ancestral families -- of a given language, use it instead of the three-letter parent -- (or immediate parent if no three-letter parent). local high_level_families = require("Module:table").listToSet { -- Indo-European "gem", -- Germanic (for gme, gmq, gmw) "inc", -- Indic (for e.g. pra = Prakrit) "ine-ana", -- Anatolian (don't keep going to ine) "ine-toc", -- Tocharian (don't keep going to ine) "ira", -- Iranian (for e.g. xme = Median, xsc = Scythian) "sla", -- Slavic (for zle, zls, zlw) -- Other "ath", -- Athabaskan (for e.g. apa = Apachean) "poz", -- Malayo-Polynesian (for e.g. pqe = Eastern Malayo-Polynesian) "cau-nwc", -- Northwest Caucasian "cau-nec", -- Northeast Caucasian } local function find_high_level_family(lang) local family = lang:getFamily() -- (1) If no family, return nil (e.g. for Pictish). if not family then return nil end -- (2) See if any ancestor family is in `high_level_families`. -- if so, return it. local high_level_family = family while high_level_family do local high_level_code = high_level_family:getCode() if high_level_code == "qfa-not" then -- "not a family"; its own parent, causing an infinite loop. -- Break rather than return so we get categories like -- [[Category:English female given names from sign languages]] and -- [[Category:English female given names from constructed languages]]. break end if high_level_families[high_level_code] then return high_level_family end high_level_family = high_level_family:getFamily() end -- (3) If the family is of the form 'FOO-BAR', see if 'FOO' is a family. -- If so, return it. local basic_family = family:getCode():match("^(.-)%-.*$") if basic_family then basic_family = require("Module:families").getByCode(basic_family) if basic_family then return basic_family end end -- (4) Fall back to just the family itself. return family end local function match_gendered_nametype(nametype) local gender, label = nametype:match("^(f?e?male) (given names)$") if not gender then gender, label = nametype:match("^(unisex) (given names)$") end if gender then return gender, label end end local function get_parents(lang, nametype, source) local parents = {} if lang then table.insert(parents, {name = nametype, sort = get_source_text(source)}) if type(source) == "table" then table.insert(parents, {name = "terms derived from " .. source:getDisplayForm(), sort = " "}) -- If the source is a regular language, put it in a parent category for the high-level language family, e.g. for -- "Russian female given names from German", put it in a parent category "Russian female given names from Germanic languages" -- (skipping over West Germanic languages). -- -- If the source is an etymology language, put it in a parent category for the parent full language, e.g. for -- "French male given names from Gascon", put it in a parent category "French male given names from Occitan". -- -- If the source is a family, put it in a parent category for the parent family. if source:hasType("family") then local parent_family = source:getFamily() if parent_family and parent_family:getCode() ~= "qfa-not" then table.insert(parents, { name = nametype .. " from " .. parent_family:getDisplayForm(), sort = source:getCanonicalName() }) end elseif source:hasType("etymology-only") then local source_parent = source:getFull() if source_parent and source_parent:getCode() ~= "und" then table.insert(parents, { name = nametype .. " from " .. source_parent:getDisplayForm(), sort = source:getCanonicalName() }) end else local high_level_family = find_high_level_family(source) if high_level_family then -- may not exist, e.g. for Pictish table.insert(parents, {name = nametype .. " from " .. high_level_family:getDisplayForm(), sort = source:getCanonicalName() }) end end end local gender, label = match_gendered_nametype(nametype) if gender then table.insert(parents, {name = label .. " from " .. get_source_text(source), sort = gender}) end else local gender, label = match_gendered_nametype(nametype) if gender then table.insert(parents, {name = label .. " from " .. get_source_text(source), is_label = true, sort = " "}) elseif type(source) == "table" then -- FIXME! This is duplicated in [[Module:category tree/etymology]] in the handler for umbrella categories -- 'Terms derived from SOURCE'. local first_umbrella_parent = source:hasType("family") and {name = source:getCategoryName(), raw = true, sort = " "} or source:hasType("etymology-only") and {name = "Category:" .. source:getCategoryName(), sort = nametype} or {name = source:getCategoryName(), raw = true, sort = nametype} table.insert(parents, first_umbrella_parent) end table.insert(parents, "Names subcategories by language") end return parents end table.insert(handlers, function(data) local nametype, source_name = data.label:match("^(.*names) from (.+)$") if nametype then local personal_name_type_set = require(names_module).personal_name_type_set if not personal_name_type_set[nametype] then return nil end local source = source_name_to_source(nametype, source_name) if not source then return nil end return { description = get_description(data.lang, nametype, source), breadcrumb = "from " .. get_source_text(source), parents = get_parents(data.lang, nametype, source), umbrella = { description = get_description(nil, nametype, source), parents = get_parents(nil, nametype, source), }, } end end) -- Handler for e.g. 'English renderings of Russian male given names'. table.insert(handlers, function(data) local label = data.label:match("^renderings of (.*)$") if label then local personal_name_types = require(names_module).personal_name_types for _, nametype in ipairs(personal_name_types) do local sourcename = label:match("^(.+) " .. nametype .. "$") if sourcename then local source = require("Module:languages").getByCanonicalName(sourcename, nil, "allow etym") if source then return { description = "Transliterations, respellings or other renderings of " .. source:makeCategoryLink() .. " " .. nametype .. " into {{{langdisp}}}.", lang = data.lang, breadcrumb = sourcename .. " " .. nametype, parents = { { name = "renderings of foreign personal names", sort = sourcename }, { name = nametype, lang = source:getCode(), sort = "{{{langname}}}" }, }, umbrella = { description = "Transliterations, respellings or other renderings of " .. source:makeCategoryLink() .. " " .. nametype .. " into various languages.", parents = {{name = "renderings of foreign personal names", is_label = true, sort = label}}, }, } end end end end end) return {LABELS = labels, RAW_CATEGORIES = raw_categories, HANDLERS = handlers} nka9xy2he55k31c1lpud70iamgc4u5s 487822 487821 2026-09-02T19:26:48Z SM7 6218 SM7 ने पृष्ठ [[मॉड्यूल:category tree/names]] को [[मॉड्यूल:category tree/नाम]] पर स्थानांतरित किया 487821 Scribunto text/plain local labels = {} local raw_categories = {} local handlers = {} local names_module = "Module:names" local en_utilities_module = "Module:en-utilities" local pluralize = require(en_utilities_module).pluralize ----------------------------------------------------------------------------- -- -- -- LABELS -- -- -- ----------------------------------------------------------------------------- labels["names"] = { description = "{{{langname}}} terms that are used to refer to specific individuals or groups.", additional = "Place names, demonyms and other kinds of names can be found in [[:Category:Names]].", umbrella_parents = {name = "terms by semantic function", is_label = true, sort = " "}, parents = {"terms by semantic function", "proper nouns"}, } ------------------------------------------- given names ------------------------------------------- local human_genders = { ["male"] = "to male individuals", ["female"] = "to female individuals", ["unisex"] = "either to male or to female individuals", } for gender, props in pairs(require(names_module).given_name_genders) do if gender ~= "unknown-gender" then local is_animal = props.type == "animal" local cat = is_animal and gender .. " names" or gender .. " given names" local desc = is_animal and " given to [[" .. gender .. "|" .. pluralize(gender) .. "]]" or " given " .. human_genders[gender] local function do_cat(cat, desc, breadcrumb, parents) labels[cat] = { description = "{{{langname}}} " .. desc .. ".", breadcrumb = breadcrumb, parents = parents, } end for _, dimaug in ipairs { "diminutive", "augmentative" } do do_cat(dimaug .. "s of " .. cat, dimaug .. " names " .. desc, dimaug, {gender .. " given names", dimaug .. " nouns"}) end do_cat(cat, "names " .. desc, gender, is_animal and (gender == "animal" and "names" or is_animal and "animal names") or "given names") if not is_animal then do_cat(gender .. " skin names", "skin names " .. desc, gender, {"skin names"}) end end end labels["given names"] = { description = "{{{langname}}} names given to individuals.", parents = {"names"}, } labels["skin names"] = { description = "{{{langname}}} terms given at birth that are used to refer to individuals from specific marital classes.", parents = {"proper nouns", "names"}, } ------------------------------------------- surnames ------------------------------------------- labels["common-gender surnames"] = { description = "{{{langname}}} names shared by both male and female family members, in languages that distinguish male and female surnames.", breadcrumb = "common-gender", parents = {"surnames"}, } labels["female surnames"] = { description = "{{{langname}}} names shared by female family members.", breadcrumb = "female", parents = {"surnames"}, } labels["male surnames"] = { description = "{{{langname}}} names shared by male family members.", breadcrumb = "male", parents = {"surnames"}, } labels["surnames"] = { description = "{{{langname}}} names shared by family members.", parents = {"names"}, } for _, nymics in ipairs { "matronymics", "patronymics" } do local ancestor = nymics == "matronymics" and "mother, grandmother or earlier female ancestor" or "father, grandfather or earlier male ancestor" labels["common-gender " .. nymics] = { description = ("{{{langname}}} names used by both men and women to indicate their %s, in languages that distinguish male and female %s."): format(ancestor, nymics), breadcrumb = "common-gender", parents = {nymics}, } labels["female " .. nymics] = { description = ("{{{langname}}} names used by women to indicate their %s."): format(ancestor, nymics), breadcrumb = "female", parents = {nymics}, } labels["male " .. nymics] = { description = ("{{{langname}}} names used by men to indicate their %s."): format(ancestor, nymics), breadcrumb = "male", parents = {nymics}, } labels[nymics] = { description = ("{{{langname}}} names indicating a person's %s."):format(ancestor), parents = {"names"}, } end labels["nomina gentilia"] = { description = "{{{langname}}} \"[[family name]]s\" (singular ''[[nomen gentile]]'') in a [[w:Roman naming convention|convential Roman name]].", parents = {"names"}, } ------------------------------------------- misc ------------------------------------------- labels["exonyms"] = { description = "{{{langname}}} [[exonym]]s, i.e. terms for toponyms whose name in {{{langname}}} is different from the name in the source language.", parents = {"names"}, } labels["renderings of foreign personal names"] = { description = "{{{langname}}} transliterations, respellings or other renderings of foreign personal names.", parents = {"names"}, } -- Add 'umbrella_parents' key if not already present. for key, data in pairs(labels) do if not data.umbrella_parents then data.umbrella_parents = "Names subcategories by language" end end ----------------------------------------------------------------------------- -- -- -- RAW CATEGORIES -- -- -- ----------------------------------------------------------------------------- raw_categories["Names subcategories by language"] = { description = "Umbrella categories covering topics related to names.", additional = "{{{umbrella_meta_msg}}}", parents = { "Umbrella metacategories", {name = "names", is_label = true, sort = " "}, }, } ----------------------------------------------------------------------------- -- -- -- HANDLERS -- -- -- ----------------------------------------------------------------------------- local function source_name_to_source(nametype, source_name) local special_sources if nametype:find("given names") then special_sources = require("Module:table").listToSet { "surnames", "place names", "coinages", "the Bible", "month names" } elseif nametype:find("surnames") then special_sources = require("Module:table").listToSet { "given names", "place names", "occupations", "patronymics", "matronymics", "common nouns", "nicknames", "ethnonyms" } else special_sources = {} end if special_sources[source_name] then return source_name else return require("Module:languages").getByCanonicalName(source_name, nil, "allow etym langs", "allow families") end end local function get_source_text(source) if type(source) == "table" then return source:getDisplayForm() else return source end end local function get_description(lang, nametype, source) local origintext, addltext if source == "surnames" then origintext = "transferred from surnames" elseif source == "given names" then origintext = "transferred from given names" elseif source == "nicknames" then origintext = "transferred from nicknames" elseif source == "place names" then origintext = "transferred from place names" addltext = " For place names that are also surnames, see " .. ( lang and "[[:Category:{{{langname}}} " .. nametype .. " from surnames]]" or "[[:Category:" .. mw.getContentLanguage():ucfirst(nametype) .. " from surnames by language]]" ) .. "." elseif source == "common nouns" then origintext = "transferred from common nouns" elseif source == "month names" then origintext = "transferred from month names" elseif source == "coinages" then origintext = "originating as coinages" addltext = " These are names of artificial origin, names based on fictional characters, combinations of two words or names or backward spellings. Names of uncertain origin can also be placed here if there is a strong suspicion that they are coinages." elseif source == "occupations" then origintext = "originating as occupations" elseif source == "patronymics" then origintext = "originating as patronymics" elseif source == "matronymics" then origintext = "originating as matronymics" elseif source == "ethnonyms" then origintext = "originating as ethnonyms" elseif source == "the Bible" then -- Hack esp. for Hawaiian names. We should consider changing them to -- have the source as Biblical Hebrew and mention the derivation from -- the Bible some other way. origintext = "originating from the Bible" elseif type(source) == "string" then error("Internal error: Unrecognized string source \"" .. source .. "\", should be special-cased") else origintext = "of " .. source:makeCategoryLink() .. " origin" if lang and source:getCode() == lang:getCode() then addltext = " These are names derived from common nouns, local mythology, etc." end end local introtext if lang then introtext = "{{{langname}}} " else introtext = "Categories with " end return introtext .. nametype .. " " .. origintext .. ". (This includes names derived at an older stage of the language.)" .. (addltext or "") end -- If one of the following families occurs in any of the ancestral families -- of a given language, use it instead of the three-letter parent -- (or immediate parent if no three-letter parent). local high_level_families = require("Module:table").listToSet { -- Indo-European "gem", -- Germanic (for gme, gmq, gmw) "inc", -- Indic (for e.g. pra = Prakrit) "ine-ana", -- Anatolian (don't keep going to ine) "ine-toc", -- Tocharian (don't keep going to ine) "ira", -- Iranian (for e.g. xme = Median, xsc = Scythian) "sla", -- Slavic (for zle, zls, zlw) -- Other "ath", -- Athabaskan (for e.g. apa = Apachean) "poz", -- Malayo-Polynesian (for e.g. pqe = Eastern Malayo-Polynesian) "cau-nwc", -- Northwest Caucasian "cau-nec", -- Northeast Caucasian } local function find_high_level_family(lang) local family = lang:getFamily() -- (1) If no family, return nil (e.g. for Pictish). if not family then return nil end -- (2) See if any ancestor family is in `high_level_families`. -- if so, return it. local high_level_family = family while high_level_family do local high_level_code = high_level_family:getCode() if high_level_code == "qfa-not" then -- "not a family"; its own parent, causing an infinite loop. -- Break rather than return so we get categories like -- [[Category:English female given names from sign languages]] and -- [[Category:English female given names from constructed languages]]. break end if high_level_families[high_level_code] then return high_level_family end high_level_family = high_level_family:getFamily() end -- (3) If the family is of the form 'FOO-BAR', see if 'FOO' is a family. -- If so, return it. local basic_family = family:getCode():match("^(.-)%-.*$") if basic_family then basic_family = require("Module:families").getByCode(basic_family) if basic_family then return basic_family end end -- (4) Fall back to just the family itself. return family end local function match_gendered_nametype(nametype) local gender, label = nametype:match("^(f?e?male) (given names)$") if not gender then gender, label = nametype:match("^(unisex) (given names)$") end if gender then return gender, label end end local function get_parents(lang, nametype, source) local parents = {} if lang then table.insert(parents, {name = nametype, sort = get_source_text(source)}) if type(source) == "table" then table.insert(parents, {name = "terms derived from " .. source:getDisplayForm(), sort = " "}) -- If the source is a regular language, put it in a parent category for the high-level language family, e.g. for -- "Russian female given names from German", put it in a parent category "Russian female given names from Germanic languages" -- (skipping over West Germanic languages). -- -- If the source is an etymology language, put it in a parent category for the parent full language, e.g. for -- "French male given names from Gascon", put it in a parent category "French male given names from Occitan". -- -- If the source is a family, put it in a parent category for the parent family. if source:hasType("family") then local parent_family = source:getFamily() if parent_family and parent_family:getCode() ~= "qfa-not" then table.insert(parents, { name = nametype .. " from " .. parent_family:getDisplayForm(), sort = source:getCanonicalName() }) end elseif source:hasType("etymology-only") then local source_parent = source:getFull() if source_parent and source_parent:getCode() ~= "und" then table.insert(parents, { name = nametype .. " from " .. source_parent:getDisplayForm(), sort = source:getCanonicalName() }) end else local high_level_family = find_high_level_family(source) if high_level_family then -- may not exist, e.g. for Pictish table.insert(parents, {name = nametype .. " from " .. high_level_family:getDisplayForm(), sort = source:getCanonicalName() }) end end end local gender, label = match_gendered_nametype(nametype) if gender then table.insert(parents, {name = label .. " from " .. get_source_text(source), sort = gender}) end else local gender, label = match_gendered_nametype(nametype) if gender then table.insert(parents, {name = label .. " from " .. get_source_text(source), is_label = true, sort = " "}) elseif type(source) == "table" then -- FIXME! This is duplicated in [[Module:category tree/etymology]] in the handler for umbrella categories -- 'Terms derived from SOURCE'. local first_umbrella_parent = source:hasType("family") and {name = source:getCategoryName(), raw = true, sort = " "} or source:hasType("etymology-only") and {name = "Category:" .. source:getCategoryName(), sort = nametype} or {name = source:getCategoryName(), raw = true, sort = nametype} table.insert(parents, first_umbrella_parent) end table.insert(parents, "Names subcategories by language") end return parents end table.insert(handlers, function(data) local nametype, source_name = data.label:match("^(.*names) from (.+)$") if nametype then local personal_name_type_set = require(names_module).personal_name_type_set if not personal_name_type_set[nametype] then return nil end local source = source_name_to_source(nametype, source_name) if not source then return nil end return { description = get_description(data.lang, nametype, source), breadcrumb = "from " .. get_source_text(source), parents = get_parents(data.lang, nametype, source), umbrella = { description = get_description(nil, nametype, source), parents = get_parents(nil, nametype, source), }, } end end) -- Handler for e.g. 'English renderings of Russian male given names'. table.insert(handlers, function(data) local label = data.label:match("^renderings of (.*)$") if label then local personal_name_types = require(names_module).personal_name_types for _, nametype in ipairs(personal_name_types) do local sourcename = label:match("^(.+) " .. nametype .. "$") if sourcename then local source = require("Module:languages").getByCanonicalName(sourcename, nil, "allow etym") if source then return { description = "Transliterations, respellings or other renderings of " .. source:makeCategoryLink() .. " " .. nametype .. " into {{{langdisp}}}.", lang = data.lang, breadcrumb = sourcename .. " " .. nametype, parents = { { name = "renderings of foreign personal names", sort = sourcename }, { name = nametype, lang = source:getCode(), sort = "{{{langname}}}" }, }, umbrella = { description = "Transliterations, respellings or other renderings of " .. source:makeCategoryLink() .. " " .. nametype .. " into various languages.", parents = {{name = "renderings of foreign personal names", is_label = true, sort = label}}, }, } end end end end end) return {LABELS = labels, RAW_CATEGORIES = raw_categories, HANDLERS = handlers} nka9xy2he55k31c1lpud70iamgc4u5s मॉड्यूल:category tree/names 828 306967 487823 2026-09-02T19:26:48Z SM7 6218 SM7 ने पृष्ठ [[मॉड्यूल:category tree/names]] को [[मॉड्यूल:category tree/नाम]] पर स्थानांतरित किया 487823 Scribunto text/plain return require [[मॉड्यूल:category tree/नाम]] mtfrv4l25s70z170xguvjixukymr31j मॉड्यूल:category tree/लिपियाँ 828 306968 487824 2026-09-02T19:27:35Z SM7 6218 अंग्रेजी विक्षनरी से आयातित 487824 Scribunto text/plain local raw_categories = {} local raw_handlers = {} -- A list of Unicode blocks to which the characters of the script or scripts belong is created by this module -- and displayed in script category pages. local blocks_submodule = "Module:category tree/scripts/blocks" local en_utilities_module = "Module:en-utilities" local languages_module = "Module:languages" local scripts_module = "Module:scripts" local scripts_data_module = "Module:scripts/data" local string_utilities_module = "Module:string utilities" local table_module = "Module:table" local m_str_utils = require(string_utilities_module) local m_table = require(table_module) local add_indefinite_article = require(en_utilities_module).add_indefinite_article local get_script_by_category_name = require(scripts_module).getByCategoryName local pattern_escape = m_str_utils.pattern_escape local concat = table.concat local insert = table.insert ----------------------------------------------------------------------------- -- -- -- SCRIPT LABELS -- -- -- ----------------------------------------------------------------------------- --[=[ The following values are recognized for each script label: 'description' A plain English description for the label. Special template substitutions are recognized; see below. 'umbrella_parents' A table listing one or more parent categories of the umbrella category 'LABELS by script' for this label. The format is as for regular raw categories (see [[Module:category tree/data/documentation]]). 'umbrella_breadcrumb' The breadcrumb to use in the umbrella category 'LABELS by script'. Defaults to "by script". 'catfix' Same as the 'catfix' parameter for regular raw categories (see [[Module:category tree/data/documentation]]). This specifies a language code to use to ensure that pages in the category are displayed in the right font and linked appropriately. If this is set, the 'catfix_sc' parameter will effectively be set with the script code in question. Special template-like parameters can be used inside the 'description' field (as well as in the 'root_description', 'root_topright' and 'root_additional' variable values initialized below). These are replaced by the equivalent text. {{{code}}}: Script code. {{{codes}}}: A comma-separated list of all the alias codes for this script (e.g. Latn and pjt-Latn for Latin). {{{codesplural}}}: The value "s" if {{{codes}}} lists more than one code, otherwise an empty string. {{{scname}}}: The name of the script that the category belongs to. {{{sccat}}}: The name of the script's main category, which adds "script" to the capitalized regular name. {{{scdisp}}}: The display form of the script, which adds "script" to the regular name. {{{scprosename}}}: Same as {{{scdisp}}} for Morse code and flag semaphore, otherwise adds "the" before {{{scdisp}}}. {{{Wikipedia}}}: The Wikipedia article for the script (if it is present in the language's data file), or else {{{sccat}}}. ]=] local script_labels = {} script_labels["characters"] = { description = function(scdata) if scdata.sc:getCode() == "None" then return "All characters whose script cannot be determined." else return "All characters from {{{scprosename}}}, and their possible variations, such as versions with diacritics and combinations recognized as single characters in any language." end end, additional = function(scdata) if scdata.sc:getCode() == "None" then return "This also includes terms where such characters are listed. For example, {{m|mul|㋍}} (a CJK character called ''SQUARE ERG'' and consisting of the word [[erg]] inside of a square) is listed on the [[erg]] page, leading to this page getting categorized into this category." else return nil end end, umbrella_parents = {"Fundamental"}, umbrella_breadcrumb = "Characters by script", catfix = "mul", } script_labels["appendices"] = { description = "Appendices about {{{scprosename}}}.", umbrella_parents = {"Category:Appendices"}, } script_labels["languages"] = { description = function(scdata) if scdata.sc:getCode() == "None" then return "Languages whose script or scripts have not yet been specified in Wiktionary (and may not exist)." else return "Languages that use {{{scprosename}}}." end end, umbrella_parents = {"All languages"}, } script_labels["templates"] = { description = "Templates with predefined contents for {{{scprosename}}}.", umbrella_parents = {"Templates"}, } script_labels["modules"] = { description = "Modules that implement functionality for {{{scprosename}}}.", umbrella_parents = {"Modules"}, } script_labels["data modules"] = { description = "Modules that contain data related to {{{scprosename}}}.", umbrella_parents = {"Data modules"}, } ----------------------------------------------------------------------------- -- -- -- RAW CATEGORIES -- -- -- ----------------------------------------------------------------------------- raw_categories["All scripts"] = { description = "This category contains the categories for every script (writing system) on Wiktionary.", additional = "See [[Wiktionary:List of scripts]] for a full list.", parents = {"Fundamental"}, } -- Types of writing systems listed in [[Module:writing systems/data]]. raw_categories["Scripts by type"] = { description = "Scripts classified by how they represent words.", parents = {{ name = "All scripts", sort = " " }}, breadcrumb = "by type", } raw_categories["Abjads"] = { description = "Scripts whose basic symbols represent consonants. Some of these are impure abjads, which have letters for some vowels.", parents = {"Scripts by type"}, } raw_categories["Abugidas"] = { description = "Scripts whose symbols represent consonant and vowel combinations. Symbols representing the same consonant combined with different vowels are for the most part similar in form.", parents = {"Scripts by type"}, } raw_categories["Alphabetic writing systems"] = { description = "Scripts whose symbols represent individual speech sounds.", parents = {"Scripts by type"}, } raw_categories["Logographic writing systems"] = { description = "Scripts whose symbols represent individual words.", parents = {"Scripts by type"}, } raw_categories["Pictographic writing systems"] = { description = "Scripts whose symbols represent individual words by using symbols that resemble the physical objects to which those words refer.", parents = {"Scripts by type"}, } raw_categories["Semisyllabaries"] = { description = "Scripts which are a combination of an alphabet and a syllbary.", parents = {"Scripts by type"}, } raw_categories["Syllabaries"] = { description = "Scripts whose symbols represent consonant and vowel combinations. Symbols representing the same consonant combined with different vowels are for the most part different in form.", parents = {"Scripts by type"}, } for script_label, obj in pairs(script_labels) do raw_categories[mw.getContentLanguage():ucfirst(script_label) .. " by script"] = { description = "Categories with " .. script_label .. " of various specific scripts.", breadcrumb = obj.umbrella_breadcrumb or "by script", parents = obj.umbrella_parents, } end ----------------------------------------------------------------------------- -- -- -- RAW HANDLERS -- -- -- ----------------------------------------------------------------------------- -- Intro text for "root" categories such as [[Category:Arabic script]]. Template substitutions are as described above. local root_topright = [=[<div style="clear: right; border: solid var(--border-color-base,#aaa) 1px; margin: 1 1 1 1; background: var(--wikt-palette-paleblue,#f9f9f9); width: 250px; padding: 5px; text-align: left; float: right"> <div style="text-align: center; margin-bottom: 10px; margin-top: 5px">'''{{{scdisp}}}'''</div> {| style="font-size: 90%; background: var(--wikt-palette-paleblue,#f9f9f9)" | style="vertical-align: middle; height: 35px;" | [[File:Wikipedia-logo.png|35px|none|Wikipedia]] || ''Wikipedia article about {{{scprosename}}}'' |- | colspan="2" style="padding-left: 50px; border-bottom: 1px solid var(--border-color-base,#aaa);" | '''[[w:{{{Wikipedia}}}|{{{Wikipedia}}}]]''' |- | style="vertical-align: middle; height: 35px;" | [[File:Crystal kfind.png|35px|none|Considerations]] || {{{scdisp}}} considerations |- | colspan="2" style="padding-left: 50px; border-bottom: 1px solid var(--border-color-base,#aaa);" | '''[[Wiktionary:About {{{scdisp}}}]]''' |- | style="vertical-align: middle; height: 35px;" | [[File:Book notice.png|35px|none|Information]] || {{{scdisp}}} information |- | colspan="2" style="padding-left: 50px; border-bottom: 1px solid var(--border-color-base,#aaa);" | '''[[Appendix:{{{sccat}}}]]''' |- | style="vertical-align: Middle; height: 35px;" | [[File:Abc box.svg|35px|none|Code]] || {{{scdisp}}} code |- | colspan="2" style="padding-left: 50px; border-bottom: 1px solid var(--border-color-base,#aaa);" | '''{{{code}}}''' |} </div>]=] -- Short description for "root" categories such as [[Category:Arabic script]]. Template substitutions are as described above. local root_description = "This is the main category of '''{{{scprosename}}}'''." -- Additional description text for "root" categories such as [[Category:Arabic script]]. Template substitutions are as described above. local root_additional = [=[Information about {{{scprosename}}} may be available at [[Appendix:{{{sccat}}}]]. In various places at Wiktionary, {{{scprosename}}} is represented by the [[Wiktionary:Scripts|code{{{codesplural}}}]] {{{codes}}}.]=] -- Replace template notation {{{}}} with variables. local function substitute_template_refs(text, scdata) local sc = scdata.sc local scname = scdata.canonical_name local display_form = sc:getDisplayForm() -- FIXME: Here we assume that the few scripts that have lowercase canonical names don't have -- language-specific variants. If such scripts are created, we have to do this a different way. if mw.getContentLanguage():ucfirst(display_form) == display_form then display_form = scdata.category_name end local codes = {} if type(text) == "function" then text = text(scdata) end if not text then return nil end local function insert_code(name, code) if name == scname then m_table.insertIfNot(codes, "'''" .. code .. "'''") end end for code, data in pairs(mw.loadData(scripts_data_module)) do local rawname = data[1] if type(rawname) == "table" then -- e.g. script code `Aran` for lang, name in pairs(rawname) do insert_code(name, code) end else insert_code(rawname, code) end end if codes[2] then table.sort( codes, -- Four-letter codes have length 10, because they are bolded: '''Latn'''. function(code1, code2) if #code1 == 10 then if #code2 == 10 then return code1 < code2 else return true end else if #code2 == 10 then return false -- four-letter codes before other codes else return code1 < code2 end end end) end local content = { code = sc:getCode(), codesplural = codes[2] and "s" or "", codes = concat(codes, ", "), scname = scname, sccat = scdata.category_name, scdisp = display_form, scprosename = (display_form:find("code") or display_form:find("semaphore")) and display_form or "the " .. display_form, Wikipedia = sc:getWikipediaArticle(), } text = string.gsub( text, "{{{([^}]+)}}}", function (parameter) return content[parameter] or error("No value for script category parameter '" .. parameter .. "'.") end) return text end local function get_root_additional(additional, scdata) local ret = {} local function ins(text) insert(ret, text) end local sc = scdata.sc local canonicalNameTable = sc:getCanonicalNameTable() if type(canonicalNameTable) == "table" then local default_name = sc:getCanonicalName() local default_catname = sc:getCategoryName() local matching_langs = {} local names_to_langs = {} for lang, name in pairs(canonicalNameTable) do local this_catname = require(scripts_module).canonicalNameToCategoryName(name) if this_catname ~= default_catname then -- Any "lang-specific" names that are the same as the default should be skipped. if this_catname == scdata.category_name then insert(matching_langs, lang) elseif names_to_langs[name] then insert(names_to_langs[name], lang) else names_to_langs[name] = {lang} end end end local function format_languages(langs) local langcats = {} for _, langcode in ipairs(langs) do local lang = require(languages_module).getByCode(langcode) if not lang then insert(langcats, ("<span class=\"error\">unknown language code '''%s'''</span>"):format(langcode)) else insert(langcats, lang:makeCategoryLink()) end end table.sort(langcats) return ("language%s %s"):format(langcats[2] and "s" or "", m_table.serialCommaJoin(langcats)) end local function insert_other_names() local names_to_langs_lines = {} for name, langs in pairs(names_to_langs) do insert(names_to_langs_lines, ("* [[:Category:%s|%s]] for %s.\n"):format( require(scripts_module).canonicalNameToCategoryName(name), name, format_languages(langs) )) end table.sort(names_to_langs_lines) ins(concat(names_to_langs_lines)) end if default_catname == scdata.category_name then if next(names_to_langs) then ins(("This category corresponds to the default name for script code '''%s''', which also goes by the following language-specific names:\n" ):format(sc:getCode())) insert_other_names() ins("\n") end else ins(("This category bears a language-specific name for script code '''%s''', as used for %s. The script goes by the default name of [[:Category:%s|%s]]." ):format(sc:getCode(), format_languages(matching_langs), default_catname, default_name)) if next(names_to_langs) then ins(" The script has the following additional language-specific names:\n") insert_other_names() ins("\n") else ins("\n\n") end end end ins(additional) local systems = sc:getSystems() for _, system in ipairs(systems) do ins("\n\nThe {{{scname}}} script is ") ins(add_indefinite_article(system:getDisplayForm("singular"))) ins(".") end local blocks = require(blocks_submodule).print_blocks_by_canonical_name(scdata.canonical_name) if blocks then ins("\n") ins(blocks) end return substitute_template_refs(concat(ret), scdata) end -- Handler for 'SCRIPT script' e.g. [[Category:Arabic script]] as well as [[Category:Morse code]] and -- [[Category:Flag semaphore]]. insert(raw_handlers, function(data) local sc, canonical_name = get_script_by_category_name(data.category) if not sc then return nil end local scdata = { sc = sc, canonical_name = canonical_name, category_name = data.category, } -- Compute parents. local parents = {} local systems = sc:getSystems() for _, system in ipairs(systems) do insert(parents, system:getCategoryName()) end insert(parents, "All scripts") -- Compute (extra) children. local children = {} for script_label in pairs(script_labels) do insert(children, data.category .. " " .. script_label) end return { canonical_name = data.category, topright = substitute_template_refs(root_topright, scdata), description = substitute_template_refs(root_description, scdata), additional = get_root_additional(root_additional, scdata), parents = parents, breadcrumb = canonical_name, extra_children = children, can_be_empty = true, } end) -- Handler for 'SCRIPT script LABELS' e.g. [[Category:Arabic script templates]] as well as [[Category:Morse code LABELS]] and -- [[Category:Flag semaphore LABELS]]. insert(raw_handlers, function(data) local sc, category_name, canonical_name, label for lab in pairs(script_labels) do category_name, label = data.category:match("^(.+) (" .. pattern_escape(lab) .. ")$") sc, canonical_name = get_script_by_category_name(category_name) if sc then break end end if not sc then return nil end local label_obj = script_labels[label] -- Compute parents. local parents = { {name = category_name, sort = label}, -- umbrella category mw.getContentLanguage():ucfirst(label) .. " by script", } local scdata = { sc = sc, canonical_name = canonical_name, category_name = category_name, } return { canonical_name = category_name .. " " .. label, description = substitute_template_refs(label_obj.description, scdata), additional = substitute_template_refs(label_obj.additional, scdata), parents = parents, breadcrumb = label, catfix = label_obj.catfix, catfix_sc = label_obj.catfix and sc:getCode(), } end) return {RAW_CATEGORIES = raw_categories, RAW_HANDLERS = raw_handlers} 5wbrhtkpzn59eg6aclz5p1xg8tfhmyc 487825 487824 2026-09-02T19:27:51Z SM7 6218 SM7 ने पृष्ठ [[मॉड्यूल:category tree/scripts]] को [[मॉड्यूल:category tree/लिपियाँ]] पर स्थानांतरित किया 487824 Scribunto text/plain local raw_categories = {} local raw_handlers = {} -- A list of Unicode blocks to which the characters of the script or scripts belong is created by this module -- and displayed in script category pages. local blocks_submodule = "Module:category tree/scripts/blocks" local en_utilities_module = "Module:en-utilities" local languages_module = "Module:languages" local scripts_module = "Module:scripts" local scripts_data_module = "Module:scripts/data" local string_utilities_module = "Module:string utilities" local table_module = "Module:table" local m_str_utils = require(string_utilities_module) local m_table = require(table_module) local add_indefinite_article = require(en_utilities_module).add_indefinite_article local get_script_by_category_name = require(scripts_module).getByCategoryName local pattern_escape = m_str_utils.pattern_escape local concat = table.concat local insert = table.insert ----------------------------------------------------------------------------- -- -- -- SCRIPT LABELS -- -- -- ----------------------------------------------------------------------------- --[=[ The following values are recognized for each script label: 'description' A plain English description for the label. Special template substitutions are recognized; see below. 'umbrella_parents' A table listing one or more parent categories of the umbrella category 'LABELS by script' for this label. The format is as for regular raw categories (see [[Module:category tree/data/documentation]]). 'umbrella_breadcrumb' The breadcrumb to use in the umbrella category 'LABELS by script'. Defaults to "by script". 'catfix' Same as the 'catfix' parameter for regular raw categories (see [[Module:category tree/data/documentation]]). This specifies a language code to use to ensure that pages in the category are displayed in the right font and linked appropriately. If this is set, the 'catfix_sc' parameter will effectively be set with the script code in question. Special template-like parameters can be used inside the 'description' field (as well as in the 'root_description', 'root_topright' and 'root_additional' variable values initialized below). These are replaced by the equivalent text. {{{code}}}: Script code. {{{codes}}}: A comma-separated list of all the alias codes for this script (e.g. Latn and pjt-Latn for Latin). {{{codesplural}}}: The value "s" if {{{codes}}} lists more than one code, otherwise an empty string. {{{scname}}}: The name of the script that the category belongs to. {{{sccat}}}: The name of the script's main category, which adds "script" to the capitalized regular name. {{{scdisp}}}: The display form of the script, which adds "script" to the regular name. {{{scprosename}}}: Same as {{{scdisp}}} for Morse code and flag semaphore, otherwise adds "the" before {{{scdisp}}}. {{{Wikipedia}}}: The Wikipedia article for the script (if it is present in the language's data file), or else {{{sccat}}}. ]=] local script_labels = {} script_labels["characters"] = { description = function(scdata) if scdata.sc:getCode() == "None" then return "All characters whose script cannot be determined." else return "All characters from {{{scprosename}}}, and their possible variations, such as versions with diacritics and combinations recognized as single characters in any language." end end, additional = function(scdata) if scdata.sc:getCode() == "None" then return "This also includes terms where such characters are listed. For example, {{m|mul|㋍}} (a CJK character called ''SQUARE ERG'' and consisting of the word [[erg]] inside of a square) is listed on the [[erg]] page, leading to this page getting categorized into this category." else return nil end end, umbrella_parents = {"Fundamental"}, umbrella_breadcrumb = "Characters by script", catfix = "mul", } script_labels["appendices"] = { description = "Appendices about {{{scprosename}}}.", umbrella_parents = {"Category:Appendices"}, } script_labels["languages"] = { description = function(scdata) if scdata.sc:getCode() == "None" then return "Languages whose script or scripts have not yet been specified in Wiktionary (and may not exist)." else return "Languages that use {{{scprosename}}}." end end, umbrella_parents = {"All languages"}, } script_labels["templates"] = { description = "Templates with predefined contents for {{{scprosename}}}.", umbrella_parents = {"Templates"}, } script_labels["modules"] = { description = "Modules that implement functionality for {{{scprosename}}}.", umbrella_parents = {"Modules"}, } script_labels["data modules"] = { description = "Modules that contain data related to {{{scprosename}}}.", umbrella_parents = {"Data modules"}, } ----------------------------------------------------------------------------- -- -- -- RAW CATEGORIES -- -- -- ----------------------------------------------------------------------------- raw_categories["All scripts"] = { description = "This category contains the categories for every script (writing system) on Wiktionary.", additional = "See [[Wiktionary:List of scripts]] for a full list.", parents = {"Fundamental"}, } -- Types of writing systems listed in [[Module:writing systems/data]]. raw_categories["Scripts by type"] = { description = "Scripts classified by how they represent words.", parents = {{ name = "All scripts", sort = " " }}, breadcrumb = "by type", } raw_categories["Abjads"] = { description = "Scripts whose basic symbols represent consonants. Some of these are impure abjads, which have letters for some vowels.", parents = {"Scripts by type"}, } raw_categories["Abugidas"] = { description = "Scripts whose symbols represent consonant and vowel combinations. Symbols representing the same consonant combined with different vowels are for the most part similar in form.", parents = {"Scripts by type"}, } raw_categories["Alphabetic writing systems"] = { description = "Scripts whose symbols represent individual speech sounds.", parents = {"Scripts by type"}, } raw_categories["Logographic writing systems"] = { description = "Scripts whose symbols represent individual words.", parents = {"Scripts by type"}, } raw_categories["Pictographic writing systems"] = { description = "Scripts whose symbols represent individual words by using symbols that resemble the physical objects to which those words refer.", parents = {"Scripts by type"}, } raw_categories["Semisyllabaries"] = { description = "Scripts which are a combination of an alphabet and a syllbary.", parents = {"Scripts by type"}, } raw_categories["Syllabaries"] = { description = "Scripts whose symbols represent consonant and vowel combinations. Symbols representing the same consonant combined with different vowels are for the most part different in form.", parents = {"Scripts by type"}, } for script_label, obj in pairs(script_labels) do raw_categories[mw.getContentLanguage():ucfirst(script_label) .. " by script"] = { description = "Categories with " .. script_label .. " of various specific scripts.", breadcrumb = obj.umbrella_breadcrumb or "by script", parents = obj.umbrella_parents, } end ----------------------------------------------------------------------------- -- -- -- RAW HANDLERS -- -- -- ----------------------------------------------------------------------------- -- Intro text for "root" categories such as [[Category:Arabic script]]. Template substitutions are as described above. local root_topright = [=[<div style="clear: right; border: solid var(--border-color-base,#aaa) 1px; margin: 1 1 1 1; background: var(--wikt-palette-paleblue,#f9f9f9); width: 250px; padding: 5px; text-align: left; float: right"> <div style="text-align: center; margin-bottom: 10px; margin-top: 5px">'''{{{scdisp}}}'''</div> {| style="font-size: 90%; background: var(--wikt-palette-paleblue,#f9f9f9)" | style="vertical-align: middle; height: 35px;" | [[File:Wikipedia-logo.png|35px|none|Wikipedia]] || ''Wikipedia article about {{{scprosename}}}'' |- | colspan="2" style="padding-left: 50px; border-bottom: 1px solid var(--border-color-base,#aaa);" | '''[[w:{{{Wikipedia}}}|{{{Wikipedia}}}]]''' |- | style="vertical-align: middle; height: 35px;" | [[File:Crystal kfind.png|35px|none|Considerations]] || {{{scdisp}}} considerations |- | colspan="2" style="padding-left: 50px; border-bottom: 1px solid var(--border-color-base,#aaa);" | '''[[Wiktionary:About {{{scdisp}}}]]''' |- | style="vertical-align: middle; height: 35px;" | [[File:Book notice.png|35px|none|Information]] || {{{scdisp}}} information |- | colspan="2" style="padding-left: 50px; border-bottom: 1px solid var(--border-color-base,#aaa);" | '''[[Appendix:{{{sccat}}}]]''' |- | style="vertical-align: Middle; height: 35px;" | [[File:Abc box.svg|35px|none|Code]] || {{{scdisp}}} code |- | colspan="2" style="padding-left: 50px; border-bottom: 1px solid var(--border-color-base,#aaa);" | '''{{{code}}}''' |} </div>]=] -- Short description for "root" categories such as [[Category:Arabic script]]. Template substitutions are as described above. local root_description = "This is the main category of '''{{{scprosename}}}'''." -- Additional description text for "root" categories such as [[Category:Arabic script]]. Template substitutions are as described above. local root_additional = [=[Information about {{{scprosename}}} may be available at [[Appendix:{{{sccat}}}]]. In various places at Wiktionary, {{{scprosename}}} is represented by the [[Wiktionary:Scripts|code{{{codesplural}}}]] {{{codes}}}.]=] -- Replace template notation {{{}}} with variables. local function substitute_template_refs(text, scdata) local sc = scdata.sc local scname = scdata.canonical_name local display_form = sc:getDisplayForm() -- FIXME: Here we assume that the few scripts that have lowercase canonical names don't have -- language-specific variants. If such scripts are created, we have to do this a different way. if mw.getContentLanguage():ucfirst(display_form) == display_form then display_form = scdata.category_name end local codes = {} if type(text) == "function" then text = text(scdata) end if not text then return nil end local function insert_code(name, code) if name == scname then m_table.insertIfNot(codes, "'''" .. code .. "'''") end end for code, data in pairs(mw.loadData(scripts_data_module)) do local rawname = data[1] if type(rawname) == "table" then -- e.g. script code `Aran` for lang, name in pairs(rawname) do insert_code(name, code) end else insert_code(rawname, code) end end if codes[2] then table.sort( codes, -- Four-letter codes have length 10, because they are bolded: '''Latn'''. function(code1, code2) if #code1 == 10 then if #code2 == 10 then return code1 < code2 else return true end else if #code2 == 10 then return false -- four-letter codes before other codes else return code1 < code2 end end end) end local content = { code = sc:getCode(), codesplural = codes[2] and "s" or "", codes = concat(codes, ", "), scname = scname, sccat = scdata.category_name, scdisp = display_form, scprosename = (display_form:find("code") or display_form:find("semaphore")) and display_form or "the " .. display_form, Wikipedia = sc:getWikipediaArticle(), } text = string.gsub( text, "{{{([^}]+)}}}", function (parameter) return content[parameter] or error("No value for script category parameter '" .. parameter .. "'.") end) return text end local function get_root_additional(additional, scdata) local ret = {} local function ins(text) insert(ret, text) end local sc = scdata.sc local canonicalNameTable = sc:getCanonicalNameTable() if type(canonicalNameTable) == "table" then local default_name = sc:getCanonicalName() local default_catname = sc:getCategoryName() local matching_langs = {} local names_to_langs = {} for lang, name in pairs(canonicalNameTable) do local this_catname = require(scripts_module).canonicalNameToCategoryName(name) if this_catname ~= default_catname then -- Any "lang-specific" names that are the same as the default should be skipped. if this_catname == scdata.category_name then insert(matching_langs, lang) elseif names_to_langs[name] then insert(names_to_langs[name], lang) else names_to_langs[name] = {lang} end end end local function format_languages(langs) local langcats = {} for _, langcode in ipairs(langs) do local lang = require(languages_module).getByCode(langcode) if not lang then insert(langcats, ("<span class=\"error\">unknown language code '''%s'''</span>"):format(langcode)) else insert(langcats, lang:makeCategoryLink()) end end table.sort(langcats) return ("language%s %s"):format(langcats[2] and "s" or "", m_table.serialCommaJoin(langcats)) end local function insert_other_names() local names_to_langs_lines = {} for name, langs in pairs(names_to_langs) do insert(names_to_langs_lines, ("* [[:Category:%s|%s]] for %s.\n"):format( require(scripts_module).canonicalNameToCategoryName(name), name, format_languages(langs) )) end table.sort(names_to_langs_lines) ins(concat(names_to_langs_lines)) end if default_catname == scdata.category_name then if next(names_to_langs) then ins(("This category corresponds to the default name for script code '''%s''', which also goes by the following language-specific names:\n" ):format(sc:getCode())) insert_other_names() ins("\n") end else ins(("This category bears a language-specific name for script code '''%s''', as used for %s. The script goes by the default name of [[:Category:%s|%s]]." ):format(sc:getCode(), format_languages(matching_langs), default_catname, default_name)) if next(names_to_langs) then ins(" The script has the following additional language-specific names:\n") insert_other_names() ins("\n") else ins("\n\n") end end end ins(additional) local systems = sc:getSystems() for _, system in ipairs(systems) do ins("\n\nThe {{{scname}}} script is ") ins(add_indefinite_article(system:getDisplayForm("singular"))) ins(".") end local blocks = require(blocks_submodule).print_blocks_by_canonical_name(scdata.canonical_name) if blocks then ins("\n") ins(blocks) end return substitute_template_refs(concat(ret), scdata) end -- Handler for 'SCRIPT script' e.g. [[Category:Arabic script]] as well as [[Category:Morse code]] and -- [[Category:Flag semaphore]]. insert(raw_handlers, function(data) local sc, canonical_name = get_script_by_category_name(data.category) if not sc then return nil end local scdata = { sc = sc, canonical_name = canonical_name, category_name = data.category, } -- Compute parents. local parents = {} local systems = sc:getSystems() for _, system in ipairs(systems) do insert(parents, system:getCategoryName()) end insert(parents, "All scripts") -- Compute (extra) children. local children = {} for script_label in pairs(script_labels) do insert(children, data.category .. " " .. script_label) end return { canonical_name = data.category, topright = substitute_template_refs(root_topright, scdata), description = substitute_template_refs(root_description, scdata), additional = get_root_additional(root_additional, scdata), parents = parents, breadcrumb = canonical_name, extra_children = children, can_be_empty = true, } end) -- Handler for 'SCRIPT script LABELS' e.g. [[Category:Arabic script templates]] as well as [[Category:Morse code LABELS]] and -- [[Category:Flag semaphore LABELS]]. insert(raw_handlers, function(data) local sc, category_name, canonical_name, label for lab in pairs(script_labels) do category_name, label = data.category:match("^(.+) (" .. pattern_escape(lab) .. ")$") sc, canonical_name = get_script_by_category_name(category_name) if sc then break end end if not sc then return nil end local label_obj = script_labels[label] -- Compute parents. local parents = { {name = category_name, sort = label}, -- umbrella category mw.getContentLanguage():ucfirst(label) .. " by script", } local scdata = { sc = sc, canonical_name = canonical_name, category_name = category_name, } return { canonical_name = category_name .. " " .. label, description = substitute_template_refs(label_obj.description, scdata), additional = substitute_template_refs(label_obj.additional, scdata), parents = parents, breadcrumb = label, catfix = label_obj.catfix, catfix_sc = label_obj.catfix and sc:getCode(), } end) return {RAW_CATEGORIES = raw_categories, RAW_HANDLERS = raw_handlers} 5wbrhtkpzn59eg6aclz5p1xg8tfhmyc 487852 487825 2026-09-02T20:22:16Z SM7 6218 localization... 487852 Scribunto text/plain local raw_categories = {} local raw_handlers = {} -- A list of Unicode blocks to which the characters of the script or scripts belong is created by this module -- and displayed in script category pages. local blocks_submodule = "Module:category tree/scripts/blocks" local en_utilities_module = "Module:en-utilities" local languages_module = "Module:languages" local scripts_module = "Module:scripts" local scripts_data_module = "Module:scripts/data" local string_utilities_module = "Module:string utilities" local table_module = "Module:table" local m_str_utils = require(string_utilities_module) local m_table = require(table_module) local add_indefinite_article = require(en_utilities_module).add_indefinite_article local get_script_by_category_name = require(scripts_module).getByCategoryName local pattern_escape = m_str_utils.pattern_escape local concat = table.concat local insert = table.insert ----------------------------------------------------------------------------- -- -- -- SCRIPT LABELS -- -- -- ----------------------------------------------------------------------------- --[=[ The following values are recognized for each script label: 'description' A plain English description for the label. Special template substitutions are recognized; see below. 'umbrella_parents' A table listing one or more parent categories of the umbrella category 'LABELS by script' for this label. The format is as for regular raw categories (see [[Module:category tree/data/documentation]]). 'umbrella_breadcrumb' The breadcrumb to use in the umbrella category 'LABELS by script'. Defaults to "by script". 'catfix' Same as the 'catfix' parameter for regular raw categories (see [[Module:category tree/data/documentation]]). This specifies a language code to use to ensure that pages in the category are displayed in the right font and linked appropriately. If this is set, the 'catfix_sc' parameter will effectively be set with the script code in question. Special template-like parameters can be used inside the 'description' field (as well as in the 'root_description', 'root_topright' and 'root_additional' variable values initialized below). These are replaced by the equivalent text. {{{code}}}: Script code. {{{codes}}}: A comma-separated list of all the alias codes for this script (e.g. Latn and pjt-Latn for Latin). {{{codesplural}}}: The value "s" if {{{codes}}} lists more than one code, otherwise an empty string. {{{scname}}}: The name of the script that the category belongs to. {{{sccat}}}: The name of the script's main category, which adds "script" to the capitalized regular name. {{{scdisp}}}: The display form of the script, which adds "script" to the regular name. {{{scprosename}}}: Same as {{{scdisp}}} for Morse code and flag semaphore, otherwise adds "the" before {{{scdisp}}}. {{{Wikipedia}}}: The Wikipedia article for the script (if it is present in the language's data file), or else {{{sccat}}}. ]=] local script_labels = {} script_labels["characters"] = { description = function(scdata) if scdata.sc:getCode() == "None" then return "All characters whose script cannot be determined." else return "All characters from {{{scprosename}}}, and their possible variations, such as versions with diacritics and combinations recognized as single characters in any language." end end, additional = function(scdata) if scdata.sc:getCode() == "None" then return "This also includes terms where such characters are listed. For example, {{m|mul|㋍}} (a CJK character called ''SQUARE ERG'' and consisting of the word [[erg]] inside of a square) is listed on the [[erg]] page, leading to this page getting categorized into this category." else return nil end end, umbrella_parents = {"मूलभूत श्रेणी"}, umbrella_breadcrumb = "Characters by script", catfix = "mul", } script_labels["appendices"] = { description = "Appendices about {{{scprosename}}}.", umbrella_parents = {"Category:Appendices"}, } script_labels["languages"] = { description = function(scdata) if scdata.sc:getCode() == "None" then return "Languages whose script or scripts have not yet been specified in Wiktionary (and may not exist)." else return "Languages that use {{{scprosename}}}." end end, umbrella_parents = {"All languages"}, } script_labels["templates"] = { description = "Templates with predefined contents for {{{scprosename}}}.", umbrella_parents = {"Templates"}, } script_labels["modules"] = { description = "Modules that implement functionality for {{{scprosename}}}.", umbrella_parents = {"Modules"}, } script_labels["data modules"] = { description = "Modules that contain data related to {{{scprosename}}}.", umbrella_parents = {"Data modules"}, } ----------------------------------------------------------------------------- -- -- -- RAW CATEGORIES -- -- -- ----------------------------------------------------------------------------- raw_categories["सभी लिपियाँ"] = { description = "This category contains the categories for every script (writing system) on Wiktionary.", additional = "See [[Wiktionary:List of scripts]] for a full list.", parents = {"मूलभूत श्रेणी"}, } -- Types of writing systems listed in [[Module:writing systems/data]]. raw_categories["लिपियाँ प्रकार अनुसार"] = { description = "Scripts classified by how they represent words.", parents = {{ name = "सभी लिपियाँ", sort = " " }}, breadcrumb = "लिपि अनुसार", } raw_categories["Abjads"] = { description = "Scripts whose basic symbols represent consonants. Some of these are impure abjads, which have letters for some vowels.", parents = {"लिपियाँ प्रकार अनुसार"}, } raw_categories["Abugidas"] = { description = "Scripts whose symbols represent consonant and vowel combinations. Symbols representing the same consonant combined with different vowels are for the most part similar in form.", parents = {"लिपियाँ प्रकार अनुसार"}, } raw_categories["Alphabetic writing systems"] = { description = "Scripts whose symbols represent individual speech sounds.", parents = {"लिपियाँ प्रकार अनुसार"}, } raw_categories["Logographic writing systems"] = { description = "Scripts whose symbols represent individual words.", parents = {"लिपियाँ प्रकार अनुसार"}, } raw_categories["Pictographic writing systems"] = { description = "Scripts whose symbols represent individual words by using symbols that resemble the physical objects to which those words refer.", parents = {"लिपियाँ प्रकार अनुसार"}, } raw_categories["Semisyllabaries"] = { description = "Scripts which are a combination of an alphabet and a syllbary.", parents = {"लिपियाँ प्रकार अनुसार"}, } raw_categories["Syllabaries"] = { description = "Scripts whose symbols represent consonant and vowel combinations. Symbols representing the same consonant combined with different vowels are for the most part different in form.", parents = {"लिपियाँ प्रकार अनुसार"}, } for script_label, obj in pairs(script_labels) do raw_categories[mw.getContentLanguage():ucfirst(script_label) .. " by script"] = { description = "Categories with " .. script_label .. " of various specific scripts.", breadcrumb = obj.umbrella_breadcrumb or "by script", parents = obj.umbrella_parents, } end ----------------------------------------------------------------------------- -- -- -- RAW HANDLERS -- -- -- ----------------------------------------------------------------------------- -- Intro text for "root" categories such as [[Category:Arabic script]]. Template substitutions are as described above. local root_topright = [=[<div style="clear: right; border: solid var(--border-color-base,#aaa) 1px; margin: 1 1 1 1; background: var(--wikt-palette-paleblue,#f9f9f9); width: 250px; padding: 5px; text-align: left; float: right"> <div style="text-align: center; margin-bottom: 10px; margin-top: 5px">'''{{{scdisp}}}'''</div> {| style="font-size: 90%; background: var(--wikt-palette-paleblue,#f9f9f9)" | style="vertical-align: middle; height: 35px;" | [[File:Wikipedia-logo.png|35px|none|Wikipedia]] || ''Wikipedia article about {{{scprosename}}}'' |- | colspan="2" style="padding-left: 50px; border-bottom: 1px solid var(--border-color-base,#aaa);" | '''[[w:{{{Wikipedia}}}|{{{Wikipedia}}}]]''' |- | style="vertical-align: middle; height: 35px;" | [[File:Crystal kfind.png|35px|none|Considerations]] || {{{scdisp}}} considerations |- | colspan="2" style="padding-left: 50px; border-bottom: 1px solid var(--border-color-base,#aaa);" | '''[[Wiktionary:About {{{scdisp}}}]]''' |- | style="vertical-align: middle; height: 35px;" | [[File:Book notice.png|35px|none|Information]] || {{{scdisp}}} information |- | colspan="2" style="padding-left: 50px; border-bottom: 1px solid var(--border-color-base,#aaa);" | '''[[Appendix:{{{sccat}}}]]''' |- | style="vertical-align: Middle; height: 35px;" | [[File:Abc box.svg|35px|none|Code]] || {{{scdisp}}} code |- | colspan="2" style="padding-left: 50px; border-bottom: 1px solid var(--border-color-base,#aaa);" | '''{{{code}}}''' |} </div>]=] -- Short description for "root" categories such as [[Category:Arabic script]]. Template substitutions are as described above. local root_description = "This is the main category of '''{{{scprosename}}}'''." -- Additional description text for "root" categories such as [[Category:Arabic script]]. Template substitutions are as described above. local root_additional = [=[Information about {{{scprosename}}} may be available at [[Appendix:{{{sccat}}}]]. In various places at Wiktionary, {{{scprosename}}} is represented by the [[Wiktionary:Scripts|code{{{codesplural}}}]] {{{codes}}}.]=] -- Replace template notation {{{}}} with variables. local function substitute_template_refs(text, scdata) local sc = scdata.sc local scname = scdata.canonical_name local display_form = sc:getDisplayForm() -- FIXME: Here we assume that the few scripts that have lowercase canonical names don't have -- language-specific variants. If such scripts are created, we have to do this a different way. if mw.getContentLanguage():ucfirst(display_form) == display_form then display_form = scdata.category_name end local codes = {} if type(text) == "function" then text = text(scdata) end if not text then return nil end local function insert_code(name, code) if name == scname then m_table.insertIfNot(codes, "'''" .. code .. "'''") end end for code, data in pairs(mw.loadData(scripts_data_module)) do local rawname = data[1] if type(rawname) == "table" then -- e.g. script code `Aran` for lang, name in pairs(rawname) do insert_code(name, code) end else insert_code(rawname, code) end end if codes[2] then table.sort( codes, -- Four-letter codes have length 10, because they are bolded: '''Latn'''. function(code1, code2) if #code1 == 10 then if #code2 == 10 then return code1 < code2 else return true end else if #code2 == 10 then return false -- four-letter codes before other codes else return code1 < code2 end end end) end local content = { code = sc:getCode(), codesplural = codes[2] and "s" or "", codes = concat(codes, ", "), scname = scname, sccat = scdata.category_name, scdisp = display_form, scprosename = (display_form:find("code") or display_form:find("semaphore")) and display_form or "the " .. display_form, Wikipedia = sc:getWikipediaArticle(), } text = string.gsub( text, "{{{([^}]+)}}}", function (parameter) return content[parameter] or error("No value for script category parameter '" .. parameter .. "'.") end) return text end local function get_root_additional(additional, scdata) local ret = {} local function ins(text) insert(ret, text) end local sc = scdata.sc local canonicalNameTable = sc:getCanonicalNameTable() if type(canonicalNameTable) == "table" then local default_name = sc:getCanonicalName() local default_catname = sc:getCategoryName() local matching_langs = {} local names_to_langs = {} for lang, name in pairs(canonicalNameTable) do local this_catname = require(scripts_module).canonicalNameToCategoryName(name) if this_catname ~= default_catname then -- Any "lang-specific" names that are the same as the default should be skipped. if this_catname == scdata.category_name then insert(matching_langs, lang) elseif names_to_langs[name] then insert(names_to_langs[name], lang) else names_to_langs[name] = {lang} end end end local function format_languages(langs) local langcats = {} for _, langcode in ipairs(langs) do local lang = require(languages_module).getByCode(langcode) if not lang then insert(langcats, ("<span class=\"error\">unknown language code '''%s'''</span>"):format(langcode)) else insert(langcats, lang:makeCategoryLink()) end end table.sort(langcats) return ("language%s %s"):format(langcats[2] and "s" or "", m_table.serialCommaJoin(langcats)) end local function insert_other_names() local names_to_langs_lines = {} for name, langs in pairs(names_to_langs) do insert(names_to_langs_lines, ("* [[:Category:%s|%s]] for %s.\n"):format( require(scripts_module).canonicalNameToCategoryName(name), name, format_languages(langs) )) end table.sort(names_to_langs_lines) ins(concat(names_to_langs_lines)) end if default_catname == scdata.category_name then if next(names_to_langs) then ins(("This category corresponds to the default name for script code '''%s''', which also goes by the following language-specific names:\n" ):format(sc:getCode())) insert_other_names() ins("\n") end else ins(("This category bears a language-specific name for script code '''%s''', as used for %s. The script goes by the default name of [[:Category:%s|%s]]." ):format(sc:getCode(), format_languages(matching_langs), default_catname, default_name)) if next(names_to_langs) then ins(" The script has the following additional language-specific names:\n") insert_other_names() ins("\n") else ins("\n\n") end end end ins(additional) local systems = sc:getSystems() for _, system in ipairs(systems) do ins("\n\nThe {{{scname}}} script is ") ins(add_indefinite_article(system:getDisplayForm("singular"))) ins(".") end local blocks = require(blocks_submodule).print_blocks_by_canonical_name(scdata.canonical_name) if blocks then ins("\n") ins(blocks) end return substitute_template_refs(concat(ret), scdata) end -- Handler for 'SCRIPT script' e.g. [[Category:Arabic script]] as well as [[Category:Morse code]] and -- [[Category:Flag semaphore]]. insert(raw_handlers, function(data) local sc, canonical_name = get_script_by_category_name(data.category) if not sc then return nil end local scdata = { sc = sc, canonical_name = canonical_name, category_name = data.category, } -- Compute parents. local parents = {} local systems = sc:getSystems() for _, system in ipairs(systems) do insert(parents, system:getCategoryName()) end insert(parents, "All scripts") -- Compute (extra) children. local children = {} for script_label in pairs(script_labels) do insert(children, data.category .. " " .. script_label) end return { canonical_name = data.category, topright = substitute_template_refs(root_topright, scdata), description = substitute_template_refs(root_description, scdata), additional = get_root_additional(root_additional, scdata), parents = parents, breadcrumb = canonical_name, extra_children = children, can_be_empty = true, } end) -- Handler for 'SCRIPT script LABELS' e.g. [[Category:Arabic script templates]] as well as [[Category:Morse code LABELS]] and -- [[Category:Flag semaphore LABELS]]. insert(raw_handlers, function(data) local sc, category_name, canonical_name, label for lab in pairs(script_labels) do category_name, label = data.category:match("^(.+) (" .. pattern_escape(lab) .. ")$") sc, canonical_name = get_script_by_category_name(category_name) if sc then break end end if not sc then return nil end local label_obj = script_labels[label] -- Compute parents. local parents = { {name = category_name, sort = label}, -- umbrella category mw.getContentLanguage():ucfirst(label) .. " by script", } local scdata = { sc = sc, canonical_name = canonical_name, category_name = category_name, } return { canonical_name = category_name .. " " .. label, description = substitute_template_refs(label_obj.description, scdata), additional = substitute_template_refs(label_obj.additional, scdata), parents = parents, breadcrumb = label, catfix = label_obj.catfix, catfix_sc = label_obj.catfix and sc:getCode(), } end) return {RAW_CATEGORIES = raw_categories, RAW_HANDLERS = raw_handlers} mwljn2e9hhyzkkbf1k5mflglpqa9d8c मॉड्यूल:category tree/scripts 828 306969 487826 2026-09-02T19:27:51Z SM7 6218 SM7 ने पृष्ठ [[मॉड्यूल:category tree/scripts]] को [[मॉड्यूल:category tree/लिपियाँ]] पर स्थानांतरित किया 487826 Scribunto text/plain return require [[मॉड्यूल:category tree/लिपियाँ]] 3i134eyc5yk7xxagitb4qp19fmls1en मॉड्यूल:category tree/हेडवर्ड 828 306970 487828 2026-09-02T19:30:05Z SM7 6218 अंग्रेजी विक्षनरी से आयातित 487828 Scribunto text/plain local raw_categories = {} local raw_handlers = {} local insert = table.insert ----------------------------------------------------------------------------- -- -- -- RAW CATEGORIES -- -- -- ----------------------------------------------------------------------------- raw_categories["The Headword"] = { description = "Pages of [[Wiktionary:The Headword|''The Headword'']]: the portal, every issue, and one subcategory per issue holding that issue's articles.", breadcrumb = "The Headword", parents = "Wiktionary", } ----------------------------------------------------------------------------- -- -- -- RAW HANDLERS -- -- -- ----------------------------------------------------------------------------- -- The Headword by issue insert(raw_handlers, function(data) local issue = data.category:match("^The Headword, issue (%d+)$") if not issue then return end return { description = "Articles from issue " .. issue .. " of [[Wiktionary:The Headword|''The Headword'']].", additional = "They are listed in the order they are read in the issue, not alphabetically.", breadcrumb = "issue " .. issue, parents = { { name = "The Headword", sort = ("%02d"):format(tonumber(issue)) }, }, } end) return { RAW_CATEGORIES = raw_categories, RAW_HANDLERS = raw_handlers } 3fawqq29evtquk2sx2kwzoouiolvsv6 487829 487828 2026-09-02T19:30:18Z SM7 6218 SM7 ने पृष्ठ [[मॉड्यूल:category tree/the headword]] को [[मॉड्यूल:category tree/हेडवर्ड]] पर स्थानांतरित किया 487828 Scribunto text/plain local raw_categories = {} local raw_handlers = {} local insert = table.insert ----------------------------------------------------------------------------- -- -- -- RAW CATEGORIES -- -- -- ----------------------------------------------------------------------------- raw_categories["The Headword"] = { description = "Pages of [[Wiktionary:The Headword|''The Headword'']]: the portal, every issue, and one subcategory per issue holding that issue's articles.", breadcrumb = "The Headword", parents = "Wiktionary", } ----------------------------------------------------------------------------- -- -- -- RAW HANDLERS -- -- -- ----------------------------------------------------------------------------- -- The Headword by issue insert(raw_handlers, function(data) local issue = data.category:match("^The Headword, issue (%d+)$") if not issue then return end return { description = "Articles from issue " .. issue .. " of [[Wiktionary:The Headword|''The Headword'']].", additional = "They are listed in the order they are read in the issue, not alphabetically.", breadcrumb = "issue " .. issue, parents = { { name = "The Headword", sort = ("%02d"):format(tonumber(issue)) }, }, } end) return { RAW_CATEGORIES = raw_categories, RAW_HANDLERS = raw_handlers } 3fawqq29evtquk2sx2kwzoouiolvsv6 मॉड्यूल:category tree/the headword 828 306971 487830 2026-09-02T19:30:18Z SM7 6218 SM7 ने पृष्ठ [[मॉड्यूल:category tree/the headword]] को [[मॉड्यूल:category tree/हेडवर्ड]] पर स्थानांतरित किया 487830 Scribunto text/plain return require [[मॉड्यूल:category tree/हेडवर्ड]] 80v1czcia68en8tm4nfig7lbxyn4mnf मॉड्यूल:table/isArray 828 306972 487832 2026-09-02T19:49:39Z SM7 6218 अंग्रेजी विक्षनरी से आयातित 487832 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 मॉड्यूल:table/reverseIpairs 828 306973 487833 2026-09-02T19:50:32Z SM7 6218 अंग्रेजी विक्षनरी से आयातित 487833 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 मॉड्यूल:table/size 828 306974 487834 2026-09-02T19:51:30Z SM7 6218 अंग्रेजी विक्षनरी से आयातित 487834 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 मॉड्यूल:table/sparseConcat 828 306975 487835 2026-09-02T19:52:37Z SM7 6218 अंग्रेजी विक्षनरी से आयातित 487835 Scribunto text/plain local table_sparse_ipairs_module = "Module:table/sparseIpairs" local concat = table.concat local function sparse_ipairs(...) sparse_ipairs = require(table_sparse_ipairs_module) return sparse_ipairs(...) end --[==[ Concatenates all values in a table that are indexed by a number, in order. * {sparseConcat{ a, nil, c, d }} => {"acd"} * {sparseConcat{ nil, b, c, d }} => {"bcd"}]==] return function(t, sep, i, j) local list, k = {}, 0 for _, v in sparse_ipairs(t) do k = k + 1 list[k] = v end return concat(list, sep, i, j) end bjv07xjo7s2ffvu9stl8xil2x52wjqt मॉड्यूल:scripts/canonical names 828 306976 487838 2026-09-02T19:57:13Z SM7 6218 अंग्रेजी विक्षनरी से आयातित 487838 Scribunto text/plain return { ["Adlam"] = "Adlm", ["Afaka"] = "Afak", ["Ahom"] = "Ahom", ["Anatolian hieroglyphic"] = "Hluw", ["Ancient North Arabian"] = "Narb", ["Ancient South Arabian"] = "Sarb", ["Arabic"] = "Arab", ["Armenian"] = "Armn", ["Assamese"] = "as-Beng", ["Avestan"] = "Avst", ["Balbodh"] = "Deva", ["Balinese"] = "Bali", ["Bamum"] = "Bamu", ["Bassa"] = "Bass", ["Batak"] = "Batk", ["Baybayin"] = "Tglg", ["Bengali"] = "Beng", ["Bhaiksuki"] = "Bhks", ["Blissymbolic"] = "Blis", ["Book Pahlavi"] = "Phlv", ["Brahmi"] = "Brah", ["Braille"] = "Brai", ["Buhid"] = "Buhd", ["Burmese"] = "Mymr", ["Canadian syllabic"] = "Cans", ["Carian"] = "Cari", ["Caucasian Albanian"] = "Aghb", ["Chakma"] = "Cakm", ["Cham"] = "Cham", ["Cherokee"] = "Cher", ["Chisoi"] = "Chis", ["Clear Script"] = "xwo-Mong", ["Coptic"] = "Copt", ["Cuneiform"] = "Xsux", ["Cypriot"] = "Cprt", ["Cypro-Minoan"] = "Cpmn", ["Cyrillic"] = "Cyrl", ["Demotic"] = "Egyd", ["Deseret"] = "Dsrt", ["Devanagari"] = "Deva", ["Dhives Akuru"] = "Diak", ["Dogra"] = "Dogr", ["Dongba"] = "Nkdb", ["Duployan"] = "Dupl", ["Egyptian hieroglyphic"] = "Egyp", ["Elbasan"] = "Elba", ["Elymaic"] = "Elym", ["Ethiopic"] = "Ethi", ["Fraktur"] = "Latf", ["Fraser"] = "Lisu", ["Gaelic"] = "Latg", ["Garay"] = "Gara", ["Geba"] = "Nkgb", ["Georgian"] = "Geor", ["Glagolitic"] = "Glag", ["Gothic"] = "Goth", ["Grantha"] = "Gran", ["Greek"] = "Grek", ["Gujarati"] = "Gujr", ["Gunjala Gondi"] = "Gong", ["Gurmukhi"] = "Guru", ["Han"] = "Hani", ["Hangul"] = "Hang", ["Hanifi Rohingya"] = "Rohg", ["Hanunoo"] = "Hano", ["Hatran"] = "Hatr", ["Hebrew"] = "Hebr", ["Hieratic"] = "Egyh", ["Hiragana"] = "Hira", ["Image-rendered"] = "Image", ["Imperial Aramaic"] = "Armi", ["Indus"] = "Inds", ["Inscriptional Pahlavi"] = "Phli", ["Inscriptional Parthian"] = "Prti", ["International Phonetic Alphabet"] = "Ipach", ["Japanese"] = "Jpan", ["Javanese"] = "Java", ["Jurchen"] = "Jurc", ["Kaithi"] = "Kthi", ["Kana"] = "Hrkt", ["Kannada"] = "Knda", ["Katakana"] = "Kana", ["Kawi"] = "Kawi", ["Kayah Li"] = "Kali", ["Kharoshthi"] = "Khar", ["Khema"] = "Gukh", ["Khitan large"] = "Kitl", ["Khitan small"] = "Kits", ["Khmer"] = "Khmr", ["Khojki"] = "Khoj", ["Khom Thai"] = "Khomt", ["Khudabadi"] = "Sind", ["Khutsuri"] = "Geok", ["Khwarezmian"] = "Chrs", ["Kirat Rai"] = "Krai", ["Korean"] = "Kore", ["Kpelle"] = "Kpel", ["Kulitan"] = "Kulit", ["Lai Tay"] = "Tayo", ["Lao"] = "Laoo", ["Latin"] = "Latn", ["Leke"] = "Leke", ["Lepcha"] = "Lepc", ["Limbu"] = "Limb", ["Linear A"] = "Lina", ["Linear B"] = "Linb", ["Loma"] = "Loma", ["Lontara"] = "Bugi", ["Lycian"] = "Lyci", ["Lydian"] = "Lydi", ["Mahajani"] = "Mahj", ["Makasar"] = "Maka", ["Malayalam"] = "Mlym", ["Manchu"] = "mnc-Mong", ["Mandaic"] = "Mand", ["Manichaean"] = "Mani", ["Marchen"] = "Marc", ["Masaram Gondi"] = "Gonm", ["Maya"] = "Maya", ["Medefaidrin"] = "Medf", ["Meitei Mayek"] = "Mtei", ["Mende"] = "Mend", ["Meroitic cursive"] = "Merc", ["Meroitic hieroglyphic"] = "Mero", ["Modi"] = "Modi", ["Mongolian"] = "Mong", ["Moon"] = "Moon", ["Morse code"] = "Morse", ["Mru"] = "Mroo", ["Multani"] = "Mult", ["Mundari Bani"] = "Nagm", ["N'Ko"] = "Nkoo", ["Nabataean"] = "Nbat", ["Nandinagari"] = "Nand", ["New Tai Lue"] = "Talu", ["Newa"] = "Newa", ["Northeastern Iberian"] = "Ibrnn", ["Nyiakeng Puachue Hmong"] = "Hmnp", ["Nüshu"] = "Nshu", ["Odia"] = "Orya", ["Ogham"] = "Ogam", ["Ol Chiki"] = "Olck", ["Ol Onal"] = "Onao", ["Old Cyrillic"] = "Cyrs", ["Old Hungarian"] = "Hung", ["Old Italic"] = "Ital", ["Old Permic"] = "Perm", ["Old Persian"] = "Xpeo", ["Old Sogdian"] = "Sogo", ["Old Turkic"] = "Orkh", ["Old Uyghur"] = "Ougr", ["Osage"] = "Osge", ["Osmanya"] = "Osma", ["Pahawh Hmong"] = "Hmng", ["Palmyrene"] = "Palm", ["Pau Cin Hau"] = "Pauc", ["Pazend"] = "pal-Avst", ["Phags-pa"] = "Phag", ["Phoenician"] = "Phnx", ["Pollard"] = "Plrd", ["Proto-Cuneiform"] = "Pcun", ["Proto-Elamite"] = "Pelm", ["Proto-Sinaitic"] = "Psin", ["Psalter Pahlavi"] = "Phlp", ["Ranjana"] = "Ranj", ["Rejang"] = "Rjng", ["Rongorongo"] = "Roro", ["Rumi numerals"] = "Rumin", ["Runic"] = "Runr", ["Samaritan"] = "Samr", ["Saurashtra"] = "Saur", ["Shahmukhi"] = "Aran", ["Sharada"] = "Shrd", ["Shavian"] = "Shaw", ["Siddham"] = "Sidd", ["Sidetic"] = "Sidt", ["SignWriting"] = "Sgnw", ["Simplified Han"] = "Hans", ["Sinhalese"] = "Sinh", ["Sogdian"] = "Sogd", ["Sorang Sompeng"] = "Sora", ["Southeastern Iberian"] = "Ibrns", ["Soyombo"] = "Soyo", ["Sui"] = "Shui", ["Sundanese"] = "Sund", ["Sunuwar"] = "Sunu", ["Sylheti Nagri"] = "Sylo", ["Syriac"] = "Syrc", ["Tagbanwa"] = "Tagb", ["Tai Nüa"] = "Tale", ["Tai Tham"] = "Lana", ["Tai Viet"] = "Tavt", ["Takri"] = "Takr", ["Tamil"] = "Taml", ["Tamyig"] = "sit-tam-Tibt", ["Tangsa"] = "Tnsa", ["Tangut"] = "Tang", ["Telugu"] = "Telu", ["Tengwar"] = "Teng", ["Thaana"] = "Thaa", ["Thai"] = "Thai", ["Tibetan"] = "Tibt", ["Tifinagh"] = "Tfng", ["Tigalari"] = "Tutg", ["Tirhuta"] = "Tirh", ["Todhri"] = "Todr", ["Tolong Siki"] = "Tols", ["Toto"] = "Toto", ["Traditional Han"] = "Hant", ["Ugaritic"] = "Ugar", ["Vai"] = "Vaii", ["Varang Kshiti"] = "Wara", ["Visible Speech"] = "Visp", ["Vithkuqi"] = "Vith", ["Wancho"] = "Wcho", ["Woleai"] = "Wole", ["Xibe"] = "sjo-Mong", ["Yezidi"] = "Yezi", ["Yi"] = "Yiii", ["Zanabazar Square"] = "Zanb", ["Zhuyin"] = "Bopo", ["Znamenny musical notation"] = "Zname", ["flag semaphore"] = "Semap", ["mathematical notation"] = "Zmth", ["musical notation"] = "Music", ["symbolic"] = "Zsym", ["uncoded"] = "Zzzz", ["undetermined"] = "Zyyy", ["unspecified"] = "None", ["unwritten"] = "Zxxx", } 6b22bp3m71of958rzhttmxwrkuk69zk मॉड्यूल:scripts/canonical names.json 828 306977 487839 2026-09-02T19:59:12Z SM7 6218 "{ "Adlam": "Adlm", "Afaka": "Afak", "Ahom": "Ahom", "Anatolian hieroglyphic": "Hluw", "Ancient North Arabian": "Narb", "Ancient South Arabian": "Sarb", "Arabic": "Arab", "Armenian": "Armn", "Assamese": "as-Beng", "Avestan": "Avst", "Balbodh": "Deva", "Balinese": "Bali", "Bamum": "Bamu", "Bassa": "Bass", "Batak": "Batk", "Baybayin": "Tglg", "Bengali": "Beng", "Bhaiksuki": "Bhks", "Blissymbolic": "Blis", "Book Pa..." के साथ नया पृष्ठ बनाया 487839 json application/json { "Adlam": "Adlm", "Afaka": "Afak", "Ahom": "Ahom", "Anatolian hieroglyphic": "Hluw", "Ancient North Arabian": "Narb", "Ancient South Arabian": "Sarb", "Arabic": "Arab", "Armenian": "Armn", "Assamese": "as-Beng", "Avestan": "Avst", "Balbodh": "Deva", "Balinese": "Bali", "Bamum": "Bamu", "Bassa": "Bass", "Batak": "Batk", "Baybayin": "Tglg", "Bengali": "Beng", "Bhaiksuki": "Bhks", "Blissymbolic": "Blis", "Book Pahlavi": "Phlv", "Brahmi": "Brah", "Braille": "Brai", "Buhid": "Buhd", "Burmese": "Mymr", "Canadian syllabic": "Cans", "Carian": "Cari", "Caucasian Albanian": "Aghb", "Chakma": "Cakm", "Cham": "Cham", "Cherokee": "Cher", "Chisoi": "Chis", "Clear Script": "xwo-Mong", "Coptic": "Copt", "Cuneiform": "Xsux", "Cypriot": "Cprt", "Cypro-Minoan": "Cpmn", "Cyrillic": "Cyrl", "Demotic": "Egyd", "Deseret": "Dsrt", "Devanagari": "Deva", "Dhives Akuru": "Diak", "Dogra": "Dogr", "Dongba": "Nkdb", "Duployan": "Dupl", "Egyptian hieroglyphic": "Egyp", "Elbasan": "Elba", "Elymaic": "Elym", "Ethiopic": "Ethi", "Fraktur": "Latf", "Fraser": "Lisu", "Gaelic": "Latg", "Garay": "Gara", "Geba": "Nkgb", "Georgian": "Geor", "Glagolitic": "Glag", "Gothic": "Goth", "Grantha": "Gran", "Greek": "Grek", "Gujarati": "Gujr", "Gunjala Gondi": "Gong", "Gurmukhi": "Guru", "Han": "Hani", "Hangul": "Hang", "Hanifi Rohingya": "Rohg", "Hanunoo": "Hano", "Hatran": "Hatr", "Hebrew": "Hebr", "Hieratic": "Egyh", "Hiragana": "Hira", "Image-rendered": "Image", "Imperial Aramaic": "Armi", "Indus": "Inds", "Inscriptional Pahlavi": "Phli", "Inscriptional Parthian": "Prti", "International Phonetic Alphabet": "Ipach", "Japanese": "Jpan", "Javanese": "Java", "Jurchen": "Jurc", "Kaithi": "Kthi", "Kana": "Hrkt", "Kannada": "Knda", "Katakana": "Kana", "Kawi": "Kawi", "Kayah Li": "Kali", "Kharoshthi": "Khar", "Khema": "Gukh", "Khitan large": "Kitl", "Khitan small": "Kits", "Khmer": "Khmr", "Khojki": "Khoj", "Khom Thai": "Khomt", "Khudabadi": "Sind", "Khutsuri": "Geok", "Khwarezmian": "Chrs", "Kirat Rai": "Krai", "Korean": "Kore", "Kpelle": "Kpel", "Kulitan": "Kulit", "Lai Tay": "Tayo", "Lao": "Laoo", "Latin": "Latn", "Leke": "Leke", "Lepcha": "Lepc", "Limbu": "Limb", "Linear A": "Lina", "Linear B": "Linb", "Loma": "Loma", "Lontara": "Bugi", "Lycian": "Lyci", "Lydian": "Lydi", "Mahajani": "Mahj", "Makasar": "Maka", "Malayalam": "Mlym", "Manchu": "mnc-Mong", "Mandaic": "Mand", "Manichaean": "Mani", "Marchen": "Marc", "Masaram Gondi": "Gonm", "Maya": "Maya", "Medefaidrin": "Medf", "Meitei Mayek": "Mtei", "Mende": "Mend", "Meroitic cursive": "Merc", "Meroitic hieroglyphic": "Mero", "Modi": "Modi", "Mongolian": "Mong", "Moon": "Moon", "Morse code": "Morse", "Mru": "Mroo", "Multani": "Mult", "Mundari Bani": "Nagm", "N'Ko": "Nkoo", "Nabataean": "Nbat", "Nandinagari": "Nand", "New Tai Lue": "Talu", "Newa": "Newa", "Northeastern Iberian": "Ibrnn", "Nyiakeng Puachue Hmong": "Hmnp", "Nüshu": "Nshu", "Odia": "Orya", "Ogham": "Ogam", "Ol Chiki": "Olck", "Ol Onal": "Onao", "Old Cyrillic": "Cyrs", "Old Hungarian": "Hung", "Old Italic": "Ital", "Old Permic": "Perm", "Old Persian": "Xpeo", "Old Sogdian": "Sogo", "Old Turkic": "Orkh", "Old Uyghur": "Ougr", "Osage": "Osge", "Osmanya": "Osma", "Pahawh Hmong": "Hmng", "Palmyrene": "Palm", "Pau Cin Hau": "Pauc", "Pazend": "pal-Avst", "Phags-pa": "Phag", "Phoenician": "Phnx", "Pollard": "Plrd", "Proto-Cuneiform": "Pcun", "Proto-Elamite": "Pelm", "Proto-Sinaitic": "Psin", "Psalter Pahlavi": "Phlp", "Ranjana": "Ranj", "Rejang": "Rjng", "Rongorongo": "Roro", "Rumi numerals": "Rumin", "Runic": "Runr", "Samaritan": "Samr", "Saurashtra": "Saur", "Shahmukhi": "Aran", "Sharada": "Shrd", "Shavian": "Shaw", "Siddham": "Sidd", "Sidetic": "Sidt", "SignWriting": "Sgnw", "Simplified Han": "Hans", "Sinhalese": "Sinh", "Sogdian": "Sogd", "Sorang Sompeng": "Sora", "Southeastern Iberian": "Ibrns", "Soyombo": "Soyo", "Sui": "Shui", "Sundanese": "Sund", "Sunuwar": "Sunu", "Sylheti Nagri": "Sylo", "Syriac": "Syrc", "Tagbanwa": "Tagb", "Tai Nüa": "Tale", "Tai Tham": "Lana", "Tai Viet": "Tavt", "Takri": "Takr", "Tamil": "Taml", "Tamyig": "sit-tam-Tibt", "Tangsa": "Tnsa", "Tangut": "Tang", "Telugu": "Telu", "Tengwar": "Teng", "Thaana": "Thaa", "Thai": "Thai", "Tibetan": "Tibt", "Tifinagh": "Tfng", "Tigalari": "Tutg", "Tirhuta": "Tirh", "Todhri": "Todr", "Tolong Siki": "Tols", "Toto": "Toto", "Traditional Han": "Hant", "Ugaritic": "Ugar", "Vai": "Vaii", "Varang Kshiti": "Wara", "Visible Speech": "Visp", "Vithkuqi": "Vith", "Wancho": "Wcho", "Woleai": "Wole", "Xibe": "sjo-Mong", "Yezidi": "Yezi", "Yi": "Yiii", "Zanabazar Square": "Zanb", "Zhuyin": "Bopo", "Znamenny musical notation": "Zname", "flag semaphore": "Semap", "mathematical notation": "Zmth", "musical notation": "Music", "symbolic": "Zsym", "uncoded": "Zzzz", "undetermined": "Zyyy", "unspecified": "None", "unwritten": "Zxxx" } i93e49hv0i31oyjmfvncnyu054ybq9l मॉड्यूल:category tree/fam 828 306978 487840 2026-09-02T20:01:04Z SM7 6218 अंग्रेजी विक्षनरी से आयातित 487840 Scribunto text/plain -- This module contains a list of families with family-specific modules. local families_with_modules = { ["alg"] = true, ["gem"] = true, ["jpx"] = true, ["qfa-kor"] = true, ["roa-ibe"] = true, ["sem-ara"] = true, ["sla"] = true, ["trk"] = true, ["tup"] = true, ["zhx"] = true, } return families_with_modules i4uemo2elq7n14h8788ftpa3rouz69z 487849 487840 2026-09-02T20:12:27Z SM7 6218 कुछ को छुपाया 487849 Scribunto text/plain -- This module contains a list of families with family-specific modules. local families_with_modules = { -- ["alg"] = true, -- ["gem"] = true, -- ["jpx"] = true, ["qfa-kor"] = true, -- ["roa-ibe"] = true, -- ["sem-ara"] = true, -- ["sla"] = true, ["trk"] = true, -- ["tup"] = true, -- ["zhx"] = true, } return families_with_modules mxv96g2mffbnwrrqj741fncjq7yolav मॉड्यूल:table/sparseIpairs 828 306979 487841 2026-09-02T20:02:49Z SM7 6218 अंग्रेजी विक्षनरी से आयातित 487841 Scribunto text/plain local table_num_keys_module = "Module:table/numKeys" local function num_keys(...) num_keys = require(table_num_keys_module) return num_keys(...) end --[==[ An iterator which works like `ipairs`, but which works for sparse arrays.]==] return function(t) local keys, i = num_keys(t), 0 return function() i = i + 1 local k = keys[i] if k ~= nil then return k, t[k] end end end awvh1kj2qsubuy2anwvpmp6t7xxz299 मॉड्यूल:labels/utilities 828 306980 487842 2026-09-02T20:03:19Z SM7 6218 अंग्रेजी विक्षनरी से आयातित 487842 Scribunto text/plain local export = {} -- This module contains ancillary functions for manipulating labels. Currently the supported functions are for finding -- the labels that generate a given category. local m_labels = require("Module:labels") local languages_module = "Module:languages" --[==[ Find the labels matching category `cat` of type `cat_type` for language `lang` (a full language object). `lang` can be {nil}, but in that case no language-specific labels will be fetched. Currently supported values for `cat_type` are {"topic"} for topic categories, e.g. {en:Water}; {"pos"} for POS categories, e.g. {English attenuative verbs}; {"regional"} for regional categories, e.g. {Ghanaian English}; {"sense"} for sense-dependent categories, e.g. {English obsolete terms} or {English terms with obsolete senses} (where the particular category chosen depends on whether {{tl|lb}} or {{tl|tlb}} is used); and {"plain"} for plain categories, e.g. {Issime Walser}. The format of `cat` depends on `cat_type`, but in general is the portion of the category minus the language prefix or suffix. For topic categories it should be e.g. {"water"} or {"Water"} (either form works); for POS categories it should be e.g. {"attenuative verbs"}; for regional categories it should be e.g. {"Ghanaian"}; for sense categories it should be e.g. {"obsolete"}; and for plain categories it should be e.g. {"Issime Walser"} (the actual category name). Note that this will only check for categories of the specified type. In particular, since the format of POS and sense-dependent categories overlaps, you may need to check for labels with both types of categories. (This is done, for example, in [[Module:category tree/poscatboiler]]; see that module for details.) Likewise with regional and plain categories. (See the code in [[Module:category tree/poscatboiler/data/language varieties]] that handles both types of categories.) If `cat_type` is {"plain"} and `check_all_langs` is specified, the code will check all language-specific modules for plan categories matching `cat`. In that case, the relevant language is returned in the return value structure (see below). The return value is a table whose keys are concatenations of labels and language codes (separated by a colon), and whose values are objects with the following keys: * `module` (the name of the module from which the label was fetched); * `labdata` (the raw label data structure from this module); * `canonical` (the canonical form of the label); * `aliases` (a list of any aliases for the label, not including the label itself); * `lang` (the language needed to generate the category using the label; this will always be the passed-in `lang` unless `check_all_langs` is specified, in which case it may be a different language). The table can be directly passed to `format_labels_categorizing`. ]==] function export.find_labels_for_category(cat, cat_type, lang, check_all_langs) local function ucfirst(txt) return mw.getContentLanguage():ucfirst(txt) end local function transform_cat_for_comparison(cat) if cat_type ~= "pos" and cat_type ~= "sense" then cat = ucfirst(cat) end return cat end local function should_error_on_cat(cat) if cat_type == "topic" then return cat:find("^[Aa]ll ") elseif cat_type == "pos" then return cat == "lemmas" elseif cat_type == "regional" then return cat == "British" -- an arbitrary known regional category elseif cat_type == "sense" then return cat == "obsolete" -- an arbitrary known sense category else return cat == "Issime Walser" -- an arbitrary known plain category end end local function labcat_matches(labcat) if cat_type ~= "pos" and cat_type ~= "sense" then return ucfirst(labcat) == cat else return labcat == cat end end local function fetch_labdata_cats(labdata) if cat_type == "topic" then return labdata.topical_categories elseif cat_type == "pos" then return labdata.pos_categories elseif cat_type == "regional" then return labdata.regional_categories elseif cat_type == "sense" then return labdata.sense_categories else return labdata.plain_categories end end cat = transform_cat_for_comparison(cat) local cat_labels_found = {} local prev_modules_labels_found = {} local this_module_labels_found local function check_submodule(submodule_to_check, lang) if this_module_labels_found then for label, _ in pairs(this_module_labels_found) do prev_modules_labels_found[label] = true end end this_module_labels_found = {} local submodule = mw.loadData(submodule_to_check) for label, labdata in pairs(submodule) do local canonical = label local num_hops = 0 local hop_error = false while type(labdata) == "string" do num_hops = num_hops + 1 if num_hops >= 10 then if should_error_on_cat(cat) then error(("Internal error: Likely alias loop processing label '%s' in submodule '%s'"):format(label, submodule_to_check)) else hop_error = true break end end -- an alias canonical = labdata labdata = submodule[labdata] end if hop_error then -- skip this label elseif not labdata then if should_error_on_cat(cat) then -- Only error at top level to avoid a flood of errors. error(("Internal error: In submodule '%s', label '%s' is aliased to '%s', which doesn't exist"):format(submodule_to_check, label, canonical)) end else -- Deprecated labels directly assign an object to aliases, where `canonical` is the canonical label. if labdata.canonical then canonical = labdata.canonical end local labcats = fetch_labdata_cats(labdata) local matching_labcat if labcats then if type(labcats) ~= "table" then labcats = {labcats} end for _, labcat in ipairs(labcats) do if labcat == true then labcat = canonical end if labcat_matches(labcat) then matching_labcat = true break end end end local canonical_with_lang = canonical .. ":" .. (lang and lang:getCode() or "nil") if matching_labcat and not prev_modules_labels_found[canonical_with_lang] then this_module_labels_found[canonical_with_lang] = true if not cat_labels_found[canonical_with_lang] then cat_labels_found[canonical_with_lang] = { module = submodule_to_check, canonical = canonical, aliases = {}, lang = lang, labdata = labdata } end if canonical ~= label then table.insert(cat_labels_found[canonical_with_lang].aliases, label) end end end end end local submodules_to_check if check_all_langs then if cat_type ~= "plain" then error("Currently, `check_all_langs` only supported with category type \"plain\"") end submodules_to_check = {} local all_lang_codes = mw.loadData(m_labels.lang_specific_data_list_module) for lang_code, _ in pairs(all_lang_codes.langs_with_lang_specific_modules) do local lang = require(languages_module).getByCode(lang_code) if lang then table.insert(submodules_to_check, { module = m_labels.lang_specific_data_modules_prefix .. lang_code, lang = lang }) end end for _, submodule_to_check in ipairs(m_labels.get_submodules(nil)) do table.insert(submodules_to_check, {module = submodule_to_check, lang = lang}) end else submodules_to_check = m_labels.get_submodules(lang) for i, submodule_to_check in ipairs(submodules_to_check) do submodules_to_check[i] = {module = submodule_to_check, lang = lang} end end for _, submodule_to_check in ipairs(submodules_to_check) do check_submodule(submodule_to_check.module, submodule_to_check.lang) end return cat_labels_found end --[==[ Format the labels that categorize into some category for display in the text for that category. `lang` is the language of the category, or {nil}. `labels` are the labels that categorize when invoked using {{tl|lb}}, while `tlb_labels` are the labels that categorize when invoked using {{tl|tlb}}. Both of these parameters are tables whose keys are concatenations of labels and language codes and whose values are objects as returned by `find_labels_for_category`. Returns {nil} if there are no labels. ]==] function export.format_labels_categorizing(labels, tlb_labels, lang) local function make_code(txt) return ("<code>%s</code>"):format(txt) end local function generate_label_set_text(labels, use_tlb, include_in_addition) local labels_by_lang = {} for _, labobj in pairs(labels) do local labobj_code = labobj.lang and labobj.lang:getCode() or false if not labels_by_lang[labobj_code] then labels_by_lang[labobj_code] = {} end table.insert(labels_by_lang[labobj_code], labobj) end local function process_lang_labels(labels) local formatted_labels = {} local has_aliases = false if labels then for _, labobj in ipairs(labels) do local function make_edit_button() return ("<sup>[%s edit]</sup>"):format(tostring(mw.uri.fullUrl(labobj.module, "action=edit"))) end local label = labobj.canonical local aliases = labobj.aliases if #aliases == 0 then table.insert(formatted_labels, make_code(label) .. make_edit_button()) elseif #aliases == 1 then table.insert(formatted_labels, ("%s (alias %s)%s"):format(make_code(label), make_code(aliases[1]), make_edit_button())) has_aliases = true else table.sort(aliases) for i, alias in ipairs(aliases) do aliases[i] = make_code(alias) end table.insert(formatted_labels, ("%s (aliases %s)%s"):format(make_code(label),table.concat(aliases, ", "), make_edit_button())) has_aliases = true end end end return formatted_labels, has_aliases end local function get_intro_text(num_labels, include_also) local intro_wording = not include_also and include_in_addition and "In addition, the" or "The" local sense_dependent = use_tlb and "sense-dependent " or "" return ("%s following %slabel%s %sgenerate%s this category:"):format(intro_wording, sense_dependent, num_labels == 1 and "" or "s", include_also and "also " or "", num_labels == 1 and "s" or "") end local function get_label_text(label_lang, formatted_labels, has_aliases) table.sort(formatted_labels) local retval = table.concat(formatted_labels, "; ") .. ". " local template = use_tlb and "tlb" or "lb" local this_label_text if #formatted_labels == 1 and not has_aliases then this_label_text = "this label" else this_label_text = "one of these labels" end if label_lang then retval = retval .. ("To generate this category using %s, use {{tl|%s|%s|<var>label</var>}}."):format( this_label_text, template, label_lang:getCode()) else retval = retval .. ("To generate this category using %s, use {{tl|%s|<var>langcode</var>|<var>label</var>}}, " .. "where <code><var>langcode</var></code> is the appropriate language code for the language in question " .. "(see [[Wiktionary:List of languages]])."):format(this_label_text, template) end return retval end if not lang then local formatted_labels, has_aliases = process_lang_labels(labels_by_lang[false]) if #formatted_labels > 0 then local intro_text = get_intro_text(#formatted_labels) local label_text = get_label_text(false, formatted_labels, has_aliases) return intro_text .. " " .. label_text end else local formatted_labels, has_aliases = process_lang_labels(labels_by_lang[lang:getCode()]) local this_lang_text if #formatted_labels > 0 then local intro_text = get_intro_text(#formatted_labels) local label_text = get_label_text(lang, formatted_labels, has_aliases) this_lang_text = intro_text .. " " .. label_text end local langcode = lang:getCode() local other_langs_label_text = {} local total_num_other_lang_labels = 0 for other_lang_code, lang_labels in pairs(labels_by_lang) do if other_lang_code ~= langcode then local formatted_labels, has_aliases = process_lang_labels(lang_labels) if #formatted_labels > 0 then total_num_other_lang_labels = total_num_other_lang_labels + #formatted_labels local other_lang = require(languages_module).getByCode(other_lang_code, true, "allow etym") local label_text = get_label_text(other_lang, formatted_labels, has_aliases) table.insert(other_langs_label_text, ("* For %s: %s"):format(other_lang:getCanonicalName(), label_text)) end end end local other_lang_text if total_num_other_lang_labels > 0 then table.sort(other_langs_label_text) local intro_text = get_intro_text(total_num_other_lang_labels, this_lang_text and "include also") other_lang_text = intro_text .. "\n" .. table.concat(other_langs_label_text, "\n") end if this_lang_text and other_lang_text then return ("%s\n\n%s"):format(this_lang_text, other_lang_text) else return this_lang_text or other_lang_text end end end local labels_text = generate_label_set_text(labels) local tlb_labels_text = tlb_labels and generate_label_set_text(tlb_labels, "use tlb", labels_text and "include in addition") or nil if labels_text and tlb_labels_text then return ("%s\n\n%s"):format(labels_text, tlb_labels_text) else return labels_text or tlb_labels_text end end return export crgb29elv68h2qsr1ml03cepd5uto1h साँचा:commons category 10 306981 487843 2026-09-02T20:05:54Z SM7 6218 "{{interproject-box|logo=Commons-logo.svg|logolink=commons:Category:{{{1|{{ucfirst:{{PAGENAME}}}}}}}|intro=[[c:|Wikimedia Commons]] has media about|noitalic={{#ifeq:{{{3|}}}|ni|1|}}|link=[[c:Category:{{{1|{{ucfirst:{{PAGENAME}}}}}}}|{{{2|{{{1|{{ucfirst:{{PAGENAME}}}}}}}}}}]]}}<noinclude>{{documentation}}</noinclude>" के साथ नया पृष्ठ बनाया 487843 wikitext text/x-wiki {{interproject-box|logo=Commons-logo.svg|logolink=commons:Category:{{{1|{{ucfirst:{{PAGENAME}}}}}}}|intro=[[c:|Wikimedia Commons]] has media about|noitalic={{#ifeq:{{{3|}}}|ni|1|}}|link=[[c:Category:{{{1|{{ucfirst:{{PAGENAME}}}}}}}|{{{2|{{{1|{{ucfirst:{{PAGENAME}}}}}}}}}}]]}}<noinclude>{{documentation}}</noinclude> 71adsemdad3dpdyhl8wm4t0zbad2jzk साँचा:interproject-box 10 306982 487844 2026-09-02T20:06:24Z SM7 6218 अंग्रेजी विक्षनरी से आयातित 487844 wikitext text/x-wiki <includeonly><div class="interproject-box {{#if:{{{sisterclass|}}}|sister-{{{sisterclass}}}}} sister-project noprint floatright"><div style="float: left;" class="interproject-box-logo">[[File:{{{logo}}}|{{{logosize|x40px}}}|none|link={{{logolink|}}}|alt={{{logoalt|}}}]]</div><div style="margin-left: 60px;">{{{intro}}}:<div style="margin-left: 10px;">{{#if:{{{nobold|}}}|<span {{#if:{{{nolang|}}}|| class="Latn" lang="en"}}>|<b {{#if:{{{nolang|}}}|| class="Latn" lang="en"}}>}}{{#if:{{{noitalic|}}}||<i>}}{{{link|}}}{{#if:{{{noitalic|}}}||</i>}}{{#if:{{{nobold|}}}|</span>|</b>}}</div></div>{{#if:{{{interprojectlink|}}}|<span class="interProject">{{{interprojectlink}}}</span>}}</div><templatestyles src="Module:interproject/style.css" /></includeonly><noinclude>{{interproject-box|logo=Commons-emblem-success.svg|logoalt=Hello, World!|intro=This Wiktionary template has more information on {{FULLPAGENAME}}|link=[[#documentation|{{FULLPAGENAME}}]]}}{{documentation}}</noinclude> 3eoiinhktx1dffstt568c2vkft2svjd साँचा:commonscat 10 306983 487845 2026-09-02T20:06:30Z SM7 6218 [[साँचा:commons category]] को अनुप्रेषित 487845 wikitext text/x-wiki #पुनर्प्रेषित [[साँचा:commons category]] sla5wxnvs20ckvt49fc0cwc2giovkqu मॉड्यूल:interproject/style.css 828 306984 487846 2026-09-02T20:07:23Z SM7 6218 अंग्रेजी विक्षनरी से आयातित 487846 sanitized-css text/css /* note: these styles are also used by some legacy templates that do not use the module. thus a full redesign should probably use a new class. */ .interproject-box { font-size: 90%; width: 250px; padding: 5px; text-align: left; background: var(--wikt-palette-paleblue, #f9f9f9); border: var(--border-color-base, #aaa) 1px solid; display: flex; flex-direction: row; align-items: center; } .interproject-box-logo { min-width: 44px; display: flex; align-items: center; justify-content: center; } /* override inline styles */ .interproject-box > div:first-child { float: none !important; flex: none; } .interproject-box > div:nth-child(2) { margin-left: 0.55em !important; } /* allow {{commonscat}} to be smaller in Vector skin */ body.skin-vector:not(.skin-vector-2022) .interproject-box .vector-hide { display: none; } body.skin-vector:not(.skin-vector-2022) .interproject-box .vector-inline-block { display: inline-block; margin-left: 0 !important; } @media screen and (max-width: 719px) { /* >=720px is the crossover point for floats to work */ .interproject-box { box-sizing: border-box; line-height: 1.5; width: 100%; max-width: 100%; padding: 6px; } } m9k5xbng6wuwr54i1j6n3x45wmrntyz मॉड्यूल:category tree/fam/qfa-kor 828 306985 487848 2026-09-02T20:10:11Z SM7 6218 अंग्रेजी विक्षनरी से आयातित 487848 Scribunto text/plain local labels = {} local handlers = {} labels["hanja"] = { topright = "{{wp|Hanja}}", description = "{{{langname}}} symbols of the Han logographic script, which can represent sounds or convey meanings directly.", toc_template = "Hani-categoryTOC", umbrella = "Han characters", parents = "logograms", } labels["hanja forms"] = { topright = "{{wp|Hanja}}", description = "{{{langname}}} terms written in [[hanja]].", parents = "terms by script", } labels["idu forms"] = { topright = "{{wp|Idu script}}", description = "{{{langname}}} terms written in [[idu]].", parents = "terms by script", } labels["four-character idioms"] = { topright = "{{wp|Sajaseong-eo}}", description = "{{{langname}}} traditional idiomatic expressions, also called sajaseong-eo, usually consisting of four syllables and traditionally given in [[hanja]]; typically derived from [[Classical Chinese]].", additional = "Compare Chinese {{w|chengyu}} and Japanese {{w|yojijukugo}}.", umbrella = "four-character idioms", parents = "idioms", } labels["terms written in Hanja-Hangul mixed script"] = { topright = "{{wp|Korean mixed script}}", description = "{{{langname}}} mixed script is a form of writing that uses both [[hangeul]] (hangul) (an alphabetical script) and [[hanja]] (logo-syllabic characters).", parents = "terms written in multiple scripts", } return {LABELS = labels, HANDLERS = handlers} sg8wfygn9ns7dv1gh1uvf8z468u1th2 मॉड्यूल:category tree/fam/trk 828 306986 487850 2026-09-02T20:13:12Z SM7 6218 अंग्रेजी विक्षनरी से आयातित 487850 Scribunto text/plain local labels = {} ------- Turkic izafet I/II/III compounds ------- -- FIXME: Possibly should be limited to a subfamily of Turkic. labels["izafet I compounds"] = { description = "{{{langname}}} izafet I compounds, i.e. nominal compounds consisting of two nouns both lacking 3rd-person possessive marking.", additional = "These compounds are right-headed (the second noun is modified by the first), unlike Persian {{lg|ezafe}} compounds, which are typically left-headed.", breadcrumb_and_first_sort_key = "izafet I", parents = {"compound terms"}, } labels["izafet II compounds"] = { description = "{{{langname}}} izafet II compounds, i.e. nominal compounds with the first noun having zero-marking, and the second noun receiving a possessive suffix.", additional = "These compounds are right-headed (the second noun is modified by the first), unlike Persian {{lg|ezafe}} compounds, which are typically left-headed.", breadcrumb_and_first_sort_key = "izafet II", parents = {"compound terms"}, } labels["izafet III compounds"] = { description = "{{{langname}}} izafet III compounds, i.e. nominal compounds with the first noun in the genitive case and the second noun receiving a possessive suffix.", additional = "These compounds are right-headed (the second noun is modified by the first), unlike Persian {{lg|ezafe}} compounds, which are typically left-headed.", breadcrumb_and_first_sort_key = "izafet III", parents = {"compound terms"}, } labels["Persian-style izafet compounds"] = { description = "{{{langname}}} Persian-style izafet compounds, i.e. left-headed nominal compounds with the first noun receiving a Persian-style {{lg|ezafe}} suffix and the second noun having zero-marking.", additional = "These compounds are left-headed (the first noun is modified by second), unlike native Turkic izafet compounds, which are always right-headed.", breadcrumb_and_first_sort_key = "Persian-style", parents = {"izafet II compounds"}, } -- Add 'umbrella_parents' key if not already present. for key, data in pairs(labels) do if not data.umbrella_parents then data.umbrella_parents = "Types of compound terms by language" end end return {LABELS = labels} ps5lfysh0wgnpjatzdh4pzsy8y1w7y6 मॉड्यूल:category tree/lang 828 306987 487857 2026-09-02T20:49:37Z SM7 6218 अंग्रेजी विक्षनरी से आयातित 487857 Scribunto text/plain -- This module contains a list of languages with lang-specific modules. local langs_with_modules = { ["acm"] = true, ["acw"] = true, ["acy"] = true, ["aeb"] = true, ["afb"] = true, ["aii"] = true, ["ajp"] = true, ["akk"] = true, ["akl"] = true, ["ang"] = true, ["apc"] = true, ["apd"] = true, ["ar"] = true, ["arn"] = true, ["ars"] = true, ["ary"] = true, ["arz"] = true, ["ayl"] = true, ["az"] = true, ["bbl"] = true, ["be"] = true, ["bcl"] = true, ["bg"] = true, ["bku"] = true, ["ca"] = true, ["cbk"] = true, ["ce"] = true, ["ceb"] = true, ["cpi"] = true, ["cs"] = true, ["csb"] = true, ["cu"] = true, ["cy"] = true, ["de"] = true, ["egy"] = true, ["el"] = true, ["en"] = true, ["enm"] = true, ["eo"] = true, ["es"] = true, ["et"] = true, ["eu"] = true, ["fa"] = true, ["fax"] = true, ["fi"] = true, ["fr"] = true, ["fro"] = true, ["fy"] = true, ["gho"] = true, ["gl"] = true, ["gmh"] = true, ["goh"] = true, ["got"] = true, ["grk-pro"] = true, ["gmq-osw"] = true, ["gmw-pro"] = true, ["gu"] = true, ["gug"] = true, ["he"] = true, ["hi"] = true, ["hil"] = true, ["hnn"] = true, ["hrx"] = true, ["hsb"] = true, ["hu"] = true, ["id"] = true, ["ilo"] = true, ["inc-apa"] = true, ["inc-ash"] = true, ["ine-bsl-pro"] = true, ["ine-pro"] = true, ["ira-pro"] = true, ["is"] = true, ["it"] = true, ["ja"] = true, ["jbo"] = true, ["jv"] = true, ["ket"] = true, ["klj"] = true, ["kn"] = true, ["kne"] = true, ["ko"] = true, ["krj"] = true, ["ky"] = true, ["la"] = true, ["lo"] = true, ["mdh"] = true, ["mhr"] = true, ["mk"] = true, ["moh"] = true, ["mr"] = true, ["mrw"] = true, ["ms"] = true, ["mt"] = true, ["mul"] = true, ["mvi"] = true, ["mwl"] = true, ["nan-hbl"] = true, ["nb"] = true, ["ne"] = true, ["nl"] = true, ["nn"] = true, ["non"] = true, ["ny"] = true, ["odt"] = true, ["orv"] = true, ["osx"] = true, ["pag"] = true, ["pam"] = true, ["phl"] = true, ["pi"] = true, ["pl"] = true, ["pra"] = true, ["pt"] = true, ["ro"] = true, ["roa-opt"] = true, ["rsk"] = true, ["ru"] = true, ["rue"] = true, ["sa"] = true, ["sc"] = true, ["sd"] = true, ["sei"] = true, ["sga"] = true, ["sh"] = true, ["shn"] = true, ["shu"] = true, ["sk"] = true, ["skr"] = true, ["sw"] = true, ["syc"] = true, ["szl"] = true, ["te"] = true, ["tg"] = true, ["th"] = true, ["tl"] = true, ["tpw"] = true, ["tsg"] = true, ["uk"] = true, ["ulw"] = true, ["ur"] = true, ["vec"] = true, ["vep"] = true, ["vi"] = true, ["war"] = true, ["yrl"] = true, ["zhx"] = true, ["zle-ono"] = true, ["zle-ort"] = true, ["zlw-ocs"] = true, } return langs_with_modules b69j2h0jp2mxg9nt3u7afqo7fn7gk8m কৃষক 0 306988 487860 2026-09-03T05:40:48Z अजीत कुमार तिवारी 4887 +1 487860 wikitext text/x-wiki ==असमिया== ===संज्ञा=== {{as-noun}} # [[कृषक]] # [[किसान]] === प्रकाशित कोशों से अर्थ === ==== हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश ==== खेती-बारी करने वाला, कृषक। (पुल्लिंग) [[श्रेणी: हिन्दी-प्रकाशितकोशों से अर्थ-हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश]] 8xef7zkkovqrp61xs0h16ejbyzx2jrg 487873 487860 2026-09-03T10:03:19Z SM7 6218 +बंगाली + व्युत्पत्ति साँचे (परीक्षण हेतु) 487873 wikitext text/x-wiki ==असमिया== ===व्युत्पत्ति=== {{lbor|as|sa|कृषक}}. ===संज्ञा=== {{as-noun}} # [[कृषक]] # [[किसान]] === प्रकाशित कोशों से अर्थ === ==== हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश ==== # खेती-बारी करने वाला, कृषक। (पुल्लिंग) {{C|as|लोग}} [[श्रेणी:हिन्दी-प्रकाशितकोशों से अर्थ-हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश]] ==बंगाली== ===व्युत्पत्ति=== {{lbor|bn|sa|कृषक}}. ===उच्चारण=== {{bn-IPA}} ===संज्ञा=== {{bn-noun}} # [[किसान]], [[कृषक]], खेतीबाड़ी करने वाला। {{C|bn|लोग}} 44amfpp7scmpvpw4002yezrw5djk73s 487877 487873 2026-09-03T10:08:46Z SM7 6218 सामग्री को "{{lbor|as|sa|कृषक}}." में बदला 487877 wikitext text/x-wiki {{lbor|as|sa|कृषक}}. gkqsmtejipqp92b2jkttwow9j4eaqcm 487889 487877 2026-09-03T10:37:02Z SM7 6218 स्टेप बैक 487889 wikitext text/x-wiki ==असमिया== ===व्युत्पत्ति=== {{lbor|as|sa|कृषक}}. ===संज्ञा=== {{as-noun}} # [[कृषक]] # [[किसान]] === प्रकाशित कोशों से अर्थ === ==== हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश ==== # खेती-बारी करने वाला, कृषक। (पुल्लिंग) {{C|as|लोग}} [[श्रेणी:हिन्दी-प्रकाशितकोशों से अर्थ-हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश]] ==बंगाली== ===व्युत्पत्ति=== {{lbor|bn|sa|कृषक}}. ===उच्चारण=== {{bn-IPA}} ===संज्ञा=== {{bn-noun}} # [[किसान]], [[कृषक]], खेतीबाड़ी करने वाला। {{C|bn|लोग}} 44amfpp7scmpvpw4002yezrw5djk73s কিস্তি 0 306989 487861 2026-09-03T05:50:16Z अजीत कुमार तिवारी 4887 +1 487861 wikitext text/x-wiki ==असमिया== ===संज्ञा=== {{as-noun}} # [[किस्त]] # [[क़िस्त]] === प्रकाशित कोशों से अर्थ === ==== हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश ==== # ऋण के भुगतान करने की वह प्रणाली जिसके अनुसार ऋणी को कुछ निश्चित अवधियों में ऋण को कई बराबर खंडों में चुकाना पड़ता है; # एक किस्त में चुकाए गए ऋण की मात्रा; # किसी वस्तु की प्राप्त कुल मात्रा का वह अंश जो किसी एक अवधि में दिया या लिया जाय। (स्त्रीलिंग) [[श्रेणी: हिन्दी-प्रकाशितकोशों से अर्थ-हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश]] orxeycli9ox02j8vsiouc9dnofdwk39 অপচেষ্টা 0 306990 487862 2026-09-03T06:05:28Z अजीत कुमार तिवारी 4887 +1 487862 wikitext text/x-wiki ==असमिया== ===संज्ञा=== {{as-noun}} # [[कुचेष्टा]] === प्रकाशित कोशों से अर्थ === ==== हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश ==== बुरा कार्य करने का प्रयत्‍न। (स्त्रीलिंग) [[श्रेणी: हिन्दी-प्रकाशितकोशों से अर्थ-हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश]] a9wii2d3lt3r6jowq8tuihxpfz7epe5 কেইটামান 0 306991 487863 2026-09-03T06:07:46Z अजीत कुमार तिवारी 4887 +1 487863 wikitext text/x-wiki ==असमिया== ===विशेषण=== {{as-adj}} # [[कुछेक]] === प्रकाशित कोशों से अर्थ === ==== हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश ==== गिनती या संख्या में कम, थोड़ा। [[श्रेणी: हिन्दी-प्रकाशितकोशों से अर्थ-हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश]] g6rfx0t8c33lp5ce6e23pn7kovxvlik 487864 487863 2026-09-03T06:12:06Z अजीत कुमार तिवारी 4887 /* विशेषण */ 487864 wikitext text/x-wiki ==असमिया== ===विशेषण=== {{as-adj}} # [[किंचित्]] === प्रकाशित कोशों से अर्थ === ==== हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश ==== गिनती या संख्या में कम, थोड़ा। [[श्रेणी: हिन्दी-प्रकाशितकोशों से अर्थ-हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश]] 07cfbtvr363k2x42ao0mpigz64o4l8v কুটনী 0 306992 487865 2026-09-03T06:17:49Z अजीत कुमार तिवारी 4887 +1 487865 wikitext text/x-wiki ==असमिया== ===संज्ञा=== {{as-adj}} # [[कुटनी]] === प्रकाशित कोशों से अर्थ === ==== हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश ==== # स्त्रियों को बहकाकर उन्हें परपुरुष से मिलानेवाली स्त्री; # दो पक्षों या व्यक्तियों में झगड़ा करानेवाली स्त्री। (स्त्रीलिंग) [[श्रेणी: हिन्दी-प्रकाशितकोशों से अर्थ-हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश]] ddw8a0jsb2tnq7gmigsh5j1nptvxuil 487866 487865 2026-09-03T06:20:09Z अजीत कुमार तिवारी 4887 487866 wikitext text/x-wiki ==असमिया== ===संज्ञा=== {{as-noun}} # [[कुटनी]] === प्रकाशित कोशों से अर्थ === ==== हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश ==== # स्त्रियों को बहकाकर उन्हें परपुरुष से मिलानेवाली स्त्री; # दो पक्षों या व्यक्तियों में झगड़ा करानेवाली स्त्री। (स्त्रीलिंग) [[श्रेणी: हिन्दी-प्रकाशितकोशों से अर्थ-हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश]] 9p5309texs4iy68e3mbx5m86n7z1z67 কুঠাৰ 0 306993 487867 2026-09-03T06:23:05Z अजीत कुमार तिवारी 4887 +1 487867 wikitext text/x-wiki ==असमिया== ===संज्ञा=== {{as-noun}} # [[कुठार]] # [[परशु]] === प्रकाशित कोशों से अर्थ === ==== हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश ==== # कुल्हाड़ा; # फरसा। (पुल्लिंग) [[श्रेणी: हिन्दी-प्रकाशितकोशों से अर्थ-हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश]] 38zjwu82y6a2yfi0o7yo0onrdbyuuvu কোৰ 0 306994 487868 2026-09-03T06:29:54Z अजीत कुमार तिवारी 4887 +1 487868 wikitext text/x-wiki ==असमिया== ===संज्ञा=== {{as-noun}} # [[कुदाल]] === प्रकाशित कोशों से अर्थ === ==== हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश ==== मिट्टी खोदने और खेत गोड़ने का एक औजार जिसमें लकड़ी का एक वेंट लगा होता है। (पुल्लिंग) [[श्रेणी: हिन्दी-प्रकाशितकोशों से अर्थ-हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश]] hrbbdcembcf1vflm8w3iyx4jscvkcc2 487869 487868 2026-09-03T06:32:38Z अजीत कुमार तिवारी 4887 487869 wikitext text/x-wiki ==असमिया== [[File:COLLECTIE TROPENMUSEUM Hak TMnr A-3790.jpg|thumb|কোৰ]] ===संज्ञा=== {{as-noun}} # [[कुदाल]] === प्रकाशित कोशों से अर्थ === ==== हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश ==== मिट्टी खोदने और खेत गोड़ने का एक औजार जिसमें लकड़ी का एक वेंट लगा होता है। (पुल्लिंग) [[श्रेणी: हिन्दी-प्रकाशितकोशों से अर्थ-हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश]] 9rcqqwsxlinm363s54fi38lbj91dua4 অপৰিপুষ্টি 0 306995 487870 2026-09-03T06:37:29Z अजीत कुमार तिवारी 4887 +1 487870 wikitext text/x-wiki ==असमिया== ===संज्ञा=== {{as-noun}} # [[कुपोषण]] === प्रकाशित कोशों से अर्थ === ==== हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश ==== शरीर के लिए ऐसा पोषण जो अनुपयुक्त और हानिकारक हो। (पुल्लिंग) [[श्रेणी: हिन्दी-प्रकाशितकोशों से अर्थ-हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश]] ro9dniltep1p6gxdykixw3u1ez2icb9 অব্য়বস্থা 0 306996 487871 2026-09-03T06:49:57Z अजीत कुमार तिवारी 4887 +1 487871 wikitext text/x-wiki ==असमिया== ===संज्ञा=== {{as-noun}} # [[अव्यवस्था]] # [[कुप्रबंध]] === प्रकाशित कोशों से अर्थ === ==== हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश ==== उचित व्यवस्था का न होना, खराब या बुरा प्रबंध। (स्त्रीलिंग) [[श्रेणी: हिन्दी-प्रकाशितकोशों से अर्थ-हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश]] i8mqkrd0moo9rrs2oqmr16lzv7vjndq 487872 487871 2026-09-03T06:51:39Z अजीत कुमार तिवारी 4887 /* संज्ञा */ 487872 wikitext text/x-wiki ==असमिया== ===संज्ञा=== {{as-noun}} # [[अव्यवस्था]] === प्रकाशित कोशों से अर्थ === ==== हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश ==== उचित व्यवस्था का न होना, खराब या बुरा प्रबंध। (स्त्रीलिंग) [[श्रेणी: हिन्दी-प्रकाशितकोशों से अर्थ-हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश]] 3y1kvlp7b28nsijwkpq6udl7xzwgcx6 साँचा:bn-noun 10 306997 487874 2026-09-03T10:04:44Z SM7 6218 नया साँचा अंग्रेजी से कॉपी करके 487874 wikitext text/x-wiki {{#invoke:checkparams|warn}}<!-- Validate template parameters -->{{head|bn|noun|sort={{{sort|}}}|head={{{head|{{{1|}}}}}}|autotrinfl=1|tr={{{tr|{{{tr1|}}}}}}|tr2={{{tr2|}}}|g={{{g|}}} |{{#if:{{{obj|}}}|objective}}|{{{obj|}}} |{{#if:{{{obj2|}}}|or}}|{{{obj2|}}} |{{#if:{{{obj3|}}}|or}}|{{{obj3|}}} |{{#if:{{{gen|}}}|genitive}}|{{{gen|}}} |{{#if:{{{loc|}}}|locative}}|{{{loc|}}} |{{#if:{{{loc2|}}}|or}}|{{{loc2|}}} |{{#if:{{{m|}}}|male equivalent}}|{{{m|}}} |{{#if:{{{f|}}}|female equivalent}}|{{{f|}}} |{{#if:{{{mw|}}}|classifier}}|{{{mw|}}} |cat2={{#if:{{{mw|}}}|nouns classified by {{{mw}}}}} |cat3={{#if:{{{m|}}}{{{f|}}}|nouns with other-gender equivalents}} }}<noinclude>{{documentation}}{{tcat|hw}}</noinclude> 9q43x9a2wrwn574s7svx3atx2agdvxx साँचा:template cat 10 306998 487875 2026-09-03T10:06:44Z SM7 6218 नया साँचा अंग्रेजी से कॉपी करके 487875 wikitext text/x-wiki <includeonly>{{#invoke:template cat|categorize}}</includeonly><noinclude>{{documentation}}</noinclude> snrmdr6gj01ktlz7f7crr0jyhkh3jtd साँचा:tcat 10 306999 487876 2026-09-03T10:07:38Z SM7 6218 [[साँचा:template cat]] को अनुप्रेषित 487876 wikitext text/x-wiki #पुनर्प्रेषित [[साँचा:template cat]] izakcxd7lmk0c5s7k3ngv5du0sxru9l साँचा:tlb 10 307000 487885 2026-09-03T10:27:44Z SM7 6218 [[साँचा:term-label]] को अनुप्रेषित 487885 wikitext text/x-wiki #पुनर्प्रेषित [[साँचा:term-label]] qwpibgcon9babeyaylajof0qd9693nv साँचा:term-label 10 307001 487886 2026-09-03T10:28:01Z SM7 6218 "{{#invoke:labels/templates|show|term=1}}<noinclude>{{documentation}}</noinclude>" के साथ नया पृष्ठ बनाया 487886 wikitext text/x-wiki {{#invoke:labels/templates|show|term=1}}<noinclude>{{documentation}}</noinclude> q1sk1j74jv2s11u1x0324przcr352sb