میڈیاویکی:Gadget-friendlytag-2022.js

تفصیل کے لیے کھولیں کے بٹن پر کلک کریں یاددہانی: محفوظ کرنے کے بعد تازہ ترین تبدیلیوں کو دیکھنے کے لیے آپ کو اپنے براؤزر کا کیش صاف کرنا ہوگا۔

  • فائرفاکس/ سفاری: جب Reload پر کلک کریں تو Shift دبا کر رکھیں، یا Ctrl-F5 یا Ctrl-R دبائیں (Mac پر R- )
  • گوگل کروم: Ctrl-Shift-R دبائیں (Mac پر Shift-R-⌘)
  • انٹرنیٹ ایکسپلورر: جب Refresh پر کلک کریں تو Ctrl یا Ctrl-F5 دبائیں
  • اوپیرا: Tools → Preferences میں جائیں اور کیش صاف کریں

// <nowiki>

(function($) {


/*
 ****************************************
 *** friendlytag.js: Tag module
 ****************************************
 * Mode of invocation:     Tab ("ٹیگ")
 * 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.isPageRedirect()) {
		Twinkle.tag.mode = 'redirect';
		Twinkle.addPortletLink(Twinkle.tag.callback, 'ٹیگ', 'friendly-tag', 'رجوع مکرر پر ٹیگ چسپاں کریں');
	// 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', 'تصویر میں انتظامی ٹیگ چسپاں کریں');
	// 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', 'مضمون میں انتظامی ٹیگ چسپاں کریں');
	}
};

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('ٹیگ کاری کی ترجیحات', 'وپ:پلک/ترجیحات#tag');
	Window.addFooterLink('رہنمائے پلک', ':en:WP:TW/DOC#tag');
	Window.addFooterLink('آپ کے تاثرات', 'تبادلۂ خیال ویکیپیڈیا:پلک');

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

	if (document.getElementsByClassName('patrollink').length) {
		form.append({
			type: 'checkbox',
			list: [
				{
					label: 'اس صفحہ کو بطور مراجعت شدہ نشان زد کریں',
					value: 'patrol',
					name: 'patrol',
					checked: Twinkle.getPref('markTaggedPagesAsPatrolled')
				}
			]
		});
	}

	form.append({
		type: 'input',
		label: 'ٹیگوں کی فہرست:',
		name: 'quickfilter',
		size: '30',
		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('مضمون میں انتظامی ٹیگ کاری');

			// Object.values is unavailable in IE 11
			var obj_values = Object.values || function (obj) {
				return Object.keys(obj).map(function (key) {
					return obj[key];
				});
			};

			// Build sorting and lookup object flatObject, which is always
			// needed but also used to generate the alphabetical list
			Twinkle.tag.article.flatObject = {};
			obj_values(Twinkle.tag.article.tagList).forEach(function (group) {
				obj_values(group).forEach(function (subgroup) {
					if (Array.isArray(subgroup)) {
						subgroup.forEach(function (item) {
							Twinkle.tag.article.flatObject[item.tag] = item;
						});
					} else {
						Twinkle.tag.article.flatObject[subgroup.tag] = subgroup;
					}
				});
			});


			form.append({
				type: 'select',
				name: 'sortorder',
				label: 'فہرست دیکھیں:',
				tooltip: 'آپ پلک کی ترجیحات کے ذریعہ طے شدہ ترتیب کو تبدیل کر سکتے ہیں۔',
				event: Twinkle.tag.updateSortOrder,
				list: [
					{ type: 'option', value: 'cat', label: 'بلحاظ موضوع', selected: Twinkle.getPref('tagArticleSortOrder') === 'cat' },
					{ type: 'option', value: 'alpha', label: 'الف بائی ترتیب میں', selected: Twinkle.getPref('tagArticleSortOrder') === 'alpha' }
				]
			});


			if (!Twinkle.tag.canRemove) {
				var divElement = document.createElement('div');
				divElement.innerHTML = 'موجود ٹیگوں کو ہٹانے کے لیے مضمون کے تازہ ترین نسخہ سے ٹیگ کاری کا مینو کھولیں';
				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: 'اگر ممکن ہو تو سانچہ {{متعدد مسائل}} میں یکجا کریں',
						value: 'group',
						name: 'group',
						tooltip: 'اگر آپ تین سے زائد ایسے ٹیگ چسپاں کرنا چاہتے ہیں جنھیں {{متعدد مسائل}} کا سانچہ معاونت فراہم کرتا ہے اور یہ خانہ نشان زد ہے تو تمام معاونت یافتہ ٹیگ {{متعدد مسائل}} میں یکجا نظر آئیں گے۔',
						checked: Twinkle.getPref('groupByDefault')
					}
				]
			});

			form.append({
				type: 'input',
				label: 'وجہ',
				name: 'reason',
				tooltip: 'خلاصۂ ترمیم میں درج کرنے کے لیے وجہ درکار ہے۔ خصوصاً جب ٹیگ ہٹا رہے ہوں تو وجہ ضرور درج کریں۔',
				size: '60'
			});

			break;

		case 'file':
			Window.setTitle('تصویر میں انتظامی ٹیگ کاری');

			$.each(Twinkle.tag.fileList, function(groupName, group) {
				form.append({ type: 'header', label: groupName });
				form.append({ type: 'checkbox', name: 'tags', list: group });
			});

			if (Twinkle.getPref('customFileTagList').length) {
				form.append({ type: 'header', label: 'شخصی ٹیگ' });
				form.append({ type: 'checkbox', name: 'tags', list: Twinkle.getPref('customFileTagList') });
			}
			break;

		case 'redirect':
			Window.setTitle('رجوع مکرر کے ٹیگ');

			var i = 1;
			$.each(Twinkle.tag.redirectList, function(groupName, group) {
				form.append({ type: 'header', id: 'tagHeader' + i, label: groupName });
				var subdiv = form.append({ type: 'div', id: 'tagSubdiv' + i++ });
				$.each(group, function(subgroupName, subgroup) {
					subdiv.append({ type: 'div', label: [ Morebits.htmlNode('b', subgroupName) ] });
					subdiv.append({
						type: 'checkbox',
						name: 'tags',
						list: subgroup.map(function (item) {
							// Fawiki localozation: "item.tag.replace" to shorten long labels
							return { value: item.tag, label: '{{' + item.tag.replace(/رجوع\sمکرر\s/, '') + '}}: ' + item.description, subgroup: item.subgroup };
						})
					});
				});
			});

			if (Twinkle.getPref('customRedirectTagList').length) {
				form.append({ type: 'header', label: 'شخصی ٹیگ' });
				form.append({ type: 'checkbox', name: 'tags', list: Twinkle.getPref('customRedirectTagList') });
			}
			break;

		default:
			alert('پلک: ' + Twinkle.tag.mode + ' نامعلوم صورت حال');
			break;
	}

	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, .quickformDescription');
	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) {
							if (e.classList[0].indexOf('box-') === 0) {
								var tag = e.classList[0].slice('box-'.length).replace(/_/g, ' ');
								Twinkle.tag.alreadyPresentTags.push(tag);
							}
						});
						return true; // continue
					}

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

			// {{Uncategorized}} and {{Improve categories}} 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, '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('tags');

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

	// function to generate a checkbox, with appropriate subgroup if needed
	var makeCheckbox = function (item) {
		var tag = item.tag, description = item.description;
		var checkbox = { value: tag, label: '{{' + tag + '}}: ' + description };
		if (Twinkle.tag.checkedTags.indexOf(tag) !== -1) {
			checkbox.checked = true;
		}
		checkbox.subgroup = item.subgroup;
		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('existingTags');
		Twinkle.tag.alreadyPresentTags.forEach(function(tag) {
			var checkbox =
				{
					value: tag,
					label: '{{' + tag + '}}' + (Twinkle.tag.article.flatObject[tag] ? ': ' + Twinkle.tag.article.flatObject[tag].description : ''),
					checked: unCheckedTags.indexOf(tag) === -1,
					style: 'font-style: italic'
				};

			checkboxes.push(checkbox);
		});
		subdiv.append({
			type: 'checkbox',
			name: 'existingTags',
			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, subgroup) {
			var checkboxes = [];
			$.each(subgroup, function(k, item) {
				if (Twinkle.tag.alreadyPresentTags.indexOf(item.tag) === -1) {
					checkboxes.push(makeCheckbox(item));
				}
			});
			subdiv.append({
				type: 'checkbox',
				name: 'tags',
				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.tagList, function(groupName, group) {
			container.append({ type: 'header', id: 'tagHeader' + i, label: groupName });
			var subdiv = container.append({ type: 'div', id: 'tagSubdiv' + i++ });
			if (Array.isArray(group)) {
				doCategoryCheckboxes(subdiv, group);
			} else {
				$.each(group, function(subgroupName, subgroup) {
					subdiv.append({ type: 'div', label: [ Morebits.htmlNode('b', subgroupName) ] });
					doCategoryCheckboxes(subdiv, subgroup);
				});
			}
		});
	} else { // alphabetical sort order
		if (Twinkle.tag.alreadyPresentTags.length > 0) {
			makeCheckboxesForAlreadyPresentTags();
			container.append({ type: 'header', id: 'tagHeader1', label: 'دستیاب ٹیگ' });
		}

		// Avoid repeatedly resorting
		Twinkle.tag.article.alphabeticalList = Twinkle.tag.article.alphabeticalList || Object.keys(Twinkle.tag.article.flatObject).sort();
		var checkboxes = [];
		Twinkle.tag.article.alphabeticalList.forEach(function(tag) {
			if (Twinkle.tag.alreadyPresentTags.indexOf(tag) === -1) {
				checkboxes.push(makeCheckbox(Twinkle.tag.article.flatObject[tag]));
			}
		});
		container.append({
			type: 'checkbox',
			name: 'tags',
			list: checkboxes
		});
	}

	// append any custom tags
	if (Twinkle.getPref('customTagList').length) {
		container.append({ type: 'header', label: 'شخصی ٹیگ' });
		container.append({ type: 'checkbox', name: 'tags',
			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], [name=existingTags]').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' });

	Morebits.quickForm.getElements(form, 'existingTags').forEach(generateLinks);
	Morebits.quickForm.getElements(form, 'tags').forEach(generateLinks);

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

		var firstPart = 'اضافہ ' + mw.language.convertNumber(Twinkle.tag.status.numAdded) + ' ٹیگ';
		var secondPart = 'حذف ' + mw.language.convertNumber(Twinkle.tag.status.numRemoved) + ' ٹیگ';
		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 ? 'سانچہ:' : '') +
		(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 = {};

// Shared across {{Rough translation}} and {{Not English}}
var translationSubgroups = [
	{
		name: 'translationLanguage',
		parameter: '1',
		type: 'input',
		label: 'مضمون کی زبان (اگر معلوم ہو):',
		tooltip: 'مدد کے لیے [[وپ:لسانی شناخت]] ملاحظہ فرمائیں۔ اگر آپ [[وپ:ترجمہ درکار مضامین]] میں درخواست کر رہے ہیں تو اس خانے کو خالی نہ چھوڑیں، ہاں اگر آپ بالکل نہیں جانتے تو کوئی بات نہیں۔'
	}
].concat(mw.config.get('wgNamespaceNumber') === 0 ? [
	{
		type: 'checkbox',
		list: [ {
			name: 'translationPostAtPNT',
			label: 'اس مضمون کو [[وپ:ترجمہ درکار مضامین]] میں درج کریں',
			checked: true
		} ]
	},
	{
		name: 'translationComments',
		type: 'textarea',
		label: 'ترجمہ درکار صفحے پر درج کرنے کے لیے اضافی تبصرہ',
		tooltip: 'اختیاری، اور محض "اس مضمون کو۔۔۔" کے خانے سے متعلق متعلق ہے اگر وہ نشان زد ہو۔'
	}
] : []);

// Subgroups for {{merge}}, {{merge-to}} and {{merge-from}}
var getMergeSubgroups = function(tag) {
	var otherTagName = 'ضم';
	switch (tag) {
		case 'ضم از':
			otherTagName = 'ضم در';
			break;
		case 'ضم در':
			otherTagName = 'ضم از';
			break;
		// no default
	}
	return [
		{
			name: 'mergeTarget',
			type: 'input',
			label: 'دیگر مضمون/مضامین:',
			tooltip: 'اگر متعدد مضامین کو رکھنا چاہتے ہیں تو ان کے درمیان پائپ کی علامت رکھیں۔ مثلا پہلا مضمون|دوسرا مضمون',
			required: true
		},
		{
			type: 'checkbox',
			list: [
				{
					name: 'mergeTagOther',
					label: 'دوسرے مضمون پر ٹیگ {{' + otherTagName + '}} چسپاں کریں',
					checked: true,
					tooltip: 'محض ایک مضمون کا عنوان درج کرنے پر دستیاب ہوگا۔'
				}
			]
		}
	].concat(mw.config.get('wgNamespaceNumber') === 0 ? {
		name: 'mergeReason',
		type: 'textarea',
		label: 'ضم کی وجہ (تبادلہ خیال صفحہ میں ' +
			(tag === 'ضم در' ? 'ہدف مضمون' : 'پیش نظر مضمون') + '):',
		tooltip: 'اختیاری، لیکن پرزور سفارش کی جاتی ہے۔ اگر نہ چاہیں تو خالی چھوڑ دیں۔ محض ایک مضمون کا عنوان درج کرنے پر دستیاب ہوگا۔'
	} : []);
};

// Tags arranged by category; will be used to generate the alphabetical list,
// but tags should be in alphabetical order within the categories
// excludeMI: true indicate a tag that *does not* work inside {{multiple issues}}
// Add new categories with discretion - the list is long enough as is!
Twinkle.tag.article.tagList = {
	'انتظامی ٹیگ': {
		'عمومی': [
			{
				tag: 'بازنویسی',
				description: "برای سازگار شدن با استانداردهای کیفی ویکی‌پدیا× نیازمند بازنویسی عمده است"
			},
			{
				tag: 'تمیزکاری ۲', description: 'نیازمند تمیزکاری',
				subgroup: {
					name: 'cleanup',
					parameter: 'reason',
					type: 'input',
					label: 'مشخص برای اینکه چرا به تمیزکاری نیاز است:',
					tooltip: 'الزامی.',
					size: 35,
					required: true
				}
			},  // has a subgroup with text input
			{
				tag: 'ویراستاری',
				description: 'نیازمند ویراستاری دستور زبان، سبک، انسجام، لحن، یا آوانگاری',
				subgroup: {
					name: 'copyEdit',
					parameter: 'برای',
					type: 'input',
					label: '«این نوشتار برای ... به ویراستاری نیاز دارد»',
					tooltip: 'به‌عنوان مثال، «یکپارچه شدن املا». اختیاری.',
					size: 35
				}
			}  // has a subgroup with text input
		],
		'محتوای بالقوه نامطلوب': [
			{
				tag: 'بازنویسی نزدیک',
				description: 'دربردارندهٔ بازنویسی نزدیک از یک منبع غیرآزاد دارای حق تکثیر است',
				subgroup: {
					name: 'closeParaphrasing',
					parameter: 'منبع',
					type: 'input',
					label: 'منبع:',
					tooltip: 'منبعی که به‌طور نزدیک بازنویسی شده‌است'
				}
			},
			{ tag: 'پیوند به بیرون', description: 'پیوندهای به بیرون ممکن است از سیاست‌ها یا رهنمودهای محتوایی پیروی نکنند' },
			{ tag: 'غیر-آزاد', description: 'ممکن است بیش از اندازه یا به‌شکلی نامناسب از محتوای دارای حق تکثیر استفاده کرده باشد' },
			{
				tag: 'کپی',
				description: 'به‌نظر می‌رسد از جای دیگری کپی شده و در اینجا قرار گرفته است',
				excludeMI: true,
				subgroup: {
					name: 'copypaste',
					parameter: 'نشانی',
					type: 'input',
					label: 'نشانی منبع:',
					tooltip: 'اگر مشخص است.',
					size: 50
				}
			}  // has a subgroup with text input
		],
		'ساختار، قالب‌بندی و بخش آغازین': [
			{ tag: 'بازسازماندهی', description: "برای سازگار شدن با رهنمودهای قالب‌بندی ویکی‌پدیا، نیازمند سازماندهی مجدد است" },
			{ tag: 'بازنویسی بخش آغازین', description: 'بخش آغازین برای سازگار شدن با رهنمودها، نیازمند بازنویسی است' },
			{ tag: 'بخش آغازین بلند', description: 'بخش آغازین نسبت به طول کلی مقاله بسیار بلند است' },
			{ tag: 'بخش آغازین کوتاه', description: 'بخش آغازین بسیار کوتاه است و برای بیان خلاصه‌ای از نکته‌های کلیدی، نیازمند گسترش است' },
			{ tag: 'بخش‌بندی', description: 'نیازمند تقسیم به چند بخش بر پایه موضوع است' },
			{ tag: 'بخش‌بندی بیش از اندازه', description: 'تعداد زیاد عنوان‌های بخش که محتوا را پراکنده کرده‌اند' },
			{ tag: 'طولانی', description: 'به اندازه‌ای طولانی است که خواندن و گشتن در آن سخت است' },
			{ tag: 'فاقد بخش آغازین', description: 'فاقد بخش آغازین است' }
		],
		'Fiction-related cleanup': [
			{ tag: 'در دنیا', description: 'موضوع، تخیلی است و برای ارائهٔ یک دیدگاه غیرخیالی، نیازمند بازنویسی است' },
			{ tag: 'خلاصه صرف', description: 'تقریباً به‌طور کامل یک خلاصهٔ صرف از اثر است' },
			{ tag: 'داستان', description: 'وجه تمایز میان حقایق و حکایت‌ها مشخص نیست' },
			{ tag: 'خلاصه داستان طولانی', description: 'خلاصهٔ داستان بسیار بلند است یا دارای جزئیات بیش از اندازه است' },
			{ tag: 'فاقد خلاصه داستان', description: 'نیازمند خلاصهٔ داستان است' }
		]
	},
	'مشکلات محتوایی عمومی': {
		'اهمیت و سرشناسی': [
			{ tag: 'سرشناسی', description: 'موضوع ممکن است رهنمود اصلی سرشناسی را احراز نکند',
				subgroup: {
					name: 'notability',
					parameter: '1',
					type: 'select',
					list: [
						{ label: "{{سرشناسی}}: موضوع مقاله ممکن است رهنمود اصلی سرشناسی را احراز نکند", value: '' },
						{ label: '{{سرشناسی|اعداد}}: رهنمود سرشناسی عددها', value: 'عدد' },
						{ label: '{{سرشناسی|افراد}}: رهنمود سرشناسی زندگی‌نامه افراد', value: 'زندگی‌نامه' },
						{ label: '{{سرشناسی|تلویزیون}}: رهنمود سرشناسی برنامه‌های تلویزیونی', value: 'تلویزیون' },
						{ label: '{{سرشناسی|جغرافیا}}: رهنمود سرشناسی ویژگی‌های جغرافیایی', value: 'جغرافیا' },
						{ label: '{{سرشناسی|دانشگاهیان}}: رهنمود سرشناسی دانشگاهیان', value: 'دانشگاهیان' },
						{ label: '{{سرشناسی|رویداد}}: رهنمود سرشناسی برای رویدادها', value: 'رویداد' },
						{ label: '{{سرشناسی|شرکت}}: رهنمودهای سرشناسی شرکت‌ها و سازمان‌ها', value: 'شرکت' },
						{ label: '{{سرشناسی|فضا}}: رهنمود سرشناسی اجرام آسمانی', value: 'فضا' },
						{ label: '{{سرشناسی|فهرست}}: رهنمود سرشناسی فهرست‌های مسقل', value: 'فهرست' },
						{ label: '{{سرشناسی|فیلم}}: رهنمود سرشناسی فیلم‌ها', value: 'فیلم' },
						{ label: '{{سرشناسی|کتاب}}: رهنمود سرشناسی کتاب', value: 'کتاب' },
						{ label: '{{سرشناسی|محصول}}: رهنمود سرشناسی محصولات و خدمات', value: 'محصول' },
						{ label: '{{سرشناسی|موسیقی}}: رهنمود سرشناسی موسیقی', value: 'موسیقی' },
						{ label: '{{سرشناسی|نوواژه}}: رهنمود سرشناسی نوواژه‌ها', value: 'نوواژه' },
						{ label: '{{سرشناسی|وب}}: رهنمود سرشناسی مجتوای وب', value: 'وب' },
						{ label: '{{سرشناسی|ورزش}}: رهنمود سرشناسی ورزش‌ها', value: 'ورزش' }
					]
				}
			}
		],
		'سبک نگارش': [
			{ tag: 'آموزشی', description: 'همانند یک کتابچهٔ راهنما یا دستورالعمل نوشته شده‌است' },
			{ tag: 'انتشار خبری', description: 'مشابه یک انتشار مطبوعاتی یا مقالهٔ خبری نوشته شده‌است',
				subgroup: {
					type: 'hidden',
					name: 'cleanupPR1',
					parameter: '1',
					value: 'مقاله'
				}
			},
			{ tag: 'انشا مانند', description: 'همانند نتیجهٔ تحقیقات شخصی، تألیفات شخصی یا یک انشای استدلالی نوشته شده‌است' },
			{ tag: 'پرگفتاورد', description: 'حاوی گفتاوردهای خیلی زیاد یا خیلی طولانی برای یک مدخل دانشنامه‌ای است' },
			{ tag: 'تبلیغات', description: 'مشابه یک متن تبلیغاتی نوشته شده‌است' },
			{ tag: 'زمان فعل', description: 'از رهنمودهای استفاده از زمان‌های مختلف افعال پیروی نمی‌کند.' },
			{ tag: 'شبه رزومه', description: 'همانند یک رزومه نوشته شده‌است' },
			{ tag: 'ضمیر نامناسب', description: 'به‌شکلی نامناسب از ضمیر اول‌شخص یا دوم‌شخص استفاده می‌کند' },
			{ tag: 'فنی', description: 'به‌اندازه‌ای فنی است که درک آن برای بیشتر مخاطبان سخت است' },
			{ tag: 'لحن', description: 'لحن یا سبک مقاله بازتاب‌دهندهٔ لحن دانشنامه‌ای مورد استفاده رفته در ویکی‌پدیا نیست' },
			{ tag: 'نثر', description: 'در قالب یک فهرست نوشته شده‌است، اما در صورتی که به نثر درآید، بهتر خوانده می‌شود' },
			{ tag: 'هواداران', description: "از دیدگاه یک هوادار نوشته شده‌است" }
		],
		'مفهوم (یا فقدان آن)': [
			{ tag: 'غیر قابل درک', description: 'فهمیدن آن بسیار سخت یا غیرممکن است' },
			{ tag: 'گیج‌کننده', description: 'گیج‌کننده یا مبهم است' },
			{ tag: 'نامتمرکز', description: 'فاقد تمرکز است، یا در مورد بیش از یک موضوع است' }
		],
		'اطلاعات و جزئیات': [
			{ tag: 'ارزش ناحق', description: 'به بعضی ایده‌ها، وقایع یا حواشی، وزن بی‌مورد داده‌است' },
			{ tag: 'پرجزئیات', description: 'مقدار بیش از اندازه از جزئیات پیچیده' },
			{ tag: 'زمینه', description: 'زمینهٔ ناکافی برای کسانی که با موضوع آشنا نیستند' },
			{ tag: 'متخصص', description: 'نیازمند توجه از سوی یک فرد متخصص در زمینهٔ موضوع مقاله است',
				subgroup: [
					{
						name: 'expertNeeded',
						parameter: '1',
						type: 'input',
						label: 'نام ویکی‌پروژهٔ مرتبط:',
						tooltip: 'به‌طور اختیاری می‌توانید نام یک ویکی‌پروژه که ممکن است بتواند به یافتن یک متخصص کمک کند را وارد کنید. نیازی نیست پیشوند «ویکی‌پروژه» را هم ذکر کنید.'
					},
					{
						name: 'expertNeededReason',
						parameter: 'دلیل',
						type: 'input',
						label: 'دلیل:',
						tooltip: 'توصیف مشکل به‌شکل مختصر. یکی از دو پارامتر دلیل یا بحث باید وارد شود.'
					},
					{
						name: 'expertNeededTalk',
						parameter: 'بحث',
						type: 'input',
						label: 'گفتگو در صفحهٔ بحث:',
						tooltip: 'عنوان بخشی در صفحهٔ بحث این مقاله که بحث پیرامون مشکل در آن جریان دارد. نیازی به پیونددهی نیست و نام بخش کفایت می‌کند. یکی از دو پارامتر دلیل یا بحث باید وارد شود.'
					}
				]
			},
			{ tag: 'مثال‌های بیش از حد', description: 'ممکن است حاوی مثال‌های به‌هم‌ریخته، بیش از اندازه یا نامرتبط باشد' }
		],
		'وابستگی به زمان': [
			{ tag: 'رویداد روز', description: 'دربردارندهٔ یک رویداد روز است', excludeMI: true }, // Works but not intended for use in MI
			{ tag: 'رویداد روز مرتبط', description: 'موضوعی را پوشش می‌دهد که تحت تأثیر یک رویداد روز است', excludeMI: true }, // Works but not intended for use in MI
			{ tag: 'نیازمند به‌روزرسانی', description: 'نیازمند افزودن اطلاعات به‌روز بیشتر است',
				subgroup: [
					{
						name: 'updatePart',
						parameter: 'قسمت',
						type: 'input',
						label: 'کدام قسمت از مقاله؟',
						tooltip: 'قسمتی از مقاله که نیازمند به‌روزرسانی است',
						size: '45'
					},
					{
						name: 'updateReason',
						parameter: 'دلیل',
						type: 'input',
						label: 'دلیل:',
						tooltip: 'توضیحی در این مورد که چرا مقاله تاریخ‌گذشته است',
						size: '55'
					}
				]
			}
		],
		'بی‌طرفی، جانبداری و دقت در بیان حقایق': [
			{ tag: 'پوشش نامتناسب', description: 'جانبداری گسترده یا پوشش نامتناسب به‌سمت یک یا چند منطقهٔ مشخص' },
			{ tag: 'تازه‌گرایی', description: 'متمایل به رویدادهای اخیر است' },
			{ tag: 'تعارض منافع', description: 'سازنده یا مشارکت‌کنندهٔ عمدهٔ مقاله ممکن است دارای تعارض منافع باشد', subgroup: mw.config.get('wgNamespaceNumber') === 0 ? {
				name: 'coiReason',
				type: 'textarea',
				label: 'توضیح برای استفاده از برچسب تعارض منافع (در صفحهٔ بحث این مقاله ارسال خواهد شد):',
				tooltip: 'اختیاری؛ اما به‌شدت توصیه‌شده. در صورت عدم تمایل، خالی بگذارید.'
			} : [] },
			{ tag: 'تعمیم', description: 'نمایانگر وجههٔ جهانی موضوع نیست',
				subgroup: [
					{
						type: 'hidden',
						name: 'globalize1',
						parameter: '1',
						value: 'نوشتار'
					}, {
						name: 'globalizeRegion',
						parameter: '2',
						type: 'input',
						label: 'منطقه یا کشوری که بیش از حد نمایانده شده'
					}
				]
			},
			{ tag: 'خودزندگی‌نامه', description: 'خودزندگی‌نامه است و احتمالاً بی‌طرفانه نوشته نشده‌است' },
			{ tag: 'درستی', description: 'دقت در بیان حقایق مورد سؤال است' },
			{ tag: 'دستمزد فاش‌نشده', description: 'ممکن است در برابر دستمزد فاش‌نشده ایجاد یا ویرایش شده‌باشد' },
			{ tag: 'دیدگاه‌های اندک', description: 'ممکن است دربردارندهٔ تمامی دیدگاه‌های قابل توجه نباشد' },
			{ tag: 'طرفداری', description: 'به دیدگاه بی‌طرف پایبند نیست' },
			{ tag: 'طفره‌آمیز', description: 'به‌دلیل استفاده از الفاظ طفره‌آمیز، بی‌طرفی و اثبات‌پذیری آن به‌خطر افتاده‌است' },
			{ tag: 'کلک', description: 'کل یا بخشی از آن ممکن است شامل کلک‌زنی باشد' },
			{ tag: 'مشارکت در برابر دستمزد', description: 'حاوی مشارکت در برابر دستمزد است و ممکن است نیازمند تمیزکاری باشد' },
			{ tag: 'واژه نامناسب', description: 'شامل جمله‌بندی‌ است که بدون افزودن اطلاعات، موضوع را به شیوه‌ای انتزاعی تبلیغ می‌کند' }
		],
		'اثبات‌پذیری و منابع': [
			{ tag: 'بدون منبع', description: 'به هیچ منبعی استناد نمی‌کند' },
			{ tag: 'بدون منبع زنده', description: 'زندگی‌نامهٔ زندگان که هیچ منبعی ندارد (برای مقاله‌های جدید، از حذف زماندار زندگی‌نامه زندگان اسفاده کنید)' },
			{ tag: 'بهبود منبع', description: 'برای تأییدپذیری، نیازمند منابع و ارجاع‌های بیشتر است' },
			{ tag: 'خودچاپ‌کرده', description: 'دارای ارجاع‌های بیش از اندازه و نامناسب به منابع خودچاپ‌کرده است' },
			{ tag: 'دست‌اول', description: 'شامل تحقیق دست اول است' },
			{ tag: 'منابع اولیه', description: 'بیش از اندازه بر ارجاع به منابع اولیه متکی است و نیازمند ارجاع به منابع ثانویه است' },
			{ tag: 'منابع نامعتبر', description: 'بعضی منابع ممکن است قابل اعتماد نباشند' },
			{ tag: 'منبع زنده', description: 'زندگی‌نامهٔ زندگان که برای تأییدپذیری نیامند منابع بیشتر است' },
			{ tag: 'منبع مستقل', description: 'به‌شدت به منابعی اتکا دارد که به‌طور نزدیکی با موضوع مرتبط هستند' },
			{ tag: 'موضوع سرشناس', description: 'موضوع سرشناس، منابعی موجود هستند که می‌توانند به مقاله افزوده شوند' },
			{ tag: 'یک منبع', description: 'به‌طور گسترده یا تنها به یک منبع متکی است' }
		]
	},
	'مشکلات محتوایی مشخص': {
		'زبان': [
			{ tag: 'اصلاح ترجمه', description: 'دقیق، کامل و صحیح ترجمه نشده‌است و نیازمند اصلاح ترجمه است',
				excludeMI: true,
				subgroup: translationSubgroups.slice(0, 1).concat([{
					type: 'checkbox',
					list: [
						{
							name: 'translationNotify',
							label: 'آگاه‌سازی ایجاد‌کنندهٔ مقاله',
							checked: true,
							tooltip: "اعلان {{هبک-غیرفارسی}} در صفحهٔ بحث ایجادکنندهٔ مقاله قرار می‌دهد."
						}
					]
				}]).concat(translationSubgroups.slice(1))
			},
			{ tag: 'ترجمه تقریبی', description: 'ترجمهٔ ضعیف از یک زبان دیگر', excludeMI: true,
				subgroup: translationSubgroups
			},
			{ tag: 'گسترش از زبان', description: 'لازم است که با ترجمهٔ متن از یک مقاله به زبان دیگر، گسترش یابد',
				excludeMI: true,
				subgroup: [{
					type: 'hidden',
					name: 'expandLangTopic',
					parameter: 'موضوع',
					value: '',
					required: true // force empty topic param in output
				}, {
					name: 'expandLanguageLangCode',
					parameter: 'کد زبان',
					type: 'input',
					label: 'کد زبان:',
					tooltip: 'شناسهٔ زبانی که مقاله می‌تواند از روی آن گسترش داده‌شود',
					required: true
				}, {
					name: 'expandLanguageArticle',
					parameter: 'مقاله دیگر',
					type: 'input',
					label: 'نام مقاله:',
					tooltip: 'عنوان مقاله‌ای که گسترش از روی آن انجام می‌شود، بدون پیشوند میان‌ویکی'
				}]
			}
		],
		'پیونددهی': [
			{ tag: 'بن‌بست', description: 'مقاله به هیچ مقالهٔ دیگری پیوند ندارد' },
			{ tag: 'پرپیوند', description: 'پیوندهای تکراری و/یا نامرتبط زیاد به مقاله‌های دیگر' },
			{ tag: 'کم‌پیوند', description: 'نیازمند ویکی‌پیوندهای بیشتر به مقاله‌های دیگر است' },
			{ tag: 'یتیم', description: 'از هیچ مقالهٔ دیگری به آن پیوند داده نشده‌است' }
		],
		'شیوهٔ ارجاع': [
			{ tag: 'بدون پانویس', description: 'دارای ارجاع است، اما فاقد یادکرد درون‌خطی است' },
			{ tag: 'پانویس بیشتر', description: 'چند ارجاع دارد، اما یادکردهای درون‌خطی آن کافی نیستند' },
			{ tag: 'سبک یادکرد', description: 'از سبک یادکرد مبهم یا متناقض برخوردار است' },
			{ tag: 'نشانی‌های وب عریان', description: 'از پیوندهای عریان برای ارجاع استفاده می‌کند، که مستعد خراب‌شدن پیوند است' }
		],
		'رده‌ها': [
			{ tag: 'بهبود رده‌ها', description: 'نیازمند رده‌های تخصصی بیشتر است', excludeMI: true },
			{ tag: 'رده‌بندی‌نشده', description: 'در هیچ رده‌ای قرار نگرفته‌است', excludeMI: true }
		]
	},
	'ادغام': [
		{
			tag: 'ادغام تاریخچه',
			description: 'تاریخچهٔ یک صفحهٔ دیگر می‌تواند در تاریخچهٔ این صفحه ادغام شود',
			excludeMI: true,
			subgroup: [
				{
					name: 'histmergeOriginalPage',
					parameter: 'صفحه اولیه',
					type: 'input',
					label: 'مقالهٔ دیگر:',
					tooltip: 'عنوان صفحه‌ای که تاریخچه‌اش می‌تواند در این مقاله ادغام شود (الزامی).',
					required: true
				},
				{
					name: 'histmergeReason',
					parameter: 'دلیل',
					type: 'input',
					label: 'دلیل:',
					tooltip: 'توضیح کوتاه که دلیل نیاز به ادغام تاریخچه را بیان کند. بهتر است با عبارت «زیرا» آغاز نشود و با یک نقطه پایان یابد.'
				},
				{
					name: 'histmergeSysopDetails',
					parameter: 'جزئیات',
					type: 'input',
					label: 'جزئیات بیشتر:',
					tooltip: 'برای موارد پیچیده، راهنمایی‌های بیشتری را در اختیار مدیر بررسی‌کننده قرار دهید.'
				}
			]
		},
		{ tag: 'ادغام با', description: 'لازم است با یک مقالهٔ مشخص دیگر ادغام شود', excludeMI: true,
			subgroup: getMergeSubgroups('ادغام با') },
		{ tag: 'ادغام از', description: 'یک مقالهٔ مشخص دیگر باید در این مقاله ادغام شود', excludeMI: true,
			subgroup: getMergeSubgroups('ادغام از') },
		{ tag: 'ادغام در', description: 'لازم است که در یک مقالهٔ مشخص دیگر ادغام شود', excludeMI: true,
			subgroup: getMergeSubgroups('ادغام در') }
	],
	'اطلاع‌رسانی': [
//		{ tag: 'GOCEinuse', description: 'currently undergoing a major copy edit by the Guild of Copy Editors', excludeMI: true }, Localized [Removed] not used
		{ tag: 'در دست ترجمه', description: 'به‌طور فعال در دست ترجمه از یک ویکی‌پدیای دیگر است', excludeMI: true }, // Localized [Added] potentially useful
		{ tag: 'ویرایش', description: 'برای مدتی کوتاه تحت ویرایش عمده است', excludeMI: true },
		{ tag: 'در دست ساخت', description: 'در دست گسترش یا بازنویسی عمده است', excludeMI: true }
	]
};

// Tags for REDIRECTS start here
// Not by policy, but the list roughly approximates items with >500
// transclusions from Template:R template index
Twinkle.tag.redirectList = {
	'دستور زبان، علائم نگارشی و املاء': {
		'کوته‌نویسی': [
			{ tag: 'تغییرمسیر از سرواژه', description: 'تغییرمسیر از یک سرواژه (مانند بی‌بی‌سی) به قالب گسترش‌یافتهٔ آن' },
			{ tag: 'تغییرمسیر از مخفف', description: 'تغییرمسیر از یک سرنام (مانند فحن) به قالب گسترش‌یافتهٔ آن' }
//			{ tag: 'R from MathSciNet abbreviation', description: 'redirect from MathSciNet publication title abbreviation to the unabbreviated title' },
//			{ tag: 'R from NLM abbreviation', description: 'redirect from a NLM publication title abbreviation to the unabbreviated title' }
		],
/* 		'Capitalisation': [
			{ tag: 'R from CamelCase', description: 'redirect from a CamelCase title' },
			{ tag: 'R from other capitalisation', description: 'redirect from a title with another method of capitalisation' },
			{ tag: 'R from miscapitalisation', description: 'redirect from a capitalisation error' }
		], Localized [Removed] */ 
		'دستور زبان و علائم نگارشی': [
			{ tag: 'تغییرمسیر از تغییر', description: 'تغییرمسیر از یک حالت تغییر یافتهٔ عنوان هدف نظیر جابجایی واژه‌ها' },
			{ tag: 'تغییرمسیر از اسم جمع', description: 'تغییرمسیر از یک واژهٔ جمع بسته‌شده به معادل مفرد' },
			{ tag: 'تغییرمسیر به اسم جمع', description: 'تغییرمسیر از یک اسم مفرد به حالت جمع‌بسته‌شدهٔ آن' }
		],
		'بخش‌های گفتار': [
			{ tag: 'تغییرمسیر از فعل', description: 'تغییرمسیر از یک عفل یا گروه فعلی فارسی' },
			{ tag: 'تغییرمسیر از صفت', description: 'تغییرمسیر از یک صفت (واژه یا عبارتی برای توصیف یک اسم)' }
		],
		'تلفظ': [
			{ tag: 'تغییرمسیر از املای جایگزین', description: 'تغییرمسیر از یک عنوان با املای متفاوت' },
//			{ tag: 'R from ASCII-only', description: 'redirect from a title in only basic ASCII to the formal title, with differences that are not diacritical marks or ligatures' },
//			{ tag: 'R to ASCII-only', description: 'redirect to a title in only basic ASCII from the formal title, with differences that are not diacritical marks or ligatures' },
			{ tag: 'تغییرمسیر از حرکت‌گذاری', description: 'تغییرمسیر از عنوانی که دارای نویسه‌های حرکت‌گذاری (ـَــِــُ و امثال آن‌ها) است'  },
			{ tag: 'تغییرمسیر به حرکت‌گذاری', description: 'تغییرمسیر به عنوانی که دارای نویسه‌های حرکت‌گذاری (ـَــِــُ و امثال آن‌ها) است' },
			{ tag: 'تغییرمسیر از غلط املایی', description: 'تغییرمسیر از یک آوانگاری اشتباه یا خطا در نشانه‌گذاری' }
		]
	},
	'نام‌های جایگزین': {
		'عمومی': [
			{
				tag: 'تغییرمسیر از زبانی دیگر',
				description: 'تغییرمسیر از یک نام فارسی به نامی به زبان دیگر، یا برعکس',
				subgroup: [
					{
						name: 'altLangFrom',
						type: 'input',
						label: 'از زبان (شناسهٔ دوحرفی):',
						tooltip: 'شناسهٔ دوحرفی زبانی که عنوان تغییرمسیر به آن زبان نوشته شده‌است را وارد کنید؛ مانند fa برای فارسی و en برای انگلیسی'
					},
					{
						name: 'altLangTo',
						type: 'input',
						label: 'به زبان (شناسه دوحرفی):',
						tooltip: 'شناسهٔ دوحرفی زبانی که عنوان هدف به آن زبان نوشته شده‌است را وارد کنید؛ مانند fa برای فارسی و en برای انگلیسی'
					},
					{
						name: 'altLangInfo',
						type: 'div',
						label: $.parseHTML('<p>برای مشاهدهٔ فهرست شناسه‌های زبان‌ها <a href="en.wikipedia.org/wiki/Wp:Template_messages/Redirect_language_codes">ویکی‌پدیا:فهرست الگوهای پیامی/شناسه‌های زبان تغییرمسیر</a></p> (انگلیسی) را ببینید')
					}
				]
			},
			{ tag: 'تغییرمسیر از نام جایگزین', description: 'تغییرمسیر از عنوانی که نام دیگر، نام مستعار، نام خودمانی یا نام مترادف است' },
			{
				tag: 'تغییرمسیر از نام مرتب‌سازی ابهام‌دار',					// Localized; added param
				description: 'تغییرمسیر از یک نام مرتب‌سازی ابهام‌دار به صفحه یا فهرستی که آن را ابهام‌زدایی می‌کند',
				subgroup: [
					{
						name: 'ambigSortTarget',
						type: 'input',
						label: 'نخستین حرف از عنوان صفحهٔ هدف:',
						tooltip: 'نخستین حرف عنوان صفحهٔ هدف تغییرمسیر؛ برای مثال، «م» برای «مایکل جکسون»',
						required: true
					}
				]
			},
			{ tag: 'تغییرمسیر از نام پیشین', description: 'تغییرمسیر از نام یا عنوان کاری سابق' },
			{ tag: 'تغییرمسیر از نام ناکامل', description: 'تغییرمسیر از حالت ناکامل عنوان هدف' },
			{ tag: 'تغییرمسیر از نام نادرست', description: 'تغییرمسیر از یک نام اشتباه که برای استفاده در عنوان، مناسب نیست' },
			{ tag: 'تغییرمسیر از نام عمومی‌تر', description: 'تغییرمسیر از عنوانی کمتر اختصاصی به عنوانی اختصاصی‌تر و کمتر عمومی' },
			{ tag: 'تغییرمسیر از نام بلند', description: 'تغییرمسیر از عنوانی کامل‌تر' },
			{ tag: 'تغییرمسیر از نام اختصاصی‌تر', description: 'تغییرمسیر از عنوانی اختصاصی‌تر به یک عنوان عمومی‌تر و کمتر اختصاصی' },
			{ tag: 'تغییرمسیر از نام غیربی‌طرف', description: 'تغییرمسیر از عنوانی که حاوی یک واژه، عبارت یا نام غیربی‌طرف، تحقیرآمیز، بحث‌برانگیز یا توهین‌آمیز است' },
			{ tag: 'تغییرمسیر از نام کوتاه', description: 'تغییرمسیر از عنوانی که صورت کوتاه‌شدهٔ نام کامل یک شخص، یک عنوان کتاب، یا عنوان کامل‌تر دیگری است' },
			{
				tag: 'تغییرمسیر از نام مرتب‌سازی',
				description: 'تغییرمسیر از نام مرتب‌سازی هدف، مثلاً عنوانی که به‌جای نام کوچک، با نام خانوادگی شروع می‌شود',
				subgroup: [
					{
						name: 'sortTarget',
						type: 'input',
						label: 'نخستین حرف از عنوان صفحهٔ هدف:',
						tooltip: 'نخستین حرف عنوان صفحهٔ هدف تغییرمسیر؛ برای مثال، «م» برای «مایکل جکسون»',
						required: true
					}
				]
			},
			{ tag: 'تغییرمسیر از مترادف', description: 'تغییرمسیر از یک مترادف معنایی برای عنوان صفحهٔ هدف' }
		],
		'افراد': [
			{ tag: 'تغییرمسیر از نام تولد', description: 'تغییرمسیر از نام تولد یک شخص به نامی متداول‌تر یا موضوعی مرتبط' },
			{ tag: 'تغییرمسیر از نام کوچک', description: 'تغییرمسیر از نام کوچک یک فرد' },
//			{ tag: 'R from married name', description: 'redirect from a person\'s married name to a more common name' },
			{ tag: 'تغییرمسیر از نام با عنوان', description: 'تغییرمسیر از نام یک شخص که پیش یا پس از آن یک عنوان افتخاری قرار گرفته، به نامی بدون عنوان یا به‌همراه عنوان قرارگرفته در پرانتز' },
			{ tag: 'تغییرمسیر از شخص', description: 'تغییرمسیر از یک یا چند شخص به یک مقالهٔ مرتبط' },
			{ tag: 'تغییرمسیر از نام شخصی', description: 'تغییرمسیر از نام شخصی یک فرد به مقاله‌ای که عنوان آن برابر با نام هنری حرفه‌ای یا سایر نام‌های خودمان شناخته‌شده‌تر است' },
			{ tag: 'تغییرمسیر از نام مستعار', description: 'تغییرمسیر از یک نام مستعار، نظیر نام هنری یک هنرمند یا تخلص یک نویسنده' },
			{ tag: 'تغییرمسیر از نام خانوادگی', description: 'تغییرمسیر از عنوانی که یک نام خانوادگی است' }
		],
		'فنی': [
			{ tag: 'تغییرمسیر از نام تجاری دارو', description: 'از (یا به) نام تجاری یک دارو به (یا از) نام غیراختصاصی بین‌المللی (INN)' },
			{ tag: 'تغییرمسیر از نام پرونده', description: 'تغییرمسیر از عنوانی که نام پروندهٔ موضوع صفحهٔ هدف است' },
			{ tag: 'تغییرمسیر از فرمول شیمیایی', description: 'تغییرمسیر از یک فرمول شیمیایی/مولکولی یه نام فنی یا عمومی آن' },

//			{ tag: 'R from gene symbol', description: 'redirect from a Human Genome Organisation (HUGO) symbol for a gene to an article about the gene' }
		],
		'جانداران': [
			{ tag: 'تغییرمسیر به نام علمی', description: 'تغییرمسیر از نام عمومی به نام علمی' },
			{ tag: 'تغییرمسیر از نام علمی', description: 'تغییرمسیر از نام علمی به نام عمومی' },
			{ tag: 'تغییرمسیر از نام علمی جایگزین', description: 'تغییرمسیر از یک نام علمی جایگزین به نام علمی پذیرفته‌شده' },
			{ tag: 'تغییرمسیر از کوته‌نوشت علمی', description: 'تغییرمسیر از یک کوته‌نوشت علمی' },
			{ tag: 'تغییرمسیر به آرایه تک‌نماد', description: 'تغییرمسیر از تنها عضو رده پایین‌تر یک آرایهٔ تک‌نماد به خود آرایهٔ تک‌نماد آن' },
			{ tag: 'تغییرمسیر از آرایه تک‌نماد', description: 'تغییرمسیر از یک آرایهٔ تک‌نماد به تنها عضر رده پایین‌تر آن' },
			{ tag: 'تغییرمسیر آرایه با احتمالات', description: 'تغییرمسیر از عنوانی مرتبط با یک جاندار زندهکه احتمالاً می‌تواند تا سطح تبدیل شدن به یک مقاله گسترش یابد' }
		],
		'جغرافیا': [
			{ tag: 'تغییرمسیر از نام و کشور', description: 'تغییرمسیر از نام اختصاصی یک مکان جغرافیایی به نام مختصرتر آن' },
			{ tag: 'تغییرمسیر از شهر و ایالت', description: 'تغییرمسیر از نام یک شهر به‌همراه ایالت آن به مقالهٔ اختصاصی آن شهر' },
			{ tag: 'تغییرمسیر از شهر و استان', description: 'تغییرمسیر از نام یک شهر به‌همراه استان آن به مقالهٔ اختصاصی آن شهر' },
			{ tag: 'تغییرمسیر از نام جغرافیایی اختصاصی‌تر', description: 'تغییرمسیر از نام یک مکان جغرافیایی که حاوی یک شناسهٔ فرعی نظیر نام شهرستان یا منطقهٔ آن شهر است' }
		]
	},
	'کمک به ناوبری': {
		'ناوبری': [
			{ tag: 'تغییرمسیر به لنگر', description: 'تغییرمسیر از موضوعی که صفحهٔ اختصاصی برای خود ندارد به بخشی از یک صفحه دربارهٔ موضوع که دارای لنگر است' },
			{
				tag: 'تغییرمسیر دوتایی اجتناب‌شده',
				description: 'تغییرمسیر از یک عنوان جایگزین برای یک تغییرمسیر دیگر',
				subgroup: {
					name: 'doubleRedirectTarget',
					type: 'input',
					label: 'نام هدف تغییرمسیر',
					tooltip: 'نام صفحه‌ای که در صورت تغییرمسیر نبودن، این تغییرمسیر باید به آن هدایت می‌شد را وارد کنید'
				}
			},
//			{ tag: 'R from file metadata link', description: 'redirect of a wikilink created from EXIF, XMP, or other information (i.e. the "metadata" section on some image description pages)' }, Localized [Removed]: Only for enwiki
			{ tag: 'تغییرمسیر به مدخل فهرست', description: 'تغییرمسیر به فهرستی که حاوی توصیفی مختصر پیرامون موضوعاتی است که برای داشتن مقالهٔ جداگانه به‌اندازهٔ کافی سرشناس نیستند' },

			{ tag: 'تغییرمسیر مورد اشاره در سرنویس', description: 'تغییرمسیر از عنوانی که در یک سرنویس در صفحهٔ هدف مورد اشاره قرار گرفته است' },
			{ tag: 'تغییرمسیر به بخش', description: 'مشابه {{تغییرمسیر به مدخل فهرست}}، اما برای زمانی که فهرست بخش‌بندی شده‌است، مانند فهرستی از شخصیت‌ها در یک دنیای خیالی' },
			{ tag: 'تغییرمسیر از میانبر', description: 'تغییرمسیر از یک میانبر ویکی‌پدیا' },
			{ tag: 'تغییرمسیر به زیرصفحه', description: 'تغییرمسیر به یک زیرصفحه' }
		],
		'ابهام‌زدایی': [
			{ tag: 'تغییرمسیر از اصطلاح ابهام‌دار', description: 'تغییرمسیر از نام ابهام‌دار یک صفحه به صفحه‌ای که ابهام آن را رفع می‌کند. این الگو هرگز نباید در صفحه‌ای که در عنوان خود عبارت «(ابهام‌زدایی)» را دارد، به‌کار رود. در چنین مواردی در عوض از {{تغییرمسیر به صفحه ابهام‌زدایی}} استفاده کنید' },
			{ tag: 'تغییرمسیر به صفحه ابهام‌زدایی', description: 'تغییرمسیر به یک صفحهٔ ابهام‌زدایی' },
			{ tag: 'تغییرمسیر از ابهام‌زدایی ناکامل', description: 'عنوانی که بیش از آن دارای ابهام است که بتواند عنوان یک نوشتار قرار گیرد و باید به یک صفحهٔ ابهام‌زدایی مناسب تغییرمسیر داده شود' },
			{ tag: 'تغییرمسیر از ابهام‌زدایی نادرست', description: 'تغییرمسیر از یک نام صفحه با ابهام‌زدایی نادرست به‌دلیل اشتباه تایپی یا تصور ویرایشی نادرست در گذشته' },
			{ tag: 'تغییرمسیر از ابهام‌زدایی دیگر', description: 'تغییرمسیر از نام یک صفحه با یک واژه ابهام‌زدایی جایگزین' },
			{ tag: 'تغییرمسیر از ابهام‌زدایی نالازم', description: 'تغییرمسیر از یک نام صفحه که دارای عبارت ابهام‌زدایی نالازم است' }
		],
		'ادغام، تکرار یا انتقال': [
			{ tag: 'تغییرمسیر از مقاله تکراری', description: 'تغییرمسیر به یک مقالهٔ مشابه به‌منظور حفظ تاریخچهٔ ویرایشی صفحه' },
			{ tag: 'تغییرمسیر دارای تاریخچه', description: 'تغییرمسیر از صفحه‌ای که دارای تاریخچهٔ مختص به خود است و برای حفظ محتوا و انتساب‌ها نگه داشته شده است' },
			{ tag: 'تغییرمسیر از انتقال', description: 'تغییرمسیر از صفحه‌ای که منتقل شده یا تغییر نام یافته است' },
			{ tag: 'تغییرمسیر حاصل از ادغام', description: 'تغییرمسیر از صفحهٔ ادغام‌شده به‌منظور حفظ تاریخچهٔ ویرایشی آن' }
		],
		'فضای نام': [
			{ tag: 'تغییرمسیر از صفحه بحث جزئی', description: 'تغییرمسیر از یک صفحهٔ بحث در هریک از فضاهای بحث به یک صفحهٔ بحث متناظر که پی‌گیری‌کنندگان بیشتری دارد' },
			{ tag: 'تغییرمسیر به فضای نام رده', description: 'تغییرمسیر از صفحه‌ای خارج از فضای نام رده به یک صفحهٔ رده' },
			{ tag: 'تغییرمسیر به فضای نام راهنما', description: 'تغییرمسیر از هر صفحه‌ای داخل یا خارج از فضای نام راهنما به صفحه‌ای در این فضای نام' },
			{ tag: 'تغییرمسیر به فضای نام اصلی', description: 'تغییرمسیر از صفحه‌های خارج از فضای نام اصلی مقاله‌ها به یک مقاله در فضای نام اصلی' },
			{ tag: 'تغییرمسیر به فضای نام درگاه', description: 'تغییرمسیر از هر صفحه‌ای درون یا خارج از فضای نام درگاه به صفحه‌ای در همین فضای نام' },
			{ tag: 'تغییرمسیر به فضای نام پروژه', description: 'تغییرمسیر از هر صفحه‌ای درون یا خارج از فضای نام پروژه (ویکی‌پدیا: یا وپ:) به هر صفحه‌ای در این فضای نام' },
			{ tag: 'تغییرمسیر به فضای نام کاربر', description: 'تغییرمسیر از صفحه‌ای خارج از فضای نام کاربر به یک صفحهٔ کاربری (و نه صفحهٔ بحث کاربر)' }
		]
	},
	'رسانه': {
		'عمومی': [
			{ tag: 'تغییرمسیر از کتاب', description: 'تغییرمسیر از عنوان یک کتاب به یک مقالهٔ مرتبط و عمومی‌تر یا عنوان دیگر آن کتاب' },
			{ tag: 'تغییرمسیر از آلبوم', description: 'تغییرمسیر از یک آلبوم به یک موضوع مرتبط نظیر مقالهٔ موسیقی‌دان صاحب آلبوم یا فهرست آلبوم‌های او' },
			{ tag: 'تغییرمسیر از ترانه', description: 'تغییرمسیر از عنوان یک ترانه به یک مقالهٔ عمومی‌تر مرتبط' },
			{ tag: 'تغییرمسیر از فیلم', description: 'تغییرمسیر از عنوان یک فیلم به یک مقالهٔ عمومی‌تر نظیر مقالهٔ کارگردان یا فهرست آثار او' },
			{ tag: 'تغییرمسیر از قسمت تلویزیونی', description: 'تغییرمسیر از قسمتی از یک برنامه تلویزیونی به یک اثر مرتبط یا فهرست قسمت‌های آن برنامه' }
		],
/*		Fiction: [
			{ tag: 'R from fictional character', description: 'redirect from a fictional character to a related fictional work or list of characters' },
			{ tag: 'R from fictional element', description: 'redirect from a fictional element (such as an object or concept) to a related fictional work or list of similar elements' },
			{ tag: 'R from fictional location', description: 'redirect from a fictional location or setting to a related fictional work or list of places' }

		] Localized [Removed] There's no such redirects on fawiki or they're very rare */ 
	},
	'متفرقه': {
		'اطلاعات مرتبط': [
			{ tag: 'تغییرمسیر به مقاله فاقد اشاره', description: 'تغییرمسیر به مقاله‌ای که فاقد هرگونه اشاره به واژه یا عبارت عنوان تغییرمسیر است' },
			{ tag: 'تغییرمسیر به دهه', description: 'تغییرمسیر از یک سال به مقالهٔ دههٔ مرتبط' },
			{
				tag: 'تغییرمسیر از نام دامنه',
				description: 'تغییرمسیر از یک نام دامنه به مقاله‌ای پیرامون یک نهاد یا وبگاه',
				subgroup: {
					name: 'domainName',
					type: 'input',
					label: 'دامنه:',
					tooltip: 'دامنهٔ مورد نظر برای اشاره در متن الگو. مثلاً «ir» یا «com»'
				}
			},
			{ tag: 'تغییرمسیر از عبارت', description: 'تغییرمسیر از یک عبارت به یک مقالهٔ عمومی‌تر مرتبط که موضوع را پوشش داده است' },
			{ tag: 'تغییرمسیر از موضوع فهرست', description: 'تغییرمسیر از موضوع یک فهرست به فهرست متناظر آن' },
			{ tag: 'تغییرمسیر از عضو', description: 'تغییرمسیر از عضوی از یک گروه به یک موضوع مرتبط نظیر گروه یا سازمانی که در آن عضویت دارد' },
			{ tag: 'تغییرمسیر به موضوع مرتبط', description: 'تغییرمسیر به مقاله‌ای پیرامون موضوعی مشابه' },
			{ tag: 'تغییرمسیر از واژه مرتبط', description: 'تغییرمسیر از یک واژهٔ مرتبط' },
			{ tag: 'تغییرمسیر از مدرسه', description: 'تغییرمسیر از مقالهٔ سابق یک مدرسه که اطلاعات بسیار کمی داشته است' },
			{ tag: 'تغییرمسیر از زیرموضوع', description: 'تغییرمسیر از عنوانی که زیرموضوعی از مقالهٔ هدف است' },
			{ tag: 'تغییرمسیر به زیرموضوع', description: 'تغییرمسیر به زیرموضوعی از موضوع تغییرمسیر' },
			{ tag: 'تغییرمسیر از نویسه یونی‌کد', description: 'تغییرمسیر از یک نویسهٔ تکی یونی‌کد به یک مقاله یا صفحهٔ پروژهٔ ویکی‌پدیا که معنای آن نماد را استنباط می‌کند' },
			{ tag: 'تغییرمسیر از شناسه یونی‌کد', description: 'تغییرمسیر از یک موقعیت کد یونی‌کد به مقاله‌ای پیرامون نویسهٔ مرتبط با آن موقعیت کد' }
		],
		'دارای احتمالات': [
			{ tag: 'تغییرمسیر با احتمالات', description: 'تغییرمسیر از یک موضوع خاص به یک مقالهٔ عمومی‌تر با جزئیات کمتر (مقاله‌ای که می‌تواند و می‌باید گسترش داده شود)' }
		],
/*		'شناسه‌های ایزو': [
			{ tag: 'R from ISO 4 abbreviation', description: 'redirect from an ISO 4 publication title abbreviation to the unabbreviated title' },
			{ tag: 'R from ISO 639 code', description: 'redirect from a title that is an ISO 639 language code to an article about the language' }
		], Localized [Removed] Is it needed here? */
		'ارزش چاپ': [
			{ tag: 'تغییرمسیر قابل چاپ', description: 'تغییر مسیر از عنوانی که وجود آن در نسخهٔ چاپی یا سی‌دی/دی‌وی‌دی ویکی‌پدیا مفید است' },
			{ tag: 'تغییرمسیر فاقد ارزش چاپ', description: 'تغییرمسیر از عنوانی که وجود آن در نسخهٔ چاپی یا سی‌دی/دی‌وی‌دی ویکی‌پدیا مفید نیست' }
		]
	}
};

