ویکیفەرھەنگ
ckbwiktionary
https://ckb.wiktionary.org/wiki/%D9%88%DB%8C%DA%A9%DB%8C%D9%81%DB%95%D8%B1%DA%BE%DB%95%D9%86%DA%AF:%D8%AF%DB%95%D8%B3%D8%AA%D9%BE%DB%8E%DA%A9
MediaWiki 1.47.0-wmf.15
case-sensitive
میدیا
تایبەت
وتووێژ
بەکارھێنەر
لێدوانی بەکارھێنەر
ویکیفەرھەنگ
لێدوانی ویکیفەرھەنگ
پەڕگە
وتووێژی پەڕگە
میدیاویکی
وتووێژی میدیاویکی
داڕێژە
وتووێژی داڕێژە
یارمەتی
وتووێژی یارمەتی
پۆل
وتووێژی پۆل
TimedText
TimedText talk
مۆدیوول
لێدوانی مۆدیوول
Event
Event talk
مۆدیوول:category tree
828
19
36741
35048
2026-08-12T13:45:06Z
Ghybu
12
Extraction of category titles adapted for Sorani names
36741
Scribunto
text/plain
-- Prevent substitution.
if mw.isSubsting() then
return require("Module:unsubst")
end
local export = {}
local category_tree_submodule_prefix = "Module:category tree/"
local category_tree_styles_css = "Module:category tree/styles.css"
local m_str_utils = require("Module:string utilities")
local m_template_parser = require("Module:template parser")
local m_utilities = require("Module:utilities")
local ceil = math.ceil
local class_else_type = m_template_parser.class_else_type
local concat = table.concat
local deep_copy = require("Module:table").deepCopy
local full_url = mw.uri.fullUrl
local insert = table.insert
local is_callable = require("Module:fun").is_callable
local log10 = math.log10 or require("Module:math").log10
local new_title = mw.title.new
local pages_in_category = mw.site.stats.pagesInCategory
local parse = m_template_parser.parse
local remove_comments = require("Module:string/removeComments")
local sort = table.sort
local split = m_str_utils.split
local string_compare = require("Module:string/compare")
local trim = m_str_utils.trim
local uupper = m_str_utils.upper
local yesno = require("Module:yesno")
local current_frame = mw.getCurrentFrame()
local current_title = mw.title.getCurrentTitle()
local namespace = current_title.namespace
local poscatboiler_subsystem = "poscatboiler"
local extra_args_error = "Extra arguments to {{((}}auto cat{{))}} are not allowed for this category."
-- Generates a sortkey for a numeral `n`, adding leading zeroes to avoid the "1, 10, 2, 3" sorting problem. `max_n` is the greatest expected value of `n`, and is used to determine how many leading zeroes are needed. If not supplied, it defaults to the number of languages.
function export.numeral_sortkey(n, max_n)
max_n = max_n or require("Module:list of languages").count()
return ("#%%0%dd"):format(ceil(log10(max_n + 1))):format(n)
end
function export.split_lang_label(title_text)
local getByCanonicalName = require("Module:languages").getByCanonicalName
-- Progressively remove a word from the potential canonical name until it
-- matches an actual canonical name.
local words = split(title_text, " ", true)
for i = #words - 1, 1, -1 do
local lang = getByCanonicalName(concat(words, " ", 1, i))
if lang then
return lang, concat(words, " ", i + 1)
end
end
return nil, title_text
end
local function show_error(text)
return require("Module:message box").maintenance(
"red",
"[[File:Ambox warning pn.svg|50px]]",
"ئەم پۆلە لە داری پۆلی ویکیفەرھەنگدا پێناسە نەکراوە.",
text
)
end
-- Show the text that goes at the very top right of the page.
local function show_topright(current)
return current.getTopright and current:getTopright() or nil
end
local function link_box(content)
return ("<div class=\"noprint plainlinks\" style=\"float: left; clear: both; margin: 0 1em .5em 0; background: var(--wikt-palette-paleblue, #f9f9f9); border: 1px var(--border-color-base, #aaaaaa) solid; margin-top: -1px; padding: 5px; font-weight: bold;\">%s</div>"):format(content)
end
local function show_editlink(current)
return link_box(("[%s دراوەی پۆل دەستکاری بکە]"):format(tostring(full_url(current:getDataModule(), "action=edit"))))
end
function show_related_changes()
local title = current_title.fullText
return link_box(("[%s <span title=\"دوایین دەستکاری و گۆڕانکارییەکانی تری پەڕەکانی نێو «%s»\">دوایین گۆڕانکارییەکان</span>]"):format(
tostring(full_url("Special:RecentChangesLinked", {
target = title,
showlinkedto = 0,
})),
title
))
end
local function show_pagelist(current)
local namespace = "namespace="
local info = current:getInfo()
local lang_code = info.code
if info.label == "citations" or info.label == "citations of undefined terms" then
namespace = namespace .. "Citations"
elseif lang_code then
local lang = require("Module:languages").getByCode(lang_code, true)
if lang then
-- Proto-Norse (gmq-pro) is the probably language with a code ending in -pro
-- that's intended to have mostly non-reconstructed entries.
if (lang_code:find("%-pro$") and lang_code ~= "gmq-pro") or lang:hasType("reconstructed") then
namespace = namespace .. "Reconstruction"
elseif lang:hasType("appendix-constructed") then
namespace = namespace .. "Appendix"
end
end
elseif info.label:match("templates") then
namespace = namespace .. "داڕێژە"
elseif info.label:match("modules") then
namespace = namespace .. "مۆدیوول"
elseif info.label:match("^Wiktionary") or info.label:match("^Pages") then
namespace = ""
end
return ([=[
{| id="newest-and-oldest-pages" class="wikitable mw-collapsible mw-collapsed" style="float: left; clear: both; margin: 0 1em .5em 0;"
! نوێترین و کۆنترین پەڕەکان
|-
| id="recent-additions" style="font-size:0.9em;" | '''نوێترین پەڕەکان بەپێی کۆتا [[mw:Manual:Categorylinks table#cl_timestamp|نوێکردنەوەی بەستەری پۆلەکە]] ڕیز کراون:'''
%s
|-
| id="oldest-pages" style="font-size:0.9em;" | '''کۆنترین پەڕەکان بەپێی کۆتا دەستکاری ڕیز کراون:'''
%s
|}]=]):format(
current_frame:extensionTag(
"DynamicPageList",
([=[
category=%s
%s
count=10
mode=ordered
ordermethod=categoryadd
order=descending]=]
):format(current_title.text, namespace)
),
current_frame:extensionTag(
"DynamicPageList",
([=[
category=%s
%s
count=10
mode=ordered
ordermethod=lastedit
order=ascending]=]
):format(current_title.text, namespace)
)
)
end
-- Show navigational "breadcrumbs" at the top of the page.
local function show_breadcrumbs(current)
local steps = {}
-- Start at the current label and move our way up the "chain" from child to parent, until we can't go further.
while current do
local category, display_name, nocap
if type(current) == "string" then
category = current
display_name = current:gsub("^پۆل:", "")
else
if not current.getCategoryName then
error("Internal error: Bad format in breadcrumb chain structure, probably a misformatted value for `parents`: " ..
mw.dumpObject(current))
end
category = "پۆل:" .. current:getCategoryName()
display_name, nocap = current:getBreadcrumbName()
end
if not nocap then
display_name = mw.getContentLanguage():ucfirst(display_name)
end
insert(steps, 1, ("[[:%s|%s]]"):format(category, display_name))
-- Move up the "chain" by one level.
if type(current) == "string" then
current = nil
else
current = current:getParents()
end
if current then
current = current[1].name
end
end
local templateStyles = require("Module:TemplateStyles")(category_tree_styles_css)
local ol = mw.html.create("ol")
for i, step in ipairs(steps) do
local li = mw.html.create("li")
if i ~= 1 then
local span = mw.html.create("span")
:attr("aria-hidden", "true")
:addClass("ts-categoryBreadcrumbs-separator")
:wikitext(" » ")
li:node(span)
end
li:wikitext(step)
ol:node(li)
end
return templateStyles .. tostring(mw.html.create("div")
:attr("role", "navigation")
:attr("aria-label", "Breadcrumb")
:addClass("ts-categoryBreadcrumbs")
:node(ol))
end
local function show_also(current)
local also = current._info.also
if also and #also > 0 then
return ('<div style="margin-top:-1em;margin-bottom:1.5em">%s</div>'):format(require("Module:also").main(also))
end
return nil
end
-- Show a short description text for the category.
local function show_description(current)
return current.getDescription and current:getDescription() or nil
end
local function show_appendix(current)
local appendix = current.getAppendix and current:getAppendix()
return appendix and ("For more information, see [[%s]]."):format(appendix) or nil
end
local function sort_children(child1, child2)
return string_compare(uupper(child1.sort), uupper(child2.sort))
end
-- Show a list of child categories.
local function show_children(current)
local children = current.getChildren and current:getChildren() or nil
if not children then
return nil
end
sort(children, sort_children)
local children_list = {}
for _, child in ipairs(children) do
local child_name, child_pagetitle = child.name
if type(child_name) == "string" then
child_pagetitle = child_name
else
child_pagetitle = "پۆل:" .. child_name:getCategoryName()
end
if new_title(child_pagetitle).exists then
insert(children_list, ("* [[:%s]]: %s"):format(
child_pagetitle,
child.description or
type(child_name) == "string" and child_name:gsub("^پۆل:", "") .. "." or
child_name:getDescription("child")
))
end
end
return concat(children_list, "\n")
end
-- Show a table of contents with links to each letter in the language's script.
local function show_TOC(current)
local titleText = current_title.text
local inCategoryPages = pages_in_category(titleText, "pages")
local inCategorySubcats = pages_in_category(titleText, "subcats")
local TOC_type
-- Compute type of table of contents required.
if inCategoryPages > 2500 or inCategorySubcats > 2500 then
TOC_type = "full"
elseif inCategoryPages > 200 or inCategorySubcats > 200 then
TOC_type = "normal"
else
-- No (usual) need for a TOC if all pages or subcategories can fit on one page;
-- but allow this to be overridden by a custom TOC handler.
TOC_type = "none"
end
if current.getTOC then
local TOC_text = current:getTOC(TOC_type)
if TOC_text ~= true then
return TOC_text or nil
end
end
if TOC_type ~= "none" then
local templatename = current:getTOCTemplateName()
local TOC_template
if TOC_type == "full" then
-- This category is very large, see if there is a "full" version of the TOC.
local TOC_template_full = new_title(templatename .. "/full")
if TOC_template_full.exists then
TOC_template = TOC_template_full
end
end
if not TOC_template then
local TOC_template_normal = new_title(templatename)
if TOC_template_normal.exists then
TOC_template = TOC_template_normal
end
end
if TOC_template then
return current_frame:expandTemplate{title = TOC_template.text, args = {}}
end
end
return nil
end
-- Show the "catfix" that adds language attributes and script classes to the page.
local function show_catfix(current)
local lang, sc = current:getCatfixInfo()
return lang and m_utilities.catfix(lang, sc) or nil
end
-- Show the parent categories that the current category should be placed in.
local function show_categories(current, categories)
local parents = current.getParents and current:getParents() or nil
if not parents then
return nil
end
for _, parent in ipairs(parents) do
local parent_name = parent.name
local sortkey = type(parent.sort) == "table" and parent.sort:makeSortKey() or parent.sort
if type(parent_name) == "string" then
insert(categories, ("[[%s|%s]]"):format(parent_name, sortkey))
else
insert(categories, ("[[پۆل:%s|%s]]"):format(parent_name:getCategoryName(), sortkey))
end
end
-- Also put the category in its corresponding "umbrella" or "by language" category.
local umbrella = current:getUmbrella()
if umbrella then
-- FIXME: use a language-neutral sorting function like the Unicode Collation Algorithm.
local sortkey = current._lang and current._lang:getCanonicalName() or current:getCategoryName()
sortkey = require("Module:languages").getByCode("en", true):makeSortKey(sortkey)
if type(umbrella) == "string" then
insert(categories, ("[[%s|%s]]"):format(umbrella, sortkey))
else
insert(categories, ("[[پۆل:%s|%s]]"):format(umbrella:getCategoryName(), sortkey))
end
end
-- Check for various unwanted parser functions, which should be integrated into the category tree data instead.
-- Note: HTML comments shouldn't be removed from `content` until after this step, as they can affect the result.
local content = current_title:getContent()
if not content then
-- This happens when using [[Special:ExpandTemplates]] to call {{auto cat}} on a nonexistent category page,
-- which is needed by Benwing's create_wanted_categories.py script.
return
end
local defaultsort, displaytitle, page_has_param
for node in parse(content):iterate_nodes() do
local node_class = class_else_type(node)
if node_class == "template" then
local name = node:get_name()
if name == "DEFAULTSORT:" and not defaultsort then
insert(categories, "[[پۆل:Pages with DEFAULTSORT conflicts]]")
defaultsort = true
elseif name == "DISPLAYTITLE:" and not displaytitle then
insert(categories,"[[پۆل:Pages with DISPLAYTITLE conflicts]]")
displaytitle = true
end
elseif node_class == "parameter" and not page_has_param then
insert(categories,"[[پۆل:Pages with raw triple-brace template parameters]]")
page_has_param = true
end
end
-- Check for raw category markup, which should also be integrated into the category tree data.
content = remove_comments(content, "BOTH")
local head = content:find("[[", 1, true)
while head do
local close = content:find("]]", head + 2, true)
if not close then
break
end
-- Make sure there are no intervening "[[" between head and close.
local open = content:find("[[", head + 2, true)
while open and open < close do
head = open
open = content:find("[[", head + 2, true)
end
local cat = content:sub(head + 2, close - 1)
local colon = cat:match("^[ _\128-\244]*[Cc][Aa][Tt][EeGgOoRrYy _\128-\244]*():")
if colon then
local pipe = cat:find("|", colon + 1, true)
if pipe ~= #cat then
local title = new_title(pipe and cat:sub(1, pipe - 1) or cat)
if title and title.namespace == 14 then
insert(categories,"[[پۆل:Categories with categories using raw markup]]")
break
end
end
end
head = open
end
end
local function generate_output(current)
if current then
for _, functionName in pairs{
"getBreadcrumbName",
"getDataModule",
"canBeEmpty",
"getDescription",
"getParents",
"getChildren",
"getUmbrella",
"getAppendix",
"getTOCTemplateName",
} do
if not is_callable(current[functionName]) then
require("Module:debug").track{"category tree/missing function", "category tree/missing function/" .. functionName}
end
end
end
local boxes, display, categories = {}, {}, {}
-- Categories should never show files as a gallery.
insert(categories, "__NOGALLERY__")
if current_frame:getParent():getTitle() == "داڕێژە:auto cat" then
insert(categories, "[[پۆل:Categories calling Template:auto cat]]")
end
-- Check if the category is empty
local totalPages = pages_in_category(current_title.text, "all")
local hugeCategory = totalPages > 1000000 -- 1 million
-- Categorize huge categories, as they cause DynamicPageList to time out and make the category inaccessible.
if hugeCategory then
insert(categories, "[[پۆل:Huge categories]]")
end
-- Are the parameters valid?
if not current then
insert(categories, "[[پۆل:ئەو پۆلانەی کە لە داری پۆلەکەدا پێناسە نەکراون]]")
insert(categories, totalPages == 0 and "[[پۆل:پۆلە واڵاکان]]" or nil)
insert(display, show_error(
"Double-check the category name for typos. <br>" ..
"[[Special:Search/Category: " .. current_title.text:gsub("^.+:", ""):gsub(" ", "~2 ") .. '~2|Search existing categories]] to check if this category should be created under a different name (for example, "Fruits" instead of "Fruit"). <br>' ..
"To add a new category to Wiktionary's category tree, please consult " .. current_frame:expandTemplate{title = "section link", args = {
"Help:Category#How_to_create_a_category",
}} .. "."))
-- Exit here, as all code beyond here relies on current not being nil
return concat(categories, "") .. concat(display, "\n\n"), true
end
-- Does the category have the correct name?
local currentName = current:getCategoryName()
local correctName = current_title.text == currentName
if not correctName then
insert(categories, "[[پۆل:Categories with incorrect names]]")
insert(display, show_error(("Based on the data in the category tree, this category should be called '''[[:پۆل:%s]]'''."):format(currentName)))
end
-- Add cleanup category for empty categories.
local canBeEmpty = current:canBeEmpty()
if canBeEmpty and correctName then
insert(categories, " __EXPECTUNUSEDCATEGORY__")
elseif totalPages == 0 then
insert(categories, "[[پۆل:پۆلە واڵاکان]]")
end
if current:isHidden() then
insert(categories, "__HIDDENCAT__")
end
-- Put all the float-right stuff into a <div> that does not clear, so that float-left stuff like the breadcrumbs and
-- description can go opposite the float-right stuff without vertical space.
insert(boxes, "<div style=\"float: left;\">")
insert(boxes, show_topright(current))
insert(boxes, show_editlink(current))
insert(boxes, show_related_changes())
-- Show pagelist, unless it's a huge category (since they can't use DynamicPageList - see above).
if not hugeCategory then
insert(boxes, show_pagelist(current))
end
insert(boxes, "</div>")
-- Generate the displayed information
insert(display, show_breadcrumbs(current))
insert(display, show_also(current))
insert(display, show_description(current))
-- insert(display, show_appendix(current))
insert(display, show_children(current))
insert(display, show_TOC(current))
insert(display, show_catfix(current))
insert(display, '<br class="clear-both-in-vector-2022-only">')
show_categories(current, categories)
return concat(boxes, "\n") .. "\n" .. concat(display, "\n\n") .. concat(categories, "")
end
--[==[
List of handler functions that try to match the page name. A handler should return the name of a submodule to
[[Module:category tree]] and an info table which is passed as an argument to the submodule. If a handler does not
recognize the page name, it should return nil. Note that the order of handlers matters!
]==]
local handlers = {}
-- Thesaurus per-language category
insert(handlers, function(title)
local code, label = title:match("^Thesaurus:(%l[%a-]*%a):(.+)")
if code then
return poscatboiler_subsystem, {label = title, raw = true}
end
end)
-- Topic per-language category
insert(handlers, function(title)
local code, label = title:match("^(%l[%a-]*%a):(.+)")
if code then
return poscatboiler_subsystem, {label = title, raw = true}
end
end)
-- Lect category e.g. for [[:Category:New Zealand English]] or [[:Category:Issime Walser]]
insert(handlers, function(title, args)
local lect = args.lect or args.dialect
if lect ~= "" and yesno(lect, true) then -- Same as boolean in [[Module:parameters]].
return poscatboiler_subsystem, {label = title, args = args, raw = true}
end
end)
-- poscatboiler per-language label, e.g. [[Category:English non-lemma forms]]
insert(handlers, function(title, args)
local label, langname = title:match("^(.-) بە (.+)$")
if not (label and langname) then
return
end
local lang = require("Module:languages").getByCanonicalName(langname)
if not lang then
return
end
--local lang, label = export.split_lang_label(title)
--if not lang then
-- return
--end
local baseLabel, script = label:match("(.+) in (.-) script$")
if script and baseLabel ~= "terms" then
local scriptObj = require("Module:scripts").getByCanonicalName(script)
if scriptObj then
return poscatboiler_subsystem, {label = baseLabel, code = lang:getCode(), sc = scriptObj:getCode(), args = args}
end
end
return poscatboiler_subsystem, {label = label, code = lang:getCode(), args = args}
end)
-- poscatboiler label umbrella category
insert(handlers, function(title, args)
local label = title:match("(.+) by language$")
if label then
-- The poscatboiler code will appropriately lowercase if needed.
return poscatboiler_subsystem, {label = label, args = args}
end
end)
-- poscatboiler raw handlers
insert(handlers, function(title, args)
return poscatboiler_subsystem, {label = title, args = args, raw = true}
end)
-- poscatboiler umbrella handlers without 'by language'
insert(handlers, function(title, args)
return poscatboiler_subsystem, {label = title, args = args}
end)
function export.show(frame)
local args, other_args = require("Module:parameters").process(frame:getParent().args, {
["also"] = {type = "title", sublist = "comma without whitespace", namespace = 14}
}, true)
if args.also then
for k, arg in next, args.also do
args.also[k] = arg.prefixedText
end
end
for k, arg in next, other_args do
other_args[k] = trim(arg)
end
if namespace == 10 then -- Template
return "(ئەم داڕێژە پێویستە لەسەر پەڕەکانی بۆشاییناوی [[:en:Help:Namespaces#Category|پۆل:]] بەکاربھێنرێت.)"
elseif namespace ~= 14 then -- Category
error("ئەم داڕێژە/مۆدیوولە دەکرێ تەنیا لەسەر پەڕەکانی بۆشاییناوی [[mw:Help:Namespaces#Category|پۆل:]] بەکاربھێنرێت.")
end
local first_fail_args_handled, first_fail_cattext
-- Go through each handler in turn. If a handler doesn't recognize the format of the category, it will return nil,
-- and we will consider the next handler. Otherwise, it returns a template name and arguments to call it with, but
-- even then, that template might return an error, and we need to consider the next handler. This happens, for
-- example, with the category "CAT:Mato Grosso, Brazil", where "Mato" is the name of a language, so the poscatboiler
-- per-language label handler fires and tries to find a label "Grosso, Brazil". This throws an error, and
-- previously, this blocked fruther handler consideration, but now we check for the error and continue checking
-- handlers; eventually, the topic umbrella handler will fire and correctly handle the category.
for _, handler in ipairs(handlers) do
-- Use a new title object and args table for each handler, to keep them isolated.
local submodule, info = handler(current_title.text, deep_copy(other_args))
if submodule then
info.also = deep_copy(args.also)
require("Module:debug").track("auto cat/" .. submodule)
-- `failed` is true if no match was found.
submodule = require(category_tree_submodule_prefix .. submodule)
local cattext, failed = generate_output(submodule.main(info))
if failed then
if not first_fail_cattext then
first_fail_cattext = cattext
first_fail_args_handled = info.args and true or false
end
elseif not info.args and next(other_args) then
error(extra_args_error)
else
return cattext
end
end
end
-- If there were no matches, throw an error if any arguments were given, or otherwise return the cattext
-- from the first fail encountered. The final handlers call the boilers unconditionally, so there should
-- always be something to return.
if not first_fail_args_handled and next(other_args) then
error(extra_args_error)
end
return first_fail_cattext
end
-- TODO: new test entrypoint.
return export
du1gorua0pozjtrvjhdwcor9nn5b3hh
36743
36741
2026-08-12T17:19:00Z
Ghybu
12
36743
Scribunto
text/plain
-- Prevent substitution.
if mw.isSubsting() then
return require("Module:unsubst")
end
local export = {}
local category_tree_submodule_prefix = "Module:category tree/"
local category_tree_styles_css = "Module:category tree/styles.css"
local m_str_utils = require("Module:string utilities")
local m_template_parser = require("Module:template parser")
local m_utilities = require("Module:utilities")
local ceil = math.ceil
local class_else_type = m_template_parser.class_else_type
local concat = table.concat
local deep_copy = require("Module:table").deepCopy
local full_url = mw.uri.fullUrl
local insert = table.insert
local is_callable = require("Module:fun").is_callable
local log10 = math.log10 or require("Module:math").log10
local new_title = mw.title.new
local pages_in_category = mw.site.stats.pagesInCategory
local parse = m_template_parser.parse
local remove_comments = require("Module:string/removeComments")
local sort = table.sort
local split = m_str_utils.split
local string_compare = require("Module:string/compare")
local trim = m_str_utils.trim
local uupper = m_str_utils.upper
local yesno = require("Module:yesno")
local current_frame = mw.getCurrentFrame()
local current_title = mw.title.getCurrentTitle()
local namespace = current_title.namespace
local poscatboiler_subsystem = "poscatboiler"
local extra_args_error = "Extra arguments to {{((}}auto cat{{))}} are not allowed for this category."
-- Generates a sortkey for a numeral `n`, adding leading zeroes to avoid the "1, 10, 2, 3" sorting problem. `max_n` is the greatest expected value of `n`, and is used to determine how many leading zeroes are needed. If not supplied, it defaults to the number of languages.
function export.numeral_sortkey(n, max_n)
max_n = max_n or require("Module:list of languages").count()
return ("#%%0%dd"):format(ceil(log10(max_n + 1))):format(n)
end
function export.split_lang_label(title_text)
local getByCanonicalName = require("Module:languages").getByCanonicalName
-- Progressively remove a word from the potential canonical name until it
-- matches an actual canonical name.
--local words = split(title_text, " ", true)
--for i = #words - 1, 1, -1 do
-- local lang = getByCanonicalName(concat(words, " ", 1, i))
-- if lang then
-- return lang, concat(words, " ", i + 1)
-- end
--end
local label, langname = title_text:match("^(.-) بە (.+)$")
local lang = getByCanonicalName(langname)
if lang then
return lang, label
end
return nil, title_text
end
local function show_error(text)
return require("Module:message box").maintenance(
"red",
"[[File:Ambox warning pn.svg|50px]]",
"ئەم پۆلە لە داری پۆلی ویکیفەرھەنگدا پێناسە نەکراوە.",
text
)
end
-- Show the text that goes at the very top right of the page.
local function show_topright(current)
return current.getTopright and current:getTopright() or nil
end
local function link_box(content)
return ("<div class=\"noprint plainlinks\" style=\"float: left; clear: both; margin: 0 1em .5em 0; background: var(--wikt-palette-paleblue, #f9f9f9); border: 1px var(--border-color-base, #aaaaaa) solid; margin-top: -1px; padding: 5px; font-weight: bold;\">%s</div>"):format(content)
end
local function show_editlink(current)
return link_box(("[%s دراوەی پۆل دەستکاری بکە]"):format(tostring(full_url(current:getDataModule(), "action=edit"))))
end
function show_related_changes()
local title = current_title.fullText
return link_box(("[%s <span title=\"دوایین دەستکاری و گۆڕانکارییەکانی تری پەڕەکانی نێو «%s»\">دوایین گۆڕانکارییەکان</span>]"):format(
tostring(full_url("Special:RecentChangesLinked", {
target = title,
showlinkedto = 0,
})),
title
))
end
local function show_pagelist(current)
local namespace = "namespace="
local info = current:getInfo()
local lang_code = info.code
if info.label == "citations" or info.label == "citations of undefined terms" then
namespace = namespace .. "Citations"
elseif lang_code then
local lang = require("Module:languages").getByCode(lang_code, true)
if lang then
-- Proto-Norse (gmq-pro) is the probably language with a code ending in -pro
-- that's intended to have mostly non-reconstructed entries.
if (lang_code:find("%-pro$") and lang_code ~= "gmq-pro") or lang:hasType("reconstructed") then
namespace = namespace .. "Reconstruction"
elseif lang:hasType("appendix-constructed") then
namespace = namespace .. "Appendix"
end
end
elseif info.label:match("templates") then
namespace = namespace .. "داڕێژە"
elseif info.label:match("modules") then
namespace = namespace .. "مۆدیوول"
elseif info.label:match("^Wiktionary") or info.label:match("^Pages") then
namespace = ""
end
return ([=[
{| id="newest-and-oldest-pages" class="wikitable mw-collapsible mw-collapsed" style="float: left; clear: both; margin: 0 1em .5em 0;"
! نوێترین و کۆنترین پەڕەکان
|-
| id="recent-additions" style="font-size:0.9em;" | '''نوێترین پەڕەکان بەپێی کۆتا [[mw:Manual:Categorylinks table#cl_timestamp|نوێکردنەوەی بەستەری پۆلەکە]] ڕیز کراون:'''
%s
|-
| id="oldest-pages" style="font-size:0.9em;" | '''کۆنترین پەڕەکان بەپێی کۆتا دەستکاری ڕیز کراون:'''
%s
|}]=]):format(
current_frame:extensionTag(
"DynamicPageList",
([=[
category=%s
%s
count=10
mode=ordered
ordermethod=categoryadd
order=descending]=]
):format(current_title.text, namespace)
),
current_frame:extensionTag(
"DynamicPageList",
([=[
category=%s
%s
count=10
mode=ordered
ordermethod=lastedit
order=ascending]=]
):format(current_title.text, namespace)
)
)
end
-- Show navigational "breadcrumbs" at the top of the page.
local function show_breadcrumbs(current)
local steps = {}
-- Start at the current label and move our way up the "chain" from child to parent, until we can't go further.
while current do
local category, display_name, nocap
if type(current) == "string" then
category = current
display_name = current:gsub("^پۆل:", "")
else
if not current.getCategoryName then
error("Internal error: Bad format in breadcrumb chain structure, probably a misformatted value for `parents`: " ..
mw.dumpObject(current))
end
category = "پۆل:" .. current:getCategoryName()
display_name, nocap = current:getBreadcrumbName()
end
if not nocap then
display_name = mw.getContentLanguage():ucfirst(display_name)
end
insert(steps, 1, ("[[:%s|%s]]"):format(category, display_name))
-- Move up the "chain" by one level.
if type(current) == "string" then
current = nil
else
current = current:getParents()
end
if current then
current = current[1].name
end
end
local templateStyles = require("Module:TemplateStyles")(category_tree_styles_css)
local ol = mw.html.create("ol")
for i, step in ipairs(steps) do
local li = mw.html.create("li")
if i ~= 1 then
local span = mw.html.create("span")
:attr("aria-hidden", "true")
:addClass("ts-categoryBreadcrumbs-separator")
:wikitext(" » ")
li:node(span)
end
li:wikitext(step)
ol:node(li)
end
return templateStyles .. tostring(mw.html.create("div")
:attr("role", "navigation")
:attr("aria-label", "Breadcrumb")
:addClass("ts-categoryBreadcrumbs")
:node(ol))
end
local function show_also(current)
local also = current._info.also
if also and #also > 0 then
return ('<div style="margin-top:-1em;margin-bottom:1.5em">%s</div>'):format(require("Module:also").main(also))
end
return nil
end
-- Show a short description text for the category.
local function show_description(current)
return current.getDescription and current:getDescription() or nil
end
local function show_appendix(current)
local appendix = current.getAppendix and current:getAppendix()
return appendix and ("For more information, see [[%s]]."):format(appendix) or nil
end
local function sort_children(child1, child2)
return string_compare(uupper(child1.sort), uupper(child2.sort))
end
-- Show a list of child categories.
local function show_children(current)
local children = current.getChildren and current:getChildren() or nil
if not children then
return nil
end
sort(children, sort_children)
local children_list = {}
for _, child in ipairs(children) do
local child_name, child_pagetitle = child.name
if type(child_name) == "string" then
child_pagetitle = child_name
else
child_pagetitle = "پۆل:" .. child_name:getCategoryName()
end
if new_title(child_pagetitle).exists then
insert(children_list, ("* [[:%s]]: %s"):format(
child_pagetitle,
child.description or
type(child_name) == "string" and child_name:gsub("^پۆل:", "") .. "." or
child_name:getDescription("child")
))
end
end
return concat(children_list, "\n")
end
-- Show a table of contents with links to each letter in the language's script.
local function show_TOC(current)
local titleText = current_title.text
local inCategoryPages = pages_in_category(titleText, "pages")
local inCategorySubcats = pages_in_category(titleText, "subcats")
local TOC_type
-- Compute type of table of contents required.
if inCategoryPages > 2500 or inCategorySubcats > 2500 then
TOC_type = "full"
elseif inCategoryPages > 200 or inCategorySubcats > 200 then
TOC_type = "normal"
else
-- No (usual) need for a TOC if all pages or subcategories can fit on one page;
-- but allow this to be overridden by a custom TOC handler.
TOC_type = "none"
end
if current.getTOC then
local TOC_text = current:getTOC(TOC_type)
if TOC_text ~= true then
return TOC_text or nil
end
end
if TOC_type ~= "none" then
local templatename = current:getTOCTemplateName()
local TOC_template
if TOC_type == "full" then
-- This category is very large, see if there is a "full" version of the TOC.
local TOC_template_full = new_title(templatename .. "/full")
if TOC_template_full.exists then
TOC_template = TOC_template_full
end
end
if not TOC_template then
local TOC_template_normal = new_title(templatename)
if TOC_template_normal.exists then
TOC_template = TOC_template_normal
end
end
if TOC_template then
return current_frame:expandTemplate{title = TOC_template.text, args = {}}
end
end
return nil
end
-- Show the "catfix" that adds language attributes and script classes to the page.
local function show_catfix(current)
local lang, sc = current:getCatfixInfo()
return lang and m_utilities.catfix(lang, sc) or nil
end
-- Show the parent categories that the current category should be placed in.
local function show_categories(current, categories)
local parents = current.getParents and current:getParents() or nil
if not parents then
return nil
end
for _, parent in ipairs(parents) do
local parent_name = parent.name
local sortkey = type(parent.sort) == "table" and parent.sort:makeSortKey() or parent.sort
if type(parent_name) == "string" then
insert(categories, ("[[%s|%s]]"):format(parent_name, sortkey))
else
insert(categories, ("[[پۆل:%s|%s]]"):format(parent_name:getCategoryName(), sortkey))
end
end
-- Also put the category in its corresponding "umbrella" or "by language" category.
local umbrella = current:getUmbrella()
if umbrella then
-- FIXME: use a language-neutral sorting function like the Unicode Collation Algorithm.
local sortkey = current._lang and current._lang:getCanonicalName() or current:getCategoryName()
sortkey = require("Module:languages").getByCode("en", true):makeSortKey(sortkey)
if type(umbrella) == "string" then
insert(categories, ("[[%s|%s]]"):format(umbrella, sortkey))
else
insert(categories, ("[[پۆل:%s|%s]]"):format(umbrella:getCategoryName(), sortkey))
end
end
-- Check for various unwanted parser functions, which should be integrated into the category tree data instead.
-- Note: HTML comments shouldn't be removed from `content` until after this step, as they can affect the result.
local content = current_title:getContent()
if not content then
-- This happens when using [[Special:ExpandTemplates]] to call {{auto cat}} on a nonexistent category page,
-- which is needed by Benwing's create_wanted_categories.py script.
return
end
local defaultsort, displaytitle, page_has_param
for node in parse(content):iterate_nodes() do
local node_class = class_else_type(node)
if node_class == "template" then
local name = node:get_name()
if name == "DEFAULTSORT:" and not defaultsort then
insert(categories, "[[پۆل:Pages with DEFAULTSORT conflicts]]")
defaultsort = true
elseif name == "DISPLAYTITLE:" and not displaytitle then
insert(categories,"[[پۆل:Pages with DISPLAYTITLE conflicts]]")
displaytitle = true
end
elseif node_class == "parameter" and not page_has_param then
insert(categories,"[[پۆل:Pages with raw triple-brace template parameters]]")
page_has_param = true
end
end
-- Check for raw category markup, which should also be integrated into the category tree data.
content = remove_comments(content, "BOTH")
local head = content:find("[[", 1, true)
while head do
local close = content:find("]]", head + 2, true)
if not close then
break
end
-- Make sure there are no intervening "[[" between head and close.
local open = content:find("[[", head + 2, true)
while open and open < close do
head = open
open = content:find("[[", head + 2, true)
end
local cat = content:sub(head + 2, close - 1)
local colon = cat:match("^[ _\128-\244]*[Cc][Aa][Tt][EeGgOoRrYy _\128-\244]*():")
if colon then
local pipe = cat:find("|", colon + 1, true)
if pipe ~= #cat then
local title = new_title(pipe and cat:sub(1, pipe - 1) or cat)
if title and title.namespace == 14 then
insert(categories,"[[پۆل:Categories with categories using raw markup]]")
break
end
end
end
head = open
end
end
local function generate_output(current)
if current then
for _, functionName in pairs{
"getBreadcrumbName",
"getDataModule",
"canBeEmpty",
"getDescription",
"getParents",
"getChildren",
"getUmbrella",
"getAppendix",
"getTOCTemplateName",
} do
if not is_callable(current[functionName]) then
require("Module:debug").track{"category tree/missing function", "category tree/missing function/" .. functionName}
end
end
end
local boxes, display, categories = {}, {}, {}
-- Categories should never show files as a gallery.
insert(categories, "__NOGALLERY__")
if current_frame:getParent():getTitle() == "داڕێژە:auto cat" then
insert(categories, "[[پۆل:Categories calling Template:auto cat]]")
end
-- Check if the category is empty
local totalPages = pages_in_category(current_title.text, "all")
local hugeCategory = totalPages > 1000000 -- 1 million
-- Categorize huge categories, as they cause DynamicPageList to time out and make the category inaccessible.
if hugeCategory then
insert(categories, "[[پۆل:Huge categories]]")
end
-- Are the parameters valid?
if not current then
insert(categories, "[[پۆل:ئەو پۆلانەی کە لە داری پۆلەکەدا پێناسە نەکراون]]")
insert(categories, totalPages == 0 and "[[پۆل:پۆلە واڵاکان]]" or nil)
insert(display, show_error(
"Double-check the category name for typos. <br>" ..
"[[Special:Search/Category: " .. current_title.text:gsub("^.+:", ""):gsub(" ", "~2 ") .. '~2|Search existing categories]] to check if this category should be created under a different name (for example, "Fruits" instead of "Fruit"). <br>' ..
"To add a new category to Wiktionary's category tree, please consult " .. current_frame:expandTemplate{title = "section link", args = {
"Help:Category#How_to_create_a_category",
}} .. "."))
-- Exit here, as all code beyond here relies on current not being nil
return concat(categories, "") .. concat(display, "\n\n"), true
end
-- Does the category have the correct name?
local currentName = current:getCategoryName()
local correctName = current_title.text == currentName
if not correctName then
insert(categories, "[[پۆل:Categories with incorrect names]]")
insert(display, show_error(("Based on the data in the category tree, this category should be called '''[[:پۆل:%s]]'''."):format(currentName)))
end
-- Add cleanup category for empty categories.
local canBeEmpty = current:canBeEmpty()
if canBeEmpty and correctName then
insert(categories, " __EXPECTUNUSEDCATEGORY__")
elseif totalPages == 0 then
insert(categories, "[[پۆل:پۆلە واڵاکان]]")
end
if current:isHidden() then
insert(categories, "__HIDDENCAT__")
end
-- Put all the float-right stuff into a <div> that does not clear, so that float-left stuff like the breadcrumbs and
-- description can go opposite the float-right stuff without vertical space.
insert(boxes, "<div style=\"float: left;\">")
insert(boxes, show_topright(current))
insert(boxes, show_editlink(current))
insert(boxes, show_related_changes())
-- Show pagelist, unless it's a huge category (since they can't use DynamicPageList - see above).
if not hugeCategory then
insert(boxes, show_pagelist(current))
end
insert(boxes, "</div>")
-- Generate the displayed information
insert(display, show_breadcrumbs(current))
insert(display, show_also(current))
insert(display, show_description(current))
-- insert(display, show_appendix(current))
insert(display, show_children(current))
insert(display, show_TOC(current))
insert(display, show_catfix(current))
insert(display, '<br class="clear-both-in-vector-2022-only">')
show_categories(current, categories)
return concat(boxes, "\n") .. "\n" .. concat(display, "\n\n") .. concat(categories, "")
end
--[==[
List of handler functions that try to match the page name. A handler should return the name of a submodule to
[[Module:category tree]] and an info table which is passed as an argument to the submodule. If a handler does not
recognize the page name, it should return nil. Note that the order of handlers matters!
]==]
local handlers = {}
-- Thesaurus per-language category
insert(handlers, function(title)
local code, label = title:match("^Thesaurus:(%l[%a-]*%a):(.+)")
if code then
return poscatboiler_subsystem, {label = title, raw = true}
end
end)
-- Topic per-language category
insert(handlers, function(title)
local code, label = title:match("^(%l[%a-]*%a):(.+)")
if code then
return poscatboiler_subsystem, {label = title, raw = true}
end
end)
-- Lect category e.g. for [[:Category:New Zealand English]] or [[:Category:Issime Walser]]
insert(handlers, function(title, args)
local lect = args.lect or args.dialect
if lect ~= "" and yesno(lect, true) then -- Same as boolean in [[Module:parameters]].
return poscatboiler_subsystem, {label = title, args = args, raw = true}
end
end)
-- poscatboiler per-language label, e.g. [[Category:English non-lemma forms]]
insert(handlers, function(title, args)
local lang, label = export.split_lang_label(title)
if not lang then
return
end
local baseLabel, script = label:match("(.+) in (.-) script$")
if script and baseLabel ~= "terms" then
local scriptObj = require("Module:scripts").getByCanonicalName(script)
if scriptObj then
return poscatboiler_subsystem, {label = baseLabel, code = lang:getCode(), sc = scriptObj:getCode(), args = args}
end
end
return poscatboiler_subsystem, {label = label, code = lang:getCode(), args = args}
end)
-- poscatboiler label umbrella category
insert(handlers, function(title, args)
local label = title:match("(.+) by language$")
if label then
-- The poscatboiler code will appropriately lowercase if needed.
return poscatboiler_subsystem, {label = label, args = args}
end
end)
-- poscatboiler raw handlers
insert(handlers, function(title, args)
return poscatboiler_subsystem, {label = title, args = args, raw = true}
end)
-- poscatboiler umbrella handlers without 'by language'
insert(handlers, function(title, args)
return poscatboiler_subsystem, {label = title, args = args}
end)
function export.show(frame)
local args, other_args = require("Module:parameters").process(frame:getParent().args, {
["also"] = {type = "title", sublist = "comma without whitespace", namespace = 14}
}, true)
if args.also then
for k, arg in next, args.also do
args.also[k] = arg.prefixedText
end
end
for k, arg in next, other_args do
other_args[k] = trim(arg)
end
if namespace == 10 then -- Template
return "(ئەم داڕێژە پێویستە لەسەر پەڕەکانی بۆشاییناوی [[:en:Help:Namespaces#Category|پۆل:]] بەکاربھێنرێت.)"
elseif namespace ~= 14 then -- Category
error("ئەم داڕێژە/مۆدیوولە دەکرێ تەنیا لەسەر پەڕەکانی بۆشاییناوی [[mw:Help:Namespaces#Category|پۆل:]] بەکاربھێنرێت.")
end
local first_fail_args_handled, first_fail_cattext
-- Go through each handler in turn. If a handler doesn't recognize the format of the category, it will return nil,
-- and we will consider the next handler. Otherwise, it returns a template name and arguments to call it with, but
-- even then, that template might return an error, and we need to consider the next handler. This happens, for
-- example, with the category "CAT:Mato Grosso, Brazil", where "Mato" is the name of a language, so the poscatboiler
-- per-language label handler fires and tries to find a label "Grosso, Brazil". This throws an error, and
-- previously, this blocked fruther handler consideration, but now we check for the error and continue checking
-- handlers; eventually, the topic umbrella handler will fire and correctly handle the category.
for _, handler in ipairs(handlers) do
-- Use a new title object and args table for each handler, to keep them isolated.
local submodule, info = handler(current_title.text, deep_copy(other_args))
if submodule then
info.also = deep_copy(args.also)
require("Module:debug").track("auto cat/" .. submodule)
-- `failed` is true if no match was found.
submodule = require(category_tree_submodule_prefix .. submodule)
local cattext, failed = generate_output(submodule.main(info))
if failed then
if not first_fail_cattext then
first_fail_cattext = cattext
first_fail_args_handled = info.args and true or false
end
elseif not info.args and next(other_args) then
error(extra_args_error)
else
return cattext
end
end
end
-- If there were no matches, throw an error if any arguments were given, or otherwise return the cattext
-- from the first fail encountered. The final handlers call the boilers unconditionally, so there should
-- always be something to return.
if not first_fail_args_handled and next(other_args) then
error(extra_args_error)
end
return first_fail_cattext
end
-- TODO: new test entrypoint.
return export
7itjbcb9xfzv0abwbqehgdph5ovc2rn
36784
36743
2026-08-13T00:09:27Z
Ghybu
12
It doesn't work.
36784
Scribunto
text/plain
-- Prevent substitution.
if mw.isSubsting() then
return require("Module:unsubst")
end
local export = {}
local category_tree_submodule_prefix = "Module:category tree/"
local category_tree_styles_css = "Module:category tree/styles.css"
local m_str_utils = require("Module:string utilities")
local m_template_parser = require("Module:template parser")
local m_utilities = require("Module:utilities")
local ceil = math.ceil
local class_else_type = m_template_parser.class_else_type
local concat = table.concat
local deep_copy = require("Module:table").deepCopy
local full_url = mw.uri.fullUrl
local insert = table.insert
local is_callable = require("Module:fun").is_callable
local log10 = math.log10 or require("Module:math").log10
local new_title = mw.title.new
local pages_in_category = mw.site.stats.pagesInCategory
local parse = m_template_parser.parse
local remove_comments = require("Module:string/removeComments")
local sort = table.sort
local split = m_str_utils.split
local string_compare = require("Module:string/compare")
local trim = m_str_utils.trim
local uupper = m_str_utils.upper
local yesno = require("Module:yesno")
local current_frame = mw.getCurrentFrame()
local current_title = mw.title.getCurrentTitle()
local namespace = current_title.namespace
local poscatboiler_subsystem = "poscatboiler"
local extra_args_error = "Extra arguments to {{((}}auto cat{{))}} are not allowed for this category."
-- Generates a sortkey for a numeral `n`, adding leading zeroes to avoid the "1, 10, 2, 3" sorting problem. `max_n` is the greatest expected value of `n`, and is used to determine how many leading zeroes are needed. If not supplied, it defaults to the number of languages.
function export.numeral_sortkey(n, max_n)
max_n = max_n or require("Module:list of languages").count()
return ("#%%0%dd"):format(ceil(log10(max_n + 1))):format(n)
end
function export.split_lang_label(title_text)
local getByCanonicalName = require("Module:languages").getByCanonicalName
-- Progressively remove a word from the potential canonical name until it
-- matches an actual canonical name.
--local words = split(title_text, " ", true)
--for i = #words - 1, 1, -1 do
-- local lang = getByCanonicalName(concat(words, " ", 1, i))
-- if lang then
-- return lang, concat(words, " ", i + 1)
-- end
--end
local label, langname = title_text:match("^(.-) بە (.+)$")
local lang = getByCanonicalName(langname)
if lang then
return lang, label
end
return nil, title_text
end
local function show_error(text)
return require("Module:message box").maintenance(
"red",
"[[File:Ambox warning pn.svg|50px]]",
"ئەم پۆلە لە داری پۆلی ویکیفەرھەنگدا پێناسە نەکراوە.",
text
)
end
-- Show the text that goes at the very top right of the page.
local function show_topright(current)
return current.getTopright and current:getTopright() or nil
end
local function link_box(content)
return ("<div class=\"noprint plainlinks\" style=\"float: left; clear: both; margin: 0 1em .5em 0; background: var(--wikt-palette-paleblue, #f9f9f9); border: 1px var(--border-color-base, #aaaaaa) solid; margin-top: -1px; padding: 5px; font-weight: bold;\">%s</div>"):format(content)
end
local function show_editlink(current)
return link_box(("[%s دراوەی پۆل دەستکاری بکە]"):format(tostring(full_url(current:getDataModule(), "action=edit"))))
end
function show_related_changes()
local title = current_title.fullText
return link_box(("[%s <span title=\"دوایین دەستکاری و گۆڕانکارییەکانی تری پەڕەکانی نێو «%s»\">دوایین گۆڕانکارییەکان</span>]"):format(
tostring(full_url("Special:RecentChangesLinked", {
target = title,
showlinkedto = 0,
})),
title
))
end
local function show_pagelist(current)
local namespace = "namespace="
local info = current:getInfo()
local lang_code = info.code
if info.label == "citations" or info.label == "citations of undefined terms" then
namespace = namespace .. "Citations"
elseif lang_code then
local lang = require("Module:languages").getByCode(lang_code, true)
if lang then
-- Proto-Norse (gmq-pro) is the probably language with a code ending in -pro
-- that's intended to have mostly non-reconstructed entries.
if (lang_code:find("%-pro$") and lang_code ~= "gmq-pro") or lang:hasType("reconstructed") then
namespace = namespace .. "Reconstruction"
elseif lang:hasType("appendix-constructed") then
namespace = namespace .. "Appendix"
end
end
elseif info.label:match("templates") then
namespace = namespace .. "داڕێژە"
elseif info.label:match("modules") then
namespace = namespace .. "مۆدیوول"
elseif info.label:match("^Wiktionary") or info.label:match("^Pages") then
namespace = ""
end
return ([=[
{| id="newest-and-oldest-pages" class="wikitable mw-collapsible mw-collapsed" style="float: left; clear: both; margin: 0 1em .5em 0;"
! نوێترین و کۆنترین پەڕەکان
|-
| id="recent-additions" style="font-size:0.9em;" | '''نوێترین پەڕەکان بەپێی کۆتا [[mw:Manual:Categorylinks table#cl_timestamp|نوێکردنەوەی بەستەری پۆلەکە]] ڕیز کراون:'''
%s
|-
| id="oldest-pages" style="font-size:0.9em;" | '''کۆنترین پەڕەکان بەپێی کۆتا دەستکاری ڕیز کراون:'''
%s
|}]=]):format(
current_frame:extensionTag(
"DynamicPageList",
([=[
category=%s
%s
count=10
mode=ordered
ordermethod=categoryadd
order=descending]=]
):format(current_title.text, namespace)
),
current_frame:extensionTag(
"DynamicPageList",
([=[
category=%s
%s
count=10
mode=ordered
ordermethod=lastedit
order=ascending]=]
):format(current_title.text, namespace)
)
)
end
-- Show navigational "breadcrumbs" at the top of the page.
local function show_breadcrumbs(current)
local steps = {}
-- Start at the current label and move our way up the "chain" from child to parent, until we can't go further.
while current do
local category, display_name, nocap
if type(current) == "string" then
category = current
display_name = current:gsub("^پۆل:", "")
else
if not current.getCategoryName then
error("Internal error: Bad format in breadcrumb chain structure, probably a misformatted value for `parents`: " ..
mw.dumpObject(current))
end
category = "پۆل:" .. current:getCategoryName()
display_name, nocap = current:getBreadcrumbName()
end
if not nocap then
display_name = mw.getContentLanguage():ucfirst(display_name)
end
insert(steps, 1, ("[[:%s|%s]]"):format(category, display_name))
-- Move up the "chain" by one level.
if type(current) == "string" then
current = nil
else
current = current:getParents()
end
if current then
current = current[1].name
end
end
local templateStyles = require("Module:TemplateStyles")(category_tree_styles_css)
local ol = mw.html.create("ol")
for i, step in ipairs(steps) do
local li = mw.html.create("li")
if i ~= 1 then
local span = mw.html.create("span")
:attr("aria-hidden", "true")
:addClass("ts-categoryBreadcrumbs-separator")
:wikitext(" » ")
li:node(span)
end
li:wikitext(step)
ol:node(li)
end
return templateStyles .. tostring(mw.html.create("div")
:attr("role", "navigation")
:attr("aria-label", "Breadcrumb")
:addClass("ts-categoryBreadcrumbs")
:node(ol))
end
local function show_also(current)
local also = current._info.also
if also and #also > 0 then
return ('<div style="margin-top:-1em;margin-bottom:1.5em">%s</div>'):format(require("Module:also").main(also))
end
return nil
end
-- Show a short description text for the category.
local function show_description(current)
return current.getDescription and current:getDescription() or nil
end
local function show_appendix(current)
local appendix = current.getAppendix and current:getAppendix()
return appendix and ("For more information, see [[%s]]."):format(appendix) or nil
end
local function sort_children(child1, child2)
return string_compare(uupper(child1.sort), uupper(child2.sort))
end
-- Show a list of child categories.
local function show_children(current)
local children = current.getChildren and current:getChildren() or nil
if not children then
return nil
end
sort(children, sort_children)
local children_list = {}
for _, child in ipairs(children) do
local child_name, child_pagetitle = child.name
if type(child_name) == "string" then
child_pagetitle = child_name
else
child_pagetitle = "پۆل:" .. child_name:getCategoryName()
end
if new_title(child_pagetitle).exists then
insert(children_list, ("* [[:%s]]: %s"):format(
child_pagetitle,
child.description or
type(child_name) == "string" and child_name:gsub("^پۆل:", "") .. "." or
child_name:getDescription("child")
))
end
end
return concat(children_list, "\n")
end
-- Show a table of contents with links to each letter in the language's script.
local function show_TOC(current)
local titleText = current_title.text
local inCategoryPages = pages_in_category(titleText, "pages")
local inCategorySubcats = pages_in_category(titleText, "subcats")
local TOC_type
-- Compute type of table of contents required.
if inCategoryPages > 2500 or inCategorySubcats > 2500 then
TOC_type = "full"
elseif inCategoryPages > 200 or inCategorySubcats > 200 then
TOC_type = "normal"
else
-- No (usual) need for a TOC if all pages or subcategories can fit on one page;
-- but allow this to be overridden by a custom TOC handler.
TOC_type = "none"
end
if current.getTOC then
local TOC_text = current:getTOC(TOC_type)
if TOC_text ~= true then
return TOC_text or nil
end
end
if TOC_type ~= "none" then
local templatename = current:getTOCTemplateName()
local TOC_template
if TOC_type == "full" then
-- This category is very large, see if there is a "full" version of the TOC.
local TOC_template_full = new_title(templatename .. "/full")
if TOC_template_full.exists then
TOC_template = TOC_template_full
end
end
if not TOC_template then
local TOC_template_normal = new_title(templatename)
if TOC_template_normal.exists then
TOC_template = TOC_template_normal
end
end
if TOC_template then
return current_frame:expandTemplate{title = TOC_template.text, args = {}}
end
end
return nil
end
-- Show the "catfix" that adds language attributes and script classes to the page.
local function show_catfix(current)
local lang, sc = current:getCatfixInfo()
return lang and m_utilities.catfix(lang, sc) or nil
end
-- Show the parent categories that the current category should be placed in.
local function show_categories(current, categories)
local parents = current.getParents and current:getParents() or nil
if not parents then
return nil
end
for _, parent in ipairs(parents) do
local parent_name = parent.name
local sortkey = type(parent.sort) == "table" and parent.sort:makeSortKey() or parent.sort
if type(parent_name) == "string" then
insert(categories, ("[[%s|%s]]"):format(parent_name, sortkey))
else
insert(categories, ("[[پۆل:%s|%s]]"):format(parent_name:getCategoryName(), sortkey))
end
end
-- Also put the category in its corresponding "umbrella" or "by language" category.
local umbrella = current:getUmbrella()
if umbrella then
-- FIXME: use a language-neutral sorting function like the Unicode Collation Algorithm.
local sortkey = current._lang and current._lang:getCanonicalName() or current:getCategoryName()
sortkey = require("Module:languages").getByCode("en", true):makeSortKey(sortkey)
if type(umbrella) == "string" then
insert(categories, ("[[%s|%s]]"):format(umbrella, sortkey))
else
insert(categories, ("[[پۆل:%s|%s]]"):format(umbrella:getCategoryName(), sortkey))
end
end
-- Check for various unwanted parser functions, which should be integrated into the category tree data instead.
-- Note: HTML comments shouldn't be removed from `content` until after this step, as they can affect the result.
local content = current_title:getContent()
if not content then
-- This happens when using [[Special:ExpandTemplates]] to call {{auto cat}} on a nonexistent category page,
-- which is needed by Benwing's create_wanted_categories.py script.
return
end
local defaultsort, displaytitle, page_has_param
for node in parse(content):iterate_nodes() do
local node_class = class_else_type(node)
if node_class == "template" then
local name = node:get_name()
if name == "DEFAULTSORT:" and not defaultsort then
insert(categories, "[[پۆل:Pages with DEFAULTSORT conflicts]]")
defaultsort = true
elseif name == "DISPLAYTITLE:" and not displaytitle then
insert(categories,"[[پۆل:Pages with DISPLAYTITLE conflicts]]")
displaytitle = true
end
elseif node_class == "parameter" and not page_has_param then
insert(categories,"[[پۆل:Pages with raw triple-brace template parameters]]")
page_has_param = true
end
end
-- Check for raw category markup, which should also be integrated into the category tree data.
content = remove_comments(content, "BOTH")
local head = content:find("[[", 1, true)
while head do
local close = content:find("]]", head + 2, true)
if not close then
break
end
-- Make sure there are no intervening "[[" between head and close.
local open = content:find("[[", head + 2, true)
while open and open < close do
head = open
open = content:find("[[", head + 2, true)
end
local cat = content:sub(head + 2, close - 1)
local colon = cat:match("^[ _\128-\244]*[Cc][Aa][Tt][EeGgOoRrYy _\128-\244]*():")
if colon then
local pipe = cat:find("|", colon + 1, true)
if pipe ~= #cat then
local title = new_title(pipe and cat:sub(1, pipe - 1) or cat)
if title and title.namespace == 14 then
insert(categories,"[[پۆل:Categories with categories using raw markup]]")
break
end
end
end
head = open
end
end
local function generate_output(current)
if current then
for _, functionName in pairs{
"getBreadcrumbName",
"getDataModule",
"canBeEmpty",
"getDescription",
"getParents",
"getChildren",
"getUmbrella",
"getAppendix",
"getTOCTemplateName",
} do
if not is_callable(current[functionName]) then
require("Module:debug").track{"category tree/missing function", "category tree/missing function/" .. functionName}
end
end
end
local boxes, display, categories = {}, {}, {}
-- Categories should never show files as a gallery.
insert(categories, "__NOGALLERY__")
if current_frame:getParent():getTitle() == "داڕێژە:auto cat" then
insert(categories, "[[پۆل:Categories calling Template:auto cat]]")
end
-- Check if the category is empty
local totalPages = pages_in_category(current_title.text, "all")
local hugeCategory = totalPages > 1000000 -- 1 million
-- Categorize huge categories, as they cause DynamicPageList to time out and make the category inaccessible.
if hugeCategory then
insert(categories, "[[پۆل:Huge categories]]")
end
-- Are the parameters valid?
if not current then
insert(categories, "[[پۆل:ئەو پۆلانەی کە لە داری پۆلەکەدا پێناسە نەکراون]]")
insert(categories, totalPages == 0 and "[[پۆل:پۆلە واڵاکان]]" or nil)
insert(display, show_error(
"Double-check the category name for typos. <br>" ..
"[[Special:Search/Category: " .. current_title.text:gsub("^.+:", ""):gsub(" ", "~2 ") .. '~2|Search existing categories]] to check if this category should be created under a different name (for example, "Fruits" instead of "Fruit"). <br>' ..
"To add a new category to Wiktionary's category tree, please consult " .. current_frame:expandTemplate{title = "section link", args = {
"Help:Category#How_to_create_a_category",
}} .. "."))
-- Exit here, as all code beyond here relies on current not being nil
return concat(categories, "") .. concat(display, "\n\n"), true
end
-- Does the category have the correct name?
local currentName = current:getCategoryName()
local correctName = current_title.text == currentName
if not correctName then
insert(categories, "[[پۆل:Categories with incorrect names]]")
insert(display, show_error(("Based on the data in the category tree, this category should be called '''[[:پۆل:%s]]'''."):format(currentName)))
end
-- Add cleanup category for empty categories.
local canBeEmpty = current:canBeEmpty()
if canBeEmpty and correctName then
insert(categories, " __EXPECTUNUSEDCATEGORY__")
elseif totalPages == 0 then
insert(categories, "[[پۆل:پۆلە واڵاکان]]")
end
if current:isHidden() then
insert(categories, "__HIDDENCAT__")
end
-- Put all the float-right stuff into a <div> that does not clear, so that float-left stuff like the breadcrumbs and
-- description can go opposite the float-right stuff without vertical space.
insert(boxes, "<div style=\"float: left;\">")
insert(boxes, show_topright(current))
insert(boxes, show_editlink(current))
insert(boxes, show_related_changes())
-- Show pagelist, unless it's a huge category (since they can't use DynamicPageList - see above).
--if not hugeCategory then
-- insert(boxes, show_pagelist(current))
--end
insert(boxes, "</div>")
-- Generate the displayed information
insert(display, show_breadcrumbs(current))
insert(display, show_also(current))
insert(display, show_description(current))
-- insert(display, show_appendix(current))
insert(display, show_children(current))
insert(display, show_TOC(current))
insert(display, show_catfix(current))
insert(display, '<br class="clear-both-in-vector-2022-only">')
show_categories(current, categories)
return concat(boxes, "\n") .. "\n" .. concat(display, "\n\n") .. concat(categories, "")
end
--[==[
List of handler functions that try to match the page name. A handler should return the name of a submodule to
[[Module:category tree]] and an info table which is passed as an argument to the submodule. If a handler does not
recognize the page name, it should return nil. Note that the order of handlers matters!
]==]
local handlers = {}
-- Thesaurus per-language category
insert(handlers, function(title)
local code, label = title:match("^Thesaurus:(%l[%a-]*%a):(.+)")
if code then
return poscatboiler_subsystem, {label = title, raw = true}
end
end)
-- Topic per-language category
insert(handlers, function(title)
local code, label = title:match("^(%l[%a-]*%a):(.+)")
if code then
return poscatboiler_subsystem, {label = title, raw = true}
end
end)
-- Lect category e.g. for [[:Category:New Zealand English]] or [[:Category:Issime Walser]]
insert(handlers, function(title, args)
local lect = args.lect or args.dialect
if lect ~= "" and yesno(lect, true) then -- Same as boolean in [[Module:parameters]].
return poscatboiler_subsystem, {label = title, args = args, raw = true}
end
end)
-- poscatboiler per-language label, e.g. [[Category:English non-lemma forms]]
insert(handlers, function(title, args)
local lang, label = export.split_lang_label(title)
if not lang then
return
end
local baseLabel, script = label:match("(.+) in (.-) script$")
if script and baseLabel ~= "terms" then
local scriptObj = require("Module:scripts").getByCanonicalName(script)
if scriptObj then
return poscatboiler_subsystem, {label = baseLabel, code = lang:getCode(), sc = scriptObj:getCode(), args = args}
end
end
return poscatboiler_subsystem, {label = label, code = lang:getCode(), args = args}
end)
-- poscatboiler label umbrella category
insert(handlers, function(title, args)
local label = title:match("(.+) by language$")
if label then
-- The poscatboiler code will appropriately lowercase if needed.
return poscatboiler_subsystem, {label = label, args = args}
end
end)
-- poscatboiler raw handlers
insert(handlers, function(title, args)
return poscatboiler_subsystem, {label = title, args = args, raw = true}
end)
-- poscatboiler umbrella handlers without 'by language'
insert(handlers, function(title, args)
return poscatboiler_subsystem, {label = title, args = args}
end)
function export.show(frame)
local args, other_args = require("Module:parameters").process(frame:getParent().args, {
["also"] = {type = "title", sublist = "comma without whitespace", namespace = 14}
}, true)
if args.also then
for k, arg in next, args.also do
args.also[k] = arg.prefixedText
end
end
for k, arg in next, other_args do
other_args[k] = trim(arg)
end
if namespace == 10 then -- Template
return "(ئەم داڕێژە پێویستە لەسەر پەڕەکانی بۆشاییناوی [[:en:Help:Namespaces#Category|پۆل:]] بەکاربھێنرێت.)"
elseif namespace ~= 14 then -- Category
error("ئەم داڕێژە/مۆدیوولە دەکرێ تەنیا لەسەر پەڕەکانی بۆشاییناوی [[mw:Help:Namespaces#Category|پۆل:]] بەکاربھێنرێت.")
end
local first_fail_args_handled, first_fail_cattext
-- Go through each handler in turn. If a handler doesn't recognize the format of the category, it will return nil,
-- and we will consider the next handler. Otherwise, it returns a template name and arguments to call it with, but
-- even then, that template might return an error, and we need to consider the next handler. This happens, for
-- example, with the category "CAT:Mato Grosso, Brazil", where "Mato" is the name of a language, so the poscatboiler
-- per-language label handler fires and tries to find a label "Grosso, Brazil". This throws an error, and
-- previously, this blocked fruther handler consideration, but now we check for the error and continue checking
-- handlers; eventually, the topic umbrella handler will fire and correctly handle the category.
for _, handler in ipairs(handlers) do
-- Use a new title object and args table for each handler, to keep them isolated.
local submodule, info = handler(current_title.text, deep_copy(other_args))
if submodule then
info.also = deep_copy(args.also)
require("Module:debug").track("auto cat/" .. submodule)
-- `failed` is true if no match was found.
submodule = require(category_tree_submodule_prefix .. submodule)
local cattext, failed = generate_output(submodule.main(info))
if failed then
if not first_fail_cattext then
first_fail_cattext = cattext
first_fail_args_handled = info.args and true or false
end
elseif not info.args and next(other_args) then
error(extra_args_error)
else
return cattext
end
end
end
-- If there were no matches, throw an error if any arguments were given, or otherwise return the cattext
-- from the first fail encountered. The final handlers call the boilers unconditionally, so there should
-- always be something to return.
if not first_fail_args_handled and next(other_args) then
error(extra_args_error)
end
return first_fail_cattext
end
-- TODO: new test entrypoint.
return export
0lncvn4qup3fuhj4huf9jspmvfh9hj8
مۆدیوول:category tree/poscatboiler
828
21
36744
35481
2026-08-12T20:19:00Z
Ghybu
12
Extraction of category titles adapted for Sorani names
36744
Scribunto
text/plain
local lang_independent_data = require("Module:category tree/data")
local lang_specific_module = "Module:category tree/lang"
local lang_specific_module_prefix = lang_specific_module .. "/"
local family_specific_module = "Module:category tree/fam"
local family_specific_module_prefix = family_specific_module .. "/"
local labels_utilities_module = "Module:labels/utilities"
local template_parser_module = "Module:template parser"
local concat = table.concat
local dump = mw.dumpObject
local expand_template = require("Module:frame").expandTemplate
local insert = table.insert
local is_callable = require("Module:fun").is_callable
local lcfirst = require("Module:string utilities").lcfirst
local list_to_set = require("Module:table").listToSet
local make_title = mw.title.makeTitle
local new_title = mw.title.new
local parse = require(template_parser_module).parse
local sparse_concat = require("Module:table").sparseConcat
local tostring = tostring
local type = type
local ucfirst = require("Module:string utilities").ucfirst
local uupper = require("Module:string utilities").upper
local function internal_error(msg)
error("Internal error: " .. msg)
end
local function get_lang(...)
local _get_lang = require("Module:languages").getByCode
function get_lang(...)
return _get_lang(...) or require("Module:languages/errorGetBy").code(...)
end
return get_lang(...)
end
local function get_script(...)
local _get_script = require("Module:scripts").getByCode
function get_script(code)
return _get_script(code) or require("Module:languages/error")(code, true, "script code")
end
return get_script(...)
end
-- Category object
local Category = {}
Category.__index = Category
function Category:get_originating_info()
local originating_info = ""
if self._info.originating_label then
originating_info = " (originating from label \"" .. self._info.originating_label .. "\" in module [[" .. self._info.originating_module .. "]])"
end
return originating_info
end
local valid_keys = list_to_set{"code", "label", "sc", "raw", "args", "also", "called_from_inside", "originating_label", "originating_module"}
function Category.new(info)
for key in pairs(info) do
if not valid_keys[key] then
internal_error("The parameter \"" .. key .. "\" was not recognized.")
end
end
local self = setmetatable({}, Category)
self._info = info
if not self._info.label then
internal_error("No label was specified.")
end
self:initCommon()
if not self._data then
internal_error("The " .. (self._info.raw and "raw " or "") .. "label \"" .. self._info.label .. "\" does not exist" .. self:get_originating_info() .. ".")
end
return self
end
function Category:initCommon()
local function patch_args(args)
-- This fixes the issue with Scribunto automatically converting keys
-- in a table as numbers to strings, which in turn causes a circular
-- error for having argument parameter names as numbers as strings.
if type(args) ~= "table" then
return args
end
local new_args = {}
for k, v in pairs(args) do
if type(k) == "string" and string.len(k) < 10 and not string.match(k, "^0") and string.match(k, "^%d+$") then
new_args[tonumber(k)] = patch_args(v)
else
new_args[k] = patch_args(v)
end
end
return new_args
end
local args_handled = false
if self._info.raw then
-- Check if the category exists
local raw_categories = lang_independent_data["RAW_CATEGORIES"]
self._data = raw_categories[self._info.label]
if self._data then
if self._data.lang then
self._lang = get_lang(self._data.lang)
self._info.code = self._lang:getCode()
end
if self._data.sc then
self._sc = get_script(self._data.sc)
self._info.sc = self._sc:getCode()
end
else
-- Go through raw handlers
local data = {
category = self._info.label,
args = patch_args(self._info.args) or {},
called_from_inside = self._info.called_from_inside,
}
for _, handler in ipairs(lang_independent_data["RAW_HANDLERS"]) do
self._data, args_handled = handler.handler(data)
if self._data then
self._data.module = self._data.module or handler.module
break
end
end
if self._data then
-- Update the label if the handler specified a canonical name for it.
if self._data.canonical_name then
self._info.canonical_name = self._data.canonical_name
end
if self._data.lang then
if type(self._data.lang) ~= "string" then
internal_error("Received non-string value " .. dump(self._data.lang) .. " for self._data.lang, label \"" .. self._info.label .. "\"" .. self:get_originating_info() .. ".")
end
self._lang = get_lang(self._data.lang)
self._info.code = self._lang:getCode()
end
if self._data.sc then
if type(self._data.sc) ~= "string" then
internal_error("Received non-string value " .. dump(self._data.sc) .. " for self._data.sc, label \"" .. self._info.label .. "\"" .. self:get_originating_info() .. ".")
end
self._sc = get_script(self._data.sc)
self._info.sc = self._sc:getCode()
end
end
end
else
-- Already parsed into language + label
if self._info.code then
self._lang = get_lang(self._info.code)
else
self._lang = nil
end
if self._info.sc then
self._sc = get_script(self._info.sc)
else
self._sc = nil
end
self._info.orig_label = self._info.label
if not self._lang then
-- Umbrella categories without a preceding language always begin with a capital letter, but the actual label may be
-- lowercase (cf. [[:Category:Nouns by language]] with label 'nouns' with per-language [[:Category:English nouns]];
-- but [[:Category:Reddit slang by language]] with label 'Reddit slang' with per-language
-- [[:Category:English Reddit slang]]). Since the label is almost always lowercase, we lowercase it for umbrella
-- categories, storing the original into `orig_label`, and correct it later if needed.
self._info.label = lcfirst(self._info.label)
end
-- First, check lang-specific labels and handlers if this is not an umbrella category.
if self._lang then
local objects_with_modules = require(lang_specific_module)
local obj, seen = self._lang, {}
local object_specific_module_prefix = lang_specific_module_prefix
local is_family = false
repeat
if objects_with_modules[obj:getCode()] then
local module = object_specific_module_prefix .. obj:getCode()
local labels_and_handlers = require(module)
if labels_and_handlers.LABELS then
self._data = labels_and_handlers.LABELS[self._info.label]
if self._data then
if not is_family and self._data.umbrella == nil and self._data.umbrella_parents == nil then
self._data.umbrella = false
end
self._data.module = self._data.module or module
end
end
if not self._data and labels_and_handlers.HANDLERS then
for _, handler in ipairs(labels_and_handlers.HANDLERS) do
local data = {
label = self._info.label,
lang = self._lang,
sc = self._sc,
args = patch_args(self._info.args) or {},
called_from_inside = self._info.called_from_inside,
}
self._data, args_handled = handler(data)
if self._data then
if not is_family and self._data.umbrella == nil and
self._data.umbrella_parents == nil then
self._data.umbrella = false
end
self._data.module = self._data.module or module
break
end
end
end
if self._data then
break
end
end
seen[obj:getCode()] = true
obj = obj:getFamily()
if not is_family then
is_family = true
object_specific_module_prefix = family_specific_module_prefix
objects_with_modules = require(family_specific_module)
end
until not obj or seen[obj:getCode()]
end
local function fetch_label_data(labels)
self._data = labels[self._info.label]
-- See comment above about uppercase- vs. lowercase-initial labels, which are indistinguishable
-- in umbrella categories.
if not self._data then
self._data = labels[self._info.orig_label]
if self._data then
self._info.label = self._info.orig_label
end
end
end
-- Then check lang-independent labels.
if not self._data then
-- lang_independent_data.LABELS should always exist.
fetch_label_data(lang_independent_data.LABELS)
if not self._data and not self._lang then
-- Check family-specific labels for umbrella label.
local families_with_modules = require(family_specific_module)
for famcode, _ in pairs(families_with_modules) do
local module = family_specific_module_prefix .. famcode
local labels_and_handlers = require(module)
if labels_and_handlers.LABELS then
fetch_label_data(labels_and_handlers.LABELS)
if self._data then
self._data.module = self._data.module or module
break
end
end
end
end
end
-- Then check lang-independent handlers.
if not self._data then
local data = {
label = self._info.label,
lang = self._lang,
sc = self._sc,
args = patch_args(self._info.args) or {},
called_from_inside = self._info.called_from_inside,
}
for _, handler in ipairs(lang_independent_data["HANDLERS"]) do
self._data, args_handled = handler.handler(data)
if self._data then
self._data.module = self._data.module or handler.module
break
end
end
if not self._data and not self._lang then
-- Check family-specific labels for umbrella handler.
local families_with_modules = require(family_specific_module)
for famcode, _ in pairs(families_with_modules) do
local module = family_specific_module_prefix .. famcode
local labels_and_handlers = require(module)
if labels_and_handlers.HANDLERS then
for _, handler in ipairs(labels_and_handlers.HANDLERS) do
local data = {
label = self._info.label,
sc = self._sc,
args = patch_args(self._info.args) or {},
called_from_inside = self._info.called_from_inside,
}
self._data, args_handled = handler(data)
if self._data then
self._data.module = self._data.module or module
break
end
end
end
if self._data then
break
end
end
end
end
end
if not args_handled and self._data and self._info.args and next(self._info.args) then
local module_text = " (handled in [[" .. (self._data.module or "UNKNOWN").. "]])"
local args_text = {}
for k, v in pairs(self._info.args) do
insert(args_text, k .. "=" .. ((type(v) == "string" or type(v) == "number") and v or dump(v)))
end
error("poscatboiler label '" .. self._info.label .. "' " .. module_text .. " doesn't accept extra args " ..
concat(args_text, ", "))
end
if self._sc and not self._lang then
internal_error("Umbrella categories cannot have a script specified.")
end
end
function Category:convert_spec_to_string(desc)
if not desc then
return desc
end
local desc_type = type(desc)
if desc_type == "string" then
return desc
elseif desc_type == "number" then
return tostring(desc)
elseif not is_callable(desc) then
internal_error("`desc` must be a string, number, function, callable table or nil; received " .. dump(desc))
end
desc = desc {
lang = self._lang,
sc = self._sc,
label = self._info.label,
raw = self._info.raw,
}
if not desc then
return desc
end
desc_type = type(desc)
if desc_type == "string" then
return desc
end
internal_error("The value returned by `desc` must be a string or nil; received " .. dump(desc))
end
local function add_obj_args(args, obj, obj_type)
if obj then
args[obj_type .. "code"] = obj:getCode()
args[obj_type .. "name"] = obj:getCanonicalName()
args[obj_type .. "disp"] = obj:getDisplayForm()
args[obj_type .. "cat"] = obj:getCategoryName()
args[obj_type .. "link"] = obj:makeCategoryLink()
end
end
-- Expands `desc` like a template, passing values for specs like {{{langname}}}.
function Category:substitute_template_specs(desc)
-- This may end up happening twice but that's OK as the function is (usually) idempotent.
-- FIXME: Not idempotent if a preprocessed template returns wikicode.
desc = self:convert_spec_to_string(desc)
if not desc then
return nil
end
-- Populate the substitution arguments.
local args = {}
args.umbrella_msg = "ئەمە پۆلێکی گشتگیرە. ھیچ سەروشەیەکی فەرھەنگی تێدا نییە، بەڵکوو تەنیا پۆلەکانی تری تایبەت بە زمانی تێدایە، کە ئەوانیش چەمکە پەیوەندیدارەکان بەو زمانەیان تێدایە."
args.umbrella_meta_msg = "This is an umbrella metacategory, covering a general area such as \"lemmas\", \"names\" or \"terms by etymology\". It contains no dictionary entries, but holds only umbrella (\"by language\") categories covering specific subtopics, which in turn contain language-specific categories holding terms in a given language for that same topic."
add_obj_args(args, self._lang, "lang")
add_obj_args(args, self._sc, "sc")
return parse(desc, true):expand(args)
end
function Category:substitute_template_specs_in_args(args)
if not args then
return args
end
local pinfo = {}
for k, v in pairs(args) do
pinfo[self:substitute_template_specs(k)] = self:substitute_template_specs(v)
end
return pinfo
end
function Category:make_new(info)
info.originating_label = self._info.label
info.originating_module = self._data.module
info.called_from_inside = true
return Category.new(info)
end
function Category:getBreadcrumbName()
local ret
if self._lang or self._info.raw then
ret = self._data.breadcrumb or self._data.breadcrumb_and_first_sort_base
else
ret = self._data.umbrella and (self._data.umbrella.breadcrumb or self._data.umbrella.breadcrumb_and_first_sort_base)
end
if not ret then
ret = self._info.label
end
if type(ret) ~= "table" then
ret = {name = ret}
end
local name = self:substitute_template_specs(ret.name)
local nocap = ret.nocap
if self._sc then
name = name .. " in " .. self._sc:getDisplayForm()
end
return name, nocap
end
local function expand_toc_template_if(template)
local template_obj = new_title(template, 10)
if template_obj.exists then
return expand_template{title = template_obj.text}
end
return nil
end
-- Return the textual expansion of the first existing template among the given templates, first performing
-- substitutions on the template name such as replacing {{{langcode}}} with the current language's code (if any).
-- If no templates exist after expansion, or if nil is passed in, return nil. If a single string is passed in,
-- treat it like a one-element list consisting of that string.
function Category:get_template_text(templates)
if templates == nil then
return nil
elseif type(templates) ~= "table" then
templates = {templates}
end
for _, template in ipairs(templates) do
if template == false then
return false
end
template = self:substitute_template_specs(template)
return expand_toc_template_if(template)
end
return nil
end
function Category:getTOC(toc_type)
-- Type "none" means everything fits on a single page; in that case, display nothing.
if toc_type == "none" then
return nil
end
local templates, fallback_templates
-- If TOC type is "full" (more than 2500 entries), do the following, in order:
-- 1. look up and expand the `toc_template_full` templates (normal or umbrella, depending on whether there is
-- a current language);
-- 2. look up and expand the `toc_template` templates (normal or umbrella, as above);
-- 3. do the default behavior, which is as follows:
-- 3a. look up a language-specific "full" template according to the current language (using English if there
-- is no current language);
-- 3b. look up a script-specific "full" template according to the first script of current language (using English
-- if there is no current language);
-- 3c. look up a language-specific "normal" template according to the current language (using English if there
-- is no current language);
-- 3d. look up a script-specific "normal" template according to the first script of the current language (using
-- English if there is no current language);
-- 3e. display nothing.
--
-- If TOC type is "normal" (between 200 and 2500 entries), do the following, in order:
-- 1. look up and expand the `toc_template` templates (normal or umbrella, depending on whether there is
-- a current language);
-- 2. do the default behavior, which is as follows:
-- 2a. look up a language-specific "normal" template according to the current language (using English if there
-- is no current language);
-- 2b. look up a script-specific "normal" template according to the first script of the current language (using
-- English if there is no current language);
-- 2c. display nothing.
local data_source
if self._lang or self._info.raw then
data_source = self._data
else
data_source = self._data.umbrella
end
if data_source then
if toc_type == "full" then
templates = data_source.toc_template_full
fallback_templates = data_source.toc_template
else
templates = data_source.toc_template
end
end
local text = self:get_template_text(templates)
if text then
return text
elseif text == false then
return nil
end
text = self:get_template_text(fallback_templates)
if text then
return text
elseif text == false then
return nil
end
local default_toc_templates_to_check = {}
local lang, sc = self:getCatfixInfo()
local langcode = lang and lang:getCode() or "en"
local sccode = sc and sc:getCode() or lang and lang:getScriptCodes()[1] or "Latn"
-- FIXME: What is toctemplateprefix used for?
local tocname = (self._data.toctemplateprefix or "") .. "categoryTOC"
if toc_type == "full" then
insert(default_toc_templates_to_check, ("%s-%s/full"):format(langcode, tocname))
insert(default_toc_templates_to_check, ("%s-%s/full"):format(sccode, tocname))
end
insert(default_toc_templates_to_check, ("%s-%s"):format(langcode, tocname))
insert(default_toc_templates_to_check, ("%s-%s"):format(sccode, tocname))
for _, toc_template in ipairs(default_toc_templates_to_check) do
local toc_template_text = expand_toc_template_if(toc_template)
if toc_template_text then
return toc_template_text
end
end
return nil
end
function Category:getInfo()
return self._info
end
function Category:getDataModule()
return self._data.module
end
function Category:canBeEmpty()
if self._lang or self._info.raw then
return self._data.can_be_empty
end
return self._data.umbrella and self._data.umbrella.can_be_empty
end
function Category:isHidden()
if self._lang or self._info.raw then
return self._data.hidden
end
return self._data.umbrella and self._data.umbrella.hidden
end
function Category:getCategoryName()
if self._info.raw then
return self._info.canonical_name or self._info.label
elseif self._lang then
local ret = self._info.label .. " بە " .. self._lang:getCanonicalName()
if self._sc then
ret = ret .. " in " .. self._sc:getDisplayForm()
end
return ucfirst(ret)
end
local ret = ucfirst(self._info.label)
if not (self._data.no_by_language or self._data.umbrella and self._data.umbrella.no_by_language) then
ret = ret .. " by language"
end
return ret
end
function Category:getTopright()
if self._lang or self._info.raw then
return self:substitute_template_specs(self._data.topright)
end
return self._data.umbrella and self:substitute_template_specs(self._data.umbrella.topright)
end
function Category:display_title(displaytitle, lang)
if type(displaytitle) == "string" then
displaytitle = self:substitute_template_specs(displaytitle)
else
displaytitle = displaytitle(self:getCategoryName(), lang)
end
mw.getCurrentFrame():callParserFunction("DISPLAYTITLE", "Category:" .. displaytitle)
end
function Category:get_labels_categorizing()
local m_labels_utilities = require(labels_utilities_module)
local pos_cat_labels, sense_cat_labels, use_tlb
pos_cat_labels = m_labels_utilities.find_labels_for_category(self._info.label, "pos", self._lang)
local sense_label = self._info.label:match("^(.*) terms$")
if sense_label then
use_tlb = true
else
sense_label = self._info.label:match("^terms with (.*) senses$")
end
if not sense_label then
return nil
end
sense_cat_labels = m_labels_utilities.find_labels_for_category(sense_label, "sense", self._lang)
if use_tlb then
return m_labels_utilities.format_labels_categorizing(pos_cat_labels, sense_cat_labels, self._lang)
end
local all_labels = pos_cat_labels
for k, v in pairs(sense_cat_labels) do
all_labels[k] = v
end
return m_labels_utilities.format_labels_categorizing(all_labels, nil, self._lang)
end
-- FIXME: this is clunky.
local function remove_lang_params(desc)
-- Simply remove a language name/code/category from the beginning of the string, but replace the language name
-- in the middle of the string with either "specific languages" or "specific-language" depending on whether the
-- language name appears to be an attributive qualifier of another noun or to stand by itself. This may be wrong,
-- in which case the category in question should supply its own umbrella description.
desc = desc:gsub("^{{{langname}}} ", "")
:gsub("{{{langname}}} %(", "specific languages (")
:gsub("{{{langname}}}([.,])", "specific languages%1")
:gsub("{{{langname}}} ", "specific-language ")
:gsub("{{{langdisp}}}", "specific languages")
:gsub("{{{langlink}}}", "specific languages")
return desc
end
function Category:getDescription(isChild)
-- Allows different text in the list of a category's children
local isChild = isChild == "child"
if self._lang or self._info.raw then
if not isChild and self._data.displaytitle then
self:display_title(self._data.displaytitle, self._lang)
end
if self._sc then
return self:getCategoryName() .. "."
end
local desc = self:substitute_template_specs(self._data.description)
if not desc then
return nil
elseif isChild then
return desc
end
return sparse_concat({
self:substitute_template_specs(self._data.preceding),
desc,
self:substitute_template_specs(self._data.additional),
self:substitute_template_specs(self:get_labels_categorizing()),
}, "\n\n")
end
local umbrella = self._data.umbrella
if not isChild and umbrella and umbrella.displaytitle then
self:display_title(umbrella.displaytitle)
end
local desc = self:substitute_template_specs(umbrella and umbrella.description)
local has_umbrella_desc = not not desc
if not desc then
desc = self:convert_spec_to_string(self._data.description)
if desc then
desc = remove_lang_params(desc)
desc = lcfirst(desc)
desc = desc:gsub("%.$", "")
desc = "Categories with " .. desc .. "."
else
desc = "Categories with " .. self._info.label .. " in various specific languages."
end
desc = self:substitute_template_specs(desc)
end
if isChild then
return desc
end
return sparse_concat({
self:substitute_template_specs(umbrella and umbrella.preceding or not has_umbrella_desc and self._data.preceding),
desc,
self:substitute_template_specs(umbrella and umbrella.additional or not has_umbrella_desc and self._data.additional),
self:substitute_template_specs("{{{umbrella_msg}}}"),
self:substitute_template_specs(self:get_labels_categorizing()),
}, "\n\n")
end
function Category:new_sortkey(sortkey)
local sortkey_type = type(sortkey)
if sortkey_type == "string" then
sortkey = uupper(sortkey)
elseif sortkey_type == "table" then
function sortkey:makeSortKey()
local sort_func = self.sort_func
if sort_func ~= nil then
return sort_func(self.sort_base)
end
local lang = self.lang
if lang == nil then
return self.sort_base
end
lang = get_lang(lang, nil, true)
if lang == nil then
return self.sort_base
end
local sc = self.sc
if sc ~= nil then
sc = get_script(sc)
end
return lang:makeSortKey(self.sort_base, sc)
end
end
return sortkey
end
function Category:inherit_spec(spec, parent_spec, substitute_result)
if spec == false then
return nil
end
local retval = spec or parent_spec
if substitute_result then
retval = self:substitute_template_specs(retval)
end
return retval
end
function Category:canonicalize_parents_children(cats, is_children, fallback_sort_base)
if not cats then
return nil
elseif type(cats) == "table" then
if cats.name or cats.module then
cats = {cats}
elseif #cats == 0 then
return nil
end
else
cats = {cats}
end
local ret = {}
for _, cat in ipairs(cats) do
if type(cat) ~= "table" or not cat.name and not cat.module then
cat = {name = cat}
end
insert(ret, cat)
end
local is_umbrella = not self._lang and not self._info.raw
local table_type = is_children and "extra_children" or "parents"
for i, cat in ipairs(ret) do
local raw
if self._info.raw or is_umbrella then
raw = not cat.is_label
else
raw = cat.raw
end
local lang = self:inherit_spec(cat.lang, not raw and self._info.code or nil, "substitute")
local sc = self:inherit_spec(cat.sc, not raw and self._info.sc or nil, "substitute")
-- Get the sortkey.
local sortkey = self:inherit_spec(cat.sort, i == 1 and fallback_sort_base and {sort_base = fallback_sort_base} or nil)
if type(sortkey) == "table" then
sortkey.sort_base = self:substitute_template_specs(sortkey.sort_base) or
internal_error("Missing .sort_base in '" .. table_type .. "' .sort table for '" ..
self._info.label .. "' category entry in module '" .. (self._data.module or "unknown") .. "'")
if sortkey.sort_func then
-- Not allowed to give a lang and/or script if sort_func is given.
local bad_spec = sortkey.lang and "lang" or sortkey.sc and "sc" or nil
if bad_spec then
internal_error("Cannot specify both ." .. bad_spec .. " and .sort_func in '" .. table_type ..
"' .sort table for '" .. self._info.label .. "' category entry in module '" ..
(self._data.module or "unknown") .. "'")
end
else
sortkey.lang = self:inherit_spec(sortkey.lang, lang, "substitute")
sortkey.sc = self:inherit_spec(sortkey.sc, sc, "substitute")
end
else
sortkey = self:substitute_template_specs(sortkey)
end
local name
if cat.module then
-- A reference to a category using another category tree module.
if not cat.args then
internal_error("Missing .args in '" .. table_type .. "' table with module=\"" .. cat.module .. "\" for '" ..
self._info.label .. "' category entry in module '" .. (self._data.module or "unknown") .. "'")
end
name = require("Module:category tree/" .. cat.module).new(self:substitute_template_specs_in_args(cat.args))
else
name = cat.name
if not name then
internal_error("Missing .name in " .. (is_umbrella and "umbrella " or "") .. "'" .. table_type .. "' table for '" ..
self._info.label .. "' category entry in module '" .. (self._data.module or "unknown") .. "'")
elseif type(name) == "string" then -- otherwise, assume it's a category object and use it directly
name = self:substitute_template_specs(name)
if name:find("^Category:") then
-- It's a non-poscatboiler category name.
sortkey = sortkey or is_children and name:gsub("^Category:", "") or self:getCategoryName()
else
-- It's a label.
sortkey = sortkey or is_children and name or self._info.label
name = self:make_new{
label = name, code = lang, sc = sc,
raw = raw, args = self:substitute_template_specs_in_args(cat.args)
}
end
end
end
sortkey = sortkey or is_children and " " or self._info.label
ret[i] = {
name = name,
description = is_children and self:substitute_template_specs(cat.description) or nil,
sort = self:new_sortkey(sortkey)
}
end
return ret
end
function Category:getParents()
local is_umbrella, ret = not self._lang and not self._info.raw
if self._sc then
local parent1 = self:make_new{code = self._info.code, label = "terms in " .. self._sc:getCanonicalName() .. " script"}
local parent2 = self:make_new{code = self._info.code, label = self._info.label, raw = self._info.raw, args = self._info.args}
ret = {
{name = parent1, sort = self._sc:getCanonicalName()},
{name = parent2, sort = self._sc:getCanonicalName()},
}
else
local parents, fallback_sort_base
if is_umbrella then
parents = self._data.umbrella and self._data.umbrella.parents or self._data.umbrella_parents
fallback_sort_base = self._data.umbrella and self._data.umbrella.breadcrumb_and_first_sort_base or nil
else
parents = self._data.parents
fallback_sort_base = self._data.breadcrumb_and_first_sort_base
end
ret = self:canonicalize_parents_children(parents, nil, fallback_sort_base)
if not ret then
return nil
end
end
local self_cat = self:getCategoryName()
for _, parent in ipairs(ret) do
local parent_cat = parent.name.getCategoryName and parent.name:getCategoryName()
if self_cat == parent_cat then
internal_error(("Infinite loop would occur, as parent category '%s' is the same as the child category"):format(self_cat))
end
end
return ret
end
function Category:getChildren()
local is_umbrella = not self._lang and not self._info.raw
local children = self._data.children
local ret = {}
if not is_umbrella and children then
for _, child in ipairs(children) do
child = mw.clone(child)
if type(child) ~= "table" then
child = {name = child}
end
if not child.sort then
child.sort = child.name
end
-- FIXME, is preserving the script correct?
child.name = self:make_new{code = self._info.code, label = child.name, raw = child.raw, sc = self._info.sc}
insert(ret, child)
end
end
local extra_children
if is_umbrella then
extra_children = self._data.umbrella and self._data.umbrella.extra_children
else
extra_children = self._data.extra_children
end
extra_children = self:canonicalize_parents_children(extra_children, "children")
if extra_children then
for _, child in ipairs(extra_children) do
insert(ret, child)
end
end
return #ret > 0 and ret or nil
end
function Category:getUmbrella()
local umbrella = self._data.umbrella
if umbrella == false or self._info.raw or not self._lang or self._sc then
return nil
end
-- If `umbrella` is a string, use that; otherwise, use the label.
return self:make_new({label = type(umbrella) == "string" and umbrella or self._info.label})
end
function Category:getAppendix()
-- FIXME, this should be customizable.
local lang, label = self._lang, self._info.label
if self._info.raw or not (lang and label) then
return nil
end
local appendix = make_title(100, lang:getCanonicalName() .. " " .. label)
return appendix.exists and appendix.fullText or nil
end
function Category:getCatfixInfo()
if self._lang or self._sc or self._info.raw then
local langcode, sccode, lang, sc = self._data.catfix, self._data.catfix_sc
if langcode then
langcode = self:substitute_template_specs(langcode)
lang = get_lang(langcode)
elseif langcode == nil then -- not false
lang = self._lang
end
if sccode then
sccode = self:substitute_template_specs(sccode)
sc = get_script(sccode)
elseif sccode == nil then -- not false
sc = self._sc
end
return lang, sc
elseif not self._data.umbrella then
return
end
-- umbrella
local langcode, sccode, lang, sc = self._data.umbrella.catfix, self._data.umbrella.catfix_sc
if langcode then
langcode = self:substitute_template_specs(langcode)
lang = get_lang(langcode)
end
if sccode then
sccode = self:substitute_template_specs(sccode)
sc = get_script(sccode)
end
return lang, sc
end
function Category:getTOCTemplateName()
-- This should only be invoked if getTOC() returns true, meaning to do the default algorithm, but getTOC()
-- implements its own default algorithm.
internal_error("This should never get called")
end
local export = {}
function export.main(info)
local self = setmetatable({_info = info}, Category)
self:initCommon()
return self._data and self or nil
end
export.new = Category.new
return export
2en0fruvknv7e2aj4r2968jkh2854zh
مۆدیوول:en-headword
828
29
36793
34159
2026-08-13T01:20:42Z
Ghybu
12
soranî
36793
Scribunto
text/plain
local export = {}
local pos_functions = {}
local force_cat = false -- for testing; if true, categories appear in non-mainspace pages
local require = require
local require_when_needed = require("Module:require when needed")
local en_utilities_module = "Module:en-utilities"
local headword_utilities_module = "Module:headword utilities"
local headword_module = "Module:headword"
local inflection_utilities_module = "Module:inflection utilities"
local parse_utilities_module = "Module:parse utilities"
local JSON_module = "Module:JSON"
local links_module = "Module:links"
local parameters_module = "Module:parameters"
local string_utilities_module = "Module:string utilities"
local table_module = "Module:table"
local utilities_module = "Module:utilities"
local iut = require_when_needed(inflection_utilities_module)
local put = require_when_needed(parse_utilities_module)
local add_links_to_multiword_term = require_when_needed(headword_utilities_module, "add_links_to_multiword_term")
local add_suffix = require_when_needed(en_utilities_module, "add_suffix")
local apply_link_modifiers = require_when_needed(headword_utilities_module, "apply_link_modifiers")
local concat = table.concat
local format_categories = require_when_needed(utilities_module, "format_categories")
local full_headword = require_when_needed(headword_module, "full_headword")
local get_link_page = require_when_needed(links_module, "get_link_page")
local insert = table.insert
local is_regular_plural = require_when_needed(en_utilities_module, "is_regular_plural")
local list_to_set = require_when_needed(table_module, "listToSet")
local remove = table.remove
local remove_links = require_when_needed(links_module, "remove_links")
local process_params = require_when_needed(parameters_module, "process")
local singularize = require_when_needed(en_utilities_module, "singularize")
local split = require_when_needed(string_utilities_module, "split")
local toJSON = require_when_needed(JSON_module, "toJSON")
local toNFD = mw.ustring.toNFD
local ulen = require_when_needed(string_utilities_module, "len")
local ulower = require_when_needed(string_utilities_module, "lower")
local umatch = require_when_needed(string_utilities_module, "match")
local lang = require("Module:languages").getByCode("en")
local langname = lang:getCanonicalName()
local function glossary_link(entry, text)
text = text or entry
return "[[Appendix:Glossary#" .. entry .. "|" .. text .. "]]"
end
local function track(page)
require("Module:debug/track")("en-headword/" .. page)
return true
end
------------------------------------------- UTILITY FUNCTIONS ------------------------------------------
-- These functions are used directly in the <> format as well as in the utility functions #2 below.
local function compute_double_last_cons_stem(term)
local last_cons = term:match("([bcdfghjklmnpqrstvwxyzBCDFGHJKLMNPQRSTVWXYZ])$")
if not last_cons then
error("Verb stem '" .. term .. "' must end in a consonant to use ++")
end
return term .. last_cons
end
local function compute_plusplus_s_form(term, default_s_form)
if term:find("[sz]$") then
-- regas -> regasses, derez -> derezzes
return compute_double_last_cons_stem(term) .. "es"
else
return default_s_form
end
end
-- The main entry point.
-- This is the only function that can be invoked from a template.
function export.show(frame)
local poscat = frame.args[1] or error("Part of speech has not been specified. Please pass parameter 1 to the module invocation.")
local boolean = {type = "boolean"}
local params = {
["head"] = {list = true},
["id"] = true,
["json"] = boolean,
["sort"] = true,
["splithyph"] = boolean,
["nosplithyph"] = boolean,
["hyphspace"] = boolean,
["nolink"] = boolean,
["nolinkhead"] = {type = "boolean", alias_of = "nolink"},
["nosuffix"] = boolean,
["nomultiwordcat"] = boolean,
["pagename"] = true, -- for testing
}
local pos_data = pos_functions[poscat]
if pos_data then
for key, val in pairs(pos_data.params) do
params[key] = val
end
end
local args = process_params(frame:getParent().args, params, nil, "en-headword", "show")
local pagename = args.pagename or mw.loadData("Module:headword/data").pagename -- Accounts for unsupported titles.
local user_specified_heads = args.head
local heads = user_specified_heads
local autohead
if args.nolink or not pagename:find("[ '%-]") then
autohead = pagename
else
local en_no_split_apostrophe_words = list_to_set{
"one's",
"someone's",
"he's",
"she's",
"it's",
}
local en_include_hyphen_prefixes = list_to_set{
-- We don't include things that are also words even though they are often (perhaps mostly) prefixes, e.g.
-- "be", "counter", "cross", "extra", "half", "mid", "over", "pan", "under".
"acro",
"acousto",
"Afro",
"agro",
"anarcho",
"angio",
"Anglo",
"ante",
"anti",
"arch",
"auto",
"bi",
"bio",
"cis",
"co",
"cryo",
"crypto",
"de",
"demi",
"eco",
"electro",
"Euro",
"ex",
"Greco",
"hemi",
"hydro",
"hyper",
"hypo",
"infra",
"Indo",
"inter",
"intra",
"Judeo",
"macro",
"meta",
"micro",
"mini",
"multi",
"neo",
"neuro",
"non",
"para",
"peri",
"post",
"pre",
"pro",
"proto",
"pseudo",
"re",
"semi",
"sub",
"super",
"trans",
"un",
"vice",
}
local function is_english(term)
local title = mw.title.new(term)
if title and title.exists then
local content = title:getContent()
if content and content:find("==English==\n") then
return true
end
end
return false
end
local function en_split_hyphen_when_space(word)
if not word:find("-", nil, true) then
return nil
end
if args.hyphspace then
return "[[" .. word:gsub("%-+", " ") .. "|" .. word .. "]]"
end
if args.nosplithyph then
return "[[" .. word .. "]]"
end
if not args.splithyph then
local space_word = word:gsub("%-+", " ")
if is_english(space_word) then
return "[[" .. space_word .. "|" .. word .. "]]"
end
if is_english(word) then
return "[[" .. word .. "]]"
end
end
return nil
end
local function en_split_apostrophe(word)
local base = word:match("^(.*)'s$")
if base then
return "[[" .. base .. "]][[-'s|'s]]"
end
base = word:match("^(.*)'$")
if base then
if base:find("s$") then
local sg = singularize(base)
if is_english(sg) then
return "[[" .. sg .. "|" .. base .. "]][[-'|']]"
end
end
return "[[" .. base .. "]][[-'|']]"
end
return "[[" .. word .. "]]"
end
autohead = add_links_to_multiword_term(pagename, {
split_hyphen_when_space = en_split_hyphen_when_space,
split_apostrophe = en_split_apostrophe,
no_split_apostrophe_words = en_no_split_apostrophe_words,
include_hyphen_prefixes = en_include_hyphen_prefixes,
})
end
if #heads == 0 then
heads = {autohead}
else
for i, head in ipairs(heads) do
if head:find("^~") then
head = apply_link_modifiers(autohead, head:sub(2))
heads[i] = head
end
if head == autohead then
track("redundant-head")
end
end
end
local data = {
lang = lang,
pos_category = poscat,
categories = {},
heads = heads,
user_specified_heads = user_specified_heads,
no_redundant_head_cat = #user_specified_heads == 0,
inflections = {},
nomultiwordcat = args.nomultiwordcat,
sort_key = args.sort,
pagename = args.pagename,
-- This is always set, and in the case of unsupported titles, it's the displayed version (e.g. 'C|N>K' instead of
-- 'Unsupported titles/C through N to K').
displayed_pagename = pagename,
id = args.id,
force_cat_output = force_cat,
}
local is_suffix = false
if not args.nosuffix and pagename:find("^%-") and not pagename:find("^%-%-") and poscat ~= "suffix forms" then
is_suffix = true
data.pos_category = "suffixes"
local singular_poscat = singularize(poscat)
insert(data.categories, langname .. " " .. singular_poscat .. "-forming suffixes")
insert(data.inflections, {label = singular_poscat .. "-forming suffix"})
end
if pos_data then
pos_data.func(args, data, is_suffix)
end
local extra_categories = {}
if pagename:find("[Qq][^Uu]") or pagename:find("[Qq]$") then
insert(data.categories, langname .. " words containing Q not followed by U")
end
-- toNFD performs decomposition, so letters that decompose to an ASCII
-- vowel and a diacritic, such as é, are counted as vowels anddo not do not
-- need to be included in the pattern.
if not umatch(ulower(toNFD(pagename)), "[aeiouyæœøəªºαεηιουω]") then
insert(data.categories, langname .. " words without vowels")
end
if pagename:find("yre$") then
insert(data.categories, langname .. ' words ending in "-yre"')
end
if not pagename:find(" ") and ulen(pagename) >= 25 then
insert(extra_categories, "Long " .. langname .. ' words')
end
if pagename:find("^[^aeiou ]*a[^aeiou ]*e[^aeiou ]*i[^aeiou ]*o[^aeiou ]*u[^aeiou ]*$") then
insert(data.categories, langname .. ' words that use all vowels in alphabetical order')
end
if args.json then
return toJSON(data)
end
return full_headword(data)
.. (#extra_categories > 0
and format_categories(extra_categories, lang, args.sort)
or "")
end
-- This function does the common work between adjectives and adverbs
local function make_comparatives(params, data)
local comp_parts = {label = glossary_link("comparative"), accel = {form = "comparative"}}
local sup_parts = {label = glossary_link("superlative"), accel = {form = "superlative"}}
local pagename = data.displayed_pagename
if #params == 0 then
insert(params, {"more"})
end
-- Go over each parameter given and create a comparative and superlative
-- form.
for i, val in ipairs(params) do
local comp = val[1]
local comp_qual = val[2]
local sup = val[3]
local sup_qual = val[4]
local comp_part, sup_part
if comp == "more" and pagename ~= "many" and pagename ~= "much" then
comp_part = "more [[" .. pagename .. "]]"
sup_part = sup or "most [[" .. pagename .. "]]"
elseif comp == "further" and pagename ~= "far" then
comp_part = "further [[" .. pagename .. "]]"
sup_part = sup or "furthest [[" .. pagename .. "]]"
elseif comp == "er" then
-- Add the "-er" and "-est" suffixes.
comp_part = add_suffix(pagename, "r")
sup_part = sup or add_suffix(pagename, "st.superlative")
elseif comp == "ier" then
if pagename:sub(-1) ~= "y" then
error("Can't specify 'ier' comparative unless the term ends with 'y'.")
end
comp_part = pagename:gsub("e?y$", "ier")
sup_part = sup or pagename:gsub("e?y$", "iest")
elseif comp == "-" or sup == "-" then
-- Allowing '-' makes it more flexible to not have some forms
if comp ~= "-" then
comp_part = comp
end
if sup ~= "-" then
sup_part = sup
end
else
-- If the full comparative was given, but no superlative, then
-- create it by replacing the ending -er with -est.
if not sup then
if comp:sub(-2) == "er" then
sup = comp:sub(1, -3) .. "est"
else
error("The superlative of \"" .. comp .. "\" cannot be generated automatically. Please provide it with the \"sup" .. (i == 1 and "" or i) .. "=\" parameter.")
end
end
comp_part = comp
sup_part = sup
end
if comp_part then
insert(comp_parts, {term = comp_part, q = {comp_qual}})
end
if sup_part then
insert(sup_parts, {term = sup_part, q = {sup_qual}})
end
end
insert(data.inflections, comp_parts)
insert(data.inflections, sup_parts)
end
local function make_heads_definite(args, data)
if args.def == "~" then
local newheads = {}
for _, head in ipairs(data.heads) do
insert(newheads, head)
insert(newheads, "the " .. head)
end
data.heads = newheads
else
for i, head in ipairs(data.heads) do
data.heads[i] = "the " .. head
end
end
end
local function non_op()
end
pos_functions["ھاوەڵناو"] = {
params = {
[1] = {list = true, allow_holes = true},
["def"] = true,
["the"] = {alias_of = "def"},
["comp_qual"] = {list = "comp\1_qual", allow_holes = true},
["sup"] = {list = true, allow_holes = true},
["sup_qual"] = {list = "sup\1_qual", allow_holes = true},
},
func = function(args, data)
local shift = 0
local is_not_comparable = false
local is_comparative_only = false
if args.def then
make_heads_definite(args, data)
end
-- If the first parameter is ?, then don't show anything, just return.
if args[1][1] == "?" then
return
-- If the first parameter is -, then move all parameters up one position.
elseif args[1][1] == "-" then
shift = 1
is_not_comparable = true
-- If the only argument is +, then remember this and clear parameters
elseif args[1][1] == "+" and args[1].maxindex == 1 then
shift = 1
is_comparative_only = true
end
-- Gather all the comparative and superlative parameters.
local params = {}
for i = 1, args[1].maxindex - shift do
local comp = args[1][i + shift]
local comp_qual = args["comp_qual"][i + shift]
local sup = args["sup"][i]
local sup_qual = args["sup_qual"][i + shift]
if comp or sup then
insert(params, {comp, comp_qual, sup, sup_qual})
end
end
if shift == 1 then
-- If the first parameter is "-" but there are no parameters,
-- then show "not comparable" only and return.
-- If there are parameters, then show "not generally comparable"
-- before the forms.
if #params == 0 then
if is_not_comparable then
insert(data.inflections, {label = "not " .. glossary_link("comparable")})
insert(data.categories, langname .. " uncomparable adjectives")
return
end
if is_comparative_only then
insert(data.inflections, {label = glossary_link("comparative") .. " form only"})
insert(data.categories, langname .. " comparative-only adjectives")
return
end
else
insert(data.inflections, {label = "not generally " .. glossary_link("comparable")})
end
end
-- Process the parameters
make_comparatives(params, data)
end
}
pos_functions["adverbs"] = {
params = {
[1] = {list = true, allow_holes = true},
["comp_qual"] = {list = "comp\1_qual", allow_holes = true},
["sup"] = {list = true, allow_holes = true},
["sup_qual"] = {list = "sup\1_qual", allow_holes = true},
},
func = function(args, data)
local shift = 0
-- If the first parameter is ?, then don't show anything, just return.
if args[1][1] == "?" then
return
-- If the first parameter is -, then move all parameters up one position.
elseif args[1][1] == "-" then
shift = 1
end
-- Gather all the comparative and superlative parameters.
local params = {}
for i = 1, args[1].maxindex - shift do
local comp = args[1][i + shift]
local comp_qual = args["comp_qual"][i + shift]
local sup = args["sup"][i]
local sup_qual = args["sup_qual"][i + shift]
if comp or sup then
insert(params, {comp, comp_qual, sup, sup_qual})
end
end
if shift == 1 then
-- If the first parameter is "-" but there are no parameters,
-- then show "not comparable" only and return. If there are parameters,
-- then show "not generally comparable" before the forms.
if #params == 0 then
insert(data.inflections, {label = "not " .. glossary_link("comparable")})
insert(data.categories, langname .. " uncomparable adverbs")
return
else
insert(data.inflections, {label = "not generally " .. glossary_link("comparable")})
end
end
-- Process the parameters
make_comparatives(params, data)
end
}
pos_functions["conjunctions"] = {
params = {
[1] = { alias_of = "head" },
},
func = non_op,
}
pos_functions["interjections"] = {
params = {
[1] = { alias_of = "head" },
},
func = non_op,
}
local function escape(str)
return (str:gsub("\\([:#])", "\\\\%1")
:gsub("[:#]", "\\%0"))
end
local function canonicalize_plural(pl, pagename, pos)
if pl == "+" then
return escape(add_suffix(pagename, "s.plural", pos))
elseif pl == "++" then
return escape(compute_plusplus_s_form(pagename, add_suffix(pagename, "s.plural", pos)))
elseif pl == "*" then
return escape(pagename)
elseif pl == "ies" then
if pagename:sub(-1) == "y" then
return escape(pagename:gsub("e?y$", pl))
end
error("Can't specify 'ies' plural unless the term ends with 'y'.")
elseif pl == "s" or pl == "es" or pl == "'s" then
return escape(pagename .. pl)
end
end
local function do_nouns(args, data, pos)
local pagename = data.displayed_pagename
pos = pos or "noun"
local function gather_inflections_with_quals(infl_field, qual_field, label)
-- Gather all the plural parameters from the numbered parameters.
local infls = {}
if label then
infls.label = label
end
for i, infl in ipairs(args[infl_field]) do
local qual = args[qual_field][i]
if qual then
insert(infls, {term = infl, q = {qual}})
else
insert(infls, infl)
end
end
return infls
end
if args.def then
make_heads_definite(args, data)
end
local plurals = gather_inflections_with_quals(1, "plqual")
if plurals[1] == "p" then
-- plurale tantum
if #plurals > 1 then
error("With plurale tantum noun, can't specify more than one plural")
end
data.genders = {"p"} -- this should auto-insert the correct 'pluralia tantum' category
if #args.sg > 0 then
insert(data.inflections, {label = "normally plural"})
insert(data.inflections, gather_inflections_with_quals("sg", "sgqual", "singular"))
else
insert(data.inflections, {label = "plural only"})
end
if #args.attr > 0 then
insert(data.inflections, gather_inflections_with_quals("attr", "attrqual", "attributive"))
end
return
end
local need_default_plural = pos == "noun"
if plurals[1] == "-" then
-- Uncountable noun; may occasionally have a plural
remove(plurals, 1) -- Remove the "-"
insert(data.categories, "ناوە نەژماردەنییە " .. langname .. "یەکان")
-- If plural forms were given explicitly, then show "usually"
if #plurals > 0 then
insert(data.inflections, {label = "بەگشتی " .. glossary_link("نەژماردەنی")})
insert(data.categories, "ناوە ژماردەنییە " .. langname .. "یەکان")
else
insert(data.inflections, {label = glossary_link("نەژماردەنی")})
end
need_default_plural = false
elseif plurals[1] == "~" then
-- Mixed countable/uncountable noun, always has a plural
remove(plurals, 1) -- Remove the "~"
insert(data.inflections, {label = glossary_link("ژماردەنی") .. " و " .. glossary_link("نەژماردەنی")})
insert(data.categories, "ناوە نەژماردەنییە " .. langname .. "یەکان")
insert(data.categories, "ناوە ژماردەنییە " .. langname .. "یەکان")
-- If no plural was given, add a default one now
if #plurals == 0 then
plurals[1] = escape(add_suffix(pagename, "s.plural", pos))
end
elseif pos == "proper noun" then
-- For proper nouns, the default is uncountable
insert(data.categories, "ناوە نەژماردەنییە " .. langname .. "یەکان")
else
-- For common nouns, the default is countable, has a plural
insert(data.categories, "ناوە ژماردەنییە " .. langname .. "یەکان")
end
-- Plural is unknown
if plurals[1] == "?" then
remove(plurals, 1) -- Remove the "?"
-- Not desired; see [[Wiktionary:Tea_room/2021/August#"Plural unknown or uncertain"]]
-- insert(data.inflections, {label = "plural unknown or uncertain"})
insert(data.categories, langname .. " nouns with unknown or uncertain plurals")
if #plurals > 0 then
error("Can't specify explicit plurals along with '?' for unknown/uncertain plural")
end
return
end
-- Plural is not attested
if plurals[1] == "!" then
remove(plurals, 1) -- Remove the "!"
insert(data.inflections, {label = "plural not attested"})
insert(data.categories, langname .. " nouns with unattested plurals")
if #plurals > 0 then
error("Can't specify explicit plurals along with '!' for unattested plural")
end
return
end
-- If no plural was given, maybe add a default one, otherwise (when "-" was given) return.
if #plurals == 0 then
if not need_default_plural then
return
end
plurals[1] = escape(add_suffix(pagename, "s.plural", pos))
end
-- There are plural forms to show, so show them.
plurals.label = "کۆ:"
plurals.accel = {form = "p"}
local irregular, indeclinable
for i, pl in ipairs(plurals) do
local pl_type = type(pl)
local pl_term = pl_type == "table" and pl.term or pl
local canon_pl = canonicalize_plural(pl_term, pagename, pos)
if canon_pl then
pl_term = canon_pl
if pl_type == "table" then
pl.term = pl_term
else
plurals[i] = pl_term
end
end
pl_term = get_link_page(pl_term, lang)
if not (pagename:find(" ") or is_regular_plural(pl_term, pagename)) then
irregular = true
if pl_term == pagename then
indeclinable = true
end
end
end
if irregular then
insert(data.categories, langname .. " nouns with irregular plurals")
end
if indeclinable then
insert(data.categories, langname .. " indeclinable nouns")
end
insert(data.inflections, plurals)
end
-- Return the parameters to be used for nouns and proper nouns. Currently the same.
local function get_noun_params(is_proper)
return {
[1] = {list = true, disallow_holes = true},
["def"] = true,
["the"] = {alias_of = "def"},
["pl\1qual"] = {list = true, allow_holes = true},
-- The following four only used for pluralia tantum (1=p)
["sg"] = {list = true, disallow_holes = true},
["sg\1qual"] = {list = true, allow_holes = true},
["attr"] = {list = true, disallow_holes = true},
["attr\1qual"] = {list = true, allow_holes = true},
}
end
pos_functions["ناو"] = {
params = get_noun_params(false),
func = do_nouns,
}
pos_functions["proper nouns"] = {
params = get_noun_params("is proper"),
func = function(args, data) return do_nouns(args, data, "proper noun") end,
}
local function base_default_verb_forms(verb)
return escape(add_suffix(verb, "s.verb")), escape(add_suffix(verb, "ing")), escape(add_suffix(verb, "d"))
end
local function default_verb_forms(verb)
local full_s_form, full_ing_form, full_ed_form = base_default_verb_forms(verb)
if verb:find(" ") then
local first, rest = verb:match("^(.-)( .*)$")
local first_s_form, first_ing_form, first_ed_form = base_default_verb_forms(first)
return full_s_form, full_ing_form, full_ed_form, first_s_form .. rest, first_ing_form .. rest, first_ed_form .. rest
else
return full_s_form, full_ing_form, full_ed_form, nil, nil, nil
end
end
pos_functions["verbs"] = {
params = {
[1] = {list = "pres_3sg", allow_holes = true},
["pres_3sg_qual"] = {list = "pres_3sg\1_qual", allow_holes = true},
[2] = {list = "pres_ptc", allow_holes = true},
["pres_ptc_qual"] = {list = "pres_ptc\1_qual", allow_holes = true},
[3] = {list = "past", allow_holes = true},
["past_qual"] = {list = "past\1_qual", allow_holes = true},
[4] = {list = "past_ptc", allow_holes = true},
["past_ptc_qual"] = {list = "past_ptc\1_qual", allow_holes = true},
["noautolinkverb"] = {type = "boolean"},
},
func = function(args, data)
-- Get parameters
local par1 = args[1][1]
local par2 = args[2][1]
local par3 = args[3][1]
local par4 = args[4][1]
local pres_3sgs, pres_ptcs, pasts, past_ptcs
local pagename = data.displayed_pagename
------------------------------------------- UTILITY FUNCTIONS #2 ------------------------------------------
-- These functions are used in both in the separate-parameter format and in the override params such as past_ptc2=.
local new_default_s, new_default_ing, new_default_ed, split_default_s, split_default_ing, split_default_ed =
default_verb_forms(pagename)
local function compute_double_last_cons_stem_of_split_verb(verb, ending)
local first, rest = verb:match("^(.-)( .*)$")
if not first then
error("Verb '" .. verb .. "' must have a space in it to use ++*")
end
local last_cons = first:match("([bcdfghjklmnpqrstvwxyzBCDFGHJKLMNPQRSTVWXYZ])$")
if not last_cons then
error("First word '" .. first .. "' must end in a consonant to use ++*")
end
return first .. last_cons .. ending .. rest
end
local function check_non_nil_star_form(form)
if form == nil then
error("Verb '" .. pagename .. "' must have a space in it to use * or ++*")
end
return form
end
local function sub_tilde(form)
if not form then
return nil
end
local retval = form:gsub("~", pagename) -- discard second return value
return retval
end
local function canonicalize_s_form(form)
if form == "+" then
return new_default_s
elseif form == "*" then
return check_non_nil_star_form(split_default_s)
elseif form == "++" then
return compute_plusplus_s_form(pagename, new_default_s)
elseif form == "++*" then
if pagename:find("^[^ ]*[sz] ") then
return compute_double_last_cons_stem_of_split_verb(pagename, "es")
else
return check_non_nil_star_form(split_default_s)
end
else
return sub_tilde(form)
end
end
local function canonicalize_ing_form(form)
if form == "+" then
return new_default_ing
elseif form == "*" then
return check_non_nil_star_form(split_default_ing)
elseif form == "++" then
return compute_double_last_cons_stem(pagename) .. "ing"
elseif form == "++*" then
return compute_double_last_cons_stem_of_split_verb(pagename, "ing")
else
return sub_tilde(form)
end
end
local function canonicalize_ed_form(form)
if form == "+" then
return new_default_ed
elseif form == "*" then
return check_non_nil_star_form(split_default_ed)
elseif form == "++" then
return compute_double_last_cons_stem(pagename) .. "ed"
elseif form == "++*" then
return compute_double_last_cons_stem_of_split_verb(pagename, "ed")
else
return sub_tilde(form)
end
end
local function canonicalize_en_form(form)
if form == "n" then
return add_suffix(pagename, "n")
end
return canonicalize_ed_form(form)
end
--------------------------------- MAIN PARSING/CONJUGATING CODE --------------------------------
local past_ptcs_given
if par1 and par1:find("<") then
-------------------------- ANGLE-BRACKET FORMAT --------------------------
if par2 or par3 or par4 then
error("Can't specify 2=, 3= or 4= when 1= contains angle brackets: " .. par1)
end
-- In the angle bracket format, we always copy the full past tense specs to the past participle
-- specs if none of the latter are given, so act as if the past participle is always given.
-- There is a separate check to see if the past tense and past participle are identical, in any case.
past_ptcs_given = true
-- (1) Parse the indicator specs inside of angle brackets.
local function parse_indicator_spec(angle_bracket_spec)
local inside = angle_bracket_spec:match("^<(.*)>$")
assert(inside)
local segments = put.parse_balanced_segment_run(inside, "[", "]")
local comma_separated_groups = put.split_alternating_runs(segments, ",")
if #comma_separated_groups > 4 then
error("Too many comma-separated parts in indicator spec: " .. angle_bracket_spec)
end
local function fetch_qualifiers(separated_group)
local qualifiers
for j = 2, #separated_group - 1, 2 do
if separated_group[j + 1] ~= "" then
error("Extraneous text after bracketed qualifiers: '" .. concat(separated_group) .. "'")
end
if not qualifiers then
qualifiers = {}
end
insert(qualifiers, separated_group[j])
end
return qualifiers
end
local function fetch_specs(comma_separated_group)
if not comma_separated_group then
return {{}}
end
local specs = {}
local colon_separated_groups = put.split_alternating_runs(comma_separated_group, ":")
for _, colon_separated_group in ipairs(colon_separated_groups) do
local form = colon_separated_group[1]
if form == "*" or form == "++*" then
error("* and ++* not allowed inside of indicator specs: " .. angle_bracket_spec)
end
if form == "" then
form = nil
end
insert(specs, {form = form, q = fetch_qualifiers(colon_separated_group)})
end
return specs
end
local s_specs = fetch_specs(comma_separated_groups[1])
local ing_specs = fetch_specs(comma_separated_groups[2])
local ed_specs = fetch_specs(comma_separated_groups[3])
local en_specs = fetch_specs(comma_separated_groups[4])
for _, spec in ipairs(s_specs) do
if spec.form == "++" and #ing_specs == 1 and not ing_specs[1].form and not ing_specs[1].q
and #ed_specs == 1 and not ed_specs[1].form and not ed_specs[1].q then
ing_specs[1].form = "++"
ed_specs[1].form = "++"
break
end
end
return {
forms = {},
s_specs = s_specs,
ing_specs = ing_specs,
ed_specs = ed_specs,
en_specs = en_specs,
}
end
local parse_props = {
parse_indicator_spec = parse_indicator_spec,
}
local alternant_multiword_spec = iut.parse_inflected_text(par1, parse_props)
-- (2) Check for user-specified brackets; remove any links from the lemma, but remember the original
-- form so we can use it below in the 'lemma_linked' form.
-- Check to see if there are brackets in the pre-text or post-text. If so, use the linked lemma (with the
-- verb autolinked unless noautolinkverb is given). Otherwise, use the default headword algorithm.
local function check_bracket(val)
if val:find("%[%[") then
alternant_multiword_spec.saw_bracket = true
end
end
for _, alternant_or_word_spec in ipairs(alternant_multiword_spec.alternant_or_word_specs) do
check_bracket(alternant_or_word_spec.before_text)
if alternant_or_word_spec.alternants then
for _, multiword_spec in ipairs(alternant_or_word_spec.alternants) do
for _, word_spec in ipairs(multiword_spec.word_specs) do
check_bracket(word_spec.before_text)
end
check_bracket(multiword_spec.post_text)
end
end
end
check_bracket(alternant_multiword_spec.post_text)
iut.map_word_specs(alternant_multiword_spec, function(base)
if base.lemma == "" then
base.lemma = pagename
end
base.orig_lemma = base.lemma
base.lemma = remove_links(base.lemma)
if args.noautolinkverb or base.orig_lemma:find("%[%[") then
base.linked_lemma = base.orig_lemma
else
base.linked_lemma = "[[" .. base.orig_lemma .. "]]"
end
end)
-- (3) Conjugate the verbs according to the indicator specs parsed above.
local all_verb_slots = {
lemma = "infinitive",
lemma_linked = "infinitive",
s_form = "3|s|pres",
ing_form = "pres|ptcp",
ed_form = "past",
en_form = "past|ptcp",
}
local function conjugate_verb(base)
local def_s_form, def_ing_form, def_ed_form = base_default_verb_forms(base.lemma)
local function process_specs(slot, specs, default_form, canonicalize_plusplus)
for _, spec in ipairs(specs) do
local form = spec.form
if not form or form == "+" then
form = default_form
elseif form == "++" then
form = canonicalize_plusplus()
end
-- If there's a ~ in the form, substitute it with the lemma,
-- but make sure to first replace % in the lemma with %% so that
-- it doesn't get interpreted as a capture replace expression.
if form:find("~") then
-- Assign to a var because gsub returns multiple values.
local subbed_lemma = base.lemma:gsub("%%", "%%%%")
form = form:gsub("~", subbed_lemma)
end
-- If the form is -, don't insert any forms, which will result
-- in there being no overall forms (in fact it will be nil).
-- We check for that down below and substitute a single "-" as
-- the form, which in turn gets turned into special labels like
-- "no present participle".
if form ~= "-" then
iut.insert_form(base.forms, slot, {form = form, footnotes = spec.q})
end
end
end
process_specs("s_form", base.s_specs, def_s_form,
function() return compute_plusplus_s_form(base.lemma, def_s_form) end)
process_specs("ing_form", base.ing_specs, def_ing_form,
function() return compute_double_last_cons_stem(base.lemma) .. "ing" end)
process_specs("ed_form", base.ed_specs, def_ed_form,
function() return compute_double_last_cons_stem(base.lemma) .. "ed" end)
-- If the -en spec is completely missing, substitute the -ed spec in its entirely.
-- Otherwise, if individual -en forms are missing or use +, we will substitute the
-- default -ed form, as with the -ed spec.
local en_specs = base.en_specs
if #en_specs == 1 and not en_specs[1].form and not en_specs[1].q then
en_specs = base.ed_specs
end
process_specs("en_form", en_specs, def_ed_form,
function() return compute_double_last_cons_stem(base.lemma) .. "ed" end)
iut.insert_form(base.forms, "lemma", {form = base.lemma})
-- Add linked version of lemma for use in head=. We write this in a general fashion in case
-- there are multiple lemma forms (which isn't possible currently at this level, although it's
-- possible overall using the ((...,...)) notation).
iut.insert_forms(base.forms, "lemma_linked", iut.map_forms(base.forms.lemma, function(form)
if form == base.lemma and base.linked_lemma:find("%[%[") then
return base.linked_lemma
else
return form
end
end))
end
local inflect_props = {
slot_table = all_verb_slots,
inflect_word_spec = conjugate_verb,
}
iut.inflect_multiword_or_alternant_multiword_spec(alternant_multiword_spec, inflect_props)
-- (4) Fetch the forms and put the conjugated lemmas in data.heads if not explicitly given.
local function fetch_forms(slot)
local forms = alternant_multiword_spec.forms[slot]
-- See above. This should only occur if the user explicitly used -
-- for a spec.
if not forms or #forms == 0 then
forms = {{form = "-"}}
end
return forms
end
pres_3sgs = fetch_forms("s_form")
pres_ptcs = fetch_forms("ing_form")
pasts = fetch_forms("ed_form")
past_ptcs = fetch_forms("en_form")
-- Use the "linked" form of the lemma as the head if no head= explicitly given and the user specified brackets
-- in one of the lemmas. Otherwise we use the default headword-linking algorithm.
if #data.user_specified_heads == 0 and alternant_multiword_spec.saw_bracket then
data.heads = {}
for _, lemma_obj in ipairs(alternant_multiword_spec.forms.lemma_linked) do
local quals, refs = iut.convert_footnotes_to_qualifiers_and_references(lemma_obj.footnotes)
insert(data.heads, {term = lemma_obj.form, q = quals, refs = refs})
end
end
else
-------------------------- SEPARATE-PARAM FORMAT --------------------------
local pres_3sg, pres_ptc, past
if par1 and not (par2 or par3) then
-- Use of a single parameter other than "++", "*" or "++*" is now the "legacy" format,
-- and no longer supported.
if par1 == "es" or par1 == "ies" or par1 == "d" then
error("Legacy parameter 1=es/ies/d no longer supported, just use 'en-verb' without params")
elseif par1 == "++" or par1 == "*" or par1 == "++*" then
pres_3sg = canonicalize_s_form(par1)
pres_ptc = canonicalize_ing_form(par1)
past = canonicalize_ed_form(par1)
else
error("Legacy parameter 1=STEM no longer supported, just use 'en-verb' without params")
end
else
if par2 then
track("xxx2")
end
if par3 then
track("xxx3")
end
end
if not pres_3sg or not pres_ptc or not past then
-- Either all three should be set above, or none of them.
assert(not pres_3sg and not pres_ptc and not past)
if par1 then
pres_3sg = canonicalize_s_form(par1)
else
pres_3sg = new_default_s
end
if par2 then
pres_ptc = canonicalize_ing_form(par2)
else
pres_ptc = new_default_ing
end
if par3 then
past = canonicalize_ed_form(par3)
else
past = new_default_ed
end
end
local past_ptc
if par4 then
past_ptcs_given = true
past_ptc = canonicalize_en_form(par4)
track("xxx4")
else
past_ptc = past
end
pres_3sgs = {{form = pres_3sg}}
pres_ptcs = {{form = pres_ptc}}
pasts = {{form = past}}
past_ptcs = {{form = past_ptc}}
end
------------------------------------------- HANDLE OVERRIDES ------------------------------------------
local function strip_brackets(qualifiers)
if not qualifiers then
return nil
end
local stripped_qualifiers = {}
for _, qualifier in ipairs(qualifiers) do
local stripped_qualifier = qualifier:match("^%[(.*)%]$")
if not stripped_qualifier then
error("Internal error: Qualifier should be surrounded by brackets at this stage: " .. qualifier)
end
insert(stripped_qualifiers, stripped_qualifier)
end
return stripped_qualifiers
end
local function collect_forms(label, accel_form, defaults, overrides, override_qualifiers, canonicalize)
if defaults[1].form == "-" then
return {label = "no " .. label}
else
local into_table = {label = label, accel = {form = accel_form}}
local maxindex = math.max(#defaults, overrides.maxindex)
local qualifiers = override_qualifiers[1] and {override_qualifiers[1]} or strip_brackets(defaults[1].footnotes)
insert(into_table, {term = defaults[1].form, q = qualifiers})
-- Present 3rd singular
for i = 2, maxindex do
local override_form = canonicalize(overrides[i])
if override_form then
-- If there is an override such as past_ptc2=..., only use the qualifier specified
-- using an override (past_ptc2_qual=...), if any; it doesn't make sense to combine
-- an override form with a qualifier specified inside of angle brackets.
insert(into_table, {term = override_form, q = {override_qualifiers[i]}})
elseif defaults[i] then
-- If the form comes from inside angle brackets, allow any override qualifier
-- (past_ptc2_qual=...) to override any qualifier specified inside of angle brackets.
-- FIXME: Maybe we should throw an error here if both exist.
local qualifiers = override_qualifiers[i] and {override_qualifiers[i]} or strip_brackets(defaults[i].footnotes)
insert(into_table, {term = defaults[i].form, q = qualifiers})
end
end
return into_table
end
end
local pres_3sg_infls = collect_forms("third-person singular simple present", "s-verb-form",
pres_3sgs, args[1], args.pres_3sg_qual, canonicalize_s_form)
local pres_ptc_infls = collect_forms("present participle", "ing-form",
pres_ptcs, args[2], args.pres_ptc_qual, canonicalize_ing_form)
local past_infls = collect_forms("simple past", "spast",
pasts, args[3], args.past_qual, canonicalize_ed_form)
local past_ptc_infls = collect_forms("past participle", "past|part",
past_ptcs, args[4], args.past_ptc_qual, canonicalize_en_form)
-- Are the past forms identical to the past participle forms? If so, we use a single
-- combined "simple past and past participle" label on the past tense forms.
-- We check for two conditions: Either no past participle forms were given at all, or
-- they were given but are identical in every way (all forms and qualifiers) to the past
-- tense forms. The former "no explicit past participle forms" check is important in the
-- "separate-parameter" format; if past tense overrides are given and no past participle
-- forms given, the past tense overrides should apply to the past participle as well.
-- In the angle-bracket format, it's expected that all forms and qualifiers are specified
-- using that format, and we explicitly copy past tense forms and qualifiers to past
-- participle ones if the latter are omitted, so we disable to "no explicit past participle
-- forms" check.
if args[4].maxindex > 0 or args.past_ptc_qual.maxindex > 0 then
past_ptcs_given = true
end
local identical = true
-- For the past and past participle to be identical, there must be
-- the same number of inflections, and each inflection must match
-- in term and qualifiers.
if #past_infls ~= #past_ptc_infls then
identical = false
else
for key, val in ipairs(past_infls) do
if past_ptc_infls[key].term ~= val.term then
identical = false
break
else
local quals1 = past_ptc_infls[key].q
local quals2 = val.q
if (not not quals1) ~= (not not quals2) then
-- one is nil, the other is not
identical = false
elseif quals1 and quals2 then
-- qualifiers present in both; each qualifier must match
if #quals1 ~= #quals2 then
identical = false
else
for k, v in ipairs(quals1) do
if v ~= quals2[k] then
identical = false
break
end
end
end
end
if not identical then
break
end
end
end
end
-- Insert the forms
insert(data.inflections, pres_3sg_infls)
insert(data.inflections, pres_ptc_infls)
if not past_ptcs_given or identical then
if past_ptcs[1].form == "-" then
past_infls.label = "no simple past or past participle"
else
past_infls.label = "simple past and past participle"
past_infls.accel = {form = "ed-form"}
end
insert(data.inflections, past_infls)
else
insert(data.inflections, past_infls)
insert(data.inflections, past_ptc_infls)
end
if pagename:find(" ") then
-- Check for placeholder "it"
local words = split(pagename, " ")
for _, word in ipairs(words) do
if word == "it" or word == "its" or word == "it's" then
insert(data.categories, langname .. ' terms with placeholder "it"')
break
end
end
-- Check for phrasal verbs
local phrasal_adverbs = list_to_set{
-- NOTE: This should only contain common phrasal adverbs, not random words like [[low]],
-- [[adrift]], etc.
"aback",
"about",
"above",
"across",
"after",
"against",
"ahead",
"along",
"apart",
"around",
"as",
"aside",
"at",
"away",
"back",
"before",
"behind",
"below",
"between",
"beyond",
"by",
"down",
"for",
"forth",
"from",
"in",
"into",
"of",
"off",
"on",
"onto",
"out",
"over",
"past",
"round",
"through",
"to",
"together",
"towards",
"under",
"up",
"upon",
"with",
"without",
}
local allowed_non_adverb_words = list_to_set{
"it",
"one",
"oneself",
"someone",
}
local base = pagename
local seen_adverbs = {}
-- Only consider a verb to be phrasal if it consists of a single base verb followed exclusively by either
-- adverbs from `phrasal_adverbs` or placeholder words from `allowed_non_adverb_words`, where at
-- least one following word is from `phrasal_adverbs` (hence [[can it]] is not a phrasal verb).
while true do
local prev, word = base:match("^(.+) (.-)$")
if not prev then
break
end
if phrasal_adverbs[word] then
insert(seen_adverbs, word)
elseif allowed_non_adverb_words[word] then
-- do nothing
else
break
end
base = prev
end
if not base:find(" ") and #seen_adverbs > 0 then
insert(data.categories, langname .. " phrasal verbs")
for i = #seen_adverbs, 1, -1 do
insert(data.categories, langname .. ' phrasal verbs formed with "' .. seen_adverbs[i] ..
'"')
end
end
end
end
}
return export
1z9oeyysvy912uekmtn3usb78jdnjrn
مۆدیوول:gender and number
828
34
36803
34104
2026-08-13T11:39:43Z
Ghybu
12
update
36803
Scribunto
text/plain
local export = {}
local debug_track_module = "Module:debug/track"
local load_module = "Module:load"
local pron_qualifier_module = "Module:pron qualifier"
local parameters_module = "Module:parameters"
local string_utilities_module = "Module:string utilities"
local table_module = "Module:table"
local utilities_module = "Module:utilities"
local concat = table.concat
local insert = table.insert
local function debug_track(...)
debug_track = require(debug_track_module)
return debug_track(...)
end
local function deep_copy(...)
deep_copy = require(table_module).deepCopy
return deep_copy(...)
end
local function format_categories(...)
format_categories = require(utilities_module).format_categories
return format_categories(...)
end
local function format_pron_qualifiers(...)
format_pron_qualifiers = require(pron_qualifier_module).format_qualifiers
return format_pron_qualifiers(...)
end
local function load_data(...)
load_data = require(load_module).load_data
return load_data(...)
end
local function process_params(...)
process_params = require(parameters_module).process
return process_params(...)
end
local function split(...)
split = require(string_utilities_module).split
return split(...)
end
local gender_and_number_data
local function get_gender_and_number_data()
gender_and_number_data, get_gender_and_number_data = load_data("Module:gender and number/data"), nil
return gender_and_number_data
end
--[==[ intro:
This module creates standardised displays for gender and number. It converts a gender specification into Wiki/HTML format.
A gender/number specification consists of one or more gender/number elements, separated by hyphens. Examples are:
{"n"} (neuter gender), {"f-p"} (feminine plural), {"m-an-p"} (masculine animate plural),
{"pf"} (perfective aspect). Each gender/number element has the following properties:
# A code, as used in the spec, e.g. {"f"} for feminine, {"p"} for plural.
# A type, e.g. `gender`, `number` or `animacy`. Each element in a given spec must be of a different type.
# A display form, which in turn consists of a display code and a tooltip gloss. The display code
may not be the same as the spec code, e.g. the spec code {"an"} has display code {"anim"} and tooltip
gloss ''animate''.
# A category into which lemmas of the right part of speech are placed if they have a gender/number
spec containing the given element. For example, a noun with gender/number spec {"m-an-p"} is placed
into the categories `<var>lang</var> masculine nouns`, `<var>lang</var> animate nouns` and `<var>lang</var> pluralia tantum`.
]==]
--[==[
Version of format_list that can be invoked from a template.
]==]
function export.show_list(frame)
local params = {
[1] = {list = true},
["lang"] = {type = "language"},
}
local iargs = process_params(frame.args, params)
return export.format_list(iargs[1], iargs.lang)
end
--[==[
Older entry point; equivalent to format_genders() except that it formats the
categories and returns them appended to the formatted gender text rather than
returning the formatted text and categories separately.
]==]
function export.format_list(specs, lang, pos_for_cat, sort_key)
debug_track("gender and number/old-format-list")
local text, cats = export.format_genders(specs, lang, pos_for_cat)
if not cats then
return text
end
return text .. format_categories(cats, lang, sort_key)
end
local function autoadd_abbr(display)
if not display then
error("Internal error: '.display' for gender/number code is missing")
end
if display:find("<abbr", nil, true) then
return display
end
return ('%s'):format(display, display)
end
-- Add qualifiers, labels and references to a formatted gender/number spec. `spec` is the object describing the
-- gender/number spec, which should optionally contain:
-- * left qualifiers in `q` or (for compatibility) `qualifiers`, an array of strings;
-- * right qualifiers in `qq`, an array of strings;
-- * left labels in `l`, an array of strings;
-- * right labels in `ll`, an array of strings;
-- * references in `refs`, an array either of strings (formatted reference text) or objects containing fields `text`
-- (formatted reference text) and optionally `name` and/or `group`;
-- `formatted` is the formatted version of the term itself, and `lang` is the optional language object passed into
-- format_genders().
local function add_qualifiers_and_refs(formatted, spec, lang)
local function field_non_empty(field)
local list = spec[field]
if not list then
return nil
end
if type(list) ~= "table" then
error(("Internal error: Wrong type for `spec.%s`=%s, should be \"table\""):format(
field, mw.dumpObject(list)))
end
return list[1]
end
if field_non_empty("q") or field_non_empty("qq") or field_non_empty("l") or field_non_empty("ll") or
field_non_empty("qualifiers") or field_non_empty("refs") then
formatted = format_pron_qualifiers{
lang = lang,
text = formatted,
q = spec.q,
qq = spec.qq,
qualifiers = spec.qualifiers,
l = spec.l,
ll = spec.ll,
refs = spec.refs,
}
end
return formatted
end
--[==[
Format one or more gender/number specifications. Each spec is either a string, e.g. {"f-p"}, or a table of the form
{ {spec = "SPEC", qualifiers = {"QUALIFIER", "QUALIFIER", ...}}} where `.spec` is a gender/number spec such as {"f-p"}
and `.qualifiers` is a list of qualifiers to display before the formatted gender/number spec. `.spec` must be present
but `.qualifiers` may be omitted.
The function returns two values:
# the formatted text;
# a list of the categories to add.
If `lang` (which should be a language object) and `pos_for_cat` (which should be a plural part of speech) are given,
gender categories such as `German masculine nouns` or `Russian imperfective verbs` are added to the categories, and
request categories such as `Requests for gender in <var>lang</var> entries` or
`Requests for animacy in <var>lang</var> entries` may also be added. Otherwise, if only `lang` is given, only request
categories may be returned. If both are omitted, the returned list is empty.
]==]
function export.format_genders(specs, lang, pos_for_cat)
local formatted_specs, categories, seen_types = {}
local all_is_nounclass = nil
local full_langname = lang and lang:getFullName() or nil
local function do_gender_spec(spec, parts)
local types = {}
local codes = (gender_and_number_data or get_gender_and_number_data()).codes
for key, code in ipairs(parts) do
-- Is this code valid?
if not codes[code] then
error('The tag "' .. code .. '" in the gender specification "' .. spec.spec .. '" is not valid. See [[Module:gender and number]] for a list of valid tags.')
end
-- Check for multiple genders/numbers/animacies in a single spec.
local typ = codes[code].type
if typ ~= "other" and types[typ] then
error('The gender specification "' .. spec.spec .. '" contains multiple tags of type "' .. typ .. '".')
end
types[typ] = true
parts[key] = autoadd_abbr(codes[code].display)
-- Generate categories if called for.
if lang and pos_for_cat then
local cat = codes[code].cat
if cat then
if not categories then
categories = {}
end
insert(categories, full_langname .. " " .. cat)
end
if not seen_types then
seen_types = {}
elseif seen_types[typ] and seen_types[typ] ~= code then
cat = (gender_and_number_data or get_gender_and_number_data()).multicode_cats[typ]
if cat then
if not categories then
categories = {}
end
insert(categories, full_langname .. " " .. cat)
end
end
seen_types[typ] = code
end
if lang and codes[code].req then
local type_for_req = typ
if code == "?" then
-- Keep in mind `pos_for_cat` may be nil here.
type_for_req = pos_for_cat == "verbs" and "aspect" or "gender"
end
if not categories then
categories = {}
end
insert(categories, "Requests for " .. type_for_req .. " in " .. full_langname .. " entries")
end
end
-- Add the processed codes together with non-breaking spaces
if not parts[2] and parts[1] then
return parts[1]
else
return concat(parts, " ")
end
end
for _, spec in ipairs(specs) do
if type(spec) ~= "table" then
spec = {spec = spec}
end
local spec_spec, is_nounclass = spec.spec
-- If the specification starts with cX, then it is a noun class specification.
if spec_spec:match("^%d") or spec_spec:match("^c[^-]") then
is_nounclass = true
local code = spec_spec:gsub("^c", "")
local text
if code == "?" then
text = '<abbr class="noun-class" title="noun class missing">?</abbr>'
if lang then
if not categories then
categories = {}
end
insert(categories, "Requests for noun class in " .. full_langname .. " entries")
end
else
text = '<abbr class="noun-class" title="noun class ' .. code .. '">' .. code .. "</abbr>"
if lang and pos_for_cat then
if not categories then
categories = {}
end
insert(categories, full_langname .. " class " .. code .. " POS")
end
end
local text_with_qual = add_qualifiers_and_refs(text, spec, lang)
insert(formatted_specs, text_with_qual)
else
-- Split the parts and iterate over each part, converting it into its display form
local parts = split(spec.spec, "-", true, true)
local combined_codes = (gender_and_number_data or get_gender_and_number_data()).combinations
if lang then
-- Check if the specification is valid
--elseif langinfo.genders then
-- local valid_genders = {}
-- for _, g in ipairs(langinfo.genders) do valid_genders[g] = true end
--
-- if not valid_genders[spec.spec] then
-- local valid_string = {}
-- for i, g in ipairs(langinfo.genders) do valid_string[i] = g end
-- error('The gender specification "' .. spec.spec .. '" is not valid for ' .. langinfo.names[1] .. ". Valid are: " .. concat(valid_string, ", "))
-- end
--end
end
local has_combined = false
for _, code in ipairs(parts) do
if combined_codes[code] then
has_combined = true
break
end
end
if not has_combined then
if formatted_specs[1] then
insert(formatted_specs, "or")
end
insert(formatted_specs, add_qualifiers_and_refs(do_gender_spec(spec, parts), spec, lang))
else
-- This logic is to handle combined gender specs like 'mf' and 'mfbysense'.
local all_parts = {{}}
local extra_displays
local this_formatted_specs = {}
for _, code in ipairs(parts) do
if combined_codes[code] then
local new_all_parts = {}
for _, one_parts in ipairs(all_parts) do
for _, one_code in ipairs(combined_codes[code].codes) do
local new_combined_parts = deep_copy(one_parts)
insert(new_combined_parts, one_code)
insert(new_all_parts, new_combined_parts)
end
end
all_parts = new_all_parts
if lang and pos_for_cat then
local extra_cat = combined_codes[code].cat
if extra_cat then
if not categories then
categories = {}
end
insert(categories, full_langname .. " " .. extra_cat)
end
end
local extra_display = combined_codes[code].display
if extra_display then
if not extra_displays then
extra_displays = {}
end
insert(extra_displays, autoadd_abbr(extra_display))
end
else
for _, one_parts in ipairs(all_parts) do
insert(one_parts, code)
end
end
end
for _, parts in ipairs(all_parts) do
if this_formatted_specs[1] then
insert(this_formatted_specs, "or")
end
insert(this_formatted_specs, do_gender_spec(spec, parts))
end
if extra_displays then
for _, display in ipairs(extra_displays) do
insert(this_formatted_specs, display)
end
end
insert(formatted_specs, add_qualifiers_and_refs(
concat(this_formatted_specs, " "), spec, lang))
end
is_nounclass = false
end
-- Ensure that the specifications are either all noun classes, or none are.
if all_is_nounclass == nil then
all_is_nounclass = is_nounclass
elseif all_is_nounclass ~= is_nounclass then
error("Noun classes and genders cannot be mixed. Please use either one or the other.")
end
end
if categories and lang and pos_for_cat then
for i, cat in ipairs(categories) do
categories[i] = cat:gsub("POS", pos_for_cat)
end
end
if all_is_nounclass then
-- Add the processed codes together with slashes
return '<span class="gender">class ' .. concat(formatted_specs, "/") .. "</span>", categories
else
-- Add the processed codes together with spaces
return '<span class="gender">' .. concat(formatted_specs, " ") .. "</span>", categories
end
end
return export
2m0recg6bd63ggydwpzsqejrsntefgo
مۆدیوول:headword/templates
828
37
36802
36503
2026-08-13T11:34:14Z
Ghybu
12
+ pagename
36802
Scribunto
text/plain
insert = table.insert
local process_params = require("Module:parameters").process
local export = {}
local function get_args(frame)
local boolean = {type = "boolean"}
local boolean_list_allow_holes = {type = "boolean", list = true, allow_holes = true}
local list_allow_holes = {list = true, allow_holes = true}
return process_params(frame:getParent().args, {
[1] = {required = true, type = "language", default = "und"},
["sc"] = {type = "script"},
["sort"] = true,
[2] = {required = true, default = "nouns"},
["sccat"] = boolean,
["noposcat"] = boolean,
["nomultiwordcat"] = boolean,
["nogendercat"] = boolean,
["nopalindromecat"] = boolean,
["nolinkhead"] = boolean,
["autotrinfl"] = boolean,
["altform"] = boolean, -- EXPERIMENTAL: see [[Wiktionary:Beer parlour/2024/June#Decluttering the altform mess]]
["cat2"] = true,
["cat3"] = true,
["cat4"] = true,
pagename = true,
["head"] = list_allow_holes,
["id"] = true,
["tr"] = list_allow_holes,
["ts"] = list_allow_holes,
["gloss"] = true,
["g"] = {list = true},
["g\1qual"] = list_allow_holes,
[3] = list_allow_holes,
["f\1accel-form"] = list_allow_holes,
["f\1accel-translit"] = list_allow_holes,
["f\1accel-lemma"] = list_allow_holes,
["f\1accel-lemma-translit"] = list_allow_holes,
["f\1accel-gender"] = list_allow_holes,
["f\1accel-nostore"] = boolean_list_allow_holes,
["f\1request"] = list_allow_holes,
["f\1alt"] = list_allow_holes,
["f\1lang"] = {list = true, allow_holes = true, type = "language"},
["f\1sc"] = {list = true, allow_holes = true, type = "script"},
["f\1id"] = list_allow_holes,
["f\1tr"] = list_allow_holes,
["f\1ts"] = list_allow_holes,
["f\1g"] = list_allow_holes,
["f\1qual"] = list_allow_holes,
["f\1autotr"] = boolean_list_allow_holes,
["f\1nolink"] = boolean_list_allow_holes,
})
end
function export.head_t(frame)
local m_headword = require("Module:headword")
local function track(page)
require("Module:debug/track")("headword/templates/" .. page)
return true
end
local args = get_args(frame)
-- Get language and script information
local data = {}
data.lang = args[1]
data.sc = args["sc"]
data.sccat = args["sccat"]
data.sort_key = args["sort"]
data.heads = args["head"]
data.id = args["id"]
data.translits = args["tr"]
data.transcriptions = args["ts"]
data.gloss = args["gloss"]
data.genders = args["g"]
data.pagename = args.pagename
data.pagename = args.pagename
-- This shouldn't really happen.
for i = 1,args["head"].maxindex do
if not args["head"][i] then
track("head-with-holes")
end
end
for k, v in pairs(args["gqual"]) do
if k ~= "maxindex" then
if data.genders[k] then
data.genders[k] = {spec = data.genders[k], qualifiers = {v}}
else
k = k == 1 and "" or tostring(k)
error(("g%squal= specified without g%s="):format(k, k))
end
end
end
-- EXPERIMENTAL: see [[Wiktionary:Beer parlour/2024/June#Decluttering the altform mess]]
data.altform = args["altform"]
-- Part-of-speech category
local pos_category = args[2]
data.noposcat = args["noposcat"]
-- Check for headword aliases and then pluralize if the POS term does not have an invariable plural.
data.pos_category = m_headword.canonicalize_pos(pos_category)
-- Additional categories.
data.categories = {}
data.whole_page_categories = {}
data.nomultiwordcat = args["nomultiwordcat"]
data.nogendercat = args["nogendercat"]
data.nopalindromecat = args["nopalindromecat"]
if args["cat2"] then
insert(data.categories, data.lang:getFullName() .. " " .. args["cat2"])
end
if args["cat3"] then
insert(data.categories, data.lang:getFullName() .. " " .. args["cat3"])
end
if args["cat4"] then
insert(data.categories, data.lang:getFullName() .. " " .. args["cat4"])
end
-- Headword linking
data.nolinkhead = args["nolinkhead"]
-- Inflected forms
data.inflections = {enable_auto_translit = args["autotrinfl"]}
for i = 1, math.ceil(args[3].maxindex / 2) do
local infl_part = {
label = args[3][i * 2 - 1],
accel = args["faccel-form"][i] and {
form = args["faccel-form"][i],
translit = args["faccel-translit"][i],
lemma = args["faccel-lemma"][i],
lemma_translit = args["faccel-lemma-translit"][i],
gender = args["faccel-gender"][i],
nostore = args["faccel-nostore"][i],
} or nil,
request = args["frequest"][i],
enable_auto_translit = args["fautotr"][i],
}
local form = {
term = args[3][i * 2],
alt = args["falt"][i],
genders = args["fg"][i] and mw.text.split(args["fg"][i], ",") or {},
id = args["fid"][i],
lang = args["flang"][i],
nolinkinfl = args["fnolink"][i],
q = {args["fqual"][i]},
sc = args["fsc"][i],
translit = args["ftr"][i],
transcription = args["fts"][i],
}
-- If no term or alt is given, then the label is shown alone.
if form.term or form.alt then
insert(infl_part, form)
end
if infl_part.label == "or" then
-- Append to the previous inflection part, if one exists
if #infl_part > 0 and data.inflections[1] then
insert(data.inflections[#data.inflections], form)
end
elseif infl_part.label then
-- Add a new inflection part
insert(data.inflections, infl_part)
end
end
return m_headword.full_headword(data)
end
return export
7q8bwcmtluydlh9q2u3or79w9lje4pi
apple
0
620
36760
36579
2026-08-12T22:33:08Z
Ghybu
12
/* ئینگلیزی */
36760
wikitext
text/x-wiki
== ئینگلیزی ==
[[پەڕگە:Red Apple.jpg|thumb|A red '''apple''']]
[[پەڕگە:Granny Smith Apples.jpg|thumb|A green '''apple''']]
=== گۆکردن ===
* {{IPA|en|/ˈæp.əl/|[ˈæp.ɫ̩]}}
* {{دەنگ|en|en-us-apple.ogg}}
=== ناو ===
{{en-noun}}
# [[سێو]]
# [[دارسێو]]
d3vqv78g78ld34gbjefayoj5wypw332
blue
0
840
36804
36578
2026-08-13T11:47:48Z
Ghybu
12
/* ھاوەڵناو */ {{en-adj}} not work
36804
wikitext
text/x-wiki
== ئینگلیزی ==
[[پەڕگە:Blue wall.jpg|thumb]]
=== گۆکردن ===
* {{دەنگ|en|En-us-blue.ogg|ئەمریکی}}
* {{دەنگ|en|En-uk-blue.ogg|بەریتانی}}
* {{دەنگ|en|EN-AU ck1 blue.ogg|ئوسترالی}}
=== ھاوەڵناو ===
{{head|en|ھاوەڵناو}}
# [[شین]]
=== ناو ===
{{en-noun|~}}
# ڕەنگی [[شین]]
== سەرچاوەکان ==
* فەرھەنگی ڤەژین
* [https://dictionary.cambridge.org/ زانکۆی کامبرێج]
[[پۆل:ئینگلیزی]]
f9vvar4j2zkpnttmbe1z0hhqub9nsm9
görünüş
0
1614
36755
22830
2026-08-12T21:18:21Z
Ghybu
12
36755
wikitext
text/x-wiki
== تورکی ==
=== وشەڕەتناسی ===
{{واڵا}}
===ناو ===
{{head|tr|ناو{{
# بینی (رابردوو)
ef0z594oy9s2wkusgofwzc8tpu6rsjs
36756
36755
2026-08-12T21:18:57Z
Ghybu
12
/* تورکی */
36756
wikitext
text/x-wiki
== تورکی ==
=== وشەڕەتناسی ===
{{واڵا}}
===ناو ===
{{head|tr|ناو}}
# بینی (رابردوو)
mmflp73pmkry4nc9d8jkkqtz0fff69j
revision
0
2586
36795
22944
2026-08-13T01:22:52Z
Ghybu
12
36795
wikitext
text/x-wiki
== ئینگلیزی ==
=== وشەڕەتناسی ===
{{واڵا}}
=== ناو ===
{{en-noun|~}}
#پێداچوونەوە، پێداچوونەوە بۆ شتێک
=== سەرچاوەکان ===
* فەرھەنگی ڤەژین
* [https://dictionary.cambridge.org/ زانکۆی کامبرێج]
elykrxpq3qkei8dvgsu7l0glo9825zo
пожарный
0
3711
36789
28727
2026-08-13T01:02:41Z
Ghybu
12
/* ڕووسی */
36789
wikitext
text/x-wiki
== ڕووسی ==
=== وشەڕەتناسی ===
{{واڵا}}
=== ناو ===
{{head|ru|ناو}}
# ئۆتۆمبێلی ئاگر کوژێنەوە
[[پۆل:زمانی ڕووسی]]
5weii6kt10dugm82orbggu5376ethre
36790
36789
2026-08-13T01:02:54Z
Ghybu
12
36790
wikitext
text/x-wiki
== ڕووسی ==
=== وشەڕەتناسی ===
{{واڵا}}
=== ناو ===
{{head|ru|ناو}}
# ئۆتۆمبێلی ئاگر کوژێنەوە
eesabob3c8c5t4ja9rvzfwkf5r35nos
باوک
0
4741
36781
33743
2026-08-12T23:20:55Z
Ghybu
12
/* کوردیی ناوەندی */
36781
wikitext
text/x-wiki
== کوردیی ناوەندی ==
===وشەڕەتناسی===
{{واڵا}}
==== ناو ====
{{ckb-noun}}
# یەکێک لە [[باوان]] کە [[نێر]] بێت.
#: '''''باوکم''' ناوی ئیبراھیمە، منیش ناوم کەریمە.''
{{C|ckb|خێزان}}
[[پۆل:وشە چوار پیتییە کوردییەکان]]
nu77rtoj6td7frshqegfwt9eks4xeg7
خۆڵەڕێژ
0
5035
36786
31211
2026-08-13T00:26:06Z
Ghybu
12
/* کوردیی ناوەندی */
36786
wikitext
text/x-wiki
== کوردیی ناوەندی ==
===وشەڕەتناسی ===
{{واڵا}}
====ناو====
{{ckb-noun}}
# پارچە تەنەکە یان پلاستیکێکە کە بە [[گسک]] خۆڵوخشاکی تێ دەکرێت.
====ھاوماناکان====
{{واڵا}}
====وەرگێڕانەکان====
{{وەرگێڕان-سەر|ناو}}
* عەرەبی: {{t|ar|لقاطة}}
* فارسی: {{t|fa|خاکانداز}}
{{trans-mid}}
* ئینگلیزی: {{t+|en|dustpan}}
* ئیسپانی: {{t|es|recogedor}}
{{وەرگێڕان-بن}}
====سەرچاوەکان====
<references />
[[پۆل:وشە حەوت پیتییە کوردییەکان]]
g0w49b7hqom2o1azwm2ilqj1av6y3lj
مانگ
0
6047
36782
30333
2026-08-12T23:23:41Z
Ghybu
12
/* کوردیی ناوەندی */
36782
wikitext
text/x-wiki
== کوردیی ناوەندی ==
[[file:FullMoon2010.jpg|thumb|مانگ]]
=== ناو ===
{{ckb-noun}}
# مانگی دەستکردی [[زەوی]]. ئەستێرەژمێریدا ھێمای [[☽︎]] و[[☾]]ی بۆ دانراوە.
==== وەرگێڕانەکان ====
{{وەرگێڕان-سەر|میوەیە}}
* ئینگلیزی: {{t+|en|moon}}
* فەڕەنسی: {{t+|fr|lune|f}}
* عەرەبی: {{t+|ar|قمر}}
{{وەرگێڕان-بن}}
s7zyo6fxa4cs9whzv5lgl0ix7plici9
چاوشارکێ
0
6664
36778
32191
2026-08-12T23:01:33Z
Ghybu
12
/* کوردیی ناوەندی */
36778
wikitext
text/x-wiki
== کوردیی ناوەندی ==
===وشەڕەتناسی ===
{{واڵا}}
====ناو====
{{ckb-noun}}
یارییەکی منداڵانە کە لانی کەم دوو، سێ یان زیاتر ئەنجام دەدرێت، تێیدا یەکێک لە یاریکەرەکان چاوی دادەخات و لەو کاتەدا یاریکەرەکانی دیکە خۆیان دەشارنەوە.<ref>فەرهەنگی خاڵ</ref> یارییەکە کەلتوورێکی جیهانییە.
====ھاوماناکان====
* قەرەقەرە<ref>قەرەقەرە، هەنبانە بەرۆینە.</ref>
* خۆشاردنەوانێ
====وەرگێڕانەکان====
{{وەرگێڕان-سەر|یارییەکی منداڵانە کە لانی کەم دوو، سێ یان زیاتر ئەنجام دەدرێت. یارییەکە کەلتوورێکی جیهانییە}}
* عەرەبی: {{t|ar|غميضة}}
* فارسی: {{t+|fa|قایمموشک}}
{{trans-mid}}
* ئینگلیزی: {{t+|en|Hide-and-seek}}
{{وەرگێڕان-بن}}
== سەرچاوەکان ==
<references />
h9az3bdqok2dd5a6hoavrdlvt75swh8
36779
36778
2026-08-12T23:01:49Z
Ghybu
12
/* سەرچاوەکان */
36779
wikitext
text/x-wiki
== کوردیی ناوەندی ==
===وشەڕەتناسی ===
{{واڵا}}
====ناو====
{{ckb-noun}}
یارییەکی منداڵانە کە لانی کەم دوو، سێ یان زیاتر ئەنجام دەدرێت، تێیدا یەکێک لە یاریکەرەکان چاوی دادەخات و لەو کاتەدا یاریکەرەکانی دیکە خۆیان دەشارنەوە.<ref>فەرهەنگی خاڵ</ref> یارییەکە کەلتوورێکی جیهانییە.
====ھاوماناکان====
* قەرەقەرە<ref>قەرەقەرە، هەنبانە بەرۆینە.</ref>
* خۆشاردنەوانێ
====وەرگێڕانەکان====
{{وەرگێڕان-سەر|یارییەکی منداڵانە کە لانی کەم دوو، سێ یان زیاتر ئەنجام دەدرێت. یارییەکە کەلتوورێکی جیهانییە}}
* عەرەبی: {{t|ar|غميضة}}
* فارسی: {{t+|fa|قایمموشک}}
{{trans-mid}}
* ئینگلیزی: {{t+|en|Hide-and-seek}}
{{وەرگێڕان-بن}}
=== سەرچاوەکان ===
<references />
retgf802jp4q2jsou87k7xdzvh3at4t
36780
36779
2026-08-12T23:02:50Z
Ghybu
12
/* ناو */
36780
wikitext
text/x-wiki
== کوردیی ناوەندی ==
===وشەڕەتناسی ===
{{واڵا}}
====ناو====
{{ckb-noun}}
# یارییەکی منداڵانە کە لانی کەم دوو، سێ یان زیاتر ئەنجام دەدرێت، تێیدا یەکێک لە یاریکەرەکان چاوی دادەخات و لەو کاتەدا یاریکەرەکانی دیکە خۆیان دەشارنەوە.<ref>فەرهەنگی خاڵ</ref> یارییەکە کەلتوورێکی جیهانییە.
====ھاوماناکان====
* قەرەقەرە<ref>قەرەقەرە، هەنبانە بەرۆینە.</ref>
* خۆشاردنەوانێ
====وەرگێڕانەکان====
{{وەرگێڕان-سەر|یارییەکی منداڵانە کە لانی کەم دوو، سێ یان زیاتر ئەنجام دەدرێت. یارییەکە کەلتوورێکی جیهانییە}}
* عەرەبی: {{t|ar|غميضة}}
* فارسی: {{t+|fa|قایمموشک}}
{{trans-mid}}
* ئینگلیزی: {{t+|en|Hide-and-seek}}
{{وەرگێڕان-بن}}
=== سەرچاوەکان ===
<references />
0mjf7pu4h0rlc1b4ubr78x4cduvh6h7
ڕهمهزان
0
6728
36783
30331
2026-08-12T23:26:59Z
Ghybu
12
/* کوردیی ناوەندی */
36783
wikitext
text/x-wiki
== کوردیی ناوەندی ==
=== وشەڕەتناسی ===
{{واڵا}}
=== گۆکردن ===
* {{ckb-IPA}}
=== ناو ===
{{ckb-noun}}
# ?
==== وەرگێڕانەکان ====
{{وەرگێڕان-سەر|میوەیە}}
* عەرەبی: {{t+|ar|رمضان}}
{{وەرگێڕان-بن}}
phss2luc2tbbm0cyad2db0j9v9gv57e
ڕەمەزان
0
6794
36807
32304
2026-08-13T11:58:49Z
Ghybu
12
/* کوردیی ناوەندی */
36807
wikitext
text/x-wiki
== کوردیی ناوەندی ==
===وشەڕەتناسی ===
{{واڵا}}
====ناو====
{{ckb-noun}}
# نۆیەم مانگی [[ڕۆژژمێری کۆچی]]یە کە [[موسڵمانان]] تێیدا بە[[ڕۆژوو]] دەبن.
# [[جەژن]]ی ڕەمەزان، کە لە شەوی ٣٠ یان ٣١ی مانگی ڕەمەزان دەست پێ دەکات و سێ ڕۆژ دەخایەنێت.
# ناوێکی عەرەبیی کوڕانەیە.
====وەرگێڕانەکان====
{{وەرگێڕان-سەر|نۆیەم مانگی ڕۆژژمێری کۆچی}}
* عەرەبی: {{t|ar|رمضان}}
* فارسی: {{t+|fa|رمضان}}
{{trans-mid}}
* ئینگلیزی: {{t+|en|Ramadan}}
{{وەرگێڕان-بن}}
[[پۆل:وشە حەوت پیتییە کوردییەکان]]
p9th8piu8fe74laeg01w25nxt3v6yhq
پۆل:ئینگلیزی
14
7280
36788
29981
2026-08-13T00:51:21Z
Ghybu
12
ڕەوانەکەرەکەی بۆ [[پۆل:زمانی ئینگلیزی]] داندرا بوو لابرد
36788
wikitext
text/x-wiki
{{ڕەوانەکەری پۆل|زمانی ئینگلیزی}}
[[پۆل:ھەموو زمانەکان]]
dy9xi9twi6jt49iqjup8uyr40egzzmw
gund
0
7518
36785
36695
2026-08-13T00:11:08Z
Ghybu
12
/* کرمانجی */
36785
wikitext
text/x-wiki
== کرمانجی ==
=== ناو ===
{{kmr-noun|m}}
# [[دێ]]
p7poceeqpe0c79a3nxjup9xdof3pj0l
clothes
0
7593
36805
32653
2026-08-13T11:51:54Z
Ghybu
12
36805
wikitext
text/x-wiki
== کوردیی ناوەندی ==
=== ناو ===
{{en-noun|p}}
# [[جلوبەرگ]]
5hwvuah85eivl4k81gdn4iedlkw4d3x
لالیگا
0
8261
36754
32918
2026-08-12T21:17:37Z
Ghybu
12
36754
wikitext
text/x-wiki
== کوردیی ناوەندی ==
===وشەڕەتناسی ===
{{واڵا}}
=== ناو ===
{{ckb-noun}}
# خولی تۆپی پێی ئیسپانیایە ناسراو بە لا لیگا
ebiwsacr8fvqk7c3u2ad9t412bxpnhq
مۆدیوول:category tree/languages
828
9310
36758
35044
2026-08-12T22:27:12Z
Ghybu
12
lemmas => لەما
36758
Scribunto
text/plain
local new_title = mw.title.new
local ucfirst = require("Module:string utilities").ucfirst
local split = require("Module:string utilities").split
local raw_categories = {}
local raw_handlers = {}
local location_categories = {}
local m_languages = require("Module:languages")
local m_sc_getByCode = require("Module:scripts").getByCode
local m_table = require("Module:table")
local parse_utilities_module = "Module:parse utilities"
-- Load the location translation module
local location_translation = require("Module:category tree/location translation")
local concat = table.concat
local insert = table.insert
local reverse_ipairs = m_table.reverseIpairs
local serial_comma_join = m_table.serialCommaJoin
local size = m_table.size
local sorted_pairs = m_table.sortedPairs
local to_json = require("Module:JSON").toJSON
local Hang = m_sc_getByCode("Hang")
local Hani = m_sc_getByCode("Hani")
local Hira = m_sc_getByCode("Hira")
local Hrkt = m_sc_getByCode("Hrkt")
local Kana = m_sc_getByCode("Kana")
local function track(page)
-- [[Special:WhatLinksHere/Wiktionary:Tracking/category tree/languages/PAGE]]
return require("Module:debug/track")("category tree/languages/" .. page)
end
-- This handles language categories of the form e.g. [[:Category:French language]] and
-- [[:Category:British Sign Language]]; categories like [[:Category:Languages of Indonesia]]; categories like
-- [[:Category:English-based creole or pidgin languages]]; and categories like
-- [[:Category:English-based constructed languages]].
-----------------------------------------------------------------------------
-- --
-- RAW CATEGORIES --
-- --
-----------------------------------------------------------------------------
raw_categories["ھەموو زمانەکان"] = {
topright = "{{commonscat|Languages}}\n[[File:Languages world map-transparent background.svg|thumb|left|250px|نەخشەی جیھانیی سەرەتاییی بنەماڵەی زمانەکان]]",
description = "ئەم پۆلە سەرجەم پۆلی زمانەکانی سەر ویکیفەرھەنگی تێدایە.",
additional = "بەڵام مەرج نییە سەرجەم ئەو زمانانەی کە ویکیفەرھەنگ دەیانناسێت لێرەدا پۆلێکیان ھەبێت. پۆلگەلێک ھەن کە ھێشتا سەرنجی دەستکاریکەرانیان بەلادا نەچووە، " ..
"کە ھۆکارە سەرەکییەکەشی ئەوەیە سەرجەم بەکارھێنەرانی ویکیفەرھەنگ سەرجەم زمانەکانی ویکیفەرھەنگ نازانن. " ..
"بۆ تەواوی پێڕستەکە بڕوانە [[:en:Wiktionary:List of languages|ویکیفەرھەنگ:پێڕستی زمانەکان]].",
parents = {
"Fundamental",
},
}
raw_categories["ھەموو زمانە لەناوچووەکان"] = {
description = "ئەم پۆلە پۆلەکانی ھەموو [[زمانی لەناوچوو|زمانە لەناوچووەکانی]] سەر ویکیفەرھەنگ دەگرێتە خۆ",
additional = "ئەم پۆلەت لەگەڵ [[:پۆل:زمانە لەناوچووەکان]] لێ تێک نەچێ، کە پۆلێکی گشتگیرە بۆ ناوەکانی زمانە لەناوچووەکان بە زمانە دیاریکراوەکانی ترەوە (بۆ نموونە {{m+|de|Langobardisch}} بۆ زمانی کۆنی [[Lombardic]]).",
parents = {
"ھەموو زمانەکان",
},
}
raw_categories["زمانەکان بەپێی وڵات"] = {
topright = "{{commonscat|Languages by continent}}",
description = "ئەو پۆلانەی کە زمانەکان بەپێی وڵات دەکەنە گرووپ.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"ھەموو زمانەکان",
},
}
raw_categories["Language isolates"] = {
topright = "{{wikipedia|Language isolate}}\n{{commonscat|Language isolates}}",
description = "Languages with no known relatives.",
parents = {
{name = "Languages by family", sort = "*Isolates"},
{name = "All language families", sort = "Isolates"},
},
}
raw_categories["Languages not sorted into a location category"] = {
description = "Languages which do not specify (in their {{tl|auto cat}} call) the location(s) where they are spoken.",
additional = "This excludes constructed and reconstructed languages; as a result, all languages in this category explicitly specify their location as {{cd|UNKNOWN}}.",
parents = {
{name = "Requests"},
},
hidden = true,
}
-----------------------------------------------------------------------------
-- --
-- RAW HANDLERS --
-- --
-----------------------------------------------------------------------------
-- Given a category (without the "Category:" prefix), look up the page defining the category, find the call to
-- {{auto cat}} (if any), and return a table of its arguments. If the category page doesn't exist or doesn't have
-- an {{auto cat}} invocation, return nil.
--
-- FIXME: Duplicated in [[Module:category tree/lects]].
local function scrape_category_for_auto_cat_args(cat)
local cat_page = mw.title.new("Category:" .. cat)
if cat_page then
local contents = cat_page:getContent()
if contents then
local frame = mw.getCurrentFrame()
for template in require("Module:template parser").find_templates(contents) do
-- The template parser automatically handles redirects and canonicalizes them, so uses of {{autocat}}
-- will also be found.
if template:get_name() == "auto cat" then
return template:get_arguments()
end
end
end
end
return nil
end
local function link_location(location)
local location_no_the = location:match("^the (.*)$")
local bare_location = location_no_the or location
local location_link
local bare_location_parts = split(bare_location, ", ")
for i, part in ipairs(bare_location_parts) do
bare_location_parts[i] = ("[[%s]]"):format(part)
end
location_link = concat(bare_location_parts, ", ")
if location_no_the then
location_link = "the " .. location_link
end
return location_link
end
local function linkbox(lang, setwiki, setwikt, setsister, entryname)
local wiktionarylinks = {}
local canonicalName = lang:getCanonicalName()
local wikimediaLanguages = lang:getWikimediaLanguages()
local wikipediaArticle = setwiki or lang:getWikipediaArticle()
setsister = setsister and ucfirst(setsister) or nil
if setwikt then
track("setwikt")
if setwikt == "-" then
track("setwikt/hyphen")
end
end
if setwikt ~= "-" and wikimediaLanguages and wikimediaLanguages[1] then
for _, wikimedialang in ipairs(wikimediaLanguages) do
local check = new_title(wikimedialang:getCode() .. ":")
if check and check.isExternal then
insert(wiktionarylinks,
(wikimedialang:getCanonicalName() ~= canonicalName and "(''" .. wikimedialang:getCanonicalName() .. "'') " or "") ..
"'''[[:" .. wikimedialang:getCode() .. ":|" .. wikimedialang:getCode() .. ".wiktionary.org]]'''")
end
end
wiktionarylinks = concat(wiktionarylinks, "<br/>")
end
local wikt_plural = wikimediaLanguages[2] and "گەل" or ""
if #wiktionarylinks == 0 then
wiktionarylinks = "''نییە.''"
end
if setsister then
track("setsister")
if setsister == "-" then
track("setsister/hyphen")
else
setsister = "Category:" .. setsister
end
else
setsister = lang:getCommonsCategory() or "-"
end
return concat{
[=[<div class="wikitable" style="float: left; clear: right; margin: 0 1em 0.5em 0; width: 300px; padding: 5px;">
<div style="text-align: center; margin-bottom: 10px; margin-top: 5px">'''بەستەرەکانی زمانی ]=], canonicalName ,[=['''</div>
{| style="font-size: 90%"
|-
| style="vertical-align: top; height: 35px; border-bottom: 1px solid lightgray;" | [[File:Wikipedia-logo-v2.svg|35px|none|ویکیپیدیا]]
| style="border-bottom: 1px solid lightgray;" | '''ویکیپیدیای کوردیی ناوەندی''' وتارێکی ھەیە لەسەر:
<div style="padding: 5px 10px">]=], (setwiki == "-" and "''نییە.''" or "'''[[w:" .. wikipediaArticle .. "|" .. wikipediaArticle .. "]]'''"), [=[</div>
|-
| style="vertical-align: top; height: 35px; border-bottom: 1px solid lightgray;" | [[File:Wikimedia-logo.svg|35px|none|ویکیمیدیا کامنز]]
| style="border-bottom: 1px solid lightgray;" | '''ویکیمیدیا کامنز''' بەستەری پەیوەندیداری بە ناوەڕۆکی ]=], canonicalName, [=[ لە پڕۆژە خوشکەکان ھەیە:
<div style="padding: 5px 10px">]=], (setsister == "-" and "''نییە.''" or "'''[[commons:" .. setsister .. "|" .. setsister .. "]]'''"), [=[</div>
|-
| style="vertical-align: top; height: 35px; width: 40px; border-bottom: 1px solid lightgray;" | [[File:Wiktionary-logo-v2.svg|35px|none|ویکیفەرھەنگ]]
|style="border-bottom: 1px solid lightgray;" | '''چاپی ویکیفەرھەنگ''']=], wikt_plural, [=[ نووسراو بە ]=], canonicalName, [=[:
<div style="padding: 5px 10px">]=], wiktionarylinks, [=[</div>
|-
| style="vertical-align: top; height: 35px; border-bottom: 1px solid lightgray;" | [[File:Open book nae 02.svg|35px|none|سەروشە]]
| style="border-bottom: 1px solid lightgray;" | '''سەروشەی ویکیفەرھەنگ''' بۆ ناوی کوردیی زمانەکە:
<div style="padding: 5px 10px">''']=], require("Module:links").full_link({lang = m_languages.getByCode("ckb"), term = entryname or canonicalName}), [=['''</div>
|-
| style="vertical-align: top; height: 35px;" | [[File:Crystal kfind.png|35px|none|گرنگییەکان]]
|| '''سەرچاوەکانی ویکیفەرھەنگ''' بۆ ئەو دەستکاریکەرانەی بەشداری لە سەروشەکانی ]=], canonicalName, [=[ دەکەن:
<div style="padding: 5px 0">
* '''[[Wiktionary:]=], canonicalName, [=[ entry guidelines]]'''
* '''[[:Category:]=], canonicalName, [=[ reference templates|Reference templates]] ({{PAGESINCAT:]=], canonicalName, [=[ reference templates}})'''
* '''[[Appendix:]=], canonicalName, [=[ bibliography|Bibliography]]'''
|}
</div>]=]
}
end
local function edit_link(title, text)
return '<span class="plainlinks">['
.. tostring(mw.uri.fullUrl(title, { action = "edit" }))
.. ' ' .. text .. ']</span>'
end
-- Should perhaps use wiki syntax.
local function infobox(lang)
local ret = {}
insert(ret, '<table class="wikitable language-category-info"')
local raw_data = lang:getData("extra")
if raw_data then
local replacements = {
[1] = "canonical-name",
[2] = "wikidata-item",
[3] = "family",
[4] = "scripts",
}
local function replacer(letter1, letter2)
return letter1:lower() .. "-" .. letter2:lower()
end
-- For each key in the language data modules, returns a descriptive
-- kebab-case version (containing ASCII lowercase words separated
-- by hyphens).
local function kebab_case(key)
key = replacements[key] or key
key = key:gsub("(%l)(%u)", replacer):gsub("(%l)_(%l)", replacer)
return key
end
local compress = {compress = true}
local function html_attribute_encode(str)
str = to_json(str, compress)
:gsub('"', """)
-- & in attributes is automatically escaped.
-- :gsub("&", "&")
:gsub("<", "<")
:gsub(">", ">")
return str
end
insert(ret, ' data-code="' .. lang:getCode() .. '"')
for k, v in sorted_pairs(raw_data) do
insert(ret, " data-" .. kebab_case(k)
.. '="'
.. html_attribute_encode(v)
.. '"')
end
end
mw.log(lang:getDataModuleName());
insert(ret, '>\n')
insert(ret, '<tr class="language-category-data">\n<th colspan="2">'
.. edit_link(lang:getDataModuleName(), "دەستکاریی دراوەی زمان بکە")
.. "</th>\n</tr>\n")
insert(ret, "<tr>\n<th>ناوی ستاندارد</th><td>" .. lang:getCanonicalName() .. "</td>\n</tr>\n")
local otherNames = lang:getOtherNames()
if otherNames then
local names = {}
for _, name in ipairs(otherNames) do
insert(names, "<li>" .. name .. "</li>")
end
if #names > 0 then
insert(ret, "<tr>\n<th>ناوەکانی تر</th><td><ul>" .. concat(names, "\n") .. "</ul></td>\n</tr>\n")
end
end
local aliases = lang:getAliases()
if aliases then
local names = {}
for _, name in ipairs(aliases) do
insert(names, "<li>" .. name .. "</li>")
end
if #names > 0 then
insert(ret, "<tr>\n<th>ناوگەلی تر</th><td><ul>" .. concat(names, "\n") .. "</ul></td>\n</tr>\n")
end
end
local varieties = lang:getVarieties()
if varieties then
local names = {}
for _, name in ipairs(varieties) do
if type(name) == "string" then
insert(names, "<li>" .. name .. "</li>")
else
assert(type(name) == "table")
local first_var
local subvars = {}
for i, var in ipairs(name) do
if i == 1 then
first_var = var
else
insert(subvars, "<li>" .. var .. "</li>")
end
end
if #subvars > 0 then
insert(names, "<li><dl><dt>" .. first_var .. "</dt>\n<dd><ul>" .. concat(subvars, "\n") .. "</ul></dd></dl></li>")
elseif first_var then
insert(names, "<li>" .. first_var .. "</li>")
end
end
end
if #names > 0 then
insert(ret, "<tr>\n<th>Varieties</th><td><ul>" .. concat(names, "\n") .. "</ul></td>\n</tr>\n")
end
end
insert(ret, "<tr>\n<th>[[ویکیفەرھەنگ:زمانەکان|کۆدی زمان]]</th><td><code>" .. lang:getCode() .. "</code></td>\n</tr>\n")
insert(ret, "<tr>\n<th>[[ویکیفەرھەنگ:خێزانەکان|خێزانی زمان]]</th>\n")
local fam = lang:getFamily()
local famCode = fam and fam:getCode()
if not fam then
insert(ret, "<td>unclassified</td>")
elseif famCode == "qfa-iso" then
insert(ret, "<td>[[:Category:Language isolates|language isolate]]</td>")
elseif famCode == "qfa-mix" then
insert(ret, "<td>[[:Category:Mixed languages|mixed language]]</td>")
elseif famCode == "sgn" then
insert(ret, "<td>[[:Category:Sign languages|sign language]]</td>")
elseif famCode == "crp" then
insert(ret, "<td>[[:Category:Creole or pidgin languages|creole or pidgin]]</td>")
elseif famCode == "art" then
insert(ret, "<td>[[:Category:Constructed languages|constructed language]]</td>")
else
insert(ret, "<td>" .. fam:makeCategoryLink() .. "</td>")
end
insert(ret, "\n</tr>\n<tr>\n<th>باووباپیران</th>\n")
local ancestors = lang:getAncestors()
if ancestors[2] then
local ancestorList = {}
for i, anc in ipairs(ancestors) do
ancestorList[i] = "<li>" .. anc:makeCategoryLink() .. "</li>"
end
insert(ret, "<ul>\n" .. concat(ancestorList, "\n") .. "</ul>")
else
local ancestorChain = lang:getAncestorChainOld()
if ancestorChain[1] then
local chain = {}
for _, anc in reverse_ipairs(ancestorChain) do
insert(chain, "<li>" .. anc:makeCategoryLink() .. "</li>")
end
insert(ret, "<ul>\n" .. concat(chain, "\n<ul>\n") .. ("</ul>"):rep(#chain))
else
insert(ret, "unknown")
end
end
insert(ret, "</td>\n</tr>\n")
local scripts = lang:getScripts()
if scripts[1] then
local script_text = {}
local function makeScriptLine(sc)
local code = sc:getCode()
local url = tostring(mw.uri.fullUrl('Special:Search', {
search = 'contentmodel:css insource:"' .. code
.. '" insource:/\\.' .. code .. '/',
ns8 = '1'
}))
return sc:makeCategoryLink()
.. ' (<span class="plainlinks" title="Search for stylesheets referencing this script">[' .. url .. ' <code>' .. code .. '</code>]</span>)'
end
local function add_Hrkt(text)
insert(text, "<li>" .. makeScriptLine(Hrkt))
insert(text, "<ul>")
insert(text, "<li>" .. makeScriptLine(Hira) .. "</li>")
insert(text, "<li>" .. makeScriptLine(Kana) .. "</li>")
insert(text, "</ul>")
insert(text, "</li>")
end
for _, sc in ipairs(scripts) do
local text = {}
local code = sc:getCode()
if code == "Hrkt" then
add_Hrkt(text)
else
insert(text, "<li>" .. makeScriptLine(sc))
if code == "Jpan" then
insert(text, "<ul>")
insert(text, "<li>" .. makeScriptLine(Hani) .. "</li>")
add_Hrkt(text)
insert(text, "</ul>")
elseif code == "Kore" then
insert(text, "<ul>")
insert(text, "<li>" .. makeScriptLine(Hang) .. "</li>")
insert(text, "<li>" .. makeScriptLine(Hani) .. "</li>")
insert(text, "</ul>")
end
insert(text, "</li>")
end
insert(script_text, concat(text, "\n"))
end
insert(ret, "<tr>\n<th>[[ویکیفەرھەنگ:سکریپتەکان|سکریپتەکان]]</th>\n<td><ul>\n" .. concat(script_text, "\n") .. "</ul></td>\n</tr>\n")
else
insert(ret, "<tr>\n<th>[[ویکیفەرھەنگ:سکریپتەکان|سکریپتەکان]]</th>\n<td>دیاری نەکراوە</td>\n</tr>\n")
end
local function add_module_info(raw_data, heading)
if raw_data then
local scripts = lang:getScriptCodes()
local module_info, add = {}, false
if type(raw_data) == "string" then
insert(module_info,
("[[Module:%s]]"):format(raw_data))
add = true
else
local raw_data_type = type(raw_data)
if raw_data_type == "table" and size(scripts) == 1 and type(raw_data[scripts[1]]) == "string" then
insert(module_info,
("[[Module:%s]]"):format(raw_data[scripts[1]]))
add = true
elseif raw_data_type == "table" then
insert(module_info, "<ul>")
for script, data in sorted_pairs(raw_data) do
if type(data) == "string" and m_sc_getByCode(script) then
insert(module_info, ("<li><code>%s</code>: [[Module:%s]]</li>"):format(script, data))
end
end
insert(module_info, "</ul>")
add = size(module_info) > 2
end
end
if add then
insert(ret, [=[
<tr>
<th>]=] .. heading .. [=[</th>
<td>]=] .. concat(module_info) .. [=[</td>
</tr>
]=])
end
end
end
add_module_info(raw_data.generate_forms, "مۆدیوولی<br>دروستکردنی شێوە")
add_module_info(raw_data.translit, "[[:en:Wiktionary:Transliteration and romanization|مۆدیوولی<br>پیتنووسی]]")
add_module_info(raw_data.display_text, "مۆدیوولی<br>دەقی پیشاندان")
add_module_info(raw_data.entry_name, "مۆدیوولی<br>ناوی سەروشە")
add_module_info(raw_data.sort_key, "مۆدیوولی<br>[[sortkey|ڕیزکردن]]")
local wikidataItem = lang:getWikidataItem()
if lang:getWikidataItem() and mw.wikibase then
local URL = mw.wikibase.getEntityUrl(wikidataItem)
local link
if URL then
link = '[' .. URL .. ' ' .. wikidataItem .. ']'
else
link = '<span class="error">بەندی ویکیدراوەی نادروست: <code>' .. wikidataItem .. '</code></span>'
end
insert(ret, "<tr><th>ویکیدراوە</th><td>" .. link .. "</td></tr>")
end
insert(ret, "</table>")
return concat(ret)
end
local function NavFrame(content, title)
return '<div class="NavFrame"><div class="NavHead">'
.. (title or '{{{title}}}') .. '</div>'
.. '<div class="NavContent" style="text-align: right;">'
.. content
.. '</div></div>'
end
local function get_description_topright_additional(lang, locations, extinct, setwiki, setwikt, setsister, entryname)
local nameWithLanguage = lang:getCategoryName("nocap")
if lang:getCode() == "und" then
local description =
"This is the main category of the '''" .. nameWithLanguage .. "''', represented in Wiktionary by the [[Wiktionary:Languages|code]] '''" .. lang:getCode() .. "'''. " ..
"This language contains terms in historical writing, whose meaning has not yet been determined by scholars."
return description, nil, nil
end
local canonicalName = lang:getCanonicalName()
local topright = linkbox(lang, setwiki, setwikt, setsister, entryname)
local the_prefix
if canonicalName:find("^زمانی ") then
the_prefix = ""
else
the_prefix = "the "
end
local description = "ئەمە پۆلی سەرەکیی " .. "'''" .. nameWithLanguage .. "یە'''."
local location_links = {}
local prep
local saw_embedded_comma = false
for _, location in ipairs(locations) do
local this_prep
if location == "the world" then
this_prep = "across"
insert(location_links, location)
elseif location ~= "UNKNOWN" then
this_prep = "" -- Removed "لە" > Test page: [[پۆل:زمانی بوریاتی]]
if location:find(",") then
saw_embedded_comma = true
end
insert(location_links, link_location(location))
end
if this_prep then
if prep and this_prep ~= prep then
error("Can't handle location 'the world' along with another location (clashing prepositions)")
end
prep = this_prep
end
end
local location_desc
if #location_links > 0 then
local location_link_text
if saw_embedded_comma and #location_links >= 3 then
location_link_text = mw.text.listToText(location_links, "; ", "; and ")
else
location_link_text = serial_comma_join(location_links)
end
location_desc = ("لە %s %s %s.\n\n"):format(
location_link_text, prep, extinct and "an [[extinct language]] that was formerly spoken" or "قسەی پێ دەکرێت")
elseif extinct then
location_desc = "[[زمانی لەناوچوو|زمانێکی لەناوچووە]].\n\n"
else
location_desc = ""
end
local add = location_desc .. "زانیاری لەسەر " .. canonicalName .. ":\n\n" .. infobox(lang)
if lang:hasType("reconstructed") then
add = add .. "\n\n" ..
ucfirst(canonicalName) .. " is a reconstructed language. Its words and roots are not directly attested in any written works, but have been reconstructed through the ''comparative method'', " ..
"which finds regular similarities between languages that cannot be explained by coincidence or word-borrowing, and extrapolates ancient forms from these similarities.\n\n" ..
"According to our [[Wiktionary:Criteria for inclusion|criteria for inclusion]], terms in " .. canonicalName ..
" should '''not''' be present in entries in the main namespace, but may be added to the Reconstruction: namespace."
elseif lang:hasType("appendix-constructed") then
add = add .. "\n\n" ..
ucfirst(canonicalName) .. " is a constructed language that is only in sporadic use. " ..
"According to our [[Wiktionary:Criteria for inclusion|criteria for inclusion]], terms in " .. canonicalName ..
" should '''not''' be present in entries in the main namespace, but may be added to the Appendix: namespace. " ..
"All terms in this language may be available at [[Appendix:" .. ucfirst(canonicalName) .. "]]."
end
local about = new_title("Wiktionary:About " .. canonicalName)
if about.exists then
add = add .. "\n\n" ..
"Please see '''[[Wiktionary:About " .. canonicalName .. "]]''' for information and special considerations for creating " .. nameWithLanguage .. " entries."
end
local ok, tree_of_descendants = pcall(
require("Module:family tree").print_children,
lang:getCode(), {
protolanguage_under_family = true,
must_have_descendants = true
})
if ok then
if tree_of_descendants then
add = add .. NavFrame(
tree_of_descendants,
"Family tree")
else
add = add .. "\n\n" .. ucfirst(lang:getCanonicalName())
.. " has no descendants or varieties listed in Wiktionary's language data modules."
end
else
mw.log("error while generating tree: " .. tostring(tree_of_descendants))
end
return description, topright, add
end
local function get_parents(lang, locations, extinct)
local canonicalName = lang:getCanonicalName()
local sortkey = {sort_base = canonicalName, lang = "en"}
local ret = {{name = "ھەموو زمانەکان", sort = sortkey}}
local fam = lang:getFamily()
local famCode = fam and fam:getCode()
-- FIXME: Some of the following categories should be added to this module.
if not fam then
insert(ret, {name = "Category:Unclassified languages", sort = sortkey})
elseif famCode == "qfa-iso" then
insert(ret, {name = "Category:Language isolates", sort = sortkey})
elseif famCode == "qfa-mix" then
insert(ret, {name = "Category:Mixed languages", sort = sortkey})
elseif famCode == "sgn" then
insert(ret, {name = "Category:All sign languages", sort = sortkey})
elseif famCode == "crp" then
insert(ret, {name = "Category:Creole or pidgin languages", sort = sortkey})
for _, anc in ipairs(lang:getAncestors()) do
-- Avoid Haitian Creole being categorised in [[:Category:Haitian Creole-based creole or pidgin languages]], as one of its ancestors is an etymology-only variety of it.
-- Use that ancestor's ancestors instead.
if anc:getFullCode() == lang:getCode() then
for _, anc_extra in ipairs(anc:getAncestors()) do
insert(ret, {name = "Category:" .. ucfirst(anc_extra:getFullName()) .. "-based creole or pidgin languages", sort = sortkey})
end
else
insert(ret, {name = "Category:" .. ucfirst(anc:getFullName()) .. "-based creole or pidgin languages", sort = sortkey})
end
end
elseif famCode == "art" then
if lang:hasType("appendix-constructed") then
insert(ret, {name = "Category:Appendix-only constructed languages", sort = sortkey})
else
insert(ret, {name = "Category:Constructed languages", sort = sortkey})
end
for _, anc in ipairs(lang:getAncestors()) do
if anc:getFullCode() == lang:getCode() then
for _, anc_extra in ipairs(anc:getAncestors()) do
insert(ret, {name = "Category:" .. ucfirst(anc_extra:getFullName()) .. "-based constructed languages", sort = sortkey})
end
else
insert(ret, {name = "Category:" .. ucfirst(anc:getFullName()) .. "-based constructed languages", sort = sortkey})
end
end
else
insert(ret, {name = "Category:" .. fam:getCategoryName(), sort = sortkey})
if lang:hasType("reconstructed") then
insert(ret, {
name = "Category:Reconstructed languages",
sort = {sort_base = canonicalName:gsub("^Proto%-", ""), lang = "en"}
})
end
end
local function add_sc_cat(sc)
insert(ret, {name = "Category:زمانەکانی " .. sc:getCategoryName(), sort = sortkey})
end
local function add_Hrkt()
add_sc_cat(Hrkt)
add_sc_cat(Hira)
add_sc_cat(Kana)
end
for _, sc in ipairs(lang:getScripts()) do
if sc:getCode() == "Hrkt" then
add_Hrkt()
else
add_sc_cat(sc)
if sc:getCode() == "Jpan" then
add_sc_cat(Hani)
add_Hrkt()
elseif sc:getCode() == "Kore" then
add_sc_cat(Hang)
add_sc_cat(Hani)
end
end
end
if lang:hasTranslit() then
insert(ret, {name = "Category:Languages with automatic transliteration", sort = sortkey})
end
local function insert_location_language_cat(location)
local cat = "زمانەکانی " .. location
insert(ret, {name = "Category:" .. cat, sort = sortkey})
local auto_cat_args = scrape_category_for_auto_cat_args(cat)
local location_parent = auto_cat_args and auto_cat_args.parent
if location_parent then
local split_parents = require(parse_utilities_module).split_on_comma(location_parent)
for _, parent in ipairs(split_parents) do
parent = parent:match("^(.-):.*$") or parent
insert_location_language_cat(parent)
end
end
end
local saw_location = false
for _, location in ipairs(locations) do
if location ~= "UNKNOWN" then
saw_location = true
insert_location_language_cat(location)
end
end
if extinct then
insert(ret, {name = "Category:ھەموو زمانە لەناوچووەکان", sort = sortkey})
end
if not saw_location and not (lang:hasType("reconstructed") or (fam and fam:getCode() == "art")) then
-- Constructed and reconstructed languages don't need a location specified and often won't have one,
-- so don't put them in this maintenance category.
insert(ret, {name = "Category:Languages not sorted into a location category", sort = sortkey})
end
return ret
end
local function get_children()
local ret = {}
-- FIXME: We should work on the children mechanism so it isn't necessary to manually specify these.
for _, label in ipairs({"appendices", "ڕاگرتنی سەروشە", "لەما", "names", "phrases", "rhymes", "symbols", "templates", "terms by etymology", "terms by usage"}) do
insert(ret, {name = label, is_label = true})
end
insert(ret, {name = "terms derived from {{{langname}}}", is_label = true, lang = false})
insert(ret, {name = "{{{langcode}}}:ھەموو بابەتەکان", sort = "ھەموو بابەتەکان"})
insert(ret, {name = "Varieties of {{{langname}}}"})
insert(ret, {name = "Requests concerning {{{langname}}}"})
insert(ret, {name = "Rhymes:{{{langname}}}", description = "Lists of {{{langname}}} words by their rhymes."})
insert(ret, {name = "User {{{langcode}}}", description = "Wiktionary users categorized by fluency levels in {{{langdisp}}}."})
return ret
end
-- Handle language categories of the form e.g. [[:Category:French language]] and
-- [[:Category:British Sign Language]].
insert(raw_handlers, function(data)
local category = data.category
if not (category:match("^زمانی ") or category:match("[Ll]ect$")) then
return nil
end
local lang = m_languages.getByCanonicalName(category)
if not lang then
local langname = category:match("^زمانی (.*)$")
if langname then
lang = m_languages.getByCanonicalName(langname)
end
if not lang then
return nil
end
end
local args = require("Module:parameters").process(data.args, {
[1] = {list = true},
["setwiki"] = true,
["setwikt"] = true,
["setsister"] = true,
["entryname"] = true,
["extinct"] = {type = "boolean"},
})
-- If called from inside, don't require any arguments, as they can't be known
-- in general and aren't needed just to generate the first parent (used for
-- breadcrumbs).
if #args[1] == 0 and not data.called_from_inside then
-- At least one location must be specified unless the language is constructed (e.g. Esperanto) or reconstructed (e.g. Proto-Indo-European).
local fam = lang:getFamily()
if not (lang:hasType("reconstructed") or (fam and fam:getCode() == "art")) then
error("At least one location (param 1=) must be specified for language '" .. lang:getCanonicalName() .. "' (code '" .. lang:getCode() .. "'). " ..
"Use the value UNKNOWN if the language's location is truly unknown.")
end
end
local description, topright, additional = "", "", ""
-- If called from inside the category tree system, it's called when generating
-- parents or children, and we don't need to generate the description or additional
-- text (which is very expensive in terms of memory because it calls [[Module:family tree]],
-- which calls [[Module:languages/data/all]]).
if not data.called_from_inside then
description, topright, additional = get_description_topright_additional(
lang, args[1], args.extinct, args.setwiki, args.setwikt, args.setsister, args.entryname
)
end
return {
canonical_name = lang:getCategoryName(),
description = description,
lang = lang:getCode(),
topright = topright,
additional = additional,
breadcrumb = lang:getCanonicalName(),
parents = get_parents(lang, args[1], args.extinct),
extra_children = get_children(lang),
umbrella = false,
can_be_empty = true,
}, true
end)
-- Handle categories such as [[:Category:Languages of Indonesia]].
insert(raw_handlers, function(data)
local location = data.category:match("^زمانەکانی (.*)$")
if location then
local args = require("Module:parameters").process(data.args, {
["flagfile"] = true,
["commonscat"] = true,
["wp"] = true,
["basename"] = true,
["parent"] = true,
["locationcat"] = true,
["locationlink"] = true,
})
local topright
local basename = args.basename or location:gsub(", .*", "")
-- Attempt to get translated name; fallback to original if missing.
-- This ensures flags use translated names when available.
local translated_basename = location_translation[basename] or basename
-- If translation is missing, log and categorize for tracking.
if translated_basename == basename then
table.insert(location_categories, "[[Category:Categories where the location translation is not recorded]]")
mw.log("Translation not found for location basename: " .. basename)
end
if args.flagfile ~= "-" then
local flagfile_arg = args.flagfile or ("Flag of %s.svg"):format(translated_basename)
local files = require(parse_utilities_module).split_on_comma(flagfile_arg)
local topright_parts = {}
for _, file in ipairs(files) do
local flagfile = "File:" .. file
local flagfile_page = new_title(flagfile)
if flagfile_page and flagfile_page.file.exists then
insert(topright_parts, ("[[%s|left|100px|border]]"):format(flagfile))
elseif args.flagfile then
error(("Explicit flagfile '%s' doesn't exist"):format(flagfile))
end
end
topright = concat(topright_parts)
end
if args.wp then
local wp = require("Module:yesno")(args.wp, "+")
if wp == "+" or wp == true then
wp = data.category
end
if wp then
local wp_topright = ("{{wikipedia|%s}}"):format(wp)
if topright then
topright = topright .. wp_topright
else
topright = wp_topright
end
end
end
if args.commonscat then
local commonscat = require("Module:yesno")(args.commonscat, "+")
if commonscat == "+" or commonscat == true then
commonscat = data.category
end
if commonscat then
local commons_topright = ("{{commonscat|%s}}"):format(commonscat)
if topright then
topright = topright .. commons_topright
else
topright = commons_topright
end
end
end
local bare_location = location:match("^the (.*)$") or location
local location_link = args.locationlink or link_location(location)
local bare_basename = basename:match("^the (.*)$") or basename
local parents = {}
if args.parent then
local explicit_parents = require(parse_utilities_module).split_on_comma(args.parent)
for i, parent in ipairs(explicit_parents) do
local actual_parent, sort_key = parent:match("^(.-):(.*)$")
if actual_parent then
parent = actual_parent
sort_key = sort_key:gsub("%+", bare_location)
else
sort_key = " " .. bare_location
end
insert(parents, {name = "زمانەکانی " .. parent, sort = sort_key})
end
else
insert(parents, {name = "زمانەکان بەپێی وڵات", sort = {sort_base = bare_location, lang = "en"}})
end
if args.locationcat then
local explicit_location_cats = require(parse_utilities_module).split_on_comma(args.locationcat)
for i, locationcat in ipairs(explicit_location_cats) do
insert(parents, {name = "Category:" .. locationcat, sort = " Languages"})
end
else
local location_cat = ("Category:%s"):format(bare_location)
local location_page = new_title(location_cat)
if location_page and location_page.exists then
insert(parents, {name = location_cat, sort = "زمانەکان"})
end
end
local description = ("پۆلەکانی زمانەکانی %s (بە زار و بنزار و کەمینەکانیشەوە)."):format(location_link)
return {
topright = topright,
description = description,
parents = parents,
breadcrumb = bare_basename,
additional = "{{{umbrella_msg}}}",
}, true
end
end)
-- Handle categories such as [[:Category:English-based creole or pidgin languages]].
insert(raw_handlers, function(data)
local langname = data.category:match("(.*)%-based creole or pidgin languages$")
if langname then
local lang = m_languages.getByCanonicalName(langname)
if lang then
return {
lang = lang:getCode(),
description = "Languages which developed as a [[creole]] or [[pidgin]] from " .. lang:makeCategoryLink() .. ".",
parents = {{name = "Creole or pidgin languages", sort = {sort_base = "*" .. langname, lang = "en"}}},
breadcrumb = lang:getCanonicalName() .. "-based",
}
end
end
end)
-- Handle categories such as [[:Category:English-based constructed languages]].
insert(raw_handlers, function(data)
local langname = data.category:match("(.*)%-based constructed languages$")
if langname then
local lang = m_languages.getByCanonicalName(langname)
if lang then
return {
lang = lang:getCode(),
description = "Constructed languages which are based on " .. lang:makeCategoryLink() .. ".",
parents = {{name = "Constructed languages", sort = {sort_base = "*" .. langname, lang = "en"}}},
breadcrumb = lang:getCanonicalName() .. "-based",
}
end
end
end)
return {RAW_CATEGORIES = raw_categories, RAW_HANDLERS = raw_handlers, LOCATION_CATEGORIES = location_categories}
n7sdteo87025rrknnlkzu93ipcds0w1
مۆدیوول:category tree/lemmas
828
9311
36747
36739
2026-08-12T20:41:19Z
Ghybu
12
36747
Scribunto
text/plain
local labels = {}
local raw_categories = {}
local handlers = {}
-----------------------------------------------------------------------------
-- --
-- LABELS --
-- --
-----------------------------------------------------------------------------
local diminutive_augmentative_poses = {
"adjectives",
"adverbs",
"interjections",
"nouns",
"numerals",
"prefixes",
"proper nouns",
"pronouns",
"suffixes",
"verbs"
}
labels["لەما"] = {
description = "{{{langname}}} [[Wiktionary:Lemmas|lemmas]], categorized by their part of speech.",
umbrella_parents = "Fundamental",
parents = {{name = "{{{langcat}}}", raw = true, sort = " "}},
}
labels["abstract verbs"] = {
description = "{{{langname}}} abstract verbs of motion whose motion is multidirectional (as opposed to unidirectional) or indirect, or whose action is repeated or in a series, instead of being a single, completed action. Abstract verbs are always imperfective in aspect, even with prefixes that are normally associated with the perfective aspect.",
additional = "See also [[abstract verb]].",
parents = {"کار"},
}
labels["action nouns"] = {
description = "{{{langname}}} nouns denoting action of a verb or verbal root that it is derived from.",
parents = {"ناو"},
}
labels["act-related adverbs"] = {
description = "{{{langname}}} adverbs that indicate the motive or other background information for an action.",
parents = {"adverbs"},
}
labels["active verbs"] = {
description = "{{{langname}}} verbs that indicate an activity",
parents = {"کار"},
}
labels["adjective concords"] = {
description = "{{{langname}}} concords that are prefixed to adjective stems.",
parents = {"concords"},
}
labels["ھاوەڵناو"] = {
description = "{{{langname}}} terms that give attributes to nouns, extending their definitions.",
parents = {"لەما"},
}
labels["adverbial accusatives"] = {
description = "Accusative case-forms in {{{langname}}} used as adverbs.",
parents = {"adverbs"},
}
labels["adverbs"] = {
description = "{{{langname}}} terms that modify clauses, sentences and phrases directly.",
parents = {"لەما"},
}
labels["affixes"] = {
description = "Morphemes attached to existing {{{langname}}} words.",
parents = {"morphemes"},
}
labels["agent nouns"] = {
description = "{{{langname}}} nouns that denote an agent that performs the action denoted by the verb from which the noun is derived.",
parents = {"ناو"},
}
labels["ambipositions"] = {
description = "{{{langname}}} adpositions that can occur either before or after their objects.",
parents = {"لەما"},
}
labels["ambitransitive verbs"] = {
description = "{{{langname}}} verbs that may or may not direct actions, occurrences or states to grammatical objects.",
parents = {"verbs", "transitive verbs", "intransitive verbs"},
}
labels["animal commands"] = {
description = "{{{langname}}} words used to communicate with animals.",
parents = {"interjections"},
}
labels["articles"] = {
description = "{{{langname}}} terms that indicate and specify nouns.",
parents = {"determiners"},
}
labels["aspect adverbs"] = {
description = "{{{langname}}} adverbs that express [[w:Grammatical aspect|grammatical aspect]], describing the flow of time in relation to a statement.",
parents = {"adverbs"},
}
for _, pos in ipairs(diminutive_augmentative_poses) do
labels["augmentative " .. pos] = {
description = "{{{langname}}} " .. pos .. " that are derived from a base word to convey big size or big intensity.",
parents = {pos},
}
end
labels["attenuative verbs"] = {
description = "{{{langname}}} verbs that indicate that an action or event is performed or takes place gently, lightly, partially, perfunctorily or to an otherwise reduced extent.",
parents = {"کار"},
}
labels["autobenefactive verbs"] = {
description = "{{{langname}}} verbs that indicate that the agent of an action is also its benefactor.",
parents = {"کار"},
}
labels["automative verbs"] = {
description = "{{{langname}}} verbs that indicate actions directed at or a change of state of the grammatical subject.",
parents = {"کار"},
}
labels["auxiliary verbs"] = {
description = "{{{langname}}} verbs that provide additional conjugations for other verbs.",
parents = {"کار"},
}
labels["biaspectual verbs"] = {
description = "{{{langname}}} verbs that can be both imperfective and perfective.",
parents = {"کار"},
}
labels["causative verbs"] = {
description = "{{{langname}}} verbs that express causing actions or states rather than performing or being them directly. Use this only for separate verbs (as opposed to causative forms that are part of the inflection of verbs).",
parents = {"کار"},
}
labels["circumfixes"] = {
description = "Affixes attached to both the beginning and the end of {{{langname}}} words, functioning together as single units.",
parents = {"morphemes"},
}
labels["circumpositions"] = {
description = "{{{langname}}} adpositions that appear on both sides of their objects.",
parents = {"لەما"},
}
labels["classifiers"] = {
description = "{{{langname}}} terms that classify nouns according to their meanings.",
parents = {"لەما"},
}
labels["clitics"] = {
description = "{{{langname}}} morphemes that function as independent words, but are always attached to another word.",
parents = {"morphemes"},
}
for _, pos in ipairs { "nouns", "suffixes" } do
labels["collective " .. pos] = {
description = "{{{langname}}} " .. pos .. " that indicate groups of related things or beings, without the need of grammatical pluralization.",
parents = {pos},
}
end
labels["combining forms"] = {
description = "Forms of {{{langname}}} words that do not occur independently, but are used when joined with other words.",
parents = {"morphemes"},
}
labels["comparable adjectives"] = {
description = "{{{langname}}} adjectives that can be inflected to display different degrees of comparison.",
parents = {"ھاوەڵناو"},
}
labels["comparable adverbs"] = {
description = "{{{langname}}} adverbs that can be inflected to display different degrees of comparison.",
parents = {"adverbs"},
}
labels["comparative-only adjectives"] = {
description = "{{{langname}}} adjectives that are only used in their comparative forms.",
parents = {"ھاوەڵناو"},
}
labels["completive verbs"] = {
description = "{{{langname}}} verbs which refer to the completion of an action which has already commenced or which has already been performed upon a subset of the entities which it affects.",
parents = {"کار"},
}
labels["concords"] = {
description = "{{{langname}}} prefixes attached to words to show agreement with a noun or pronoun.",
parents = {"prefixes"},
}
labels["concrete verbs"] = {
description = "{{{langname}}} concrete verbs refer to a verbal aspect in verbs of motion that is unidirectional (as opposed to multidirectional), a definitely directed motion, or a single, completed action (instead of a repeated action or series of actions). Concrete verbs may be either imperfective or perfective.",
additional = "See also [[concrete verb]].",
parents = {"کار"},
}
labels["conjunctions"] = {
description = "{{{langname}}} terms that connect words, phrases or clauses together.",
parents = {"لەما"},
}
labels["conjunctive adverbs"] = {
description = "{{{langname}}} adverbs that connect two independent clauses together.",
parents = {"adverbs"},
}
labels["continuative verbs"] = {
description = "{{{langname}}} verbs that express continuing action.",
parents = {"کار"},
}
labels["control verbs"] = {
description = "{{{langname}}} verbs that take multiple arguments, one of which is another verb. One of the control verb's arguments is syntactically both an argument of the control verb and an argument of the other verb.",
parents = {"کار"},
}
labels["cooperative verbs"] = {
description = "{{{langname}}} verbs that indicate cooperation",
parents = {"کار"},
}
labels["coordinating conjunctions"] = {
description = "{{{langname}}} conjunctions that indicate equal syntactic importance between connected items.",
parents = {"conjunctions"},
}
labels["copulative verbs"] = {
description = "{{{langname}}} verbs that may take adjectives as their complement.",
parents = {"کار"},
}
labels["ناوە ژماردەنییەکان"] = {
description = "ناوە ژماردەنییە {{{langname}}}یەکان کە دەتوانرێت ڕاستەوخۆ بە ژمارەیی بپێورێت.",
parents = {"ناوەکان"},
}
labels["ناوە تایبەتەکان"] = {
description = "ناوە تایبەتە {{{langname}}}یەکان کە دەتوانرێت ڕاستەوخۆ بە ژمارەیی بپێورێت.",
parents = {"ناوەکان"},
}
labels["countable numerals"] = {
description = "{{{langname}}} numerals that can be quantified directly by other numerals.",
parents = {"numerals"},
}
labels["countable suffixes"] = {
description = "{{{langname}}} suffixes that can be used to form nouns that can be quantified directly by numerals.",
parents = {"numerals"},
}
labels["counters"] = {
description = "{{{langname}}} terms that combine with numerals to express quantity of nouns.",
parents = {"لەما"},
}
labels["cumulative verbs"] = {
description = "{{{langname}}} verbs which indicate that an action or event gradually yields a certain or significant quantity or effect.",
parents = {"کار"},
}
labels["degree adverbs"] = {
description = "{{{langname}}} adverbs that express a particular degree to which the word they modify applies.",
parents = {"adverbs"},
}
labels["delimitative verbs"] = {
description = "{{{langname}}} verbs which indicate that an action or event is performed or takes place briefly or to an otherwise reduced extent.",
parents = {"کار"},
}
labels["demonstrative adjectives"] = {
description = "{{{langname}}} adjectives that refer to nouns, comparing them to external references.",
parents = {"adjectives", {name = "demonstrative pro-forms", sort = "adjectives"}},
}
labels["demonstrative adverbs"] = {
description = "{{{langname}}} adverbs that refer to other adverbs, comparing them to external references.",
parents = {"adverbs", {name = "demonstrative pro-forms", sort = "adverbs"}},
}
labels["denominal verbs"] = { -- in [[Appendix:Glossary]]; "denominative" more frequent?
description = "{{{langname}}} verbs that derive from nouns.",
parents = { "verbs" },
}
labels["demonstrative determiners"] = {
description = "{{{langname}}} determiners that refer to nouns, comparing them to external references.",
parents = {"determiners", {name = "demonstrative pro-forms", sort = "determiners"}},
}
labels["demonstrative pronouns"] = {
description = "{{{langname}}} pronouns that refer to nouns, comparing them to external references.",
parents = {"pronouns", {name = "demonstrative pro-forms", sort = "pronouns"}},
}
labels["deponent verbs"] = {
description = "{{{langname}}} verbs that have active meanings but are not conjugated in the active voice.",
parents = {"کار"},
}
labels["derivational prefixes"] = {
description = "{{{langname}}} prefixes that are used to create new words.",
parents = {"prefixes"},
}
labels["derivational suffixes"] = {
description = "{{{langname}}} suffixes that are used to create new words.",
parents = {"suffixes"},
}
labels["derivative verbs"] = {
description = "{{{langname}}} verbs that are derived from nouns and adjectives.",
parents = {"کار"},
}
labels["desiderative verbs"] = {
description = "{{{langname}}} verbs with the following morphology: verbal root xxx + [[desiderative]] affix, and the following semantics: to wish to do the action xxx.",
parents = {"کار"},
}
labels["determinatives"] = {
description = "{{{langname}}} terms that indicate the general class to which the following logogram belongs.",
parents = {"لەما"},
}
labels["determiners"] = {
description = "{{{langname}}} terms that narrow down, within the conversational context, the referent of the following noun.",
parents = {"لەما"},
}
labels["diminutiva tantum"] = {
description = "{{{langname}}} nouns or noun senses that are mostly or exclusively used in the diminutive form.",
parents = {"ناو"},
}
for _, pos in ipairs(diminutive_augmentative_poses) do
labels["diminutive " .. pos] = {
description = "{{{langname}}} " .. pos .. " that are derived from a base word to convey endearment, small size or small intensity.",
parents = {pos},
}
end
labels["discourse particles"] = {
description = "{{{langname}}} particles that manage the flow and structure of discourse.",
parents = {"particles"},
}
labels["distributive verbs"] = {
description = "{{{langname}}} verbs which indicate that an action or event involves multiple participants or a large quantity of an uncountable mass, usually as the grammatical subject in the case of intransitive verbs and as the grammatical object in the case of transitive verbs.",
parents = {"کار"},
}
labels["ditransitive verbs"] = {
description = "{{{langname}}} verbs that indicate actions, occurrences or states of two grammatical objects simultaneously, one direct and one indirect.",
parents = {"verbs", "transitive verbs"},
}
labels["dualia tantum"] = {
description = "{{{langname}}} nouns that are mostly or exclusively used in the dual form.",
parents = {"ناو"},
}
labels["duration adverbs"] = {
description = "{{{langname}}} adverbs that express duration in time.",
parents = {"time adverbs"},
}
labels["ergative verbs"] = {
description = "{{{langname}}} [[Appendix:Glossary#ergative|ergative verb]]s: intransitive verbs that become causatives when used transitively.",
parents = {"verbs", "intransitive verbs", "transitive verbs"},
}
labels["excessive verbs"] = {
description = "{{{langname}}} verbs that indicate that an action is performed to an excessive extent.",
parents = {"کار"},
}
labels["enclitics"] = {
description = "{{{langname}}} clitics that attach to the preceding word.",
parents = {"clitics"},
}
labels["nouns with other-gender equivalents"] = {
description = "{{{langname}}} nouns that refer to gendered concepts (e.g. [[actor]] vs. [[actress]], [[king]] vs. [[queen]]) and have corresponding other-gender equivalent terms.",
parents = {"ناو"},
}
labels["female equivalent nouns"] = {
description = "{{{langname}}} nouns that refer to female beings with the same characteristics as the base noun.",
parents = {"nouns with other-gender equivalents"},
}
labels["neuter equivalent nouns"] = {
description = "{{{langname}}} nouns that refer to neuter beings with the same characteristics as the base noun.",
parents = {"nouns with other-gender equivalents"},
}
labels["female equivalent suffixes"] = {
description = "{{{langname}}} suffixes that refer to female beings with the same characteristics as the base suffix.",
parents = {"noun-forming suffixes"},
}
labels["focus adverbs"] = {
description = "{{{langname}}} adverbs that indicate [[w:Focus (linguistics)|focus]] within the sentence.",
parents = {"adverbs"},
}
labels["frequency adverbs"] = {
description = "{{{langname}}} adverbs that express repetition with a certain frequency or interval.",
parents = {"time adverbs"},
}
labels["frequentative verbs"] = {
description = "{{{langname}}} verbs that express repeated action.",
parents = {"کار"},
}
labels["general pronouns"] = {
description = "{{{langname}}} pronouns that refer to all persons, things, abstract ideas and their characteristics.",
parents = {"pronouns"},
}
labels["generational moieties"] = {
description = "{{{langname}}} moieties that alternate every generation.",
parents = {"moieties"},
}
labels["ideophones"] = {
description = "{{{langname}}} terms that evoke an idea, especially a sensation or impression, with a sound.",
parents = {"لەما"},
}
labels["imperfective verbs"] = {
description = "{{{langname}}} verbs that express actions considered as ongoing or continuous, as opposed to completed events.",
parents = {"کار"},
}
labels["impersonal verbs"] = {
description = "{{{langname}}} verbs that do not indicate actions, occurrences or states of any specific grammatical subject.",
parents = {"کار"},
}
labels["inchoative verbs"] = {
description = "{{{langname}}} verbs that indicate the beginning of an action or event.",
parents = {"کار"},
}
labels["indefinite adjectives"] = {
description = "{{{langname}}} adjectives that refer to unspecified adjective meanings.",
parents = {"adjectives", {name = "indefinite pro-forms", sort = "adjectives"}},
}
labels["indefinite adverbs"] = {
description = "{{{langname}}} adverbs that refer to unspecified adverbial meanings.",
parents = {"adverbs", {name = "indefinite pro-forms", sort = "adverbs"}},
}
labels["indefinite determiners"] = {
description = "{{{langname}}} determiners that designate an unidentified noun.",
parents = {"determiners", {name = "indefinite pro-forms", sort = "determiners"}},
}
labels["indefinite pronouns"] = {
description = "{{{langname}}} pronouns that refer to unspecified nouns.",
parents = {"pronouns", {name = "indefinite pro-forms", sort = "pronouns"}},
}
labels["infixes"] = {
description = "Affixes inserted inside {{{langname}}} words.",
parents = {"morphemes"},
}
labels["inflectional prefixes"] = {
description = "{{{langname}}} prefixes that are used as inflectional beginnings in noun, adjective or verb paradigms.",
parents = {"prefixes"},
}
labels["inflectional suffixes"] = {
description = "{{{langname}}} suffixes that are used as inflectional endings in noun, adjective or verb paradigms.",
parents = {"suffixes"},
}
labels["intensive verbs"] = {
description = "{{{langname}}} verbs which indicate that an action is performed vigorously, enthusiastically, forcefully or to an otherwise enlarged extent.",
parents = {"کار"},
}
labels["interfixes"] = {
description = "Affixes used to join two {{{langname}}} words or morphemes together.",
parents = {"morphemes"},
}
labels["interjections"] = {
description = "{{{langname}}} terms that express emotions, sounds, etc. as exclamations.",
parents = {"لەما"},
}
labels["interrogative adjectives"] = {
description = "{{{langname}}} adjectives that indicate questions.",
parents = {"adjectives", {name = "interrogative pro-forms", sort = "adjectives"}},
}
labels["interrogative adverbs"] = {
description = "{{{langname}}} adverbs that indicate questions.",
parents = {"adverbs", {name = "interrogative pro-forms", sort = "adverbs"}},
}
labels["interrogative determiners"] = {
description = "{{{langname}}} determiners that indicate questions.",
parents = {"determiners", {name = "interrogative pro-forms", sort = "determiners"}},
}
labels["interrogative particles"] = {
description = "{{{langname}}} particles that indicate questions.",
parents = {"particles", {name = "interrogative pro-forms", sort = "particles"}},
}
labels["interrogative pronouns"] = {
description = "{{{langname}}} pronouns that indicate questions.",
parents = {"pronouns", {name = "interrogative pro-forms", sort = "pronouns"}},
}
labels["intransitive verbs"] = {
description = "{{{langname}}} verbs that don't require any grammatical objects.",
parents = {"کار"},
}
labels["iterative verbs"] = {
description = "{{{langname}}} verbs that express the repetition of an event.",
parents = {"کار"},
}
labels["location adverbs"] = {
description = "{{{langname}}} adverbs that indicate location.",
parents = {"adverbs"},
}
labels["male equivalent nouns"] = {
description = "{{{langname}}} nouns that refer to male beings with the same characteristics as the base noun.",
parents = {"nouns with other-gender equivalents"},
}
labels["manner adverbs"] = {
description = "{{{langname}}} adverbs that indicate the manner, way or style in which an action is performed.",
parents = {"adverbs"},
}
labels["modal adverbs"] = {
description = "{{{langname}}} adverbs that express [[w:Linguistic modality|linguistic modality]], indicating the mood or attitude of the speaker with respect to what is being said.",
parents = {"sentence adverbs"},
}
labels["modal particles"] = {
description = "{{{langname}}} particles that reflect the mood or attitude of the speaker, without changing the basic meaning of the sentence.",
parents = {"particles"},
}
labels["modal verbs"] = {
description = "{{{langname}}} verbs that indicate [[grammatical mood]].",
parents = {"auxiliary verbs"},
}
labels["moieties"] = {
description = "{{{langname}}} pairs of abstract categories separating people and the environment.",
parents = {"لەما"},
}
labels["momentane verbs"] = {
description = "{{{langname}}} verbs that express a sudden and brief action.",
parents = {"کار"},
}
labels["morphemes"] = {
description = "{{{langname}}} word-elements used to form full words.",
parents = {"لەما"},
}
labels["multiword terms"] = {
description = "{{{langname}}} lemmas that are an [[WT:CFI#Idiomaticity|idiomatic]] combination of multiple words.",
parents = {"لەما"},
}
labels["negative verbs"] = {
description = "{{{langname}}} verbs that indicate the lack of an action.",
parents = {"کار"},
}
labels["negative particles"] = {
description = "{{{langname}}} particles that indicate negation.",
parents = {"particles"},
}
labels["negative pronouns"] = {
description = "{{{langname}}} pronouns that refer to negative or non-existent references.",
parents = {"pronouns"},
}
labels["neutral verbs"] = {
description = "{{{langname}}} verbs that indicate either or both an activity or a result of an activity",
parents = {"کار"},
}
labels["nominalized adjectives"] = {
description = "{{{langname}}} adjectives that are used as nouns.",
parents = {"nouns", "adjectives"},
}
labels["non-constituents"] = {
description = "{{{langname}}} terms that are not grammatical [[constituent#Noun|constituents]], and therefore need to be combined with additional terms to form a complete phrase.",
parents = {"phrases"},
}
labels["noun prefixes"] = {
description = "{{{langname}}} prefixes attached to a noun that display its noun class.",
parents = {"prefixes"},
}
labels["ناو"] = {
description = "{{{langname}}} terms that indicate people, beings, things, places, phenomena, qualities or ideas.",
parents = {"لەما"},
}
labels["nouns by classifier"] = {
description = "{{{langname}}} nouns organized by the classifier they are used with.",
parents = {{name = "nouns", sort = "classifier"}},
}
labels["numerals"] = {
description = "{{{langname}}} terms that quantify nouns.",
parents = {"لەما"},
}
labels["object concords"] = {
description = "{{{langname}}} concords used to show the grammatical object.",
parents = {"concords"},
}
labels["object pronouns"] = {
description = "{{{langname}}} pronouns that refer to grammatical objects.",
parents = {"pronouns"},
}
labels["particles"] = {
description = "{{{langname}}} terms that do not belong to any of the inflected grammatical word classes, often lacking their own grammatical functions and forming other parts of speech or expressing the relationship between clauses.",
parents = {"لەما"},
}
labels["passive verbs"] = {
description = "{{{langname}}} verbs that are usually used in passive voice.",
parents = {"کار"},
}
labels["perfective verbs"] = {
description = "{{{langname}}} verbs that express actions considered as completed events, as opposed to ongoing or continuous.",
parents = {"کار"},
}
labels["personal pronouns"] = {
description = "{{{langname}}} pronouns that are used as substitutes for known nouns.",
parents = {"pronouns"},
}
labels["phrasal verbs"] = {
description = "{{{langname}}} verbs accompanied by particles, such as prepositions and adverbs.",
parents = {"verbs", "phrases"},
}
labels["phrasal prepositions"] = {
description = "{{{langname}}} prepositions formed with combinations of other terms.",
parents = {"prepositions", "phrases"},
}
labels["pluralia tantum"] = {
description = "{{{langname}}} nouns that are mostly or exclusively used in the plural form.",
parents = {"ناو"},
}
labels["point-in-time adverbs"] = {
description = "{{{langname}}} adverbs that reference a specific point in time, e.g. {{m|en|yesterday}}, {{m+|es|anoche||last night}} or {{m+|hu|egykor||at one o'clock}}.",
parents = {"time adverbs"},
}
labels["possessable nouns"] = {
description = "{{{langname}}} nouns can have their possession indicated directly by possessive pronouns.",
parents = {"ناو"},
umbrella = {
description = "Categories with nouns that can have their possession indicated directly by possessive pronouns and, in some languages, be transformed into adjectives.",
parents = {"Lemmas subcategories by language"},
breadcrumb = "Possessable nouns by language",
},
}
labels["possessional adjectives"] = {
description = "{{{langname}}} adjectives that indicate that a noun is in possession of something.",
parents = {"ھاوەڵناو"},
}
labels["possessive adjectives"] = {
description = "{{{langname}}} adjectives that indicate ownership.",
parents = {"ھاوەڵناو"},
}
labels["possessive concords"] = {
description = "{{{langname}}} concords used to show possession.",
parents = {"concords"},
}
labels["possessive determiners"] = {
description = "{{{langname}}} determiners that indicate ownership.",
parents = {"determiners"},
}
labels["possessive pronouns"] = {
description = "{{{langname}}} pronouns that indicate ownership.",
parents = {"pronouns"},
}
labels["postpositional phrases"] = {
description = "{{{langname}}} phrases headed by a postposition.",
parents = {"phrases", "postpositions"},
}
labels["postpositions"] = {
description = "{{{langname}}} adpositions that are placed after their objects.",
parents = {"لەما"},
}
labels["predicatives"] = {
description = "{{{langname}}} elements of the predicate that supplement the subject or object of a sentence via the verb.",
parents = {"لەما"},
}
labels["prefixes"] = {
description = "Affixes attached to the beginning of {{{langname}}} words.",
parents = {"morphemes"},
}
labels["prepositional phrases"] = {
description = "{{{langname}}} phrases headed by a preposition.",
parents = {"phrases", "prepositions"},
}
labels["prepositions"] = {
description = "{{{langname}}} adpositions that are placed before their objects.",
parents = {"لەما"},
}
labels["ablative prepositions"] = {
description = "{{{langname}}} prepositions that cause the succeeding noun to be in the ablative case.",
parents = {"prepositions"},
}
labels["accusative prepositions"] = {
description = "{{{langname}}} prepositions that cause the succeeding noun to be in the accusative case.",
parents = {"prepositions"},
}
labels["dative prepositions"] = {
description = "{{{langname}}} prepositions that cause the succeeding noun to be in the dative case.",
parents = {"prepositions"},
}
labels["genitive prepositions"] = {
description = "{{{langname}}} prepositions that cause the succeeding noun to be in the genitive case.",
parents = {"prepositions"},
}
labels["instrumental prepositions"] = {
description = "{{{langname}}} prepositions that cause the succeeding noun to be in the instrumental case.",
parents = {"prepositions"},
}
labels["matrilineal moieties"] = {
description = "{{{langname}}} moieties inherited from an individual's mother.",
parents = {"moieties"},
}
labels["nominative prepositions"] = {
description = "{{{langname}}} prepositions that cause the succeeding noun to be in the nominative case.",
parents = {"prepositions"},
}
labels["patrilineal moieties"] = {
description = "{{{langname}}} moieties inherited from an individual's father.",
parents = {"moieties"},
}
labels["pejorative suffixes"] = {
description = "{{{langname}}} suffixes that [[belittle]] (lessen in value).",
parents = {"suffixes"},
}
labels["prepositional prepositions"] = {
description = "{{{langname}}} prepositions that cause the succeeding noun to be in the prepositional case.",
parents = {"prepositions"},
}
labels["prenouns"] = {
description = "{{{langname}}} prefixes of various kinds that are attached to nouns.",
parents = {"prefixes"},
}
labels["preverbs"] = {
description = "{{{langname}}} prefixes of various kinds that are attached to verbs.",
parents = {"prefixes"},
}
labels["privative verbs"] = {
description = "{{{langname}}} verbs that indicate that the grammatical object is deprived of something or that something is removed from the object.",
parents = {"کار"},
}
labels["pronominal adverbs"] = {
description = "{{{langname}}} adverbs that are formed by combining a pronoun with a preposition.",
parents = {"adverbs", "prepositions", "pronouns"},
}
labels["pronominal concords"] = {
description = "{{{langname}}} concords that are prefixed to pronominal stems.",
parents = {"concords"},
}
labels["pronouns"] = {
description = "{{{langname}}} terms that refer to and substitute nouns.",
parents = {"لەما"},
}
labels["proper nouns"] = {
description = "{{{langname}}} nouns that indicate individual entities, such as names of persons, places or organizations.",
parents = {"ناو"},
}
labels["punctual adverbs"] = {
description = "{{{langname}}} adverbs that express a single point or span in time.",
parents = {"time adverbs"},
}
labels["raising verbs"] = {
description = "{{{langname}}} verbs that, in a matrix or main clause, take an argument from an embedded or subordinate clause; in other words, a raising verb appears with a syntactic argument that is not its semantic argument, but is rather the semantic argument of an embedded predicate.",
parents = {"کار"},
}
labels["reciprocal pronouns"] = {
description = "{{{langname}}} pronouns that refer back to a plural subject and express an action done in two or more directions.",
parents = {"pronouns", "personal pronouns"},
}
labels["reciprocal verbs"] = {
description = "{{{langname}}} verbs that indicate actions, occurrences or states directed from multiple subjects to each other.",
parents = {"کار"},
}
labels["reflexive pronouns"] = {
description = "{{{langname}}} pronouns that refer back to the subject.",
parents = {"pronouns", "personal pronouns"},
}
labels["reflexive verbs"] = {
description = "{{{langname}}} verbs that indicate actions, occurrences or states directed from the grammatical subjects to themselves.",
parents = {"کار"},
}
labels["relational adjectives"] = {
description = "{{{langname}}} adjectives that stand in place of a noun when modifying another noun.",
parents = {"ھاوەڵناو"},
}
labels["relational nouns"] = {
description = "{{{langname}}} nouns used to indicate a relation between other two nouns by means of possession.",
parents = {"ناو"},
}
labels["relative adjectives"] = {
description = "{{{langname}}} adjectives used to indicate [[relative clause]]s.",
parents = {"adjectives", {name = "relative pro-forms", sort = "adjectives"}},
}
labels["relative adverbs"] = {
description = "{{{langname}}} adverbs used to indicate [[relative clause]]s.",
parents = {"adverbs", {name = "relative pro-forms", sort = "adverbs"}},
}
labels["relative determiners"] = {
description = "{{{langname}}} determiners used to indicate [[relative clause]]s.",
parents = {"determiners", {name = "relative pro-forms", sort = "determiners"}},
}
labels["relative concords"] = {
description = "{{{langname}}} concords that are prefixed to relative stems.",
parents = {"concords"},
}
labels["relative pronouns"] = {
description = "{{{langname}}} pronouns used to indicate [[relative clause]]s.",
parents = {"pronouns", {name = "relative pro-forms", sort = "pronouns"}},
}
labels["relatives"] = {
description = "{{{langname}}} terms that give attributes to nouns, acting grammatically as relative clauses.",
parents = {"لەما"},
}
labels["repetitive verbs"] = {
description = "{{{langname}}} verbs that indicate actions or events which are performed or occur again, anew or differently.",
parents = {"کار"},
}
labels["resultative verbs"] = {
description = "{{{langname}}} verbs that indicate a result of some action",
parents = {"کار"},
}
labels["reversative verbs"] = {
description = "{{{langname}}} verbs that indicate that the reversal or undoing of an action, event or state.",
parents = {"کار"},
}
labels["saturative verbs"] = {
description = "{{{langname}}} verbs which indicate that an action is performed to the point of saturation or satisfaction.",
parents = {"کار"},
}
labels["semelfactive verbs"] = {
description = "{{{langname}}} verbs that are punctual (instantaneous, momentive), perfective (treated as a unitary whole with no explicit internal temporal structure), and telic (having a boundary out of which the activity cannot be said to have taken place or continue).",
parents = {"کار"},
}
labels["sentence adverbs"] = {
description = "{{{langname}}} adverbs that modify an entire clause or sentence.",
parents = {"adverbs"},
}
labels["sequence adverbs"] = {
description = "{{{langname}}} conjunctive adverbs that express sequence in space or time.",
parents = {"conjunctive adverbs"},
}
labels["simulfixes"] = {
description = "Affixes replacing positions in {{{langname}}} words.",
parents = {"morphemes"},
}
labels["singulative nouns"] = {
description = "{{{langname}}} nouns that indicate a single item of a group of related things or beings.",
parents = {"ناو"},
}
labels["singularia tantum"] = {
description = "{{{langname}}} nouns that are mostly or exclusively used in the singular form.",
parents = {"ناو"},
}
labels["stative verbs"] = {
description = "{{{langname}}} verbs that define a state with no or insignificant internal dynamics.",
parents = {"کار"},
}
labels["stems"] = {
description = "Morphemes from which {{{langname}}} words are formed.",
parents = {"morphemes"},
}
labels["subordinating conjunctions"] = {
description = "{{{langname}}} conjunctions that indicate relations of syntactic dependence between connected items.",
parents = {"conjunctions"},
}
labels["subject concords"] = {
description = "{{{langname}}} concords used to show the grammatical subject.",
parents = {"concords"},
}
labels["subject pronouns"] = {
description = "{{{langname}}} pronouns that refer to grammatical subjects.",
parents = {"pronouns"},
}
labels["suffixes"] = {
description = "Affixes attached to the end of {{{langname}}} words.",
parents = {"morphemes"},
}
labels["splitting verbs"] = {
description = "{{{langname}}} bisyllabic verbs that obligatorily split around a direct object or pronoun.",
parents = {"کار"},
}
labels["terminative verbs"] = {
description = "{{{langname}}} verbs that indicate that an action or event ceases.",
parents = {"کار"},
}
labels["time adverbs"] = {
description = "{{{langname}}} adverbs that indicate time.",
parents = {"adverbs"},
}
labels["transfixes"] = {
description = "Discontinuous affixes inserted within a word root.",
parents = {"morphemes"},
}
labels["transformative verbs"] = {
description = "{{{langname}}} verbs that indicate a change of state or nature, in the subject for intransitive verbs and in the object for transitive verbs.",
parents = {"کار"},
}
labels["transitive verbs"] = {
description = "{{{langname}}} verbs that indicate actions, occurrences or states directed to one or more grammatical objects.",
parents = {"کار"},
}
labels["uncomparable adjectives"] = {
description = "{{{langname}}} adjectives that are not inflected to display different degrees of comparison.",
parents = {"ھاوەڵناو"},
}
labels["uncomparable adverbs"] = {
description = "{{{langname}}} adverbs that are not inflected to display different degrees of comparison.",
parents = {"adverbs"},
}
labels["ناوە ژماردەنییەکان"] = {
description = "{{{langname}}} nouns that indicate qualities, ideas, unbounded mass or other abstract concepts that cannot be quantified directly by numerals.",
parents = {"ناوەکان"},
}
labels["uncountable numerals"] = {
description = "{{{langname}}} numerals that cannot be quantified directly by other numerals.",
parents = {"numerals"},
}
labels["uncountable proper nouns"] = {
description = "{{{langname}}} proper nouns that cannot be quantified directly by numerals.",
parents = {"proper nouns"},
}
labels["uncountable suffixes"] = {
description = "{{{langname}}} suffixes that can be used to form nouns that cannot be quantified directly by numerals.",
parents = {"numerals"},
}
labels["unpossessable nouns"] = {
description = "{{{langname}}} nouns that cannot have their possession indicated directly by possessive pronouns.",
parents = {"ناو"},
umbrella = {
description = "Categories with nouns that cannot have their possession indicated directly by possessive pronouns or, in some languages, be transformed into adjectives.",
parents = {"Lemmas subcategories by language"},
breadcrumb = "Unpossessable nouns by language",
},
}
labels["verbal nouns"] = {
description = "{{{langname}}} nouns morphologically related to a verb and similar to it in meaning.",
parents = {"ناو"},
}
labels["verbal adjectives"] = {
description = "{{{langname}}} adjectives describing the condition or state resulting from the action of the corresponding verb.",
parents = {"ھاوەڵناو"},
}
labels["کار"] = {
description = "{{{langname}}} terms that indicate actions, occurrences or states.",
parents = {"لەما"},
}
labels["verbs of movement"] = {
description = "{{{langname}}} verbs that indicate physical movement of the grammatical subject across a trajectory, with a starting point and an endpoint.",
parents = {"کار"},
}
-- Add "POS-forming suffixes".
local poses_derived_by_suffix = {
"adjective", "adverb", "noun", "verb",
}
for _, pos in pairs(poses_derived_by_suffix) do
labels[pos .. "-forming suffixes"] = {
description = "{{{langname}}} suffixes that are used to derive " .. pos .. "s from other words.",
parents = {"derivational suffixes"},
}
end
local labels2 = {}
-- Add "reconstructed" subcategories; add 'umbrella_parents' key if not
-- already present.
for key, data in pairs(labels) do
labels2[key] = data
if not data.umbrella_parents then
data.umbrella_parents = "Lemmas subcategories by language"
end
labels2["reconstructed " .. key] = {
description = "{{{langname}}} " .. key .. " that have been linguistically [[Wiktionary:Reconstructed terms|reconstructed]].",
umbrella_parents = "Lemmas subcategories by language",
parents = {key, {name = "reconstructed terms", sort = key}}
}
end
-----------------------------------------------------------------------------
-- --
-- RAW CATEGORIES --
-- --
-----------------------------------------------------------------------------
raw_categories["Lemmas subcategories by language"] = {
description = "Umbrella categories covering topics related to lemmas.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Umbrella metacategories",
{name = "lemmas", is_label = true, sort = " "},
},
}
-----------------------------------------------------------------------------
-- --
-- HANDLERS --
-- --
-----------------------------------------------------------------------------
-- Handler for e.g. [[:Category:English phrasal verbs with particle (around)]].
table.insert(handlers, function(data)
local particle = data.label:match("^phrasal verbs with particle %((.-)%)$")
if particle then
local tagged_text = require("Module:script utilities").tag_text(particle, data.lang, nil, "term")
local link = require("Module:links").full_link({ term = particle, lang = data.lang }, "term")
return {
description = "{{{langname}}} {{w|phrasal verb}}s using the particle " .. link .. ".",
displaytitle = "{{{langname}}} phrasal verbs with particle (" .. tagged_text .. ")",
breadcrumb = tagged_text,
parents = {{ name = "phrasal verbs", sort = particle }},
umbrella = false,
}
end
end)
return {LABELS = labels2, RAW_CATEGORIES = raw_categories, HANDLERS = handlers}
6pj7hd6pvqpmdyf6x5u08cuo82jxssp
پۆل:زمانی ئینگلیزی
14
9990
36765
29940
2026-08-12T22:37:42Z
Ghybu
12
36765
wikitext
text/x-wiki
{{auto cat|ساموای ئەمریکا |Anguilla |ئانتیگوا و باربوودا |Ascension Island |ئوسترالیا |باربادۆس |بەلیز |بەرموودا |بۆتسوانا |کامیروون |کەنەدا |کاریبی Netherlands |دوورگەی کریسمس |دۆمینیکا |ئێسواتینی |فیجی |گانا |گیبرالتار |گرینادا |گوام |Guernsey |گویانا |ھاوایی |ھۆنگ کۆنگ |ھیندستان |ئیرلەند |جامایکا |Jersey |کینیا |کیریباس |لیسۆتۆ |لیبێریا |مالاوی |مالیزیا |ماڵتا |مۆریس |مایکرۆنیزیا |Montserrat |نائووروو |نیوزیلاند |نێجیریا |نیووەی |دوورگەی نۆرفۆلک |the Northern Mariana Islands |عومان |پاکستان |پالاو |Papua New گینێ |پۆرتۆ ڕیکۆ |ڕواندا |سانت ھێلانە |سەینت کیتس و نیڤیس |سەینت لووسیا |سەینت ڤینسەنت و گرینادینز |ساموا |سیەرالیۆن |سینگاپوور |ئەفریقای باشوور |سوودانی باشوور |سوودان |تانزانیا |بەھاما |the British Indian Ocean Territory |the British Virgin Islands |دوورگەکانی کەیمەن |the Cocos (Keeling) Islands |the Cook Islands |دوورگەکانی فۆڵکلاند |گامبیا |the Isle of Man |دوورگەکانی مارشاڵ |the Pitcairn Islands |سیشێل |دوورگەکانی سولەیمان |شانشینی یەکگرتوو |فلیپین |دوورگەکانی تورکس و کایکۆس |ویلایەتە یەکگرتووەکانی ئەمریکا |ویلایەتە یەکگرتووەکانی ئەمریکا Virgin Islands |توکیلاو |تۆنگا |ترینیداد و تۆباگۆ |تووڤالوو |ئووگاندا |ڤانواتوو |زامبیا |زیمبابوی}}
9ftz283mnb9zlxt4htq5oxe0qm6mhex
داڕێژە:en-adj
10
10126
36792
29692
2026-08-13T01:19:54Z
Ghybu
12
ھاوەڵناو
36792
wikitext
text/x-wiki
{{#invoke:en-headword|show|ھاوەڵناو}}<!--
--><noinclude>{{documentation}}</noinclude>
3g7wb2ddpkxp3o8g9d9ejlvw301coe2
داڕێژە:en-noun
10
10135
36761
29716
2026-08-12T22:34:29Z
Ghybu
12
ناو
36761
wikitext
text/x-wiki
{{#invoke:en-headword|show|ناو}}<noinclude>{{documentation}}</noinclude>
5mcy3o6453hko4y1qsfrin6ivxapw8v
blackwood
0
10147
36806
30373
2026-08-13T11:52:42Z
Ghybu
12
/* ئینگلیزی */
36806
wikitext
text/x-wiki
== ئینگلیزی ==
{{ویکیپیدیا|lang=en}}
===وشەڕەتناسی===
{{compound|en|black|wood}}
====ناو====
{{en-noun|-|s}}
# شوێنێکی دوور لە [[شارستانیەت]]
# [[دێکوێرە]]
# [[شارون]]
56g7unqexq917yr5q3fdn4k2t32fx2w
داڕێژە:ar-noun
10
10547
36774
30443
2026-08-12T22:43:18Z
Ghybu
12
ناو
36774
wikitext
text/x-wiki
{{#invoke:ar-headword|show|ناو}}<!--
--><noinclude>{{documentation}}</noinclude>
an6sopszfpr1ty9wgshfigwpmvcr5o5
مۆدیوول:ar-headword
828
10557
36775
30453
2026-08-12T22:53:02Z
Ghybu
12
ناو
36775
Scribunto
text/plain
-- Author: Benwing2; based on an early version by Rua
local ar_translit = require("Module:ar-translit")
local m_str_utils = require("Module:string utilities")
local list_to_set = require("Module:table").listToSet
local rfind = m_str_utils.find
local rsubn = m_str_utils.gsub
local u = m_str_utils.char
local lang = require("Module:languages").getByCode("ar")
local export = {}
local pos_functions = {}
-- diacritics
local A = u(0x064E) -- fatḥa
local AN = u(0x064B) -- fatḥatān (fatḥa tanwīn)
local U = u(0x064F) -- ḍamma
local UN = u(0x064C) -- ḍammatān (ḍamma tanwīn)
local I = u(0x0650) -- kasra
local IN = u(0x064D) -- kasratān (kasra tanwīn)
local SK = u(0x0652) -- sukūn = no vowel
local SH = u(0x0651) -- šadda = gemination of consonants
local DAGGER_ALIF = u(0x0670)
local DIACRITIC_ANY_BUT_SH = "[" .. A .. I .. U .. AN .. IN .. UN .. SK .. DAGGER_ALIF .. "]"
-- various letters and signs
local HAMZA = u(0x0621) -- hamza on the line (stand-alone hamza) = ء
local ALIF = u(0x0627) -- ʾalif = ا
local AMAQ = u(0x0649) -- ʾalif maqṣūra = ى
local TAM = u(0x0629) -- tāʾ marbūṭa = ة
-- common combinations
local UNU = "[" .. UN .. U .. "]"
-----------------------
-- Utility functions --
-----------------------
-- If Not Empty
local function ine(arg)
if arg == "" then
return nil
else
return arg
end
end
-- version of mw.ustring.gsub() 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 remove_links(text)
text = rsub(text, "%[%[[^|%]]*|", "")
text = rsub(text, "%[%[", "")
text = rsub(text, "%]%]", "")
return text
end
local function reorder_shadda(text)
-- shadda+short-vowel (including tanwīn vowels, i.e. -an -in -un) gets
-- replaced with short-vowel+shadda during NFC normalisation, which
-- MediaWiki does for all Unicode strings; however, it makes the
-- detection process inconvenient, so undo it. (For example, the tracking
-- code below would fail to detect the -un in سِتٌّ because the shadda
-- would come after the -un.)
text = rsub(text, "(" .. DIACRITIC_ANY_BUT_SH .. ")" .. SH, SH .. "%1")
return text
end
-- Tracking functions
local trackfn = require("Module:debug/track")
local function track(page)
trackfn("ar-headword/" .. page)
return true
end
--[==[
Examples of what you can find by looking at what links to the given
pages:
[[Special:WhatLinksHere/Wiktionary:Tracking/ar-headword/unvocalized]]
all unvocalized pages
[[Special:WhatLinksHere/Wiktionary:Tracking/ar-headword/unvocalized/pl]]
all unvocalized pages where the plural is unvocalized,
whether specified using pl=, pl2=, etc.
[[Special:WhatLinksHere/Wiktionary:Tracking/ar-headword/unvocalized/head]]
all unvocalized pages where the head is unvocalized
[[Special:WhatLinksHere/Wiktionary:Tracking/ar-headword/unvocalized/head/nouns]]
all nouns excluding proper nouns, collective nouns,
singulative nouns where the head is unvocalized
[[Special:WhatLinksHere/Wiktionary:Tracking/ar-headword/unvocalized/head/proper]]
nouns all proper nouns where the head is unvocalized
[[Special:WhatLinksHere/Wiktionary:Tracking/ar-headword/unvocalized/head/not]]
proper nouns all words that are not proper nouns
where the head is unvocalized
[[Special:WhatLinksHere/Wiktionary:Tracking/ar-headword/unvocalized/adjectives]]
all adjectives where any parameter is unvocalized;
currently only works for heads,
so equivalent to .../unvocalized/head/adjectives
[[Special:WhatLinksHere/Wiktionary:Tracking/ar-headword/unvocalized-empty-head]]
all pages with an empty head
[[Special:WhatLinksHere/Wiktionary:Tracking/ar-headword/unvocalized-manual-translit]]
all unvocalized pages with manual translit
[[Special:WhatLinksHere/Wiktionary:Tracking/ar-headword/unvocalized-manual-translit/head/nouns]]
all nouns where the head is unvocalized but has manual translit
[[Special:WhatLinksHere/Wiktionary:Tracking/ar-headword/unvocalized-no-translit]]
all unvocalized pages without manual translit
[[Special:WhatLinksHere/Wiktionary:Tracking/ar-headword/i3rab]]
all pages with any parameter containing i3rab
of either -un, -u, -a or -i
[[Special:WhatLinksHere/Wiktionary:Tracking/ar-headword/i3rab-un]]
all pages with any parameter containing an -un i3rab ending
[[Special:WhatLinksHere/Wiktionary:Tracking/ar-headword/i3rab-un/pl]]
all pages where a form specified using pl=, pl2=, etc.
contains an -un i3rab ending
[[Special:WhatLinksHere/Wiktionary:Tracking/ar-headword/i3rab-u/head]]
all pages with a head containing an -u i3rab ending
[[Special:WhatLinksHere/Wiktionary:Tracking/ar-headword/i3rab/head/proper]]
nouns (all proper nouns with a head containing i3rab
of either -un, -u, -a or -i)
In general, the format is one of the following:
Wiktionary:Tracking/ar-headword/FIRSTLEVEL
Wiktionary:Tracking/ar-headword/FIRSTLEVEL/ARGNAME
Wiktionary:Tracking/ar-headword/FIRSTLEVEL/POS
Wiktionary:Tracking/ar-headword/FIRSTLEVEL/ARGNAME/POS
FIRSTLEVEL can be one of "unvocalized", "unvocalized-empty-head" or its
opposite "unvocalized-specified", "unvocalized-manual-translit" or its
opposite "unvocalized-no-translit", "i3rab", "i3rab-un", "i3rab-u",
"i3rab-a", or "i3rab-i".
ARGNAME is either "head" or an argument such as "pl", "f", "cons", etc.
This automatically includes arguments specified as head2=, pl3=, etc.
POS is a part of speech, lowercase and pluralized, e.g. "nouns",
"adjectives", "proper nouns", "collective nouns", etc. or
"not proper nouns", which includes all parts of speech but proper nouns.
]==]
local function track_form(argname, form, translit, pos)
form = reorder_shadda(remove_links(form))
function dotrack(page)
track(page)
track(page .. "/" .. argname)
if pos then
track(page .. "/" .. pos)
track(page .. "/" .. argname .. "/" .. pos)
if pos ~= "proper nouns" then
track(page .. "/not proper nouns")
track(page .. "/" .. argname .. "/not proper nouns")
end
end
end
function track_i3rab(arabic, tr)
if rfind(form, arabic .. "$") then
dotrack("i3rab")
dotrack("i3rab-" .. tr)
end
end
track_i3rab(UN, "un")
track_i3rab(U, "u")
track_i3rab(A, "a")
track_i3rab(I, "i")
if form == "" or not (lang:transliterate(form)) then
dotrack("unvocalized")
if form == "" then
dotrack("unvocalized-empty-head")
else
dotrack("unvocalized-specified")
end
if translit then
dotrack("unvocalized-manual-translit")
else
dotrack("unvocalized-no-translit")
end
end
end
-- The main entry point.
function export.show(frame)
local poscat = frame.args[1]
or error("Part of speech has not been specified. Please pass parameter 1 to the module invocation.")
local parargs = frame:getParent().args
local params = {
[1] = {list = "head", disallow_holes = true},
["tr"] = {list = true, allow_holes = true},
["id"] = {},
["nolinkhead"] = {type = "boolean"},
["json"] = {type = "boolean"},
["pagename"] = {}, -- for testing
}
if pos_functions[poscat] then
for key, val in pairs(pos_functions[poscat].params) do
params[key] = val
end
end
local args = require("Module:parameters").process(parargs, params)
local pagename = args.pagename or mw.loadData("Module:headword/data").pagename
local data = {
lang = lang,
pos_category = poscat,
categories = {},
heads = args[1],
translits = args.tr,
genders = {},
inflections = {enable_auto_translit = true},
pagename = pagename,
id = args.id,
sort_key = args.sort,
force_cat_output = force_cat,
}
local irreg_translit = false
for i = 1, #args[1] do
if ar_translit.irregular_translit(args[1][i], args.tr[i]) then
irreg_translit = true
break
end
end
if irreg_translit then
table.insert(data.categories, lang:getCanonicalName() .. " terms with irregular pronunciations")
end
if pos_functions[poscat] then
pos_functions[poscat].func(args, data)
end
if args.json then
return require("Module:JSON").toJSON(data)
end
return require("Module:headword").full_headword(data)
end
-- Get a list of inflections. See handle_infl() for meaning of ARGS and ARGPREF.
local function getargs(args, argpref)
local forms = {}
for i, form in ipairs(args[argpref]) do
local translit = args[argpref .. "tr"][i]
local gender = args[argpref .. "g"][i]
local gender2 = args[argpref .. "g2"][i]
local genderlist = (gender or gender2) and { gender, gender2 } or nil
-- FIXME, do we need this?
track_form(argpref, form, translit)
table.insert(forms, { term = form, translit = translit, genders = genderlist })
end
return forms
end
local function add_infl_params(params, argpref, defgender)
params[argpref] = {list = true, disallow_holes = true}
params[argpref .. "\1tr"] = {list = true, allow_holes = true}
params[argpref .. "\1g"] = {list = true, default = defgender}
params[argpref .. "\1g2"] = {list = true}
end
-- Get a list of inflections from the arguments in ARGS based on argument
-- prefix ARGPREF (e.g. "pl" to snarf arguments called "pl", "pl2", etc.,
-- along with "pltr", "pl2tr", etc. and optional gender(s) "plg", "plg2",
-- "pl2g", "pl2g2", "pl3g", "pl3g2", etc.). Label with LABEL (e.g. "plural"),
-- which will appear in the headword. Insert into inflections list
-- INFLS. Optional DEFGENDER is default gender to insert if gender
-- isn't given; otherwise, no gender is inserted. (This is used for
-- singulative forms of collective nouns, and collective forms of singulative
-- nouns, which have different gender from the base form(s).)
local function handle_infl(args, data, argpref, label, generate_default)
local newinfls = getargs(args, argpref)
if #newinfls == 0 and generate_default then
newinfls = {{term = "+"}}
end
if generate_default then
local saw_plus = false
for _, newinfl in ipairs(newinfls) do
if newinfl.term == "+" then
saw_plus = true
break
end
end
if saw_plus then
local newnewinfls = {}
for _, newinfl in ipairs(newinfls) do
if newinfl.term == "+" then
local definfls = generate_default(args, data)
for _, definfl in ipairs(definfls) do
table.insert(newnewinfls, definfl)
end
else
table.insert(newnewinfls, newinfl)
end
end
newinfls = newnewinfls
end
end
if #newinfls > 0 then
newinfls.label = label
table.insert(data.inflections, newinfls)
end
end
local function add_all_infl_params(params, argpref)
if argpref ~= "" then
add_infl_params(params, argpref)
end
add_infl_params(params, argpref .. "cons")
add_infl_params(params, argpref .. "def")
add_infl_params(params, argpref .. "obl")
add_infl_params(params, argpref .. "inf")
end
-- Handle a basic inflection (e.g. plural, feminine) along with the construct,
-- definite and oblique variants of this inflection. Can also handle the base
-- construct/definite/oblique variants if both ARGPREF and LABEL are given
-- as blank strings. If ARGPREF is blank, skip the base inflection.
local function handle_all_infl(args, data, argpref, label, generate_default)
if argpref ~= "" then
handle_infl(args, data, argpref, label, generate_default)
end
local labelsp = label == "" and "" or label .. " "
handle_infl(args, data, argpref .. "cons", labelsp .. "construct state")
handle_infl(args, data, argpref .. "def", labelsp .. "definite state")
handle_infl(args, data, argpref .. "obl", labelsp .. "oblique")
handle_infl(args, data, argpref .. "inf", labelsp .. "informal")
end
-- Handle the case where pl=-, indicating an uncountable noun.
local function handle_noun_plural(args, data)
if args.pl[1] == "-" then
table.insert(data.inflections, { label = "usually [[Appendix:Glossary#uncountable|uncountable]]" })
table.insert(data.categories, lang:getCanonicalName() .. " uncountable nouns")
if args.pauc and #args.pauc > 0 then
error("Can't specify paucals when pl=-")
end
else
handle_all_infl(args, data, "pl", "plural")
end
end
local valid_bare_genders = {false, "m", "f", "mfbysense", "mfequiv"}
local valid_bare_numbers = {false, "d", "p"}
local valid_bare_animacies = {false, "pr", "np"}
local valid_genders = {}
for _, gender in ipairs(valid_bare_genders) do
for _, number in ipairs(valid_bare_numbers) do
for _, animacy in ipairs(valid_bare_animacies) do
local parts = {}
local function ins_part(part)
if part then
table.insert(parts, part)
end
end
ins_part(gender)
ins_part(number)
ins_part(animacy)
local full_gender = table.concat(parts, "-")
valid_genders[full_gender == "" and "?" or full_gender] = true
end
end
end
local function is_masc_sg(g)
return g == "m" or g == "m-pr" or g == "m-np"
end
local function is_fem_sg(g)
return g == "f" or g == "f-pr" or g == "f-np"
end
local function add_gender_params(params, default)
params[2] = {list = "g", default = default or "?"}
end
-- Handle gender in params 2=, g2=, etc., inserting into `data.genders`. Also, if a lemma, insert categories into
-- `data.categories` if the gender is unexpected for the form of the noun. (Note: If there are multiple genders,
-- [[Module:gender and number]] will automatically insert 'Arabic POS with multiple genders'.)
local function handle_gender(args, data, nonlemma)
for _, g in ipairs(args[2]) do
if valid_genders[g] then
table.insert(data.genders, g)
else
error("Unrecognized gender: " .. g)
end
end
if nonlemma then
return
end
if #args[2] == 1 then
local g = args[2][1]
if is_masc_sg(g) or is_fem_sg(g) then
local head = args.head
if head then
head = rsub(reorder_shadda(remove_links(head)), UNU .. "?$", "")
local ends_with_tam = rfind(head, "^[^ ]*" .. TAM .. "$") or
rfind(head, "^[^ ]*" .. TAM .. " ")
if is_masc_sg(g) and ends_with_tam then
table.insert(data.categories, lang:getCanonicalName() .. " masculine terms with feminine ending")
elseif is_fem_sg(g) and not ends_with_tam and
not rfind(head, "[" .. ALIF .. AMAQ .. "]$") and
not rfind(head, ALIF .. HAMZA .. "$") then
table.insert(data.categories, lang:getCanonicalName() .. " feminine terms lacking feminine ending")
end
end
end
end
end
-- Part-of-speech functions
local adj_inflections = {
{pref = "", label = ""}, -- handle cons, def, obl, inf
{pref = "f", label = "feminine"},
{pref = "d", label = "masculine dual"},
{pref = "fd", label = "feminine dual"},
{pref = "cpl", label = "common plural"},
{pref = "pl", label = "masculine plural"},
{pref = "fpl", label = "feminine plural"},
}
local function create_infl_list_params(infl_list)
params = {}
for _, infl in ipairs(infl_list) do
if infl.basic then
add_infl_params(params, infl.pref)
else
add_all_infl_params(params, infl.pref)
end
end
return params
end
local function handle_infl_list_args(args, data, infl_list)
for _, infl in ipairs(infl_list) do
if infl.handle then
infl.handle(args, data)
elseif infl.basic then
handle_infl(args, data, infl.pref, infl.label, infl.generate_default)
else
handle_all_infl(args, data, infl.pref, infl.label, infl.generate_default)
end
end
end
pos_functions["adjectives"] = {
params = (function()
local params = create_infl_list_params(adj_inflections)
add_infl_params(params, "el")
return params
end)(),
func = function(args, data)
handle_infl_list_args(args, data, adj_inflections)
handle_infl(args, data, "el", "elative")
end
}
local function make_nisba_default(ending, endingtr)
return function(args, data)
local heads = data.heads
if #heads == 0 then
heads = {data.pagename}
end
local forms = {}
for i = 1, #heads do
local tr = data.translits[i]
table.insert(forms, {term = heads[i] .. ending, translit = tr and tr .. endingtr or nil})
end
return forms
end
end
local nisba_adj_inflections = {
{pref = "", label = ""}, -- handle cons, def, obl, inf
{pref = "f", label = "feminine", generate_default = make_nisba_default(A .. "ة", "a")},
{pref = "d", label = "masculine dual"},
{pref = "fd", label = "feminine dual"},
{pref = "cpl", label = "common plural"},
{pref = "pl", label = "masculine plural", generate_default = make_nisba_default(U .. "ونَ", "ūna")},
{pref = "fpl", label = "feminine plural", generate_default = make_nisba_default(A .. "ات", "āt")},
}
pos_functions["nisba adjectives"] = {
params = (function()
return create_infl_list_params(nisba_adj_inflections)
end)(),
func = function(args, data)
data.pos_category = "adjectives"
handle_infl_list_args(args, data, nisba_adj_inflections)
end
}
local sing_coll_noun_inflections = {
{pref = "", label = ""}, -- handle cons, def, obl, inf
{pref = "d", label = "dual"},
{pref = "pl", label = "plural", handle = handle_noun_plural},
{pref = "pauc", label = "paucal"},
}
local function handle_sing_coll_noun_infls(args, data, otherinfl, otherlabel)
handle_gender(args, data)
-- Handle sing= (corresponding singulative noun) or coll= (corresponding collective noun) and their gender
handle_infl(args, data, otherinfl, otherlabel)
handle_infl_list_args(args, data, sing_coll_noun_inflections)
end
local function get_sing_coll_noun_params(defgender, otherinfl, othergender)
local params = create_infl_list_params(sing_coll_noun_inflections)
add_gender_params(params, defgender)
add_infl_params(params, otherinfl, othergender)
return params
end
pos_functions["collective nouns"] = {
params = get_sing_coll_noun_params("m", "sing", "f"),
func = function(args, data)
data.pos_category = "nouns"
table.insert(data.categories, lang:getCanonicalName() .. " collective nouns")
table.insert(data.inflections, { label = "collective" })
handle_sing_coll_noun_infls(args, data, "sing", "singulative")
end
}
pos_functions["singulative nouns"] = {
params = get_sing_coll_noun_params("f", "coll", "m"),
func = function(args, data)
data.pos_category = "nouns"
table.insert(data.categories, lang:getCanonicalName() .. " singulative nouns")
table.insert(data.inflections, { label = "singulative" })
handle_sing_coll_noun_infls(args, data, "coll", "collective")
end
}
local noun_inflections = {
{pref = "", label = ""}, -- handle cons, def, obl, inf
{pref = "d", label = "dual"},
{pref = "pl", label = "plural", handle = handle_noun_plural},
{pref = "pauc", label = "paucal"},
{pref = "f", label = "feminine"},
{pref = "m", label = "masculine"},
}
local function get_noun_params()
local params = create_infl_list_params(noun_inflections)
add_gender_params(params)
return params
end
local function handle_noun_infls(args, data)
handle_gender(args, data)
handle_infl_list_args(args, data, noun_inflections)
end
pos_functions["ناو"] = {
params = get_noun_params(),
func = handle_noun_infls,
}
-- FIXME: Do numerals really behave almost as nouns? They vary by masc/fem.
pos_functions["numerals"] = {
params = get_noun_params(),
func = function(args, data)
table.insert(data.categories, lang:getCanonicalName() .. " cardinal numbers")
handle_noun_infls(args, data)
end
}
pos_functions["proper nouns"] = {
params = get_noun_params(),
func = handle_noun_infls,
}
local pronoun_inflections = {
{pref = "", label = ""}, -- handle cons, def, obl, inf
{pref = "d", label = "dual"},
{pref = "pl", label = "plural", handle = handle_noun_plural},
{pref = "f", label = "feminine"},
}
local function get_pronoun_params()
local params = create_infl_list_params(pronoun_inflections)
add_gender_params(params)
return params
end
pos_functions["pronouns"] = {
params = get_pronoun_params(),
func = function(args, data)
handle_gender(args, data)
handle_infl_list_args(args, data, pronoun_inflections)
end
}
local function get_gender_only_params(default)
local params = {}
add_gender_params(params, default)
return params
end
pos_functions["noun plural forms"] = {
params = (function()
local params = {}
add_gender_params(params, "p")
add_infl_params(params, "cons")
return params
end)(),
func = function(args, data)
data.pos_category = "noun forms"
handle_gender(args, data, "nonlemma")
handle_infl(args, data, "cons", "construct state")
end
}
pos_functions["adjective feminine forms"] = {
params = get_gender_only_params("f"),
func = function(args, data)
data.pos_category = "adjective feminine forms"
handle_gender(args, data, "nonlemma")
end
}
pos_functions["noun dual forms"] = {
params = get_gender_only_params("m-d"),
func = function(args, data)
data.pos_category = "noun forms"
handle_gender(args, data, "nonlemma")
end
}
pos_functions["adjective plural forms"] = {
params = get_gender_only_params("m-p"),
func = function(args, data)
data.pos_category = "adjective forms"
handle_gender(args, data, "nonlemma")
end
}
pos_functions["adjective dual forms"] = {
params = get_gender_only_params("m-p"),
func = function(args, data)
data.pos_category = "adjective forms"
handle_gender(args, data, "m-d", "nonlemma")
end
}
pos_functions["noun forms"] = {
params = get_gender_only_params(),
func = function(args, data)
handle_gender(args, data, nil, "nonlemma")
end
}
local valid_forms = list_to_set(
{ "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX", "X", "XI", "XII",
"XIII", "XIV", "XV", "Iq", "IIq", "IIIq", "IVq" })
local function handle_conj_form(args, data)
local form = args[2]
if form then
if not valid_forms[form] then
error("Invalid verb conjugation form " .. form)
end
table.insert(data.inflections, { label = '[[Appendix:Arabic verbs#Form ' .. form .. '|form ' .. form .. ']]' })
end
end
pos_functions["verb forms"] = {
params = {
[2] = {},
},
func = function(args, data)
handle_conj_form(args, data)
end
}
local function get_participle_params()
local params = create_infl_list_params(adj_inflections)
params[2] = {}
return params
end
pos_functions["active participles"] = {
params = get_participle_params(),
func = function(args, data)
data.pos_category = "participles"
table.insert(data.categories, lang:getCanonicalName() .. " active participles")
handle_conj_form(args, data)
handle_infl_list_args(args, data, adj_inflections)
end
}
pos_functions["passive participles"] = {
params = get_participle_params(),
func = function(args, data)
data.pos_category = "participles"
table.insert(data.categories, lang:getCanonicalName() .. " passive participles")
handle_conj_form(args, data)
handle_infl_list_args(args, data, adj_inflections)
end
}
return export
144h3jhppylw6j445plq3fk8afuiz0n
لێدوانی بەکارھێنەر:-Haryad
3
11153
36742
36587
2026-08-12T16:27:33Z
-Haryad
34
/* داڕێژە:trans-top */ ans
36742
wikitext
text/x-wiki
==بە خێر بێن ==
<div style="border: 1px solid #d2b48c; background-color: #fdfaf6; padding: 1em 1.5em; margin: 1em 0; border-radius: 10px; line-height: 1.6em;">
<div style="text-align:center; font-weight:bold; font-size:115%; margin-bottom: 1em;">
سڵاو {{ROOTPAGENAME}}، [[ویکیفەرھەنگ:بە خێر بێن، تازەکاران|بە خێر بێن بۆ ویکیفەرھەنگ]]، و سپاس بۆ ئەو بەشدارییانەی تا ئێستا کردووتن.
</div>
ئەگەر بە دەستکاریکردنی ویکی ئاشنا نیت، ئەوا سەیرێکی [[:en:Help:How to edit a page|چۆنێتیی دەستکاریکردنی پەڕە]] بکە. پەڕەکە پێڕستێکی پوختە لەسەر ڕێنمایییە تەکنیکییەکانی ئەو شێوازی ویکییەی ئێمە لێرە بە کاری دەھێنین: بۆ نموونە، چۆن دەقێک تۆخ بکەیت یان بەستەرەکان دروست بکەیت. ئاسوودە بە لە ڕاھێنانکردن لە [[ویکیفەرھەنگ:خۆڵەپەتانێ|خۆڵەپەتانێ]]. ئەگەر حەزت لە پێشەکییەکی ھێواشترە، ئەوا [[ویکیفەرھەنگ:فێرکاری|فێرکارییەکی]] کورتمان ھەیە.
لەوانەیە ئەم بەستەرانە وات لێ بکەن تا خۆت بە ویکیفەرھەنگ ئاشنا بکەیت:
* [[ویکیفەرھەنگ:ڕێکخستنی سەروشە|ڕێکخستنی سەروشە]] سیاسەتێکی وردە لەسەر شێوازی ڕێکخستنی پەڕەی ویکیفەرھەنگ؛ فەرزە ھەموو سەروشەکان پەیڕەویی لێ بکەن. ئاسانترین ڕێگا بۆ ئەوەی دەست پێ بکەیت، ئەوەیە کە ناوەڕۆکی پەڕەیەکی سەروشەی تری ھەمان زمان لەبەر بگریتەوە و، ئینجا لەگەڵ ئەو پەڕەیەی کە دروستی دەکەیت بیگونجێنیت.
* سەیری [[ویکیفەرھەنگ:ڕەچاوکردنی زمان|ڕەچاوکردنی زمان]] بکە تا زیاتر لەسەر چۆنێتیی دەستکاریکردنی زمانێکی دیاریکراو بزانیت.
* [[ویکیفەرھەنگ:پێوەرەکانی قبووڵکردن|پێوەری قبووڵکردنەکەمان]] بەتەواوی باسی ئەو وشانە دەکات کە دەکرێت بۆ ویکیفەرھەنگ زیاد بکرێ؛ گرنگترین شت ئەوەیە کە ویکیفەرھەنگ تەنیا ئەو وشانە قبووڵ دەکات کە بە لای کەمەوە بۆ ماوەی ساڵێک تا ڕادەیەک بە شێوەیەکی بەرفراوان بە کار ھێنراون، و کە گومان ھەبوو داوای ئەو سەرچاوانە بکرێت کە بەکارھێنانیان دەسەلمێنێ.
* ئەگەر پێشتر ئەزموونێکت لە دەستکاریکردنی پڕۆژەی [[w:دەستپێک|ویکیپیدیا]] ھەبووە، ئەوا لەوانەیە [[:en:Wiktionary:Wiktionary for Wikipedians|ڕێنمایی بۆ بەکارھێنەرانی ویکیپیدیا]] بە کەڵک بێت بۆت.
* ئەگەر ھەر پرسیارێکت ھەیە، تکایە بیانبە [[ویکیفەرھەنگ:مێزی زانیاری]] یانیش لە پەڕەی وتووێژەکەم لە منیان بپرسە.
* ھانت دەدەین تا [[:en:WT:Babel|سنووقی بابل]] بۆ پەڕەی بەکارھێنەریت زیاد بکەیت تا ئاستی زانینی زمانەکانت دیاری بکەیت.
<div style="text-align:center; font-weight:bold; margin-top: 1em;">چێژ لە مانەوەت لە ویکیفەرھەنگ ببینە!</div>
</div> [[User:-Haryad |<span style="color:black; font-size:16px;">'''ʜᴀʀʏᴀᴅ'''</span>]] <sub>[[User Talk: -Haryad |<span style="color:yellow; Background:black ">'''ᴛᴀʟᴋ'''</span>]]</sub> ١٧:٢٤، ٢٥ی نیسانی ٢٠٢٦ (+03)
== [[داڕێژە:trans-top]] ==
{{Rtl}}
Silav, Could you replace "right" with "left" here: [[MediaWiki:Common.css#L-569]]. Spas! [[بەکارھێنەر:Ghybu|Ghybu]] ([[لێدوانی بەکارھێنەر:Ghybu|لێدوان]]) ٠٠:٤٠، ٩ی ئابی ٢٠٢٦ (+03)
:Silav Ghybu, bi xêr hatî
:It is written as right because Sorani Kurdish writing is from RTL. If it is changed to left, the translation table will get messed up. [[User:-Haryad |<span style="color:black; font-size:16px;">'''ʜᴀʀʏᴀᴅ'''</span>]] <sub>[[User Talk: -Haryad |<span style="color:yellow; Background:black ">'''ᴛᴀʟᴋ'''</span>]]</sub> ٠٩:٣٨، ٩ی ئابی ٢٠٢٦ (+03)
::Look at the [[Template:trans-top]] table: currently, "[بشارەوە ▲]/[پیشان بدە ▼]" is written to the right of the table; this is incorrect—it should be placed at the far left of the table. Check the Sorani Wikipedia article [https://ckb.wikipedia.org/wiki/%D8%AF%D8%A7%DA%95%DB%8E%DA%98%DB%95:%D9%86%D9%88%D9%88%D8%B3%DB%95%D8%B1%D8%A7%D9%86_%D9%88_%D8%B4%D8%A7%D8%B9%DB%8C%D8%B1%D8%A7%D9%86%DB%8C_%D8%B3%DB%95%D8%AF%DB%95%DB%8C_%D8%A8%DB%8C%D8%B3%D8%AA%DB%95%D9%85%DB%8C_%D9%81%DB%95%DA%95%DB%95%D9%86%D8%B3%D8%A7]: it is located to the left of the title, not to the right. [[بەکارھێنەر:Ghybu|Ghybu]] ([[لێدوانی بەکارھێنەر:Ghybu|لێدوان]]) ١٨:٤٥، ٩ی ئابی ٢٠٢٦ (+03)
:::PS: In the English Wiktionary (written left-to-right), it is also on the right: [https://en.wiktionary.org/wiki/MediaWiki:Gadget-Site.css#L-627]
::::[[بەکارھێنەر:Aram|Aram]]: If you have time, check this out. [[User:-Haryad |<span style="color:black; font-size:16px;">'''ʜᴀʀʏᴀᴅ'''</span>]] <sub>[[User Talk: -Haryad |<span style="color:yellow; Background:black ">'''ᴛᴀʟᴋ'''</span>]]</sub> ٢٣:٠٣، ٩ی ئابی ٢٠٢٦ (+03)
:::::Hey -Haryad and {{وب|Ghybu}} {{کرا|Done!}} To see the changes, please [https://ckb.wiktionary.org/w/index.php?title=%D8%AA%D8%A7%DB%8C%D8%A8%DB%95%D8%AA%3A%D8%A8%DB%95%D8%B4%D8%AF%D8%A7%D8%B1%DB%8C%DB%8C%DB%95%DA%A9%D8%A7%D9%86&target=Aram&namespace=all&tagfilter=&start=2026-08-10&end=2026-08-10&limit=50 check the edits I've made today]. Thanks! [[بەکارھێنەر:Aram|Aram]] ([[لێدوانی بەکارھێنەر:Aram|لێدوان]]) ٠٧:٢٦، ١٠ی ئابی ٢٠٢٦ (+03)
::::::Spas! {{ping|Aram}} Here too [https://ckb.wiktionary.org/wiki/%D9%85%DB%8C%D8%AF%DB%8C%D8%A7%D9%88%DB%8C%DA%A9%DB%8C:Common.css#L-520], <code>padding-left: 10px;</code> needs to be replaced with <code>padding: 1px 10px 1px 5px;</code> because the title is too close to the edge, see [[سێو#وەرگێڕانەکان]]. By the way, what are the Sorani terms for "[[conjugation]]" (of verbs) and "[[declension]]" (of nouns)? That way, I'll be able to add them [[کەوتن|here]]. Do you have a page where you've listed all the section names? I think that could really help newcomers. One more thing: the characters are too small here, aren't they? --[[بەکارھێنەر:Ghybu|Ghybu]] ([[لێدوانی بەکارھێنەر:Ghybu|لێدوان]]) ١٥:٤٣، ١٠ی ئابی ٢٠٢٦ (+03)
::::::: Category names are formed from these words: [[مۆدیوول:headword/data#L-41]], when the templates [[Template:ckb-noun]], [[Template:ckb-verb]], etc., are used. For example: [[:پۆل:کوردیی ناوەندی nouns]] --[[بەکارھێنەر:Ghybu|Ghybu]] ([[لێدوانی بەکارھێنەر:Ghybu|لێدوان]]) ٠٠:٥٧، ١١ی ئابی ٢٠٢٦ (+03)
{{Rtl/end}}
{{Rtl}}
::::::::[[بەکارھێنەر:Aram|Aram]]: ping [[User:-Haryad |<span style="color:black; font-size:16px;">'''ʜᴀʀʏᴀᴅ'''</span>]] <sub>[[User Talk: -Haryad |<span style="color:yellow; Background:black ">'''ᴛᴀʟᴋ'''</span>]]</sub> ١٩:٢٧، ١٢ی ئابی ٢٠٢٦ (+03)
{{Rtl/end}}
kti47gp31phpdfokwdgst9ljnvnxoqj
36745
36742
2026-08-12T20:30:25Z
Ghybu
12
36745
wikitext
text/x-wiki
==بە خێر بێن ==
<div style="border: 1px solid #d2b48c; background-color: #fdfaf6; padding: 1em 1.5em; margin: 1em 0; border-radius: 10px; line-height: 1.6em;">
<div style="text-align:center; font-weight:bold; font-size:115%; margin-bottom: 1em;">
سڵاو {{ROOTPAGENAME}}، [[ویکیفەرھەنگ:بە خێر بێن، تازەکاران|بە خێر بێن بۆ ویکیفەرھەنگ]]، و سپاس بۆ ئەو بەشدارییانەی تا ئێستا کردووتن.
</div>
ئەگەر بە دەستکاریکردنی ویکی ئاشنا نیت، ئەوا سەیرێکی [[:en:Help:How to edit a page|چۆنێتیی دەستکاریکردنی پەڕە]] بکە. پەڕەکە پێڕستێکی پوختە لەسەر ڕێنمایییە تەکنیکییەکانی ئەو شێوازی ویکییەی ئێمە لێرە بە کاری دەھێنین: بۆ نموونە، چۆن دەقێک تۆخ بکەیت یان بەستەرەکان دروست بکەیت. ئاسوودە بە لە ڕاھێنانکردن لە [[ویکیفەرھەنگ:خۆڵەپەتانێ|خۆڵەپەتانێ]]. ئەگەر حەزت لە پێشەکییەکی ھێواشترە، ئەوا [[ویکیفەرھەنگ:فێرکاری|فێرکارییەکی]] کورتمان ھەیە.
لەوانەیە ئەم بەستەرانە وات لێ بکەن تا خۆت بە ویکیفەرھەنگ ئاشنا بکەیت:
* [[ویکیفەرھەنگ:ڕێکخستنی سەروشە|ڕێکخستنی سەروشە]] سیاسەتێکی وردە لەسەر شێوازی ڕێکخستنی پەڕەی ویکیفەرھەنگ؛ فەرزە ھەموو سەروشەکان پەیڕەویی لێ بکەن. ئاسانترین ڕێگا بۆ ئەوەی دەست پێ بکەیت، ئەوەیە کە ناوەڕۆکی پەڕەیەکی سەروشەی تری ھەمان زمان لەبەر بگریتەوە و، ئینجا لەگەڵ ئەو پەڕەیەی کە دروستی دەکەیت بیگونجێنیت.
* سەیری [[ویکیفەرھەنگ:ڕەچاوکردنی زمان|ڕەچاوکردنی زمان]] بکە تا زیاتر لەسەر چۆنێتیی دەستکاریکردنی زمانێکی دیاریکراو بزانیت.
* [[ویکیفەرھەنگ:پێوەرەکانی قبووڵکردن|پێوەری قبووڵکردنەکەمان]] بەتەواوی باسی ئەو وشانە دەکات کە دەکرێت بۆ ویکیفەرھەنگ زیاد بکرێ؛ گرنگترین شت ئەوەیە کە ویکیفەرھەنگ تەنیا ئەو وشانە قبووڵ دەکات کە بە لای کەمەوە بۆ ماوەی ساڵێک تا ڕادەیەک بە شێوەیەکی بەرفراوان بە کار ھێنراون، و کە گومان ھەبوو داوای ئەو سەرچاوانە بکرێت کە بەکارھێنانیان دەسەلمێنێ.
* ئەگەر پێشتر ئەزموونێکت لە دەستکاریکردنی پڕۆژەی [[w:دەستپێک|ویکیپیدیا]] ھەبووە، ئەوا لەوانەیە [[:en:Wiktionary:Wiktionary for Wikipedians|ڕێنمایی بۆ بەکارھێنەرانی ویکیپیدیا]] بە کەڵک بێت بۆت.
* ئەگەر ھەر پرسیارێکت ھەیە، تکایە بیانبە [[ویکیفەرھەنگ:مێزی زانیاری]] یانیش لە پەڕەی وتووێژەکەم لە منیان بپرسە.
* ھانت دەدەین تا [[:en:WT:Babel|سنووقی بابل]] بۆ پەڕەی بەکارھێنەریت زیاد بکەیت تا ئاستی زانینی زمانەکانت دیاری بکەیت.
<div style="text-align:center; font-weight:bold; margin-top: 1em;">چێژ لە مانەوەت لە ویکیفەرھەنگ ببینە!</div>
</div> [[User:-Haryad |<span style="color:black; font-size:16px;">'''ʜᴀʀʏᴀᴅ'''</span>]] <sub>[[User Talk: -Haryad |<span style="color:yellow; Background:black ">'''ᴛᴀʟᴋ'''</span>]]</sub> ١٧:٢٤، ٢٥ی نیسانی ٢٠٢٦ (+03)
== [[داڕێژە:trans-top]] ==
{{Rtl}}
Silav, Could you replace "right" with "left" here: [[MediaWiki:Common.css#L-569]]. Spas! [[بەکارھێنەر:Ghybu|Ghybu]] ([[لێدوانی بەکارھێنەر:Ghybu|لێدوان]]) ٠٠:٤٠، ٩ی ئابی ٢٠٢٦ (+03)
:Silav Ghybu, bi xêr hatî
:It is written as right because Sorani Kurdish writing is from RTL. If it is changed to left, the translation table will get messed up. [[User:-Haryad |<span style="color:black; font-size:16px;">'''ʜᴀʀʏᴀᴅ'''</span>]] <sub>[[User Talk: -Haryad |<span style="color:yellow; Background:black ">'''ᴛᴀʟᴋ'''</span>]]</sub> ٠٩:٣٨، ٩ی ئابی ٢٠٢٦ (+03)
::Look at the [[Template:trans-top]] table: currently, "[بشارەوە ▲]/[پیشان بدە ▼]" is written to the right of the table; this is incorrect—it should be placed at the far left of the table. Check the Sorani Wikipedia article [https://ckb.wikipedia.org/wiki/%D8%AF%D8%A7%DA%95%DB%8E%DA%98%DB%95:%D9%86%D9%88%D9%88%D8%B3%DB%95%D8%B1%D8%A7%D9%86_%D9%88_%D8%B4%D8%A7%D8%B9%DB%8C%D8%B1%D8%A7%D9%86%DB%8C_%D8%B3%DB%95%D8%AF%DB%95%DB%8C_%D8%A8%DB%8C%D8%B3%D8%AA%DB%95%D9%85%DB%8C_%D9%81%DB%95%DA%95%DB%95%D9%86%D8%B3%D8%A7]: it is located to the left of the title, not to the right. [[بەکارھێنەر:Ghybu|Ghybu]] ([[لێدوانی بەکارھێنەر:Ghybu|لێدوان]]) ١٨:٤٥، ٩ی ئابی ٢٠٢٦ (+03)
:::PS: In the English Wiktionary (written left-to-right), it is also on the right: [https://en.wiktionary.org/wiki/MediaWiki:Gadget-Site.css#L-627]
::::[[بەکارھێنەر:Aram|Aram]]: If you have time, check this out. [[User:-Haryad |<span style="color:black; font-size:16px;">'''ʜᴀʀʏᴀᴅ'''</span>]] <sub>[[User Talk: -Haryad |<span style="color:yellow; Background:black ">'''ᴛᴀʟᴋ'''</span>]]</sub> ٢٣:٠٣، ٩ی ئابی ٢٠٢٦ (+03)
:::::Hey -Haryad and {{وب|Ghybu}} {{کرا|Done!}} To see the changes, please [https://ckb.wiktionary.org/w/index.php?title=%D8%AA%D8%A7%DB%8C%D8%A8%DB%95%D8%AA%3A%D8%A8%DB%95%D8%B4%D8%AF%D8%A7%D8%B1%DB%8C%DB%8C%DB%95%DA%A9%D8%A7%D9%86&target=Aram&namespace=all&tagfilter=&start=2026-08-10&end=2026-08-10&limit=50 check the edits I've made today]. Thanks! [[بەکارھێنەر:Aram|Aram]] ([[لێدوانی بەکارھێنەر:Aram|لێدوان]]) ٠٧:٢٦، ١٠ی ئابی ٢٠٢٦ (+03)
::::::Spas! {{ping|Aram}} Here too [https://ckb.wiktionary.org/wiki/%D9%85%DB%8C%D8%AF%DB%8C%D8%A7%D9%88%DB%8C%DA%A9%DB%8C:Common.css#L-520], <code>padding-left: 10px;</code> needs to be replaced with <code>padding: 1px 10px 1px 5px;</code> because the title is too close to the edge, see [[سێو#وەرگێڕانەکان]]. By the way, what are the Sorani terms for "[[conjugation]]" (of verbs) and "[[declension]]" (of nouns)? That way, I'll be able to add them [[کەوتن|here]]. Do you have a page where you've listed all the section names? I think that could really help newcomers. One more thing: the characters are too small here, aren't they? --[[بەکارھێنەر:Ghybu|Ghybu]] ([[لێدوانی بەکارھێنەر:Ghybu|لێدوان]]) ١٥:٤٣، ١٠ی ئابی ٢٠٢٦ (+03)
::::::: Category names are formed from these words: [[مۆدیوول:headword/data#L-41]], when the templates [[Template:ckb-noun]], [[Template:ckb-verb]], etc., are used. For example: [[:پۆل:کوردیی ناوەندی nouns]] --[[بەکارھێنەر:Ghybu|Ghybu]] ([[لێدوانی بەکارھێنەر:Ghybu|لێدوان]]) ٠٠:٥٧، ١١ی ئابی ٢٠٢٦ (+03)
{{Rtl/end}}
{{Rtl}}
::::::::[[بەکارھێنەر:Aram|Aram]]: ping [[User:-Haryad |<span style="color:black; font-size:16px;">'''ʜᴀʀʏᴀᴅ'''</span>]] <sub>[[User Talk: -Haryad |<span style="color:yellow; Background:black ">'''ᴛᴀʟᴋ'''</span>]]</sub> ١٩:٢٧، ١٢ی ئابی ٢٠٢٦ (+03)
:::::::: CaCategories now work using {{tl|auto cat}}. Categories are automatically formed as follows: "Lemma + " بە " + lang", for example: [[:پۆل:ناو بە کوردیی ناوەندی]]
{{Rtl/end}}
o98r1gy31niib8kfem6oxj80go6neot
36749
36745
2026-08-12T20:47:17Z
Ghybu
12
/* داڕێژە:trans-top */
36749
wikitext
text/x-wiki
==بە خێر بێن ==
<div style="border: 1px solid #d2b48c; background-color: #fdfaf6; padding: 1em 1.5em; margin: 1em 0; border-radius: 10px; line-height: 1.6em;">
<div style="text-align:center; font-weight:bold; font-size:115%; margin-bottom: 1em;">
سڵاو {{ROOTPAGENAME}}، [[ویکیفەرھەنگ:بە خێر بێن، تازەکاران|بە خێر بێن بۆ ویکیفەرھەنگ]]، و سپاس بۆ ئەو بەشدارییانەی تا ئێستا کردووتن.
</div>
ئەگەر بە دەستکاریکردنی ویکی ئاشنا نیت، ئەوا سەیرێکی [[:en:Help:How to edit a page|چۆنێتیی دەستکاریکردنی پەڕە]] بکە. پەڕەکە پێڕستێکی پوختە لەسەر ڕێنمایییە تەکنیکییەکانی ئەو شێوازی ویکییەی ئێمە لێرە بە کاری دەھێنین: بۆ نموونە، چۆن دەقێک تۆخ بکەیت یان بەستەرەکان دروست بکەیت. ئاسوودە بە لە ڕاھێنانکردن لە [[ویکیفەرھەنگ:خۆڵەپەتانێ|خۆڵەپەتانێ]]. ئەگەر حەزت لە پێشەکییەکی ھێواشترە، ئەوا [[ویکیفەرھەنگ:فێرکاری|فێرکارییەکی]] کورتمان ھەیە.
لەوانەیە ئەم بەستەرانە وات لێ بکەن تا خۆت بە ویکیفەرھەنگ ئاشنا بکەیت:
* [[ویکیفەرھەنگ:ڕێکخستنی سەروشە|ڕێکخستنی سەروشە]] سیاسەتێکی وردە لەسەر شێوازی ڕێکخستنی پەڕەی ویکیفەرھەنگ؛ فەرزە ھەموو سەروشەکان پەیڕەویی لێ بکەن. ئاسانترین ڕێگا بۆ ئەوەی دەست پێ بکەیت، ئەوەیە کە ناوەڕۆکی پەڕەیەکی سەروشەی تری ھەمان زمان لەبەر بگریتەوە و، ئینجا لەگەڵ ئەو پەڕەیەی کە دروستی دەکەیت بیگونجێنیت.
* سەیری [[ویکیفەرھەنگ:ڕەچاوکردنی زمان|ڕەچاوکردنی زمان]] بکە تا زیاتر لەسەر چۆنێتیی دەستکاریکردنی زمانێکی دیاریکراو بزانیت.
* [[ویکیفەرھەنگ:پێوەرەکانی قبووڵکردن|پێوەری قبووڵکردنەکەمان]] بەتەواوی باسی ئەو وشانە دەکات کە دەکرێت بۆ ویکیفەرھەنگ زیاد بکرێ؛ گرنگترین شت ئەوەیە کە ویکیفەرھەنگ تەنیا ئەو وشانە قبووڵ دەکات کە بە لای کەمەوە بۆ ماوەی ساڵێک تا ڕادەیەک بە شێوەیەکی بەرفراوان بە کار ھێنراون، و کە گومان ھەبوو داوای ئەو سەرچاوانە بکرێت کە بەکارھێنانیان دەسەلمێنێ.
* ئەگەر پێشتر ئەزموونێکت لە دەستکاریکردنی پڕۆژەی [[w:دەستپێک|ویکیپیدیا]] ھەبووە، ئەوا لەوانەیە [[:en:Wiktionary:Wiktionary for Wikipedians|ڕێنمایی بۆ بەکارھێنەرانی ویکیپیدیا]] بە کەڵک بێت بۆت.
* ئەگەر ھەر پرسیارێکت ھەیە، تکایە بیانبە [[ویکیفەرھەنگ:مێزی زانیاری]] یانیش لە پەڕەی وتووێژەکەم لە منیان بپرسە.
* ھانت دەدەین تا [[:en:WT:Babel|سنووقی بابل]] بۆ پەڕەی بەکارھێنەریت زیاد بکەیت تا ئاستی زانینی زمانەکانت دیاری بکەیت.
<div style="text-align:center; font-weight:bold; margin-top: 1em;">چێژ لە مانەوەت لە ویکیفەرھەنگ ببینە!</div>
</div> [[User:-Haryad |<span style="color:black; font-size:16px;">'''ʜᴀʀʏᴀᴅ'''</span>]] <sub>[[User Talk: -Haryad |<span style="color:yellow; Background:black ">'''ᴛᴀʟᴋ'''</span>]]</sub> ١٧:٢٤، ٢٥ی نیسانی ٢٠٢٦ (+03)
== [[داڕێژە:trans-top]] ==
{{Rtl}}
Silav, Could you replace "right" with "left" here: [[MediaWiki:Common.css#L-569]]. Spas! [[بەکارھێنەر:Ghybu|Ghybu]] ([[لێدوانی بەکارھێنەر:Ghybu|لێدوان]]) ٠٠:٤٠، ٩ی ئابی ٢٠٢٦ (+03)
:Silav Ghybu, bi xêr hatî
:It is written as right because Sorani Kurdish writing is from RTL. If it is changed to left, the translation table will get messed up. [[User:-Haryad |<span style="color:black; font-size:16px;">'''ʜᴀʀʏᴀᴅ'''</span>]] <sub>[[User Talk: -Haryad |<span style="color:yellow; Background:black ">'''ᴛᴀʟᴋ'''</span>]]</sub> ٠٩:٣٨، ٩ی ئابی ٢٠٢٦ (+03)
::Look at the [[Template:trans-top]] table: currently, "[بشارەوە ▲]/[پیشان بدە ▼]" is written to the right of the table; this is incorrect—it should be placed at the far left of the table. Check the Sorani Wikipedia article [https://ckb.wikipedia.org/wiki/%D8%AF%D8%A7%DA%95%DB%8E%DA%98%DB%95:%D9%86%D9%88%D9%88%D8%B3%DB%95%D8%B1%D8%A7%D9%86_%D9%88_%D8%B4%D8%A7%D8%B9%DB%8C%D8%B1%D8%A7%D9%86%DB%8C_%D8%B3%DB%95%D8%AF%DB%95%DB%8C_%D8%A8%DB%8C%D8%B3%D8%AA%DB%95%D9%85%DB%8C_%D9%81%DB%95%DA%95%DB%95%D9%86%D8%B3%D8%A7]: it is located to the left of the title, not to the right. [[بەکارھێنەر:Ghybu|Ghybu]] ([[لێدوانی بەکارھێنەر:Ghybu|لێدوان]]) ١٨:٤٥، ٩ی ئابی ٢٠٢٦ (+03)
:::PS: In the English Wiktionary (written left-to-right), it is also on the right: [https://en.wiktionary.org/wiki/MediaWiki:Gadget-Site.css#L-627]
::::[[بەکارھێنەر:Aram|Aram]]: If you have time, check this out. [[User:-Haryad |<span style="color:black; font-size:16px;">'''ʜᴀʀʏᴀᴅ'''</span>]] <sub>[[User Talk: -Haryad |<span style="color:yellow; Background:black ">'''ᴛᴀʟᴋ'''</span>]]</sub> ٢٣:٠٣، ٩ی ئابی ٢٠٢٦ (+03)
:::::Hey -Haryad and {{وب|Ghybu}} {{کرا|Done!}} To see the changes, please [https://ckb.wiktionary.org/w/index.php?title=%D8%AA%D8%A7%DB%8C%D8%A8%DB%95%D8%AA%3A%D8%A8%DB%95%D8%B4%D8%AF%D8%A7%D8%B1%DB%8C%DB%8C%DB%95%DA%A9%D8%A7%D9%86&target=Aram&namespace=all&tagfilter=&start=2026-08-10&end=2026-08-10&limit=50 check the edits I've made today]. Thanks! [[بەکارھێنەر:Aram|Aram]] ([[لێدوانی بەکارھێنەر:Aram|لێدوان]]) ٠٧:٢٦، ١٠ی ئابی ٢٠٢٦ (+03)
::::::Spas! {{ping|Aram}} Here too [https://ckb.wiktionary.org/wiki/%D9%85%DB%8C%D8%AF%DB%8C%D8%A7%D9%88%DB%8C%DA%A9%DB%8C:Common.css#L-520], <code>padding-left: 10px;</code> needs to be replaced with <code>padding: 1px 10px 1px 5px;</code> because the title is too close to the edge, see [[سێو#وەرگێڕانەکان]]. By the way, what are the Sorani terms for "[[conjugation]]" (of verbs) and "[[declension]]" (of nouns)? That way, I'll be able to add them [[کەوتن|here]]. Do you have a page where you've listed all the section names? I think that could really help newcomers. One more thing: the characters are too small here, aren't they? --[[بەکارھێنەر:Ghybu|Ghybu]] ([[لێدوانی بەکارھێنەر:Ghybu|لێدوان]]) ١٥:٤٣، ١٠ی ئابی ٢٠٢٦ (+03)
::::::: Category names are formed from these words: [[مۆدیوول:headword/data#L-41]], when the templates [[Template:ckb-noun]], [[Template:ckb-verb]], etc., are used. For example: [[:پۆل:کوردیی ناوەندی nouns]] --[[بەکارھێنەر:Ghybu|Ghybu]] ([[:لێدوانی بەکارھێنەر:Ghybu|لێدوان]]) ٠٠:٥٧، ١١ی ئابی ٢٠٢٦ (+03)
{{Rtl/end}}
{{Rtl}}
::::::::[[بەکارھێنەر:Aram|Aram]]: ping [[User:-Haryad |<span style="color:black; font-size:16px;">'''ʜᴀʀʏᴀᴅ'''</span>]] <sub>[[User Talk: -Haryad |<span style="color:yellow; Background:black ">'''ᴛᴀʟᴋ'''</span>]]</sub> ١٩:٢٧، ١٢ی ئابی ٢٠٢٦ (+03)
:::::::: CaCategories now work using {{tl|auto cat}}. Categories are automatically formed as follows: "Lemma + " بە " + lang", for example: [[:پۆل:ناو بە کوردیی ناوەندی]]/[[:پۆل:کار بە کوردیی ناوەندی]]
:::::::: The names of the lemmas are here: [[پۆل:ھاوەڵناو بە کوردیی ناوەندی]] --[[بەکارھێنەر:Ghybu|Ghybu]] ([[لێدوانی بەکارھێنەر:Ghybu|لێدوان]]) ٢٣:٤٧، ١٢ی ئابی ٢٠٢٦ (+03)
{{Rtl/end}}
gv8pubr51soqfbebuy1r1ejj2n7axmb
36750
36749
2026-08-12T20:49:04Z
Ghybu
12
/* داڕێژە:trans-top */
36750
wikitext
text/x-wiki
==بە خێر بێن ==
<div style="border: 1px solid #d2b48c; background-color: #fdfaf6; padding: 1em 1.5em; margin: 1em 0; border-radius: 10px; line-height: 1.6em;">
<div style="text-align:center; font-weight:bold; font-size:115%; margin-bottom: 1em;">
سڵاو {{ROOTPAGENAME}}، [[ویکیفەرھەنگ:بە خێر بێن، تازەکاران|بە خێر بێن بۆ ویکیفەرھەنگ]]، و سپاس بۆ ئەو بەشدارییانەی تا ئێستا کردووتن.
</div>
ئەگەر بە دەستکاریکردنی ویکی ئاشنا نیت، ئەوا سەیرێکی [[:en:Help:How to edit a page|چۆنێتیی دەستکاریکردنی پەڕە]] بکە. پەڕەکە پێڕستێکی پوختە لەسەر ڕێنمایییە تەکنیکییەکانی ئەو شێوازی ویکییەی ئێمە لێرە بە کاری دەھێنین: بۆ نموونە، چۆن دەقێک تۆخ بکەیت یان بەستەرەکان دروست بکەیت. ئاسوودە بە لە ڕاھێنانکردن لە [[ویکیفەرھەنگ:خۆڵەپەتانێ|خۆڵەپەتانێ]]. ئەگەر حەزت لە پێشەکییەکی ھێواشترە، ئەوا [[ویکیفەرھەنگ:فێرکاری|فێرکارییەکی]] کورتمان ھەیە.
لەوانەیە ئەم بەستەرانە وات لێ بکەن تا خۆت بە ویکیفەرھەنگ ئاشنا بکەیت:
* [[ویکیفەرھەنگ:ڕێکخستنی سەروشە|ڕێکخستنی سەروشە]] سیاسەتێکی وردە لەسەر شێوازی ڕێکخستنی پەڕەی ویکیفەرھەنگ؛ فەرزە ھەموو سەروشەکان پەیڕەویی لێ بکەن. ئاسانترین ڕێگا بۆ ئەوەی دەست پێ بکەیت، ئەوەیە کە ناوەڕۆکی پەڕەیەکی سەروشەی تری ھەمان زمان لەبەر بگریتەوە و، ئینجا لەگەڵ ئەو پەڕەیەی کە دروستی دەکەیت بیگونجێنیت.
* سەیری [[ویکیفەرھەنگ:ڕەچاوکردنی زمان|ڕەچاوکردنی زمان]] بکە تا زیاتر لەسەر چۆنێتیی دەستکاریکردنی زمانێکی دیاریکراو بزانیت.
* [[ویکیفەرھەنگ:پێوەرەکانی قبووڵکردن|پێوەری قبووڵکردنەکەمان]] بەتەواوی باسی ئەو وشانە دەکات کە دەکرێت بۆ ویکیفەرھەنگ زیاد بکرێ؛ گرنگترین شت ئەوەیە کە ویکیفەرھەنگ تەنیا ئەو وشانە قبووڵ دەکات کە بە لای کەمەوە بۆ ماوەی ساڵێک تا ڕادەیەک بە شێوەیەکی بەرفراوان بە کار ھێنراون، و کە گومان ھەبوو داوای ئەو سەرچاوانە بکرێت کە بەکارھێنانیان دەسەلمێنێ.
* ئەگەر پێشتر ئەزموونێکت لە دەستکاریکردنی پڕۆژەی [[w:دەستپێک|ویکیپیدیا]] ھەبووە، ئەوا لەوانەیە [[:en:Wiktionary:Wiktionary for Wikipedians|ڕێنمایی بۆ بەکارھێنەرانی ویکیپیدیا]] بە کەڵک بێت بۆت.
* ئەگەر ھەر پرسیارێکت ھەیە، تکایە بیانبە [[ویکیفەرھەنگ:مێزی زانیاری]] یانیش لە پەڕەی وتووێژەکەم لە منیان بپرسە.
* ھانت دەدەین تا [[:en:WT:Babel|سنووقی بابل]] بۆ پەڕەی بەکارھێنەریت زیاد بکەیت تا ئاستی زانینی زمانەکانت دیاری بکەیت.
<div style="text-align:center; font-weight:bold; margin-top: 1em;">چێژ لە مانەوەت لە ویکیفەرھەنگ ببینە!</div>
</div> [[User:-Haryad |<span style="color:black; font-size:16px;">'''ʜᴀʀʏᴀᴅ'''</span>]] <sub>[[User Talk: -Haryad |<span style="color:yellow; Background:black ">'''ᴛᴀʟᴋ'''</span>]]</sub> ١٧:٢٤، ٢٥ی نیسانی ٢٠٢٦ (+03)
== [[داڕێژە:trans-top]] ==
{{Rtl}}
Silav, Could you replace "right" with "left" here: [[MediaWiki:Common.css#L-569]]. Spas! [[بەکارھێنەر:Ghybu|Ghybu]] ([[لێدوانی بەکارھێنەر:Ghybu|لێدوان]]) ٠٠:٤٠، ٩ی ئابی ٢٠٢٦ (+03)
:Silav Ghybu, bi xêr hatî
:It is written as right because Sorani Kurdish writing is from RTL. If it is changed to left, the translation table will get messed up. [[User:-Haryad |<span style="color:black; font-size:16px;">'''ʜᴀʀʏᴀᴅ'''</span>]] <sub>[[User Talk: -Haryad |<span style="color:yellow; Background:black ">'''ᴛᴀʟᴋ'''</span>]]</sub> ٠٩:٣٨، ٩ی ئابی ٢٠٢٦ (+03)
::Look at the [[Template:trans-top]] table: currently, "[بشارەوە ▲]/[پیشان بدە ▼]" is written to the right of the table; this is incorrect—it should be placed at the far left of the table. Check the Sorani Wikipedia article [https://ckb.wikipedia.org/wiki/%D8%AF%D8%A7%DA%95%DB%8E%DA%98%DB%95:%D9%86%D9%88%D9%88%D8%B3%DB%95%D8%B1%D8%A7%D9%86_%D9%88_%D8%B4%D8%A7%D8%B9%DB%8C%D8%B1%D8%A7%D9%86%DB%8C_%D8%B3%DB%95%D8%AF%DB%95%DB%8C_%D8%A8%DB%8C%D8%B3%D8%AA%DB%95%D9%85%DB%8C_%D9%81%DB%95%DA%95%DB%95%D9%86%D8%B3%D8%A7]: it is located to the left of the title, not to the right. [[بەکارھێنەر:Ghybu|Ghybu]] ([[لێدوانی بەکارھێنەر:Ghybu|لێدوان]]) ١٨:٤٥، ٩ی ئابی ٢٠٢٦ (+03)
:::PS: In the English Wiktionary (written left-to-right), it is also on the right: [https://en.wiktionary.org/wiki/MediaWiki:Gadget-Site.css#L-627]
::::[[بەکارھێنەر:Aram|Aram]]: If you have time, check this out. [[User:-Haryad |<span style="color:black; font-size:16px;">'''ʜᴀʀʏᴀᴅ'''</span>]] <sub>[[User Talk: -Haryad |<span style="color:yellow; Background:black ">'''ᴛᴀʟᴋ'''</span>]]</sub> ٢٣:٠٣، ٩ی ئابی ٢٠٢٦ (+03)
:::::Hey -Haryad and {{وب|Ghybu}} {{کرا|Done!}} To see the changes, please [https://ckb.wiktionary.org/w/index.php?title=%D8%AA%D8%A7%DB%8C%D8%A8%DB%95%D8%AA%3A%D8%A8%DB%95%D8%B4%D8%AF%D8%A7%D8%B1%DB%8C%DB%8C%DB%95%DA%A9%D8%A7%D9%86&target=Aram&namespace=all&tagfilter=&start=2026-08-10&end=2026-08-10&limit=50 check the edits I've made today]. Thanks! [[بەکارھێنەر:Aram|Aram]] ([[لێدوانی بەکارھێنەر:Aram|لێدوان]]) ٠٧:٢٦، ١٠ی ئابی ٢٠٢٦ (+03)
::::::Spas! {{ping|Aram}} Here too [https://ckb.wiktionary.org/wiki/%D9%85%DB%8C%D8%AF%DB%8C%D8%A7%D9%88%DB%8C%DA%A9%DB%8C:Common.css#L-520], <code>padding-left: 10px;</code> needs to be replaced with <code>padding: 1px 10px 1px 5px;</code> because the title is too close to the edge, see [[سێو#وەرگێڕانەکان]]. By the way, what are the Sorani terms for "[[conjugation]]" (of verbs) and "[[declension]]" (of nouns)? That way, I'll be able to add them [[کەوتن|here]]. Do you have a page where you've listed all the section names? I think that could really help newcomers. One more thing: the characters are too small here, aren't they? --[[بەکارھێنەر:Ghybu|Ghybu]] ([[لێدوانی بەکارھێنەر:Ghybu|لێدوان]]) ١٥:٤٣، ١٠ی ئابی ٢٠٢٦ (+03)
::::::: Category names are formed from these words: [[مۆدیوول:headword/data#L-41]], when the templates [[Template:ckb-noun]], [[Template:ckb-verb]], etc., are used. For example: [[:پۆل:کوردیی ناوەندی nouns]] --[[بەکارھێنەر:Ghybu|Ghybu]] ([[:لێدوانی بەکارھێنەر:Ghybu|لێدوان]]) ٠٠:٥٧، ١١ی ئابی ٢٠٢٦ (+03)
{{Rtl/end}}
{{Rtl}}
::::::::[[بەکارھێنەر:Aram|Aram]]: ping [[User:-Haryad |<span style="color:black; font-size:16px;">'''ʜᴀʀʏᴀᴅ'''</span>]] <sub>[[User Talk: -Haryad |<span style="color:yellow; Background:black ">'''ᴛᴀʟᴋ'''</span>]]</sub> ١٩:٢٧، ١٢ی ئابی ٢٠٢٦ (+03)
:::::::: CaCategories now work using {{tl|auto cat}}. Categories are automatically formed as follows: "Lemma + " بە " + lang", for example: [[:پۆل:ناو بە کوردیی ناوەندی]]/[[:پۆل:کار بە کوردیی ناوەندی]]
:::::::: The names of the lemmas are here: [[:مۆدیوول:category tree/lemmas]] --[[بەکارھێنەر:Ghybu|Ghybu]] ([[لێدوانی بەکارھێنەر:Ghybu|لێدوان]]) ٢٣:٤٧، ١٢ی ئابی ٢٠٢٦ (+03)
{{Rtl/end}}
j5r4zvf65iqme4jntftts7vua8oa0vg
36751
36750
2026-08-12T20:55:26Z
Ghybu
12
/* داڕێژە:trans-top */
36751
wikitext
text/x-wiki
==بە خێر بێن ==
<div style="border: 1px solid #d2b48c; background-color: #fdfaf6; padding: 1em 1.5em; margin: 1em 0; border-radius: 10px; line-height: 1.6em;">
<div style="text-align:center; font-weight:bold; font-size:115%; margin-bottom: 1em;">
سڵاو {{ROOTPAGENAME}}، [[ویکیفەرھەنگ:بە خێر بێن، تازەکاران|بە خێر بێن بۆ ویکیفەرھەنگ]]، و سپاس بۆ ئەو بەشدارییانەی تا ئێستا کردووتن.
</div>
ئەگەر بە دەستکاریکردنی ویکی ئاشنا نیت، ئەوا سەیرێکی [[:en:Help:How to edit a page|چۆنێتیی دەستکاریکردنی پەڕە]] بکە. پەڕەکە پێڕستێکی پوختە لەسەر ڕێنمایییە تەکنیکییەکانی ئەو شێوازی ویکییەی ئێمە لێرە بە کاری دەھێنین: بۆ نموونە، چۆن دەقێک تۆخ بکەیت یان بەستەرەکان دروست بکەیت. ئاسوودە بە لە ڕاھێنانکردن لە [[ویکیفەرھەنگ:خۆڵەپەتانێ|خۆڵەپەتانێ]]. ئەگەر حەزت لە پێشەکییەکی ھێواشترە، ئەوا [[ویکیفەرھەنگ:فێرکاری|فێرکارییەکی]] کورتمان ھەیە.
لەوانەیە ئەم بەستەرانە وات لێ بکەن تا خۆت بە ویکیفەرھەنگ ئاشنا بکەیت:
* [[ویکیفەرھەنگ:ڕێکخستنی سەروشە|ڕێکخستنی سەروشە]] سیاسەتێکی وردە لەسەر شێوازی ڕێکخستنی پەڕەی ویکیفەرھەنگ؛ فەرزە ھەموو سەروشەکان پەیڕەویی لێ بکەن. ئاسانترین ڕێگا بۆ ئەوەی دەست پێ بکەیت، ئەوەیە کە ناوەڕۆکی پەڕەیەکی سەروشەی تری ھەمان زمان لەبەر بگریتەوە و، ئینجا لەگەڵ ئەو پەڕەیەی کە دروستی دەکەیت بیگونجێنیت.
* سەیری [[ویکیفەرھەنگ:ڕەچاوکردنی زمان|ڕەچاوکردنی زمان]] بکە تا زیاتر لەسەر چۆنێتیی دەستکاریکردنی زمانێکی دیاریکراو بزانیت.
* [[ویکیفەرھەنگ:پێوەرەکانی قبووڵکردن|پێوەری قبووڵکردنەکەمان]] بەتەواوی باسی ئەو وشانە دەکات کە دەکرێت بۆ ویکیفەرھەنگ زیاد بکرێ؛ گرنگترین شت ئەوەیە کە ویکیفەرھەنگ تەنیا ئەو وشانە قبووڵ دەکات کە بە لای کەمەوە بۆ ماوەی ساڵێک تا ڕادەیەک بە شێوەیەکی بەرفراوان بە کار ھێنراون، و کە گومان ھەبوو داوای ئەو سەرچاوانە بکرێت کە بەکارھێنانیان دەسەلمێنێ.
* ئەگەر پێشتر ئەزموونێکت لە دەستکاریکردنی پڕۆژەی [[w:دەستپێک|ویکیپیدیا]] ھەبووە، ئەوا لەوانەیە [[:en:Wiktionary:Wiktionary for Wikipedians|ڕێنمایی بۆ بەکارھێنەرانی ویکیپیدیا]] بە کەڵک بێت بۆت.
* ئەگەر ھەر پرسیارێکت ھەیە، تکایە بیانبە [[ویکیفەرھەنگ:مێزی زانیاری]] یانیش لە پەڕەی وتووێژەکەم لە منیان بپرسە.
* ھانت دەدەین تا [[:en:WT:Babel|سنووقی بابل]] بۆ پەڕەی بەکارھێنەریت زیاد بکەیت تا ئاستی زانینی زمانەکانت دیاری بکەیت.
<div style="text-align:center; font-weight:bold; margin-top: 1em;">چێژ لە مانەوەت لە ویکیفەرھەنگ ببینە!</div>
</div> [[User:-Haryad |<span style="color:black; font-size:16px;">'''ʜᴀʀʏᴀᴅ'''</span>]] <sub>[[User Talk: -Haryad |<span style="color:yellow; Background:black ">'''ᴛᴀʟᴋ'''</span>]]</sub> ١٧:٢٤، ٢٥ی نیسانی ٢٠٢٦ (+03)
== [[داڕێژە:trans-top]] ==
{{Rtl}}
Silav, Could you replace "right" with "left" here: [[MediaWiki:Common.css#L-569]]. Spas! [[بەکارھێنەر:Ghybu|Ghybu]] ([[لێدوانی بەکارھێنەر:Ghybu|لێدوان]]) ٠٠:٤٠، ٩ی ئابی ٢٠٢٦ (+03)
:Silav Ghybu, bi xêr hatî
:It is written as right because Sorani Kurdish writing is from RTL. If it is changed to left, the translation table will get messed up. [[User:-Haryad |<span style="color:black; font-size:16px;">'''ʜᴀʀʏᴀᴅ'''</span>]] <sub>[[User Talk: -Haryad |<span style="color:yellow; Background:black ">'''ᴛᴀʟᴋ'''</span>]]</sub> ٠٩:٣٨، ٩ی ئابی ٢٠٢٦ (+03)
::Look at the [[Template:trans-top]] table: currently, "[بشارەوە ▲]/[پیشان بدە ▼]" is written to the right of the table; this is incorrect—it should be placed at the far left of the table. Check the Sorani Wikipedia article [https://ckb.wikipedia.org/wiki/%D8%AF%D8%A7%DA%95%DB%8E%DA%98%DB%95:%D9%86%D9%88%D9%88%D8%B3%DB%95%D8%B1%D8%A7%D9%86_%D9%88_%D8%B4%D8%A7%D8%B9%DB%8C%D8%B1%D8%A7%D9%86%DB%8C_%D8%B3%DB%95%D8%AF%DB%95%DB%8C_%D8%A8%DB%8C%D8%B3%D8%AA%DB%95%D9%85%DB%8C_%D9%81%DB%95%DA%95%DB%95%D9%86%D8%B3%D8%A7]: it is located to the left of the title, not to the right. [[بەکارھێنەر:Ghybu|Ghybu]] ([[لێدوانی بەکارھێنەر:Ghybu|لێدوان]]) ١٨:٤٥، ٩ی ئابی ٢٠٢٦ (+03)
:::PS: In the English Wiktionary (written left-to-right), it is also on the right: [https://en.wiktionary.org/wiki/MediaWiki:Gadget-Site.css#L-627]
::::[[بەکارھێنەر:Aram|Aram]]: If you have time, check this out. [[User:-Haryad |<span style="color:black; font-size:16px;">'''ʜᴀʀʏᴀᴅ'''</span>]] <sub>[[User Talk: -Haryad |<span style="color:yellow; Background:black ">'''ᴛᴀʟᴋ'''</span>]]</sub> ٢٣:٠٣، ٩ی ئابی ٢٠٢٦ (+03)
:::::Hey -Haryad and {{وب|Ghybu}} {{کرا|Done!}} To see the changes, please [https://ckb.wiktionary.org/w/index.php?title=%D8%AA%D8%A7%DB%8C%D8%A8%DB%95%D8%AA%3A%D8%A8%DB%95%D8%B4%D8%AF%D8%A7%D8%B1%DB%8C%DB%8C%DB%95%DA%A9%D8%A7%D9%86&target=Aram&namespace=all&tagfilter=&start=2026-08-10&end=2026-08-10&limit=50 check the edits I've made today]. Thanks! [[بەکارھێنەر:Aram|Aram]] ([[لێدوانی بەکارھێنەر:Aram|لێدوان]]) ٠٧:٢٦، ١٠ی ئابی ٢٠٢٦ (+03)
::::::Spas! {{ping|Aram}} Here too [https://ckb.wiktionary.org/wiki/%D9%85%DB%8C%D8%AF%DB%8C%D8%A7%D9%88%DB%8C%DA%A9%DB%8C:Common.css#L-520], <code>padding-left: 10px;</code> needs to be replaced with <code>padding: 1px 10px 1px 5px;</code> because the title is too close to the edge, see [[سێو#وەرگێڕانەکان]]. By the way, what are the Sorani terms for "[[conjugation]]" (of verbs) and "[[declension]]" (of nouns)? That way, I'll be able to add them [[کەوتن|here]]. Do you have a page where you've listed all the section names? I think that could really help newcomers. One more thing: the characters are too small here, aren't they? --[[بەکارھێنەر:Ghybu|Ghybu]] ([[لێدوانی بەکارھێنەر:Ghybu|لێدوان]]) ١٥:٤٣، ١٠ی ئابی ٢٠٢٦ (+03)
::::::: Category names are formed from these words: [[مۆدیوول:headword/data#L-41]], when the templates [[Template:ckb-noun]], [[Template:ckb-verb]], etc., are used. For example: [[:پۆل:کوردیی ناوەندی nouns]] --[[بەکارھێنەر:Ghybu|Ghybu]] ([[:لێدوانی بەکارھێنەر:Ghybu|لێدوان]]) ٠٠:٥٧، ١١ی ئابی ٢٠٢٦ (+03)
{{Rtl/end}}
{{Rtl}}
::::::::[[بەکارھێنەر:Aram|Aram]]: ping [[User:-Haryad |<span style="color:black; font-size:16px;">'''ʜᴀʀʏᴀᴅ'''</span>]] <sub>[[User Talk: -Haryad |<span style="color:yellow; Background:black ">'''ᴛᴀʟᴋ'''</span>]]</sub> ١٩:٢٧، ١٢ی ئابی ٢٠٢٦ (+03)
:::::::: Categories now work using {{tl|auto cat}}. Categories are automatically formed as follows: "Lemma + " بە " + lang", for example: [[:پۆل:ناو بە کوردیی ناوەندی]]/[[:پۆل:کار بە کوردیی ناوەندی]]
:::::::: The names of the lemmas are here: [[:مۆدیوول:category tree/lemmas]]
:::::::: For example, you can change the description displayed in English in the category here: [https://ckb.wiktionary.org/w/index.php?title=%D9%85%DB%86%D8%AF%DB%8C%D9%88%D9%88%D9%84:category_tree/lemmas&oldid=36747#L-633] --[[بەکارھێنەر:Ghybu|Ghybu]] ([[لێدوانی بەکارھێنەر:Ghybu|لێدوان]]) ٢٣:٤٧، ١٢ی ئابی ٢٠٢٦ (+03)
{{Rtl/end}}
cdmn07ahod1xflj2r7nbn7s9ajhlwh1
36752
36751
2026-08-12T21:11:20Z
Ghybu
12
/* داڕێژە:trans-top */
36752
wikitext
text/x-wiki
==بە خێر بێن ==
<div style="border: 1px solid #d2b48c; background-color: #fdfaf6; padding: 1em 1.5em; margin: 1em 0; border-radius: 10px; line-height: 1.6em;">
<div style="text-align:center; font-weight:bold; font-size:115%; margin-bottom: 1em;">
سڵاو {{ROOTPAGENAME}}، [[ویکیفەرھەنگ:بە خێر بێن، تازەکاران|بە خێر بێن بۆ ویکیفەرھەنگ]]، و سپاس بۆ ئەو بەشدارییانەی تا ئێستا کردووتن.
</div>
ئەگەر بە دەستکاریکردنی ویکی ئاشنا نیت، ئەوا سەیرێکی [[:en:Help:How to edit a page|چۆنێتیی دەستکاریکردنی پەڕە]] بکە. پەڕەکە پێڕستێکی پوختە لەسەر ڕێنمایییە تەکنیکییەکانی ئەو شێوازی ویکییەی ئێمە لێرە بە کاری دەھێنین: بۆ نموونە، چۆن دەقێک تۆخ بکەیت یان بەستەرەکان دروست بکەیت. ئاسوودە بە لە ڕاھێنانکردن لە [[ویکیفەرھەنگ:خۆڵەپەتانێ|خۆڵەپەتانێ]]. ئەگەر حەزت لە پێشەکییەکی ھێواشترە، ئەوا [[ویکیفەرھەنگ:فێرکاری|فێرکارییەکی]] کورتمان ھەیە.
لەوانەیە ئەم بەستەرانە وات لێ بکەن تا خۆت بە ویکیفەرھەنگ ئاشنا بکەیت:
* [[ویکیفەرھەنگ:ڕێکخستنی سەروشە|ڕێکخستنی سەروشە]] سیاسەتێکی وردە لەسەر شێوازی ڕێکخستنی پەڕەی ویکیفەرھەنگ؛ فەرزە ھەموو سەروشەکان پەیڕەویی لێ بکەن. ئاسانترین ڕێگا بۆ ئەوەی دەست پێ بکەیت، ئەوەیە کە ناوەڕۆکی پەڕەیەکی سەروشەی تری ھەمان زمان لەبەر بگریتەوە و، ئینجا لەگەڵ ئەو پەڕەیەی کە دروستی دەکەیت بیگونجێنیت.
* سەیری [[ویکیفەرھەنگ:ڕەچاوکردنی زمان|ڕەچاوکردنی زمان]] بکە تا زیاتر لەسەر چۆنێتیی دەستکاریکردنی زمانێکی دیاریکراو بزانیت.
* [[ویکیفەرھەنگ:پێوەرەکانی قبووڵکردن|پێوەری قبووڵکردنەکەمان]] بەتەواوی باسی ئەو وشانە دەکات کە دەکرێت بۆ ویکیفەرھەنگ زیاد بکرێ؛ گرنگترین شت ئەوەیە کە ویکیفەرھەنگ تەنیا ئەو وشانە قبووڵ دەکات کە بە لای کەمەوە بۆ ماوەی ساڵێک تا ڕادەیەک بە شێوەیەکی بەرفراوان بە کار ھێنراون، و کە گومان ھەبوو داوای ئەو سەرچاوانە بکرێت کە بەکارھێنانیان دەسەلمێنێ.
* ئەگەر پێشتر ئەزموونێکت لە دەستکاریکردنی پڕۆژەی [[w:دەستپێک|ویکیپیدیا]] ھەبووە، ئەوا لەوانەیە [[:en:Wiktionary:Wiktionary for Wikipedians|ڕێنمایی بۆ بەکارھێنەرانی ویکیپیدیا]] بە کەڵک بێت بۆت.
* ئەگەر ھەر پرسیارێکت ھەیە، تکایە بیانبە [[ویکیفەرھەنگ:مێزی زانیاری]] یانیش لە پەڕەی وتووێژەکەم لە منیان بپرسە.
* ھانت دەدەین تا [[:en:WT:Babel|سنووقی بابل]] بۆ پەڕەی بەکارھێنەریت زیاد بکەیت تا ئاستی زانینی زمانەکانت دیاری بکەیت.
<div style="text-align:center; font-weight:bold; margin-top: 1em;">چێژ لە مانەوەت لە ویکیفەرھەنگ ببینە!</div>
</div> [[User:-Haryad |<span style="color:black; font-size:16px;">'''ʜᴀʀʏᴀᴅ'''</span>]] <sub>[[User Talk: -Haryad |<span style="color:yellow; Background:black ">'''ᴛᴀʟᴋ'''</span>]]</sub> ١٧:٢٤، ٢٥ی نیسانی ٢٠٢٦ (+03)
== [[داڕێژە:trans-top]] ==
{{Rtl}}
Silav, Could you replace "right" with "left" here: [[MediaWiki:Common.css#L-569]]. Spas! [[بەکارھێنەر:Ghybu|Ghybu]] ([[لێدوانی بەکارھێنەر:Ghybu|لێدوان]]) ٠٠:٤٠، ٩ی ئابی ٢٠٢٦ (+03)
:Silav Ghybu, bi xêr hatî
:It is written as right because Sorani Kurdish writing is from RTL. If it is changed to left, the translation table will get messed up. [[User:-Haryad |<span style="color:black; font-size:16px;">'''ʜᴀʀʏᴀᴅ'''</span>]] <sub>[[User Talk: -Haryad |<span style="color:yellow; Background:black ">'''ᴛᴀʟᴋ'''</span>]]</sub> ٠٩:٣٨، ٩ی ئابی ٢٠٢٦ (+03)
::Look at the [[Template:trans-top]] table: currently, "[بشارەوە ▲]/[پیشان بدە ▼]" is written to the right of the table; this is incorrect—it should be placed at the far left of the table. Check the Sorani Wikipedia article [https://ckb.wikipedia.org/wiki/%D8%AF%D8%A7%DA%95%DB%8E%DA%98%DB%95:%D9%86%D9%88%D9%88%D8%B3%DB%95%D8%B1%D8%A7%D9%86_%D9%88_%D8%B4%D8%A7%D8%B9%DB%8C%D8%B1%D8%A7%D9%86%DB%8C_%D8%B3%DB%95%D8%AF%DB%95%DB%8C_%D8%A8%DB%8C%D8%B3%D8%AA%DB%95%D9%85%DB%8C_%D9%81%DB%95%DA%95%DB%95%D9%86%D8%B3%D8%A7]: it is located to the left of the title, not to the right. [[بەکارھێنەر:Ghybu|Ghybu]] ([[لێدوانی بەکارھێنەر:Ghybu|لێدوان]]) ١٨:٤٥، ٩ی ئابی ٢٠٢٦ (+03)
:::PS: In the English Wiktionary (written left-to-right), it is also on the right: [https://en.wiktionary.org/wiki/MediaWiki:Gadget-Site.css#L-627]
::::[[بەکارھێنەر:Aram|Aram]]: If you have time, check this out. [[User:-Haryad |<span style="color:black; font-size:16px;">'''ʜᴀʀʏᴀᴅ'''</span>]] <sub>[[User Talk: -Haryad |<span style="color:yellow; Background:black ">'''ᴛᴀʟᴋ'''</span>]]</sub> ٢٣:٠٣، ٩ی ئابی ٢٠٢٦ (+03)
:::::Hey -Haryad and {{وب|Ghybu}} {{کرا|Done!}} To see the changes, please [https://ckb.wiktionary.org/w/index.php?title=%D8%AA%D8%A7%DB%8C%D8%A8%DB%95%D8%AA%3A%D8%A8%DB%95%D8%B4%D8%AF%D8%A7%D8%B1%DB%8C%DB%8C%DB%95%DA%A9%D8%A7%D9%86&target=Aram&namespace=all&tagfilter=&start=2026-08-10&end=2026-08-10&limit=50 check the edits I've made today]. Thanks! [[بەکارھێنەر:Aram|Aram]] ([[لێدوانی بەکارھێنەر:Aram|لێدوان]]) ٠٧:٢٦، ١٠ی ئابی ٢٠٢٦ (+03)
::::::Spas! {{ping|Aram}} Here too [https://ckb.wiktionary.org/wiki/%D9%85%DB%8C%D8%AF%DB%8C%D8%A7%D9%88%DB%8C%DA%A9%DB%8C:Common.css#L-520], <code>padding-left: 10px;</code> needs to be replaced with <code>padding: 1px 10px 1px 5px;</code> because the title is too close to the edge, see [[سێو#وەرگێڕانەکان]]. By the way, what are the Sorani terms for "[[conjugation]]" (of verbs) and "[[declension]]" (of nouns)? That way, I'll be able to add them [[کەوتن|here]]. Do you have a page where you've listed all the section names? I think that could really help newcomers. One more thing: the characters are too small here, aren't they? --[[بەکارھێنەر:Ghybu|Ghybu]] ([[لێدوانی بەکارھێنەر:Ghybu|لێدوان]]) ١٥:٤٣، ١٠ی ئابی ٢٠٢٦ (+03)
::::::: Category names are formed from these words: [[مۆدیوول:headword/data#L-41]], when the templates [[Template:ckb-noun]], [[Template:ckb-verb]], etc., are used. For example: [[:پۆل:کوردیی ناوەندی nouns]] --[[بەکارھێنەر:Ghybu|Ghybu]] ([[:لێدوانی بەکارھێنەر:Ghybu|لێدوان]]) ٠٠:٥٧، ١١ی ئابی ٢٠٢٦ (+03)
{{Rtl/end}}
{{Rtl}}
::::::::[[بەکارھێنەر:Aram|Aram]]: ping [[User:-Haryad |<span style="color:black; font-size:16px;">'''ʜᴀʀʏᴀᴅ'''</span>]] <sub>[[User Talk: -Haryad |<span style="color:yellow; Background:black ">'''ᴛᴀʟᴋ'''</span>]]</sub> ١٩:٢٧، ١٢ی ئابی ٢٠٢٦ (+03)
:::::::: Categories now work using {{tl|auto cat}}. Categories are automatically formed as follows: "Lemma + " بە " + lang", for example: [[:پۆل:ناو بە کوردیی ناوەندی]]/[[:پۆل:کار بە کوردیی ناوەندی]]
:::::::: The names of the lemmas are here: [[:مۆدیوول:category tree/lemmas]]
:::::::: For example, you can change the description displayed in English in the category here: [https://ckb.wiktionary.org/w/index.php?title=%D9%85%DB%86%D8%AF%DB%8C%D9%88%D9%88%D9%84:category_tree/lemmas&oldid=36747#L-633] --[[بەکارھێنەر:Ghybu|Ghybu]] ([[لێدوانی بەکارھێنەر:Ghybu|لێدوان]]) ٢٣:٤٧، ١٢ی ئابی ٢٠٢٦ (+03)
:::::::: One last remark, and then I'll leave you be :) You created the language category names by adding "زمانی" (ziman), like here [[:پۆل:زمانی کوردیی ناوەندی]]. Why not create the category using simply the name of the language, as most Wiktionaries do?
{{Rtl/end}}
se0upv30wn4oea2kgw1fqxeb6t7j9o1
36753
36752
2026-08-12T21:13:48Z
Ghybu
12
îmze
36753
wikitext
text/x-wiki
==بە خێر بێن ==
<div style="border: 1px solid #d2b48c; background-color: #fdfaf6; padding: 1em 1.5em; margin: 1em 0; border-radius: 10px; line-height: 1.6em;">
<div style="text-align:center; font-weight:bold; font-size:115%; margin-bottom: 1em;">
سڵاو {{ROOTPAGENAME}}، [[ویکیفەرھەنگ:بە خێر بێن، تازەکاران|بە خێر بێن بۆ ویکیفەرھەنگ]]، و سپاس بۆ ئەو بەشدارییانەی تا ئێستا کردووتن.
</div>
ئەگەر بە دەستکاریکردنی ویکی ئاشنا نیت، ئەوا سەیرێکی [[:en:Help:How to edit a page|چۆنێتیی دەستکاریکردنی پەڕە]] بکە. پەڕەکە پێڕستێکی پوختە لەسەر ڕێنمایییە تەکنیکییەکانی ئەو شێوازی ویکییەی ئێمە لێرە بە کاری دەھێنین: بۆ نموونە، چۆن دەقێک تۆخ بکەیت یان بەستەرەکان دروست بکەیت. ئاسوودە بە لە ڕاھێنانکردن لە [[ویکیفەرھەنگ:خۆڵەپەتانێ|خۆڵەپەتانێ]]. ئەگەر حەزت لە پێشەکییەکی ھێواشترە، ئەوا [[ویکیفەرھەنگ:فێرکاری|فێرکارییەکی]] کورتمان ھەیە.
لەوانەیە ئەم بەستەرانە وات لێ بکەن تا خۆت بە ویکیفەرھەنگ ئاشنا بکەیت:
* [[ویکیفەرھەنگ:ڕێکخستنی سەروشە|ڕێکخستنی سەروشە]] سیاسەتێکی وردە لەسەر شێوازی ڕێکخستنی پەڕەی ویکیفەرھەنگ؛ فەرزە ھەموو سەروشەکان پەیڕەویی لێ بکەن. ئاسانترین ڕێگا بۆ ئەوەی دەست پێ بکەیت، ئەوەیە کە ناوەڕۆکی پەڕەیەکی سەروشەی تری ھەمان زمان لەبەر بگریتەوە و، ئینجا لەگەڵ ئەو پەڕەیەی کە دروستی دەکەیت بیگونجێنیت.
* سەیری [[ویکیفەرھەنگ:ڕەچاوکردنی زمان|ڕەچاوکردنی زمان]] بکە تا زیاتر لەسەر چۆنێتیی دەستکاریکردنی زمانێکی دیاریکراو بزانیت.
* [[ویکیفەرھەنگ:پێوەرەکانی قبووڵکردن|پێوەری قبووڵکردنەکەمان]] بەتەواوی باسی ئەو وشانە دەکات کە دەکرێت بۆ ویکیفەرھەنگ زیاد بکرێ؛ گرنگترین شت ئەوەیە کە ویکیفەرھەنگ تەنیا ئەو وشانە قبووڵ دەکات کە بە لای کەمەوە بۆ ماوەی ساڵێک تا ڕادەیەک بە شێوەیەکی بەرفراوان بە کار ھێنراون، و کە گومان ھەبوو داوای ئەو سەرچاوانە بکرێت کە بەکارھێنانیان دەسەلمێنێ.
* ئەگەر پێشتر ئەزموونێکت لە دەستکاریکردنی پڕۆژەی [[w:دەستپێک|ویکیپیدیا]] ھەبووە، ئەوا لەوانەیە [[:en:Wiktionary:Wiktionary for Wikipedians|ڕێنمایی بۆ بەکارھێنەرانی ویکیپیدیا]] بە کەڵک بێت بۆت.
* ئەگەر ھەر پرسیارێکت ھەیە، تکایە بیانبە [[ویکیفەرھەنگ:مێزی زانیاری]] یانیش لە پەڕەی وتووێژەکەم لە منیان بپرسە.
* ھانت دەدەین تا [[:en:WT:Babel|سنووقی بابل]] بۆ پەڕەی بەکارھێنەریت زیاد بکەیت تا ئاستی زانینی زمانەکانت دیاری بکەیت.
<div style="text-align:center; font-weight:bold; margin-top: 1em;">چێژ لە مانەوەت لە ویکیفەرھەنگ ببینە!</div>
</div> [[User:-Haryad |<span style="color:black; font-size:16px;">'''ʜᴀʀʏᴀᴅ'''</span>]] <sub>[[User Talk: -Haryad |<span style="color:yellow; Background:black ">'''ᴛᴀʟᴋ'''</span>]]</sub> ١٧:٢٤، ٢٥ی نیسانی ٢٠٢٦ (+03)
== [[داڕێژە:trans-top]] ==
{{Rtl}}
Silav, Could you replace "right" with "left" here: [[MediaWiki:Common.css#L-569]]. Spas! [[بەکارھێنەر:Ghybu|Ghybu]] ([[لێدوانی بەکارھێنەر:Ghybu|لێدوان]]) ٠٠:٤٠، ٩ی ئابی ٢٠٢٦ (+03)
:Silav Ghybu, bi xêr hatî
:It is written as right because Sorani Kurdish writing is from RTL. If it is changed to left, the translation table will get messed up. [[User:-Haryad |<span style="color:black; font-size:16px;">'''ʜᴀʀʏᴀᴅ'''</span>]] <sub>[[User Talk: -Haryad |<span style="color:yellow; Background:black ">'''ᴛᴀʟᴋ'''</span>]]</sub> ٠٩:٣٨، ٩ی ئابی ٢٠٢٦ (+03)
::Look at the [[Template:trans-top]] table: currently, "[بشارەوە ▲]/[پیشان بدە ▼]" is written to the right of the table; this is incorrect—it should be placed at the far left of the table. Check the Sorani Wikipedia article [https://ckb.wikipedia.org/wiki/%D8%AF%D8%A7%DA%95%DB%8E%DA%98%DB%95:%D9%86%D9%88%D9%88%D8%B3%DB%95%D8%B1%D8%A7%D9%86_%D9%88_%D8%B4%D8%A7%D8%B9%DB%8C%D8%B1%D8%A7%D9%86%DB%8C_%D8%B3%DB%95%D8%AF%DB%95%DB%8C_%D8%A8%DB%8C%D8%B3%D8%AA%DB%95%D9%85%DB%8C_%D9%81%DB%95%DA%95%DB%95%D9%86%D8%B3%D8%A7]: it is located to the left of the title, not to the right. [[بەکارھێنەر:Ghybu|Ghybu]] ([[لێدوانی بەکارھێنەر:Ghybu|لێدوان]]) ١٨:٤٥، ٩ی ئابی ٢٠٢٦ (+03)
:::PS: In the English Wiktionary (written left-to-right), it is also on the right: [https://en.wiktionary.org/wiki/MediaWiki:Gadget-Site.css#L-627]
::::[[بەکارھێنەر:Aram|Aram]]: If you have time, check this out. [[User:-Haryad |<span style="color:black; font-size:16px;">'''ʜᴀʀʏᴀᴅ'''</span>]] <sub>[[User Talk: -Haryad |<span style="color:yellow; Background:black ">'''ᴛᴀʟᴋ'''</span>]]</sub> ٢٣:٠٣، ٩ی ئابی ٢٠٢٦ (+03)
:::::Hey -Haryad and {{وب|Ghybu}} {{کرا|Done!}} To see the changes, please [https://ckb.wiktionary.org/w/index.php?title=%D8%AA%D8%A7%DB%8C%D8%A8%DB%95%D8%AA%3A%D8%A8%DB%95%D8%B4%D8%AF%D8%A7%D8%B1%DB%8C%DB%8C%DB%95%DA%A9%D8%A7%D9%86&target=Aram&namespace=all&tagfilter=&start=2026-08-10&end=2026-08-10&limit=50 check the edits I've made today]. Thanks! [[بەکارھێنەر:Aram|Aram]] ([[لێدوانی بەکارھێنەر:Aram|لێدوان]]) ٠٧:٢٦، ١٠ی ئابی ٢٠٢٦ (+03)
::::::Spas! {{ping|Aram}} Here too [https://ckb.wiktionary.org/wiki/%D9%85%DB%8C%D8%AF%DB%8C%D8%A7%D9%88%DB%8C%DA%A9%DB%8C:Common.css#L-520], <code>padding-left: 10px;</code> needs to be replaced with <code>padding: 1px 10px 1px 5px;</code> because the title is too close to the edge, see [[سێو#وەرگێڕانەکان]]. By the way, what are the Sorani terms for "[[conjugation]]" (of verbs) and "[[declension]]" (of nouns)? That way, I'll be able to add them [[کەوتن|here]]. Do you have a page where you've listed all the section names? I think that could really help newcomers. One more thing: the characters are too small here, aren't they? --[[بەکارھێنەر:Ghybu|Ghybu]] ([[لێدوانی بەکارھێنەر:Ghybu|لێدوان]]) ١٥:٤٣، ١٠ی ئابی ٢٠٢٦ (+03)
::::::: Category names are formed from these words: [[مۆدیوول:headword/data#L-41]], when the templates [[Template:ckb-noun]], [[Template:ckb-verb]], etc., are used. For example: [[:پۆل:کوردیی ناوەندی nouns]] --[[بەکارھێنەر:Ghybu|Ghybu]] ([[:لێدوانی بەکارھێنەر:Ghybu|لێدوان]]) ٠٠:٥٧، ١١ی ئابی ٢٠٢٦ (+03)
{{Rtl/end}}
{{Rtl}}
::::::::[[بەکارھێنەر:Aram|Aram]]: ping [[User:-Haryad |<span style="color:black; font-size:16px;">'''ʜᴀʀʏᴀᴅ'''</span>]] <sub>[[User Talk: -Haryad |<span style="color:yellow; Background:black ">'''ᴛᴀʟᴋ'''</span>]]</sub> ١٩:٢٧، ١٢ی ئابی ٢٠٢٦ (+03)
:::::::: Categories now work using {{tl|auto cat}}. Categories are automatically formed as follows: "Lemma + " بە " + lang", for example: [[:پۆل:ناو بە کوردیی ناوەندی]]/[[:پۆل:کار بە کوردیی ناوەندی]]
:::::::: The names of the lemmas are here: [[:مۆدیوول:category tree/lemmas]]
:::::::: For example, you can change the description displayed in English in the category here: [https://ckb.wiktionary.org/w/index.php?title=%D9%85%DB%86%D8%AF%DB%8C%D9%88%D9%88%D9%84:category_tree/lemmas&oldid=36747#L-633] --[[بەکارھێنەر:Ghybu|Ghybu]] ([[لێدوانی بەکارھێنەر:Ghybu|لێدوان]]) ٢٣:٤٧، ١٢ی ئابی ٢٠٢٦ (+03)
:::::::: One last remark, and then I'll leave you be :) You created the language category names by adding "زمانی" (ziman), like here [[:پۆل:زمانی کوردیی ناوەندی]]. Why not create the category using simply the name of the language, as most Wiktionaries do ? --[[بەکارھێنەر:Ghybu|Ghybu]] ([[لێدوانی بەکارھێنەر:Ghybu|لێدوان]]) ٠٠:١٣، ١٣ی ئابی ٢٠٢٦ (+03)
{{Rtl/end}}
d7ghsx3ke65x3fuoljdi6nbf4m75iwr
36757
36753
2026-08-12T21:48:43Z
Ghybu
12
/* داڕێژە:trans-top */
36757
wikitext
text/x-wiki
==بە خێر بێن ==
<div style="border: 1px solid #d2b48c; background-color: #fdfaf6; padding: 1em 1.5em; margin: 1em 0; border-radius: 10px; line-height: 1.6em;">
<div style="text-align:center; font-weight:bold; font-size:115%; margin-bottom: 1em;">
سڵاو {{ROOTPAGENAME}}، [[ویکیفەرھەنگ:بە خێر بێن، تازەکاران|بە خێر بێن بۆ ویکیفەرھەنگ]]، و سپاس بۆ ئەو بەشدارییانەی تا ئێستا کردووتن.
</div>
ئەگەر بە دەستکاریکردنی ویکی ئاشنا نیت، ئەوا سەیرێکی [[:en:Help:How to edit a page|چۆنێتیی دەستکاریکردنی پەڕە]] بکە. پەڕەکە پێڕستێکی پوختە لەسەر ڕێنمایییە تەکنیکییەکانی ئەو شێوازی ویکییەی ئێمە لێرە بە کاری دەھێنین: بۆ نموونە، چۆن دەقێک تۆخ بکەیت یان بەستەرەکان دروست بکەیت. ئاسوودە بە لە ڕاھێنانکردن لە [[ویکیفەرھەنگ:خۆڵەپەتانێ|خۆڵەپەتانێ]]. ئەگەر حەزت لە پێشەکییەکی ھێواشترە، ئەوا [[ویکیفەرھەنگ:فێرکاری|فێرکارییەکی]] کورتمان ھەیە.
لەوانەیە ئەم بەستەرانە وات لێ بکەن تا خۆت بە ویکیفەرھەنگ ئاشنا بکەیت:
* [[ویکیفەرھەنگ:ڕێکخستنی سەروشە|ڕێکخستنی سەروشە]] سیاسەتێکی وردە لەسەر شێوازی ڕێکخستنی پەڕەی ویکیفەرھەنگ؛ فەرزە ھەموو سەروشەکان پەیڕەویی لێ بکەن. ئاسانترین ڕێگا بۆ ئەوەی دەست پێ بکەیت، ئەوەیە کە ناوەڕۆکی پەڕەیەکی سەروشەی تری ھەمان زمان لەبەر بگریتەوە و، ئینجا لەگەڵ ئەو پەڕەیەی کە دروستی دەکەیت بیگونجێنیت.
* سەیری [[ویکیفەرھەنگ:ڕەچاوکردنی زمان|ڕەچاوکردنی زمان]] بکە تا زیاتر لەسەر چۆنێتیی دەستکاریکردنی زمانێکی دیاریکراو بزانیت.
* [[ویکیفەرھەنگ:پێوەرەکانی قبووڵکردن|پێوەری قبووڵکردنەکەمان]] بەتەواوی باسی ئەو وشانە دەکات کە دەکرێت بۆ ویکیفەرھەنگ زیاد بکرێ؛ گرنگترین شت ئەوەیە کە ویکیفەرھەنگ تەنیا ئەو وشانە قبووڵ دەکات کە بە لای کەمەوە بۆ ماوەی ساڵێک تا ڕادەیەک بە شێوەیەکی بەرفراوان بە کار ھێنراون، و کە گومان ھەبوو داوای ئەو سەرچاوانە بکرێت کە بەکارھێنانیان دەسەلمێنێ.
* ئەگەر پێشتر ئەزموونێکت لە دەستکاریکردنی پڕۆژەی [[w:دەستپێک|ویکیپیدیا]] ھەبووە، ئەوا لەوانەیە [[:en:Wiktionary:Wiktionary for Wikipedians|ڕێنمایی بۆ بەکارھێنەرانی ویکیپیدیا]] بە کەڵک بێت بۆت.
* ئەگەر ھەر پرسیارێکت ھەیە، تکایە بیانبە [[ویکیفەرھەنگ:مێزی زانیاری]] یانیش لە پەڕەی وتووێژەکەم لە منیان بپرسە.
* ھانت دەدەین تا [[:en:WT:Babel|سنووقی بابل]] بۆ پەڕەی بەکارھێنەریت زیاد بکەیت تا ئاستی زانینی زمانەکانت دیاری بکەیت.
<div style="text-align:center; font-weight:bold; margin-top: 1em;">چێژ لە مانەوەت لە ویکیفەرھەنگ ببینە!</div>
</div> [[User:-Haryad |<span style="color:black; font-size:16px;">'''ʜᴀʀʏᴀᴅ'''</span>]] <sub>[[User Talk: -Haryad |<span style="color:yellow; Background:black ">'''ᴛᴀʟᴋ'''</span>]]</sub> ١٧:٢٤، ٢٥ی نیسانی ٢٠٢٦ (+03)
== [[داڕێژە:trans-top]] ==
{{Rtl}}
Silav, Could you replace "right" with "left" here: [[MediaWiki:Common.css#L-569]]. Spas! [[بەکارھێنەر:Ghybu|Ghybu]] ([[لێدوانی بەکارھێنەر:Ghybu|لێدوان]]) ٠٠:٤٠، ٩ی ئابی ٢٠٢٦ (+03)
:Silav Ghybu, bi xêr hatî
:It is written as right because Sorani Kurdish writing is from RTL. If it is changed to left, the translation table will get messed up. [[User:-Haryad |<span style="color:black; font-size:16px;">'''ʜᴀʀʏᴀᴅ'''</span>]] <sub>[[User Talk: -Haryad |<span style="color:yellow; Background:black ">'''ᴛᴀʟᴋ'''</span>]]</sub> ٠٩:٣٨، ٩ی ئابی ٢٠٢٦ (+03)
::Look at the [[Template:trans-top]] table: currently, "[بشارەوە ▲]/[پیشان بدە ▼]" is written to the right of the table; this is incorrect—it should be placed at the far left of the table. Check the Sorani Wikipedia article [https://ckb.wikipedia.org/wiki/%D8%AF%D8%A7%DA%95%DB%8E%DA%98%DB%95:%D9%86%D9%88%D9%88%D8%B3%DB%95%D8%B1%D8%A7%D9%86_%D9%88_%D8%B4%D8%A7%D8%B9%DB%8C%D8%B1%D8%A7%D9%86%DB%8C_%D8%B3%DB%95%D8%AF%DB%95%DB%8C_%D8%A8%DB%8C%D8%B3%D8%AA%DB%95%D9%85%DB%8C_%D9%81%DB%95%DA%95%DB%95%D9%86%D8%B3%D8%A7]: it is located to the left of the title, not to the right. [[بەکارھێنەر:Ghybu|Ghybu]] ([[لێدوانی بەکارھێنەر:Ghybu|لێدوان]]) ١٨:٤٥، ٩ی ئابی ٢٠٢٦ (+03)
:::PS: In the English Wiktionary (written left-to-right), it is also on the right: [https://en.wiktionary.org/wiki/MediaWiki:Gadget-Site.css#L-627]
::::[[بەکارھێنەر:Aram|Aram]]: If you have time, check this out. [[User:-Haryad |<span style="color:black; font-size:16px;">'''ʜᴀʀʏᴀᴅ'''</span>]] <sub>[[User Talk: -Haryad |<span style="color:yellow; Background:black ">'''ᴛᴀʟᴋ'''</span>]]</sub> ٢٣:٠٣، ٩ی ئابی ٢٠٢٦ (+03)
:::::Hey -Haryad and {{وب|Ghybu}} {{کرا|Done!}} To see the changes, please [https://ckb.wiktionary.org/w/index.php?title=%D8%AA%D8%A7%DB%8C%D8%A8%DB%95%D8%AA%3A%D8%A8%DB%95%D8%B4%D8%AF%D8%A7%D8%B1%DB%8C%DB%8C%DB%95%DA%A9%D8%A7%D9%86&target=Aram&namespace=all&tagfilter=&start=2026-08-10&end=2026-08-10&limit=50 check the edits I've made today]. Thanks! [[بەکارھێنەر:Aram|Aram]] ([[لێدوانی بەکارھێنەر:Aram|لێدوان]]) ٠٧:٢٦، ١٠ی ئابی ٢٠٢٦ (+03)
::::::Spas! {{ping|Aram}} Here too [https://ckb.wiktionary.org/wiki/%D9%85%DB%8C%D8%AF%DB%8C%D8%A7%D9%88%DB%8C%DA%A9%DB%8C:Common.css#L-520], <code>padding-left: 10px;</code> needs to be replaced with <code>padding: 1px 10px 1px 5px;</code> because the title is too close to the edge, see [[سێو#وەرگێڕانەکان]]. By the way, what are the Sorani terms for "[[conjugation]]" (of verbs) and "[[declension]]" (of nouns)? That way, I'll be able to add them [[کەوتن|here]]. Do you have a page where you've listed all the section names? I think that could really help newcomers. One more thing: the characters are too small here, aren't they? --[[بەکارھێنەر:Ghybu|Ghybu]] ([[لێدوانی بەکارھێنەر:Ghybu|لێدوان]]) ١٥:٤٣، ١٠ی ئابی ٢٠٢٦ (+03)
::::::: Category names are formed from these words: [[مۆدیوول:headword/data#L-41]], when the templates [[Template:ckb-noun]], [[Template:ckb-verb]], etc., are used. For example: [[:پۆل:کوردیی ناوەندی nouns]] --[[بەکارھێنەر:Ghybu|Ghybu]] ([[:لێدوانی بەکارھێنەر:Ghybu|لێدوان]]) ٠٠:٥٧، ١١ی ئابی ٢٠٢٦ (+03)
{{Rtl/end}}
{{Rtl}}
::::::::[[بەکارھێنەر:Aram|Aram]]: ping [[User:-Haryad |<span style="color:black; font-size:16px;">'''ʜᴀʀʏᴀᴅ'''</span>]] <sub>[[User Talk: -Haryad |<span style="color:yellow; Background:black ">'''ᴛᴀʟᴋ'''</span>]]</sub> ١٩:٢٧، ١٢ی ئابی ٢٠٢٦ (+03)
:::::::: Categories now work using {{tl|auto cat}}. Categories are automatically formed as follows: "Lemma + " بە " + lang", for example: [[:پۆل:ناو بە کوردیی ناوەندی]]/[[:پۆل:کار بە کوردیی ناوەندی]]
:::::::: The names of the lemmas are here: [[:مۆدیوول:category tree/lemmas]]
:::::::: For example, you can change the description displayed in English in the category here: [https://ckb.wiktionary.org/w/index.php?title=%D9%85%DB%86%D8%AF%DB%8C%D9%88%D9%88%D9%84:category_tree/lemmas&oldid=36747#L-633] --[[بەکارھێنەر:Ghybu|Ghybu]] ([[لێدوانی بەکارھێنەر:Ghybu|لێدوان]]) ٢٣:٤٧، ١٢ی ئابی ٢٠٢٦ (+03)
:::::::: One last remark, and then I'll leave you be :) You created the language category names by adding "زمانی" ( zimanî + "lang"), like here [[:پۆل:زمانی کوردیی ناوەندی]]. Why not create the category using simply the name of the language, as most Wiktionaries do ? --[[بەکارھێنەر:Ghybu|Ghybu]] ([[لێدوانی بەکارھێنەر:Ghybu|لێدوان]]) ٠٠:١٣، ١٣ی ئابی ٢٠٢٦ (+03)
{{Rtl/end}}
8o9mcbkc8bhwyca5a9px5vm444pgrlv
پۆل:ھاوەڵناو بە کوردیی ناوەندی
14
11430
36746
2026-08-12T20:37:09Z
Ghybu
12
پەڕەی دروست کرد بە «{{auto cat}}»ەوە
36746
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
پۆل:کار بە کوردیی ناوەندی
14
11431
36748
2026-08-12T20:41:35Z
Ghybu
12
پەڕەی دروست کرد بە «{{auto cat}}»ەوە
36748
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
پۆل:ناو بە کوردیی باکووری
14
11432
36759
2026-08-12T22:31:50Z
Ghybu
12
پەڕەی دروست کرد بە «{{auto cat}}»ەوە
36759
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
پۆل:ناو بە ئینگلیزی
14
11433
36762
2026-08-12T22:35:01Z
Ghybu
12
پەڕەی دروست کرد بە «{{auto cat}}»ەوە
36762
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
پۆل:کار بە ئینگلیزی
14
11434
36763
2026-08-12T22:35:35Z
Ghybu
12
پەڕەی دروست کرد بە «{{auto cat}}»ەوە
36763
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
پۆل:لەما بە ئینگلیزی
14
11435
36764
2026-08-12T22:36:51Z
Ghybu
12
پەڕەی دروست کرد بە «{{auto cat}}»ەوە
36764
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
پۆل:لەما بە کوردیی باکووری
14
11436
36766
2026-08-12T22:39:18Z
Ghybu
12
پەڕەی دروست کرد بە «{{auto cat}}»ەوە
36766
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
پۆل:کار بە کوردیی باکووری
14
11437
36767
2026-08-12T22:39:38Z
Ghybu
12
پەڕەی دروست کرد بە «{{auto cat}}»ەوە
36767
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
پۆل:ھاوەڵناو بە کوردیی باکووری
14
11438
36768
2026-08-12T22:40:04Z
Ghybu
12
پەڕەی دروست کرد بە «{{auto cat}}»ەوە
36768
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
پۆل:ناو بە فەڕەنسی
14
11439
36769
2026-08-12T22:40:45Z
Ghybu
12
پەڕەی دروست کرد بە «{{auto cat}}»ەوە
36769
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
پۆل:ناو بە تورکی
14
11440
36770
2026-08-12T22:41:10Z
Ghybu
12
پەڕەی دروست کرد بە «{{auto cat}}»ەوە
36770
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
پۆل:لەما بە تورکی
14
11441
36771
2026-08-12T22:41:39Z
Ghybu
12
پەڕەی دروست کرد بە «{{auto cat}}»ەوە
36771
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
پۆل:ناو بە فارسی
14
11442
36772
2026-08-12T22:42:14Z
Ghybu
12
پەڕەی دروست کرد بە «{{auto cat}}»ەوە
36772
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
پۆل:لەما بە فارسی
14
11443
36773
2026-08-12T22:42:28Z
Ghybu
12
پەڕەی دروست کرد بە «{{auto cat}}»ەوە
36773
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
پۆل:ناو بە عەرەبی
14
11444
36776
2026-08-12T22:53:25Z
Ghybu
12
پەڕەی دروست کرد بە «{{auto cat}}»ەوە
36776
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
پۆل:لەما بە عەرەبی
14
11445
36777
2026-08-12T22:53:38Z
Ghybu
12
پەڕەی دروست کرد بە «{{auto cat}}»ەوە
36777
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
داڕێژە:ڕەوانەکەری پۆل
10
11446
36787
2026-08-13T00:48:35Z
Ghybu
12
From [[w:داڕێژە:ڕەوانەکەری پۆل]]
36787
wikitext
text/x-wiki
{| align="center" width="80%" id="softredirect" style="margin-top:0.5em; margin-bottom:0.5em; border: solid 1px #a2a9b1; background: #e4d8ff; line-height:1.4em;"
|-
| style="padding:0em 0.8em 0em 0.3em" | [[File:Redirect_arrow_rtl_without_text.svg|120px]]
| style="padding-right:0.5em; padding-left:0.5em" |
'''ئەم پۆلە گوێزراوەتەوە بۆ <span id="softredirect">[[:پۆل:{{{1}}}]]</span>.'''
: '''سەرنج:''' ئەم پۆڵە دەبێ واڵا بێ.
|}<noinclude>{{documentation}}</noinclude>
o5b9zre21xjzoss5srw0dov2494ej28
پۆل:ناو بە ڕووسی
14
11447
36791
2026-08-13T01:03:16Z
Ghybu
12
پەڕەی دروست کرد بە «{{auto cat}}»ەوە
36791
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
پۆل:ھاوەڵناو بە ئینگلیزی
14
11448
36794
2026-08-13T01:21:10Z
Ghybu
12
پەڕەی دروست کرد بە «{{auto cat}}»ەوە
36794
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
پۆل:Categories calling Template:auto cat
14
11449
36796
2026-08-13T03:16:28Z
Ghybu
12
پەڕەی دروست کرد بە «{{auto cat}}»ەوە
36796
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
داڕێژە:head/documentation
10
11450
36797
2026-08-13T11:10:52Z
Ghybu
12
پەڕەی دروست کرد بە «{{uses lua|Module:headword/templates}} This template is used to create a basic headword line. This is the line of text that comes between the part-of-speech header (like <code>===Noun===</code>) and the actual definitions of the word. Every Wiktionary entry must have one headword line per part of speech. ==Basic usage== The basic usage of this template is: : <code><nowiki>{{</nowiki>head|<var>lang</var>|<var>part of speech</var>}}</code> The...»ەوە
36797
wikitext
text/x-wiki
{{uses lua|Module:headword/templates}}
This template is used to create a basic headword line. This is the line of text that comes between the part-of-speech header (like <code>===Noun===</code>) and the actual definitions of the word.
Every Wiktionary entry must have one headword line per part of speech.
==Basic usage==
The basic usage of this template is:
: <code><nowiki>{{</nowiki>head|<var>lang</var>|<var>part of speech</var>}}</code>
The first parameter is the language code (see [[Wiktionary:Languages]]), which is required in all cases. The second is the part of speech. For example on {{m|nl|van}}:
{{demo|<nowiki>{{head|nl|preposition|pagename=van}}</nowiki>}}
The part of speech is used to add a category to the page. So, the above code would also add the page to [[:Category:Dutch prepositions]].
Using {{temp|head}} directly in an entry, similar to this example, is preferred for words for which the basic usage (two or three parameters) is enough, such as:
* words in non-inflecting languages, such as Chinese
* parts of speech with no grammatical information, like prepositions
* parts of speech where the grammatical information is very simple, such as a plural form or gender only (see [[#Gender and number|below]] to learn how to include this)
If a language requires a relatively complex call to {{temp|head}} for many words (such as the same set of inflected forms in many entries, or using <code>sort=</code> in every entry), the language may need its own headword-line templates. Templates made specifically for a given language can handle inflections and other grammatical issues that are specific to that language without reinventing the wheel in every single entry.
Many languages already have dedicated [[:Category:Headword-line templates by language|sets of headword-line templates]], such as {{temp|en-verb}}, {{temp|ja-noun}}, {{temp|de-noun}}, {{temp|la-verb}} and so on.
==Parameters==
A short reference of all parameters.
; {{para|1}}
: The language code. See [[Wiktionary:Languages]].
; {{para|sc}}
: The script code. See [[Wiktionary:Scripts]]. This is rarely needed as the script can generally be automatically detected.
; {{para|2}}
: The [[WT:Part of speech|part of speech]] category (such as "noun", "verb", "adjective" etc), which is used to add the entry to the appropriate category. This can be in either plural or singular form. In the latter case, the template will pluralise it automatically if it doesn't already end in ''-s''. Exceptions can be added to the <code>invariable</code> list at the top of [[Module:headword/data]] if necessary.
; {{para|head}} and {{para|head2}}, {{para|head3}} ...
: Overrides the headword that is displayed. This is used primarily to add diacritical marks or to link to individual words in a multi-word term. By default, if the page name has spaces in it, the words are split across the spaces, which is usually correct but may need overriding. Additional parameters are available if more than one headword needs to be shown.
; {{para|tr}} and {{para|tr2}}, {{para|tr3}} ...
: Provides the transliteration for the term, see [[Wiktionary:Transliteration]]. For many languages, this can be generated automatically so this does not need to be specified, but some entries cannot be reliably transliterated automatically (e.g. Arabic) so this parameter is necessary then. The additional parameters with a number correspond to each additional headword, pairwise.
; {{para|g}}
: Provides gender/number specifications for the term, if necessary. Separate multiple specifications with a comma (with no space following). You can use inline modifiers {{cd|<l:...>}}, {{cd|<ll:...>}}, {{cd|<q:...>}}, {{cd|<qq:...>}} or {{cd|<ref:...>}} to add labels, qualifiers and/or references to individual gender-number specifications. See examples below, and see [[Module:gender and number]] for the format used. <small>Alternatively, additional gender/number specs can be given in {{para|g2}}, {{para|g3}}, etc., but this is deprecated.</small>
; {{para|cat2}}, {{para|cat3}}, {{para|cat4}}
: Additional part-of-speech or other categories. Unlike the part-of-speech category in {{para|2}}, these should always be in the plural.
; {{para|noposcat|1}}
: If given, don't automatically place the headword in a category based on the part of speech as given in {{para|2}}. Normally, two categories are added, one based on the part of speech given (e.g. [[:Category:Sanskrit nouns]]) and one based on the type of the part of speech, either lemma or non-lemma form (e.g. [[:Category:Sanskrit lemmas]]). Specifying {{para|noposcat|1}} will suppress both categories.
; {{para|nogendercat|1}}
: If given, don't automatically place the headword in categories based on the gender(s). Normally, headwords with gender/number specifications given are placed in categories appropriate for the gender and number, e.g. [[:Category:Sanskrit masculine nouns]], [[:Category:Russian animate nouns]], [[:Category:Czech imperfective verbs]] or [[:Category:Spanish pluralia tantum]].
; {{para|nomultiwordcat|1}}
: If given, don't automatically categorize multiword headwords. Normally, for most languages, headwords with multiple words are placed in a special category, e.g. [[:Category:Sanskrit multiword terms]]. This is automatically suppressed for some languages, e.g. sign languages; languages without spaces between terms (such as Chinese, Japanese and Thai); or languages with spaces between syllables (such as Vietnamese). This is controlled by [[Module:headword/data]].
; {{para|nopalindromecat|1}}
: If given, don't automatically categorize palindromes. Normally, for most languages, palindromes are placed in a category like [[:Category:English palindromes]] or [[:Category:Hungarian palindromes]]. For some languages, there are language-specific rules for handling digraphs; for example, in Hungarian, ''gy'', ''sz'', ''zs'' and certain other combinations are treated like single letters for palindrome purposes, meaning that words like {{m|hu|koszok}} and {{m|hu|legyél}} are considered palindromes. This can create problems, e.g. {{m|hu|gazság}} would be categorized as a palindrome but is not because in this word, ''zs'' is two separate sounds rather than a digraph. Specifying {{para|nopalindromecat|1}} disables this categorization.
; {{para|sccat|1}}
: If given, automatically add a category "(lang) (pos)es in (script) script" (e.g. [[:Category:Sanskrit nouns in Devanagari script]]), for the script specified using {{para|sc}} or autodetected based on the value specified to {{para|head}} or the page name. This category is useful for languages that can be written in multiple scripts.
; {{para|autotrinfl|1}}
: If given, include automatic transliteration after each of the inflections specified using {{para|3}}, {{para|4}} and further parameters (see below). This can also be set for individual inflected forms using {{para|f''N''autotr}}.
; {{para|sort}}
: The sort key to use when placing the entry in the above categories. This is rarely needed, as the default generated sort key is usually correct.
; {{para|3}}, {{para|4}} and further
: Specifies inflected forms to show. These are specified pairwise, with the first giving the name of the form, and the second giving the form itself. So the forms are numbered like this: {{tl|head|language|category|name 1|form 1|name 2|form 2|name 3|form 3|...}}. If multiple forms exist for the same name, separate them by using "<code>or</code>" as the name. Forms work the same as the 2nd parameter of {{tl|l}}, and can thus have embedded wikilinks, will have certain diacritics removed, and so on.
: The following additional parameters are available for each form, with <code>''N''</code> replaced by the number of the form:
:; {{para|f''N''alt}}
:: Specifies the alternative display form of the inflected form, much like the 3rd parameter of {{tl|l}}.
:; {{para|f''N''tr}}
:: Specifies the transliteration of the inflected form, much like the {{para|tr}} parameter of {{tl|l}}.
:; {{para|f''N''ts}}
:: Specifies the transcription of the inflected form, much like the {{para|ts}} parameter of {{tl|l}}. The same caveats apply as for that parameter.
:; {{para|f''N''sc}}
:: Specifies the script of the form; works like {{para|sc}}.
:; {{para|f''N''id}}
:: Specifies the sense ID to use for the link to the form's entry. See {{tl|senseid}} and the {{para|id}} parameter of {{tl|l}}.
:; {{para|f''N''g}}
:: Provides gender/number specification(s) to display after the form. To include multiple specifications, separate them by commas (with no space following). Uses the same gender/number specifications as for {{para|g}}. You can use inline modifiers {{cd|<l:...>}}, {{cd|<ll:...>}}, {{cd|<q:...>}}, {{cd|<qq:...>}} or {{cd|<ref:...>}} to add labels, qualifiers and/or references to individual gender-number specifications, as for the overall {{para|g}} parameter.
:; {{para|f''N''l}}
:: Specifies a label or labels (comma-separated, with no space after the comma) that should appear before the form, formatted like the template {{tl|lb}} does. This is used to mark certain forms as archaic, rare or similar.
:; {{para|f''N''ll}}
:: Specifies a label or labels (comma-separated, with no space after the comma) that should appear after the form, formatted like the template {{tl|lb}} does.
:; {{para|f''N''q}}
:: Specifies a qualifier that should appear before the form, formatted like the template {{tl|q}} does. This is used to add descriptive text such as ''in the meaning “foo”'' before a form.
:; {{para|f''N''qq}}
:: Specifies a qualifier that should appear after the form, formatted like the template {{tl|q}} does.
:; {{para|f''N''ref}}
:: Specifies a reference or references that should appear after the form, in the same format as specified for references given to {{tl|IPA}}.
:; {{para|f''N''t}}
:: Specifies a gloss for the form, if its meaning is not apparent. Use this sparingly.
:; {{para|f''N''lit}}
:: Specifies a literal meaning for the form, if its meaning is not apparent. Use this sparingly.
:; {{para|f''N''pos}}
:: Specifies a part of speech for the form, if its part of speech is not apparent. Use this sparingly. The same codes as for the {{para|pos}} parameter of {{tl|l}} are accepted; anything else is displayed as-is.
:; {{para|f''N''ng}}
:: Specifies arbitrary non-gloss explanatory text for the form. Use this sparingly.
: The following parameters are available only for each ''name'', meaning that if multiple forms are displayed for the same name (with "<code>or</code>"), these parameters should use the number of the ''first'' form. They are automatically applied to all forms following that name.
:; {{para|f''N''accel-form}}
:: Specifies an accelerated creation tag to be used by the [[WT:ACCEL]] gadget, to automatically generate an entry for a non-lemma form when the link is clicked. For information about acceleration tags, see [[WT:ACCEL#Acceleration tags]]. This should not be used directly in entries. If you find you need to use it, or any of the following acceleration-related parameters, you should probably make a custom template for the language instead. If the acceleration tag contains a vertical bar <code><nowiki>|</nowiki></code>, use {{tl|!}} instead.
:; {{para|f''N''accel-translit}}
:: Specifies a manual transliteration of the non-lemma form for use with accelerated creation of entries; see [[WT:ACCEL]] and {{para|f''N''accel-form}} above. The value of this parameter goes into param {{para|tr}} of the call to {{tl|head}} in the accelerated entry. You only need to specify this for languages that use a non-Latin script, and only when the auto-generated transliteration is insufficient, incorrect or nonexistent.
:; {{para|f''N''accel-lemma}}
:: Specifies the lemma corresponding to the non-lemma form for use with accelerated creation of entries; see [[WT:ACCEL]] and {{para|f''N''accel-form}} above. The value of this parameter goes into param {{para|2}} of the call to {{tl|inflection of}} in the accelerated entry. It defaults to the name of the current page, and only needs to be specified when the lemma contains additional diacritics that are stripped in order to generate the pagename (as in Latin, Russian, Ancient Greek, Old English, etc.).
:; {{para|f''N''accel-lemma-translit}}
:: Specifies a manual transliteration of the lemma corresponding to the non-lemma form for use with accelerated creation of entries; see [[WT:ACCEL]] and {{para|f''N''accel-form}} above. The value of this parameter goes into param {{para|tr}} of the call to {{tl|inflection of}} in the accelerated entry. You only need to specify this for languages that use a non-Latin script, and only when the auto-generated transliteration is insufficient, incorrect or nonexistent.
:; {{para|f''N''accel-gender}}
:: Specifies the gender of the non-lemma form for use with accelerated creation of entries; see [[WT:ACCEL]] and {{para|f''N''accel-form}} above. The value of this parameter goes into param {{para|g}} of the call to {{tl|head}} in the accelerated entry. You should only rarely specify this.
:; {{para|f''N''accel-nostore|1}}
:: For use with accelerated creation of entries. Place this on links that appear in the collapsed state of collapsible tables; see [[WT:ACCEL]].
:; {{para|f''N''nolink|1}}
:: Inhibits automatic creation of a link to the forms. The forms will just be displayed in bold text instead. Links that are embedded into the form parameters are retained.
:; {{para|f''N''request|1}}
:: Causes the page to be added to [[:Category:Requests for inflections by language|Category:Requests for inflections in LANG entries]] if a form is missing.
:; {{para|f''N''autotr|1}}
:: Causes automatic transliteration to be included after each form.
==Detailed usage==
Note that the examples are for illustrative purposes only, to demonstrate how {{tl|head}} works. For most of the languages and parts of speech shown here, there are dedicated headword-line templates that should be used in entries instead of directly invoking {{tl|head}}.
===Part of speech===
The part of speech (second parameter) can be either singular or plural, and written out fully (e.g. {{cd|interjection}}) or abbreviated (e.g. {{cd|int}} or {{cd|intj}}). If the part of speech is written out in full, it is stylistically preferred to write it in the singular.
Add the word "form" to indicate a non-[[Wiktionary:Lemmas|lemma]] form. For example, use {{cd|noun form}} for plurals and inflections of nouns.
The following part of speech aliases (abbreviations) are recognized by the module. In addition, any alias or fully-written part of speech in the singular can be followed by {{cd|f}} as an abbreviation for "form". For example, {{cd|nf}} or {{cd|nounf}} expands to {{cd|noun forms}}, and {{cd|compadjf}} expands to {{cd|comparative adjective forms}}.
{{#invoke:headword doc|pos_alias_table}}
===Displayed headword===
Normally, the displayed headword is the same as the name of the current page. The parameter {{para|head}} can be used to specify a different headword to display. This can be useful if additional accent marks should be placed on the word, that are not present in the normal written form that is given in the page's name. For example, the Latin word {{m|la|scribo}} is normally written that way, but is also spelled {{m|la||scrībō}} in its fully accented form. For such a case, you would specify {{para|head|scrībō}}.
Another purpose of this parameter is for terms that consist of multiple words. The {{para|head}} parameter can be used to link to the individual words that the term is made up of. For example, for the English phrasal verb {{m|en|give up}}, you could use:
: <code><nowiki>{{head|en|verb|head=[[give]] [[up]]}}</nowiki></code>
: {{head|en|verb|head=[[give]] [[up]]}}
Note in the above example that the template automatically adds the correct language section to the links in the same way as {{temp|l}}. So the links actually come out as if written <code><nowiki>[[give#English|give]] [[up#English|up]]</nowiki></code>. This means that you should not add such section links yourself, nor should you use {{temp|l}} inside the {{para|head}} parameter. These were necessary in the past, but they can now be safely removed.
In a few cases it may be necessary to show more than one headword. For example, a language like Russian might have a word with a single written form, but multiple alternative ways of placing the accent marks (compare this to English {{m|en||kílometer}} and {{m|en||kilómeter}}). Additional headwords can be displayed using the parameters {{para|head2}}, {{para|head3}} and so on.
===Transliteration===
If a term is written in a script other than the Latin alphabet, a transliteration of the term into the Latin alphabet should be provided using the {{para|tr}} parameter. Every language generally has its own rules for writing transliterations on Wiktionary; check with the language's entry guidelines page (such as [[Wiktionary:Russian entry guidelines]]) for more information.
The template can automatically transliterate words in many languages; this is controlled through special transliteration modules such as [[Module:el-translit]] (and also the data in [[Module:languages]]). This means that for those languages, a transliteration does not need to be provided, as it can be generated internally. If the {{para|head}} parameter was provided, it is used as the base for the transliteration instead, so that any additional accents are also included in the transliteration. Use {{para|tr|-}} if you don't want a transliteration to be automatically generated (you shouldn't really ever do this in an entry).
===Gender and number===
The template has a set of parameters to display gender, number, noun class or other kinds of grammatical property. These are used and displayed in the standard format required by [[Module:gender and number]].
The gender is given with the optional {{para|g}} parameter. If more than one specification is necessary, separate them with a comma, with no space following, as follows (for {{m+|sc|dì}}):
{{demo2|<nowiki>{{head|sc|noun|g=f,m<l:uncommon>|plural|dis|pagename=dì}}</nowiki>}}
This also shows the use of an inline modifier attached to the second gender.
If you know that a gender is needed, but don't know what it is, specify {{para|g|?}}, which will add the page to a cleanup category. You can also specify a partial gender. For example, if you know that a word is plural but don't know if it's, say, masculine or feminine plural, you can specify {{para|g|?-p}}.
===Inflections===
Further optional parameters are available to display inflections or other closely related forms of the word. These are given pair-wise: the first of each pair gives a label for the inflection, and the second then gives the actual term.
For example, in the [[Wiktionary:Sandbox|Sandbox]]:
{{demo2|<nowiki>{{head|en|noun|plural|Sandboxes|irregular plural|Sandboxen|pagename=Sandbox}}</nowiki>}}
Certain diacritics are automatically removed from the term when creating the link, just like {{temp|l}} and {{temp|term}} do. So you don't need to worry about removing them yourself. A Latin example, where macrons are removed automatically:
{{demo2|<nowiki>{{head|la|noun|head=nīdus|g=m|genitive|nīdī|pagename=nidus}}</nowiki>}}
If you want to display multiple alternative forms of an inflection, you can use <code>or</code> as the label separating them. The template will recognise this and omit the comma:
{{demo2|<nowiki>{{head|en|noun|plural|lemmas|or|lemmata|pagename=lemma}}</nowiki>}}
The term (second part of a pair) may be blank. This can be used to add a simple note, such as "uncountable" or "intransitive":
{{demo2|<nowiki>{{head|en|noun|countable and uncountable||plural|milks|pagename=milk}}</nowiki>}}
If the label is blank, but the term is not, it acts as if the term was not specified either and omits both. This is not very useful in entries, but it can be a very powerful feature when writing templates using {{temp|head}} as a base.
You can specify alternative display form, script, sense id and gender for each form with the parameters {{para|fNalt}}, {{para|fNsc}}, {{para|fNid}} and {{para|fNg}}, with "N" replaced with the number of the form. Some examples:
{{demo2|<nowiki>{{head|sh|noun|head=tȇlo|g=n|Cyrillic spelling|те̑ло|f1sc=Cyrl|pagename=telo}}</nowiki>}}
{{demo2|<nowiki>{{head|de|noun|g=m|genitive|Hundes|or|Hunds|plural|Hunde|diminutive|Hündchen|f4g=n|pagename=Hund}}</nowiki>}}
{{demo2|<nowiki>{{head|ja|noun|uncountable||hiragana|せいじ|romaji|seiji|f3sc=Latn|pagename=政治}}</nowiki>}}
{{demo2|<nowiki>{{head|cmn|noun|traditional and simplified||Pinyin|zhèngzhì|f2sc=Latn|pagename=政治}}</nowiki>}}
When using {{temp|head}} as a base to create other templates, the class for accelerated links ([[WT:ACCEL]]) can be added with {{para|fNaccel-form}}. See [[Module:headword]] for more information on how to use this. If the label is <code>or</code>, the corresponding acceleration is ignored, and it is "inherited" from the preceding form. Examples:
{{demo2|<nowiki>{{head|ca|noun|g=m|plural|f1accel-form=p|homes|or|hòmens|pagename=home}}</nowiki>}}
An inflection term can contain wikilinks as part of the parameter, like the {{para|head}} parameter as well as the {{temp|l}} template. Language sections will be added to the individual links:
{{demo2|<nowiki>{{head|en|adjective|comparative|[[more]] broken|superlative|[[most]] broken|pagename=broken}}</nowiki>}}
Naturally, you should only use this to display a ''single'' form that consists of multiple words. You should not use this to specify multiple alternative forms; use the <code>or</code> label for this instead.
The following example shows the use of {{para|fNl}} to attach labels to forms (on {{m+|cim|lachan}}):
{{demo2|<nowiki>{{head|cim|verb|third-person singular present indicative|lachet|past participle|galàchet|or|gelacht|auxiliary|haban|or|håm|f2l=Sette Comuni|f3l=Luserna|f4l=Sette Comuni|f5l=Luserna|cat2=weak verbs|pagename=lachan}}</nowiki>}}
===Categories===
There are a few more parameters available for categories:
* {{para|sort}} specifies a category sort key. This is rarely needed, as by default, a sort key will be generated for the language according to the rules defined for that language in [[Module:languages]] (the <code>sort_key</code> setting). For languages that have no sort key rules defined yet, the default sort key is the name of the page, with any hyphens removed from the beginning of the name.
* {{para|cat2}}, {{para|cat3}} and , {{para|cat4}} specify additional category names that the page should be added to. The language's name is added in front, so if you use <code><nowiki>{{head|en|verb|cat2=irregular verbs}}</nowiki></code>, the page will be added to both [[:Category:English verbs]] and [[:Category:English irregular verbs]]. Note that this parameter must be given in plural, unlike the part-of-speech parameter!
===Script code===
The optional parameter {{para|sc}} gives the script code (see [[Wiktionary:Scripts]]). The script can usually be detected automatically based on the possibilities listed for the language in [[Module:languages]], so this parameter is only needed in rare cases. The example below is thus only for illustrative purposes; a real example would not need {{para|sc}} here.
An example, for the entry {{m|sh|море}}, one might use:
{{demo2|<nowiki>{{head|sh|noun|sc=Cyrl|g=n|pagename=море}}</nowiki>}}
<includeonly>
[[Category:Headword-line templates|head]]
</includeonly>
==TemplateData==
<templatedata>
{
"params": {
"1": {
"label": "language code",
"description": "The language code. See [[Wiktionary:Languages]].",
"type": "line",
"required": true
},
"2": {
"label": "part of speech",
"description": "The part of speech category which is used to add the entry to the appropriate category. This can be in either plural or singular form. In the latter case, the template will pluralise it automatically if it doesn't already end in ''-s''. Exceptions can be added to the <code>invariable</code> list at the top of [[Module:headword/templates]] if necessary.",
"type": "string",
"example": "verb",
"required": true
},
"3": {
"label": "name of form 1",
"description": "The name of a first of form of a term.",
"type": "string"
},
"4": {
"label": "form 1",
"description": "A first form of the term.",
"type": "string"
},
"sc": {
"label": "script code",
"description": "The script code. See [[Wiktionary:Scripts]]. This is rarely needed as the script can generally be automatically detected."
},
"cat sc": {
"label": "script code with category",
"description": "The same as {{para|sc}}, but this also adds \"in (name) script\" to the category specified by the second parameter below. This is used to subcategorise words in different scripts, if languages can be written in more than one script. If both {{para|sc}} and {{para|cat sc}} are provided, the latter takes precedence.",
"type": "string"
},
"cat2": {
"label": "part of speech category 2",
"description": "Additional part-of-speech categories. Unlike the <code>part of speech</code>, these should always be in plural.",
"type": "string"
},
"cat3": {
"label": "part of speech category 3",
"description": "Additional part-of-speech categories. Unlike the <code>part of speech</code>, these should always be in plural.",
"type": "string"
},
"sort": {
"label": "sort key",
"description": "The sort key to use when placing the entry in the above categories. This is rarely needed, as the default generated sort key is usually correct.",
"type": "string"
},
"head": {
"description": "Overrides the headword that is displayed. This is used primarily to add diacritical marks or to link to individual words in a multi-word term. By default, if the page name has spaces in it, the words are split across the spaces, which is usually correct but may need overriding. Additional parameters are available if more than one headword needs to be shown.",
"type": "string"
},
"head2": {
"description": "Additional term for the headword display.",
"type": "string"
},
"head3": {
"description": "Additional term for the headword display.",
"type": "string"
},
"head4": {
"description": "Additional term for the headword display.",
"type": "string"
},
"head5": {
"description": "Additional term for the headword display.",
"type": "string"
},
"tr": {
"description": "Provides the transiteration for the term, see [[Wiktionary:Transliteration]]. For many languages, this can be generated automatically so this does not need to be specified, but some entries cannot be reliably transliterated automatically (e.g. Arabic) so this parameter is necessary then.",
"type": "string"
},
"tr2": {
"description": "Provides the transiteration for the term, should match <code>head2</code>.",
"type": "string"
},
"tr3": {
"description": "Provides the transiteration for the term, should match <code>head3</code>.",
"type": "string"
},
"tr4": {
"description": "Provides the transiteration for the term, should match <code>head4</code>.",
"type": "string"
},
"tr5": {
"description": "Provides the transiteration for the term, should match <code>head5</code>.",
"type": "string"
},
"g": {
"description": "Provides gender specifications for the word, if necessary. See [[Module:gender and number]] for the format used.",
"type": "string"
},
"g2": {
"description": "Provides gender specifications for the word, if necessary, should match <code>head2</code>.",
"type": "string"
},
"g3": {
"description": "Provides gender specifications for the word, if necessary, should match <code>head3</code>.",
"type": "string"
},
"g4": {
"description": "Provides gender specifications for the word, if necessary, should match <code>head4</code>.",
"type": "string"
},
"g5": {
"description": "Provides gender specifications for the word, if necessary, should match <code>head5</code>.",
"type": "string"
}
},
"description": "This template is used to create a basic headword line. This is the line of text that comes between the part-of-speech header (like <code>===Noun===</code>) and the actual definitions of the word. ",
"paramOrder": [
"1",
"2",
"sc",
"cat sc",
"cat2",
"cat3",
"sort",
"head",
"head2",
"head3",
"head4",
"head5",
"tr",
"tr2",
"tr3",
"tr4",
"tr5",
"g",
"g2",
"g3",
"g4",
"g5",
"3",
"4"
],
"format": "inline"
}
</templatedata>
4af681hbqbyb52anhern0fu8jlrzdbj
داڕێژە:demo2
10
11451
36798
2026-08-13T11:12:14Z
Ghybu
12
پەڕەی دروست کرد بە «<includeonly>{{#invoke:demo|main|fmt=twoline}}</includeonly><noinclude>{{documentation}}</noinclude>»ەوە
36798
wikitext
text/x-wiki
<includeonly>{{#invoke:demo|main|fmt=twoline}}</includeonly><noinclude>{{documentation}}</noinclude>
417sbtee06xrhqzb3uv3t1t68mqwfwa
داڕێژە:demo
10
11452
36799
2026-08-13T11:13:55Z
Ghybu
12
پەڕەی دروست کرد بە «<includeonly>{{#invoke:demo|main}}</includeonly><noinclude>{{documentation}}</noinclude>»ەوە
36799
wikitext
text/x-wiki
<includeonly>{{#invoke:demo|main}}</includeonly><noinclude>{{documentation}}</noinclude>
gtlov5con2hyrnl984a5hrroa0fjac9
مۆدیوول:demo
828
11453
36800
2026-08-13T11:15:30Z
Ghybu
12
From en wiktionary
36800
Scribunto
text/plain
local export = {}
local string_remove_comments_module = "Module:string/removeComments"
local string_utilities_module = "Module:string utilities"
local require = require
local tonumber = tonumber
local unstrip_nowiki = mw.text.unstripNoWiki
local function remove_comments(...)
remove_comments = require(string_remove_comments_module)
return remove_comments(...)
end
-- Ported from [[w:Module:Demo]] by Benwing2 on Sep 1st 2023 around 6am UTC.
-- Significantly reworked since then; quite divergent by now.
local nowiki_strip_marker_pattern = "\127'\"`UNIQ%-%-nowiki%-" .. ("[%dA-F]"):rep(8) .. "%-QINU`\"'\127"
local nowiki_replacements = {
["gt"] = ">",
["lt"] = "<",
["#123"] = "{",
["#125"] = "}",
}
function export.main(frame)
local boolean = {type = "boolean"}
local parent_args = frame:getParent().args
local args = require("Module:parameters").process(parent_args, {
[1] = true,
["fmt"] = {
set = {
["compact"] = true, ["c"] = "compact",
["inline"] = true, ["i"] = "inline", ["1"] = "inline",
["multiline"] = true, ["m"] = "multiline",
["raw"] = true,
["twoline"] = true, ["2"] = "twoline",
["twocol"] = true, ["2c"] = "twocol", ["2col"] = "twocol",
["nooutput"] = true, ["0"] = "nooutput",
},
default = frame.args.fmt or "compact"
},
["br"] = true,
["fullsep"] = true,
["sep"] = true,
["reverse"] = boolean,
["nocat"] = boolean,
["style"] = true,
["omit"] = {sublist = true, default = "pagename"},
["indent"] = true,
-- Hack to allow for > to appear in the output, if &gt; is supplied in the input.
-- Otherwise this isn't possible because > and > both end up as > when placed inside of <nowiki>...</nowiki>
-- and passed through unstrip_nowiki(), and can't be distinguished. As a result, the code below converts > back
-- to >, and there's no way to get a literal > in the output since &gt; normally ends up unchanged.
["replace_amp"] = boolean,
})
local source = args[1]
if source:match(nowiki_strip_marker_pattern) then
-- Unescape the four patterns that automatically get escaped by nowiki
-- (taken from CoreTagHooks.php).
source = unstrip_nowiki(source)
source = source:gsub("()&([#gl][1t]2?[35]?);", function(pos, code)
local ch = nowiki_replacements[code]
if ch == "{" then -- -{
return source:byte(pos - 1) == 0x2D and ch or nil
elseif ch == "}" then -- }-
return source:byte(pos + 6) == 0x2D and ch or nil
end
return ch
end)
if args.replace_amp then
source = source:gsub("&", "&")
end
end
local fullsep, sep, fmt, rev, indent = args.fullsep, args.sep, args.fmt, args.reverse, args.indent
local output = fmt == "nooutput" and "" or remove_comments(frame:preprocess(source), "POST")
-- FIXME: this will miss some categories.
if args.nocat then
output = output:gsub("%[%[Category.-%]%]", "")
end
for _, param in ipairs(args.omit) do
if param ~= "-" then
-- FIXME, this doesn't correctly handle nested template calls or HTML comments in the param value
source = source:gsub(("| *%s *=[^{}|]*"):format(require(string_utilities_module).pattern_escape(param)), "")
end
end
if indent == "-" then
indent = ""
elseif not indent then
if fmt == "twoline" then
indent = ":"
else
indent = ""
end
end
local newline = indent == "" and "<br />" or "\n"
if not fullsep then
local br = args.br
if br then
fullsep = tonumber(br) and ("<br />"):rep(br) or br
elseif fmt == "inline" or fmt == "twoline" then
fullsep = (sep or (rev and "⇐" or "⇒")) .. (fmt == "twoline" and newline .. (newline == "\n" and "" or "\n") .. indent or "")
elseif fmt == "raw" or fmt == "nooutput" then
fullsep = sep or ""
elseif fmt == "twocol" then
fullsep = sep or "||"
else
fullsep = (sep or (rev and "generated from" or "which produces")) .. "<br />\n" .. indent
if fmt == "compact" then
fullsep = newline .. indent .. fullsep
end
end
end
if #fullsep > 0 and not (fullsep:find("\n", nil, true) or fullsep:match("<br%f[%W].->")) then
fullsep = " " .. fullsep .. " "
end
source = frame:extensionTag("syntaxhighlight", source, {
lang = "wikitext",
inline = fmt ~= "multiline" and fmt ~= "raw" and true or nil,
style = args.style
})
return indent .. (rev and output .. fullsep .. source or source .. fullsep .. output)
end
return export
486zf9394wmx48ne4snwtrr7a90m7vl
داڕێژە:m+
10
11454
36801
2026-08-13T11:17:52Z
Ghybu
12
From en wiktionary
36801
wikitext
text/x-wiki
<includeonly><onlyinclude>{{safesubst:<noinclude/>#invoke:links/templates|l_term_t|langname=1|face=term}}</onlyinclude></includeonly><!--
-->{{m+|en|term}}{{documentation}}
24rcsskporjthfd9afqocn7986e9qpg