text:
Module:User:Benwing2/form of

local export = {}

export.force_cat = false -- for testing; set to true to display categories even on non-mainspace pages

local m_links = require("Module:links") local m_string_utils = require("Module:string utilities") local m_table = require("Module:table") local parse_utilities_module = "Module:parse utilities" local labels_module = "Module:labels" local utilities_module = "Module:utilities" export.form_of_pos_module = "Module:form of/pos" export.form_of_functions_module = "Module:form of/functions" export.form_of_cats_module = "Module:form of/cats" export.form_of_lang_data_module_prefix = "Module:form of/lang-data/" export.form_of_data_module = "Module:form of/data" export.form_of_data2_module = "Module:form of/data2"

local ulen = m_string_utils.len local rsubn = m_string_utils.gsub local rmatch = m_string_utils.match local rsplit = m_string_utils.split

export.TAG_TYPE = 1 export.GLOSSARY = 2 export.SHORTCUTS = 3 export.WIKIDATA = 4

export.APPENDIX = true export.WIKIPEDIA = false export.WIKTIONARY = 0

--[==[ Set listing the languages with lang-specific tags. If a language isn't listed here, the tags for that language won't be recognized. ]==] export.langs_with_lang_specific_tags = { ["en"] = true, ["got"] = true, ["lt"] = true, ["lv"] = true, ["nl"] = true, ["pi"] = true, ["sw"] = true, ["ttj"] = true, }

--[==[ intro:

This module implements the underlying processing of form of, inflection of and specific variants such as past participle of and alternative spelling of. Most of the logic in this file is to handle tags in inflection of. Other related files:

tags, their shortcuts, the category they belong to (tense-aspect, case, gender, voice-valence, etc.), the appropriate glossary link and the wikidata ID. format as Module:form of/data. tags for the language with code LANGCODE, in the same format as Module:form of/data. Language-specific tags override general tags. appropriate combinations of tags are seen for a given language. categorization. FIXME: This should be unified with the parts of speech listed in Module:links. They are contained in this module because data-only modules can't contain code. The functions in this file are of two types: one such handler, for handling multipart person tags such as `1//2//3`. Currently no such functions exist.
 * Module:form of/templates contains the majority of the logic that implements the templates themselves.
 * Module:form of/data is a data-only file containing information on the more common inflection tags, listing the
 * Module:form of/data2 is a data-only file containing information on the less common inflection tags, in the same
 * Module:form of/lang-data/LANGCODE is a data-only file containing information on the language-specific inflection
 * Module:form of/cats is a data-only file listing the language-specific categories that are added when the
 * Module:form of/pos is a data-only file listing the recognized parts of speech and their abbreviations, used for
 * Module:form of/functions contains functions for use with Module:form of/data and Module:form of/cats.
 * Display handlers allow for customization of the display of multipart tags (see below). Currently there is only
 * Cat functions allow for more complex categorization logic, and are referred to by name in Module:form of/cats.

The following terminology is used in conjunction with inflection of:

are `masculine`, `nominative`, or `first-person`. Tags may be abbreviated, e.g. `m` for `masculine`, `nom` for `nominative`, or `1` for `first-person`. Such abbreviations are called aliases, and some tags have multiple equivalent aliases (e.g. `p` or `pl` for `plural`). The full, non-abbreviated form of a tag is called its canonical form. as its canonical form, and it normally functions as a link to a glossary entry explaining the tag. Usually the link is to an entry in Appendix:Glossary, but sometimes the tag is linked to an individual dictionary entry or to a  Wikipedia entry. Occasionally, the display text differs from the canonical form of the tag. An example is the tag `comparative case`, which has the display text read as simply `comparative`. Normally, tags referring to cases don't have the word "case" in them, but in this case the tag `comparative` was already used as an alias for the tag `comparative degree`, so the tag was named `comparative case` to avoid clashing. A similar situation occurs with `adverbial case` vs. the grammar tag `adverbial` (as in `adverbial participle`). which can be expanded to canonical-form tags as `first-person|singular|present|indicative`. `1|s|pres|ind|;|2|s|imp`, which specifies two tag sets, `1|s|pres|ind` as above and `2|s|imp` (in canonical form, `second-person|singular|imperative`). Multiple tag sets specified in a single call to inflection of are specified in this fashion. Conjoined tag sets can also occur in list-tag shortcuts. the case of syncretism, when the same form applies to multiple inflections. Examples are the Spanish present subjunctive, where the first-person and third-person singular have the same form (e.g. from  ), or Latin third-declension adjectives, where the dative and ablative plural of all genders have the same form (e.g. from ). These would be expressed respectively as `1//3|s|pres|sub` and `dat//abl|m//f//n|p`, where the use of the multipart tag compactly encodes the syncretism and avoids the need to individually list out all of the inflections. Multipart tags currently display as a list separated by a slash, e.g. dative/ablative or masculine/feminine/neuter where each individual word is linked appropriately. As a special case, multipart tags involving persons display specially; for example, the multipart tag `1//2//3` displays as first-, second- and third-person, with the word "person" occurring only once. individual tags. The tags within the tag set are joined by a colon, e.g. `1:s//3:p`, which is displayed as first-person singular and third-person plural, e.g. for use with the form  of the verb , which uses the tag set `1:s//3:p|impf|actv|indc|unaugmented` to express the syncretism between the first singular and third plural forms of the imperfect active indicative unaugmented conjugation. Two-level multipart tags should be used sparingly; if in doubt, list out the inflections separately. [FIXME: Make two-level multipart tags obsolete.] Aliases are a particular type of shortcut whose expansion is a single non-multipart tag. multipart tag `1//2//3`. Only the most common such combinations exist as shortcuts. the shortcut `1s` expands to `1|s` (first-person singular). Only the most common such combinations exist as shortcuts. sets). For example, the English language-specific shortcut `ed-form` expands to `spast|;|past|part`, expressing the common syncretism between simple past and past participle in English (and in this case, `spast` is itself a list shortcut that expands to `simple|past`). ]==]
 * A tag is a single grammatical item, as specified in a single numbered parameter of inflection of. Examples
 * The display form of a tag is the way it's displayed to the user. Usually the displayed text of the tag is the same
 * A tag set is an ordered list of tags, which together express a single inflection, for example, `1|s|pres|ind`,
 * A conjoined tag set is a tag set that consists of multiple individual tag sets separated by a semicolon, e.g.
 * A multipart tag is a tag that embeds multiple tags within it, such as `f//n` or `nom//acc//voc`. These are used in
 * A two-level multipart tag is a special type of multipart tag that joins two or more tag sets instead of joining
 * A shortcut is a tag that expands to any type of tag described above, or to any type of tag set described above.
 * A multipart shortcut is a shortcut that expands into a multipart tag, for example `123`, which expands to the
 * A list shortcut is a special type of shortcut that expands to a list of tags instead of a single tag. For example,
 * A conjoined shortcut is a special type of list shortcut that consists of a conjoined tag set (multiple logical tag

-- version of rsubn that discards all but the first return value local function rsub(term, foo, bar) local retval = rsubn(term, foo, bar) return retval end

local function normalize_index(list, index) if index < 0 then return #list + index + 1 end return index end

-- FIXME, consider moving to Module:table -- Return true if the list `tags1`, treated as a set, is a subset of the list `tags2`, also treated as a set. local function is_subset(tags1, tags2) tags1 = m_table.listToSet(tags1) tags2 = m_table.listToSet(tags2) for tag, _ in pairs(tags1) do		if not tags2[tag] then return false end end return true end

-- FIXME, move to Module:table local function slice(list, i, j)	--checkType("slice", 1, list, "table") --checkType("slice", 2, i, "number", true) --checkType("slice", 3, j, "number", true) if i == nil then i = 1 else i = normalize_index(list, i)	end j = normalize_index(list, j or -1)

local retval = {} local k = 0 for index = i, j do		k = k + 1 retval[k] = list[index] end return retval end

-- Add tracking category for PAGE when called from or -- similar TEMPLATE. The tracking category linked to is -- Tracking/inflection of/PAGE. local function track(page) require("Module:debug/track")("inflection of/" ..		-- avoid including links in pages (may cause error)		page:gsub("%[", "("):gsub("%]", ")"):gsub("|", "!")) end

local function wrap_in_span(text, classes) return (" %s "):format(classes, text) end

--[==[ Lowest-level implementation of form-of templates, including the general form of as well as those that deal with inflection tags, such as the general inflection of, semi-specific variants such as participle of, and specific variants such as past participle of. `data` contains all the information controlling the display, with the following fields:

directly to {full_link} in Module:links. Each object should have at minimum a `.lang` field containing the language of the lemma and a `.term` field containing the lemma itself. Each object is formatted using {full_link} and then if there are more than one, they are joined using {serialCommaJoin} in Module:table. Alternatively, `.lemmas` can be a string, which is displayed directly, or omitted, to show no lemma links and omit the connecting text. themselves forms of another lemma (the base lemma), e.g. a comparative, superlative or participle. Each object is of  the form { { paramobj = PARAM_OBJ, lemmas = {LEMMA_OBJ, LEMMA_OBJ, ...} }} where PARAM_OBJ describes the properties of the base lemma parameter (i.e. the relationship between the intermediate and base lemmas) and LEMMA_OBJ is an  object suitable to be passed to {full_link} in Module:links. PARAM_OBJ is of the format { { param = "PARAM", tags = {"TAG", "TAG", ...} } where PARAM is the name of the parameter to inflection of  etc. that holds the base lemma(s) of the specified relationship and the tags describe the relationship, such as   { {"comd"}} or { {"past", "part"}}. for the tag text and lemma links, and additionally {"form-of-definition-link"} specifically for the lemma links. (FIXME: Should separate out the lemma links into their own field.) ]==] function export.format_form_of(data) if type(data) ~= "table" then error("Internal error: First argument must now be a table of arguments") end local text_classes = data.text_classes or "form-of-definition use-with-mention" local lemma_classes = data.text_classes or "form-of-definition-link" local parts = {} local function ins(text) table.insert(parts, text) end ins("") ins(data.text) if data.text ~= "" and data.lemmas then ins(" ") end if data.lemmas then if type(data.lemmas) == "string" then ins(wrap_in_span(data.lemmas, lemma_classes)) else local formatted_terms = {} for _, lemma in ipairs(data.lemmas) do				table.insert(formatted_terms, wrap_in_span( m_links.full_link(lemma, data.lemma_face), lemma_classes ))			end ins(m_table.serialCommaJoin(formatted_terms)) end end if data.enclitics and #data.enclitics > 0 then -- The outer parens need to be outside of the text_classes span so they show in upright instead of italic, or -- they will clash with upright parens generated by link annotations such as transliterations and pos=. ins(" ") local formatted_terms = {} for _, enclitic in ipairs(data.enclitics) do -- FIXME, should we have separate clitic face and/or classes? table.insert(formatted_terms, wrap_in_span( m_links.full_link(enclitic, data.lemma_face, nil, "show qualifiers"), lemma_classes ))		end ins(" (")		ins(wrap_in_span("with enclitic" .. (#data.enclitics > 1 and "s" or "") .. " ", text_classes))		ins(m_table.serialCommaJoin(formatted_terms))		ins(")") ins("") end if data.base_lemmas and #data.base_lemmas > 0 then for _, base_lemma in ipairs(data.base_lemmas) do			ins(", the ") ins(export.tagged_inflections {				lang = base_lemma.lemmas[1].lang,				tags = base_lemma.paramobj.tags,				lemmas = base_lemma.lemmas,				lemma_face = data.lemma_face,				no_format_categories = true,				nocat = true,				text_classes = data.text_classes,			}) ins("") end end -- FIXME, should posttext go before enclitics? If so we need to have separate handling for the -- final colon when there are multiple tag sets in tagged_inflections. if data.posttext then ins(data.posttext) end ins(" ") return table.concat(parts) end
 * `.text`: Text to insert before the lemmas. Wrapped in the value of `.text_classes`, or its default; see below.
 * `.lemmas`: List of objects describing the lemma(s) of which the term in question is a non-lemma form. These are passed
 * `.lemma_face`: "Face" to use when displaying the lemma objects. Usually should be set to {"term"}.
 * `.enclitics`: List of enclitics to display after the lemmas, in parens.
 * `.base_lemmas`: List of base lemmas to display after the lemmas, in the case where the lemmas in `.lemmas` are
 * `.text_classes`: CSS classes used to wrap the tag text and lemma links. Default is {"form-of-definition use-with-mention"}
 * `.posttext`: Additional text to display after the lemma links.

--[==[ Return true if `tag` contains an internal link or HTML. ]==] function export.is_link_or_html(tag) return tag:find("[[", nil, true) or tag:find("|", nil, true) or tag:find("<", nil, true) end

--[==[ Look up a tag (either a shortcut of any sort of a canonical long-form tag) and return its expansion. The expansion will be a string unless the shortcut is a list-tag shortcut such as `1s`; in that case, the expansion will be a list. The caller must handle both cases. Only one level of expansion happens; hence, `acc` expands to {"accusative"}, `1s` expands to { {"1", "s"}} (not to { {"first", "singular"}}) and `123` expands to {"1//2//3"}. The expansion will be the same as the passed-in tag in the following circumstances:

 * 1) The tag is `;` (this is special-cased, and no lookup is done).
 * 2) The tag is a multipart tag such as `nom//acc` (this is special-cased, and no lookup is done).
 * 3) The tag contains a raw link (this is special-cased, and no lookup is done).
 * 4) The tag contains HTML (this is special-cased, and no lookup is done).
 * 5) The tag is already a canonical long-form tag.
 * 6) The tag is unrecognized.

