Wikikamus
mswiktionary
https://ms.wiktionary.org/wiki/Wikikamus:Laman_Utama
MediaWiki 1.47.0-wmf.17
case-sensitive
Media
Khas
Perbincangan
Pengguna
Perbincangan pengguna
Wikikamus
Perbincangan Wikikamus
Fail
Perbincangan fail
MediaWiki
Perbincangan MediaWiki
Templat
Perbincangan templat
Bantuan
Perbincangan bantuan
Kategori
Perbincangan kategori
Lampiran
Perbincangan lampiran
Rima
Perbincangan rima
Tesaurus
Perbincangan tesaurus
Indeks
Perbincangan indeks
Petikan
Perbincangan petikan
Rekonstruksi
Perbincangan rekonstruksi
Padanan isyarat
Perbincangan padanan isyarat
Konkordans
Perbincangan konkordans
TimedText
TimedText talk
Modul
Perbincangan modul
Acara
Perbincangan acara
Wikikamus:Senarai perkataan O
4
3523
369326
155517
2026-08-30T09:15:23Z
~2026-47139-51
11293
/* Oz */
369326
wikitext
text/x-wiki
Objek
== Oc ==
== Od ==
{{berbilanglajur}}
* [[oder]]
{{berbilanglajur-pisah}}
** [[mengoder]]
{{berbilanglajur-akhir}}
== Oe ==
== Of ==
* [[ofset]]
== Og ==
{{berbilanglajur}}
* [[ogah]]
** [[mengogah]]
{{berbilanglajur-pisah}}
* [[Ogos]]
{{berbilanglajur-akhir}}
== Oh ==
jodoh moron
bodoh moron
tempoh moron
== Oi ==
== Oj ==
== Ok ==
{{berbilanglajur}}
* [[oksiasetilena]]
* [[oksida]]
** [[mengoksidakan]], [[pengoksidaan]]
* [[oksigen]]
** [[beroksigen]], [[mengoksigenkan]]
{{berbilanglajur-pisah}}
* [[oksihemoglobin]]
* [[oksihidrogen]]
* [[oktaf]]
* [[oktana]]
* [[Oktober]]
{{berbilanglajur-akhir}}
== Ol ==
{{berbilanglajur}}
* [[olah]]
** [[berolah]], [[memperolahkan]], [[mengolah]], [[pengolah]]
* [[olah-olah]]
** [[seolah-olah]]
* [[olahan]]
** [[pengolahan]]
* [[olahraga]]
** [[berolahraga]], [[keolahragaan]], [[pengolahraga]]
* [[olahragawan]]
* [[olahragawati]]
* [[olak]]
** [[berolak]], [[pengolak]]
* [[olakan]]
** [[perolakan]]
{{berbilanglajur-pisah}}
* [[oleander]]
* [[oleh]]
** [[beroleh]], [[memperoleh]], [[memperolehi]], [[perolehan]]
* [[oligarki]]
* [[oligopoli]]
* [[olimpiad]]
* [[Olimpik]]
* [[olok]]
** [[memperolokkan]]
* [[olok-olok]]
** [[berolok-olok]], [[memperolok-olok]], [[memperolok-olokkan]], [[mengolok-olokkan]]
* [[olok-olokan]]
* [[olokan]]
{{berbilanglajur-akhir}}
== Om ==
{{berbilanglajur}}
* [[ombak]]
** [[berombak]], [[mengombak]]
* [[omel]]
** [[mengomel]], [[mengomeli]]
* [[omelan]]
{{berbilanglajur-pisah}}
* [[omong]]
** [[mengomong]], [[mengomongkan]]
* [[omong-omong]]
** [[beromong-omong]]
* [[omongan]]
{{berbilanglajur-akhir}}
== On ==
{{berbilanglajur}}
* [[onak]]
* [[onani]]
* [[onar]]
** [[keonaran]], [[mengonarkan]]
* [[ondak]]
** [[berondak-ondak]], [[terondak-ondak]]
* [[onde]]
{{berbilanglajur-pisah}}
* [[onde-onde]]
* [[onggok]]
** [[beronggok-onggok]], [[mengonggokkan]], [[teronggok]]
* [[onggokan]]
* [[ongkos]]
** [[memperongkosi]], [[mengongkosi]], [[perongkosan]]
{{berbilanglajur-akhir}}
== Oo ==
== Op ==
{{berbilanglajur}}
* [[operasi]]
** [[beroperasi]], [[mengoperasi]]
* [[operasional]]
* [[operator]]
* [[opium]]
* [[oportunis]]
* [[oposisi]]
{{berbilanglajur-pisah}}
* [[optik]]
* [[optimis]]
* [[optimisme]]
* [[optimistik]]
* [[optimistis]]
* [[optimum]]
{{berbilanglajur-akhir}}
== Oq ==
== Or ==
{{berbilanglajur}}
* [[orak]]
** [[mengorak]], [[terorak]]
* [[orang]]
** [[berseorang]], [[berseorangan]], [[keseorangan]], [[perseorangan]], [[seorang]], [[seseorang]]
* [[orang-orang]]
** [[berorang-orang]]
* [[orang-orangan]]
* [[orbit]]
* [[orde]]
* [[ordinan]]
* [[ordinat]]
* [[oren]]
* [[organ]]
* [[organik]]
* [[organisasi]]
{{berbilanglajur-pisah}}
** [[mengorganisasi]], [[mengorganisasikan]]
* [[organisator]]
* [[organisma]]
* [[orientalis]]
* [[orientasi]]
** [[berorientasi]], [[berorientasikan]], [[mengorientasikan]]
* [[Orion]]
* [[orkes]]
* [[orkestra]]
* [[orkid]]
* [[ornamen]]
* [[orok]]
* [[ortodoks]]
* [[ortografi]]
{{berbilanglajur-akhir}}
== Os ==
{{berbilanglajur}}
* [[oskar]]
{{berbilanglajur-pisah}}
* [[osmosis]]
{{berbilanglajur-akhir}}
== Ot ==
{{berbilanglajur}}
* [[otak]]
** [[berotak]]
{{berbilanglajur-pisah}}
* [[otek]]
* [[otot]]
{{berbilanglajur-akhir}}
== Ou ==
* [[output]]
== Ov ==
{{berbilanglajur}}
* [[ovari]]
* [[overdraf]]
{{berbilanglajur-pisah}}
* [[ovul]]
* [[ovum]]
{{berbilanglajur-akhir}}
== Ow ==
oxy mat
== Oy ==
{{berbilanglajur}}
* [[oyong]]
{{berbilanglajur-pisah}}
** [[mengoyongkan]]
{{berbilanglajur-akhir}}
== Oz ==
ozon
[[Kategori:Kamus]]
[[Kategori:Wiktionary]]
03mqit823pqd628tw715g5isztnfoph
369327
369326
2026-08-30T09:16:02Z
Veritas Sapientiae
6077
Suntingan oleh [[Special:Contributions/~2026-47139-51|~2026-47139-51]] ([[User talk:~2026-47139-51|perbincangan]]) dikembalikan kepada semakan terdahulu oleh [[User:2404:160:8170:592F:BC84:AFF:FEF3:65A5|2404:160:8170:592F:BC84:AFF:FEF3:65A5]]
155517
wikitext
text/x-wiki
Objek
== Oc ==
== Od ==
{{berbilanglajur}}
* [[oder]]
{{berbilanglajur-pisah}}
** [[mengoder]]
{{berbilanglajur-akhir}}
== Oe ==
== Of ==
* [[ofset]]
== Og ==
{{berbilanglajur}}
* [[ogah]]
** [[mengogah]]
{{berbilanglajur-pisah}}
* [[Ogos]]
{{berbilanglajur-akhir}}
== Oh ==
jodoh moron
bodoh moron
tempoh moron
== Oi ==
== Oj ==
== Ok ==
{{berbilanglajur}}
* [[oksiasetilena]]
* [[oksida]]
** [[mengoksidakan]], [[pengoksidaan]]
* [[oksigen]]
** [[beroksigen]], [[mengoksigenkan]]
{{berbilanglajur-pisah}}
* [[oksihemoglobin]]
* [[oksihidrogen]]
* [[oktaf]]
* [[oktana]]
* [[Oktober]]
{{berbilanglajur-akhir}}
== Ol ==
{{berbilanglajur}}
* [[olah]]
** [[berolah]], [[memperolahkan]], [[mengolah]], [[pengolah]]
* [[olah-olah]]
** [[seolah-olah]]
* [[olahan]]
** [[pengolahan]]
* [[olahraga]]
** [[berolahraga]], [[keolahragaan]], [[pengolahraga]]
* [[olahragawan]]
* [[olahragawati]]
* [[olak]]
** [[berolak]], [[pengolak]]
* [[olakan]]
** [[perolakan]]
{{berbilanglajur-pisah}}
* [[oleander]]
* [[oleh]]
** [[beroleh]], [[memperoleh]], [[memperolehi]], [[perolehan]]
* [[oligarki]]
* [[oligopoli]]
* [[olimpiad]]
* [[Olimpik]]
* [[olok]]
** [[memperolokkan]]
* [[olok-olok]]
** [[berolok-olok]], [[memperolok-olok]], [[memperolok-olokkan]], [[mengolok-olokkan]]
* [[olok-olokan]]
* [[olokan]]
{{berbilanglajur-akhir}}
== Om ==
{{berbilanglajur}}
* [[ombak]]
** [[berombak]], [[mengombak]]
* [[omel]]
** [[mengomel]], [[mengomeli]]
* [[omelan]]
{{berbilanglajur-pisah}}
* [[omong]]
** [[mengomong]], [[mengomongkan]]
* [[omong-omong]]
** [[beromong-omong]]
* [[omongan]]
{{berbilanglajur-akhir}}
== On ==
{{berbilanglajur}}
* [[onak]]
* [[onani]]
* [[onar]]
** [[keonaran]], [[mengonarkan]]
* [[ondak]]
** [[berondak-ondak]], [[terondak-ondak]]
* [[onde]]
{{berbilanglajur-pisah}}
* [[onde-onde]]
* [[onggok]]
** [[beronggok-onggok]], [[mengonggokkan]], [[teronggok]]
* [[onggokan]]
* [[ongkos]]
** [[memperongkosi]], [[mengongkosi]], [[perongkosan]]
{{berbilanglajur-akhir}}
== Oo ==
== Op ==
{{berbilanglajur}}
* [[operasi]]
** [[beroperasi]], [[mengoperasi]]
* [[operasional]]
* [[operator]]
* [[opium]]
* [[oportunis]]
* [[oposisi]]
{{berbilanglajur-pisah}}
* [[optik]]
* [[optimis]]
* [[optimisme]]
* [[optimistik]]
* [[optimistis]]
* [[optimum]]
{{berbilanglajur-akhir}}
== Oq ==
== Or ==
{{berbilanglajur}}
* [[orak]]
** [[mengorak]], [[terorak]]
* [[orang]]
** [[berseorang]], [[berseorangan]], [[keseorangan]], [[perseorangan]], [[seorang]], [[seseorang]]
* [[orang-orang]]
** [[berorang-orang]]
* [[orang-orangan]]
* [[orbit]]
* [[orde]]
* [[ordinan]]
* [[ordinat]]
* [[oren]]
* [[organ]]
* [[organik]]
* [[organisasi]]
{{berbilanglajur-pisah}}
** [[mengorganisasi]], [[mengorganisasikan]]
* [[organisator]]
* [[organisma]]
* [[orientalis]]
* [[orientasi]]
** [[berorientasi]], [[berorientasikan]], [[mengorientasikan]]
* [[Orion]]
* [[orkes]]
* [[orkestra]]
* [[orkid]]
* [[ornamen]]
* [[orok]]
* [[ortodoks]]
* [[ortografi]]
{{berbilanglajur-akhir}}
== Os ==
{{berbilanglajur}}
* [[oskar]]
{{berbilanglajur-pisah}}
* [[osmosis]]
{{berbilanglajur-akhir}}
== Ot ==
{{berbilanglajur}}
* [[otak]]
** [[berotak]]
{{berbilanglajur-pisah}}
* [[otek]]
* [[otot]]
{{berbilanglajur-akhir}}
== Ou ==
* [[output]]
== Ov ==
{{berbilanglajur}}
* [[ovari]]
* [[overdraf]]
{{berbilanglajur-pisah}}
* [[ovul]]
* [[ovum]]
{{berbilanglajur-akhir}}
== Ow ==
oxy mat
== Oy ==
{{berbilanglajur}}
* [[oyong]]
{{berbilanglajur-pisah}}
** [[mengoyongkan]]
{{berbilanglajur-akhir}}
== Oz ==
oz, oz, oz, oz, OZ lah kalapo
[[Kategori:Kamus]]
[[Kategori:Wiktionary]]
0842ygdig66kdaoexiejgdt10gdsuye
biru
0
5830
369329
333158
2026-08-30T11:16:24Z
Hakimi97
2668
t+cmn:[[:蓝]] ([[WT:EDIT|Suntingan berbantu gajet]])
369329
wikitext
text/x-wiki
{{wikipedia|Biru}}
==Bahasa Melayu==
===Kata nama===
{{ms-kn}}
#{{colorbox|blue}} [[warna]] seperti [[langit]] yang [[cerah]].
{{ms-ks}}
# berwarna biru.
===Sebutan===
{{dewan|bi|ru}}
===Tulisan Jawi===
{{ARchar|بيرو}}
===Terjemahan===
{{ter-atas|warna}}
* Arab: {{ARchar|أزرق}}
* Afrikaan: blou
* Albania: kaltërt
* Belanda: {{t+|nl|blauw|n}}
* Bosnia: {{t-|bs|plava|f}}
* Breton: glas
* Catalonia: blau
* Cina: [[蓝色]] (lánsè)
*: Mandarin: {{t+|cmn|蓝}}
* Croatia: {{t-|hr|plava|f}}
* Czech: {{t-|cs|modř|f}}
* Denmark: {{t+|da|blå}}
* Esperanto: {{t-|eo|blu|xs=Bahasa Esperanto}}
* Estonia: {{t+|et|sinine}}
* Finland: {{t+|fi|sininen}}, {{t-|fi|sini}}
* Frisia Barat: blau
* Gaelik Scot: gorm
* Ibrani: כחול (kakhól)
* Hindi: नीला (nīlā)
* Hungary: {{t+|hu|kék}}
* Iceland: {{t+|is|blár}}
* Indonesia: {{t+|id|biru|xs=Bahasa Indonesia}}
* Inggeris: {{t+|en|blue}}
* Ireland: {{t-|ga|gorm|xs=Bahasa Ireland}}
* Itali: (''biru tua'') blu ; (''biru muda'') azzurro
* Jepun: [[青]] (あお, ao)
* Jerman: {{t+|de|Blau|n}}
* Korea: (''biru'') [[파랑]] (parang), [[파란색]] (paransæk),
*: (''biru langit'') [[하늘색]] (haneulsæk),
*: (''biru tua'') [[남색]] [藍色] (namsæk), [[남빛]] (nambit), [[쪽빛]] (jjokbit),
*: (''ultramarin'') [[군청]] [群靑] (guncheong), [[군청색]] [群靑色] (guncheongsæk), [[남청색]] [藍靑色] (namcheongsæk)
* Kurdi:
*: Kurmanji: şîn
*: Sorani: {{t|ku|شین|tr=sheen|sc=KUchar}}
* Latin: caerulus
* Latvia: {{t+|lv|zils|xs=Bahasa_Latvia}}
* Lojban: blanu
* Macedonia: сина (sina)
* Malayalam: നീല (neela)
* Malta: [[blu]]; (''biru langit'') ikħal; (''biru langit'') iżraq
* Norway: blåfarge
* Parsi: {{FAchar|آبی}} (ābi)
* Perancis: {{t+|fr|bleu|m}}
* Poland: niebieski , błękit (''sky blue'')
* Portugis: {{t+|pt|azul|m}}
* Rusia: синий (sínij, ''biru kelasi)'', голубой (golubój, ''biru langit)''
* Sepanyol: {{t|es|azul}}, (''biru muda'') {{t|es|celeste}}
* Serbia:
*: Cyril: плава {{f}}
*: Rumi: plava {{f}}
* Slovakia: modrá
* Slovenia: modra {{f}}
* Swahili: bluu
* Sweden: {{t+|sv|blå}}
* Telugu: నీలము (niilamu)
* Turki: {{t+|tr|mavi}}
* Urdu: {{URchar|نیلا}} neela (m), {{URchar|نیلى}} neeli (f)
* Vietnam: (màu) xanh (''biru hijau''), xanh lam
* Wales: {{t-|cy|glas|xs=Bahasa Wales}}
* Yunani: γαλάζιο (ghalázio), γαλανό (ghalanó), μπλε (ble), κυανό (kianó), γλαυκό (ghlafkó)
{{ter-bawah}}
==Bahasa Indonesia==
* Lihat takrifan bahasa Melayu.
[[Kategori:Warna]]
==Tangar Labuk==
===Kata nama===
{{inti|dtb|kata nama}}
# nipah
os5g4m5y7ixc663bnb7ahqu4zp35fqy
sapulo
0
6405
369279
53844
2026-08-30T03:03:57Z
Hakimi97
2668
369279
wikitext
text/x-wiki
== Bahasa Bugis ==
===Kata nama===
{{inti|bug|sapulo|ᨔᨄᨘᨒᨚ}}
# [[sepuluh]].
===Sebutan===
{{IPA|bug|/sapuˈlo/}}
1cneej9o9iwa9zy73631tihpl6ci4df
369280
369279
2026-08-30T03:04:39Z
Hakimi97
2668
369280
wikitext
text/x-wiki
== Bahasa Bugis ==
===Kata nama===
{{inti|bug|kata nama|ᨔᨄᨘᨒᨚ}}
# [[sepuluh]].
===Sebutan===
{{IPA|bug|/sapuˈlo/}}
sno6fh6gyx8tb34fy23rpauaai7k1hw
369281
369280
2026-08-30T03:06:38Z
Hakimi97
2668
369281
wikitext
text/x-wiki
== Bahasa Bugis ==
===Kata nama===
{{inti|bug|kata nama|ᨔᨄᨘᨒᨚ|f3sc=Bugi}}
# [[sepuluh]].
===Sebutan===
{{IPA|bug|/sapuˈlo/}}
rfx6euqxs6o6ks9pettf9jq9nidx1pt
Templat:rujukan
10
8783
369310
111879
2026-08-30T07:36:31Z
SNN95
2113
kemaskini
369310
wikitext
text/x-wiki
{{#invoke:checkparams|error}}<!-- Validate template parameters
--><includeonly>{{#if:{{{name|}}}|{{#tag:ref|{{{1|{{{ref|}}}}}}|name={{{name|}}}|group={{{group|}}}}}|{{#tag:ref|{{{1|{{{refn|}}}}}}|group={{{group|}}}}}}}</includeonly><noinclude>{{documentation}}</noinclude>
67i7orpwsei9zmk5marec7kbindgdtz
369313
369310
2026-08-30T07:44:00Z
SNN95
2113
Membatalkan semakan [[Special:Diff/369310|369310]] oleh [[Special:Contributions/SNN95|SNN95]] ([[User talk:SNN95|bincang]])
369313
wikitext
text/x-wiki
<includeonly>{{#if:{{{name|}}}|{{#tag:ref|{{{1|{{{ref|}}}}}}|name={{{name|}}}|group={{{group|}}}}}|{{#tag:ref|{{{1|{{{refn|}}}}}}|group={{{group|}}}}}}}</includeonly><noinclude>{{documentation}}</noinclude>
1oh2m2600irkg56xbatl3x13a82b49k
369314
369313
2026-08-30T07:44:16Z
SNN95
2113
Membatalkan semakan [[Special:Diff/111879|111879]] oleh [[Special:Contributions/SNN95|SNN95]] ([[User talk:SNN95|bincang]])
369314
wikitext
text/x-wiki
<div class="reflist <!--
-->{{#if: {{{1|}}}
| {{#iferror: {{#ifexpr: {{{1|1}}} > 1 }}
| references-column-width
| references-column-count references-column-count-{{#if:1|{{{1}}}}} }}
| {{#if: {{{colwidth|}}}
| references-column-width }} }}" style="<!--
-->{{#if: {{{1|}}}
| {{#iferror: {{#ifexpr: {{{1|1}}} > 1 }}
| {{column-width|{{#if:1|{{{1}}}}}}}
| {{column-count|{{#if:1|{{{1}}}}}}} }}
| {{#if: {{{colwidth|}}}
| {{column-width|{{{colwidth}}}}} }} }} list-style-type: <!--
-->{{{liststyle|{{#switch: {{{group|}}}
| upper-alpha
| upper-roman
| lower-alpha
| lower-greek
| lower-roman = {{{group}}}
| #default = decimal}}}}};">
{{#tag:references|{{{refs|}}}|group={{{group|}}}}}</div><noinclude>
{{documentation}}</noinclude>
f3apxyfsq3ms5u18bf7m8mihj4dfed0
Modul:headword
828
9757
369309
281455
2026-08-30T07:04:32Z
SNN95
2113
kemaskini
369309
Scribunto
text/plain
local export = {}
-- Named constants for all modules used, to make it easier to swap out sandbox versions.
local debug_track_module = "Module:debug/track"
local en_utilities_module = "Module:en-utilities"
local gender_and_number_module = "Module:gender and number"
local headword_data_module = "Module:headword/data"
local headword_page_module = "Module:headword/page"
local links_module = "Module:links"
local load_module = "Module:load"
local pages_module = "Module:pages"
local palindromes_module = "Module:palindromes"
local pron_qualifier_module = "Module:pron qualifier"
local scripts_module = "Module:scripts"
local scripts_data_module = "Module:scripts/data"
local script_utilities_module = "Module:script utilities"
local script_utilities_data_module = "Module:script utilities/data"
local string_utilities_module = "Module:string utilities"
local table_module = "Module:table"
local utilities_module = "Module:utilities"
local concat = table.concat
local dump = mw.dumpObject
local insert = table.insert
local ipairs = ipairs
local max = math.max
local new_title = mw.title.new
local pairs = pairs
local require = require
local toNFC = mw.ustring.toNFC
local toNFD = mw.ustring.toNFD
local type = type
local ufind = mw.ustring.find
local ugmatch = mw.ustring.gmatch
local ugsub = mw.ustring.gsub
local umatch = mw.ustring.match
--[==[
Loaders for functions in other modules, which overwrite themselves with the target function when called. This ensures modules are only loaded when needed, retains the speed/convenience of locally-declared pre-loaded functions, and has no overhead after the first call, since the target functions are called directly in any subsequent calls.]==]
local function debug_track(...)
debug_track = require(debug_track_module)
return debug_track(...)
end
local function encode_entities(...)
encode_entities = require(string_utilities_module).encode_entities
return encode_entities(...)
end
local function extend(...)
extend = require(table_module).extend
return extend(...)
end
local function find_best_script_without_lang(...)
find_best_script_without_lang = require(scripts_module).findBestScriptWithoutLang
return find_best_script_without_lang(...)
end
local function format_categories(...)
format_categories = require(utilities_module).format_categories
return format_categories(...)
end
local function format_genders(...)
format_genders = require(gender_and_number_module).format_genders
return format_genders(...)
end
local function format_pron_qualifiers(...)
format_pron_qualifiers = require(pron_qualifier_module).format_qualifiers
return format_pron_qualifiers(...)
end
local function full_link(...)
full_link = require(links_module).full_link
return full_link(...)
end
local function get_current_L2(...)
get_current_L2 = require(pages_module).get_current_L2
return get_current_L2(...)
end
local function get_link_page(...)
get_link_page = require(links_module).get_link_page
return get_link_page(...)
end
local function get_script(...)
get_script = require(scripts_module).getByCode
return get_script(...)
end
local function is_palindrome(...)
is_palindrome = require(palindromes_module).is_palindrome
return is_palindrome(...)
end
local function language_link(...)
language_link = require(links_module).language_link
return language_link(...)
end
local function load_data(...)
load_data = require(load_module).load_data
return load_data(...)
end
local function pattern_escape(...)
pattern_escape = require(string_utilities_module).pattern_escape
return pattern_escape(...)
end
local function pluralize(...)
pluralize = require(en_utilities_module).pluralize
return pluralize(...)
end
local function process_page(...)
process_page = require(headword_page_module).process_page
return process_page(...)
end
local function remove_links(...)
remove_links = require(links_module).remove_links
return remove_links(...)
end
local function shallow_copy(...)
shallow_copy = require(table_module).shallowCopy
return shallow_copy(...)
end
local function tag_text(...)
tag_text = require(script_utilities_module).tag_text
return tag_text(...)
end
local function tag_transcription(...)
tag_transcription = require(script_utilities_module).tag_transcription
return tag_transcription(...)
end
local function tag_translit(...)
tag_translit = require(script_utilities_module).tag_translit
return tag_translit(...)
end
local function trim(...)
trim = require(string_utilities_module).trim
return trim(...)
end
local function ulen(...)
ulen = require(string_utilities_module).len
return ulen(...)
end
local function ucfirst(...)
ucfirst = require(string_utilities_module).ucfirst
return ucfirst(...)
end
--[==[
Loaders for objects, which load data (or some other object) into some variable, which can then be accessed as "foo or get_foo()", where the function get_foo sets the object to "foo" and then returns it. This ensures they are only loaded when needed, and avoids the need to check for the existence of the object each time, since once "foo" has been set, "get_foo" will not be called again.]==]
local m_data
local function get_data()
m_data = load_data(headword_data_module)
return m_data
end
local script_data
local function get_script_data()
script_data = load_data(scripts_data_module)
return script_data
end
local script_utilities_data
local function get_script_utilities_data()
script_utilities_data = load_data(script_utilities_data_module)
return script_utilities_data
end
-- If set to true, categories always appear, even in non-mainspace pages
local test_force_categories = false
-- Add a tracking category to track entries with certain (unusually undesirable) properties. `track_id` is an identifier
-- for the particular property being tracked and goes into the tracking page. Specifically, this adds a link in the
-- page text to [[Wiktionary:Tracking/headword/TRACK_ID]], meaning you can find all entries with the `track_id` property
-- by visiting [[Special:WhatLinksHere/Wiktionary:Tracking/headword/TRACK_ID]].
--
-- If `lang` (a language object) is given, an additional tracking page [[Wiktionary:Tracking/headword/TRACK_ID/CODE]] is
-- linked to where CODE is the language code of `lang`, and you can find all entries in the combination of `track_id`
-- and `lang` by visiting [[Special:WhatLinksHere/Wiktionary:Tracking/headword/TRACK_ID/CODE]]. This makes it possible to
-- isolate only the entries with a specific tracking property that are in a given language. Note that if `lang`
-- references at etymology-only language, both that language's code and its full parent's code are tracked.
local function track(track_id, lang)
local tracking_page = "headword/" .. track_id
if lang and lang:hasType("etymology-only") then
debug_track{tracking_page, tracking_page .. "/" .. lang:getCode(),
tracking_page .. "/" .. lang:getFullCode()}
elseif lang then
debug_track{tracking_page, tracking_page .. "/" .. lang:getCode()}
else
debug_track(tracking_page)
end
return true
end
local function text_in_script(text, script_code)
local sc = get_script(script_code)
if not sc then
error("Internal error: Bad script code " .. script_code)
end
local characters = sc.characters
local out
if characters then
text = ugsub(text, "%W", "")
out = ufind(text, "[" .. characters .. "]")
end
if out then
return true
else
return false
end
end
local spacingPunctuation = "[%s%p]+"
--[[ List of punctuation or spacing characters that are found inside of words.
Used to exclude characters from the regex above. ]]
local wordPunc = "-#%%&@־׳״'.·*’་•:᠊"
local notWordPunc = "[^" .. wordPunc .. "]+"
-- Format a term (either a head term or an inflection term) along with any left or right qualifiers, labels, references
-- or customized separator: `part` is the object specifying the term (and `lang` the language of the term), which should
-- optionally contain:
-- * left qualifiers in `q`, an array of strings;
-- * right qualifiers in `qq`, an array of strings;
-- * left labels in `l`, an array of strings;
-- * right labels in `ll`, an array of strings;
-- * references in `refs`, an array either of strings (formatted reference text) or objects containing fields `text`
-- (formatted reference text) and optionally `name` and/or `group`;
-- * a separator in `separator`, defaulting to " <i>or</i> " if this is not the first term (j > 1), otherwise "".
-- `formatted` is the formatted version of the term itself, and `j` is the index of the term.
local function format_term_with_qualifiers_and_refs(lang, part, formatted, j)
local function part_non_empty(field)
local list = part[field]
if not list then
return nil
end
if type(list) ~= "table" then
error(("Internal error: Wrong type for `part.%s`=%s, should be \"table\""):format(field, dump(list)))
end
return list[1]
end
if part_non_empty("q") or part_non_empty("qq") or part_non_empty("l") or
part_non_empty("ll") or part_non_empty("refs") then
formatted = format_pron_qualifiers {
lang = lang,
text = formatted,
q = part.q,
qq = part.qq,
l = part.l,
ll = part.ll,
refs = part.refs,
}
end
local separator = part.separator or j > 1 and " <i>atau</i> " -- use "" to request no separator
if separator then
formatted = separator .. formatted
end
return formatted
end
--[==[Return true if the given head is multiword according to the algorithm used in full_headword().]==]
function export.head_is_multiword(head)
for possibleWordBreak in ugmatch(head, spacingPunctuation) do
if umatch(possibleWordBreak, notWordPunc) then
return true
end
end
return false
end
do
local function workaround_to_exclude_chars(s)
return (ugsub(s, notWordPunc, "\2%1\1"))
end
--[==[Add links to a multiword head.]==]
function export.add_multiword_links(head, default)
head = "\1" .. ugsub(head, spacingPunctuation, workaround_to_exclude_chars) .. "\2"
if default then
head = head
:gsub("(\1[^\2]*)\\([:#][^\2]*\2)", "%1\\\\%2")
:gsub("(\1[^\2]*)([:#][^\2]*\2)", "%1\\%2")
end
--Escape any remaining square brackets to stop them breaking links (e.g. "[citation needed]").
head = encode_entities(head, "[]", true, true)
--[=[
use this when workaround is no longer needed:
head = "[[" .. ugsub(head, WORDBREAKCHARS, "]]%1[[") .. "]]"
Remove any empty links, which could have been created above
at the beginning or end of the string.
]=]
return (head
:gsub("\1\2", "")
:gsub("[\1\2]", {["\1"] = "[[", ["\2"] = "]]"}))
end
end
local function non_categorizable(full_raw_pagename)
return full_raw_pagename:find("^Lampiran:Gerak isyarat/") or
-- Unsupported titles with descriptive names.
(full_raw_pagename:find("^Tajuk tidak disokong/") and not full_raw_pagename:find("`"))
end
local function tag_text_and_add_quals_and_refs(data, head, formatted, j)
-- Add language and script wrapper.
formatted = tag_text(formatted, data.lang, head.sc, "head", nil, j == 1 and data.id or nil)
-- Add qualifiers, labels, references and separator.
return format_term_with_qualifiers_and_refs(data.lang, head, formatted, j)
end
-- Format a headword with transliterations.
local function format_headword(data)
-- Are there non-empty transliterations?
local has_translits = false
local has_manual_translits = false
------ Format the headwords. ------
local head_parts = {}
local unique_head_parts = {}
local has_multiple_heads = not not data.heads[2]
for j, head in ipairs(data.heads) do
if head.tr or head.ts then
has_translits = true
end
if head.tr and head.tr_manual or head.ts then
has_manual_translits = true
end
local formatted
-- Apply processing to the headword, for formatting links and such.
if head.term:find("[[", nil, true) and head.sc:getCode() ~= "Image" then
formatted = language_link{term = head.term, lang = data.lang}
else
formatted = data.lang:makeDisplayText(head.term, head.sc, true)
end
local head_part = tag_text_and_add_quals_and_refs(data, head, formatted, j)
insert(head_parts, head_part)
-- If multiple heads, try to determine whether all heads display the same. To do this we need to effectively
-- rerun the text tagging and addition of qualifiers and references, using 1 for all indices.
if has_multiple_heads then
local unique_head_part
if j == 1 then
unique_head_part = head_part
else
unique_head_part = tag_text_and_add_quals_and_refs(data, head, formatted, 1)
end
unique_head_parts[unique_head_part] = true
end
end
local set_size = 0
if has_multiple_heads then
for _ in pairs(unique_head_parts) do
set_size = set_size + 1
end
end
if set_size == 1 then
head_parts = head_parts[1]
else
head_parts = concat(head_parts)
end
if has_manual_translits then
-- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/manual-tr]]
-- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/manual-tr/LANGCODE]]
track("manual-tr", data.lang)
end
------ Format the transliterations and transcriptions. ------
local translits_formatted
if has_translits then
local translit_parts = {}
for _, head in ipairs(data.heads) do
if head.tr or head.ts then
local this_parts = {}
if head.tr then
insert(this_parts, tag_translit(head.tr, data.lang:getCode(), "head", nil, head.tr_manual))
if head.ts then
insert(this_parts, " ")
end
end
if head.ts then
insert(this_parts, "/" .. tag_transcription(head.ts, data.lang:getCode(), "head") .. "/")
end
insert(translit_parts, concat(this_parts))
end
end
translits_formatted = " (" .. concat(translit_parts, " <i>atau</i> ") .. ")"
local langname = data.lang:getCanonicalName()
local transliteration_page = new_title("Transliterasi bahasa " .. langname, "Wikikamus")
local saw_translit_page = false
if transliteration_page and transliteration_page:getContent() then
translits_formatted = " [[Wikikamus:Transliterasi bahasa " .. langname .. "|•]]" .. translits_formatted
saw_translit_page = true
end
-- If data.lang is an etymology-only language and we didn't find a translation page for it, fall back to the
-- full parent.
if not saw_translit_page and data.lang:hasType("etymology-only") then
langname = data.lang:getFullName()
transliteration_page = new_title("Transliterasi bahasa " .. langname, "Wikikamus")
if transliteration_page and transliteration_page:getContent() then
translits_formatted = " [[Wikikamus:Transliterasi bahasa " .. langname .. "|•]]" .. translits_formatted
end
end
else
translits_formatted = ""
end
------ Paste heads and transliterations/transcriptions. ------
local lemma_gloss
if data.gloss then
lemma_gloss = ' <span class="ib-content qualifier-content">' .. data.gloss .. '</span>'
else
lemma_gloss = ""
end
return head_parts .. translits_formatted .. lemma_gloss
end
local function format_headword_genders(data)
local retval = ""
if data.genders and data.genders[1] then
if data.gloss then
retval = ","
end
local pos_for_cat
if not data.nogendercat then
local no_gender_cat = (m_data or get_data()).no_gender_cat
if not (no_gender_cat[data.lang:getCode()] or no_gender_cat[data.lang:getFullCode()]) then
pos_for_cat = (m_data or get_data()).pos_for_gender_number_cat[data.pos_category:gsub("^reconstructed ", "")]
end
end
local text, cats = format_genders(data.genders, data.lang, pos_for_cat)
if cats then
extend(data.categories, cats)
end
retval = retval .. " " .. text
end
return retval
end
-- Forward reference
local format_inflections
local function format_inflection_parts(data, parts)
for j, part in ipairs(parts) do
if type(part) ~= "table" then
part = {term = part}
end
local partaccel = part.accel
local face = part.face or "bold"
if face ~= "bold" and face ~= "plain" and face ~= "hypothetical" then
error("The face `" .. face .. "` " .. (
(script_utilities_data or get_script_utilities_data()).faces[face] and
"should not be used for non-headword terms on the headword line." or
"is invalid."
))
end
-- Here the final part 'or data.nolinkinfl' allows to have 'nolinkinfl=true'
-- right into the 'data' table to disable inflection links of the entire headword
-- when inflected forms aren't entry-worthy, e.g.: in Vulgar Latin
local nolinkinfl = part.face == "hypothetical" or (part.nolink and track("nolink") or part.nolinkinfl) or (
data.nolink and track("nolink") or data.nolinkinfl)
local formatted
if part.label then
-- FIXME: There should be a better way of italicizing a label. As is, this isn't customizable.
formatted = "<i>" .. part.label .. "</i>"
else
-- Convert the term into a full link. Don't show a transliteration here unless enable_auto_translit is
-- requested, either at the `parts` level (i.e. per inflection) or at the `data.inflections` level (i.e.
-- specified for all inflections). This is controllable in {{head}} using autotrinfl=1 for all inflections,
-- or fNautotr=1 for an individual inflection (remember that a single inflection may be associated with
-- multiple terms). The reason for doing this is to avoid clutter in headword lines by default in languages
-- where the script is relatively straightforward to read by learners (e.g. Greek, Russian), but allow it
-- to be enabled in languages with more complex scripts (e.g. Arabic).
--
-- FIXME: With nested inflections, should we also respect `enable_auto_translit` at the top level of the
-- nested inflections structure?
local tr = part.tr or not (parts.enable_auto_translit or data.inflections.enable_auto_translit) and "-" or nil
-- FIXME: Temporary errors added 2025-10-03. Remove after a month or so.
if part.translit then
error("Internal error: Use field `tr` not `translit` for specifying an inflection part translit")
end
if part.transcription then
error("Internal error: Use field `ts` not `transcription` for specifying an inflection part transcription")
end
local postprocess_annotations
if part.inflections then
postprocess_annotations = function(infldata)
insert(infldata.annotations, format_inflections(data, part.inflections))
end
end
formatted = full_link(
{
term = not nolinkinfl and part.term or nil,
alt = part.alt or (nolinkinfl and part.term or nil),
lang = part.lang or data.lang,
sc = part.sc or parts.sc or nil,
gloss = part.gloss,
pos = part.pos,
lit = part.lit,
id = part.id,
genders = part.genders,
tr = tr,
ts = part.ts,
accel = partaccel or parts.accel,
postprocess_annotations = postprocess_annotations,
},
face
)
end
parts[j] = format_term_with_qualifiers_and_refs(part.lang or data.lang, part,
formatted, j)
end
local parts_output
if parts[1] then
parts_output = (parts.label and " " or "") .. concat(parts)
elseif parts.request then
parts_output = " <small>[please provide]</small>"
insert(data.categories, "Requests for inflections in " .. data.lang:getFullName() .. " entries")
else
parts_output = ""
end
local parts_label = parts.label and ("<i>" .. parts.label .. "</i>") or ""
return format_term_with_qualifiers_and_refs(data.lang, parts, parts_label .. parts_output, 1)
end
-- Format the inflections following the headword or nested after a given inflection. Declared local above.
function format_inflections(data, inflections)
if inflections and inflections[1] then
-- Format each inflection individually.
for key, infl in ipairs(inflections) do
inflections[key] = format_inflection_parts(data, infl)
end
return concat(inflections, ", ")
else
return ""
end
end
-- Format the top-level inflections following the headword. Currently this just adds parens around the
-- formatted comma-separated inflections in `data.inflections`.
local function format_top_level_inflections(data)
local result = format_inflections(data, data.inflections)
if result ~= "" then
return " (" .. result .. ")"
else
return result
end
end
-- Forward reference
local check_red_link_inflections
-- Check a single inflection (which consists of a label and zero or more terms, each possibly with nested inflections)
-- for red links. If so, insert a red-link category based on `plpos` (the plural part of speech to insert in the
-- category), stop further processing, and return true. If no red links found, return false.
local function check_red_link_inflection_parts(data, parts, plpos)
for _, part in ipairs(parts) do
if type(part) ~= "table" then
part = {term = part}
end
local term = part.term
if term and not term:find("%[%[") then
local stripped_physical_term = get_link_page(term, data.lang, part.sc or parts.sc or nil)
if stripped_physical_term then
local title = mw.title.new(stripped_physical_term)
if title and not title:getContent() then
insert(data.categories, data.lang:getFullName() .. " " .. plpos .. " with red links in their headword lines")
return true
end
end
end
if part.inflections then
if check_red_link_inflections(data, part.inflections, plpos) then
return true
end
end
end
return false
end
-- Check a set of inflections (each of which describes a single inflection of the term, such as feminine or plural, and
-- consists of a label and zero or more terms, each possibly with nested inflections) for red links. If so, insert a
-- red-link category based on `plpos` (the plural part of speech to insert in the category), stop further processing,
-- and return true. If no red links found, return false.
function check_red_link_inflections(data, inflections, plpos)
if inflections and inflections[1] then
-- Check each inflection individually.
for key, infl in ipairs(inflections) do
if check_red_link_inflection_parts(data, infl, plpos) then
return true
end
end
end
return false
end
-- Check the top-level inflections in `data.inflections`, along with any nested inflections, for red links. If so,
-- insert a red-link category based on `plpos` (the plural part of speech to insert in the category), stop further
-- processing, and return true. If no red links found, return false.
local function check_red_link_inflections_top_level(data, plpos)
return check_red_link_inflections(data, data.inflections, plpos)
end
--[==[
Returns the plural form of `pos`, a raw part of speech input, which could be singular or
plural. Irregular plural POS are taken into account (e.g. "kanji" pluralizes to
"kanji").
]==]
function export.pluralize_pos(pos)
-- Make the plural form of the part of speech
return (m_data or get_data()).irregular_plurals[pos] or
pos:sub(-1) == "s" and pos or
pluralize(pos)
end
--[==[
Return "lemma" if the given POS is a lemma, "non-lemma form" if a non-lemma form, or nil
if unknown. The POS passed in must be in its plural form ("nouns", "prefixes", etc.).
If you have a POS in its singular form, call {export.pluralize_pos()} above to pluralize it
in a smart fashion that knows when to add "-s" and when to add "-es", and also takes
into account any irregular plurals.
If `best_guess` is given and the POS is in neither the lemma nor non-lemma list, guess
based on whether it ends in " forms"; otherwise, return nil.
]==]
function export.pos_lemma_or_nonlemma(plpos, best_guess)
local m_headword_data = m_data or get_data()
local isLemma = m_headword_data.lemmas
-- Is it a lemma category?
if isLemma[plpos] then
return "Lema"
end
local plpos_no_recon = plpos:gsub("^reconstructed ", "")
if isLemma[plpos_no_recon] then
return "Lema"
end
-- Is it a nonlemma category?
local isNonLemma = m_headword_data.nonlemmas
if isNonLemma[plpos] or isNonLemma[plpos_no_recon] then
return "Bentuk bukan lema"
end
local plpos_no_mut = plpos:gsub("^mutated ", "")
if isLemma[plpos_no_mut] or isNonLemma[plpos_no_mut] then
return "Bentuk bukan lema"
elseif best_guess then
return plpos:find("^Bentuk ") and "Bentuk bukan lema" or "Lema"
else
return nil
end
end
--[==[
Canonicalize a part of speech as specified in 2= in {{tl|head}}. This checks for POS aliases and non-lemma form
aliases ending in 'f', and then pluralizes if the POS term does not have an invariable plural.
]==]
function export.canonicalize_pos(pos)
-- FIXME: Temporary code to throw an error for alias 'pre' (= preposition) that will go away.
if pos == "pre" then
-- Don't throw error on 'pref' as it's an alias for "prefix".
error("POS 'pre' for 'preposition' no longer allowed as it's too ambiguous; use 'prep'")
end
-- Likewise for pro = pronoun.
if pos == "pro" or pos == "prof" then
error("POS 'pro' for 'pronoun' no longer allowed as it's too ambiguous; use 'pron'")
end
local m_headword_data = m_data or get_data()
if m_headword_data.pos_aliases[pos] then
pos = m_headword_data.pos_aliases[pos]
elseif pos:sub(-1) == "f" then
pos = pos:sub(1, -2)
pos = "Bentuk " .. (m_headword_data.pos_aliases[pos] or pos)
end
return export.pluralize_pos(pos)
end
-- Find and return the maximum index in the array `data[element]` (which may have gaps in it), and initialize it to a
-- zero-length array if unspecified. Check to make sure all keys are numeric (other than "maxindex", which is set by
-- [[Module:parameters]] for list parameters), all values are strings, and unless `allow_blank_string` is given,
-- no blank (zero-length) strings are present.
local function init_and_find_maximum_index(data, element, allow_blank_string)
local maxind = 0
if not data[element] then
data[element] = {}
end
local typ = type(data[element])
if typ ~= "table" then
error(("Internal error: In full_headword(), `data.%s` must be an array but is a %s"):format(element, typ))
end
for k, v in pairs(data[element]) do
if k ~= "maxindex" then
if type(k) ~= "number" then
error(("Internal error: Unrecognized non-numeric key '%s' in `data.%s`"):format(k, element))
end
if k > maxind then
maxind = k
end
if v then
if type(v) ~= "string" then
error(("Internal error: For key '%s' in `data.%s`, value should be a string but is a %s"):format(k, element, type(v)))
end
if not allow_blank_string and v == "" then
error(("Internal error: For key '%s' in `data.%s`, blank string not allowed; use 'false' for the default"):format(k, element))
end
end
end
end
return maxind
end
--[==[
-- Add the page to various maintenance categories for the language and the
-- whole page. These are placed in the headword somewhat arbitrarily, but
-- mainly because headword templates are mandatory for entries (meaning that
-- in theory it provides full coverage).
--
-- This is provided as an external entry point so that modules which transclude
-- information from other entries (such as {{tl|ja-see}}) can take advantage
-- of this feature as well, because they are used in place of a conventional
-- headword template.]==]
do
-- Handle any manual sortkeys that have been specified in raw categories
-- by tracking if they are the same or different from the automatically-
-- generated sortkey, so that we can track them in maintenance
-- categories.
local function handle_raw_sortkeys(tbl, sortkey, page, lang, lang_cats)
sortkey = sortkey or lang:makeSortKey(page.pagename)
-- If there are raw categories with no sortkey, then they will be
-- sorted based on the default MediaWiki sortkey, so we check against
-- that.
if tbl == true then
if page.raw_defaultsort ~= sortkey then
insert(lang_cats, "Perkataan bahasa " .. lang:getFullName() .. " dengan kunci isih tidak lewah dan tidak automatik")
end
return
end
local redundant, different
for k in pairs(tbl) do
if k == sortkey then
redundant = true
else
different = true
end
end
if redundant then
insert(lang_cats, "Perkataan bahasa " .. lang:getFullName() .. " dengan kunci isih lewah")
end
if different then
insert(lang_cats, "Perkataan bahasa " .. lang:getFullName() .. " dengan kunci isih tidak lewah dan tidak automatik")
end
return sortkey
end
function export.maintenance_cats(page, lang, lang_cats, page_cats)
extend(page_cats, page.cats)
lang = lang:getFull() -- since we are just generating categories
local canonical = lang:getCanonicalName()
local tbl, sortkey = page.wikitext_topic_cat[lang:getCode()]
if tbl then
sortkey = handle_raw_sortkeys(tbl, sortkey, page, lang, lang_cats)
insert(lang_cats, "Entri bahasa " .. canonical .. " dengan kategori topik yang menggunakan penanda mentah")
end
tbl = page.wikitext_langname_cat[canonical]
if tbl then
handle_raw_sortkeys(tbl, sortkey, page, lang, lang_cats)
insert(lang_cats, "Entri bahasa " .. canonical .. " dengan kategori nama bahasa yang menggunakan penanda mentah")
end
local current_L2 = get_current_L2()
if current_L2 then
local trimmed_L2 = trim(current_L2)
local expected_L2 = "Bahasa " .. canonical
if trimmed_L2 ~= expected_L2 then
insert(lang_cats, "Entri bahasa " .. canonical .. " dengan pengepala bahasa tidak betul")
-- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/pengepala bahasa tidak betul]]
-- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/pengepala bahasa tidak betul/LANGCODE]]
track("pengepala bahasa tidak betul", lang)
end
end
end
end
--[==[This is the primary external entry point.
{{lua|full_headword(data)}}
This is used by {{temp|head}} and various language-specific headword templates (e.g. {{temp|ru-adj}} for Russian adjectives, {{temp|de-noun}} for German nouns, etc.) to display an entire headword line.
See [[#Further explanations for full_headword()]]
]==]
function export.full_headword(data)
-- Prevent data from being destructively modified.
local data = shallow_copy(data)
------------ 1. Basic checks for old-style (multi-arg) calling convention. ------------
if data.getCanonicalName then
error("Internal error: In full_headword(), the first argument `data` needs to be a Lua object (table) of properties, not a language object")
end
if not data.lang or type(data.lang) ~= "table" or not data.lang.getCode then
error("Internal error: In full_headword(), the first argument `data` needs to be a Lua object (table) and `data.lang` must be a language object")
end
if data.id and type(data.id) ~= "string" then
error("Internal error: The id in the data table should be a string.")
end
------------ 2. Initialize pagename etc. ------------
local langcode = data.lang:getCode()
local full_langcode = data.lang:getFullCode()
local langname = data.lang:getCanonicalName()
local full_langname = data.lang:getFullName()
local raw_pagename = data.pagename
local page
local m_headword_data = m_data or get_data()
if raw_pagename and raw_pagename ~= m_headword_data.pagename then -- for testing, doc pages, etc.
-- data.pagename is often set on documentation and test pages through the pagename= parameter of various
-- templates, to emulate running on that page. Having a large number of such test templates on a single
-- page often leads to timeouts, because we fetch and parse the contents of each page in turn. However,
-- we don't really need to do that and can function fine without fetching and parsing the contents of a
-- given page, so turn off content fetching/parsing (and also setting the DEFAULTSORT key through a parser
-- function, which is *slooooow*) in certain namespaces where test and documentation templates are likely to
-- be found and where actual content does not live (User, Template, Module).
local actual_namespace = m_headword_data.page.namespace
local no_fetch_content = actual_namespace == "User" or actual_namespace == "Template" or
actual_namespace == "Module"
page = process_page(raw_pagename, no_fetch_content)
else
page = m_headword_data.page
end
local namespace = page.namespace
------------ 3. Initialize `data.heads` table; if old-style, convert to new-style. ------------
if type(data.heads) == "table" and type(data.heads[1]) == "table" then
-- new-style
if data.translits or data.transcriptions then
error("Internal error: In full_headword(), if `data.heads` is new-style (array of head objects), `data.translits` and `data.transcriptions` cannot be given")
end
else
-- convert old-style `heads`, `translits` and `transcriptions` to new-style
local maxind = max(
init_and_find_maximum_index(data, "heads"),
init_and_find_maximum_index(data, "translits", true),
init_and_find_maximum_index(data, "transcriptions", true)
)
for i = 1, maxind do
data.heads[i] = {
term = data.heads[i],
tr = data.translits[i],
ts = data.transcriptions[i],
}
end
end
-- Make sure there's at least one head.
if not data.heads[1] then
data.heads[1] = {}
end
------------ 4. Initialize and validate `data.categories` and `data.whole_page_categories`, and determine `pos_category` if not given, and add basic categories. ------------
-- EXPERIMENTAL: see [[Wiktionary:Beer parlour/2024/June#Decluttering the altform mess]]
if data.altform then
data.noposcat = true
end
init_and_find_maximum_index(data, "categories")
init_and_find_maximum_index(data, "whole_page_categories")
local pos_category_already_present = false
if data.categories[1] then
local escaped_langname = pattern_escape(full_langname)
local matches_lang_pattern = "^" .. escaped_langname .. " "
for _, cat in ipairs(data.categories) do
-- Does the category begin with the language name? If not, tag it with a tracking category.
if not cat:find(matches_lang_pattern) then
-- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/no lang category]]
-- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/no lang category/LANGCODE]]
track("no lang category", data.lang)
end
end
-- If `pos_category` not given, try to infer it from the first specified category. If this doesn't work, we
-- throw an error below.
if not data.pos_category and data.categories[1]:find(matches_lang_pattern) then
data.pos_category = data.categories[1]:gsub(matches_lang_pattern, "")
-- Optimization to avoid inserting category already present.
pos_category_already_present = true
end
end
if not data.pos_category then
error("Internal error: `data.pos_category` not specified and could not be inferred from the categories given in "
.. "`data.categories`. Either specify the plural part of speech in `data.pos_category` "
.. "(e.g. \"proper nouns\") or ensure that the first category in `data.categories` is formed from the "
.. "language's canonical name plus the plural part of speech (e.g. \"Norwegian Bokmål proper nouns\")."
)
end
-- Insert a category at the beginning for the part of speech unless it's already present or `data.noposcat` given.
if not pos_category_already_present and not data.noposcat then
local pos_category = ucfirst(data.pos_category) .. " bahasa " .. full_langname
-- FIXME: [[User:Theknightwho]] Why is this special case here? Please add an explanatory comment.
if pos_category ~= "Aksara Han rentas bahasa" then
insert(data.categories, 1, pos_category)
end
end
-- Try to determine whether the part of speech refers to a lemma or a non-lemma form; if we can figure this out,
-- add an appropriate category.
local postype = export.pos_lemma_or_nonlemma(data.pos_category)
if not postype then
-- We don't know what this category is, so tag it with a tracking category.
-- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/unrecognized pos]]
-- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/unrecognized pos/LANGCODE]]
track("unrecognized pos", data.lang)
-- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/unrecognized pos/POS]]
-- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/unrecognized pos/POS/LANGCODE]]
track("unrecognized pos/pos/" .. data.pos_category, data.lang)
elseif not data.noposcat then
insert(data.categories, 1, ucfirst(postype) .. " bahasa " .. full_langname)
end
-- EXPERIMENTAL: see [[Wiktionary:Beer parlour/2024/June#Decluttering the altform mess]]
if data.altform then
insert(data.categories, 1, "Bentuk alternatif bahasa " .. full_langname)
end
------------ 5. Create a default headword, and add links to multiword page names. ------------
-- Determine if this is an "anti-asterisk" term, i.e. an attested term in a language that must normally be
-- reconstructed.
local is_anti_asterisk = data.heads[1].term and data.heads[1].term:find("^!!")
local lang_reconstructed = data.lang:hasType("reconstructed")
if is_anti_asterisk then
if not lang_reconstructed then
error("Anti-asterisk feature (head= beginning with !!) can only be used with reconstructed languages")
end
lang_reconstructed = false
end
-- Determine if term is reconstructed
local is_reconstructed = namespace == "Rekonstruksi" or data.lang:hasType("reconstructed")
-- Create a default headword based on the pagename, which is determined in
-- advance by the data module so that it only needs to be done once.
local default_head = page.pagename
-- Add links to multi-word page names when appropriate
if not (is_reconstructed or data.nolinkhead) then
local no_links = m_headword_data.no_multiword_links
if not (no_links[langcode] or no_links[full_langcode]) and export.head_is_multiword(default_head) then
default_head = export.add_multiword_links(default_head, true)
end
end
if is_reconstructed then
default_head = "*" .. default_head
end
------------ 6. Check the namespace against the language type. ------------
if namespace == "" then
if lang_reconstructed then
error("Entri dalam bahasa " .. langname .. " mesti dimasukkan dalam ruang nama Rekonstruksi: ")
elseif data.lang:hasType("appendix-constructed") then
error("Entri dalam bahasa " .. langname .. " mesti dimasukkan dalam ruang nama Lampiran: ")
end
elseif namespace == "Petikan" or namespace == "Tesaurus" then
error("Templat pengepala tidak boleh digunakan dalam ruang nama " .. namespace .. ": .")
end
------------ 7. Fill in missing values in `data.heads`. ------------
-- True if any script among the headword scripts has spaces in it.
local any_script_has_spaces = false
-- True if any term has a redundant head= param.
local has_redundant_head_param = false
for _, head in ipairs(data.heads) do
------ 7a. If missing head, replace with default head.
if not head.term then
head.term = default_head
elseif head.term == default_head then
has_redundant_head_param = true
elseif is_anti_asterisk and head.term == "!!" then
-- If explicit head=!! is given, it's an anti-asterisk term and we fill in the default head.
head.term = "!!" .. default_head
elseif head.term:find("^[!?]$") then
-- If explicit head= just consists of ! or ?, add it to the end of the default head.
head.term = default_head .. head.term
end
head.term_no_initial_bang_bang = is_anti_asterisk and head.term:sub(3) or head.term
if is_reconstructed then
local head_term = head.term
if head_term:find("%[%[") then
head_term = remove_links(head_term)
end
if head_term:sub(1, 1) ~= "*" then
error("The headword '" .. head_term .. "' must begin with '*' to indicate that it is reconstructed.")
end
end
------ 7b. Try to detect the script(s) if not provided. If a per-head script is provided, that takes precedence,
------ otherwise fall back to the overall script if given. If neither given, autodetect the script.
local auto_sc = data.lang:findBestScript(head.term)
if (
auto_sc:getCode() == "None" and
find_best_script_without_lang(head.term):getCode() ~= "None"
) then
insert(data.categories, "Perkataan bahasa " .. full_langname .. " dalam bentuk tulisan tidak piawai")
end
if not (head.sc or data.sc) then -- No script code given, so use autodetected script.
head.sc = auto_sc
else
if not head.sc then -- Overall script code given.
head.sc = data.sc
end
-- Track uses of sc parameter.
if head.sc:getCode() == auto_sc:getCode() then
track("redundant script code", data.lang)
if not data.no_script_code_cat then
insert(data.categories, "Perkataan dengan kod tulisan lewah bahasa " .. full_langname )
end
else
track("non-redundant manual script code", data.lang)
if not data.no_script_code_cat then
insert(data.categories, "Perkataan dengan kod tulisan manual tidak lewah bahasa " .. full_langname )
end
end
end
-- If using a discouraged character sequence, add to maintenance category.
if head.sc:hasNormalizationFixes() == true then
local composed_head = toNFC(head.term)
if head.sc:fixDiscouragedSequences(composed_head) ~= composed_head then
insert(data.whole_page_categories, "Laman menggunakan jujukan aksara tidak digalakkan")
end
end
any_script_has_spaces = any_script_has_spaces or head.sc:hasSpaces()
------ 7c. Create automatic transliterations for any non-Latin headwords without manual translit given
------ (provided automatic translit is available, e.g. not in Persian or Hebrew).
-- Make transliterations
head.tr_manual = nil
-- Try to generate a transliteration if necessary
if head.tr == "-" then
head.tr = nil
else
local notranslit = m_headword_data.notranslit
if not (notranslit[langcode] or notranslit[full_langcode]) and head.sc:isTransliterated() then
head.tr_manual = not not head.tr
local text = head.term_no_initial_bang_bang
if not data.lang:link_tr(head.sc) then
text = remove_links(text)
end
local automated_tr = data.lang:transliterate(text, head.sc)
if automated_tr then
local manual_tr = head.tr
if manual_tr then
if remove_links(manual_tr) == remove_links(automated_tr) then
insert(data.categories, "Perkataan bahasa ".. full_langname .. " dengan transliterasi lewah")
else
insert(data.categories, "Perkataan bahasa ".. full_langname .. " dengan transliterasi manual tidak lewah")
end
end
if not manual_tr then
head.tr = automated_tr
end
end
-- There is still no transliteration?
-- Add the entry to a cleanup category.
if not head.tr then
head.tr = "<small>transliteration needed</small>"
-- FIXME: No current support for 'Request for transliteration of Classical Persian terms' or similar.
-- Consider adding this support in [[Module:category tree/poscatboiler/data/entry maintenance]].
insert(data.categories, "Permintaan transliterasi perkataan bahasa " .. full_langname)
else
-- Otherwise, trim it.
head.tr = trim(head.tr)
end
end
end
-- Link to the transliteration entry for languages that require this.
if head.tr and data.lang:link_tr(head.sc) then
head.tr = full_link{
term = head.tr,
lang = data.lang,
sc = get_script("Latn"),
tr = "-"
}
end
end
------------ 8. Maybe tag the title with the appropriate script code, using the `display_title` mechanism. ------------
-- Assumes that the scripts in "toBeTagged" will never occur in the Reconstruction namespace.
-- (FIXME: Don't make assumptions like this, and if you need to do so, throw an error if the assumption is violated.)
-- Avoid tagging ASCII as Hani even when it is tagged as Hani in the headword, as in [[check]]. The check for ASCII
-- might need to be expanded to a check for any Latin characters and whitespace or punctuation.
local display_title
-- Where there are multiple headwords, use the script for the first. This assumes the first headword is similar to
-- the pagename, and that headwords that are in different scripts from the pagename aren't first. This seems to be
-- about the best we can do (alternatively we could potentially do script detection on the pagename).
local dt_script = data.heads[1].sc
local dt_script_code = dt_script:getCode()
local page_non_ascii = namespace == "" and not page.pagename:find("^[%z\1-\127]+$")
local unsupported_pagename, unsupported = page.full_raw_pagename:gsub("^Tajuk tidak disokong/", "")
if unsupported == 1 and page.unsupported_titles[unsupported_pagename] then
display_title = 'Tajuk tidak disokong/<span class="' .. dt_script_code .. '">' .. page.unsupported_titles[unsupported_pagename] .. '</span>'
elseif page_non_ascii and m_headword_data.toBeTagged[dt_script_code]
or (dt_script_code == "Jpan" and (text_in_script(page.pagename, "Hira") or text_in_script(page.pagename, "Kana")))
or (dt_script_code == "Kore" and text_in_script(page.pagename, "Hang")) then
display_title = '<span class="' .. dt_script_code .. '">' .. page.full_raw_pagename .. '</span>'
-- Keep Han entries region-neutral in the display title.
elseif page_non_ascii and (dt_script_code == "Hant" or dt_script_code == "Hans") then
display_title = '<span class="Hani">' .. page.full_raw_pagename .. '</span>'
elseif namespace == "Rekonstruksi" then
local matched
display_title, matched = ugsub(
page.full_raw_pagename,
"^(Rekonstruksi:[^/]+/)(.+)$",
function(before, term)
return before .. tag_text(term, data.lang, dt_script)
end
)
if matched == 0 then
display_title = nil
end
end
-- FIXME: Generalize this.
-- If the current language uses ur-Arab (for Urdu, etc.), ku-Arab (Central Kurdish) or pa-Arab
-- (Shahmukhi, for Punjabi) and there's more than one language on the page, don't set the display title
-- because these three scripts display in Nastaliq and we don't want this for terms that also exist in other
-- languages that don't display in Nastaliq (e.g. Arabic or Persian) to display in Nastaliq. Because the word
-- "Urdu" occurs near the end of the alphabet, Urdu fonts tend to override the fonts of other languages.
-- FIXME: This is checking for more than one language on the page but instead needs to check if there are any
-- languages using scripts other than the ones just mentioned.
if (dt_script_code == "ur-Arab" or dt_script_code == "ku-Arab" or dt_script_code == "pa-Arab") and page.L2_list.n > 1 then
display_title = nil
end
if display_title then
mw.getCurrentFrame():callParserFunction(
"DISPLAYTITLE",
display_title
)
end
------------ 9. Insert additional categories. ------------
if data.force_cat_output then
-- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/force cat output]]
track("force cat output")
end
if has_redundant_head_param then
if not data.no_redundant_head_cat then
-- This is not the right way to go about this; too many exceptions and problems due to language-specific headword
-- handling customization. If we want this, it should be opt-in by a given language passing in the default headword.
-- insert(data.categories, "Perkataan bahasa " .. full_langname .. " dengan parameter kepala lewah")
end
end
-- If the first head is multiword (after removing links), maybe insert into "LANG multiword terms".
if not data.nomultiwordcat and any_script_has_spaces and postype == "lemma" then
local no_multiword_cat = m_headword_data.no_multiword_cat
if not (no_multiword_cat[langcode] or no_multiword_cat[full_langcode]) then
-- Check for spaces or hyphens, but exclude prefixes and suffixes.
-- Use the pagename, not the head= value, because the latter may have extra
-- junk in it, e.g. superscripted text that throws off the algorithm.
local no_hyphen = m_headword_data.hyphen_not_multiword_sep
-- Exclude hyphens if the data module states that they should for this language.
local checkpattern = (no_hyphen[langcode] or no_hyphen[full_langcode]) and ".[%s፡]." or ".[%s%-፡]."
local is_multiword = umatch(page.pagename, checkpattern)
if is_multiword and not non_categorizable(page.full_raw_pagename) then
insert(data.categories, "Perkataan berbilang kata bahasa " .. full_langname)
elseif not is_multiword then
local long_word_threshold = m_headword_data.long_word_thresholds[langcode] or
m_headword_data.long_word_thresholds[full_langcode]
if long_word_threshold and ulen(page.pagename) >= long_word_threshold then
insert(data.categories, "Perkataan panjang bahasa " .. full_langname)
end
end
end
end
local default_sccat = m_headword_data.default_sccat
if data.sccat or data.sccat == nil and (default_sccat[langcode] or default_sccat[full_langcode]) then
for _, head in ipairs(data.heads) do
insert(data.categories, ucfirst(data.pos_category) .. " bahasa " .. full_langname .. " dalam " ..
head.sc:getDisplayForm())
end
end
-- Reconstructed terms often use weird combinations of scripts and realistically aren't spelled so much as notated.
if namespace ~= "Rekonstruksi" then
-- Map from languages to a string containing the characters to ignore when considering whether a term has
-- multiple written scripts in it. Typically these are Greek or Cyrillic letters used for their phonetic
-- values.
local characters_to_ignore = {
["aaq"] = "αάὰ", -- Penobscot (Algonquian)
["acy"] = "δθ", -- Cypriot Arabic
["aez"] = "β", -- Aeka (Trans-New Guinea)
["anc"] = "γ", -- Ngas (Chadic/Afroasiatic)
["aou"] = "χ", -- A'ou (Kra-Dai)
["art-blk"] = "ч", -- Bolak (conlang)
["awg"] = "β", -- Anguthimri (Pama-Nyungan)
["az"] = "ь", -- Azerbaijani (Turkic; Yañalif Latin spelling, c. 1928 - 1938)
["ba"] = "ь", -- Bashkir (Turkic; Yañalif Latin spelling, c. 1928 - 1938)
["bhp"] = "β", -- Bima (Austronesian)
["bjz"] = "β", -- Baruga (Trans-New Guinea)
["byk"] = "θ", -- Biao (Kra-Dai)
["cdy"] = "θ", -- Chadong (Kra-Dai)
["chp"] = "θ", -- Chipewyan (Athabaskan)
["cjh"] = "χ", -- Upper Chehalis (Salishan)
["clm"] = "χ", -- Klallam (Salishan)
["col"] = "χ", -- Colombia-Wenatchi (Salishan)
["coo"] = "χθ", -- Comox (Salishan)
["crx"] = "θ", -- Carrier (Athabaskan)
["ets"] = "θ", -- Yekhee (Edoid/Niger-Congo)
["ett"] = "χ", -- Etruscan (isolate; in romanizations)
["fla"] = "χ", -- Montana Salish (Salishan)
["grt"] = "་", -- Garo (South Asian Sino-Tibetan)
["gmw-gts"] = "χ", -- Gottscheerish (Bavarian variant spoken in Slovenia)
["hur"] = "χθ", -- Halkomelem (Salishan)
["itc-psa"] = "f", -- Pre-Samnite (Italic; normally written in Greek)
["izh"] = "ь", -- Ingrian (Finnic)
["kic"] = "θ", -- Kickapoo (Algonquian)
["kk"] = "ь", -- Kazakh (Turkic; Yañalif Latin spelling, c. 1928 - 1938)
["ky"] = "ь", -- Kyrgyz (Turkic; Yañalif Latin spelling, c. 1928 - 1938)
["lil"] = "χ", -- Lillooet (Salishan)
["lsi"] = "ꓹ", -- Lashi (Lolo-Burmese/Sino-Tibetan; represents a glottal stop)
["mhz"] = "β", -- Mor (Austronesian)
["mqn"] = "β", -- Moronene (Austronesian)
["neg"]= "ӡā", -- Negidal (Tungusic; normally in Cyrillic)
["oka"] = "χ", -- Okanagan (Salishan)
["ole"] = "θ", -- Olekha (Sino-Tibetan)
["oui"] = "γβ", -- Old Uyghur (Turkic; FIXME: others? E.g. Greek delta (δ)?)
["pox"] = "χ", -- Polabian (West Slavic)
["rif"] = "ε", -- Tarifit (Berber)
["rom"] = "Θθ", -- Romani (Indic: International Standard; two different thetas???)
["rpn"] = "β", -- Repanbitip (Austronesian)
["sah"] = "ь", -- Yakut (Turkic; 1929 - 1939 Latin spelling)
["sit-jap"] = "χ", -- Japhug (Sino-Tibetan)
["sjw"] = "θ", -- Shawnee (Algonquian)
["squ"] = "χ", -- Squamish (Salishan)
["str"] = "χθ", -- Saanich (Salishan)
["teh"] = "χ", -- Tehuelche (Chonan; spoken in Argentina)
["tep"] = "η", -- Tepecano (Uto-Aztecan)
["thp"] = "χ", -- Thompson (Salishan)
["tk"] = "ь", -- Turkmen (Turkic; Yañalif Latin spelling, c. 1928 - 1938)
["tt"] = "ь", -- Kazakh (Turkic; Yañalif Latin spelling, c. 1928 - 1938)
["twa"] = "χ", -- Twana (Salishan)
["wbl"] = "ы", -- Wakhi (Iranian)
["xbc"] = "ϸ", -- Bactrian (Iranian; represents š; normally written in Greek)
["yha"] = "θ", -- Baha (Kra-Dai)
["za"] = "зч", -- Zhuang (Tai/Kra-Dai); 1957-1982 alphabet used two Cyrillic letters (as well as some others like
-- ƃ, ƅ, ƨ, ɯ and ɵ that look like Cyrillic or Greek but are actually Latin)
["zlw-slv"] = "χђћ", -- Slovincian (West Slavic; FIXME: χ is Greek, the other two are Cyrillic, but I'm not sure
-- the currect characters are being chosen in the entry names)
["zng"] = "θ", -- Mang (Mon-Khmer)
["ztp"] = "θ", -- Loxicha Zapotec (Zapotecan)
}
-- Determine how many real scripts are found in the pagename, where we exclude symbols and such. We exclude
-- scripts whose `character_category` is false as well as Zmth (mathematical notation symbols), which has a
-- category of "Mathematical notation symbols". When counting scripts, we need to elide language-specific
-- variants because e.g. Beng and as-Beng have slightly different characters but we don't want to consider them
-- two different scripts (e.g. [[এৰ]] has two characters which are detected respectively as Beng and as-Beng).
local seen_scripts = {}
local num_seen_scripts = 0
local num_loops = 0
local canon_pagename = page.pagename
local ch_to_ignore = characters_to_ignore[full_langcode]
if ch_to_ignore then
canon_pagename = ugsub(canon_pagename, "[" .. ch_to_ignore .. "]", "")
end
while true do
if canon_pagename == "" or num_seen_scripts >= 2 or num_loops >= 10 then
break
end
-- Make sure we don't get into a loop checking the same script over and over again; happens with e.g. [[ᠪᡳ]]
num_loops = num_loops + 1
local pagename_script = find_best_script_without_lang(canon_pagename, "None only as last resort")
local script_chars = pagename_script.characters
if not script_chars then
-- we are stuck; this happens with None
break
end
local script_code = pagename_script:getCode()
local replaced
canon_pagename, replaced = ugsub(canon_pagename, "[" .. script_chars .. "]", "")
if (
replaced and
script_code ~= "Zmth" and
(script_data or get_script_data())[script_code] and
script_data[script_code].character_category ~= false
) then
script_code = script_code:gsub("^.-%-", "")
if not seen_scripts[script_code] then
seen_scripts[script_code] = true
num_seen_scripts = num_seen_scripts + 1
end
end
end
if num_seen_scripts > 1 then
insert(data.categories, "Perkataan bahasa " .. full_langname .. " dieja dalam berbilang tulisan")
end
end
-- Categorise for unusual characters. Takes into account combining characters, so that we can categorise for characters with diacritics that aren't encoded as atomic characters (e.g. U̠). These can be in two formats: single combining characters (i.e. character + diacritic(s)) or double combining characters (i.e. character + diacritic(s) + character). Each can have any number of diacritics.
local standard = data.lang:getStandardCharacters()
if standard and not non_categorizable(page.full_raw_pagename) then
local function char_category(char)
local specials = {
["#"] = "number sign",
["("] = "parentheses",
[")"] = "parentheses",
["<"] = "angle brackets",
[">"] = "angle brackets",
["["] = "square brackets",
["]"] = "square brackets",
["_"] = "underscore",
["{"] = "braces",
["|"] = "vertical line",
["}"] = "braces",
["ß"] = "ẞ",
["\205\133"] = "", -- this is UTF-8 for U+0345 ( ͅ)
["\239\191\189"] = "replacement character",
}
char = toNFD(char)
:gsub(".[\128-\191]*", function(m)
local new_m = specials[m]
new_m = new_m or m:uupper()
return new_m
end)
return toNFC(char)
end
if full_langcode ~= "hi" and full_langcode ~= "lo" then
local standard_chars_scripts = {}
for _, head in ipairs(data.heads) do
standard_chars_scripts[head.sc:getCode()] = true
end
-- Iterate over the scripts, in case there is more than one (as they can have different sets of standard characters).
for code in pairs(standard_chars_scripts) do
local sc_standard = data.lang:getStandardCharacters(code)
if sc_standard then
if page.pagename_len > 1 then
local explode_standard = {}
local function explode(char)
explode_standard[char] = true
return ""
end
local sc_standard = ugsub(sc_standard, page.comb_chars.combined_double, explode)
sc_standard = ugsub(sc_standard,page.comb_chars.combined_single, explode)
:gsub(".[\128-\191]*", explode)
local num_cat_inserted
for char in pairs(page.explode_pagename) do
if not explode_standard[char] then
if char:find("[0-9]") then
if not num_cat_inserted then
insert(data.categories, "Perkataan dieja dengan nombor bahasa " .. full_langname)
num_cat_inserted = true
end
elseif ufind(char, page.emoji_pattern) then
insert(data.categories, "Perkataan dieja dengan emoji bahasa " .. full_langname)
else
local upper = char_category(char)
if not explode_standard[upper] then
char = upper
end
insert(data.categories, "Perkataan dieja dengan " .. char .. " bahasa " .. full_langname)
end
end
end
end
-- If a diacritic doesn't appear in any of the standard characters, also categorise for it generally.
sc_standard = toNFD(sc_standard)
for diacritic in ugmatch(page.decompose_pagename, page.comb_chars.diacritics_single) do
if not umatch(sc_standard, diacritic) then
insert(data.categories, "Perkataan dieja dengan ◌" .. diacritic .. " bahasa " .. full_langname)
end
end
for diacritic in ugmatch(page.decompose_pagename, page.comb_chars.diacritics_double) do
if not umatch(sc_standard, diacritic) then
insert(data.categories, "Perkataan dieja dengan ◌" .. diacritic .. "◌ bahasa " .. full_langname)
end
end
end
end
-- Ancient Greek, Hindi and Lao handled the old way for now, as their standard chars still need to be converted to the new format (because there are a lot of them).
elseif ulen(page.pagename) ~= 1 then
for character in ugmatch(page.pagename, "([^" .. standard .. "])") do
local upper = char_category(character)
if not umatch(upper, "[" .. standard .. "]") then
character = upper
end
insert(data.categories, "Perkataan dieja dengan " .. character .. " bahasa " .. full_langname)
end
end
end
if data.heads[1].sc:isSystem("alphabet") then
local pagename, i = page.pagename:ulower(), 2
while umatch(pagename, "(%a)" .. ("%1"):rep(i)) do
i = i + 1
insert(data.categories, "Perkataan bahasa " .. full_langname .. " dengan " .. i .. " contoh huruf yang sama berturut-turut")
end
end
-- Categorise for palindromes
if not data.nopalindromecat and namespace ~= "Rekonstruksi" and ulen(page.pagename) > 2
-- FIXME: Use of first script here seems hacky. What is the clean way of doing this in the presence of
-- multiple scripts?
and is_palindrome(page.pagename, data.lang, data.heads[1].sc) then
insert(data.categories, "Palindrom bahasa " .. full_langname)
end
if namespace == "" and not lang_reconstructed then
for _, head in ipairs(data.heads) do
if page.full_raw_pagename ~= get_link_page(remove_links(head.term), data.lang, head.sc) then
-- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/pagename spelling mismatch]]
-- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/pagename spelling mismatch/LANGCODE]]
track("pagename spelling mismatch", data.lang)
break
end
end
end
-- Add red link category if called for and we're not a "large" page, where such checks are disabled.
if data.checkredlinks and not m_headword_data.large_pages[m_headword_data.pagename] then
local plposcat = type(data.checkredlinks) == "string" and data.checkredlinks or data.pos_category
check_red_link_inflections_top_level(data, plposcat)
end
-- Add to various maintenance categories.
export.maintenance_cats(page, data.lang, data.categories, data.whole_page_categories)
------------ 10. Format and return headwords, genders, inflections and categories. ------------
-- Format and return all the gathered information. This may add more categories (e.g. gender/number categories),
-- so make sure we do it before evaluating `data.categories`.
local text = '<span class="headword-line">' ..
format_headword(data) ..
format_headword_genders(data) ..
format_top_level_inflections(data) .. '</span>'
-- Language-specific categories.
local cats = format_categories(
data.categories, data.lang, data.sort_key, page.encoded_pagename,
data.force_cat_output or test_force_categories, data.heads[1].sc
)
-- Language-agnostic categories.
local whole_page_cats = format_categories(
data.whole_page_categories, nil, "-"
)
return text .. cats .. whole_page_cats
end
return export
bosevwl8ue0ye0w6y484ylvap3hylep
MediaWiki:Gadget-TabbedLanguages.js
8
10671
369318
108283
2026-08-30T08:36:09Z
PeaceSeekers
3334
Kemaskini (permintaan SNN)
369318
javascript
text/javascript
// ******** imported from [[MediaWiki:Gadget-LegacyScriptsNewNode.js]] ********
var newNode = window.newNode = function newNode(tagname) {
var node = document.createElement(tagname);
for (var i = 1; i < arguments.length; i++) {
var argument = arguments[i];
if (typeof argument == 'string') { //Text
node.appendChild(document.createTextNode(argument));
} else if (typeof argument == 'object') {
if (argument instanceof Node) { // If it is a DOM Node
node.appendChild(argument);
} else { // Attributes (hopefully)
for (var j in argument) {
if (j === 'class') { // Classname different because...
node.className = argument[j];
} else if (j == 'style') { // Style is special
node.style.cssText = argument[j];
} else if (typeof argument[j] == 'function') { // Basic event handlers
node.addEventListener(j, argument[j], false);
} else {
node.setAttribute(j, argument[j]); //Normal attributes
}
}
}
}
}
return node;
};
// ****************************************************************************
(function ( $ ) {
// {{documentation}}
// This is a (very) modified version of User:Atelaes/TabbedLanguages.js.
// Tabbed languages with tabs on the side.
// Tabs design by [[User:Jorm (WMF)]]
/*jshint maxerr:1048576, strict:true, undef:true, latedef:true, es5:true */
/*global mw, jQuery, importScript, importScriptURI, $, ObjectStorage */
if (($.cookie('disable-tabbed-languages') !== null) || (location.search.indexOf("tabbedlanguages=off") !== -1))
return;
if (!((mw.config.get('wgNamespaceNumber') === 0) || (mw.config.get('wgPageName') === "Wiktionary:Sandbox")))
return;
var bodyContent = $(".mw-content-ltr .mw-parser-output")[0], // NOT #bodyContent
languageLinks, ttr,
languageButtons,
caption,
bodyContentFragment,
complete = false,
MO = window.MutationObserver || window.WebKitMutationObserver,
observerStyleSheet;
// Setting up the tabs has not yet been started.
function makeTabsfromScratch() {
// Set up the variables...
window.tabbedLanguages = [];
window.languageContainers = [];
window.currentLanguageTab = 0;
window.languageHeaderEditButtons = [];
languageButtons = [];
window.tabstable = newNode('table', {id: 'tabstable'},
newNode('tbody',
ttr = newNode('tr',
newNode('td', {'style': 'padding-top:0px;vertical-align:top;'},
newNode('table', {'style': 'margin-top: -2px;'},
languageLinks = newNode('tbody', {id: 'languageLinks'}))))));
window.loadremovecatbuttons = false;
bodyContentFragment = document.createDocumentFragment();
// If bodyContent is complete, do it all at once.
// Otherwise, only start working, but don't attempt the whole thing.
// Use catlinks+*, as gEBCN isn't always available.
var catlinks = document.getElementById( "catlinks" );
if( bodyContent && catlinks && catlinks.nextSibling ) {
allAtOnce();
} else {
createObserver();
}
}
function allAtOnce() {
var languageContainer, toc = document.getElementById( "toc" );
currentLanguageTab = 0;
while ( bodyContent.firstChild ) {
if ( bodyContent.firstChild.nodeName === "SECTION" ) {
// Unwrap and remove top-level <section> tags in Parsoid content
// https://www.mediawiki.org/wiki/Specs/HTML/2.8.0#Headings_and_Sections
while ( bodyContent.firstChild.firstChild ) {
bodyContentFragment.appendChild( bodyContent.firstChild.firstChild );
}
bodyContent.removeChild( bodyContent.firstChild );
} else {
bodyContentFragment.appendChild( bodyContent.firstChild );
}
}
try {
for( var child = bodyContentFragment.firstChild; child && !isHeader( child ); ){
child = child.nextSibling;
}
for (
child = child && bodyContentFragment.insertBefore(tabstable, child).nextSibling;
child && child.className !== 'printfooter' && child.className !== 'catlinks';
child = child.nextSibling
) {
if ( isHeader( child ) ) {
var langspan = getHeaderContent( child ),
language = langspan && ( langspan.innerText || langspan.textContent );
if ( language ) {
newTab( tabbedLanguages.push(language) - 1, language );
processEditButton( child.getElementsByClassName('mw-editsection')[ 0 ] );
// should probably be set from a return value of above.
languageContainer = languageContainers[ languageContainers.length - 1 ];
bodyContentFragment.removeChild( child );
child = tabstable;
}
} else {
if ( child.nodeName !== "HR" ) {
languageContainer.insertBefore(child, languageContainer.lastChild);
} else {
bodyContentFragment.removeChild(child);
}
child = tabstable;
}
}
if( tabbedLanguages.length ) {
if( toc ) {
toc.parentNode.removeChild( toc );
}
sortCats();
bodyContent.appendChild( bodyContentFragment );
setUpHashChange()();
if( location.hash === '' ) {
location.replace( "#" + tabbedLanguages[ currentLanguageTab ] );
}
complete = true;
} else {
bodyContent.appendChild( bodyContentFragment );
}
} catch( e ) {
window.console && console.error( e );
bodyContent.appendChild( bodyContentFragment );
complete || setUpHashChange()();
}
}
// Set up a MutationObserver to detect when new elements are loaded.
function createObserver() {
// If .ready happens early (or MO and animstart aren't supported), go ahead.
// TODO the following code was commented out 2023-11-09 as $.isReady was suddenly
// always evaluating to true, meaning that TabbedLanguages would not load.
//if( $.isReady ) {
// return; // ??? How did we get $.isReady if bC or catlinks aren't loaded?
//} else {
$( document ).ready( function () {
if( tabbedLanguages.length === 0 ) {
removeObserver();
if( !bodyContent ) {
bodyContent = $(".mw-content-ltr")[0];
}
if( bodyContent ) {
allAtOnce();
}
}
});
//}
if( !document.getElementsByClassName ) {
return;
}
if( !MO ) {
var supportsAnimations = false;
// Check if we can use animations as a fallback. If not, abort.
// Basically yoinked from Modernizr.
$.each(
"animationName WebkitAnimationName MozAnimationName OAnimationName msAnimationName".split(" "),
function(a, b){
// Do documentElements even always have .style? If not, this'll need fixing.
if( document.documentElement.style[ b ] !== undefined ) {
supportsAnimations = true;
return false;
}
}
);
if( supportsAnimations === false ) {
return;
}
}
var foundHeader = false,
toc, recentChild,
timer = false, // It's the setTimeout value, or false otherwise.
recentHeader = -1,
checkTab, tabFound = false,
// If anyone on this project even considers making a random element
// on a page have the class "visualClear"...
visualClear = document.getElementsByClassName( "visualClear" ),
languageContainer,
observer;
// TODO: Deal with the little jumping elements below the tabstable.
// ...How?
function elemFound() {
if( timer === false ) {
timer = setTimeout( function() {
reactToObserver();
timer = false;
}, 1);
}
}
if( MO ) {
observer = new MO( elemFound );
observer.observe( document, { childList: true, subtree: true } );
} else {
// Fallback for browsers that don't support MO, but do support animations:
// IE10, FF5-13, Chrome 17<, Safari 4-5.1, Opera 12-12.1
// Set up a stylesheet that uses animations/keyframes to allow
// animationStart to see each time a new node loads onto the bodyContent.
observerStyleSheet =
document.getElementsByTagName( 'head' )[0].appendChild(
document.createElement( "style" )
);
var oSSText = "@/@-moz-/@-webkit-/@-ms-/@-o-/".split("/")
.join("keyframes nodeInserted{" +
"from{outline-color:#fff;}" +
"to{outline-color:#000;}" +
"}\n") +
".mw-content-ltr>*,.mw-content-ltr+*,.visualClear{" +
// TODO: Fix duplication here.
"/-moz-/-webkit-/-ms-/-o-/".split("/").join("animation-duration:0.01s;") +
"/-moz-/-webkit-/-ms-/-o-/".split("/").join("animation-name:nodeInserted;") +
"}";
// Pretty much copied from mw.util.
// Don't have time to wait until it would ordinarily load.
if( observerStyleSheet.styleSheet ) {
observerStyleSheet.styleSheet.cssText = oSSText;
} else {
observerStyleSheet.appendChild( document.createTextNode( oSSText ) );
}
observerStyleSheet = observerStyleSheet.sheet ||
observerStyleSheet.styleSheet ||
observerStyleSheet;
document.addEventListener('animationstart', elemFound, false);
document.addEventListener('MSAnimationStart', elemFound, false);
document.addEventListener('webkitAnimationStart', elemFound, false);
}
function reactToObserver() {
if( complete ) {
return;
}
// TODO: Surround main areas in try{} so that if it breaks, at least
// the content gets dumped back into visibility.
// First: What part are we up to?
if( !foundHeader ) {
// search for header or toc
if( !recentChild ) { // Just starting, apparently.
if( !bodyContent ) {
bodyContent = $(".mw-content-ltr")[0];
if( !bodyContent ) {
// bC hasn't loaded yet. Nothing to do here.
return;
}
}
// Check if we can do the whole thing in one go.
if( visualClear.length ) {
removeObserver();
allAtOnce();
return;
}
recentChild = bodyContent.firstChild;
if( !recentChild ) {
return; // Somehow got activated between bodyContent load
// and bodyContent's content's load.
}
}
for( ; !isHeader( recentChild ) && recentChild.nextSibling; ) {
recentChild = recentChild.nextSibling;
}
if( isHeader( recentChild ) ) { // should simplify check. Maybe !recentChild.nextSibling?
// We have our first header.
foundHeader = true;
checkTab = setUpHashChange();
// Default to the first tab.
currentLanguageTab = 0;
toc = document.getElementById('toc');
if ( toc ) {
if ( toc.nextSibling ) {
// And we have a usable ToC. Makes things much easier.
// Analyze the ToC. We'll be using it to determine what
// the tabs are going to be.
$( ".toclevel-1 > a > .toctext" ).each( function() {
var language = $( this ).text();
tabbedLanguages.push( language );
});
// Build all the tabs.
$( tabbedLanguages ).each( newTab );
toc.parentNode.removeChild( toc );
// Afterwards, we'll check if the right section
// is already available.
} else {
// Potential panic situation: Evil formatting places
// ToC *after* the first header, so it's actually
// *partly* loaded at this point, with no nextSibling.
// (Alternatively, someone put it alone in a box.) CSS
// builds it up as a huge tabbing block, but we can't
// remove it here. Oy.
// "Solution":
// Temporarily hide the ToC until ready() fires, then
// remove it. I'm not removing it right away, as I have
// no idea what doom might occur if something like this
// is removed while stuff is being loaded into it.
toc.style.display = "none";
( function ( toc ) {
$( function() {
if( toc.parentNode ) {
toc.parentNode.removeChild( toc );
}
});
})( toc );
toc = undefined;
window.console && console.error( "TL notice: " +
"Malformed entry. ToC either appears after " +
"headers, or is placed in a box. Mind fixing " +
"it or alerting me? Thanks. -- YR" );
}
}
languageContainer = languageContainers[ 0 ];
// Edit buttons.
processEditButton(
recentChild.getElementsByClassName( "mw-editsection" )[ 0 ]
);
// Either way, start displaying the tabs right.
bodyContent.insertBefore( tabstable, recentChild );
if( toc ) {
tabFound = checkTab();
}
}
}
if( foundHeader ) {
// Note that there may or may not be a ToC available...
// Should this be reworked so that the toc check is inside the loop?
if( recentChild.nextSibling ) {
// I hope I'm not going to regret leaving out a recentChild && condition here...
for( var nextChild; recentChild.nextSibling; ) {
nextChild = recentChild.nextSibling;
if( isHeader( recentChild ) ) {
var langspan = getHeaderContent( recentChild );
var editspan = recentChild.getElementsByClassName('mw-editsection')[ 0 ];
if( recentHeader >= 0 ) {
languageContainer.insertBefore( bodyContentFragment, languageContainer.lastChild );
}
recentHeader++;
var language = ( language = langspan ).innerText || language.textContent;
// Make sure it actually matches, when necessary.
if( toc && language !== tabbedLanguages[ recentHeader ]) {
// PANIC!!!
// Okay, maybe don't panic. TL has encountered
// a header that doesn't match the ToC's
// description of the page. Possibilities
// include an h1 on the page, a fake header
// around somewhere, or some other malformed
// kind of header. This really isn't supposed
// to happen ever.
// Response: Clear everything after this point,
// and from there act as though the ToC never
// existed.
if( recentHeader > 0 ) {
toggleLanguageTabs( tabbedLanguages[ 0 ] );
} else {
currentLanguageTab = 0;
}
while( tabbedLanguages.length > recentHeader ) {
tabbedLanguages.pop();
ttr.removeChild(
languageContainers.pop()
);
languageLinks.removeChild(
languageButtons.pop().parentNode
);
}
toc = undefined; // Never. Existed.
tabFound = false;
window.console && console.error( "TL notice: " +
"Malformed entry. ToC does not match " +
"headers. Possibly a misplaced H1, fake " +
"header, or header with incorrect " +
"contents. Mind fixing it or " +
"alerting me? Thanks. -- YR "
);
}
if( !toc ) {
tabbedLanguages.push( language );
newTab( recentHeader, language );
}
// Check to see if the target tab is found.
// TODO: Need a better system of knowing when to check:
// If it's found, stop checking.
// Whether or not we have a ToC, checking can be necessary.
// If we do have a ToC, but no hash, we don't check, right?
// Put another way:
// No hash? W/ ToC, don't check. W/o ToC, only check when new headers come in.
// Hash? Depends.
// W/ ToC: Technically, target could come in at any non-header element... ???
// W/o ToC: Could be whenever. Target header coming in is rather likely, in fact. Oy.
// Either way: If the target, whether header or random element, is found, stop looking.
// Does delaying the tab switch to a element target until full load matter? Not sure.
//
// Plan B: Regardless of ToC presence, only
// check for potential target elems
// at each new header, unless target is found.
if( recentHeader > 0 && tabFound === false ) {
tabFound = checkTab();
}
languageContainer = languageContainers[ recentHeader ];
if( recentHeader > 0 ) { // I have too many of these checks...
// Don't duplicate earlier pEB for first header.
processEditButton( editspan );
}
// All done. Clear.
bodyContent.removeChild( recentChild );
} else {
if( recentChild.nodeName === "HR" ) {
// Kill unnecessary bars.
bodyContent.removeChild( recentChild );
} else {
// Regular content. Prepare for dumping into the
// latest tab.
bodyContentFragment.appendChild( recentChild );
}
}
recentChild = nextChild;
}
}
/*
// If we're all done, finish up.
// How to tell?
// Option one: Repeatedly check for nextSibling.
// - Won't work. bodyContent doesn't always have a nS at the end.
// - Currently in use only for dealing with the last elem. (Uses O2 as fallback.)
// Option two: Set up getElemsByClassName, and poll for length.
// - presumably visualClear. This would probably be pretty heavy.
// - Currently in use.
// Option three: Use $.ready.
// - Potentially introduces substantial delay...
// Option four: In the listener, check for classnames each time.
// - Every time there's a new node? Lots of processing.
// Option five: ...
*/
if( bodyContent.nextSibling && bodyContent.lastChild === recentChild ) { // are we done? ...
// bodyContent.nextSibling doesn't always exist, but if it
// does, get a head start on the stuff that can be done already.
bodyContentFragment.appendChild( bodyContent.lastChild );
/*
// Problem: recentChild is now inside the languageContainer,
// and it's possible that reactToObserver will be called again
// before the post-visualClear stuff runs.
// Option one: recentChild = tabstable;
// - Nope. That would mean bodyContent.lastChild = recentChild again
// Option two: recentChild = false;
// - Nope. The check at the top would cause us to start over again.
// Blargh. This is an awful solution that probably violates every...
*/
recentChild = 1;
// "1" is hereby the indicator that we're not doing anything with
// this particular variable, okay?
// I'll try to make this nicer later.
}
// Dump collected elems into most recent languageContainer.
if( bodyContentFragment.firstChild ) { // Exact duplicate of above code. TODO: Fix.
languageContainer.insertBefore( bodyContentFragment, languageContainer.lastChild );
}
if( visualClear.length ) {
complete = true;
if( bodyContent.lastChild === recentChild ) {
// bC.nS didn't exist. Move the last one left now.
languageContainer.insertBefore( bodyContent.lastChild, languageContainer.lastChild );
}
removeObserver();
sortCats();
if( tabFound !== true ) {
checkTab();
if( location.hash === '' ) {
location.replace( "#" + tabbedLanguages[currentLanguageTab] );
}
}
}
}
}
function removeObserver() {
if( observer ) {
observer.disconnect();
} else if( observerStyleSheet ) {
document.removeEventListener('animationstart', elemFound, false);
document.removeEventListener('MSAnimationStart', elemFound, false);
document.removeEventListener('webkitAnimationStart', elemFound, false);
observerStyleSheet.disabled = true;
}
if( timer !== false ) {
clearTimeout( timer );
}
}
}
function isHeader( elem ) {
// Handle two versions of the markup: https://www.mediawiki.org/wiki/Heading_HTML_changes
return elem && elem.nodeType === Node.ELEMENT_NODE && (
elem.nodeName === "H2" && elem.getElementsByClassName( "mw-headline" ).length !== 0 ||
elem.classList.contains( "mw-heading2" ) && elem.getElementsByTagName( "H2" ).length !== 0
);
}
function getHeaderContent( elem ) {
// Handle two versions of the markup: https://www.mediawiki.org/wiki/Heading_HTML_changes
return elem.nodeName === "H2" ?
elem.getElementsByClassName( "mw-headline" )[0] :
elem.getElementsByTagName( "H2" )[0];
}
function newTab( index, language ) {
var active = index === currentLanguageTab;
var languageContainer = ttr.appendChild( newNode('td', {
'class': 'languageContainer',
'id': language + 'container'
}, active ? undefined : { 'style' : 'display:none;' } ));
languageContainers.push( languageContainer );
newCategoryBox( languageContainer, language );
// lB contains .(un)?selectedTab nodes
languageButtons.push(
languageLinks.appendChild( newNode('tr', newNode('td', {
'class': ( active ? '' : 'un' ) + 'selectedTab'
}, newNode('a', language, {
// Note: ' + language' makes this inconsistent with the ordinary links
// themselves, which have the language name encoded. Issue?
// Keep in mind that the parser itself actually corrects for this,
// changing #!Xóõ links to the proper #.C7.83X.C3.B3.C3.B5 links.
// Probably nothing to worry about.
'href': location.pathname + location.search + '#' + language.replace(/ /g, '_')
}), ' '))).firstChild
);
}
function newCategoryBox( container, name ) {
// Put a container in each for categories.
return container.appendChild( newNode('div', name + ' categories: ', newNode('ul'), {
'class': 'catlinks',
'id': 'catlinks'
}));
}
function processEditButton( button ) {
if( button ) {
// Yes, theoretically if you have some fake H2s the edit buttons will
// be misplaced. Yet another TODO...
var len = languageHeaderEditButtons.push( button );
if( len === 1 ) {
caption = document.createElement('caption');
tabstable.insertBefore( caption, tabstable.firstChild );
}
button.className += " editlangsection";
// use a argument or variable ( from .push? ) instead of .length?
if( len - 1 === currentLanguageTab ) {
caption.firstChild && caption.removeChild( caption.firstChild );
caption.appendChild( button );
}
}
}
// Sets up the hash toggle system.
// Returns the checkTab() function, which returns true if
// we found whatever it was.
function setUpHashChange() {
// Important Note: The decodeURI mess is a real mess.
// #.C7.83X.C3.B3.C3.B5 should go to tab "!Xóõ", with
// the id "!Xóõcontainer" (no encoding). Urgh.
// Also, "#Old_English" needs to go to decoded "Old English".
// Remember to .substr( 1 ) before passing here.
function decodeHash( hash ) {
return decodeURI(
hash
.replace(/\.(?=[0-9A-F]{2})/g, '%')
.replace(/_/g, ' ')
);
}
// Called by onhashchange.
function hashToggleLT() {
var destination = decodeHash( location.hash.substr(1) );
toggleLanguageTabs( destination );
tabbedLanguages[currentLanguageTab] !== destination && resetHash();
}
// For updating page positioning.
// Doesn't activate hashchange, at least in Chrome. Not sure about others.
function resetHash() {
location.replace( location.hash );
}
// Need to decide if language arg is encoded or decoded.
// Will work with either for the moment. Decoded works earlier.
// Currently passed as decoded by every function but itself.
// The hashes are encoded, but hashToggleLT decodes them.
// Toggles to a different language tab.
window.toggleLanguageTabs = function (language) {
// Find the destination language.
var destinationLanguageTab = $.inArray( language, tabbedLanguages );
if( destinationLanguageTab === -1 ) {
var decoded = decodeHash( language );
if( decoded !== language ) {
destinationLanguageTab = $.inArray( decoded, tabbedLanguages );
}
}
// Style the right toggle button, hide the old language section and show the new one.
// var languageButtons = $("#languageLinks .selectedTab, #languageLinks .unselectedTab");
if (destinationLanguageTab !== -1 ) {
if( destinationLanguageTab !== currentLanguageTab ) {
languageButtons[currentLanguageTab].className = 'unselectedTab';
languageContainers[currentLanguageTab].style.display = 'none';
currentLanguageTab = destinationLanguageTab;
languageButtons[destinationLanguageTab].className = 'selectedTab';
languageContainers[destinationLanguageTab].style.display = '';
if (caption) {
// extra checks shouldn't be necessary...
caption.firstChild && caption.removeChild(caption.firstChild);
languageHeaderEditButtons[currentLanguageTab] && caption.appendChild(languageHeaderEditButtons[currentLanguageTab]);
}
}
} else {
// Does the hash match the id of a node in a tab?
language = encodeURI( language.replace(/\ /g, '_') );
// Yes, I just possibly undid the decoding from hashToggleLT.
// Worse, this might double-encode, breaking things.
// Or maybe not? I think everything might be decoded before being
// sent here?
// I'll deal with it later.
// Find the node, and go up the node tree until
// you hit .languageContainer, or nothing.
language = document.getElementById( language );
for( ; language && ( language = language.parentNode ) &&
language.className !== 'languageContainer'; )
;
// language = language && language.parentNode.parentNode;
if ( language ) {
// If someone maliciously makes a languageContainer with a
// non-compliant ID, boom.
toggleLanguageTabs( language.id.split('container')[0] );
}
// Possible doom bug: Endless loop?
}
};
// This function gets returned as checkTab(), btw.
// For during or immediately after load: Check if we have a
// good "starting" tab. Return true if we have a definitive find.
function checkTab() {
// If there's a location hash, the window may have scrolled down before
// we got a chance to reorganize everything.
// If the destination was a subsection or sense id, switch to the right
// tab, and rescroll.
// If it was simply a language, switch to the appropriate tab, and
// scroll back up.
// If there's no hash at all, work off the TargetedTranslations prefs.
try {
var hash = '';
var destination = 'English';
if ( location.hash !== '' ) {
hash = ( location.hash ).substr( 1 ); // does hash.substr always exist?
destination = decodeHash( hash );
}
// 'k, this is still awful.
if ( $.inArray( destination, tabbedLanguages ) !== -1 ) {
toggleLanguageTabs( destination );
window.scrollY && window.scroll(0, 0);
return true;
} else if ( hash !== '' && document.getElementById( hash ) ) {
// This was going
// to receive an area to search from an argument, but it turns
// out that elem.getElementById doesn't actually exist. Meh.
toggleLanguageTabs( destination );
resetHash(); // Scroll to the element. (Necessary since we
// this isn't running through hashToggleLT, which normally does
// it in these situations.)
return true;
}
// No hash. Work from TargetedTranslations.
if ('localStorage' in window) {
if (tabbedLanguages[0] !== 'Translingual' && tabbedLanguages[0] !== 'English' && localStorage.TargetedTranslations) {
for (
var tt_ = localStorage.TargetedTranslations.split("|"), tt = tt_[0].split(";").concat(
$.grep(
tt_[1].replace(/[^;\/]+\//g, '').split(";"),
function (z) {
return z && z !== "Latin" && z !== "Hebrew" && z !== "Arabic";
}
)
).concat( tt_[1].replace(/\/[^;]+/g, '').split(";") ), i = 0;
i < tt.length;
i++
) {
if ($.inArray(tt[i], tabbedLanguages) !== -1) {
toggleLanguageTabs(tabbedLanguages[$.inArray(tt[i], tabbedLanguages)]);
break;
}
}
}
}
return false;
} catch ( e ) {
// This probably isn't all that unlikely to happen. Too complicated. :(
window.console && console.error( "TL error: checkTab broke.", e );
}
}
if ("onhashchange" in window && (document.documentMode === undefined || document.documentMode > 7)) {
window.onhashchange = hashToggleLT;
} else {
$( bodyContent ).on(
'click',
'a[href^="' + location.pathname + location.search + '#"], a[href^="#"]',
function () {
setTimeout( hashToggleLT, 10 );
}
);
}
return checkTab;
}
function sortCats() {
var catDiv = document.getElementById('mw-normal-catlinks'),
currentCatDiv;
if (catDiv) {
var cats = catDiv.getElementsByTagName('li'),
catname,
langcurrent = 0,
catskip = 1;
do {
while (cats.length > 0) {
catname = cats[ 0 ].getElementsByTagName('a')[0].innerHTML;
if (catname.indexOf(tabbedLanguages[langcurrent + catskip]) === 0 &&
!/letter\snames$|script\scharacters$|mythology$/.test(catname)
) {
langcurrent += catskip;
catskip = 1;
}
currentCatDiv = languageContainers[langcurrent].lastChild;
currentCatDiv.lastChild.appendChild(cats[0]);
}
if (langcurrent + 1 < languageContainers.length - catskip) {
// Didn't make it to the end, which means there's a section
// without any categories. Dump what's left back and try again.
while (currentCatDiv.lastChild.firstChild) {
catDiv.lastChild.appendChild(currentCatDiv.lastChild.firstChild);
}
catskip++;
} else {
break;
}
} while (true);
}
if( currentCatDiv ) {
// place patrol link at the bottom of the page
var pl = currentCatDiv.previousSibling; // languageContainer.lastChild.previousSibling;
// Got it, the patrollink is sometimes the lagging last elem.
if( pl && pl.className === "patrollink" ) {
tabstable.parentNode.appendChild(pl);
}
}
/*
// category editing buttons
if (mw.config.get('wgAction') === "view" && !/&printable=yes|&diff=|&oldid=/.test(location.search)) {
for (z = 0; z < languageContainers.length; z++) {
// TODO: import
// addTabbedLanguageNewCatButton(z);
}
if ( window.loadremovecatbuttons === true ) {
$.get(
mw.config.get( 'wgScript' ),
{ 'title' : mw.config.get('wgPageName'), 'action' : 'raw' },
// Note that this isn't actually defined. I'm considering not
// actually importing the function, and just dumping this section.
addRemoveCatButtons
);
}
}
*/
// Remove old cat box, allow display of hidden cats box.
if (catDiv && !(catDiv.nextSibling && catDiv.nextSibling.className === "mw-hidden-catlinks mw-hidden-cats-user-shown")) {
catDiv.parentNode.style.display = 'none';
} else {
if (catDiv) {
catDiv.style.display = 'none';
}
}
}
function testStuff() {
var delay = 5000, f = document.createDocumentFragment();
var x = [
function () {
// $("#toc").remove();
var x = document.getElementById( "mw-content-text" );
while( x.nextSibling ) {
f.appendChild( x.nextSibling );
}
}, function () {
var y = $( ".mw-content-ltr" )[ 0 ];
var q = document.createDocumentFragment();
while( y.firstChild ) {
q.appendChild( y.firstChild );
}
function u( i, e ) {
setTimeout( function () {
y.appendChild( q.firstChild );
}, i / e * delay );
}
for( var i = 0, e = q.childNodes.length; i < e; i++ ) {
u( i, e ); // encapsulate
}
makeTabsfromScratch();
}, function () {
function u( i, e ) {
setTimeout( function () {
$(".mw-content-ltr").after( f.firstChild );
}, i / e * delay / 5 );
}
for( var i = 0, e = f.childNodes.length; i < e; i++ ) {
u( i, e ); // encapsulate
}
console.log(9);
}
];
x[0]();
for( var i = 1; i < x.length; i++ ) {
setTimeout( x[ i ], (i-1) * delay + 50 );
}
}
//testStuff();
makeTabsfromScratch();
// This is officially deprecated as of MW1.22. Should be replaced by mw.hook,
// but the docs don't say what event, so...
$(mw).on('LivePreviewDone', function () {
bodyContent = $(".mw-content-ltr")[0]; // reset
makeTabsfromScratch();
});
})( window.jQuery );
bo3vk8t8xgwm7kymt0gkaic1zrtyvzq
369320
369318
2026-08-30T08:48:43Z
PeaceSeekers
3334
369320
javascript
text/javascript
// ******** imported from [[MediaWiki:Gadget-LegacyScriptsNewNode.js]] ********
var newNode = window.newNode = function newNode(tagname) {
var node = document.createElement(tagname);
for (var i = 1; i < arguments.length; i++) {
var argument = arguments[i];
if (typeof argument == 'string') { //Text
node.appendChild(document.createTextNode(argument));
} else if (typeof argument == 'object') {
if (argument instanceof Node) { // If it is a DOM Node
node.appendChild(argument);
} else { // Attributes (hopefully)
for (var j in argument) {
if (j === 'class') { // Classname different because...
node.className = argument[j];
} else if (j == 'style') { // Style is special
node.style.cssText = argument[j];
} else if (typeof argument[j] == 'function') { // Basic event handlers
node.addEventListener(j, argument[j], false);
} else {
node.setAttribute(j, argument[j]); //Normal attributes
}
}
}
}
}
return node;
};
// ****************************************************************************
(function ( $ ) {
// {{documentation}}
// This is a (very) modified version of User:Atelaes/TabbedLanguages.js.
// Tabbed languages with tabs on the side.
// Tabs design by [[User:Jorm (WMF)]]
/*jshint maxerr:1048576, strict:true, undef:true, latedef:true, es5:true */
/*global mw, jQuery, importScript, importScriptURI, $, ObjectStorage */
if (($.cookie('disable-tabbed-languages') !== null) || (location.search.indexOf("tabbedlanguages=off") !== -1))
return;
if (!((mw.config.get('wgNamespaceNumber') === 0) || (mw.config.get('wgPageName') === "Wiktionary:Sandbox")))
return;
var bodyContent = $(".mw-content-ltr .mw-parser-output")[0], // NOT #bodyContent
languageLinks, ttr,
languageButtons,
caption,
bodyContentFragment,
complete = false,
MO = window.MutationObserver || window.WebKitMutationObserver,
observerStyleSheet;
// Setting up the tabs has not yet been started.
function makeTabsfromScratch() {
// Set up the variables...
window.tabbedLanguages = [];
window.languageContainers = [];
window.currentLanguageTab = 0;
window.languageHeaderEditButtons = [];
languageButtons = [];
window.tabstable = newNode('table', {id: 'tabstable'},
newNode('tbody',
ttr = newNode('tr',
newNode('td', {'style': 'padding-top:0px;vertical-align:top;'},
newNode('table', {'style': 'margin-top: -2px;'},
languageLinks = newNode('tbody', {id: 'languageLinks'}))))));
window.loadremovecatbuttons = false;
bodyContentFragment = document.createDocumentFragment();
// If bodyContent is complete, do it all at once.
// Otherwise, only start working, but don't attempt the whole thing.
// Use catlinks+*, as gEBCN isn't always available.
var catlinks = document.getElementById( "catlinks" );
if( bodyContent && catlinks && catlinks.nextSibling ) {
allAtOnce();
} else {
createObserver();
}
}
function allAtOnce() {
var languageContainer, toc = document.getElementById( "toc" );
currentLanguageTab = 0;
while ( bodyContent.firstChild ) {
if ( bodyContent.firstChild.nodeName === "SECTION" ) {
// Unwrap and remove top-level <section> tags in Parsoid content
// https://www.mediawiki.org/wiki/Specs/HTML/2.8.0#Headings_and_Sections
while ( bodyContent.firstChild.firstChild ) {
bodyContentFragment.appendChild( bodyContent.firstChild.firstChild );
}
bodyContent.removeChild( bodyContent.firstChild );
} else {
bodyContentFragment.appendChild( bodyContent.firstChild );
}
}
try {
for( var child = bodyContentFragment.firstChild; child && !isHeader( child ); ){
child = child.nextSibling;
}
for (
child = child && bodyContentFragment.insertBefore(tabstable, child).nextSibling;
child && child.className !== 'printfooter' && child.className !== 'catlinks';
child = child.nextSibling
) {
if ( isHeader( child ) ) {
var langspan = getHeaderContent( child ),
language = langspan && ( langspan.innerText || langspan.textContent );
if ( language ) {
newTab( tabbedLanguages.push(language) - 1, language );
processEditButton( child.getElementsByClassName('mw-editsection')[ 0 ] );
// should probably be set from a return value of above.
languageContainer = languageContainers[ languageContainers.length - 1 ];
bodyContentFragment.removeChild( child );
child = tabstable;
}
} else {
if ( child.nodeName !== "HR" ) {
languageContainer.insertBefore(child, languageContainer.lastChild);
} else {
bodyContentFragment.removeChild(child);
}
child = tabstable;
}
}
if( tabbedLanguages.length ) {
if( toc ) {
toc.parentNode.removeChild( toc );
}
sortCats();
bodyContent.appendChild( bodyContentFragment );
setUpHashChange()();
if( location.hash === '' ) {
location.replace( "#" + tabbedLanguages[ currentLanguageTab ] );
}
complete = true;
} else {
bodyContent.appendChild( bodyContentFragment );
}
} catch( e ) {
window.console && console.error( e );
bodyContent.appendChild( bodyContentFragment );
complete || setUpHashChange()();
}
}
// Set up a MutationObserver to detect when new elements are loaded.
function createObserver() {
// If .ready happens early (or MO and animstart aren't supported), go ahead.
// TODO the following code was commented out 2023-11-09 as $.isReady was suddenly
// always evaluating to true, meaning that TabbedLanguages would not load.
//if( $.isReady ) {
// return; // ??? How did we get $.isReady if bC or catlinks aren't loaded?
//} else {
$( document ).ready( function () {
if( tabbedLanguages.length === 0 ) {
removeObserver();
if( !bodyContent ) {
bodyContent = $(".mw-content-ltr")[0];
}
if( bodyContent ) {
allAtOnce();
}
}
});
//}
if( !document.getElementsByClassName ) {
return;
}
if( !MO ) {
var supportsAnimations = false;
// Check if we can use animations as a fallback. If not, abort.
// Basically yoinked from Modernizr.
$.each(
"animationName WebkitAnimationName MozAnimationName OAnimationName msAnimationName".split(" "),
function(a, b){
// Do documentElements even always have .style? If not, this'll need fixing.
if( document.documentElement.style[ b ] !== undefined ) {
supportsAnimations = true;
return false;
}
}
);
if( supportsAnimations === false ) {
return;
}
}
var foundHeader = false,
toc, recentChild,
timer = false, // It's the setTimeout value, or false otherwise.
recentHeader = -1,
checkTab, tabFound = false,
// If anyone on this project even considers making a random element
// on a page have the class "visualClear"...
visualClear = document.getElementsByClassName( "visualClear" ),
languageContainer,
observer;
// TODO: Deal with the little jumping elements below the tabstable.
// ...How?
function elemFound() {
if( timer === false ) {
timer = setTimeout( function() {
reactToObserver();
timer = false;
}, 1);
}
}
if( MO ) {
observer = new MO( elemFound );
observer.observe( document, { childList: true, subtree: true } );
} else {
// Fallback for browsers that don't support MO, but do support animations:
// IE10, FF5-13, Chrome 17<, Safari 4-5.1, Opera 12-12.1
// Set up a stylesheet that uses animations/keyframes to allow
// animationStart to see each time a new node loads onto the bodyContent.
observerStyleSheet =
document.getElementsByTagName( 'head' )[0].appendChild(
document.createElement( "style" )
);
var oSSText = "@/@-moz-/@-webkit-/@-ms-/@-o-/".split("/")
.join("keyframes nodeInserted{" +
"from{outline-color:#fff;}" +
"to{outline-color:#000;}" +
"}\n") +
".mw-content-ltr>*,.mw-content-ltr+*,.visualClear{" +
// TODO: Fix duplication here.
"/-moz-/-webkit-/-ms-/-o-/".split("/").join("animation-duration:0.01s;") +
"/-moz-/-webkit-/-ms-/-o-/".split("/").join("animation-name:nodeInserted;") +
"}";
// Pretty much copied from mw.util.
// Don't have time to wait until it would ordinarily load.
if( observerStyleSheet.styleSheet ) {
observerStyleSheet.styleSheet.cssText = oSSText;
} else {
observerStyleSheet.appendChild( document.createTextNode( oSSText ) );
}
observerStyleSheet = observerStyleSheet.sheet ||
observerStyleSheet.styleSheet ||
observerStyleSheet;
document.addEventListener('animationstart', elemFound, false);
document.addEventListener('MSAnimationStart', elemFound, false);
document.addEventListener('webkitAnimationStart', elemFound, false);
}
function reactToObserver() {
if( complete ) {
return;
}
// TODO: Surround main areas in try{} so that if it breaks, at least
// the content gets dumped back into visibility.
// First: What part are we up to?
if( !foundHeader ) {
// search for header or toc
if( !recentChild ) { // Just starting, apparently.
if( !bodyContent ) {
bodyContent = $(".mw-content-ltr")[0];
if( !bodyContent ) {
// bC hasn't loaded yet. Nothing to do here.
return;
}
}
// Check if we can do the whole thing in one go.
if( visualClear.length ) {
removeObserver();
allAtOnce();
return;
}
recentChild = bodyContent.firstChild;
if( !recentChild ) {
return; // Somehow got activated between bodyContent load
// and bodyContent's content's load.
}
}
for( ; !isHeader( recentChild ) && recentChild.nextSibling; ) {
recentChild = recentChild.nextSibling;
}
if( isHeader( recentChild ) ) { // should simplify check. Maybe !recentChild.nextSibling?
// We have our first header.
foundHeader = true;
checkTab = setUpHashChange();
// Default to the first tab.
currentLanguageTab = 0;
toc = document.getElementById('toc');
if ( toc ) {
if ( toc.nextSibling ) {
// And we have a usable ToC. Makes things much easier.
// Analyze the ToC. We'll be using it to determine what
// the tabs are going to be.
$( ".toclevel-1 > a > .toctext" ).each( function() {
var language = $( this ).text();
tabbedLanguages.push( language );
});
// Build all the tabs.
$( tabbedLanguages ).each( newTab );
toc.parentNode.removeChild( toc );
// Afterwards, we'll check if the right section
// is already available.
} else {
// Potential panic situation: Evil formatting places
// ToC *after* the first header, so it's actually
// *partly* loaded at this point, with no nextSibling.
// (Alternatively, someone put it alone in a box.) CSS
// builds it up as a huge tabbing block, but we can't
// remove it here. Oy.
// "Solution":
// Temporarily hide the ToC until ready() fires, then
// remove it. I'm not removing it right away, as I have
// no idea what doom might occur if something like this
// is removed while stuff is being loaded into it.
toc.style.display = "none";
( function ( toc ) {
$( function() {
if( toc.parentNode ) {
toc.parentNode.removeChild( toc );
}
});
})( toc );
toc = undefined;
window.console && console.error( "TL notice: " +
"Malformed entry. ToC either appears after " +
"headers, or is placed in a box. Mind fixing " +
"it or alerting me? Thanks. -- YR" );
}
}
languageContainer = languageContainers[ 0 ];
// Edit buttons.
processEditButton(
recentChild.getElementsByClassName( "mw-editsection" )[ 0 ]
);
// Either way, start displaying the tabs right.
bodyContent.insertBefore( tabstable, recentChild );
if( toc ) {
tabFound = checkTab();
}
}
}
if( foundHeader ) {
// Note that there may or may not be a ToC available...
// Should this be reworked so that the toc check is inside the loop?
if( recentChild.nextSibling ) {
// I hope I'm not going to regret leaving out a recentChild && condition here...
for( var nextChild; recentChild.nextSibling; ) {
nextChild = recentChild.nextSibling;
if( isHeader( recentChild ) ) {
var langspan = getHeaderContent( recentChild );
var editspan = recentChild.getElementsByClassName('mw-editsection')[ 0 ];
if( recentHeader >= 0 ) {
languageContainer.insertBefore( bodyContentFragment, languageContainer.lastChild );
}
recentHeader++;
var language = ( language = langspan ).innerText || language.textContent;
// Make sure it actually matches, when necessary.
if( toc && language !== tabbedLanguages[ recentHeader ]) {
// PANIC!!!
// Okay, maybe don't panic. TL has encountered
// a header that doesn't match the ToC's
// description of the page. Possibilities
// include an h1 on the page, a fake header
// around somewhere, or some other malformed
// kind of header. This really isn't supposed
// to happen ever.
// Response: Clear everything after this point,
// and from there act as though the ToC never
// existed.
if( recentHeader > 0 ) {
toggleLanguageTabs( tabbedLanguages[ 0 ] );
} else {
currentLanguageTab = 0;
}
while( tabbedLanguages.length > recentHeader ) {
tabbedLanguages.pop();
ttr.removeChild(
languageContainers.pop()
);
languageLinks.removeChild(
languageButtons.pop().parentNode
);
}
toc = undefined; // Never. Existed.
tabFound = false;
window.console && console.error( "TL notice: " +
"Malformed entry. ToC does not match " +
"headers. Possibly a misplaced H1, fake " +
"header, or header with incorrect " +
"contents. Mind fixing it or " +
"alerting me? Thanks. -- YR "
);
}
if( !toc ) {
tabbedLanguages.push( language );
newTab( recentHeader, language );
}
// Check to see if the target tab is found.
// TODO: Need a better system of knowing when to check:
// If it's found, stop checking.
// Whether or not we have a ToC, checking can be necessary.
// If we do have a ToC, but no hash, we don't check, right?
// Put another way:
// No hash? W/ ToC, don't check. W/o ToC, only check when new headers come in.
// Hash? Depends.
// W/ ToC: Technically, target could come in at any non-header element... ???
// W/o ToC: Could be whenever. Target header coming in is rather likely, in fact. Oy.
// Either way: If the target, whether header or random element, is found, stop looking.
// Does delaying the tab switch to a element target until full load matter? Not sure.
//
// Plan B: Regardless of ToC presence, only
// check for potential target elems
// at each new header, unless target is found.
if( recentHeader > 0 && tabFound === false ) {
tabFound = checkTab();
}
languageContainer = languageContainers[ recentHeader ];
if( recentHeader > 0 ) { // I have too many of these checks...
// Don't duplicate earlier pEB for first header.
processEditButton( editspan );
}
// All done. Clear.
bodyContent.removeChild( recentChild );
} else {
if( recentChild.nodeName === "HR" ) {
// Kill unnecessary bars.
bodyContent.removeChild( recentChild );
} else {
// Regular content. Prepare for dumping into the
// latest tab.
bodyContentFragment.appendChild( recentChild );
}
}
recentChild = nextChild;
}
}
/*
// If we're all done, finish up.
// How to tell?
// Option one: Repeatedly check for nextSibling.
// - Won't work. bodyContent doesn't always have a nS at the end.
// - Currently in use only for dealing with the last elem. (Uses O2 as fallback.)
// Option two: Set up getElemsByClassName, and poll for length.
// - presumably visualClear. This would probably be pretty heavy.
// - Currently in use.
// Option three: Use $.ready.
// - Potentially introduces substantial delay...
// Option four: In the listener, check for classnames each time.
// - Every time there's a new node? Lots of processing.
// Option five: ...
*/
if( bodyContent.nextSibling && bodyContent.lastChild === recentChild ) { // are we done? ...
// bodyContent.nextSibling doesn't always exist, but if it
// does, get a head start on the stuff that can be done already.
bodyContentFragment.appendChild( bodyContent.lastChild );
/*
// Problem: recentChild is now inside the languageContainer,
// and it's possible that reactToObserver will be called again
// before the post-visualClear stuff runs.
// Option one: recentChild = tabstable;
// - Nope. That would mean bodyContent.lastChild = recentChild again
// Option two: recentChild = false;
// - Nope. The check at the top would cause us to start over again.
// Blargh. This is an awful solution that probably violates every...
*/
recentChild = 1;
// "1" is hereby the indicator that we're not doing anything with
// this particular variable, okay?
// I'll try to make this nicer later.
}
// Dump collected elems into most recent languageContainer.
if( bodyContentFragment.firstChild ) { // Exact duplicate of above code. TODO: Fix.
languageContainer.insertBefore( bodyContentFragment, languageContainer.lastChild );
}
if( visualClear.length ) {
complete = true;
if( bodyContent.lastChild === recentChild ) {
// bC.nS didn't exist. Move the last one left now.
languageContainer.insertBefore( bodyContent.lastChild, languageContainer.lastChild );
}
removeObserver();
sortCats();
if( tabFound !== true ) {
checkTab();
if( location.hash === '' ) {
location.replace( "#" + tabbedLanguages[currentLanguageTab] );
}
}
}
}
}
function removeObserver() {
if( observer ) {
observer.disconnect();
} else if( observerStyleSheet ) {
document.removeEventListener('animationstart', elemFound, false);
document.removeEventListener('MSAnimationStart', elemFound, false);
document.removeEventListener('webkitAnimationStart', elemFound, false);
observerStyleSheet.disabled = true;
}
if( timer !== false ) {
clearTimeout( timer );
}
}
}
function isHeader( elem ) {
// Handle two versions of the markup: https://www.mediawiki.org/wiki/Heading_HTML_changes
return elem && elem.nodeType === Node.ELEMENT_NODE && (
elem.nodeName === "H2" && elem.getElementsByClassName( "mw-headline" ).length !== 0 ||
elem.classList.contains( "mw-heading2" ) && elem.getElementsByTagName( "H2" ).length !== 0
);
}
function getHeaderContent( elem ) {
// Handle two versions of the markup: https://www.mediawiki.org/wiki/Heading_HTML_changes
return elem.nodeName === "H2" ?
elem.getElementsByClassName( "mw-headline" )[0] :
elem.getElementsByTagName( "H2" )[0];
}
function newTab( index, language ) {
var active = index === currentLanguageTab;
var languageContainer = ttr.appendChild( newNode('td', {
'class': 'languageContainer',
'id': language + 'container'
}, active ? undefined : { 'style' : 'display:none;' } ));
languageContainers.push( languageContainer );
newCategoryBox( languageContainer, language );
// lB contains .(un)?selectedTab nodes
languageButtons.push(
languageLinks.appendChild( newNode('tr', newNode('td', {
'class': ( active ? '' : 'un' ) + 'selectedTab'
}, newNode('a', language, {
// Note: ' + language' makes this inconsistent with the ordinary links
// themselves, which have the language name encoded. Issue?
// Keep in mind that the parser itself actually corrects for this,
// changing #!Xóõ links to the proper #.C7.83X.C3.B3.C3.B5 links.
// Probably nothing to worry about.
'href': location.pathname + location.search + '#' + language.replace(/ /g, '_')
}), ' '))).firstChild
);
}
function newCategoryBox( container, name ) {
// Put a container in each for categories.
return container.appendChild( newNode('div', ' Kategori ' + name, newNode('ul'), {
'class': 'catlinks',
'id': 'catlinks'
}));
}
function processEditButton( button ) {
if( button ) {
// Yes, theoretically if you have some fake H2s the edit buttons will
// be misplaced. Yet another TODO...
var len = languageHeaderEditButtons.push( button );
if( len === 1 ) {
caption = document.createElement('caption');
tabstable.insertBefore( caption, tabstable.firstChild );
}
button.className += " editlangsection";
// use a argument or variable ( from .push? ) instead of .length?
if( len - 1 === currentLanguageTab ) {
caption.firstChild && caption.removeChild( caption.firstChild );
caption.appendChild( button );
}
}
}
// Sets up the hash toggle system.
// Returns the checkTab() function, which returns true if
// we found whatever it was.
function setUpHashChange() {
// Important Note: The decodeURI mess is a real mess.
// #.C7.83X.C3.B3.C3.B5 should go to tab "!Xóõ", with
// the id "!Xóõcontainer" (no encoding). Urgh.
// Also, "#Old_English" needs to go to decoded "Old English".
// Remember to .substr( 1 ) before passing here.
function decodeHash( hash ) {
return decodeURI(
hash
.replace(/\.(?=[0-9A-F]{2})/g, '%')
.replace(/_/g, ' ')
);
}
// Called by onhashchange.
function hashToggleLT() {
var destination = decodeHash( location.hash.substr(1) );
toggleLanguageTabs( destination );
tabbedLanguages[currentLanguageTab] !== destination && resetHash();
}
// For updating page positioning.
// Doesn't activate hashchange, at least in Chrome. Not sure about others.
function resetHash() {
location.replace( location.hash );
}
// Need to decide if language arg is encoded or decoded.
// Will work with either for the moment. Decoded works earlier.
// Currently passed as decoded by every function but itself.
// The hashes are encoded, but hashToggleLT decodes them.
// Toggles to a different language tab.
window.toggleLanguageTabs = function (language) {
// Find the destination language.
var destinationLanguageTab = $.inArray( language, tabbedLanguages );
if( destinationLanguageTab === -1 ) {
var decoded = decodeHash( language );
if( decoded !== language ) {
destinationLanguageTab = $.inArray( decoded, tabbedLanguages );
}
}
// Style the right toggle button, hide the old language section and show the new one.
// var languageButtons = $("#languageLinks .selectedTab, #languageLinks .unselectedTab");
if (destinationLanguageTab !== -1 ) {
if( destinationLanguageTab !== currentLanguageTab ) {
languageButtons[currentLanguageTab].className = 'unselectedTab';
languageContainers[currentLanguageTab].style.display = 'none';
currentLanguageTab = destinationLanguageTab;
languageButtons[destinationLanguageTab].className = 'selectedTab';
languageContainers[destinationLanguageTab].style.display = '';
if (caption) {
// extra checks shouldn't be necessary...
caption.firstChild && caption.removeChild(caption.firstChild);
languageHeaderEditButtons[currentLanguageTab] && caption.appendChild(languageHeaderEditButtons[currentLanguageTab]);
}
}
} else {
// Does the hash match the id of a node in a tab?
language = encodeURI( language.replace(/\ /g, '_') );
// Yes, I just possibly undid the decoding from hashToggleLT.
// Worse, this might double-encode, breaking things.
// Or maybe not? I think everything might be decoded before being
// sent here?
// I'll deal with it later.
// Find the node, and go up the node tree until
// you hit .languageContainer, or nothing.
language = document.getElementById( language );
for( ; language && ( language = language.parentNode ) &&
language.className !== 'languageContainer'; )
;
// language = language && language.parentNode.parentNode;
if ( language ) {
// If someone maliciously makes a languageContainer with a
// non-compliant ID, boom.
toggleLanguageTabs( language.id.split('container')[0] );
}
// Possible doom bug: Endless loop?
}
};
// This function gets returned as checkTab(), btw.
// For during or immediately after load: Check if we have a
// good "starting" tab. Return true if we have a definitive find.
function checkTab() {
// If there's a location hash, the window may have scrolled down before
// we got a chance to reorganize everything.
// If the destination was a subsection or sense id, switch to the right
// tab, and rescroll.
// If it was simply a language, switch to the appropriate tab, and
// scroll back up.
// If there's no hash at all, work off the TargetedTranslations prefs.
try {
var hash = '';
var destination = 'English';
if ( location.hash !== '' ) {
hash = ( location.hash ).substr( 1 ); // does hash.substr always exist?
destination = decodeHash( hash );
}
// 'k, this is still awful.
if ( $.inArray( destination, tabbedLanguages ) !== -1 ) {
toggleLanguageTabs( destination );
window.scrollY && window.scroll(0, 0);
return true;
} else if ( hash !== '' && document.getElementById( hash ) ) {
// This was going
// to receive an area to search from an argument, but it turns
// out that elem.getElementById doesn't actually exist. Meh.
toggleLanguageTabs( destination );
resetHash(); // Scroll to the element. (Necessary since we
// this isn't running through hashToggleLT, which normally does
// it in these situations.)
return true;
}
// No hash. Work from TargetedTranslations.
if ('localStorage' in window) {
if (tabbedLanguages[0] !== 'Translingual' && tabbedLanguages[0] !== 'English' && localStorage.TargetedTranslations) {
for (
var tt_ = localStorage.TargetedTranslations.split("|"), tt = tt_[0].split(";").concat(
$.grep(
tt_[1].replace(/[^;\/]+\//g, '').split(";"),
function (z) {
return z && z !== "Latin" && z !== "Hebrew" && z !== "Arabic";
}
)
).concat( tt_[1].replace(/\/[^;]+/g, '').split(";") ), i = 0;
i < tt.length;
i++
) {
if ($.inArray(tt[i], tabbedLanguages) !== -1) {
toggleLanguageTabs(tabbedLanguages[$.inArray(tt[i], tabbedLanguages)]);
break;
}
}
}
}
return false;
} catch ( e ) {
// This probably isn't all that unlikely to happen. Too complicated. :(
window.console && console.error( "TL error: checkTab broke.", e );
}
}
if ("onhashchange" in window && (document.documentMode === undefined || document.documentMode > 7)) {
window.onhashchange = hashToggleLT;
} else {
$( bodyContent ).on(
'click',
'a[href^="' + location.pathname + location.search + '#"], a[href^="#"]',
function () {
setTimeout( hashToggleLT, 10 );
}
);
}
return checkTab;
}
function sortCats() {
var catDiv = document.getElementById('mw-normal-catlinks'),
currentCatDiv;
if (catDiv) {
var cats = catDiv.getElementsByTagName('li'),
catname,
langcurrent = 0,
catskip = 1;
do {
while (cats.length > 0) {
catname = cats[ 0 ].getElementsByTagName('a')[0].innerHTML;
if (catname.indexOf(tabbedLanguages[langcurrent + catskip]) === 0 &&
!/letter\snames$|script\scharacters$|mythology$/.test(catname)
) {
langcurrent += catskip;
catskip = 1;
}
currentCatDiv = languageContainers[langcurrent].lastChild;
currentCatDiv.lastChild.appendChild(cats[0]);
}
if (langcurrent + 1 < languageContainers.length - catskip) {
// Didn't make it to the end, which means there's a section
// without any categories. Dump what's left back and try again.
while (currentCatDiv.lastChild.firstChild) {
catDiv.lastChild.appendChild(currentCatDiv.lastChild.firstChild);
}
catskip++;
} else {
break;
}
} while (true);
}
if( currentCatDiv ) {
// place patrol link at the bottom of the page
var pl = currentCatDiv.previousSibling; // languageContainer.lastChild.previousSibling;
// Got it, the patrollink is sometimes the lagging last elem.
if( pl && pl.className === "patrollink" ) {
tabstable.parentNode.appendChild(pl);
}
}
/*
// category editing buttons
if (mw.config.get('wgAction') === "view" && !/&printable=yes|&diff=|&oldid=/.test(location.search)) {
for (z = 0; z < languageContainers.length; z++) {
// TODO: import
// addTabbedLanguageNewCatButton(z);
}
if ( window.loadremovecatbuttons === true ) {
$.get(
mw.config.get( 'wgScript' ),
{ 'title' : mw.config.get('wgPageName'), 'action' : 'raw' },
// Note that this isn't actually defined. I'm considering not
// actually importing the function, and just dumping this section.
addRemoveCatButtons
);
}
}
*/
// Remove old cat box, allow display of hidden cats box.
if (catDiv && !(catDiv.nextSibling && catDiv.nextSibling.className === "mw-hidden-catlinks mw-hidden-cats-user-shown")) {
catDiv.parentNode.style.display = 'none';
} else {
if (catDiv) {
catDiv.style.display = 'none';
}
}
}
function testStuff() {
var delay = 5000, f = document.createDocumentFragment();
var x = [
function () {
// $("#toc").remove();
var x = document.getElementById( "mw-content-text" );
while( x.nextSibling ) {
f.appendChild( x.nextSibling );
}
}, function () {
var y = $( ".mw-content-ltr" )[ 0 ];
var q = document.createDocumentFragment();
while( y.firstChild ) {
q.appendChild( y.firstChild );
}
function u( i, e ) {
setTimeout( function () {
y.appendChild( q.firstChild );
}, i / e * delay );
}
for( var i = 0, e = q.childNodes.length; i < e; i++ ) {
u( i, e ); // encapsulate
}
makeTabsfromScratch();
}, function () {
function u( i, e ) {
setTimeout( function () {
$(".mw-content-ltr").after( f.firstChild );
}, i / e * delay / 5 );
}
for( var i = 0, e = f.childNodes.length; i < e; i++ ) {
u( i, e ); // encapsulate
}
console.log(9);
}
];
x[0]();
for( var i = 1; i < x.length; i++ ) {
setTimeout( x[ i ], (i-1) * delay + 50 );
}
}
//testStuff();
makeTabsfromScratch();
// This is officially deprecated as of MW1.22. Should be replaced by mw.hook,
// but the docs don't say what event, so...
$(mw).on('LivePreviewDone', function () {
bodyContent = $(".mw-content-ltr")[0]; // reset
makeTabsfromScratch();
});
})( window.jQuery );
ikhj19zh2zu51w6dndzwz3dh1iai14a
MediaWiki:Gadget-TabbedLanguages.css
8
10672
369319
96570
2026-08-30T08:36:58Z
PeaceSeekers
3334
Kemaskini (permintaan SNN)
369319
css
text/css
/* Styles for the Tabbed Languages gadget */
#languageLinks .selectedTab a {
font-size: 19px;
color: #000;
padding: 6px;
display: block;
border-left: 1px solid #CCC;
border-bottom: 1px solid #CCC;
margin-bottom: -3px;
background-color: #fff;
margin-right: -6px;
position: relative;
border-top: 1px solid #CCC;
white-space: nowrap;
}
#languageLinks .unselectedTab a {
font-size: 16px;
color: #929292;
padding: 6px;
display: block;
border-left: 1px solid #CCC;
border-top: 1px solid #CCC;
border-bottom: 1px solid #CCC;
margin-bottom: -3px;
margin-left: 15px;
margin-right: -5px;
white-space: nowrap;
background-color: #F6F6F6;
}
#languageLinks tr td {
padding: 0px;
}
tr td.languageContainer {
padding-left: 8px;
padding-bottom: 10px;
padding-right: 8px;
border: 1px solid #CCC;
vertical-align: top;
width: 100%;
}
.unselectedtab {
margin-left: 5px;
}
.editlangsection {
margin-top: -13px;
margin-right: 5px;
border: 1px solid #CCC;
margin-bottom: -2px;
border-bottom-width: 0px;
-webkit-border-top-left-radius: 5px;
-webkit-border-top-right-radius: 5px;
-moz-border-radius-topleft: 5px;
-moz-border-radius-topright: 5px;
border-top-left-radius: 5px;
border-top-right-radius: 5px;
color: white;
line-height: 14px;
font-size: 12px;
padding: 0px 7px;
text-align: center;
clear: both;
background-color: white;
float: right;
}
#languageLinks a.addLanguageButton {
font-size: 12px;
padding: 3px 6px;
}
@media screen and (max-width:36em) {
#tabstable > tbody > tr > td {
display: block;
float: left;
width: 100%;
}
#languageLinks tr {
display: block;
float: left;
margin-bottom: -3px;
margin-left: -5px;
margin-top: 5px;
}
#languageLinks .unselectedTab a {
margin-left: 0;
margin-right: 5px;
border-right: 1px solid #CCC;
}
#languageLinks .selectedTab a {
margin-left: 0;
margin-right: 5px;
border-right: 1px solid #CCC;
border-bottom: 1px solid #FFF;
}
#tabstable {
width: 100%;
}
#languageLinks a.addLanguageButton {
margin-top: 2px;
margin-bottom: 1px;
}
.editlangsection {
border-bottom-width: 1px;
}
}
.minitoc:not(.mammoth-minitoc) {
display: none;
}
0vfsobgurlx0r6mcpypw92v32flnn6t
Wikikamus:Glosari
4
14298
369282
113257
2026-08-30T03:33:00Z
Hakimi97
2668
369282
wikitext
text/x-wiki
{{shortcut|WT:GL|WT:GLOS}}
'''Ini ialah glosari kata yang digunakan dalam komuniti Wikikamus''' tetapi bukan dalam badan kamus tersebut. ''Lihat juga'' '''[[Lampiran:Glosari]]''', yang mengandungi kata yang digunakan dalam badan kamus ini. (Terdapat juga [[w:Wikipedia:Glosari|'''Wikipedia''':Glosari]].)
----
{{compactTOS}}
==A==
*'''adj.''', – [[adjektif|Adjektif]]. Contoh: {{temp|ms-ks}}
*'''adv.''', – [[adverba|Adverba]]. Contoh: {{temp|en-adv}}
*'''alt''' – Alternatif, iaitu "bentuk alt".
*'''awan''', '''awanip''' – Seseorang yang menyunting Wikikamus tanpa log masuk. Juga, ''IP''.
[[Kategori:Wiktionary:Rujukan|Glosari]]
kqepp7kr6a6tp5d7hnh7jj2p5i8juy1
inum
0
15387
369289
297369
2026-08-30T04:59:03Z
~2026-46834-50
11290
/* Kata terbitan */ Tambahan
369289
wikitext
text/x-wiki
==Bahasa Bajau Sama==
===Kata kerja===
{{inti|bdr|kata kerja}}
# [[minum]]
===Etimologi===
Daripada {{inh|bdr|poz-pro|*inum}}.
===Sebutan===
* {{AFA|bdr|/ˈi.num/}}
* {{rima|bdr|um}}
* {{penyempangan|bdr|i|num}}
===Terbitan===
* {{l|bdr|nginum}}
* {{l|bdr|pinum}}
==Bahasa Kadazandusun==
===Kata kerja===
{{inti|dtp|kata kerja}}
# [[minum]]. {{ux|dtp|'''Inum''' oku po waig.
|Saya '''minum''' air dulu.}}
[[File:LL-Q5317225 (dtp)-Jjurieee-inum.wav|thumb|LL-Q5317225 (dtp)-Jjurieee-inum]]
===Sebutan===
* {{IPA|dtp|/i.nʊm/}}
* {{rima|dtp|nʊm}}
* {{penyempangan|dtp|i|num}}
===Etimologi===
{{inh|dtp|poz-pro|*inum}}.
===Kata terbitan===
* {{l|dtp|inumon}}
* {{l|dtp|inumo'}}
* {{l|dtp|inumai}}
* {{l|dtp|monginum}}
* {{l|dtp|koinum}}
* {{l|dtp|minonginum}}
* {{l|dtp|moginum}}
===Rujukan===
* Komoiboros DusunKadazan, Mongulud Boros Dusun Kadazan (MBDK) 1994
==Bahasa Suluk==
===Kata kerja===
{{inti|tsg|kata kerja}}
# [[minum]]
===Etimologi===
{{inh+|tsg|poz-pro|*inum}}. Banding dengan {{cog|tl|inom}}.
====Kata terbitan====
{{der3|tsg|minum|uminum|mag'inum|inuman|nag'inum|pag'iinuman|inumun|mag'iinum|mainum}}
tntxnq5e0tt2pr3jlnoa93gohmcd1gb
辞書
0
17907
369317
316569
2026-08-30T08:22:18Z
SNN95
2113
kemaskini
369317
wikitext
text/x-wiki
{{also|辭書|辞书}}
{{Wikikamus:ja/{{PAGENAME}}}}
l7b97o8ezygk3ksqvqc1f7qwdb6o1uq
kumaun
0
25109
369295
325811
2026-08-30T06:02:47Z
~2026-46834-50
11290
/* Kata kerja */
369295
wikitext
text/x-wiki
==Bahasa Melayu Brunei==
===Kata kerja===
{{inti|kxd|kata kerja}}
# makan
==Bahasa Suluk==
===Kata kerja===
{{inti|tsg|kata kerja}}
# makan
#: {{cp|tsg|Mabaya aku '''kumaun''' ista'.|Aku mahu '''makan''' ikan.}}
# akan makan
#: {{cp|tsg|Duun ta ha mekdi '''kumaun'''.|t=Kita '''akan makan''' dekat mekdi.}}
===Etimologi===
Daripada {{sisipan|tsg|kaun|um}}.
nj8289i8spqtifnza3w0g0u8efzj7eu
apadtong
0
27639
369278
295916
2026-08-30T02:11:29Z
Hakimi97
2668
369278
wikitext
text/x-wiki
==Bahasa Kadazandusun==
===Kata sifat===
{{inti|dtp|kata sifat}}
# [[bengis]]
#: {{cp|dtp|Tulun di '''apadtong''' dilo' asaasaru' amalon anaknya.|Orang yang '''bengis''' itu selalu memukul anaknya}}
a5hqa5xokjd517oeegdmmeba8fwhzjk
Modul:Jpan-headword
828
34824
369308
281361
2026-08-30T06:46:24Z
SNN95
2113
kemaskini
369308
Scribunto
text/plain
local m_ja = require("Module:ja")
local m_ja_ruby = require("Module:ja-ruby")
local m_str_utils = require("Module:string utilities")
local byteoffset = mw.ustring.byteoffset
local concat = table.concat
local gsplit = m_str_utils.gsplit
local insert = table.insert
local kana_to_romaji = require("Module:Hrkt-translit").tr
local max_index = require("Module:table").maxIndex
local moraify = m_ja.moraify
local remove = table.remove
local ugmatch = mw.ustring.gmatch
local ugsub = m_str_utils.gsub
local ulen = m_str_utils.len
local ulower = m_str_utils.lower
local umatch = mw.ustring.match
local usub = m_str_utils.sub
local export = {}
local pos_functions = {}
local range = mw.loadData('Module:ja/data/range')
local Jpan = require("Module:scripts").getByCode("Jpan")
local function remove_links(text)
return (text:gsub("%[%[[^|%]]-|", "")
:gsub("%[%[", "")
:gsub("%]%]", ""))
end
local function assign_kana_to_kanji(head, kana, pagename, template_name)
-- TODO: uses deprecated module
local m_tu = require'Module:template utilities'
local kanji_pos = {[0] = { nil, 0}}
local head_nolink = {}
local link_border = 0
local function insert_kanji_pos(substr)
insert(head_nolink, substr)
for p1, w1 in ugmatch(substr, '()([々' .. range.kanji .. '])') do
p1 = byteoffset(substr, p1) + link_border
insert(kanji_pos, { p1, p1 + w1:len() - 1 })
end
end
for p1, p2, w1 in m_tu.gfind_bracket(head, {['%[%['] = ']]'}) do
insert_kanji_pos(head:sub(link_border + 1, p1 - 1))
local p_pipe = w1:find'|' or 2
link_border = p1 + p_pipe - 1
insert_kanji_pos(w1:sub(p_pipe + 1, -3))
link_border = p2
end
insert_kanji_pos(head:sub(link_border + 1))
head_nolink = concat(head_nolink)
local pagetext = mw.title.new(pagename):getContent()
if not pagetext then return head, kana end
local non_kanji = {}
local last_kanji = 1
for p1 in ugmatch(head_nolink, '[々' .. range.kanji .. ']()') do
insert(non_kanji, usub(head_nolink, last_kanji, p1 - 2))
last_kanji = p1
end
insert(non_kanji, usub(head_nolink, last_kanji))
for kanjitab in pagetext:gmatch('(){{%s*' .. template_name) do
kanjitab = select(3, m_tu.find_bracket(pagetext, m_tu.brackets_temp, kanjitab))
if not kanjitab then error('ill-formed [[t:' .. template_name:gsub('%%', '') .. ']] syntax') end
kanjitab = m_tu.parse_temp(kanjitab)
local readings = {}
local readings_len = {}
for i = 1, max_index(kanjitab.args) do
local r_i = kanjitab.args[i] or ''
local r_o = kanjitab.args['o' .. i] or ''
if kanjitab.args['k' .. i] then
readings[i] = kanjitab.args['k' .. i] .. r_o
readings_len[i] = tonumber(r_i:match'^%s*%D*(%d*)%s*$') or 1
else
local r_kana, r_len = r_i:match'^%s*(%D*)(%d*)%s*$'
readings[i] = r_kana .. r_o
readings_len[i] = tonumber(r_len) or 1
end
end
local kana_decom = {}
local reading_id = 1
local reading_len = 1
for i = 1, #non_kanji - 1 do
if reading_len <= 1 then
reading_len = readings_len[reading_id] or 1
insert(kana_decom, non_kanji[i])
insert(kana_decom, readings[reading_id])
reading_id = reading_id + 1
else
reading_len = reading_len - 1
end
end
insert(kana_decom, non_kanji[#non_kanji])
local function strip_nonkana(str, repl)
return ugsub(str, '[^' .. range.kana .. ']+', repl) or nil
end
local xeno_reading = {strip_nonkana(kana, ''):match('^' .. strip_nonkana(concat(kana_decom), '(.-)') .. '$')}
if #xeno_reading > 0 then
local head_decom = {}
reading_id = 1
reading_len = 1
for i = 1, #non_kanji - 1 do
if reading_len <= 1 then
reading_len = readings_len[reading_id] or 1
insert(head_decom, head:sub(kanji_pos[i - 1][2] + 1, kanji_pos[i][1] - 1))
insert(head_decom, head:sub(kanji_pos[i][1], kanji_pos[i + reading_len - 1][2]))
reading_id = reading_id + 1
else
reading_len = reading_len - 1
end
end
insert(head_decom, head:sub(kanji_pos[#non_kanji - 1][2] + 1))
if #head_decom ~= #kana_decom then error('number of parameters in [[t:' .. template_name:gsub('%%', '') .. ']] is incorrect') end
local n_xeno_reading = 0
for i = 1, #kana_decom, 2 do
kana_decom[i] = ugsub(kana_decom[i], '[^' .. range.kana .. ']+', function()
n_xeno_reading = n_xeno_reading + 1
if xeno_reading[n_xeno_reading] == '' then return nil
else return xeno_reading[n_xeno_reading] end
end)
end
return concat(head_decom, '%'), concat(kana_decom, '%')
end
end
return head, kana
end
local en_grades = {
"gred pertama", "gred kedua", "gred ketiga",
"gred keempat", "gred kelima", "gred keenam",
"sekolah menengah", "jinmeiyō", "hyōgai"
}
local aliases = {
['transitive']='tr', ['trans']='tr',
['intransitive']='in', ['intrans']='in', ['intr']='in',
['godan']='1', ['ichidan']='2', ['irregular']='irr'
}
local adverbs_optional_tag = 'optionally '
local adverbs_optional_aliases = {
['to']='と', ['と']='と', ['ト']='と',
['ni']='に', ['に']='に', ['ニ']='に',
}
local adverbs_optional_links = {
['と']='[[と#Japanese:_adverbs|と]]',
['に']='[[に]]',
}
local function formatting_adjustments(rom, kana, pos_category)
-- hyphens for prefixes, suffixes, and counters (classifiers)
if pos_category == "Awalan" then
rom = rom:gsub('%-?$', '-')
elseif pos_category == "Akhiran" or pos_category == "Bentuk akhiran" or pos_category == "counters" or pos_category == "classifiers" then
rom = rom:gsub('^%-?', '-')
elseif pos_category == "Kata nama khas" and not kana:match'%^' then -- automatic caps for proper nouns, if not already specified
rom = ugsub(ugsub(rom, '%f[^%s%c%p]%l', string.uupper), "%w'%u", ulower) -- no caps after medial apostrophes
end
return rom
end
local function kana_to_romaji_with_pos_format(kana, data, args)
if data.headword.pos_category == "Bentuk gabungan" or data.headword.pos_category == "Tanda baca" or data.headword.pos_category == "Tanda lelaran" then
return "-"
end
local rom = remove_links(kana_to_romaji(kana, data.lang_code))
-- make adjustments for -u verbs and -i adjectives
if args['infl'] == '1' or args['infl'] == '1s' or args['infl'] == 'godan' then
rom = rom:gsub('ō$', 'ou'):gsub('ū$', 'uu')
elseif args['infl'] == 'i' or args['infl'] == 'is' or args['infl'] == 'い' then
rom = rom:gsub('ī$', 'ii')
end
return formatting_adjustments(rom, kana, data.headword.pos_category)
end
local function iterate_rare_chars(text)
local ch, i
return function()
repeat
ch, i = umatch(text, "([" .. range.kana .. range.kana_graph .. "!-/:-@%[\\-`×△○◎。-〠〶〷〻-〽・·゠=~][゙゚]*)()", i)
until not (ch and umatch(ch, "^[ぁ-ちっつて-ろんァ-チッツテ-ロンヲ-゚]$"))
return ch
end
end
local function historical_kana(data, hist_kana, modern_kana)
-- Disallow historical kana for kana and morae, as there's no one-to-one correspondence.
local pos = data.headword.pos_category
if pos == "syllables" or pos == "kana" or pos == "morae" then
error(("Cannot specify historical kana for %s."):format(pos))
end
local hist_kana_no_formatting = hist_kana:gsub("[%^%-%. %%]+", "")
local rare_chars, lang_name, hc = {}, data.lang_name, data.headword.categories
for ch in iterate_rare_chars(hist_kana_no_formatting) do
if not (modern_kana and modern_kana:find(ch)) then
rare_chars[ch] = true
end
end
for _, mora in ipairs(moraify((ugsub(hist_kana_no_formatting, "[^" .. range.kana .. "]+", " ")))) do
if not (mora:gsub(" +", ""):match("^.?[\128-\191]*$") or (modern_kana and modern_kana:find(mora))) then
rare_chars[mora] = true
end
end
for ch in pairs(rare_chars) do
insert(hc, "Perkataan mengikut sejarah dieja dengan " .. ch .. " bahasa " .. lang_name)
end
insert(data.info_hist, require("Module:ja-link").link({
lang = data.headword.lang,
lemma = hist_kana,
tr = formatting_adjustments(
remove_links(kana_to_romaji(hist_kana, data.lang_code, nil, {hist = true})),
hist_kana,
pos
)
}, {
face = "head",
disableSelfLink = true,
}))
end
local function detect_pagename_kana(data, digraphs)
local pagename = data.pagename
-- Exclude "&" and "@", which are part of %p (e.g. リズム&ブルース).
local function remove_kana(m)
return m:match("[&@]") or ""
end
if ugsub(pagename, '[%p%s%c' .. range.hiragana .. (digraphs and "ゟ" or "") .. ']', remove_kana) == "" then
return 'hira'
elseif ugsub(pagename, '[%p%s%c' .. range.katakana .. (digraphs and "ヿ" or "") .. ']', remove_kana) == "" then
return 'kata'
elseif ugsub(pagename, '[%p%s%c' .. range.kana .. (digraphs and "ゟヿ" or "") .. ']', remove_kana) == "" then
return 'both'
end
end
-- go through args and build inflections by finding whatever kanas were given to us
local function format_headword(args, data)
local pagename, kanas, lang_name = data.pagename, data.kanas, data.lang_name
data.pagename_kana = detect_pagename_kana(data)
if args[1][1] and not args[1][1]:match'[\128-\255]' then
-- filter out POS designations
remove(args[1], 1)
end
local linked_translit = data.headword.lang:link_tr(Jpan)
local suru_ending, rom_suru_ending
if data.headword.pos_category == "kata kerja suru" then
suru_ending = "[[する]]"
rom_suru_ending = linked_translit and " [[suru]]" or " suru"
else
suru_ending, rom_suru_ending = "", ""
end
if data.pagename_kana then -- pure-kana-title entry
if #args.head > 0 or args.head.default then
insert(data.headword.categories, "Perkataan dengan parameter pengepala lewah bahasa " .. lang_name)
end
-- {{ja-xxx}} vs {{ja-xxx|こ.うし}} vs {{ja-xxx|コウシ}} in [[こうし]]
if not args[1][1] then
args[1][1] = pagename
elseif remove_links(args[1][1]:gsub("[%^%-%. %%]+", "")) ~= pagename then
insert(args[1], 1, pagename)
end
for i, k in ipairs(args[1]) do
insert(data.headword.heads, {
term = k:gsub("[%^%-%. %%]+", "") .. suru_ending,
tr = '-',
l = args.label[i] and {args.label[i]} or nil,
})
end
for i = 1, math.max(args.rom.maxindex, 1) do
local rom = args.rom[i] or args.rom.default or kana_to_romaji_with_pos_format(args[1][1], data, args)
if not data.headword.heads[i] then
data.headword.heads[i] = {term = data.headword.heads[i-1].term}
end
if rom == "-" then
data.headword.heads[i].tr = "-"
elseif linked_translit then
data.headword.heads[i].tr = "[[" .. rom .. "]]" .. rom_suru_ending
else
data.headword.heads[i].tr = rom .. rom_suru_ending
end
if not data.inflection_base.form then
data.inflection_base.form = remove_links(args[i][1]:gsub("[%^%-%. %%]+", "")) .. suru_ending
data.inflection_base.romaji = rom .. rom_suru_ending
end
end
kanas[1] = pagename
if args.hist[1] then
historical_kana(data, args.hist[1], args[1][1])
end
else -- non-pure-kana-title entry
if #args[1] == 0 and not (data.headword.pos_category == "Tanda baca" or data.headword.pos_category == "Tanda lelaran" or data.headword.pos_category == "Simbol") then
error("Kana form is required.")
end
if args.head.default == pagename then
insert(data.headword.categories, "Perkataan dengan parameter pengepala lewah bahasa " .. lang_name)
end
local rom_repetition_final = {}
for i, k in ipairs(args[1]) do
local rom_auto = kana_to_romaji_with_pos_format(k, data, args)
local head = args.head[i] or args.head.default or pagename
if args.head[i] == pagename then
insert(data.headword.categories, "Perkataan dengan parameter pengepala lewah bahasa " .. lang_name)
end
local head_for_ruby, kana_for_ruby
if ulen(head) > 1 and head:match'%%' == nil and k:match'%%' == nil then
head_for_ruby, kana_for_ruby = assign_kana_to_kanji(head, k, pagename, data.lang_code .. '%-kanjitab')
else
head_for_ruby, kana_for_ruby = head, k
end
local format_table = m_ja_ruby.parse_text(head_for_ruby, kana_for_ruby, {
try = 'force',
try_force_limit = 10000
})
local kana_bare = remove_links(k:gsub("[%^%-%. %%]+", ""))
local rom = args.rom[i] or args.rom.default or rom_auto
head = {
term = m_ja_ruby.to_wiki(format_table, {
break_link = true,
}):gsub('<rt>(..-)</rt>', "<rt>[[" .. kana_bare .."|%1]]</rt>") .. suru_ending,
l = args.label[i] and {args.label[i]} or nil,
}
if rom == "-" or rom_repetition_final[rom] then
head.tr = "-"
elseif linked_translit then
head.tr = "[[" .. rom .. "]]" .. rom_suru_ending
else
head.tr = rom .. rom_suru_ending
end
insert(data.headword.heads, head)
rom_repetition_final[rom] = true
insert(kanas, kana_bare)
if args.hist[i] then
historical_kana(data, args.hist[i], k)
end
if not data.inflection_base.form then
data.inflection_base.form = remove_links(m_ja_ruby.to_markup(format_table)) .. suru_ending
data.inflection_base.romaji = rom .. rom_suru_ending
end
end
local first_reading, multiple = kanas[1]
if not first_reading then
return
end
first_reading = ulower(kana_to_romaji(first_reading, data.lang_code)):gsub("%%", "")
for i = 2, #kanas do
if ulower(kana_to_romaji(kanas[i], data.lang_code)):gsub("%%", "") ~= first_reading then
multiple = true
break
end
end
if not multiple then
local lang_code = data.lang_code
local content = mw.title.getCurrentTitle():getContent()
local loc1, loc2 = content:find("%f[^%z%s]==%s*" .. lang_name:gsub("%-", "%%%-") .. "%s*==()")
loc2 = content:find("%f[^%z%s]==[^\n=]+==", loc2)
if loc1 then
content = content:sub(loc1, loc2)
for template in require("Module:template parser").find_templates(content) do
local name, reading = template:get_name()
if (
name == lang_code .. "-head" or
name == lang_code .. "-pos"
) then
reading = template:get_arguments()[2]
if reading ~= nil then
reading = remove_links(reading):gsub("%%", "")
end
elseif (
name == lang_code .. "-noun" or
name == lang_code .. "-verb" or
name == lang_code .. "-adj" or
name == lang_code .. "-phrase" or
name == lang_code .. "-verb form" or
name == lang_code .. "-verb-suru"
) then
reading = template:get_arguments()[1]
if reading ~= nil then
reading = remove_links(reading):gsub("%%", "")
end
elseif name == lang_code .. "-see" then
reading = template:get_arguments()[1]
if reading ~= nil then
reading = remove_links(reading):gsub("%%", "")
end
-- if umatch(reading, "[^" .. range.kana .. "]") then
-- TODO: check linked page
-- end
end
if reading and ulower(kana_to_romaji(reading, lang_code)):gsub("%%", "") ~= first_reading then
multiple = true
end
end
end
end
if multiple then
insert(data.headword.categories, "Perkataan dengan pelbagai bacaan bahasa " .. lang_name)
end
end
end
local function add_transitivity(data, tr)
local categories, lang_name = data.headword.categories, data.lang_name
tr = aliases[tr] or tr
if tr == "tr" then
insert(data.info_mid, 'transitive')
insert(categories, "Kata kerja transitif bahasa " .. lang_name)
elseif tr == "in" then
insert(data.info_mid, 'intransitive')
insert(categories, "Kata kerja tak transitif bahasa " .. lang_name)
elseif tr == "both" then
insert(data.info_mid, 'transitive or intransitive')
insert(categories, "Kata kerja transitif bahasa " .. lang_name)
insert(categories, "Kata kerja tak transitif bahasa " .. lang_name)
else
insert(categories, "Kata kerja tanpa ketransitifan bahasa " .. lang_name)
end
end
local function get_final(lemma, data)
return kana_to_romaji(remove(moraify(m_ja_ruby.to_ruby(m_ja_ruby.parse_markup(lemma)))), data.lang_code)
end
local function add_language_fragment(t, lang_name)
for k, v in ipairs(t) do
t[k] = v:gsub("%[%[([^]#]*)%]%]", "[[%1#%%s|%1]]"):format(lang_name)
end
end
local function add_inflections(data, inflection_type, cat_suffix)
local lang_name = data.lang_name
local lemma = data.inflection_base.form
local romaji = data.inflection_base.romaji
inflection_type = aliases[inflection_type] or inflection_type
local function replace_suffix(lemma_from, lemma_to, romaji_from, romaji_to)
-- e.g. 持って来る, lemma = "[持](も)って来(く)る"
-- lemma_from = "くる", lemma_to = {"き","きた"}
add_language_fragment(lemma_to, lang_name)
add_language_fragment(romaji_to, lang_name)
local result = {}
local pattern_from, n_from = lemma_from:gsub('.[\128-\191]*', function(c)
return '[' .. c .. m_ja.hira_to_kata(c) .. ']([^' .. range.kana .. ']*)'
end)
pattern_from = pattern_from .. '$'
-- "[くク]([^kana range]*)[るル]([^kana range]*)$"
for i_lemma_to, s_lemma_to in ipairs(lemma_to) do
local n_to = 0
local pattern_to = s_lemma_to:gsub('.[\128-\191]*', function(c)
if n_to < n_from then
n_to = n_to + 1
return c .. "%" .. n_to
else
return c
end
end)
for i = n_to + 1, n_from do
pattern_to = pattern_to .. "%" .. i
end
-- "き%1%2", "き%1た%2"
local lemma_inflected, success = ugsub(lemma, pattern_from, pattern_to)
if success == 0 then
return
end
local romaji_inflected
romaji_inflected, success = romaji:gsub(romaji_from .. "$", romaji_to[i_lemma_to])
if success == 0 then
romaji_inflected, success = romaji:gsub("%[%[" .. romaji_from .. "%]%]$", "[[" .. romaji_to[i_lemma_to] .. "]]")
if success == 0 then
return
end
end
insert(result, {lemma = lemma_inflected, romaji = romaji_inflected})
end
return result -- {{lemma="[持](も)って来(き)",romaji="motteki"},{lemma="[持](も)って来(き)た",romaji="mottekita"}}
end
local function insert_form(label, ...)
-- label = "stem" or "past" etc.
-- ... = {lemma=...,romaji=...},{lemma=...,romaji=...}
local labeled_forms = {label = label}
for _, v in ipairs{...} do
local table_form = m_ja_ruby.parse_markup(v.lemma)
local form_term = m_ja_ruby.to_wiki(table_form)
if not form_term:find'%[%[.+%]%]' then
form_term = '[[' .. m_ja_ruby.to_text(table_form) .. '#' .. lang_name .. '|' .. form_term .. ']]'
end
insert(labeled_forms, {
term = form_term,
tr = v.romaji,
})
end
insert(data.headword.inflections, labeled_forms)
end
local inflected_forms
if data.lang_code == 'ja' then
if inflection_type == '1' or inflection_type == '1s' then
insert(data.info_mid, '<abbr title="godan (group 1) conjugation">godan</abbr>')
if cat_suffix then
insert(data.headword.categories, cat_suffix .. " godan bahasa " .. lang_name)
local romaji = data.inflection_base.romaji
if cat_suffix == "Kata kerja" then
local final = get_final(lemma, data)
insert(data.headword.categories, cat_suffix .. " godan berakhir dengan -" .. final " bahasa ".. lang_name)
if final == "ru" then
if umatch(romaji, "[iIīĪ]ru$") then
insert(data.headword.categories, cat_suffix .. " godan berakhir dengan -iru bahasa " .. lang_name)
elseif umatch(romaji, "[eEēĒ]ru$") then
insert(data.headword.categories, cat_suffix .. " godan berakhir dengan -eru bahasa " .. lang_name)
end
end
end
end
if inflection_type == '1' then
inflected_forms =
replace_suffix('く', {'き', 'いた'}, 'ku', {'ki', 'ita'}) or
replace_suffix('ぐ', {'ぎ', 'いだ'}, 'gu', {'gi', 'ida'}) or
replace_suffix('す', {'し', 'した'}, 'su', {'shi', 'shita'}) or
replace_suffix('つ', {'ち', 'った'}, 'tsu', {'chi', 'tta'}) or
replace_suffix('ぬ', {'に', 'んだ'}, 'nu', {'ni', 'nda'}) or
replace_suffix('ぶ', {'び', 'んだ'}, 'bu', {'bi', 'nda'}) or
replace_suffix('む', {'み', 'んだ'}, 'mu', {'mi', 'nda'}) or
replace_suffix('る', {'り', 'った'}, 'ru', {'ri', 'tta'}) or
replace_suffix('う', {'い', 'った'}, 'u', {'i', 'tta'})
if inflected_forms then
insert_form('dasar', inflected_forms[1])
insert_form('lampau', inflected_forms[2])
else
require'Module:debug'.track'Jpan-headword/inflection failed/ja'
end
else
inflected_forms =
replace_suffix('る', {'り', 'った', 'い'}, 'ru', {'ri', 'tta', 'i'}) or --くださる
replace_suffix('いく', {'いき', 'いった'}, 'iku', {'iki', 'itta'}) or --行く
replace_suffix('う', {'い', 'うた'}, 'ou', {'oi', 'ōta'}) --問う
if inflected_forms then
insert_form('dasar', inflected_forms[1], inflected_forms[3])
insert_form('lampau', inflected_forms[2])
else
require'Module:debug'.track'Jpan-headword/inflection failed/ja'
end
end
elseif inflection_type == '2' then
insert(data.info_mid, '<abbr title="ichidan (group 2) conjugation">ichidan</abbr>')
if cat_suffix then
insert(data.headword.categories, cat_suffix .. " ichidan bahasa " .. lang_name)
local romaji = data.inflection_base.romaji
if umatch(romaji, "[iIīĪ]ru$") then
insert(data.headword.categories, cat_suffix .. " kami ichidan bahasa " .. lang_name)
elseif umatch(romaji, "[eEēĒ]ru$") then
insert(data.headword.categories, cat_suffix .. " shimo ichidan bahasa " .. lang_name)
else
insert(data.headword.categories, cat_suffix .. " irregular bahasa " .. lang_name)
end
end
inflected_forms = replace_suffix('る', {'', 'た'}, 'ru', {'', 'ta'})
if inflected_forms then
insert_form('dasar', inflected_forms[1])
insert_form('lampau', inflected_forms[2])
else
require'Module:debug'.track'Jpan-headword/inflection failed/ja'
end
elseif inflection_type == 'suru' then
insert(data.info_mid, '<abbr title="suru (group 3) conjugation">suru</abbr>')
if cat_suffix then
insert(data.headword.categories, cat_suffix .. " suru bahasa " .. lang_name)
end
inflected_forms =
replace_suffix('する', {'し', 'した'}, 'suru', {'shi', 'shita'}) or
replace_suffix('ずる', {'じ', 'じた'}, 'zuru', {'ji', 'jita'})
if inflected_forms then
insert_form('dasar', inflected_forms[1])
insert_form('lampau', inflected_forms[2])
else
require'Module:debug'.track'Jpan-headword/inflection failed/ja'
end
elseif inflection_type == 'kuru' then
insert(data.info_mid, '<abbr title="kuru (group 3) conjugation">kuru</abbr>')
if cat_suffix then
insert(data.headword.categories, cat_suffix .. " kuru bahasa " .. lang_name)
end
inflected_forms = replace_suffix('くる', {'き', 'きた'}, 'kuru', {'ki', 'kita'})
if inflected_forms then
insert_form('dasar', inflected_forms[1])
insert_form('lampau', inflected_forms[2])
else
require'Module:debug'.track'Jpan-headword/inflection failed/ja'
end
elseif inflection_type == 'i' or inflection_type == 'い' then
insert(data.info_mid, '<abbr title="-i (type I) inflection">-i</abbr>')
if cat_suffix then
insert(data.headword.categories, cat_suffix .. " い-i bahasa " .. lang_name)
end
inflected_forms = replace_suffix('い', {'く'}, 'i', {'ku'})
if inflected_forms then
insert_form('adverbial', inflected_forms[1])
else
require'Module:debug'.track'Jpan-headword/inflection failed/ja'
end
elseif inflection_type == 'is' then
insert(data.info_mid, '<abbr title="-i (type I) inflection">-i</abbr>')
if cat_suffix then
insert(data.headword.categories, cat_suffix .. " い-i bahasa " .. lang_name)
end
inflected_forms = replace_suffix('いい', {'よく'}, 'ii', {'yoku'})
if inflected_forms then
insert_form('adverbial', inflected_forms[1])
else
require'Module:debug'.track'Jpan-headword/inflection failed/ja'
end
elseif inflection_type == 'na' or inflection_type == 'な' then
insert(data.info_mid, '<abbr title="-na (type II) inflection">-na</abbr>')
if cat_suffix then
insert(data.headword.categories, cat_suffix .. " な-na bahasa " .. lang_name)
end
inflected_forms = replace_suffix('', {'[[な]]', '[[に]]'}, '', {' [[na]]', ' [[ni]]'})
insert_form('adnominal', inflected_forms[1])
insert_form('adverbial', inflected_forms[2])
elseif inflection_type == "yo" then
insert(data.info_mid, '<abbr title="yodan conjugation (classical)"><sup><small>†</small></sup>yodan</abbr>')
if cat_suffix then
insert(data.headword.categories, cat_suffix .. " yodan " .. lang_name)
insert(data.headword.categories, cat_suffix .. " yodan berakhir dengan -" .. get_final(lemma, data) .. " bahasa ".. lang_name)
end
elseif inflection_type == "kami ni" then
insert(data.info_mid, '<abbr title="kami nidan conjugation (classical)"><sup><small>†</small></sup>nidan</abbr>')
if cat_suffix then
insert(data.headword.categories, cat_suffix .. " nidan bahasa " .. lang_name)
insert(data.headword.categories, cat_suffix .. " kami nidan bahasa " .. lang_name)
end
elseif inflection_type == "shimo ni" then
insert(data.info_mid, '<abbr title="shimo nidan conjugation (classical)"><sup><small>†</small></sup>nidan</abbr>')
if cat_suffix then
insert(data.headword.categories, cat_suffix .. " nidan bahasa " .. lang_name)
insert(data.headword.categories, cat_suffix .. " shimo nidan bahasa " .. lang_name)
end
elseif inflection_type == "rahen" then
insert(data.info_mid, '<abbr title="r-special conjugation (classical)"><sup><small>†</small></sup>-ri</abbr>')
elseif inflection_type == "sahen" then
insert(data.info_mid, '<abbr title="s-special conjugation (classical)"><sup><small>†</small></sup>-se</abbr>')
elseif inflection_type == "kahen" then
insert(data.info_mid, '<abbr title="k-special conjugation (classical)"><sup><small>†</small></sup>-ko</abbr>')
elseif inflection_type == "nahen" then
insert(data.info_mid, '<abbr title="n-special conjugation (classical)"><sup><small>†</small></sup>-n</abbr>')
elseif inflection_type == "nari" or inflection_type == "なり" then
insert(data.info_mid, '<abbr title="-nari inflection (classical)"><sup><small>†</small></sup>-nari</abbr>')
if cat_suffix then
insert(data.headword.categories, cat_suffix .. " なり-nari bahasa " .. lang_name)
end
elseif inflection_type == 'tari' or inflection_type == 'たり' then
insert(data.info_mid, '<abbr title="-tari inflection (classical)"><sup><small>†</small></sup>-tari</abbr>')
if cat_suffix then
insert(data.headword.categories, cat_suffix .. " たり-tari bahasa " .. lang_name)
end
inflected_forms = replace_suffix('', {'[[とした]]', '[[たる]]', '[[と]]', '[[として]]'}, '', {' [[to shita]]', ' [[taru]]', ' [[to]]', ' [[to shite]]'})
insert_form('adnominal', inflected_forms[1], inflected_forms[2])
insert_form('adverbial', inflected_forms[3], inflected_forms[4])
elseif inflection_type == "ku" or inflection_type == "く" then
insert(data.info_mid, '<abbr title="-ku inflection (classical)"><sup><small>†</small></sup>-ku</abbr>')
if cat_suffix then
insert(data.headword.categories, cat_suffix .. " く-ku bahasa " .. lang_name)
end
elseif inflection_type == "shiku" or inflection_type == "しく" then
insert(data.info_mid, '<abbr title="-shiku inflection (classical)"><sup><small>†</small></sup>-shiku</abbr>')
if cat_suffix then
insert(data.headword.categories, cat_suffix .. " しく-shiku bahasa " .. lang_name)
end
elseif inflection_type == "ka" or inflection_type == "か" then
insert(data.info_mid, '<abbr title="-ka inflection (dialectal)"><sup><small>†</small></sup>-ka</abbr>')
if cat_suffix then
insert(data.headword.categories, cat_suffix .. " か-ka " .. lang_name)
end
elseif inflection_type and inflection_type:len() > adverbs_optional_tag:len() and inflection_type:sub(1, adverbs_optional_tag:len()) == adverbs_optional_tag then
local adverbs_optional_list = inflection_type:sub(adverbs_optional_tag:len() + 1)
for option in gsplit(adverbs_optional_list, ':') do
local normalized_option = adverbs_optional_aliases[option]
if not normalized_option then
error('unrecognized adverb opt= argument: "' .. option .. '"')
end
local normalized_option_romaji = kana_to_romaji(normalized_option, data.lang_code)
local normalized_option_link = adverbs_optional_links[normalized_option]
inflected_forms = replace_suffix('', {normalized_option_link}, '', {' [[' .. normalized_option_romaji .. ']]'})
insert_form('optionally as', inflected_forms[1])
if cat_suffix then
insert(data.headword.categories, cat_suffix .. " secara pilihan mengambil " .. normalized_option .. "-" .. normalized_option_romaji .. " bahasa " .. lang_name)
end
end
elseif inflection_type == 'irr' then
insert(data.info_mid, 'irregular')
if cat_suffix then
insert(data.headword.categories, cat_suffix .. " irregular bahasa " .. lang_name)
end
elseif inflection_type == '-' or inflection_type == 'un' then
insert(data.info_mid, 'uninflectable')
end
--elseif data.lang_code == 'ryu' then ...
end
end
local function add_categories(data)
local lang_name = data.lang_name
local pagename = data.pagename
local tc = data.headword.categories
-- adds category [langname] terms spelled with jōyō kanji or [langname] terms spelled with non-jōyō kanji
-- (if it contains any kanji)
local number_of_kanji = 0
for c in ugmatch(pagename, "[" .. range.kanji .. "々〻]") do
number_of_kanji = number_of_kanji + 1
if c ~= "々" and c ~= "〻" then -- Not a kanji for the purposes of categorisation.
insert(tc, ("Perkataan dieja dengan kanji %s bahasa " .. lang_name):format(en_grades[m_ja.kanji_grade(c)]))
end
end
-- categorize by number of kanji
if number_of_kanji ~= 0 then
insert(tc, ("Perkataan dengan %s aksara kanji bahasa " .. lang_name):format(number_of_kanji))
-- single-kanji terms
if ulen(pagename) == 1 then
insert(tc, "Perkataan dieja dengan " .. pagename .. " bahasa " .. lang_name)
insert(tc, "Perkataan kanji tunggal bahasa " .. lang_name)
end
end
-- categorize by the script of the pagename or specific characters contained in it
-- if pagename is hiragana or katakana
if detect_pagename_kana(data, true) == 'hira' then insert(tc, "Hiragana bahasa " .. lang_name) end
if detect_pagename_kana(data, true) == 'kata' then insert(data.katakana_category, "Katakana bahasa " .. lang_name) end
local p, n = ugsub(pagename, '[' .. range.kana .. range.kanji .. range.ideograph .. range.kana_graph .. range.punctuation .. ']+', '')
if p ~= '' and n > 0 then insert(tc, "Perkataan ditulis dalam pelbagai tulisan bahasa " .. lang_name) end
local pos = data.headword.pos_category
local rare_chars = {}
for ch in iterate_rare_chars(pagename) do
rare_chars[ch] = true
end
-- Categorise yōon, but exclude kana and mora entries, since they can't be spelled with themselves.
-- FIXME: allow kana categories for morae.
if not (pos == "syllables" or pos == "kana" or pos == "morae") then
for _, mora in ipairs(moraify((ugsub(pagename, "[^" .. range.kana .. "]+", " ")))) do
if not mora:gsub(" +", ""):match("^.?[\128-\191]*$") then
rare_chars[mora] = true
end
end
end
for ch in pairs(rare_chars) do
insert(tc, "Perkataan dieja dengan " .. ch .. " bahasa " .. lang_name)
end
if (
pos ~= "proverbs" and
pos ~= "phrases" and
umatch(ugsub(pagename, "[" .. range.katakana .. "]+", ""), "[" .. range.hiragana .. "]") and
umatch(ugsub(pagename, "[" .. range.hiragana .. "]+", ""), "[" .. range.katakana .. "]")
) then
insert(tc, "Perkataan dieja dengan campuran kana bahasa " .. lang_name)
end
end
pos_functions["Kata kerja"] = function(args, data)
add_transitivity(data, args["tr"])
add_inflections(data, args["infl"], 'verbs')
end
pos_functions["Akhiran"] = function(args, data)
add_inflections(data, args["infl"])
end
pos_functions["Kata kerja bantu"] = function(args, data)
insert(data.headword.categories, "Kata kerja bantu bahasa " .. data.lang_name)
add_inflections(data, args["infl"])
data.headword.pos_category = "Kata kerja"
end
pos_functions["Kata kerja suru"] = function(args, data)
add_transitivity(data, args["tr"])
add_inflections(data, 'suru', 'verbs')
data.headword.pos_category = "Kata kerja"
end
pos_functions["Kata sifat"] = function(args, data)
add_inflections(data, args["infl"], 'adjectives')
end
pos_functions["Kata nama"] = function(args, data)
-- the counter (classifier) parameter, only relevant for nouns
local counter = args["count"] or ""
if counter == "-" then
insert(data.headword.inflections, {label = "uncountable"})
elseif counter ~= "" then
insert(data.headword.inflections, {label = "counter", counter})
end
end
pos_functions["Adverba"] = function(args, data)
local opt = args["opt"]
if opt then
opt = adverbs_optional_tag .. opt
end
add_inflections(data, opt, 'adverbs')
end
--[==[
Generate categories by pagename, also optionally by POS
Also for use in soft redirect pages ([[Module:ja-see]]).
Sortkey is not provided.
data = {
pagename = ..., -- (required)
lang = ..., -- (required) language object
categories = {}, -- (required) receive categories
katakana_category = {}, -- (required) receive katakana-sorted categories
pos = ..., "noun", "verb", etc. no POS categories if not given
}
]==]
function export.cat(data)
data.lang_name = data.lang:getCanonicalName()
data.pagename_kana = detect_pagename_kana(data)
if data.pos then
local pos = data.pos:gsub('x$', 'xe') .. ''
insert(data.categories, pos .. ' bahasa ' .. data.lang_name)
insert(data.categories, require'Module:headword'.pos_lemma_or_nonlemma(pos, true) .. ' bahasa ' .. data.lang_name)
end
data.headword = { categories = data.categories }
add_categories(data)
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[2] or frame.args[1] or error("Part of speech has not been specified. Please pass parameter 1 to the module invocation.")
local alias_of_hist = {alias_of = 'hist', list = false}
local alias_of_infl = {alias_of = "infl"}
local list = {list = true}
local list_allow_holes_separate_no_index = {list = true, allow_holes = true, separate_no_index = true}
local params = {
[1] = list,
['rom'] = list_allow_holes_separate_no_index,
['head'] = list_allow_holes_separate_no_index,
['label'] = {list = true, allow_holes = true},
['hist'] = list, ['hhira'] = alias_of_hist, ['hkata'] = alias_of_hist,
['tr'] = true,
['infl'] = true, ['type'] = alias_of_infl, ['decl'] = alias_of_infl,
['opt'] = true,
['count'] = true,
['sort'] = true,
['pagename'] = true,
}
-- For backwards compatibility with uses of {{ja-syllable}} with the script parameter.
if poscat == "syllables" then
params["sc"] = true
end
local args = require('Module:parameters').process(frame:getParent().args, params)
local data = {
headword = {
pos_category = poscat,
categories = {},
heads = {},
no_redundant_head_cat = true,
inflections = {},
genders = {'m'}, -- placeholder
nogendercat = true
},
--custom info
pagename = args.pagename or mw.loadData("Module:headword/data").pagename,
pagename_kana = nil, -- "hira" "kata" "both", nil
lang_code = frame.args[1],
lang_name = nil, -- "Japanese", "Okinawan" ...
katakana_category = {},
info_mid = {}, -- "godan", "intransitive" ...
info_hist = {}, -- historical kana
inflection_base = {}, -- base of inflections
kanas = {}, -- kana id
}
data.headword.lang = require("Module:languages").getByCode(data.lang_code)
data.lang_name = data.headword.lang:getCanonicalName()
-- sort out all the kanas and do the romanization business
format_headword(args, data)
-- add certain inflections and categories for adjectives, verbs, nouns, or adverbs
if pos_functions[poscat] then
pos_functions[poscat](args, data)
end
-- categories
add_categories(data)
local sort_base = args.sort or data.kanas[1] or data.pagename
data.headword.sort_key = data.headword.lang:makeSortKey(sort_base)
local katakana_category = #data.katakana_category > 0 and
require("Module:utilities").format_categories(
data.katakana_category,
data.headword.lang,
nil,
sort_base,
nil,
require("Module:scripts").getByCode("Kana")
) or ""
-- output
local i_kanas = 0
return katakana_category .. require('Module:headword').full_headword(data.headword):gsub('<span class="gender">.-</span>', function()
return (#data.info_hist > 0 and '<sup>←' .. concat(data.info_hist, ' atau ') .. '<sup>[[w:Sistem ejaan kana lama|?]]</sup></sup>' or '') .. ('<i>' .. concat(data.info_mid, ' ') .. '</i>')
end):gsub('<strong .->.-</strong>', function(m0)
i_kanas = i_kanas + 1
if data.kanas[i_kanas] then
return m0
end
end):gsub('<span class="headword%-tr tr" dir="ltr"><span class="Latn" lang="ja">', '<span lang="ja-Latn" class="headword-tr tr Latn" dir="ltr">'):gsub('</span></span>', '</span>')
end
return export
gk5rnqt7b34ggbjmhoszfko60hezeod
dusa
0
68901
369180
206656
2026-08-29T12:01:43Z
~2026-46834-50
11290
/* Bahasa Melanau Tengah */
369180
wikitext
text/x-wiki
==Bahasa Melanau Tengah==
===Takrifan===
====Kata nama====
{{inti|mel|kata nama}}
# {{lb|mel|Mukah}} [[dosa]]
===Etimologi===
{{bor+|mel|ms|dosa}}.
===Sebutan===
* {{AFA|mel|/du.sa/}}
===Rujukan===
* {{R:KMMD}}
==Bahasa Suluk==
===Takdridan===
====Kata nama====
{{inti|tsg|kata nama}}
# [[dosa]]
===Etimologi===
{{bor+|tsg|ms|dosa}}.
====Kata terbitan====
{{der3|tsg|magdusa|nagdusa|baldusa}}
aoqnivag9w28r2urtyao285z0hk36gh
369182
369180
2026-08-29T12:02:57Z
~2026-46834-50
11290
/* Kata nama */
369182
wikitext
text/x-wiki
==Bahasa Melanau Tengah==
===Takrifan===
====Kata nama====
{{inti|mel|kata nama}}
# {{lb|mel|Mukah}} [[dosa]]
===Etimologi===
{{bor+|mel|ms|dosa}}.
===Sebutan===
* {{AFA|mel|/du.sa/}}
===Rujukan===
* {{R:KMMD}}
==Bahasa Suluk==
===Takdridan===
====Kata nama====
{{inti|tsg|kata nama}}
# [[dosa]]
# [[jenayah]]
===Etimologi===
{{bor+|tsg|ms|dosa}}.
====Kata terbitan====
{{der3|tsg|magdusa|nagdusa|baldusa}}
bnmd6f4m3pqk4rb2r8v6jhcxn330w4x
daral
0
74051
369263
215047
2026-08-29T18:23:47Z
~2026-46834-50
11290
/* Kata kerja */
369263
wikitext
text/x-wiki
==Bahasa Suluk==
===Takrifan 1===
====Kata nama====
{{inti|tsg|kata nama}}
# [[telur goreng]]
====Kata kerja====
{{inti|tsg|kata kerja}}
# menggoreng [[telur]]
#: {{cp|tsg|'''Daral''' kaw iklug.|Anda '''menggoreng''' telur.}}
====Kata terbitan====
{{der3|tsg|magdaral|nagdaral|daralun}}
===Takrifan 2===
====Kata nama====
{{inti|tsg|kata nama}}
# sejenis [[kuih muih]] atau [[pencuci mulut]] terbuat daripada daging [[kelapa]] terkukur dengan [[gula]] dibungkus dalam [[tepung]] atau [[pembalut]] [[tepung beras]]
{{C|tsg|Makanan|Pencuci mulut}}
dqdt0m0m0f8chgeifr434tosrohedb5
369264
369263
2026-08-29T18:26:02Z
~2026-46834-50
11290
/* Bahasa Suluk */ Takrifan 1 adalah kata kerja
369264
wikitext
text/x-wiki
==Bahasa Suluk==
====Kata kerja====
{{inti|tsg|kata kerja}}
# menggoreng [[telur]]
#: {{cp|tsg|'''Daral''' kaw iklug.|Anda '''menggoreng''' telur.}}
====Kata terbitan====
{{der3|tsg|magdaral|nagdaral|daralun}}
===Takrifan 2===
====Kata nama====
{{inti|tsg|kata nama}}
# sejenis [[kuih muih]] atau [[pencuci mulut]] terbuat daripada daging [[kelapa]] terkukur dengan [[gula]] dibungkus dalam [[tepung]] atau [[pembalut]] [[tepung beras]]
{{C|tsg|Makanan|Pencuci mulut}}
s8vtwjshjcdbrfb0hstub9ohermg6l8
liyuuran
0
74074
369307
290969
2026-08-30T06:40:34Z
~2026-47210-99
11292
/* Kata nama */ Sinonim: kaluwarga'
369307
wikitext
text/x-wiki
==Bahasa Suluk==
===Kata nama===
{{inti|tsg|kata nama}}
# [[keturunan]]
# [[keluarga]]
#: {{syn|tsg|kaluwarga'}}
# [[kaum kerabat]]
m6tp38w8k8dd9imssp1lmktmjv9c09g
dihil
0
74130
369328
325561
2026-08-30T09:33:05Z
~2026-47210-99
11292
/* Kata kerja */
369328
wikitext
text/x-wiki
==Bahasa Suluk==
===Kata kerja===
{{inti|tsg|kata kerja}}
# [[beri]]
#: {{cp|tsg|'''Dihi''' kaw kawahaan tag lima ringgit.|'''Berikan ''' saya dua puluh lima ringgit.}}
====Kata terbitan====
{{der3|tsg|magdihil|nagdihil|nagdirihil|dihilan|dihili|dumihil|magdirihil}}
8q0hyivhnrl6wrk0qrcynvl5w11hgx7
sasakatan
0
74326
369300
313322
2026-08-30T06:13:23Z
~2026-46834-50
11290
/* Kata nama */
369300
wikitext
text/x-wiki
==Bahasa Suluk==
===Kata nama===
{{inti|tsg|kata nama}}
# [[kenderaan]]
#: {{cp|tsg|Basikul da in '''sasakatan''' sin manga tau Malaysia sin timpu Anggalis.|Basikal adalah '''kenderaan''' yang digunakan oleh ramai Malaysia semasa tempoh British.}}
===Etimologi===
Penggandaan kepada {{akhiran|tsg|sakat|an}}.
==Bahasa Iban==
===Kata nama===
{{inti|iba|kata nama}}
# Pengangkut
#: {{cp|iba|Iya bisi ngembuan '''pengangkut'''. | Dia ada mempunyai '''kenderaan'''.}}
677obbcfgiekyiejqd3t39mezf1drjl
Wikikamus:ja/辞書
4
89583
369312
250467
2026-08-30T07:39:58Z
SNN95
2113
369312
wikitext
text/x-wiki
== Bahasa Jepun ==
=== Etimologi 1 ===
{{ja-kanjitab|じ|しょ|y=o}}
Satu penggunaan semula istilah yang lebih lama {{m|ja|辞書|tr=jisho||surat peletakan jawatan}} (lihat di bawah), berdasarkan analisis semula aksara-aksara yang membentuknya iaitu {{m|ja|辞|tr=ji||peletakan jawatan, berhenti; perkataan}} + {{m|ja|書|tr=sho||tulisan, rekod, dokumen, buku}}. Dipengaruhi oleh istilah yang berasal daripada {{cog|ltc|-}} iaitu {{m|ja|辞典|tr=jiten||kamus}}, di mana aksara {{m|ja|辞}} membawa maksud "perkataan" daripada {{der|ja|ltc|-|sort=ししょ'}} {{m|zh|辭|tr=zi}}, berbanding maksud "peletakan jawatan" atau "berhenti" daripada {{cog|ltc|-}} {{m|zh|辤|tr=zi}}. Ambil perhatian bahawa kedua-dua bentuk aksara lama ini kemudiannya digabungkan dalam kedua-dua {{noncog|ja|-}} dan {{cog|zh|-}} menjadi versi ringkas [[辞]], dengan maksud "perkataan" menjadi dominan dalam {{cog|zh|-}}.
Kemunculan pertama dalam bahasa Jepun dengan maksud kamus ini mungkin menerusi penerbitan {{lang|ja|羅葡日辞書}} (''Ra-Ho-Nichi Jisho'', "Kamus Latin-Portugis-Jepun") oleh pihak Jesuit pada tahun 1595, dengan tajuk alternatif ''{{lang|la|Dictionarium Latino Lusitanicum, ac Iaponicum}}''.<ref name="Nipponica">'''1984''', {{lang|ja|[[w:ja:日本大百科全書|日本大百科全書:ニッポニカ]]}} (''Nippon Dai Hyakka Zensho: Nipponica'', "[[w:ms:Encyclopedia Nipponica|Encyclopedia Nipponica]]") (dalam bahasa Jepun), [[w:ms:Tokyo|Tōkyō]]: [[w:ms:Shogakukan|Shogakukan]], teks berkaitan dalam talian [https://kotobank.jp/word/%E8%BE%9E%E5%85%B8-74325#西欧系日本語辞典 di sini]. Ambil perhatian tentang [[salah taip]] pada nama Latin yang disenaraikan dalam sumber ini, yang menunjukkan ''Dictionaricum'' dan bukannya {{m|la|dictionarium|Dictionarium}} yang betul.</ref>
Bandingkan dengan {{cog|cmn|-}} moden {{m|zh|辭書|tr=císhū||kamus, leksikon}}, yang berkemungkinan dipinjam semula daripada atau sebaliknya dipengaruhi oleh bahasa Jepun.
==== Sebutan ====
{{ja-pron|じしょ|acc=1|acc_ref=NHK,DJR,SMK5}}
==== Kata nama ====
{{ja-noun|じしょ}}
# {{C|ja|Kamus|sort=ししょ'}} sebuah [[kamus]] {{gl|penerbitan yang menerangkan maksud bagi senarai perkataan yang disusun}}
===== Sinonim =====
{{col|ja
|{{ja-r|辞典|じてん}}
|{{ja-r|辞林|じりん}}
|{{ja-r|字引|じびき}}
|{{ja-r|辞彙|じ.い}}
}}
===== Lihat juga =====
{{col|ja|title=Lihat juga
|{{ja-r|事典|じてん}}
|{{ja-r|字典|じてん}}
}}
=== Etimologi 2 ===
{{ja-kanjitab|yomi=o|じ|しょ}}
Daripada kata majmuk {{der|ja|ltc|-|sort=ししょ'}} {{m|zh|辤書|tr=zi syo|lit=berhenti + tulisan}}.
==== Sebutan ====
{{ja-pron|じしょ|acc=1|acc_ref=NHK,DJR,SMK5}}
==== Kata nama ====
{{ja-noun|じしょ}}
# [[surat]] [[peletakan jawatan]]
#: {{syn|ja|辞表<tr:jihyō>}}
# surat atau dokumen rasmi [[turun takhta]] apabila seorang [[maharaja]] [[melepaskan jawatan]] dan maharaja baharu [[menaiki takhta]]
#: {{syn|ja|御報書<tr:gohōsho>}}
=== Etimologi 3 ===
{{ja-kanjitab|じ|そ|y=irr|sort=しそ'}}
Bentuk {{m|ja|直音表記|tr=chokuon hyōki|lit=ejaan bunyi lurus}} bagi ''jisho'' di atas. Paling biasa digunakan dari zaman [[w:ms:Zaman Heian|Heian]] hingga zaman [[w:ms:Zaman Muromachi|Muromachi]].<ref name="KDJ">{{R:Kokugo Dai Jiten}}</ref>
Tidak dapat dipastikan sama ada sebutannya sendiri turut berubah, atau hanya ejaannya.
==== Sebutan ====
{{ja-pron|じそ}}
==== Kata nama ====
{{ja-noun|じそ}}
# {{lb|ja|sort=しそ'|usang}} sebuah [[surat]] [[peletakan jawatan]]
===Rujukan===
{{reflist}}
===Bacaan lanjut===
* {{R:Kanjipedia Kotoba|0002888300}}
79mz31j33pny8o00ugv7i0rwb6vugxl
Wikikamus:dtp/rangalau
4
116424
369316
283296
2026-08-30T08:07:30Z
Ft btysio18
8236
369316
wikitext
text/x-wiki
==Bahasa {{bahasa|dtp}}==
===Kata nama===
{{inti|dtp|kata nama}}
# {{label|1=dtp|2=Bundu Liwan|3=Malaysia}} rambutan {{cp|dtp|Akapal tonsi dilo '''rangalau'''.|Isi '''[[rambutan]]''' itu tebal.}}
cronm7wwe1lsd386p81irdsue3bj81j
Wikikamus:ar/مفتاح
4
136334
369196
363185
2026-08-29T12:15:22Z
Hsnaqrrtuainie
11246
/* */
369196
wikitext
text/x-wiki
مفتاح
١.kunci
==Bahasa {{bahasa|ar}}==
===Kata nama===
{{inti|ar|kata nama}}
# Kunci
0yr8fjskjgus3ey29l1zmcrg92hh9vc
Wikikamus:ar/عنب
4
136356
369204
363207
2026-08-29T12:25:36Z
Hsnaqrrtuainie
11246
/* */
369204
wikitext
text/x-wiki
1.anggur
==Bahasa {{bahasa|ar}}==
===Kata nama===
{{inti|ar|kata nama}}
# Anggur
7tmbxuikigik02rw6zn4p70ouliq7ez
Wikikamus:ar/تمر
4
136361
369205
363212
2026-08-29T12:28:46Z
Hsnaqrrtuainie
11246
/* */
369205
wikitext
text/x-wiki
١.kurma
==Bahasa {{bahasa|ar}}==
===Kata nama===
{{inti|ar|kata nama}}
# Kurma
7mt0qn531sxtvdvzbz3ncm3kgr3owdr
Wikikamus:ar/أب
4
136586
369177
363596
2026-08-29T11:59:20Z
Hsnaqrrtuainie
11246
/* */
369177
wikitext
text/x-wiki
أب
١.ayah
==Bahasa {{bahasa|ar}}==
===Kata nama===
{{inti|ar|kata nama}}
# {{label|1=ar|2=Ayah}}
aw9ae38xoj0fqgd76pdy54pn4fkrgr6
Wikikamus:ar/ولد
4
136808
369212
366220
2026-08-29T12:34:34Z
Hsnaqrrtuainie
11246
/* */
369212
wikitext
text/x-wiki
budak lelaki
==Bahasa {{bahasa|ar}}==
===Kata nama===
{{inti|ar|kata nama}}
# budak lelaki
# melahirkan
crnpxcntiscr8gcwhn4phwazhi78jhj
Wikikamus:ar/رسم
4
136959
369232
364026
2026-08-29T12:43:20Z
Azrieani
11232
/* */
369232
wikitext
text/x-wiki
==Bahasa {{bahasa|ar}}==
===Kata kerja===
{{inti|ar|kata kerja}}
# telah lukis
# melukis
spba0z78p89kb89i63brl2k9q0ymn5k
Wikikamus:ar/صحن
4
137461
369200
364556
2026-08-29T12:20:08Z
Hsnaqrrtuainie
11246
/* */
369200
wikitext
text/x-wiki
صحن
١.pinggan
==Bahasa {{bahasa|ar}}==
===Kata nama===
{{inti|ar|kata nama}}
# pinggan
4lanqcok3qtx2ycv5icsy259lkm7hge
Wikikamus:ar/دفتر
4
137483
369190
364578
2026-08-29T12:11:55Z
Hsnaqrrtuainie
11246
/* */
369190
wikitext
text/x-wiki
دفتر
١.buku nota
==Bahasa {{bahasa|ar}}==
===Kata nama===
{{inti|ar|kata nama}}
# buku nota
tlc58dzhxc1l4v1h4ql57s19kz1r82y
Wikikamus:ar/خبز
4
137487
369202
364582
2026-08-29T12:22:53Z
Hsnaqrrtuainie
11246
/* */
369202
wikitext
text/x-wiki
خبز
١.roti
==Bahasa {{bahasa|ar}}==
===Kata nama===
{{inti|ar|kata nama}}
# roti
5m5trm9u3ud6osc9z5n177unq4wobx8
Wikikamus:ar/سرير
4
137536
369199
364633
2026-08-29T12:18:51Z
Hsnaqrrtuainie
11246
/* */
369199
wikitext
text/x-wiki
سرير
١.katil
==Bahasa {{bahasa|ar}}==
===Kata nama===
# katil
os6l78euts8e8a4d8xrzw7wy1bq4sjr
Wikikamus:ar/اشتری
4
137571
369258
364683
2026-08-29T13:06:13Z
Awangazzam
11056
/* */
369258
wikitext
text/x-wiki
اشتری
1.membeli
==Bahasa {{bahasa|ar}}==
===Kata kerja===
{{inti|ar|kata kerja}}
# telah beli
6077894my5wjc4wuzkadc25mxr0t6i5
Wikikamus:ar/دعا
4
137572
369213
364684
2026-08-29T12:34:52Z
Azrieani
11232
/* */
369213
wikitext
text/x-wiki
==Bahasa {{bahasa|ar}}==
===Kata kerja===
{{inti|ar|kata kerja}}
# telah berdoa
# berdoa
merqvhar8rruoybc3pwmtmk5zmey5kb
369226
369213
2026-08-29T12:40:22Z
Hsnaqrrtuainie
11246
/* */
369226
wikitext
text/x-wiki
1.memanggil
2.berdoa
==Bahasa {{bahasa|ar}}==
===Kata kerja===
{{inti|ar|kata kerja}}
# telah berdoa
# berdoa
6fylzi4nkwcqgb4r8rxb6oyb1ewb0nd
Wikikamus:ar/نجح
4
137578
369248
364693
2026-08-29T12:52:13Z
Hsnaqrrtuainie
11246
/* */
369248
wikitext
text/x-wiki
berjaya
==Bahasa {{bahasa|ar}}==
===Kata kerja===
{{inti|ar|kata kerja}}
# telah berjaya
sowr1dr1h4k6rrqnp2j30qebdcmqh8b
Wikikamus:ar/صام
4
137593
369228
364712
2026-08-29T12:40:49Z
Hsnaqrrtuainie
11246
/* */
369228
wikitext
text/x-wiki
berpuasa
==Bahasa {{bahasa|ar}}==
===Kata kerja===
{{inti|ar|kata kerja}}
# telah berpuasa
aq239keg7enrkp6ryb6t3qzq0roa3cf
Wikikamus:ar/بدل
4
137603
369223
364727
2026-08-29T12:39:23Z
Azrieani
11232
/* */
369223
wikitext
text/x-wiki
==Bahasa {{bahasa|ar}}==
===Kata kerja===
{{inti|ar|kata kerja}}
# telah menukar
# menganti
lolz7253lzc7zgv1yxcje0t2vs95ynf
Wikikamus:ar/قتل
4
137772
369253
364958
2026-08-29T12:58:14Z
Hsnaqrrtuainie
11246
/* */
369253
wikitext
text/x-wiki
membunuh
==Bahasa {{bahasa|ar}}==
===Kata nama===
{{inti|ar|kata nama}}
# bunuh
j87slmky0da1tk9rth9i9p106ceon0y
Wikikamus:ar/مدير
4
137858
369187
365053
2026-08-29T12:10:09Z
Hsnaqrrtuainie
11246
/* */
369187
wikitext
text/x-wiki
مدير
١.pengurus
==Bahasa {{bahasa|ar}}==
===Kata nama===
{{inti|ar|kata nama}}
# guru besar
tuo50l0axg7aw6p6hezqojc3p4qlwxj
Wikikamus:ar/تابع
4
137898
369217
365093
2026-08-29T12:36:51Z
Azrieani
11232
/* */
369217
wikitext
text/x-wiki
meneruskan
==Bahasa {{bahasa|ar}}==
===Kata nama===
{{inti|ar|kata nama}}
# mengikuti
cft4fs2ooywulzg9az0dzxdqci00gwb
Wikikamus:ar/زجاج
4
137919
369201
365114
2026-08-29T12:20:53Z
Hsnaqrrtuainie
11246
/* */
369201
wikitext
text/x-wiki
زجاج
١.botol kaca
==Bahasa {{bahasa|ar}}==
===Kata nama===
{{inti|ar|kata nama}}
# kaca
f04ife95m57kco11ofer4dipvei9yr7
Wikikamus:ar/شاهد
4
137928
369219
365123
2026-08-29T12:37:35Z
Azrieani
11232
/* */
369219
wikitext
text/x-wiki
==Bahasa {{bahasa|ar}}==
===Kata nama===
{{inti|ar|kata nama}}
# saksi
# menonton
823klu1up0w5xdr7d98ucto6jim7cpl
Wikikamus:ar/جدار
4
137952
369197
365149
2026-08-29T12:16:22Z
Hsnaqrrtuainie
11246
/* */
369197
wikitext
text/x-wiki
جدار
١.dinding
==Bahasa {{bahasa|ar}}==
===Kata nama===
{{inti|ar|kata nama}}
# dinding
9raa36aojp95zpm3hzjdoqt0bg1lmf4
Wikikamus:ar/سقف
4
137954
369198
365151
2026-08-29T12:17:08Z
Hsnaqrrtuainie
11246
/* */
369198
wikitext
text/x-wiki
سقف
١.siling
==Bahasa {{bahasa|ar}}==
===Kata nama===
{{inti|ar|kata nama}}
# syiling / bumbung
tj3s9lk8sl92y2lb62h9oqr9td8cyvi
Wikikamus:ar/غادر
4
138160
369206
365397
2026-08-29T12:30:26Z
Azrieani
11232
/* */
369206
wikitext
text/x-wiki
cuti
==Bahasa {{bahasa|ar}}==
===Kata nama===
{{inti|ar|kata nama}}
# meninggalkan
e7y05q2qyny5xj4aeeogn4s0ph3hse2
Wikikamus:ar/صديق
4
138185
369185
365422
2026-08-29T12:06:13Z
Hsnaqrrtuainie
11246
/* */
369185
wikitext
text/x-wiki
صديق
١.kawan
==Bahasa {{bahasa|ar}}==
===Kata nama===
{{inti|ar|kata nama}}
# kawan lelaki
flmr2tuo4i10rzu13ah5bdhrn8yh7hl
Wikikamus:ar/جسر
4
138289
369207
365529
2026-08-29T12:31:03Z
Hsnaqrrtuainie
11246
/* */
369207
wikitext
text/x-wiki
1.jambatan
==Bahasa {{bahasa|ar}}==
===Kata nama===
{{inti|ar|kata nama}}
# jambatan
siulmq6o3b7y2a3y6b6m6lzkvf79k0u
Wikikamus:ar/بنت
4
138484
369210
365734
2026-08-29T12:33:26Z
Hsnaqrrtuainie
11246
/* */
369210
wikitext
text/x-wiki
١.budak perempuan
==Bahasa {{bahasa|ar}}==
===Kata nama===
{{inti|ar|kata nama}}
# budak perempuan
kpqzh3tthdirfk0kyr2n12dblasfw1o
Wikikamus:ar/نسي
4
138707
369240
366170
2026-08-29T12:46:59Z
Hsnaqrrtuainie
11246
/* */
369240
wikitext
text/x-wiki
lupa
==Bahasa {{bahasa|ar}}==
===Kata kerja===
{{inti|ar|kata kerja}}
# lupa
1oyn3vtdfherahh9v97weazmioiv8pt
Wikikamus:ar/قبل
4
138735
369254
366206
2026-08-29T12:59:07Z
Hsnaqrrtuainie
11246
/* */
369254
wikitext
text/x-wiki
mencium
==Bahasa {{bahasa|ar}}==
===Kata kerja===
{{inti|ar|kata kerja}}
# mencium
rxsh2z2xb8ctb58m0etkrxfnqbnct2o
Wikikamus:ar/ساعد
4
138783
369220
366264
2026-08-29T12:38:35Z
Hsnaqrrtuainie
11246
/* */
369220
wikitext
text/x-wiki
membantu
==Bahasa {{bahasa|ar}}==
===Kata kerja===
{{inti|ar|kata kerja}}
# telah menolong
8ld85biz6qjstn7u35od567enxbhign
Wikikamus:ar/رسب
4
138833
369247
366322
2026-08-29T12:50:53Z
Hsnaqrrtuainie
11246
/* */
369247
wikitext
text/x-wiki
gagal
==Bahasa {{bahasa|ar}}==
===Kata kerja===
{{inti|ar|kata kerja}}
# telah gagal
r3nm9y8yb68e75dxhmk13si7wojg8ic
Wikikamus:ar/عامل
4
139406
369186
366997
2026-08-29T12:08:47Z
Hsnaqrrtuainie
11246
/* */
369186
wikitext
text/x-wiki
عامل
١.pekerja
==Bahasa {{bahasa|ar}}==
===Kata nama===
{{inti|ar|kata nama}}
# pekerja am
ja4bnsblgj7t1e21wnp2gu79f24zltn
Wikikamus:ar/زار
4
139486
369224
367083
2026-08-29T12:39:24Z
Hsnaqrrtuainie
11246
/* */
369224
wikitext
text/x-wiki
melawat
==Bahasa {{bahasa|ar}}==
===Kata kerja===
{{inti|ar|kata kerja}}
# melawat
4u1jvzgri8eabok03jup38p8gmrxn41
Wikikamus:ar/حاول
4
139590
369250
367213
2026-08-29T12:54:11Z
Hsnaqrrtuainie
11246
/* */
369250
wikitext
text/x-wiki
mencuba
==Bahasa {{bahasa|ar}}==
===Kata kerja===
{{inti|ar|kata kerja}}
# mencuba
qsb140bg6s8om7xlhaq2k8y3o84h7ri
Wikikamus:ar/وعد
4
139595
369257
367220
2026-08-29T13:02:16Z
Hsnaqrrtuainie
11246
/* */
369257
wikitext
text/x-wiki
berjanji
==Bahasa {{bahasa|ar}}==
===Kata kerja===
{{inti|ar|kata kerja}}
# berjanji
ot2dgas395wobe4cpzo6sp6jnq413o4
Wikikamus:ar/شرح
4
139654
369245
367284
2026-08-29T12:49:25Z
Hsnaqrrtuainie
11246
/* */
369245
wikitext
text/x-wiki
menerangkan
==Bahasa {{bahasa|ar}}==
===Kata kerja===
{{inti|ar|kata kerja}}
# menerangkan
g5rpw3iohpqwe3xrgz9wiq2tawraze4
Wikikamus:ar/خروف
4
139673
369214
367303
2026-08-29T12:35:10Z
Ainulaqilahh
11233
/* */
369214
wikitext
text/x-wiki
==Bahasa {{bahasa|ar}}==
===Kata nama===
{{inti|ar|kata nama}}
# pelita
# lampu
covnnr741vdxiok3h3m2rjor4pb4jb0
Wikikamus:ar/فقد
4
140032
369235
367697
2026-08-29T12:45:02Z
Hsnaqrrtuainie
11246
/* */
369235
wikitext
text/x-wiki
kehilangan
==Bahasa {{bahasa|ar}}==
===Kata kerja===
{{inti|ar|kata kerja}}
# terlepas
smktm3chiraoil8jusjwvbpor0xp4qd
Wikikamus:ar/لحم
4
140330
369203
368045
2026-08-29T12:24:07Z
Hsnaqrrtuainie
11246
/* */
369203
wikitext
text/x-wiki
لحم
١.daging
==Bahasa {{bahasa|ar}}==
===Kata nama===
{{inti|ar|kata nama}}
# daging
t81e2gqvxbfptp4vbu17yjcpbqrbdk5
Wikikamus:ar/وجد
4
140697
369209
368559
2026-08-29T12:32:13Z
Azrieani
11232
/* */
369209
wikitext
text/x-wiki
==Bahasa {{bahasa|ar}}==
===Kata kerja===
{{inti|ar|kata kerja}}
# Menjumpai
# menemukan
gxx11e2v4imjoyzrcddtd3recluswyk
369233
369209
2026-08-29T12:43:58Z
Hsnaqrrtuainie
11246
/* */
369233
wikitext
text/x-wiki
menemui
==Bahasa {{bahasa|ar}}==
===Kata kerja===
{{inti|ar|kata kerja}}
# Menjumpai
# menemukan
ovyyo5gtpet1ym8subrz6u8lphrume8
biyunu'
0
141163
369259
369175
2026-08-29T17:40:02Z
~2026-46834-50
11290
/* Kata kerja */ Tatabahasa
369259
wikitext
text/x-wiki
==Bahasa Suluk==
====Kata kerja====
{{inti|tsg|kata kerja}}
# membunuh
#: {{ux|tsg|'''Biyunu'''' niya in iru' kangug nakapangutkut ha anak niya.|t=Dia '''membunuh''' anjing galak yang menggigit anaknya.}}
===Eimologi===
Daripada {{af|tsg|bunu'|-iy-}}.
ee47slkbkx73fo162rvsez1b5ugi7w6
Wikikamus:ar/أم
4
141164
369178
2026-08-29T12:00:15Z
Hsnaqrrtuainie
11246
/* */
369178
wikitext
text/x-wiki
أم
١.ibu
==Bahasa {{bahasa|ar}}==
===Kata nama===
{{inti|ar|kata nama}}
# {{label|1=ar|2=dialek|3=Johor}} contoh
0c6d82qwprkwlo2bf7hldtz00csmxsg
Wikikamus:ar/أج
4
141165
369179
2026-08-29T12:01:07Z
Hsnaqrrtuainie
11246
/* */
369179
wikitext
text/x-wiki
أج
١.saudara lelaki
==Bahasa {{bahasa|ar}}==
===Kata nama===
{{inti|ar|kata nama}}
# {{label|1=ar|2=dialek|3=Johor}} contoh
96xg34lsemwkyc3iz88muvero2ps47p
369181
369179
2026-08-29T12:02:05Z
Hsnaqrrtuainie
11246
369181
wikitext
text/x-wiki
أخ
١.saudara lelaki
==Bahasa {{bahasa|ar}}==
===Kata nama===
{{inti|ar|kata nama}}
# {{label|1=ar|2=dialek|3=Johor}} contoh
7p9ewbop6epf0jvbcnrbdwn73rmvyg4
369183
369181
2026-08-29T12:03:10Z
Hsnaqrrtuainie
11246
/* Kata nama */
369183
wikitext
text/x-wiki
أخ
١.saudara lelaki
==Bahasa {{bahasa|ar}}==
===KATA NAMA===
# أخ(saudara lelaki)
98538u9kmtbcwmc2fvpl5e62m05qgr9
Wikikamus:ar/أخت
4
141166
369184
2026-08-29T12:04:55Z
Hsnaqrrtuainie
11246
/* */
369184
wikitext
text/x-wiki
أخت
١.saudara perempuan
==Bahasa {{bahasa|ar}}==
===Kata nama===
{{inti|ar|kata nama}}
# {{label|1=ar|2=dialek|3=Johor}} contoh
mgnbqavrrw1el0nsg2ba3ass9m32957
maglanggung
0
141167
369188
2026-08-29T12:10:11Z
~2026-46834-50
11290
Mencipta laman baru dengan kandungan '==Bahasa Suluk== ====Kata sifat==== {{inti|tsg|kata sifat}} # [[bersaudara]] #: {{uxi|tsg|'''Maglanggung''' Wright|t=Wright '''bersaudara'''}} ===Etimologi=== Daripada {{af|tsg|mag-|langgung}}.'
369188
wikitext
text/x-wiki
==Bahasa Suluk==
====Kata sifat====
{{inti|tsg|kata sifat}}
# [[bersaudara]]
#: {{uxi|tsg|'''Maglanggung''' Wright|t=Wright '''bersaudara'''}}
===Etimologi===
Daripada {{af|tsg|mag-|langgung}}.
ba5iq82wi8ef89yzdlist6yysgdk3fw
Wikikamus:ar/ابر
4
141168
369189
2026-08-29T12:10:44Z
Awangazzam
11056
Mencipta laman baru dengan kandungan '==Bahasa {{bahasa|{{safesubst:ROOTPAGENAME}}}}== ===Kata nama=== {{inti|{{safesubst:ROOTPAGENAME}}|kata nama}} # jarum'
369189
wikitext
text/x-wiki
==Bahasa {{bahasa|ar}}==
===Kata nama===
{{inti|ar|kata nama}}
# jarum
h5mdbrc5w5twj1tnitsd6asq5935owp
taymanghud
0
141169
369191
2026-08-29T12:13:07Z
~2026-46834-50
11290
Mencipta laman baru dengan kandungan '==Bahasa Suluk== ====Kata nama==== {{inti|tsg|kata nama}} # [[saudara]] #: {{syn|tsg|langgung}}'
369191
wikitext
text/x-wiki
==Bahasa Suluk==
====Kata nama====
{{inti|tsg|kata nama}}
# [[saudara]]
#: {{syn|tsg|langgung}}
bupsqfvanuywc4czu4s2brg6wgc1r0w
369192
369191
2026-08-29T12:13:26Z
~2026-46834-50
11290
/* Bahasa Suluk */ Autocat
369192
wikitext
text/x-wiki
==Bahasa Suluk==
====Kata nama====
{{inti|tsg|kata nama}}
# [[saudara]]
#: {{syn|tsg|langgung}}
{{C|tsg|Keluarga}}
msoujhtm5vj4q6197tujp9s57pdz08i
Wikikamus:ar/ابدل
4
141170
369193
2026-08-29T12:13:37Z
Awangazzam
11056
/* */
369193
wikitext
text/x-wiki
==Bahasa {{bahasa|ar}}==
===Kata kerja===
{{inti|ar|kata kerja}}
# {{label|1=ar|2=dialek|3=Johor}} contoh
9wvwgga0kx9pso5yd87wu0t4ddyqkoj
369195
369193
2026-08-29T12:14:25Z
Awangazzam
11056
/* Kata kerja */
369195
wikitext
text/x-wiki
==Bahasa {{bahasa|ar}}==
===Kata kerja===
{{inti|ar|kata kerja}}
# menukar
jkzrh3jdgdwdsg09dvhikv816s1l6kt
Wikikamus:ar/حاسوب
4
141171
369194
2026-08-29T12:13:55Z
Hsnaqrrtuainie
11246
/* */
369194
wikitext
text/x-wiki
حاسوب
١.komputer
==Bahasa {{bahasa|ar}}==
===Kata nama===
{{inti|ar|kata nama}}
# {{label|1=ar|2=dialek|3=Johor}} contoh
d2suzkzbg6o6c9yepcnkpsfpco61zxq
Wikikamus:ar/وضع
4
141172
369208
2026-08-29T12:31:31Z
Azrieani
11232
/* */
369208
wikitext
text/x-wiki
==Bahasa {{bahasa|ar}}==
===Kata kerja===
{{inti|ar|kata kerja}}
# meletakkan
twfbyyamn2o6ciyld8py5vun1peq58f
Wikikamus:ar/أعطي
4
141173
369211
2026-08-29T12:33:56Z
Azrieani
11232
/* */
369211
wikitext
text/x-wiki
==Bahasa {{bahasa|ar}}==
===Kata kerja===
{{inti|ar|kata kerja}}
# memberi
1xaco7rn7tj7nkpowksze2ok4dc4mbg
Wikikamus:ar/صدق
4
141174
369215
2026-08-29T12:35:36Z
Azrieani
11232
/* */
369215
wikitext
text/x-wiki
==Bahasa {{bahasa|ar}}==
===Kata kerja===
{{inti|ar|kata kerja}}
# membenarkan
pdns0l6l52lfvxgax1ietethrmlog5k
369256
369215
2026-08-29T13:01:31Z
Hsnaqrrtuainie
11246
/* */
369256
wikitext
text/x-wiki
1.berkata benar
2.jujur
==Bahasa {{bahasa|ar}}==
===Kata kerja===
{{inti|ar|kata kerja}}
# membenarkan
bzvkkw39382212kjr0yjoay61hoqvpy
Wikikamus:ar/أراد
4
141175
369216
2026-08-29T12:36:02Z
Hsnaqrrtuainie
11246
/* */
369216
wikitext
text/x-wiki
mahu
==Bahasa {{bahasa|ar}}==
===Kata kerja===
{{inti|ar|kata kerja}}
# {{label|1=ar|2=dialek|3=Johor}} contoh
mbgyk784ixioemcqz1kil2qwie6gb4u
Wikikamus:ar/احتاج
4
141176
369218
2026-08-29T12:37:07Z
Hsnaqrrtuainie
11246
/* */
369218
wikitext
text/x-wiki
memerlukan
==Bahasa {{bahasa|ar}}==
===Kata kerja===
{{inti|ar|kata kerja}}
# {{label|1=ar|2=dialek|3=Johor}} contoh
24akvztafapml5scl90spollmb7t32k
Wikikamus:ar/حضر
4
141177
369221
2026-08-29T12:38:40Z
Azrieani
11232
/* */
369221
wikitext
text/x-wiki
==Bahasa {{bahasa|ar}}==
===Kata kerja===
{{inti|ar|kata kerja}}
# menghadiri
pn126oenyc05d1cfxn9zha2x3fv8fac
Wikikamus:ar/حادثة
4
141178
369222
2026-08-29T12:38:56Z
Ainulaqilahh
11233
/* */
369222
wikitext
text/x-wiki
==Bahasa {{bahasa|ar}}==
===Kata kerja===
{{inti|ar|kata kerja}}
# kemalangan
ia7gu4h34pw3uga6ajwpv2vxney1vez
Wikikamus:ar/مسح
4
141179
369225
2026-08-29T12:40:07Z
Azrieani
11232
/* */
369225
wikitext
text/x-wiki
==Bahasa {{bahasa|ar}}==
===Kata kerja===
{{inti|ar|kata kerja}}
# mengelap
feg6fctdqe09jo70gct4lpfsbq7qy2e
Wikikamus:ar/حصد
4
141180
369227
2026-08-29T12:40:41Z
Azrieani
11232
/* */
369227
wikitext
text/x-wiki
==Bahasa {{bahasa|ar}}==
===Kata kerja===
{{inti|ar|kata kerja}}
# menuai
dxb9ch1elmrxjx3n3qe8f8l3wnn6bg9
Wikikamus:ar/عبد
4
141181
369229
2026-08-29T12:41:41Z
Hsnaqrrtuainie
11246
/* */
369229
wikitext
text/x-wiki
menyembah
==Bahasa {{bahasa|ar}}==
===Kata kerja===
{{inti|ar|kata kerja}}
# {{label|1=ar|2=dialek|3=Johor}} contoh
s887wdq1nt30gyly3t0sudznrdummic
Wikikamus:ar/أصلح
4
141182
369230
2026-08-29T12:42:19Z
Azrieani
11232
/* */
369230
wikitext
text/x-wiki
==Bahasa {{bahasa|ar}}==
===Kata kerja===
{{inti|ar|kata kerja}}
# memperbaiki
kzmagxwqvna3fpbbr63p6yelm2znxfc
Wikikamus:ar/بدأ
4
141183
369231
2026-08-29T12:42:42Z
Hsnaqrrtuainie
11246
/* */
369231
wikitext
text/x-wiki
mula
==Bahasa {{bahasa|ar}}==
===Kata kerja===
{{inti|ar|kata kerja}}
# {{label|1=ar|2=dialek|3=Johor}} contoh
m9q6ttrw52dd5xtcegd6x7euvg9u71c
Wikikamus:ar/يطحن
4
141184
369234
2026-08-29T12:44:41Z
Azrieani
11232
/* */
369234
wikitext
text/x-wiki
==Bahasa {{bahasa|ar}}==
===Kata kerja===
{{inti|ar|kata kerja}}
# menggiling
5lucra8u7ubrdyhbkas451fvg4wb21x
Wikikamus:ar/يعصر
4
141185
369236
2026-08-29T12:45:18Z
Azrieani
11232
/* */
369236
wikitext
text/x-wiki
==Bahasa {{bahasa|ar}}==
===Kata kerja===
{{inti|ar|kata kerja}}
# memeras
1w745yc06cglmy98o1sew0p9oy3j9cs
Wikikamus:ar/ينحت
4
141186
369237
2026-08-29T12:46:09Z
Azrieani
11232
/* */
369237
wikitext
text/x-wiki
==Bahasa {{bahasa|ar}}==
===Kata kerja===
{{inti|ar|kata kerja}}
# mengukir
41hd576mw5s2cf1470orsfc2vmaqxb1
Wikikamus:ar/ترڬ
4
141187
369238
2026-08-29T12:46:19Z
Hsnaqrrtuainie
11246
/* */
369238
wikitext
text/x-wiki
meninggalkan
==Bahasa {{bahasa|ar}}==
===Kata kerja===
{{inti|ar|kata kerja}}
# {{label|1=ar|2=dialek|3=Johor}} contoh
4upmwqdsamr0s53fdg0huu627hrsyre
Wikikamus:ar/يطوي
4
141188
369239
2026-08-29T12:46:47Z
Azrieani
11232
/* */
369239
wikitext
text/x-wiki
==Bahasa {{bahasa|ar}}==
===Kata kerja===
{{inti|ar|kata kerja}}
# melipat
3lnjowwajqpn9om04720t1sk76lgbu9
Wikikamus:ar/ينشر
4
141189
369241
2026-08-29T12:47:28Z
Azrieani
11232
/* */
369241
wikitext
text/x-wiki
==Bahasa {{bahasa|ar}}==
===Kata kerja===
{{inti|ar|kata kerja}}
# membentang
qernrlniw11q4gsaol09qubobassule
Wikikamus:ar/أرسل
4
141190
369242
2026-08-29T12:47:50Z
Hsnaqrrtuainie
11246
/* */
369242
wikitext
text/x-wiki
menghantar
==Bahasa {{bahasa|ar}}==
===Kata kerja===
{{inti|ar|kata kerja}}
# {{label|1=ar|2=dialek|3=Johor}} contoh
5cxw09o6y6qq5mmbl6o7ly8fpe7pi9y
Wikikamus:ar/يخبز
4
141191
369243
2026-08-29T12:48:21Z
Azrieani
11232
/* */
369243
wikitext
text/x-wiki
==Bahasa {{bahasa|ar}}==
===Kata kerja===
{{inti|ar|kata kerja}}
# memanggang
gk5z6bsq7gqxe5wpc5d9uh8axcz1krs
Wikikamus:ar/يقشر
4
141192
369244
2026-08-29T12:48:59Z
Azrieani
11232
/* */
369244
wikitext
text/x-wiki
==Bahasa {{bahasa|ar}}==
===Kata kerja===
{{inti|ar|kata kerja}}
# mengupas
8xg6i4htmz9fr9zczd1g1ta01wrjs8w
Wikikamus:ar/يفرم
4
141193
369246
2026-08-29T12:49:36Z
Azrieani
11232
/* */
369246
wikitext
text/x-wiki
==Bahasa {{bahasa|ar}}==
===Kata kerja===
{{inti|ar|kata kerja}}
# mencincang
ef8qr3ld8jyd5lrp1ai9cggz2565xpx
Wikikamus:ar/شفي
4
141194
369249
2026-08-29T12:53:28Z
Hsnaqrrtuainie
11246
/* */
369249
wikitext
text/x-wiki
sembuh
==Bahasa {{bahasa|ar}}==
===Kata kerja===
{{inti|ar|kata kerja}}
# {{label|1=ar|2=dialek|3=Johor}} contoh
1jksx5gd47zew6efd28kzbvnud3kuzj
Wikikamus:ar/نصر
4
141195
369251
2026-08-29T12:56:02Z
Hsnaqrrtuainie
11246
/* */
369251
wikitext
text/x-wiki
menolong
==Bahasa {{bahasa|ar}}==
===Kata kerja===
{{inti|ar|kata kerja}}
# {{label|1=ar|2=dialek|3=Johor}} contoh
pzl569dh55b7jcaudn2hvtddb4fjl83
Wikikamus:ar/حبس
4
141196
369252
2026-08-29T12:57:11Z
Hsnaqrrtuainie
11246
/* */
369252
wikitext
text/x-wiki
1.menahan
2.memenjarakan
==Bahasa {{bahasa|ar}}==
===Kata kerja===
{{inti|ar|kata kerja}}
# {{label|1=ar|2=dialek|3=Johor}} contoh
dq1pc09jhbtwrmy1fe9x5o6yj0zckof
Wikikamus:ar/عفا
4
141197
369255
2026-08-29T13:00:21Z
Hsnaqrrtuainie
11246
/* */
369255
wikitext
text/x-wiki
memaafkan
==Bahasa {{bahasa|ar}}==
===Kata kerja===
{{inti|ar|kata kerja}}
# {{label|1=ar|2=dialek|3=Johor}} contoh
0s3a8vb6b480fyzk9mfww21rkj4mr9x
paniniga
0
141198
369260
2026-08-29T17:49:29Z
~2026-46834-50
11290
Mencipta laman baru dengan kandungan '==Bahasa Suluk== ====Kata nama==== {{inti|tsg|kata nama}} # [[perokok]] #: {{ux|tsg|In ama' ku hambuuk '''paniniga'''.|t=Bapa saya ialah seorang '''perokok'''.}} ===Etimologi=== Daripada {{af|tsg|pan-|siga}} dengan penggandaan separa.'
369260
wikitext
text/x-wiki
==Bahasa Suluk==
====Kata nama====
{{inti|tsg|kata nama}}
# [[perokok]]
#: {{ux|tsg|In ama' ku hambuuk '''paniniga'''.|t=Bapa saya ialah seorang '''perokok'''.}}
===Etimologi===
Daripada {{af|tsg|pan-|siga}} dengan penggandaan separa.
3w5lkifukut5exa8ybqeeercnudkpec
sipi'
0
141199
369261
2026-08-29T18:05:04Z
~2026-46834-50
11290
Mencipta laman baru dengan kandungan '==Bahasa Suluk== ====Kata nama==== {{inti|tsg|kata nama}} # sisir {{gl|pisang}} #: {{ux|tsg|Namī hi ina' hangka-'''sipi'''' sayng.|t=Emak membeli satu '''sisir''' pisang.}} ===Etimologi=== Banding dengan {{cog|ceb|sipi}}.'
369261
wikitext
text/x-wiki
==Bahasa Suluk==
====Kata nama====
{{inti|tsg|kata nama}}
# sisir {{gl|pisang}}
#: {{ux|tsg|Namī hi ina' hangka-'''sipi'''' sayng.|t=Emak membeli satu '''sisir''' pisang.}}
===Etimologi===
Banding dengan {{cog|ceb|sipi}}.
bar77toxo32hvx3wx8hmtv7bki6n48i
bulig
0
141200
369262
2026-08-29T18:18:46Z
~2026-46834-50
11290
Mencipta laman baru dengan kandungan '==Bahasa Suluk== ====Kata jama==== {{inti|tsg|kata nama}} # tandan {{gl|pisang, kelapa, enau, dsb.}} ===Etimologi=== {{inh+|tsg|poz-pro|*buliʀ}}. Banding dengan {{cog|ms|bulir}}, {{cog|mrw|olig}}, dan {{cog|tl|buwig}}.'
369262
wikitext
text/x-wiki
==Bahasa Suluk==
====Kata jama====
{{inti|tsg|kata nama}}
# tandan {{gl|pisang, kelapa, enau, dsb.}}
===Etimologi===
{{inh+|tsg|poz-pro|*buliʀ}}. Banding dengan {{cog|ms|bulir}}, {{cog|mrw|olig}}, dan {{cog|tl|buwig}}.
3lr14we83pedz82kyhgu2i3o78aj2ly
369284
369262
2026-08-30T04:43:48Z
~2026-46834-50
11290
/* Kata jama */ Inilah ekslusif kpd pisang sahaja
369284
wikitext
text/x-wiki
==Bahasa Suluk==
====Kata jama====
{{inti|tsg|kata nama}}
# tandan pisa
===Etimologi===
{{inh+|tsg|poz-pro|*buliʀ}}. Banding dengan {{cog|ms|bulir}}, {{cog|mrw|olig}}, dan {{cog|tl|buwig}}.
f6zs202flzt3pdrx9k92sxpbzw1hdwt
369285
369284
2026-08-30T04:44:02Z
~2026-46834-50
11290
/* Kata jama */ Pisang
369285
wikitext
text/x-wiki
==Bahasa Suluk==
====Kata jama====
{{inti|tsg|kata nama}}
# tandan pisang
===Etimologi===
{{inh+|tsg|poz-pro|*buliʀ}}. Banding dengan {{cog|ms|bulir}}, {{cog|mrw|olig}}, dan {{cog|tl|buwig}}.
ngl0qhr1va9qiypgwswq7akw1aca9ln
Wikikamus:ar/شجرة التمر
4
141201
369265
2026-08-29T22:18:45Z
Mairaaaa
11051
/* */
369265
wikitext
text/x-wiki
pokok kurma
==Bahasa {{bahasa|ar}}==
===Kata nama===
{{inti|ar|kata nama}}
# {{label|1=ar|2=dialek|3=Johor}} contoh
7fih2vgpwmno8gtqjipznxhmh2ku2yp
Wikikamus:ar/حبوب اللقاح
4
141202
369266
2026-08-29T22:19:19Z
Mairaaaa
11051
/* */
369266
wikitext
text/x-wiki
debunga
==Bahasa {{bahasa|ar}}==
===Kata nama===
{{inti|ar|kata nama}}
# {{label|1=ar|2=dialek|3=Johor}} contoh
9zrfxrqa856t0g8jpdghuxzpmutln82
Wikikamus:ar/رحيق
4
141203
369267
2026-08-29T22:21:21Z
Mairaaaa
11051
/* */
369267
wikitext
text/x-wiki
nektar
==Bahasa {{bahasa|ar}}==
===Kata nama===
{{inti|ar|kata nama}}
# {{label|1=ar|2=dialek|3=Johor}} contoh
q4v95rpg43r658u33xrjog2ya7ybert
Wikikamus:ar/الفطريات
4
141204
369268
2026-08-29T22:22:26Z
Mairaaaa
11051
/* */
369268
wikitext
text/x-wiki
kulat
==Bahasa {{bahasa|ar}}==
===Kata nama===
{{inti|ar|kata nama}}
# {{label|1=ar|2=dialek|3=Johor}} contoh
ryh27ab89cl1s246le9joskh77p4qn1
Wikikamus:ar/الطحالب
4
141205
369269
2026-08-29T22:22:48Z
Mairaaaa
11051
/* */
369269
wikitext
text/x-wiki
alga
==Bahasa {{bahasa|ar}}==
===Kata nama===
{{inti|ar|kata nama}}
# {{label|1=ar|2=dialek|3=Johor}} contoh
m23uzfftv6ud1jxrerin7i4fyd5nl22
Wikikamus:ar/إيجل
4
141206
369270
2026-08-29T22:23:12Z
Mairaaaa
11051
/* */
369270
wikitext
text/x-wiki
helang
==Bahasa {{bahasa|ar}}==
===Kata nama===
{{inti|ar|kata nama}}
# {{label|1=ar|2=dialek|3=Johor}} contoh
fv48k50xxymly2zdtth9othcxogx1el
Wikikamus:ar/الببغاء
4
141207
369271
2026-08-29T22:25:00Z
Mairaaaa
11051
/* */
369271
wikitext
text/x-wiki
burung kakak tua
==Bahasa {{bahasa|ar}}==
===Kata nama===
{{inti|ar|kata nama}}
# {{label|1=ar|2=dialek|3=Johor}} contoh
7zrxepk3tcqubr1v7vjmfmy5hpbf1v5
Wikikamus:ar/النعامة
4
141208
369272
2026-08-29T22:25:35Z
Mairaaaa
11051
/* */
369272
wikitext
text/x-wiki
burung unta
==Bahasa {{bahasa|ar}}==
===Kata nama===
{{inti|ar|kata nama}}
# {{label|1=ar|2=dialek|3=Johor}} contoh
gyyl2meupnw36810k3kkebi0hisj1sc
Wikikamus:ar/البجع
4
141209
369273
2026-08-29T22:32:19Z
Mairaaaa
11051
/* */
369273
wikitext
text/x-wiki
angsa
==Bahasa {{bahasa|ar}}==
===Kata nama===
{{inti|ar|kata nama}}
# {{label|1=ar|2=dialek|3=Johor}} contoh
33ppvpcfcjq6ptvjs287ts75trqhpuc
Wikikamus:ar/الدببة
4
141210
369274
2026-08-29T22:33:08Z
Mairaaaa
11051
/* */
369274
wikitext
text/x-wiki
beruang
==Bahasa {{bahasa|ar}}==
===Kata nama===
{{inti|ar|kata nama}}
# {{label|1=ar|2=dialek|3=Johor}} contoh
2fxqylird9ribdncsgiyn2snszthlze
Wikikamus:ar/الغزلان
4
141211
369275
2026-08-29T22:33:37Z
Mairaaaa
11051
/* */
369275
wikitext
text/x-wiki
rusa
==Bahasa {{bahasa|ar}}==
===Kata nama===
{{inti|ar|kata nama}}
# {{label|1=ar|2=dialek|3=Johor}} contoh
e7ozsskafw2mjlyjb2epzy3acipby5x
Wikikamus:ar/الذئب
4
141212
369276
2026-08-29T22:33:59Z
Mairaaaa
11051
/* */
369276
wikitext
text/x-wiki
serigala
==Bahasa {{bahasa|ar}}==
===Kata nama===
{{inti|ar|kata nama}}
# {{label|1=ar|2=dialek|3=Johor}} contoh
pe7yez82t4f4s5gdmtn6jtf9hu3iuw8
Wikikamus:ar/ابن عرس
4
141213
369277
2026-08-29T22:34:37Z
Mairaaaa
11051
/* */
369277
wikitext
text/x-wiki
Serigala
==Bahasa {{bahasa|ar}}==
===Kata nama===
{{inti|ar|kata nama}}
# {{label|1=ar|2=dialek|3=Johor}} contoh
9gvzvp9dbdhjxwr550ykku1453x9tqr
Kategori:Nama diri lelaki bahasa Arab
14
141214
369283
2026-08-30T04:15:17Z
Hakimi97
2668
Mencipta laman baru dengan kandungan '{{auto cat}}'
369283
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
junay
0
141215
369286
2026-08-30T04:49:09Z
~2026-46834-50
11290
Mencipta laman baru dengan kandungan '==Bahasa Suluk== ====Kata nama==== {{inti|tsg|kata nama}} # [[nasi]] berempah dengan pewarna kunig dibungkus dengan daun pisang {{C|tsg|Makanan}}'
369286
wikitext
text/x-wiki
==Bahasa Suluk==
====Kata nama====
{{inti|tsg|kata nama}}
# [[nasi]] berempah dengan pewarna kunig dibungkus dengan daun pisang
{{C|tsg|Makanan}}
f629rkdxmcffjntlpxj8c1vby7mxnm5
kaagi
0
141216
369287
2026-08-30T04:51:45Z
~2026-46834-50
11290
Mencipta laman baru dengan kandungan '==Bahasa Suluk== ====Kata nama==== {{inti|tsg|kata nama}} # [[cara]] # [[kaedah]] ===Etimologi=== Daripada {{af|tsg|ka-|agi}}.'
369287
wikitext
text/x-wiki
==Bahasa Suluk==
====Kata nama====
{{inti|tsg|kata nama}}
# [[cara]]
# [[kaedah]]
===Etimologi===
Daripada {{af|tsg|ka-|agi}}.
rxwzw4cqqtii1uiv9njgqw98abai9to
inuman
0
141217
369288
2026-08-30T04:57:48Z
~2026-46834-50
11290
Mencipta laman baru dengan kandungan '==Bahasa Suluk== ====Kata nama==== {{inti|tsg|kata nama}} # [[sarapan]] #: {{ux|tsg|Unu in '''inuman''' ta mahinaat ini?|t=Apakah '''sarapan''' kita pagi ini?}} ===Erimologi=== Daropada {{af|tsg|inum|-an}}.'
369288
wikitext
text/x-wiki
==Bahasa Suluk==
====Kata nama====
{{inti|tsg|kata nama}}
# [[sarapan]]
#: {{ux|tsg|Unu in '''inuman''' ta mahinaat ini?|t=Apakah '''sarapan''' kita pagi ini?}}
===Erimologi===
Daropada {{af|tsg|inum|-an}}.
poflfp3r9c33ki2s26hk4ame3tufk9t
Wikikamus:ja/辞典
4
141218
369290
2026-08-30T05:04:39Z
SNN95
2113
Mencipta laman baru dengan kandungan '==Bahasa {{bahasa|{{safesubst:ROOTPAGENAME}}}}== {{ja-kanjitab|じ|てん|yomi=o}} {{ja-kanjitab|ことば|てん|yomi=ko}} ===Sebutan=== {{ja-pron|じてん|acc=0|acc_ref=NHK,DJR,SMK5}} * {{homophone|ja|字典|事典|sort=してん'}} {{ja-pron|ことばてん}} ===Kata nama=== {{ja-noun|じてん|ことばてん}} # sebuah [[kamus]] ====Nota penggunaan==== {{wp|Kamus bahasa Jepun}} * Bahasa Jepun mempunyai perkataan diterjemah sebagai “kamus”...'
369290
wikitext
text/x-wiki
==Bahasa {{bahasa|ja}}==
{{ja-kanjitab|じ|てん|yomi=o}}
{{ja-kanjitab|ことば|てん|yomi=ko}}
===Sebutan===
{{ja-pron|じてん|acc=0|acc_ref=NHK,DJR,SMK5}}
* {{homophone|ja|字典|事典|sort=してん'}}
{{ja-pron|ことばてん}}
===Kata nama===
{{ja-noun|じてん|ことばてん}}
# sebuah [[kamus]]
====Nota penggunaan====
{{wp|Kamus bahasa Jepun}}
* Bahasa Jepun mempunyai perkataan diterjemah sebagai “kamus” di Wikipedia Bahasa Melayu; lihat {{w|kamus bahasa Jepun}} di Wikipedia.
* {{lang|ja|辞典}} digunakan (bersama-sama dengan {{ja-r|辞書|じしょ}}) untuk membawa maksud "kamus" sama seperti pengertian "leksikon" dalam Bahasa Melayu, serta secara lebih meluas untuk merujuk kepada buku-buku kata yang lain seperti
*: {{ja-r|類語辞典|るいご じてん}}: tesaurus dan
*: {{ja-r|文法辞典|ぶんぽう じてん}}: buku tatabahasa, antara lain.
Bacaan {{ja-r|ことばてん}} digunakan untuk membezakan {{ja-r|事%典|じ%てん|ensiklopedia}} dan {{ja-r|字%典|じ%てん|kamus aksara kanji}}.
====Sinonim====
{{col2|ja
|{{ja-r|辞書|じしょ}}
|{{ja-r|辞林|じりん}}
|{{ja-r|字引|じびき}}
|{{ja-r|辞彙|じ.い}}
}}
====Istilah terbitan====
{{col|ja
|{{ja-r|英%和 辞%典|えい%わ じ%てん}}
|{{ja-r|英英 辞%典|えいえい じ%てん}}
|{{ja-r|露和 辞%典|ろわ じ%てん}}
|{{ja-r|漢%和 辞%典|かん%わ じ%てん}}
|{{ja-r|国%語 辞%典|こく%ご じ%てん}}
|{{ja-r|大%辞%典|だい%じ%てん}}
|{{ja-r|仏%和 辞%典|ふつ%わ じ%てん}}
|{{ja-r|文法 辞%典|ぶんぽう じ%てん}}: buku tatabahasa
|{{ja-r|類%語 辞%典|るい%ご じ%てん}}: tesaurus
|{{ja-r|和%英 辞%典|わ%えい じ%てん}}
|{{ja-r|和%独 辞%典|わ%どく じ%てん}}
|{{ja-r|和%仏 辞%典|わ%ふつ じ%てん}}
|{{ja-r|和露 辞%典|わろ じ%てん}}
}}
====Istilah berkaitan====
* {{ja-r|事典|じてん}}: ensiklopedia
* {{ja-r|字典|じてん}}: kamus aksara
====Kata turunan====
* {{desc|ami|citing|bor=1}}
* {{desc|ckv|ziting|bor=1}}
* {{desc|szy|zitin|bor=1}}
* {{desc|tsu|ziten|bor=1}}
8dm08tsmmwdlbk5adavhji4hexujznn
369306
369290
2026-08-30T06:38:20Z
SNN95
2113
/* Bahasa {{bahasa|ja}} */
369306
wikitext
text/x-wiki
==Bahasa {{bahasa|ja}}==
{{ja-kanjitab|じ|てん|yomi=o}}
{{ja-kanjitab|ことば|てん|yomi=ko}}
===Sebutan===
{{ja-pron|じてん|acc=0|acc_ref=NHK,DJR,SMK5}}
* {{homophone|ja|字典|事典|sort=してん'}}
{{ja-pron|ことばてん}}
===Kata nama===
{{ja-noun|じてん|ことばてん}}
# sebuah [[kamus]]
====Nota penggunaan====
{{wp|Kamus bahasa Jepun}}
* Bahasa Jepun mempunyai perkataan diterjemah sebagai “kamus” di Wikipedia Bahasa Melayu; lihat {{w|kamus bahasa Jepun}} di Wikipedia.
* {{lang|ja|辞典}} digunakan (bersama-sama dengan {{ja-r|辞書|じしょ}}) untuk membawa maksud "kamus" sama seperti pengertian "leksikon" dalam Bahasa Melayu, serta secara lebih meluas untuk merujuk kepada buku-buku kata yang lain seperti
*: {{ja-r|類語辞典|るいご じてん}}: tesaurus dan
*: {{ja-r|文法辞典|ぶんぽう じてん}}: buku tatabahasa, antara lain.
Bacaan {{ja-r|ことばてん}} digunakan untuk membezakan {{ja-r|事%典|じ%てん|ensiklopedia}} dan {{ja-r|字%典|じ%てん|kamus aksara kanji}}.
====Sinonim====
{{col2|ja
|{{ja-r|辞書|じしょ}}
|{{ja-r|辞林|じりん}}
|{{ja-r|字引|じびき}}
|{{ja-r|辞彙|じ.い}}
}}
====Istilah terbitan====
{{col|ja
|{{ja-r|英%和 辞%典|えい%わ じ%てん}}
|{{ja-r|英英 辞%典|えいえい じ%てん}}
|{{ja-r|露和 辞%典|ろわ じ%てん}}
|{{ja-r|漢%和 辞%典|かん%わ じ%てん}}
|{{ja-r|国%語 辞%典|こく%ご じ%てん}}
|{{ja-r|大%辞%典|だい%じ%てん}}
|{{ja-r|仏%和 辞%典|ふつ%わ じ%てん}}
|{{ja-r|文法 辞%典|ぶんぽう じ%てん}}: buku tatabahasa
|{{ja-r|類%語 辞%典|るい%ご じ%てん}}: tesaurus
|{{ja-r|和%英 辞%典|わ%えい じ%てん}}
|{{ja-r|和%独 辞%典|わ%どく じ%てん}}
|{{ja-r|和%仏 辞%典|わ%ふつ じ%てん}}
|{{ja-r|和露 辞%典|わろ じ%てん}}
}}
====Istilah berkaitan====
* {{ja-r|事典|じてん}}: ensiklopedia
* {{ja-r|字典|じてん}}: kamus aksara
====Kata turunan====
* {{desc|ami|citing|bor=1}}
* {{desc|ckv|ziting|bor=1}}
* {{desc|szy|zitin|bor=1}}
* {{desc|tsu|ziten|bor=1}}
===Liha juga===
* Bahasa Korea: {{ko-l|辭典|사전}}
* Bahasa Vietnam: {{vi-l|từ điển|辭典}}
===Rujukan===
{{reflist}}
:* {{R:Kanjipedia Kotoba|0002888800}}
{{C|ja|Kamus|sort=してん'}}
b5emnh6anplk23snaadnbb24ph666yc
mainum
0
141219
369291
2026-08-30T05:04:43Z
~2026-46834-50
11290
Mencipta laman baru dengan kandungan '==Bahasa Suluk== ====Kata sifat==== {{inti|tsg|kata sifat}} # boleh diminum #: {{ux|tsg|Di' '''mainum''' in tubig ha gripu yan.|t=Air di dalam kepala paip itu tak '''boleh diminum'''.}} ===Etimologi=== Daripada {{af|tsg|ma-|inum}}.'
369291
wikitext
text/x-wiki
==Bahasa Suluk==
====Kata sifat====
{{inti|tsg|kata sifat}}
# boleh diminum
#: {{ux|tsg|Di' '''mainum''' in tubig ha gripu yan.|t=Air di dalam kepala paip itu tak '''boleh diminum'''.}}
===Etimologi===
Daripada {{af|tsg|ma-|inum}}.
3vw7u5e0shlzw827cu8qhnvdckviips
369294
369291
2026-08-30T05:56:53Z
~2026-46834-50
11290
/* Etimologi */
369294
wikitext
text/x-wiki
==Bahasa Suluk==
====Kata sifat====
{{inti|tsg|kata sifat}}
# boleh diminum
#: {{ux|tsg|Di' '''mainum''' in tubig ha gripu yan.|t=Air di dalam kepala paip itu tak '''boleh diminum'''.}}
===Etimologi===
Daripada {{af|tsg|ma-|inum}}. Banding dengan {{cog|ceb|mainom}} & {{cog|tl|mainom}}.
sbe427jfg50u543uikgl84r1vksjjhv
辞典
0
141220
369292
2026-08-30T05:05:29Z
SNN95
2113
Mencipta laman baru dengan kandungan '{{Wikikamus:ja/{{PAGENAME}}}}'
369292
wikitext
text/x-wiki
{{Wikikamus:ja/{{PAGENAME}}}}
sb7csf5px5grg0rwddz8ydp556prnd8
369305
369292
2026-08-30T06:34:24Z
SNN95
2113
369305
wikitext
text/x-wiki
{{also|辭典}}
{{Wikikamus:zh/{{PAGENAME}}}}
{{Wikikamus:ja/{{PAGENAME}}}}
g5abgcquwkfgl77jlw70dxuahryrfmf
pag'iinuman
0
141221
369293
2026-08-30T05:19:51Z
~2026-46834-50
11290
Mencipta laman baru dengan kandungan '==Bahasa Suluk== [[File:Chiang Mai bars at night-KayEss-1.jpeg|thumb|In manga magtutulak-tulak limingkud ha guwa' sin '''pag'iinuman''' ha Chiang Mai, Taylan.— Para pelancong duduk luar '''bar''' di Chiang Mai, Thailand.]] ====Kata nama==== {{inti|tsg|kata nama}} # [[bar]]; [[tempat minum]]; [[kedai minum]] ===Etimologi=== Daripada {{af|tsg|inum|pag- -an}} dengan penggandaan separa.'
369293
wikitext
text/x-wiki
==Bahasa Suluk==
[[File:Chiang Mai bars at night-KayEss-1.jpeg|thumb|In manga magtutulak-tulak limingkud ha guwa' sin '''pag'iinuman''' ha Chiang Mai, Taylan.— Para pelancong duduk luar '''bar''' di Chiang Mai, Thailand.]]
====Kata nama====
{{inti|tsg|kata nama}}
# [[bar]]; [[tempat minum]]; [[kedai minum]]
===Etimologi===
Daripada {{af|tsg|inum|pag- -an}} dengan penggandaan separa.
4toxv2vuox943zqn9qaksci9ub90j2b
kakaun
0
141222
369296
2026-08-30T06:05:25Z
~2026-46834-50
11290
Mencipta laman baru dengan kandungan '==Bahasa Suluk== ===Kata nama=== {{inti|tsg|kata nama}} # {{syn of|tsg|pagkaun|t=makanan}} ===Etimologi=== Daripada penggandaan separa kata {{l|tsg|kaun}}.'
369296
wikitext
text/x-wiki
==Bahasa Suluk==
===Kata nama===
{{inti|tsg|kata nama}}
# {{syn of|tsg|pagkaun|t=makanan}}
===Etimologi===
Daripada penggandaan separa kata {{l|tsg|kaun}}.
lij6g9m995jbaqpurpr2rn205plvyo2
muskitiru
0
141223
369297
2026-08-30T06:08:39Z
~2026-46834-50
11290
Mencipta laman baru dengan kandungan '==Bahasa Suluk== ====Kata nama==== {{inti|tsg|kata nama}} {{tlb|tsg|Filipina}} # [[kelambu]] #: {{syn|tsg|kulambu'}} ===Etimologi=== {{bor+|tsg|es,cbk|mosquitero}}.'
369297
wikitext
text/x-wiki
==Bahasa Suluk==
====Kata nama====
{{inti|tsg|kata nama}} {{tlb|tsg|Filipina}}
# [[kelambu]]
#: {{syn|tsg|kulambu'}}
===Etimologi===
{{bor+|tsg|es,cbk|mosquitero}}.
q5ms0ip3n2d16fn0jzawp14oe0ucdwh
kulambu'
0
141224
369298
2026-08-30T06:11:06Z
~2026-46834-50
11290
Mencipta laman baru dengan kandungan '==Bahasa Suluk== ====Kata jama==== {{inti|tsg|kata nama}} # [[kelambu]] ===Etimologi=== {{bor+|tsg|ms|kelambu}}.'
369298
wikitext
text/x-wiki
==Bahasa Suluk==
====Kata jama====
{{inti|tsg|kata nama}}
# [[kelambu]]
===Etimologi===
{{bor+|tsg|ms|kelambu}}.
pweasww6kev4dgbnpnc6x8m5exhoeis
369299
369298
2026-08-30T06:11:46Z
~2026-46834-50
11290
/* Kata jama */
369299
wikitext
text/x-wiki
==Bahasa Suluk==
====Kata jama====
{{inti|tsg|kata nama}}
# [[kelambu]]
#: {{syn|tsg|muskitiru<ll:Filipina>}}
===Etimologi===
{{bor+|tsg|ms|kelambu}}.
bt6d5dcq6emnnsvihtx4n885vttphmh
magsulay
0
141225
369301
2026-08-30T06:27:58Z
~2026-47210-99
11292
Mencipta laman baru dengan kandungan '==Bahasa Suluk== ====Kata kerja==== {{inti|tsg|kata kerja}} # [[mencuba]] ===Etimologi=== Daripada {{af|tsg|mag-|sulay}}.'
369301
wikitext
text/x-wiki
==Bahasa Suluk==
====Kata kerja====
{{inti|tsg|kata kerja}}
# [[mencuba]]
===Etimologi===
Daripada {{af|tsg|mag-|sulay}}.
st2pntet1g6uh5gkb7ofdm4fe6axt9c
pagsulay
0
141226
369302
2026-08-30T06:29:30Z
~2026-47210-99
11292
Mencipta laman baru dengan kandungan '==Bahasa Suluk== ====Kata nama==== {{inti|tsg|kata nama}} # [[percubaan]] ===Etimologi=== Daripada {{af|tsg|pag-|sulay}}.'
369302
wikitext
text/x-wiki
==Bahasa Suluk==
====Kata nama====
{{inti|tsg|kata nama}}
# [[percubaan]]
===Etimologi===
Daripada {{af|tsg|pag-|sulay}}.
5v8kbf0ptl8oiie33iyeki29zfzodnp
369303
369302
2026-08-30T06:30:04Z
~2026-47210-99
11292
/* Kata nama */
369303
wikitext
text/x-wiki
==Bahasa Suluk==
====Kata nama====
{{inti|tsg|kata nama}}
# [[percubaan]]
# perbuatan mencuba
===Etimologi===
Daripada {{af|tsg|pag-|sulay}}.
1tvhur3st7l1mtiddhj0d8ljpquhyjh
Wikikamus:zh/辞典
4
141227
369304
2026-08-30T06:31:45Z
SNN95
2113
Mencipta laman baru dengan kandungan '==Bahasa {{bahasa|{{safesubst:ROOTPAGENAME}}}}== {{zh-see|辭典}}'
369304
wikitext
text/x-wiki
==Bahasa {{bahasa|zh}}==
{{zh-see|辭典}}
8mw0vn7rhdm08d103w71hdkrsgnwqd1
Wikikamus:dtp/butul
4
141228
369311
2026-08-30T07:37:26Z
Lynumiss
5957
Mencipta laman baru dengan kandungan '==Bahasa {{bahasa|{{safesubst:ROOTPAGENAME}}}}== ===Kata nama=== {{inti|{{safesubst:ROOTPAGENAME}}|kata nama}} # botol{{cp|dtp|Agayo ilo '''butul''' do waig.|'''[[Botol]]''' air itu besar.}}'
369311
wikitext
text/x-wiki
==Bahasa {{bahasa|dtp}}==
===Kata nama===
{{inti|dtp|kata nama}}
# botol{{cp|dtp|Agayo ilo '''butul''' do waig.|'''[[Botol]]''' air itu besar.}}
0wbgrabek3vvnmdjf3ufejvy4fh3a8h
Wikikamus:dtp/tangkus
4
141229
369315
2026-08-30T08:01:21Z
Ft btysio18
8236
Mencipta laman baru dengan kandungan '==Bahasa {{bahasa|{{safesubst:ROOTPAGENAME}}}}== ===Kata kerja=== {{inti|{{safesubst:ROOTPAGENAME}}|kata kerja}} # {{label|1={{safesubst:ROOTPAGENAME}}|2=Bundu Liwan|3=Malaysia}} lari{{cp|dtp|'''Tangkus''' nopo ilo tasu nokorongou kobong.|Anjing itu '''[[lari]]''' selepas mendengar letupan.}}'
369315
wikitext
text/x-wiki
==Bahasa {{bahasa|dtp}}==
===Kata kerja===
{{inti|dtp|kata kerja}}
# {{label|1=dtp|2=Bundu Liwan|3=Malaysia}} lari{{cp|dtp|'''Tangkus''' nopo ilo tasu nokorongou kobong.|Anjing itu '''[[lari]]''' selepas mendengar letupan.}}
a4ble4gvxr0dscy1bxdndkzqm8f369t
Wikikamus:ar/مروحة السقف
4
141230
369321
2026-08-30T09:01:35Z
Mairaaaa
11051
/* */
369321
wikitext
text/x-wiki
kipas siling
==Bahasa {{bahasa|ar}}==
===Kata nama===
{{inti|ar|kata nama}}
# {{label|1=ar|2=dialek|3=Johor}} contoh
jepbrewcw4w88pjnxbeyf8nf5lzyopp
Wikikamus:ar/مصباح الزيت
4
141231
369322
2026-08-30T09:02:18Z
Mairaaaa
11051
/* */
369322
wikitext
text/x-wiki
lampu minyak
==Bahasa {{bahasa|ar}}==
===Kata nama===
{{inti|ar|kata nama}}
# {{label|1=ar|2=dialek|3=Johor}} contoh
s1wkwe39ck7grw99m4tombuszwkmkjh
Wikikamus:ar/الخنزير
4
141232
369323
2026-08-30T09:02:57Z
Mairaaaa
11051
/* */
369323
wikitext
text/x-wiki
babi/khinzir
==Bahasa {{bahasa|ar}}==
===Kata nama===
{{inti|ar|kata nama}}
# {{label|1=ar|2=dialek|3=Johor}} contoh
g2zk98c5ushwdov8fs4o48w9e4id9r7
Wikikamus:ar/أدوات التعبئة
4
141233
369324
2026-08-30T09:03:41Z
Mairaaaa
11051
/* */
369324
wikitext
text/x-wiki
alat mengikir
==Bahasa {{bahasa|ar}}==
===Kata nama===
{{inti|ar|kata nama}}
# {{label|1=ar|2=dialek|3=Johor}} contoh
5905gewr3j2rzls8atpmnzuh74jpi7i
Wikikamus:ar/آلة المخرطة
4
141234
369325
2026-08-30T09:04:16Z
Mairaaaa
11051
/* */
369325
wikitext
text/x-wiki
mesin pelarik
==Bahasa {{bahasa|ar}}==
===Kata nama===
{{inti|ar|kata nama}}
# {{label|1=ar|2=dialek|3=Johor}} contoh
csgsaoygy6egprkq36g91dteu5dtr9t