Gadget-twinklewarn-2020.js
// (function($) { /* **************************************** *** twinklewarn.js: Warn module **************************************** * Mode of invocation: Tab ("Warn") * Active on: Any page with relevant user name (userspace, contribs, * etc.), as well as the rollback success page */ Twinkle.warn = function twinklewarn() { if (mw.config.get('wgRelevantUserName')) { Twinkle.addPortletLink(Twinkle.warn.callback, 'هشدار', 'tw-warn', 'هشدار/اعلان به کاربر'); // localized 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', 'در صورت صلاحدید، میتوانید از توینکل برای هشدار به کاربر دربارهٔ ویرایشهایش در این صفحه استفاده کنید.')); // localized // 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('شما در حال هشدار به خودتان هستید! آیا از انجام این کار مطمئن هستید؟')) { // localized return; } var dialog; Twinkle.warn.dialog = new Morebits.simpleWindow(600, 440); dialog = Twinkle.warn.dialog; dialog.setTitle('هشدار/اعلان به کاربر'); // localized dialog.setScriptName('توینکل'); // localized dialog.addFooterLink('انتخاب سطح هشدار', 'en:WP:UWUL#Levels'); // localized dialog.addFooterLink('راهنمای توینکل', 'en:WP:TW/DOC#warn'); // localized var form = new Morebits.quickForm(Twinkle.warn.callback.evaluate); var main_select = form.append({ type: 'field', label: 'نوع هشدار/اعلان برای این مشکل را انتخاب کنید', // localized tooltip: 'ابتدا گروه اصلی هشدار، و سپس یک هشدار اختصاصی برای این مشکل را انتحاب کنید.' // localized }); var main_group = main_select.append({ type: 'select', name: 'main_group', event: Twinkle.warn.callback.change_category }); var defaultGroup = parseInt(Twinkle.getPref('defaultWarningGroup'), 10); main_group.append({ type: 'option', label: '۱: یادداشت عمومی', value: 'level1', selected: defaultGroup === 1 }); // localized main_group.append({ type: 'option', label: '۲: اخطار', value: 'level2', selected: defaultGroup === 2 }); // localized main_group.append({ type: 'option', label: '۳: هشدار', value: 'level3', selected: defaultGroup === 3 }); // localized main_group.append({ type: 'option', label: '۴: آخرین هشدار', value: 'level4', selected: defaultGroup === 4 }); // localized main_group.append({ type: 'option', label: 'فوری: تنها هشدار', value: 'level4im', selected: defaultGroup === 5 }); // localized if (Twinkle.getPref('combinedSingletMenus')) { main_group.append({ type: 'option', label: 'پیامها دربارهٔ یک مشکل واحد', value: 'singlecombined', selected: defaultGroup === 6 || defaultGroup === 7 }); // localized } else { main_group.append({ type: 'option', label: 'اعلانها دربارهٔ یک مشکل واحد', value: 'singlenotice', selected: defaultGroup === 6 }); // localized main_group.append({ type: 'option', label: 'هشدارها دربارهٔ یک مشکل واحد', value: 'singlewarn', selected: defaultGroup === 7 }); // localized } if (Twinkle.getPref('customWarningList').length) { main_group.append({ type: 'option', label: 'هشدارهای سفارشی', value: 'custom', selected: defaultGroup === 9 }); // localized } main_group.append({ type: 'option', label: 'تمام الگوهای هشدار', value: 'kitchensink', selected: defaultGroup === 10 }); // localized main_group.append({ type: 'option', label: 'انتخاب خودکار هشدار خرابکاری (سطح ۱-۴)', value: 'autolevel', selected: defaultGroup === 11 }); // localized 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: 'صفحهٔ پیوند دادهشده', // localized value: mw.util.getParamValue('vanarticle') || '', tooltip: 'میتوان یک صفحه را از درون اعلان پیوند داد، شاید به این دلیل که این اعلان بهواسطهٔ یک خنثیسازی در صفحهٔ مذکور ارسال شدهاست. برای اینکه پیوندی داده نشود، این جعبه را خالی بگذارید.' // localized }); form.append({ type: 'div', label: '', style: 'color: red', id: 'twinkle-warn-revert-messages' }); 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' }; new Morebits.wiki.api('بررسی این که واگردانی شما در این صفحه موفق بود یا نه', query, function(apiobj) { // localized var revertUser = $(apiobj.getResponse()).find('revisions rev')[1].getAttribute('user'); if (revertUser && revertUser !== mw.config.get('wgUserName')) { message += ' کس دیگری این صفحه را واگردانی کردهاست و ممکن است به کاربر نیز هشدار دادهباشد.'; // localized $('#twinkle-warn-revert-messages').text('Note:' + message); } }).post(); } // Confirm edit wasn't too old for a warning query = { action: 'query', prop: 'revisions', rvprop: 'timestamp', revids: vanrevid }; new Morebits.wiki.api('گرفتن برچسب زمان نسخهها', query, function(apiobj) { // localized var vantimestamp = $(apiobj.getResponse()).find('revisions rev').attr('timestamp'); var revDate = new Morebits.date(vantimestamp); if (vantimestamp && revDate.isValid()) { if (revDate.add(24, 'hours').isBefore(new Date())) { message += ' این ویرایش بیشتر از ۲۴ ساعت پیش انجام شدهاست و ممکن است نیازی به هشدار نباشد.'; // localized $('#twinkle-warn-revert-messages').text('Note:' + message); } } }).post(); } var more = form.append({ type: 'field', name: 'reasonGroup', label: 'Warning information' }); more.append({ type: 'textarea', label: 'پیام اختیاری:', name: 'reason', tooltip: 'شاید لازم باشد یک دلیل یا یک اعلان با جزئیات بیشتر اضافه شود' }); // localized var previewlink = document.createElement('a'); $(previewlink).click(function() { Twinkle.warn.callbacks.preview(result); // |result| is defined below }); previewlink.style.cursor = 'pointer'; previewlink.textContent = 'پیشنمایش'; // localized more.append({ type: 'div', id: 'warningpreview', label: [ previewlink ] }); more.append({ type: 'div', id: 'twinklewarn-previewbox', style: 'display: none' }); more.append({ type: 'submit', label: 'ثبت' }); // localized 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]); // 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 ". $summaryAd" // 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: { 'هشدارهای رایج': { // localized 'هبک-خرابکاری': { // localized level1: { label: 'خرابکاری', // localized summary: 'یادداشت عمومی: ویرایش غیرسازنده' // localized }, level2: { label: 'خرابکاری', // localized summary: 'اخطار: ویرایش غیرسازنده' // localized }, level3: { label: 'خرابکاری', // localized summary: 'هشدار: خرابکاری' // localized }, level4: { label: 'خرابکاری', // localized summary: 'آخرین هشدار: خرابکاری' // localized }, level4im: { label: 'Vandalism', // localized summary: 'تنها هشدار: خرابکاری' // localized } }, 'uw-disruptive': { level1: { label: 'ویرایش اخلالگرانه', // localized summary: 'یادداشت عمومی: ویرایش غیرسازنده' // localized }, level2: { label: 'ویرایش اخلالگرانه', // localized summary: 'اخطار: ویرایش غیرسازنده' // localized }, level3: { label: 'ویرایش اخلالگرانه', // localized summary: 'هشدار: ویرایش اخلالگرانه' // localized } }, 'uw-test': { level1: { label: 'ویرایش آزمایشی', // localized summary: 'یادداشت عمومی: ویرایش آزمایشی' // localized }, level2: { label: 'ویرایش آزمایشی', // localized summary: 'اخطار: ویرایش آزمایشی' // localized }, level3: { label: 'ویرایش آزمایشی', // localized summary: 'هشدار: ویرایش آزمایشی' // localized } }, 'هبک-حذف': { // localized level1: { label: 'حذف محتوا، خالی کردن', // localized summary: 'یادداشت عمومی: حذف محتوا، خالی کردن' // localized }, level2: { label: 'حذف محتوا، خالی کردن', // localized summary: 'اخطار: حذف محتوا، خالی کردن' // localized }, level3: { label: 'حذف محتوا، خالی کردن', // localized summary: 'هشدار: حذف محتوا، خالی کردن' // localized }, level4: { label: 'حذف محتوا، خالی کردن', // localized summary: 'آخرین هشدار: حذف محتوا، خالی کردن' // localized }, level4im: { label: 'حذف محتوا، خالی کردن', // localized summary: 'تنها هشدار: حذف محتوا، خالی کردن' // localized } }, 'uw-generic': { level4: { label: 'هشدار کلی (برای مجموعه الگوهایی که سطح ۴ را ندارند)', // localized summary: 'اعلان آخرین هشدار' // localized } } }, 'رفتار در مقالهها': { // localized 'uw-biog': { level1: { label: 'افزودن اطلاعات بحثبرانگیز بدون منبع دربارهٔ افراد زنده', // localized summary: 'یادداشت عمومی: افزودن اطلاعات بحثبرانگیز بدون منبع دربارهٔ افراد زنده' // localized }, level2: { label: 'افزودن اطلاعات بحثبرانگیز بدون منبع دربارهٔ افراد زنده', // localized summary: 'اخطار: افزودن اطلاعات بحثبرانگیز بدون منبع دربارهٔ افراد زنده' // localized }, level3: { label: 'افزودن اطلاعات بحثبرانگیز/افتراآمیز بدون منبع دربارهٔ افراد زنده', // localized summary: 'هشدار: افزودن اطلاعات بحثبرانگیز بدون منبع دربارهٔ افراد زنده' // localized }, level4: { label: 'افزودن اطلاعات افتراآمیز بدون منبع دربارهٔ افراد زنده', // localized summary: 'آخرین هشدار: افزودن اطلاعات بحثبرانگیز بدون منبع دربارهٔ افراد زنده' // localized }, level4im: { label: 'افزودن اطلاعات افتراآمیز بدون منبع دربارهٔ افراد زنده', // localized summary: 'تنها هشدار: افزودن اطلاعات بحثبرانگیز بدون منبع دربارهٔ افراد زنده' // localized } }, 'uw-defamatory': { level1: { label: 'افزودن محتوای افتراآمیز', // localized summary: 'یادداشت عمومی: افزودن محتوای افتراآمیز' // localized }, level2: { label: 'افزودن محتوای افتراآمیز', // localized summary: 'اخطار: افزودن محتوای افتراآمیز' // localized }, level3: { label: 'افزودن محتوای افتراآمیز', // localized summary: 'هشدار: افزودن محتوای افتراآمیز' // localized }, level4: { label: 'افزودن محتوای افتراآمیز', // localized summary: 'آخرین هشدار: افزودن محتوای افتراآمیز' // localized }, level4im: { label: 'افزودن محتوای افتراآمیز', // localized summary: 'تنها هشدار: افزودن محتوای افتراآمیز' // localized } }, 'uw-error': { level1: { label: 'وارد کردن عمدی اطلاعات غلط به مقاله', // localized summary: 'یادداشت عمومی: وارد کردن عمدی اطلاعات غلط به مقاله' // localized }, level2: { label: 'وارد کردن عمدی اطلاعات غلط به مقاله', // localized summary: 'اخطار: وارد کردن عمدی اطلاعات غلط به مقاله' // localized }, level3: { label: 'وارد کردن عمدی اطلاعات غلط به مقاله', // localized summary: 'هشدار: وارد کردن عمدی اطلاعات غلط به مقاله' // localized }, level4: { label: 'وارد کردن عمدی اطلاعات غلط به مقاله', // localized summary: 'آخرین هشدار: وارد کردن عمدی اطلاعات غلط به مقاله' // localized } }, 'uw-genre': { level1: { label: 'تغییر مکرر یا عمده در ژانرها بدون اجماع یا ارجاع', // localized summary: 'یادداشت عمومی: تغییر مکرر یا عمده در ژانرها بدون اجماع یا ارجاع' // localized }, level2: { label: 'تغییر مکرر یا عمده در ژانرها بدون اجماع یا ارجاع', // localized summary: 'اخطار: تغییر مکرر یا عمده در ژانرها بدون اجماع یا ارجاع' // localized }, level3: { label: 'تغییر مکرر یا عمده در ژانرها بدون اجماع یا ارجاع', // localized summary: 'هشدار: تغییر مکرر یا عمده در ژانرها بدون اجماع یا ارجاع' // localized }, level4: { label: 'تغییر مکرر یا عمده در ژانرها بدون اجماع یا ارجاع', // localized summary: 'آخرین هشدار: تغییر مکرر یا عمده در ژانرها بدون اجماع یا ارجاع' // localized } }, 'uw-image': { level1: { label: 'خرابکاری مرتبط با تصاویر در مقالهها', // localized summary: 'یادداشت عمومی: خرابکاری مرتبط با تصاویر در مقالهها' // localized }, level2: { label: 'خرابکاری مرتبط با تصاویر در مقالهها', // localized summary: 'اخطار: خرابکاری مرتبط با تصاویر در مقالهها' // localized }, level3: { label: 'خرابکاری مرتبط با تصاویر در مقالهها', // localized summary: 'هشدار: خرابکاری مرتبط با تصاویر در مقالهها' // localized }, level4: { label: 'خرابکاری مرتبط با تصاویر در مقالهها', // localized summary: 'آخرین هشدار: خرابکاری مرتبط با تصاویر در مقالهها' // localized }, level4im: { label: 'خرابکاری مرتبط با تصاویر', // localized summary: 'تنها هشدار: خرابکاری مرتبط با تصاویر' // localized } }, 'uw-joke': { level1: { label: 'استفاده از شوخی نامناسب در مقالهها', // localized summary: 'یادداشت عمومی: استفاده از شوخیهای نامناسب در مقالهها' // localized }, level2: { label: 'استفاده از شوخی نامناسب در مقالهها', // localized summary: 'اخطار: استفاده از شوخی نامناسب در مقالهها' // localized }, level3: { label: 'استفاده از شوخی نامناسب در مقالهها', // localized summary: 'هشدار: استفاده از شوخی نامناسب در مقالهها' // localized }, level4: { label: 'استفاده از شوخی نامناسب در مقالهها', // localized summary: 'آخرین هشدار: استفاده از شوخی نامناسب در مقالهها' // localized }, level4im: { label: 'استفاده از شوخی نامناسب', // localized summary: 'تنها هشدار: استفاده از شوخی نامناسب' // localized } }, 'uw-nor': { level1: { label: 'افزودن تحقیق دست اول، شامل ترکیب منتشر نشده در منابع', // localized summary: 'یادداشت عمومی: افزودن تحقیق دست اول، شامل ترکیب منتشر نشده در منابع' // localized }, level2: { label: 'افزودن تحقیق دست اول، شامل ترکیب منتشر نشده در منابع', // localized summary: 'اخطار: افزودن تحقیق دست اول، شامل ترکیب منتشر نشده در منابع' // localized }, level3: { label: 'افزودن تحقیق دست اول، شامل ترکیب منتشر نشده در منابع', // localized summary: 'هشدار: افزودن تحقیق دست اول، شامل ترکیب منتشر نشده در منابع' // localized }, level4: { label: 'افزودن تحقیق دست اول، شامل ترکیب منتشر نشده در منابع', // localized summary: 'آخرین هشدار: افزودن تحقیق دست اول، شامل ترکیب منتشر نشده در منابع' // localized } }, 'uw-notcensored': { level1: { label: 'سانسور محتوا', // localized summary: 'یادداشت عمومی: سانسور محتوا' // localized }, level2: { label: 'سانسور محتوا', // localized summary: 'اخطار: سانسور محتوا' // localized }, level3: { label: 'سانسور محتوا', // localized summary: 'هشدار: سانسور محتوا' // localized } }, 'uw-own': { level1: { label: 'مالکیت مقالهها', // localized summary: 'یادداشت عمومی: مالکیت مقالهها' // localized }, level2: { label: 'مالکیت مقالهها', // localized summary: 'اخطار: مالکیت مقالهها' // localized }, level3: { label: 'مالکیت مقالهها', // localized summary: 'هشدار: مالکیت مقالهها' // localized }, level4: { label: 'مالکیت مقالهها', // localized summary: 'آخرین هشدار: مالکیت مقالهها' // localized }, level4im: { label: 'مالکیت مقالهها', // localized summary: 'تنها هشدار: مالکیت مقالهها' // localized } }, 'uw-tdel': { level1: { label: 'حذف الگوهای نگهداری', // localized summary: 'یادداشت عمومی: حذف الگوهای نگهداری' // localized }, level2: { label: 'حذف الگوهای نگهداری', // localized summary: 'اخطار: حذف الگوهای نگهداری' // localized }, level3: { label: 'حذف الگوهای نگهداری', // localized summary: 'هشدار: حذف الگوهای نگهداری' // localized }, level4: { label: 'حذف الگوهای نگهداری', // localized summary: 'آخرین هشدار: حذف الگوهای نگهداری' // localized } }, 'uw-unsourced': { level1: { label: 'افزودن مطالب بدون منبع یا با منبع ضعیف', // localized summary: 'یادداشت عمومی: افزودن مطالب بدون منبع یا با منبع ضعیف', // localized }, level2: { label: 'افزودن مطالب بدون منبع یا با منبع ضعیف', // localized summary: 'اخطار: افزودن مطالب بدون منبع یا با منبع ضعیف' // localized }, level3: { label: 'افزودن مطالب بدون منبع یا با منبع ضعیف', // localized summary: 'هشدار: افزودن مطالب بدون منبع یا با منبع ضعیف' // localized }, level4: { label: 'افزودن مطالب بدون منبع یا با منبع ضعیف', // localized summary: 'آخرین هشدار: افزودن مطالب بدون منبع یا با منبع ضعیف' // localized } } }, 'هرزنگاری و تبلیغات: { 'uw-advert': { level1: { label: 'استفاده از ویکیپدیا برای تبلیغات یا ترویج', // localized summary: 'یادداشت عمومی: استفاده از ویکیپدیا برای تبلیغات یا ترویج' // localized }, level2: { label: 'استفاده از ویکیپدیا برای تبلیغات یا ترویج', // localized summary: 'اخطار: استفاده از ویکیپدیا برای تبلیغات یا ترویج' // localized }, level3: { label: 'استفاده از ویکیپدیا برای تبلیغات یا ترویج', // localized summary: 'هشدار: استفاده از ویکیپدیا برای تبلیغات یا ترویج' // localized }, level4: { label: 'استفاده از ویکیپدیا برای تبلیغات یا ترویج', // localized summary: 'آخرین هشدار: استفاده از ویکیپدیا برای تبلیغات یا ترویج' // localized }, level4im: { label: 'استفاده از ویکیپدیا برای تبلیغات یا ترویج', // localized summary: 'تنها هشدار: استفاده از ویکیپدیا برای تبلیغات یا ترویج' // localized } }, 'uw-npov': { level1: { label: 'عدم پایبندی به دیدگاه بیطرف', // localized summary: 'یادداشت عمومی: عدم پایبندی به دیدگاه بیطرف' // localized }, level2: { label: 'عدم پایبندی به دیدگاه بیطرف', // localized summary: 'اخطار: عدم پایبندی به دیدگاه بیطرف' // localized }, level3: { label: 'عدم پایبندی به دیدگاه بیطرف', // localized summary: 'هشدار: عدم پایبندی به دیدگاه بیطرف' // localized }, level4: { label: 'عدم پایبندی به دیدگاه بیطرف', // localized summary: 'آخرین هشدار: عدم پایبندی به دیدگاه بیطرف' // localized } }, 'uw-paid': { level1: { label: 'ویرایش در برابر دستمزد بدون فاشسازی تحت شرایط استفادهٔ ویکیمدیا', // localized summary: 'یادداشت عمومی: ویرایش در برابر دستمزد بدون فاشسازی تحت شرایط استفادهٔ ویکیمدیا' // localized }, level2: { label: 'ویرایش در برابر دستمزد بدون فاشسازی تحت شرایط استفادهٔ ویکیمدیا', // localized summary: 'اخطار: ویرایش در برابر دستمزد بدون فاشسازی تحت شرایط استفادهٔ ویکیمدیا' // localized }, level3: { label: 'ویرایش در برابر دستمزد بدون فاشسازی تحت شرایط استفادهٔ ویکیمدیا', // localized summary: 'هشدار: ویرایش در برابر دستمزد بدون فاشسازی تحت شرایط استفادهٔ ویکیمدیا' // localized }, level4: { label: 'ویرایش در برابر دستمزد بدون فاشسازی تحت شرایط استفادهٔ ویکیمدیا', // localized summary: 'آخرین هشدار: ویرایش در برابر دستمزد بدون فاشسازی تحت شرایط استفادهٔ ویکیمدیا' // localized } }, 'uw-spam': { level1: { label: 'افزودن پیوندهای بیرونی نامناسب', // localized summary: 'یادداشت عمومی: افزودن پیوندهای بیرونی نامناسب' // localized }, level2: { label: 'افزودن پیوندهای هرزنامه', // localized summary: 'اخطار: افزودن پیوندهای هرزنامه' // localized }, level3: { label: 'افزودن پیوندهای هرزنامه', // localized summary: 'هشدار: افزودن پیوندهای هرزنامه' // localized }, level4: { label: 'افزودن پیوندهای هرزنامه', // localized summary: 'آخرین هشدار: افزودن پیوندهای هرزنامه' // localized }, level4im: { label: 'افزودن پیوندهای هرزنامه', // localized summary: 'تنها هشدار: افزودن پیوندهای هرزنامه' // localized } } }, 'Behavior towards other editors': { 'uw-agf': { level1: { label: 'بدون فرض حست نیت', // localized summary: 'یادداشت عمومی: بدون فرض حست نیت' // localized }, level2: { label: 'بدون فرض حست نیت', // localized summary: 'اخطار: بدون فرض حست نیت' // localized }, level3: { label: 'بدون فرض حست نیت', // localized summary: 'هشدار: بدون فرض حست نیت' // localized } }, 'uw-harass': { level1: { label: 'آزار و اذیت کاربران دیگر', // localized summary: 'یادداشت عمومی: آزار و اذیت کاربران دیگر' // localized }, level2: { label: 'آزار و اذیت کاربران دیگر', // localized summary: 'اخطار: آزار و اذیت کاربران دیگر' // localized }, level3: { label: 'آزار و اذیت کاربران دیگر', // localized summary: 'هشدار: آزار و اذیت کاربران دیگر' // localized }, level4: { label: 'آزار و اذیت کاربران دیگر', // localized summary: 'آخرین هشدار: آزار و اذیت کاربران دیگر' // localized }, level4im: { label: 'آزار و اذیت کاربران دیگر', // localized summary: 'تنها هشدار: آزار و اذیت کاربران دیگر' // localized } }, 'uw-npa': { level1: { label: 'حملهٔ شخصی مستقیم به یک کاربر خاص', // localized summary: 'یادداشت عمومی: حملهٔ شخصی مستقیم به یک کاربر خاص' // localized }, level2: { label: 'حملهٔ شخصی مستقیم به یک کاربر خاص', // localized summary: 'اخطار: حملهٔ شخصی مستقیم به یک کاربر خاص' // localized }, level3: { label: 'حملهٔ شخصی مستقیم به یک کاربر خاص', // localized summary: 'هشدار: حملهٔ شخصی مستقیم به یک کاربر خاص' // localized }, level4: { label: 'حملهٔ شخصی مستقیم به یک کاربر خاص', // localized summary: 'آخرین هشدار: حملهٔ شخصی مستقیم به یک کاربر خاص' // localized }, level4im: { label: 'حملهٔ شخصی مستقیم به یک کاربر خاص', // localized summary: 'تنها هشدار: حملهٔ شخصی مستقیم به یک کاربر خاص' // localized } }, 'uw-tempabuse': { level1: { label: 'استفادهٔ نادرست از الگوی هشدار یا قطع دسترسی', // localized summary: 'یادداشت عمومی: استفادهٔ نادرست از الگوی هشدار یا قطع دسترسی' // localized }, level2: { label: 'استفادهٔ نادرست از الگوی هشدار یا قطع دسترسی', // localized summary: 'اخطار: استفادهٔ نادرست از الگوی هشدار یا قطع دسترسی' // localized } } }, 'Removal of deletion tags': { 'uw-afd': { level1: { label: 'برداشتن الگوهای {{نبح}}', // localized summary: 'یادداشت عمومی: برداشتن الگوهای {{نبح}}' // localized }, level2: { label: 'برداشتن الگوهای {{نبح}}', // localized summary: 'اخطار: برداشتن الگوهای {{نبح}}' // localized }, level3: { label: 'برداشتن الگوهای {{نبح}}', // localized summary: 'هشدار: برداشتن الگوهای {{نبح}}' // localized }, level4: { label: 'برداشتن الگوهای {{نبح}}', // localized summary: 'آخرین هشدار: برداشتن الگوهای {{نبح}}' // localized } }, /* 'uw-blpprod': { level1: { label: 'Removing {{blp prod}} templates', summary: 'یادداشت عمومی: Removing {{blp prod}} templates' }, level2: { label: 'Removing {{blp prod}} templates', summary: 'اخطار: Removing {{blp prod}} templates' }, level3: { label: 'Removing {{blp prod}} templates', summary: 'هشدار: Removing {{blp prod}} templates' }, level4: { label: 'Removing {{blp prod}} templates', summary: 'آخرین هشدار: Removing {{blp prod}} templates' } }, */ // localized [removed] 'uw-idt': { level1: { label: 'برداشتن برچسبهای حذف پرونده', // localized summary: 'یادداشت عمومی: برداشتن برچسبهای حذف پرونده' // localized }, level2: { label: 'برداشتن برچسبهای حذف پرونده', // localized summary: 'اخطار: برداشتن برچسبهای حذف پرونده' // localized }, level3: { label: 'برداشتن برچسبهای حذف پرونده', // localized summary: 'هشدار: برداشتن برچسبهای حذف پرونده' // localized }, level4: { label: 'برداشتن برچسبهای حذف پرونده', // localized summary: 'آخرین هشدار: برداشتن برچسبهای حذف پرونده' // localized } }, 'uw-speedy': { level1: { label: 'برداشتن برچسب حذف سریع', // localized summary: 'یادداشت عمومی: برداشتن برچسب حذف سریع' // localized }, level2: { label: 'برداشتن برچسب حذف سریع', // localized summary: 'اخطار: برداشتن برچسب حذف سریع' // localized }, level3: { label: 'برداشتن برچسب حذف سریع', // localized summary: 'هشدار: برداشتن برچسب حذف سریع' // localized }, level4: { label: 'برداشتن برچسب حذف سریع', // localized summary: 'آخرین هشدار: برداشتن برچسب حذف سریع' // localized } } }, 'سایر': { // localized 'uw-attempt': { level1: { label: 'فعالکردن پالایهٔ ویرایش', // localized summary: 'یادداشت عمومی: فعالکردن پالایهٔ ویرایش' // localized }, level2: { label: 'فعالکردن پالایهٔ ویرایش', // localized summary: 'اخطار: فعالکردن پالایهٔ ویرایش' // localized }, level3: { label: 'فعالکردن پالایهٔ ویرایش', // localized summary: 'هشدار: فعالکردن پالایهٔ ویرایش' // localized }, level4: { label: 'فعالکردن پالایهٔ ویرایش', // localized summary: 'آخرین هشدار: فعالکردن پالایهٔ ویرایش' // localized } }, 'uw-chat': { level1: { label: 'استفاده از صفحهٔ بحث مانند یک انجمن', // localized summary: 'یادداشت عمومی: استفاده از صفحهٔ بحث مانند یک انجمن' // localized }, level2: { label: 'استفاده از صفحهٔ بحث مانند یک انجمن', // localized summary: 'اخطار: استفاده از صفحهٔ بحث مانند یک انجمن' // localized }, level3: { label: 'استفاده از صفحهٔ بحث مانند یک انجمن', // localized summary: 'هشدار: استفاده از صفحهٔ بحث مانند یک انجمن' // localized }, level4: { label: 'استفاده از صفحهٔ بحث مانند یک انجمن', // localized summary: 'آخرین هشدار: استفاده از صفحهٔ بحث مانند یک انجمن' // localized } }, 'uw-create': { level1: { label: 'ساخت صفحههای نامناسب', // localized summary: 'یادداشت عمومی: ساخت صفحههای نامناسب' // localized }, level2: { label: 'ساخت صفحههای نامناسب', // localized summary: 'اخطار: ساخت صفحههای نامناسب' // localized }, level3: { label: 'ساخت صفحههای نامناسب', // localized summary: 'هشدار: ساخت صفحههای نامناسب' // localized }, level4: { label: 'ساخت صفحههای نامناسب', // localized summary: 'آخرین هشدار: ساخت صفحههای نامناسب' // localized }, level4im: { label: 'ساخت صفحههای نامناسب', // localized summary: 'تنها هشدار: ساخت صفحههای نامناسب' // localized } }, 'uw-mos': { level1: { label: 'شیوهنامه', // localized summary: 'یادداشت عمومی: قالببندی، تاریخ، زبان و غیره. (شیوهنامه)' // localized }, level2: { label: 'شیوهنامه', // localized summary: 'اخطار: قالببندی، تاریخ، زبان و غیره. (شیوهنامه)' // localized }, level3: { label: 'شیوهنامه', // localized summary: 'هشدار: قالببندی، تاریخ، زبان و غیره. (شیوهنامه)' // localized }, level4: { label: 'شیوهنامه', // localized summary: 'آخرین هشدار: قالببندی، تاریخ، زبان و غیره. (شیوهنامه)' // localized } }, 'uw-move': { level1: { label: 'انتقال صفحهها بر خلاف قواعد نامگذاری یا اجماع', // localized summary: 'یادداشت عمومی: انتقال صفحهها بر خلاف قواعد نامگذاری یا اجماع' // localized }, level2: { label: 'انتقال صفحهها بر خلاف قواعد نامگذاری یا اجماع', // localized summary: 'اخطار: انتقال صفحهها بر خلاف قواعد نامگذاری یا اجماع' // localized }, level3: { label: 'انتقال صفحهها بر خلاف قواعد نامگذاری یا اجماع', // localized summary: 'هشدار: انتقال صفحهها بر خلاف قواعد نامگذاری یا اجماع' // localized }, level4: { label: 'انتقال صفحهها بر خلاف قواعد نامگذاری یا اجماع', // localized summary: 'آخرین هشدار: انتقال صفحهها بر خلاف قواعد نامگذاری یا اجماع' // localized }, level4im: { label: 'انتقال صفحهها بر خلاف قواعد نامگذاری یا اجماع', // localized summary: 'تنها هشدار: انتقال صفحهها بر خلاف قواعد نامگذاری یا اجماع' // localized } }, 'uw-tpv': { level1: { label: "دست بردن در پیامهای صفحههای بحث دیگران", // localized summary: "یادداشت عمومی: دست بردن در پیامهای صفحههای بحث دیگران" // localized }, level2: { label: "دست بردن در پیامهای صفحههای بحث دیگران", // localized summary: "اخطار: دست بردن در پیامهای صفحههای بحث دیگران" // localized }, level3: { label: "دست بردن در پیامهای صفحههای بحث دیگران", // localized summary: "هشدار: دست بردن در پیامهای صفحههای بحث دیگران" // localized }, level4: { label: "دست بردن در پیامهای صفحههای بحث دیگران", // localized summary: "آخرین هشدار: دست بردن در پیامهای صفحههای بحث دیگران" // localized }, level4im: { label: "دست بردن در پیامهای صفحههای بحث دیگران", // localized summary: "تنها هشدار: دست بردن در پیامهای صفحههای بحث دیگران" // localized } }, 'uw-upload': { level1: { label: 'بارگزاری تصاویر غیردانشنامهای', // localized summary: 'یادداشت عمومی: بارگزاری تصاویر غیردانشنامهای' // localized }, level2: { label: 'بارگزاری تصاویر غیردانشنامهای', // localized summary: 'اخطار: بارگزاری تصاویر غیردانشنامهای' // localized }, level3: { label: 'بارگزاری تصاویر غیردانشنامهای', // localized summary: 'هشدار: بارگزاری تصاویر غیردانشنامهای' // localized }, level4: { label: 'بارگزاری تصاویر غیردانشنامهای', // localized summary: 'آخرین هشدار: بارگزاری تصاویر غیردانشنامهای' // localized }, level4im: { label: 'بارگزاری تصاویر غیردانشنامهای', // localized summary: 'تنها هشدار: بارگزاری تصاویر غیردانشنامهای' // localized } } } }, singlenotice: { /* 'uw-aiv': { label: 'Bad AIV report', summary: 'Notice: Bad AIV report' }, */ // localized [removed] 'uw-autobiography': { label: 'ساخت خودزندگینامه', // localized summary: 'اعلان: ساخت خودزندگینامه' // localized }, 'uw-badcat': { label: 'افزودن ردههای اشتباه', // localized summary: 'اعلان: افزودن ردههای اشتباه' // localized }, 'uw-badlistentry': { label: 'افزودن مدخلهای نامناسب به فهرستها', // localized summary: 'اعلان: افزودن مدخلهای نامناسب به فهرستها' // localized }, 'uw-bite': { label: 'استقبال از تازهواردها با «چماق»', // localized summary: 'اعلان: استقبال از تازهواردها با «چماق»', // localized suppressArticleInSummary: true // non-standard (user name, not article), and not necessary }, 'uw-coi': { label: 'تعارض منافع', // localized summary: 'اعلان: تعارض منافع', // localized heading: 'مهار کردن تعارض منافع' // localized }, 'uw-controversial': { label: 'معرفی محتوای بحثبرانگیز', // localized summary: 'اعلان: معرفی محتوای بحثبرانگیز' // localized }, 'uw-copying': { label: 'کپیکردن متن به یک صفحهٔ دیگر', // localized summary: 'اعلان: کپیکردن متن به یک صفحهٔ دیگر' // localized }, 'uw-crystal': { label: 'افزودن حدس و گمان یا اطلاعات تأییدنشده', // localized summary: 'اعلان: افزودن حدس و گمان یا اطلاعات تأییدنشده' // localized }, 'uw-c&pmove': { label: 'انتقال متن بهجای انتقال صفحه', // localized summary: 'اعلان: انتقال متن بهجای انتقال صفحه' // localized }, 'uw-dab': { label: 'ویرایش نادرست در یک صفحهٔ ابهامزدایی', // localized summary: 'اعلان: ویرایش نادرست در یک صفحهٔ ابهامزدایی' // localized }, 'uw-date': { label: 'تغییر نالازم در قالب تاریخ', // localized summary: 'اعلان: تغییر نالازم در قالب تاریخ' // localized }, 'uw-deadlink': { label: 'حذف منابع صحیح دارای پیوندهای مرده', // localized summary: 'اعلان: حذف منابع صحیح دارای پیوندهای مرده' // localized }, 'uw-draftfirst': { label: 'User should draft in userspace without the risk of speedy deletion', summary: 'Notice: Consider drafting your article in [[Help:Userspace draft|userspace]]' }, 'uw-editsummary': { label: 'عدم استفاده از خلاصه ویرایش', // localized summary: 'اعلان: عدم استفاده از خلاصه ویرایش' // localized }, 'uw-elinbody': { label: 'افزودن پیوند بیرونی به بدنهٔ یک مقاله', // localized summary: 'اعلان: پیوندهای بیرونی را در بخش پیوند به بیرون در پایین صفحهٔ مقاله نگهدارید' // localized }, 'uw-english': { label: 'Not communicating in English', summary: 'Notice: Not communicating in English' }, 'uw-hasty': { label: 'افزودن عجولانهٔ برچسبّای حذف سریع', // localized summary: 'اعلان: پیش از قرار دادن برچسب حذف سریع، به ایجادکنندگان فرصت دهید تا مقالهٔ خود را بهبود بخشند' // localized }, 'uw-italicize': { label: 'ایتالیک (کج) نوشتن عنوان کتابها، فیلمها، آلبومها، مجلهها، مجموعههای تلویزیونی و غیره در مقالهها', // localized summary: 'اعلان: عنوان کتابها، فیلمها، آلبومها، مجلهها، مجموعههای تلویزیونی و غیره را در مقالهها ایتالیک (کج) بنویسید' // localized }, 'uw-lang': { label: 'Unnecessarily changing between British and American English', summary: 'Notice: Unnecessarily changing between British and American English', heading: 'National varieties of English' }, 'uw-linking': { label: 'افزودن بیش از اندازهٔ پیوندهای قرمز یا پیوندهای آبی تکراری', // localized summary: 'اعلان: افزودن بیش از اندازهٔ پیوندهای قرمز یا پیوندهای آبی تکراری' // localized }, 'uw-minor': { label: 'استفادهٔ نادرست از گزینهٔ «ویرایش جزئی»', // localized summary: 'اعلان: استفادهٔ نادرست از گزینهٔ «ویرایش جزئی»' // localized }, 'uw-notenglish': { label: 'Creating non-English articles', summary: 'Notice: Creating non-English articles' }, 'uw-notvote': { label: 'ما از احماع استفاده میکنیم، نه رأیگیری', // localized summary: 'اعلان: ما از احماع استفاده میکنیم، نه رأیگیری' // localized }, 'uw-plagiarism': { label: 'کپیکاری از منابع تحت مالکیت عمومی بدون انتساب', // localized summary: 'اعلان: کپیکاری از منابع تحت مالکیت عمومی بدون انتساب' // localized }, 'uw-preview': { label: 'برای پیشگیری از اشتباه، از دکمهٔ پیشنمایش استفاده کنید', // localized summary: 'اعلان: برای پیشگیری از اشتباه، از دکمهٔ پیشنمایش استفاده کنید' // localized }, 'uw-redlink': { label: 'حذف بیوقفهٔ پیوندهای قرمز', // localized summary: 'اعلان: بههنگام حذف پیوندهای قرمز بیشتر دقت کنید' // localized }, 'uw-selfrevert': { label: 'واگردانی آزمایشهای شخصی', // localized summary: 'اعلان: واگردانی آزمایشهای شخصی' // localized }, 'uw-socialnetwork': { label: 'ویکیپدیا شبکهٔ اجتماعی نیست', // localized summary: 'اعلان: ویکیپدیا شبکهٔ اجتماعی نیست' // localized }, 'uw-sofixit': { label: 'جسور باشید و موارد را خودتان اصلاح کنید', // localized summary: 'اعلان: جسور باشید و موارد را خودتان اصلاح کنید' // localized }, 'uw-spoiler': { label: 'افزودن هشدار لوث شدن یا حذف اسپویلرها از بخشهای مناسب', // localized summary: "اعلان: اسپویلرها را از مقالههای ویکیپدیا حذف نکنید یا آنها را علامتگذاری نکنید" // localized }, 'uw-talkinarticle': { label: 'بحث در مقاله', // localized summary: 'اعلان: بحث در مقاله' // localized }, 'uw-tilde': { label: 'امضا نکردن پیامها', // localized summary: 'اعلان: امضا نکردن پیامها' // localized }, 'uw-toppost': { label: 'ارسال پیام در بالای صفحههای بحث', // localized summary: 'اعلان: ارسال پیام در بالای صفحههای بحث' // localized }, 'uw-userspace draft finish': { label: 'پیشنویس رها شده در فضای نام کاربری', // localized summary: 'اعلان: پیشنویس رها شده در فضای نام کاربری' // localized }, 'uw-vgscope': { label: 'افزودن راهنمای قدم به قدم، رمزهای تقلب یا دستورالعملهای بازیهای ویدئویی', // localized summary: 'اعلان: افزودن راهنمای قدم به قدم، رمزهای تقلب یا دستورالعملهای بازیهای ویدئویی' // localized }, 'uw-warn': { label: 'قرار دادن الگوهای هشدار به کاربر در زمان خنثیسازی خرابکاری', // localized summary: 'اعلان: در زمان خنثیسازی خرابکاری، میتوانید از الگوهای هشدار به کاربر استفاده کنید' // localized }, 'uw-wrongsummary': { label: 'استفاده از خلاصه ویرایشهای نادقیق یا نامناسب', // localized summary: 'هشدار: استفاده از خلاصه ویرایشهای نادقیق یا نامناسب' // localized } }, singlewarn: { 'هشدار نقض قاعده سه برگردان': { // localized label: 'نقض محتمل قاعدهٔ سهبرگردان؛ هشدار جنگ ویرایشی را نیز ببینید', // localized summary: 'هشدار: قاعدهٔ سهبرگردان' }, /* 'uw-affiliate': { label: 'فروش رابطهای', // localized summary: 'هشدار: فروش رابطهای' // localized }, */ // localized [removed] 'uw-agf-sock': { label: 'استفاده از چند حساب کاربری (با فرض حسن نیت)', // localized summary: 'هشدار: استفاده از چند حساب کاربری' // localized }, 'uw-attack': { label: 'ساخت صفحهٔ حمله', // localized summary: 'هشدار: ساخت صفحهٔ حمله', // localized suppressArticleInSummary: true }, 'uw-botun': { label: 'نام کاربری ربات', // localized summary: 'هشدار: نام کاربری ربات' // localized }, 'uw-canvass': { label: 'جارزنی', // localized summary: 'هشدار: جارزنی' // localized }, 'uw-copyright': { label: 'نقض حق تکثیر', // localized summary: 'هشدار: نقض حق تکثیر' // localized }, 'uw-copyright-link': { label: 'پیونددهی به نقض حقوق کارهای دارای حق تکثیر', // localized summary: 'هشدار: پیونددهی به نقض حقوق کارهای دارای حق تکثیر' // localized }, 'uw-copyright-new': { label: 'نقض حق تکثیر (همراه با توضیحات برای کاربران جدید)', // localized summary: 'اعلان: دوری جستن از مشکلات حق تکثیر', // localized heading: 'ویکیپدیا و حق تکثیر' // localized }, 'uw-copyright-remove': { label: 'حذف الگوهای {{نقض حق تکثیر}} از مقالهها', // localized summary: 'هشدار: حذف الگوهای {{نقض حق تکثیر}}' // localized }, 'uw-efsummary': { label: 'خلاصه ویرایشی که پالایهٔ ویرایش را فعال میکند', // localized summary: 'هشدار: خلاصه ویرایشی که پالایهٔ ویرایش را فعال میکند' // localized }, 'uw-ew': { label: 'جنگ ویرایشی (جملهبندی محکمتر)', // localized summary: 'هشدار: جنگ ویرایشی' // localized }, 'هشدار جنگ ویرایشی-تازهوارد': { // localized label: 'جنگ ویرایشی (جملهبندی ملایمتر برای تازهواردان)', // localized summary: 'هشدار: جنگ ویرایشی' // localized }, 'uw-hijacking': { label: 'دستبرد زدن به مقالهها', // localized summary: 'هشدار: دستبرد زدن به مقالهها' // localized }, 'uw-hoax': { label: 'کلکزنی', // localized summary: 'هشدار: کلکزنی' // localized }, 'uw-legal': { label: 'تهدید قانونی', // localized summary: 'هشدار: تهدید قانونی' // localized }, 'uw-login': { label: 'ویرایش پس از خروج از سامانه', // localized summary: 'هشدار: ویرایش پس از خروج از سامانه' // localized }, 'uw-multipleIPs': { label: 'استفاده از چند نشانی آیپی', // localized summary: 'هشدار: خرابکاری با استفاده از چند نشانی آیپی' // localized }, 'uw-pinfo': { label: 'اطلاعات خصوصی', // localized summary: 'هشدار: اطلاعات خصوصی' // localized }, 'uw-salt': { label: 'ساخت دوبارهٔ مقالهٔ محافظتشده در برابر ایجاد با استفاده از عنوان متفاوت', // localized summary: 'اعلان: ساخت دوبارهٔ مقالههای محافظتشده در برابر ایجاد با استفاده از عنوان متفاوت' // localized }, 'uw-socksuspect': { label: 'زاپاسبازی', // localized summary: 'هشدار: شما یک [[وپ:زاپاس|حساب زاپاس]] شناساییشده هستید' // of User:... // localized }, 'uw-upv': { label: 'خرابکاری در فضای نام کاربری', // localized summary: 'هشدار: خرابکاری در فضای نام کاربری' // localized }, 'uw-username': { label: 'نام کاربری مغایر با سیاست', // localized summary: 'هشدار: نام کاربری شما با سیاست نام کاربری مغایرت دارد', // localized suppressArticleInSummary: true // not relevant for this template }, 'uw-coi-username': { label: 'مغایرت نام کاربری با سیاست نام کاربری و تعارض منافع', // localized summary: 'هشدار: سیاست نام کاربری و تعارض منافع', // localized heading: 'نام کاربری شما' // localized }, 'uw-userpage': { label: 'صفحهٔ کاربری یا زیرصفحهٔ مغایر با سیاست', // localized summary: 'هشدار: صفحهٔ کاربری یا زیرصفحه با سیاست مغایرت دارد' // localized } } }; // 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: 'الگوهای موجود' // localized }); 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); }); }; 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(_, levelGroup) { createEntries(levelGroup, sub_group, true, lvl); }); }); createEntries(Twinkle.warn.messages.singlenotice, sub_group, true); createEntries(Twinkle.warn.messages.singlewarn, sub_group, true); createEntries(Twinkle.getPref('customWarningList'), sub_group, true); 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) { var optgroup = new Morebits.quickForm.element({ type: 'optgroup', label: groupLabel }); optgroup = optgroup.render(); sub_group.appendChild(optgroup); // create the options createEntries(groupContents, optgroup, 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) { var optgroup = new Morebits.quickForm.element({ type: 'optgroup', label: groupLabel }); optgroup = optgroup.render(); sub_group.appendChild(optgroup); // create the options createEntries(groupContents, optgroup, 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'), 'بارگیری هشدارهای قبلی'); // localized usertalk_page.setFollowRedirect(true); usertalk_page.load(function(pageobj) { Twinkle.warn.talkpageObj = pageobj; // Update talkpageObj autolevelProc(); }); } break; default: alert('Unknown warning group in twinklewarn'); 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); mw.util.addCSS( // prevent dropdown from appearing behind the dialog, just in case '.select2-container { z-index: 10000; }' + // 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': 'اختیاری: نام کاربری حساب دیگر (بدون پیشوند کاربر:) ', // localized 'uw-bite': "نام کاربری کاربر «چماقخورده» (بدون پیشوند کاربر:) ", // localized 'uw-socksuspect': 'نام کاربری حساب اصلی، در صورت اطلاع (بدون پیشوند کاربر:) ', // localized 'uw-username': 'نام کاربری ناقض سیاست است زیرا... ', // localized 'uw-aiv': 'اختیاری: نام کاربری گزارششده (بدون پیشوند کاربر:) ' // localized }; 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'>{{نام کاربری نامناسب}} <b>نباید</b> برای موارد نقض <b>آشکار</b> سیاستها استفاده شود. " + // localized "نقضهای آشکار باید مستقیماً در [[وپ:تامنام]] گزارش شوند (با استفاده از زبانهٔ بررسی و گزارش پیشرفتهٔ توینکل). " + // localized '{{نام کاربری نامناسب}} باید تنها در موارد لبمرزی و جهت ورود به گفتگو با کاربر استفاده شود.</div>'); // localized $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> برای موارد نقض <b>آشکار</b>سیاست نام کاربری استفاده شود. " + // localized "نقضهای آشکار باید مستقیماً در [[وپ:تامنام]] گزارش شوند (با استفاده از زبانهٔ بررسی و گزارش پیشرفتهٔ توینکل). " + // localized '{{uw-coi-username}} باید تنها در موارد لبمرزی و جهت ورود به گفتگو با کاربر استفاده شود.</div>'); // localized $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) { // Provided on autolevel, not otherwise templatename = templatename || form.sub_group.value; var linkedarticle = form.article.value; var templatetext; templatetext = Twinkle.warn.callbacks.getWarningWikitext(templatename, linkedarticle, form.reason.value, form.main_group.value === 'custom'); form.previewer.beginRender(templatetext, 'User_talk:' + 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'), 'بارگیری هشدارهای قبلی'); // localized usertalk_page.setFollowRedirect(true); 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 template = params.sub_group.replace(/(.*)\d$/, '$1'); 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(template) ? 'uw-multipleIPs' : template.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 = 'Unable to parse previous warning level, please manually select a warning level.'; 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': 'برای باز کردن ابزار بررسی و هشدار پیشرفته اینجا کلیک کنید.', // localized '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 + ') بنابراین احتمالاً گزارش کاربر گزینهٔ بهتری است; ', // localized '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; } } // 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; $autolevelMessage.prepend($('<div>Will issue a <span style="font-weight: bold;">level ' + level + '</span> template.</div>')); // After the only other message: the (text-only) staleness note $('#twinkle-warn-autolevel-message').remove(); // clean slate $autolevelMessage.insertAfter($('#twinkle-warn-warning-message')); 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('Will issue a {{' + templateAndLevel[0] + '}} template to the user, okay?')) { statelem.error('aborted per user request'); 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('یک ' + params.sub_group + ' همسان در ۲۴ ساعت گذشته صادر شدهاست. \nهمچنان مایل هستید این هشدار/اعلان را بیافزایید؟')) { // localized statelem.error('به درخواست کاربر لغو شد'); // localized return; } } } latest.date.add(1, 'minute'); // after long debate, one minute is max if (latest.date.isAfter(now)) { if (!confirm('A ' + latest.type + ' در یک دقیقهٔ گذشته صادر شدهاست. \nهمچنان مایل هستید این هشدار/اعلان را بیافزایید؟')) { // localized statelem.error('به درخواست کاربر لغو شد'); // localized return; } } var dateHeaderRegex = now.monthHeaderRegex(), dateHeaderRegexLast, dateHeaderRegexResult; while ((dateHeaderRegexLast = dateHeaderRegex.exec(text)) !== null) { dateHeaderRegexResult = dateHeaderRegexLast; } // If dateHeaderRegexResult is null then lastHeaderIndex is never checked. If it is not null but // \n== is not found, then the date header must be at the very start of the page. lastIndexOf // returns -1 in this case, so lastHeaderIndex gets set to 0 as desired. var lastHeaderIndex = text.lastIndexOf('\n==') + 1; if (text.length > 0) { text += '\n\n'; } if (messageData.heading) { text += '== ' + messageData.heading + ' ==\n'; } else if (!dateHeaderRegexResult || dateHeaderRegexResult.index !== lastHeaderIndex) { Morebits.status.info('Info', 'یک سرتیتر سطح ۲ برای تاریخ خواهد ساخت، زیرا هیچ سرتیتری برای این ماه یافت نشد'); // localized text += now.monthHeader() + '\n'; } text += 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('Info', 'افزودن اعلان آیپی مشترک'); // localized text += '\n{{subst:آگاهی آیپی مشترک}}'; // localized } // build the edit summary var summary; if (params.main_group === 'custom') { switch (params.sub_group.substr(-1)) { case '1': summary = 'یادداشت عمومی'; // localized break; case '2': summary = 'اخطار'; // localized break; case '3': summary = 'هشدار'; // localized break; case '4': summary = 'آخرین هشدار'; // localized break; case 'm': if (params.sub_group.substr(-3) === '4im') { summary = 'تنها هشدار'; // localized break; } summary = 'اعلان'; // localized break; default: summary = 'اعلان'; // localized break; } summary += ': ' + Morebits.string.toUpperCaseFirstChar(messageData.label); } 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; } } summary = /^\D+$/.test(params.main_group) ? messageData.summary : messageData[params.main_group].summary; 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 += ' of [[:کاربر:' + params.article + ']]'; // localized } else { summary += ' on [[:' + params.article + ']]'; } } } summary += '.' + Twinkle.getPref('summaryAd'); pageobj.setPageText(text); pageobj.setEditSummary(summary); pageobj.setWatchlist(Twinkle.getPref('watchWarnings')); pageobj.save(); } }; Twinkle.warn.callback.evaluate = function twinklewarnCallbackEvaluate(e) { var userTalkPage = 'بحث_کاربر:' + mw.config.get('wgRelevantUserName'); // First, check to make sure a reason was filled in if uw-username was selected if (e.target.sub_group.value === 'uw-username' && e.target.article.value.trim() === '') { alert('لازم است که برای الگوی {{نام کاربری نامناسب}} یک دلیل ارائه کنید.'); // localized return; } // 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() + '"]'); // Then, grab all the values provided by the form var params = { reason: e.target.reason.value, main_group: e.target.main_group.value, sub_group: e.target.sub_group.value, article: e.target.article.value, // .replace( /^(Image|Category):/i, ':$1:' ), -- apparently no longer needed... messageData: selectedEl.data('messageData') }; Morebits.simpleWindow.setButtonsEnabled(false); Morebits.status.init(e.target); Morebits.wiki.actionCompleted.redirect = userTalkPage; Morebits.wiki.actionCompleted.notice = 'هشدار دادن کامل شد، بارگیری صفحهٔ بحث تا چند ثانیهٔ دیگر'; // localized var wikipedia_page = new Morebits.wiki.page(userTalkPage, 'ویرایش صفحهٔ بحث کاربر'); // localized wikipedia_page.setCallbackParameters(params); wikipedia_page.setFollowRedirect(true); wikipedia_page.load(Twinkle.warn.callbacks.main); }; })(jQuery); //
This article "Gadget-twinklewarn-2020.js" is from Wikipedia. The list of its authors can be seen in its historical and/or the page Edithistory:Gadget-twinklewarn-2020.js. Articles copied from Draft Namespace on Wikipedia could be seen on the Draft Namespace of Wikipedia and not main one.