مدیاویکی: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]])