This function first looks up in the lang-specific data module Module:form of/lang-data/LANGCODE, then in Module:form of/data (which includes more common non-lang-specific tags) and finally (only if the tag is not recognized as a shortcut or canonical tag, and is not of types 1-4 above) in Module:form of/data2.

If the expansion is a string and is different from the tag, track it if `do_track` is true. ]==] function export.lookup_shortcut(tag, lang, do_track) -- If there is HTML or a link in the tag, return it directly; don't try -- to look it up, which will fail. if tag == ";" or tag:find("//", nil, true) or export.is_link_or_html(tag) then return tag end local expansion local langcode = lang and lang:getCode if langcode and export.langs_with_lang_specific_tags[langcode] then local langdata = mw.loadData(export.form_of_lang_data_module_prefix .. langcode) -- If this is a canonical long-form tag, just return it, and don't check for shortcuts. This is an -- optimization; see below. if langdata.tags[tag] then return tag end expansion = langdata.shortcuts[tag] end if not expansion and lang then -- If the lang we're dealing with is an etym-only lang, try again with the corresponding full language. local full_langcode = lang:getFullCode if full_langcode ~= langcode and export.langs_with_lang_specific_tags[full_langcode] then local langdata = mw.loadData(export.form_of_lang_data_module_prefix .. full_langcode) -- If this is a canonical long-form tag, just return it, and don't check for shortcuts. This is an -- optimization; see below. if langdata.tags[tag] then return tag end expansion = langdata.shortcuts[tag] end end if not expansion then local m_data = mw.loadData(export.form_of_data_module) -- If this is a canonical long-form tag, just return it, and don't check for shortcuts (which will cause		-- Module:form of/data2 to be loaded, because there won't be a shortcut entry in Module:form of/data --		-- or, for that matter, in Module:form of/data2). This is an optimization; the code will still work without -- it, but will use up more memory. if m_data.tags[tag] then return tag end expansion = m_data.shortcuts[tag] end if not expansion then local m_data2 = mw.loadData(export.form_of_data2_module) expansion = m_data2.shortcuts[tag] end if not expansion then return tag end -- Maybe track the expansion if it's not the same as the raw tag. if do_track and expansion ~= tag and type(expansion) == "string" then track("tag/" .. tag) end return expansion end

