مدیاویکی:Gadget-friendlytag-2020.js

از ویکی‌پدیا، دانشنامهٔ آزاد

نکته: برای دیدن تغییرات، ممکن است نیاز باشد که حافظهٔ نهانی مرورگر خود را پس از انتشار پاک‌سازی کنید. گوگل کروم، فایرفاکس، مایکروسافت اج و سافاری: کلید Shift را نگه دارید و روی دکمهٔ Reload در نوار ابزار مرورگر کلیک کنید. برای آگاهی از جزئیات و نحوهٔ پاک‌سازی حافظهٔ نهانی سایر مرورگرها، صفحهٔ ویکی‌پدیا:میانگیر مرورگرتان را خالی کنید را ببینید.

// <nowiki>

(function($) {


/*
 ****************************************
 *** friendlytag.js: Tag module
 ****************************************
 * Mode of invocation:     Tab ("Tag")
 * Active on:              Existing articles and drafts; file pages with a corresponding file
 *                         which is local (not on Commons); all redirects
 */

Twinkle.tag = function friendlytag() {
	// redirect tagging
	if (Morebits.wiki.isPageRedirect()) {
		Twinkle.tag.mode = 'redirect';
		Twinkle.addPortletLink(Twinkle.tag.callback, 'برچسب', 'friendly-tag', 'برچسب ردهٔ تغییرمسیر'); // localized
	// file tagging
	} else if (mw.config.get('wgNamespaceNumber') === 6 && !document.getElementById('mw-sharedupload') && document.getElementById('mw-imagepage-section-filehistory')) {
		Twinkle.tag.mode = 'file';
		Twinkle.addPortletLink(Twinkle.tag.callback, 'برچسب', 'friendly-tag', 'زدن برچسب‌های نگهداری به پرونده'); // localized
	// article/draft article tagging
	} else if ([0, 118].indexOf(mw.config.get('wgNamespaceNumber')) !== -1 && mw.config.get('wgCurRevisionId')) {
		Twinkle.tag.mode = 'article';
		// Can't remove tags when not viewing current version
		Twinkle.tag.canRemove = (mw.config.get('wgCurRevisionId') === mw.config.get('wgRevisionId')) &&
			// Disabled on latest diff because the diff slider could be used to slide
			// away from the latest diff without causing the script to reload
			!mw.config.get('wgDiffNewId');
		Twinkle.addPortletLink(Twinkle.tag.callback, 'برچسب', 'friendly-tag', 'افزودن یا حذف برچسب‌های نگهداری مقاله'); // localized
	}
};

Twinkle.tag.checkedTags = [];

Twinkle.tag.callback = function friendlytagCallback() {
	var Window = new Morebits.simpleWindow(630, Twinkle.tag.mode === 'article' ? 500 : 400);
	Window.setScriptName('توینکل');
	// anyone got a good policy/guideline/info page/instructional page link??
	Window.addFooterLink('راهنمای توینکل', 'en:WP:TW/DOC#tag');

	var form = new Morebits.quickForm(Twinkle.tag.callback.evaluate);

	form.append({
		type: 'input',
		label: 'پالایش سریع: ', // localized
		name: 'quickfilter',
		size: '30px',
		event: function twinkletagquickfilter() {
			// flush the DOM of all existing underline spans
			$allCheckboxDivs.find('.search-hit').each(function(i, e) {
				var label_element = e.parentElement;
				// This would convert <label>Hello <span class=search-hit>wo</span>rld</label>
				// to <label>Hello world</label>
				label_element.innerHTML = label_element.textContent;
			});

			if (this.value) {
				$allCheckboxDivs.hide();
				$allHeaders.hide();
				var searchString = this.value;
				var searchRegex = new RegExp(mw.util.escapeRegExp(searchString), 'i');

				$allCheckboxDivs.find('label').each(function () {
					var label_text = this.textContent;
					var searchHit = searchRegex.exec(label_text);
					if (searchHit) {
						var range = document.createRange();
						var textnode = this.childNodes[0];
						range.selectNodeContents(textnode);
						range.setStart(textnode, searchHit.index);
						range.setEnd(textnode, searchHit.index + searchString.length);
						var underline_span = $('<span>').addClass('search-hit').css('text-decoration', 'underline')[0];
						range.surroundContents(underline_span);
						this.parentElement.style.display = 'block'; // show
					}
				});
			} else {
				$allCheckboxDivs.show();
				$allHeaders.show();
			}
		}
	});

	switch (Twinkle.tag.mode) {
		case 'article':
			Window.setTitle('افزودن برچسب‌های نگهداری مقاله');

			form.append({
				type: 'select',
				name: 'sortorder',
				label: 'مشاهده این فهرست:', // localized
				tooltip: 'می‌توانید ترتیب پیش‌فرض نمایش را در ترجیحات توینکل خود تغییر دهید (وپ:توینکل تر).', // localized
				event: Twinkle.tag.updateSortOrder,
				list: [
					{ type: 'option', value: 'cat', label: 'بر پایه رده', selected: Twinkle.getPref('tagArticleSortOrder') === 'cat' }, // localized
					{ type: 'option', value: 'alpha', label: 'به‌ترتیب الفبا', selected: Twinkle.getPref('tagArticleSortOrder') === 'alpha' } // localized
				]
			});


			if (!Twinkle.tag.canRemove) {
				var divElement = document.createElement('div');
				divElement.innerHTML = 'برای حذف برچسب‌های موجود، لطفاً منوی برچسب را از نسخهٔ کنونی مقاله باز کنید'; // localized
				form.append({
					type: 'div',
					name: 'untagnotice',
					label: divElement
				});
			}

			form.append({
				type: 'div',
				id: 'tagWorkArea',
				className: 'morebits-scrollbox',
				style: 'max-height: 28em'
			});

			form.append({
				type: 'checkbox',
				list: [
					{
						label: 'گروه‌بندی برچسب‌ها در {{مشکلات متعدد}}، در صورت امکان', // localized
						value: 'group',
						name: 'group',
						tooltip: 'در صورتی که در حال افزودن دو یا چند الگویی که توسط {{مشکلات متعدد}} پشتیبانی می‌شوند هستید و این گزینه نیز انتخاب شده‌است، تمامی الگوهای پشتیبانی‌شده در درون الگوی {{مشکلات متعدد}} گروه‌بندی خواهند شد.', // localized
						checked: Twinkle.getPref('groupByDefault')
					}
				]
			});

			form.append({
				type: 'input',
				label: 'دلیل',
				name: 'reason',
				tooltip: 'دلیل اختیاری برای پیوست‌شدن به خلاصه ویرایش. ذکر دلیل به‌هنگام حذف برچسب‌ها توصیه می‌شود.', // localized
				size: '60px'
			});

			break;

		case 'file':
			Window.setTitle('افزودن برچسب‌های نگهداری پرونده');

			form.append({ type: 'header', label: 'برچسب‌های مشکلات مجوز و منبع‌دهی' }); // localized
			form.append({ type: 'checkbox', name: 'fileTags', list: Twinkle.tag.file.licenseList });

			form.append({ type: 'header', label: 'برچسب‌های مرتبط با ویکی‌انبار' }); // localized
			form.append({ type: 'checkbox', name: 'fileTags', list: Twinkle.tag.file.commonsList });

			form.append({ type: 'header', label: 'برچسب‌های تمیزکاری' }); // localized
			form.append({ type: 'checkbox', name: 'fileTags', list: Twinkle.tag.file.cleanupList });

			form.append({ type: 'header', label: 'برچسب‌های کیفیت تصویر' }); // localized
			form.append({ type: 'checkbox', name: 'fileTags', list: Twinkle.tag.file.qualityList });

			form.append({ type: 'header', label: 'برچسب‌های جایگزینی' }); // localized
			form.append({ type: 'checkbox', name: 'fileTags', list: Twinkle.tag.file.replacementList });

			if (Twinkle.getPref('customFileTagList').length) {
				form.append({ type: 'header', label: 'برچسب‌های سفارشی' }); // localized
				form.append({ type: 'checkbox', name: 'fileTags', list: Twinkle.getPref('customFileTagList') });
			}
			break;

		case 'redirect':
			Window.setTitle('افزودن برچسب های تغییرمسیر');

			form.append({ type: 'header', label: 'الگوهای تلفظ، تلفظ اشتباه و زمان افعال' });
			form.append({ type: 'checkbox', name: 'redirectTags', list: Twinkle.tag.spellingList });

			form.append({ type: 'header', label: 'الگوهای نام جایگزین' }); // localized
			form.append({ type: 'checkbox', name: 'redirectTags', list: Twinkle.tag.alternativeList });

			form.append({ type: 'header', label: 'الگوهای تغییرمسیر گوناگون و مدیریتی' }); // localized
			form.append({ type: 'checkbox', name: 'redirectTags', list: Twinkle.tag.administrativeList });

			if (Twinkle.getPref('customRedirectTagList').length) {
				form.append({ type: 'header', label: 'برچسب‌های سفارشی' }); // localized
				form.append({ type: 'checkbox', name: 'redirectTags', list: Twinkle.getPref('customRedirectTagList') });
			}
			break;

		default:
			alert('Twinkle.tag: unknown mode ' + Twinkle.tag.mode);
			break;
	}

	if (document.getElementsByClassName('patrollink').length) {
		form.append({
			type: 'checkbox',
			list: [
				{
					label: 'علامت زدن صفحه به‌عنوان گشت‌خورده/بازبینی‌شده', // localized
					value: 'patrolPage',
					name: 'patrolPage',
					checked: Twinkle.getPref('markTaggedPagesAsPatrolled')
				}
			]
		});
	}
	form.append({ type: 'submit', className: 'tw-tag-submit' });

	var result = form.render();
	Window.setContent(result);
	Window.display();

	// for quick filter:
	$allCheckboxDivs = $(result).find('[name$=Tags]').parent();
	$allHeaders = $(result).find('h5');
	result.quickfilter.focus();  // place cursor in the quick filter field as soon as window is opened
	result.quickfilter.autocomplete = 'off'; // disable browser suggestions
	result.quickfilter.addEventListener('keypress', function(e) {
		if (e.keyCode === 13) { // prevent enter key from accidentally submitting the form
			e.preventDefault();
			return false;
		}
	});

	if (Twinkle.tag.mode === 'article') {

		Twinkle.tag.alreadyPresentTags = [];

		if (Twinkle.tag.canRemove) {
			// Look for existing maintenance tags in the lead section and put them in array

			// All tags are HTML table elements that are direct children of .mw-parser-output,
			// except when they are within {{multiple issues}}
			$('.mw-parser-output').children().each(function parsehtml(i, e) {

				// break out on encountering the first heading, which means we are no
				// longer in the lead section
				if (e.tagName === 'H2') {
					return false;
				}

				// The ability to remove tags depends on the template's {{ambox}} |name=
				// parameter bearing the template's correct name (preferably) or a name that at
				// least redirects to the actual name

				// All tags have their first class name as "box-" + template name
				if (e.className.indexOf('box-') === 0) {
					if (e.classList[0] === 'box-مشکلات_متعدد') {
						$(e).find('.ambox').each(function(idx, e) {
							var tag = e.classList[0].slice(4).replace(/_/g, ' ');
							Twinkle.tag.alreadyPresentTags.push(tag);
						});
						return true; // continue
					}

					var tag = e.classList[0].slice(4).replace(/_/g, ' ');
					Twinkle.tag.alreadyPresentTags.push(tag);
				}
			});

			// {{رده‌بندی‌نشده}} and {{بهبود رده‌ها}} are usually placed at the end
			if ($('.box-رده‌بندی‌نشده').length) {
				Twinkle.tag.alreadyPresentTags.push('رده‌بندی‌نشده');
			}
			if ($('.box-بهبود_رده‌ها').length) {
				Twinkle.tag.alreadyPresentTags.push('بهبود رده‌ها');
			}

		}

		// Add status text node after Submit button
		var statusNode = document.createElement('small');
		statusNode.id = 'tw-tag-status';
		Twinkle.tag.status = {
			// initial state; defined like this because these need to be available for reference
			// in the click event handler
			numAdded: 0,
			numRemoved: 0
		};
		$('button.tw-tag-submit').after(statusNode);

		// fake a change event on the sort dropdown, to initialize the tag list
		var evt = document.createEvent('Event');
		evt.initEvent('change', true, true);
		result.sortorder.dispatchEvent(evt);

	} else {
		// Redirects and files: Add a link to each template's description page
		Morebits.quickForm.getElements(result, Twinkle.tag.mode + 'Tags').forEach(generateLinks);
	}
};


// $allCheckboxDivs and $allHeaders are defined globally, rather than in the
// quickfilter event function, to avoid having to recompute them on every keydown
var $allCheckboxDivs, $allHeaders;

Twinkle.tag.updateSortOrder = function(e) {
	var form = e.target.form;
	var sortorder = e.target.value;
	Twinkle.tag.checkedTags = form.getChecked('articleTags') || [];

	var container = new Morebits.quickForm.element({ type: 'fragment' });

	// function to generate a checkbox, with appropriate subgroup if needed
	var makeCheckbox = function(tag, description) {
		var checkbox = { value: tag, label: '{{' + tag + '}}: ' + description };
		if (Twinkle.tag.checkedTags.indexOf(tag) !== -1) {
			checkbox.checked = true;
		}
		switch (tag) {
			case 'تمیزکاری ۲':
				checkbox.subgroup = {
					name: 'cleanup',
					type: 'input',
					label: 'دلیل مشخص برای اینکه چرا به تمیزکاری نیاز است: ', // localized
					tooltip: 'الزامی.', // localized
					size: 35
				};
				break;
			case 'بازنویسی نزدیک':
				checkbox.subgroup = {
					name: 'closeParaphrasing',
					type: 'input',
					label: 'منبع: ', // localized
					tooltip: 'منبعی که به‌طور نزدیک بازنویسی شده‌است' // localized
				};
				break;
			case 'ویراستاری':
				checkbox.subgroup = {
					name: 'copyEdit',
					type: 'input',
					label: '«این نوشتار برای ... به ویراستاری نیاز دارد» ', // localized
					tooltip: 'به‌عنوان مثال، «یکپارچه شدن املا». اختیاری.', // localized
					size: 35
				};
				break;
			case 'کپی':
				checkbox.subgroup = {
					name: 'copypaste',
					type: 'input',
					label: 'نشانی منبع: ', // localized
					tooltip: 'اگر مشخص است.', // localized
					size: 50
				};
				break;
			case 'گسترش از زبان':
				checkbox.subgroup = [ {
					name: 'expandLanguageLangCode',
					type: 'input',
					label: 'شناسهٔ زبان: ', // localized
					tooltip: 'شناسهٔ زبانی که مقاله می‌تواند از روی آن گسترش داده‌شود' // localized
				}, {
					name: 'expandLanguageArticle',
					type: 'input',
					label: 'عنوان مقاله: ', // localized
					tooltip: 'عنوان مقاله‌ای که گسترش از روی آن انجام می‌شود، بدون پیشوند میان‌ویکی' // localized
				}
				];
				break;
			case 'متخصص':
				checkbox.subgroup = [
					{
						name: 'expertNeeded',
						type: 'input',
						label: 'عنوان ویکی‌پروژهٔ مرتبط: ', // localized
						tooltip: 'به‌طور انتخابی، نام ویکی‌پروژه‌ای که می‌تواند به جذب یک کاربر باتجربه کمک کند را وارد کنید. بدون پیشوند «ویکی‌پروژه».' // localized
					},
					{
						name: 'expertNeededReason',
						type: 'input',
						label: 'دلیل: ', // localized
						tooltip: 'توضیح کوتاه برای توصیف مشکل. پیوند به دلیل یا بحث الزامی است.' // localized
					},
					{
						name: 'expertNeededTalk',
						type: 'input',
						label: 'ریسهٔ بحث: ', // localized
						tooltip: 'عنوان بخشی از صفحهٔ بحث این مقاله که بحث دربارهٔ مشکل در آن جریان دارد. نیاز به درج پیوند نیست، تنها عنوان بخش را وارد کنید. پیوند به دلیل یا بحث الزامی است.' // localized
					}
				];
				break;
			case 'تعمیم':
				checkbox.subgroup = {
					name: 'globalizeRegion',
					type: 'input',
					label: 'منطقه یا کشورِی که این مقاله بیش از اندازه بر آن متمرکز است' // localized
				};
				break;
			case 'ادغام تاریخچه':
				checkbox.subgroup = [
					{
						name: 'histmergeOriginalPage',
						type: 'input',
						label: 'مقالهٔ دیگر: ', // localized
						tooltip: 'عنوان صفحه‌ای که تاریخچه‌اش می‌تواند در این مقاله ادغام شود (الزامی).' // localized
					},
					{
						name: 'histmergeReason',
						type: 'input',
						label: 'دلیل: ', // localized
						tooltip: 'توضیح کوتاه که دلیل نیاز به ادغام تاریخچه را بیان کند. بهتر است با عبارت «زیرا» آغاز نشود و با یک نقطه پایان یابد.' // localized
					},
					{
						name: 'histmergeSysopDetails',
						type: 'input',
						label: 'جزئیات بیشتر: ', // localized
						tooltip: 'برای موارد پیچیده، راهنمایی‌های بیشتری را در اختیار مدیر بررسی‌کننده قرار دهید.' // localized
					}
				];
				break;
			case 'ادغام':
			case 'ادغام از':
			case 'ادغام در':
				var otherTagName = 'ادغام';
				switch (tag) {
					case 'ادغام از':
						otherTagName = 'ادغام در';
						break;
					case 'ادغام در':
						otherTagName = 'ادغام از';
						break;
					// no default
				}
				checkbox.subgroup = [
					{
						name: 'mergeTarget',
						type: 'input',
						label: 'مقاله(های) دیگر: ', // localized
						tooltip: 'اگر قصد دارید مقاله‌های متعدد را مشخص کنید، آن‌ها را با نویسهٔ لوله از هم جدا کنید: مقالهٔ اول|مقالهٔ دوم' // localized
					},
					{
						name: 'mergeTagOther',
						type: 'checkbox',
						list: [
							{
								label: 'مقالهٔ دیگر را با یک برچسب {{' + otherTagName + '}} مشخص کنید', // localized
								checked: true,
								tooltip: 'فقط در صورتی که تنها عنوان یک مقاله وارد شده‌باشد، در دسترس است.' // localized
							}
						]
					}
				];
				if (mw.config.get('wgNamespaceNumber') === 0) {
					checkbox.subgroup.push({
						name: 'mergeReason',
						type: 'textarea',
						label: 'دلیل اصلی برای ادغام (بر روی صفحهٔ بحث' +
							(tag === 'ادغام در' ? 'مقالهٔ مقصد' : 'این مقاله') + ' قرار خواهد گرفت):', // localized
						tooltip: 'انتخابی، اما به‌شدت توصیه‌شده. در صورت عدم تمایل، خالی بگذارید. فقط در صورتی که تنها عنوان یک مقاله وارد شده‌باشد، در دسترس است.' // localized
					});
				}
				break;
			case 'اصلاح ترجمه':
			case 'ترجمه تقریبی':
				checkbox.subgroup = [
					{
						name: 'translationLanguage',
						type: 'input',
						label: 'زبان مقاله (اگر مشخص است): ', // localized
						tooltip: 'برای راهنمایی، مرور [[en:WP:LRC]] را در نظر داشته‌باشید. اگر مقاله را در صفحهٔ مقاله‌های نیازمند ترجمه فهرست می‌کنید، لطفاً از خالی‌گذاشتن این جعبه خودداری کنید؛ مگر آنکه کاملاً نامطمئن باشید.' // localized
					}
				];
				if (tag === 'اصلاح ترجمه') {
					checkbox.subgroup.push({
						name: 'translationNotify',
						type: 'checkbox',
						list: [
							{
								label: 'اطلاع‌رسانی به سازندهٔ مقاله', // localized
								checked: true,
								tooltip: "الگوی {{uw-notenglish}} را در صفحهٔ بحث سازندهٔ مقاله قرار می‌دهد." // localized
							}
						]
					});
				}
				if (mw.config.get('wgNamespaceNumber') === 0) {
					checkbox.subgroup.push({
						name: 'translationPostAtPNT',
						type: 'checkbox',
						list: [
							{
								label: 'فهرست‌کردن این مقاله در ویکی‌پدیا:صفحه‌های نیازمند ترجمه به فارسی (PNT)', // localized
								checked: true
							}
						]
					});
					checkbox.subgroup.push({
						name: 'translationComments',
						type: 'textarea',
						label: 'توضیح بیشتر برای ارسال به ویکی‌پدیا:صفحه‌های نیازمند ترجمه به فارسی', // localized
						tooltip: 'انتخابی، و متناسب تنها در صورتی که "فهرست‌کردن این مقاله..." در بالا انتخاب شده‌باشد.' // localized
					});
				}
				break;
			case 'سرشناسی':
				checkbox.subgroup = {
					name: 'notability',
					type: 'select',
					list: [
						{ label: "{{سرشناسی}}: موضوع مقاله ممکن است رهنمود اصلی سرشناسی را احراز نکند", value: 'none' }, // localized
						{ label: '{{سرشناسی|دانشگاهیان}}: رهنمود سرشناسی دانشگاهیان', value: 'دانشگاهیان' }, // localized
						{ label: '{{سرشناسی|اجرام آسمانی}}: رهنمود سرشناسی اجرام آسمانی', value: 'فضا' }, // localized
						{ label: '{{سرشناسی|افراد}}: رهنمود سرشناسی زندگی‌نامه افراد', value: 'زندگی‌نامه' }, // localized
						{ label: '{{سرشناسی|کتاب‌ها}}: رهنمود سرشناسی کتاب', value: 'کتاب' }, // localized
						{ label: '{{سرشناسی|سازمان‌ها}}: رهنمودهای سرشناسی شرکت‌ها و سازمان‌ها', value: 'شرکت' }, // localized
						{ label: '{{سرشناسی|رویدادها}}: رهنمود سرشناسی برای رویدادها', value: 'رویداد' }, // localized
						{ label: '{{سرشناسی|فیلم‌ها}}: رهنمود سرشناسی فیلم‌ها', value: 'فیلم' }, // localized
						{ label: '{{سرشناسی|مکان}}: رهنمود سرشناسی ویژگی‌های جغرافیایی', value: 'جغرافیا' }, // localized
						{ label: '{{سرشناسی|فهرست‌ها}}: رهنمود سرشناسی فهرست‌های مسقل', value: 'فهرست' }, // localized
						{ label: '{{سرشناسی|موسیقی}}: رهنمود سرشناسی موسیقی', value: 'موسیقی' }, // localized
						{ label: '{{سرشناسی|نوواژه‌ها}}: رهنمود سرشناسی نوواژه‌ها', value: 'نوواژه' }, // localized
						{ label: '{{سرشناسی|عددها}}: رهنمود سرشناسی عددها', value: 'عدد' }, // localized
						{ label: '{{سرشناسی|محصولات}}: رهنمود سرشناسی محصولات و خدمات', value: 'محصول' }, // localized
						{ label: '{{سرشناسی|ورزش‌ها}}: رهنمود سرشناسی ورزش‌ها', value: 'ورزش' }, // localized
						{ label: '{{سرشناسی|تلویزیون}}: رهنمود سرشناسی برنامه‌های تلویزیونی', value: 'تلویزیون' }, // localized
						{ label: '{{سرشناسی|وب}}: رهنمود سرشناسی مجتوای وب', value: 'وب' } // localized
					]
				};
				break;
			default:
				break;
		}
		return checkbox;
	};

	var makeCheckboxesForAlreadyPresentTags = function() {
		container.append({ type: 'header', id: 'tagHeader0', label: 'برچسب‌های از پیش موجود' });
		var subdiv = container.append({ type: 'div', id: 'tagSubdiv0' });
		var checkboxes = [];
		var unCheckedTags = e.target.form.getUnchecked('alreadyPresentArticleTags') || [];
		Twinkle.tag.alreadyPresentTags.forEach(function(tag) {
			var description = Twinkle.tag.article.tags[tag];
			var checkbox =
				{
					value: tag,
					label: '{{' + tag + '}}' + (description ? ': ' + description : ''),
					checked: unCheckedTags.indexOf(tag) === -1,
					style: 'font-style: italic'
				};

			checkboxes.push(checkbox);
		});
		subdiv.append({
			type: 'checkbox',
			name: 'alreadyPresentArticleTags',
			list: checkboxes
		});
	};

	if (sortorder === 'cat') { // categorical sort order
		// function to iterate through the tags and create a checkbox for each one
		var doCategoryCheckboxes = function(subdiv, array) {
			var checkboxes = [];
			$.each(array, function(k, tag) {
				var description = Twinkle.tag.article.tags[tag];
				if (Twinkle.tag.alreadyPresentTags.indexOf(tag) === -1) {
					checkboxes.push(makeCheckbox(tag, description));
				}
			});
			subdiv.append({
				type: 'checkbox',
				name: 'articleTags',
				list: checkboxes
			});
		};

		if (Twinkle.tag.alreadyPresentTags.length > 0) {
			makeCheckboxesForAlreadyPresentTags();
		}
		var i = 1;
		// go through each category and sub-category and append lists of checkboxes
		$.each(Twinkle.tag.article.tagCategories, function(title, content) {
			container.append({ type: 'header', id: 'tagHeader' + i, label: title }); // localized
			var subdiv = container.append({ type: 'div', id: 'tagSubdiv' + i++ });
			if (Array.isArray(content)) {
				doCategoryCheckboxes(subdiv, content);
			} else {
				$.each(content, function(subtitle, subcontent) {
					subdiv.append({ type: 'div', label: [ Morebits.htmlNode('b', subtitle) ] });
					doCategoryCheckboxes(subdiv, subcontent);
				});
			}
		});
	} else { // alphabetical sort order
		if (Twinkle.tag.alreadyPresentTags.length > 0) {
			makeCheckboxesForAlreadyPresentTags();
			container.append({ type: 'header', id: 'tagHeader1', label: 'برچسب‌های قابل استفاده' }); // localized
		}
		var checkboxes = [];
		$.each(Twinkle.tag.article.tags, function(tag, description) {
			if (Twinkle.tag.alreadyPresentTags.indexOf(tag) === -1) {
				checkboxes.push(makeCheckbox(tag, description));
			}
		});
		container.append({
			type: 'checkbox',
			name: 'articleTags',
			list: checkboxes
		});
	}

	// append any custom tags
	if (Twinkle.getPref('customTagList').length) {
		container.append({ type: 'header', label: 'برچسب‌های سفارشی' }); // localized
		container.append({ type: 'checkbox', name: 'articleTags',
			list: Twinkle.getPref('customTagList').map(function(el) {
				el.checked = Twinkle.tag.checkedTags.indexOf(el.value) !== -1;
				return el;
			})
		});
	}

	var $workarea = $(form).find('#tagWorkArea');
	var rendered = container.render();
	$workarea.empty().append(rendered);

	// for quick filter:
	$allCheckboxDivs = $workarea.find('[name$=Tags]').parent();
	$allHeaders = $workarea.find('h5, .quickformDescription');
	form.quickfilter.value = ''; // clear search, because the search results are not preserved over mode change
	form.quickfilter.focus();

	// style adjustments
	$workarea.find('h5').css({ 'font-size': '110%' });
	$workarea.find('h5:not(:first-child)').css({ 'margin-top': '1em' });
	$workarea.find('div').filter(':has(span.quickformDescription)').css({ 'margin-top': '0.4em' });

	var alreadyPresentTags = Morebits.quickForm.getElements(form, 'alreadyPresentArticleTags');
	if (alreadyPresentTags) {
		alreadyPresentTags.forEach(generateLinks);
	}
	// in the unlikely case that *every* tag is already on the page
	var notPresentTags = Morebits.quickForm.getElements(form, 'articleTags');
	if (notPresentTags) {
		notPresentTags.forEach(generateLinks);
	}

	// tally tags added/removed, update statusNode text
	var statusNode = document.getElementById('tw-tag-status');
	$('[name=articleTags], [name=alreadyPresentArticleTags]').click(function() {
		if (this.name === 'articleTags') {
			Twinkle.tag.status.numAdded += this.checked ? 1 : -1;
		} else if (this.name === 'alreadyPresentArticleTags') {
			Twinkle.tag.status.numRemoved += this.checked ? -1 : 1;
		}

		var firstPart = 'افزودن ' + mw.language.convertNumber(Twinkle.tag.status.numAdded) + ' برچسب' + (Twinkle.tag.status.numAdded > 1 ? '' : '');
		var secondPart = 'حذف ' + mw.language.convertNumber(Twinkle.tag.status.numRemoved) + ' برچسب' + (Twinkle.tag.status.numRemoved > 1 ? '' : '');
		statusNode.textContent =
			(Twinkle.tag.status.numAdded ? '  ' + firstPart : '') +
			(Twinkle.tag.status.numRemoved ? (Twinkle.tag.status.numAdded ? '؛ ' : '  ') + secondPart : '');
	});
};

/**
 * Adds a link to each template's description page
 * @param {Morebits.quickForm.element} checkbox  associated with the template
 */
var generateLinks = function(checkbox) {
	var link = Morebits.htmlNode('a', '>');
	link.setAttribute('class', 'tag-template-link');
	var tagname = checkbox.values;
	link.setAttribute('href', mw.util.getUrl(
		(tagname.indexOf(':') === -1 ? 'Template:' : '') +
		(tagname.indexOf('|') === -1 ? tagname : tagname.slice(0, tagname.indexOf('|')))
	));
	link.setAttribute('target', '_blank');
	$(checkbox).parent().append(['\u00A0', link]);
};


// Tags for ARTICLES start here

Twinkle.tag.article = {};

// A list of all article tags, in alphabetical order
// To ensure tags appear in the default "categorized" view, add them to the tagCategories hash below.

Twinkle.tag.article.tags = {
	'تبلیغات': 'مشابه یک متن تبلیغاتی نوشته شده‌است', // localized
	'خلاصه صرف': 'تقریباً به‌طور کامل یک خلاصهٔ صرف از اثر است', // localized
	'خودزندگی‌نامه': 'خودزندگی‌نامه است و احتمالاً بی‌طرفانه نوشته نشده‌است', // localized
	'منبع زنده': 'زندگی‌نامهٔ زندگان که برای تأییدپذیری نیامند منابع بیشتر است', // localized
	'بدون منبع زنده': 'زندگی‌نامهٔ زندگان که هیچ منبعی ندارد (برای مقاله‌های جدید، از حذف زماندار زندگی‌نامه زندگان اسفاده کنید)', // localized
	'سبک یادکرد': 'از سبک یادکرد مبهم یا متناقض برخوردار است', // localized
	'تمیزکاری ۲': 'نیازمند تمیزکاری است', // localized
	'نشانی‌های وب عریان': 'از پیوندهای عریان برای ارجاع استفاده می‌کند، که مستعد خراب‌شدن پیوند است', // localized
	'انتشار خبری': 'مشابه یک انتشار مطبوعاتی یا مقالهٔ خبری نوشته شده‌است', // localized
	'بازسازماندهی': "برای سازگار شدن با رهنمودهای قالب‌بندی ویکی‌پدیا، نیازمند سازماندهی مجدد است", // localized
	'بازنویسی': "برای سازگار شدن با استانداردهای کیفی ویکی‌پدیا× نیازمند بازنویسی عمده است", // localized
	'زمان فعل': 'از رهنمودهای استفاده از زمان‌های مختلف افعال پیروی نمی‌کند.', // localized
	'بازنویسی نزدیک': 'دربردارندهٔ بازنویسی نزدیک از یک منبع غیرآزاد دارای حق تکثیر است', // localized
	'تعارض منافع': 'سازنده یا مشارکت‌کنندهٔ عمده ممکن است دارای تعارض منافع باشد', // localized
	'بخش‌بندی بیش از اندازه': 'تعداد زیاد عنوان‌های بخش که محتوا را پراکنده کرده‌اند', // localized
	'گیج‌کننده': 'گیج‌کننده و مبهم', // localized
	'زمینه': 'زمینهٔ ناکافی برای کسانی که با موضوع آشنا نیستند', // localized
	'ویراستاری': 'نیازمند ویراستاری دستور زبان، سبک، انسجام، لحن، یا آوانگاری', // localized
	'کپی': 'به‌نظر می‌رسد از جای دیگری کپی‌کاری شده‌است', // localized
	'رویداد روز': 'دربردارندهٔ یک رویداد روز است', // localized
	'بن‌بست': 'مقاله به هیچ مقالهٔ دیگری پیوند ندارد', // localized
	'درستی': 'دقت در بیان حقایق مورد سؤال است', // localized
	'انشا مانند': 'همانند یک تفکر شخصی، انشای شخصی یا مقالهٔ استدلالی نوشته شده‌است', // localized
	'گسترش از زبان': 'لازم است که با ترجمهٔ متن از یک مقاله به زبان دیگر، گسترش یابد', // localized
	'متخصص': 'نیازمند توجه از سوی یک فرد آشنا با موضوع است', // localized
	'پیوند به بیرون': 'پیوندهای به بیرون ممکن است از سیاست‌ها یا رهنمودهای محتوایی پیروی نکنند', // localized
	'هواداران': "از دیدگاه یک طرفدار نوشته شده‌است", // localized
	'داستان': 'وجه تمایز میان حقایق و حکایت‌ها مشخص نیست', // localized
	'تعمیم': 'نمایانگر وجههٔ جهانی موضوع نیست', // localized
	//'GOCEinuse': 'currently undergoing a major copy edit by the Guild of Copy Editors', // removed; no guild in fawiki! 
	'ادغام تاریخچه': 'تاریخچهٔ یک صفحهٔ دیگر می‌تواند در تاریخچهٔ این صفحه ادغام شود', // localized
	'کلک': 'کل یا بخشی از آن ممکن است شامل کلک‌زنی باشد', // localized
	'بهبود رده‌ها': 'نیازمند رده‌های تخصصی بیشتر است', // localized
	'غیر قابل درک': 'فهمیدن آن بسیار سخت یا غیرممکن است', // localized
	'در دنیا': 'موضوع، تخیلی است و برای ارائهٔ یک دیدگاه غیرخیالی، نیازمند بازنویسی است', // localized
	'ویرایش': 'برای مدتی کوتاه تحت ویرایش عمده است', // localized
	'فاقد بخش آغازین': 'فاقد بخش آغازین است', // localized
	'بازنویسی بخش آغازین': 'بخش آغازین برای سازگار شدن با رهنمودها، نیازمند بازنویسی است', // localized
	'بخش آغازین بلند': 'بخش آغازین نسبت به طول کلی مقاله بسیار بلند است', // localized
	'بخش آغازین کوتاه': 'بخش آغازین بسیار کوتاه است و برای بیان خلاصه‌ای از نکته‌های کلیدی، نیازمند گسترش است', // localized
	'شبه رزومه': 'همانند یک رزومه نوشته شده‌است', // localized
	'خلاصه داستان طولانی': 'خلاصهٔ طرح بسیار بلند است یا دارای جزئیات بیش از اندازه است', // localized
	'آموزشی': 'همانند یک دفترچهٔ راهنما نوشته شده‌است', // localized
	'ادغام': 'لازم است با یک مقالهٔ مشخص دیگر ادغام شود', // localized
	'ادغام از': 'یک مقالهٔ مشخص دیگر باید در این مقاله ادغام شود', // localized
	'ادغام در': 'لازم است که در یک مقالهٔ مشخص دیگر ادغام شود', // localized
	'بهبود منبع': 'برای تأییدپذیری، نیازمند منابع و ارجاع‌های بیشتر است', // localized
	'پانویس بیشتر': 'چند ارجاع دارد، اما یادکردهای درون‌خطی آن کافی نیستند', // localized
	'بدون پانویس': 'دارای ارجاع است، اما فاقد یادکرد درون‌خطی است', // localized
	'فاقد خلاصه داستان': 'نیازمند خلاصهٔ طرح است', // localized
	'غیر-آزاد': 'ممکن است بیش از اندازه یا به‌طور نادرست از محتوای دارای حق تکثیر استفاده کرده‌باشد', // localized
	'سرشناسی': 'موضوع ممکن است رهنمود اصلی سرشناسی را احراز نکند', // localized
	'اصلاح ترجمه': 'دقیق، کامل و صحیح ترجمه نشده‌است و نیازمند اصلاح ترجمه است',
	'یک منبع': 'به‌طور گسترده یا تنها به یک منبع متکی است', // localized
	'دست‌اول': 'شامل تحقیق دست اول است', // localized
	'یتیم': 'از هیچ مقالهٔ دیگری به آن پیوند داده نشده‌است', // localized
	'پوشش نامتناسب': 'جانبداری گسترده یا پوشش نامتناسب به‌سمت یک یا چند منطقهٔ مشخص', // localized
	'پرپیوند': 'پیوندهای تکراری و/یا نامرتبط زیاد به مقاله‌های دیگر', // localized
	'پرجزئیات': 'مقدار بیش از اندازه از جزئیات پیچیده', // localized
	'پرگفتاورد': 'گفتاوردهای خیلی زیاد یا خیلی طولانی برای یک مدخل دانشنامه‌ای', // localized
	'واژه نامناسب': 'شامل جمله‌بندی‌ است که بدون افزودن اطلاعات، موضوع را به شیوه‌ای انتزاعی تبلیغ می‌کند', // localized
	'طرفداری': 'به دیدگاه بی‌طرف پایبند نیست', // localized
	'منابع اولیه': 'بیش از اندازه بر ارجاع به منابع اولیه متکی است و نیازمند ارجاع به منابع ثانویه است', // localized
	'نثر': 'در قالب یک فهرست نوشته شده‌است، اما در صورتی که به نثر درآید، بهتر خوانده می‌شود', // localized
	'تازه‌گرایی': 'دارای دید یک‌طرفه به رویدادهای اخیر است', // localized
	'ترجمه تقریبی': 'ترجمهٔ ضعیف از یک زبان دیگر', // localized
	'بخش‌بندی': 'نیازمند تقسیم به چند بخش بر پایه موضوع است', // localized
	'خودچاپ‌کرده': 'دارای ارجاع‌های بیش از اندازه و نامناسب به منابع خود چاپ‌کرده است', // localized
	'منابع وجود دارد': 'موضوع سرشناس، منابعی موجود هستند که می‌توانند به مقاله افزوده شوند', // localized
	'فنی': 'به‌اندازه‌ای فنی است که درک آن برای بیشتر مخاطبان سخت است', // localized
	'منبع مستقل': 'به‌شدت به منابعی اتکا دارد که به‌طور نزدیکی با موضوع مرتبط هستند', // localized
	'لحن': 'لحن یا سبک نوشتار بازتاب‌دهندهٔ لحن دانشنامه‌ای به‌کار رفته در ویکی‌پدیا نیست', // localized
	'دیدگاه‌های اندک': 'ممکن است دربردارندهٔ تمامی دیدگاه‌های قابل توجه نباشد', // localized
	'رده‌بندی‌نشده': 'در هیچ رده‌ای قرار نگرفته‌است', // localized
	'در دست ساخت': 'در فرایند گسترش یا بازسازی عمده است', // localized
	'کم‌پیوند': 'نیازمند ویکی‌پیوندهای بیشتر به مقاله‌های دیگر است', // localized
	'ارزش ناحق': 'به بعضی ایده‌ها، وقایع یا حواشی، وزن بی‌مورد داده‌است', // localized
	'نامتمرکز': 'فاقد تمرکز است، یا در مورد بیش از یک موضوع است', // localized
	'بدون منبع': 'به هیچ منبعی استناد نمی‌کند', // localized
	'منابع نامعتبر': 'بعضی منابع ممکن است قابل اعتماد نباشند', // localized
	'دستمزد فاش‌نشده': 'ممکن است در برابر دستمزد فاش‌نشده ایجاد یا ویرایش شده‌باشد', // localized
	'نیازمند به‌روزرسانی': 'نیازمند افزودن اطلاعات به‌روز بیشتر است', // localized
	'طولانی': 'به اندازه‌ای طولانی است که خواندن و گشتن در آن سخت است', // localized
	'طفره‌آمیز': 'به‌دلیل استفاده از الفاظ طفره‌آمیز، بی‌طرفی و اثبات‌پذیری آن به‌خطر افتاده‌است' // localized
};

// A list of tags in order of category
// Tags should be in alphabetical order within the categories
// Add new categories with discretion - the list is long enough as is!

Twinkle.tag.article.tagCategories = {
	'برچسب‌های تمیزکاری و نگهدار': {
		'تمزیکاری عمومی': [
			'تمیزکاری ۲',  // has a subgroup with text input
			'بازنویسی',
			'ویراستاری'  // has a subgroup with text input
		],
		'محتوای بالقوه نامطلوب': [
			'بازنویسی نزدیک',
			'کپی',  // has a subgroup with text input
			'پیوند به بیرون',
			'غیر-آزاد'
		],
		'ساختار، قالب‌بندی و بخش آغازین': [
			'بازسازماندهی',
			'بخش‌بندی بیش از اندازه',
			'فاقد بخش آغازین',
			'بازنویسی بخش آغازین',
			'بخش آغازین بلند',
			'بخش آغازین کوتاه',
			'بخش‌بندی',
			'طولانی'
		],
		'تمیزکاری مرتبط با داستان': [
			'خلاصه صرف',
			'داستان',
			'در دنیا',
			'خلاصه داستان طولانی',
			'فاقد خلاصه داستان'
		]
	},
	'مشکلات محتوایی عمومی': {
		'اهمیت و سرشناسی': [
			'سرشناسی'  // has a subgroup with subcategories
		],
		'سبک نوشتار': [
			'تبلیغات',
			'زمان فعل',
			'انشا مانند',
			'هواداران',
			'شبه رزومه',
			'آموزشی',
			'انتشار خبری',
			'پرگفتاورد',
			'نثر',
			'فنی',
			'لحن'
		],
		'مفهوم (یا فقدان آن)': [
			'گیج‌کننده',
			'غیر قابل درک',
			'نامتمرکز'
		],
		'اطلاعات و جزئیات': [
			'زمینه',
			'متخصص',
			'پرجزئیات',
			'ارزش ناحق'
		],
		'وابستگی به زمان': [
			'رویداد روز',
			'نیازمند به‌روزرسانی'
		],
		'بی‌طرفی، جانبداری و دقت در بیان حقایق': [
			'خودزندگی‌نامه',
			'تعارض منافع',
			'درستی',
			'کلک',
			'تعمیم',
			'پوشش نامتناسب',
			'واژه نامناسب',
			'طرفداری',
			'تازه‌گرایی',
			'دیدگاه‌های اندک',
			'دستمزد فاش‌نشده',
			'طفره‌آمیز'
		],
		'تأییدپذیری و ارجاعات': [
			'منبع زنده',
			'بدون منبع زنده',
			'بهبود منبع',
			'یک منبع',
			'دست‌اول',
			'منابع اولیه',
			'خودچاپ‌کرده',
			'منابع وجود دارد',
			'منبع مستقل',
			'بدون منبع',
			'منابع نامعتبر'
		]
	},
	'مشکلات خاص محتوایی': {
		'زبان': [
			'اصلاح ترجمه',  // has a subgroup with several options
			'ترجمه تقریبی',  // has a subgroup with several options
			'گسترش از زبان'
		],
		'پیوندها': [
			'بن‌بست',
			'یتیم',
			'پرپیوند',
			'کم‌پیوند'
		],
		'شیوهٔ ارجاع': [
			'سبک یادکرد',
			'نشانی‌های وب عریان',
			'پانویس بیشتر',
			'بدون پانویس'
		],
		'رده‌بندی': [
			'بهبود رده‌ها',
			'رده‌بندی‌نشده'
		]
	},
	'ادغام': [
		'ادغام تاریخچه',
		'ادغام',   // these three have a subgroup with several options
		'ادغام از',
		'ادغام در'
	],
	'اطلاع‌رسانی': [
		//'GOCEinuse', removed; no guild in fawiki!
		'ویرایش',
		'در دست ساخت'
	]
};

// Contains those article tags that *do not* work inside {{multiple issues}}.
Twinkle.tag.multipleIssuesExceptions = [
	'کپی',
	'رویداد روز', // Works but not intended for use in MI
	'گسترش از زبان',
	//'GOCEinuse', removed; no guild in fawiki!
	'ادغام تاریخچه',
	'بهبود رده‌ها',
	'ویرایش',
	'ادغام',
	'ادغام از',
	'ادغام در',
	'اصلاح ترجمه',
	'ترجمه تقریبی',
	'رده‌بندی‌نشده',
	'در دست ساخت'
];

// Tags for REDIRECTS start here

Twinkle.tag.spellingList = [
	{
		label: '{{R from acronym}}: تغییرمسیر از یک سرنام (مانند فحن) به قالب گسترش‌یافتهٔ آن', // localized
		value: 'R from acronym'
	},
	{
		label: '{{R from alternative spelling}}: تغییرمسیر از یک عنوان با تلفظ متفاوت', // localized
		value: 'R from alternative spelling'
	},
	{
		label: '{{R from initialism}}: تغییرمسیر از یک سرواژه (مانند BBC) به قالب گسترش‌یافتهٔ آن', // localized
		value: 'R from initialism'
	},
	{
		label: '{{R from ASCII-only}}: redirect from a title in only basic ASCII to the formal article title, with differences that are not diacritical marks (accents, umlauts, etc.) or ligatures', // localized
		value: 'R from ASCII-only'
	},
	{
		label: '{{R from member}}: تغییرمسیر از عضو یک گروه به عنوان مرتبط مانند خود گروه، سازمان یا تیمی که در آن عضویت دارد', // localized
		value: 'R from member'
	},
	{
		label: '{{R from misspelling}}: تغییرمسیر از یک آوانگاری اشتباه یا خطای نشانه‌گذاری', // localized
		value: 'R from misspelling'
	},
	{
		label: '{{R from modification}}: تغییرمسیر از اعمال تغییر بر عنوان هدف، مثلاً مرتب‌سازی مجدد واژگان', // localized
		value: 'R from modification'
	},
	{
		label: '{{R from other capitalisation}}: redirect from a title with another method of capitalisation',
		value: 'R from other capitalisation'
	},
	{
		label: '{{R from plural}}: تغییرمسیر از یک واژهٔ جمع بسته‌شده به معادل مفرد', // localized
		value: 'R from plural'
	},
	{
		label: '{{R from related word}}: تغییرمسیر از یک واژهٔ مرتبط', // Localized
		value: 'R from related word'
	},
	{
		label: '{{R to list entry}}: تغییرمسیر به یک مقاله از نوع «فهرستی از موجودیت‌های جزئی» که شامل توضیحات مختصری در مورد موضوعاتی است که سرشناسی کافی برای داشتن مقالهٔ مستقل را ندارند', // localized
		value: 'R to list entry'
	},
	{
		label: '{{تغییرمسیر به بخش}}: مشابه {{R to list entry}}، اما برای زمانی که فهرست بخش‌بندی شده‌است، مانند فهرستی از شخصیت‌ها در یک دنیای خیالی.', // localized
		value: 'R to section'
	},
	{
		label: '{{R with possibilities}}: تغییرمسیر از یک عنوان اختصاصی‌تر به یک مقالهٔ عمومی‌تر و با جزئیات کمتر، که می‌تواند و بایست که گسترش پیدا کند', // Localized
		value: 'R with possibilities'
	}
];

Twinkle.tag.alternativeList = [
	{
		label: '{{تغییرمسیر از زبانی دیگر}}: تغییرمسیر از یک نام فارسی به نامی به زبان دیگر، یا برعکس', // localized
		value: 'R from alternative language',
		subgroup: [
			{
				name: 'altLangFrom',
				type: 'input',
				label: 'از زبان (شناسه دوحرفی): ', // localized
				tooltip: 'شناسهٔ دوحرفی زبانی که عنوان تغییرمسیر به آن زبان نوشته شده‌است را وارد کنید؛ مانند fa برای فارسی و en برای انگلیسی' // localized
			},
			{
				name: 'altLangTo',
				type: 'input',
				label: 'به زبان (شناسه دوحرفی): ', // localized
				tooltip: 'شناسهٔ دوحرفی زبانی که عنوان هدف به آن زبان نوشته شده‌است را وارد کنید؛ مانند fa برای فارسی و en برای انگلیسی' // localized
			},
			{
				name: 'altLangInfo',
				type: 'div',
				label: $.parseHTML('<p>برای فهرستی از شناسه‌های زبان‌ها، <a href="/wiki/Wp:Template_messages/Redirect_language_codes">en:Wikipedia:Template messages/Redirect language codes</a></p> را ببینید') // localized
			}
		]
	},
	{
		label: '{{R from alternative name}}: تغییرمسیر از عنوانی که نام دیگر، نام مستعار، نام خودمانی یا نام مترادف است', // localized
		value: 'R from alternative name'
	},
	{
		label: '{{R from former name}}: تغییرمسیر از نام یا عنوان کاری سابق', // localized
		value: 'R from former name'
	},
	{
		label: '{{R from historic name}}: تغییرمسیر از نامی دیگر با پیشینهٔ تاریخی قابل توجه مانند یک منطقه، ایالت، شهر یا نظایر آن، که دیگر با آن نام یا عنوان شناخته نمی‌شود', // localized
		value: 'R from historic name'
	},
	{
		label: '{{R from incorrect name}}: تغییرمسیر از یک نام اشتباه که برای استفاده در عنوان، مناسب نیست', // localized
		value: 'R from incorrect name'
	},
	{
		label: '{{R from long name}}: تغییرمسیر از عنوانی که شامل نام کامل یا کامل‌تر است', // localized
		value: 'R from long name'
	},
	{
		label: '{{R from molecular formula}}: تغییرمسیر از یک فرمول مولکولی/شیمیایی به نام فنی یا بدیهی آن', // localized
		value: 'R from molecular formula'
	},
	{
		label: '{{R from name and country}}: تغییرمسیر از نام اختصاصی به نام مختصرتر', // localized
		value: 'R from name and country'
	},
	{
		label: '{{R from phrase}}: تغییرمسیر از یک اصطلاح به یک مقالهٔ مرتبط عمومی‌تر که موضوع را پوشش می‌دهد', // localized
		value: 'R from phrase'
	},
	{
		label: '{{R from scientific name}}: تغییرمسیر از نام علمی به نام رایج', // localized
		value: 'R from scientific name'
	},
	{
		label: '{{R from short name}}: تغییرمسیر از عنوانی که صورت کوتاه‌شدهٔ نام کامل یک شخص، یک عنوان کتاب، یا عنوان کامل‌تر دیگری است', // localized
		value: 'R from short name'
	},
	{
		label: '{{R from subtopic}}: تغییرمسیر از عنوانی که موضوعی فرعی از مقالهٔ مقصد است', // localized
		value: 'R from subtopic'
	},
	{
		label: '{{R from surname}}: تغییرمسیر از عنوانی که لقب است', // localized
		value: 'R from surname'
	},
	{
		label: '{{R to diacritic}}: تغییرمسیر به عنوان مقاله با حرکت‌گذاری (تلفظ، دونقطه، و غیره)', // localized
		value: 'R to diacritic'
	},
	{
		label: '{{R to related topic}}: تغییرمسیر به یک مقاله دربارهٔ یک موضوع مشابه', // localized
		value: 'R to related topic'
	},
	{
		label: '{{R to scientific name}}: تغییرمسیر از یک نام رایج به نام علمی', // localized
		value: 'R to scientific name'
	}
];

Twinkle.tag.administrativeList = [
	{
		label: '{{R from ambiguous term}}: تغییرمسیر از یک نام صفحهٔ مبهم به صفحه‌ای که آن را ابهام‌زدایی می‌کند. این الگو هرگز نباید در صفحه‌ای که «(ابهام‌زدایی)» را در عنوانش دارد، نمایش یابد، به‌جای آن از تغییرمسیر به صفحه ابهام‌زدایی استفاده کنید', // localized
		value: 'R from ambiguous term'
	},
	{
		label: '{{R from CamelCase}}: تغییرمسیر از یک عنوان با نگارش شتری', // localized
		value: 'R from CamelCase'
	},
	{
		label: '{{R to decade}}: تغییرمسیر از یک سال به مقالهٔ دهه', // localized
		value: 'R to decade'
	},
	{
		label: '{{R to disambiguation page}}: تغییرمسیر به یک صفحه ابهام‌زدایی', // localized
		value: 'R to disambiguation page'
	},
	{
		label: '{{R from duplicated article}}: تغییرمسیر به یک مقالهٔ مشابه جهت حفظ تاریخچهٔ ویرایش آن', // localized
		value: 'R from duplicated article'
	},
	{
		label: '{{R from file metadata link}}: تغییرمسیر یک ویکی‌پیوند ایجادشده از EXIF، XMP، یا اطلاعات دیگر (مثلاً بخش «فراداده» در بعضی از صفحه‌های توضیحات تصویر)', // localized
		value: 'R from file metadata link'
	},
	{
		label: '{{R with history}}: تغییرمسیر از یک صفحه با تاریخچهٔ قابل توجه، که جهت حفظ محتوا و انتساب‌ها نگهداری شده‌است', // localized
		value: 'R with history'
	},
	{
		label: '{{تغییرمسیر از ابهام‌زدایی‌های نالازم}}: تغییرمسیر از نام یک صفحه که بیش از آن دارای ابهام است که بتواند عنوان یک نوشتار قرار گیرد و باید به یک صفحهٔ ابهام‌زدایی مناسب تغییرمسیر یابد.', // localized
		value: 'تغییرمسیر از ابهام‌زدایی‌های نالازم'
	},
	{
		label: '{{تغییرمسیر حاصل از ادغام}}: تغییرمسیر از یک صفحهٔ ادغام‌شده جهت حفظ تاریخچهٔ ویرایشی آن', // localized
		value: 'R from merge'
	},
	{
		label: '{{تغییرمسیر از ابهام‌زدایی دیگر}}: تغییرمسیر از نام یک صفحه با یک واژه ابهام‌زدایی جایگزین', // localized
		value: 'تغییرمسیر از ابهام‌زدایی دیگر'
	},
	{
		label: '{{R printworthy}}: تغییرمسیر از عنوانی که می‌تواند در یک نسخهٔ چاپ‌شده یا نسخهٔ سی‌دی/دی‌وی‌دی ویکی‌پدیا کمک‌کننده باشد', // localized
		value: 'R printworthy'
	},
	{
		label: '{{R from school}}: تغییرمسیر از مقالهٔ یک مدرسه دارای اطلاعات کمی بوده‌است', // localized
		value: 'R from school'
	},
	{
		label: '{{تغییرمسیر از میانبر}}: تغییرمسیر از یک میانبر ویکی‌پدیا', // localized
		value: 'تغییرمسیر از میانبر'
	},
	{
		label: '{{R from sort name}}: تغییرمسیر از نام مرتب‌سازی هدف، مثلاً عنوانی که به‌جای نام کوچک، با نام خانوادگی شروع می‌شود', // localized
		value: 'R from sort name'
	},
	{
		label: '{{R unprintworthy}}: تغییرمسیر از عنوانی که «نمی‌تواند» در یک نسخهٔ چاپ‌شده یا نسخهٔ سی‌دی/دی‌وی‌دی ویکی‌پدیا کمک‌کننده باشد', // localized
		value: 'R unprintworthy'
	},
	{
		label: '{{تغییرمسیر از ابهام‌زدایی‌های نالازم}}: تغییرمسیر از صفحه‌ای که عنوان آن دارای یک عبارت ابهام‌زدایی نالازم است',
		value: 'تغییرمسیر از ابهام‌زدایی‌های نالازم'
	}
];

// maintenance tags for FILES start here

Twinkle.tag.file = {};

Twinkle.tag.file.licenseList = [
	{ label: '{{Bsr}}: source info consists of bare image URL/generic base URL only', value: 'Bsr' },
	{ label: '{{نیازمند نسخه کوچکتر}}: تصویر مورد استفادهٔ منصفانه با وضوح بالا (یا کلیپ صوتی بسیار بلند و غیره)', value: 'Non-free reduce' }, // localized
	{ label: '{{نسخه‌های غیر آزاد یتیم}}: رسانه‌های استفادهٔ منصفانه با اصلاحات قدیمی که نیازمند حذف هستند', value: 'subst:orfurrev' } // localized
];

Twinkle.tag.file.commonsList = [
	{ label: '{{انتقال به ویکی‌انبار}}: رسانه‌های آزاد که باید به ویکی‌انبار منتقل شوند', value: 'Copy to Commons' }, // localized
	{ label: '{{به ویکی‌انبار انتقال ندهید}} (مشکل مالکیت عمومی): پرونده در ایالات متحده در مالکیت عمومی قرار دارد، اما در کشور مبدأ خود، خیر.', value: 'Do not move to Commons' }, // localized
	{
		label: '{{به ویکی‌انبار انتقال ندهید}} (دلیل دیگر)', // localized
		value: 'Do not move to Commons_reason',
		subgroup: {
			type: 'input',
			name: 'DoNotMoveToCommons',
			label: 'دلیل: ', // localized
			tooltip: 'دلیلی ارائه دهید که چرا نباید این تصویر را به ویکی‌انبار انتقال داد (الزامی)' // localized
		}
	},
	{
		label: '{{نسخه محلی حفظ شود}}: درخواست برای نگه‌داشتن نسخهٔ محلی از یک پروندهٔ انبار', // localized
		value: 'Keep local',
		subgroup: {
			type: 'input',
			name: 'keeplocalName',
			label: 'نام تصویر در انبار در صورت تفاوت داشتن: ', // localized
			tooltip: 'نام تصویر در ویکی‌انبار (اگر با نام محلی متفاوت است)، بدون پیشوند «پرونده:»:' // localized
		}
	},
	{
		label: '{{موجود در انبار}}: پرونده به انبار کپی شده‌است', // localized
		value: 'subst:ncd',
		subgroup: {
			type: 'input',
			name: 'ncdName',
			label: 'نام تصویر در انبار در صورت تفاوت داشتن: ', // localized
			tooltip: 'نام تصویر در ویکی‌انبار (اگر با نام محلی متفاوت است), ، بدون پیشوند «پرونده:»:' // localized
		}
	}
];

Twinkle.tag.file.cleanupList = [
	{ label: '{{Artifacts}}: پروندهٔ PNG شامل مصنوعات فشرده‌سازی باقی‌مانده', value: 'Artifacts' }, // localized
	{ label: '{{Bad font}}: پروندهٔ SVG استفاده‌کننده از فونت‌هایی که در سرور بندانگشتی موجود نیستند', value: 'Bad font' }, // localized
	{ label: '{{Bad format}}: پروندهٔ PDF/DOC/... باید به یک فرمت کاربردی‌تر تبدیل شود', value: 'Bad format' }, // localized
	{ label: '{{Bad GIF}}: پروندهٔ GIF که باید در فرمت PNG، JPEG، یا SVG باشد', value: 'Bad GIF' }, // localized
	{ label: '{{Bad JPEG}}: پروندهٔ JPEG که باید در فرمت PNG یا SVG باشد', value: 'Bad JPEG' }, // localized
	{ label: '{{Bad SVG}}: پروندهٔ SVG شامل جلوه‌های شطرنجی', value: 'Bad SVG' }, // localized
	{ label: '{{Bad trace}}: پروندهٔ SVG ترسیم‌شده به‌صورت خودکار که نیازمند تمیزکاری است', value: 'Bad trace' }, // localized
	{
		label: '{{تمیزکاری تصویر}}: تمیزکاری عمومی', value: 'Cleanup image', // localized
		subgroup: {
			type: 'input',
			name: 'cleanupimageReason',
			label: 'دلیل: ', // localized
			tooltip: 'دلیل نیاز به تمیزکاری را وارد کنید (الزامی)' // localized
		}
	},
	{ label: '{{ClearType}}: تصویر (نه نماگرفت) با تصحیح فرکانس ClearType', value: 'ClearType' }, // localized
	{ label: '{{واترمارک تصویر}}: تصویر شامل واترمارک نمایان یا پنهان است', value: 'Imagewatermark' }, // localized
	{ label: '{{NoCoins}}: تصویر استفاده‌کننده از سکه برای نشان‌دادن مقیاس', value: 'NoCoins' }, // localized
	{ label: '{{Overcompressed JPEG}}: پروندهٔ JPEG با سطح بالایی از مصنوعات', value: 'Overcompressed JPEG' }, // localized
	{ label: '{{Opaque}}: پس‌زمینهٔ مات که باید شفاف باشد', value: 'Opaque' }, // localized
	{ label: '{{نیازمند حذف کادر}}: کادر نالازم، فضای سفید و غیره.', value: 'Remove border' }, // localized
	{
		label: '{{تغییرنام پرونده}}: نام پرونده با توجه به معیار درج‌شده در [[وپ:بت]] باید تغییر یابد', // localized
		value: 'Rename media',
		subgroup: [
			{
				type: 'input',
				name: 'renamemediaNewname',
				label: 'نام جدید: ', // localized
				tooltip: 'نام جدید برای تصویر را وارد کنید (اختیاری)' // localized
			},
			{
				type: 'input',
				name: 'renamemediaReason',
				label: 'دلیل: ', // localized
				tooltip: 'دلیل تغییر نام را وارد کنید (اختیاری)' // localized
			}
		]
	},
	{ label: '{{Should be PNG}}: پروندهٔ GIF یا JPEG که باید lossless باشد', value: 'Should be PNG' }, // localized
	{
		label: '{{باید اس‌وی‌جی باشد}}: پروندهٔ PNG، GIF یا JPEG که باید گرافیکی بُرداری باشد', value: 'Should be SVG', // localized
		subgroup: {
			name: 'svgCategory',
			type: 'select',
			list: [
				{ label: '{{باید اس‌وی‌جی باشد|other}}', value: 'other' }, // localized
				{ label: '{{باید اس‌وی‌جی باشد|alphabet}}: character images, font examples, etc.', value: 'alphabet' }, // localized
				{ label: '{{باید اس‌وی‌جی باشد|chemical}}: chemical diagrams, etc.', value: 'chemical' }, // localized
				{ label: '{{باید اس‌وی‌جی باشد|circuit}}: electronic circuit diagrams, etc.', value: 'circuit' }, // localized
				{ label: '{{باید اس‌وی‌جی باشد|coat of arms}}: coats of arms', value: 'coat of arms' }, // localized
				{ label: '{{باید اس‌وی‌جی باشد|diagram}}: diagrams that do not fit any other subcategory', value: 'diagram' }, // localized
				{ label: '{{باید اس‌وی‌جی باشد|emblem}}: emblems, free/libre logos, insignias, etc.', value: 'emblem' }, // localized
				{ label: '{{باید اس‌وی‌جی باشد|fair use}}: fair-use images, fair-use logos', value: 'fair use' }, // localized
				{ label: '{{باید اس‌وی‌جی باشد|flag}}: flags', value: 'flag' }, // localized
				{ label: '{{باید اس‌وی‌جی باشد|graph}}: visual plots of data', value: 'graph' }, // localized
				{ label: '{{باید اس‌وی‌جی باشد|logo}}: logos', value: 'logo' }, // localized
				{ label: '{{باید اس‌وی‌جی باشد|map}}: maps', value: 'map' }, // localized
				{ label: '{{باید اس‌وی‌جی باشد|music}}: musical scales, notes, etc.', value: 'music' }, // localized
				{ label: '{{باید اس‌وی‌جی باشد|physical}}: "realistic" images of physical objects, people, etc.', value: 'physical' }, // localized
				{ label: '{{باید اس‌وی‌جی باشد|symbol}}: miscellaneous symbols, icons, etc.', value: 'symbol' } // localized
			]
		}
	},
	{ label: '{{Should be text}}: image should be represented as text, tables, or math markup', value: 'Should be text' } // localized
];

Twinkle.tag.file.qualityList = [
	{ label: '{{Image-blownout}}', value: 'Image-blownout' },
	{ label: '{{Image-out-of-focus}}', value: 'Image-out-of-focus' },
	{
		label: '{{Image-Poor-Quality}}', value: 'Image-Poor-Quality',
		subgroup: {
			type: 'input',
			name: 'ImagePoorQualityReason',
			label: 'دلیل: ', // localized
			tooltip: 'دلیل اینکه چرا این تصویر خوب نیست (الزامی)' // localized
		}
	},
	{ label: '{{Image-underexposure}}', value: 'Image-underexposure' },
	{
		label: '{{Low quality chem}}: ساختارهای شیمیایی مورد اختلاف', value: 'Low quality chem', // localized
		subgroup: {
			type: 'input',
			name: 'lowQualityChemReason',
			label: 'دلیل: ', // localized
			tooltip: 'دلیل اینکه چرا نمودار مورد اختلاف است (الزامی)' // localized
		}
	}
];

Twinkle.tag.file.replacementList = [
	{ label: '{{Obsolete}}: نسخهٔ بهبودیافته موجود است', value: 'Obsolete' }, // localized
	{ label: '{{PNG version available}}', value: 'نسخهٔ پی‌ان‌جی موجود است' }, // localized
	{ label: '{{Vector version available}}', value: 'نسخهٔ وکتور موجود است' } // localized
];
Twinkle.tag.file.replacementList.forEach(function(el) {
	el.subgroup = {
		type: 'input',
		label: 'پروندهٔ جایگزین: ', // localized
		tooltip: 'نام پرونده‌ای که جایگزین این پرونده می‌شود را وارد کنید (الزامی)', // localized
		name: el.value.replace(/ /g, '_') + 'File'
	};
});


Twinkle.tag.callbacks = {
	article: function articleCallback(pageobj) {

		// Remove tags that become superfluous with this action
		var pageText = pageobj.getPageText().replace(/\{\{\s*([Uu]serspace draft)\s*(\|(?:\{\{[^{}]*\}\}|[^{}])*)?\}\}\s*/g, '');
		var params = pageobj.getCallbackParameters();

		/**
		 * Saves the page following the removal of tags if any. The last step.
		 * Called from removeTags()
		 */
		var postRemoval = function() {
			if (params.tagsToRemove.length) {
				// Remove empty {{multiple issues}} if found
				pageText = pageText.replace(/\{\{(multiple ?issues|article ?issues|mi)\s*\|\s*\}\}\n?/im, '');
				// Remove single-element {{multiple issues}} if found
				pageText = pageText.replace(/\{\{(?:multiple ?issues|article ?issues|mi)\s*\|\s*(\{\{[^}]+\}\})\s*\}\}/im, '$1');
			}

			// Build edit summary
			var makeSentence = function(array) {
				if (array.length < 3) {
					return array.join(' و ');
				}
				var last = array.pop();
				return array.join('، ') + ' و ' + last;
			};
			var makeTemplateLink = function(tag) {
				var text = '{{[[';
				// if it is a custom tag with a parameter
				if (tag.indexOf('|') !== -1) {
					tag = tag.slice(0, tag.indexOf('|'));
				}
				text += tag.indexOf(':') !== -1 ? tag : 'الگو:' + tag + '|' + tag;
				return text + ']]}}';
			};

			var summaryText;
			var addedTags = params.tags.map(makeTemplateLink);
			var removedTags = params.tagsToRemove.map(makeTemplateLink);
			if (addedTags.length) {
				summaryText = 'افزودن برچسب' + (addedTags.length > 1 ? '‌های ' : ' ') + makeSentence(addedTags);
				summaryText += removedTags.length ? '؛ و حذف برچسب' + (removedTags.length > 1 ? '‌های ' : ' ') + makeSentence(removedTags) : '';
			} else {
				summaryText = 'حذف ' + makeSentence(removedTags);
			}
			// نیازی به عبارت زیر در پیام‌های فارسی نیست. تغییرات لازم در سطر 1313 و 1314 اعمال شده
			summaryText += '' + (addedTags.length + removedTags.length > 1 ? '' : ''); 
			if (params.reason) {
				summaryText += ': ' + params.reason;
			}

			// avoid truncated summaries
			if (summaryText.length > (499 - Twinkle.getPref('summaryAd').length)) {
				summaryText = summaryText.replace(/\[\[[^|]+\|([^\]]+)\]\]/g, '$1');
			}

			pageobj.setPageText(pageText);
			pageobj.setEditSummary(summaryText + Twinkle.getPref('summaryAd'));
			pageobj.setWatchlist(Twinkle.getPref('watchTaggedPages'));
			pageobj.setMinorEdit(Twinkle.getPref('markTaggedPagesAsMinor'));
			pageobj.setCreateOption('nocreate');
			pageobj.save(function() {
				// special functions for merge tags
				if (params.mergeReason) {
					// post the rationale on the talk page (only operates in main namespace)
					var talkpageText = '\n\n== ' + params.talkDiscussionTitleLinked + ' ==\n\n';
					talkpageText += params.mergeReason.trim() + ' ~~~~';
					var talkpage = new Morebits.wiki.page('بحث:' + params.discussArticle, 'اعلام دلیل در صفحهٔ بحث');
					talkpage.setAppendText(talkpageText);
					talkpage.setEditSummary('/* ' + params.talkDiscussionTitle + ' */ بخش جدید' + Twinkle.getPref('summaryAd'));
					talkpage.setWatchlist(Twinkle.getPref('watchMergeDiscussions'));
					talkpage.setCreateOption('recreate');
					talkpage.append();
				}
				if (params.mergeTagOther) {
					// tag the target page if requested
					var otherTagName = 'ادغام';
					if (params.mergeTag === 'ادغام از') {
						otherTagName = 'ادغام در';
					} else if (params.mergeTag === 'ادغام در') {
						otherTagName = 'ادغام از';
					}
					var newParams = {
						tags: [otherTagName],
						tagsToRemove: [],
						tagsToRemain: [],
						mergeTarget: Morebits.pageNameNorm,
						discussArticle: params.discussArticle,
						talkDiscussionTitle: params.talkDiscussionTitle,
						talkDiscussionTitleLinked: params.talkDiscussionTitleLinked
					};
					var otherpage = new Morebits.wiki.page(params.mergeTarget, 'برچسب‌زدن صفحهٔ دیگر (' +
						params.mergeTarget + ')');
					otherpage.setCallbackParameters(newParams);
					otherpage.load(Twinkle.tag.callbacks.article);
				}

				// post at WP:PNT for {{اصلاح ترجمه}} and {{ترجمه تقریبی}} tag
				if (params.translationPostAtPNT) {
					var pntPage = new Morebits.wiki.page('ویکی‌پدیا:صفحه‌های نیازمند ترجمه به فارسی',
						'فهرست‌کردن مقاله در ویکی‌پدیا:صفحه‌های نیازمند ترجمه به فارسی');
					pntPage.setFollowRedirect(true);
					pntPage.load(function friendlytagCallbacksTranslationListPage(pageobj) {
						var old_text = pageobj.getPageText();

						var template = params.tags.indexOf('ترجمه تقریبی') !== -1 ? 'duflu' : 'نیاز به ترجمه';
						var lang = params.translationLanguage;
						var reason = params.translationComments;

						var templateText = '{{subst:' + template + '|pg=' + Morebits.pageNameNorm + '|Language=' +
							(lang || 'نامعلوم') + '|Comments=' + reason.trim() + '}} ~~~~';

						var text, summary;
						if (template === 'duflu') {
							text = old_text + '\n\n' + templateText;
							summary = 'درخواست تمیزکاری ترجمه برای ';
						} else {
							text = old_text.replace(/\n+(==\s?صفحه‌های ترجمه‌شده که هنوز نیازمند تمیزکاری هستند\s?==)/,
								'\n\n' + templateText + '\n\n$1');
							summary = 'درخواست ترجمه ' + (lang ? ' از ' + lang : '') + ' برای ';
						}

						if (text === old_text) {
							pageobj.getStatusElement().error('ناتوان در یافتن نقطهٔ هدف برای قرار دادن بحث');
							return;
						}
						pageobj.setPageText(text);
						pageobj.setEditSummary(summary + ' [[:' + Morebits.pageNameNorm + ']]' + Twinkle.getPref('summaryAd'));
						pageobj.setCreateOption('recreate');
						pageobj.save();
					});
				}
				if (params.translationNotify) {
					pageobj.lookupCreation(function(innerPageobj) {
						var initialContrib = innerPageobj.getCreator();

						// Disallow warning yourself
						if (initialContrib === mw.config.get('wgUserName')) {
							innerPageobj.getStatusElement().warn('شما (' + initialContrib + ') این صفحه را ایجاد کرده‌اید؛ چشم‌پوشی از آگاه‌سازی');
							return;
						}

						var userTalkPage = new Morebits.wiki.page('بحث کاربر:' + initialContrib,
							'آگاه‌سازی ایجادکنندهٔ اولیه (' + initialContrib + ')');
						var notifytext = '\n\n== مقالهٔ شما، [[' + Morebits.pageNameNorm + ']]==\n' +
							'{{subst:uw-notenglish|1=' + Morebits.pageNameNorm +
							(params.translationPostAtPNT ? '' : '|nopnt=yes') + '}} ~~~~';
						userTalkPage.setAppendText(notifytext);
						userTalkPage.setEditSummary('اعلان: لطفاً برای مشارکت در ویکی‌پدیای فارسی، از زبان فارسی استفاده کنید.' +
							Twinkle.getPref('summaryAd'));
						userTalkPage.setCreateOption('recreate');
						userTalkPage.setFollowRedirect(true);
						userTalkPage.append();
					});
				}
			});

			if (params.patrol) {
				pageobj.triage();
			}
		};

		/**
		 * Removes the existing tags that were deselected (if any)
		 * Calls postRemoval() when done
		 */
		var removeTags = function removeTags() {

			if (params.tagsToRemove.length === 0) {
				postRemoval();
				return;
			}

			Morebits.status.info('Info', 'حذف برجسب‌های منتفی‌شده که از پیش موجود بودند');

			var getRedirectsFor = [];

			// Remove the tags from the page text, if found in its proper name,
			// otherwise moves it to `getRedirectsFor` array earmarking it for
			// later removal
			params.tagsToRemove.forEach(function removeTag(tag) {
				var tag_re = new RegExp('\\{\\{' + Morebits.pageNameRegex(tag) + '\\s*(\\|[^}]+)?\\}\\}\\n?');

				if (tag_re.test(pageText)) {
					pageText = pageText.replace(tag_re, '');
				} else {
					getRedirectsFor.push('الگو:' + tag);
				}
			});

			if (!getRedirectsFor.length) {
				postRemoval();
				return;
			}

			// Remove tags which appear in page text as redirects
			var api = new Morebits.wiki.api('دریافت تغییرمسیرهای الگو', {
				'action': 'query',
				'prop': 'linkshere',
				'titles': getRedirectsFor.join('|'),
				'redirects': 1,  // follow redirect if the class name turns out to be a redirect page
				'lhnamespace': '10',  // template namespace only
				'lhshow': 'redirect',
				'lhlimit': 'max' // 500 is max for normal users, 5000 for bots and sysops
			}, function removeRedirectTag(apiobj) {

				$(apiobj.responseXML).find('page').each(function(idx, page) {
					var removed = false;
					$(page).find('lh').each(function(idx, el) {
						var tag = $(el).attr('title').slice(5);
						var tag_re = new RegExp('\\{\\{' + Morebits.pageNameRegex(tag) + '\\s*(\\|[^}]*)?\\}\\}\\n?');
						if (tag_re.test(pageText)) {
							pageText = pageText.replace(tag_re, '');
							removed = true;
							return false;   // break out of $.each
						}
					});
					if (!removed) {
						Morebits.status.warn('Info', 'ناتوان در یافتن {{' +
						$(page).attr('title').slice(5) + '}} در صفحه... در حال مستثنی کردن');
					}

				});

				postRemoval();

			});
			api.post();

		};

		if (!params.tags.length) {
			removeTags();
			return;
		}

		var tagRe, tagText = '', tags = [], groupableTags = [], groupableExistingTags = [];
		// Executes first: addition of selected tags

		/**
		 * Updates `tagText` with the syntax of `tagName` template with its parameters
		 * @param {number} tagIndex
		 * @param {string} tagName
		 */
		var addTag = function articleAddTag(tagIndex, tagName) {
			var currentTag = '';
			if (tagName === 'رده‌بندی‌نشده' || tagName === 'بهبود رده‌ها') {
				pageText += '\n\n{{' + tagName + '|تاریخ={{جا:نام‌ماه‌کنونی}} {{جا:سال‌کنونی}}}}';
			} else {
				currentTag += '{{' + tagName;
				// fill in other parameters, based on the tag
				switch (tagName) {
					case 'تمیزکاری ۲':
						currentTag += '|دلیل=' + params.cleanup;
						break;
					case 'بازنویسی نزدیک':
						currentTag += '|منبع=' + params.closeParaphrasing;
						break;
					case 'ویراستاری':
						if (params.copyEdit) {
							currentTag += '|برای=' + params.copyEdit;
						}
						break;
					case 'کپی':
						if (params.copypaste) {
							currentTag += '|نشانی=' + params.copypaste;
						}
						break;
					case 'گسترش از زبان':
						currentTag += '|مبحث=';
						currentTag += '|کد زبان=' + params.expandLanguageLangCode;
						if (params.expandLanguageArticle !== null) {
							currentTag += '|مقاله دیگر=' + params.expandLanguageArticle;
						}
						break;
					case 'متخصص':
						if (params.expertNeeded) {
							currentTag += '|1=' + params.expertNeeded;
						}
						if (params.expertNeededTalk) {
							currentTag += '|talk=' + params.expertNeededTalk;
						}
						if (params.expertNeededReason) {
							currentTag += '|reason=' + params.expertNeededReason;
						}
						break;
					case 'تعمیم':
						currentTag += '|1=نوشتار';
						if (params.globalizeRegion) {
							currentTag += '|2=' + params.globalizeRegion;
						}
						break;
					case 'News release':
						currentTag += '|1=article';
						break;
					case 'سرشناسی':
						if (params.notability !== 'none') {
							currentTag += '|' + params.notability;
						}
						break;
					case 'اصلاح ترجمه':
					case 'ترجمه تقریبی':
						if (params.translationLanguage) {
							currentTag += '|1=' + params.translationLanguage;
						}
						if (params.translationPostAtPNT) {
							currentTag += '|فهرست‌شده=بله';
						}
						break;
					case 'ادغام تاریخچه':
						currentTag += '|صفحه اولیه=' + params.histmergeOriginalPage;
						if (params.histmergeReason) {
							currentTag += '|دلیل=' + params.histmergeReason;
						}
						if (params.histmergeSysopDetails) {
							currentTag += '|جزئیات=' + params.histmergeSysopDetails;
						}
						break;
					case 'ادغام':
					case 'ادغام در':
					case 'ادغام از':
						params.mergeTag = tagName;
						// normalize the merge target for now and later
						params.mergeTarget = Morebits.string.toUpperCaseFirstChar(params.mergeTarget.replace(/_/g, ' '));

						currentTag += '|' + params.mergeTarget;

						// link to the correct section on the talk page, for article space only
						if (mw.config.get('wgNamespaceNumber') === 0 && (params.mergeReason || params.discussArticle)) {
							if (!params.discussArticle) {
								// discussArticle is the article whose talk page will contain the discussion
								params.discussArticle = tagName === 'ادغام در' ? params.mergeTarget : mw.config.get('wgTitle');
								// nonDiscussArticle is the article which won't have the discussion
								params.nonDiscussArticle = tagName === 'ادغام در' ? mw.config.get('wgTitle') : params.mergeTarget;
								var direction = '[[' + params.nonDiscussArticle + ']]' + (params.mergeTag === 'ادغام' ? ' با ' : ' در ') + '[[' + params.discussArticle + ']]';
								params.talkDiscussionTitleLinked = 'پیشنهاد ادغام ' + direction;
								params.talkDiscussionTitle = params.talkDiscussionTitleLinked.replace(/\[\[(.*?)\]\]/g, '$1');
							}
							currentTag += '|discuss=بحث:' + params.discussArticle + '#' + params.talkDiscussionTitle;
						}
						break;
					default:
						break;
				}

				currentTag += '|date={{subst:CURRENTMONTHNAME}} {{subst:CURRENTYEAR}}}}\n';
				tagText += currentTag;
			}
		};

		/**
		 * Adds the tags which go outside {{multiple issues}}, either because
		 * these tags aren't supported in {{multiple issues}} or because
		 * {{multiple issues}} is not being added to the page at all
		 */
		var addUngroupedTags = function() {
			$.each(tags, addTag);

			// Smartly insert the new tags after any hatnotes or
			// afd, csd, or prod templates or hatnotes. Regex is
			// extra complicated to allow for templates with
			// parameters and to handle whitespace properly.
			pageText = pageText.replace(
				new RegExp(
					// leading whitespace
					'^\\s*' +
					// capture template(s)
					'(?:((?:\\s*' +
					// AfD is special, as the tag includes html comments before and after the actual template
					'(?:<!--.*AfD.*\\n\\{\\{(?:Article for deletion\\/dated|AfDM).*\\}\\}\\n<!--.*(?:\\n<!--.*)?AfD.*(?:\\s*\\n))?|' + // trailing whitespace/newline needed since this subst's a newline
					// begin template format
					'\\{\\{\\s*(?:' +
					// CSD
					'db|delete|db-.*?|speedy deletion-.*?|' +
					// PROD
					'(?:proposed deletion|prod blp)\\/dated(?:\\s*\\|(?:concern|user|timestamp|help).*)+|' +
					// various hatnote templates
					'about|correct title|dablink|distinguish|for|other\\s?(?:hurricaneuses|people|persons|places|uses(?:of)?)|redirect(?:-acronym)?|see\\s?(?:also|wiktionary)|selfref|short description|the' +
					// not a hatnote, but sometimes under a CSD or AfD
					'|salt|proposed deletion endorsed' +
					// end main template name, optionally with a number (such as redirect2)
					')\\d*\\s*' +
					// template parameters
					'(\\|(?:\\{\\{[^{}]*\\}\\}|[^{}])*)?' +
					// end template format
					'\\}\\})+' +
					// end capture
					'(?:\\s*\\n)?)' +
					// trailing whitespace
					'\\s*)?',
					'i'), '$1' + tagText
			);

			removeTags();
		};

		// Separate tags into groupable ones (`groupableTags`) and non-groupable ones (`tags`)
		params.tags.forEach(function(tag) {
			tagRe = new RegExp('\\{\\{' + tag + '(\\||\\}\\})', 'im');
			// regex check for preexistence of tag can be skipped if in canRemove mode
			if (Twinkle.tag.canRemove || !tagRe.exec(pageText)) {
				// condition Twinkle.tag.article.tags[tag] to ensure that its not a custom tag
				// Custom tags are assumed non-groupable, since we don't know whether MI template supports them
				if (Twinkle.tag.article.tags[tag] && Twinkle.tag.multipleIssuesExceptions.indexOf(tag) === -1) {
					groupableTags.push(tag);
				} else {
					tags.push(tag);
				}
			} else {
				if (tag === 'ادغام از' || tag === 'ادغام تاریخچه') {
					tags.push(tag);
				} else {
					Morebits.status.warn('Info', 'برچسب {{' + tag +
						'}} از پیش در مقاله موجود است...در حال مستثنی کردن');
					// don't do anything else with merge tags
					if (['ادغام', 'ادغام در'].indexOf(tag) !== -1) {
						params.mergeTarget = params.mergeReason = params.mergeTagOther = null;
					}
				}
			}
		});

		// To-be-retained existing tags that are groupable
		params.tagsToRemain.forEach(function(tag) {
			if (Twinkle.tag.multipleIssuesExceptions.indexOf(tag) === -1) {
				groupableExistingTags.push(tag);
			}
		});

		var miTest = /\{\{(multiple ?issues|article ?issues|mi)(?!\s*\|\s*section\s*=)[^}]+\{/im.exec(pageText);

		if (miTest && groupableTags.length > 0) {
			Morebits.status.info('Info', 'افزودن برچسب‌های پشتیبانی‌شده به درون برچسب {{مشکلات متعدد}} که از پیش موجود بود');

			tagText = '';
			$.each(groupableTags, addTag);

			var miRegex = new RegExp('(\\{\\{\\s*' + miTest[1] + '\\s*(?:\\|(?:\\{\\{[^{}]*\\}\\}|[^{}])*)?)\\}\\}\\s*', 'im');
			pageText = pageText.replace(miRegex, '$1' + tagText + '}}\n');
			tagText = '';

			addUngroupedTags();

		} else if (params.group && !miTest && (groupableExistingTags.length + groupableTags.length) >= 2) {
			Morebits.status.info('Info', 'گروه‌بندی برچسب‌های پشتیبانی‌شده درون {{مشکلات متعدد}}');

			tagText += '{{Multiple issues|\n';

			/**
			 * Adds newly added tags to MI
			 */
			var addNewTagsToMI = function() {
				$.each(groupableTags, addTag);
				tagText += '}}\n';

				addUngroupedTags();
			};


			var getRedirectsFor = [];

			// Reposition the tags on the page into {{multiple issues}}, if found with its
			// proper name, else moves it to `getRedirectsFor` array to be handled later
			groupableExistingTags.forEach(function repositionTagIntoMI(tag) {
				var tag_re = new RegExp('(\\{\\{' + Morebits.pageNameRegex(tag) + '\\s*(\\|[^}]+)?\\}\\}\\n?)');
				if (tag_re.test(pageText)) {
					tagText += tag_re.exec(pageText)[1];
					pageText = pageText.replace(tag_re, '');
				} else {
					getRedirectsFor.push('الگو:' + tag);
				}
			});

			if (!getRedirectsFor.length) {
				addNewTagsToMI();
				return;
			}

			var api = new Morebits.wiki.api('دریافت تغییرمسیرهای الگو', {
				'action': 'query',
				'prop': 'linkshere',
				'titles': getRedirectsFor.join('|'),
				'redirects': 1,
				'lhnamespace': '10', // template namespace only
				'lhshow': 'redirect',
				'lhlimit': 'max' // 500 is max for normal users, 5000 for bots and sysops
			}, function replaceRedirectTag(apiobj) {
				$(apiobj.responseXML).find('page').each(function(idx, page) {
					var found = false;
					$(page).find('lh').each(function(idx, el) {
						var tag = $(el).attr('title').slice(5);
						var tag_re = new RegExp('(\\{\\{' + Morebits.pageNameRegex(tag) + '\\s*(\\|[^}]*)?\\}\\}\\n?)');
						if (tag_re.test(pageText)) {
							tagText += tag_re.exec(pageText)[1];
							pageText = pageText.replace(tag_re, '');
							found = true;
							return false;   // break out of $.each
						}
					});
					if (!found) {
						Morebits.status.warn('Info', 'ناتوان در یافتن الگوی تز پیش موجود {{' +
						$(page).attr('title').slice(5) + '}} در صفحه... چشم‌پوش از جای‌گذاری مجدد');
					}
				});
				addNewTagsToMI();
			});
			api.post();

		} else {
			tags = tags.concat(groupableTags);
			addUngroupedTags();
		}
	},

	redirect: function redirect(pageobj) {
		var params = pageobj.getCallbackParameters(),
			pageText = pageobj.getPageText(),
			tagRe, tagText = '', summaryText = 'افزودن برچسب',
			tags = [], i;

		for (i = 0; i < params.tags.length; i++) {
			tagRe = new RegExp('(\\{\\{' + params.tags[i] + '(\\||\\}\\}))', 'im');
			if (!tagRe.exec(pageText)) {
				tags.push(params.tags[i]);
			} else {
				Morebits.status.warn('Info', 'برچسب {{' + params.tags[i] +
					'}} از پیش در صفحهٔ تغییرمسیر موجود است...در حال مستثنی کردن');
			}
		}

		var addTag = function redirectAddTag(tagIndex, tagName) {
			tagText += '\n{{' + tagName;
			if (tagName === 'R from alternative language') {
				if (params.altLangFrom) {
					tagText += '|from=' + params.altLangFrom;
				}
				if (params.altLangTo) {
					tagText += '|to=' + params.altLangTo;
				}
			}
			tagText += '}}';

			if (tagIndex > 0) {
				if (tagIndex === (tags.length - 1)) {
					summaryText += ' و';
				} else if (tagIndex < (tags.length - 1)) {
					summaryText += '،';
				}
			}

			summaryText += ' {{[[:' + (tagName.indexOf(':') !== -1 ? tagName : 'الگو:' + tagName + '|' + tagName) + ']]}}';
		};

		tags.sort();
		$.each(tags, addTag);

		// Check for all Rcat shell redirects (from #433)
		if (pageText.match(/{{(?:redr|این یک تغییرمسیر است|this is a redirect|r(?:edirect)?(?:.?cat.*)?[ _]?sh)/i)) {
			// Regex inspired by [[User:Kephir/gadgets/sagittarius.js]] ([[Special:PermaLink/831402893]])
			var oldTags = pageText.match(/(\s*{{[A-Za-zا-ی ]+\|)((?:[^|{}]*|{{[^}]*}})+)(}})\s*/i);
			pageText = pageText.replace(oldTags[0], oldTags[1] + tagText + oldTags[2] + oldTags[3]);
		} else {
			// Fold any pre-existing Rcats into taglist and under Rcatshell
			var pageTags = pageText.match(/\n{{(تغییرمسیر|R(?:edirect)?) .*?}}/img); //localized to match "تغییرمسیر از..." templates
			var oldPageTags = '';
			if (pageTags) {
				pageTags.forEach(function(pageTag) {
					var pageRe = new RegExp(pageTag, 'img');
					pageText = pageText.replace(pageRe, '');
					oldPageTags += pageTag;
				});
			}
			pageText += '\n\n{{پوسته رده تغییرمسیر|' + tagText + oldPageTags + '\n}}';
		}

		summaryText += (tags.length > 0 ? '' + (tags.length > 1 ? '' : '') : '') + ' به تغییرمسیر'; // "tags" not needed in Persian

		// avoid truncated summaries
		if (summaryText.length > (499 - Twinkle.getPref('summaryAd').length)) {
			summaryText = summaryText.replace(/\[\[[^|]+\|([^\]]+)\]\]/g, '$1');
		}

		pageobj.setPageText(pageText);
		pageobj.setEditSummary(summaryText + Twinkle.getPref('summaryAd'));
		pageobj.setWatchlist(Twinkle.getPref('watchTaggedPages'));
		pageobj.setMinorEdit(Twinkle.getPref('markTaggedPagesAsMinor'));
		pageobj.setCreateOption('nocreate');
		pageobj.save();

		if (params.patrol) {
			pageobj.triage();
		}

	},

	file: function friendlytagCallbacksFile(pageobj) {
		var text = pageobj.getPageText();
		var params = pageobj.getCallbackParameters();
		var summary = 'افزودن برچسب ';

		// Add maintenance tags
		if (params.tags.length) {

			var tagtext = '', currentTag;
			$.each(params.tags, function(k, tag) {
				// when other commons-related tags are placed, remove "move to Commons" tag (or "انتقال به ویکی‌انبار" tag)
				if (['Keep local', 'subst:ncd', 'Do not move to Commons_reason', 'Do not move to Commons',
					'Now Commons', 'به ویکی‌انبار انتقال ندهید', 'نگاره آمریکا مغایر با ویکی‌انبار'].indexOf(tag) !== -1) {
					text = text.replace(/\{\{(mtc|(copy |move )?to ?commons|move to wikimedia commons|copy to wikimedia commons|انتقال به ویکی‌انبار|انتقال به انبار|نامزد انتقال به انبار|[Cc]tC)[^}]*\}\}/gi, '');
				}

				currentTag = '{{' + (tag === 'Do not move to Commons_reason' ? 'Do not move to Commons' : tag);

				switch (tag) {
					case 'subst:ncd':
						if (params.ncdName !== '') {
							currentTag += '|1=' + params.ncdName;
						}
						break;
					case 'Keep local':
						if (params.keeplocalName !== '') {
							currentTag += '|1=' + params.keeplocalName;
						}
						break;
					case 'Rename media':
						if (params.renamemediaNewname !== '') {
							currentTag += '|1=' + params.renamemediaNewname;
						}
						if (params.renamemediaReason !== '') {
							currentTag += '|2=' + params.renamemediaReason;
						}
						break;
					case 'Cleanup image':
						currentTag += '|1=' + params.cleanupimageReason;
						break;
					case 'Image-Poor-Quality':
						currentTag += '|1=' + params.ImagePoorQualityReason;
						break;
					case 'Low quality chem':
						currentTag += '|1=' + params.lowQualityChemReason;
						break;
					case 'Vector version available':
						text = text.replace(/\{\{((convert to |convertto|should be |shouldbe|to)?svg|badpng|vectorize)[^}]*\}\}/gi, '');
						/* falls through */
					case 'PNG version available':
						/* falls through */
					case 'Obsolete':
						currentTag += '|1=' + params[tag.replace(/ /g, '_') + 'File'];
						break;
					case 'Do not move to Commons_reason':
						currentTag += '|reason=' + params.DoNotMoveToCommons;
						break;
					case 'subst:orfurrev':
						// remove {{non-free reduce}} and redirects
						text = text.replace(/\{\{\s*(Template\s*:\s*)?(Non-free reduce|FairUseReduce|Fairusereduce|Fair Use Reduce|Fair use reduce|Reduce size|Reduce|Fair-use reduce|Image-toobig|Comic-ovrsize-img|Non-free-reduce|Nfr|Smaller image|Nonfree reduce)\s*(\|(?:\{\{[^{}]*\}\}|[^{}])*)?\}\}\s*/ig, '');
						currentTag += '|date={{subst:date}}';
						break;
					case 'Copy to Commons':
						currentTag += '|human=' + mw.config.get('wgUserName');
						break;
					case 'Should be SVG':
						currentTag += '|' + params.svgCategory;
						break;
					default:
						break;  // don't care
				}

				currentTag += '}}\n';

				tagtext += currentTag;
				summary += '{{' + tag + '}}, ';
			});

			if (!tagtext) {
				pageobj.getStatusElement().warn('عملیات توسط کاربر لغو شد؛ کاری برای انجام نیست');
				return;
			}

			text = tagtext + text;
		}

		pageobj.setPageText(text);
		pageobj.setEditSummary(summary.substring(0, summary.length - 2) + Twinkle.getPref('summaryAd'));
		pageobj.setWatchlist(Twinkle.getPref('watchTaggedPages'));
		pageobj.setMinorEdit(Twinkle.getPref('markTaggedPagesAsMinor'));
		pageobj.setCreateOption('nocreate');
		pageobj.save();

		if (params.patrol) {
			pageobj.triage();
		}
	}
};