// maintenance tags for FILES start here

Twinkle.tag.fileList = {
	'برچسب‌های مشکلات اجازه‌نامه و منبع‌دهی': [
		{ label: '{{درخواست منبع بهتر}}: اطلاعات منبع تنها حاوی نشانی عریان پرونده یا نشانی عمومی ریشه است', value: 'درخواست منبع بهتر' },
		{ label: '{{نیازمند نسخه کوچکتر}}: تصویر مورد استفادهٔ منصفانه با وضوح بالا (یا کلیپ صوتی بسیار بلند و غیره)', value: 'نیازمند نسخه کوچکتر' },
		{ label: '{{نسخه‌های غیر آزاد یتیم}}: رسانه‌های استفادهٔ منصفانه با اصلاحات قدیمی که نیازمند حذف هستند', value: 'نسخه‌های غیر آزاد یتیم' }
	],
	'برچسب‌های مرتبط با ویکی‌انبار': [
		{ label: '{{انتقال به ویکی‌انبار}}: رسانه‌های آزاد که باید به ویکی‌انبار منتقل شوند', value: 'انتقال به ویکی‌انبار' },
		{
			label: '{{به ویکی‌انبار انتقال ندهید}}: پروندهٔ نامناسب برای انتقال به ویکی‌انبار',
			value: 'به ویکی‌انبار انتقال ندهید',
			subgroup: [
				{
					type: 'input',
					name: 'DoNotMoveToCommons_reason',
					label: 'دلیل:',
					tooltip: 'دلیل این که این تصویر نباید به ویکی‌انبار منتقل شود را وارد کنید (الزامی). اگر این پرونده در ایالات متحده آزاد است، اما در کشور خاستگاه چنین نیست، عبارت «فقط آمریکا» را وارد کنید',
					required: true
				},
				{
					type: 'number',
					name: 'DoNotMoveToCommons_expiry',
					label: 'سال منقضی شدن:',
					min: new Morebits.date().getFullYear(),
					tooltip: 'اگر این پرونده را می‌توان در یک سال مشخص به ویکی‌انبار منتقل کرد، می‌توانید سال مورد نظر را اینجا وارد کنید (اختیاری).'
				}
			]
		},
		{
			label: '{{نسخه محلی حفظ شود}}: درخواست برای نگه‌داشتن نسخهٔ محلی از یک پروندهٔ انبار',
			value: 'نسخه محلی حفظ شود',
			subgroup: {
				type: 'input',
				name: 'keeplocalName',
				label: 'نام تصویر در انبار در صورت تفاوت داشتن:',
				tooltip: 'نام تصویر در ویکی‌انبار (اگر با نام محلی متفاوت است)، بدون پیشوند «پرونده:»:'
			}
		},
		{
			label: '{{موجود در انبار}}: پرونده به انبار کپی شده‌است',
			value: 'موجود در انبار',
			subgroup: {
				type: 'input',
				name: 'nowcommonsName',
				label: 'نام تصویر در انبار در صورت تفاوت داشتن:',
				tooltip: 'نام تصویر در ویکی‌انبار (اگر با نام محلی متفاوت است), ، بدون پیشوند «پرونده:»:'
			}
		}
	],
	'برچسب‌های تمیزکاری': [
		{ label: '{{مصنوعات}}: پروندهٔ PNG شامل مصنوعات فشرده‌سازی باقی‌مانده', value: 'مصنوعات' },
		{ label: '{{قلم بد}}: پروندهٔ SVG استفاده‌کننده از فونت‌هایی که در سرور بندانگشتی موجود نیستند', value: 'قلم بد' },
		{ label: '{{قالب بد}}: پروندهٔ PDF/DOC/... باید به یک قالب کاربردی‌تر تبدیل شود', value: 'قالب بد' },
		{ label: '{{گیف بد}}: پروندهٔ GIF که باید در فرمت PNG، JPEG، یا SVG باشد', value: 'گیف بد' },
		{ label: '{{جی‌پگ بد}}: پروندهٔ JPEG که باید در فرمت PNG یا SVG باشد', value: 'جی‌پگ بد' },
		{ label: '{{اس‌وی‌جی بد}}: پروندهٔ SVG حاوی جلوه‌های شطرنجی', value: 'اس‌وی‌جی بد' },
		{ label: '{{مسیر بد}}: پروندهٔ SVG ترسیم‌شده به‌صورت خودکار که نیازمند تمیزکاری است', value: 'مسیر بد' },
		{
			label: '{{تمیزکاری تصویر}}: تمیزکاری عمومی', value: 'تمیزکاری تصویر',
			subgroup: {
				type: 'input',
				name: 'cleanupimageReason',
				label: 'دلیل:',
				tooltip: 'دلیل نیاز این تصویر به تمیزکاری را وارد کنید (الزامی)',
				required: true
			}
		},
		{ label: '{{کلیرتایپ}}: تصویر (و نه نماگرفت) با تصحیح فرکانس کلیرتایپ', value: 'کلیرتایپ' },
		{ label: '{{واترمارک تصویر}}: تصویر شامل واترمارک نمایان یا پنهان است', value: 'واترمارک تصویر' },
		{ label: '{{سکه نه}}: تصویر استفاده‌کننده از سکه برای نشان‌دادن مقیاس', value: 'سکه نه' },
		{ label: '{{جی‌پگ بیش‌فشرده}}: پروندهٔ JPEG با سطح بالایی از مصنوعات', value: 'جی‌پگ بیش‌فشرده' },
		{ label: '{{کدر}}: پس‌زمینهٔ تصویر کدر است و باید شفاف باشد', value: 'کدر' },
		{ label: '{{نیازمند حذف کادر}}: کادر نالازم، فضای سفید و غیره', value: 'نیازمند حذف کادر' },
		{
			label: '{{تغییرنام پرونده}}: نام پرونده با توجه به معیارهای درج‌شده در [[وپ:بت]] باید تغییر یابد',
			value: 'تغییرنام پرونده',
			subgroup: [
				{
					type: 'input',
					name: 'renamemediaNewname',
					label: 'نام جدید:',
					tooltip: 'نام جدید برای تصویر را وارد کنید (اختیاری)'
				},
				{
					type: 'input',
					name: 'renamemediaReason',
					label: 'دلیل:',
					tooltip: 'دلیل تغییرنام را وارد کنید (اختیاری)'
				}
			]
		},
		{ label: '{{باید پی‌ان‌جی باشد}}: پیوندهٔ گیف یا جی‌پگ که باید بی‌اتلاف باشد', value: 'باید پی‌ان‌جی باشد' },
		{
			label: '{{باید اس‌وی‌جی باشد}}: پروندهٔ پی‌ان‌جی، گیف، یا جی‌پگ که باید گرافیک بُرداری باشد', value: 'باید اس‌وی‌جی باشد',
			subgroup: {
				name: 'svgCategory',
				type: 'select',
				list: [
					{ label: '{{باید اس‌وی‌جی باشد|متفرقه}}', value: 'متفرقه' },
					{ label: '{{باید اس‌وی‌جی باشد|الفبا}}: تصویر نویسه‌ها، نمونهٔ قلم و غیره', value: 'الفبا' },
					{ label: '{{باید اس‌وی‌جی باشد|شیمی}}: نمودارهای شیمیایی و غیره', value: 'شیمی' },
					{ label: '{{باید اس‌وی‌جی باشد|مدار}}: نمودار مدارهای الکترونیکی و غیره', value: 'مدار' },
					{ label: '{{باید اس‌وی‌جی باشد|نشان خاندان}}: نشان‌های خانوادگی', value: 'نشان خاندان' },
					{ label: '{{باید اس‌وی‌جی باشد|هندسی}}: نمودارهایی که در زیرردهٔ دیگری نمی‌گنجند', value: 'هندسی' },
					{ label: '{{باید اس‌وی‌جی باشد|علامت}}: علامت‌ها، نشان‌واره‌های آزاد، نشان‌های افتخار و غیره', value: 'علامت' },
					{ label: '{{باید اس‌وی‌جی باشد|منصفانه}}: تصاویر استفاده منصفانه، نشان‌واره‌های استفاده منصفانه', value: 'منصفانه' },
					{ label: '{{باید اس‌وی‌جی باشد|پرچم}}: پرچم‌ها', value: 'پرچم' },
					{ label: '{{باید اس‌وی‌جی باشد|نمودار}}: نمودارهای بصری داده‌ها', value: 'نمودار' },
					{ label: '{{باید اس‌وی‌جی باشد|لوگو}}: نشان‌واره‌ها', value: 'لوگو' },
					{ label: '{{باید اس‌وی‌جی باشد|نقشه}}: نقشه‌ها', value: 'نقشه' },
					{ label: '{{باید اس‌وی‌جی باشد|موسیقی}}: مقیاس‌های موسیقی، نت‌های موسیقی و غیره', value: 'موسیقی' },
					{ label: '{{باید اس‌وی‌جی باشد|فیزیکی}}: تصاویر «واقع‌بینانه» از اشیاء فیزیکی، انسان‌ها و غیره', value: 'فیزیکی' },
					{ label: '{{باید اس‌وی‌جی باشد|نماد}}: نمادهای متفرقه، آیکون‌ها و غیره', value: 'نماد' }
				]
			}
		},
		{ label: '{{باید متن باشد}}: image should be represented as text, tables, or math markup', value: 'باید متن باشد' }
	],
	'برچسب‌های کیفیت تصویر': [
		{ label: '{{کلک‌زنی تصویر}}: تصویر ممکن است دستکاری شده باشد یا شکل‌دهندهٔ یک حقه باشد', value: 'کلک‌زنی تصویر' },
		{ label: '{{تصویر پرنور}}: نور باعث شده که برخی نواحی تصویر از آن جدا شوند', value: 'تصویر پرنور' },
		{ label: '{{فوکوس تصویر}} موضوع اصلی تصویر از فاصلهٔ کانونی خارج است', value: 'فوکوس تصویر' },
		{
			label: '{{تصویر کم‌کیفیت}}: کیفیت تصویر پایین است و باید با نسخه‌ای با کیفیت بهتر جایگزین شود', value: 'تصویر کم‌کیفیت',
			subgroup: {
				type: 'input',
				name: 'ImagePoorQualityReason',
				label: 'دلیل:',
				tooltip: 'دلیل کم‌کیفیت بودن تصویر را وارد کنید (الزامی)',
				required: true
			}
		},
		{ label: '{{نوردهی ضعیف}} نوردهی تصویر ضعیف است', value: 'نوردهی ضعیف' },
		{
			label: '{{شیمیایی کم‌کیفیت}}: ساختار شیمیایی مورد اختلاف', value: 'شیمیایی کم‌کیفیت',
			subgroup: {
				type: 'input',
				name: 'lowQualityChemReason',
				label: 'دلیل:',
				tooltip: 'دلیل این که نمودار مورد اختلاف است را وارد کنید (الزامی)',
				required: true
			}
		}
	],
	'برچسب‌های جایگزینی': [
		{ label: '{{منسوخ‌شده}}: نسخهٔ بهبودیافتهٔ پرونده در دسترس است', value: 'منسوخ‌شده' },
		{ label: '{{نسخه پی‌ان‌جی در دسترس است}} تصاویری که نسخهٔ پی‌ان‌جی آن‌ها به‌عنوان جایگزین بارگذاری شده است', value: 'نسخه پی‌ان‌جی در دسترس است' },
		{ label: '{{نسخه برداری در دسترس است}} تصاویری که نسخهٔ اس‌وی‌جی آن‌ها به‌عنوان جایگزین بارگذاری شده است', value: 'نسخه برداری در دسترس است' }
	]
};
Twinkle.tag.fileList['برچسب‌های جایگزینی'].forEach(function(el) {
	el.subgroup = {
		type: 'input',
		label: 'پروندهٔ جایگزین:',
		tooltip: 'نام پرونده‌ای که جایگزین این پرونده شده است را وارد کنید (الزامی)',
		name: el.value.replace(/ /g, '_') + 'File',
		required: true
	};
});


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 = 'حذف برچسب' + (removedTags.length > 1 ? '‌های ' : ' ') + makeSentence(removedTags);
			}
			// نیازی به عبارت زیر در پیام‌های فارسی نیست. تغییرات لازم در سطر 1326 و 1327 اعمال شده
			// summaryText += ' tag' + (addedTags.length + removedTags.length > 1 ? 's' : ''); Localized [Removed]
			if (params.reason) {
				summaryText += ': ' + params.reason;
			}

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

			pageobj.setPageText(pageText);
			pageobj.setEditSummary(summaryText);
			if ((mw.config.get('wgNamespaceNumber') === 0 && Twinkle.getPref('watchTaggedVenues').indexOf('articles') !== -1) || (mw.config.get('wgNamespaceNumber') === 118 && Twinkle.getPref('watchTaggedVenues').indexOf('drafts') !== -1)) {
				pageobj.setWatchlist(Twinkle.getPref('watchTaggedPages'));
			}
			pageobj.setMinorEdit(Twinkle.getPref('markTaggedPagesAsMinor'));
			pageobj.setCreateOption('nocreate');
			pageobj.save(function() {
				// COI: Start the discussion on the talk page (mainspace only)
				if (params.coiReason) {
					var coiTalkPage = new Morebits.wiki.page('بحث:' + Morebits.pageNameNorm, 'در حال آغاز گفتگو در صفحهٔ بحث');
					coiTalkPage.setNewSectionText(params.coiReason + ' ~~~~');
					coiTalkPage.setNewSectionTitle('برچسب تعارض منافع (' + new Morebits.date(pageobj.getLoadTime()).format('MMMM Y', 'utc') + ')');
					coiTalkPage.setChangeTags(Twinkle.changeTags);
					coiTalkPage.setCreateOption('recreate');
					coiTalkPage.newSection();
				}

				// Special functions for merge tags
				// Post a rationale on the talk page (mainspace only)
				if (params.mergeReason) {
					var mergeTalkPage = new Morebits.wiki.page('بحث:' + params.discussArticle, 'در حال اعلام دلیل در صفحهٔ بحث');
					mergeTalkPage.setNewSectionText(params.mergeReason.trim() + ' ~~~~');
					mergeTalkPage.setNewSectionTitle(params.talkDiscussionTitleLinked);
					mergeTalkPage.setChangeTags(Twinkle.changeTags);
					mergeTalkPage.setWatchlist(Twinkle.getPref('watchMergeDiscussions'));
					mergeTalkPage.setCreateOption('recreate');
					mergeTalkPage.newSection();
				}
				// Tag the target page (if requested)
				if (params.mergeTagOther) {
					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.setChangeTags(Twinkle.changeTags);
					otherpage.setCallbackParameters(newParams);
					otherpage.load(Twinkle.tag.callbacks.article);
				}

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

						var lang = params.translationLanguage;
						var reason = params.translationComments;

						var templateText = '{{جا:نیاز به ترجمه|صفحه=' + Morebits.pageNameNorm + '|زبان=' +
							(lang || 'نامعلوم') + '|نظر=' + reason.trim() + '}} ~~~~';

						var text, summary;
						if (params.tags.indexOf('ترجمه تقریبی') !== -1) {
							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 + ']]');
						pageobj.setChangeTags(Twinkle.changeTags);
						pageobj.setCreateOption('recreate');
						pageobj.save();
					});
				}
				// Notify the user ({{Not English}} only)
				if (params.translationNotify) {
					new Morebits.wiki.page(Morebits.pageNameNorm).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 + ')');
						userTalkPage.setNewSectionTitle('مقالهٔ شما، [[' + Morebits.pageNameNorm + ']]');
						userTalkPage.setNewSectionText('{{جا:هبک-غیرفارسی|1=' + Morebits.pageNameNorm +
							(params.translationPostAtPNT ? '' : '|nopnt=yes') + '}} ~~~~');
						userTalkPage.setEditSummary('اعلان: لطفاً برای مشارکت در ویکی‌پدیای فارسی، از زبان فارسی استفاده کنید.');
						userTalkPage.setChangeTags(Twinkle.changeTags);
						userTalkPage.setCreateOption('recreate');
						userTalkPage.setFollowRedirect(true, false);
						userTalkPage.newSection();
					});
				}
			});

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

		/**
		 * 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('اطلاع', 'درحال حذف برجسب‌های منتفی‌شده که از پیش موجود بودند');

			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
				format: 'json'
			}, function removeRedirectTag(apiobj) {
				var pages = apiobj.getResponse().query.pages.filter(function(p) {
					return !p.missing && !!p.linkshere;
				});
				pages.forEach(function(page) {
					var removed = false;
					page.linkshere.forEach(function(el) {
						var tag = el.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('اطلاع', 'ناتوان در یافتن برچسب {{' +
						page.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

				var subgroupObj = Twinkle.tag.article.flatObject[tagName] &&
					Twinkle.tag.article.flatObject[tagName].subgroup;
				if (subgroupObj) {
					var subgroups = Array.isArray(subgroupObj) ? subgroupObj : [ subgroupObj ];
					subgroups.forEach(function(gr) {
						if (gr.parameter && (params[gr.name] || gr.required)) {
							currentTag += '|' + gr.parameter + '=' + (params[gr.name] || '');
						}
					});
				}

				switch (tagName) {
					case 'اصلاح ترجمه':
					case 'ترجمه تقریبی':
						if (params.translationPostAtPNT) {
							currentTag += '|فهرست‌شده=بله';
						}
						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');
							}
							var titleWithSectionRemoved = params.discussArticle.replace(/^([^#]*)#.*$/, '$1'); // If article name is Test#Section, delete #Section
							currentTag += '|بحث=بحث:' + titleWithSectionRemoved + '#' + params.talkDiscussionTitle;
						}
						break;
					default:
						break;
				}

				currentTag += '|تاریخ={{جا:نام‌ماه‌کنونی}} {{جا:سال‌کنونی}}}}\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);

			// Insert tag after short description or any hatnotes,
			// as well as deletion/protection-related templates
			var wikipage = new Morebits.wikitext.page(pageText);
			var templatesAfter = Twinkle.hatnoteRegex +
				// Protection templates
				'pp|حص|pp-|حص-.*?|' +
				// CSD
				'db|delete|db-.*?|speedy deletion-|حس|حذف سریع.*?|' +
				// PROD
				'(?:proposed deletion|حذف زمان‌دار|prod blp|حز زنز)\\/(dated|پیغام)(?:\\s*\\|(?:concern|اهمیت|دلیل|user|timestamp|help).*)+|' +
				// not a hatnote, but sometimes under a CSD or AfD
				'salt|نمک|proposed deletion endorsed|تأیید حذف زمان‌دار';
			// AfD is special, as the tag includes html comments before and after the actual template
			// trailing whitespace/newline needed since this subst's a newline
			var afdRegex = '(?:<!--.*پیشنهاد حذف.*\\n\\{\\{(?:Article for deletion\\/dated|AfDM|نظرخواهی برای حذف\\/تاریخ‌دار).*\\}\\}\\n<!--.*(?:\\n<!--.*)?می‌توانید ویرایش کنید.*(?:\\s*\\n))?'; // Localized [Tested; Working well]
			pageText = wikipage.insertAfterTemplates(tagText, templatesAfter, null, afdRegex).getText();

			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.flatObject[tag] && !Twinkle.tag.article.flatObject[tag].excludeMI) {
					groupableTags.push(tag);
				} else {
					tags.push(tag);
				}
			} else {
				if (tag === 'ادغام از' || tag === 'ادغام تاریخچه') {
					tags.push(tag);
				} else {
					Morebits.status.warn('اطلاع', 'برچسب {{' + 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 the tag is unknown to us, we consider it non-groupable
			if (Twinkle.tag.article.flatObject[tag] && !Twinkle.tag.article.flatObject[tag].excludeMI) {
				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('اطلاع', 'در حال افزوده برچسب‌های پشتیبانی‌شده درون برچسب {{مشکلات متعدد}} که از پیش موجود بود');

			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('اطلاع', 'در حال گروه‌بندی برچسب‌های پشتیبانی‌شده درون {{مشکلات متعدد}}');

			tagText += '{{مشکلات متعدد|\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
				format: 'json'
			}, function replaceRedirectTag(apiobj) {
				var pages = apiobj.getResponse().query.pages.filter(function(p) {
					return !p.missing && !!p.linkshere;
				});
				pages.forEach(function(page) {
					var found = false;
					page.linkshere.forEach(function(el) {
						var tag = el.title.slice(9);
						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('اطلاع', 'ناتوان در یافت برچسب از پیش موجود {{' +
						page.title.slice(9) + '}} در صفحه... در حال چشم‌پوشی از جای‌گذاری مجدد');
					}
				});
				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('اطلاع', 'برچسب {{' + params.tags[i] +
					'}} از پیش در صفحهٔ تغییرمسیر موجود است... در حال مستثنی کردن');
			}
		}

		var addTag = function redirectAddTag(tagIndex, tagName) {
			tagText += '\n{{' + tagName;
			if (tagName === 'تغییرمسیر از زبانی دیگر') {
				if (params.altLangFrom) {
					tagText += '|از=' + params.altLangFrom;
				}
				if (params.altLangTo) {
					tagText += '|به=' + params.altLangTo;
				}
			} else if (tagName === 'تغییرمسیر دوتایی اجتناب‌شده' && params.doubleRedirectTarget) {
				tagText += '|1=' + params.doubleRedirectTarget;
			} else if (tagName === 'تغییرمسیر از نام مرتب‌سازی ابهام‌دار' || tagName === 'تغییرمسیر از نام مرتب‌سازی') { // Localized [Added]; missing param in enwiki twinkle
				tagText += '|1=' + mw.config.get('wgPageName').charAt(0) + '|2=' +
				(tagName === 'تغییرمسیر از نام مرتب‌سازی' ? params.sortTarget : params.ambigSortTarget);
			} else if (tagName === 'تغییرمسیر از نام دامنه') {
				tagText += '|دامنه=' + params.domainName;
			}
			tagText += '}}';

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

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

		if (!tags.length) {
			Morebits.status.warn('اطلاع', 'برچسبی برای افزودن باقی نمانده است');
		}

		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)) { // [No redirects, no need to localize]
			// Regex inspired by [[:en:User:Kephir/gadgets/sagittarius.js]] ([[:en:Special:PermaLink/831402893]])
			var oldTags = pageText.match(/(\s*{{[A-Za-zا-ی\s]+\|(?:\s*1=)?)((?:[^|{}]|{{[^}]+}})+)(}})\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(/\s*{{(R(?:edirect)?|تغییرمسیر) .*?}}/img); // Localized [Tested]
			var oldPageTags = '';
			if (pageTags) {
				pageTags.forEach(function(pageTag) {
					var pageRe = new RegExp(Morebits.string.escapeRegExp(pageTag), 'img');
					pageText = pageText.replace(pageRe, '');
					pageTag = pageTag.trim();
					oldPageTags += '\n' + pageTag;
				});
			}
			pageText = pageText.trim() + '\n\n{{پوسته رده تغییرمسیر|' + tagText + oldPageTags + '\n}}';
		}

		summaryText += (tags.length > 0 ? '' /* + (tags.length > 1 ? 's' : ' ') */ : 'پوسته رده تغییرمسیر') + ' به صفحهٔ تغییرمسیر';

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

		pageobj.setPageText(pageText);
		pageobj.setEditSummary(summaryText);
		if (Twinkle.getPref('watchTaggedVenues').indexOf('redirects') !== -1) {
			pageobj.setWatchlist(Twinkle.getPref('watchTaggedPages'));
		}
		pageobj.setMinorEdit(Twinkle.getPref('markTaggedPagesAsMinor'));
		pageobj.setCreateOption('nocreate');
		pageobj.save();

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

	},

	file: function friendlytagCallbacksFile(pageobj) {
		var text = pageobj.getPageText();
		var params = pageobj.getCallbackParameters();
		var summary = 'افزودن برچسب';
		
		// Localized [Added; Note the preceding zero-width character before "های"]
		summary += params.tags.length > 1 ? '‌های ' : ' ';

		// 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
				if (['نسخه محلی حفظ شود', 'موجود در انبار', 'به ویکی‌انبار انتقال ندهید'].indexOf(tag) !== -1) {
					text = text.replace(/\{\{(mtc|(انتقال |copy |move )?(to |به )?(commons|انبار|ویکی‌انبار)|move to wikimedia commons|copy to wikimedia commons)[^}]*\}\}/gi, '');
				}

				currentTag = tag;

				switch (tag) {
					case 'موجود در انبار':
						currentTag = 'جا:' + currentTag; // subst
						if (params.nowcommonsName !== '') {
							currentTag += '|1=' + params.nowcommonsName;
						}
						break;
					case 'نسخه محلی حفظ شود':
						if (params.keeplocalName !== '') {
							currentTag += '|1=' + params.keeplocalName;
						}
						break;
					case 'تغییرنام پرونده':
						if (params.renamemediaNewname !== '') {
							currentTag += '|1=' + params.renamemediaNewname;
						}
						if (params.renamemediaReason !== '') {
							currentTag += '|2=' + params.renamemediaReason;
						}
						break;
					case 'تمیزکاری تصویر':
						currentTag += '|1=' + params.cleanupimageReason;
						break;
					case 'تصویر کم‌کیفیت':
						currentTag += '|1=' + params.ImagePoorQualityReason;
						break;
					case 'کلک‌زنی تصویر':
						currentTag += '|تاریخ={{جا:نام‌ماه‌کنونی}} {{جا:سال‌کنونی}}';
						break;
					case 'شیمیایی کم‌کیفیت':
						currentTag += '|1=' + params.lowQualityChemReason;
						break;
					case 'نسخه برداری در دسترس است':
						text = text.replace(/\{\{((convert to |convertto|should be |باید |shouldbe|to)?svg|اس‌وی‌جی باشد|badpng|vectorize)[^}]*\}\}/gi, '');
						/* falls through */
					case 'نسخه پی‌ان‌جی در دسترس است':
						/* falls through */
					case 'منسوخ‌شده':
						currentTag += '|1=' + params[tag.replace(/ /g, '_') + 'File'];
						break;
					case 'به ویکی‌انبار انتقال ندهید':
						currentTag += '|دلیل=' + params.DoNotMoveToCommons_reason;
						if (params.DoNotMoveToCommons_expiry) {
							currentTag += '|انقضا=' + params.DoNotMoveToCommons_expiry;
						}
						break;
					case 'نسخه‌های غیر آزاد یتیم':
						currentTag = 'جا:' + currentTag; // subst
						// 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}}';
						break;
					case 'انتقال به ویکی‌انبار':
						currentTag += '|انسان=' + mw.config.get('wgUserName');
						break;
					case 'باید اس‌وی‌جی باشد':
						currentTag += '|' + params.svgCategory;
						break;
					default:
						break;  // don't care
				}

				currentTag = '{{' + 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));
		pageobj.setChangeTags(Twinkle.changeTags);
		if (Twinkle.getPref('watchTaggedVenues').indexOf('files') !== -1) {
			pageobj.setWatchlist(Twinkle.getPref('watchTaggedPages'));
		}
		pageobj.setMinorEdit(Twinkle.getPref('markTaggedPagesAsMinor'));
		pageobj.setCreateOption('nocreate');
		pageobj.save();

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