--[==[ Look up a normalized/canonicalized tag and return the data object associated with it. If the tag isn't found, return nil. This first looks up in the lang-specific data module Module:form of/lang-data/LANGCODE, then in Module:form of/data (which includes more common non-lang-specific tags) and then finally in Module:form of/data2. ]==] function export.lookup_tag(tag, lang) local langcode = lang and lang:getCode if langcode and export.langs_with_lang_specific_tags[langcode] then local langdata = mw.loadData(export.form_of_lang_data_module_prefix .. langcode) if langdata.tags[tag] then return langdata.tags[tag] end end local full_langcode = lang and lang:getFullCode if full_langcode and full_langcode ~= langcode and export.langs_with_lang_specific_tags[full_langcode] then -- If the lang we're dealing with is an etym-only lang, try again with the corresponding full language. local langdata = mw.loadData(export.form_of_lang_data_module_prefix .. full_langcode) if langdata.tags[tag] then return langdata.tags[tag] end end local m_data = mw.loadData(export.form_of_data_module) local tagobj = m_data.tags[tag] if tagobj then return tagobj end local m_data2 = mw.loadData(export.form_of_data2_module) local tagobj2 = m_data2.tags[tag] if tagobj2 then return tagobj2 end return nil end

-- Normalize a single tag, which may be a shortcut but should not be a multipart tag, a multipart shortcut or a list -- shortcut. local function normalize_single_tag(tag, lang, do_track) local expansion = export.lookup_shortcut(tag, lang, do_track) if type(expansion) ~= "string" then error("Tag '" .. tag .. "' is a list shortcut, which is not allowed here") end tag = expansion if not export.lookup_tag(tag, lang) and do_track then -- If after all expansions and normalizations we don't recognize the canonical tag, track it. track("unknown") track("unknown/" .. tag) end return tag end

--[=[ Normalize a component of a multipart tag. This should not have any // in it, but may join multiple individual tags with a colon, and may be a single list-tag shortcut, which is treated as if colon-separated. The return value may be a list of tags. ]=] local function normalize_multipart_component(tag, lang, do_track) -- If there is HTML or a link in the tag, don't try to split on colon. A colon may legitimately occur in either one, -- and we don't want these things parsed. Note that we don't do this check before splitting on //, which we don't	-- expect to occur in links or HTML; see comment in normalize_tag. if export.is_link_or_html(tag) then return tag end local components = rsplit(tag, ":", true) if #components == 1 then -- We allow list-tag shortcuts inside of multipart tags, e.g. -- '1s//3p'. Check for this now. tag = export.lookup_shortcut(tag, lang, do_track) if type(tag) == "table" then -- Temporary tracking as we will disallow this. track("list-tag-inside-of-multipart") -- We found a list-tag shortcut; treat as if colon-separated. components = tag else return normalize_single_tag(tag, lang, do_track) end end local normtags = {} -- Temporary tracking as we will disallow this. track("two-level-multipart") for _, component in ipairs(components) do		if do_track then -- There are multiple components; track each of the individual -- raw tags. track("tag/" .. component) end table.insert(normtags, normalize_single_tag(component, lang, do_track)) end

return normtags end

--[=[ Normalize a single tag. The return value may be a list (in the case of multipart tags), which will contain nested lists in the case of two-level multipart tags. ]=] local function normalize_tag(tag, lang, do_track) -- We don't check for links or HTML before splitting on //, which we don't expect to occur in links or HTML. Doing -- it this way allows for a tag like '//' to function correctly (the template calls	-- will be expanded before we process the tag, and will contain links and HTML). The only check we do is for a URL, -- which shouldn't normally occur, but might if the user tries to put an external link into the tag. URL's with // -- normally have the sequence ://, which should never normally occur when // and : are used in their normal ways. if tag:find("://", nil, true) then return tag end local split_tags = rsplit(tag, "//", true) if #split_tags == 1 then local retval = normalize_multipart_component(tag, lang, do_track) if type(retval) == "table" then -- The user gave a tag like '1:s', i.e. with colon but without //. Allow this, but we need to return a -- nested list. return {retval} end return retval end local normtags = {} for _, single_tag in ipairs(split_tags) do		if do_track then -- If the tag was a multipart tag, track each of individual raw tags. track("tag/" .. single_tag) end table.insert(normtags, normalize_multipart_component(single_tag, lang, do_track)) end return normtags end

--[==[ Normalize a tag set (a list of tags) into its canonical-form tags. The return value is a list of normalized tag sets (a list because of there may be conjoined shortcuts among the input tags). A normalized tag set is a list of tag elements, where each element is either a string (the canonical form of a tag), a list of such strings (in the case of multipart tags) or a list of lists of such strings (in the case of two-level multipart tags). For example, the multipart tag `nom//acc//voc` will be represented in canonical form as { {"nominative", "accusative", "vocative"}}, and the two-level multipart tag `1:s//3:p` will be represented as { {{"first-person", "singular"}, {"third-person", "plural"}}}.

Example 1:

{normalize_tag_set({"nom//acc//voc", "n", "p"})} = { }

Example 2:

{normalize_tag_set({"ed-form"}, ENGLISH)} = { {{"simple", "past"}, {"past", "participle"}}}

Example 3:

{normalize_tag_set({"archaic", "ed-form"}, ENGLISH)} = { {{"archaic", "simple", "past"}, {"archaic", "past", "participle"}}} ]==] function export.normalize_tag_set(tag_set, lang, do_track) -- We track usage of shortcuts, normalized forms and (in the case of multipart tags or list tags) intermediate -- forms. For example, if the tags 1s|mn|gen|indefinite are passed in, we track the following: -- Tracking/inflection of/tag/1s -- Tracking/inflection of/tag/1 -- Tracking/inflection of/tag/s -- Tracking/inflection of/tag/first-person -- Tracking/inflection of/tag/singular -- Tracking/inflection of/tag/mn -- Tracking/inflection of/tag/m//n -- Tracking/inflection of/tag/m -- Tracking/inflection of/tag/n -- Tracking/inflection of/tag/masculine -- Tracking/inflection of/tag/neuter -- Tracking/inflection of/tag/gen -- Tracking/inflection of/tag/genitive -- Tracking/inflection of/tag/indefinite local output_tag_set = {} local saw_semicolon = false

for _, tag in ipairs(tag_set) do		if do_track then -- Track the raw tag. track("tag/" .. tag) end -- Expand the tag, which may generate a new tag (either a fully canonicalized tag, a multipart tag, or a list		-- of tags). tag = export.lookup_shortcut(tag, lang, do_track) if type(tag) == "table" then saw_semicolon = m_table.contains(tag, ";") if saw_semicolon then -- If we saw a conjoined shortcut, we need to use a more general algorithm that can expand a single -- tag set into multiple. break end

for _, t in ipairs(tag) do				if do_track then -- If the tag expands to a list of raw tags, track each of those. track("tag/" .. t)				end table.insert(output_tag_set, normalize_tag(t, lang, do_track)) end else table.insert(output_tag_set, normalize_tag(tag, lang, do_track)) end end

if not saw_semicolon then return {output_tag_set} end

-- Use a more general algorithm that handles conjoined shortcuts. local output_tag_set = {} for i, tag in ipairs(tag_set) do		if do_track then -- Track the raw tag. track("tag/" .. tag) end -- Expand the tag, which may generate a new tag (either a fully canonicalized tag, a multipart tag, or a list		-- of tags). tag = export.lookup_shortcut(tag, lang, do_track) if type(tag) == "table" then local output_tag_sets = {} local shortcut_tag_sets = export.split_tag_set(tag) local normalized_shortcut_tag_sets = {} for _, shortcut_tag_set in ipairs(shortcut_tag_sets) do				m_table.extendList(normalized_shortcut_tag_sets,					export.normalize_tag_set(shortcut_tag_set, lang, do_track)) end local after_tags = slice(tag_set, i + 1) local normalized_after_tags_sets = export.normalize_tag_set(after_tags, lang, do_track) for _, normalized_shortcut_tag_set in ipairs(normalized_shortcut_tag_sets) do				for _, normalized_after_tags_set in ipairs(normalized_after_tags_sets) do					table.insert(output_tag_sets, m_table.append(output_tag_set, normalized_shortcut_tag_set, normalized_after_tags_set)) end end return output_tag_sets else table.insert(output_tag_set, normalize_tag(tag, lang, do_track)) end end

error("Internal error: Should not get here") end

function export.combine_multipart_tags(tag_set) for i, tag in ipairs(tag_set) do		if type(tag) == "table" then for j, subtag in ipairs(tag) do				if type(subtag) == "table" then tag[j] = table.concat(subtag, ":") end end tag_set[i] = table.concat(tag, "//") end end

return tag_set end

function export.normalize_tags(tags, lang, recombine_multitags, do_track) local tag_sets = export.normalize_tag_set(tags, lang, do_track) if recombine_multitags then for i, tag_set in ipairs(tag_sets) do			tag_sets[i] = export.combine_multipart_tags(tag_set) end return export.combine_tag_sets(tag_sets) end return tag_sets end

--[==[ Split a tag set containing two-level multipart tags into one or more tag sets not containing such tags. Single-level multipart tags are left alone. (If we need to, a slight modification of the following code will also split single-level multipart tags.) This assumes that multipart tags are represented as lists and two-level multipart tags are represented as lists of lists, as is output by {normalize_tag_set}. NOTE: We have to be careful to properly handle imbalanced two-level multipart tags such as `def:s//p` (or the reverse, `s//def:p`). ]==] function export.split_two_level_multipart_tag_set(tag_set) for i, tag in ipairs(tag_set) do		if type(tag) == "table" then -- We saw a multipart tag. Check if any of the parts are two-level. local saw_two_level_tag = false for _, first_level_tag in ipairs(tag) do				if type(first_level_tag) == "table" then saw_two_level_tag = true break end end if saw_two_level_tag then -- We found a two-level multipart tag. -- (1) Extract the preceding tags. local pre_tags = slice(tag_set, 1, i - 1) -- (2) Extract the following tags. local post_tags = slice(tag_set, i + 1) -- (3) Loop over each tag set alternant in the two-level multipart tag. -- For each alternant, form the tag set consisting of pre_tags + alternant + post_tags, -- and recursively split that tag set. local resulting_tag_sets = {} for _, first_level_tag_set in ipairs(tag) do					local expanded_tag_set = {} m_table.extendList(expanded_tag_set, pre_tags) -- The second level may have a string or a list. if type(first_level_tag_set) == "table" then m_table.extendList(expanded_tag_set, first_level_tag_set) else table.insert(expanded_tag_set, first_level_tag_set) end m_table.extendList(expanded_tag_set, post_tags) m_table.extendList(resulting_tag_sets, export.split_two_level_multipart_tag_set(expanded_tag_set)) end return resulting_tag_sets end end end

return {tag_set} end

--[==[ Split a tag set that may consist of multiple semicolon-separated tag sets into the component tag sets. ]==] function export.split_tag_set(tag_set) local split_tag_sets = {} local cur_tag_set = {} for _, tag in ipairs(tag_set) do		if tag == ";" then if #cur_tag_set > 0 then table.insert(split_tag_sets, cur_tag_set) end cur_tag_set = {} else table.insert(cur_tag_set, tag) end end if #cur_tag_set > 0 then table.insert(split_tag_sets, cur_tag_set) end return split_tag_sets end

export.split_tags_into_tag_sets = export.split_tag_set

--[==[ Combine multiple tag sets in a tag set group into a simple tag set, with logical tag sets separated by semicolons. This is the opposite of {split_tag_set}. ]==] function export.combine_tag_sets(tag_sets) if #tag_sets == 1 then return tag_sets[1] end local combined_tag_set = {} for _, tag_set in ipairs(tag_sets) do		if #combined_tag_set > 0 then table.insert(combined_tag_set, ";") end m_table.extendList(combined_tag_set, tag_set) end return tags end

local tag_set_param_mods = { lb = { item_dest = "labels", convert = function(arg, parse_err) return rsplit(arg, "//", true) end, } }

--[==[ Parse tag set properties from a tag set (list of tags). Currently no per-tag properties are recognized, and the only per-tag-set property recognized is `` for specifing label(s) for the tag set. Per-tag-set properties must be attached to the last tag. ]==] function export.parse_tag_set_properties(tag_set) local function generate_tag_set_obj(last_tag) tag_set[#tag_set] = last_tag return {tags = tag_set} end local last_tag = tag_set[#tag_set] -- Check for inline modifier, e.g. מרים. But exclude HTML entry with, , or -- similar in it, caused by wrapping an argument in, or similar. Basically, all tags of -- the sort we parse here should consist of a less-than sign, plus letters, plus a colon, e.g. , so if -- we see a tag on the outer level that isn't in this format, we don't try to parse it. The restriction to the -- outer level is to allow generated HTML inside of e.g. qualifier tags, such as foo. if last_tag:find("<") and not last_tag:find("^[^<]*<[a-z]*[^a-z:]") then return require(parse_utilities_module).parse_inline_modifiers(last_tag, {			param_mods = tag_set_param_mods,			generate_obj = generate_tag_set_obj,		}) else return generate_tag_set_obj(last_tag) end end

function export.normalize_pos(pos) if not pos then return nil end return mw.loadData(export.form_of_pos_module)[pos] or pos end

-- Return the display form of a single canonical-form tag. The value -- passed in must be a string (i.e. it cannot be a list describing a -- multipart tag). To handle multipart tags, use get_tag_display_form. local function get_single_tag_display_form(normtag, lang) local data = export.lookup_tag(normtag, lang) local display = normtag

-- If the tag has a special display form, use it	if data and data.display then display = data.display end

-- If there is a nonempty glossary index, then show a link to it	local glossary = data and data[export.GLOSSARY] if glossary then if glossary == export.WIKTIONARY then display = "" .. display .. "" elseif glossary == export.WIKIPEDIA then display = "" .. display .. "" elseif glossary == export.APPENDIX then display = "" .. display .. "" elseif type(glossary) ~= "string" then error(("Internal error: Wrong type %s for glossary value %s for tag %s"):format( type(glossary), mw.dumpObject(glossary), normtag)) else local link = rmatch(glossary, "^wikt:(.*)") if link then display = "" .. display .. "" end if not link then link = rmatch(glossary, "^w:(.*)") if link then display = "" .. display .. "" end end if not link then display = "" .. display .. "" end end end return display end

--[==[ Turn a canonicalized tag spec (which describes a single, possibly multipart tag) into the displayed form. The tag spec may be a string (a canonical-form tag); a list of canonical-form tags (in the case of a simple multipart tag); or a list of mixed canonical-form tags and lists of such tags (in the case of a two-level multipart tag). `joiner` indicates how to join the parts of a multipart tag, and can be either {"and"} ("foo and bar", or "foo, bar and baz" for 3 or more), {"slash"} ("foo/bar"), {"en-dash"} ("foo–bar") or {nil}, which uses the global default found in {multipart_join_strategy} in Module:form of/functions. (NOTE: The global default is {"slash"} and this seems unlikely to change.) ]==] function export.get_tag_display_form(tagspec, lang, joiner) if type(tagspec) == "string" then return get_single_tag_display_form(tagspec, lang) end -- We have a multipart tag. See if there's a display handler to display them specially. for _, handler in ipairs(require(export.form_of_functions_module).display_handlers) do		local displayval = handler(tagspec, joiner) if displayval then return displayval end end -- No display handler. local displayed_tags = {} for _, first_level_tag in ipairs(tagspec) do		if type(first_level_tag) == "string" then table.insert(displayed_tags, get_single_tag_display_form(first_level_tag, lang)) else -- A first-level element of a two-level multipart tag. Currently we just separate the individual components -- with spaces, but other ways are possible, e.g. using an underscore, colon, parens or braces. local components = {} for _, component in ipairs(first_level_tag) do				table.insert(components, get_single_tag_display_form(component, lang)) end table.insert(displayed_tags, table.concat(components, " ")) end end return require(export.form_of_functions_module).join_multiparts(displayed_tags, joiner) end

--[==[ Given a normalized tag set (i.e. as output by {normalize_tag_set}; all tags are in canonical form, multipart tags are represented as lists, and two-level multipart tags as lists of lists), convert to displayed form (a string). See {get_tag_display_form} for the meaning of `joiner`. ]==] function export.get_tag_set_display_form(normalized_tag_set, lang, joiner) local parts = {}

for _, tagspec in ipairs(normalized_tag_set) do		local to_insert = export.get_tag_display_form(tagspec, lang, joiner) -- Maybe insert a space before inserting the display form of the tag. We insert a space if		-- (a) we're not the first tag; and -- (b) the tag we're about to insert doesn't have the "no_space_on_left" property; and -- (c) the preceding tag doesn't have the "no_space_on_right" property. -- NOTE: We depend here on the fact that -- (1) all tags with either of the above properties set have the same display form as canonical form, and -- (2) all tags with either of the above properties set are single-character tags. -- The second property is an optimization to avoid looking up display forms resulting from multipart tags, -- which won't be found and which will trigger loading of Module:form of/data2. If multichar punctuation is -- added in the future, it's ok to change the == 1 below to <= 2 or <= 3. --		-- If the first property above fails to hold in the future, we need to track the canonical form of each tag -- (including the previous one) as well as the display form. This would also avoid the need for the == 1 check. if #parts > 0 then local most_recent_tagobj = ulen(parts[#parts]) == 1 and export.lookup_tag(parts[#parts], lang) local to_insert_tagobj = ulen(to_insert) == 1 and export.lookup_tag(to_insert, lang) if (				(not most_recent_tagobj or not most_recent_tagobj.no_space_on_right) and				(not to_insert_tagobj or not to_insert_tagobj.no_space_on_left)			) then table.insert(parts, " ") end end table.insert(parts, to_insert) end

return table.concat(parts) end

--[==[ Given a normalized tag set (i.e. as output by {normalize_tag_set}; all tags are in canonical form, multipart tags are represented as lists, and two-level multipart tags as lists of lists), fetch the associated categories and labels. Return two values, a list of categories and a list of labels. `lang` is the language of term represented by the tag set, and `POS` is the user-provided part of speech (which may be {nil}). ]==] function export.fetch_categories_and_labels(normalized_tag_set, lang, POS, pagename, lemmas) local m_cats = mw.loadData(export.form_of_cats_module) local categories = {} local labels = {}

POS = export.normalize_pos(POS) -- First split any two-level multipart tags into multiple sets, to make our life easier. for _, tag_set in ipairs(export.split_two_level_multipart_tag_set(normalized_tag_set)) do		-- Call a named function, either from the lang-specific data in -- Module:form of/lang-specific/LANGCODE/functions or in Module:form of/functions. local function call_named_function(name, funtype) local data = { pagename = pagename or mw.title.getCurrentTitle.subpageText, lemmas = lemmas, tag_set = normalized_tag_set, lang = lang, POS = POS }			local modules_tried = {} local function try_lang_specific_module(langcode) if export.langs_with_lang_specific_tags[langcode] then local lang_specific_module = export.form_of_lang_data_module_prefix .. langcode .. "/functions" local langdata = require(utilities_module).safe_require(lang_specific_module) if langdata then table.insert(modules_tried, lang_specific_module) if langdata.cat_functions then local fn = langdata.cat_functions[name] if fn then return fn(data), true end end end end return nil, false end -- First try lang-specific. local langcode = lang and lang:getCode if langcode then local retval, found_it = try_lang_specific_module(langcode) if found_it then return retval end end -- If the lang we're dealing with is an etym-only lang, try again with the corresponding full language. local full_langcode = lang and lang:getFullCode if full_langcode and full_langcode ~= langcode then local retval, found_it = try_lang_specific_module(full_langcode) if found_it then return retval end end -- Try lang-independent. table.insert(modules_tried, export.form_of_functions_module) local fn = require(export.form_of_functions_module).cat_functions[name] if fn then return fn(data) end for i, modname in ipairs(modules_tried) do modules_tried[i] = "" .. modname .. "" end error(("No %s function named '%s' in %s"):format(funtype, name, lang_specific_part, m_table.serialCommaJoin(modules_tried, {conj = "or", dontTag = true}))) end

-- Given a tag from the current tag set (which may be a list in case of a multipart tag), -- and a tag from a categorization spec, check that the two match. -- (1) If both are strings, we just check for equality. -- (2) If the spec tag is a string and the tag set tag is a list (i.e. it originates from a		-- multipart tag), we check that the spec tag is in the list. This is because we want to treat -- multipart tags in user-specified tag sets as if the user had specified multiple tag sets. -- For example, if the user said "1//3|s|pres|ind" and the categorization spec says {"has", "1"}, -- we want this to match, because "1//3|s|pres|ind" should be treated equivalently to two tag -- sets "1|s|pres|ind" and "3|s|pres|ind", and the former matches the categorization spec. -- (3) If the spec tag is a list (i.e. it originates from a multipart tag), we check that the -- tag set tag is also a list and is a superset of the spec tag. For example, if the categorization -- spec says {"has", "1//3"}, then the tag set tag must be a multipart tag that has both "1" and "3" -- in it. "1//3" works, as does "1//2//3". local function tag_set_tag_matches_spec_tag(tag_set_tag, spec_tag) if type(spec_tag) == "table" then if type(tag_set_tag) == "table" and is_subset(spec_tag, tag_set_tag) then return true end elseif type(tag_set_tag) == "table" then if m_table.contains(tag_set_tag, spec_tag) then return true end elseif tag_set_tag == spec_tag then return true end return false end

-- Check that the current tag set matches the given spec tag. This means that any of the tags -- in the current tag set match, according to tag_set_tag_matches_spec_tag; see above. If the -- current tag set contains only string tags (i.e. no multipart tags), and the spec tag is a -- string (i.e. not a multipart tag), this boils down to list containment, but it gets more -- complex when multipart tags are present. local function tag_set_matches_spec_tag(spec_tag) spec_tag = normalize_tag(spec_tag, lang) for _, tag_set_tag in ipairs(tag_set) do				if tag_set_tag_matches_spec_tag(tag_set_tag, spec_tag) then return true end end return false end

-- Check whether the given spec matches the current tag set. Two values are returned: -- (1) whether the spec matches the tag set; (2) the index of the category to add if -- the spec matches. local function check_condition(spec) if type(spec) == "boolean" then return spec elseif type(spec) ~= "table" then error("Wrong type of condition " .. spec .. ": " .. type(spec)) end local predicate = spec[1] if predicate == "has" then return tag_set_matches_spec_tag(spec[2]), 3 elseif predicate == "hasall" then for _, tag in ipairs(spec[2]) do					if not tag_set_matches_spec_tag(tag) then return false, 3 end end return true, 3 elseif predicate == "hasany" then for _, tag in ipairs(spec[2]) do					if tag_set_matches_spec_tag(tag) then return true, 3 end end return false, 3 elseif predicate == "tags=" then local normalized_spec_tag_sets = export.normalize_tag_set(spec[2], lang) if #normalized_spec_tag_sets > 1 then error("Internal error: No support for conjoined shortcuts in category/label specs in "						.. "Module:form of/cats when processing spec tag set " .. table.concat(spec[2], "|")) end local normalized_spec_tag_set = normalized_spec_tag_sets[1] -- Check for and disallow two-level multipart tags in the specs. FIXME: Remove this when we remove -- support for two-level multipart tags. for _, tag in ipairs(normalized_spec_tag_set) do					if type(tag) == "table" then for _, subtag in ipairs(tag) do							if type(subtag) == "table" then error("Internal error: No support for two-level multipart tags in category/label specs"									.. "Module:form of/cats when processing spec tag set "									.. table.concat(spec[2], "|")) end end end end -- Allow tags to be in different orders, and multipart tags to be in different orders. To handle this, -- we first check that both tag set tags and spec tags have the same length. If so, we sort the -- multipart tags in the tag set tags and spec tags, and then check that all tags in the spec tags are -- in the tag set tags. if #tag_set ~= #normalized_spec_tag_set then return false, 3 end local tag_set_tags = m_table.deepcopy(tag_set) for i=1,#tag_set_tags do					if type(tag_set_tags[i]) == "table" then table.sort(tag_set_tags[i]) end if type(normalized_spec_tag_set[i]) == "table" then table.sort(normalized_spec_tag_set[i]) end end for i=1,#tag_set_tags do					if not m_table.contains(tag_set_tags, normalized_spec_tag_set[i]) then return false, 3 end end return true, 3 elseif predicate == "p=" then return POS == export.normalize_pos(spec[2]), 3 elseif predicate == "pany" then for _, specpos in ipairs(spec[2]) do					if POS == export.normalize_pos(specpos) then return true, 3 end end return false, 3 elseif predicate == "pexists" then return POS ~= nil, 2 elseif predicate == "not" then local condval = check_condition(spec[2]) return not condval, 3 elseif predicate == "and" then local condval = check_condition(spec[2]) if condval then condval = check_condition(spec[3]) end return condval, 4 elseif predicate == "or" then local condval = check_condition(spec[2]) if not condval then condval = check_condition(spec[3]) end return condval, 4 elseif predicate == "call" then return fn(call_named_function(spec[2], "condition")), 3 else error("Unrecognized predicate: " .. predicate) end end

-- Process a given spec. This checks any conditions in the spec against the -- tag set, and insert any resulting categories into `categories`. Return value -- is true if the outermost condition evaluated to true and a category was inserted -- (this is used in {"cond" ...} conditions, which stop when a subcondition evaluates		-- to true). local function process_spec(spec) if not spec then return false elseif type(spec) == "string" then -- A category. Substitute POS request with user-specified part of speech or default. spec = rsub(spec, "<>", function(default)					return POS or export.normalize_pos(default)				end) table.insert(categories, lang:getFullName .. " " .. spec) return true elseif type(spec) == "table" and spec.labels then -- A label spec. for _, label in ipairs(spec.labels) do					m_table.insertIfNot(labels, label) end return true elseif type(spec) ~= "table" then error("Wrong type of specification " .. spec .. ": " .. type(spec)) end local predicate = spec[1] if predicate == "multi" then -- WARNING! #spec doesn't work for objects loaded from loadData for i, sp in ipairs(spec) do					if i > 1 then process_spec(sp) end end return true elseif predicate == "cond" then -- WARNING! #spec doesn't work for objects loaded from loadData for i, sp in ipairs(spec) do					if i > 1 and process_spec(sp) then return true end end return false elseif predicate == "call" then return process_spec(call_named_function(spec[2], "spec")) else local condval, ifspec = check_condition(spec) if condval then process_spec(spec[ifspec]) return true else process_spec(spec[ifspec + 1]) -- FIXME: Are we sure this is correct? return false end end end

local langcode = lang:getCode local langspecs = m_cats[langcode] if langspecs then for _, spec in ipairs(langspecs) do				process_spec(spec) end end local full_code = lang:getFullCode if full_code ~= langcode then local langspecs = m_cats[full_code] if langspecs then for _, spec in ipairs(langspecs) do					process_spec(spec) end end end if full_code ~= "und" then local langspecs = m_cats["und"] if langspecs then for _, spec in ipairs(langspecs) do					process_spec(spec) end end end end

return categories, labels end

--[==[ Implementation of templates that display inflection tags, such as the general inflection of, semi-specific variants such as participle of, and specific variants such as past participle of. `data` contains all the information controlling the display, with the following fields:

labels, and for displaying categories and labels. can be indicated by a {";"} as one of the tags, and tag-set properties may be attached to the last tag of a tag set. The tags themselves may come directly from the user (as in inflection of); come partly from the user (as in participle of, which adds the tag `part` to user-specified inflection tags); or be entirely specified by the template (as in past participle of). per-tag-set properties. Each element of the list is an object of the form { {tags = {"TAG", "TAG", ...}, labels = {"LABEL", "LABEL", ...}}. If `.tag_sets` is specified, `.tags` should not be given and vice-versa. Specifying `.tag_sets` in place of tags allowed per-tag set labels to be specified; otherwise, there is no advantage. Module:pt-gl-inflections uses this functionality to supply labels like {"Brazil"} and {"Portugal"} associated with specific tag sets. non-lemma form. These are passed directly to {full_link} in Module:links. Each object should have at minimum a `.lang` field containing the language of the lemma and a `.term` field containing the lemma itself. Each object is formatted using {full_link} and then if there are more than one, they are joined using {serialCommaJoin} in  Module:table. Alternatively, `.lemmas` can be a string, which is displayed directly. If omitted entirely, no lemma links are shown and the connecting "of" is also omitted. {"term"}. inflection of. {"form-of-definition use-with-mention"} for the tag text, {"form-of-definition-link"} for the lemma links. (FIXME: Should separate out the lemma links into their own field.) `.joiner`: Override the joiner (normally a slash) used to join multipart tags. You should normally not specify this.
 * `.lang`: (required) Language to use when looking up language-specific inflection tags, categories and
 * `.tags`: (required unless `.tag_sets` is given) List of non-canonicalized inflection tags. Multiple tag sets
 * `.tag_sets`: (required unless `.tags` is given) List of non-canonicalized tag sets and associated
 * `.lemmas`: (recommended) List of objects describing the lemma(s) of which the term in question is a
 * `.lemma_face`: (recommended) "Face" to use when displaying the lemma objects. Usually should be set to
 * `.POS`: (recommended) Categorizing part-of-speech tag. Comes from the p or POS argument of
 * `.pagename`: Page name of "current" page or nil to use the actual page title; for testing purposes.
 * `.enclitics`: List of enclitics to display after the lemmas, in parens.
 * `.no_format_categories`: If true, don't format the categories derived from the inflection tags; just return them.
 * `.sort`: Sort key for formatted categories. Ignored when `.no_format_categories` = {true}.
 * `.nocat`: Suppress computation of categories (even if `.no_format_categories` is not given).
 * `.notext`: Disable display of all tag text and `inflection of` text. (FIXME: Maybe not implemented correctly.)
 * `.capfirst`: Capitalize the first word displayed.
 * `.pretext`: Additional text to display before the inflection tags, but after any top-level labels.
 * `.posttext`: Additional text to display after the lemma links.
 * `.text_classes`: CSS classes used to wrap the tag text and lemma links. Default is

A typical call might look like this (for ): { local lang = require("Module:languages").getByCode("es")

local lemma_obj = { lang = lang, term = "amar", }

return m_form_of.tagged_inflections({		lang = lang, tags = {"1", "s", "pres", "ind"}, lemmas = {lemma_obj}, lemma_face = "term", POS = "verb"	}) }

Normally, one value is returned, the formatted text, which has appended to it the formatted categories derived from the tag-set-related categories generated by the specs in [Module:form of/cats]]. To suppress this, set `data.no_format_categories` = {true}, in which case two values are returned, the formatted text without any formatted categories appended and a list of the categories to be formatted.

NOTE: There are two sets of categories that may be generated: (1) categories derived directly from the tag sets, as specified in Module:form of/cats; (2) categories derived from tag-set labels, either (a) set explicitly by the caller in `data.tag_sets`, (b) specified by the user using `` attached to the last tag in a tag set, or (c) specified in Module:form of/cats. The second type (label-related categories) are currently not returned in the second return value of {tagged_inflections}, and are currently inserted into the output text even if `data.no_format_categories` is set to {true}; but they can be suppressed by setting `data.nocat` = {true} (which also suppresses the first type of categories, those derived directly from tag sets, even if `data.no_format_categories` is set to {true}). ]==] function export.tagged_inflections(data) if not data.tags and not data.tag_sets then error("First argument must be a table of arguments, and `.tags` or `.tag_sets` must be specified") end if data.tags and data.tag_sets then error("Both `.tags` and `.tag_sets` cannot be specified") end local tag_sets = data.tag_sets if not tag_sets then tag_sets = export.split_tag_set(data.tags) for i, tag_set in ipairs(tag_sets) do			tag_sets[i] = export.parse_tag_set_properties(tag_set) end end

local inflections = {} local categories = {} for _, tag_set in ipairs(tag_sets) do		local normalized_tag_sets = export.normalize_tag_set(tag_set.tags, data.lang, "do-track")

for _, normalized_tag_set in ipairs(normalized_tag_sets) do			local cur_infl = {} local this_categories, this_labels = export.fetch_categories_and_labels(normalized_tag_set, data.lang,				data.POS, data.pagename, type(data.lemmas) == "table" and data.lemmas or nil) if not data.nocat then m_table.extendList(categories, this_categories) end local cur_infl = export.get_tag_set_display_form(normalized_tag_set, data.lang, data.joiner) if #cur_infl > 0 then if tag_set.labels then this_labels = m_table.append(tag_set.labels, this_labels) end table.insert(inflections, {infl_text = cur_infl, labels = this_labels}) end end end

local overall_labels, need_per_tag_set_labels for _, inflection in ipairs(inflections) do		if overall_labels == nil then overall_labels = inflection.labels elseif not m_table.deepEquals(overall_labels, inflection.labels) then need_per_tag_set_labels = true overall_labels = nil break end end

if not need_per_tag_set_labels then for _, inflection in ipairs(inflections) do			inflection.labels = nil end end

local format_data = m_table.shallowcopy(data)

local function format_labels(labels, notext) if labels and #labels > 0 then return require(labels_module).show_labels { labels = labels, lang = data.lang, sort = data.sort, nocat = data.nocat } .. (notext and (data.pretext or "") == "" and "" or " ") else return "" end end

local of_text = data.lemmas and " of" or "" local formatted_text if #inflections == 1 then if need_per_tag_set_labels then error("Internal error: need_per_tag_set_labels should not be set with one inflection") end format_data.text = format_labels(overall_labels, data.notext) .. (data.pretext or "") .. (data.notext and "" or			((data.capfirst and require("Module:string utilities").ucfirst(inflections[1].infl_text) or inflections[1].infl_text) .. of_text)) formatted_text = export.format_form_of(format_data) else format_data.text = format_labels(overall_labels, data.notext) .. (data.pretext or "") .. (data.notext and "" or			((data.capfirst and "Inflection" or "inflection") .. of_text)) format_data.posttext = (data.posttext or "") .. ":"		local link = export.format_form_of(format_data) local text_classes = data.text_classes or "form-of-definition use-with-mention" for i, inflection in ipairs(inflections) do inflections[i] = "\n## " .. format_labels(inflection.labels, false) .. "" .. inflection.infl_text .. " "		end formatted_text = link .. table.concat(inflections) end

if not data.no_format_categories then if #categories > 0 then formatted_text = formatted_text .. require("Module:utilities").format_categories(categories, data.lang,				data.sort, nil, export.force_cat) end return formatted_text end return formatted_text, categories end

--[==[ Given a tag set, return a flattened list all Wikidata ID's of all tags in the tag set. FIXME: Only used in a debugging function in Module:se-verbs; move there. ]==] function export.to_Wikidata_IDs(tag_set, lang, skip_tags_without_ids) local ret = {}

local function get_wikidata_id(tag) local data = export.lookup_tag(tag, lang)

if not data or not data[export.WIKIPEDIA] then if not skip_tags_without_ids then error('The tag "' .. tag .. '" does not have a Wikidata ID defined in the form-of data modules') else return nil end else return ("Q%s"):format(data[export.WIKIPEDIA]) end end

local normalized_tag_sets = export.normalize_tag_set(tag_set, lang) for _, tag_set in ipairs(normalized_tag_sets) do		for _, tag in ipairs(tag_set) do			if type(tag) == "table" then for _, subtag in ipairs(tag) do					if type(subtag) == "table" then -- two-level multipart tag; FIXME: delete support for this for _, subsubtag in ipairs(subtag) do							table.insert(ret, get_wikidata_id(subsubtag)) end else table.insert(ret, get_wikidata_id(subtag)) end end else table.insert(ret, get_wikidata_id(tag)) end end end

return ret end

function export.dump_form_of_data(frame) local data = { data = require(export.form_of_data_module), data2 = require(export.form_of_data2_module) }	return require("Module:JSON").toJSON(data) end

function export.finalize_tag_data(tags, shortcuts) local function process_shortcut(name, shortcut) -- If the shortcut is already in the list, then there is a duplicate. if shortcuts[shortcut] then error("The shortcut \"" .. shortcut .. "\" (for the inflection tag \"" .. name .. "\") conflicts with an existing shortcut for the tag \"" .. shortcuts[shortcut] .. "\".") elseif tags[shortcut] then error("The shortcut \"" .. shortcut .. "\" (for the inflection tag \"" .. name .. "\") conflicts with an existing tag with that name.") end

shortcuts[shortcut] = name end for name, data in pairs(tags) do		local data_shortcuts = data[export.SHORTCUTS] if data_shortcuts then if type(data_shortcuts) == "string" then process_shortcut(name, data_shortcuts) else for _, shortcut in ipairs(data_shortcuts) do					process_shortcut(name, shortcut) end end end end end

return export

title: Module:User:Benwing2/form of


text:
樹大招風

Idiom

 * 1)  prominence invites trouble

license: Creative Commons - Attribution Share-Alike - https://creativecommons.org/licenses/by-sa/4.0/

title: 樹大招風


text:
An Phong

Etymology
From.

Proper noun

 * 1)  Alphonsus Liguori Italian bishop and founder of the Redemptorists
 * 2)  Alfonso

Usage notes
In the sense, this name is used only as a Christian name, not as a general translation of the given name.

title: An Phong


text: klonie

title: klonie


text: klonem

title: klonem


text:
utinan

Adjective

 * 1) having a penis

Noun

 * 1) someone or something with a penis
 * 2)  a faggot

title: utinan


text: klonowi

title: klonowi


text:
butoan

Adjective

 * 1) having a vulva

