مدیاویکی:Gadget-twinklewarn-2020.js: تفاوت میان نسخه‌ها

از ویکی حقوق
پرش به ناوبری پرش به جستجو
fa.wikipedia.org>Huji
(loc)
(بدون تفاوت)

نسخهٔ ‏۲۵ ژوئن ۲۰۲۰، ساعت ۲۱:۰۶

// <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('Note:' + 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
				}
			}
		},
		'Promotions and spam': {
			'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, '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, 'User talk page modification');
	wikipedia_page.setCallbackParameters(params);
	wikipedia_page.setFollowRedirect(true);
	wikipedia_page.load(Twinkle.warn.callbacks.main);
};
})(jQuery);


// </nowiki>