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