Noun

 * 1) someone or something with a vulva

title: butoan


text: bassame

title: bassame


text: klony

title: klony


text: User:Benwing2/superseded spelling of

title: User:Benwing2/superseded spelling of


text:
béeme

Pronoun

 * : whom

title: béeme


text:
假託

Verb

 * 1) to do something under someone's name
 * 2) to rely on; to make use of
 * 3) to use as an excuse; to use as a pretext
 * 1) to use as an excuse; to use as a pretext
 * 1) to use as an excuse; to use as a pretext

title: 假託


text:
палиғи

Adjective

 * 1) black

title: палиғи


text: klonom

title: klonom


text: klonami

title: klonami


text:
холиғи

Etymology
From, compare 🇨🇬.

Adjective

 * 1) yellow

title: холиғи


text: klonach

title: klonach


text: klonów

title: klonów


text: 意动用法

title: 意动用法


text:
дуӈмалиғи

Adjective

 * 1) blue

title: дуӈмалиғи


text:
意動用法

Noun

 * 1) use of a non-verb as a verb

title: 意動用法


text: Template:cim-decl-béeldar

title: Template:cim-decl-béeldar


text: Template:cim-decl-béeldar/documentation

title: Template:cim-decl-béeldar/documentation


text: glonu

title: glonu