Twinkle.tag.callback.evaluate = function friendlytagCallbackEvaluate(e) {
	var form = e.target;
	var params = {};
	if (form.patrolPage) {
		params.patrol = form.patrolPage.checked;
	}

	// Don't return null if there aren't any available tags
	params.tags = form.getChecked(Twinkle.tag.mode + 'Tags') || [];

	// Save values of input fields into params object. This works as quickform input
	// fields within subgroups of elements with name 'articleTags' (say) have their
	// name attribute as 'articleTags.' + name of the subgroup element

	var name_prefix = Twinkle.tag.mode + 'Tags.';
	$(form).find("[name^='" + name_prefix + "']:not(div)").each(function(idx, el) {
		// el are the HTMLInputElements, el.name gives the name attribute
		params[el.name.slice(name_prefix.length)] =
			el.type === 'checkbox' ? form[el.name].checked : form[el.name].value;
	});

	switch (Twinkle.tag.mode) {
		case 'article':
			params.tagsToRemove = form.getUnchecked('alreadyPresentArticleTags') || [];
			params.tagsToRemain = form.getChecked('alreadyPresentArticleTags') || [];
			params.reason = form.reason.value.trim();

			params.group = form.group.checked;

			// Validation
			if ((params.tags.indexOf('ادغام') !== -1) || (params.tags.indexOf('ادغام از') !== -1) ||
				(params.tags.indexOf('ادغام در') !== -1)) {
				if (((params.tags.indexOf('ادغام') !== -1) + (params.tags.indexOf('ادغام از') !== -1) +
					(params.tags.indexOf('ادغام در') !== -1)) > 1) {
					alert('لطفاً تنها یکی از برچسب‌های {{ادغام}}، {{ادغام از}}، و {{ادغام در}} را انتخاب کنید. اگر به چندین ادغام نیاز است، از {{ادغام}} استفاده کنید و نام مقاله‌ها را با خط عمودی از هم جدا کنید (هرچند که در این حالت توینکل قادر به برچسب‌زدن به سایر مقاله‌ها به‌صورت خودکار نخواهد بود).');
					return;
				}
				if (!params.mergeTarget) {
					alert('لطفاً عنوان مقالهٔ دیگر را برای استفاده در الگوی ادغام مشخص کنید.');
					return;
				}
				if ((params.mergeTagOther || params.mergeReason) && params.mergeTarget.indexOf('|') !== -1) {
					alert('در حال حاضر برچسب‌زدن چندین مقاله برای ادغام، و آغاز یک بحث برای چندین مقاله پشتیبانی نمی‌شود. لطفاً گزینهٔ «برچسب‌زدن مقالهٔ دیگر» را غیرفعال کنید، و/یا جعبهٔ «دلیل» را خالی کرده و دوباره تلاش کنید.');
					return;
				}
			}
			if ((params.tags.indexOf('اصلاح ترجمه') !== -1) && (params.tags.indexOf('ترجمه تقریبی') !== -1)) {
				alert('لطفاً تنها یکی از برچسب‌های {{اصلاح ترجمه}} و {{ترجمه تقریبی}} را انتخاب کنید.');
				return;
			}
			if (params.tags.indexOf('ادغام تاریخچه') !== -1 && params.histmergeOriginalPage.trim() === '') {
				alert('برای افزودن برچسب {{ادغام تاریخچه}}، باید صفحه‌ای را برای ادغام مشخص کنید.');
				return;
			}
			if (params.tags.indexOf('تمیزکاری ۲') !== -1 && params.cleanup.trim() === '') {
				alert('لازم است دلیلی را برای برچسب {{تمزیکاری}} مشخص کنید.');
				return;
			}
			if (params.tags.indexOf('گسترش از زبان') !== -1 && params.expandLanguageLangCode.trim() === '') {
				alert('لازم است که شناسهٔ زبان را برای برچسب  {{گسترش از زبان}} مشخص کنید.');
				return;
			}
			break;

		case 'file':

			if (params.tags.indexOf('Cleanup image') !== -1 && params.cleanupimageReason === '') {
				alert('لازم است که دلیلی را برای برچسب تمیزکاری مشخص کنید.');
				return;
			}
			if (params.tags.indexOf('Image-Poor-Quality') !== -1 && params.ImagePoorQualityReason === '') {
				alert('لازم است که دلیلی را برای برچسب {{Image-Poor-Quality}} مشخص کنید');
				return;
			}
			if (params.tags.indexOf('Low Quality Chem') !== -1 && params.lowQualityChemReason === '') {
				alert('لازم است که دلیلی را برای برچسب {{Low Quality Chem}} مشخص کنید');
				return;
			}
			if ((params.tags.indexOf('Obsolete') !== -1 && params.ObsoleteFile === '') ||
				(params.tags.indexOf('PNG version available') !== -1 && params.PNG_version_availableFile === '') ||
				(params.tags.indexOf('Vector version available') !== -1 && params.Vector_version_availableFile === '')
			) {
				alert('لازم است که نام پرونده‌ای جایگزین برای یک برچسب را در فهرست برچسب‌های جایگزینی مشخص کنید');
				return;
			}
			if (params.tags.indexOf('Do not move to Commons_reason') !== -1 && params.DoNotMoveToCommons === '') {
				alert('لازم است که دلیلی را برای برچسب {{Do not move to Commons}} مشخص کنید');
				return;
			}
			break;

		case 'redirect':
			break;

		default:
			alert('Twinkle.tag: حالت ناشناختهٔ ' + Twinkle.tag.mode);
			break;
	}

	// File/redirect: return if no tags selected
	// Article: return if no tag is selected and no already present tag is deselected
	if (params.tags.length === 0 && (Twinkle.tag.mode !== 'article' || params.tagsToRemove.length === 0)) {
		alert('لازم است که دست کم یک برچسب را انتخاب کنید!');
		return;
	}

	Morebits.simpleWindow.setButtonsEnabled(false);
	Morebits.status.init(form);

	Morebits.wiki.actionCompleted.redirect = Morebits.pageNameNorm;
	Morebits.wiki.actionCompleted.notice = 'برچسب زدن کامل شد، بارگیری مجدد مقاله تا چند ثانیه دیگر';
	if (Twinkle.tag.mode === 'redirect') {
		Morebits.wiki.actionCompleted.followRedirect = false;
	}
	
	// Localized: Following "tagModeLoc" variable is defined to localize progress messages
	// e.g. «برچسب‌زدن article» to «برچسب‌زدن مقاله»
	// can't change initial "Twinkle.tag.mode" variable because
	// it is used to define some parameters like the one in L-639

	var tagModeLoc;
	if (Twinkle.tag.mode === 'article') {
		tagModeLoc = 'مقاله';
	} else if (Twinkle.tag.mode === 'file') {
		tagModeLoc = 'پرونده';
	} else {
		tagModeLoc = 'تغییرمسیر';
	}

	var wikipedia_page = new Morebits.wiki.page(Morebits.pageNameNorm, 'برچسب‌زدن ' + tagModeLoc);
	wikipedia_page.setCallbackParameters(params);
	wikipedia_page.load(Twinkle.tag.callbacks[Twinkle.tag.mode]);

};

})(jQuery);
// </nowiki>