Twinkle.tag.callback.evaluate = function friendlytagCallbackEvaluate(e) {
	var form = e.target;
	var params = Morebits.quickForm.getInputData(form);


	// Validation

	// Given an array of incompatible tags, check if we have two or more selected
	var checkIncompatible = function(conflicts, extra) {
		var count = conflicts.reduce(function(sum, tag) {
			return sum += params.tags.indexOf(tag) !== -1;
		}, 0);
		if (count > 1) {
			var message = 'لطفاً تنها یکی از برچسب‌های {{' + conflicts.join('}}، {{') + '}} را انتخاب کنید.';
			message += extra ? ' ' + extra : '';
			alert(message);
			return true;
		}
	};

	// We could theoretically put them all checkIncompatible calls in a
	// forEach loop, but it's probably clearer not to have [[array one],
	// [array two]] devoid of context.
	switch (Twinkle.tag.mode) {
		case 'article':
			params.tagsToRemove = form.getUnchecked('existingTags'); // not in `input`
			params.tagsToRemain = params.existingTags || []; // container not created if none present

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

			if (checkIncompatible(['اصلاح ترجمه', 'ترجمه تقریبی'])) {
				return;
			}
			break;

		case 'file':
			if (checkIncompatible(['گیف بد', 'جی‌پگ بد', 'اس‌وی‌جی بد', 'قالب بد'])) {
				return;
			}
			if (checkIncompatible(['باید پی‌ان‌جی باشد', 'باید اس‌وی‌جی باشد', 'باید متن باشد'])) {
				return;
			}
			if (checkIncompatible(['اس‌وی‌جی بد', 'نسخه برداری در دسترس است'])) {
				return;
			}
			if (checkIncompatible(['جی‌پگ بد', 'جی‌پگ بیش‌فشرده'])) {
				return;
			}
			if (checkIncompatible(['نسخه پی‌ان‌جی در دسترس است', 'نسخه برداری در دسترس است'])) {
				return;
			}

			// Get extension from either mime-type or title, if not present (e.g., SVGs)
			var extension = ((extension = $('.mime-type').text()) && extension.split(/\//)[1]) || mw.Title.newFromText(Morebits.pageNameNorm).getExtension();
			if (extension) {
				var extensionUpper = extension.toUpperCase();
				// What self-respecting file format has *two* extensions?!
				if (extensionUpper === 'JPG') {
					extensionUpper = 'JPEG';
				}

				// Localized [Added to translate "suggestion" below]
				var localExtentionNames = {
					'JPEG': 'جی‌پگ',
					'PNG': 'پی‌ان‌جی',
					'SVG': 'اس‌وی‌جی'
				};
				// Check that selected templates make sense given the file's extension.

				// Bad GIF|JPEG|SVG
				var badIndex; // Keep track of where the offending template is so we can reference it below
				if ((extensionUpper !== 'GIF' && ((badIndex = params.tags.indexOf('گیف بد')) !== -1)) ||
					(extensionUpper !== 'JPEG' && ((badIndex = params.tags.indexOf('جی‌پگ بد')) !== -1)) ||
					(extensionUpper !== 'SVG' && ((badIndex = params.tags.indexOf('اس‌وی‌جی بد')) !== -1))) {
					var suggestion = 'به‌نظر می‌رسد که این یک پروندهٔ ' + extension + ' است، ';
					if (['GIF', 'JPEG', 'SVG'].indexOf(extensionUpper) !== -1) {
						suggestion += 'لطفاً در عوض از {{' + localExtentionNames[extensionUpper] + ' بد}} استفاده کنید.';
					} else {
						suggestion += 'بنابراین برچسب {{' + params.tags[badIndex] + '}} برای آن مناسب نیست.';
					}
					alert(suggestion);
					return;
				}
				// Should be PNG|SVG
				if ((params.tags.toString().indexOf('باید ') !== -1) && (params.tags.indexOf('باید ' + localExtentionNames[extensionUpper] + ' باشد') !== -1)) {
					alert('این پرونده از پیش در فرمت ' + extension + ' است، بنابراین برچسب {{باید ' + localExtentionNames[extensionUpper] + ' باشد}} برای آن مناسب نیست.');
					return;
				}

				// Overcompressed JPEG
				if (params.tags.indexOf('جی‌پگ بیش‌فشرده') !== -1 && extensionUpper !== 'JPEG') {
					alert('به‌نظر می‌رسد که این یک پروندهٔ ' + extension + ' است، بنابراین برچسب {{جی‌پگ بیش‌فشرده}} احتمالاً شامل حال آن نمی‌شود.');
					return;
				}
				// Bad trace and Bad font
				if (extensionUpper !== 'SVG') {
					if (params.tags.indexOf('مسیر بد') !== -1) {
						alert('به‌نظر می‌رسد که این یک پروندهٔ ' + extension + ' است، بنابراین برچسب {{مسیر بد}} احتمالاً شامل حال آن نمی‌شود.');
						return;
					} else if (params.tags.indexOf('قلم بد') !== -1) {
						alert('به‌نظر می‌رسد که این یک پروندهٔ ' + extension + ' است، بنابراین برچسب  {{قلم بد}} احتمالاً شامل حال آن نمی‌شود.');
						return;
					}
				}
			}

			if (params.tags.indexOf('به ویکی‌انبار انتقال ندهید') !== -1 && params.DoNotMoveToCommons_expiry &&
				(!/^2\d{3}$/.test(params.DoNotMoveToCommons_expiry) || parseInt(params.DoNotMoveToCommons_expiry, 10) <= new Date().getFullYear())) {
				alert('باید یک سال معتبر در آینده باشد.');
				return;
			}
			break;

		case 'redirect':
			if (checkIncompatible(['تغییرمسیر قابل چاپ', 'تغییرمسیر فاقد ارزش چاپ'])) {
				return;
			}
			if (checkIncompatible(['تغییرمسیر از زیرموضوع', 'تغییرمسیر به زیرموضوع'])) {
				return;
			}
			if (checkIncompatible([
				'تغییرمسیر به فضای نام رده',
				'تغییرمسیر به فضای نام راهنما',
				'تغییرمسیر به فضای نام اصلی',
				'تغییرمسیر به فضای نام درگاه',
				'تغییرمسیر به فضای نام پروژه',
				'تغییرمسیر به فضای نام کاربر'
			])) {
				return;
			}
			break;

		default:
			alert('پودمان برچسب توینکل: حالت ' + 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 [Added for translation below]
	var localModes = {
		'article'	: 'مقاله',
		'file'		: 'پرونده',
		'redirect'	: 'تغییرمسیر'
	};
	
	var wikipedia_page = new Morebits.wiki.page(Morebits.pageNameNorm, 'در حال برچسب زدن به ' + localModes[Twinkle.tag.mode]);
	wikipedia_page.setCallbackParameters(params);
	wikipedia_page.setChangeTags(Twinkle.changeTags); // Here to apply to triage
	wikipedia_page.load(Twinkle.tag.callbacks[Twinkle.tag.mode]);

};

Twinkle.addInitCallback(Twinkle.tag, 'tag');
})(jQuery);
// </nowiki>