text: glonem

title: glonem


text:
хуӈналиғи

Adjective

 * 1) grey

title: хуӈналиғи


text: glony

title: glony


text: glonie

title: glonie


text: glonom

title: glonom


text: glonami

title: glonami


text: glonach

title: glonach


text: glonów

title: glonów


text: glonowi

title: glonowi


text:
မရန်း

Etymology
Borrowed from.

Noun

 * 1) Marian plum

title: မရန်း


text:
ဥပါယ်

Etymology
, from.

Noun

 * 1) means; expedience; device; stratagem

title: ဥပါယ်


text:
upāya

Etymology
.

Noun

 * 1) way
 * 2) means
 * 3) resource

title: upāya


text:
គណៈ

Etymology
From or. .

Noun

 * 1) group; faction; section

title: គណៈ


text:
မုဒြာ

Etymology
Borrowed from.

Noun

 * 1) gesture
 * , a gesture in Buddhist iconography

title: မုဒြာ


text:
Tepenixtlahuaca

Etymology
Borrowed from, from a language; cf. 🇨🇬.

Translations

 * Chatino:
 * Tataltepec: Siyaꞌ
 * Western Highland: Siyaꞌ, kichen Siyaꞌ
 * Spanish: Tepenixtlahuaca, Santa Cruz Tepenixtlahuaca

Etymology
Borrowed from a language; cf. 🇨🇬.

title: Tepenixtlahuaca


text:
គណៈរដ្ឋមន្ត្រី

Etymology
🇰🇲.

Noun

 * 1) cabinet, council of ministers

title: គណៈរដ្ឋមន្ត្រី


text:
姑娘兒

Noun

 * 1)  female prostitute
 * 2)  daughter
 * 3)  girl; maiden
 * 4)  underaged sister-in-law (husband's sister)
 * 5)  doll

title: 姑娘兒


text: 姑娘儿

title: 姑娘儿


text: chijyanꞌ

title: chijyanꞌ


text: Category:ctp:Birds

title: Category:ctp:Birds


text:
Reconstruction:Proto-Iranian/hwatā́wā

Etymology
From  ~, from  ~ , from  ~ , from  ~  (compare 🇨🇬, from  ),. Cognate with 🇨🇬.

Noun

 * 1) lord, sovereign, king
 * 2) god

Derived terms

 * Xiongnu:
 * Xiongnu:
 * Xiongnu:
 * Xiongnu:
 * Xiongnu:
 * Xiongnu:
 * Xiongnu:
 * Xiongnu:

Descendants

 * Northeastern Iranian:
 * Northwestern Iranian:
 * Southwestern Iranian:
 * Northwestern Iranian:
 * Southwestern Iranian:
 * Northwestern Iranian:
 * Southwestern Iranian:
 * Northwestern Iranian:
 * Southwestern Iranian:
 * Northwestern Iranian:
 * Southwestern Iranian:
 * Northwestern Iranian:
 * Southwestern Iranian:
 * Northwestern Iranian:
 * Southwestern Iranian:
 * Northwestern Iranian:
 * Southwestern Iranian:
 * Southwestern Iranian:
 * Southwestern Iranian:

title: Reconstruction:Proto-Iranian/hwatā́wā


text:
hồng y

Etymology
From, , from +.

Noun

 * 1)  cardinal official of the Catholic Church

title: hồng y


text:
đức hồng y

Noun

 * 1)  cardinal official in the Catholic Church

title: đức hồng y


text:
tổng giám mục

Etymology
.

Noun

 * 1)  archbishop

title: tổng giám mục


text:
tổng giáo phận

Noun

 * 1)  archdiocese

title: tổng giáo phận


text:
reassortation

Noun

 * 1)  A second or subsequent assortation

title: reassortation


text:
renoprotectant

Noun

 * 1) Any renoprotective material

title: renoprotectant


text: renoprotectants

title: renoprotectants


text:
retinoscleral

Adjective

 * 1) Relating to the retina and the sclera

title: retinoscleral


text:
giáo phận

Noun

 * 1)  diocese

title: giáo phận


text:
retrocolic

Adjective

 * 1)  posterior to the colon

title: retrocolic


text:
giáo tỉnh

Noun

 * 1) province area under the jurisdiction of an archbishop

title: giáo tỉnh


text: retropulsing

title: retropulsing


text:
giám tỉnh

Noun

 * 1)  provincial monastic superior

title: giám tỉnh


text:
rhizarthrosis

Noun

 * 1) rhizal arthrosis of the base of the thumb

title: rhizarthrosis


text:
riboguanidine

Noun

 * 1)  A glycoside of ribose and guanidine

title: riboguanidine


text:
একলা

Etymology
, from, from. Cognate with 🇨🇬, 🇨🇬, 🇨🇬 /, 🇨🇬.

Adverb

 * 1) singly, alone

title: একলা


text:
দয়া করে

Adverb

 * 1) please

title: দয়া করে


text:
দয়া

Etymology
From.

Noun

 * 1) pity, mercy, favour

title: দয়া


text:
saccharolactone

Noun

 * 1)  The lactone of saccharic acid

title: saccharolactone


text:
giò thủ

Etymology
🇰🇲.

Noun

 * 1) head cheese

title: giò thủ


text:
sanguivory

Etymology
or.

Noun

 * 1) The condition of being sanguivorous

title: sanguivory


text: ĐHY

title: ĐHY


text:
sclerocarpy

Noun

 * 1)  The condition of being sclerocarpic

title: sclerocarpy


text: card-sharp

title: card-sharp


text: card-sharps

title: card-sharps


text: put to lie

title: put to lie


text: put lie to

title: put lie to


text:
septohypothalamic

Adjective

 * 1)  Relating to the hypothalamus and its septum

title: septohypothalamic


text: put the lie to

title: put the lie to


text: giving the lie to

title: giving the lie to


text: gave the lie to

title: gave the lie to


text: putting the lie to

title: putting the lie to


text: putting lie to

title: putting lie to


text: putting to lie

title: putting to lie


text: puts to lie

title: puts to lie


text: giving lie to

title: giving lie to


text: gave lie to

title: gave lie to


text: shizontocidal

title: shizontocidal


text: dàzì

title: dàzì


text: schizontocidal

title: schizontocidal


text:
Talk:đức hồng y

I'm not sure if there should be a separate entry for this. The looks kind of like a classifier to me? PhanAnh123 (talk) 06:50, 29 March 2019 (UTC)

title: Talk:đức hồng y


text:
silicophilous

Adjective

 * 1)  That lives in an environment rich in silicate rocks

title: silicophilous


text:
slimicidal

Adjective

 * 1) Relating to a slimicide

title: slimicidal


text:
pterotillomania

Noun

 * 1) A behavioural disorder in birds in which a bird plucks out its own feathers, or plucks the feathers of its chicks.

title: pterotillomania


text:
ประมุข

Etymology
From ; from + ; equivalent to 🇨🇬 🇰🇲. Cognate with 🇨🇬, 🇨🇬, 🇨🇬. Compare 🇨🇬.

Noun

 * 1)  chief; head; leader.
 * 2)  bishop.
 * 1)  bishop.
 * 1)  bishop.
 * 1)  bishop.
 * 1)  bishop.
 * 1)  bishop.
 * 1)  bishop.
 * 1)  bishop.
 * 1)  bishop.
 * 1)  bishop.
 * 1)  bishop.
 * 1)  bishop.

title: ประมุข


text:
ประมุขแห่งรัฐ

Etymology
From 🇰🇲;.

Noun

 * 1) head of state.

title: ประมุขแห่งรัฐ


text:
北マケドニア

Etymology
From.

title: 北マケドニア


text:
maharajalela

Noun

 * 1)  the royal executioner; a minister who beheads a criminal
 * 2)  chief chamberlain

title: maharajalela


text:
北マケドニア共和国

Etymology
From.

Proper noun

 * 1) the Republic of North Macedonia

title: 北マケドニア共和国


text: δήλωνα

title: δήλωνα


text:
母身

Noun

 * 1)  mother's body

title: 母身


text:
マニエリスム

Etymology
From.

Noun

 * 1)  Mannerism

title: マニエリスム


text:
母欉

Noun

 * 1)  female parent in hybridisation
 * 2)  trunk and branch of a tree

title: 母欉


text:
母目

