মিডিয়াউইকি:Gadget-twinklewarn.js

লক্ষ্য করুন: প্রকাশ করার পর, পরিবর্তনগুলো দেখতে আপনাকে আপনার ব্রাউজারের ক্যাশে পরিষ্কার করার প্রয়োজন হতে পারে।

  • ফায়ারফক্স / সাফারি: পুনরায় লোড-এ ক্লিক করার সময় শিফট টিপে ধরে রাখুন, অথবা হয় Ctrl-F5 বা Ctrl-R টিপুন (ম্যাকে ⌘-R টিপুন)
  • গুগল ক্রোম: Ctrl-Shift-R (ম্যাকে ⌘-Shift-R) টিপুন
  • ইন্টারনেট এক্সপ্লোরার / এজ: Ctrl ধরে রাখা অবস্থায় Refresh-এ ক্লিক করুন, অথবা Ctrl-F5 টিপুন
  • অপেরা: Ctrl-F5 টিপুন।
// <nowiki>
  /*
     ****************************************
     *** twinklewarn.js: সতর্কবার্তা মডিউল
     ****************************************
     * Mode of invocation:     Tab ("সতর্কবার্তা")
     * Active on:              Any page with relevant user name (userspace, contribs,
     *                         etc.) (not IP ranges), as well as the rollback success page
     
     *caution কে ‘দ্বিতীয় স্তরের সতর্কতা’ এবং warning কে ‘তৃতীয় স্তরের সতর্কতা’ অনুবাদ করা হয়েছে। --Yahya
    *[[টেমপ্লেট:বাংলায় সম্পাদনা সারাংশ দিন (টুইংকল)]] একক সমস্যার বার্তা অংশে যুক্ত করা হলো --MdsShakil
     */
     
    (function ($) {

      Twinkle.warn = function twinklewarn() {
        // Users and IPs but not IP ranges
        if (
          mw.config.exists("wgRelevantUserName") &&
          !Morebits.ip.isRange(mw.config.get("wgRelevantUserName"))
        ) {
          Twinkle.addPortletLink(
            Twinkle.warn.callback,
            "সতর্ক করুন",
            "tw-warn",
            "সতর্ক করুন/ব্যবহারকারীকে অবহিত করুন"
          );
          if (
            Twinkle.getPref("autoMenuAfterRollback") &&
            mw.config.get("wgNamespaceNumber") === 3 &&
            mw.util.getParamValue("vanarticle") &&
            !mw.util.getParamValue("friendlywelcome") &&
            !mw.util.getParamValue("noautowarn")
          ) {
            Twinkle.warn.callback();
          }
        }
    
        // Modify URL of talk page on rollback success pages, makes use of a
        // custom message box in [[MediaWiki:Rollback-success]]
        if (mw.config.get("wgAction") === "rollback") {
          var $vandalTalkLink = $("#mw-rollback-success")
            .find(".mw-usertoollinks a")
            .first();
          if ($vandalTalkLink.length) {
            $vandalTalkLink.css("font-weight", "bold");
            $vandalTalkLink.wrapInner(
              $("<span/>").attr(
                "title",
                "উপযুক্ত হলে, আপনি এই পৃষ্ঠায় ব্যবহারকারীদের তাদের সম্পাদনা সম্পর্কে সতর্ক করতে টুইঙ্কল ব্যবহার করতে পারেন।"
              )
            );
    
            // Can't provide vanarticlerevid as only wgCurRevisionId is provided
            var extraParam =
              "vanarticle=" + mw.util.rawurlencode(Morebits.pageNameNorm);
            var href = $vandalTalkLink.attr("href");
            if (href.indexOf("?") === -1) {
              $vandalTalkLink.attr("href", href + "?" + extraParam);
            } else {
              $vandalTalkLink.attr("href", href + "&" + extraParam);
            }
          }
        }
      };
    
      // Used to close window when switching to ARV in autolevel
      Twinkle.warn.dialog = null;
    
      Twinkle.warn.callback = function twinklewarnCallback() {
        if (
          mw.config.get("wgRelevantUserName") === mw.config.get("wgUserName") &&
          !confirm(
            "আপনি নিজেকে সতর্ক করতে চলেছেন! আপনি কি নিশ্চিত আপনি এটাই করতে চান?"
          )
        ) {
          return;
        }
    
        var dialog;
        Twinkle.warn.dialog = new Morebits.simpleWindow(600, 440);
        dialog = Twinkle.warn.dialog;
        dialog.setTitle("সতর্ক করুন/ব্যবহারকারীকে অবহিত করুন");
        dialog.setScriptName("টুইংকল");
        dialog.addFooterLink("একটি সতর্কতা স্তর নির্বাচন করা", "WP:UWUL#Levels");
        dialog.addFooterLink("সতর্কতার পছন্দসমূহ", "WP:TW/PREF#warn");
        dialog.addFooterLink("টুইংকল সাহায্য", "WP:TW/DOC#warn");
        dialog.addFooterLink("প্রতিক্রিয়া জানান", "WT:TW");
    
        var form = new Morebits.quickForm(Twinkle.warn.callback.evaluate);
        var main_select = form.append({
          type: "field",
          label: "প্রদান করার জন্য সতর্কতার ধরন/বিজ্ঞপ্তি বেছে নিন",
          tooltip:
            "প্রথমে একটি প্রধান সতর্কতা গ্রুপ নির্বাচন করুন, তারপরে প্রদান করার জন্য একটি নির্দিষ্ট সতর্কতা বাছাই করুন।",
        });
    
        var main_group = main_select.append({
          type: "select",
          name: "main_group",
          tooltip:
            "আপনি আপনার টুইঙ্কল পছন্দগুলিতে ডিফল্ট নির্বাচনটি কাস্টমাইজ করতে পারেন",
          event: Twinkle.warn.callback.change_category,
        });
    
        var defaultGroup = parseInt(Twinkle.getPref("defaultWarningGroup"), 10);
        main_group.append({
          type: "option",
          label: "স্বয়ংক্রিয় স্তর নির্বাচন (১-৪)",
          value: "autolevel",
          selected: defaultGroup === 11,
        });
        main_group.append({
          type: "option",
          label: "১: সাধারণ বিজ্ঞপ্তি",
          value: "level1",
          selected: defaultGroup === 1,
        });
        main_group.append({
          type: "option",
          label: "২: দ্বিতীয় স্তরের সতর্কবার্তা",
          value: "level2",
          selected: defaultGroup === 2,
        });
        main_group.append({
          type: "option",
          label: "৩: তৃতীয় স্তরের সতর্কবার্তা",
          value: "level3",
          selected: defaultGroup === 3,
        });
        main_group.append({
          type: "option",
          label: "৪: সর্বশেষ সতর্কবার্তা",
          value: "level4",
          selected: defaultGroup === 4,
        });
        main_group.append({
          type: "option",
          label: "4im: একমাত্র সতর্কবার্তা",
          value: "level4im",
          selected: defaultGroup === 5,
        });
        if (Twinkle.getPref("combinedSingletMenus")) {
          main_group.append({
            type: "option",
            label: "একক সমস্যার বার্তা",
            value: "singlecombined",
            selected: defaultGroup === 6 || defaultGroup === 7,
          });
        } else {
          main_group.append({
            type: "option",
            label: "একক সমস্যার বার্তা",
            value: "singlenotice",
            selected: defaultGroup === 6,
          });
          main_group.append({
            type: "option",
            label: "একক সমস্যার সতর্কবার্তা",
            value: "singlewarn",
            selected: defaultGroup === 7,
          });
        }
        if (Twinkle.getPref("customWarningList").length) {
          main_group.append({
            type: "option",
            label: "স্বনির্ধারিত সতর্কবার্তা",
            value: "custom",
            selected: defaultGroup === 9,
          });
        }
        main_group.append({
          type: "option",
          label: "সকল সতর্কবার্তা টেমপ্লেট",
          value: "kitchensink",
          selected: defaultGroup === 10,
        });
    
        main_select.append({
          type: "select",
          name: "sub_group",
          event: Twinkle.warn.callback.change_subcategory,
        }); // Will be empty to begin with.
    
        form.append({
          type: "input",
          name: "article",
          label: "সংযুক্ত পাতা",
          value: mw.util.getParamValue("vanarticle") || "",
          tooltip:
            "একটি পাতা বিজ্ঞপ্তির সাথে সংযুক্ত করা যেতে পারে, কারণ সম্ভবত আপনি উল্লিখিত পাতায় সম্পাদনা পুনর্বহাল করেছিলেন যে কারণে এই বিজ্ঞপ্তিটি পাঠাচ্ছেন।  কোন পৃষ্ঠা সংযুক্ত না করতে এটি খালি রাখুন।",
        });
    
        form.append({
          type: "div",
          label: "",
          style: "color: red",
          id: "twinkle-warn-warning-messages",
        });
    
        var more = form.append({
          type: "field",
          name: "reasonGroup",
          label: "সতর্কীকরণ তথ্য",
        });
        more.append({
          type: "textarea",
          label: "ঐচ্ছিক বার্তা:",
          name: "reason",
          tooltip:
            "সম্ভবত একটি কারণ, অথবা আরো বিস্তারিত বিজ্ঞপ্তি সংযুক্ত করা আবশ্যক",
        });
    
        var previewlink = document.createElement("a");
        $(previewlink).click(function () {
          Twinkle.warn.callbacks.preview(result); // |result| is defined below
        });
        previewlink.style.cursor = "pointer";
        previewlink.textContent = "প্রাকদর্শন";
        more.append({ type: "div", id: "warningpreview", label: [previewlink] });
        more.append({
          type: "div",
          id: "twinklewarn-previewbox",
          style: "display: none",
        });
    
        more.append({ type: "submit", label: "জমা দিন" });
    
        var result = form.render();
        dialog.setContent(result);
        dialog.display();
        result.main_group.root = result;
        result.previewer = new Morebits.wiki.preview(
          $(result).find("div#twinklewarn-previewbox").last()[0]
        );
    
        // Potential notices for staleness and missed reverts
        var vanrevid = mw.util.getParamValue("vanarticlerevid");
        if (vanrevid) {
          var message = "";
          var query = {};
    
          // If you tried reverting, check if *you* actually reverted
          if (
            !mw.util.getParamValue("noautowarn") &&
            mw.util.getParamValue("vanarticle")
          ) {
            // Via fluff link
            query = {
              action: "query",
              titles: mw.util.getParamValue("vanarticle"),
              prop: "revisions",
              rvstartid: vanrevid,
              rvlimit: 2,
              rvdir: "newer",
              rvprop: "user",
              format: "json",
            };
    
            new Morebits.wiki.api(
              "আপনি পাতাটি সফলভাবে সম্পাদনা পুনর্বহাল করেছেন কিনা তা পরীক্ষা করা হচ্ছে",
              query,
              function (apiobj) {
                var rev = apiobj.getResponse().query.pages[0].revisions;
                var revertUser = rev && rev[1].user;
                if (revertUser && revertUser !== mw.config.get("wgUserName")) {
                  message +=
                    " অন্য কেউ পাতাটিতে পুনর্বহাল করেছেন এবং ইতিমধ্যেই ব্যবহারকারীকে সতর্ক করেছে।";
                  $("#twinkle-warn-warning-messages").text("বিজ্ঞপ্তি:" + message);
                }
              }
            ).post();
          }
    
          // Confirm edit wasn't too old for a warning
          var checkStale = function (vantimestamp) {
            var revDate = new Morebits.date(vantimestamp);
            if (vantimestamp && revDate.isValid()) {
              if (revDate.add(24, "hours").isBefore(new Date())) {
                message +=
                  " এই সম্পাদনাটি ২৪ ঘন্টারও বেশি আগে করা হয়েছিল তাই একটি সতর্কতা পুরনো হতে পারে।";
                $("#twinkle-warn-warning-messages").text("বিজ্ঞপ্তি:" + message);
              }
            }
          };
    
          var vantimestamp = mw.util.getParamValue("vantimestamp");
          // Provided from a fluff module-based revert, no API lookup necessary
          if (vantimestamp) {
            checkStale(vantimestamp);
          } else {
            query = {
              action: "query",
              prop: "revisions",
              rvprop: "timestamp",
              revids: vanrevid,
              format: "json",
            };
            new Morebits.wiki.api(
              "সংস্করণ টাইমস্ট্যাম্প আনা হচ্ছে",
              query,
              function (apiobj) {
                var rev = apiobj.getResponse().query.pages[0].revisions;
                vantimestamp = rev && rev[0].timestamp;
                checkStale(vantimestamp);
              }
            ).post();
          }
        }
    
        // We must init the first choice (General Note);
        var evt = document.createEvent("Event");
        evt.initEvent("change", true, true);
        result.main_group.dispatchEvent(evt);
      };
    
      // This is all the messages that might be dispatched by the code
      // Each of the individual templates require the following information:
      //   label (required): A short description displayed in the dialog
      //   summary (required): The edit summary used. If an article name is entered, the summary is postfixed with "on [[article]]", and it is always postfixed with "."
      //   suppressArticleInSummary (optional): Set to true to suppress showing the article name in the edit summary. Useful if the warning relates to attack pages, or some such.
      Twinkle.warn.messages = {
        levels: {
          "সাধারণ সতর্কতা": {
            "uw-vandalism": {
              level1: {
                label: "ধ্বংসপ্রবণতা",
                summary: "সাধারণ বিজ্ঞপ্তি: অগঠনমূলক সম্পাদনা",
              },
              level2: {
                label: "ধ্বংসপ্রবণতা",
                summary: "দ্বিতীয় স্তরের সতর্কতা: অগঠনমূলক সম্পাদনা",
              },
              level3: {
                label: "ধ্বংসপ্রবণতা",
                summary: "তৃতীয় স্তরের সতর্কতা: ধ্বংসপ্রবণতা",
              },
              level4: {
                label: "ধ্বংসপ্রবণতা",
                summary: "সর্বশেষ সতর্কতা: ধ্বংসপ্রবণতা",
              },
              level4im: {
                label: "ধ্বংসপ্রবণতা",
                summary: "একমাত্র সতর্কতা: ধ্বংসপ্রবণতা",
              },
            },
            "uw-disruptive": {
              level1: {
                label: "অগঠনমূলক সম্পাদনা",
                summary: "সাধারণ বিজ্ঞপ্তি: অগঠমূলক সম্পাদনা",
              },
              level2: {
                label: "অগঠনমূলক সম্পাদনা",
                summary: "দ্বিতীয় স্তরের সতর্কতা: অগঠমূলক সম্পাদনা",
              },
              level3: {
                label: "অগঠনমূলক সম্পাদনা",
                summary: "তৃতীয় স্তরের সতর্কতা: অগঠনমূলক সম্পাদনা",
              },
            },
            "uw-test": {
              level1: {
                label: "পরীক্ষামূলক সম্পাদনা",
                summary: "সাধারণ বিজ্ঞপ্তি: পরীক্ষামূলক সম্পাদনা",
              },
              level2: {
                label: "পরীক্ষামূলক সম্পাদনা",
                summary: "দ্বিতীয় স্তরের সতর্কতা: পরীক্ষামূলক সম্পাদনা",
              },
              level3: {
                label: "পরীক্ষামূলক সম্পাদনা",
                summary: "তৃতীয় স্তরের সতর্কতা: পরীক্ষামূলক সম্পাদনা",
              },
            },
            "uw-delete": {
              level1: {
                label: "পাতার বিষয়বস্তু অপসারণ বা খালি করা",
                summary: "সাধারণ বিজ্ঞপ্তি: পাতার বিষয়বস্তু অপসারণ বা খালি করা",
              },
              level2: {
                label: "পাতার বিষয়বস্তু অপসারণ বা খালি করা",
                summary:
                  "দ্বিতীয় স্তরের সতর্কতা: পাতার বিষয়বস্তু অপসারণ বা খালি করা",
              },
              level3: {
                label: "পাতার বিষয়বস্তু অপসারণ বা খালি করা",
                summary:
                  "তৃতীয় স্তরের সতর্কতা: পাতার বিষয়বস্তু অপসারণ বা খালি করা",
              },
              level4: {
                label: "পাতার বিষয়বস্তু অপসারণ বা খালি করা",
                summary: "সর্বশেষ সতর্কতা: পাতার বিষয়বস্তু অপসারণ বা খালি করা",
              },
              level4im: {
                label: "পাতার বিষয়বস্তু অপসারণ বা খালি করা",
                summary: "একমাত্র সতর্কতা: পাতার বিষয়বস্তু অপসারণ বা খালি করা",
              },
            },
          },
          "বিষয়বস্তু (প্রধান/থিসরাস প্রভৃতি) নামস্থান সংক্রান্ত": {
            "uw-error": {
              level1: {
                label: "ইচ্ছাকৃত ত্রুটিপূর্ণ উপাদান যোগ করা",
                summary: "সাধারণ বিজ্ঞপ্তি: ইচ্ছাকৃত ত্রুটিপূর্ণ উপাদান যোগ করা",
              },
              level2: {
                label: "ইচ্ছাকৃত ত্রুটিপূর্ণ উপাদান যোগ করা করা",
                summary:
                  "দ্বিতীয় স্তরের সতর্কতা: ইচ্ছাকৃত ত্রুটিপূর্ণ উপাদান যোগ করা",
              },
              level3: {
                label: "ইচ্ছাকৃত ত্রুটিপূর্ণ উপাদান যোগ করা করা",
                summary:
                  "তৃতীয় স্তরের সতর্কতা: ইচ্ছাকৃত ত্রুটিপূর্ণ উপাদান যোগ করা করা",
              },
              level4: {
                label: "ইচ্ছাকৃত ত্রুটিপূর্ণ উপাদান যোগ করা করা",
                summary: "সর্বশেষ সতর্কতা: ইচ্ছাকৃত ত্রুটিপূর্ণ উপাদান যোগ করা করা",
              },
            },
            "uw-genre": {
              level1: {
                label: "ঐকমত্য বা তথ্যসূত্র ছাড়া ঘরানার ঘন ঘন বা গণ পরিবর্তন",
                summary:
                  "সাধারণ বিজ্ঞপ্তি: ঐকমত্য বা তথ্যসূত্র ছাড়া ঘরানার ঘন ঘন বা গণ পরিবর্তন",
              },
              level2: {
                label: "ঐকমত্য বা তথ্যসূত্র ছাড়া ঘরানার ঘন ঘন বা গণ পরিবর্তন",
                summary:
                  "দ্বিতীয় স্তরের সতর্কতা: ঐকমত্য বা তথ্যসূত্র ছাড়া ঘরানার ঘন ঘন বা গণ পরিবর্তন",
              },
              level3: {
                label: "ঐকমত্য বা তথ্যসূত্র ছাড়া ঘরানার ঘন ঘন বা গণ পরিবর্তন",
                summary:
                  "তৃতীয় স্তরের সতর্কতা: ঐকমত্য বা তথ্যসূত্র ছাড়া ঘরানার ঘন ঘন বা গণ পরিবর্তন",
              },
              level4: {
                label: "ঐকমত্য বা তথ্যসূত্র ছাড়া ঘরানার ঘন ঘন বা গণ পরিবর্তন",
                summary:
                  "সর্বশেষ সতর্কতা: ঐকমত্য বা তথ্যসূত্র ছাড়া ঘরানার ঘন ঘন বা গণ পরিবর্তন",
              },
            },
            "uw-media": {
              level1: {
                label: "নিবন্ধে অডিও বা মিডিয়া ফাইল-সংক্রান্ত ধ্বংসাত্মক সম্পাদনা",
                summary:
                  "সাধারণ বিজ্ঞপ্তি: নিবন্ধে অডিও বা মিডিয়া ফাইল-সংক্রান্ত ধ্বংসাত্মক সম্পাদনা",
              },
              level2: {
                label: "নিবন্ধে অডিও বা মিডিয়া ফাইল-সংক্রান্ত ধ্বংসাত্মক সম্পাদনা",
                summary:
                  "দ্বিতীয় স্তরের সতর্কতা: নিবন্ধে অডিও বা মিডিয়া ফাইল-সংক্রান্ত ধ্বংসাত্মক সম্পাদনা",
              },
              level3: {
                label: "নিবন্ধে অডিও বা মিডিয়া ফাইল-সংক্রান্ত ধ্বংসাত্মক সম্পাদনা",
                summary:
                  "তৃতীয় স্তরের সতর্কতা: নিবন্ধে অডিও বা মিডিয়া ফাইল-সংক্রান্ত ধ্বংসাত্মক সম্পাদনা",
              },
              level4: {
                label: "নিবন্ধে অডিও বা মিডিয়া ফাইল-সংক্রান্ত ধ্বংসাত্মক সম্পাদনা",
                summary:
                  "সর্বশেষ সতর্কতা: নিবন্ধে অডিও বা মিডিয়া ফাইল-সংক্রান্ত ধ্বংসাত্মক সম্পাদনা",
              },
              level4im: {
                label: "অডিও বা মিডিয়া ফাইল-সংক্রান্ত ধ্বংসপ্রবণতা",
                summary: "একমাত্র সতর্কতা: অডিও বা মিডিয়া ফাইল-সংক্রান্ত ধ্বংসাত্মক সম্পাদনা",
              },
            },
            "uw-joke": {
              level1: {
                label: "নিবন্ধে অনুপযুক্ত হাস্যরস ব্যবহার করা",
                summary: "সাধারণ বিজ্ঞপ্তি: নিবন্ধে অনুপযুক্ত হাস্যরস ব্যবহার করা",
              },
              level2: {
                label: "নিবন্ধে অনুপযুক্ত হাস্যরস ব্যবহার করা",
                summary:
                  "দ্বিতীয় স্তরের সতর্কতা: নিবন্ধে অনুপযুক্ত হাস্যরস ব্যবহার করা",
              },
              level3: {
                label: "নিবন্ধে অনুপযুক্ত হাস্যরস ব্যবহার করা",
                summary:
                  "তৃতীয় স্তরের সতর্কতা: নিবন্ধে অনুপযুক্ত হাস্যরস ব্যবহার করা",
              },
              level4: {
                label: "নিবন্ধে অনুপযুক্ত হাস্যরস ব্যবহার করা",
                summary: "সর্বশেষ সতর্কতা: নিবন্ধে অনুপযুক্ত হাস্যরস ব্যবহার করা",
              },
              level4im: {
                label: "অনুপযুক্ত হাস্যরস ব্যবহার",
                summary: "একমাত্র সতর্কতা: অনুপযুক্ত হাস্যরস ব্যবহার",
              },
            },
            "uw-nor": {
              level1: {
                label: "মনগড়া ভুক্তি বা ব্যক্তিগত গবেষণা যোগ করা",
                summary:
                  "সাধারণ বিজ্ঞপ্তি: মনগড়া ভুক্তি বা ব্যক্তিগত গবেষণা যোগ করা",
              },
              level2: {
                label: "মনগড়া ভুক্তি বা ব্যক্তিগত গবেষণা যোগ করা",
                summary:
                  "দ্বিতীয় স্তরের সতর্কতা: মনগড়া ভুক্তি বা ব্যক্তিগত গবেষণা যোগ করা",
              },
              level3: {
                label: "মনগড়া ভুক্তি বা ব্যক্তিগত গবেষণা যোগ করা",
                summary:
                  "তৃতীয় স্তরের সতর্কতা: মনগড়া ভুক্তি বা ব্যক্তিগত গবেষণা যোগ করা",
              },
              level4: {
                label: "মনগড়া ভুক্তি বা ব্যক্তিগত গবেষণা যোগ করা",
                summary:
                  "সর্বশেষ সতর্কতা: মনগড়া ভুক্তি বা ব্যক্তিগত গবেষণা যোগ করা",
              },
            },
            "uw-own": {
              level1: {
                label: "নিবন্ধের মালিকানা",
                summary: "সাধারণ বিজ্ঞপ্তি: নিবন্ধের মালিকানা",
              },
              level2: {
                label: "নিবন্ধের মালিকানা",
                summary: "দ্বিতীয় স্তরের সতর্কতা: নিবন্ধের মালিকানা",
              },
              level3: {
                label: "নিবন্ধের মালিকানা",
                summary: "তৃতীয় স্তরের সতর্কতা: নিবন্ধের মালিকানা",
              },
              level4: {
                label: "নিবন্ধের মালিকানা",
                summary: "সর্বশেষ সতর্কতা: নিবন্ধের মালিকানা",
              },
              level4im: {
                label: "নিবন্ধের মালিকানা",
                summary: "একমাত্র সতর্কতা: নিবন্ধের মালিকানা",
              },
            },
            "uw-subtle": {
              level1: {
                label: "সূক্ষ্ম ধ্বংপ্রবণতা",
                summary: "সাধারণ বিজ্ঞপ্তি: সম্ভবত অগঠনমূলক সম্পাদনা",
              },
              level2: {
                label: "সূক্ষ্ম ধ্বংপ্রবণতা",
                summary: "দ্বিতীয় স্তরের সতর্কতা: সম্ভাব্য অগঠনমূলক সম্পাদনা",
              },
              level3: {
                label: "সূক্ষ্ম ধ্বংপ্রবণতা",
                summary: "তৃতীয় স্তরের সতর্কতা: সূক্ষ্ম ধ্বংপ্রবণতা",
              },
              level4: {
                label: "সূক্ষ্ম ধ্বংপ্রবণতা",
                summary: "সর্বশেষ সতর্কতা: সূক্ষ্ম ধ্বংপ্রবণতা",
              },
            },
            "uw-tdel": {
              level1: {
                label: "রক্ষণাবেক্ষণ টেমপ্লেট অপসারণ",
                summary: "সাধারণ বিজ্ঞপ্তি: রক্ষণাবেক্ষণ টেমপ্লেট অপসারণ",
              },
              level2: {
                label: "রক্ষণাবেক্ষণ টেমপ্লেট অপসারণ",
                summary: "দ্বিতীয় স্তরের সতর্কতা: রক্ষণাবেক্ষণ টেমপ্লেট অপসারণ",
              },
              level3: {
                label: "রক্ষণাবেক্ষণ টেমপ্লেট অপসারণ",
                summary: "তৃতীয় স্তরের সতর্কতা: রক্ষণাবেক্ষণ টেমপ্লেট অপসারণ",
              },
              level4: {
                label: "রক্ষণাবেক্ষণ টেমপ্লেট অপসারণ",
                summary: "সর্বশেষ সতর্কতা: রক্ষণাবেক্ষণ টেমপ্লেট অপসারণ",
              },
            },
          },
          "স্প্যাম ও প্রচারণা": {
            "uw-advert": {
              level1: {
                label: "বিজ্ঞাপন বা প্রচারনার উদ্দেশ্যে উইকিঅভিধান ব্যবহার করা",
                summary:
                  "সাধারণ বিজ্ঞপ্তি: বিজ্ঞাপন বা প্রচারনার উদ্দেশ্যে উইকিঅভিধান ব্যবহার করা",
              },
              level2: {
                label: "বিজ্ঞাপন বা প্রচারনার উদ্দেশ্যে উইকিঅভিধান ব্যবহার করা",
                summary:
                  "দ্বিতীয় স্তরের সতর্কতা: বিজ্ঞাপন বা প্রচারনার উদ্দেশ্যে উইকিঅভিধান ব্যবহার করা",
              },
              level3: {
                label: "বিজ্ঞাপন বা প্রচারনার উদ্দেশ্যে উইকিঅভিধান ব্যবহার করা",
                summary:
                  "তৃতীয় স্তরের সতর্কতা: বিজ্ঞাপন বা প্রচারনার উদ্দেশ্যে উইকিঅভিধান ব্যবহার করা",
              },
              level4: {
                label: "বিজ্ঞাপন বা প্রচারনার উদ্দেশ্যে উইকিঅভিধান ব্যবহার করা",
                summary:
                  "সর্বশেষ সতর্কতা: বিজ্ঞাপন বা প্রচারনার উদ্দেশ্যে উইকিঅভিধান ব্যবহার করা",
              },
              level4im: {
                label: "বিজ্ঞাপন বা প্রচারনার উদ্দেশ্যে উইকিঅভিধান ব্যবহার করা",
                summary:
                  "একমাত্র সতর্কতা: বিজ্ঞাপন বা প্রচারনার উদ্দেশ্যে উইকিঅভিধান ব্যবহার করা",
              },
            },
            "uw-spam": {
              level1: {
                label: "অনুপযুক্ত বহিঃসংযোগ যোগ করা",
                summary: "সাধারণ বিজ্ঞপ্তি: অনুপযুক্ত বহিঃসংযোগ যোগ করা",
              },
              level2: {
                label: "স্প্যাম লিংক সংযোজন",
                summary: "দ্বিতীয় স্তরের সতর্কতা: স্প্যাম লিংক সংযোজন",
              },
              level3: {
                label: "স্প্যাম লিংক সংযোজন",
                summary: "তৃতীয় স্তরের সতর্কতা: স্প্যাম লিংক সংযোজন",
              },
              level4: {
                label: "স্প্যাম লিংক সংযোজন",
                summary: "সর্বশেষ সতর্কতা: স্প্যাম লিংক সংযোজন",
              },
              level4im: {
                label: "স্প্যাম লিংক সংযোজন",
                summary: "একমাত্র সতর্কতা: স্প্যাম লিংক সংযোজন",
              },
            },
          },
          "অন্য ব্যবহারকারীর প্রতি আচরণ": {
            "uw-agf": {
              level1: {
                label: "অন্য ব্যবহারকারীর উপর আস্থা না রাখা",
                summary: "সাধারণ বিজ্ঞপ্তি: অন্য ব্যবহারকারীর উপর আস্থা না রাখা",
              },
              level2: {
                label: "অন্য ব্যবহারকারীর উপর আস্থা না রাখা",
                summary:
                  "দ্বিতীয় স্তরের সতর্কতা: অন্য ব্যবহারকারীর উপর আস্থা না রাখা",
              },
              level3: {
                label: "অন্য ব্যবহারকারীর উপর আস্থা না রাখা",
                summary:
                  "তৃতীয় স্তরের সতর্কতা: অন্য ব্যবহারকারীর উপর আস্থা না রাখা",
              },
            },
            "uw-harass": {
              level1: {
                label: "অন্য ব্যবহারকারীদের হয়রানি",
                summary: "সাধারণ বিজ্ঞপ্তি: অন্য ব্যবহারকারীদের হয়রানি",
              },
              level2: {
                label: "অন্য ব্যবহারকারীদের হয়রানি",
                summary: "দ্বিতীয় স্তরের সতর্কতা: অন্য ব্যবহারকারীদের হয়রানি",
              },
              level3: {
                label: "অন্য ব্যবহারকারীদের হয়রানি",
                summary: "তৃতীয় স্তরের সতর্কতা: অন্য ব্যবহারকারীদের হয়রানি",
              },
              level4: {
                label: "অন্য ব্যবহারকারীদের হয়রানি",
                summary: "সর্বশেষ সতর্কতা: অন্য ব্যবহারকারীদের হয়রানি",
              },
              level4im: {
                label: "অন্য ব্যবহারকারীদের হয়রানি",
                summary: "একমাত্র সতর্কতা: অন্য ব্যবহারকারীদের হয়রানি",
              },
            },
            "uw-npa": {
              level1: {
                label: "একজন নির্দিষ্ট সম্পাদককে লক্ষ্য করে ব্যক্তিগত আক্রমণ",
                summary:
                  "সাধারণ বিজ্ঞপ্তি: একজন নির্দিষ্ট সম্পাদককে লক্ষ্য করে ব্যক্তিগত আক্রমণ",
              },
              level2: {
                label: "একজন নির্দিষ্ট সম্পাদককে লক্ষ্য করে ব্যক্তিগত আক্রমণ",
                summary:
                  "দ্বিতীয় স্তরের সতর্কতা: একজন নির্দিষ্ট সম্পাদককে লক্ষ্য করে ব্যক্তিগত আক্রমণ",
              },
              level3: {
                label: "একজন নির্দিষ্ট সম্পাদককে লক্ষ্য করে ব্যক্তিগত আক্রমণ",
                summary:
                  "তৃতীয় স্তরের সতর্কতা: একজন নির্দিষ্ট সম্পাদককে লক্ষ্য করে ব্যক্তিগত আক্রমণ",
              },
              level4: {
                label: "একজন নির্দিষ্ট সম্পাদককে লক্ষ্য করে ব্যক্তিগত আক্রমণ",
                summary:
                  "সর্বশেষ সতর্কতা: একজন নির্দিষ্ট সম্পাদককে লক্ষ্য করে ব্যক্তিগত আক্রমণ",
              },
              level4im: {
                label: "একজন নির্দিষ্ট সম্পাদককে লক্ষ্য করে ব্যক্তিগত আক্রমণ",
                summary:
                  "একমাত্র সতর্কতা: একজন নির্দিষ্ট সম্পাদককে লক্ষ্য করে ব্যক্তিগত আক্রমণ",
              },
            },
            "uw-tempabuse": {
              level1: {
                label: "সতর্কতা ও বাধা দান টেমপ্লেটের অনুপযুক্ত ব্যবহার",
                summary:
                  "সাধারণ বিজ্ঞপ্তি: সতর্কতা ও বাধা দান টেমপ্লেটের অনুপযুক্ত ব্যবহার",
              },
              level2: {
                label: "সতর্কতা ও বাধা দান টেমপ্লেটের অনুপযুক্ত ব্যবহার",
                summary:
                  "দ্বিতীয় স্তরের সতর্কতা: সতর্কতা ও বাধা দান টেমপ্লেটের অনুপযুক্ত ব্যবহার",
              },
            },
          },
          "অপসারণ ট্যাগ অপসারণ": {
            "uw-speedy": {
              level1: {
                label: "দ্রুত, প্রস্তাবিত বা সম্ভাব্য অপসারণের ট্যাগ অপসারণ",
                summary: "সাধারণ বিজ্ঞপ্তি: দ্রুত, প্রস্তাবিত বা সম্ভাব্য অপসারণের ট্যাগ অপসারণ",
              },
              level2: {
                label: "দ্রুত, প্রস্তাবিত বা সম্ভাব্য অপসারণের ট্যাগ অপসারণ",
                summary: "দ্বিতীয় স্তরের সতর্কতা: দ্রুত, প্রস্তাবিত বা সম্ভাব্য অপসারণের ট্যাগ অপসারণ",
              },
              level3: {
                label: "দ্রুত, প্রস্তাবিত বা সম্ভাব্য অপসারণের ট্যাগ অপসারণ",
                summary: "তৃতীয় স্তরের সতর্কতা: দ্রুত, প্রস্তাবিত বা সম্ভাব্য অপসারণের ট্যাগ অপসারণ",
              },
              level4: {
                label: "দ্রুত, প্রস্তাবিত বা সম্ভাব্য অপসারণের ট্যাগ অপসারণ",
                summary: "সর্বশেষ সতর্কতা: দ্রুত, প্রস্তাবিত বা সম্ভাব্য অপসারণের ট্যাগ অপসারণ",
              },
            },
          },
          অন্যান্য: {
            // "uw-attempt": {
            //   level1: {
            //     label: "সম্পাদনা ছাঁকনি ট্রিগার করা",
            //     summary: "সাধারণ বিজ্ঞপ্তি: সম্পাদনা ছাঁকনি ট্রিগার করা",
            //   },
            //   level2: {
            //     label: "সম্পাদনা ছাঁকনি ট্রিগার করা",
            //     summary: "দ্বিতীয় স্তরের সতর্কতা: সম্পাদনা ছাঁকনি ট্রিগার করা",
            //   },
            //   level3: {
            //     label: "সম্পাদনা ছাঁকনি ট্রিগার করা",
            //     summary: "তৃতীয় স্তরের সতর্কতা: সম্পাদনা ছাঁকনি ট্রিগার করা",
            //   },
            //   level4: {
            //     label: "সম্পাদনা ছাঁকনি ট্রিগার করা",
            //     summary: "সর্বশেষ সতর্কতা: সম্পাদনা ছাঁকনি ট্রিগার করা",
            //   },
            //   level4im: {
            //     label: "সম্পাদনা ছাঁকনি ট্রিগার করা",
            //     summary: "শুধুমাত্র সতর্কতা: সম্পাদনা ছাঁকনি ট্রিগার করা",
            //   },
            // },
            "uw-chat": {
              level1: {
                label: "আলাপ পাতাকে ফোরাম হিসেবে ব্যবহার",
                summary: "সাধারণ বিজ্ঞপ্তি: আলাপ পাতাকে ফোরাম হিসেবে ব্যবহার",
              },
              level2: {
                label: "আলাপ পাতাকে ফোরাম হিসেবে ব্যবহার",
                summary:
                  "দ্বিতীয় স্তরের সতর্কতা: আলাপ পাতাকে ফোরাম হিসেবে ব্যবহার",
              },
              level3: {
                label: "আলাপ পাতাকে ফোরাম হিসেবে ব্যবহার",
                summary: "তৃতীয় স্তরের সতর্কতা: আলাপ পাতাকে ফোরাম হিসেবে ব্যবহার",
              },
              level4: {
                label: "আলাপ পাতাকে ফোরাম হিসেবে ব্যবহার",
                summary: "সর্বশেষ সতর্কতা: আলাপ পাতাকে ফোরাম হিসেবে ব্যবহার",
              },
            },
            "uw-create": {
              level1: {
                label: "অনুপযুক্ত পাতা তৈরি",
                summary: "সাধারণ বিজ্ঞপ্তি: অনুপযুক্ত পাতা তৈরি",
              },
              level2: {
                label: "অনুপযুক্ত পাতা তৈরি",
                summary: "দ্বিতীয় স্তরের সতর্কতা: অনুপযুক্ত পাতা তৈরি",
              },
              level3: {
                label: "অনুপযুক্ত পাতা তৈরি",
                summary: "তৃতীয় স্তরের সতর্কতা: অনুপযুক্ত পাতা তৈরি",
              },
              level4: {
                label: "অনুপযুক্ত পাতা তৈরি",
                summary: "সর্বশেষ সতর্কতা: অনুপযুক্ত পাতা তৈরি",
              },
              level4im: {
                label: "অনুপযুক্ত পাতা তৈরি",
                summary: "একমাত্র সতর্কতা: অনুপযুক্ত পাতা তৈরি",
              },
            },
            "uw-mos": {
              level1: {
                label: "রচনাশৈলী",
                summary:
                  "সাধারণ বিজ্ঞপ্তি: ফরম্যাটিং, তারিখ, ভাষা ইত্যাদি (রচনাশৈলী)",
              },
              level2: {
                label: "রচনাশৈলী",
                summary:
                  "দ্বিতীয় স্তরের সতর্কতা: ফরম্যাটিং, তারিখ, ভাষা ইত্যাদি (রচনাশৈলী)",
              },
              level3: {
                label: "রচনাশৈলী",
                summary:
                  "তৃতীয় স্তরের সতর্কতা: ফরম্যাটিং, তারিখ, ভাষা ইত্যাদি (রচনাশৈলী)",
              },
              level4: {
                label: "রচনাশৈলী",
                summary:
                  "সর্বশেষ সতর্কতা: ফরম্যাটিং, তারিখ, ভাষা ইত্যাদি (রচনাশৈলী)",
              },
            },
            "uw-move": {
              level1: {
                label: "নামকরণ রীতি বা ঐকমত্যের বিরুদ্ধে পাতা স্থানান্তর",
                summary:
                  "সাধারণ বিজ্ঞপ্তি: নামকরণ রীতি বা ঐকমত্যের বিরুদ্ধে পাতা স্থানান্তর",
              },
              level2: {
                label: "নামকরণ রীতি বা ঐকমত্যের বিরুদ্ধে পাতা স্থানান্তর",
                summary:
                  "দ্বিতীয় স্তরের সতর্কতা: নামকরণ রীতি বা ঐকমত্যের বিরুদ্ধে পাতা স্থানান্তর",
              },
              level3: {
                label: "নামকরণ রীতি বা ঐকমত্যের বিরুদ্ধে পাতা স্থানান্তর",
                summary:
                  "তৃতীয় স্তরের সতর্কতা: নামকরণ রীতি বা ঐকমত্যের বিরুদ্ধে পাতা স্থানান্তর",
              },
              level4: {
                label: "নামকরণ রীতি বা ঐকমত্যের বিরুদ্ধে পাতা স্থানান্তর",
                summary:
                  "সর্বশেষ সতর্কতা: নামকরণ রীতি বা ঐকমত্যের বিরুদ্ধে পাতা স্থানান্তর",
              },
              level4im: {
                label: "নামকরণ রীতি বা ঐকমত্যের বিরুদ্ধে পাতা স্থানান্তর",
                summary:
                  "একমাত্র সতর্কতা: নামকরণ রীতি বা ঐকমত্যের বিরুদ্ধে পাতা স্থানান্তর",
              },
            },
            "uw-tpv": {
              level1: {
                label: "অন্যদের আলাপ পাতার মন্তব্যসমূহের পুনর্বিন্যস করা", //Refactoring others' talk page comments
                summary:
                  "সাধারণ বিজ্ঞপ্তি: অন্যদের আলাপ পাতার মন্তব্যসমূহের পুনর্বিন্যস করা",
              },
              level2: {
                label: "অন্যদের আলাপ পাতার মন্তব্যসমূহের পুনর্বিন্যস করা",
                summary:
                  "দ্বিতীয় স্তরের সতর্কতা: অন্যদের আলাপ পাতার মন্তব্যসমূহের পুনর্বিন্যস করা",
              },
              level3: {
                label: "অন্যদের আলাপ পাতার মন্তব্যসমূহের পুনর্বিন্যস করা",
                summary:
                  "তৃতীয় স্তরের সতর্কতা: অন্যদের আলাপ পাতার মন্তব্যসমূহের পুনর্বিন্যস করা",
              },
              level4: {
                label: "অন্যদের আলাপ পাতার মন্তব্যসমূহের পুনর্বিন্যস করা",
                summary:
                  "সর্বশেষ সতর্কতা: অন্যদের আলাপ পাতার মন্তব্যসমূহের পুনর্বিন্যস করা",
              },
              level4im: {
                label: "অন্যদের আলাপ পাতার মন্তব্যসমূহের পুনর্বিন্যস করা",
                summary:
                  "একমাত্র সতর্কতা: অন্যদের আলাপ পাতার মন্তব্যসমূহের পুনর্বিন্যস করা",
              },
            },
          },
        },
    
        singlenotice: {
          "uw-agf-sock": {
            label: "একাধিক অ্যাকাউন্টের ব্যবহার (আস্থা রেখে)",
            summary: "বিজ্ঞপ্তি: একাধিক অ্যাকাউন্টের ব্যবহার",
          },
          "uw-autobiography": {
            label: "আত্মজীবনী তৈরি",
            summary: "বিজ্ঞপ্তি: আত্মজীবনী তৈরি",
          },
          "uw-badcat": {
            label: "ভুল বিষয়শ্রেণী যোগ",
            summary: "বিজ্ঞপ্তি: ভুল বিষয়শ্রেণী যোগ",
          },
          "Uw-np": {
            label: "বিশ্বকোষীয় নিবন্ধ তৈরি",
            summary: "বিজ্ঞপ্তি: উইকিঅভিধানে বিশ্বকোষীয় নিবন্ধ তৈরি",
          },
          "uw-badlistentry": {
            label: "তালিকায় অনুপযুক্ত ভুক্তি যোগ",
            summary: "বিজ্ঞপ্তি: তালিকায় অনুপযুক্ত ভুক্তি যোগ",
          },
          "uw-bite": {
            label: 'নবাগতদের "জ্বালাতন"',
            summary: 'বিজ্ঞপ্তি: "নবাগতদের জ্বালাতন',
            suppressArticleInSummary: true, // non-standard (user name, not article), and not necessary
          },
          "uw-controversial": {
            label: "বিতর্কিত উপাদান যোগ",
            summary: "বিজ্ঞপ্তি: বিতর্কিত উপাদান যোগ",
          },
          "uw-copying": {
            label: "অন্য পাতায় লেখা অনুলিপি",
            summary: "বিজ্ঞপ্তি: অন্য পাতায় লেখা অনুলিপি",
          },
          "uw-crystal": {
            label: "অনুমাননির্ভর বা অনিশ্চিত তথ্য যোগ করা",
            summary: "বিজ্ঞপ্তি: অনুমাননির্ভর বা অনিশ্চিত তথ্য যোগ করা",
          },
          "uw-c&pmove": {
            label: "অনুলিপি প্রতিলিপি করে পাতা স্থানান্তর",
            summary: "বিজ্ঞপ্তি: অনুলিপি প্রতিলিপি করে পাতা স্থানান্তর",
          },
          "uw-dab": {
            label: "দ্ব্যর্থতা নিরসন পাতায় ভুল সম্পাদনা",
            summary: "বিজ্ঞপ্তি: দ্ব্যর্থতা নিরসন পাতায় ভুল সম্পাদনা",
          },
          "uw-deadlink": {
            label: "অকার্যকর সংযোগ সম্বলিত সঠিক উৎস সরানো",
            summary: "বিজ্ঞপ্তি: অকার্যকর সংযোগ সম্বলিত সঠিক উৎস সরানো",
          },
          "uw-displaytitle": {
            label: "DISPLAYTITLE এর ভুল ব্যবহার",
            summary: "বিজ্ঞপ্তি: DISPLAYTITLE এর ভুল ব্যবহার",
          },
          "uw-draftfirst": {
            label:
              "দ্রুত মুছে ফেলার ঝুঁকি এড়াতে ব্যবহারকারীর ব্যবহারকারী নামস্থানে খসড়া তৈরি করা উচিত",
            summary:
              "বিজ্ঞপ্তি: দয়া করে [[Help:Userspace draft|ব্যবহারকারী নামস্থানে]] খসড়া তৈরি করুন",
          },
          "uw-editsummary": {
            label: "নতুন ব্যবহারকারী সম্পাদনা সারাংশ ব্যবহার করছে না",
            summary: "বিজ্ঞপ্তি: সম্পাদনা সারাংশ ব্যবহার না করা",
          },
          "uw-editsummary2": {
            label: "অভিজ্ঞ ব্যবহারকারী সম্পাদনা সারাংশ ব্যবহার করছে না",
            summary: "বিজ্ঞপ্তি: সম্পাদনা সারাংশ ব্যবহার না করা",
          },
          "uw-hasty": {
            label: "তাড়াহুড়ো করে দ্রুত অপসারণ ট্যাগ যোগ",
            summary:
              "বিজ্ঞপ্তি: অপসারণ ট্যাগ যোগ করার আগে প্রণেতাকে নিবন্ধটির মানোন্নয়নের সময় দিন",
          },
          "uw-linking": {
            label: "লাল লিংকের অত্যধিক কিংবা বার বার নীল লিংকের ব্যবহার",
            summary:
              "বিজ্ঞপ্তি: লাল লিংকের অত্যধিক কিংবা বার বার নীল লিংকের ব্যবহার",
          },
          "uw-minor": {
            label: "অনুল্লেখ্য সম্পাদনা চেক বক্সের ভুল ব্যবহার",
            summary: "বিজ্ঞপ্তি: অনুল্লেখ্য সম্পাদনা চেক বক্সের ভুল ব্যবহার",
          },
          "uw-notvote": {
            label: "আমরা ঐকমত্য ব্যবহার করি, ভোট নয়",
            summary: "বিজ্ঞপ্তি: আমরা ঐকমত্য ব্যবহার করি, ভোট নয়",
          },
          "uw-plagiarism": {
            label: "অ্যাট্রিবিউশন ছাড়াই পাবলিক ডোমেইন উৎস থেকে কপি করা",
            summary:
              "বিজ্ঞপ্তি: অ্যাট্রিবিউশন ছাড়াই পাবলিক ডোমেইন উৎস থেকে কপি করা",
          },
          "uw-preview": {
            label: "ভুল এড়াতে প্রাকদর্শন বাটন ব্যবহার করুন",
            summary: "বিজ্ঞপ্তি: ভুল এড়াতে প্রাকদর্শন বাটন ব্যবহার করুন",
          },
          "uw-redlink": {
            label: "নির্বিচারে লাল লিংক অপসারণ",
            summary: "বিজ্ঞপ্তি: লাল লিংক অপসারণ করার সময় সতর্ক হোন",
          },
          "uw-selfrevert": {
            label: "নিজের পরীক্ষা-নিরীক্ষা পুনর্বহাল করা",
            summary: "বিজ্ঞপ্তি: নিজের পরীক্ষা-নিরীক্ষা পুনর্বহাল করা",
          },
          "uw-sofixit": {
            label: "সাহসী হোন এবং নিজেই কোনো কিছু সংশোধন করুন",
            summary: "বিজ্ঞপ্তি: সাহস করে নিজেই কোনো কিছু সংশোধন করতে পারেন",
          },
          "uw-talkinarticle": {
            label: "নিবন্ধের ভেতরে বার্তা",
            summary: "বিজ্ঞপ্তি: নিবন্ধের ভেতরে বার্তা",
          },
          "uw-tilde": {
            label: "পোস্টে স্বাক্ষর না করা",
            summary: "বিজ্ঞপ্তি: পোস্টে স্বাক্ষর না করা",
          },
          "uw-toppost": {
            label: "আলাপ পাতার শীর্ষে বার্তা প্রদান",
            summary: "বিজ্ঞপ্তি: আলাপ পাতার শীর্ষে বার্তা প্রদান",
          },
          "uw-unattribcc": {
            label: "নির্দেশ ছাড়াই উপযুক্ত-লাইসেন্সযুক্ত উৎস থেকে অনুলিপি করা",
            summary:
              "বিজ্ঞপ্তি: নির্দেশ ছাড়াই উপযুক্ত-লাইসেন্সযুক্ত উৎস থেকে অনুলিপি করা", //Copying from compatibility-licensed sources without attribution
          },
          "uw-userspace draft finish": {
            label: "অনেক পুরাতন ব্যবহারকারী খসড়া",
            summary: "বিজ্ঞপ্তি: অনেক পুরাতন ব্যবহারকারী খসড়া",
          },
          "uw-warn": {
            label:
              "ধ্বংসপ্রবণতা পুনর্বহাল করার সময় ব্যবহারকারীকে সতর্ক বার্তা দিন",
            summary:
              "বিজ্ঞপ্তি: ধ্বংসপ্রবণতা পুনর্বহাল করার সময় ব্যবহারকারীকে সতর্কতা বার্তা দিন",
          },
          "uw-wrongsummary": {
            label: "ভুল বা অনুপযুক্ত সম্পাদনা সারাংশ ব্যবহার করা",
            summary: "সতর্কতা: ভুল বা অনুপযুক্ত সম্পাদনা সারাংশ ব্যবহার করা",
          },
        },
    
        singlewarn: {
          "uw-affiliate": {
            label: "অ্যাফিলিয়েট মার্কেটিং",
            summary: "সতর্কতা: অ্যাফিলিয়েট মার্কেটিং",
          },
          "uw-attack": {
            label: "আক্রমণাত্বক পাতা তৈরি",
            summary: "সতর্কতা: আক্রমণাত্বক পাতা তৈরি",
            suppressArticleInSummary: true,
          },
          "uw-botun": {
            label: "বট ব্যবহারকারী নাম",
            summary: "সতর্কতা: বট ব্যবহারকারী নাম",
          },
          "uw-canvass": {
            label: "ক্যানভাসিং",
            summary: "সতর্কতা: ক্যানভাসিং",
          },
          "uw-copyright": {
            label: "কপিরাইট লঙ্ঘন",
            summary: "সতর্কতা: কপিরাইট লঙ্ঘন",
          },
          "uw-copyright-link": {
            label: "কপিরাইটযুক্ত কাজের লঙ্ঘনের সাথে সংযোগ স্থাপন করা হচ্ছে", //Linking to copyrighted works violation
            summary:
              "সতর্কতা: কপিরাইটযুক্ত কাজের লঙ্ঘনের সাথে সংযোগ স্থাপন করা হচ্ছে",
          },
          "uw-copyright-new": {
            label: "কপিরাইট নীতি লঙ্ঘন (নতুন ব্যবহারকারীদের জন্য ব্যাখ্যা সহ)",
            summary: "বিজ্ঞপ্তি: কপিরাইট সমস্যা এড়ানো",
            heading: "উইকিঅভিধান ও কপিরাইট",
          },
          "uw-efsummary": {
            label: "সম্পাদনা সারাংশে সম্পাদনা ছাঁকনি ট্রিগার করা",
            summary: "সতর্কতা: সম্পাদনা সারাংশে সম্পাদনা ছাঁকনি ট্রিগার করা",
          },
          "uw-ew": {
            label: "সম্পাদনা যুদ্ধ (শক্তিশালী শব্দ)", // Edit warring
            summary: "সতর্কতা: সম্পাদনা যুদ্ধ",
          },
          "uw-ewsoft": {
            label: "সম্পাদনা যুদ্ধ (নতুনদের জন্য নরম শব্দ)",
            summary: "সতর্কতা: সম্পাদনা যুদ্ধ",
          },
          "uw-hijacking": {
            label: "নিবন্ধ ছিনতাই", // Hijacking articles
            summary: "সতর্কতা: নিবন্ধ ছিনতাই",
          },
          "uw-hoax": {
            label: "প্রতারণা তৈরি করা", // Creating hoaxes
            summary: "সতর্কতা: প্রতারণা তৈরি করা",
          },
          "uw-legal": {
            label: "আইনি হুমকি প্রদান",
            summary: "সতর্কতা: আইনি হুমকি প্রদান",
          },
          "uw-login": {
            label: "লগ আউট অবস্থায় সম্পাদনা",
            summary: "সতর্কতা: লগ আউট অবস্থায় সম্পাদনা",
          },
          "uw-multipleIPs": {
            label: "একাধিক আইপি ব্যবহার",
            summary: "সতর্কতা: একাধিক আইপি ব্যবহার করে ধ্বংসপ্রবণতা",
          },
          "uw-pinfo": {
            label: "ব্যক্তিগত তথ্য (outing)",
            summary: "সতর্কতা: ব্যক্তিগত তথ্য",
          },
          "uw-salt": {
            label: "ভিন্ন শিরোনামের অধীনে সুরক্ষিত নিবন্ধগুলি পুনরায় তৈরি করা",
            summary:
              "বিজ্ঞপ্তি: একটি ভিন্ন শিরোনামের অধীনে সুরক্ষিত নিবন্ধগুলি পুনরায় তৈরি করা হচ্ছে",
          },
          "uw-socksuspect": {
            label: "সকপাপেট্রি",
            summary: "সতর্কতা: আপনি একজন সন্দেহভাজন [[WP:SOCK|সকপাপেট]]", // of User:...
          },
          "uw-upv": {
            label: "ব্যবহারকারী পাতা ধ্বংসপ্রবণতা",
            summary: "সতর্কতা: ব্যবহারকারী পাতা ধ্বংসপ্রবণতা",
          },
          "uw-username": {
            label: "ব্যবহারকারী নাম নীতিমালা বিরোধী",
            summary: "সতর্কতা: আপনার ব্যবহারকারী নাম সম্ভবত নীতিমালা বিরোধী",
            suppressArticleInSummary: true, // not relevant for this template
          },
          "uw-coi-username": {
            label: "ব্যবহারকারী নাম নীতিমালা বিরোধী, এবং স্বার্থের সংঘাত",
            summary: "সতর্কতা: ব্যবহারকারী নাম ও স্বার্থের সংঘাত নীতি",
            heading: "আপনার ব্যবহারকারী নাম",
          },
          "uw-userpage": {
            label: "ব্যবহারকারী পাতা বা উপপাতা নীতিমালা বিরোধী",
            summary: "সতর্কতা: ব্যবহারকারী পাতা বা উপপাতা নীতিমালা বিরোধী",
          },
        },
      };
    
      // Used repeatedly below across menu rebuilds
      Twinkle.warn.prev_article = null;
      Twinkle.warn.prev_reason = null;
      Twinkle.warn.talkpageObj = null;
    
      Twinkle.warn.callback.change_category =
        function twinklewarnCallbackChangeCategory(e) {
          var value = e.target.value;
          var sub_group = e.target.root.sub_group;
          sub_group.main_group = value;
          var old_subvalue = sub_group.value;
          var old_subvalue_re;
          if (old_subvalue) {
            if (value === "kitchensink") {
              // Exact match possible in kitchensink menu
              old_subvalue_re = new RegExp(mw.util.escapeRegExp(old_subvalue));
            } else {
              old_subvalue = old_subvalue.replace(/\d*(im)?$/, "");
              old_subvalue_re = new RegExp(
                mw.util.escapeRegExp(old_subvalue) + "(\\d*(?:im)?)$"
              );
            }
          }
    
          while (sub_group.hasChildNodes()) {
            sub_group.removeChild(sub_group.firstChild);
          }
    
          var selected = false;
          // worker function to create the combo box entries
          var createEntries = function (contents, container, wrapInOptgroup, val) {
            val = typeof val !== "undefined" ? val : value; // IE doesn't support default parameters
            // level2->2, singlewarn->''; also used to distinguish the
            // scaled levels from singlenotice, singlewarn, and custom
            var level = val.replace(/^\D+/g, "");
            // due to an apparent iOS bug, we have to add an option-group to prevent truncation of text
            // (search WT:TW archives for "Problem selecting warnings on an iPhone")
            if (wrapInOptgroup && $.client.profile().platform === "iphone") {
              var wrapperOptgroup = new Morebits.quickForm.element({
                type: "optgroup",
                label: "ব্যবহারযোগ্য টেমপ্লেটগুলো",
              });
              wrapperOptgroup = wrapperOptgroup.render();
              container.appendChild(wrapperOptgroup);
              container = wrapperOptgroup;
            }
    
            $.each(contents, function (itemKey, itemProperties) {
              // Skip if the current template doesn't have a version for the current level
              if (!!level && !itemProperties[val]) {
                return;
              }
              var key =
                typeof itemKey === "string" ? itemKey : itemProperties.value;
              var template = key + level;
    
              var elem = new Morebits.quickForm.element({
                type: "option",
                label:
                  "{{" +
                  template +
                  "}}: " +
                  (level ? itemProperties[val].label : itemProperties.label),
                value: template,
              });
    
              // Select item best corresponding to previous selection
              if (!selected && old_subvalue && old_subvalue_re.test(template)) {
                elem.data.selected = selected = true;
              }
              var elemRendered = container.appendChild(elem.render());
              $(elemRendered).data("messageData", itemProperties);
            });
          };
          var createGroup = function (warnGroup, label, wrapInOptgroup, val) {
            wrapInOptgroup =
              typeof wrapInOptgroup !== "undefined" ? wrapInOptgroup : true;
            var optgroup = new Morebits.quickForm.element({
              type: "optgroup",
              label: label,
            });
            optgroup = optgroup.render();
            sub_group.appendChild(optgroup);
            createEntries(warnGroup, optgroup, wrapInOptgroup, val);
          };
    
          switch (value) {
            case "singlenotice":
            case "singlewarn":
              createEntries(Twinkle.warn.messages[value], sub_group, true);
              break;
            case "singlecombined":
              var unSortedSinglets = $.extend(
                {},
                Twinkle.warn.messages.singlenotice,
                Twinkle.warn.messages.singlewarn
              );
              var sortedSingletMessages = {};
              Object.keys(unSortedSinglets)
                .sort()
                .forEach(function (key) {
                  sortedSingletMessages[key] = unSortedSinglets[key];
                });
              createEntries(sortedSingletMessages, sub_group, true);
              break;
            case "custom":
              createEntries(Twinkle.getPref("customWarningList"), sub_group, true);
              break;
            case "kitchensink":
              ["level1", "level2", "level3", "level4", "level4im"].forEach(
                function (lvl) {
                  $.each(
                    Twinkle.warn.messages.levels,
                    function (levelGroupLabel, levelGroup) {
                      createGroup(
                        levelGroup,
                        "Level " + lvl.slice(5) + ": " + levelGroupLabel,
                        true,
                        lvl
                      );
                    }
                  );
                }
              );
              createGroup(
                Twinkle.warn.messages.singlenotice,
                "Single-issue notices"
              );
              createGroup(
                Twinkle.warn.messages.singlewarn,
                "Single-issue warnings"
              );
              createGroup(Twinkle.getPref("customWarningList"), "Custom warnings");
              break;
            case "level1":
            case "level2":
            case "level3":
            case "level4":
            case "level4im":
              // Creates subgroup regardless of whether there is anything to place in it;
              // leaves "Removal of deletion tags" empty for 4im
              $.each(
                Twinkle.warn.messages.levels,
                function (groupLabel, groupContents) {
                  createGroup(groupContents, groupLabel, false);
                }
              );
              break;
            case "autolevel":
              // Check user page to determine appropriate level
              var autolevelProc = function () {
                var wikitext = Twinkle.warn.talkpageObj.getPageText();
                // history not needed for autolevel
                var latest = Twinkle.warn.callbacks.dateProcessing(wikitext)[0];
                // Pseudo-params with only what's needed to parse the level i.e. no messageData
                var params = {
                  sub_group: old_subvalue,
                  article: e.target.root.article.value,
                };
                var lvl =
                  "level" +
                  Twinkle.warn.callbacks.autolevelParseWikitext(
                    wikitext,
                    params,
                    latest
                  )[1];
    
                // Identical to level1, etc. above but explicitly provides the level
                $.each(
                  Twinkle.warn.messages.levels,
                  function (groupLabel, groupContents) {
                    createGroup(groupContents, groupLabel, false, lvl);
                  }
                );
    
                // Trigger subcategory change, add select menu, etc.
                Twinkle.warn.callback.postCategoryCleanup(e);
              };
    
              if (Twinkle.warn.talkpageObj) {
                autolevelProc();
              } else {
                var usertalk_page = new Morebits.wiki.page(
                  "ব্যবহারকারী_আলাপ:" + mw.config.get("wgRelevantUserName"),
                  "পূর্ববর্তী সতর্কবার্তাসমূহ লোড হচ্ছে।"
                );
                usertalk_page.setFollowRedirect(true, false);
                usertalk_page.load(
                  function (pageobj) {
                    Twinkle.warn.talkpageObj = pageobj; // Update talkpageObj
                    autolevelProc();
                  },
                  function () {
                    // Catch and warn if the talkpage can't load,
                    // most likely because it's a cross-namespace redirect
                    // Supersedes the typical $autolevelMessage added in autolevelParseWikitext
                    var $noTalkPageNode = $("<strong/>", {
                      text: "ব্যবহারকারীর আলাপ পাতা লোড হচ্ছে না; এটি একটি ক্রস-নেমস্পেসের পুনঃনির্দেশ হতে পারে। স্বয়ংক্রিয় লেভেল সনাক্তকরণ সম্ভব নয়।",
                      id: "twinkle-warn-autolevel-message",
                      css: { color: "red" },
                    });
                    $noTalkPageNode.insertBefore(
                      $("#twinkle-warn-warning-messages")
                    );
                    // If a preview was opened while in a different mode, close it
                    // Should nullify the need to catch the error in preview callback
                    e.target.root.previewer.closePreview();
                  }
                );
              }
              break;
            default:
              alert("টুইংকেল সতর্কীকরণে অজানা সতর্কীকরণ গ্রুপ");
              break;
          }
    
          // Trigger subcategory change, add select menu, etc.
          // Here because of the async load for autolevel
          if (value !== "autolevel") {
            // reset any autolevel-specific messages while we're here
            $("#twinkle-warn-autolevel-message").remove();
    
            Twinkle.warn.callback.postCategoryCleanup(e);
          }
        };
    
      Twinkle.warn.callback.postCategoryCleanup =
        function twinklewarnCallbackPostCategoryCleanup(e) {
          // clear overridden label on article textbox
          Morebits.quickForm.setElementTooltipVisibility(
            e.target.root.article,
            true
          );
          Morebits.quickForm.resetElementLabel(e.target.root.article);
          // Trigger custom label/change on main category change
          Twinkle.warn.callback.change_subcategory(e);
    
          // Use select2 to make the select menu searchable
          if (!Twinkle.getPref("oldSelect")) {
            $("select[name=sub_group]")
              .select2({
                width: "100%",
                matcher: Morebits.select2.matchers.optgroupFull,
                templateResult: Morebits.select2.highlightSearchMatches,
                language: {
                  searching: Morebits.select2.queryInterceptor,
                },
              })
              .change(Twinkle.warn.callback.change_subcategory);
    
            $(".select2-selection").keydown(Morebits.select2.autoStart).focus();
    
            mw.util.addCSS(
              // Increase height
              ".select2-container .select2-dropdown .select2-results > .select2-results__options { max-height: 350px; }" +
                // Reduce padding
                ".select2-results .select2-results__option { padding-top: 1px; padding-bottom: 1px; }" +
                ".select2-results .select2-results__group { padding-top: 1px; padding-bottom: 1px; } " +
                // Adjust font size
                ".select2-container .select2-dropdown .select2-results { font-size: 13px; }" +
                ".select2-container .selection .select2-selection__rendered { font-size: 13px; }"
            );
          }
        };
    
      Twinkle.warn.callback.change_subcategory =
        function twinklewarnCallbackChangeSubcategory(e) {
          var main_group = e.target.form.main_group.value;
          var value = e.target.form.sub_group.value;
    
          // Tags that don't take a linked article, but something else (often a username).
          // The value of each tag is the label next to the input field
          var notLinkedArticle = {
            "uw-agf-sock":
              "অন্য অ্যাকাউন্টের ঐচ্ছিক ব্যবহারকারীর নাম ('ব্যবহারকারী:' ছাড়া) ",
            "uw-bite":
              "'দংশিত' ব্যবহারকারীর ব্যবহারকারীর নাম ('ব্যবহারকারী:' ছাড়া) ",
            "uw-socksuspect":
              "সক মাস্টারের ব্যবহারকারী নাম, যদি জানা থাকে ('ব্যবহারকারী:' ছাড়া) ",
            "uw-username": "ব্যবহারকারী নাম নীতিমালা ভঙ্গ করে কারণ... ",
            "uw-aiv":
              "ঐচ্ছিক ব্যবহারকারীর নাম যেটি রিপোর্ট করা হয়েছে ('ব্যবহারকারী:' ছাড়া) ",
          };
    
          if (
            ["singlenotice", "singlewarn", "singlecombined", "kitchensink"].indexOf(
              main_group
            ) !== -1
          ) {
            if (notLinkedArticle[value]) {
              if (Twinkle.warn.prev_article === null) {
                Twinkle.warn.prev_article = e.target.form.article.value;
              }
              e.target.form.article.notArticle = true;
              e.target.form.article.value = "";
    
              // change form labels according to the warning selected
              Morebits.quickForm.setElementTooltipVisibility(
                e.target.form.article,
                false
              );
              Morebits.quickForm.overrideElementLabel(
                e.target.form.article,
                notLinkedArticle[value]
              );
            } else if (e.target.form.article.notArticle) {
              if (Twinkle.warn.prev_article !== null) {
                e.target.form.article.value = Twinkle.warn.prev_article;
                Twinkle.warn.prev_article = null;
              }
              e.target.form.article.notArticle = false;
              Morebits.quickForm.setElementTooltipVisibility(
                e.target.form.article,
                true
              );
              Morebits.quickForm.resetElementLabel(e.target.form.article);
            }
          }
    
          // add big red notice, warning users about how to use {{uw-[coi-]username}} appropriately
          $("#tw-warn-red-notice").remove();
          var $redWarning;
          if (value === "uw-username") {
            $redWarning = $(
              "<div style='color: red;' id='tw-warn-red-notice'>{{uw-username}} <b>যথাযথ</b> কারণসহ ব্যবহার করুন।</div>"
            );
    
            $redWarning.insertAfter(
              Morebits.quickForm.getElementLabelObject(e.target.form.reasonGroup)
            );
          } else if (value === "uw-coi-username") {
            $redWarning = $(
              "<div style='color: red;' id='tw-warn-red-notice'>{{uw-coi-username}} <b>যথাযথ</b> কারণসহ ব্যবহার করুন।</div>"
            );
            $redWarning.insertAfter(
              Morebits.quickForm.getElementLabelObject(e.target.form.reasonGroup)
            );
          }
        };
    
      Twinkle.warn.callbacks = {
        getWarningWikitext: function (templateName, article, reason, isCustom) {
          var text = "{{subst:" + templateName;
          // add linked article for user warnings
          if (article) {
            // c&pmove has the source as the first parameter
            if (templateName === "uw-c&pmove") {
              text += "|to=" + article;
            } else {
              text += "|1=" + article;
            }
          }
          if (reason && !isCustom) {
            // add extra message
            if (
              templateName === "uw-csd" ||
              templateName === "uw-probation" ||
              templateName === "uw-userspacenoindex" ||
              templateName === "uw-userpage"
            ) {
              text += "|3=''" + reason + "''";
            } else {
              text += "|2=''" + reason + "''";
            }
          }
          text += "}}";
    
          if (reason && isCustom) {
            // we assume that custom warnings lack a {{{2}}} parameter
            text += " ''" + reason + "''";
          }
    
          return text + " ~~~~";
        },
        showPreview: function (form, templatename) {
          var input = Morebits.quickForm.getInputData(form);
          // Provided on autolevel, not otherwise
          templatename = templatename || input.sub_group;
          var linkedarticle = input.article;
          var templatetext;
    
          templatetext = Twinkle.warn.callbacks.getWarningWikitext(
            templatename,
            linkedarticle,
            input.reason,
            input.main_group === "custom"
          );
    
          form.previewer.beginRender(
            templatetext,
            "ব্যবহারকারী_আলাপ:" + mw.config.get("wgRelevantUserName")
          ); // Force wikitext/correct username
        },
        // Just a pass-through unless the autolevel option was selected
        preview: function (form) {
          if (form.main_group.value === "autolevel") {
            // Always get a new, updated talkpage for autolevel processing
            var usertalk_page = new Morebits.wiki.page(
              "ব্যবহারকারী_আলাপ:" + mw.config.get("wgRelevantUserName"),
              "পূর্ববর্তী সতর্কবার্তা গুলো লোড হচ্ছে।"
            );
            usertalk_page.setFollowRedirect(true, false);
            // Will fail silently if the talk page is a cross-ns redirect,
            // removal of the preview box handled when loading the menu
            usertalk_page.load(function (pageobj) {
              Twinkle.warn.talkpageObj = pageobj; // Update talkpageObj
    
              var wikitext = pageobj.getPageText();
              // history not needed for autolevel
              var latest = Twinkle.warn.callbacks.dateProcessing(wikitext)[0];
              var params = {
                sub_group: form.sub_group.value,
                article: form.article.value,
                messageData: $(form.sub_group)
                  .find('option[value="' + $(form.sub_group).val() + '"]')
                  .data("messageData"),
              };
              var template = Twinkle.warn.callbacks.autolevelParseWikitext(
                wikitext,
                params,
                latest
              )[0];
              Twinkle.warn.callbacks.showPreview(form, template);
    
              // If the templates have diverged, fake a change event
              // to reload the menu with the updated pageobj
              if (form.sub_group.value !== template) {
                var evt = document.createEvent("Event");
                evt.initEvent("change", true, true);
                form.main_group.dispatchEvent(evt);
              }
            });
          } else {
            Twinkle.warn.callbacks.showPreview(form);
          }
        },
        /**
         * Used in the main and autolevel loops to determine when to warn
         * about excessively recent, stale, or identical warnings.
         * @param {string} wikitext  The text of a user's talk page, from getPageText()
         * @returns {Object[]} - Array of objects: latest contains most recent
         * warning and date; history lists all prior warnings
         */
        dateProcessing: function (wikitext) {
          var history_re =
            /<!--\s?Template:([uU]w-.*?)\s?-->.*?(\d{1,2}:\d{1,2}, \d{1,2} \w+ \d{4} \(UTC\))/g;
          var history = {};
          var latest = { date: new Morebits.date(0), type: "" };
          var current;
    
          while ((current = history_re.exec(wikitext)) !== null) {
            var template = current[1],
              current_date = new Morebits.date(current[2]);
            if (
              !(template in history) ||
              history[template].isBefore(current_date)
            ) {
              history[template] = current_date;
            }
            if (!latest.date.isAfter(current_date)) {
              latest.date = current_date;
              latest.type = template;
            }
          }
          return [latest, history];
        },
        /**
         * Main loop for deciding what the level should increment to. Most of
         * this is really just error catching and updating the subsequent data.
         * May produce up to two notices in a twinkle-warn-autolevel-messages div
         *
         * @param {string} wikitext  The text of a user's talk page, from getPageText() (required)
         * @param {Object} params  Params object: sub_group is the template (required);
         * article is the user-provided article (form.article) used to link ARV on recent level4 warnings;
         * messageData is only necessary if getting the full template, as it's
         * used to ensure a valid template of that level exists
         * @param {Object} latest  First element of the array returned from
         * dateProcessing. Provided here rather than processed within to avoid
         * repeated call to dateProcessing
         * @param {(Date|Morebits.date)} date  Date from which staleness is determined
         * @param {Morebits.status} statelem  Status element, only used for handling error in final execution
         *
         * @returns {Array} - Array that contains the full template and just the warning level
         */
        autolevelParseWikitext: function (
          wikitext,
          params,
          latest,
          date,
          statelem
        ) {
          var level; // undefined rather than '' means the isNaN below will return true
          if (/\d(?:im)?$/.test(latest.type)) {
            // level1-4im
            level = parseInt(latest.type.replace(/.*(\d)(?:im)?$/, "$1"), 10);
          } else if (latest.type) {
            // Non-numbered warning
            // Try to leverage existing categorization of
            // warnings, all but one are universally lowercased
            var loweredType = /uw-multipleIPs/i.test(latest.type)
              ? "uw-multipleIPs"
              : latest.type.toLowerCase();
            // It would be nice to account for blocks, but in most
            // cases the hidden message is terminal, not the sig
            if (Twinkle.warn.messages.singlewarn[loweredType]) {
              level = 3;
            } else {
              level = 1; // singlenotice or not found
            }
          }
    
          var $autolevelMessage = $("<div/>", {
            id: "twinkle-warn-autolevel-message",
          });
    
          if (isNaN(level)) {
            // No prior warnings found, this is the first
            level = 1;
          } else if (level > 4 || level < 1) {
            // Shouldn't happen
            var message =
              "পূর্ববর্তী সতর্কতা স্তর পার্স করতে অক্ষম, দয়া করে হাত দ্বারা একটি সতর্কতা স্তর নির্বাচন করুন৷";
            if (statelem) {
              statelem.error(message);
            } else {
              alert(message);
            }
            return;
          } else {
            date = date || new Date();
            var autoTimeout = new Morebits.date(latest.date.getTime()).add(
              parseInt(Twinkle.getPref("autolevelStaleDays"), 10),
              "days"
            );
            if (autoTimeout.isAfter(date)) {
              if (level === 4) {
                level = 4;
                // Basically indicates whether we're in the final Main evaluation or not,
                // and thus whether we can continue or need to display the warning and link
                if (!statelem) {
                  var $link = $("<a/>", {
                    href: "#",
                    text: "ARV টুলটি চালু করতে এখানে ক্লিক করুন।",
                    css: { fontWeight: "bold" },
                    click: function () {
                      Morebits.wiki.actionCompleted.redirect = null;
                      Twinkle.warn.dialog.close();
                      Twinkle.arv.callback(mw.config.get("wgRelevantUserName"));
                      $("input[name=page]").val(params.article); // Target page
                      $("input[value=final]").prop("checked", true); // Vandalism after final
                    },
                  });
                  var statusNode = $("<div/>", {
                    text:
                      mw.config.get("wgRelevantUserName") +
                      " সম্প্রতি চতুর্থ স্তরের সতর্কতা বার্তা পেয়েছেন (" +
                      latest.type +
                      ") তাই সম্ভবত অভিযোগ করা ভালো হবে; ",
                    css: { color: "red" },
                  });
                  statusNode.append($link[0]);
                  $autolevelMessage.append(statusNode);
                }
              } else {
                // Automatically increase severity
                level += 1;
              }
            } else {
              // Reset warning level if most-recent warning is too old
              level = 1;
            }
          }
    
          $autolevelMessage.prepend(
            $(
              '<div>একটা ইস্যু সৃষ্টি করবে যা, <span style="font-weight: bold;">লেভেল ' +
                level +
                "</span> টেমপ্লেটে।</div>"
            )
          );
          // Place after the stale and other-user-reverted (text-only) messages
          $("#twinkle-warn-autolevel-message").remove(); // clean slate
          $autolevelMessage.insertAfter($("#twinkle-warn-warning-messages"));
    
          var template = params.sub_group.replace(/(.*)\d$/, "$1");
          // Validate warning level, falling back to the uw-generic series.
          // Only a few items are missing a level, and in all but a handful
          // of cases, the uw-generic series is explicitly used elsewhere per WP:UTM.
          if (params.messageData && !params.messageData["level" + level]) {
            template = "uw-generic";
          }
          template += level;
    
          return [template, level];
        },
        main: function (pageobj) {
          var text = pageobj.getPageText();
          var statelem = pageobj.getStatusElement();
          var params = pageobj.getCallbackParameters();
          var messageData = params.messageData;
    
          // JS somehow didn't get destructured assignment until ES6 so of course IE doesn't support it
          var warningHistory = Twinkle.warn.callbacks.dateProcessing(text);
          var latest = warningHistory[0];
          var history = warningHistory[1];
    
          var now = new Morebits.date(pageobj.getLoadTime());
    
          Twinkle.warn.talkpageObj = pageobj; // Update talkpageObj, just in case
          if (params.main_group === "autolevel") {
            // [template, level]
            var templateAndLevel = Twinkle.warn.callbacks.autolevelParseWikitext(
              text,
              params,
              latest,
              now,
              statelem
            );
    
            // Only if there's a change from the prior display/load
            if (
              params.sub_group !== templateAndLevel[0] &&
              !confirm(
                "{{" +
                  templateAndLevel[0] +
                  "}} টেমপ্লেটটি ব্যবহারকারীর জন্য একটি ইস্যু তৈরি করবে, ঠিক আছে?"
              )
            ) {
              statelem.error("ব্যবহারকারীর অনুরোধে বাতিল করা হয়েছে");
              return;
            }
            // Update params now that we've selected a warning
            params.sub_group = templateAndLevel[0];
            messageData = params.messageData["level" + templateAndLevel[1]];
          } else if (params.sub_group in history) {
            if (
              new Morebits.date(history[params.sub_group])
                .add(1, "day")
                .isAfter(now)
            ) {
              if (
                !confirm(
                  "An identical " +
                    params.sub_group +
                    " গত ২৪ ঘন্টায় ইস্যুগুলো হয়েছে।  \nআপনি কি এখনও এই সতর্কবার্তা/বিজ্ঞপ্তি যোগ করতে চান?"
                )
              ) {
                statelem.error("ব্যবহারকারীর অনুরোধে বাতিল করা হয়েছে");
                return;
              }
            }
          }
    
          latest.date.add(1, "minute"); // after long debate, one minute is max
    
          if (latest.date.isAfter(now)) {
            if (
              !confirm(
                "একটি ইস্যু" +
                  latest.type +
                  " শেষ মিনিটে উত্থাপিত হয়েছে। \nআপনি কি এখনও এই সতর্কবার্তা/বিজ্ঞপ্তি যোগ করতে চান?"
              )
            ) {
              statelem.error("aborted per user request");
              return;
            }
          }
    
          // build the edit summary
          // Function to handle generation of summary prefix for custom templates
          var customProcess = function (template) {
            template = template.split("|")[0];
            var prefix;
            switch (template.substr(-1)) {
              case "1":
                prefix = "সাধারণ মন্তব্য";
                break;
              case "2":
                prefix = "সতর্কবার্তা";
                break;
              case "3":
                prefix = "সতর্কবার্তা";
                break;
              case "4":
                prefix = "সর্বশেষ সতর্কবার্তা";
                break;
              case "m":
                if (template.substr(-3) === "4im") {
                  prefix = "একমাত্র সতর্কবার্তা";
                  break;
                }
              // falls through
              default:
                prefix = "বিজ্ঞপ্তি";
                break;
            }
            return (
              prefix +
              ": " +
              Morebits.string.toUpperCaseFirstChar(messageData.label)
            );
          };
    
          var summary;
          if (params.main_group === "custom") {
            summary = customProcess(params.sub_group);
          } else {
            // Normalize kitchensink to the 1-4im style
            if (
              params.main_group === "kitchensink" &&
              !/^D+$/.test(params.sub_group)
            ) {
              var sub = params.sub_group.substr(-1);
              if (sub === "m") {
                sub = params.sub_group.substr(-3);
              }
              // Don't overwrite uw-3rr, technically unnecessary
              if (/\d/.test(sub)) {
                params.main_group = "level" + sub;
              }
            }
            // singlet || level1-4im, no need to /^\D+$/.test(params.main_group)
            summary =
              messageData.summary ||
              (messageData[params.main_group] &&
                messageData[params.main_group].summary);
            // Not in Twinkle.warn.messages, assume custom template
            if (!summary) {
              summary = customProcess(params.sub_group);
            }
            if (messageData.suppressArticleInSummary !== true && params.article) {
              if (
                params.sub_group === "uw-agf-sock" ||
                params.sub_group === "uw-socksuspect" ||
                params.sub_group === "uw-aiv"
              ) {
                // these templates require a username
                summary += " [[:ব্যাবহারকারী:" + params.article + "]] পাতায়";
              } else {
                summary += " [[:" + params.article + "]] পাতায়";
              }
            }
          }
    
          pageobj.setEditSummary(summary + "।");
          pageobj.setChangeTags(Twinkle.changeTags);
          pageobj.setWatchlist(Twinkle.getPref("watchWarnings"));
    
          // Get actual warning text
          var warningText = Twinkle.warn.callbacks.getWarningWikitext(
            params.sub_group,
            params.article,
            params.reason,
            params.main_group === "custom"
          );
          if (
            Twinkle.getPref("showSharedIPNotice") &&
            mw.util.isIPAddress(mw.config.get("wgTitle"))
          ) {
            Morebits.status.info(
              "তথ্য",
              "একটি শেয়ার করা আইপি নোটিশ যোগ করা হচ্ছে।"
            );
            warningText += "\n{{subst:Shared IP advice}}";
          }
    
          var sectionExists = false,
            sectionNumber = 0;
          // Only check sections if there are sections or there's a chance we won't create our own
          if (!messageData.heading && text.length) {
            // Get all sections
            var sections = text.match(/^(==*).+\1/gm);
            if (sections && sections.length !== 0) {
              // Find the index of the section header in question
              var dateHeaderRegex = now.monthHeaderRegex();
              sectionNumber = 0;
              // Find this month's section among L2 sections, preferring the bottom-most
              sectionExists = sections.reverse().some(function (sec, idx) {
                return (
                  /^(==)[^=].+\1/m.test(sec) &&
                  dateHeaderRegex.test(sec) &&
                  typeof (sectionNumber = sections.length - 1 - idx) === "number"
                );
              });
            }
          }
    
          if (sectionExists) {
            // append to existing section
            pageobj.setPageSection(sectionNumber + 1);
            pageobj.setAppendText("\n\n" + warningText);
            pageobj.append();
          } else {
            if (messageData.heading) {
              // create new section
              pageobj.setNewSectionTitle(messageData.heading);
            } else {
              Morebits.status.info(
                "তথ্য",
                "যেহেতু কিছুই পাওয়া যায় নি, তাই এই মাসের জন্য নতুন অনুচ্ছেদ তৈরি করা হবে"
              );
              pageobj.setNewSectionTitle(now.monthHeader(0));
            }
            pageobj.setNewSectionText(warningText);
            pageobj.newSection();
          }
        },
      };
    
      Twinkle.warn.callback.evaluate = function twinklewarnCallbackEvaluate(e) {
        var userTalkPage =
          "ব্যবহারকারী_আলাপ:" + mw.config.get("wgRelevantUserName");
    
        // reason, main_group, sub_group, article
        var params = Morebits.quickForm.getInputData(e.target);
    
        // Check that a reason was filled in if uw-username was selected
        if (params.sub_group === "uw-username" && !params.article) {
          alert(
            "{{uw-username}} এই টেমপ্লেটি ব্যবহারের জন্য আপনাকে সঠিক কারণ দর্শাতে হবে।"
          );
          return;
        }
    
        // The autolevel option will already know by now if a user talk page
        // is a cross-namespace redirect (via !!Twinkle.warn.talkpageObj), so
        // technically we could alert an error here, but the user will have
        // already ignored the bold red error above.  Moreover, they probably
        // *don't* want to actually issue a warning, so the error handling
        // after the form is submitted is probably preferable
    
        // Find the selected <option> element so we can fetch the data structure
        var $selectedEl = $(e.target.sub_group).find(
          'option[value="' + $(e.target.sub_group).val() + '"]'
        );
        params.messageData = $selectedEl.data("messageData");
    
        Morebits.simpleWindow.setButtonsEnabled(false);
        Morebits.status.init(e.target);
    
        Morebits.wiki.actionCompleted.redirect = userTalkPage;
        Morebits.wiki.actionCompleted.notice =
          "সতর্কবার্তা প্রদান করা হয়েছে, কয়েক সেকেন্ডের মধ্যে আলাপ পাতা পুনঃলোড করা হবে";
    
        var wikipedia_page = new Morebits.wiki.page(
          userTalkPage,
          "আলাপ পাতা পরিবর্তন"
        );
        wikipedia_page.setCallbackParameters(params);
        wikipedia_page.setFollowRedirect(true, false);
        wikipedia_page.load(Twinkle.warn.callbacks.main);
      };
    
      Twinkle.addInitCallback(Twinkle.warn, "warn");
    })(jQuery);
    
    // </nowiki>