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