Noun

 * 1)  main threads of a complicated affair

title: 母目


text:
母仔

Noun

 * 1)  mother
 * 2)  female servant; maid; maidservant

title: 母仔


text:
婆仔

Noun

 * 1)  female servant; maid; maidservant
 * 2)  old woman; old bag
 * 3)  married woman that guides a bride in wedding etiquette and custom
 * 4)  married woman mortician in the southern coastal areas of Taiwan

title: 婆仔


text:
стрельница

Noun

 * 1) barbican

title: стрельница


text:
барбакан

Noun

 * 1) barbican

title: барбакан


text:
宜母子

Etymology
Attested in :

Noun

 * 1)  lemon (fruit)

title: 宜母子


text: клиночек

title: клиночек


text: кулёчек

title: кулёчек


text: кулечек

title: кулечек


text: tāi-tông

title: tāi-tông


text: Thesaurus:母子

title: Thesaurus:母子


text:
оподельдок

Noun

 * 1) opodeldoc

title: оподельдок


text:
母仔囝

Noun

 * 1)  mother and child

title: 母仔囝


text:
母囝

Noun

 * 1)  mother and child

title: 母囝


text:
仔乸

Noun

 * 1)  mother and child; mother and son

title: 仔乸


text:
子哀

Noun

 * 1)  mother and child; mother and son

title: 子哀


text:
兩子哀

Noun

 * 1)  mother and child; mother and son

title: 兩子哀


text: 两子哀

title: 两子哀


text: Tiong-san

title: Tiong-san


text:
娘兒們

Noun

 * 1)  mother and child; mother and son
 * 2)  womenfolk
 * 3)  wife

title: 娘兒們


text: 娘儿们

title: 娘儿们


text: Lāi-ô͘

title: Lāi-ô͘


text:
娘兒倆

Noun

 * 1) mother and child; mother and son

title: 娘兒倆


text: 娘儿俩

title: 娘儿俩


text: Siông-san

title: Siông-san


text:
母姨

Noun

 * 1)  maternal aunt one's mother's sister

title: 母姨


text:
三十六計逃げるに如かず

Etymology
. Compare 🇨🇬, 🇨🇬.

The back-formation of this form in pseudo-kanbun would be 三十六計不如逃.

Phrase

 * 1) among the , nothing beats fleeing

title: 三十六計逃げるに如かず


text:
អំបាត

Noun

 * 1) (small) louse; (small) flea; nit

title: អំបាត


text: pugilisten

title: pugilisten


text: Bān-hôa

title: Bān-hôa


text: Báng-kah

title: Báng-kah


text:
سورپرایز

Etymology
.

Noun

 * 1) surprise

title: سورپرایز


text:
pugilistiek

Etymology
From.

Noun

 * , boxing, fistfighting

title: pugilistiek


text:
短小精悍

Idiom

 * 1) not imposing but strong and capable of a man
 * 2) short and pithy; terse and forceful of a piece of writing

title: 短小精悍


text:
武腯

Adjective

 * 1)  short and small but strong and able-bodied of a person

title: 武腯


text:
pugilistisch

Etymology
From or an adapted borrowing from.

Adjective

 * 1) pugilistic, pertaining to boxing

title: pugilistisch


text:
武身

Adjective

 * 1)  short and small but strong and able-bodied of a person

title: 武身


text:
短小

Adjective

 * 1) short and small

title: 短小


text:
pugilisme

Etymology
Probably borrowed from.

Noun

 * , boxing, fistfighting

title: pugilisme


text: Bûn-san

title: Bûn-san


text: boksers

title: boksers


text: Lâm-káng

title: Lâm-káng


text:
vô sản

Etymology
, from.

Adjective

 * 1)  proletarian

title: vô sản


text:
de pijp aan Maarten geven

Etymology
. Literally, “to give the pipe to Maarten [Martin]”.

Verb

 * 1)  to give up, to throw in the towel
 * 2)  to die.
 * 1)  to die.

title: de pijp aan Maarten geven


text:
tư sản

Etymology 1
, from.

Adjective

 * 1)  bourgeois

Etymology 2
.

Noun

 * 1)  personal property

title: tư sản


text:
de pijp uit gaan

Etymology
Literally, “to go out (of) the pipe”, in reference to a rabbit hole.

Verb

 * 1)  to kick the bucket, to die

title: de pijp uit gaan


text:
蒼旻

Noun

 * 1)  blue sky

Noun

 * 1) blue sky

title: 蒼旻


text: 苍旻

title: 苍旻


text:
မွှား

Noun

 * 1) tick

title: မွှား


text:
awda

Etymology
.

Pronoun

 * 1) * "kxd"
 * 1) * "kxd"
 * 1) * "kxd"
 * 1) * "kxd"

- Saya menjemput awda untuk menikmati alam sekitar, makanan, budaya dan hutan hujan kami semasa awda berada di negara ini.

Noun

 * 1) meadow

title: awda


text:
stuurkuip

Etymology
Compound of.

Noun

 * 1)  An open bridge or cockpit of a boat or aircraft; an open front section of a car.
 * 2) A small fairing protecting the headlight and the handlebar of a motorbike.

title: stuurkuip


text:
旻天

Noun

 * 1)  autumn; fall
 * 2)  day

title: 旻天


text:
旻序

Noun

 * 1)  season and climate of autumn

title: 旻序


text: windschermen

title: windschermen


text: windschermpje

title: windschermpje


text: windschermpjes

title: windschermpjes


text: zweefvliegje

title: zweefvliegje


text: zweefvliegjes

title: zweefvliegjes


text:
escolla

Etymology 1
. Compare 🇨🇬.

Noun

 * 1) selection; act of choosing
 * 2) selection something selected

title: escolla


text: Category:poz-mly-pro:Time

title: Category:poz-mly-pro:Time


text:
zweeftrein

Etymology
Compound of.

Noun

 * 1) A levitating train, in particular a maglev.

title: zweeftrein


text: zweeftreinen

title: zweeftreinen


text:
Talk:conjetura

Catalan
Is this really Catalan? The DIEC and the diccionariu normatiu valencià of the AVL both have *conjectura* - the AVL dictionary redirects conjetura to conjectura and the DIEC doesn't recognise *conjetura* at all. The Alcover-Moll dictionary seems like it's down at the moment (at least for me), but I'd be surprised if it had something different. Perhaps there are some native speakers who say *conjetura* without the /k/, but I wonder if that sort of criteria for inclusion would lead us to accept basically any Spanish word as "Catalan", given Catalan's sociolinguistic situation and the high level of Spanish influence and code switching among some speakers. Saimdusan (talk) 09:27, 29 March 2019 (UTC)

title: Talk:conjetura


text:
somatoblast

Noun

 * 1) A group of cells that develops into the ectoderm, nervous system and nephridia of an annelid

title: somatoblast


text: somatoblasts

title: somatoblasts


text:
sparstolonin

Noun

 * 1)  An isocoumarin polyphenol, present in some Chinese herbs, that has antiinflammatory action

title: sparstolonin


text: vuohiskarvat

title: vuohiskarvat


text:
vuohiskarva

Noun

 * 1)  horsefeather long hair on lower legs of a draft horse

title: vuohiskarva


text:
spectropotentiometry

Noun

 * 1) A form of potentiometry in which the subject is exposed to light of varying frequencies

Related terms

 * spectropotentiometric

title: spectropotentiometry


text:
spectropotentiometric

Adjective

 * 1) Relating to spectropotentiometry

title: spectropotentiometric


text:
linuog

Etymology
⟨ceb⟩

Adjective

 * 1) barbaric
 * 2) savage

title: linuog


text:
spermatangial

Adjective

 * 1) Relating to spermatangia

title: spermatangial


text:
vliegpark

Etymology
Compound of.

Noun

 * , military airport

title: vliegpark


text: vliegparken

title: vliegparken


text:
guol

Verb

 * 1) to worry

Noun

 * 1) yam

title: guol


text:
stereoangiography

Noun

 * 1) stereoscopic angiography

title: stereoangiography


text:
stereophysical

Adjective

 * 1) Describing physical aspects that vary with orientation

Related terms

 * stereochemical

title: stereophysical


text: strepsirhine

title: strepsirhine


text: strepsirhines

title: strepsirhines


text:
ερασιτέχνης

Noun

 * 1) amateur, dilettante

title: ερασιτέχνης


text:
subcatalogue

Alternative forms

 * subcatalog

Noun

 * 1)  A subordinate catalogue

title: subcatalogue


text: subcatalogues

title: subcatalogues


text: subcortexes

title: subcortexes


text:
subdichotomous

Adjective

 * 1) Partially dichotomous

title: subdichotomous


text:
vernieler

Etymology
From.

Noun

 * 1) A destroyer, one who destroys.
 * 2)  A destroyer fast combat ship.

title: vernieler


text: vernielers

title: vernielers


text:
subdichotomously

Adverb

 * 1) In a subdichotomous manner

title: subdichotomously


text:
suboblate

Adjective

 * 1) Slightly oblate

title: suboblate


text:
subpopliteal

Adjective

 * 1)  Beneath the popliteus

title: subpopliteal


text:
vliegtuigmoederschip

Etymology
From,.

Noun

 * 1) seaplane carrier seaplane tender with facilities for launching and hoisting seaplanes

title: vliegtuigmoederschip


text: vliegtuigmoederschepen

title: vliegtuigmoederschepen


text:
subresolvable

Adjective

 * 1) Partially resolvable

title: subresolvable


text:
superdominance

Noun

 * 1) The condition of being superdominant

title: superdominance


text:
superocaudally

Adverb

 * 1) In a superocaudal manner

title: superocaudally


text:
vleugeltip

Etymology
Compound of.

Noun

 * 1) wing tip extremity of an animal's or aeroplane's wing

title: vleugeltip


text: vleugeltips

title: vleugeltips


text: vleugeltippen

title: vleugeltippen


text: superocaudal

title: superocaudal


text:
syndetome

Etymology
From.

Noun

 * 1) The dorsolateral part of a embryonic somite

title: syndetome


text: syndetomes

title: syndetomes


text:
syphaxin

Noun

 * 1)  A hemolytic protein present in the frog

title: syphaxin


text: Category:poz-mly-pro:Religion

title: Category:poz-mly-pro:Religion


text:
tolvlucht

Etymology
Compound of.

Noun

 * 1)  tailspin

title: tolvlucht


text: tolvluchten

title: tolvluchten


text:
کارکردگی

Noun

 * 1) performance
 * 2) output
 * 3) work
 * 4) efficiency

title: کارکردگی


text:
chó hoang châu Phi

Etymology
.

Noun

 * 1) African hunting dog

title: chó hoang châu Phi


text:
vergasser

Etymology
Borrowed from. Equivalent to.

Noun

 * 1)  carburetor, carburettor
 * 2)  gas burner of a lamp or heating device
 * 1)  gas burner of a lamp or heating device

title: vergasser


text: vergassers

title: vergassers


text:
User talk:Glevion

Welcome!

Hello, welcome to Wiktionary, and thank you for your contributions so far.

If you are unfamiliar with wiki editing, take a look at Help:How to edit a page. It is a concise list of technical guidelines to the wiki format we use here: how to, for example, make text boldfaced or create hyperlinks. Feel free to practice in the sandbox. If you would like a slower introduction we have a short tutorial.

These links may help you familiarize yourself with Wiktionary:

 * Entry layout (EL) is a detailed policy documenting how Wiktionary pages should be formatted. All entries should conform to this standard. The easiest way to start off is to copy the contents of an existing page for a similar word, and then adapt it to fit the entry you are creating.
 * Our Criteria for inclusion (CFI) define exactly which words can be added to Wiktionary, though it may be a bit technical and longwinded. The most important part is that Wiktionary only accepts words that have been in somewhat widespread use over the course of at least a year, and citations that demonstrate usage can be asked for when there is doubt.
 * If you already have some experience with editing our sister project Wikipedia, then you may find our guide for Wikipedia users useful.
 * The FAQ aims to answer most of your remaining questions, and there are several help pages that you can browse for more information.
 * A glossary of our technical jargon, and some hints for dealing with the more common communication issues.
 * If you have anything to ask about or suggest, we have several discussion rooms. Feel free to ask any other editors in person if you have any problems or question, by posting a message on their talk page.

You are encouraged to add a BabelBox to your userpage. This shows which languages you know, so other editors know which languages you'll be working on, and what they can ask you for help with.

I hope you enjoy editing here and being a Wiktionarian! If you have any questions, bring them to the Information desk, or ask me on my talk page. If you do so, please sign your posts with four tildes: ~ which automatically produces your username and the current date and time.

