Wikikamus
mswiktionary
https://ms.wiktionary.org/wiki/Wikikamus:Laman_Utama
MediaWiki 1.47.0-wmf.3
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
Templat:CategoryTOChiragana
10
4435
343017
24969
2026-05-19T12:15:14Z
EmausBot
3738
Memperbetulkan pelencongan berganda ke [[Templat:Hira-categoryTOC]]
343017
wikitext
text/x-wiki
#LENCONG [[Templat:Hira-categoryTOC]]
7o0ru8id3f1otfs3j2vapmciu3or1ct
Wikikamus:Penyelia/Permohonan
4
5269
343020
343015
2026-05-19T14:27:03Z
PeaceSeekers
3334
/* Rulwarih (Perbincangan - Sumbangan) 2 */ Balas
343020
wikitext
text/x-wiki
{{penyelia}}
Setiap pengguna aktif Wiktionary yang mengetahui tentang [[Wiktionary:Polisi dan garis panduan|peraturan serta dasar Wiktionary]], serta memiliki keinginan untuk memajukan Wiktionary layak untuk memohon menjadi seorang penyelia.
== Syarat menjadi penyelia ==
Syarat-syarat berikut harus dipenuhi seorang pengguna boleh menjadi calon penyelia:
* Anda haruslah mengetahui selok belok Wiktionary seperti ruang nama, templat, kategori dan interwiki.
* Alamat e-mel (surat elektronik) hendaklah diaktifkan dan tepat.
* Anda telah menyunting di Wiktionary minimum selama tiga bulan.
* Jumlah suntingan anda mencapai 500. Kepelbagaian serta kualiti suntingan juga merupakan faktor.
* Anda aktif dalam laman perbincangan/kedai kopi/permohonan pendapat/pengundian dan sebagainya.
* Anda telah turut serta melakukan tugas-tugas seorang penyelia. Misalnya, memperbaiki masukan, menambahkan interwiki, kategori, templat, meletakkan templat "hapus" pada laman yang layak.
* Sekiranya anda dicalonkan oleh pengguna lain, pengusul harus merupakan pengguna berdaftar dan anda harus menyatakan persetujuan di bawah pencalonan tersebut sebelum undi dapat bermula.
* Dipersetujui minimum 70% pengguna berdaftar. Undian 'berkecuali' tidak diambil kira.
'''Nota''': Pengguna berdaftar yang dimaksudkan di atas ialah yang telah mencapai minimum 15 suntingan dan telah berumur seminggu (dari suntingan pertama) '''sebelum''' pengundian bermula serta bukan merupakan pengguna boneka.
=== Langkah ===
* Taipkan nama calon penyelia di bahagian "Permohonan menjadi penyelia" di bawah ini. Jangan lupa untuk menandatangani permohonan anda. Gunakan kod di bawah ini:
<pre>
=== [[Pengguna:Nama Calon|Nama Calon]] ([[Perbincangan pengguna:Nama Calon|Perbincangan]] - [[Khas:Sumbangan/Nama Calon|Sumbangan]]) ===
* Saya ingin [memohon|mencalonkan Nama Calon] untuk menjadi penyelia. ~~~~
</pre>
* Sekiranya layak, penyelia akan memindahkannya ke [[Wiktionary:Penyelia/Pengundian|laman pengundian]].
* Pengundian dijalankan selama dua minggu.
* Sekiranya berjaya, permohonan tersebut akan dimajukan ke [[m:Requests for permissions|meta]].
'''Catatan''': Pengguna yang kelihatan sememangnya tidak layak menjadi penyelia dan tidak memenuhi syarat-syarat di atas, permohonannya akan ditolak terus.
== Permohonan menjadi penyelia ==
{{Special:Prefixindex/Wiktionary:Penyelia/Pengundian/}}
=== [[Pengguna:Ultron90|Ultron90]] ([[Perbincangan pengguna:Ultron90|Perbincangan]] - [[Khas:Sumbangan/Ultron90|Sumbangan]]) ===
* Saya ingin memohon untuk pelanjutan hak sebagai penyelia. [[Pengguna:Ultron90|Ultron90]] ([[Perbincangan pengguna:Ultron90|bincang]]) 11:57, 26 Oktober 2025 (UTC)
*:[[Wikikamus:Penyelia/Pengundian/Ultron90 untuk penyelia 26 Oktober 2025|Permohonan diluluskan]]. [[Pengguna:PeaceSeekers|PeaceSeekers]] ([[Perbincangan pengguna:PeaceSeekers|bincang]]) 12:38, 26 Oktober 2025 (UTC)
=== [[Pengguna:Rombituon|Rombituon]] ([[Perbincangan pengguna:Rombituon|Perbincangan]] - [[Khas:Sumbangan/Rombituon|Sumbangan]]) ===
* Saya ingin mencalonkan {{U|Rombituon}} untuk pelanjutan hak sebagai penyelia. [[Pengguna:Ultron90|Ultron90]] ([[Perbincangan pengguna:Ultron90|bincang]]) 11:57, 26 Oktober 2025 (UTC)
*:[[Wikikamus:Penyelia/Pengundian/Rombituon untuk penyelia 26 Oktober 2025|Permohonan diluluskan]]. [[Pengguna:PeaceSeekers|PeaceSeekers]] ([[Perbincangan pengguna:PeaceSeekers|bincang]]) 12:39, 26 Oktober 2025 (UTC)
=== [[Pengguna:Rulwarih|Rulwarih]] ([[Perbincangan pengguna:Rulwarih|Perbincangan]] - [[Khas:Sumbangan/Rulwarih|Sumbangan]]) ===
* Saya ingin memohon untuk menjadi penyelia. [[Pengguna:Rulwarih|Rulwarih]] ([[Perbincangan pengguna:Rulwarih|bincang]]) 21:43, 31 Oktober 2025 (UTC)
*:[[Wikikamus:Penyelia/Pengundian/Rulwarih untuk penyelia 3 November 2025|Permohonan diluluskan]]. [[Pengguna:PeaceSeekers|PeaceSeekers]] ([[Perbincangan pengguna:PeaceSeekers|bincang]]) 02:07, 3 November 2025 (UTC)
=== [[Pengguna:EmpAhmadK|EmpAhmadK]] ([[Perbincangan pengguna:v|Perbincangan]] - [[Khas:Sumbangan/EmpAhmadK|Sumbangan]]) ===
* Saya ingin memohon untuk menjadi penyelia dan penyelia antara muka. [[Pengguna:EmpAhmadK|EmpAhmadK]] ([[Perbincangan pengguna:EmpAhmadK|bincang]]) 19:39, 14 April 2026 (UTC)
=== [[Pengguna:Rulwarih|Rulwarih]] ([[Perbincangan pengguna:Rulwarih|Perbincangan]] - [[Khas:Sumbangan/Rulwarih|Sumbangan]]) ===
* Saya ingin memohon untuk menjadi penyelia untuk tempoh sekurang-kurangnya satu tahun. Terima kasih. [[Pengguna:Rulwarih|Rulwarih]] ([[Perbincangan pengguna:Rulwarih|bincang]]) 05:28, 19 Mei 2026 (UTC)
*:[https://ms.wiktionary.org/wiki/Wikikamus:Penyelia/Pengundian/Rulwarih_untuk_penyelia_19_Mei_2026 Diluluskan]. [[Pengguna:PeaceSeekers|PeaceSeekers]] ([[Perbincangan pengguna:PeaceSeekers|bincang]]) 14:27, 19 Mei 2026 (UTC)
[[Kategori:Penyeliaan Wikikamus|Penyelia/Permohonan]]
95xy0nlkaw4vwmiad37apy7zno7onix
343031
343020
2026-05-19T14:43:54Z
PeaceSeekers
3334
/* EmpAhmadK (Perbincangan - Sumbangan) */ Balas
343031
wikitext
text/x-wiki
{{penyelia}}
Setiap pengguna aktif Wiktionary yang mengetahui tentang [[Wiktionary:Polisi dan garis panduan|peraturan serta dasar Wiktionary]], serta memiliki keinginan untuk memajukan Wiktionary layak untuk memohon menjadi seorang penyelia.
== Syarat menjadi penyelia ==
Syarat-syarat berikut harus dipenuhi seorang pengguna boleh menjadi calon penyelia:
* Anda haruslah mengetahui selok belok Wiktionary seperti ruang nama, templat, kategori dan interwiki.
* Alamat e-mel (surat elektronik) hendaklah diaktifkan dan tepat.
* Anda telah menyunting di Wiktionary minimum selama tiga bulan.
* Jumlah suntingan anda mencapai 500. Kepelbagaian serta kualiti suntingan juga merupakan faktor.
* Anda aktif dalam laman perbincangan/kedai kopi/permohonan pendapat/pengundian dan sebagainya.
* Anda telah turut serta melakukan tugas-tugas seorang penyelia. Misalnya, memperbaiki masukan, menambahkan interwiki, kategori, templat, meletakkan templat "hapus" pada laman yang layak.
* Sekiranya anda dicalonkan oleh pengguna lain, pengusul harus merupakan pengguna berdaftar dan anda harus menyatakan persetujuan di bawah pencalonan tersebut sebelum undi dapat bermula.
* Dipersetujui minimum 70% pengguna berdaftar. Undian 'berkecuali' tidak diambil kira.
'''Nota''': Pengguna berdaftar yang dimaksudkan di atas ialah yang telah mencapai minimum 15 suntingan dan telah berumur seminggu (dari suntingan pertama) '''sebelum''' pengundian bermula serta bukan merupakan pengguna boneka.
=== Langkah ===
* Taipkan nama calon penyelia di bahagian "Permohonan menjadi penyelia" di bawah ini. Jangan lupa untuk menandatangani permohonan anda. Gunakan kod di bawah ini:
<pre>
=== [[Pengguna:Nama Calon|Nama Calon]] ([[Perbincangan pengguna:Nama Calon|Perbincangan]] - [[Khas:Sumbangan/Nama Calon|Sumbangan]]) ===
* Saya ingin [memohon|mencalonkan Nama Calon] untuk menjadi penyelia. ~~~~
</pre>
* Sekiranya layak, penyelia akan memindahkannya ke [[Wiktionary:Penyelia/Pengundian|laman pengundian]].
* Pengundian dijalankan selama dua minggu.
* Sekiranya berjaya, permohonan tersebut akan dimajukan ke [[m:Requests for permissions|meta]].
'''Catatan''': Pengguna yang kelihatan sememangnya tidak layak menjadi penyelia dan tidak memenuhi syarat-syarat di atas, permohonannya akan ditolak terus.
== Permohonan menjadi penyelia ==
{{Special:Prefixindex/Wiktionary:Penyelia/Pengundian/}}
=== [[Pengguna:Ultron90|Ultron90]] ([[Perbincangan pengguna:Ultron90|Perbincangan]] - [[Khas:Sumbangan/Ultron90|Sumbangan]]) ===
* Saya ingin memohon untuk pelanjutan hak sebagai penyelia. [[Pengguna:Ultron90|Ultron90]] ([[Perbincangan pengguna:Ultron90|bincang]]) 11:57, 26 Oktober 2025 (UTC)
*:[[Wikikamus:Penyelia/Pengundian/Ultron90 untuk penyelia 26 Oktober 2025|Permohonan diluluskan]]. [[Pengguna:PeaceSeekers|PeaceSeekers]] ([[Perbincangan pengguna:PeaceSeekers|bincang]]) 12:38, 26 Oktober 2025 (UTC)
=== [[Pengguna:Rombituon|Rombituon]] ([[Perbincangan pengguna:Rombituon|Perbincangan]] - [[Khas:Sumbangan/Rombituon|Sumbangan]]) ===
* Saya ingin mencalonkan {{U|Rombituon}} untuk pelanjutan hak sebagai penyelia. [[Pengguna:Ultron90|Ultron90]] ([[Perbincangan pengguna:Ultron90|bincang]]) 11:57, 26 Oktober 2025 (UTC)
*:[[Wikikamus:Penyelia/Pengundian/Rombituon untuk penyelia 26 Oktober 2025|Permohonan diluluskan]]. [[Pengguna:PeaceSeekers|PeaceSeekers]] ([[Perbincangan pengguna:PeaceSeekers|bincang]]) 12:39, 26 Oktober 2025 (UTC)
=== [[Pengguna:Rulwarih|Rulwarih]] ([[Perbincangan pengguna:Rulwarih|Perbincangan]] - [[Khas:Sumbangan/Rulwarih|Sumbangan]]) ===
* Saya ingin memohon untuk menjadi penyelia. [[Pengguna:Rulwarih|Rulwarih]] ([[Perbincangan pengguna:Rulwarih|bincang]]) 21:43, 31 Oktober 2025 (UTC)
*:[[Wikikamus:Penyelia/Pengundian/Rulwarih untuk penyelia 3 November 2025|Permohonan diluluskan]]. [[Pengguna:PeaceSeekers|PeaceSeekers]] ([[Perbincangan pengguna:PeaceSeekers|bincang]]) 02:07, 3 November 2025 (UTC)
=== [[Pengguna:EmpAhmadK|EmpAhmadK]] ([[Perbincangan pengguna:v|Perbincangan]] - [[Khas:Sumbangan/EmpAhmadK|Sumbangan]]) ===
* Saya ingin memohon untuk menjadi penyelia dan penyelia antara muka. [[Pengguna:EmpAhmadK|EmpAhmadK]] ([[Perbincangan pengguna:EmpAhmadK|bincang]]) 19:39, 14 April 2026 (UTC)
*:Diluluskan ([[Wikikamus:Penyelia/Pengundian/EmpAhmadK untuk penyelia 19 Mei 2026|penyelia]], [[Wikikamus:Penyelia/Pengundian/EmpAhmadK untuk penyelia antaramuka 19 Mei 2026|penyelia antaramuka]]) [[Pengguna:PeaceSeekers|PeaceSeekers]] ([[Perbincangan pengguna:PeaceSeekers|bincang]]) 14:43, 19 Mei 2026 (UTC)
=== [[Pengguna:Rulwarih|Rulwarih]] ([[Perbincangan pengguna:Rulwarih|Perbincangan]] - [[Khas:Sumbangan/Rulwarih|Sumbangan]]) ===
* Saya ingin memohon untuk menjadi penyelia untuk tempoh sekurang-kurangnya satu tahun. Terima kasih. [[Pengguna:Rulwarih|Rulwarih]] ([[Perbincangan pengguna:Rulwarih|bincang]]) 05:28, 19 Mei 2026 (UTC)
*:[https://ms.wiktionary.org/wiki/Wikikamus:Penyelia/Pengundian/Rulwarih_untuk_penyelia_19_Mei_2026 Diluluskan]. [[Pengguna:PeaceSeekers|PeaceSeekers]] ([[Perbincangan pengguna:PeaceSeekers|bincang]]) 14:27, 19 Mei 2026 (UTC)
[[Kategori:Penyeliaan Wikikamus|Penyelia/Permohonan]]
ri3jqcnoibx0cequaho9jn0t5ozlfra
doktor
0
6659
343045
337026
2026-05-20T03:29:06Z
Hakimi97
2668
343045
wikitext
text/x-wiki
==Bahasa Melayu==
===Kata nama===
{{ms-kn|j=دوکتور}}
# [[ahli perubatan|Ahli perubatan]], mereka yang terbabit dalam bidang rawatan dan perubatan.
# [[ijazah|Ijazah]] kedoktoran, kelulusan tertinggi dalam dunia kesarjanaan, seperti Ph.D. atau Th.D.
===Etimologi===
Daripada bahasa Inggeris ''doctor'' daripada Latin ''dcotor'' daripada ''doceō'' (ajar).
===Sebutan===
* {{dewan|dok|tor}}
* {{IPA|ms|/dɔkto(r)/}}
* {{rhymes|ms|to(r)|o(r)}}
* {{audio|ms|Ms-MY-doktor.ogg|Audio (MY)}}
===Terjemahan===
{{ter-atas|ahli perubatan}}
* Akan: dɔkota {{n}}
* Arab: {{ARchar|طبيب}} , {{ARchar|طبيبة}} {{f}}
* Aram:
*: Suryani: ܐܣܝܐ (’āsyā’)
*: Ibrani: אסיא (’āsyā’)
* Armenia: բժիշկ (bžišk)
* Belanda: dokter {{mf}}, arts {{mf}}
* Bulgaria: {{Cyrl|доктор}}
* Chechen: лор
* Cina: 醫生, 医生 (yīshēng), 大夫 (dàifū)
* Croatia: liječnik , liječnica {{f}}
* Czech: doktor , lékař
* Denmark: læge, doktor
* Esperanto: kuracisto
* Ewe: ɖɔkta, atikewɔla
* Finland: lääkäri, tohtori
* Gaelik Scot: lighiche , lèigh , dotair
* Georgia: ექიმი (ek‘imi)
* Jerman: Arzt , Ärztin {{f}}, Mediziner , Doktor , Doktorin {{f}}
* Greek: {{Grek|ιατρός}} (iatrós) {{c}}, {{Grek|γιατρός}} (ghiatrós) {{c}}
* Hungary: orvos , doktor , orvosnő {{f}}, doktornő {{f}}
* Ibrani: רופא (rofe) , רופאה (rof'a) {{f}}; דוקטור (doqt'or) (basahan, orang kedua)
* Iceland: læknir , doktor
* Indonesia: dokter
* Inggeris: {{t+|en|doctor}}
* Ireland: [[dochtúir]]
* Itali: [[medico]] , [[dottore]] , dottoressa {{f}}, Dottor (''digunakan sebelum nama orang'')
* Jepun: 医師 (いし, ishi), 医者 (いしゃ, isha)
* Kurdi: {{KUchar|دکتۆر}}
* Latin: medicus , medica {{f}}
* Malta: [[tabib]] , tabiba {{f}}
* Martuthunira: juwayumarta
* Novial: medike
* Perancis: médecin , docteur
* Poland: lekarz , lekarka {{f}}
* Portugis: doutor , doutora {{f}}
* Romania: medic , medică {{f}}, doctor , doctoare {{f}}
* Rusia: {{Cyrl|[[доктор]]}} (dóktor}} , {{Cyrl|[[врач]]}} {vrač)
* Serbia: lekar , lekarka {{f}}, zdravnik , zdravnica {{f}}
* Slovak: doktor , lekár
* Slovenia: zdravnik , zdravnica {{f}}
* Sepanyol: médico , médica {{f}}
* Sweden: doktor, läkare
* Thai: {{THchar|หมอ}} (mŏr), {{THchar|แพทย์}} (pâet), {{THchar|เวช}} (wêt)
* Turki: doktor, hekim, tabip
* Ukraine: {{Cyrl|лікар}}
* Urdu: {{URchar|ڈاکٹر}}
* Vietnam: bác sĩ y khoa
{{ter-bawah}}
{{ter-atas|orang berijazah}}
* Armenia: դոկտոր (doktor)
* Belanda: doctor {{mf}}
* Bulgaria: доктор , лекар , лекарка {{f}}
* Cina: 博士 (bóshì)
* Croatia: doktor , doktorica {{f}}
* Czech: doktor
* Denmark: doktor
* Esperanto: doktoro {{mf}}
* Finland: tohtori
* Gaelik Scot: ollamh
* Georgia: დოქტორი (dok‘tori)
* Greek: διδάκτορας (thithactorás) {{c}}
* Hungary: doktor
* Ibrani: דוקטור (doqt'or)
* Iceland: læknir , doktor
* Indonesia: {{t-|id|doktor|xs=Bahasa Indonesia}}
* Inggeris: {{t+|en|doctor}}
* Itali: dottore , dottoressa {{f}}
* Jepun: 博士 (はくし, hakushi, はかせ, hakase)
* Jerman: Doktor , Doktorin {{f}}
* Kurdi: {{KUchar|دکتۆر}}
* Malta: dottor , dottoressa {{f}}
* Novial: doktore
* Poland: doktor
* Portugis: doutor , doutora {{f}}
* Rusia: {{Cyrl|доктор}} (dóktor)
* Slovak: doktor
* Slovenia: doktor , doktorica {{f}}
* Sweden: doktor
* Thai: {{THchar|ปริญญาเอก}} (bprinyaa èk), {{THchar|ดุษฎีบัณฑิต}} (dòotsàdee bantít)
* Turki: doktor
* Ukraine: {{Cyrl|доктор}}
* Vietnam: tiến sĩ
{{ter-bawah}}
===Terbitan===
* kedoktoran: hal-hal berkenaan ilmu menjadi doktor.
===Tesaurus===
; Sinonim: [[tabib]], [[ahli perubatan]], [[pawang]], [[dukun]], [[bomoh]].
===Pautan luar===
* {{R:PRPM}}
{{C|ms|Pekerjaan|Pekerjaan penjagaan kesihatan|Gelaran}}
jz0kw3zjynsr81ha5nkj5lngyntvy4g
Yunan
0
9276
343024
333868
2026-05-19T14:41:12Z
Hakimi97
2668
343024
wikitext
text/x-wiki
{{Pautan Projek Wikimedia}}
==Bahasa Melayu==
{{wikipedia}}
[[Fail:Yunnan in China (+all claims hatched).svg|thumbnail|Lokasi Yunan]]
===Kata nama===
{{ms-kn}}
# Sebuah wilayah di barat daya negara China.
===Etimologi===
Daripada {{bor|ms|cmn|-}} {{zh-l|鬱南}}.
===Sebutan===
{{dewan|yu|nãn}}
===Tulisan Jawi===
{{ARchar|يونان}}
===Terjemahan===
{{ter-atas|wilayah China}}
* Arab: {{t|ar|يونان|m|tr=yunān}}, {{t|ar|يوننان|m|tr=yunnān}}
* Cina:
*: Hokkien: {{t|nan|雲南}}, {{t|nan|云南|tr=Hûn-lâm}}
*: Mandarin: {{t|cmn|雲南|sc=Hani}}, {{t+|cmn|云南|tr=Yúnnán|sc=Hani}}
* Czech: {{t|cs|Jün-nan}}
* Finland: {{t|fi|Yunnan}}
* Jepun: {{t|ja|雲南|tr=うんなん, Unnan}}
* Korea: {{t|ko|윈난|tr=Winnan|sc=Hang}}
* Macedonia: {{t|mk|Јунан|tr=Júnan|sc=Cyrl}}
* Marathi: {{t|mr|युन्नान|tr=yunnāna|sc=Deva}}
* Portugis: {{t|pt|Yunnan|m}}, {{t|pt|Iunã|m}}
* Rusia: {{t|ru|Юньна́нь|m}}
* Sepanyol: {{t+|es|Yunnan}}
* Sweden: {{t+|sv|Yunnan|n}}
* Vietnam: {{t+|vi|Vân Nam}}
{{ter-bawah}}
==Bahasa Tatar==
====Kata nama khas====
# Orang Greek.
====Kata sifat====
# Berkaitan dengan negara Greece atau orang Greek.
[[Kategori:Kata nama khas bahasa Tatar]]
[[Kategori:Kata sifat bahasa Tatar]]
==Bahasa Turki==
{{wikipedia|lang=tr}}
====Kata nama khas====
{{head|tr|kata nama khas}}
# Orang [[Yunani]] atau [[Greece]].
====Kata sifat====
{{head|tr|kata sifat}}
# Berkaitan dengan Yunani atau Greece.
===Tesaurus===
; Sinonim: [[Yunanistanlı]], [[palikarya]].
===Sebutan===
* {{IPA|tr|[juˈnɑn]}}
* {{hyphenation|tr|Yu|nan}}
{{C|tr|Kewarganegaraan}}
euptml7aryunz69eekr59zgzz7yqpii
Modul:category tree/topic
828
11518
343056
244150
2026-05-20T05:20:11Z
Hakimi97
2668
Enable [[:Kategori:en:Bahasa Korea]] pattern
343056
Scribunto
text/plain
local raw_handlers = {}
local raw_categories = {}
--[=[
This module implements the topic category subsystem. It is currently implemented with a single raw handler that
handlers both language-specific and umbrella topic categories, and a corresponding handler for thesaurus categories.
The topmost topic category [[:Category:All topics]] is special and potentially could be handled as a separate raw
category, but currently it's handled as part of the raw topic handler. The topmost thesaurus category
[[:Category:Thesaurus]] is in fact handled as a raw category.
]=]
local functions_module = "Module:fun"
local labels_utilities_module = "Module:labels/utilities"
local languages_module = "Module:languages"
local string_pattern_escape_module = "Module:string/patternEscape"
local string_replacement_escape_module = "Module:string/replacementEscape"
local string_utilities_module = "Module:string utilities"
local table_module = "Module:table"
local topic_data_module = "Module:category tree/topic/data"
local topic_utilities_module = "Module:category tree/topic/utilities"
local thesaurus_data_module = "Module:category tree/topic/thesaurus data"
local concat = table.concat
local insert = table.insert
local dump = mw.dumpObject
local is_callable = require(functions_module).is_callable
local pattern_escape = require(string_pattern_escape_module)
local replacement_escape = require(string_replacement_escape_module)
local split = require(string_utilities_module).split
local type_data = {
["berkenaan"] = {
prefix = "Istilah",
desc = "berkenaan",
additional = "'''NOTA''': Ini merupakan kategori \"berkenaan\". Ia sepatutnya mengandungi istilah " ..
"berkenaan {{{topic}}}. Elak dari menambah istilah yang ada hubungan seleweng dengan {{{topic}}}. " ..
"Berhati-hati dengan istilah jenis atau kejadian topik yang selalunya masuk dalam kategori berasingan.",
},
set = {
prefix = "Istilah",
desc = "untuk jenis atau keadaan",
additional = "'''NOTA''': Ini merupakan kategori set. Ia sepatutnya mengandungi istilah untuk {{{topic}}}, " ..
"bukan sekadar istilah berkaitan {{{topic}}}. Ia mungkin mengandungi lebih banyak istilah umum (seperti jenis " ..
"{{{topic}}}) atau lebih banyak istilah spesifik (seperti nama {{{topic}}} spesifik), walau mungkin terdapat "..
"kategori berkenaan khusus untuk istilah-istilah tersebut.",
},
nama = {
prefix = "Nama-nama dalam",
desc = "secara spesifik berkaitan ",
additional = "'''NOTA''': Ini merupakan kategori nama. Ia sepatutnya mengandungi nama {{{topic}}} khusus, " ..
"bukannya sekadar istilah berkenaan {{{topic}}}, dan sepatutnya tidak mengandungi istilah umum untuk " ..
"jenis {{{topic}}}.",
},
jenis = {
prefix = "Istilah",
desc = "berkaitan penjenisan",
additional = "'''NOTA''': Ini merupakan kategori jenis. Ia sepatutnya mengandungi istilah untuk jenis {{{topic}}}, " ..
"bukannya sekadar istilah berkaitan {{{topic}}}, dan sepatutnya juga tidak mengandungi nama {{{topic}}} khusus.",
},
kumpulan = {
prefix = "Istilah",
desc = "pengelompokan berkenaan varian khusus",
additional = "'''NOTA''': Ini merupakan kategori khusus. Ia tidak sepatutnya mengandungi apa-apa istilah secara " ..
"langsung tetapi hanya subkategori. Jika terdapat sebarang istilah berkaitan kategori ini, sila alihkannya ke" ..
"subkategori berkaitan.",
},
toplevel = {
desc = "UNUSED", -- all categories of this type hardcode their description
additional = "'''NOTA''': Kategori ini merupakan kategori senarai beraras tertinggi. Ia tidak sepatutnya " ..
"mengandungi sebarang perkataan secara langsung, tetapi sekadar topik berkenaan {{{topic}}}.",
},
}
local function invalid_type(types)
local valid_types = {}
for typ, _ in pairs(type_data) do
insert(valid_types, ("'%s'"):format(typ))
end
error(("Invalid type '%s', should be one or more of %s, comma-separated")
:format(types, mw.text.listToText(valid_types)))
end
local function split_types(types)
types = types or "berkenaan"
local splitvals = split(types, "%s*,%s*")
for i, typ in ipairs(splitvals) do
-- FIXME: Temporary
if typ == "topic" then
typ = "berkenaan"
end
if not type_data[typ] then
invalid_type(types)
end
splitvals[i] = typ
end
return splitvals
end
local function gsub_escaping_replacement(str, from, to)
return (str:gsub(pattern_escape(from), replacement_escape(to)))
end
function ucfirst(txt)
local italics, raw_txt = txt:match("^('*)(.-)$")
return italics .. mw.getContentLanguage():ucfirst(raw_txt)
end
function lcfirst(txt)
local italics, raw_txt = txt:match("^('*)(.-)$")
return italics .. mw.getContentLanguage():lcfirst(raw_txt)
end
local function convert_spec_to_string(data, desc)
if not desc then
return desc
end
local desc_type = type(desc)
if desc_type == "string" then
return desc
elseif desc_type == "number" then
return tostring(desc)
elseif not is_callable(desc) then
error("Internal error: `desc` must be a string, number, function, callable table or nil; received a " ..
desc_type)
end
desc = desc {
lang = data.lang,
sc = data.sc,
label = data.label,
category = data.category,
topic_data = data.topdata,
}
if not desc then
return desc
end
desc_type = type(desc)
if desc_type == "string" then
return desc
end
error("Internal error: the value returned by `desc` must be a string or nil; received a " .. desc_type)
end
local function get_and_cache(data, obj, key)
local val = convert_spec_to_string(data, obj[key])
obj[key] = val
return val
end
local function process_default(desc)
local stripped_desc = desc
local no_singularize, wikify, add_the
while true do
local new_stripped_desc = stripped_desc:match("^(.+) no singularize$")
if new_stripped_desc then
no_singularize = true
end
if not new_stripped_desc then
new_stripped_desc = stripped_desc:match("^(.+) wikify$")
if new_stripped_desc then
wikify = true
end
end
if not new_stripped_desc then
new_stripped_desc = stripped_desc:match("^(.+) with the$")
if new_stripped_desc then
add_the = true
end
end
if new_stripped_desc then
stripped_desc = new_stripped_desc
else
break
end
end
if stripped_desc == "default" then
return true, no_singularize, wikify, add_the
else
return false
end
end
local function format_desc(data, desc)
local desc_parts = {}
local types = split_types(data.topdata.type)
for _, typ in ipairs(types) do
local type_info = type_data[typ]
if type_info.prefix and type_info.prefix ~= "" then
-- Use "tertentu" if there's no language (umbrella category)
local langname = data.lang and "{{{langname}}}" or "tertentu"
insert(desc_parts, type_info.prefix .. " bahasa " .. langname .. " " .. type_info.desc .. " " .. desc)
else
insert(desc_parts, type_info.desc .. " " .. desc)
end
end
return require(table_module).serialCommaJoin(desc_parts) .. "."
end
local substitute_template_specs
local function format_displaytitle(data, include_lang_prefix, upcase)
local topdata, lang, label = data.topdata, data.lang, data.label
local displaytitle = substitute_template_specs(data, topdata.displaytitle)
if not displaytitle then
return nil
end
if upcase then
displaytitle = ucfirst(displaytitle)
end
if include_lang_prefix and lang then
displaytitle = ("%s:%s"):format(lang:getCode(), displaytitle)
end
return displaytitle
end
local function get_breadcrumb(data)
local topdata, lang, label = data.topdata, data.lang, data.label
local ret
if not lang and topdata.umbrella then
ret = topdata.umbrella.breadcrumb or topdata.umbrella.breadcrumb_and_sort_base
end
if not ret then
ret = topdata.breadcrumb or topdata.breadcrumb_and_sort_base or format_displaytitle(data, false, "upcase") or
label
end
if type(ret) == "string" or type(ret) == "number" then
ret = {name = ret}
end
local name = substitute_template_specs(data, ret.name)
local nocap = ret.nocap
return {name = name, nocap = nocap}
end
local function make_category_name(lang, label)
if lang then
return lang:getCode() .. ":" .. ucfirst(label)
else
return ucfirst(label)
end
end
local function replace_special_descriptions(data, desc)
if not desc then
return desc
end
if desc:find("^=") then
desc = desc:gsub("^=", "")
return format_desc(data, desc)
end
local is_default, no_singularize, wikify, add_the = process_default(desc)
if is_default then
local linked_label = require(topic_utilities_module).link_label(data.label, no_singularize, wikify)
if add_the then
linked_label = "" .. linked_label
end
return format_desc(data, linked_label)
else
return desc
end
end
local function get_displaytitle_or_label(data)
return format_displaytitle(data, false) or data.label
end
local function process_default_add_the(data, topic)
local is_default, _, _, add_the = process_default(topic)
if is_default then
topic = get_displaytitle_or_label(data)
if add_the then
topic = "" .. topic
end
end
return topic, is_default
end
substitute_template_specs = function(data, desc)
desc = convert_spec_to_string(data, desc)
if not desc then
return nil
end
local topdata, lang, label = data.topdata, data.lang, data.label
if desc:find("{{{umbrella_msg}}}") then
local catname = ucfirst(label)
desc = gsub_escaping_replacement(desc, "{{{umbrella_msg}}}",
"Kategori ini tidak mengandungi kata masukan kamus, hanya lain-lain kategori sahaja. Subkategorinya " ..
"adalah sama ada:\n\n* Subkategori dengan nama seperti \"{{{thespref}}}aa:" .. catname ..
"\" (dengan awalan kod bahasa) ialah subkategori istilah dalam bahasa tertentu. Anda mungkin berminat " ..
"terutamanya berkaitan [[:Kategori:{{{thespref}}}ms:" .. catname .. "]], untuk istilah bahasa Melayu.\n" ..
"* Subkategori yang dinamakan tanpa awalan kod bahasa ini merupakan kategori lanjutan seperti yang ini, " ..
"tetapi tertumpu kepada topik yang lebih halus."
)
end
if desc:find("{{{topic}}}") then
-- Compute the value for {{{topic}}}. If the user specified `topic`, use it. (If we're an umbrella category,
-- allow a separate value for `umbrella.topic`, falling back to `topic`.) Otherwise, see if the description
-- was specified as 'default' or a variant; if so, parse it to determine whether to add "the" to the label.
-- Otherwise, just use the label directly.
local topic = not lang and topdata.umbrella and topdata.umbrella.topic or topdata.topic
if topic then
topic = process_default_add_the(data, topic)
else
local desc
if not lang then
desc = topdata.umbrella and get_and_cache(data, topdata.umbrella, "description") or
get_and_cache(data, topdata, "umbrella_description")
end
desc = desc or get_and_cache(data, topdata, "description")
local defaulted_desc, is_default = process_default_add_the(data, desc)
if is_default then
topic = defaulted_desc
else
topic = get_displaytitle_or_label(data)
end
end
desc = gsub_escaping_replacement(desc, "{{{topic}}}", topic)
end
desc = desc:gsub("{{{thespref}}}", data.thesaurus_data and "Tesaurus:" or "")
return desc
end
local function process_box(data, def_topright_parts, val, pattern)
if not val then
return
end
local defval = ucfirst(data.label)
if type(val) ~= "table" then
val = {val}
end
for _, v in ipairs(val) do
if v == true then
insert(def_topright_parts, pattern:format(defval))
else
insert(def_topright_parts, pattern:format(v))
end
end
end
local function get_topright(data)
local topdata, lang = data.topdata, data.lang
local def_topright_parts = {}
process_box(data, def_topright_parts, topdata.wp, "{{wikipedia|%s}}")
process_box(data, def_topright_parts, topdata.wpcat, "{{wikipedia|cat=%s}}")
process_box(data, def_topright_parts, topdata.commonscat, "{{commonscat|%s}}")
local def_topright
if #def_topright_parts > 0 then
def_topright = concat(def_topright_parts, "\n")
end
if lang then
return substitute_template_specs(data, topdata.topright or def_topright)
else
return topdata.umbrella and substitute_template_specs(data, topdata.umbrella.topright) or
substitute_template_specs(data, def_topright)
end
end
local function remove_lang_params(desc)
desc = desc:gsub("^{{{langname}}} ", "")
desc = desc:gsub("{{{langcode}}}:", "")
desc = desc:gsub("^{{{langcode}}} ", "")
desc = desc:gsub("^{{{langcat}}} ", "")
return desc
end
local function get_additional_msg(data)
local types = split_types(data.topdata.type)
if #types > 1 then
local parts = {"'''NOTE''': This is a mixed category. It may contain terms of any of the following category types:"}
for i, typ in ipairs(types) do
insert(parts, ("* %s {{{topic}}}%s"):format(type_data[typ].desc, i == #types and "." or ";"))
end
insert(parts, "'''WARNING''': Such categories are strongly dispreferred and should be split into separate per-type categories.")
return concat(parts, "\n")
elseif label == "semua topik" then
return "'''NOTE''': This is the topmost topic category for {{{langname}}}. It should not directly contain " ..
"any terms, but only lists of topic categories organized by type."
else
return type_data[types[1]].additional
end
end
local function get_labels_categorizing(data)
local m_labels_utilities = require(labels_utilities_module)
return m_labels_utilities.format_labels_categorizing(
m_labels_utilities.find_labels_for_category(data.label, "topic", data.lang), nil, data.lang)
end
-- Return the description along with the text following and preceding the description. The description and additional
-- (i.e. following) text are returned in the form of closures so the work of calculating the text (which can be
-- expensive, especially in the case of the additional text, where get_labels_categorizing() scans the entire set of
-- labels for any that categorize into this category) is not done when not needed, e.g. in higher levels of the
-- breadcrumb chain, where only the breadcrumb and parents (in fact, really just the first parent) are actually needed.
local function get_description_additional_preceding(data)
local topdata, lang, label = data.topdata, data.lang, data.label
local desc, additional, preceding
-- This is kind of hacky, but it works for now.
local function postprocess_thesaurus(txt)
if not txt then
return nil
end
if not data.thesaurus_data then
return txt
end
txt = txt:gsub(" terms([ .,])", " thesaurus entries%1")
return txt
end
if lang then
desc = function()
return postprocess_thesaurus(substitute_template_specs(data,
replace_special_descriptions(data, get_and_cache(data, topdata, "description"))))
end
preceding = topdata.preceding
additional = function()
local additional_parts = {}
if topdata.additional then
insert(additional_parts, topdata.additional)
end
if not data.thesaurus_data then
insert(additional_parts, get_additional_msg(data))
local labels_msg = get_labels_categorizing(data)
if labels_msg then
insert(additional_parts, labels_msg)
end
end
return postprocess_thesaurus(substitute_template_specs(data, concat(additional_parts, "\n\n")))
end
else
if label == "semua topik" then
desc = "Kategori ini ialah kategori topik aras tertinggi untuk semua bahasa."
additional = "Ia hanya mempunyai kategori lain tanpa mengandungi entri kamus. Subkategori yang ada " ..
"terdiri daripada dua jenis berikut:\n\n" ..
"* Subkategori yang tersenarai pada permulaan (tanpa kod bahasa berawalan) mengumpul kategori " ..
"yang serupa dengan kategori ini, tetapi tertumpu kepada bidang subjek umum. Di bawahnya " ..
"terdiri daripada bidang subjek yang lebih halus.\n" ..
"* Subkategori yang format namanya seperti \"aa:Semua topik\" (dengan kod bahasa berawalan) " ..
"adalah peringkat tertinggi untuk kategori seperti ini, tetapi untuk bahasa-bahasa tertentu. " ..
"Anda mungkin berminat terutamanya berkenaan [[:Kategori:ms:Semua topik]], untuk istilah " ..
"bahasa Melayu. \n" ..
"Perhatikan bahawa kategori-kategori di bawah kategori pokok ini mengkategorikan istilah " ..
"secara semantik bukannya secara tatabahasa. Kategori tatabahasa (seperti kesemua kata kerja " ..
"bahasa Perancis, atau kesemua bentuk jamak tak sekata bahasa Inggeris) mempunyai struktur " ..
"penamaan yang berbeza, dengan nama bahasa yang dieja jelas, seperti " ..
"[[:Kategori:Kata kerja bahasa Perancis]] atau [[:Kategori:Bentuk jamak tak sekata bahasa Inggeris]]."
return desc, additional
end
-- Assume that if the description field contains a function, the function will return non-nil, so we don't
-- have to call the function at this point (in case it is heavyweight).
local has_umbrella_desc = topdata.umbrella and topdata.umbrella.description or topdata.umbrella_description
desc = function()
local desc = topdata.umbrella and get_and_cache(data, topdata.umbrella, "description") or
get_and_cache(data, topdata, "umbrella_description")
if not desc then
desc = get_and_cache(data, topdata, "description")
if desc then
desc = replace_special_descriptions(data, desc)
desc = remove_lang_params(desc)
desc = desc:gsub("%.$", "")
desc = "Kategori ini berkaitan dengan topik: " .. desc .. "."
end
end
if not desc then
desc = "Kategori berkenaan " .. label .. " dalam bahasa-bahasa khusus."
end
return postprocess_thesaurus(substitute_template_specs(data, desc))
end
preceding = topdata.umbrella and topdata.umbrella.preceding or not has_umbrella_desc and topdata.preceding
if preceding then
preceding = remove_lang_params(preceding)
end
additional = function()
local additional_parts = {}
local topdata_additional = topdata.umbrella and topdata.umbrella.additional or
not has_umbrella_desc and topdata.additional
if topdata_additional then
insert(additional_parts, remove_lang_params(topdata_additional))
end
insert(additional_parts, "{{{umbrella_msg}}}")
if not data.thesaurus_data then
insert(additional_parts, get_additional_msg(data))
local labels_msg = get_labels_categorizing(data)
if labels_msg then
insert(additional_parts, labels_msg)
end
end
return postprocess_thesaurus(substitute_template_specs(data, concat(additional_parts, "\n\n")))
end
end
preceding = substitute_template_specs(data, preceding)
return desc, additional, preceding
end
local function normalize_sort_key(data, sort)
local topdata, lang, label = data.topdata, data.lang, data.label
sort = sort or not lang and topdata.umbrella and topdata.umbrella.breadcrumb_and_sort_base or
topdata.breadcrumb_and_sort_base
if not sort then
-- When defaulting sort key to label, strip 'The ' (e.g. in 'The Matrix', 'The Hunger Games')
-- and 'A ' (e.g. in 'A Song of Ice and Fire', 'A Christmas Carol') from label.
local stripped_sort = label:match("^[Tt]he (.*)$")
if stripped_sort then
sort = stripped_sort
end
if not stripped_sort then
stripped_sort = label:match("^[Aa] (.*)$")
if stripped_sort then
sort = stripped_sort
end
end
if not stripped_sort then
sort = label
end
end
sort = substitute_template_specs(data, sort)
if not lang then
sort = " " .. sort
end
return sort
end
local function get_topic_parents(data)
local topdata, lang, label = data.topdata, data.lang, data.label
local parents = topdata.parents
if not lang and label == "semua topik" then
return {{ name = "Kategori:Asas", sort = "topik" }}
end
if not parents or #parents == 0 then
return nil
end
local ret = {}
for _, parent in ipairs(parents) do
parent = mw.clone(parent)
if type(parent) ~= "table" then
parent = {name = parent}
end
parent.sort = normalize_sort_key(data, parent.sort)
if type(parent.name) ~= "string" then
error(("Internal error: parent.name is not a string: parent = %s"):format(dump(parent)))
end
if parent.name:find("^Kategori:") or parent.nontopic then
-- leave as-is
parent.nontopic = nil
else
parent.name = make_category_name(lang, parent.name)
end
parent.name = substitute_template_specs(data, parent.name)
insert(ret, parent)
end
local function make_list_of_type_parent(typ)
return {
name = make_category_name(lang, ("senarai kategori %s"):format(typ)),
sort = (not lang and " " or "") .. label,
}
end
if topdata.type ~= "toplevel" then
local types = split_types(topdata.type)
for _, typ in ipairs(types) do
insert(ret, make_list_of_type_parent(typ))
end
if #types > 1 then
insert(ret, make_list_of_type_parent("campuran"))
end
end
-- Add umbrella category.
if lang then
insert(ret, {
name = make_category_name(nil, label),
sort = lang:getCanonicalName(),
})
end
return ret
end
local function get_thesaurus_parents(data)
local topdata, lang, label = data.topdata, data.lang, data.label
local parent_substitutions = data.thesaurus_data.parent_substitutions
local parents = topdata.parents
if not parents or #parents == 0 then
return nil
end
local ret = {}
for _, parent in ipairs(parents) do
-- Process parent categories as follows:
-- 1. skip non-topic cats and meta-categories that start with "List of"
-- 2. map "en:All topics" to "English thesaurus entries" (and same for other languages), but map "All topics" itself to the root "Thesaurus" category
-- 3. check if this parent is to be substituted, if so, substitute it
-- 4. prepend "Thesaurus:" to all other category names
parent = mw.clone(parent)
if type(parent) ~= "table" then
parent = {name = parent}
end
parent.sort = normalize_sort_key(data, parent.sort)
if type(parent.name) ~= "string" then
error(("Internal error: parent.name is not a string: parent = %s"):format(dump(parent)))
end
if parent.name:find("^Kategori:") or parent.nontopic then
-- skip
elseif parent.name == "semua topik" or parent_substitutions[parent.name] == "semua topik" then
if not lang then
insert(ret, {
name = "Tesaurus",
sort = label,
})
else
insert(ret, {
name = "thesaurus entries",
sort = parent.sort,
lang = lang:getCode(),
is_label = true,
})
end
else
parent.name = "Tesaurus:" .. make_category_name(lang, parent_substitutions[parent.name] or parent.name)
parent.name = substitute_template_specs(data, parent.name)
insert(ret, parent)
end
end
-- Add the non-thesaurus version of this category as a parent, unless it is a thesaurus-only category.
if not topdata.thesaurusonly then
insert(ret, { name = make_category_name(lang, label), sort = " " })
end
-- Add umbrella category.
if lang then
insert(ret, {
name = "Tesaurus:" .. make_category_name(nil, label),
sort = lang:getCanonicalName(),
})
end
return ret
end
local function generate_spec(category, lang, upcase_label, thesaurus_data)
local label_data = require(topic_data_module)
local label
-- Convert label to lowercase if possible
local lowercase_label = mw.getContentLanguage():lcfirst(upcase_label)
-- Check if the label exists
local labels = label_data["LABELS"]
if labels[lowercase_label] then
label = lowercase_label
else
label = upcase_label
end
local topdata = labels[label]
-- Malay-specific fallback:
-- Allow [[Kategori:en:Bahasa Arab]] to resolve internally as topic label "Arab",
-- but do not affect bare [[Kategori:Bahasa Arab]], so poscatboiler can still handle it.
if not topdata and lang then
local stripped_label = upcase_label:match("^Bahasa%s+(.+)$") or
upcase_label:match("^Bahasa%-bahasa%s+(.+)$")
if stripped_label then
local function has_bahasa_bahasa_parent(data)
for _, parent in ipairs(data.parents or {}) do
local parent_name = type(parent) == "table" and parent.name or parent
if parent_name == "bahasa-bahasa" then
return true
end
end
return false
end
local stripped_lowercase_label = mw.getContentLanguage():lcfirst(stripped_label)
local possible_label, possible_topdata
if labels[stripped_lowercase_label] then
possible_label = stripped_lowercase_label
possible_topdata = labels[possible_label]
elseif labels[stripped_label] then
possible_label = stripped_label
possible_topdata = labels[possible_label]
end
if possible_topdata and has_bahasa_bahasa_parent(possible_topdata) then
label = possible_label
topdata = possible_topdata
end
end
end
-- Go through handlers
if not topdata then
for _, handler in ipairs(label_data["HANDLERS"]) do
topdata = handler.handler(label)
if topdata then
topdata.module = handler.module
break
end
end
end
if not topdata then
return nil
end
local data = {
category = category,
lang = lang,
label = label,
topdata = topdata,
thesaurus_data = thesaurus_data,
}
local description, additional, preceding = get_description_additional_preceding(data)
local parents
if thesaurus_data then
parents = get_thesaurus_parents(data)
else
parents = get_topic_parents(data)
end
return {
lang = lang and lang:getCode() or nil,
description = description,
additional = additional,
preceding = preceding,
parents = parents,
breadcrumb = get_breadcrumb(data),
displaytitle = format_displaytitle(data, "include lang prefix", "upcase"),
topright = get_topright(data),
module = topdata.module,
can_be_empty = not lang,
hidden = false,
}
end
-- Handler for `Thesaurus:...` categories.
table.insert(raw_handlers, function(data)
local code, upcase_label = data.category:match("^Tesaurus:(%l[%a-]*%a):(.+)$")
local lang
if code then
lang = require(languages_module).getByCode(code)
if not lang then
mw.log(("Category '%s' looks like a language-specific thesaurus category but unable to match language prefix"):
format(data.category))
return nil
end
else
upcase_label = data.category:match("^Tesaurus:(.+)$")
end
if upcase_label then
local thesaurus_data = require(thesaurus_data_module)
-- substituted category names are not allowed
if thesaurus_data.parent_substitutions[lcfirst(upcase_label)] then
error(("Category is not allowed as a Thesaurus category: %s (see the list of parent substitutions at " ..
"[[Module:category tree/topic/thesaurus]])"):format(data.category))
end
return generate_spec(data.category, lang, upcase_label, thesaurus_data)
end
end)
-- Handler for regular topic categories.
table.insert(raw_handlers, function(data)
local code, upcase_label = data.category:match("^(%l[%a-]*%a):(.+)$")
local lang
if code then
lang = require(languages_module).getByCode(code)
if not lang then
mw.log(("Category '%s' looks like a language-specific topic category but unable to match language prefix"):
format(data.category))
return nil
end
else
upcase_label = data.category
end
return generate_spec(data.category, lang, upcase_label)
end)
-----------------------------------------------------------------------------
-- --
-- RAW CATEGORIES --
-- --
-----------------------------------------------------------------------------
raw_categories["Tesaurus"] = {
description = "Category for entries of the Wiktionary thesaurus, located in a separate namespace.",
additional = [=[
There are '''three ways to browse''' the thesaurus:
* Look under '''[[:Category:Thesaurus entries by language]]''' to get started.
* Use the search box below.
* Browse the thesaurus by topic using the links under "Subcategories" below.
The main project page is [[Wiktionary:Thesaurus]].
{{ws header|<nowiki/>|link=}}]=],
parents = {
"Kategori:Asas",
"Kategori:Projek Wikikamus",
},
}
return {RAW_CATEGORIES = raw_categories, RAW_HANDLERS = raw_handlers}
lsktm9y5fbhbnlcz2j97ijtlqq32xmf
343057
343056
2026-05-20T05:20:34Z
Hakimi97
2668
Membatalkan semakan [[Special:Diff/343056|343056]] oleh [[Special:Contributions/Hakimi97|Hakimi97]] ([[User talk:Hakimi97|bincang]])
343057
Scribunto
text/plain
local raw_handlers = {}
local raw_categories = {}
--[=[
This module implements the topic category subsystem. It is currently implemented with a single raw handler that
handlers both language-specific and umbrella topic categories, and a corresponding handler for thesaurus categories.
The topmost topic category [[:Category:All topics]] is special and potentially could be handled as a separate raw
category, but currently it's handled as part of the raw topic handler. The topmost thesaurus category
[[:Category:Thesaurus]] is in fact handled as a raw category.
]=]
local functions_module = "Module:fun"
local labels_utilities_module = "Module:labels/utilities"
local languages_module = "Module:languages"
local string_pattern_escape_module = "Module:string/patternEscape"
local string_replacement_escape_module = "Module:string/replacementEscape"
local string_utilities_module = "Module:string utilities"
local table_module = "Module:table"
local topic_data_module = "Module:category tree/topic/data"
local topic_utilities_module = "Module:category tree/topic/utilities"
local thesaurus_data_module = "Module:category tree/topic/thesaurus data"
local concat = table.concat
local insert = table.insert
local dump = mw.dumpObject
local is_callable = require(functions_module).is_callable
local pattern_escape = require(string_pattern_escape_module)
local replacement_escape = require(string_replacement_escape_module)
local split = require(string_utilities_module).split
local type_data = {
["berkenaan"] = {
prefix = "Istilah",
desc = "berkenaan",
additional = "'''NOTA''': Ini merupakan kategori \"berkenaan\". Ia sepatutnya mengandungi istilah " ..
"berkenaan {{{topic}}}. Elak dari menambah istilah yang ada hubungan seleweng dengan {{{topic}}}. " ..
"Berhati-hati dengan istilah jenis atau kejadian topik yang selalunya masuk dalam kategori berasingan.",
},
set = {
prefix = "Istilah",
desc = "untuk jenis atau keadaan",
additional = "'''NOTA''': Ini merupakan kategori set. Ia sepatutnya mengandungi istilah untuk {{{topic}}}, " ..
"bukan sekadar istilah berkaitan {{{topic}}}. Ia mungkin mengandungi lebih banyak istilah umum (seperti jenis " ..
"{{{topic}}}) atau lebih banyak istilah spesifik (seperti nama {{{topic}}} spesifik), walau mungkin terdapat "..
"kategori berkenaan khusus untuk istilah-istilah tersebut.",
},
nama = {
prefix = "Nama-nama dalam",
desc = "secara spesifik berkaitan ",
additional = "'''NOTA''': Ini merupakan kategori nama. Ia sepatutnya mengandungi nama {{{topic}}} khusus, " ..
"bukannya sekadar istilah berkenaan {{{topic}}}, dan sepatutnya tidak mengandungi istilah umum untuk " ..
"jenis {{{topic}}}.",
},
jenis = {
prefix = "Istilah",
desc = "berkaitan penjenisan",
additional = "'''NOTA''': Ini merupakan kategori jenis. Ia sepatutnya mengandungi istilah untuk jenis {{{topic}}}, " ..
"bukannya sekadar istilah berkaitan {{{topic}}}, dan sepatutnya juga tidak mengandungi nama {{{topic}}} khusus.",
},
kumpulan = {
prefix = "Istilah",
desc = "pengelompokan berkenaan varian khusus",
additional = "'''NOTA''': Ini merupakan kategori khusus. Ia tidak sepatutnya mengandungi apa-apa istilah secara " ..
"langsung tetapi hanya subkategori. Jika terdapat sebarang istilah berkaitan kategori ini, sila alihkannya ke" ..
"subkategori berkaitan.",
},
toplevel = {
desc = "UNUSED", -- all categories of this type hardcode their description
additional = "'''NOTA''': Kategori ini merupakan kategori senarai beraras tertinggi. Ia tidak sepatutnya " ..
"mengandungi sebarang perkataan secara langsung, tetapi sekadar topik berkenaan {{{topic}}}.",
},
}
local function invalid_type(types)
local valid_types = {}
for typ, _ in pairs(type_data) do
insert(valid_types, ("'%s'"):format(typ))
end
error(("Invalid type '%s', should be one or more of %s, comma-separated")
:format(types, mw.text.listToText(valid_types)))
end
local function split_types(types)
types = types or "berkenaan"
local splitvals = split(types, "%s*,%s*")
for i, typ in ipairs(splitvals) do
-- FIXME: Temporary
if typ == "topic" then
typ = "berkenaan"
end
if not type_data[typ] then
invalid_type(types)
end
splitvals[i] = typ
end
return splitvals
end
local function gsub_escaping_replacement(str, from, to)
return (str:gsub(pattern_escape(from), replacement_escape(to)))
end
function ucfirst(txt)
local italics, raw_txt = txt:match("^('*)(.-)$")
return italics .. mw.getContentLanguage():ucfirst(raw_txt)
end
function lcfirst(txt)
local italics, raw_txt = txt:match("^('*)(.-)$")
return italics .. mw.getContentLanguage():lcfirst(raw_txt)
end
local function convert_spec_to_string(data, desc)
if not desc then
return desc
end
local desc_type = type(desc)
if desc_type == "string" then
return desc
elseif desc_type == "number" then
return tostring(desc)
elseif not is_callable(desc) then
error("Internal error: `desc` must be a string, number, function, callable table or nil; received a " ..
desc_type)
end
desc = desc {
lang = data.lang,
sc = data.sc,
label = data.label,
category = data.category,
topic_data = data.topdata,
}
if not desc then
return desc
end
desc_type = type(desc)
if desc_type == "string" then
return desc
end
error("Internal error: the value returned by `desc` must be a string or nil; received a " .. desc_type)
end
local function get_and_cache(data, obj, key)
local val = convert_spec_to_string(data, obj[key])
obj[key] = val
return val
end
local function process_default(desc)
local stripped_desc = desc
local no_singularize, wikify, add_the
while true do
local new_stripped_desc = stripped_desc:match("^(.+) no singularize$")
if new_stripped_desc then
no_singularize = true
end
if not new_stripped_desc then
new_stripped_desc = stripped_desc:match("^(.+) wikify$")
if new_stripped_desc then
wikify = true
end
end
if not new_stripped_desc then
new_stripped_desc = stripped_desc:match("^(.+) with the$")
if new_stripped_desc then
add_the = true
end
end
if new_stripped_desc then
stripped_desc = new_stripped_desc
else
break
end
end
if stripped_desc == "default" then
return true, no_singularize, wikify, add_the
else
return false
end
end
local function format_desc(data, desc)
local desc_parts = {}
local types = split_types(data.topdata.type)
for _, typ in ipairs(types) do
local type_info = type_data[typ]
if type_info.prefix and type_info.prefix ~= "" then
-- Use "tertentu" if there's no language (umbrella category)
local langname = data.lang and "{{{langname}}}" or "tertentu"
insert(desc_parts, type_info.prefix .. " bahasa " .. langname .. " " .. type_info.desc .. " " .. desc)
else
insert(desc_parts, type_info.desc .. " " .. desc)
end
end
return require(table_module).serialCommaJoin(desc_parts) .. "."
end
local substitute_template_specs
local function format_displaytitle(data, include_lang_prefix, upcase)
local topdata, lang, label = data.topdata, data.lang, data.label
local displaytitle = substitute_template_specs(data, topdata.displaytitle)
if not displaytitle then
return nil
end
if upcase then
displaytitle = ucfirst(displaytitle)
end
if include_lang_prefix and lang then
displaytitle = ("%s:%s"):format(lang:getCode(), displaytitle)
end
return displaytitle
end
local function get_breadcrumb(data)
local topdata, lang, label = data.topdata, data.lang, data.label
local ret
if not lang and topdata.umbrella then
ret = topdata.umbrella.breadcrumb or topdata.umbrella.breadcrumb_and_sort_base
end
if not ret then
ret = topdata.breadcrumb or topdata.breadcrumb_and_sort_base or format_displaytitle(data, false, "upcase") or
label
end
if type(ret) == "string" or type(ret) == "number" then
ret = {name = ret}
end
local name = substitute_template_specs(data, ret.name)
local nocap = ret.nocap
return {name = name, nocap = nocap}
end
local function make_category_name(lang, label)
if lang then
return lang:getCode() .. ":" .. ucfirst(label)
else
return ucfirst(label)
end
end
local function replace_special_descriptions(data, desc)
if not desc then
return desc
end
if desc:find("^=") then
desc = desc:gsub("^=", "")
return format_desc(data, desc)
end
local is_default, no_singularize, wikify, add_the = process_default(desc)
if is_default then
local linked_label = require(topic_utilities_module).link_label(data.label, no_singularize, wikify)
if add_the then
linked_label = "" .. linked_label
end
return format_desc(data, linked_label)
else
return desc
end
end
local function get_displaytitle_or_label(data)
return format_displaytitle(data, false) or data.label
end
local function process_default_add_the(data, topic)
local is_default, _, _, add_the = process_default(topic)
if is_default then
topic = get_displaytitle_or_label(data)
if add_the then
topic = "" .. topic
end
end
return topic, is_default
end
substitute_template_specs = function(data, desc)
desc = convert_spec_to_string(data, desc)
if not desc then
return nil
end
local topdata, lang, label = data.topdata, data.lang, data.label
if desc:find("{{{umbrella_msg}}}") then
local catname = ucfirst(label)
desc = gsub_escaping_replacement(desc, "{{{umbrella_msg}}}",
"Kategori ini tidak mengandungi kata masukan kamus, hanya lain-lain kategori sahaja. Subkategorinya " ..
"adalah sama ada:\n\n* Subkategori dengan nama seperti \"{{{thespref}}}aa:" .. catname ..
"\" (dengan awalan kod bahasa) ialah subkategori istilah dalam bahasa tertentu. Anda mungkin berminat " ..
"terutamanya berkaitan [[:Kategori:{{{thespref}}}ms:" .. catname .. "]], untuk istilah bahasa Melayu.\n" ..
"* Subkategori yang dinamakan tanpa awalan kod bahasa ini merupakan kategori lanjutan seperti yang ini, " ..
"tetapi tertumpu kepada topik yang lebih halus."
)
end
if desc:find("{{{topic}}}") then
-- Compute the value for {{{topic}}}. If the user specified `topic`, use it. (If we're an umbrella category,
-- allow a separate value for `umbrella.topic`, falling back to `topic`.) Otherwise, see if the description
-- was specified as 'default' or a variant; if so, parse it to determine whether to add "the" to the label.
-- Otherwise, just use the label directly.
local topic = not lang and topdata.umbrella and topdata.umbrella.topic or topdata.topic
if topic then
topic = process_default_add_the(data, topic)
else
local desc
if not lang then
desc = topdata.umbrella and get_and_cache(data, topdata.umbrella, "description") or
get_and_cache(data, topdata, "umbrella_description")
end
desc = desc or get_and_cache(data, topdata, "description")
local defaulted_desc, is_default = process_default_add_the(data, desc)
if is_default then
topic = defaulted_desc
else
topic = get_displaytitle_or_label(data)
end
end
desc = gsub_escaping_replacement(desc, "{{{topic}}}", topic)
end
desc = desc:gsub("{{{thespref}}}", data.thesaurus_data and "Tesaurus:" or "")
return desc
end
local function process_box(data, def_topright_parts, val, pattern)
if not val then
return
end
local defval = ucfirst(data.label)
if type(val) ~= "table" then
val = {val}
end
for _, v in ipairs(val) do
if v == true then
insert(def_topright_parts, pattern:format(defval))
else
insert(def_topright_parts, pattern:format(v))
end
end
end
local function get_topright(data)
local topdata, lang = data.topdata, data.lang
local def_topright_parts = {}
process_box(data, def_topright_parts, topdata.wp, "{{wikipedia|%s}}")
process_box(data, def_topright_parts, topdata.wpcat, "{{wikipedia|cat=%s}}")
process_box(data, def_topright_parts, topdata.commonscat, "{{commonscat|%s}}")
local def_topright
if #def_topright_parts > 0 then
def_topright = concat(def_topright_parts, "\n")
end
if lang then
return substitute_template_specs(data, topdata.topright or def_topright)
else
return topdata.umbrella and substitute_template_specs(data, topdata.umbrella.topright) or
substitute_template_specs(data, def_topright)
end
end
local function remove_lang_params(desc)
desc = desc:gsub("^{{{langname}}} ", "")
desc = desc:gsub("{{{langcode}}}:", "")
desc = desc:gsub("^{{{langcode}}} ", "")
desc = desc:gsub("^{{{langcat}}} ", "")
return desc
end
local function get_additional_msg(data)
local types = split_types(data.topdata.type)
if #types > 1 then
local parts = {"'''NOTE''': This is a mixed category. It may contain terms of any of the following category types:"}
for i, typ in ipairs(types) do
insert(parts, ("* %s {{{topic}}}%s"):format(type_data[typ].desc, i == #types and "." or ";"))
end
insert(parts, "'''WARNING''': Such categories are strongly dispreferred and should be split into separate per-type categories.")
return concat(parts, "\n")
elseif label == "semua topik" then
return "'''NOTE''': This is the topmost topic category for {{{langname}}}. It should not directly contain " ..
"any terms, but only lists of topic categories organized by type."
else
return type_data[types[1]].additional
end
end
local function get_labels_categorizing(data)
local m_labels_utilities = require(labels_utilities_module)
return m_labels_utilities.format_labels_categorizing(
m_labels_utilities.find_labels_for_category(data.label, "topic", data.lang), nil, data.lang)
end
-- Return the description along with the text following and preceding the description. The description and additional
-- (i.e. following) text are returned in the form of closures so the work of calculating the text (which can be
-- expensive, especially in the case of the additional text, where get_labels_categorizing() scans the entire set of
-- labels for any that categorize into this category) is not done when not needed, e.g. in higher levels of the
-- breadcrumb chain, where only the breadcrumb and parents (in fact, really just the first parent) are actually needed.
local function get_description_additional_preceding(data)
local topdata, lang, label = data.topdata, data.lang, data.label
local desc, additional, preceding
-- This is kind of hacky, but it works for now.
local function postprocess_thesaurus(txt)
if not txt then
return nil
end
if not data.thesaurus_data then
return txt
end
txt = txt:gsub(" terms([ .,])", " thesaurus entries%1")
return txt
end
if lang then
desc = function()
return postprocess_thesaurus(substitute_template_specs(data,
replace_special_descriptions(data, get_and_cache(data, topdata, "description"))))
end
preceding = topdata.preceding
additional = function()
local additional_parts = {}
if topdata.additional then
insert(additional_parts, topdata.additional)
end
if not data.thesaurus_data then
insert(additional_parts, get_additional_msg(data))
local labels_msg = get_labels_categorizing(data)
if labels_msg then
insert(additional_parts, labels_msg)
end
end
return postprocess_thesaurus(substitute_template_specs(data, concat(additional_parts, "\n\n")))
end
else
if label == "semua topik" then
desc = "Kategori ini ialah kategori topik aras tertinggi untuk semua bahasa."
additional = "Ia hanya mempunyai kategori lain tanpa mengandungi entri kamus. Subkategori yang ada " ..
"terdiri daripada dua jenis berikut:\n\n" ..
"* Subkategori yang tersenarai pada permulaan (tanpa kod bahasa berawalan) mengumpul kategori " ..
"yang serupa dengan kategori ini, tetapi tertumpu kepada bidang subjek umum. Di bawahnya " ..
"terdiri daripada bidang subjek yang lebih halus.\n" ..
"* Subkategori yang format namanya seperti \"aa:Semua topik\" (dengan kod bahasa berawalan) " ..
"adalah peringkat tertinggi untuk kategori seperti ini, tetapi untuk bahasa-bahasa tertentu. " ..
"Anda mungkin berminat terutamanya berkenaan [[:Kategori:ms:Semua topik]], untuk istilah " ..
"bahasa Melayu. \n" ..
"Perhatikan bahawa kategori-kategori di bawah kategori pokok ini mengkategorikan istilah " ..
"secara semantik bukannya secara tatabahasa. Kategori tatabahasa (seperti kesemua kata kerja " ..
"bahasa Perancis, atau kesemua bentuk jamak tak sekata bahasa Inggeris) mempunyai struktur " ..
"penamaan yang berbeza, dengan nama bahasa yang dieja jelas, seperti " ..
"[[:Kategori:Kata kerja bahasa Perancis]] atau [[:Kategori:Bentuk jamak tak sekata bahasa Inggeris]]."
return desc, additional
end
-- Assume that if the description field contains a function, the function will return non-nil, so we don't
-- have to call the function at this point (in case it is heavyweight).
local has_umbrella_desc = topdata.umbrella and topdata.umbrella.description or topdata.umbrella_description
desc = function()
local desc = topdata.umbrella and get_and_cache(data, topdata.umbrella, "description") or
get_and_cache(data, topdata, "umbrella_description")
if not desc then
desc = get_and_cache(data, topdata, "description")
if desc then
desc = replace_special_descriptions(data, desc)
desc = remove_lang_params(desc)
desc = desc:gsub("%.$", "")
desc = "Kategori ini berkaitan dengan topik: " .. desc .. "."
end
end
if not desc then
desc = "Kategori berkenaan " .. label .. " dalam bahasa-bahasa khusus."
end
return postprocess_thesaurus(substitute_template_specs(data, desc))
end
preceding = topdata.umbrella and topdata.umbrella.preceding or not has_umbrella_desc and topdata.preceding
if preceding then
preceding = remove_lang_params(preceding)
end
additional = function()
local additional_parts = {}
local topdata_additional = topdata.umbrella and topdata.umbrella.additional or
not has_umbrella_desc and topdata.additional
if topdata_additional then
insert(additional_parts, remove_lang_params(topdata_additional))
end
insert(additional_parts, "{{{umbrella_msg}}}")
if not data.thesaurus_data then
insert(additional_parts, get_additional_msg(data))
local labels_msg = get_labels_categorizing(data)
if labels_msg then
insert(additional_parts, labels_msg)
end
end
return postprocess_thesaurus(substitute_template_specs(data, concat(additional_parts, "\n\n")))
end
end
preceding = substitute_template_specs(data, preceding)
return desc, additional, preceding
end
local function normalize_sort_key(data, sort)
local topdata, lang, label = data.topdata, data.lang, data.label
sort = sort or not lang and topdata.umbrella and topdata.umbrella.breadcrumb_and_sort_base or
topdata.breadcrumb_and_sort_base
if not sort then
-- When defaulting sort key to label, strip 'The ' (e.g. in 'The Matrix', 'The Hunger Games')
-- and 'A ' (e.g. in 'A Song of Ice and Fire', 'A Christmas Carol') from label.
local stripped_sort = label:match("^[Tt]he (.*)$")
if stripped_sort then
sort = stripped_sort
end
if not stripped_sort then
stripped_sort = label:match("^[Aa] (.*)$")
if stripped_sort then
sort = stripped_sort
end
end
if not stripped_sort then
sort = label
end
end
sort = substitute_template_specs(data, sort)
if not lang then
sort = " " .. sort
end
return sort
end
local function get_topic_parents(data)
local topdata, lang, label = data.topdata, data.lang, data.label
local parents = topdata.parents
if not lang and label == "semua topik" then
return {{ name = "Kategori:Asas", sort = "topik" }}
end
if not parents or #parents == 0 then
return nil
end
local ret = {}
for _, parent in ipairs(parents) do
parent = mw.clone(parent)
if type(parent) ~= "table" then
parent = {name = parent}
end
parent.sort = normalize_sort_key(data, parent.sort)
if type(parent.name) ~= "string" then
error(("Internal error: parent.name is not a string: parent = %s"):format(dump(parent)))
end
if parent.name:find("^Kategori:") or parent.nontopic then
-- leave as-is
parent.nontopic = nil
else
parent.name = make_category_name(lang, parent.name)
end
parent.name = substitute_template_specs(data, parent.name)
insert(ret, parent)
end
local function make_list_of_type_parent(typ)
return {
name = make_category_name(lang, ("senarai kategori %s"):format(typ)),
sort = (not lang and " " or "") .. label,
}
end
if topdata.type ~= "toplevel" then
local types = split_types(topdata.type)
for _, typ in ipairs(types) do
insert(ret, make_list_of_type_parent(typ))
end
if #types > 1 then
insert(ret, make_list_of_type_parent("campuran"))
end
end
-- Add umbrella category.
if lang then
insert(ret, {
name = make_category_name(nil, label),
sort = lang:getCanonicalName(),
})
end
return ret
end
local function get_thesaurus_parents(data)
local topdata, lang, label = data.topdata, data.lang, data.label
local parent_substitutions = data.thesaurus_data.parent_substitutions
local parents = topdata.parents
if not parents or #parents == 0 then
return nil
end
local ret = {}
for _, parent in ipairs(parents) do
-- Process parent categories as follows:
-- 1. skip non-topic cats and meta-categories that start with "List of"
-- 2. map "en:All topics" to "English thesaurus entries" (and same for other languages), but map "All topics" itself to the root "Thesaurus" category
-- 3. check if this parent is to be substituted, if so, substitute it
-- 4. prepend "Thesaurus:" to all other category names
parent = mw.clone(parent)
if type(parent) ~= "table" then
parent = {name = parent}
end
parent.sort = normalize_sort_key(data, parent.sort)
if type(parent.name) ~= "string" then
error(("Internal error: parent.name is not a string: parent = %s"):format(dump(parent)))
end
if parent.name:find("^Kategori:") or parent.nontopic then
-- skip
elseif parent.name == "semua topik" or parent_substitutions[parent.name] == "semua topik" then
if not lang then
insert(ret, {
name = "Tesaurus",
sort = label,
})
else
insert(ret, {
name = "thesaurus entries",
sort = parent.sort,
lang = lang:getCode(),
is_label = true,
})
end
else
parent.name = "Tesaurus:" .. make_category_name(lang, parent_substitutions[parent.name] or parent.name)
parent.name = substitute_template_specs(data, parent.name)
insert(ret, parent)
end
end
-- Add the non-thesaurus version of this category as a parent, unless it is a thesaurus-only category.
if not topdata.thesaurusonly then
insert(ret, { name = make_category_name(lang, label), sort = " " })
end
-- Add umbrella category.
if lang then
insert(ret, {
name = "Tesaurus:" .. make_category_name(nil, label),
sort = lang:getCanonicalName(),
})
end
return ret
end
local function generate_spec(category, lang, upcase_label, thesaurus_data)
local label_data = require(topic_data_module)
local label
-- Convert label to lowercase if possible
local lowercase_label = mw.getContentLanguage():lcfirst(upcase_label)
-- Check if the label exists
local labels = label_data["LABELS"]
if labels[lowercase_label] then
label = lowercase_label
else
label = upcase_label
end
local topdata = labels[label]
-- Go through handlers
if not topdata then
for _, handler in ipairs(label_data["HANDLERS"]) do
topdata = handler.handler(label)
if topdata then
topdata.module = handler.module
break
end
end
end
if not topdata then
return nil
end
local data = {
category = category,
lang = lang,
label = label,
topdata = topdata,
thesaurus_data = thesaurus_data,
}
local description, additional, preceding = get_description_additional_preceding(data)
local parents
if thesaurus_data then
parents = get_thesaurus_parents(data)
else
parents = get_topic_parents(data)
end
return {
lang = lang and lang:getCode() or nil,
description = description,
additional = additional,
preceding = preceding,
parents = parents,
breadcrumb = get_breadcrumb(data),
displaytitle = format_displaytitle(data, "include lang prefix", "upcase"),
topright = get_topright(data),
module = topdata.module,
can_be_empty = not lang,
hidden = false,
}
end
-- Handler for `Thesaurus:...` categories.
table.insert(raw_handlers, function(data)
local code, upcase_label = data.category:match("^Tesaurus:(%l[%a-]*%a):(.+)$")
local lang
if code then
lang = require(languages_module).getByCode(code)
if not lang then
mw.log(("Category '%s' looks like a language-specific thesaurus category but unable to match language prefix"):
format(data.category))
return nil
end
else
upcase_label = data.category:match("^Tesaurus:(.+)$")
end
if upcase_label then
local thesaurus_data = require(thesaurus_data_module)
-- substituted category names are not allowed
if thesaurus_data.parent_substitutions[lcfirst(upcase_label)] then
error(("Category is not allowed as a Thesaurus category: %s (see the list of parent substitutions at " ..
"[[Module:category tree/topic/thesaurus]])"):format(data.category))
end
return generate_spec(data.category, lang, upcase_label, thesaurus_data)
end
end)
-- Handler for regular topic categories.
table.insert(raw_handlers, function(data)
local code, upcase_label = data.category:match("^(%l[%a-]*%a):(.+)$")
local lang
if code then
lang = require(languages_module).getByCode(code)
if not lang then
mw.log(("Category '%s' looks like a language-specific topic category but unable to match language prefix"):
format(data.category))
return nil
end
else
upcase_label = data.category
end
return generate_spec(data.category, lang, upcase_label)
end)
-----------------------------------------------------------------------------
-- --
-- RAW CATEGORIES --
-- --
-----------------------------------------------------------------------------
raw_categories["Tesaurus"] = {
description = "Category for entries of the Wiktionary thesaurus, located in a separate namespace.",
additional = [=[
There are '''three ways to browse''' the thesaurus:
* Look under '''[[:Category:Thesaurus entries by language]]''' to get started.
* Use the search box below.
* Browse the thesaurus by topic using the links under "Subcategories" below.
The main project page is [[Wiktionary:Thesaurus]].
{{ws header|<nowiki/>|link=}}]=],
parents = {
"Kategori:Asas",
"Kategori:Projek Wikikamus",
},
}
return {RAW_CATEGORIES = raw_categories, RAW_HANDLERS = raw_handlers}
4qze18jyjt1m41qf8upyrapfvkcstcw
343060
343057
2026-05-20T05:30:47Z
Hakimi97
2668
343060
Scribunto
text/plain
local raw_handlers = {}
local raw_categories = {}
--[=[
This module implements the topic category subsystem. It is currently implemented with a single raw handler that
handlers both language-specific and umbrella topic categories, and a corresponding handler for thesaurus categories.
The topmost topic category [[:Category:All topics]] is special and potentially could be handled as a separate raw
category, but currently it's handled as part of the raw topic handler. The topmost thesaurus category
[[:Category:Thesaurus]] is in fact handled as a raw category.
]=]
local functions_module = "Module:fun"
local labels_utilities_module = "Module:labels/utilities"
local languages_module = "Module:languages"
local string_pattern_escape_module = "Module:string/patternEscape"
local string_replacement_escape_module = "Module:string/replacementEscape"
local string_utilities_module = "Module:string utilities"
local table_module = "Module:table"
local topic_data_module = "Module:category tree/topic/data"
local topic_utilities_module = "Module:category tree/topic/utilities"
local thesaurus_data_module = "Module:category tree/topic/thesaurus data"
local concat = table.concat
local insert = table.insert
local dump = mw.dumpObject
local is_callable = require(functions_module).is_callable
local pattern_escape = require(string_pattern_escape_module)
local replacement_escape = require(string_replacement_escape_module)
local split = require(string_utilities_module).split
local type_data = {
["berkenaan"] = {
prefix = "Istilah",
desc = "berkenaan",
additional = "'''NOTA''': Ini merupakan kategori \"berkenaan\". Ia sepatutnya mengandungi istilah " ..
"berkenaan {{{topic}}}. Elak dari menambah istilah yang ada hubungan seleweng dengan {{{topic}}}. " ..
"Berhati-hati dengan istilah jenis atau kejadian topik yang selalunya masuk dalam kategori berasingan.",
},
set = {
prefix = "Istilah",
desc = "untuk jenis atau keadaan",
additional = "'''NOTA''': Ini merupakan kategori set. Ia sepatutnya mengandungi istilah untuk {{{topic}}}, " ..
"bukan sekadar istilah berkaitan {{{topic}}}. Ia mungkin mengandungi lebih banyak istilah umum (seperti jenis " ..
"{{{topic}}}) atau lebih banyak istilah spesifik (seperti nama {{{topic}}} spesifik), walau mungkin terdapat "..
"kategori berkenaan khusus untuk istilah-istilah tersebut.",
},
nama = {
prefix = "Nama-nama dalam",
desc = "secara spesifik berkaitan ",
additional = "'''NOTA''': Ini merupakan kategori nama. Ia sepatutnya mengandungi nama {{{topic}}} khusus, " ..
"bukannya sekadar istilah berkenaan {{{topic}}}, dan sepatutnya tidak mengandungi istilah umum untuk " ..
"jenis {{{topic}}}.",
},
jenis = {
prefix = "Istilah",
desc = "berkaitan penjenisan",
additional = "'''NOTA''': Ini merupakan kategori jenis. Ia sepatutnya mengandungi istilah untuk jenis {{{topic}}}, " ..
"bukannya sekadar istilah berkaitan {{{topic}}}, dan sepatutnya juga tidak mengandungi nama {{{topic}}} khusus.",
},
kumpulan = {
prefix = "Istilah",
desc = "pengelompokan berkenaan varian khusus",
additional = "'''NOTA''': Ini merupakan kategori khusus. Ia tidak sepatutnya mengandungi apa-apa istilah secara " ..
"langsung tetapi hanya subkategori. Jika terdapat sebarang istilah berkaitan kategori ini, sila alihkannya ke" ..
"subkategori berkaitan.",
},
toplevel = {
desc = "UNUSED", -- all categories of this type hardcode their description
additional = "'''NOTA''': Kategori ini merupakan kategori senarai beraras tertinggi. Ia tidak sepatutnya " ..
"mengandungi sebarang perkataan secara langsung, tetapi sekadar topik berkenaan {{{topic}}}.",
},
}
local function invalid_type(types)
local valid_types = {}
for typ, _ in pairs(type_data) do
insert(valid_types, ("'%s'"):format(typ))
end
error(("Invalid type '%s', should be one or more of %s, comma-separated")
:format(types, mw.text.listToText(valid_types)))
end
local function split_types(types)
types = types or "berkenaan"
local splitvals = split(types, "%s*,%s*")
for i, typ in ipairs(splitvals) do
-- FIXME: Temporary
if typ == "topic" then
typ = "berkenaan"
end
if not type_data[typ] then
invalid_type(types)
end
splitvals[i] = typ
end
return splitvals
end
local function gsub_escaping_replacement(str, from, to)
return (str:gsub(pattern_escape(from), replacement_escape(to)))
end
function ucfirst(txt)
local italics, raw_txt = txt:match("^('*)(.-)$")
return italics .. mw.getContentLanguage():ucfirst(raw_txt)
end
function lcfirst(txt)
local italics, raw_txt = txt:match("^('*)(.-)$")
return italics .. mw.getContentLanguage():lcfirst(raw_txt)
end
local function convert_spec_to_string(data, desc)
if not desc then
return desc
end
local desc_type = type(desc)
if desc_type == "string" then
return desc
elseif desc_type == "number" then
return tostring(desc)
elseif not is_callable(desc) then
error("Internal error: `desc` must be a string, number, function, callable table or nil; received a " ..
desc_type)
end
desc = desc {
lang = data.lang,
sc = data.sc,
label = data.label,
category = data.category,
topic_data = data.topdata,
}
if not desc then
return desc
end
desc_type = type(desc)
if desc_type == "string" then
return desc
end
error("Internal error: the value returned by `desc` must be a string or nil; received a " .. desc_type)
end
local function get_and_cache(data, obj, key)
local val = convert_spec_to_string(data, obj[key])
obj[key] = val
return val
end
local function process_default(desc)
local stripped_desc = desc
local no_singularize, wikify, add_the
while true do
local new_stripped_desc = stripped_desc:match("^(.+) no singularize$")
if new_stripped_desc then
no_singularize = true
end
if not new_stripped_desc then
new_stripped_desc = stripped_desc:match("^(.+) wikify$")
if new_stripped_desc then
wikify = true
end
end
if not new_stripped_desc then
new_stripped_desc = stripped_desc:match("^(.+) with the$")
if new_stripped_desc then
add_the = true
end
end
if new_stripped_desc then
stripped_desc = new_stripped_desc
else
break
end
end
if stripped_desc == "default" then
return true, no_singularize, wikify, add_the
else
return false
end
end
local function format_desc(data, desc)
local desc_parts = {}
local types = split_types(data.topdata.type)
for _, typ in ipairs(types) do
local type_info = type_data[typ]
if type_info.prefix and type_info.prefix ~= "" then
-- Use "tertentu" if there's no language (umbrella category)
local langname = data.lang and "{{{langname}}}" or "tertentu"
insert(desc_parts, type_info.prefix .. " bahasa " .. langname .. " " .. type_info.desc .. " " .. desc)
else
insert(desc_parts, type_info.desc .. " " .. desc)
end
end
return require(table_module).serialCommaJoin(desc_parts) .. "."
end
local substitute_template_specs
local function format_displaytitle(data, include_lang_prefix, upcase)
local topdata, lang, label = data.topdata, data.lang, data.label
local displaytitle = substitute_template_specs(data, topdata.displaytitle)
if not displaytitle then
return nil
end
if upcase then
displaytitle = ucfirst(displaytitle)
end
if include_lang_prefix and lang then
displaytitle = ("%s:%s"):format(lang:getCode(), displaytitle)
end
return displaytitle
end
local function get_breadcrumb(data)
local topdata, lang, label = data.topdata, data.lang, data.label
local ret
if not lang and topdata.umbrella then
ret = topdata.umbrella.breadcrumb or topdata.umbrella.breadcrumb_and_sort_base
end
if not ret then
ret = topdata.breadcrumb or topdata.breadcrumb_and_sort_base or format_displaytitle(data, false, "upcase") or
label
end
if type(ret) == "string" or type(ret) == "number" then
ret = {name = ret}
end
local name = substitute_template_specs(data, ret.name)
local nocap = ret.nocap
return {name = name, nocap = nocap}
end
local function make_category_name(lang, label)
if lang then
return lang:getCode() .. ":" .. ucfirst(label)
else
return ucfirst(label)
end
end
local function replace_special_descriptions(data, desc)
if not desc then
return desc
end
if desc:find("^=") then
desc = desc:gsub("^=", "")
return format_desc(data, desc)
end
local is_default, no_singularize, wikify, add_the = process_default(desc)
if is_default then
local linked_label = require(topic_utilities_module).link_label(data.label, no_singularize, wikify)
if add_the then
linked_label = "" .. linked_label
end
return format_desc(data, linked_label)
else
return desc
end
end
local function get_displaytitle_or_label(data)
return format_displaytitle(data, false) or data.label
end
local function process_default_add_the(data, topic)
local is_default, _, _, add_the = process_default(topic)
if is_default then
topic = get_displaytitle_or_label(data)
if add_the then
topic = "" .. topic
end
end
return topic, is_default
end
substitute_template_specs = function(data, desc)
desc = convert_spec_to_string(data, desc)
if not desc then
return nil
end
local topdata, lang, label = data.topdata, data.lang, data.label
if desc:find("{{{umbrella_msg}}}") then
local catname = ucfirst(label)
desc = gsub_escaping_replacement(desc, "{{{umbrella_msg}}}",
"Kategori ini tidak mengandungi kata masukan kamus, hanya lain-lain kategori sahaja. Subkategorinya " ..
"adalah sama ada:\n\n* Subkategori dengan nama seperti \"{{{thespref}}}aa:" .. catname ..
"\" (dengan awalan kod bahasa) ialah subkategori istilah dalam bahasa tertentu. Anda mungkin berminat " ..
"terutamanya berkaitan [[:Kategori:{{{thespref}}}ms:" .. catname .. "]], untuk istilah bahasa Melayu.\n" ..
"* Subkategori yang dinamakan tanpa awalan kod bahasa ini merupakan kategori lanjutan seperti yang ini, " ..
"tetapi tertumpu kepada topik yang lebih halus."
)
end
if desc:find("{{{topic}}}") then
-- Compute the value for {{{topic}}}. If the user specified `topic`, use it. (If we're an umbrella category,
-- allow a separate value for `umbrella.topic`, falling back to `topic`.) Otherwise, see if the description
-- was specified as 'default' or a variant; if so, parse it to determine whether to add "the" to the label.
-- Otherwise, just use the label directly.
local topic = not lang and topdata.umbrella and topdata.umbrella.topic or topdata.topic
if topic then
topic = process_default_add_the(data, topic)
else
local desc
if not lang then
desc = topdata.umbrella and get_and_cache(data, topdata.umbrella, "description") or
get_and_cache(data, topdata, "umbrella_description")
end
desc = desc or get_and_cache(data, topdata, "description")
local defaulted_desc, is_default = process_default_add_the(data, desc)
if is_default then
topic = defaulted_desc
else
topic = get_displaytitle_or_label(data)
end
end
desc = gsub_escaping_replacement(desc, "{{{topic}}}", topic)
end
desc = desc:gsub("{{{thespref}}}", data.thesaurus_data and "Tesaurus:" or "")
return desc
end
local function process_box(data, def_topright_parts, val, pattern)
if not val then
return
end
local defval = ucfirst(data.label)
if type(val) ~= "table" then
val = {val}
end
for _, v in ipairs(val) do
if v == true then
insert(def_topright_parts, pattern:format(defval))
else
insert(def_topright_parts, pattern:format(v))
end
end
end
local function get_topright(data)
local topdata, lang = data.topdata, data.lang
local def_topright_parts = {}
process_box(data, def_topright_parts, topdata.wp, "{{wikipedia|%s}}")
process_box(data, def_topright_parts, topdata.wpcat, "{{wikipedia|cat=%s}}")
process_box(data, def_topright_parts, topdata.commonscat, "{{commonscat|%s}}")
local def_topright
if #def_topright_parts > 0 then
def_topright = concat(def_topright_parts, "\n")
end
if lang then
return substitute_template_specs(data, topdata.topright or def_topright)
else
return topdata.umbrella and substitute_template_specs(data, topdata.umbrella.topright) or
substitute_template_specs(data, def_topright)
end
end
local function remove_lang_params(desc)
desc = desc:gsub("^{{{langname}}} ", "")
desc = desc:gsub("{{{langcode}}}:", "")
desc = desc:gsub("^{{{langcode}}} ", "")
desc = desc:gsub("^{{{langcat}}} ", "")
return desc
end
local function get_additional_msg(data)
local types = split_types(data.topdata.type)
if #types > 1 then
local parts = {"'''NOTE''': This is a mixed category. It may contain terms of any of the following category types:"}
for i, typ in ipairs(types) do
insert(parts, ("* %s {{{topic}}}%s"):format(type_data[typ].desc, i == #types and "." or ";"))
end
insert(parts, "'''WARNING''': Such categories are strongly dispreferred and should be split into separate per-type categories.")
return concat(parts, "\n")
elseif label == "semua topik" then
return "'''NOTE''': This is the topmost topic category for {{{langname}}}. It should not directly contain " ..
"any terms, but only lists of topic categories organized by type."
else
return type_data[types[1]].additional
end
end
local function get_labels_categorizing(data)
local m_labels_utilities = require(labels_utilities_module)
return m_labels_utilities.format_labels_categorizing(
m_labels_utilities.find_labels_for_category(data.label, "topic", data.lang), nil, data.lang)
end
-- Return the description along with the text following and preceding the description. The description and additional
-- (i.e. following) text are returned in the form of closures so the work of calculating the text (which can be
-- expensive, especially in the case of the additional text, where get_labels_categorizing() scans the entire set of
-- labels for any that categorize into this category) is not done when not needed, e.g. in higher levels of the
-- breadcrumb chain, where only the breadcrumb and parents (in fact, really just the first parent) are actually needed.
local function get_description_additional_preceding(data)
local topdata, lang, label = data.topdata, data.lang, data.label
local desc, additional, preceding
-- This is kind of hacky, but it works for now.
local function postprocess_thesaurus(txt)
if not txt then
return nil
end
if not data.thesaurus_data then
return txt
end
txt = txt:gsub(" terms([ .,])", " thesaurus entries%1")
return txt
end
if lang then
desc = function()
return postprocess_thesaurus(substitute_template_specs(data,
replace_special_descriptions(data, get_and_cache(data, topdata, "description"))))
end
preceding = topdata.preceding
additional = function()
local additional_parts = {}
if topdata.additional then
insert(additional_parts, topdata.additional)
end
if not data.thesaurus_data then
insert(additional_parts, get_additional_msg(data))
local labels_msg = get_labels_categorizing(data)
if labels_msg then
insert(additional_parts, labels_msg)
end
end
return postprocess_thesaurus(substitute_template_specs(data, concat(additional_parts, "\n\n")))
end
else
if label == "semua topik" then
desc = "Kategori ini ialah kategori topik aras tertinggi untuk semua bahasa."
additional = "Ia hanya mempunyai kategori lain tanpa mengandungi entri kamus. Subkategori yang ada " ..
"terdiri daripada dua jenis berikut:\n\n" ..
"* Subkategori yang tersenarai pada permulaan (tanpa kod bahasa berawalan) mengumpul kategori " ..
"yang serupa dengan kategori ini, tetapi tertumpu kepada bidang subjek umum. Di bawahnya " ..
"terdiri daripada bidang subjek yang lebih halus.\n" ..
"* Subkategori yang format namanya seperti \"aa:Semua topik\" (dengan kod bahasa berawalan) " ..
"adalah peringkat tertinggi untuk kategori seperti ini, tetapi untuk bahasa-bahasa tertentu. " ..
"Anda mungkin berminat terutamanya berkenaan [[:Kategori:ms:Semua topik]], untuk istilah " ..
"bahasa Melayu. \n" ..
"Perhatikan bahawa kategori-kategori di bawah kategori pokok ini mengkategorikan istilah " ..
"secara semantik bukannya secara tatabahasa. Kategori tatabahasa (seperti kesemua kata kerja " ..
"bahasa Perancis, atau kesemua bentuk jamak tak sekata bahasa Inggeris) mempunyai struktur " ..
"penamaan yang berbeza, dengan nama bahasa yang dieja jelas, seperti " ..
"[[:Kategori:Kata kerja bahasa Perancis]] atau [[:Kategori:Bentuk jamak tak sekata bahasa Inggeris]]."
return desc, additional
end
-- Assume that if the description field contains a function, the function will return non-nil, so we don't
-- have to call the function at this point (in case it is heavyweight).
local has_umbrella_desc = topdata.umbrella and topdata.umbrella.description or topdata.umbrella_description
desc = function()
local desc = topdata.umbrella and get_and_cache(data, topdata.umbrella, "description") or
get_and_cache(data, topdata, "umbrella_description")
if not desc then
desc = get_and_cache(data, topdata, "description")
if desc then
desc = replace_special_descriptions(data, desc)
desc = remove_lang_params(desc)
desc = desc:gsub("%.$", "")
desc = "Kategori ini berkaitan dengan topik: " .. desc .. "."
end
end
if not desc then
desc = "Kategori berkenaan " .. label .. " dalam bahasa-bahasa khusus."
end
return postprocess_thesaurus(substitute_template_specs(data, desc))
end
preceding = topdata.umbrella and topdata.umbrella.preceding or not has_umbrella_desc and topdata.preceding
if preceding then
preceding = remove_lang_params(preceding)
end
additional = function()
local additional_parts = {}
local topdata_additional = topdata.umbrella and topdata.umbrella.additional or
not has_umbrella_desc and topdata.additional
if topdata_additional then
insert(additional_parts, remove_lang_params(topdata_additional))
end
insert(additional_parts, "{{{umbrella_msg}}}")
if not data.thesaurus_data then
insert(additional_parts, get_additional_msg(data))
local labels_msg = get_labels_categorizing(data)
if labels_msg then
insert(additional_parts, labels_msg)
end
end
return postprocess_thesaurus(substitute_template_specs(data, concat(additional_parts, "\n\n")))
end
end
preceding = substitute_template_specs(data, preceding)
return desc, additional, preceding
end
local function normalize_sort_key(data, sort)
local topdata, lang, label = data.topdata, data.lang, data.label
sort = sort or not lang and topdata.umbrella and topdata.umbrella.breadcrumb_and_sort_base or
topdata.breadcrumb_and_sort_base
if not sort then
-- When defaulting sort key to label, strip 'The ' (e.g. in 'The Matrix', 'The Hunger Games')
-- and 'A ' (e.g. in 'A Song of Ice and Fire', 'A Christmas Carol') from label.
local stripped_sort = label:match("^[Tt]he (.*)$")
if stripped_sort then
sort = stripped_sort
end
if not stripped_sort then
stripped_sort = label:match("^[Aa] (.*)$")
if stripped_sort then
sort = stripped_sort
end
end
if not stripped_sort then
sort = label
end
end
sort = substitute_template_specs(data, sort)
if not lang then
sort = " " .. sort
end
return sort
end
local function get_topic_parents(data)
local topdata, lang, label = data.topdata, data.lang, data.label
local parents = topdata.parents
if not lang and label == "semua topik" then
return {{ name = "Kategori:Asas", sort = "topik" }}
end
if not parents or #parents == 0 then
return nil
end
local ret = {}
for _, parent in ipairs(parents) do
parent = mw.clone(parent)
if type(parent) ~= "table" then
parent = {name = parent}
end
parent.sort = normalize_sort_key(data, parent.sort)
if type(parent.name) ~= "string" then
error(("Internal error: parent.name is not a string: parent = %s"):format(dump(parent)))
end
if parent.name:find("^Kategori:") or parent.nontopic then
-- leave as-is
parent.nontopic = nil
else
parent.name = make_category_name(lang, parent.name)
end
parent.name = substitute_template_specs(data, parent.name)
insert(ret, parent)
end
local function make_list_of_type_parent(typ)
return {
name = make_category_name(lang, ("senarai kategori %s"):format(typ)),
sort = (not lang and " " or "") .. label,
}
end
if topdata.type ~= "toplevel" then
local types = split_types(topdata.type)
for _, typ in ipairs(types) do
insert(ret, make_list_of_type_parent(typ))
end
if #types > 1 then
insert(ret, make_list_of_type_parent("campuran"))
end
end
-- Add umbrella category.
if lang then
insert(ret, {
name = make_category_name(nil, label),
sort = lang:getCanonicalName(),
})
end
return ret
end
local function get_thesaurus_parents(data)
local topdata, lang, label = data.topdata, data.lang, data.label
local parent_substitutions = data.thesaurus_data.parent_substitutions
local parents = topdata.parents
if not parents or #parents == 0 then
return nil
end
local ret = {}
for _, parent in ipairs(parents) do
-- Process parent categories as follows:
-- 1. skip non-topic cats and meta-categories that start with "List of"
-- 2. map "en:All topics" to "English thesaurus entries" (and same for other languages), but map "All topics" itself to the root "Thesaurus" category
-- 3. check if this parent is to be substituted, if so, substitute it
-- 4. prepend "Thesaurus:" to all other category names
parent = mw.clone(parent)
if type(parent) ~= "table" then
parent = {name = parent}
end
parent.sort = normalize_sort_key(data, parent.sort)
if type(parent.name) ~= "string" then
error(("Internal error: parent.name is not a string: parent = %s"):format(dump(parent)))
end
if parent.name:find("^Kategori:") or parent.nontopic then
-- skip
elseif parent.name == "semua topik" or parent_substitutions[parent.name] == "semua topik" then
if not lang then
insert(ret, {
name = "Tesaurus",
sort = label,
})
else
insert(ret, {
name = "thesaurus entries",
sort = parent.sort,
lang = lang:getCode(),
is_label = true,
})
end
else
parent.name = "Tesaurus:" .. make_category_name(lang, parent_substitutions[parent.name] or parent.name)
parent.name = substitute_template_specs(data, parent.name)
insert(ret, parent)
end
end
-- Add the non-thesaurus version of this category as a parent, unless it is a thesaurus-only category.
if not topdata.thesaurusonly then
insert(ret, { name = make_category_name(lang, label), sort = " " })
end
-- Add umbrella category.
if lang then
insert(ret, {
name = "Tesaurus:" .. make_category_name(nil, label),
sort = lang:getCanonicalName(),
})
end
return ret
end
local function generate_spec(category, lang, upcase_label, thesaurus_data)
local label_data = require(topic_data_module)
local label
-- Convert label to lowercase if possible
local lowercase_label = mw.getContentLanguage():lcfirst(upcase_label)
-- Check if the label exists
local labels = label_data["LABELS"]
if labels[lowercase_label] then
label = lowercase_label
else
label = upcase_label
end
-- Malay Wiktionary special case:
-- Allow [[Kategori:en:Bahasa Korea]] to use topic label "Korea",
-- but do not allow bare [[Kategori:Bahasa Korea]] to be treated as a topic.
if lang and not labels[label] then
local stripped_label = upcase_label:match("^Bahasa%s+(.+)$")
or upcase_label:match("^Bahasa%-bahasa%s+(.+)$")
if stripped_label then
local stripped_lowercase_label = mw.getContentLanguage():lcfirst(stripped_label)
local possible_label
if labels[stripped_lowercase_label] then
possible_label = stripped_lowercase_label
elseif labels[stripped_label] then
possible_label = stripped_label
end
if possible_label then
local possible_topdata = labels[possible_label]
local is_language_topic = false
for _, parent in ipairs(possible_topdata.parents or {}) do
local parent_name = type(parent) == "table" and parent.name or parent
if parent_name == "bahasa-bahasa" then
is_language_topic = true
break
end
end
if is_language_topic then
label = possible_label
end
end
end
end
local topdata = labels[label]
-- Go through handlers
if not topdata then
for _, handler in ipairs(label_data["HANDLERS"]) do
topdata = handler.handler(label)
if topdata then
topdata.module = handler.module
break
end
end
end
if not topdata then
return nil
end
local data = {
category = category,
lang = lang,
label = label,
topdata = topdata,
thesaurus_data = thesaurus_data,
}
local description, additional, preceding = get_description_additional_preceding(data)
local parents
if thesaurus_data then
parents = get_thesaurus_parents(data)
else
parents = get_topic_parents(data)
end
return {
lang = lang and lang:getCode() or nil,
description = description,
additional = additional,
preceding = preceding,
parents = parents,
breadcrumb = get_breadcrumb(data),
displaytitle = format_displaytitle(data, "include lang prefix", "upcase"),
topright = get_topright(data),
module = topdata.module,
can_be_empty = not lang,
hidden = false,
}
end
-- Handler for `Thesaurus:...` categories.
table.insert(raw_handlers, function(data)
local code, upcase_label = data.category:match("^Tesaurus:(%l[%a-]*%a):(.+)$")
local lang
if code then
lang = require(languages_module).getByCode(code)
if not lang then
mw.log(("Category '%s' looks like a language-specific thesaurus category but unable to match language prefix"):
format(data.category))
return nil
end
else
upcase_label = data.category:match("^Tesaurus:(.+)$")
end
if upcase_label then
local thesaurus_data = require(thesaurus_data_module)
-- substituted category names are not allowed
if thesaurus_data.parent_substitutions[lcfirst(upcase_label)] then
error(("Category is not allowed as a Thesaurus category: %s (see the list of parent substitutions at " ..
"[[Module:category tree/topic/thesaurus]])"):format(data.category))
end
return generate_spec(data.category, lang, upcase_label, thesaurus_data)
end
end)
-- Handler for regular topic categories.
table.insert(raw_handlers, function(data)
local code, upcase_label = data.category:match("^(%l[%a-]*%a):(.+)$")
local lang
if code then
lang = require(languages_module).getByCode(code)
if not lang then
mw.log(("Category '%s' looks like a language-specific topic category but unable to match language prefix"):
format(data.category))
return nil
end
else
upcase_label = data.category
end
return generate_spec(data.category, lang, upcase_label)
end)
-----------------------------------------------------------------------------
-- --
-- RAW CATEGORIES --
-- --
-----------------------------------------------------------------------------
raw_categories["Tesaurus"] = {
description = "Category for entries of the Wiktionary thesaurus, located in a separate namespace.",
additional = [=[
There are '''three ways to browse''' the thesaurus:
* Look under '''[[:Category:Thesaurus entries by language]]''' to get started.
* Use the search box below.
* Browse the thesaurus by topic using the links under "Subcategories" below.
The main project page is [[Wiktionary:Thesaurus]].
{{ws header|<nowiki/>|link=}}]=],
parents = {
"Kategori:Asas",
"Kategori:Projek Wikikamus",
},
}
return {RAW_CATEGORIES = raw_categories, RAW_HANDLERS = raw_handlers}
evpc9z4ql3hokrlkohp42zq5d00c0kx
343061
343060
2026-05-20T05:31:59Z
Hakimi97
2668
Membatalkan semakan [[Special:Diff/343060|343060]] oleh [[Special:Contributions/Hakimi97|Hakimi97]] ([[User talk:Hakimi97|bincang]])
343061
Scribunto
text/plain
local raw_handlers = {}
local raw_categories = {}
--[=[
This module implements the topic category subsystem. It is currently implemented with a single raw handler that
handlers both language-specific and umbrella topic categories, and a corresponding handler for thesaurus categories.
The topmost topic category [[:Category:All topics]] is special and potentially could be handled as a separate raw
category, but currently it's handled as part of the raw topic handler. The topmost thesaurus category
[[:Category:Thesaurus]] is in fact handled as a raw category.
]=]
local functions_module = "Module:fun"
local labels_utilities_module = "Module:labels/utilities"
local languages_module = "Module:languages"
local string_pattern_escape_module = "Module:string/patternEscape"
local string_replacement_escape_module = "Module:string/replacementEscape"
local string_utilities_module = "Module:string utilities"
local table_module = "Module:table"
local topic_data_module = "Module:category tree/topic/data"
local topic_utilities_module = "Module:category tree/topic/utilities"
local thesaurus_data_module = "Module:category tree/topic/thesaurus data"
local concat = table.concat
local insert = table.insert
local dump = mw.dumpObject
local is_callable = require(functions_module).is_callable
local pattern_escape = require(string_pattern_escape_module)
local replacement_escape = require(string_replacement_escape_module)
local split = require(string_utilities_module).split
local type_data = {
["berkenaan"] = {
prefix = "Istilah",
desc = "berkenaan",
additional = "'''NOTA''': Ini merupakan kategori \"berkenaan\". Ia sepatutnya mengandungi istilah " ..
"berkenaan {{{topic}}}. Elak dari menambah istilah yang ada hubungan seleweng dengan {{{topic}}}. " ..
"Berhati-hati dengan istilah jenis atau kejadian topik yang selalunya masuk dalam kategori berasingan.",
},
set = {
prefix = "Istilah",
desc = "untuk jenis atau keadaan",
additional = "'''NOTA''': Ini merupakan kategori set. Ia sepatutnya mengandungi istilah untuk {{{topic}}}, " ..
"bukan sekadar istilah berkaitan {{{topic}}}. Ia mungkin mengandungi lebih banyak istilah umum (seperti jenis " ..
"{{{topic}}}) atau lebih banyak istilah spesifik (seperti nama {{{topic}}} spesifik), walau mungkin terdapat "..
"kategori berkenaan khusus untuk istilah-istilah tersebut.",
},
nama = {
prefix = "Nama-nama dalam",
desc = "secara spesifik berkaitan ",
additional = "'''NOTA''': Ini merupakan kategori nama. Ia sepatutnya mengandungi nama {{{topic}}} khusus, " ..
"bukannya sekadar istilah berkenaan {{{topic}}}, dan sepatutnya tidak mengandungi istilah umum untuk " ..
"jenis {{{topic}}}.",
},
jenis = {
prefix = "Istilah",
desc = "berkaitan penjenisan",
additional = "'''NOTA''': Ini merupakan kategori jenis. Ia sepatutnya mengandungi istilah untuk jenis {{{topic}}}, " ..
"bukannya sekadar istilah berkaitan {{{topic}}}, dan sepatutnya juga tidak mengandungi nama {{{topic}}} khusus.",
},
kumpulan = {
prefix = "Istilah",
desc = "pengelompokan berkenaan varian khusus",
additional = "'''NOTA''': Ini merupakan kategori khusus. Ia tidak sepatutnya mengandungi apa-apa istilah secara " ..
"langsung tetapi hanya subkategori. Jika terdapat sebarang istilah berkaitan kategori ini, sila alihkannya ke" ..
"subkategori berkaitan.",
},
toplevel = {
desc = "UNUSED", -- all categories of this type hardcode their description
additional = "'''NOTA''': Kategori ini merupakan kategori senarai beraras tertinggi. Ia tidak sepatutnya " ..
"mengandungi sebarang perkataan secara langsung, tetapi sekadar topik berkenaan {{{topic}}}.",
},
}
local function invalid_type(types)
local valid_types = {}
for typ, _ in pairs(type_data) do
insert(valid_types, ("'%s'"):format(typ))
end
error(("Invalid type '%s', should be one or more of %s, comma-separated")
:format(types, mw.text.listToText(valid_types)))
end
local function split_types(types)
types = types or "berkenaan"
local splitvals = split(types, "%s*,%s*")
for i, typ in ipairs(splitvals) do
-- FIXME: Temporary
if typ == "topic" then
typ = "berkenaan"
end
if not type_data[typ] then
invalid_type(types)
end
splitvals[i] = typ
end
return splitvals
end
local function gsub_escaping_replacement(str, from, to)
return (str:gsub(pattern_escape(from), replacement_escape(to)))
end
function ucfirst(txt)
local italics, raw_txt = txt:match("^('*)(.-)$")
return italics .. mw.getContentLanguage():ucfirst(raw_txt)
end
function lcfirst(txt)
local italics, raw_txt = txt:match("^('*)(.-)$")
return italics .. mw.getContentLanguage():lcfirst(raw_txt)
end
local function convert_spec_to_string(data, desc)
if not desc then
return desc
end
local desc_type = type(desc)
if desc_type == "string" then
return desc
elseif desc_type == "number" then
return tostring(desc)
elseif not is_callable(desc) then
error("Internal error: `desc` must be a string, number, function, callable table or nil; received a " ..
desc_type)
end
desc = desc {
lang = data.lang,
sc = data.sc,
label = data.label,
category = data.category,
topic_data = data.topdata,
}
if not desc then
return desc
end
desc_type = type(desc)
if desc_type == "string" then
return desc
end
error("Internal error: the value returned by `desc` must be a string or nil; received a " .. desc_type)
end
local function get_and_cache(data, obj, key)
local val = convert_spec_to_string(data, obj[key])
obj[key] = val
return val
end
local function process_default(desc)
local stripped_desc = desc
local no_singularize, wikify, add_the
while true do
local new_stripped_desc = stripped_desc:match("^(.+) no singularize$")
if new_stripped_desc then
no_singularize = true
end
if not new_stripped_desc then
new_stripped_desc = stripped_desc:match("^(.+) wikify$")
if new_stripped_desc then
wikify = true
end
end
if not new_stripped_desc then
new_stripped_desc = stripped_desc:match("^(.+) with the$")
if new_stripped_desc then
add_the = true
end
end
if new_stripped_desc then
stripped_desc = new_stripped_desc
else
break
end
end
if stripped_desc == "default" then
return true, no_singularize, wikify, add_the
else
return false
end
end
local function format_desc(data, desc)
local desc_parts = {}
local types = split_types(data.topdata.type)
for _, typ in ipairs(types) do
local type_info = type_data[typ]
if type_info.prefix and type_info.prefix ~= "" then
-- Use "tertentu" if there's no language (umbrella category)
local langname = data.lang and "{{{langname}}}" or "tertentu"
insert(desc_parts, type_info.prefix .. " bahasa " .. langname .. " " .. type_info.desc .. " " .. desc)
else
insert(desc_parts, type_info.desc .. " " .. desc)
end
end
return require(table_module).serialCommaJoin(desc_parts) .. "."
end
local substitute_template_specs
local function format_displaytitle(data, include_lang_prefix, upcase)
local topdata, lang, label = data.topdata, data.lang, data.label
local displaytitle = substitute_template_specs(data, topdata.displaytitle)
if not displaytitle then
return nil
end
if upcase then
displaytitle = ucfirst(displaytitle)
end
if include_lang_prefix and lang then
displaytitle = ("%s:%s"):format(lang:getCode(), displaytitle)
end
return displaytitle
end
local function get_breadcrumb(data)
local topdata, lang, label = data.topdata, data.lang, data.label
local ret
if not lang and topdata.umbrella then
ret = topdata.umbrella.breadcrumb or topdata.umbrella.breadcrumb_and_sort_base
end
if not ret then
ret = topdata.breadcrumb or topdata.breadcrumb_and_sort_base or format_displaytitle(data, false, "upcase") or
label
end
if type(ret) == "string" or type(ret) == "number" then
ret = {name = ret}
end
local name = substitute_template_specs(data, ret.name)
local nocap = ret.nocap
return {name = name, nocap = nocap}
end
local function make_category_name(lang, label)
if lang then
return lang:getCode() .. ":" .. ucfirst(label)
else
return ucfirst(label)
end
end
local function replace_special_descriptions(data, desc)
if not desc then
return desc
end
if desc:find("^=") then
desc = desc:gsub("^=", "")
return format_desc(data, desc)
end
local is_default, no_singularize, wikify, add_the = process_default(desc)
if is_default then
local linked_label = require(topic_utilities_module).link_label(data.label, no_singularize, wikify)
if add_the then
linked_label = "" .. linked_label
end
return format_desc(data, linked_label)
else
return desc
end
end
local function get_displaytitle_or_label(data)
return format_displaytitle(data, false) or data.label
end
local function process_default_add_the(data, topic)
local is_default, _, _, add_the = process_default(topic)
if is_default then
topic = get_displaytitle_or_label(data)
if add_the then
topic = "" .. topic
end
end
return topic, is_default
end
substitute_template_specs = function(data, desc)
desc = convert_spec_to_string(data, desc)
if not desc then
return nil
end
local topdata, lang, label = data.topdata, data.lang, data.label
if desc:find("{{{umbrella_msg}}}") then
local catname = ucfirst(label)
desc = gsub_escaping_replacement(desc, "{{{umbrella_msg}}}",
"Kategori ini tidak mengandungi kata masukan kamus, hanya lain-lain kategori sahaja. Subkategorinya " ..
"adalah sama ada:\n\n* Subkategori dengan nama seperti \"{{{thespref}}}aa:" .. catname ..
"\" (dengan awalan kod bahasa) ialah subkategori istilah dalam bahasa tertentu. Anda mungkin berminat " ..
"terutamanya berkaitan [[:Kategori:{{{thespref}}}ms:" .. catname .. "]], untuk istilah bahasa Melayu.\n" ..
"* Subkategori yang dinamakan tanpa awalan kod bahasa ini merupakan kategori lanjutan seperti yang ini, " ..
"tetapi tertumpu kepada topik yang lebih halus."
)
end
if desc:find("{{{topic}}}") then
-- Compute the value for {{{topic}}}. If the user specified `topic`, use it. (If we're an umbrella category,
-- allow a separate value for `umbrella.topic`, falling back to `topic`.) Otherwise, see if the description
-- was specified as 'default' or a variant; if so, parse it to determine whether to add "the" to the label.
-- Otherwise, just use the label directly.
local topic = not lang and topdata.umbrella and topdata.umbrella.topic or topdata.topic
if topic then
topic = process_default_add_the(data, topic)
else
local desc
if not lang then
desc = topdata.umbrella and get_and_cache(data, topdata.umbrella, "description") or
get_and_cache(data, topdata, "umbrella_description")
end
desc = desc or get_and_cache(data, topdata, "description")
local defaulted_desc, is_default = process_default_add_the(data, desc)
if is_default then
topic = defaulted_desc
else
topic = get_displaytitle_or_label(data)
end
end
desc = gsub_escaping_replacement(desc, "{{{topic}}}", topic)
end
desc = desc:gsub("{{{thespref}}}", data.thesaurus_data and "Tesaurus:" or "")
return desc
end
local function process_box(data, def_topright_parts, val, pattern)
if not val then
return
end
local defval = ucfirst(data.label)
if type(val) ~= "table" then
val = {val}
end
for _, v in ipairs(val) do
if v == true then
insert(def_topright_parts, pattern:format(defval))
else
insert(def_topright_parts, pattern:format(v))
end
end
end
local function get_topright(data)
local topdata, lang = data.topdata, data.lang
local def_topright_parts = {}
process_box(data, def_topright_parts, topdata.wp, "{{wikipedia|%s}}")
process_box(data, def_topright_parts, topdata.wpcat, "{{wikipedia|cat=%s}}")
process_box(data, def_topright_parts, topdata.commonscat, "{{commonscat|%s}}")
local def_topright
if #def_topright_parts > 0 then
def_topright = concat(def_topright_parts, "\n")
end
if lang then
return substitute_template_specs(data, topdata.topright or def_topright)
else
return topdata.umbrella and substitute_template_specs(data, topdata.umbrella.topright) or
substitute_template_specs(data, def_topright)
end
end
local function remove_lang_params(desc)
desc = desc:gsub("^{{{langname}}} ", "")
desc = desc:gsub("{{{langcode}}}:", "")
desc = desc:gsub("^{{{langcode}}} ", "")
desc = desc:gsub("^{{{langcat}}} ", "")
return desc
end
local function get_additional_msg(data)
local types = split_types(data.topdata.type)
if #types > 1 then
local parts = {"'''NOTE''': This is a mixed category. It may contain terms of any of the following category types:"}
for i, typ in ipairs(types) do
insert(parts, ("* %s {{{topic}}}%s"):format(type_data[typ].desc, i == #types and "." or ";"))
end
insert(parts, "'''WARNING''': Such categories are strongly dispreferred and should be split into separate per-type categories.")
return concat(parts, "\n")
elseif label == "semua topik" then
return "'''NOTE''': This is the topmost topic category for {{{langname}}}. It should not directly contain " ..
"any terms, but only lists of topic categories organized by type."
else
return type_data[types[1]].additional
end
end
local function get_labels_categorizing(data)
local m_labels_utilities = require(labels_utilities_module)
return m_labels_utilities.format_labels_categorizing(
m_labels_utilities.find_labels_for_category(data.label, "topic", data.lang), nil, data.lang)
end
-- Return the description along with the text following and preceding the description. The description and additional
-- (i.e. following) text are returned in the form of closures so the work of calculating the text (which can be
-- expensive, especially in the case of the additional text, where get_labels_categorizing() scans the entire set of
-- labels for any that categorize into this category) is not done when not needed, e.g. in higher levels of the
-- breadcrumb chain, where only the breadcrumb and parents (in fact, really just the first parent) are actually needed.
local function get_description_additional_preceding(data)
local topdata, lang, label = data.topdata, data.lang, data.label
local desc, additional, preceding
-- This is kind of hacky, but it works for now.
local function postprocess_thesaurus(txt)
if not txt then
return nil
end
if not data.thesaurus_data then
return txt
end
txt = txt:gsub(" terms([ .,])", " thesaurus entries%1")
return txt
end
if lang then
desc = function()
return postprocess_thesaurus(substitute_template_specs(data,
replace_special_descriptions(data, get_and_cache(data, topdata, "description"))))
end
preceding = topdata.preceding
additional = function()
local additional_parts = {}
if topdata.additional then
insert(additional_parts, topdata.additional)
end
if not data.thesaurus_data then
insert(additional_parts, get_additional_msg(data))
local labels_msg = get_labels_categorizing(data)
if labels_msg then
insert(additional_parts, labels_msg)
end
end
return postprocess_thesaurus(substitute_template_specs(data, concat(additional_parts, "\n\n")))
end
else
if label == "semua topik" then
desc = "Kategori ini ialah kategori topik aras tertinggi untuk semua bahasa."
additional = "Ia hanya mempunyai kategori lain tanpa mengandungi entri kamus. Subkategori yang ada " ..
"terdiri daripada dua jenis berikut:\n\n" ..
"* Subkategori yang tersenarai pada permulaan (tanpa kod bahasa berawalan) mengumpul kategori " ..
"yang serupa dengan kategori ini, tetapi tertumpu kepada bidang subjek umum. Di bawahnya " ..
"terdiri daripada bidang subjek yang lebih halus.\n" ..
"* Subkategori yang format namanya seperti \"aa:Semua topik\" (dengan kod bahasa berawalan) " ..
"adalah peringkat tertinggi untuk kategori seperti ini, tetapi untuk bahasa-bahasa tertentu. " ..
"Anda mungkin berminat terutamanya berkenaan [[:Kategori:ms:Semua topik]], untuk istilah " ..
"bahasa Melayu. \n" ..
"Perhatikan bahawa kategori-kategori di bawah kategori pokok ini mengkategorikan istilah " ..
"secara semantik bukannya secara tatabahasa. Kategori tatabahasa (seperti kesemua kata kerja " ..
"bahasa Perancis, atau kesemua bentuk jamak tak sekata bahasa Inggeris) mempunyai struktur " ..
"penamaan yang berbeza, dengan nama bahasa yang dieja jelas, seperti " ..
"[[:Kategori:Kata kerja bahasa Perancis]] atau [[:Kategori:Bentuk jamak tak sekata bahasa Inggeris]]."
return desc, additional
end
-- Assume that if the description field contains a function, the function will return non-nil, so we don't
-- have to call the function at this point (in case it is heavyweight).
local has_umbrella_desc = topdata.umbrella and topdata.umbrella.description or topdata.umbrella_description
desc = function()
local desc = topdata.umbrella and get_and_cache(data, topdata.umbrella, "description") or
get_and_cache(data, topdata, "umbrella_description")
if not desc then
desc = get_and_cache(data, topdata, "description")
if desc then
desc = replace_special_descriptions(data, desc)
desc = remove_lang_params(desc)
desc = desc:gsub("%.$", "")
desc = "Kategori ini berkaitan dengan topik: " .. desc .. "."
end
end
if not desc then
desc = "Kategori berkenaan " .. label .. " dalam bahasa-bahasa khusus."
end
return postprocess_thesaurus(substitute_template_specs(data, desc))
end
preceding = topdata.umbrella and topdata.umbrella.preceding or not has_umbrella_desc and topdata.preceding
if preceding then
preceding = remove_lang_params(preceding)
end
additional = function()
local additional_parts = {}
local topdata_additional = topdata.umbrella and topdata.umbrella.additional or
not has_umbrella_desc and topdata.additional
if topdata_additional then
insert(additional_parts, remove_lang_params(topdata_additional))
end
insert(additional_parts, "{{{umbrella_msg}}}")
if not data.thesaurus_data then
insert(additional_parts, get_additional_msg(data))
local labels_msg = get_labels_categorizing(data)
if labels_msg then
insert(additional_parts, labels_msg)
end
end
return postprocess_thesaurus(substitute_template_specs(data, concat(additional_parts, "\n\n")))
end
end
preceding = substitute_template_specs(data, preceding)
return desc, additional, preceding
end
local function normalize_sort_key(data, sort)
local topdata, lang, label = data.topdata, data.lang, data.label
sort = sort or not lang and topdata.umbrella and topdata.umbrella.breadcrumb_and_sort_base or
topdata.breadcrumb_and_sort_base
if not sort then
-- When defaulting sort key to label, strip 'The ' (e.g. in 'The Matrix', 'The Hunger Games')
-- and 'A ' (e.g. in 'A Song of Ice and Fire', 'A Christmas Carol') from label.
local stripped_sort = label:match("^[Tt]he (.*)$")
if stripped_sort then
sort = stripped_sort
end
if not stripped_sort then
stripped_sort = label:match("^[Aa] (.*)$")
if stripped_sort then
sort = stripped_sort
end
end
if not stripped_sort then
sort = label
end
end
sort = substitute_template_specs(data, sort)
if not lang then
sort = " " .. sort
end
return sort
end
local function get_topic_parents(data)
local topdata, lang, label = data.topdata, data.lang, data.label
local parents = topdata.parents
if not lang and label == "semua topik" then
return {{ name = "Kategori:Asas", sort = "topik" }}
end
if not parents or #parents == 0 then
return nil
end
local ret = {}
for _, parent in ipairs(parents) do
parent = mw.clone(parent)
if type(parent) ~= "table" then
parent = {name = parent}
end
parent.sort = normalize_sort_key(data, parent.sort)
if type(parent.name) ~= "string" then
error(("Internal error: parent.name is not a string: parent = %s"):format(dump(parent)))
end
if parent.name:find("^Kategori:") or parent.nontopic then
-- leave as-is
parent.nontopic = nil
else
parent.name = make_category_name(lang, parent.name)
end
parent.name = substitute_template_specs(data, parent.name)
insert(ret, parent)
end
local function make_list_of_type_parent(typ)
return {
name = make_category_name(lang, ("senarai kategori %s"):format(typ)),
sort = (not lang and " " or "") .. label,
}
end
if topdata.type ~= "toplevel" then
local types = split_types(topdata.type)
for _, typ in ipairs(types) do
insert(ret, make_list_of_type_parent(typ))
end
if #types > 1 then
insert(ret, make_list_of_type_parent("campuran"))
end
end
-- Add umbrella category.
if lang then
insert(ret, {
name = make_category_name(nil, label),
sort = lang:getCanonicalName(),
})
end
return ret
end
local function get_thesaurus_parents(data)
local topdata, lang, label = data.topdata, data.lang, data.label
local parent_substitutions = data.thesaurus_data.parent_substitutions
local parents = topdata.parents
if not parents or #parents == 0 then
return nil
end
local ret = {}
for _, parent in ipairs(parents) do
-- Process parent categories as follows:
-- 1. skip non-topic cats and meta-categories that start with "List of"
-- 2. map "en:All topics" to "English thesaurus entries" (and same for other languages), but map "All topics" itself to the root "Thesaurus" category
-- 3. check if this parent is to be substituted, if so, substitute it
-- 4. prepend "Thesaurus:" to all other category names
parent = mw.clone(parent)
if type(parent) ~= "table" then
parent = {name = parent}
end
parent.sort = normalize_sort_key(data, parent.sort)
if type(parent.name) ~= "string" then
error(("Internal error: parent.name is not a string: parent = %s"):format(dump(parent)))
end
if parent.name:find("^Kategori:") or parent.nontopic then
-- skip
elseif parent.name == "semua topik" or parent_substitutions[parent.name] == "semua topik" then
if not lang then
insert(ret, {
name = "Tesaurus",
sort = label,
})
else
insert(ret, {
name = "thesaurus entries",
sort = parent.sort,
lang = lang:getCode(),
is_label = true,
})
end
else
parent.name = "Tesaurus:" .. make_category_name(lang, parent_substitutions[parent.name] or parent.name)
parent.name = substitute_template_specs(data, parent.name)
insert(ret, parent)
end
end
-- Add the non-thesaurus version of this category as a parent, unless it is a thesaurus-only category.
if not topdata.thesaurusonly then
insert(ret, { name = make_category_name(lang, label), sort = " " })
end
-- Add umbrella category.
if lang then
insert(ret, {
name = "Tesaurus:" .. make_category_name(nil, label),
sort = lang:getCanonicalName(),
})
end
return ret
end
local function generate_spec(category, lang, upcase_label, thesaurus_data)
local label_data = require(topic_data_module)
local label
-- Convert label to lowercase if possible
local lowercase_label = mw.getContentLanguage():lcfirst(upcase_label)
-- Check if the label exists
local labels = label_data["LABELS"]
if labels[lowercase_label] then
label = lowercase_label
else
label = upcase_label
end
local topdata = labels[label]
-- Go through handlers
if not topdata then
for _, handler in ipairs(label_data["HANDLERS"]) do
topdata = handler.handler(label)
if topdata then
topdata.module = handler.module
break
end
end
end
if not topdata then
return nil
end
local data = {
category = category,
lang = lang,
label = label,
topdata = topdata,
thesaurus_data = thesaurus_data,
}
local description, additional, preceding = get_description_additional_preceding(data)
local parents
if thesaurus_data then
parents = get_thesaurus_parents(data)
else
parents = get_topic_parents(data)
end
return {
lang = lang and lang:getCode() or nil,
description = description,
additional = additional,
preceding = preceding,
parents = parents,
breadcrumb = get_breadcrumb(data),
displaytitle = format_displaytitle(data, "include lang prefix", "upcase"),
topright = get_topright(data),
module = topdata.module,
can_be_empty = not lang,
hidden = false,
}
end
-- Handler for `Thesaurus:...` categories.
table.insert(raw_handlers, function(data)
local code, upcase_label = data.category:match("^Tesaurus:(%l[%a-]*%a):(.+)$")
local lang
if code then
lang = require(languages_module).getByCode(code)
if not lang then
mw.log(("Category '%s' looks like a language-specific thesaurus category but unable to match language prefix"):
format(data.category))
return nil
end
else
upcase_label = data.category:match("^Tesaurus:(.+)$")
end
if upcase_label then
local thesaurus_data = require(thesaurus_data_module)
-- substituted category names are not allowed
if thesaurus_data.parent_substitutions[lcfirst(upcase_label)] then
error(("Category is not allowed as a Thesaurus category: %s (see the list of parent substitutions at " ..
"[[Module:category tree/topic/thesaurus]])"):format(data.category))
end
return generate_spec(data.category, lang, upcase_label, thesaurus_data)
end
end)
-- Handler for regular topic categories.
table.insert(raw_handlers, function(data)
local code, upcase_label = data.category:match("^(%l[%a-]*%a):(.+)$")
local lang
if code then
lang = require(languages_module).getByCode(code)
if not lang then
mw.log(("Category '%s' looks like a language-specific topic category but unable to match language prefix"):
format(data.category))
return nil
end
else
upcase_label = data.category
end
return generate_spec(data.category, lang, upcase_label)
end)
-----------------------------------------------------------------------------
-- --
-- RAW CATEGORIES --
-- --
-----------------------------------------------------------------------------
raw_categories["Tesaurus"] = {
description = "Category for entries of the Wiktionary thesaurus, located in a separate namespace.",
additional = [=[
There are '''three ways to browse''' the thesaurus:
* Look under '''[[:Category:Thesaurus entries by language]]''' to get started.
* Use the search box below.
* Browse the thesaurus by topic using the links under "Subcategories" below.
The main project page is [[Wiktionary:Thesaurus]].
{{ws header|<nowiki/>|link=}}]=],
parents = {
"Kategori:Asas",
"Kategori:Projek Wikikamus",
},
}
return {RAW_CATEGORIES = raw_categories, RAW_HANDLERS = raw_handlers}
4qze18jyjt1m41qf8upyrapfvkcstcw
343062
343061
2026-05-20T05:34:59Z
Hakimi97
2668
343062
Scribunto
text/plain
local raw_handlers = {}
local raw_categories = {}
--[=[
This module implements the topic category subsystem. It is currently implemented with a single raw handler that
handlers both language-specific and umbrella topic categories, and a corresponding handler for thesaurus categories.
The topmost topic category [[:Category:All topics]] is special and potentially could be handled as a separate raw
category, but currently it's handled as part of the raw topic handler. The topmost thesaurus category
[[:Category:Thesaurus]] is in fact handled as a raw category.
]=]
local functions_module = "Module:fun"
local labels_utilities_module = "Module:labels/utilities"
local languages_module = "Module:languages"
local string_pattern_escape_module = "Module:string/patternEscape"
local string_replacement_escape_module = "Module:string/replacementEscape"
local string_utilities_module = "Module:string utilities"
local table_module = "Module:table"
local topic_data_module = "Module:category tree/topic/data"
local topic_utilities_module = "Module:category tree/topic/utilities"
local thesaurus_data_module = "Module:category tree/topic/thesaurus data"
local concat = table.concat
local insert = table.insert
local dump = mw.dumpObject
local is_callable = require(functions_module).is_callable
local pattern_escape = require(string_pattern_escape_module)
local replacement_escape = require(string_replacement_escape_module)
local split = require(string_utilities_module).split
local type_data = {
["berkenaan"] = {
prefix = "Istilah",
desc = "berkenaan",
additional = "'''NOTA''': Ini merupakan kategori \"berkenaan\". Ia sepatutnya mengandungi istilah " ..
"berkenaan {{{topic}}}. Elak dari menambah istilah yang ada hubungan seleweng dengan {{{topic}}}. " ..
"Berhati-hati dengan istilah jenis atau kejadian topik yang selalunya masuk dalam kategori berasingan.",
},
set = {
prefix = "Istilah",
desc = "untuk jenis atau keadaan",
additional = "'''NOTA''': Ini merupakan kategori set. Ia sepatutnya mengandungi istilah untuk {{{topic}}}, " ..
"bukan sekadar istilah berkaitan {{{topic}}}. Ia mungkin mengandungi lebih banyak istilah umum (seperti jenis " ..
"{{{topic}}}) atau lebih banyak istilah spesifik (seperti nama {{{topic}}} spesifik), walau mungkin terdapat "..
"kategori berkenaan khusus untuk istilah-istilah tersebut.",
},
nama = {
prefix = "Nama-nama dalam",
desc = "secara spesifik berkaitan ",
additional = "'''NOTA''': Ini merupakan kategori nama. Ia sepatutnya mengandungi nama {{{topic}}} khusus, " ..
"bukannya sekadar istilah berkenaan {{{topic}}}, dan sepatutnya tidak mengandungi istilah umum untuk " ..
"jenis {{{topic}}}.",
},
jenis = {
prefix = "Istilah",
desc = "berkaitan penjenisan",
additional = "'''NOTA''': Ini merupakan kategori jenis. Ia sepatutnya mengandungi istilah untuk jenis {{{topic}}}, " ..
"bukannya sekadar istilah berkaitan {{{topic}}}, dan sepatutnya juga tidak mengandungi nama {{{topic}}} khusus.",
},
kumpulan = {
prefix = "Istilah",
desc = "pengelompokan berkenaan varian khusus",
additional = "'''NOTA''': Ini merupakan kategori khusus. Ia tidak sepatutnya mengandungi apa-apa istilah secara " ..
"langsung tetapi hanya subkategori. Jika terdapat sebarang istilah berkaitan kategori ini, sila alihkannya ke" ..
"subkategori berkaitan.",
},
toplevel = {
desc = "UNUSED", -- all categories of this type hardcode their description
additional = "'''NOTA''': Kategori ini merupakan kategori senarai beraras tertinggi. Ia tidak sepatutnya " ..
"mengandungi sebarang perkataan secara langsung, tetapi sekadar topik berkenaan {{{topic}}}.",
},
}
local function invalid_type(types)
local valid_types = {}
for typ, _ in pairs(type_data) do
insert(valid_types, ("'%s'"):format(typ))
end
error(("Invalid type '%s', should be one or more of %s, comma-separated")
:format(types, mw.text.listToText(valid_types)))
end
local function split_types(types)
types = types or "berkenaan"
local splitvals = split(types, "%s*,%s*")
for i, typ in ipairs(splitvals) do
-- FIXME: Temporary
if typ == "topic" then
typ = "berkenaan"
end
if not type_data[typ] then
invalid_type(types)
end
splitvals[i] = typ
end
return splitvals
end
local function gsub_escaping_replacement(str, from, to)
return (str:gsub(pattern_escape(from), replacement_escape(to)))
end
function ucfirst(txt)
local italics, raw_txt = txt:match("^('*)(.-)$")
return italics .. mw.getContentLanguage():ucfirst(raw_txt)
end
function lcfirst(txt)
local italics, raw_txt = txt:match("^('*)(.-)$")
return italics .. mw.getContentLanguage():lcfirst(raw_txt)
end
local function convert_spec_to_string(data, desc)
if not desc then
return desc
end
local desc_type = type(desc)
if desc_type == "string" then
return desc
elseif desc_type == "number" then
return tostring(desc)
elseif not is_callable(desc) then
error("Internal error: `desc` must be a string, number, function, callable table or nil; received a " ..
desc_type)
end
desc = desc {
lang = data.lang,
sc = data.sc,
label = data.label,
category = data.category,
topic_data = data.topdata,
}
if not desc then
return desc
end
desc_type = type(desc)
if desc_type == "string" then
return desc
end
error("Internal error: the value returned by `desc` must be a string or nil; received a " .. desc_type)
end
local function get_and_cache(data, obj, key)
local val = convert_spec_to_string(data, obj[key])
obj[key] = val
return val
end
local function process_default(desc)
local stripped_desc = desc
local no_singularize, wikify, add_the
while true do
local new_stripped_desc = stripped_desc:match("^(.+) no singularize$")
if new_stripped_desc then
no_singularize = true
end
if not new_stripped_desc then
new_stripped_desc = stripped_desc:match("^(.+) wikify$")
if new_stripped_desc then
wikify = true
end
end
if not new_stripped_desc then
new_stripped_desc = stripped_desc:match("^(.+) with the$")
if new_stripped_desc then
add_the = true
end
end
if new_stripped_desc then
stripped_desc = new_stripped_desc
else
break
end
end
if stripped_desc == "default" then
return true, no_singularize, wikify, add_the
else
return false
end
end
local function format_desc(data, desc)
local desc_parts = {}
local types = split_types(data.topdata.type)
for _, typ in ipairs(types) do
local type_info = type_data[typ]
if type_info.prefix and type_info.prefix ~= "" then
-- Use "tertentu" if there's no language (umbrella category)
local langname = data.lang and "{{{langname}}}" or "tertentu"
insert(desc_parts, type_info.prefix .. " bahasa " .. langname .. " " .. type_info.desc .. " " .. desc)
else
insert(desc_parts, type_info.desc .. " " .. desc)
end
end
return require(table_module).serialCommaJoin(desc_parts) .. "."
end
local substitute_template_specs
local function format_displaytitle(data, include_lang_prefix, upcase)
local topdata, lang, label = data.topdata, data.lang, data.label
local displaytitle = substitute_template_specs(data, topdata.displaytitle)
if not displaytitle then
return nil
end
if upcase then
displaytitle = ucfirst(displaytitle)
end
if include_lang_prefix and lang then
displaytitle = ("%s:%s"):format(lang:getCode(), displaytitle)
end
return displaytitle
end
local function get_breadcrumb(data)
local topdata, lang, label = data.topdata, data.lang, data.label
local ret
if not lang and topdata.umbrella then
ret = topdata.umbrella.breadcrumb or topdata.umbrella.breadcrumb_and_sort_base
end
if not ret then
ret = topdata.breadcrumb or topdata.breadcrumb_and_sort_base or format_displaytitle(data, false, "upcase") or
label
end
if type(ret) == "string" or type(ret) == "number" then
ret = {name = ret}
end
local name = substitute_template_specs(data, ret.name)
local nocap = ret.nocap
return {name = name, nocap = nocap}
end
local function make_category_name(lang, label)
if lang then
return lang:getCode() .. ":" .. ucfirst(label)
else
return ucfirst(label)
end
end
local function replace_special_descriptions(data, desc)
if not desc then
return desc
end
if desc:find("^=") then
desc = desc:gsub("^=", "")
return format_desc(data, desc)
end
local is_default, no_singularize, wikify, add_the = process_default(desc)
if is_default then
local linked_label = require(topic_utilities_module).link_label(data.label, no_singularize, wikify)
if add_the then
linked_label = "" .. linked_label
end
return format_desc(data, linked_label)
else
return desc
end
end
local function get_displaytitle_or_label(data)
return format_displaytitle(data, false) or data.label
end
local function process_default_add_the(data, topic)
local is_default, _, _, add_the = process_default(topic)
if is_default then
topic = get_displaytitle_or_label(data)
if add_the then
topic = "" .. topic
end
end
return topic, is_default
end
substitute_template_specs = function(data, desc)
desc = convert_spec_to_string(data, desc)
if not desc then
return nil
end
local topdata, lang, label = data.topdata, data.lang, data.label
if desc:find("{{{umbrella_msg}}}") then
local catname = ucfirst(label)
desc = gsub_escaping_replacement(desc, "{{{umbrella_msg}}}",
"Kategori ini tidak mengandungi kata masukan kamus, hanya lain-lain kategori sahaja. Subkategorinya " ..
"adalah sama ada:\n\n* Subkategori dengan nama seperti \"{{{thespref}}}aa:" .. catname ..
"\" (dengan awalan kod bahasa) ialah subkategori istilah dalam bahasa tertentu. Anda mungkin berminat " ..
"terutamanya berkaitan [[:Kategori:{{{thespref}}}ms:" .. catname .. "]], untuk istilah bahasa Melayu.\n" ..
"* Subkategori yang dinamakan tanpa awalan kod bahasa ini merupakan kategori lanjutan seperti yang ini, " ..
"tetapi tertumpu kepada topik yang lebih halus."
)
end
if desc:find("{{{topic}}}") then
-- Compute the value for {{{topic}}}. If the user specified `topic`, use it. (If we're an umbrella category,
-- allow a separate value for `umbrella.topic`, falling back to `topic`.) Otherwise, see if the description
-- was specified as 'default' or a variant; if so, parse it to determine whether to add "the" to the label.
-- Otherwise, just use the label directly.
local topic = not lang and topdata.umbrella and topdata.umbrella.topic or topdata.topic
if topic then
topic = process_default_add_the(data, topic)
else
local desc
if not lang then
desc = topdata.umbrella and get_and_cache(data, topdata.umbrella, "description") or
get_and_cache(data, topdata, "umbrella_description")
end
desc = desc or get_and_cache(data, topdata, "description")
local defaulted_desc, is_default = process_default_add_the(data, desc)
if is_default then
topic = defaulted_desc
else
topic = get_displaytitle_or_label(data)
end
end
desc = gsub_escaping_replacement(desc, "{{{topic}}}", topic)
end
desc = desc:gsub("{{{thespref}}}", data.thesaurus_data and "Tesaurus:" or "")
return desc
end
local function process_box(data, def_topright_parts, val, pattern)
if not val then
return
end
local defval = ucfirst(data.label)
if type(val) ~= "table" then
val = {val}
end
for _, v in ipairs(val) do
if v == true then
insert(def_topright_parts, pattern:format(defval))
else
insert(def_topright_parts, pattern:format(v))
end
end
end
local function get_topright(data)
local topdata, lang = data.topdata, data.lang
local def_topright_parts = {}
process_box(data, def_topright_parts, topdata.wp, "{{wikipedia|%s}}")
process_box(data, def_topright_parts, topdata.wpcat, "{{wikipedia|cat=%s}}")
process_box(data, def_topright_parts, topdata.commonscat, "{{commonscat|%s}}")
local def_topright
if #def_topright_parts > 0 then
def_topright = concat(def_topright_parts, "\n")
end
if lang then
return substitute_template_specs(data, topdata.topright or def_topright)
else
return topdata.umbrella and substitute_template_specs(data, topdata.umbrella.topright) or
substitute_template_specs(data, def_topright)
end
end
local function remove_lang_params(desc)
desc = desc:gsub("^{{{langname}}} ", "")
desc = desc:gsub("{{{langcode}}}:", "")
desc = desc:gsub("^{{{langcode}}} ", "")
desc = desc:gsub("^{{{langcat}}} ", "")
return desc
end
local function get_additional_msg(data)
local types = split_types(data.topdata.type)
if #types > 1 then
local parts = {"'''NOTE''': This is a mixed category. It may contain terms of any of the following category types:"}
for i, typ in ipairs(types) do
insert(parts, ("* %s {{{topic}}}%s"):format(type_data[typ].desc, i == #types and "." or ";"))
end
insert(parts, "'''WARNING''': Such categories are strongly dispreferred and should be split into separate per-type categories.")
return concat(parts, "\n")
elseif label == "semua topik" then
return "'''NOTE''': This is the topmost topic category for {{{langname}}}. It should not directly contain " ..
"any terms, but only lists of topic categories organized by type."
else
return type_data[types[1]].additional
end
end
local function get_labels_categorizing(data)
local m_labels_utilities = require(labels_utilities_module)
return m_labels_utilities.format_labels_categorizing(
m_labels_utilities.find_labels_for_category(data.label, "topic", data.lang), nil, data.lang)
end
-- Return the description along with the text following and preceding the description. The description and additional
-- (i.e. following) text are returned in the form of closures so the work of calculating the text (which can be
-- expensive, especially in the case of the additional text, where get_labels_categorizing() scans the entire set of
-- labels for any that categorize into this category) is not done when not needed, e.g. in higher levels of the
-- breadcrumb chain, where only the breadcrumb and parents (in fact, really just the first parent) are actually needed.
local function get_description_additional_preceding(data)
local topdata, lang, label = data.topdata, data.lang, data.label
local desc, additional, preceding
-- This is kind of hacky, but it works for now.
local function postprocess_thesaurus(txt)
if not txt then
return nil
end
if not data.thesaurus_data then
return txt
end
txt = txt:gsub(" terms([ .,])", " thesaurus entries%1")
return txt
end
if lang then
desc = function()
return postprocess_thesaurus(substitute_template_specs(data,
replace_special_descriptions(data, get_and_cache(data, topdata, "description"))))
end
preceding = topdata.preceding
additional = function()
local additional_parts = {}
if topdata.additional then
insert(additional_parts, topdata.additional)
end
if not data.thesaurus_data then
insert(additional_parts, get_additional_msg(data))
local labels_msg = get_labels_categorizing(data)
if labels_msg then
insert(additional_parts, labels_msg)
end
end
return postprocess_thesaurus(substitute_template_specs(data, concat(additional_parts, "\n\n")))
end
else
if label == "semua topik" then
desc = "Kategori ini ialah kategori topik aras tertinggi untuk semua bahasa."
additional = "Ia hanya mempunyai kategori lain tanpa mengandungi entri kamus. Subkategori yang ada " ..
"terdiri daripada dua jenis berikut:\n\n" ..
"* Subkategori yang tersenarai pada permulaan (tanpa kod bahasa berawalan) mengumpul kategori " ..
"yang serupa dengan kategori ini, tetapi tertumpu kepada bidang subjek umum. Di bawahnya " ..
"terdiri daripada bidang subjek yang lebih halus.\n" ..
"* Subkategori yang format namanya seperti \"aa:Semua topik\" (dengan kod bahasa berawalan) " ..
"adalah peringkat tertinggi untuk kategori seperti ini, tetapi untuk bahasa-bahasa tertentu. " ..
"Anda mungkin berminat terutamanya berkenaan [[:Kategori:ms:Semua topik]], untuk istilah " ..
"bahasa Melayu. \n" ..
"Perhatikan bahawa kategori-kategori di bawah kategori pokok ini mengkategorikan istilah " ..
"secara semantik bukannya secara tatabahasa. Kategori tatabahasa (seperti kesemua kata kerja " ..
"bahasa Perancis, atau kesemua bentuk jamak tak sekata bahasa Inggeris) mempunyai struktur " ..
"penamaan yang berbeza, dengan nama bahasa yang dieja jelas, seperti " ..
"[[:Kategori:Kata kerja bahasa Perancis]] atau [[:Kategori:Bentuk jamak tak sekata bahasa Inggeris]]."
return desc, additional
end
-- Assume that if the description field contains a function, the function will return non-nil, so we don't
-- have to call the function at this point (in case it is heavyweight).
local has_umbrella_desc = topdata.umbrella and topdata.umbrella.description or topdata.umbrella_description
desc = function()
local desc = topdata.umbrella and get_and_cache(data, topdata.umbrella, "description") or
get_and_cache(data, topdata, "umbrella_description")
if not desc then
desc = get_and_cache(data, topdata, "description")
if desc then
desc = replace_special_descriptions(data, desc)
desc = remove_lang_params(desc)
desc = desc:gsub("%.$", "")
desc = "Kategori ini berkaitan dengan topik: " .. desc .. "."
end
end
if not desc then
desc = "Kategori berkenaan " .. label .. " dalam bahasa-bahasa khusus."
end
return postprocess_thesaurus(substitute_template_specs(data, desc))
end
preceding = topdata.umbrella and topdata.umbrella.preceding or not has_umbrella_desc and topdata.preceding
if preceding then
preceding = remove_lang_params(preceding)
end
additional = function()
local additional_parts = {}
local topdata_additional = topdata.umbrella and topdata.umbrella.additional or
not has_umbrella_desc and topdata.additional
if topdata_additional then
insert(additional_parts, remove_lang_params(topdata_additional))
end
insert(additional_parts, "{{{umbrella_msg}}}")
if not data.thesaurus_data then
insert(additional_parts, get_additional_msg(data))
local labels_msg = get_labels_categorizing(data)
if labels_msg then
insert(additional_parts, labels_msg)
end
end
return postprocess_thesaurus(substitute_template_specs(data, concat(additional_parts, "\n\n")))
end
end
preceding = substitute_template_specs(data, preceding)
return desc, additional, preceding
end
local function normalize_sort_key(data, sort)
local topdata, lang, label = data.topdata, data.lang, data.label
sort = sort or not lang and topdata.umbrella and topdata.umbrella.breadcrumb_and_sort_base or
topdata.breadcrumb_and_sort_base
if not sort then
-- When defaulting sort key to label, strip 'The ' (e.g. in 'The Matrix', 'The Hunger Games')
-- and 'A ' (e.g. in 'A Song of Ice and Fire', 'A Christmas Carol') from label.
local stripped_sort = label:match("^[Tt]he (.*)$")
if stripped_sort then
sort = stripped_sort
end
if not stripped_sort then
stripped_sort = label:match("^[Aa] (.*)$")
if stripped_sort then
sort = stripped_sort
end
end
if not stripped_sort then
sort = label
end
end
sort = substitute_template_specs(data, sort)
if not lang then
sort = " " .. sort
end
return sort
end
local function get_topic_parents(data)
local topdata, lang, label = data.topdata, data.lang, data.label
local parents = topdata.parents
if not lang and label == "semua topik" then
return {{ name = "Kategori:Asas", sort = "topik" }}
end
if not parents or #parents == 0 then
return nil
end
local ret = {}
for _, parent in ipairs(parents) do
parent = mw.clone(parent)
if type(parent) ~= "table" then
parent = {name = parent}
end
parent.sort = normalize_sort_key(data, parent.sort)
if type(parent.name) ~= "string" then
error(("Internal error: parent.name is not a string: parent = %s"):format(dump(parent)))
end
if parent.name:find("^Kategori:") or parent.nontopic then
-- leave as-is
parent.nontopic = nil
else
parent.name = make_category_name(lang, parent.name)
end
parent.name = substitute_template_specs(data, parent.name)
insert(ret, parent)
end
local function make_list_of_type_parent(typ)
return {
name = make_category_name(lang, ("senarai kategori %s"):format(typ)),
sort = (not lang and " " or "") .. label,
}
end
if topdata.type ~= "toplevel" then
local types = split_types(topdata.type)
for _, typ in ipairs(types) do
insert(ret, make_list_of_type_parent(typ))
end
if #types > 1 then
insert(ret, make_list_of_type_parent("campuran"))
end
end
-- Add umbrella category.
if lang then
insert(ret, {
name = make_category_name(nil, label),
sort = lang:getCanonicalName(),
})
end
return ret
end
local function get_thesaurus_parents(data)
local topdata, lang, label = data.topdata, data.lang, data.label
local parent_substitutions = data.thesaurus_data.parent_substitutions
local parents = topdata.parents
if not parents or #parents == 0 then
return nil
end
local ret = {}
for _, parent in ipairs(parents) do
-- Process parent categories as follows:
-- 1. skip non-topic cats and meta-categories that start with "List of"
-- 2. map "en:All topics" to "English thesaurus entries" (and same for other languages), but map "All topics" itself to the root "Thesaurus" category
-- 3. check if this parent is to be substituted, if so, substitute it
-- 4. prepend "Thesaurus:" to all other category names
parent = mw.clone(parent)
if type(parent) ~= "table" then
parent = {name = parent}
end
parent.sort = normalize_sort_key(data, parent.sort)
if type(parent.name) ~= "string" then
error(("Internal error: parent.name is not a string: parent = %s"):format(dump(parent)))
end
if parent.name:find("^Kategori:") or parent.nontopic then
-- skip
elseif parent.name == "semua topik" or parent_substitutions[parent.name] == "semua topik" then
if not lang then
insert(ret, {
name = "Tesaurus",
sort = label,
})
else
insert(ret, {
name = "thesaurus entries",
sort = parent.sort,
lang = lang:getCode(),
is_label = true,
})
end
else
parent.name = "Tesaurus:" .. make_category_name(lang, parent_substitutions[parent.name] or parent.name)
parent.name = substitute_template_specs(data, parent.name)
insert(ret, parent)
end
end
-- Add the non-thesaurus version of this category as a parent, unless it is a thesaurus-only category.
if not topdata.thesaurusonly then
insert(ret, { name = make_category_name(lang, label), sort = " " })
end
-- Add umbrella category.
if lang then
insert(ret, {
name = "Tesaurus:" .. make_category_name(nil, label),
sort = lang:getCanonicalName(),
})
end
return ret
end
local function generate_spec(category, lang, upcase_label, thesaurus_data)
local label_data = require(topic_data_module)
local label
-- Convert label to lowercase if possible
local lowercase_label = mw.getContentLanguage():lcfirst(upcase_label)
-- Check if the label exists
local labels = label_data["LABELS"]
if labels[lowercase_label] then
label = lowercase_label
else
label = upcase_label
end
local topdata = labels[label]
-- Go through handlers
if not topdata then
for _, handler in ipairs(label_data["HANDLERS"]) do
topdata = handler.handler(label, lang)
if topdata then
topdata.module = handler.module
break
end
end
end
if not topdata then
return nil
end
local data = {
category = category,
lang = lang,
label = label,
topdata = topdata,
thesaurus_data = thesaurus_data,
}
local description, additional, preceding = get_description_additional_preceding(data)
local parents
if thesaurus_data then
parents = get_thesaurus_parents(data)
else
parents = get_topic_parents(data)
end
return {
lang = lang and lang:getCode() or nil,
description = description,
additional = additional,
preceding = preceding,
parents = parents,
breadcrumb = get_breadcrumb(data),
displaytitle = format_displaytitle(data, "include lang prefix", "upcase"),
topright = get_topright(data),
module = topdata.module,
can_be_empty = not lang,
hidden = false,
}
end
-- Handler for `Thesaurus:...` categories.
table.insert(raw_handlers, function(data)
local code, upcase_label = data.category:match("^Tesaurus:(%l[%a-]*%a):(.+)$")
local lang
if code then
lang = require(languages_module).getByCode(code)
if not lang then
mw.log(("Category '%s' looks like a language-specific thesaurus category but unable to match language prefix"):
format(data.category))
return nil
end
else
upcase_label = data.category:match("^Tesaurus:(.+)$")
end
if upcase_label then
local thesaurus_data = require(thesaurus_data_module)
-- substituted category names are not allowed
if thesaurus_data.parent_substitutions[lcfirst(upcase_label)] then
error(("Category is not allowed as a Thesaurus category: %s (see the list of parent substitutions at " ..
"[[Module:category tree/topic/thesaurus]])"):format(data.category))
end
return generate_spec(data.category, lang, upcase_label, thesaurus_data)
end
end)
-- Handler for regular topic categories.
table.insert(raw_handlers, function(data)
local code, upcase_label = data.category:match("^(%l[%a-]*%a):(.+)$")
local lang
if code then
lang = require(languages_module).getByCode(code)
if not lang then
mw.log(("Category '%s' looks like a language-specific topic category but unable to match language prefix"):
format(data.category))
return nil
end
else
upcase_label = data.category
end
return generate_spec(data.category, lang, upcase_label)
end)
-----------------------------------------------------------------------------
-- --
-- RAW CATEGORIES --
-- --
-----------------------------------------------------------------------------
raw_categories["Tesaurus"] = {
description = "Category for entries of the Wiktionary thesaurus, located in a separate namespace.",
additional = [=[
There are '''three ways to browse''' the thesaurus:
* Look under '''[[:Category:Thesaurus entries by language]]''' to get started.
* Use the search box below.
* Browse the thesaurus by topic using the links under "Subcategories" below.
The main project page is [[Wiktionary:Thesaurus]].
{{ws header|<nowiki/>|link=}}]=],
parents = {
"Kategori:Asas",
"Kategori:Projek Wikikamus",
},
}
return {RAW_CATEGORIES = raw_categories, RAW_HANDLERS = raw_handlers}
qze90qk29wrxj28wf2zof5nx4bq2x80
Modul:category tree/topic/Communication
828
11523
343051
342796
2026-05-20T03:35:20Z
Hakimi97
2668
343051
Scribunto
text/plain
local labels = {}
local unpack = unpack or table.unpack -- Lua 5.2 compatibility
-- FIXME: Lookup langs in the language list.
for _, lang_etc in ipairs {
"Bahasa Arab", {"Bahasa Cina", "Bahasa-bahasa Cina"}, "Bahasa Inggeris", "Bahasa Jerman", "Bahasa Jepun", "Bahasa Okinawa",
"Bahasa Portugis", "Bahasa Sepanyol", "Bahasa Vietnam", {"Bahasa Melayu", "Bahasa-bahasa Melayik"},
} do
if type(lang_etc) ~= "table" then
lang_etc = {lang_etc}
end
local lang, desc = unpack(lang_etc)
desc = desc or ("[[:Kategori:%s|%s]]"):format(lang, lang)
labels[lang] = {
type = "berkenaan",
description = "=" .. desc,
parents = {"bahasa-bahasa"},
}
end
labels["komunikasi"] = {
type = "berkenaan",
description = "default",
parents = {"Semua topik"},
}
labels["huruf"] = {
type = "nama",
description = "default",
parents = {"sistem tulisan"},
}
labels["bahasa buatan"] = { -- distinguish from "cat:constructed languages" family category
type = "nama",
description = "={{w|constructed language}}s",
parents = {"bahasa-bahasa"},
}
labels["bahasa badan"] = {
type = "berkenaan",
description = "default",
parents = {"bahasa", "nonverbal communication"},
}
labels["penyiaran"] = {
type = "berkenaan",
description = "default",
parents = {"media", "telekomunikasi"},
}
labels["Komponen aksara Cina"] = {
type = "set",
description = "=[[komponen|Komponen]] [[aksara]] [[Cina]].",
parents = {"Huruf, simbol dan tanda baca"},
}
labels["tanda diakritik"] = {
type = "set",
description = "default",
parents = {"Huruf, simbol dan tanda baca"},
}
labels["dialek"] = {
type = "set",
description = "default",
parents = {"bahasa"},
}
labels["dictation"] = {
type = "berkenaan",
description = "default",
parents = {"komunikasi"},
}
labels["bahasa pupus"] = {
type = "nama",
description = "default",
parents = {"bahasa-bahasa"},
}
labels["bahasa isyarat"] = {
type = "nama",
description = "default",
parents = {"bahasa-bahasa"},
}
labels["facial expressions"] = {
type = "set",
description = "default",
parents = {"nonverbal communication", "face"},
}
labels["kiasan"] = {
type = "set",
description = "=[[figure of speech|figures of speech]]",
parents = {"retorik"},
}
labels["bendera"] = {
type = "berkenaan,name,type",
description = "default",
parents = {"komunikasi"},
}
labels["jargon"] = {
type = "berkenaan",
description = "default",
parents = {"bahasa"},
}
labels["aksara Han"] = {
type = "berkenaan",
description = "default",
parents = {"sistem tulisan"},
}
labels["bahasa"] = {
type = "berkenaan",
description = "default",
parents = {"komunikasi"},
}
labels["keluarga bahasa"] = {
type = "nama",
description = "Topik berkenaan [[keluarga bahasa]], termasuklah yang diterima dan yang bersifat kontroversi.",
parents = {"bahasa", "nama"},
}
labels["bahasa-bahasa"] = {
type = "nama",
description = "default",
parents = {"bahasa", "nama"},
}
labels["Huruf, simbol dan tanda baca"] = {
type = "set",
description = "=[[letter]]s, [[symbol]]s, and [[punctuation]]",
parents = {"Ortografi"},
}
labels["logical fallacies"] = {
type = "set",
description = "=[[logical fallacy|logical fallacies]], clearly defined errors in reasoning used to support or refute an argument",
additional = "{{also|Kategori:{{{langcode}}}:biases}}",
parents = {"retorik", "logic"},
}
labels["media"] = {
type = "berkenaan",
description = "default",
parents = {"komunikasi"},
}
labels["telefon bimbit"] = {
type = "berkenaan,set",
description = "default",
parents = {"telefoni"},
}
labels["nonverbal communication"] = {
type = "berkenaan",
description = "default",
parents = {"komunikasi"},
}
labels["ortografi"] = {
type = "berkenaan",
description = "default",
parents = {"penulisan"},
}
labels["palaeography"] = {
type = "berkenaan",
description = "default",
parents = {"penulisan"},
}
labels["pos"] = {
type = "berkenaan",
description = "=[[post#Noun|post]] or [[mail#Noun|mail]]",
parents = {"komunikasi"},
}
labels["postal abbreviations"] = {
type = "nama",
description = "default",
parents = {"pos"},
}
labels["public relations"] = {
type = "berkenaan",
description = "default no singularize",
parents = {"komunikasi"},
}
labels["tanda baca"] = {
type = "set",
description = "default",
parents = {"Huruf, simbol dan tanda baca"},
}
labels["radio"] = {
type = "berkenaan",
description = "default",
parents = {"telekomunikasi"},
}
labels["retorik"] = {
type = "berkenaan",
description = "default",
parents = {"bahasa"},
}
labels["signs"] = {
type = "berkenaan,name,type",
description = "default",
parents = {"komunikasi"},
}
labels["sociolects"] = {
type = "nama",
description = "default",
parents = {"bahasa"},
}
labels["simbol"] = {
type = "set",
description = "=[[symbol]]s, especially [[mathematical]] and [[scientific]] symbols",
additional = "Most symbols have equivalent meanings in many languages and can therefore be found in [[:Category:Translingual symbols]].",
parents = {"Huruf, simbol dan tanda baca"},
}
labels["bercakap"] = {
type = "berkenaan",
description = "default",
parents = {"bahasa", "tingkah laku manusia"},
}
labels["telekomunikasi"] = {
type = "berkenaan",
description = "default no singularize",
parents = {"komunikasi", "teknologi"},
}
labels["telegrafi"] = {
type = "berkenaan",
description = "default",
parents = {"telekomunikasi", "elektronik"},
wpcat = true,
commonscat = true,
}
labels["telefoni"] = {
type = "berkenaan",
description = "default",
parents = {"telekomunikasi", "elektronik"},
}
labels["bermesej"] = {
type = "berkenaan",
description = "default",
parents = {"telekomunikasi"},
}
labels["textual division"] = {
type = "berkenaan",
description = "default",
parents = {"penulisan"},
}
labels["tipografi"] = {
type = "berkenaan",
description = "default",
parents = {"penulisan", "percetakan"},
}
labels["penulisan"] = {
type = "berkenaan",
description = "default",
parents = {"bahasa", "tingkah laku manusia"},
}
labels["sistem tulisan"] = {
type = "set",
description = "default",
parents = {"penulisan"},
}
return labels
pusai6lk4bgae695bet8dqr9idmzts9
343052
343051
2026-05-20T03:42:53Z
Hakimi97
2668
343052
Scribunto
text/plain
local labels = {}
local unpack = unpack or table.unpack -- Lua 5.2 compatibility
-- FIXME: Lookup langs in the language list.
for _, lang_etc in ipairs {
"Bahasa Arab", {"Bahasa Cina", "Bahasa-bahasa Cina"}, "Bahasa Inggeris", "Bahasa Jerman", "Bahasa Jepun", "Bahasa Okinawa",
"Bahasa Portugis", "Bahasa Sepanyol", "Bahasa Vietnam", {"Bahasa Melayu", "Bahasa-bahasa Melayik"},
} do
if type(lang_etc) ~= "table" then
lang_etc = {lang_etc}
end
local lang, desc = unpack(lang_etc)
desc = desc or ("[[:Kategori:%s|%s]]"):format(lang, lang)
labels[lang] = {
type = "berkenaan",
description = "=" .. desc,
parents = {"bahasa-bahasa"},
}
end
labels["komunikasi"] = {
type = "berkenaan",
description = "default",
parents = {"Semua topik"},
}
labels["huruf"] = {
type = "nama",
description = "default",
parents = {"sistem tulisan"},
}
labels["bahasa buatan"] = { -- distinguish from "cat:constructed languages" family category
type = "nama",
description = "={{w|constructed language}}s",
parents = {"bahasa-bahasa"},
}
labels["bahasa badan"] = {
type = "berkenaan",
description = "default",
parents = {"bahasa", "nonverbal communication"},
}
labels["penyiaran"] = {
type = "berkenaan",
description = "default",
parents = {"media", "telekomunikasi"},
}
labels["Komponen aksara Cina"] = {
type = "set",
description = "=[[komponen|Komponen]] [[aksara]] [[Cina]].",
parents = {"Huruf, simbol dan tanda baca"},
}
labels["tanda diakritik"] = {
type = "set",
description = "default",
parents = {"Huruf, simbol dan tanda baca"},
}
labels["dialek"] = {
type = "set",
description = "default",
parents = {"bahasa"},
}
labels["dictation"] = {
type = "berkenaan",
description = "default",
parents = {"komunikasi"},
}
labels["bahasa pupus"] = {
type = "nama",
description = "default",
parents = {"bahasa-bahasa"},
}
labels["bahasa isyarat"] = {
type = "nama",
description = "default",
parents = {"bahasa-bahasa"},
}
labels["facial expressions"] = {
type = "set",
description = "default",
parents = {"nonverbal communication", "face"},
}
labels["kiasan"] = {
type = "set",
description = "=[[figure of speech|figures of speech]]",
parents = {"retorik"},
}
labels["bendera"] = {
type = "berkenaan,nama,jenis",
description = "default",
parents = {"komunikasi"},
}
labels["jargon"] = {
type = "berkenaan",
description = "default",
parents = {"bahasa"},
}
labels["aksara Han"] = {
type = "berkenaan",
description = "default",
parents = {"sistem tulisan"},
}
labels["bahasa"] = {
type = "berkenaan",
description = "default",
parents = {"komunikasi"},
}
labels["keluarga bahasa"] = {
type = "nama",
description = "Topik berkenaan [[keluarga bahasa]], termasuklah yang diterima dan yang bersifat kontroversi.",
parents = {"bahasa", "nama"},
}
labels["bahasa-bahasa"] = {
type = "nama",
description = "default",
parents = {"bahasa", "nama"},
}
labels["Huruf, simbol dan tanda baca"] = {
type = "set",
description = "=[[letter]]s, [[symbol]]s, and [[punctuation]]",
parents = {"Ortografi"},
}
labels["kesilapan logik"] = {
type = "set",
description = "=[[logical fallacy|logical fallacies]], clearly defined errors in reasoning used to support or refute an argument",
additional = "{{also|Kategori:{{{langcode}}}:biases}}",
parents = {"retorik", "logik"},
}
labels["media"] = {
type = "berkenaan",
description = "default",
parents = {"komunikasi"},
}
labels["telefon bimbit"] = {
type = "berkenaan,set",
description = "default",
parents = {"telefoni"},
}
labels["nonverbal communication"] = {
type = "berkenaan",
description = "default",
parents = {"komunikasi"},
}
labels["ortografi"] = {
type = "berkenaan",
description = "default",
parents = {"penulisan"},
}
labels["palaeography"] = {
type = "berkenaan",
description = "default",
parents = {"penulisan"},
}
labels["pos"] = {
type = "berkenaan",
description = "=[[post#Noun|post]] or [[mail#Noun|mail]]",
parents = {"komunikasi"},
}
labels["singkatan poskod"] = {
type = "nama",
description = "default",
parents = {"pos"},
}
labels["perhubungan awam"] = {
type = "berkenaan",
description = "default no singularize",
parents = {"komunikasi"},
}
labels["tanda baca"] = {
type = "set",
description = "default",
parents = {"Huruf, simbol dan tanda baca"},
}
labels["radio"] = {
type = "berkenaan",
description = "default",
parents = {"telekomunikasi"},
}
labels["retorik"] = {
type = "berkenaan",
description = "default",
parents = {"bahasa"},
}
labels["isyarat"] = {
type = "berkenaan,nama,jenis",
description = "default",
parents = {"komunikasi"},
}
labels["sosiolek"] = {
type = "nama",
description = "default",
parents = {"bahasa"},
}
labels["simbol"] = {
type = "set",
description = "=[[symbol]]s, especially [[mathematical]] and [[scientific]] symbols",
additional = "Most symbols have equivalent meanings in many languages and can therefore be found in [[:Category:Translingual symbols]].",
parents = {"Huruf, simbol dan tanda baca"},
}
labels["bercakap"] = {
type = "berkenaan",
description = "default",
parents = {"bahasa", "tingkah laku manusia"},
}
labels["telekomunikasi"] = {
type = "berkenaan",
description = "default no singularize",
parents = {"komunikasi", "teknologi"},
}
labels["telegrafi"] = {
type = "berkenaan",
description = "default",
parents = {"telekomunikasi", "elektronik"},
wpcat = true,
commonscat = true,
}
labels["telefoni"] = {
type = "berkenaan",
description = "default",
parents = {"telekomunikasi", "elektronik"},
}
labels["bermesej"] = {
type = "berkenaan",
description = "default",
parents = {"telekomunikasi"},
}
labels["textual division"] = {
type = "berkenaan",
description = "default",
parents = {"penulisan"},
}
labels["tipografi"] = {
type = "berkenaan",
description = "default",
parents = {"penulisan", "percetakan"},
}
labels["penulisan"] = {
type = "berkenaan",
description = "default",
parents = {"bahasa", "tingkah laku manusia"},
}
labels["sistem tulisan"] = {
type = "set",
description = "default",
parents = {"penulisan"},
}
return labels
nofvy9t710iengy0yr9s0wnoanvzf2t
343053
343052
2026-05-20T05:01:47Z
Hakimi97
2668
343053
Scribunto
text/plain
local labels = {}
local unpack = unpack or table.unpack -- Lua 5.2 compatibility
-- FIXME: Lookup langs in the language list.
for _, lang_etc in ipairs {
"Arab", "Aram", {"Cina", "Bahasa-bahasa [[Cina]]"}, {"Yunani", "Bahasa-bahasa [[Yunani]] dan [[Yunani Kuno]]"}, "Inggeris", "Jerman", "Jepun", "Latin", "Korea", "Okinawa",
"Portugis", "Sanskrit", "Sepanyol", "Tamil", "Vietnam", {"Melayu", "Bahasa-bahasa [[Melayik]]"},
} do
if type(lang_etc) ~= "table" then
lang_etc = {lang_etc}
end
local lang, desc = unpack(lang_etc)
desc = desc or ("[[:Kategori:Bahasa %s|Bahasa %s]]"):format(lang, lang)
labels[lang] = {
type = "berkenaan",
description = "=" .. desc,
parents = {"bahasa-bahasa"},
}
end
labels["komunikasi"] = {
type = "berkenaan",
description = "default",
parents = {"Semua topik"},
}
labels["huruf"] = {
type = "nama",
description = "default",
parents = {"sistem tulisan"},
}
labels["bahasa buatan"] = { -- distinguish from "cat:constructed languages" family category
type = "nama",
description = "={{w|constructed language}}s",
parents = {"bahasa-bahasa"},
}
labels["bahasa badan"] = {
type = "berkenaan",
description = "default",
parents = {"bahasa", "nonverbal communication"},
}
labels["penyiaran"] = {
type = "berkenaan",
description = "default",
parents = {"media", "telekomunikasi"},
}
labels["Komponen aksara Cina"] = {
type = "set",
description = "=[[komponen|Komponen]] [[aksara]] [[Cina]].",
parents = {"Huruf, simbol dan tanda baca"},
}
labels["tanda diakritik"] = {
type = "set",
description = "default",
parents = {"Huruf, simbol dan tanda baca"},
}
labels["dialek"] = {
type = "set",
description = "default",
parents = {"bahasa"},
}
labels["dictation"] = {
type = "berkenaan",
description = "default",
parents = {"komunikasi"},
}
labels["bahasa pupus"] = {
type = "nama",
description = "default",
parents = {"bahasa-bahasa"},
}
labels["bahasa isyarat"] = {
type = "nama",
description = "default",
parents = {"bahasa-bahasa"},
}
labels["facial expressions"] = {
type = "set",
description = "default",
parents = {"nonverbal communication", "face"},
}
labels["kiasan"] = {
type = "set",
description = "=[[figure of speech|figures of speech]]",
parents = {"retorik"},
}
labels["bendera"] = {
type = "berkenaan,nama,jenis",
description = "default",
parents = {"komunikasi"},
}
labels["jargon"] = {
type = "berkenaan",
description = "default",
parents = {"bahasa"},
}
labels["aksara Han"] = {
type = "berkenaan",
description = "default",
parents = {"sistem tulisan"},
}
labels["bahasa"] = {
type = "berkenaan",
description = "default",
parents = {"komunikasi"},
}
labels["keluarga bahasa"] = {
type = "nama",
description = "Topik berkenaan [[keluarga bahasa]], termasuklah yang diterima dan yang bersifat kontroversi.",
parents = {"bahasa", "nama"},
}
labels["bahasa-bahasa"] = {
type = "nama",
description = "default",
parents = {"bahasa", "nama"},
}
labels["Huruf, simbol dan tanda baca"] = {
type = "set",
description = "=[[letter]]s, [[symbol]]s, and [[punctuation]]",
parents = {"Ortografi"},
}
labels["kesilapan logik"] = {
type = "set",
description = "=[[logical fallacy|logical fallacies]], clearly defined errors in reasoning used to support or refute an argument",
additional = "{{also|Kategori:{{{langcode}}}:biases}}",
parents = {"retorik", "logik"},
}
labels["media"] = {
type = "berkenaan",
description = "default",
parents = {"komunikasi"},
}
labels["telefon bimbit"] = {
type = "berkenaan,set",
description = "default",
parents = {"telefoni"},
}
labels["nonverbal communication"] = {
type = "berkenaan",
description = "default",
parents = {"komunikasi"},
}
labels["ortografi"] = {
type = "berkenaan",
description = "default",
parents = {"penulisan"},
}
labels["palaeography"] = {
type = "berkenaan",
description = "default",
parents = {"penulisan"},
}
labels["pos"] = {
type = "berkenaan",
description = "=[[post#Noun|post]] or [[mail#Noun|mail]]",
parents = {"komunikasi"},
}
labels["singkatan poskod"] = {
type = "nama",
description = "default",
parents = {"pos"},
}
labels["perhubungan awam"] = {
type = "berkenaan",
description = "default no singularize",
parents = {"komunikasi"},
}
labels["tanda baca"] = {
type = "set",
description = "default",
parents = {"Huruf, simbol dan tanda baca"},
}
labels["radio"] = {
type = "berkenaan",
description = "default",
parents = {"telekomunikasi"},
}
labels["retorik"] = {
type = "berkenaan",
description = "default",
parents = {"bahasa"},
}
labels["isyarat"] = {
type = "berkenaan,nama,jenis",
description = "default",
parents = {"komunikasi"},
}
labels["sosiolek"] = {
type = "nama",
description = "default",
parents = {"bahasa"},
}
labels["simbol"] = {
type = "set",
description = "=[[symbol]]s, especially [[mathematical]] and [[scientific]] symbols",
additional = "Most symbols have equivalent meanings in many languages and can therefore be found in [[:Category:Translingual symbols]].",
parents = {"Huruf, simbol dan tanda baca"},
}
labels["bercakap"] = {
type = "berkenaan",
description = "default",
parents = {"bahasa", "tingkah laku manusia"},
}
labels["telekomunikasi"] = {
type = "berkenaan",
description = "default no singularize",
parents = {"komunikasi", "teknologi"},
}
labels["telegrafi"] = {
type = "berkenaan",
description = "default",
parents = {"telekomunikasi", "elektronik"},
wpcat = true,
commonscat = true,
}
labels["telefoni"] = {
type = "berkenaan",
description = "default",
parents = {"telekomunikasi", "elektronik"},
}
labels["bermesej"] = {
type = "berkenaan",
description = "default",
parents = {"telekomunikasi"},
}
labels["textual division"] = {
type = "berkenaan",
description = "default",
parents = {"penulisan"},
}
labels["tipografi"] = {
type = "berkenaan",
description = "default",
parents = {"penulisan", "percetakan"},
}
labels["penulisan"] = {
type = "berkenaan",
description = "default",
parents = {"bahasa", "tingkah laku manusia"},
}
labels["sistem tulisan"] = {
type = "set",
description = "default",
parents = {"penulisan"},
}
return labels
c4w4kb7wa9ea9tost1eaiswt3cfz138
343054
343053
2026-05-20T05:03:13Z
Hakimi97
2668
343054
Scribunto
text/plain
local labels = {}
local unpack = unpack or table.unpack -- Lua 5.2 compatibility
-- FIXME: Lookup langs in the language list.
for _, lang_etc in ipairs {
"Bahasa Arab", "Bahasa Aram", {"Bahasa Cina", "Bahasa-bahasa Cina"}, {"Bahasa Yunani", "Bahasa-bahasa Yunani dan Yunani Kuno"}, "Bahasa Inggeris", "Bahasa Jerman", "Bahasa Jepun", "Bahasa Latin", "Bahasa Korea", "Bahasa Okinawa",
"Bahasa Portugis", "Bahasa Sanskrit", "Bahasa Sepanyol", "Bahasa Tamil", "Bahasa Vietnam", {"Bahasa Melayu", "Bahasa-bahasa Melayik"},
} do
if type(lang_etc) ~= "table" then
lang_etc = {lang_etc}
end
local lang, desc = unpack(lang_etc)
desc = desc or ("[[:Kategori:%s|%s]]"):format(lang, lang)
labels[lang] = {
type = "berkenaan",
description = "=" .. desc,
parents = {"bahasa-bahasa"},
}
end
labels["komunikasi"] = {
type = "berkenaan",
description = "default",
parents = {"Semua topik"},
}
labels["huruf"] = {
type = "nama",
description = "default",
parents = {"sistem tulisan"},
}
labels["bahasa buatan"] = { -- distinguish from "cat:constructed languages" family category
type = "nama",
description = "={{w|constructed language}}s",
parents = {"bahasa-bahasa"},
}
labels["bahasa badan"] = {
type = "berkenaan",
description = "default",
parents = {"bahasa", "nonverbal communication"},
}
labels["penyiaran"] = {
type = "berkenaan",
description = "default",
parents = {"media", "telekomunikasi"},
}
labels["Komponen aksara Cina"] = {
type = "set",
description = "=[[komponen|Komponen]] [[aksara]] [[Cina]].",
parents = {"Huruf, simbol dan tanda baca"},
}
labels["tanda diakritik"] = {
type = "set",
description = "default",
parents = {"Huruf, simbol dan tanda baca"},
}
labels["dialek"] = {
type = "set",
description = "default",
parents = {"bahasa"},
}
labels["dictation"] = {
type = "berkenaan",
description = "default",
parents = {"komunikasi"},
}
labels["bahasa pupus"] = {
type = "nama",
description = "default",
parents = {"bahasa-bahasa"},
}
labels["bahasa isyarat"] = {
type = "nama",
description = "default",
parents = {"bahasa-bahasa"},
}
labels["facial expressions"] = {
type = "set",
description = "default",
parents = {"nonverbal communication", "face"},
}
labels["kiasan"] = {
type = "set",
description = "=[[figure of speech|figures of speech]]",
parents = {"retorik"},
}
labels["bendera"] = {
type = "berkenaan,nama,jenis",
description = "default",
parents = {"komunikasi"},
}
labels["jargon"] = {
type = "berkenaan",
description = "default",
parents = {"bahasa"},
}
labels["aksara Han"] = {
type = "berkenaan",
description = "default",
parents = {"sistem tulisan"},
}
labels["bahasa"] = {
type = "berkenaan",
description = "default",
parents = {"komunikasi"},
}
labels["keluarga bahasa"] = {
type = "nama",
description = "Topik berkenaan [[keluarga bahasa]], termasuklah yang diterima dan yang bersifat kontroversi.",
parents = {"bahasa", "nama"},
}
labels["bahasa-bahasa"] = {
type = "nama",
description = "default",
parents = {"bahasa", "nama"},
}
labels["Huruf, simbol dan tanda baca"] = {
type = "set",
description = "=[[letter]]s, [[symbol]]s, and [[punctuation]]",
parents = {"Ortografi"},
}
labels["kesilapan logik"] = {
type = "set",
description = "=[[logical fallacy|logical fallacies]], clearly defined errors in reasoning used to support or refute an argument",
additional = "{{also|Kategori:{{{langcode}}}:biases}}",
parents = {"retorik", "logik"},
}
labels["media"] = {
type = "berkenaan",
description = "default",
parents = {"komunikasi"},
}
labels["telefon bimbit"] = {
type = "berkenaan,set",
description = "default",
parents = {"telefoni"},
}
labels["nonverbal communication"] = {
type = "berkenaan",
description = "default",
parents = {"komunikasi"},
}
labels["ortografi"] = {
type = "berkenaan",
description = "default",
parents = {"penulisan"},
}
labels["palaeography"] = {
type = "berkenaan",
description = "default",
parents = {"penulisan"},
}
labels["pos"] = {
type = "berkenaan",
description = "=[[post#Noun|post]] or [[mail#Noun|mail]]",
parents = {"komunikasi"},
}
labels["singkatan poskod"] = {
type = "nama",
description = "default",
parents = {"pos"},
}
labels["perhubungan awam"] = {
type = "berkenaan",
description = "default no singularize",
parents = {"komunikasi"},
}
labels["tanda baca"] = {
type = "set",
description = "default",
parents = {"Huruf, simbol dan tanda baca"},
}
labels["radio"] = {
type = "berkenaan",
description = "default",
parents = {"telekomunikasi"},
}
labels["retorik"] = {
type = "berkenaan",
description = "default",
parents = {"bahasa"},
}
labels["isyarat"] = {
type = "berkenaan,nama,jenis",
description = "default",
parents = {"komunikasi"},
}
labels["sosiolek"] = {
type = "nama",
description = "default",
parents = {"bahasa"},
}
labels["simbol"] = {
type = "set",
description = "=[[symbol]]s, especially [[mathematical]] and [[scientific]] symbols",
additional = "Most symbols have equivalent meanings in many languages and can therefore be found in [[:Category:Translingual symbols]].",
parents = {"Huruf, simbol dan tanda baca"},
}
labels["bercakap"] = {
type = "berkenaan",
description = "default",
parents = {"bahasa", "tingkah laku manusia"},
}
labels["telekomunikasi"] = {
type = "berkenaan",
description = "default no singularize",
parents = {"komunikasi", "teknologi"},
}
labels["telegrafi"] = {
type = "berkenaan",
description = "default",
parents = {"telekomunikasi", "elektronik"},
wpcat = true,
commonscat = true,
}
labels["telefoni"] = {
type = "berkenaan",
description = "default",
parents = {"telekomunikasi", "elektronik"},
}
labels["bermesej"] = {
type = "berkenaan",
description = "default",
parents = {"telekomunikasi"},
}
labels["textual division"] = {
type = "berkenaan",
description = "default",
parents = {"penulisan"},
}
labels["tipografi"] = {
type = "berkenaan",
description = "default",
parents = {"penulisan", "percetakan"},
}
labels["penulisan"] = {
type = "berkenaan",
description = "default",
parents = {"bahasa", "tingkah laku manusia"},
}
labels["sistem tulisan"] = {
type = "set",
description = "default",
parents = {"penulisan"},
}
return labels
p3cytgs1cmpqkdfatdd2ily2bj1pksl
343055
343054
2026-05-20T05:04:46Z
Hakimi97
2668
Membatalkan semakan [[Special:Diff/343054|343054]] oleh [[Special:Contributions/Hakimi97|Hakimi97]] ([[User talk:Hakimi97|bincang]])
343055
Scribunto
text/plain
local labels = {}
local unpack = unpack or table.unpack -- Lua 5.2 compatibility
-- FIXME: Lookup langs in the language list.
for _, lang_etc in ipairs {
"Arab", "Aram", {"Cina", "Bahasa-bahasa [[Cina]]"}, {"Yunani", "Bahasa-bahasa [[Yunani]] dan [[Yunani Kuno]]"}, "Inggeris", "Jerman", "Jepun", "Latin", "Korea", "Okinawa",
"Portugis", "Sanskrit", "Sepanyol", "Tamil", "Vietnam", {"Melayu", "Bahasa-bahasa [[Melayik]]"},
} do
if type(lang_etc) ~= "table" then
lang_etc = {lang_etc}
end
local lang, desc = unpack(lang_etc)
desc = desc or ("[[:Kategori:Bahasa %s|Bahasa %s]]"):format(lang, lang)
labels[lang] = {
type = "berkenaan",
description = "=" .. desc,
parents = {"bahasa-bahasa"},
}
end
labels["komunikasi"] = {
type = "berkenaan",
description = "default",
parents = {"Semua topik"},
}
labels["huruf"] = {
type = "nama",
description = "default",
parents = {"sistem tulisan"},
}
labels["bahasa buatan"] = { -- distinguish from "cat:constructed languages" family category
type = "nama",
description = "={{w|constructed language}}s",
parents = {"bahasa-bahasa"},
}
labels["bahasa badan"] = {
type = "berkenaan",
description = "default",
parents = {"bahasa", "nonverbal communication"},
}
labels["penyiaran"] = {
type = "berkenaan",
description = "default",
parents = {"media", "telekomunikasi"},
}
labels["Komponen aksara Cina"] = {
type = "set",
description = "=[[komponen|Komponen]] [[aksara]] [[Cina]].",
parents = {"Huruf, simbol dan tanda baca"},
}
labels["tanda diakritik"] = {
type = "set",
description = "default",
parents = {"Huruf, simbol dan tanda baca"},
}
labels["dialek"] = {
type = "set",
description = "default",
parents = {"bahasa"},
}
labels["dictation"] = {
type = "berkenaan",
description = "default",
parents = {"komunikasi"},
}
labels["bahasa pupus"] = {
type = "nama",
description = "default",
parents = {"bahasa-bahasa"},
}
labels["bahasa isyarat"] = {
type = "nama",
description = "default",
parents = {"bahasa-bahasa"},
}
labels["facial expressions"] = {
type = "set",
description = "default",
parents = {"nonverbal communication", "face"},
}
labels["kiasan"] = {
type = "set",
description = "=[[figure of speech|figures of speech]]",
parents = {"retorik"},
}
labels["bendera"] = {
type = "berkenaan,nama,jenis",
description = "default",
parents = {"komunikasi"},
}
labels["jargon"] = {
type = "berkenaan",
description = "default",
parents = {"bahasa"},
}
labels["aksara Han"] = {
type = "berkenaan",
description = "default",
parents = {"sistem tulisan"},
}
labels["bahasa"] = {
type = "berkenaan",
description = "default",
parents = {"komunikasi"},
}
labels["keluarga bahasa"] = {
type = "nama",
description = "Topik berkenaan [[keluarga bahasa]], termasuklah yang diterima dan yang bersifat kontroversi.",
parents = {"bahasa", "nama"},
}
labels["bahasa-bahasa"] = {
type = "nama",
description = "default",
parents = {"bahasa", "nama"},
}
labels["Huruf, simbol dan tanda baca"] = {
type = "set",
description = "=[[letter]]s, [[symbol]]s, and [[punctuation]]",
parents = {"Ortografi"},
}
labels["kesilapan logik"] = {
type = "set",
description = "=[[logical fallacy|logical fallacies]], clearly defined errors in reasoning used to support or refute an argument",
additional = "{{also|Kategori:{{{langcode}}}:biases}}",
parents = {"retorik", "logik"},
}
labels["media"] = {
type = "berkenaan",
description = "default",
parents = {"komunikasi"},
}
labels["telefon bimbit"] = {
type = "berkenaan,set",
description = "default",
parents = {"telefoni"},
}
labels["nonverbal communication"] = {
type = "berkenaan",
description = "default",
parents = {"komunikasi"},
}
labels["ortografi"] = {
type = "berkenaan",
description = "default",
parents = {"penulisan"},
}
labels["palaeography"] = {
type = "berkenaan",
description = "default",
parents = {"penulisan"},
}
labels["pos"] = {
type = "berkenaan",
description = "=[[post#Noun|post]] or [[mail#Noun|mail]]",
parents = {"komunikasi"},
}
labels["singkatan poskod"] = {
type = "nama",
description = "default",
parents = {"pos"},
}
labels["perhubungan awam"] = {
type = "berkenaan",
description = "default no singularize",
parents = {"komunikasi"},
}
labels["tanda baca"] = {
type = "set",
description = "default",
parents = {"Huruf, simbol dan tanda baca"},
}
labels["radio"] = {
type = "berkenaan",
description = "default",
parents = {"telekomunikasi"},
}
labels["retorik"] = {
type = "berkenaan",
description = "default",
parents = {"bahasa"},
}
labels["isyarat"] = {
type = "berkenaan,nama,jenis",
description = "default",
parents = {"komunikasi"},
}
labels["sosiolek"] = {
type = "nama",
description = "default",
parents = {"bahasa"},
}
labels["simbol"] = {
type = "set",
description = "=[[symbol]]s, especially [[mathematical]] and [[scientific]] symbols",
additional = "Most symbols have equivalent meanings in many languages and can therefore be found in [[:Category:Translingual symbols]].",
parents = {"Huruf, simbol dan tanda baca"},
}
labels["bercakap"] = {
type = "berkenaan",
description = "default",
parents = {"bahasa", "tingkah laku manusia"},
}
labels["telekomunikasi"] = {
type = "berkenaan",
description = "default no singularize",
parents = {"komunikasi", "teknologi"},
}
labels["telegrafi"] = {
type = "berkenaan",
description = "default",
parents = {"telekomunikasi", "elektronik"},
wpcat = true,
commonscat = true,
}
labels["telefoni"] = {
type = "berkenaan",
description = "default",
parents = {"telekomunikasi", "elektronik"},
}
labels["bermesej"] = {
type = "berkenaan",
description = "default",
parents = {"telekomunikasi"},
}
labels["textual division"] = {
type = "berkenaan",
description = "default",
parents = {"penulisan"},
}
labels["tipografi"] = {
type = "berkenaan",
description = "default",
parents = {"penulisan", "percetakan"},
}
labels["penulisan"] = {
type = "berkenaan",
description = "default",
parents = {"bahasa", "tingkah laku manusia"},
}
labels["sistem tulisan"] = {
type = "set",
description = "default",
parents = {"penulisan"},
}
return labels
c4w4kb7wa9ea9tost1eaiswt3cfz138
343058
343055
2026-05-20T05:24:13Z
Hakimi97
2668
343058
Scribunto
text/plain
local labels = {}
local unpack = unpack or table.unpack -- Lua 5.2 compatibility
-- FIXME: Lookup langs in the language list.
for _, lang_etc in ipairs {
"Arab", "Aram",
{"Cina", "Bahasa-bahasa [[Cina]]", "Bahasa-bahasa Cina"},
{"Yunani", "Bahasa-bahasa [[Yunani]] dan [[Yunani Kuno]]", "Bahasa-bahasa Yunani"},
"Inggeris", "Jerman", "Jepun", "Latin", "Korea", "Okinawa",
"Portugis", "Sanskrit", "Sepanyol", "Tamil", "Vietnam",
{"Melayu", "Bahasa-bahasa [[Melayik]]", "Bahasa-bahasa Melayik"},
} do
if type(lang_etc) ~= "table" then
lang_etc = {lang_etc}
end
local lang, desc, alias = unpack(lang_etc)
local display = alias or ("Bahasa " .. lang)
desc = desc or ("[[:Kategori:Bahasa %s|Bahasa %s]]"):format(lang, lang)
-- Canonical internal topic label, e.g. [[Kategori:en:Arab]].
labels[lang] = {
type = "berkenaan",
description = "=" .. desc,
parents = {"bahasa-bahasa"},
breadcrumb = display,
displaytitle = display,
}
-- Per-language topic alias, e.g. [[Kategori:en:Bahasa Arab]].
-- This requires small support in Modul:category tree/topic; see below.
labels[display] = {
type = "berkenaan",
description = "=" .. desc,
parents = {"bahasa-bahasa"},
breadcrumb = display,
displaytitle = display,
-- New custom fields.
alias_of = lang,
per_language_only = true,
}
end
labels["komunikasi"] = {
type = "berkenaan",
description = "default",
parents = {"Semua topik"},
}
labels["huruf"] = {
type = "nama",
description = "default",
parents = {"sistem tulisan"},
}
labels["bahasa buatan"] = { -- distinguish from "cat:constructed languages" family category
type = "nama",
description = "={{w|constructed language}}s",
parents = {"bahasa-bahasa"},
}
labels["bahasa badan"] = {
type = "berkenaan",
description = "default",
parents = {"bahasa", "nonverbal communication"},
}
labels["penyiaran"] = {
type = "berkenaan",
description = "default",
parents = {"media", "telekomunikasi"},
}
labels["Komponen aksara Cina"] = {
type = "set",
description = "=[[komponen|Komponen]] [[aksara]] [[Cina]].",
parents = {"Huruf, simbol dan tanda baca"},
}
labels["tanda diakritik"] = {
type = "set",
description = "default",
parents = {"Huruf, simbol dan tanda baca"},
}
labels["dialek"] = {
type = "set",
description = "default",
parents = {"bahasa"},
}
labels["dictation"] = {
type = "berkenaan",
description = "default",
parents = {"komunikasi"},
}
labels["bahasa pupus"] = {
type = "nama",
description = "default",
parents = {"bahasa-bahasa"},
}
labels["bahasa isyarat"] = {
type = "nama",
description = "default",
parents = {"bahasa-bahasa"},
}
labels["facial expressions"] = {
type = "set",
description = "default",
parents = {"nonverbal communication", "face"},
}
labels["kiasan"] = {
type = "set",
description = "=[[figure of speech|figures of speech]]",
parents = {"retorik"},
}
labels["bendera"] = {
type = "berkenaan,nama,jenis",
description = "default",
parents = {"komunikasi"},
}
labels["jargon"] = {
type = "berkenaan",
description = "default",
parents = {"bahasa"},
}
labels["aksara Han"] = {
type = "berkenaan",
description = "default",
parents = {"sistem tulisan"},
}
labels["bahasa"] = {
type = "berkenaan",
description = "default",
parents = {"komunikasi"},
}
labels["keluarga bahasa"] = {
type = "nama",
description = "Topik berkenaan [[keluarga bahasa]], termasuklah yang diterima dan yang bersifat kontroversi.",
parents = {"bahasa", "nama"},
}
labels["bahasa-bahasa"] = {
type = "nama",
description = "default",
parents = {"bahasa", "nama"},
}
labels["Huruf, simbol dan tanda baca"] = {
type = "set",
description = "=[[letter]]s, [[symbol]]s, and [[punctuation]]",
parents = {"Ortografi"},
}
labels["kesilapan logik"] = {
type = "set",
description = "=[[logical fallacy|logical fallacies]], clearly defined errors in reasoning used to support or refute an argument",
additional = "{{also|Kategori:{{{langcode}}}:biases}}",
parents = {"retorik", "logik"},
}
labels["media"] = {
type = "berkenaan",
description = "default",
parents = {"komunikasi"},
}
labels["telefon bimbit"] = {
type = "berkenaan,set",
description = "default",
parents = {"telefoni"},
}
labels["nonverbal communication"] = {
type = "berkenaan",
description = "default",
parents = {"komunikasi"},
}
labels["ortografi"] = {
type = "berkenaan",
description = "default",
parents = {"penulisan"},
}
labels["palaeography"] = {
type = "berkenaan",
description = "default",
parents = {"penulisan"},
}
labels["pos"] = {
type = "berkenaan",
description = "=[[post#Noun|post]] or [[mail#Noun|mail]]",
parents = {"komunikasi"},
}
labels["singkatan poskod"] = {
type = "nama",
description = "default",
parents = {"pos"},
}
labels["perhubungan awam"] = {
type = "berkenaan",
description = "default no singularize",
parents = {"komunikasi"},
}
labels["tanda baca"] = {
type = "set",
description = "default",
parents = {"Huruf, simbol dan tanda baca"},
}
labels["radio"] = {
type = "berkenaan",
description = "default",
parents = {"telekomunikasi"},
}
labels["retorik"] = {
type = "berkenaan",
description = "default",
parents = {"bahasa"},
}
labels["isyarat"] = {
type = "berkenaan,nama,jenis",
description = "default",
parents = {"komunikasi"},
}
labels["sosiolek"] = {
type = "nama",
description = "default",
parents = {"bahasa"},
}
labels["simbol"] = {
type = "set",
description = "=[[symbol]]s, especially [[mathematical]] and [[scientific]] symbols",
additional = "Most symbols have equivalent meanings in many languages and can therefore be found in [[:Category:Translingual symbols]].",
parents = {"Huruf, simbol dan tanda baca"},
}
labels["bercakap"] = {
type = "berkenaan",
description = "default",
parents = {"bahasa", "tingkah laku manusia"},
}
labels["telekomunikasi"] = {
type = "berkenaan",
description = "default no singularize",
parents = {"komunikasi", "teknologi"},
}
labels["telegrafi"] = {
type = "berkenaan",
description = "default",
parents = {"telekomunikasi", "elektronik"},
wpcat = true,
commonscat = true,
}
labels["telefoni"] = {
type = "berkenaan",
description = "default",
parents = {"telekomunikasi", "elektronik"},
}
labels["bermesej"] = {
type = "berkenaan",
description = "default",
parents = {"telekomunikasi"},
}
labels["textual division"] = {
type = "berkenaan",
description = "default",
parents = {"penulisan"},
}
labels["tipografi"] = {
type = "berkenaan",
description = "default",
parents = {"penulisan", "percetakan"},
}
labels["penulisan"] = {
type = "berkenaan",
description = "default",
parents = {"bahasa", "tingkah laku manusia"},
}
labels["sistem tulisan"] = {
type = "set",
description = "default",
parents = {"penulisan"},
}
return labels
ip5w4k0e2xpgx3f16rsw7srd3yfric3
343059
343058
2026-05-20T05:25:26Z
Hakimi97
2668
Membatalkan semakan [[Special:Diff/343058|343058]] oleh [[Special:Contributions/Hakimi97|Hakimi97]] ([[User talk:Hakimi97|bincang]])
343059
Scribunto
text/plain
local labels = {}
local unpack = unpack or table.unpack -- Lua 5.2 compatibility
-- FIXME: Lookup langs in the language list.
for _, lang_etc in ipairs {
"Arab", "Aram", {"Cina", "Bahasa-bahasa [[Cina]]"}, {"Yunani", "Bahasa-bahasa [[Yunani]] dan [[Yunani Kuno]]"}, "Inggeris", "Jerman", "Jepun", "Latin", "Korea", "Okinawa",
"Portugis", "Sanskrit", "Sepanyol", "Tamil", "Vietnam", {"Melayu", "Bahasa-bahasa [[Melayik]]"},
} do
if type(lang_etc) ~= "table" then
lang_etc = {lang_etc}
end
local lang, desc = unpack(lang_etc)
desc = desc or ("[[:Kategori:Bahasa %s|Bahasa %s]]"):format(lang, lang)
labels[lang] = {
type = "berkenaan",
description = "=" .. desc,
parents = {"bahasa-bahasa"},
}
end
labels["komunikasi"] = {
type = "berkenaan",
description = "default",
parents = {"Semua topik"},
}
labels["huruf"] = {
type = "nama",
description = "default",
parents = {"sistem tulisan"},
}
labels["bahasa buatan"] = { -- distinguish from "cat:constructed languages" family category
type = "nama",
description = "={{w|constructed language}}s",
parents = {"bahasa-bahasa"},
}
labels["bahasa badan"] = {
type = "berkenaan",
description = "default",
parents = {"bahasa", "nonverbal communication"},
}
labels["penyiaran"] = {
type = "berkenaan",
description = "default",
parents = {"media", "telekomunikasi"},
}
labels["Komponen aksara Cina"] = {
type = "set",
description = "=[[komponen|Komponen]] [[aksara]] [[Cina]].",
parents = {"Huruf, simbol dan tanda baca"},
}
labels["tanda diakritik"] = {
type = "set",
description = "default",
parents = {"Huruf, simbol dan tanda baca"},
}
labels["dialek"] = {
type = "set",
description = "default",
parents = {"bahasa"},
}
labels["dictation"] = {
type = "berkenaan",
description = "default",
parents = {"komunikasi"},
}
labels["bahasa pupus"] = {
type = "nama",
description = "default",
parents = {"bahasa-bahasa"},
}
labels["bahasa isyarat"] = {
type = "nama",
description = "default",
parents = {"bahasa-bahasa"},
}
labels["facial expressions"] = {
type = "set",
description = "default",
parents = {"nonverbal communication", "face"},
}
labels["kiasan"] = {
type = "set",
description = "=[[figure of speech|figures of speech]]",
parents = {"retorik"},
}
labels["bendera"] = {
type = "berkenaan,nama,jenis",
description = "default",
parents = {"komunikasi"},
}
labels["jargon"] = {
type = "berkenaan",
description = "default",
parents = {"bahasa"},
}
labels["aksara Han"] = {
type = "berkenaan",
description = "default",
parents = {"sistem tulisan"},
}
labels["bahasa"] = {
type = "berkenaan",
description = "default",
parents = {"komunikasi"},
}
labels["keluarga bahasa"] = {
type = "nama",
description = "Topik berkenaan [[keluarga bahasa]], termasuklah yang diterima dan yang bersifat kontroversi.",
parents = {"bahasa", "nama"},
}
labels["bahasa-bahasa"] = {
type = "nama",
description = "default",
parents = {"bahasa", "nama"},
}
labels["Huruf, simbol dan tanda baca"] = {
type = "set",
description = "=[[letter]]s, [[symbol]]s, and [[punctuation]]",
parents = {"Ortografi"},
}
labels["kesilapan logik"] = {
type = "set",
description = "=[[logical fallacy|logical fallacies]], clearly defined errors in reasoning used to support or refute an argument",
additional = "{{also|Kategori:{{{langcode}}}:biases}}",
parents = {"retorik", "logik"},
}
labels["media"] = {
type = "berkenaan",
description = "default",
parents = {"komunikasi"},
}
labels["telefon bimbit"] = {
type = "berkenaan,set",
description = "default",
parents = {"telefoni"},
}
labels["nonverbal communication"] = {
type = "berkenaan",
description = "default",
parents = {"komunikasi"},
}
labels["ortografi"] = {
type = "berkenaan",
description = "default",
parents = {"penulisan"},
}
labels["palaeography"] = {
type = "berkenaan",
description = "default",
parents = {"penulisan"},
}
labels["pos"] = {
type = "berkenaan",
description = "=[[post#Noun|post]] or [[mail#Noun|mail]]",
parents = {"komunikasi"},
}
labels["singkatan poskod"] = {
type = "nama",
description = "default",
parents = {"pos"},
}
labels["perhubungan awam"] = {
type = "berkenaan",
description = "default no singularize",
parents = {"komunikasi"},
}
labels["tanda baca"] = {
type = "set",
description = "default",
parents = {"Huruf, simbol dan tanda baca"},
}
labels["radio"] = {
type = "berkenaan",
description = "default",
parents = {"telekomunikasi"},
}
labels["retorik"] = {
type = "berkenaan",
description = "default",
parents = {"bahasa"},
}
labels["isyarat"] = {
type = "berkenaan,nama,jenis",
description = "default",
parents = {"komunikasi"},
}
labels["sosiolek"] = {
type = "nama",
description = "default",
parents = {"bahasa"},
}
labels["simbol"] = {
type = "set",
description = "=[[symbol]]s, especially [[mathematical]] and [[scientific]] symbols",
additional = "Most symbols have equivalent meanings in many languages and can therefore be found in [[:Category:Translingual symbols]].",
parents = {"Huruf, simbol dan tanda baca"},
}
labels["bercakap"] = {
type = "berkenaan",
description = "default",
parents = {"bahasa", "tingkah laku manusia"},
}
labels["telekomunikasi"] = {
type = "berkenaan",
description = "default no singularize",
parents = {"komunikasi", "teknologi"},
}
labels["telegrafi"] = {
type = "berkenaan",
description = "default",
parents = {"telekomunikasi", "elektronik"},
wpcat = true,
commonscat = true,
}
labels["telefoni"] = {
type = "berkenaan",
description = "default",
parents = {"telekomunikasi", "elektronik"},
}
labels["bermesej"] = {
type = "berkenaan",
description = "default",
parents = {"telekomunikasi"},
}
labels["textual division"] = {
type = "berkenaan",
description = "default",
parents = {"penulisan"},
}
labels["tipografi"] = {
type = "berkenaan",
description = "default",
parents = {"penulisan", "percetakan"},
}
labels["penulisan"] = {
type = "berkenaan",
description = "default",
parents = {"bahasa", "tingkah laku manusia"},
}
labels["sistem tulisan"] = {
type = "set",
description = "default",
parents = {"penulisan"},
}
return labels
c4w4kb7wa9ea9tost1eaiswt3cfz138
343063
343059
2026-05-20T05:36:23Z
Hakimi97
2668
343063
Scribunto
text/plain
local labels = {}
local handlers = {}
local unpack = unpack or table.unpack -- Lua 5.2 compatibility
local language_topic_aliases = {}
-- FIXME: Lookup langs in the language list.
for _, lang_etc in ipairs {
"Arab", "Aram",
{"Cina", "Bahasa-bahasa [[Cina]]", "Bahasa-bahasa Cina"},
{"Yunani", "Bahasa-bahasa [[Yunani]] dan [[Yunani Kuno]]", "Bahasa-bahasa Yunani"},
"Inggeris", "Jerman", "Jepun", "Latin", "Korea", "Okinawa",
"Portugis", "Sanskrit", "Sepanyol", "Tamil", "Vietnam",
{"Melayu", "Bahasa-bahasa [[Melayik]]", "Bahasa-bahasa Melayu"},
} do
if type(lang_etc) ~= "table" then
lang_etc = {lang_etc}
end
local lang, desc, display = unpack(lang_etc)
display = display or ("Bahasa " .. lang)
desc = desc or ("[[:Kategori:Bahasa %s|Bahasa %s]]"):format(lang, lang)
-- Canonical topic label, e.g. [[Kategori:en:Korea]].
labels[lang] = {
type = "berkenaan",
description = "=" .. desc,
parents = {"bahasa-bahasa"},
breadcrumb = display,
displaytitle = display,
}
-- Alias only for language-prefixed topic categories, e.g.
-- [[Kategori:en:Bahasa Korea]] → internal topic label "Korea".
language_topic_aliases[display] = lang
end
table.insert(handlers, function(label, lang)
-- Do not handle bare [[Kategori:Bahasa Korea]].
-- That must remain available for poscatboiler/language-category logic.
if not lang then
return nil
end
local canonical_label = language_topic_aliases[label]
if canonical_label then
return labels[canonical_label]
end
return nil
end)
labels["komunikasi"] = {
type = "berkenaan",
description = "default",
parents = {"Semua topik"},
}
labels["huruf"] = {
type = "nama",
description = "default",
parents = {"sistem tulisan"},
}
labels["bahasa buatan"] = { -- distinguish from "cat:constructed languages" family category
type = "nama",
description = "={{w|constructed language}}s",
parents = {"bahasa-bahasa"},
}
labels["bahasa badan"] = {
type = "berkenaan",
description = "default",
parents = {"bahasa", "nonverbal communication"},
}
labels["penyiaran"] = {
type = "berkenaan",
description = "default",
parents = {"media", "telekomunikasi"},
}
labels["Komponen aksara Cina"] = {
type = "set",
description = "=[[komponen|Komponen]] [[aksara]] [[Cina]].",
parents = {"Huruf, simbol dan tanda baca"},
}
labels["tanda diakritik"] = {
type = "set",
description = "default",
parents = {"Huruf, simbol dan tanda baca"},
}
labels["dialek"] = {
type = "set",
description = "default",
parents = {"bahasa"},
}
labels["dictation"] = {
type = "berkenaan",
description = "default",
parents = {"komunikasi"},
}
labels["bahasa pupus"] = {
type = "nama",
description = "default",
parents = {"bahasa-bahasa"},
}
labels["bahasa isyarat"] = {
type = "nama",
description = "default",
parents = {"bahasa-bahasa"},
}
labels["facial expressions"] = {
type = "set",
description = "default",
parents = {"nonverbal communication", "face"},
}
labels["kiasan"] = {
type = "set",
description = "=[[figure of speech|figures of speech]]",
parents = {"retorik"},
}
labels["bendera"] = {
type = "berkenaan,nama,jenis",
description = "default",
parents = {"komunikasi"},
}
labels["jargon"] = {
type = "berkenaan",
description = "default",
parents = {"bahasa"},
}
labels["aksara Han"] = {
type = "berkenaan",
description = "default",
parents = {"sistem tulisan"},
}
labels["bahasa"] = {
type = "berkenaan",
description = "default",
parents = {"komunikasi"},
}
labels["keluarga bahasa"] = {
type = "nama",
description = "Topik berkenaan [[keluarga bahasa]], termasuklah yang diterima dan yang bersifat kontroversi.",
parents = {"bahasa", "nama"},
}
labels["bahasa-bahasa"] = {
type = "nama",
description = "default",
parents = {"bahasa", "nama"},
}
labels["Huruf, simbol dan tanda baca"] = {
type = "set",
description = "=[[letter]]s, [[symbol]]s, and [[punctuation]]",
parents = {"Ortografi"},
}
labels["kesilapan logik"] = {
type = "set",
description = "=[[logical fallacy|logical fallacies]], clearly defined errors in reasoning used to support or refute an argument",
additional = "{{also|Kategori:{{{langcode}}}:biases}}",
parents = {"retorik", "logik"},
}
labels["media"] = {
type = "berkenaan",
description = "default",
parents = {"komunikasi"},
}
labels["telefon bimbit"] = {
type = "berkenaan,set",
description = "default",
parents = {"telefoni"},
}
labels["nonverbal communication"] = {
type = "berkenaan",
description = "default",
parents = {"komunikasi"},
}
labels["ortografi"] = {
type = "berkenaan",
description = "default",
parents = {"penulisan"},
}
labels["palaeography"] = {
type = "berkenaan",
description = "default",
parents = {"penulisan"},
}
labels["pos"] = {
type = "berkenaan",
description = "=[[post#Noun|post]] or [[mail#Noun|mail]]",
parents = {"komunikasi"},
}
labels["singkatan poskod"] = {
type = "nama",
description = "default",
parents = {"pos"},
}
labels["perhubungan awam"] = {
type = "berkenaan",
description = "default no singularize",
parents = {"komunikasi"},
}
labels["tanda baca"] = {
type = "set",
description = "default",
parents = {"Huruf, simbol dan tanda baca"},
}
labels["radio"] = {
type = "berkenaan",
description = "default",
parents = {"telekomunikasi"},
}
labels["retorik"] = {
type = "berkenaan",
description = "default",
parents = {"bahasa"},
}
labels["isyarat"] = {
type = "berkenaan,nama,jenis",
description = "default",
parents = {"komunikasi"},
}
labels["sosiolek"] = {
type = "nama",
description = "default",
parents = {"bahasa"},
}
labels["simbol"] = {
type = "set",
description = "=[[symbol]]s, especially [[mathematical]] and [[scientific]] symbols",
additional = "Most symbols have equivalent meanings in many languages and can therefore be found in [[:Category:Translingual symbols]].",
parents = {"Huruf, simbol dan tanda baca"},
}
labels["bercakap"] = {
type = "berkenaan",
description = "default",
parents = {"bahasa", "tingkah laku manusia"},
}
labels["telekomunikasi"] = {
type = "berkenaan",
description = "default no singularize",
parents = {"komunikasi", "teknologi"},
}
labels["telegrafi"] = {
type = "berkenaan",
description = "default",
parents = {"telekomunikasi", "elektronik"},
wpcat = true,
commonscat = true,
}
labels["telefoni"] = {
type = "berkenaan",
description = "default",
parents = {"telekomunikasi", "elektronik"},
}
labels["bermesej"] = {
type = "berkenaan",
description = "default",
parents = {"telekomunikasi"},
}
labels["textual division"] = {
type = "berkenaan",
description = "default",
parents = {"penulisan"},
}
labels["tipografi"] = {
type = "berkenaan",
description = "default",
parents = {"penulisan", "percetakan"},
}
labels["penulisan"] = {
type = "berkenaan",
description = "default",
parents = {"bahasa", "tingkah laku manusia"},
}
labels["sistem tulisan"] = {
type = "set",
description = "default",
parents = {"penulisan"},
}
return { LABELS = labels, HANDLERS = handlers, }
58fp3ym6jru9y97ija2hpo8xrusrcub
343064
343063
2026-05-20T05:41:10Z
Hakimi97
2668
343064
Scribunto
text/plain
local labels = {}
local handlers = {}
local unpack = unpack or table.unpack -- Lua 5.2 compatibility
local language_topics = {}
-- FIXME: Lookup langs in the language list.
for _, lang_etc in ipairs {
"Arab", "Aram",
{"Cina", "Bahasa-bahasa [[Cina]]", "Bahasa-bahasa Cina"},
{"Yunani", "Bahasa-bahasa [[Yunani]] dan [[Yunani Kuno]]", "Bahasa-bahasa Yunani"},
"Inggeris", "Jerman", "Jepun", "Latin", "Korea", "Okinawa",
"Portugis", "Sanskrit", "Sepanyol", "Tamil", "Vietnam",
{"Melayu", "Bahasa-bahasa [[Melayik]]", "Bahasa-bahasa Melayu"},
} do
if type(lang_etc) ~= "table" then
lang_etc = {lang_etc}
end
local langname, desc, display = unpack(lang_etc)
display = display or ("Bahasa " .. langname)
desc = desc or ("[[:Kategori:Bahasa %s|Bahasa %s]]"):format(langname, langname)
-- Do NOT insert into labels[langname].
-- These are handler-only, so [[Kategori:en:Bahasa Korea]] works,
-- but [[Kategori:Bahasa Korea]] remains handled by poscatboiler.
language_topics[display] = {
type = "berkenaan",
description = "=" .. desc,
parents = {"bahasa-bahasa"},
breadcrumb = display,
displaytitle = display,
topic = display,
}
end
table.insert(handlers, function(label, lang)
local data = language_topics[label]
if not data then
return nil
end
-- If Modul:category tree/topic has been amended to pass `lang`,
-- use it directly.
if lang then
return data
end
-- Fallback for unamended topic module:
-- only handle categories with a language-code prefix, e.g.
-- [[Kategori:en:Bahasa Korea]], not bare [[Kategori:Bahasa Korea]].
local title_text = mw.title.getCurrentTitle().text
local code, real_label = title_text:match("^(%l[%a-]*%a):(.+)$")
if not code or real_label ~= label then
return nil
end
local m_languages = require("Module:languages")
if not m_languages.getByCode(code) then
return nil
end
return data
end)
labels["komunikasi"] = {
type = "berkenaan",
description = "default",
parents = {"Semua topik"},
}
labels["huruf"] = {
type = "nama",
description = "default",
parents = {"sistem tulisan"},
}
labels["bahasa buatan"] = { -- distinguish from "cat:constructed languages" family category
type = "nama",
description = "={{w|constructed language}}s",
parents = {"bahasa-bahasa"},
}
labels["bahasa badan"] = {
type = "berkenaan",
description = "default",
parents = {"bahasa", "nonverbal communication"},
}
labels["penyiaran"] = {
type = "berkenaan",
description = "default",
parents = {"media", "telekomunikasi"},
}
labels["Komponen aksara Cina"] = {
type = "set",
description = "=[[komponen|Komponen]] [[aksara]] [[Cina]].",
parents = {"Huruf, simbol dan tanda baca"},
}
labels["tanda diakritik"] = {
type = "set",
description = "default",
parents = {"Huruf, simbol dan tanda baca"},
}
labels["dialek"] = {
type = "set",
description = "default",
parents = {"bahasa"},
}
labels["dictation"] = {
type = "berkenaan",
description = "default",
parents = {"komunikasi"},
}
labels["bahasa pupus"] = {
type = "nama",
description = "default",
parents = {"bahasa-bahasa"},
}
labels["bahasa isyarat"] = {
type = "nama",
description = "default",
parents = {"bahasa-bahasa"},
}
labels["facial expressions"] = {
type = "set",
description = "default",
parents = {"nonverbal communication", "face"},
}
labels["kiasan"] = {
type = "set",
description = "=[[figure of speech|figures of speech]]",
parents = {"retorik"},
}
labels["bendera"] = {
type = "berkenaan,nama,jenis",
description = "default",
parents = {"komunikasi"},
}
labels["jargon"] = {
type = "berkenaan",
description = "default",
parents = {"bahasa"},
}
labels["aksara Han"] = {
type = "berkenaan",
description = "default",
parents = {"sistem tulisan"},
}
labels["bahasa"] = {
type = "berkenaan",
description = "default",
parents = {"komunikasi"},
}
labels["keluarga bahasa"] = {
type = "nama",
description = "Topik berkenaan [[keluarga bahasa]], termasuklah yang diterima dan yang bersifat kontroversi.",
parents = {"bahasa", "nama"},
}
labels["bahasa-bahasa"] = {
type = "nama",
description = "default",
parents = {"bahasa", "nama"},
}
labels["Huruf, simbol dan tanda baca"] = {
type = "set",
description = "=[[letter]]s, [[symbol]]s, and [[punctuation]]",
parents = {"Ortografi"},
}
labels["kesilapan logik"] = {
type = "set",
description = "=[[logical fallacy|logical fallacies]], clearly defined errors in reasoning used to support or refute an argument",
additional = "{{also|Kategori:{{{langcode}}}:biases}}",
parents = {"retorik", "logik"},
}
labels["media"] = {
type = "berkenaan",
description = "default",
parents = {"komunikasi"},
}
labels["telefon bimbit"] = {
type = "berkenaan,set",
description = "default",
parents = {"telefoni"},
}
labels["nonverbal communication"] = {
type = "berkenaan",
description = "default",
parents = {"komunikasi"},
}
labels["ortografi"] = {
type = "berkenaan",
description = "default",
parents = {"penulisan"},
}
labels["palaeography"] = {
type = "berkenaan",
description = "default",
parents = {"penulisan"},
}
labels["pos"] = {
type = "berkenaan",
description = "=[[post#Noun|post]] or [[mail#Noun|mail]]",
parents = {"komunikasi"},
}
labels["singkatan poskod"] = {
type = "nama",
description = "default",
parents = {"pos"},
}
labels["perhubungan awam"] = {
type = "berkenaan",
description = "default no singularize",
parents = {"komunikasi"},
}
labels["tanda baca"] = {
type = "set",
description = "default",
parents = {"Huruf, simbol dan tanda baca"},
}
labels["radio"] = {
type = "berkenaan",
description = "default",
parents = {"telekomunikasi"},
}
labels["retorik"] = {
type = "berkenaan",
description = "default",
parents = {"bahasa"},
}
labels["isyarat"] = {
type = "berkenaan,nama,jenis",
description = "default",
parents = {"komunikasi"},
}
labels["sosiolek"] = {
type = "nama",
description = "default",
parents = {"bahasa"},
}
labels["simbol"] = {
type = "set",
description = "=[[symbol]]s, especially [[mathematical]] and [[scientific]] symbols",
additional = "Most symbols have equivalent meanings in many languages and can therefore be found in [[:Category:Translingual symbols]].",
parents = {"Huruf, simbol dan tanda baca"},
}
labels["bercakap"] = {
type = "berkenaan",
description = "default",
parents = {"bahasa", "tingkah laku manusia"},
}
labels["telekomunikasi"] = {
type = "berkenaan",
description = "default no singularize",
parents = {"komunikasi", "teknologi"},
}
labels["telegrafi"] = {
type = "berkenaan",
description = "default",
parents = {"telekomunikasi", "elektronik"},
wpcat = true,
commonscat = true,
}
labels["telefoni"] = {
type = "berkenaan",
description = "default",
parents = {"telekomunikasi", "elektronik"},
}
labels["bermesej"] = {
type = "berkenaan",
description = "default",
parents = {"telekomunikasi"},
}
labels["textual division"] = {
type = "berkenaan",
description = "default",
parents = {"penulisan"},
}
labels["tipografi"] = {
type = "berkenaan",
description = "default",
parents = {"penulisan", "percetakan"},
}
labels["penulisan"] = {
type = "berkenaan",
description = "default",
parents = {"bahasa", "tingkah laku manusia"},
}
labels["sistem tulisan"] = {
type = "set",
description = "default",
parents = {"penulisan"},
}
return { LABELS = labels, HANDLERS = handlers, }
11byzwzd5jg78ueg6wps4vxay3ayd2h
Modul:category tree/topic/Society
828
12239
343035
335861
2026-05-20T01:49:37Z
Hakimi97
2668
343035
Scribunto
text/plain
local labels = {}
local unpack = unpack or table.unpack -- Lua 5.2 compatibility
labels["masyarakat"] = {
type = "berkenaan",
description = "default",
parents = {"semua topik"},
}
labels["ijazah akademik"] = {
type = "nama",
description = "default",
parents = {"pendidikan"},
}
labels["gred akademik"] = {
type = "set",
description = "default",
parents = {"pendidikan"},
}
labels["perakaunan"] = {
type = "berkenaan",
description = "default",
parents = {"kewangan"},
}
labels["bahagian pentadbiran"] = {
type = "set",
description = "default",
parents = {"pemerintahan"},
}
labels["pengiklanan"] = {
type = "berkenaan",
description = "default",
parents = {"perniagaan", "pemasaran"},
}
labels["alt-right"] = {
type = "berkenaan",
description = "=the [[alt-right]], a loosely connected [[far-right]], [[white nationalist]] movement",
parents = {"konservatisme", "fasisme", "ideologi", "ideologi ketuanan kulit putih"},
}
labels["anarkisme"] = {
type = "berkenaan",
description = "default",
parents = {"ideologi", "fahaman berhaluan kiri"},
}
labels["antisemitisme"] = {
type = "berkenaan",
description = "default",
parents = {"bentuk diskriminasi"},
}
labels["anugerah"] = {
type = "nama,jenis",
description = "default",
parents = {"masyarakat"},
}
labels["perbankan"] = {
type = "berkenaan",
description = "default",
parents = {"kewangan", "industri"},
}
labels["bar"] = {
type = "jenis",
description = "default",
parents = {"jenis perniagaan", "minuman"},
}
labels["nasionalisme Basque"] = {
type = "berkenaan",
description = "default",
parents = {"Negara Basque, Sepanyol", "nasionalisme"},
}
labels["peralatan tempat tidur"] = {
type = "berkenaan",
description = "default",
parents = {"rumah"},
}
labels["pertukangan besi"] = {
type = "berkenaan",
description = "default",
parents = {"pertukangan logam"},
}
labels["pasaran bon"] = {
type = "berkenaan",
description = "default with the",
parents = {"kewangan"},
}
labels["penjilidan buku"] = {
type = "berkenaan",
description = "default",
parents = {"penerbitan"},
}
labels["saiz buku"] = {
type = "nama",
description = "default",
parents = {"penjilidan buku"},
}
labels["Brexit"] = {
type = "berkenaan",
description = "={{w|Brexit}}, i.e. the withdrawal of the {{w|United Kingdom}} from the {{w|European Union}}",
parents = {"nasionalisme", "politik Kesatuan Eropah", "politik UK"},
}
labels["pengebumian"] = {
type = "berkenaan",
description = "default",
parents = {"masyarakat", "kematian"},
}
labels["perniagaan"] = {
type = "berkenaan",
description = "default",
parents = {"ekonomi", "masyarakat"},
}
labels["jenis perniagaan"] = {
type = "jenis",
description = "=[[business]]es (specific commercial enterprises or establishments)",
parents = {"perniagaan"},
}
labels["kapitalisme"] = {
type = "berkenaan",
description = "default",
parents = {"ekonomi", "ideologi"},
}
labels["kerusi"] = {
type = "berkenaan",
description = "default",
parents = {"perabot", "duduk"},
}
labels["penderaan kanak-kanak"] = {
type = "berkenaan",
description = "default",
parents = {"jenayah", "kanak-kanak", "keganasan"},
}
labels["restoran Cina"] = {
type = "berkenaan",
description = "default",
breadcrumb = "Cina",
parents = {"restoran", "China"},
}
labels["pembersihan"] = {
type = "berkenaan",
description = "default",
parents = {"rumah"},
}
labels["syiling"] = {
type = "set,berkenaan",
description = "default",
parents = {"wang"},
}
labels["konservatisme"] = {
type = "berkenaan",
description = "=[[conservatism]] or [[traditionalist]] beliefs",
parents = {"ideologi"},
}
labels["perdagangan komersial"] = {
type = "berkenaan",
description = "default",
parents = {"perniagaan"},
}
labels["dokumen komersial"] = {
type = "set",
description = "default",
parents = {"perdagangan komersial"},
}
labels["undang-undang komersial"] = {
type = "berkenaan",
description = "default",
breadcrumb = "komersial",
parents = {"undang-undang", "perdagangan komersial"},
}
labels["undang-undang persaingan"] = {
type = "berkenaan",
description = "default",
breadcrumb = "persaingan",
parents = {"undang-undang"},
}
labels["undang-undang antitrust"] = {
description = "default",
breadcrumb = "antitrust",
parents = {"undang-undang persaingan"},
}
labels["undang-undang persaingan tidak adil"] = {
description = "default with the",
breadcrumb = "tidak adil",
parents = {{name = "undang-undang persaingan", sort = "tidak adil"}},
}
labels["komunisme"] = {
type = "berkenaan",
description = "default",
parents = {"ideologi", "sosialisme", "fahaman berhaluan kiri"},
}
labels["undang-undang perlembagaan"] = {
type = "berkenaan",
description = "default",
breadcrumb = "perlembagaan",
parents = {"undang-undang"},
}
labels["hak cipta"] = {
type = "berkenaan",
description = "default",
parents = {"harta intelek"},
}
labels["lesen hak cipta"] = {
type = "nama",
description = "=[[license]]s of [[copyright]]",
breadcrumb_and_first_sort_key = "lesen",
parents = {"hak cipta"},
}
labels["undang-undang korporat"] = {
type = "berkenaan",
description = "default",
breadcrumb = "korporat",
parents = {"undang-undang"},
}
labels["rasuah"] = {
type = "berkenaan",
description = "default",
parents = {"jenayah", "politik"},
}
labels["kraf"] = {
type = "jenis",
description = "default",
parents = {"masyarakat"},
}
labels["jenayah"] = {
type = "berkenaan",
description = "default",
parents = {"masyarakat", "undang-undang jenayah"},
}
labels["pencegahan jenayah"] = {
type = "berkenaan",
description = "default",
parents = {"keselamatan awam", "jenayah"},
}
labels["undang-undang jenayah"] = {
type = "berkenaan",
description = "default",
breadcrumb = "jenayah",
parents = {"undang-undang"},
}
labels["kroset"] = {
type = "berkenaan",
description = "default",
parents = {"kraf"},
}
labels["mata wang kripto"] = {
type = "berkenaan",
description = "default",
parents = {"mata wang", "kriptografi", "teknologi"},
}
labels["nama mata wang"] = {
type = "set",
description = "default",
parents = {"wang", "mata wang"},
}
labels["mata wang"] = {
type = "berkenaan",
description = "default",
parents = {"wang"},
}
labels["penternakan tenusu"] = {
type = "berkenaan",
description = "default",
parents = {"pertanian", "industri"},
}
labels["demokrasi"] = {
type = "berkenaan",
description = "default",
parents = {"bentuk pemerintahan"},
}
labels["diplomasi"] = {
type = "berkenaan",
description = "default",
parents = {"masyarakat"},
}
labels["diskriminasi"] = {
type = "berkenaan",
description = "default",
parents = {"masyarakat"},
}
labels["pengedaran dadah"] = {
type = "berkenaan",
description = "default",
parents = {"jenayah", "dadah"},
}
labels["pendidikan"] = {
type = "berkenaan",
description = "default",
parents = {"masyarakat"},
}
labels["perkhidmatan kecemasan"] = {
type = "berkenaan",
description = "default",
parents = {"keselamatan awam"},
}
labels["penggajian"] = {
type = "berkenaan",
description = "default",
parents = {"perniagaan", "kerja"},
}
labels["pengintipan"] = {
type = "berkenaan",
description = "default",
parents = {"keselamatan", "penipuan", "kerahsiaan"},
}
labels["kejahatan"] = {
type = "berkenaan",
description = "default",
parents = {"etika", "agama"},
}
labels["kemasyhuran"] = {
type = "berkenaan",
description = "default",
parents = {"masyarakat", "pengetahuan"},
}
labels["undang-undang keluarga"] = {
type = "berkenaan",
description = "default",
breadcrumb = "keluarga",
parents = {"undang-undang"},
}
labels["fasisme"] = {
type = "berkenaan",
description = "default",
parents = {"ideologi"},
}
labels["pertukangan ladam"] = {
type = "berkenaan",
description = "default",
parents = {"pertukangan besi", "kuda"},
}
labels["feminisme"] = {
type = "berkenaan",
description = "default",
parents = {"gender", "perempuan", "ideologi", "masyarakat", "sosiologi"},
}
labels["feudalisme"] = {
type = "berkenaan",
description = "default",
parents = {"bentuk pemerintahan"},
}
labels["kewangan"] = {
type = "berkenaan",
description = "default",
parents = {"perniagaan"},
}
labels["pemadaman kebakaran"] = {
type = "berkenaan",
description = "default",
parents = {"perkhidmatan kecemasan", "api"},
}
labels["bentuk diskriminasi"] = {
type = "jenis",
description = "{{{langname}}} terms for [[form]]s of [[discrimination]].",
additional = "{{also|Category:{{{langcode}}}:Biases|Category:{{{langcode}}}:Conspiracy theories|Category:{{{langcode}}}:Ideologies}}",
breadcrumb = "bentuk",
parents = {"diskriminasi"},
}
labels["bentuk pemerintahan"] = {
type = "jenis",
description = "{{{langname}}} terms for [[form]]s of [[government]].",
breadcrumb = "bentuk",
parents = {"pemerintahan"},
}
labels["kebebasan"] = {
type = "berkenaan",
description = "default",
parents = {"masyarakat"},
}
labels["kebebasan bersuara"] = {
type = "berkenaan",
description = "default",
breadcrumb = "bersuara",
parents = {{name = "kebebasan", sort = "bersuara"}, "undang-undang"},
}
labels["freemasonry"] = {
type = "berkenaan",
description = "default",
parents = {"pertubuhan"},
}
labels["upacara pengebumian"] = {
type = "berkenaan",
description = "default",
parents = {"masyarakat", "kematian", "industri"},
}
labels["perabot"] = {
type = "berkenaan",
description = "default",
parents = {"rumah"},
commonscat = true,
wpcat = true,
}
labels["feminisme kritikal gender"] = {
type = "berkenaan",
description = "default",
breadcrumb = "kritikal gender",
parents = {"feminisme", "gender", "transfobia"},
}
labels["peniupan kaca"] = {
type = "berkenaan",
description = "default",
parents = {"kraf", "kaca"},
}
labels["kebaikan"] = {
type = "berkenaan",
description = "default",
parents = {"etika", "agama"},
}
labels["pemerintahan"] = {
type = "berkenaan",
description = "default",
parents = {"masyarakat", "politik"},
}
labels["dandanan rambut"] = {
type = "berkenaan",
description = "default",
parents = {"rambut", "kraf"},
}
labels["masyarakat atasan"] = {
type = "berkenaan",
description = "=royalty and nobility",
parents = {"masyarakat"},
}
labels["Hindutva"] = {
type = "berkenaan",
description = "=[[Hindutva]] or {{w|Hindu nationalism}}",
parents = {"konservatisme", "Hinduisme", "ideologi", "politik India", "nasionalisme", "teokrasi"},
}
labels["mata wang bersejarah"] = {
type = "set",
description = "default",
breadcrumb = "bersejarah",
parents = {"nama mata wang"},
}
labels["rumah"] = {
type = "berkenaan",
description = "default with the",
parents = {"masyarakat"},
}
labels["homofobia"] = {
type = "berkenaan",
description = "default",
parents = {"queerfobia"},
}
labels["hospitaliti"] = {
type = "berkenaan",
description = "default",
parents = {"perniagaan"},
}
labels["industri hos"] = {
type = "berkenaan",
description = "default",
parents = {"hospitaliti", "jenis perniagaan"},
}
labels["hotel"] = {
type = "jenis",
description = "default",
parents = {"jenis perniagaan", "pelancongan", "hospitaliti"},
}
labels["isi rumah"] = {
type = "berkenaan",
description = "default",
parents = {"rumah"},
}
labels["perumahan"] = {
type = "berkenaan",
description = "default",
parents = {"rumah", "bangunan"},
}
labels["sumber manusia"] = {
type = "berkenaan",
description = "default no singularize",
parents = {"perniagaan", "sosiologi"},
}
labels["ideologi"] = {
type = "berkenaan",
description = "default",
parents = {"masyarakat", "politik"},
}
labels["imperialisme"] = {
type = "berkenaan",
description = "default",
parents = {"ideologi"},
}
labels["import/eksport"] = {
type = "berkenaan",
description = "=[[import]]s and [[export]]s",
parents = {"perdagangan", "pengangkutan"},
}
labels["komuniti incel"] = {
type = "berkenaan",
description = "=the [[incel]] community",
parents = {"maskulinisme", "seks"},
}
labels["incoterms"] = {
type = "berkenaan",
description = "=[[Incoterm]]s",
parents = {"perniagaan", "import/eksport"},
}
labels["industri"] = {
type = "berkenaan",
description = "default",
parents = {"perniagaan"},
}
labels["undang-undang pewarisan"] = {
type = "berkenaan",
description = "default",
breadcrumb = "pewarisan",
parents = {"undang-undang"},
}
labels["insurans"] = {
type = "berkenaan",
description = "default",
parents = {"kewangan", "industri"},
}
labels["harta intelek"] = {
type = "berkenaan",
description = "=[[intellectual property]] [[law]]",
parents = {"undang-undang"},
}
labels["undang-undang antarabangsa"] = {
type = "berkenaan",
description = "default",
breadcrumb = "antarabangsa",
parents = {"undang-undang"},
}
labels["hubungan antarabangsa"] = {
type = "berkenaan",
description = "default wikify",
parents = {"politik", "Bumi"},
}
labels["kewangan Islam"] = {
type = "berkenaan",
description = "default wikify",
breadcrumb = "Islam",
parents = {"kewangan", "perbankan", "Islam"},
}
labels["undang-undang Islam"] = {
type = "berkenaan",
description = "default wikify",
breadcrumb = "undang-undang",
parents = {{name = "Islam", sort = "undang-undang"}, "undang-undang"},
}
labels["Islamisme"] = {
type = "berkenaan",
description = "default",
parents = {"ideologi", "konservatisme", "Islam", "teokrasi"},
}
labels["Juche"] = {
type = "berkenaan",
description = "default",
parents = {"Korea Utara", "komunisme", "nasionalisme"},
}
labels["keadilan"] = {
type = "berkenaan",
description = "default",
parents = {"masyarakat"},
}
labels["Kentucky Fried Chicken"] = {
type = "berkenaan",
description = "=the {{w|Kentucky Fried Chicken}} [[chain]] of [[fast-food]] [[restaurant]]s",
parents = {"restoran"},
}
labels["mengait"] = {
type = "berkenaan",
description = "default",
parents = {"kraf"},
}
labels["Ku Klux Klan"] = {
type = "berkenaan",
description = "default with the",
parents = {"pertubuhan", "ideologi ketuanan kulit putih"},
}
labels["industri kyabakura"] = {
type = "berkenaan",
description = "default",
parents = {"hospitaliti", "jenis perniagaan"},
}
labels["buruh"] = {
type = "berkenaan",
description = "=[[labour]] or the {{w|labour movement}}",
parents = {"kerja", "fahaman berhaluan kiri"},
}
labels["dobi"] = {
type = "berkenaan",
description = "default",
parents = {"pembersihan"},
}
labels["undang-undang"] = {
type = "berkenaan",
description = "=the [[science]] and [[practice]] of [[law]]",
parents = {"keadilan"},
}
labels["penguatkuasaan undang-undang"] = {
type = "berkenaan",
description = "default",
parents = {"pencegahan jenayah", "perkhidmatan kecemasan", "undang-undang"},
}
labels["undang-undang obligasi"] = {
type = "berkenaan",
description = "default with the no singularize",
breadcrumb = "obligasi",
parents = {{name = "undang-undang", sort = "obligasi"}},
}
labels["pertukangan kulit"] = {
type = "berkenaan",
description = "default",
parents = {"kraf"},
}
labels["fahaman berhaluan kiri"] = {
type = "berkenaan",
description = "default",
parents = {"ideologi"},
}
labels["liberalisme"] = {
type = "berkenaan",
description = "default",
parents = {"ideologi"},
}
labels["libertarianisme"] = {
type = "berkenaan",
description = "default",
parents = {"ideologi"},
}
labels["logistik"] = {
type = "berkenaan",
description = "default no singularize",
parents = {"operasi"},
}
labels["pengurusan"] = {
type = "berkenaan",
description = "default",
parents = {"perniagaan"},
}
labels["Maoisme"] = {
type = "berkenaan",
description = "default",
parents = {"ideologi", "komunisme", "Marxisme"},
}
labels["pemasaran"] = {
type = "berkenaan",
description = "default",
parents = {"perniagaan"},
}
labels["Marxisme"] = {
type = "berkenaan",
description = "default",
parents = {"ideologi", "sosialisme"},
}
labels["maskulinisme"] = {
type = "berkenaan",
description = "default",
parents = {"ideologi", "lelaki"},
}
labels["pertukangan logam"] = {
type = "berkenaan",
description = "default",
parents = {"kraf", "metalurgi"},
}
labels["McDonald's"] = {
type = "berkenaan",
description = "=the {{w|McDonald's}} [[chain]] of [[fast-food]] [[restaurant]]s",
parents = {"restoran"},
}
labels["mikronasionalisme"] = {
type = "berkenaan",
description = "default",
parents = {"bentuk pemerintahan", "ideologi"},
}
labels["ketenteraan"] = {
type = "berkenaan",
description = "default with the",
parents = {"masyarakat"},
}
labels["unit ketenteraan"] = {
type = "berkenaan",
description = "default",
parents = {"ketenteraan", "pekerjaan"},
}
labels["perlombongan"] = {
type = "berkenaan",
description = "default",
parents = {"industri"},
}
labels["monarkisme"] = {
type = "berkenaan",
description = "default",
parents = {"ideologi", "monarki"},
}
labels["monarki"] = {
type = "berkenaan",
description = "default",
parents = {"bentuk pemerintahan", "masyarakat atasan"},
}
labels["wang"] = {
type = "berkenaan",
description = "default",
parents = {"perniagaan"},
}
labels["muzium"] = {
type = "berkenaan",
description = "default",
parents = {"jenis perniagaan", "pelancongan", "seni"},
}
labels["nasionalisme"] = {
type = "berkenaan",
description = "default",
parents = {"ideologi"},
}
labels["Nazisme"] = {
type = "berkenaan",
description = "default",
parents = {"fasisme", "ideologi ketuanan kulit putih", "ideologi"},
}
labels["neo-Nazisme"] = { -- Adjacent to Nazism, but not quite the same thing.
type = "berkenaan",
description = "default",
parents = {"Nazisme", "fasisme", "ideologi ketuanan kulit putih", "ideologi"},
}
labels["Hadiah Nobel"] = {
type = "berkenaan",
description = "default with the",
parents = {"anugerah"},
}
labels["Objektivisme"] = {
type = "berkenaan",
description = "=the political philosophy of {{w|Objectivism}} developed by {{w|Ayn Rand}}",
parents = {"ideologi", "libertarianisme"},
}
labels["jawatan"] = {
type = "jenis",
description = "=offices, in the sense \"position of responsibility of some authority within an organisation\"",
parents = {"pemerintahan"},
}
labels["industri minyak"] = {
type = "berkenaan",
description = "default with the",
breadcrumb = "minyak",
parents = {"industri", "petroleum"},
}
labels["operasi"] = {
type = "berkenaan",
description = "{{{langname}}} terms covering all operational matters in [[production]], [[logistics]], or [[services]].",
parents = {"pengurusan", "teori sistem"},
}
labels["pertubuhan"] = {
type = "nama",
description = "default",
parents = {"masyarakat"},
}
labels["pembuatan kertas"] = {
type = "berkenaan",
description = "default",
parents = {"kraf", "industri"},
}
labels["undang-undang paten"] = {
type = "berkenaan",
description = "default",
breadcrumb = "paten",
parents = {"undang-undang"},
}
labels["keamanan"] = {
type = "berkenaan",
description = "default",
parents = {"keselamatan"},
}
labels["pencen"] = {
type = "berkenaan",
description = "default",
parents = {"kewangan"},
}
labels["filantropi"] = {
type = "berkenaan",
description = "default",
parents = {"masyarakat"},
}
labels["Philmont Scout Ranch"] = {
type = "berkenaan",
description = "={{w|Philmont Scout Ranch}}, a Scouting ranch in the United States",
parents = {"kepanduan"},
}
labels["pelanunan"] = {
type = "berkenaan",
description = "default",
parents = {"jenayah", "nautika"},
}
labels["politik"] = {
type = "berkenaan",
description = "default no singularize",
parents = {"masyarakat"},
}
labels["kemiskinan"] = {
type = "berkenaan",
description = "default",
parents = {"kekayaan"},
}
for _, country_demonym in ipairs {
{"Argentina", "Argentina"},
{"Australia", "Australia"},
{"Bangladesh", "Bangladesh"},
{"Brazil", "Brazil"},
{"Bulgaria", "Bulgaria"},
{"Kanada", "Kanada"},
{"Chile", "Chile"},
{"China", "China"},
{"Eropah", "Eropah"},
{"Kesatuan Eropah", "Kesatuan Eropah", nil, "politik Eropah"},
{"Perancis", "Perancis", nil, "politik Eropah"},
{"Jerman", "Jerman", nil, "politik Eropah"},
{"Hong Kong", "Hong Kong"},
{"Hungary", "Hungary", nil, "politik Eropah"},
{"India", "India"},
{"Indonesia", "Indonesia"},
{"Ireland", "Ireland", nil, "politik Eropah"},
{"Jepun", "Jepun"},
{"Malaysia", "Malaysia"},
{"Mexico", "Mexico"},
{"New Zealand", "New Zealand"},
{"Nigeria", "Nigeria"},
{"Pakistan", "Pakistan"},
{"Palestin", "Palestin"},
{"Peru", "Peru"},
{"Filipina", "Filipina"},
{"Poland", "Poland", nil, "politik Eropah"},
{"Portugal", "Portugal", nil, "politik Eropah"},
{"Rusia", "Rusia"},
{"Singapura", "Singapura"},
{"Afrika Selatan", "Afrika Selatan"},
{"Korea Selatan", "Korea Selatan"},
{"Sepanyol", "Sepanyol", nil, "politik Eropah"},
{"Switzerland", "Switzerland", nil, "politik Eropah"},
{"Taiwan", "Taiwan"},
{"Ukraine", "Ukraine"},
{"United Kingdom", "UK", "United Kingdom", "politik Eropah"},
{"Amerika Syarikat", "Amerika Syarikat"},
{"Venezuela", "Venezuela"},
{"Vietnam", "Vietnam"},
} do
local country, demonym, full_country, parent = unpack(country_demonym)
labels["politik " .. demonym] = {
type = "berkenaan",
description = ("={{w|politik %s}}"):format(full_country or country),
parents = {parent or "politik", country},
}
end
labels["percetakan"] = {
type = "berkenaan",
description = "default",
parents = {"industri"},
}
labels["penjara"] = {
type = "berkenaan",
description = "default",
parents = {"penguatkuasaan undang-undang", "bangunan"},
}
labels["undang-undang prosedur"] = {
type = "berkenaan",
description = "default",
breadcrumb = "prosedur",
parents = {"undang-undang"},
}
labels["undang-undang harta"] = {
type = "berkenaan",
description = "default",
breadcrumb = "harta",
parents = {"undang-undang"},
}
labels["pentadbiran awam"] = {
type = "berkenaan",
description = "=the field of [[public]] [[administration]]",
parents = {"pemerintahan"},
}
labels["keselamatan awam"] = {
type = "berkenaan",
description = "=the field of [[public]] [[safety]]",
parents = {"pentadbiran awam", "keselamatan"},
}
labels["penerbitan"] = {
type = "berkenaan",
description = "default",
parents = {"industri", "media massa"},
}
labels["QAnon"] = {
type = "berkenaan",
description = "=the [[QAnon]] movement",
parents = {"alt-right", "teori konspirasi", "Donald Trump", "pedofilia"},
}
labels["queerfobia"] = {
type = "berkenaan",
description = "default",
parents = {"bentuk diskriminasi", "LGBTQ"},
}
labels["rasisme"] = {
type = "berkenaan",
description = "default",
parents = {"bentuk diskriminasi"},
}
labels["rogol"] = {
type = "berkenaan",
description = "=the field of [[sexual violence]]",
parents = {"seks", "jenayah", "keganasan"},
}
labels["hartanah"] = {
type = "berkenaan",
description = "default",
parents = {"industri", "perumahan"},
}
labels["restoran"] = {
type = "berkenaan",
description = "=[[restaurant]]s (including [[pub]]s, [[café]]s etc.)",
parents = {"jenis perniagaan", "makanan dan minuman"},
}
labels["kediaman diraja"] = {
type = "berkenaan",
description = "default",
parents = {"perumahan", "monarki"},
}
labels["sekolah"] = {
type = "berkenaan",
description = "default",
parents = {"pendidikan", "bangunan"},
}
-- Note: this is the usual term, not "Scottish law".
labels["undang-undang Scots"] = {
type = "berkenaan",
description = "default",
breadcrumb = "Scots",
parents = {"undang-undang", "Scotland"},
}
labels["kepanduan"] = {
type = "berkenaan",
description = "default",
parents = {"masyarakat"},
}
labels["keselamatan"] = {
type = "berkenaan",
description = "default",
parents = {"masyarakat"},
}
labels["seksisme"] = {
type = "berkenaan",
description = "default",
parents = {"bentuk diskriminasi", "gender"},
}
labels["menjahit"] = {
type = "berkenaan",
description = "=[[sewing]], sewing tools, sewing [[technique]]s and so on",
parents = {"kraf"},
}
labels["pembuatan kasut"] = {
type = "berkenaan",
description = "default",
parents = {"kraf"},
}
labels["perhambaan"] = {
type = "berkenaan",
description = "default",
parents = {"masyarakat", "kerja"},
}
labels["sosialisme"] = {
type = "berkenaan",
description = "default",
parents = {"ekonomi", "ideologi", "fahaman berhaluan kiri"},
}
labels["keadilan sosial"] = {
type = "berkenaan",
description = "default",
parents = {"politik", "masyarakat", "sosiologi", "fahaman berhaluan kiri"},
}
labels["keselamatan sosial"] = {
type = "berkenaan",
description = "default",
parents = {"pemerintahan", "undang-undang", "wang"},
}
labels["pemintalan"] = {
type = "berkenaan",
description = "=[[spinning]], the process of making [[yarn]] or [[string]] from raw [[fiber]]",
parents = {"kraf"},
}
labels["tarian persegi"] = {
type = "berkenaan",
description = "default",
parents = {"tarian"},
}
labels["piawaian identiti"] = {
type = "berkenaan",
description = "default",
parents = {"undang-undang", "makanan dan minuman"},
}
labels["pasaran saham"] = {
type = "berkenaan",
description = "default with the",
parents = {"kewangan"},
}
labels["simbol saham syarikat"] = {
type = "nama",
description = "=[[stock symbol]]s for [[company|companies]]",
parents = {"perdagangan"},
}
labels["rantaian bekalan"] = {
type = "berkenaan",
description = "default no singularize",
parents = {"operasi"},
}
labels["percukaian"] = {
type = "berkenaan",
description = "default",
parents = {"pemerintahan", "undang-undang", "wang"},
}
labels["kecurian"] = {
type = "berkenaan",
description = "default",
parents = {"jenayah"},
}
labels["teokrasi"] = {
type = "berkenaan",
description = "default",
parents = {"ideologi", "agama"},
}
labels["industri balak"] = {
type = "berkenaan",
description = "default with the",
breadcrumb = "balak",
parents = {"industri"},
}
labels["tanda dagangan"] = {
type = "berkenaan",
description = "=[[trademark]] [[law]]",
parents = {"harta intelek"},
}
labels["perdagangan"] = {
type = "berkenaan",
description = "default",
parents = {"perniagaan"},
}
labels["transfobia"] = {
type = "berkenaan",
description = "default",
parents = {"bentuk diskriminasi", "transgender"},
}
labels["kepercayaan"] = {
type = "berkenaan",
description = "default",
parents = {"keselamatan"},
}
labels["jenis petempatan"] = {
type = "jenis",
topic = "settlements",
description = "=[[settlement]]s",
parents = {"pemerintahan"},
}
labels["Pertubuhan Bangsa-Bangsa Bersatu"] = {
type = "berkenaan",
description = "=the [[United Nations Organization]]",
parents = {"pertubuhan"},
}
labels["universiti"] = {
type = "berkenaan",
description = "default",
parents = {"sekolah"},
}
labels["sistem pengundian"] = {
type = "berkenaan",
description = "default",
parents = {"demokrasi", "sistem"},
}
labels["kekayaan"] = {
type = "berkenaan",
description = "default",
parents = {"ekonomi"},
}
labels["penenunan"] = {
type = "berkenaan",
description = "default",
parents = {"kraf"},
}
labels["ideologi ketuanan kulit putih"] = {
type = "berkenaan",
description = "default",
parents = {"rasisme", "antisemitisme", "ideologi"},
}
labels["kerja kayu"] = {
type = "berkenaan",
description = "default",
parents = {"kraf"},
}
labels["Zionisme"] = {
type = "berkenaan",
description = "default",
parents = {"ideologi", "Yahudi", "Israel", "nasionalisme"},
}
return labels
r6m8h8iqbkfurr673awcbyi4lcidhet
看護師
0
13187
343048
320155
2026-05-20T03:29:51Z
Hakimi97
2668
343048
wikitext
text/x-wiki
==Bahasa Jepun==
{{ja-kanjitab|かん|ご|し|yomi=on}}
===Kata nama===
{{wikipedia|lang=ja}}
{{ja-noun|かんごし}}
# [[jururawat]]
===Sebutan===
{{ja-pron|かんごし|acc=3|acc_ref=DJR}}
===Kata berkaitan===
* {{ja-r|看護婦|かんごふ}}
* {{ja-r|看護士|かんごし}}
===Rujukan===
<references />
[[Kategori:Kata genus neuter bahasa Jepun|かんごし]]
[[Kategori:ja:Pekerjaan penjagaan kesihatan|かんごし]]
==Bahasa Korea==
{{ko-hanjatab|看|護|師}}
===Kata nama===
{{ko-noun|hj|rv=ganhosa|hangeul=간호사}}
# {{hanja form of|간호사|jururawat}}
9u2i7amp1ruh2c07qv57ncrstiij7l0
Malaisien
0
15796
343027
316874
2026-05-19T14:41:59Z
Hakimi97
2668
343027
wikitext
text/x-wiki
{{juga|malaisien}}
==Bahasa Perancis==
===Kata nama===
{{fr-noun|m|f=Malaisienne}}
# [[orang Malaysia]] (seseorang dari Malaysia)
===Anagram===
* {{l|fr|Milanaise}}, {{l|fr|milanaise}}
[[Kategori:fr:Kewarganegaraan]]
5xpyjt0hpxevdz3bx6ut1puqbz0yoeg
医者
0
18588
343038
320092
2026-05-20T03:26:52Z
Hakimi97
2668
343038
wikitext
text/x-wiki
==Bahasa Cina==
{{zh-see|醫者}}
==Bahasa Jepun==
{{ja-kanjitab|い|しゃ}}
===Kata nama===
{{ja-noun|いしゃ}}
# [[doktor]]
===Sebutan===
{{ja-pron|いしゃ|acc=0|acc_ref=DJR,NHK}}
===Rujukan===
<references />
{{C|ja|Pekerjaan penjagaan kesihatan|sort=いさ}}
==Bahasa Okinawa==
===Kata nama===
{{head|ryu|kata nama|hiragana|いさ|romaji|isa|sort=いさ}}
# [[doktor]]
{{C|ryu|Pekerjaan penjagaan kesihatan|sort=いさ}}
hyhdr9pttnnmbtanvxiiumdw0ym4z8s
doktor bedah
0
20054
343044
334903
2026-05-20T03:28:55Z
Hakimi97
2668
343044
wikitext
text/x-wiki
==Bahasa Melayu==
===Kata nama===
{{ms-kn|j=دوکتور بده|orang}}
# [[doktor|Doktor]] yang menguruskan [[pembedahan]] badan para pesakit.
===Etimologi===
{{compound|ms|doktor|bedah}}
===Sebutan===
* {{dewan|dok|tor||be|dah}}
===Rujukan===
* {{R:KD4}}
===Pautan luar===
* {{R:PRPM}}
{{C|ms|Pekerjaan penjagaan kesihatan|Pembedahan}}
rkaw7svuj9d2g7qz03f3ma4go8jdpet
kejururawatan
0
25098
343043
338051
2026-05-20T03:28:40Z
Hakimi97
2668
343043
wikitext
text/x-wiki
==Bahasa Melayu==
{{Wikipedia}} <!-- Kalau ada -->
===Kata nama===
{{ms-kn|j=کجوروراوتن|pl=-}}
# Ilmu dan kemahiran berkaitan [[jururawat]].
===Etimologi===
{{apitan|ms|ke|jururawat|an}}
===Sebutan===
* {{dewan|ke|ju|ru|ra|wa|tan}}
===Pautan luar===
* {{R:PRPM}}
{{C|ms|Pekerjaan penjagaan kesihatan}}
hj35xnirjc617xpvue3lj6q00stemgf
wali kota
0
46863
343036
163916
2026-05-20T01:50:11Z
Hakimi97
2668
343036
wikitext
text/x-wiki
== Bahasa Indonesia ==
{{Wikipedia|lang=id}} <!-- Kalau ada -->
=== Takrifan ===
==== Kata nama ====
{{id-kn}}
# [[datuk bandar]]; orang yang mengetuai sesebuah [[bandar]] atau [[kota]].
===== Ejaan alternatif =====
* [[walikota]]
=== Etimologi ===
{{compound|id|wali|kota}}
=== Pautan luar ===
* {{R:KBBI Daring}}
{{C|id|Orang|Politik|Pemerintahan}}
tj8tqdk7oxa8tx0k37f9llxa80tnv4r
règle
0
48618
343032
322416
2026-05-19T14:44:32Z
Hakimi97
2668
343032
wikitext
text/x-wiki
==Bahasa Perancis==
{{Wikipedia|lang=fr}}
===Kata nama===
{{fr-kn|f}}
# [[peraturan]]
# [[pemerintahan]] (tempoh atau zaman)
# [[pembaris]]
# {{lb|fr|dalam bentuk jamak}} [[haid]]
#: {{syn|fr|menstruation}}
===Etimologi===
Daripada {{inh|fr|frm|regle}}, daripada {{inh|fr|fro|regle}} Lewat (sekitar abad ke-13), pinjaman daripada {{der|fr|la|regula}}. Menggantikan pinjaman terdahulu {{m+|fro|riule}}, {{m|fro|reule}} (asalnya {{cog|en|rule}}). Banding juga dengan {{m+|fro|reille}} (asalnya {{m+|en|rail}}). {{doublet|fr|rail|rigole}}.
===Sebutan===
* {{fr-IPA}}
* {{audio|fr|Fr-règle.ogg|audio}}
{{C|fr|Alat|Alat ukur|Haid}}
4bakjd59o0m4v0svnh9of3q7ripjf6n
Kategori:Arab
14
77569
343065
226655
2026-05-20T05:42:40Z
Hakimi97
2668
343065
wikitext
text/x-wiki
{{delete|kategori tidak lagi digunakan}}
rgc3zamtkef7ay5g9dvl2ahdr1xww4s
Kategori:ms:Pekerjaan penjagaan kesihatan
14
85163
343046
240577
2026-05-20T03:29:20Z
Hakimi97
2668
Hakimi97 telah memindahkan laman [[Kategori:ms:Pekerjaan kesihatan]] ke [[Kategori:ms:Pekerjaan penjagaan kesihatan]]: Tajuk salah eja
240577
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Kategori:Pekerjaan penjagaan kesihatan
14
85165
343041
240582
2026-05-20T03:27:33Z
Hakimi97
2668
Hakimi97 telah memindahkan laman [[Kategori:Pekerjaan kesihatan]] ke [[Kategori:Pekerjaan penjagaan kesihatan]]
240582
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Kategori:fr:Alat ukur
14
113201
343033
279460
2026-05-19T14:44:40Z
Hakimi97
2668
Hakimi97 telah memindahkan laman [[Kategori:fr:Alat ukuran]] ke [[Kategori:fr:Alat ukur]]
279460
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Kategori:fr:Kewarganegaraan
14
113230
343028
279489
2026-05-19T14:42:09Z
Hakimi97
2668
Hakimi97 telah memindahkan laman [[Kategori:fr:Kerakyatan]] ke [[Kategori:fr:Kewarganegaraan]]
279489
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Kategori:Kewarganegaraan
14
114854
343022
281285
2026-05-19T14:40:22Z
Hakimi97
2668
Hakimi97 telah memindahkan laman [[Kategori:Kerakyatan]] ke [[Kategori:Kewarganegaraan]]: Tajuk salah eja
281285
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Kategori:tr:Kewarganegaraan
14
115385
343025
281956
2026-05-19T14:41:23Z
Hakimi97
2668
Hakimi97 telah memindahkan laman [[Kategori:tr:Kerakyatan]] ke [[Kategori:tr:Kewarganegaraan]]: Tajuk salah eja
281956
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Kategori:ja:Pekerjaan penjagaan kesihatan
14
115557
343049
282134
2026-05-20T03:30:06Z
Hakimi97
2668
Hakimi97 telah memindahkan laman [[Kategori:ja:Pekerjaan kesihatan]] ke [[Kategori:ja:Pekerjaan penjagaan kesihatan]]
282134
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Kategori:ryu:Pekerjaan penjagaan kesihatan
14
115782
343039
282380
2026-05-20T03:27:03Z
Hakimi97
2668
Hakimi97 telah memindahkan laman [[Kategori:ryu:Pekerjaan kesihatan]] ke [[Kategori:ryu:Pekerjaan penjagaan kesihatan]]
282380
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Wikikamus:kzj/baivangon
4
115939
343066
282768
2026-05-20T08:09:03Z
Hiyuune
8343
/* */ edited using [[wikt:User:Dixtosa/AjaxEdit.js|AjaxEdit]]
343066
wikitext
text/x-wiki
==Bahasa Kadazan==
===Kata nama===
{{inti|kzj|kata nama}}
# (dialek, Kadazan Papar) pintu
kvk9bqqbxxoscpoa09zftbdbmwr6bz5
Kategori:id:Pentadbiran
14
117269
343037
298263
2026-05-20T01:50:55Z
Hakimi97
2668
343037
wikitext
text/x-wiki
{{delete|digantikan dengan [[:Kategori:id:Pemerintahan]]}}
4vqgwox6niott73kykr9jokz20mvmwt
Wikikamus:tmw/Jala
4
118500
343016
342523
2026-05-19T12:15:04Z
EmausBot
3738
Memperbetulkan pelencongan berganda ke [[Wikikamus:tmw/jaghas]]
343016
wikitext
text/x-wiki
#LENCONG [[Wikikamus:tmw/jaghas]]
lilkx1z0r7n8njesccc4k861yn3agl4
Wikikamus:Penyelia/Pengundian/Rulwarih untuk penyelia 19 Mei 2026
4
118688
343018
2026-05-19T14:26:09Z
PeaceSeekers
3334
Mencipta laman baru dengan kandungan '<big>'''[[Pengguna:Rulwarih|Rulwarih]]'''</big> ([[Perbincangan Pengguna:Rulwarih|Perbualan]] • [[Khas:Sumbangan/Rulwarih|Sumbangan]] • [[Khas:Pusat_pengesahan/Rulwarih|Sejagat]] • <span class="plainlinks">[https://xtools.wmcloud.org/ec/ms.wiktionary.org/Rulwarih Statistik]</span>) :{| class=wikitable |- | '''Diusulkan oleh''' | [https://ms.wiktionary.org/wiki/Wikikamus:Penyelia/Permohonan#Rulwarih_(Perbincangan_-_Sumbangan) Rulwarih] |- | '''...'
343018
wikitext
text/x-wiki
<big>'''[[Pengguna:Rulwarih|Rulwarih]]'''</big> ([[Perbincangan Pengguna:Rulwarih|Perbualan]] • [[Khas:Sumbangan/Rulwarih|Sumbangan]] • [[Khas:Pusat_pengesahan/Rulwarih|Sejagat]] • <span class="plainlinks">[https://xtools.wmcloud.org/ec/ms.wiktionary.org/Rulwarih Statistik]</span>)
:{| class=wikitable
|-
| '''Diusulkan oleh'''
| [https://ms.wiktionary.org/wiki/Wikikamus:Penyelia/Permohonan#Rulwarih_(Perbincangan_-_Sumbangan) Rulwarih]
|-
| '''Jumlah suntingan'''
| 2,158 setakat 02:25, 19 Mei 2026 (UTC)
|-
| '''Mekanisme'''
|
Waktu pengundian:
* Bermula pada 19 Mei 2026.
* Berakhir pada 2 Jun 2026 (2 minggu).
Syarat pengundian:
* Pengguna yang menyokong minimum sebanyak tiga (3) orang.
* Dipersetujui minimum 70% pengundi. Undian 'berkecuali' tidak diambil kira.
* Semua [[Wikikamus:Penyelia/Polisi#Takrifan dan istilah umum|pengguna berdaftar sah]] boleh mengundi.
|}
== Undian ==
<!-- Guna {{Undi|Y}} atau {{Undi|T}} -->
== Komen ==
== Keputusan ==
243319rkwbptraofhbcxlxyskh0zubb
343019
343018
2026-05-19T14:26:25Z
PeaceSeekers
3334
PeaceSeekers telah memindahkan laman [[Wikikamus:Penyelia/Pengundian/Rulwarih untuk penyelia 19 Mei 2025]] ke [[Wikikamus:Penyelia/Pengundian/Rulwarih untuk penyelia 19 Mei 2026]] tanpa meninggalkan lencongan: Tajuk salah eja
343018
wikitext
text/x-wiki
<big>'''[[Pengguna:Rulwarih|Rulwarih]]'''</big> ([[Perbincangan Pengguna:Rulwarih|Perbualan]] • [[Khas:Sumbangan/Rulwarih|Sumbangan]] • [[Khas:Pusat_pengesahan/Rulwarih|Sejagat]] • <span class="plainlinks">[https://xtools.wmcloud.org/ec/ms.wiktionary.org/Rulwarih Statistik]</span>)
:{| class=wikitable
|-
| '''Diusulkan oleh'''
| [https://ms.wiktionary.org/wiki/Wikikamus:Penyelia/Permohonan#Rulwarih_(Perbincangan_-_Sumbangan) Rulwarih]
|-
| '''Jumlah suntingan'''
| 2,158 setakat 02:25, 19 Mei 2026 (UTC)
|-
| '''Mekanisme'''
|
Waktu pengundian:
* Bermula pada 19 Mei 2026.
* Berakhir pada 2 Jun 2026 (2 minggu).
Syarat pengundian:
* Pengguna yang menyokong minimum sebanyak tiga (3) orang.
* Dipersetujui minimum 70% pengundi. Undian 'berkecuali' tidak diambil kira.
* Semua [[Wikikamus:Penyelia/Polisi#Takrifan dan istilah umum|pengguna berdaftar sah]] boleh mengundi.
|}
== Undian ==
<!-- Guna {{Undi|Y}} atau {{Undi|T}} -->
== Komen ==
== Keputusan ==
243319rkwbptraofhbcxlxyskh0zubb
Wikikamus:Penyelia/Pengundian/EmpAhmadK untuk penyelia 19 Mei 2026
4
118689
343021
2026-05-19T14:28:30Z
PeaceSeekers
3334
Mencipta laman baru dengan kandungan '<big>'''[[Pengguna:EmpAhmadK|EmpAhmadK]]'''</big> ([[Perbincangan Pengguna:EmpAhmadK|Perbualan]] • [[Khas:Sumbangan/EmpAhmadK|Sumbangan]] • [[Khas:Pusat_pengesahan/EmpAhmadK|Sejagat]] • <span class="plainlinks">[https://xtools.wmcloud.org/ec/ms.wiktionary.org/EmpAhmadK Statistik]</span>) :{| class=wikitable |- | '''Diusulkan oleh''' | [https://ms.wiktionary.org/wiki/Wikikamus:Penyelia/Permohonan#EmpAhmadK_(Perbincangan_-_Sumbangan) EmpAhmadK] |...'
343021
wikitext
text/x-wiki
<big>'''[[Pengguna:EmpAhmadK|EmpAhmadK]]'''</big> ([[Perbincangan Pengguna:EmpAhmadK|Perbualan]] • [[Khas:Sumbangan/EmpAhmadK|Sumbangan]] • [[Khas:Pusat_pengesahan/EmpAhmadK|Sejagat]] • <span class="plainlinks">[https://xtools.wmcloud.org/ec/ms.wiktionary.org/EmpAhmadK Statistik]</span>)
:{| class=wikitable
|-
| '''Diusulkan oleh'''
| [https://ms.wiktionary.org/wiki/Wikikamus:Penyelia/Permohonan#EmpAhmadK_(Perbincangan_-_Sumbangan) EmpAhmadK]
|-
| '''Jumlah suntingan'''
| 202 setakat 02:28, 19 Mei 2026 (UTC)
|-
| '''Mekanisme'''
|
Waktu pengundian:
* Bermula pada 19 Mei 2026.
* Berakhir pada 2 Jun 2026 (2 minggu).
Syarat pengundian:
* Pengguna yang menyokong minimum sebanyak tiga (3) orang.
* Dipersetujui minimum 70% pengundi. Undian 'berkecuali' tidak diambil kira.
* Semua [[Wikikamus:Penyelia/Polisi#Takrifan dan istilah umum|pengguna berdaftar sah]] boleh mengundi.
|}
== Undian ==
<!-- Guna {{Undi|Y}} atau {{Undi|T}} -->
== Komen ==
== Keputusan ==
gsm2rlah0fpj6ay11kbv4ikfesrpml2
Kategori:Kerakyatan
14
118690
343023
2026-05-19T14:40:23Z
Hakimi97
2668
Hakimi97 telah memindahkan laman [[Kategori:Kerakyatan]] ke [[Kategori:Kewarganegaraan]]: Tajuk salah eja
343023
wikitext
text/x-wiki
#LENCONG [[:Kategori:Kewarganegaraan]]
ckp3r07ty0lxz1orgqtucgqw9xy8di0
Kategori:tr:Kerakyatan
14
118691
343026
2026-05-19T14:41:23Z
Hakimi97
2668
Hakimi97 telah memindahkan laman [[Kategori:tr:Kerakyatan]] ke [[Kategori:tr:Kewarganegaraan]]: Tajuk salah eja
343026
wikitext
text/x-wiki
#LENCONG [[:Kategori:tr:Kewarganegaraan]]
k3jd8o4ahhlbkpr0e90lthl2h0t99iu
Kategori:fr:Kerakyatan
14
118692
343029
2026-05-19T14:42:10Z
Hakimi97
2668
Hakimi97 telah memindahkan laman [[Kategori:fr:Kerakyatan]] ke [[Kategori:fr:Kewarganegaraan]]
343029
wikitext
text/x-wiki
#LENCONG [[:Kategori:fr:Kewarganegaraan]]
994jq1n5w79y58bw959pxrjp6myf2fq
Wikikamus:Penyelia/Pengundian/EmpAhmadK untuk penyelia antaramuka 19 Mei 2026
4
118693
343030
2026-05-19T14:43:09Z
PeaceSeekers
3334
Mencipta laman baru dengan kandungan '<big>'''[[Pengguna:EmpAhmadK|EmpAhmadK]]'''</big> ([[Perbincangan Pengguna:EmpAhmadK|Perbualan]] • [[Khas:Sumbangan/EmpAhmadK|Sumbangan]] • [[Khas:Pusat_pengesahan/EmpAhmadK|Sejagat]] • <span class="plainlinks">[https://xtools.wmcloud.org/ec/ms.wiktionary.org/EmpAhmadK Statistik]</span>) :{| class=wikitable |- | '''Diusulkan oleh''' | [https://ms.wiktionary.org/wiki/Wikikamus:Penyelia/Permohonan#EmpAhmadK_(Perbincangan_-_Sumbangan) EmpAhmadK] |...'
343030
wikitext
text/x-wiki
<big>'''[[Pengguna:EmpAhmadK|EmpAhmadK]]'''</big> ([[Perbincangan Pengguna:EmpAhmadK|Perbualan]] • [[Khas:Sumbangan/EmpAhmadK|Sumbangan]] • [[Khas:Pusat_pengesahan/EmpAhmadK|Sejagat]] • <span class="plainlinks">[https://xtools.wmcloud.org/ec/ms.wiktionary.org/EmpAhmadK Statistik]</span>)
:{| class=wikitable
|-
| '''Diusulkan oleh'''
| [https://ms.wiktionary.org/wiki/Wikikamus:Penyelia/Permohonan#EmpAhmadK_(Perbincangan_-_Sumbangan) EmpAhmadK]
|-
| '''Jumlah suntingan'''
| 202 setakat 02:43, 19 Mei 2026 (UTC)
|-
| '''Mekanisme'''
|
Waktu pengundian:
* Bermula pada 19 Mei 2026.
* Berakhir pada 2 Jun 2026 (2 minggu).
Syarat pengundian:
* Pengguna yang menyokong minimum sebanyak tiga (3) orang.
* Dipersetujui minimum 70% pengundi. Undian 'berkecuali' tidak diambil kira.
* Semua [[Wikikamus:Penyelia/Polisi#Takrifan dan istilah umum|pengguna berdaftar sah]] boleh mengundi.
|}
== Undian ==
<!-- Guna {{Undi|Y}} atau {{Undi|T}} -->
== Komen ==
== Keputusan ==
t8rfgk2nwlj3ct5475310sra0hfwlys
Kategori:fr:Alat ukuran
14
118694
343034
2026-05-19T14:44:40Z
Hakimi97
2668
Hakimi97 telah memindahkan laman [[Kategori:fr:Alat ukuran]] ke [[Kategori:fr:Alat ukur]]
343034
wikitext
text/x-wiki
#LENCONG [[:Kategori:fr:Alat ukur]]
9bcls08cj0ohgw01szf6cfrpdvzdqyy
Kategori:ryu:Pekerjaan kesihatan
14
118695
343040
2026-05-20T03:27:04Z
Hakimi97
2668
Hakimi97 telah memindahkan laman [[Kategori:ryu:Pekerjaan kesihatan]] ke [[Kategori:ryu:Pekerjaan penjagaan kesihatan]]
343040
wikitext
text/x-wiki
#LENCONG [[:Kategori:ryu:Pekerjaan penjagaan kesihatan]]
l8imohfr9ebh9t1llp4nre3tq2g87av
Kategori:Pekerjaan kesihatan
14
118696
343042
2026-05-20T03:27:34Z
Hakimi97
2668
Hakimi97 telah memindahkan laman [[Kategori:Pekerjaan kesihatan]] ke [[Kategori:Pekerjaan penjagaan kesihatan]]
343042
wikitext
text/x-wiki
#LENCONG [[:Kategori:Pekerjaan penjagaan kesihatan]]
8qiksy04uv3g2i4v1uj7kmm9dbjtoxr
Kategori:ms:Pekerjaan kesihatan
14
118697
343047
2026-05-20T03:29:21Z
Hakimi97
2668
Hakimi97 telah memindahkan laman [[Kategori:ms:Pekerjaan kesihatan]] ke [[Kategori:ms:Pekerjaan penjagaan kesihatan]]: Tajuk salah eja
343047
wikitext
text/x-wiki
#LENCONG [[:Kategori:ms:Pekerjaan penjagaan kesihatan]]
bgad5bi3h5if9jw95y8japvq5fbpact
Kategori:ja:Pekerjaan kesihatan
14
118698
343050
2026-05-20T03:30:06Z
Hakimi97
2668
Hakimi97 telah memindahkan laman [[Kategori:ja:Pekerjaan kesihatan]] ke [[Kategori:ja:Pekerjaan penjagaan kesihatan]]
343050
wikitext
text/x-wiki
#LENCONG [[:Kategori:ja:Pekerjaan penjagaan kesihatan]]
dr47tghqks5fomsrb3c489ynww1j1yz
Kategori:zh:Agama samawi
14
118699
343067
2026-05-20T08:11:52Z
PEACESEEKERS-BOT
10590
Cipta halaman kategori yang masih tiada ([[WT:BOT|bot]])
343067
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Kategori:zh:Bayi
14
118700
343068
2026-05-20T08:12:02Z
PEACESEEKERS-BOT
10590
Cipta halaman kategori yang masih tiada ([[WT:BOT|bot]])
343068
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Kategori:zh:Ekonomi
14
118701
343069
2026-05-20T08:12:12Z
PEACESEEKERS-BOT
10590
Cipta halaman kategori yang masih tiada ([[WT:BOT|bot]])
343069
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Kategori:zh:Gigi
14
118702
343070
2026-05-20T08:12:22Z
PEACESEEKERS-BOT
10590
Cipta halaman kategori yang masih tiada ([[WT:BOT|bot]])
343070
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Kategori:zh:Istilah takwim
14
118703
343071
2026-05-20T08:12:32Z
PEACESEEKERS-BOT
10590
Cipta halaman kategori yang masih tiada ([[WT:BOT|bot]])
343071
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Kategori:zh:Keadilan
14
118704
343072
2026-05-20T08:12:42Z
PEACESEEKERS-BOT
10590
Cipta halaman kategori yang masih tiada ([[WT:BOT|bot]])
343072
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Kategori:zh:Kerja
14
118705
343073
2026-05-20T08:12:52Z
PEACESEEKERS-BOT
10590
Cipta halaman kategori yang masih tiada ([[WT:BOT|bot]])
343073
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Kategori:zh:Kesihatan pergigian
14
118706
343074
2026-05-20T08:13:02Z
PEACESEEKERS-BOT
10590
Cipta halaman kategori yang masih tiada ([[WT:BOT|bot]])
343074
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Kategori:zh:Pemimpin
14
118707
343075
2026-05-20T08:13:12Z
PEACESEEKERS-BOT
10590
Cipta halaman kategori yang masih tiada ([[WT:BOT|bot]])
343075
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Kategori:zh:Pengangkutan
14
118708
343076
2026-05-20T08:13:22Z
PEACESEEKERS-BOT
10590
Cipta halaman kategori yang masih tiada ([[WT:BOT|bot]])
343076
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Kategori:zh:Penjagaan kesihatan
14
118709
343077
2026-05-20T08:13:32Z
PEACESEEKERS-BOT
10590
Cipta halaman kategori yang masih tiada ([[WT:BOT|bot]])
343077
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Kategori:zh:Persepsi
14
118710
343078
2026-05-20T08:13:42Z
PEACESEEKERS-BOT
10590
Cipta halaman kategori yang masih tiada ([[WT:BOT|bot]])
343078
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Kategori:zh:Politik
14
118711
343079
2026-05-20T08:13:52Z
PEACESEEKERS-BOT
10590
Cipta halaman kategori yang masih tiada ([[WT:BOT|bot]])
343079
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Kategori:zh:Satelit semula jadi
14
118712
343080
2026-05-20T08:14:02Z
PEACESEEKERS-BOT
10590
Cipta halaman kategori yang masih tiada ([[WT:BOT|bot]])
343080
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Kategori:zh:Aktiviti manusia
14
118713
343081
2026-05-20T08:14:43Z
PEACESEEKERS-BOT
10590
Cipta halaman kategori yang masih tiada ([[WT:BOT|bot]])
343081
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Kategori:zh:Kanak-kanak
14
118714
343082
2026-05-20T08:14:53Z
PEACESEEKERS-BOT
10590
Cipta halaman kategori yang masih tiada ([[WT:BOT|bot]])
343082
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Kategori:zh:Mulut
14
118715
343083
2026-05-20T08:15:03Z
PEACESEEKERS-BOT
10590
Cipta halaman kategori yang masih tiada ([[WT:BOT|bot]])
343083
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Kategori:zh:Belia
14
118716
343084
2026-05-20T08:15:31Z
PEACESEEKERS-BOT
10590
Cipta halaman kategori yang masih tiada ([[WT:BOT|bot]])
343084
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Kategori:zh:Muka
14
118717
343085
2026-05-20T08:15:41Z
PEACESEEKERS-BOT
10590
Cipta halaman kategori yang masih tiada ([[WT:BOT|bot]])
343085
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Kategori:zh:Kepala dan leher
14
118718
343086
2026-05-20T08:15:58Z
PEACESEEKERS-BOT
10590
Cipta halaman kategori yang masih tiada ([[WT:BOT|bot]])
343086
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Kategori:zh:Umur
14
118719
343087
2026-05-20T08:16:08Z
PEACESEEKERS-BOT
10590
Cipta halaman kategori yang masih tiada ([[WT:BOT|bot]])
343087
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Kategori:zh:Anggota badan
14
118720
343088
2026-05-20T08:16:27Z
PEACESEEKERS-BOT
10590
Cipta halaman kategori yang masih tiada ([[WT:BOT|bot]])
343088
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Kategori:vi:Belia
14
118721
343089
2026-05-20T08:17:23Z
PEACESEEKERS-BOT
10590
Cipta halaman kategori yang masih tiada ([[WT:BOT|bot]])
343089
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Kategori:vi:Cahaya
14
118722
343090
2026-05-20T08:17:33Z
PEACESEEKERS-BOT
10590
Cipta halaman kategori yang masih tiada ([[WT:BOT|bot]])
343090
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Kategori:vi:Ekonomi
14
118723
343091
2026-05-20T08:17:43Z
PEACESEEKERS-BOT
10590
Cipta halaman kategori yang masih tiada ([[WT:BOT|bot]])
343091
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Kategori:vi:Jasad cakerawala
14
118724
343092
2026-05-20T08:17:53Z
PEACESEEKERS-BOT
10590
Cipta halaman kategori yang masih tiada ([[WT:BOT|bot]])
343092
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Kategori:vi:Mulut
14
118725
343093
2026-05-20T08:18:03Z
PEACESEEKERS-BOT
10590
Cipta halaman kategori yang masih tiada ([[WT:BOT|bot]])
343093
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Kategori:vi:Penjagaan kesihatan
14
118726
343094
2026-05-20T08:18:13Z
PEACESEEKERS-BOT
10590
Cipta halaman kategori yang masih tiada ([[WT:BOT|bot]])
343094
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Kategori:vi:Satelit semula jadi
14
118727
343095
2026-05-20T08:18:23Z
PEACESEEKERS-BOT
10590
Cipta halaman kategori yang masih tiada ([[WT:BOT|bot]])
343095
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Kategori:vi:Senarai kategori jenis
14
118728
343096
2026-05-20T08:18:33Z
PEACESEEKERS-BOT
10590
Cipta halaman kategori yang masih tiada ([[WT:BOT|bot]])
343096
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Kategori:vi:Angkasa
14
118729
343097
2026-05-20T08:24:13Z
PEACESEEKERS-BOT
10590
Cipta halaman kategori yang masih tiada ([[WT:BOT|bot]])
343097
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Kategori:vi:Kesihatan
14
118730
343098
2026-05-20T08:24:23Z
PEACESEEKERS-BOT
10590
Cipta halaman kategori yang masih tiada ([[WT:BOT|bot]])
343098
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Kategori:vi:Muka
14
118731
343099
2026-05-20T08:24:33Z
PEACESEEKERS-BOT
10590
Cipta halaman kategori yang masih tiada ([[WT:BOT|bot]])
343099
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Kategori:vi:Sains sosial
14
118732
343100
2026-05-20T08:24:43Z
PEACESEEKERS-BOT
10590
Cipta halaman kategori yang masih tiada ([[WT:BOT|bot]])
343100
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Kategori:vi:Tenaga
14
118733
343101
2026-05-20T08:24:53Z
PEACESEEKERS-BOT
10590
Cipta halaman kategori yang masih tiada ([[WT:BOT|bot]])
343101
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Kategori:vi:Umur
14
118734
343102
2026-05-20T08:25:03Z
PEACESEEKERS-BOT
10590
Cipta halaman kategori yang masih tiada ([[WT:BOT|bot]])
343102
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Kategori:vi:Kepala dan leher
14
118735
343103
2026-05-20T08:30:44Z
PEACESEEKERS-BOT
10590
Cipta halaman kategori yang masih tiada ([[WT:BOT|bot]])
343103
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Kategori:vi:Masa
14
118736
343104
2026-05-20T08:30:54Z
PEACESEEKERS-BOT
10590
Cipta halaman kategori yang masih tiada ([[WT:BOT|bot]])
343104
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Kategori:vi:Anggota badan
14
118737
343105
2026-05-20T08:32:27Z
PEACESEEKERS-BOT
10590
Cipta halaman kategori yang masih tiada ([[WT:BOT|bot]])
343105
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx