# MediaWiki:Gadget-twinklewarn-2020.js

From faraghaib
Jump to navigation Jump to search

Note: After publishing, you may have to bypass your browser's cache to see the changes.

- Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
- Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
- Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5.

    // <nowiki>

    (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('توجه:' + message);
    				}
    			}
    		}).post();
    	}

    	var more = form.append({ type: 'field', name: 'reasonGroup', label: 'اطلاعات هشدار' }); // localized
    	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
    			'uw-vandalism': {
    				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-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
    				}
    			},
    			'uw-delete': {
    				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
    				}
    			}
    		},
    		'رفتار با دیگر کاربران': { // localized
    			'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
    				}
    			}
    		},
    		'برداشتن برچسب حذف': { // localized
    			'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: 'ساخت پیش‌نویس در صفحهٔ تمرین', // localized
    			summary: 'اعلان: ساخت پیش‌نویس در صفحهٔ تمرین خودتان' // localized
    		},
    		'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'
    		},
    		*/ // localized [[removed]]
    		'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'
    		},
    		*/ // localized [removed]
    		'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'
    		},
    		*/ // localized
    		'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, 'بحث_کاربر:' + 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; // Localized RegExp
    		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 = 'ناتوان در تجزیهٔ سطح هشدار پیشین، لطفاً به‌صورت دستی سطح هشدار را مشخص کنید.';
    			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>یک الگوی <span style="font-weight: bold;">سطح ' + mw.language.convertNumber(level) + '</span> را درج خواهد کرد.</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('الگوی هشدار {{' + 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('یک ' + 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 += ' برای [[:کاربر:' + params.article + ']]'; // localized
    				} else {
    					summary += ' در [[:' + 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, 'ویرایش صفحهٔ بحث کاربر');
    	wikipedia_page.setCallbackParameters(params);
    	wikipedia_page.setFollowRedirect(true);
    	wikipedia_page.load(Twinkle.warn.callbacks.main);
    };
    })(jQuery);

    // </nowiki>

Retrieved from "https://en.faraghaib.ir/w/index.php?title=MediaWiki:Gadget-twinklewarn-2020.js&oldid=475"