Again, welcome! Stelio (talk) 10:33, 29 March 2019 (UTC)

Community Insights Survey
Share your experience in this survey

Hi ,

The Wikimedia Foundation is asking for your feedback in a survey about your experience with and Wikimedia. The purpose of this survey is to learn how well the Foundation is supporting your work on wiki and how we can change or improve things in the future. The opinions you share will directly affect the current and future work of the Wikimedia Foundation.

Please take 15 to 25 minutes to give your feedback through this survey. It is available in various languages.

This survey is hosted by a third-party and governed by this privacy statement (in English).

Find more information about this project. [mailto:surveys@wikimedia.org Email us] if you have any questions, or if you don't want to receive future messages about taking this survey.

Sincerely, RMaung (WMF) 14:29, 9 September 2019 (UTC)

Reminder: Community Insights Survey
Share your experience in this survey

Hi ,

A couple of weeks ago, we invited you to take the Community Insights Survey. It is the Wikimedia Foundation’s annual survey of our global communities. We want to learn how well we support your work on wiki. We are 10% towards our goal for participation. If you have not already taken the survey, you can help us reach our goal! Your voice matters to us.

Please take 15 to 25 minutes to give your feedback through this survey. It is available in various languages.

This survey is hosted by a third-party and governed by this privacy statement (in English).

Find more information about this project. [mailto:surveys@wikimedia.org Email us] if you have any questions, or if you don't want to receive future messages about taking this survey.

Sincerely, RMaung (WMF) 19:11, 20 September 2019 (UTC)

Reminder: Community Insights Survey
Share your experience in this survey

Hi ,

There are only a few weeks left to take the Community Insights Survey! We are 30% towards our goal for participation. If you have not already taken the survey, you can help us reach our goal! With this poll, the Wikimedia Foundation gathers feedback on how well we support your work on wiki. It only takes 15-25 minutes to complete, and it has a direct impact on the support we provide.

Please take 15 to 25 minutes to give your feedback through this survey. It is available in various languages.

This survey is hosted by a third-party and governed by this privacy statement (in English).

Find more information about this project. [mailto:surveys@wikimedia.org Email us] if you have any questions, or if you don't want to receive future messages about taking this survey.

Sincerely, RMaung (WMF) 17:02, 4 October 2019 (UTC)

title: User talk:Glevion


text: Category:Rejang terms borrowed from Malay


text:
របៀបណា

Etymology
🇰🇲.

Adverb

 * 1) how; in what way

title: របៀបណា


text:
按怎樣

Adverb

 * 1)  how

title: 按怎樣


text: 按怎样

title: 按怎样


text:
tekentang

Etymology
Compound of.

Noun

 * 1) A pair of tick tweezers, a tick remover.

title: tekentang


text:
tekenpincet

Etymology
Compound of.

Noun

 * 1) A pair of tick tweezers, a tick remover.

title: tekenpincet


text:
Citations:abides

 * 1998, Joel and Ethan Coen, The Big Lebowski:
 * "The Dude abides.

 * I don't know about you, but I take comfort in that. It's good knowin' he's out there. The Dude. Takin' 'er easy for all us sinners. Shoot. I sure hope he makes the finals. Well, that about does her, wraps her all up. Things seem to have worked out pretty good for the Dude and Walter, and it was a pretty good story, don't ya think? Made me laugh to beat the band. Parts, anyway. I didn't like seein' Donny go. But then, I happen to know that there's a little Lebowski on the way. I guess that's the way the whole darned human comedy keeps perpetuatin' itself, down through the generations, westward the wagons, across the sands of time until we-- aw, look at me, I'm ramblin' again. Well, I hope you folks enjoyed yourselves. Catch ya later on down the trail.

 * ...Say friend, ya got any more of that good sarsaparilla?"

title: Citations:abides


text: Category:Sylheti terms borrowed from Arabic


text: gàipiàn

title: gàipiàn


text:
ontteken

Etymology
From.

Verb

 * 1)  to detick

title: ontteken


text:
detick

Etymology
From en.

Verb

 * 1)  to remove ticks (parasitic arachnids) from

title: detick


text: deticking

title: deticking


text: deticked

title: deticked


text:
緊接

Verb

 * 1) to follow closely

title: 緊接


text: 紧接

title: 紧接


text: jǐnjiē

title: jǐnjiē


text:
non-negligible

Alternative forms

 * nonnegligible

Adjective

 * 1) Not negligible.

title: non-negligible


text:
nezanedbatelný

Etymology
From.

Adjective

 * 1) non-negligible

title: nezanedbatelný


text: Zhōngguóxué

title: Zhōngguóxué


text:
tapejaroid

Noun

 * 1) Any pterosaur of the clade

title: tapejaroid


text: tapejaroids

title: tapejaroids


text:
弋取

Verb

 * 1)  to get; to gain; to acquire; to draw

title: 弋取


text: tetranectins

title: tetranectins


text: yìqǔ

title: yìqǔ


text: tǔchǎn

title: tǔchǎn


text:
thermophilin

Noun

 * 1) A bacteriocin present in

title: thermophilin


text: thermophilins

title: thermophilins


text:
thiotropocin

Noun

 * 1)  The antibiotic 8-sulfanylcyclohepta[c]oxathiole-3,4-dione

title: thiotropocin


text:
枝杈

Noun

 * 1) branch; twig

title: 枝杈


text: zhīchā

title: zhīchā


text: brevetten

title: brevetten


text: toxigenomic

title: toxigenomic


text: wèijìng

title: wèijìng


text:
trabeculectomize

Etymology
From.

Verb

 * 1)  To carry out a trabeculectomy.

title: trabeculectomize


text: trabeculectomized

title: trabeculectomized


text: transarcolemmal

title: transarcolemmal


text:
transposonal

Adjective

 * 1) Relating to, or composed of transposons

title: transposonal


text:
秤桿

Noun

 * 1) weighing rod; weighing lever

title: 秤桿


text: 秤杆

title: 秤杆


text: chènggǎn

title: chènggǎn


text: gǎnchèng

title: gǎnchèng


text:
ក្បាច់

Noun

 * 1) art; decor
 * 2) abacus

title: ក្បាច់


text:
triazinone

Noun

 * 1)  A derivative of a triazinane that has a carbonyl group in the ring

title: triazinone


text: dòuniáng

title: dòuniáng


text: kǎochǎng

title: kǎochǎng


text: kǎocháng

title: kǎocháng


text: liúmín

title: liúmín


text:
គិតលេខ

Etymology
🇰🇲.

Verb

 * 1) to count, to calculate, to compute

title: គិតលេខ


text: zāimín

title: zāimín


text: triazinones

title: triazinones


text:
trinonadecenoin

Noun

 * 1)  The triglyceride of nonadecenoic acid

Related terms

 * trinonadecanoin

title: trinonadecenoin


text: Category:ii:Fish

title: Category:ii:Fish


text:
nonadecenoic acid

Noun

 * 1)  The saturated aliphatic carboxylic acid that has nineteen carbon atoms

Related terms

 * nonadecenoate
 * trinonadecenoin

title: nonadecenoic acid


text:
nonadecenoate

Noun

 * 1)  Any salt or ester of nonadecenoic acid

title: nonadecenoate


text: nonadecenoates

title: nonadecenoates


text:
taxiën

Etymology
Borrowed from.

Verb

 * 1)  to taxi to move without flying

title: taxiën


text: chūzhēng

title: chūzhēng


text:
គណិតចរ

Etymology
From +.

Noun

 * 1) calculator; computer

title: គណិតចរ


text: chāikāi

title: chāikāi


text: chángzhēn

title: chángzhēn


text: duǎnzhēn

title: duǎnzhēn


text: eendekkers

title: eendekkers


text:
rodge

Noun

 * 1)  The grey duck.

title: rodge


text:
抬頭不見低頭見

Idiom

 * 1)  to meet often

title: 抬頭不見低頭見


text: 抬头不见低头见

title: 抬头不见低头见


text: rodges

title: rodges


text:
kívülről

Etymology
(literally: ’from outside [of a book]’, without relying on a book)

title: kívülről


text: monoplaan

title: monoplaan


text:
Dirichlet energy

Etymology
Named after German mathematician (1805-1859), who made significant contributions to the theory of Fourier series.

Noun

 * 1)  A quadratic functional which, given a real function defined on an open subset of ℝn, yields a real number that is a measure of how variable said function is.

Usage notes

 * In mathematical terms, given an open set $$\Omega\subseteq\R^n$$ and a function $$u:\Omega\to\R$$, the Dirichlet energy of $$u$$ is $$\textstyle E[u] = \frac 1 2 \int_\Omega \| \nabla u(x) \|^2 \, dx$$, where $$\nabla u: \Omega\to\R^n$$ denotes the gradient vector field of $$u$$.

Translations

 * Dutch: Dirichlet-energie
 * Italian: energia di Dirichlet
 * Spanish: energía de Dirichlet

title: Dirichlet energy


text: móuhuà

title: móuhuà


text: Dirichlet energies

title: Dirichlet energies


text:
unimmobilized

Adjective

 * 1) Not immobilized

title: unimmobilized


text: uretroenteric

title: uretroenteric


text: Rodge

title: Rodge


text: utilisability

title: utilisability


text:
reimmobilize

Verb

 * 1)  To immobilize again.

title: reimmobilize


text: reimmobilized

title: reimmobilized


text: reimmobilizes

title: reimmobilizes


text: reimmobilizing

title: reimmobilizing


text: Ogwumike

title: Ogwumike


text:
vasculonervous

Adjective

 * 1) Relating to the vascular and nervous systems

title: vasculonervous


text: Thesaurus:思考

title: Thesaurus:思考


text:
ventrointestinal

Adjective

 * 1) Relating to the abdomen and the intestines

title: ventrointestinal


text:
ventroparietal

Adjective

 * 1) Relating to the abdominal wall.

title: ventroparietal


text: prudentials

title: prudentials


text:
driedekker

Etymology
Compound of.

Noun

 * 1)  triplane
 * 2)  three-decker three-decked warship
 * 1)  three-decker three-decked warship

title: driedekker


text: driedekkers

title: driedekkers


text: vestimeniferan

title: vestimeniferan


text:
捐募

Verb

 * 1) to raise; to collect

title: 捐募


text: juānmù

title: juānmù


text: vitroretinal

title: vitroretinal


text: vizualisation

title: vizualisation


text: vizualization

title: vizualization


text:
息金

Noun

 * 1)  interest

title: 息金


text: xíjīn

title: xíjīn


text:
អគ្គីស

Etymology
🇰🇲.

Noun

 * 1)  electron

title: អគ្គីស


text: wortamannin

title: wortamannin


text: wortamanin

title: wortamanin


text:
子金

Noun

 * 1)  interest

title: 子金


text: អគ្គី

title: អគ្គី


text:
anderhalfdekker

Etymology
Compound of.

Noun

 * 1) sesquiplane

title: anderhalfdekker


text:
利金

Noun

 * 1)  interest

title: 利金


text: lìjīn

title: lìjīn


text:
sesquiplan

Etymology
Borrowed from.

Noun

 * 1)  sesquiplane

title: sesquiplan


text:
Adịchie

Etymology
From ; ultimately from.

title: Adịchie


text: Thesaurus:利息

title: Thesaurus:利息


text:
cut and come again

Noun

 * 1) A situation where one possesses plenty of wealth or resources.
 * 2)  An approach to growing lettuces, etc. where one harvests only the outer leaves, leaving the inner part of the plant to grow replacements that can be harvested later.
 * 3)  A type of English fruitcake.
 * 1)  A type of English fruitcake.

title: cut and come again


text:
langosz

Etymology
, from +.

Noun

 * 1) langos

title: langosz


text: zhēngpìn

title: zhēngpìn


text:
coshery

Noun

 * 1)  The ancient right of an Irish chief to quarter himself and his retainers on his tenantry.

title: coshery


text: tuōtà

title: tuōtà


text: grameme

title: grameme


text: gramemes

title: gramemes


text: jiǒngrán

title: jiǒngrán


text: gramemic

title: gramemic


text:
grammemic

Adjective

 * 1) Relating to grammemes.

title: grammemic


text: salt of lemon

title: salt of lemon


text:
Onondagan

Adjective

 * 1) Of or relating to the Onondaga people.

Noun

 * 1) A member of the Onondaga people.

title: Onondagan


text: Onondagans

title: Onondagans


text:
Onopordum

Etymology
From.

Hypernyms

 * ; - subfamily;  - tribe;  - subtribe

Hyponyms

 * (cotton thistle) - type species; for other species see

title: Onopordum


text: kānguǎn

title: kānguǎn


text: suíshēn

title: suíshēn


text: Chocz

