विकिपीडिया gomwiki https://gom.wikipedia.org/wiki/%E0%A4%AE%E0%A5%81%E0%A4%96%E0%A5%87%E0%A4%B2_%E0%A4%AA%E0%A4%BE%E0%A4%A8 MediaWiki 1.47.0-wmf.24 first-letter माध्यम विशेश चर्चा वापरपी वापरपी चर्चा विकिपीडिया विकिपीडिया चर्चा फायल फायल चर्चा मिडियाविकी मिडियाविकी चर्चा सांचो सांचो चर्चा आदार आदार चर्चा वर्ग वर्ग चर्चा TimedText TimedText talk एकक एकक चर्चा Event Event talk विशय राम 0 256 217848 203172 2026-10-18T20:41:54Z Rotondus 5998 217848 wikitext text/x-wiki {{Lipi|.|Rama}} [[File:Srisita ram laxman hanuman manor.JPG|right|200px|thumb|[[Sita]] (far right), Rama (center), [[Lakshmana]] (far left) and [[Hanuman]] (below seated) at [[Bhaktivedanta Manor]], a temple in Watford (England)]] [[File:Valmiki Ramayana.jpg|thumb|left|200px|Valmiki composing the Ramayana.]] [[File:Avatars.jpg|thumb|200px|Rama (left third from top) depicted in the [[Dashavatara]] (ten avatars) of Vishnu. Painting from [[Jaipur]], now at the [[Victoria and Albert Museum]].]] [[File:Stone sculpt 2 NMND-10.JPG|thumb|200px|Ahalya offering fruits and flowers to Rama - her saviour, a 5th-century AD Stone sculpture from [[Deogarh, Uttar Pradesh|Deogah]], currently in the [[National Museum, New Delhi]].]] [[File:Rama in forest.jpg|thumb|200px|left|Rama portrayed as exile in the forest, accompanied by his wife Sita and brother Lakshmana]] [[File:Ravivarmapress Rama family.jpg|upright|thumb|200px|Rama with Sita on the throne, their children Lava and Kusha on their laps. Behind the throne, Lakshamana, Bharata and Shatrughna stand. Hanuman bows to Rama before the throne. Vashishta to the left]] [[File:Agni pariksha.jpg|thumb|left|200px|The Agni pariksha]] [[File:Rama lava kusha.jpg|upright|thumb|left|200px|Rama fighting his sons Lava and Kusha]] [[File:Lava and Kusa, the sons of Rāma..jpg|thumb|200px|Lava and Kusa, the sons of Rāma.]] [[File:WLA lacma 12th century Maharishi Agastya.jpg|thumb|upright|200px| Rishi [[Agastya]] (Father of [[Tamil literature]]) -Rama acquired a rare gem from him which entombed the powers of the gods Indra,Varuna,Yama and Kubera]] [[File:Rama-Varuna.jpg|upright|thumb|left|200px|[[Raja Ravi Varma]] Painting – 'Rama Conquers Varuna']] [[File:Adams Bridge aerial.jpg|thumb|right|200px|upright|Rama Setu (Adam's) bridge as seen from the air, [[Rameshwaram]], [[Tamil Nadu]], [[India]]]] [[File:Ravana.jpg|upright|thumb|200px|Ravana, Demon [[Monarch|King]] of Lanka]] [[File:The return of Rama.jpg|thumb|The return of Rama]] [[File:Rama-Sita coronation.jpg|upright|thumb|200px|Coronation of Rama with Sita (center on the throne), surrounded by his brothers and other deities including Hanuman (bottom left)]] '''राम''' विष्णुच्या धा अवतारांतलो सातवो अवतार. इक्ष्वाकू कुळांतलो अयोध्येचो राजा दशरथ आनी पाट्टराणी कौसल्या हांचो पूत. अभ्यासकांच्या मतान ताचो काळ इ.स. आदीं 2000 ते 1950. ताची जल्मतीथ चैत्र शु. नम (रामनम) वाल्मीकी मुनीच्या “[[रामायण]]” ह्या म्हाकाव्यांत तो आदर्श पूत, एकपत्नीव्रत, महापराक्रमी, सर्वश्रेश्ठ झुजारी आनी आदर्श राज्य करपी अशें रामाचें वर्णन केलां. नारदान ताचे विशीं वर्णन केलां तें अशें- इक्ष्वाकू कुळांतलो राम हो आदर्श पुरुर्श, सोबीत मुखामळ, विशाल कपल, व्हड दोळे, पुराय कुडीचेर आगळीच कांती आशिल्लो, विध्येत खांपो, राजनितीज्ञ, सज्जनाचो संग्रह आनी दुर्जनाचो निग्रह करपी, धर्म, अर्थ आनी काम ह्या तिनूय पुरुषार्थांचें योग्य तरेन सेवन करपी, संगीत, वाद्य, चित्रकला हातूंत हुशार, प्रजाहितक्षद आनी प्रजननांक प्रिय असों हो राम श्रेश्ठ पुरुश. राजा दशरथाक कौसल्या, सुमित्रा आनी कैकयी अशो तीन राण्यो आशिल्ल्यो. तांकां बरोच तेंप भुरगीं जाली ना. ताणें ऋश्यश्रृंग मुनीवरवीं पुत्रकामेश्ठी यज्ञ केलो. तेन्ना कौसल्येगेर राम, सुमित्रेगेर लक्ष्मण आनी शत्रुध्न आनी कैकेयीगेर भरत अशे चार पूत जाले. सगळे पूत गिऩ्यानी, गुणी आनी हुशार आशिल्ले. राम हो हतयाचेर आनी घोड्याचेर बसपांत आनी रथसंचलन करपांत फिशाल आशिल्लो. तो पंदरा वर्सांचो आसतना आपले यज्ञभुंयेक राक्षसांपसून राखण मेळची देखून विश्र्वमित्र ऋषी ताका घेवन गेलो. थंय ताणें रामाक बला आनी अतिबला ह्यो झूजविद्या शिकयल्यो. तेवेळार रामान ताटका हे राक्षशिणीक जिवेशीं मारली. तशेंच मारीच, सुबाहु आदी राक्षसांक धावंडावन घाले. तेन्ना विश्र्वामित्रान खोशी जावन रामाक दिव्य अस्त्रां दिलीं. उपरांत विश्र्वामित्रान ताका मिथिलेक जनक राजागेर व्हलो. वाटेंत रामान गौतम ऋषिची बायल अहिल्या हिका शापमुक्त केली. मिथिलेक रामान शिवधोणू उबारुन आपलें बळगें दाखयले उपरांत जनकराजान ताचें आनी सीतेचीं लग्न लावन दिलें. जेन्ना दशरथाक रामाचो युवराज्याभिशेक करपाचो थारायलो तेन्ना कैकेयीन रामाक चवदा वर्सां वनवास आनी भरताक युवराज्याभिशेंक अशे दोन वर मागून घेतले. बापायचे आज्ञेक पाळो दिवपाक राम वनवासाक वचूंक भायर सरलो. तेन्ना ताचेवांगडा सीता आनी लक्ष्मणय वनवासाक गेलीं. जेन्ना तीं चित्रकूट पर्वताचेर पावलीं तेन्ना भरत तांकां परत आयोध्येक व्हरपाक आयलो. ताणें रामाक दशरथ मरपाची खबर दिली आनी अयोध्येक परत वचपाक विनयलें.रामान बापायक दिल्लें वचन मोडूंक न्हंयकार दिलो तेन्ना भरतान ताच्यो पादुका अयोध्येक व्हरुन तांचे प्रेरणेन ताणें राजकारभार चलयलो. थंयच्यान राम, लक्ष्मण, सीता अत्री ऋषीच्या आश्रमांत गेलीं. थंय सीतेची आनी तपस्वीनी अनुसूयेचीं भेट जाली. थंयच्यान तीं दंडकारण्यांत गेलीं. थंय तांणी धा वर्सा सारलीं. जायते म्हयने तांणी ऋषींच्या वेगवेगळ्या आश्रमांत वसणूक केली. ह्याच काळांत अगस्त्य ऋषीन रामाक दिव्य धोणू दिलें. पंचवटींत आसतना रामाक जायत्या नरभक्षक राक्षसांचो नाश केलो. रावणाची भयण शुर्पणखेचो तर लक्ष्मणान कान आनी नाक कापून अपमान केलो. ते उपरांत रावणान जेन्ना सीतेक उबारुन व्हेली. तेन्ना रामाक खूब वायट दिसलें. तो लक्ष्मणावांगडा तिचो सोद घेवक लागलो. वाटेर तांका सुग्रीव मेळ्ळे. आनी हनुमान मेऴ्ळे. ताच्यां आदारान ताणें रावणाकडे झुज करुन सीतेची सुटका केली. तरी ताणें सीतेचो स्वीकार करचे आदीं तिका अग्नीपरिक्षा दिवची पडली. राम अयोध्येंत परत येतकच ताचो राज्यभिशेक केलो. कांय दिसांनी लोकोपवादाक लागून ताणें गुरवार सीतेक वाल्मीकी आश्र्मांत सोडली. थंय तिणें लव आनी कूश ह्या दोन जुवळ्या भुरग्यांक जल्म दिलो. थंय वाल्मीकीन तांकां आपणें रचिल्लें महाकाव्य गावपाक शिकयलें. ह्या दोनय कुमारांनी रामाक तें गावन दाखयलें. उपरांत रामान अश्र्वमेध यज्ञ केलो, रामाच्या आदर्श जिणेचो आनी रामायणाचो भारतीय आनी बृहदभारतीय कलासाहित्याचेर खोल छाप उठिल्लो दिसता. बौध्द आनी जैन साहित्याचेर रामकथेचो प्रभाव पडला. बौध्द धर्मात राम हो बोधिसत्तव, जाल्यार जैन धर्मात तो आठवो बलदेव मानून साहित्यनिर्मिती जाल्ली आसा. संस्कृत, प्राकृत आनी प्रदेशीक भासांत रामकथाप्रसंगाचेर जायतीं महाकाव्यां, नाटकां, चंपूकाव्यां आनी खंडकाव्यां बरयल्यांत. रामलिला, सारक्या लोकनाट्याचेर तशेंच लोकगितांतय रामचरित्राचो प्रभाव पडिल्लो दिसून येता. भारताभायर तिबेट, खोतान, जावा, मलाया, सयाम, ब्रह्रादेश, कंबोडिया (ख्मेर) आदी देशांतय रामकथेचो अविश्कार जाल्लो आसा. हाचेभायर नाच, नाटक, चित्रां, शिल्पां, आदी कलांवरवींय रामजिणेंतल्या प्रसंगाचो सोबीत आविश्कार दिसून येता. राजपूत आनी कांग्रा शैलींत रामयणाच्या प्रसंगाची जायती चित्रां आसात. जोधपुर संग्रहालयांतल्या फार्सी रामयणाचें प्रतींत 76 सोबीत चित्रां मेळटात. नामनेचो चित्रकार रविवर्मा हाणेंय रामायणांतल्या कांय प्रसंगांचेर सोबीत चित्रां मेळटात. नामनेचो चित्रकार रविवर्मा हाणेंय रामायणांतल्या कांय प्रसंगांचेर सोबीत चित्रण केल्लें आसा. वेरुळच्या कैलास लेण्यांत, हळेबीठ, हंपी, कुंभकोणम, चंद्रगिरी, देवगढ, ऐहोळे, पहाडपूर (बंगाल), नागार्जुनकोंडा तशेंच राजस्थानांतल्या केंकिदा, किवाडू (जि. बारमेर), खेड (रणछोडराम), देवूळ आदी देवळांतल्यान रामकथेंतल्या वेंचीक प्रसंगांचो कलात्मक आविश्कार दिसून येता. दक्षिण भारतांत रामाच्यो पाशाणमूर्तीपरस धातूमुर्ती जायत्यो मेऴटात. उबो राम व्दिभूज आनी कोंदंडधारी (धोणू) आसा वांगडा सीता, लक्ष्मण, भरत, शत्रुध्न, सीता आनी हनुमान हांच्यो हालींच्या काळांतल्या सोबीत मूर्ती आसात. राम, लक्ष्मण, सीता आनी हनुमान हांच्यो उब्यो कांश्यामूर्ती दक्षिण भारतांत जायत्यो == पळेयात == * [[रामायण]] == संदर्भ == {{Reflist}} {{Wikisource|1=Page:Konkani Vishwakosh - Volume 4 Released.pdf/236|2=राम}} [[वर्ग:प्रसीध, फामाध मंश्यां]] [[वर्ग:तत्वाशास्त्र / Philosophy]] [[वर्ग:धर्म / Religion]] [[वर्ग:देवनागरी पानां]] hx2s9qoxgq589gyoiv8mttyeyv9r2o9 Lisboa 0 9351 217851 199589 2026-10-19T06:34:42Z Kent Wang 12195 Main facade of Basílica da Estrela 57.jpg 217851 wikitext text/x-wiki [[File:Bandeira municipal de Lisboa.png|thumb|right|Flag of Lisboa]] '''Lisboa''' zaun asa [[Portugal]]achi rajdhani ani soglleavon vhoddlem xar. Tem Eropachem 11vem vhoddlem xar zaun asa. Hem Eropache ostonte deger, Atlantik mha-doriak lagon ani Tagus nhoi-xim asa. <br><gallery class=center caption="Lisboa"> Vista de Lisboa.jpg Main facade of Basílica da Estrela 57.jpg Lissabon-São Vicente de Fora-14-Kreuzgang-2011-gje.jpg Lissabon-Elevador de Santa Justa-02-2011-gje.jpg Lissabon-Elevador de Santa Justa-14-Zugang-2011-gje.jpg Lissabon-Castelo de Sao Jorge-38-2011-gje.jpg Lissabon-Praca do Comercio-24-Arco da Rua Augusta-2011-gje.jpg Lissabon-Servejaria Trindade-06-2011-gje.jpg </gallery> [[वर्ग:Sonvsarachim Prosidh/Famadh Xharam, Ganv ani Zage]] [[वर्ग:Romi panam]] tjvme532hu71f11vl8gouaua2f4px84 मिडियाविकी:Gadget-lipiSwitch.js 8 12603 217850 216939 2026-10-19T05:46:34Z The Discoverer 40 updated to make it robust against future classes changes 217850 javascript text/javascript /* Lipi core (creates dropdown + only the switch link) * - Vector/Vector 2022: Add #p-lipi with one item: “Interface-achi lipi bodol” * - Minerva: Insert that switch link directly BELOW the “Settings” item in the hamburger drawer, * with a language-change icon (falls back to Settings icon if needed). * - Anonymous (logged-out): Same link toggles gom ↔ gom-latn using a cookie + uselang redirect, * compatible with Commons AnonymousI18N (if present). Can fully replace it if desired. */ /* global mw, $ */ (function () { "use strict"; // ---------- Guards ---------- if (mw.config.get("wgNamespaceNumber") === 8) return; // MediaWiki namespace var act = mw.config.get("wgAction"); if (act === "edit" || act === "history") return; var conf = mw.config.get([ "wgAction", "wgIsArticle", "wgUserLanguage", "wgContentLanguage", "skin" ]); if (conf.wgAction !== "view" || !conf.wgIsArticle) return; var skin = conf.skin; // 'vector-2022','vector','minerva',... var isAnon = mw.user && typeof mw.user.isAnon === 'function' ? mw.user.isAnon() : true; // ---------- Lang helpers ---------- function nextLang() { var curr = (conf.wgUserLanguage || "").toLowerCase(); if (curr === "gom-latn") return "gom"; // Romi → Devanagari if (curr === "gom" || curr === "gom-deva") return "gom-latn"; // Devanagari → Romi return "gom-latn"; } function reloadWith(q) { location.href = mw.util.getUrl(mw.config.get("wgPageName"), q); } // Anonymous language cookie (compatible with Commons) var ANON_COOKIE = 'AnonymousI18N_lang'; var ANON_EXPIRY_DAYS = 10; function setAnonLangCookie(lang) { mw.cookie.set(ANON_COOKIE, lang, { expires: ANON_EXPIRY_DAYS, path: '/' }); } function getAnonLangCookie() { return mw.cookie.get(ANON_COOKIE); } function urlWithUselang(url, lang) { // Strip hash for manipulation, then restore var hash = ''; var iHash = url.indexOf('#'); if (iHash !== -1) { hash = url.slice(iHash); url = url.slice(0, iHash); } var hasQuery = url.indexOf('?') !== -1; var re = /([?&])uselang=[^&]*/; if (re.test(url)) { url = url.replace(re, '$1uselang=' + encodeURIComponent(lang)); } else { url = url + (hasQuery ? '&' : '?') + 'uselang=' + encodeURIComponent(lang); } return url + hash; } function redirectToUselang(lang) { var curr = location.href; var target = urlWithUselang(curr, lang); if (target !== curr) location.href = target; } // Keep uselang on internal link clicks (only when AnonymousI18N is not present) function installAnonUselangPropagation(lang) { if (!lang) return; if (window.AnonymousI18N) return; // Let Commons script handle propagation if present $(document).on('click', 'a[href]', function (e) { var a = this; var hrefAttr = a.getAttribute('href') || ''; // Ignore anchors, buttons, JS links if (!hrefAttr || hrefAttr.charAt(0) === '#' || a.getAttribute('role') === 'button') return; // Full URL for domain checks var hrefFull = a.href; // Only adjust Wikimedia links / same-origin; skip external or special “set” actions if (hrefFull.indexOf('.wik') !== -1 && hrefFull.indexOf('.org') !== -1) { // allow ctrl/cmd new tabs if (e.ctrlKey || e.metaKey) return; e.preventDefault(); location.href = urlWithUselang(hrefFull, lang); } }); // For forms, append hidden input and adjust action on submit (basic parity with AnonymousI18N) $(document).on('submit', 'form', function () { var $form = $(this); if (!$form.find('input[name="uselang"]').length) { $('<input type="hidden" name="uselang">').val(lang).appendTo($form); } var action = $form.attr('action'); if (action) { $form.attr('action', urlWithUselang(action, lang)); } }); } // On page load, if anon user has our cookie but the URL lacks that uselang, redirect once. function enforceAnonUselangOnLoad() { if (!isAnon) return; var lang = getAnonLangCookie(); if (!lang) return; // If current request language already matches cookie at base (aa vs aa-bb), avoid churn var currBase = (conf.wgUserLanguage || '').split('-')[0]; var cookieBase = lang.split('-')[0]; if (currBase === cookieBase) return; // already effectively in that language redirectToUselang(lang); } // ---------- UI language persistence ---------- function persistUiLang() { var next = nextLang(); if (!isAnon) { // Logged-in: Permanent via Action API → fallback to ?setlang=… (ULS confirm) return new mw.Api().postWithToken('csrf', { action: 'options', change: 'language=' + next }).then(function () { reloadWith({}); }).catch(function () { reloadWith({ setlang: next }); }); } // Anonymous: set cookie and redirect using uselang setAnonLangCookie(next); // If Commons AnonymousI18N already loaded, use its redirect helper for smoothness. if (window.AnonymousI18N && typeof window.AnonymousI18N.redirectCurrentPageToLanguage === 'function') { window.AnonymousI18N.redirectCurrentPageToLanguage(next); return; } // Otherwise: do it ourselves redirectToUselang(next); } // ---------- Minerva (mobile) ---------- if (skin === "minerva") { $.when( mw.loader.using(['mediawiki.util','mediawiki.api','mediawiki.cookie','mediawiki.user']), $.ready ).then(function () { // Place BELOW the Settings item in the drawer function injectBelowSettings() { var drawer = document.querySelector('#mw-mf-page-left'); if (!drawer) return false; // Find the Settings anchor and its <li> var settingsA = drawer.querySelector('a.menu__item--settings'); if (!settingsA) return false; var settingsLi = settingsA.closest('li'); if (!settingsLi || !settingsLi.parentNode) return false; // Avoid duplicates if (document.getElementById('lipi-minerva-switch')) return true; // Determine list and classes var list = settingsLi.parentNode; var liClass = settingsLi.className || 'toggle-list-item'; var aClass = settingsA.className || 'toggle-list-item__anchor'; // Build <li> var li = document.createElement('li'); li.className = liClass; // Build <a> – keep Minerva anchor class; swap settings modifier to "language" if present var a = document.createElement('a'); a.id = 'lipi-minerva-switch'; a.href = '#'; // Try to replace 'menu__item--settings' by 'menu__item--language' (harmless if absent) var aClassOut = aClass.replace(/\bmenu__item--settings\b/, 'menu__item--language'); // Ensure base anchor class is present if (aClassOut.indexOf('toggle-list-item__anchor') === -1) { aClassOut = 'toggle-list-item__anchor ' + aClassOut; } a.className = aClassOut; // ICON: Prefer a language-related icon; fallback to cloning Settings icon var iconLang = drawer.querySelector('.minerva-icon--language, .minerva-icon--translate, .minerva-icon--uls'); var icon; if (iconLang) { icon = iconLang.cloneNode(true); } else { // Construct a language icon span (if theme supports it), else clone settings icon icon = document.createElement('span'); icon.className = 'minerva-icon minerva-icon--language'; var iconSettings = settingsA.querySelector('.minerva-icon'); if (iconSettings && !iconLang) { // As a fallback, clone Settings icon to preserve spacing icon = iconSettings.cloneNode(true); } } if (icon) a.appendChild(icon); // LABEL var label = document.createElement('span'); label.className = 'toggle-list-item__label'; label.textContent = 'Interface-achi lipi bodol'; a.appendChild(label); // Click → persist UI language preference a.addEventListener('click', function (e) { e.preventDefault(); persistUiLang(); }); li.appendChild(a); // Insert AFTER Settings if (settingsLi.nextSibling) { list.insertBefore(li, settingsLi.nextSibling); } else { list.appendChild(li); } return true; } // Try drawer first, fallback to p-preferences if drawer missing if (!injectBelowSettings()) { var prefLink = mw.util.addPortletLink('p-preferences', '#', 'Interface-achi lipi bodol', 'lipi-minerva-switch'); if (prefLink) { prefLink.addEventListener('click', function (e) { e.preventDefault(); persistUiLang(); }); } else { // As a last resort, observe until drawer loads var obs = new MutationObserver(function () { if (injectBelowSettings()) obs.disconnect(); }); obs.observe(document.documentElement, { childList: true, subtree: true }); } } // Anonymous: enforce uselang on load and install propagation if needed if (isAnon) { var anonLang = getAnonLangCookie(); if (anonLang) { // Don’t fight Commons if it’s already handling it if (!window.AnonymousI18N) { installAnonUselangPropagation(anonLang); // If current UI language is not effectively the anon cookie, redirect once var currBase = (conf.wgUserLanguage || '').split('-')[0]; if (currBase !== anonLang.split('-')[0]) { // Defer to let Minerva settle; then redirect setTimeout(function () { redirectToUselang(anonLang); }, 0); } } } } }); return; // Minerva done } // ---------- Desktop (Vector / Vector‑2022) ---------- function isVectorLike() { return skin === "vector" || skin === "vector-2022"; } if (!isVectorLike()) return; function createDropdownWithSwitchOnly() { var anchor = '#p-cactions'; if (!document.querySelector(anchor)) { anchor = '#p-variants'; if (!document.querySelector(anchor)) { // Ultimate fallback: single link in p-views var single = mw.util.addPortletLink('p-views', '#', 'Lipi', 'ca-lipi'); if (single) single.addEventListener('click', function (e) { e.preventDefault(); persistUiLang(); }); return { placedAt: '#p-views', portlet: null }; } } // Stable ID for the Lipi portlet var portlet = mw.util.addPortlet('p-lipi', 'Lipi', anchor); if (!portlet) { return { placedAt: anchor, portlet: null }; } // Mark for other gadgets / debugging portlet.setAttribute('data-lipi-core', '1'); // Make it a Vector dropdown portlet.classList.add( 'vector-menu-dropdown', 'vector-menu-dropdown-noicon' ); /* * Vector 2022 now styles native dropdown labels using Codex button classes. * Custom portlets created with mw.util.addPortlet() do not automatically * inherit those classes, resulting in tighter spacing around the "Lipi" * label. Copy the classes from the built-in Variants dropdown so that * Lipi always matches the current Vector 2022 appearance. */ var lipiLabel = document.getElementById('p-lipi-dropdown-label'); var variantsLabel = document.getElementById('vector-variants-dropdown-label'); if (lipiLabel) { if (variantsLabel) { // Preferred: inherit native Vector styling lipiLabel.className = variantsLabel.className; } else { // Fallback for unusual skins or future Vector changes lipiLabel.classList.add( 'cdx-button', 'cdx-button--fake-button', 'cdx-button--fake-button--enabled', 'cdx-button--weight-quiet' ); } } // Add the only item: switch UI language var a = mw.util.addPortletLink( 'p-lipi', '#', 'Interface-achi lipi bodol', 'ca-lipi-switch' ); if (a) { a.addEventListener('click', function (e) { e.preventDefault(); persistUiLang(); }); } return { placedAt: anchor, portlet: portlet }; } $.when(mw.loader.using([ 'mediawiki.util', 'mediawiki.api', 'mediawiki.cookie', 'mediawiki.user' ]), $.ready).then(function () { var res = createDropdownWithSwitchOnly(); // Anonymous: if cookie exists and Commons helper is not present, ensure propagation if (isAnon) { var anonLang = getAnonLangCookie(); if (anonLang && !window.AnonymousI18N) { installAnonUselangPropagation(anonLang); // If current UI language doesn’t match anon cookie, redirect once var currBase = (conf.wgUserLanguage || '').split('-')[0]; if (currBase !== anonLang.split('-')[0]) { setTimeout(function () { redirectToUselang(anonLang); }, 0); } } } }); })(); dx8xe72u6p4fushqixovdoyldazd0jj 217852 217850 2026-10-19T06:52:40Z The Discoverer 40 dropping inheritance from the variants class because it is causing inconsistent behaviour because of a css loading race 217852 javascript text/javascript /* Lipi core (creates dropdown + only the switch link) * - Vector/Vector 2022: Add #p-lipi with one item: “Interface-achi lipi bodol” * - Minerva: Insert that switch link directly BELOW the “Settings” item in the hamburger drawer, * with a language-change icon (falls back to Settings icon if needed). * - Anonymous (logged-out): Same link toggles gom ↔ gom-latn using a cookie + uselang redirect, * compatible with Commons AnonymousI18N (if present). Can fully replace it if desired. */ /* global mw, $ */ (function () { "use strict"; // ---------- Guards ---------- if (mw.config.get("wgNamespaceNumber") === 8) return; // MediaWiki namespace var act = mw.config.get("wgAction"); if (act === "edit" || act === "history") return; var conf = mw.config.get([ "wgAction", "wgIsArticle", "wgUserLanguage", "wgContentLanguage", "skin" ]); if (conf.wgAction !== "view" || !conf.wgIsArticle) return; var skin = conf.skin; // 'vector-2022','vector','minerva',... var isAnon = mw.user && typeof mw.user.isAnon === 'function' ? mw.user.isAnon() : true; // ---------- Lang helpers ---------- function nextLang() { var curr = (conf.wgUserLanguage || "").toLowerCase(); if (curr === "gom-latn") return "gom"; // Romi → Devanagari if (curr === "gom" || curr === "gom-deva") return "gom-latn"; // Devanagari → Romi return "gom-latn"; } function reloadWith(q) { location.href = mw.util.getUrl(mw.config.get("wgPageName"), q); } // Anonymous language cookie (compatible with Commons) var ANON_COOKIE = 'AnonymousI18N_lang'; var ANON_EXPIRY_DAYS = 10; function setAnonLangCookie(lang) { mw.cookie.set(ANON_COOKIE, lang, { expires: ANON_EXPIRY_DAYS, path: '/' }); } function getAnonLangCookie() { return mw.cookie.get(ANON_COOKIE); } function urlWithUselang(url, lang) { // Strip hash for manipulation, then restore var hash = ''; var iHash = url.indexOf('#'); if (iHash !== -1) { hash = url.slice(iHash); url = url.slice(0, iHash); } var hasQuery = url.indexOf('?') !== -1; var re = /([?&])uselang=[^&]*/; if (re.test(url)) { url = url.replace(re, '$1uselang=' + encodeURIComponent(lang)); } else { url = url + (hasQuery ? '&' : '?') + 'uselang=' + encodeURIComponent(lang); } return url + hash; } function redirectToUselang(lang) { var curr = location.href; var target = urlWithUselang(curr, lang); if (target !== curr) location.href = target; } // Keep uselang on internal link clicks (only when AnonymousI18N is not present) function installAnonUselangPropagation(lang) { if (!lang) return; if (window.AnonymousI18N) return; // Let Commons script handle propagation if present $(document).on('click', 'a[href]', function (e) { var a = this; var hrefAttr = a.getAttribute('href') || ''; // Ignore anchors, buttons, JS links if (!hrefAttr || hrefAttr.charAt(0) === '#' || a.getAttribute('role') === 'button') return; // Full URL for domain checks var hrefFull = a.href; // Only adjust Wikimedia links / same-origin; skip external or special “set” actions if (hrefFull.indexOf('.wik') !== -1 && hrefFull.indexOf('.org') !== -1) { // allow ctrl/cmd new tabs if (e.ctrlKey || e.metaKey) return; e.preventDefault(); location.href = urlWithUselang(hrefFull, lang); } }); // For forms, append hidden input and adjust action on submit (basic parity with AnonymousI18N) $(document).on('submit', 'form', function () { var $form = $(this); if (!$form.find('input[name="uselang"]').length) { $('<input type="hidden" name="uselang">').val(lang).appendTo($form); } var action = $form.attr('action'); if (action) { $form.attr('action', urlWithUselang(action, lang)); } }); } // On page load, if anon user has our cookie but the URL lacks that uselang, redirect once. function enforceAnonUselangOnLoad() { if (!isAnon) return; var lang = getAnonLangCookie(); if (!lang) return; // If current request language already matches cookie at base (aa vs aa-bb), avoid churn var currBase = (conf.wgUserLanguage || '').split('-')[0]; var cookieBase = lang.split('-')[0]; if (currBase === cookieBase) return; // already effectively in that language redirectToUselang(lang); } // ---------- UI language persistence ---------- function persistUiLang() { var next = nextLang(); if (!isAnon) { // Logged-in: Permanent via Action API → fallback to ?setlang=… (ULS confirm) return new mw.Api().postWithToken('csrf', { action: 'options', change: 'language=' + next }).then(function () { reloadWith({}); }).catch(function () { reloadWith({ setlang: next }); }); } // Anonymous: set cookie and redirect using uselang setAnonLangCookie(next); // If Commons AnonymousI18N already loaded, use its redirect helper for smoothness. if (window.AnonymousI18N && typeof window.AnonymousI18N.redirectCurrentPageToLanguage === 'function') { window.AnonymousI18N.redirectCurrentPageToLanguage(next); return; } // Otherwise: do it ourselves redirectToUselang(next); } // ---------- Minerva (mobile) ---------- if (skin === "minerva") { $.when( mw.loader.using(['mediawiki.util','mediawiki.api','mediawiki.cookie','mediawiki.user']), $.ready ).then(function () { // Place BELOW the Settings item in the drawer function injectBelowSettings() { var drawer = document.querySelector('#mw-mf-page-left'); if (!drawer) return false; // Find the Settings anchor and its <li> var settingsA = drawer.querySelector('a.menu__item--settings'); if (!settingsA) return false; var settingsLi = settingsA.closest('li'); if (!settingsLi || !settingsLi.parentNode) return false; // Avoid duplicates if (document.getElementById('lipi-minerva-switch')) return true; // Determine list and classes var list = settingsLi.parentNode; var liClass = settingsLi.className || 'toggle-list-item'; var aClass = settingsA.className || 'toggle-list-item__anchor'; // Build <li> var li = document.createElement('li'); li.className = liClass; // Build <a> – keep Minerva anchor class; swap settings modifier to "language" if present var a = document.createElement('a'); a.id = 'lipi-minerva-switch'; a.href = '#'; // Try to replace 'menu__item--settings' by 'menu__item--language' (harmless if absent) var aClassOut = aClass.replace(/\bmenu__item--settings\b/, 'menu__item--language'); // Ensure base anchor class is present if (aClassOut.indexOf('toggle-list-item__anchor') === -1) { aClassOut = 'toggle-list-item__anchor ' + aClassOut; } a.className = aClassOut; // ICON: Prefer a language-related icon; fallback to cloning Settings icon var iconLang = drawer.querySelector('.minerva-icon--language, .minerva-icon--translate, .minerva-icon--uls'); var icon; if (iconLang) { icon = iconLang.cloneNode(true); } else { // Construct a language icon span (if theme supports it), else clone settings icon icon = document.createElement('span'); icon.className = 'minerva-icon minerva-icon--language'; var iconSettings = settingsA.querySelector('.minerva-icon'); if (iconSettings && !iconLang) { // As a fallback, clone Settings icon to preserve spacing icon = iconSettings.cloneNode(true); } } if (icon) a.appendChild(icon); // LABEL var label = document.createElement('span'); label.className = 'toggle-list-item__label'; label.textContent = 'Interface-achi lipi bodol'; a.appendChild(label); // Click → persist UI language preference a.addEventListener('click', function (e) { e.preventDefault(); persistUiLang(); }); li.appendChild(a); // Insert AFTER Settings if (settingsLi.nextSibling) { list.insertBefore(li, settingsLi.nextSibling); } else { list.appendChild(li); } return true; } // Try drawer first, fallback to p-preferences if drawer missing if (!injectBelowSettings()) { var prefLink = mw.util.addPortletLink('p-preferences', '#', 'Interface-achi lipi bodol', 'lipi-minerva-switch'); if (prefLink) { prefLink.addEventListener('click', function (e) { e.preventDefault(); persistUiLang(); }); } else { // As a last resort, observe until drawer loads var obs = new MutationObserver(function () { if (injectBelowSettings()) obs.disconnect(); }); obs.observe(document.documentElement, { childList: true, subtree: true }); } } // Anonymous: enforce uselang on load and install propagation if needed if (isAnon) { var anonLang = getAnonLangCookie(); if (anonLang) { // Don’t fight Commons if it’s already handling it if (!window.AnonymousI18N) { installAnonUselangPropagation(anonLang); // If current UI language is not effectively the anon cookie, redirect once var currBase = (conf.wgUserLanguage || '').split('-')[0]; if (currBase !== anonLang.split('-')[0]) { // Defer to let Minerva settle; then redirect setTimeout(function () { redirectToUselang(anonLang); }, 0); } } } } }); return; // Minerva done } // ---------- Desktop (Vector / Vector‑2022) ---------- function isVectorLike() { return skin === "vector" || skin === "vector-2022"; } if (!isVectorLike()) return; function createDropdownWithSwitchOnly() { var anchor = '#p-cactions'; if (!document.querySelector(anchor)) { anchor = '#p-variants'; if (!document.querySelector(anchor)) { // Ultimate fallback: single link in p-views var single = mw.util.addPortletLink('p-views', '#', 'Lipi', 'ca-lipi'); if (single) single.addEventListener('click', function (e) { e.preventDefault(); persistUiLang(); }); return { placedAt: '#p-views', portlet: null }; } } // Stable ID for the Lipi portlet var portlet = mw.util.addPortlet('p-lipi', 'Lipi', anchor); if (!portlet) { return { placedAt: anchor, portlet: null }; } // Mark for other gadgets / debugging portlet.setAttribute('data-lipi-core', '1'); // Make it a Vector dropdown portlet.classList.add( 'vector-menu-dropdown', 'vector-menu-dropdown-noicon' ); /* * Vector 2022 uses Codex button styling on native dropdown labels. * Custom portlets created via mw.util.addPortlet() do not automatically * receive those classes, resulting in tighter spacing around "Lipi". * * Add the required Codex classes directly so the appearance remains * consistent regardless of load order or future skin changes. */ var lipiLabel = document.getElementById('p-lipi-dropdown-label'); if (lipiLabel) { lipiLabel.classList.add( 'cdx-button', 'cdx-button--fake-button', 'cdx-button--fake-button--enabled', 'cdx-button--weight-quiet' ); } // Add the only item: switch UI language var a = mw.util.addPortletLink( 'p-lipi', '#', 'Interface-achi lipi bodol', 'ca-lipi-switch' ); if (a) { a.addEventListener('click', function (e) { e.preventDefault(); persistUiLang(); }); } return { placedAt: anchor, portlet: portlet }; } $.when(mw.loader.using([ 'mediawiki.util', 'mediawiki.api', 'mediawiki.cookie', 'mediawiki.user' ]), $.ready).then(function () { var res = createDropdownWithSwitchOnly(); // Anonymous: if cookie exists and Commons helper is not present, ensure propagation if (isAnon) { var anonLang = getAnonLangCookie(); if (anonLang && !window.AnonymousI18N) { installAnonUselangPropagation(anonLang); // If current UI language doesn’t match anon cookie, redirect once var currBase = (conf.wgUserLanguage || '').split('-')[0]; if (currBase !== anonLang.split('-')[0]) { setTimeout(function () { redirectToUselang(anonLang); }, 0); } } } }); })(); 3204pkwxpxwoh6rnsb6ezzhbyzgfwks मिडियाविकी:Gadget-lipiLinksMove.js 8 12604 217849 216943 2026-10-19T04:19:15Z The Discoverer 40 prevent the label from wrapping 217849 javascript text/javascript /* Lipi enhancer (Vector-only) * - If #p-lipi exists and Template:Lipi wrapper (.gom-lipi-tabs) exists, * inject its links ABOVE the switch link in the dropdown, then hide inline. * - If #p-lipi does NOT exist, do nothing (and do NOT hide inline). */ /* global mw, $ */ (function () { "use strict"; // ---------- Guards ---------- if (mw.config.get("wgNamespaceNumber") === 8) return; // MediaWiki namespace var act = mw.config.get("wgAction"); if (act === "edit" || act === "history") return; var conf = mw.config.get([ "wgAction", "wgIsArticle" ]); if (conf.wgAction !== "view" || !conf.wgIsArticle) return; var skin = mw.config.get("skin"); function isVectorLike() { return skin === "vector" || skin === "vector-2022"; } if (!isVectorLike()) return; // ---------- Lipi dropdown layout ---------- // Prevent the Lipi portlet from shrinking and prevent its label // from wrapping. The bullet itself is added only after successful // Lipi injection below. mw.util.addCSS(` #p-lipi { flex-shrink: 0; } .gom-lipi-enhanced { white-space: nowrap; } .gom-lipi-enhanced::before { content: "•"; margin-right: 0.25em; } `); // ---------- Helpers ---------- function findLipiWrapper($content) { return $content.find('.gom-lipi-tabs').first(); // STRICT } function harvestLinks($box) { var out = []; $box.find('a').each(function () { var href = $(this).attr('href'); if (!href) return; var label = $(this).text().replace(/\s+/g, ' ').trim(); if (label) out.push({ label: label, href: href }); }); return out; } function waitForPortletAndInject(links, $wrap) { var tried = 0, MAX_TRIES = 80; // ~8s at 100ms intervals var interval = setInterval(function () { tried++; var portlet = document.getElementById('p-lipi'); if (portlet) { clearInterval(interval); injectIntoPortlet(portlet, links, $wrap); } else if (tried >= MAX_TRIES) { clearInterval(interval); // No portlet → do nothing & do not hide inline } }, 100); } function injectIntoPortlet(portlet, links, $wrap) { if (!links.length) return; // Avoid double-injection if (portlet.getAttribute('data-lipi-links-injected') === '1') return; portlet.setAttribute('data-lipi-links-injected', '1'); var switchLi = document.getElementById('ca-lipi-switch'); var $switchLi = $(switchLi).closest('li'); var parentList = $switchLi.length ? $switchLi[0].parentNode : (portlet.querySelector('ul') || portlet); // Insert harvested links BEFORE the switch link, in FORWARD order (A,B,C, then switch) for (var i = 0; i < links.length; i++) { var li = mw.util.addPortletLink('p-lipi', links[i].href, links[i].label); if (li && $switchLi.length && parentList) { parentList.insertBefore(li, $switchLi[0]); // move before switch } } // Hide the inline strip ONLY because we successfully injected if ($wrap && $wrap.length) { $wrap.addClass('gom-lipi-hide'); mw.util.addCSS('.gom-lipi-hide{display:none!important}'); } // Simple indicator: make the visible Lipi label bold and // add the bullet through CSS, only after successful injection. (function () { var label = document.getElementById('p-lipi-dropdown-label') || // Vector-2022 document.querySelector('label.vector-dropdown-label[for="p-lipi-dropdown-checkbox"]') || // Fallback V22 document.getElementById('p-lipi-label'); // Classic Vector if (label) { // Bold label.style.fontWeight = 'bold'; // Mark as enhanced; CSS supplies the bullet and nowrap. label.classList.add('gom-lipi-enhanced'); } })(); } // ---------- Boot ---------- $.when(mw.loader.using('mediawiki.util'), $.ready).then(function () { var $content = mw.util.$content || $('#mw-content-text'); // STRICT harvest only when wrapper exists var $wrap = findLipiWrapper($content); if (!$wrap.length) return; var harvested = harvestLinks($wrap); if (!harvested.length) return; // Wait for the Lipi dropdown from Gadget lipiSwitch; if it never appears, do nothing waitForPortletAndInject(harvested, $wrap); }); })(); l9majktpj9dyw0cww4ppk5u5eixd5on