title: Chocz


text:
choczanin

Etymology
From.

Noun

 * 1) resident or native of Chocz

title: choczanin


text: táitóu bùjiàn dītóu jiàn

title: táitóu bùjiàn dītóu jiàn


text:
choczanka

Etymology
From.

title: choczanka


text:
proefstand

Etymology
From,.

Noun

 * 1) test bench

title: proefstand


text: proefstanden

title: proefstanden


text:
turn rusty

Verb

 * 1) To become obstinate or stubborn in opposition.

title: turn rusty


text: ride rusty

title: ride rusty


text:
Thread:User talk:Rua//ɡ/ vs /ɣ/ in Frisian/reply (8)

I have no idea. Ask on WT:GP maybe?


text:
chocki

Etymology
From.

Adjective

 * 1)  of Chocz

title: chocki


text: yāochán

title: yāochán


text: zǒuguòchǎng

title: zǒuguòchǎng


text: zǒuguòcháng

title: zǒuguòcháng


text: guòchǎng

title: guòchǎng


text: guòcháng

title: guòcháng


text: fénfēng

title: fénfēng


text: autoprotonizations

title: autoprotonizations


text: autoreinfections

title: autoreinfections


text: autorepressors

title: autorepressors


text: autoreproductions

title: autoreproductions


text: autosterilizations

title: autosterilizations


text: autotetraploidizations

title: autotetraploidizations


text: autotopisms

title: autotopisms


text: auxiliary cruisers

title: auxiliary cruisers


text:
ἅμιλλα

Etymology
According to Beekes, the ending in "-ιλλ-" points to a origin.

Noun

 * 1) competition, contest, trial
 * 2) face-off, confrontation, dispute
 * 3) struggle, fight, conflict
 * 4) sporting activity, game, race

title: ἅμιλλα


text: avagrahas

title: avagrahas


text: avascularizations

title: avascularizations


text: aventurins

title: aventurins


text: Template:ps-suffix

title: Template:ps-suffix


text:
βαλάνινος

Etymology
From.

Adjective

 * 1) made of acorns
 * 2) of the color of acorns

title: βαλάνινος


text: BAFCs

title: BAFCs


text:
chorzowianin

Etymology
From.

Noun

 * 1) resident or native of Chorzów

title: chorzowianin


text:
tetramethylmethane

Noun

 * 1)  neopentane

title: tetramethylmethane


text:
chorzowianka

Etymology
From.

title: chorzowianka


text:
Palazzo Koch

Proper noun

 * 1) the headquarter of the Bank of Italy in Rome Italy

title: Palazzo Koch


text:
hettupeysa

Etymology
From.

Noun

 * 1) hoodie

title: hettupeysa


text: luànjiāo

title: luànjiāo


text:
spierkrachtvliegtuig

Etymology
From,.

Noun

 * 1)  human-powered aeroplane

title: spierkrachtvliegtuig


text: aviation fuels

title: aviation fuels


text:
Villa Medici

Proper noun

 * 1) a group of buildings hosting the Academy of France in Rome Italy

title: Villa Medici


text: yuēpào

title: yuēpào


text: lànjiāo

title: lànjiāo


text: dǎpào

title: dǎpào


text: avonymics

title: avonymics


text: away days

title: away days


text: AWGs

title: AWGs


text: awlbills

title: awlbills


text: axiodilatons

title: axiodilatons


text:
νηρίτης

Etymology
The connection with is refuted by the forms with the vocalic anlaut “α-”. Furnée takes this initial variation as evidence for a origin. Plevačová draws the term to 🇨🇬 – which see for more relatives –, downplaying the semantic difference by noting that both are longish sea creatures caught in a fisher’s net and the contexts in which the Greek and Latin are attested may as well point to a fish.

Noun

 * 1) sea snail

title: νηρίτης


text: axographs

title: axographs


text: axoids

title: axoids


text: axotomisations

title: axotomisations


text: azafluorenes

title: azafluorenes


text:
Trinità dei Monti

Proper noun

 * 1) a church in Rome famous for its stairway to Piazza di Spagna

title: Trinità dei Monti


text:
応用科学

Etymology
From.

Noun

 * 1) applied science

title: 応用科学


text: Pleszew

title: Pleszew


text:
pseudoclassicism

Noun

 * 1) false or affected classicism

title: pseudoclassicism


text:
hydroxyethane

Noun

 * 1)  ethanol

title: hydroxyethane


text: pseudoclassicisms

title: pseudoclassicisms


text: kerbsy

title: kerbsy


text:
pleszewski

Etymology
From.

Adjective

 * 1)  of Pleszew

title: pleszewski


text:
Thread:User talk:Rua//ɡ/ vs /ɣ/ in Frisian/reply (9)

Unwatch the talk page?


text: Category:Polish terms borrowed from Hungarian


text:
ἵδρυμα

Etymology
From.

Noun

 * 1) establishment, foundation
 * 2) temple, shrine

title: ἵδρυμα


text:
roebuck-berry

Noun

 * 1)  stone bramble

title: roebuck-berry


text: roebuck-berries

title: roebuck-berries


text: Category:ja:Information science

title: Category:ja:Information science


text: gambs

title: gambs


text:
πήληξ

Etymology
The formation is like, and. The suffix "-ηξ" often occurs in words.

Noun

 * 1) helmet
 * 2) crest of the serpent

title: πήληξ


text:
Palazzo di Giustizia

Proper noun

 * 1) a building hosting the Italian Supreme Court in Rome
 * 2) similar buildings in many other Italian cities

title: Palazzo di Giustizia


text: Category:it:Collectives

title: Category:it:Collectives


text: Category:it:Miscellaneous

title: Category:it:Miscellaneous


text:
Κρῶμνος

Proper noun

 * 1) Cromnus, Arcadia, Greece

title: Κρῶμνος


text: Ner

title: Ner


text:
免疫化学

Etymology
From.

Noun

 * 1) immunochemistry

title: 免疫化学


text: Category:ja:Immunochemistry

title: Category:ja:Immunochemistry


text:
foveole

Noun

 * 1) A small fovea or depression.

title: foveole


text: foveoles

title: foveoles


text: Prosna

title: Prosna


text:
Palazzo del Laterano

Proper noun

 * 1) a building in Rome for thousand years Papal Seat and Roman Pontiff official residence nowadays hosting the Museo Storico dello Stato Pontificio

title: Palazzo del Laterano


text: panniculi

title: panniculi


text:
etäpäivä

Noun

 * 1) remote working day, remote workday day of working over telecom connection from home or elsewhere away from the ordinary place of work

title: etäpäivä


text:
palkaton

Adjective

 * 1) unpaid, unsalaried

title: palkaton


text:
pekkaspäivä

Etymology
🇰🇲, named after

Noun

 * 1) a paid day of vacation compensating for longer work days

title: pekkaspäivä


text:
pätkätyöläinen

Noun

 * 1) temporary worker

title: pätkätyöläinen


text:
rekrytoija

Noun

 * 1) recruiter

title: rekrytoija


text:
tehtävänkuva

Noun

 * 1) mission or job description or statement

title: tehtävänkuva


text:
tienesti

Etymology
Borrowed from, , , from. Akin to 🇨🇬, 🇨🇬, 🇨🇬.

Noun

 * 1) (paid) employment, paid work, wage labor
 * 2)  earnings, income

title: tienesti


text:
tilipäivä

Noun

 * 1) payday

title: tilipäivä


text: tienestit

title: tienestit


text:
työmaaruokala

Noun

 * 1) worksite canteen

title: työmaaruokala


text:
työmoraali

Noun

 * 1) work ethic

title: työmoraali


text:
työnhaku

Noun

 * 1) job search, finding a job, job hunting

title: työnhaku


text:
työnimike

Noun

 * 1) job title

title: työnimike


text:
työntekopaikka

Noun

 * 1) place of work

title: työntekopaikka


text:
työnvalvoja

Noun

 * 1) work supervisor or overseer

title: työnvalvoja


text:
työpaikkahaastattelu

Noun

 * 1) job interview

title: työpaikkahaastattelu


text:
työvuorolista

Noun

 * 1) duty roster

title: työvuorolista


text:
työvuoroluettelo

Noun

 * 1) work schedule, duty roster

title: työvuoroluettelo


text:
vakityö

Etymology
🇰🇲

Noun

 * 1) full-time job

title: vakityö


text: raffie

title: raffie


text:
alta moda

Noun

 * 1) high fashion

title: alta moda


text:
virkasuhde

Noun

 * 1) position office relationship, employment relationship

title: virkasuhde


text:
vuokratyö

Noun

 * 1) temporary agency work

title: vuokratyö


text:
värväys

Noun

 * 1) recruitment, recruiting, enlisting

title: värväys


text:
päästökauppa

Noun

 * 1) emissions trading

title: päästökauppa


text:
širokko

Etymology
From.

Noun

 * 1) sirocco

title: širokko


text: raffies

title: raffies


text: raffes

title: raffes


text:
alailmakehä

Noun

 * 1) lower atmosphere, troposphere

title: alailmakehä


text:
auringonpaistetunti

Noun

 * 1) sunshine hour

title: auringonpaistetunti


text:
diabaattinen

Etymology
(see 🇨🇬). Adapted with the adjectival suffix.

Adjective

 * 1) diabatic

title: diabaattinen


text:
hellepäivä

Noun

 * 1) hot day, day with a high temperature

title: hellepäivä


text:
hygrometria

Etymology
(see 🇨🇬). Contains the suffix.

Noun

 * 1) hygrometry

title: hygrometria


text:
Palazzo della Civiltà Italiana

Proper noun

 * 1) a monumental building in Rome EUR housing the headquarters of luxury fashion label Fendi

title: Palazzo della Civiltà Italiana


text:
ilmanpainevyöhyke

Noun

 * 1) region of either low or high air pressure

title: ilmanpainevyöhyke


text:
kuivuusindeksi

Noun

 * 1) aridity index, drought index

title: kuivuusindeksi


text:
lounatuuli

Noun

 * 1) southwester

title: lounatuuli


text:
paikallissää

Noun

 * 1) local weather

title: paikallissää


text: polaaripyörre

title: polaaripyörre


text:
räntälumi

Noun

 * 1) heavy wet snow

title: räntälumi


text:
sadesumma

Noun

 * 1) total amount of precipitation over a certain period

title: sadesumma


text:
sumupeite

Noun

 * 1) thick fog cover

title: sumupeite


text:
yläilmakehä

Noun

 * 1) upper atmosphere, stratosphere

title: yläilmakehä


text:
ソフトウェア工学

Etymology
From.

Noun

 * 1) software engineering

title: ソフトウェア工学


text:
Talk:värväys

Pronunciation
There is an error in the pronunciation. Could you look at it again, ? – Krun (talk) 13:50, 29 March 2019 (UTC)
 * Yes, it was definitely wrong - looks more like a typo than anything. — surjection ⟨?⟩ 14:30, 29 March 2019 (UTC)

title: Talk:värväys


text:
人口統計学

Etymology
From.

Noun

 * 1) demography

title: 人口統計学


text: Category:ja:Demography

title: Category:ja:Demography


text: tunica's

title: tunica's


text:
tuniek

Etymology
Borrowed from, from.

Noun

 * 1) tunic
 * 2) A sports uniform.
 * 3) A long women's overgarment similar to a long shirt or sweater or a short dress.
 * 4) A short overgarment, often one worn as part of a uniform.

title: tuniek


text: tunieken

title: tunieken


text: Giardino di Boboli

title: Giardino di Boboli


text:
инапэкӏэ

Adverb

 * 1) by his face

title: инапэкӏэ


text:
зэрэкъэлъагъорэмкӏэ

Adverb

 * 1) It appears; it seems; by the looks of things
 * зэрэкъэлъагъорэмкӏэ непэ къещхыщт — By the looks of things, it gonna rain today.
 * 1) by how (s)he looks

title: зэрэкъэлъагъорэмкӏэ


text:
彼搭

Pronoun

 * 1)  there

title: 彼搭


text:
mérföldes

Adjective

 * 1) mile-…, x miles long/wide …

title: mérföldes


text:
彼跡

Pronoun

 * 1)  there

title: 彼跡


text: Price's theorem

title: Price's theorem


text:
Talk:pla ra

I don't know if there are more words for "ปลาร้า" in languages. Anyway, many languages can translate "fermented fish" like 発酵魚 (hakkō gyo) or 발효 물고기 (balhyo mulgogi) but they may not be able to put here. --Octahedron80 (talk) 14:08, 29 March 2019 (UTC)

title: Talk:pla ra


text:
彼帶

Pronoun

 * 1)  there

title: 彼帶


text: 彼带

title: 彼带