مدیاویکی:Gadget-twinklewarn-2020.js: تفاوت میان نسخهها
پرش به ناوبری
پرش به جستجو
fa.wikipedia.org>Huji (loc) |
(بدون تفاوت)
|
نسخهٔ ۲۵ ژوئن ۲۰۲۰، ساعت ۲۱:۰۶
// <nowiki>
(function($) {
/*
****************************************
*** twinklewarn.js: Warn module
****************************************
* Mode of invocation: Tab ("Warn")
* Active on: Any page with relevant user name (userspace, contribs,
* etc.), as well as the rollback success page
*/
Twinkle.warn = function twinklewarn() {
if (mw.config.get('wgRelevantUserName')) {
Twinkle.addPortletLink(Twinkle.warn.callback, 'هشدار', 'tw-warn', 'هشدار/اعلان به کاربر'); // localized
if (Twinkle.getPref('autoMenuAfterRollback') &&
mw.config.get('wgNamespaceNumber') === 3 &&
mw.util.getParamValue('vanarticle') &&
!mw.util.getParamValue('friendlywelcome') &&
!mw.util.getParamValue('noautowarn')) {
Twinkle.warn.callback();
}
}
// Modify URL of talk page on rollback success pages, makes use of a
// custom message box in [[MediaWiki:Rollback-success]]
if (mw.config.get('wgAction') === 'rollback') {
var $vandalTalkLink = $('#mw-rollback-success').find('.mw-usertoollinks a').first();
if ($vandalTalkLink.length) {
$vandalTalkLink.css('font-weight', 'bold');
$vandalTalkLink.wrapInner($('<span/>').attr('title', 'در صورت صلاحدید، میتوانید از توینکل برای هشدار به کاربر دربارهٔ ویرایشهایش در این صفحه استفاده کنید.')); // localized
// Can't provide vanarticlerevid as only wgCurRevisionId is provided
var extraParam = 'vanarticle=' + mw.util.rawurlencode(Morebits.pageNameNorm);
var href = $vandalTalkLink.attr('href');
if (href.indexOf('?') === -1) {
$vandalTalkLink.attr('href', href + '?' + extraParam);
} else {
$vandalTalkLink.attr('href', href + '&' + extraParam);
}
}
}
};
// Used to close window when switching to ARV in autolevel
Twinkle.warn.dialog = null;
Twinkle.warn.callback = function twinklewarnCallback() {
if (mw.config.get('wgRelevantUserName') === mw.config.get('wgUserName') &&
!confirm('شما در حال هشدار به خودتان هستید! آیا از انجام این کار مطمئن هستید؟')) { // localized
return;
}
var dialog;
Twinkle.warn.dialog = new Morebits.simpleWindow(600, 440);
dialog = Twinkle.warn.dialog;
dialog.setTitle('هشدار/اعلان به کاربر'); // localized
dialog.setScriptName('توینکل'); // localized
dialog.addFooterLink('انتخاب سطح هشدار', 'en:WP:UWUL#Levels'); // localized
dialog.addFooterLink('راهنمای توینکل', 'en:WP:TW/DOC#warn'); // localized
var form = new Morebits.quickForm(Twinkle.warn.callback.evaluate);
var main_select = form.append({
type: 'field',
label: 'نوع هشدار/اعلان برای این مشکل را انتخاب کنید', // localized
tooltip: 'ابتدا گروه اصلی هشدار، و سپس یک هشدار اختصاصی برای این مشکل را انتحاب کنید.' // localized
});
var main_group = main_select.append({
type: 'select',
name: 'main_group',
event: Twinkle.warn.callback.change_category
});
var defaultGroup = parseInt(Twinkle.getPref('defaultWarningGroup'), 10);
main_group.append({ type: 'option', label: '۱: یادآوری کلی', value: 'level1', selected: defaultGroup === 1 }); // localized
main_group.append({ type: 'option', label: '۲: اخطار', value: 'level2', selected: defaultGroup === 2 }); // localized
main_group.append({ type: 'option', label: '۳: هشدار', value: 'level3', selected: defaultGroup === 3 }); // localized
main_group.append({ type: 'option', label: '۴: آخرین هشدار', value: 'level4', selected: defaultGroup === 4 }); // localized
main_group.append({ type: 'option', label: 'فوری: تنها هشدار', value: 'level4im', selected: defaultGroup === 5 }); // localized
if (Twinkle.getPref('combinedSingletMenus')) {
main_group.append({ type: 'option', label: 'پیامها دربارهٔ یک مشکل واحد', value: 'singlecombined', selected: defaultGroup === 6 || defaultGroup === 7 }); // localized
} else {
main_group.append({ type: 'option', label: 'اعلانها دربارهٔ یک مشکل واحد', value: 'singlenotice', selected: defaultGroup === 6 }); // localized
main_group.append({ type: 'option', label: 'هشدارها دربارهٔ یک مشکل واحد', value: 'singlewarn', selected: defaultGroup === 7 }); // localized
}
if (Twinkle.getPref('customWarningList').length) {
main_group.append({ type: 'option', label: 'هشدارهای سفارشی', value: 'custom', selected: defaultGroup === 9 }); // localized
}
main_group.append({ type: 'option', label: 'تمام الگوهای هشدار', value: 'kitchensink', selected: defaultGroup === 10 }); // localized
main_group.append({ type: 'option', label: 'انتخاب خودکار هشدار خرابکاری (سطح ۱-۴)', value: 'autolevel', selected: defaultGroup === 11 }); // localized
main_select.append({ type: 'select', name: 'sub_group', event: Twinkle.warn.callback.change_subcategory }); // Will be empty to begin with.
form.append({
type: 'input',
name: 'article',
label: 'صفحهٔ پیوند دادهشده', // localized
value: mw.util.getParamValue('vanarticle') || '',
tooltip: 'میتوان یک صفحه را از درون اعلان پیوند داد، شاید به این دلیل که این اعلان بهواسطهٔ یک خنثیسازی در صفحهٔ مذکور ارسال شدهاست. برای اینکه پیوندی داده نشود، این جعبه را خالی بگذارید.' // localized
});
form.append({
type: 'div',
label: '',
style: 'color: red',
id: 'twinkle-warn-revert-messages'
});
var vanrevid = mw.util.getParamValue('vanarticlerevid');
if (vanrevid) {
var message = '';
var query = {};
// If you tried reverting, check if *you* actually reverted
if (!mw.util.getParamValue('noautowarn') && mw.util.getParamValue('vanarticle')) { // Via fluff link
query = {
action: 'query',
titles: mw.util.getParamValue('vanarticle'),
prop: 'revisions',
rvstartid: vanrevid,
rvlimit: 2,
rvdir: 'newer',
rvprop: 'user'
};
new Morebits.wiki.api('بررسی این که واگردانی شما در این صفحه موفق بود یا نه', query, function(apiobj) { // localized
var revertUser = $(apiobj.getResponse()).find('revisions rev')[1].getAttribute('user');
if (revertUser && revertUser !== mw.config.get('wgUserName')) {
message += ' کس دیگری این صفحه را واگردانی کردهاست و ممکن است به کاربر نیز هشدار دادهباشد.'; // localized
$('#twinkle-warn-revert-messages').text('Note:' + message);
}
}).post();
}
// Confirm edit wasn't too old for a warning
query = {
action: 'query',
prop: 'revisions',
rvprop: 'timestamp',
revids: vanrevid
};
new Morebits.wiki.api('گرفتن برچسب زمان نسخهها', query, function(apiobj) { // localized
var vantimestamp = $(apiobj.getResponse()).find('revisions rev').attr('timestamp');
var revDate = new Morebits.date(vantimestamp);
if (vantimestamp && revDate.isValid()) {
if (revDate.add(24, 'hours').isBefore(new Date())) {
message += ' این ویرایش بیشتر از ۲۴ ساعت پیش انجام شدهاست و ممکن است نیازی به هشدار نباشد.'; // localized
$('#twinkle-warn-revert-messages').text('Note:' + message);
}
}
}).post();
}
var more = form.append({ type: 'field', name: 'reasonGroup', label: 'اطلاعات هشدار' }); // localized
more.append({ type: 'textarea', label: 'پیام اختیاری:', name: 'reason', tooltip: 'شاید لازم باشد یک دلیل یا یک اعلان با جزئیات بیشتر اضافه شود' }); // localized
var previewlink = document.createElement('a');
$(previewlink).click(function() {
Twinkle.warn.callbacks.preview(result); // |result| is defined below
});
previewlink.style.cursor = 'pointer';
previewlink.textContent = 'پیشنمایش'; // localized
more.append({ type: 'div', id: 'warningpreview', label: [ previewlink ] });
more.append({ type: 'div', id: 'twinklewarn-previewbox', style: 'display: none' });
more.append({ type: 'submit', label: 'ثبت' }); // localized
var result = form.render();
dialog.setContent(result);
dialog.display();
result.main_group.root = result;
result.previewer = new Morebits.wiki.preview($(result).find('div#twinklewarn-previewbox').last()[0]);
// We must init the first choice (General Note);
var evt = document.createEvent('Event');
evt.initEvent('change', true, true);
result.main_group.dispatchEvent(evt);
};
// This is all the messages that might be dispatched by the code
// Each of the individual templates require the following information:
// label (required): A short description displayed in the dialog
// summary (required): The edit summary used. If an article name is entered, the summary is postfixed with "on [[article]]", and it is always postfixed with ". $summaryAd"
// suppressArticleInSummary (optional): Set to true to suppress showing the article name in the edit summary. Useful if the warning relates to attack pages, or some such.
Twinkle.warn.messages = {
levels: {
'هشدارهای رایج': { // localized
'uw-vandalism': {
level1: {
label: 'خرابکاری', // localized
summary: 'یادآوری کلی: ویرایش غیرسازنده' // localized
},
level2: {
label: 'خرابکاری', // localized
summary: 'اخطار: ویرایش غیرسازنده' // localized
},
level3: {
label: 'خرابکاری', // localized
summary: 'هشدار: خرابکاری' // localized
},
level4: {
label: 'خرابکاری', // localized
summary: 'آخرین هشدار: خرابکاری' // localized
},
level4im: {
label: 'خرابکاری', // localized
summary: 'تنها هشدار: خرابکاری' // localized
}
},
'uw-disruptive': {
level1: {
label: 'ویرایش اخلالگرانه', // localized
summary: 'یادآوری کلی: ویرایش غیرسازنده' // localized
},
level2: {
label: 'ویرایش اخلالگرانه', // localized
summary: 'اخطار: ویرایش غیرسازنده' // localized
},
level3: {
label: 'ویرایش اخلالگرانه', // localized
summary: 'هشدار: ویرایش اخلالگرانه' // localized
}
},
'uw-test': {
level1: {
label: 'ویرایش آزمایشی', // localized
summary: 'یادآوری کلی: ویرایش آزمایشی' // localized
},
level2: {
label: 'ویرایش آزمایشی', // localized
summary: 'اخطار: ویرایش آزمایشی' // localized
},
level3: {
label: 'ویرایش آزمایشی', // localized
summary: 'هشدار: ویرایش آزمایشی' // localized
}
},
'uw-delete': {
level1: {
label: 'حذف محتوا، خالی کردن', // localized
summary: 'یادآوری کلی: حذف محتوا، خالی کردن' // localized
},
level2: {
label: 'حذف محتوا، خالی کردن', // localized
summary: 'اخطار: حذف محتوا، خالی کردن' // localized
},
level3: {
label: 'حذف محتوا، خالی کردن', // localized
summary: 'هشدار: حذف محتوا، خالی کردن' // localized
},
level4: {
label: 'حذف محتوا، خالی کردن', // localized
summary: 'آخرین هشدار: حذف محتوا، خالی کردن' // localized
},
level4im: {
label: 'حذف محتوا، خالی کردن', // localized
summary: 'تنها هشدار: حذف محتوا، خالی کردن' // localized
}
},
'uw-generic': {
level4: {
label: 'هشدار کلی (برای مجموعه الگوهایی که سطح ۴ را ندارند)', // localized
summary: 'اعلان آخرین هشدار' // localized
}
}
},
'رفتار در مقالهها': { // localized
'uw-biog': {
level1: {
label: 'افزودن اطلاعات بحثبرانگیز بدون منبع دربارهٔ افراد زنده', // localized
summary: 'یادآوری کلی: افزودن اطلاعات بحثبرانگیز بدون منبع دربارهٔ افراد زنده' // localized
},
level2: {
label: 'افزودن اطلاعات بحثبرانگیز بدون منبع دربارهٔ افراد زنده', // localized
summary: 'اخطار: افزودن اطلاعات بحثبرانگیز بدون منبع دربارهٔ افراد زنده' // localized
},
level3: {
label: 'افزودن اطلاعات بحثبرانگیز/افتراآمیز بدون منبع دربارهٔ افراد زنده', // localized
summary: 'هشدار: افزودن اطلاعات بحثبرانگیز بدون منبع دربارهٔ افراد زنده' // localized
},
level4: {
label: 'افزودن اطلاعات افتراآمیز بدون منبع دربارهٔ افراد زنده', // localized
summary: 'آخرین هشدار: افزودن اطلاعات بحثبرانگیز بدون منبع دربارهٔ افراد زنده' // localized
},
level4im: {
label: 'افزودن اطلاعات افتراآمیز بدون منبع دربارهٔ افراد زنده', // localized
summary: 'تنها هشدار: افزودن اطلاعات بحثبرانگیز بدون منبع دربارهٔ افراد زنده' // localized
}
},
'uw-defamatory': {
level1: {
label: 'افزودن محتوای افتراآمیز', // localized
summary: 'یادآوری کلی: افزودن محتوای افتراآمیز' // localized
},
level2: {
label: 'افزودن محتوای افتراآمیز', // localized
summary: 'اخطار: افزودن محتوای افتراآمیز' // localized
},
level3: {
label: 'افزودن محتوای افتراآمیز', // localized
summary: 'هشدار: افزودن محتوای افتراآمیز' // localized
},
level4: {
label: 'افزودن محتوای افتراآمیز', // localized
summary: 'آخرین هشدار: افزودن محتوای افتراآمیز' // localized
},
level4im: {
label: 'افزودن محتوای افتراآمیز', // localized
summary: 'تنها هشدار: افزودن محتوای افتراآمیز' // localized
}
},
'uw-error': {
level1: {
label: 'وارد کردن عمدی اطلاعات غلط به مقاله', // localized
summary: 'یادآوری کلی: وارد کردن عمدی اطلاعات غلط به مقاله' // localized
},
level2: {
label: 'وارد کردن عمدی اطلاعات غلط به مقاله', // localized
summary: 'اخطار: وارد کردن عمدی اطلاعات غلط به مقاله' // localized
},
level3: {
label: 'وارد کردن عمدی اطلاعات غلط به مقاله', // localized
summary: 'هشدار: وارد کردن عمدی اطلاعات غلط به مقاله' // localized
},
level4: {
label: 'وارد کردن عمدی اطلاعات غلط به مقاله', // localized
summary: 'آخرین هشدار: وارد کردن عمدی اطلاعات غلط به مقاله' // localized
}
},
'uw-genre': {
level1: {
label: 'تغییر مکرر یا عمده در ژانرها بدون اجماع یا ارجاع', // localized
summary: 'یادآوری کلی: تغییر مکرر یا عمده در ژانرها بدون اجماع یا ارجاع' // localized
},
level2: {
label: 'تغییر مکرر یا عمده در ژانرها بدون اجماع یا ارجاع', // localized
summary: 'اخطار: تغییر مکرر یا عمده در ژانرها بدون اجماع یا ارجاع' // localized
},
level3: {
label: 'تغییر مکرر یا عمده در ژانرها بدون اجماع یا ارجاع', // localized
summary: 'هشدار: تغییر مکرر یا عمده در ژانرها بدون اجماع یا ارجاع' // localized
},
level4: {
label: 'تغییر مکرر یا عمده در ژانرها بدون اجماع یا ارجاع', // localized
summary: 'آخرین هشدار: تغییر مکرر یا عمده در ژانرها بدون اجماع یا ارجاع' // localized
}
},
'uw-image': {
level1: {
label: 'خرابکاری مرتبط با تصاویر در مقالهها', // localized
summary: 'یادآوری کلی: خرابکاری مرتبط با تصاویر در مقالهها' // localized
},
level2: {
label: 'خرابکاری مرتبط با تصاویر در مقالهها', // localized
summary: 'اخطار: خرابکاری مرتبط با تصاویر در مقالهها' // localized
},
level3: {
label: 'خرابکاری مرتبط با تصاویر در مقالهها', // localized
summary: 'هشدار: خرابکاری مرتبط با تصاویر در مقالهها' // localized
},
level4: {
label: 'خرابکاری مرتبط با تصاویر در مقالهها', // localized
summary: 'آخرین هشدار: خرابکاری مرتبط با تصاویر در مقالهها' // localized
},
level4im: {
label: 'خرابکاری مرتبط با تصاویر', // localized
summary: 'تنها هشدار: خرابکاری مرتبط با تصاویر' // localized
}
},
'uw-joke': {
level1: {
label: 'استفاده از شوخی نامناسب در مقالهها', // localized
summary: 'یادآوری کلی: استفاده از شوخیهای نامناسب در مقالهها' // localized
},
level2: {
label: 'استفاده از شوخی نامناسب در مقالهها', // localized
summary: 'اخطار: استفاده از شوخی نامناسب در مقالهها' // localized
},
level3: {
label: 'استفاده از شوخی نامناسب در مقالهها', // localized
summary: 'هشدار: استفاده از شوخی نامناسب در مقالهها' // localized
},
level4: {
label: 'استفاده از شوخی نامناسب در مقالهها', // localized
summary: 'آخرین هشدار: استفاده از شوخی نامناسب در مقالهها' // localized
},
level4im: {
label: 'استفاده از شوخی نامناسب', // localized
summary: 'تنها هشدار: استفاده از شوخی نامناسب' // localized
}
},
'uw-nor': {
level1: {
label: 'افزودن تحقیق دست اول، شامل ترکیب منتشر نشده در منابع', // localized
summary: 'یادآوری کلی: افزودن تحقیق دست اول، شامل ترکیب منتشر نشده در منابع' // localized
},
level2: {
label: 'افزودن تحقیق دست اول، شامل ترکیب منتشر نشده در منابع', // localized
summary: 'اخطار: افزودن تحقیق دست اول، شامل ترکیب منتشر نشده در منابع' // localized
},
level3: {
label: 'افزودن تحقیق دست اول، شامل ترکیب منتشر نشده در منابع', // localized
summary: 'هشدار: افزودن تحقیق دست اول، شامل ترکیب منتشر نشده در منابع' // localized
},
level4: {
label: 'افزودن تحقیق دست اول، شامل ترکیب منتشر نشده در منابع', // localized
summary: 'آخرین هشدار: افزودن تحقیق دست اول، شامل ترکیب منتشر نشده در منابع' // localized
}
},
'uw-notcensored': {
level1: {
label: 'سانسور محتوا', // localized
summary: 'یادآوری کلی: سانسور محتوا' // localized
},
level2: {
label: 'سانسور محتوا', // localized
summary: 'اخطار: سانسور محتوا' // localized
},
level3: {
label: 'سانسور محتوا', // localized
summary: 'هشدار: سانسور محتوا' // localized
}
},
'uw-own': {
level1: {
label: 'مالکیت مقالهها', // localized
summary: 'یادآوری کلی: مالکیت مقالهها' // localized
},
level2: {
label: 'مالکیت مقالهها', // localized
summary: 'اخطار: مالکیت مقالهها' // localized
},
level3: {
label: 'مالکیت مقالهها', // localized
summary: 'هشدار: مالکیت مقالهها' // localized
},
level4: {
label: 'مالکیت مقالهها', // localized
summary: 'آخرین هشدار: مالکیت مقالهها' // localized
},
level4im: {
label: 'مالکیت مقالهها', // localized
summary: 'تنها هشدار: مالکیت مقالهها' // localized
}
},
'uw-tdel': {
level1: {
label: 'حذف الگوهای نگهداری', // localized
summary: 'یادآوری کلی: حذف الگوهای نگهداری' // localized
},
level2: {
label: 'حذف الگوهای نگهداری', // localized
summary: 'اخطار: حذف الگوهای نگهداری' // localized
},
level3: {
label: 'حذف الگوهای نگهداری', // localized
summary: 'هشدار: حذف الگوهای نگهداری' // localized
},
level4: {
label: 'حذف الگوهای نگهداری', // localized
summary: 'آخرین هشدار: حذف الگوهای نگهداری' // localized
}
},
'uw-unsourced': {
level1: {
label: 'افزودن مطالب بدون منبع یا با منبع ضعیف', // localized
summary: 'یادآوری کلی: افزودن مطالب بدون منبع یا با منبع ضعیف', // localized
},
level2: {
label: 'افزودن مطالب بدون منبع یا با منبع ضعیف', // localized
summary: 'اخطار: افزودن مطالب بدون منبع یا با منبع ضعیف' // localized
},
level3: {
label: 'افزودن مطالب بدون منبع یا با منبع ضعیف', // localized
summary: 'هشدار: افزودن مطالب بدون منبع یا با منبع ضعیف' // localized
},
level4: {
label: 'افزودن مطالب بدون منبع یا با منبع ضعیف', // localized
summary: 'آخرین هشدار: افزودن مطالب بدون منبع یا با منبع ضعیف' // localized
}
}
},
'Promotions and spam': {
'uw-advert': {
level1: {
label: 'استفاده از ویکیپدیا برای تبلیغات یا ترویج', // localized
summary: 'یادآوری کلی: استفاده از ویکیپدیا برای تبلیغات یا ترویج' // localized
},
level2: {
label: 'استفاده از ویکیپدیا برای تبلیغات یا ترویج', // localized
summary: 'اخطار: استفاده از ویکیپدیا برای تبلیغات یا ترویج' // localized
},
level3: {
label: 'استفاده از ویکیپدیا برای تبلیغات یا ترویج', // localized
summary: 'هشدار: استفاده از ویکیپدیا برای تبلیغات یا ترویج' // localized
},
level4: {
label: 'استفاده از ویکیپدیا برای تبلیغات یا ترویج', // localized
summary: 'آخرین هشدار: استفاده از ویکیپدیا برای تبلیغات یا ترویج' // localized
},
level4im: {
label: 'استفاده از ویکیپدیا برای تبلیغات یا ترویج', // localized
summary: 'تنها هشدار: استفاده از ویکیپدیا برای تبلیغات یا ترویج' // localized
}
},
'uw-npov': {
level1: {
label: 'عدم پایبندی به دیدگاه بیطرف', // localized
summary: 'یادآوری کلی: عدم پایبندی به دیدگاه بیطرف' // localized
},
level2: {
label: 'عدم پایبندی به دیدگاه بیطرف', // localized
summary: 'اخطار: عدم پایبندی به دیدگاه بیطرف' // localized
},
level3: {
label: 'عدم پایبندی به دیدگاه بیطرف', // localized
summary: 'هشدار: عدم پایبندی به دیدگاه بیطرف' // localized
},
level4: {
label: 'عدم پایبندی به دیدگاه بیطرف', // localized
summary: 'آخرین هشدار: عدم پایبندی به دیدگاه بیطرف' // localized
}
},
'uw-paid': {
level1: {
label: 'ویرایش در برابر دستمزد بدون فاشسازی تحت شرایط استفادهٔ ویکیمدیا', // localized
summary: 'یادآوری کلی: ویرایش در برابر دستمزد بدون فاشسازی تحت شرایط استفادهٔ ویکیمدیا' // localized
},
level2: {
label: 'ویرایش در برابر دستمزد بدون فاشسازی تحت شرایط استفادهٔ ویکیمدیا', // localized
summary: 'اخطار: ویرایش در برابر دستمزد بدون فاشسازی تحت شرایط استفادهٔ ویکیمدیا' // localized
},
level3: {
label: 'ویرایش در برابر دستمزد بدون فاشسازی تحت شرایط استفادهٔ ویکیمدیا', // localized
summary: 'هشدار: ویرایش در برابر دستمزد بدون فاشسازی تحت شرایط استفادهٔ ویکیمدیا' // localized
},
level4: {
label: 'ویرایش در برابر دستمزد بدون فاشسازی تحت شرایط استفادهٔ ویکیمدیا', // localized
summary: 'آخرین هشدار: ویرایش در برابر دستمزد بدون فاشسازی تحت شرایط استفادهٔ ویکیمدیا' // localized
}
},
'uw-spam': {
level1: {
label: 'افزودن پیوندهای بیرونی نامناسب', // localized
summary: 'یادآوری کلی: افزودن پیوندهای بیرونی نامناسب' // localized
},
level2: {
label: 'افزودن پیوندهای هرزنامه', // localized
summary: 'اخطار: افزودن پیوندهای هرزنامه' // localized
},
level3: {
label: 'افزودن پیوندهای هرزنامه', // localized
summary: 'هشدار: افزودن پیوندهای هرزنامه' // localized
},
level4: {
label: 'افزودن پیوندهای هرزنامه', // localized
summary: 'آخرین هشدار: افزودن پیوندهای هرزنامه' // localized
},
level4im: {
label: 'افزودن پیوندهای هرزنامه', // localized
summary: 'تنها هشدار: افزودن پیوندهای هرزنامه' // localized
}
}
},
'رفتار با دیگر کاربران': { // localized
'uw-agf': {
level1: {
label: 'بدون فرض حست نیت', // localized
summary: 'یادآوری کلی: بدون فرض حست نیت' // localized
},
level2: {
label: 'بدون فرض حست نیت', // localized
summary: 'اخطار: بدون فرض حست نیت' // localized
},
level3: {
label: 'بدون فرض حست نیت', // localized
summary: 'هشدار: بدون فرض حست نیت' // localized
}
},
'uw-harass': {
level1: {
label: 'آزار و اذیت کاربران دیگر', // localized
summary: 'یادآوری کلی: آزار و اذیت کاربران دیگر' // localized
},
level2: {
label: 'آزار و اذیت کاربران دیگر', // localized
summary: 'اخطار: آزار و اذیت کاربران دیگر' // localized
},
level3: {
label: 'آزار و اذیت کاربران دیگر', // localized
summary: 'هشدار: آزار و اذیت کاربران دیگر' // localized
},
level4: {
label: 'آزار و اذیت کاربران دیگر', // localized
summary: 'آخرین هشدار: آزار و اذیت کاربران دیگر' // localized
},
level4im: {
label: 'آزار و اذیت کاربران دیگر', // localized
summary: 'تنها هشدار: آزار و اذیت کاربران دیگر' // localized
}
},
'uw-npa': {
level1: {
label: 'حملهٔ شخصی مستقیم به یک کاربر خاص', // localized
summary: 'یادآوری کلی: حملهٔ شخصی مستقیم به یک کاربر خاص' // localized
},
level2: {
label: 'حملهٔ شخصی مستقیم به یک کاربر خاص', // localized
summary: 'اخطار: حملهٔ شخصی مستقیم به یک کاربر خاص' // localized
},
level3: {
label: 'حملهٔ شخصی مستقیم به یک کاربر خاص', // localized
summary: 'هشدار: حملهٔ شخصی مستقیم به یک کاربر خاص' // localized
},
level4: {
label: 'حملهٔ شخصی مستقیم به یک کاربر خاص', // localized
summary: 'آخرین هشدار: حملهٔ شخصی مستقیم به یک کاربر خاص' // localized
},
level4im: {
label: 'حملهٔ شخصی مستقیم به یک کاربر خاص', // localized
summary: 'تنها هشدار: حملهٔ شخصی مستقیم به یک کاربر خاص' // localized
}
},
'uw-tempabuse': {
level1: {
label: 'استفادهٔ نادرست از الگوی هشدار یا قطع دسترسی', // localized
summary: 'یادآوری کلی: استفادهٔ نادرست از الگوی هشدار یا قطع دسترسی' // localized
},
level2: {
label: 'استفادهٔ نادرست از الگوی هشدار یا قطع دسترسی', // localized
summary: 'اخطار: استفادهٔ نادرست از الگوی هشدار یا قطع دسترسی' // localized
}
}
},
'برداشتن برچسب حذف': { // localized
'uw-afd': {
level1: {
label: 'برداشتن الگوهای {{نبح}}', // localized
summary: 'یادآوری کلی: برداشتن الگوهای {{نبح}}' // localized
},
level2: {
label: 'برداشتن الگوهای {{نبح}}', // localized
summary: 'اخطار: برداشتن الگوهای {{نبح}}' // localized
},
level3: {
label: 'برداشتن الگوهای {{نبح}}', // localized
summary: 'هشدار: برداشتن الگوهای {{نبح}}' // localized
},
level4: {
label: 'برداشتن الگوهای {{نبح}}', // localized
summary: 'آخرین هشدار: برداشتن الگوهای {{نبح}}' // localized
}
},
/*
'uw-blpprod': {
level1: {
label: 'Removing {{blp prod}} templates',
summary: 'یادآوری کلی: Removing {{blp prod}} templates'
},
level2: {
label: 'Removing {{blp prod}} templates',
summary: 'اخطار: Removing {{blp prod}} templates'
},
level3: {
label: 'Removing {{blp prod}} templates',
summary: 'هشدار: Removing {{blp prod}} templates'
},
level4: {
label: 'Removing {{blp prod}} templates',
summary: 'آخرین هشدار: Removing {{blp prod}} templates'
}
},
*/ // localized [removed]
'uw-idt': {
level1: {
label: 'برداشتن برچسبهای حذف پرونده', // localized
summary: 'یادآوری کلی: برداشتن برچسبهای حذف پرونده' // localized
},
level2: {
label: 'برداشتن برچسبهای حذف پرونده', // localized
summary: 'اخطار: برداشتن برچسبهای حذف پرونده' // localized
},
level3: {
label: 'برداشتن برچسبهای حذف پرونده', // localized
summary: 'هشدار: برداشتن برچسبهای حذف پرونده' // localized
},
level4: {
label: 'برداشتن برچسبهای حذف پرونده', // localized
summary: 'آخرین هشدار: برداشتن برچسبهای حذف پرونده' // localized
}
},
'uw-speedy': {
level1: {
label: 'برداشتن برچسب حذف سریع', // localized
summary: 'یادآوری کلی: برداشتن برچسب حذف سریع' // localized
},
level2: {
label: 'برداشتن برچسب حذف سریع', // localized
summary: 'اخطار: برداشتن برچسب حذف سریع' // localized
},
level3: {
label: 'برداشتن برچسب حذف سریع', // localized
summary: 'هشدار: برداشتن برچسب حذف سریع' // localized
},
level4: {
label: 'برداشتن برچسب حذف سریع', // localized
summary: 'آخرین هشدار: برداشتن برچسب حذف سریع' // localized
}
}
},
'سایر': { // localized
'uw-attempt': {
level1: {
label: 'فعالکردن پالایهٔ ویرایش', // localized
summary: 'یادآوری کلی: فعالکردن پالایهٔ ویرایش' // localized
},
level2: {
label: 'فعالکردن پالایهٔ ویرایش', // localized
summary: 'اخطار: فعالکردن پالایهٔ ویرایش' // localized
},
level3: {
label: 'فعالکردن پالایهٔ ویرایش', // localized
summary: 'هشدار: فعالکردن پالایهٔ ویرایش' // localized
},
level4: {
label: 'فعالکردن پالایهٔ ویرایش', // localized
summary: 'آخرین هشدار: فعالکردن پالایهٔ ویرایش' // localized
}
},
'uw-chat': {
level1: {
label: 'استفاده از صفحهٔ بحث مانند یک انجمن', // localized
summary: 'یادآوری کلی: استفاده از صفحهٔ بحث مانند یک انجمن' // localized
},
level2: {
label: 'استفاده از صفحهٔ بحث مانند یک انجمن', // localized
summary: 'اخطار: استفاده از صفحهٔ بحث مانند یک انجمن' // localized
},
level3: {
label: 'استفاده از صفحهٔ بحث مانند یک انجمن', // localized
summary: 'هشدار: استفاده از صفحهٔ بحث مانند یک انجمن' // localized
},
level4: {
label: 'استفاده از صفحهٔ بحث مانند یک انجمن', // localized
summary: 'آخرین هشدار: استفاده از صفحهٔ بحث مانند یک انجمن' // localized
}
},
'uw-create': {
level1: {
label: 'ساخت صفحههای نامناسب', // localized
summary: 'یادآوری کلی: ساخت صفحههای نامناسب' // localized
},
level2: {
label: 'ساخت صفحههای نامناسب', // localized
summary: 'اخطار: ساخت صفحههای نامناسب' // localized
},
level3: {
label: 'ساخت صفحههای نامناسب', // localized
summary: 'هشدار: ساخت صفحههای نامناسب' // localized
},
level4: {
label: 'ساخت صفحههای نامناسب', // localized
summary: 'آخرین هشدار: ساخت صفحههای نامناسب' // localized
},
level4im: {
label: 'ساخت صفحههای نامناسب', // localized
summary: 'تنها هشدار: ساخت صفحههای نامناسب' // localized
}
},
'uw-mos': {
level1: {
label: 'شیوهنامه', // localized
summary: 'یادآوری کلی: قالببندی، تاریخ، زبان و غیره. (شیوهنامه)' // localized
},
level2: {
label: 'شیوهنامه', // localized
summary: 'اخطار: قالببندی، تاریخ، زبان و غیره. (شیوهنامه)' // localized
},
level3: {
label: 'شیوهنامه', // localized
summary: 'هشدار: قالببندی، تاریخ، زبان و غیره. (شیوهنامه)' // localized
},
level4: {
label: 'شیوهنامه', // localized
summary: 'آخرین هشدار: قالببندی، تاریخ، زبان و غیره. (شیوهنامه)' // localized
}
},
'uw-move': {
level1: {
label: 'انتقال صفحهها بر خلاف قواعد نامگذاری یا اجماع', // localized
summary: 'یادآوری کلی: انتقال صفحهها بر خلاف قواعد نامگذاری یا اجماع' // localized
},
level2: {
label: 'انتقال صفحهها بر خلاف قواعد نامگذاری یا اجماع', // localized
summary: 'اخطار: انتقال صفحهها بر خلاف قواعد نامگذاری یا اجماع' // localized
},
level3: {
label: 'انتقال صفحهها بر خلاف قواعد نامگذاری یا اجماع', // localized
summary: 'هشدار: انتقال صفحهها بر خلاف قواعد نامگذاری یا اجماع' // localized
},
level4: {
label: 'انتقال صفحهها بر خلاف قواعد نامگذاری یا اجماع', // localized
summary: 'آخرین هشدار: انتقال صفحهها بر خلاف قواعد نامگذاری یا اجماع' // localized
},
level4im: {
label: 'انتقال صفحهها بر خلاف قواعد نامگذاری یا اجماع', // localized
summary: 'تنها هشدار: انتقال صفحهها بر خلاف قواعد نامگذاری یا اجماع' // localized
}
},
'uw-tpv': {
level1: {
label: "دست بردن در پیامهای صفحههای بحث دیگران", // localized
summary: "یادآوری کلی: دست بردن در پیامهای صفحههای بحث دیگران" // localized
},
level2: {
label: "دست بردن در پیامهای صفحههای بحث دیگران", // localized
summary: "اخطار: دست بردن در پیامهای صفحههای بحث دیگران" // localized
},
level3: {
label: "دست بردن در پیامهای صفحههای بحث دیگران", // localized
summary: "هشدار: دست بردن در پیامهای صفحههای بحث دیگران" // localized
},
level4: {
label: "دست بردن در پیامهای صفحههای بحث دیگران", // localized
summary: "آخرین هشدار: دست بردن در پیامهای صفحههای بحث دیگران" // localized
},
level4im: {
label: "دست بردن در پیامهای صفحههای بحث دیگران", // localized
summary: "تنها هشدار: دست بردن در پیامهای صفحههای بحث دیگران" // localized
}
},
'uw-upload': {
level1: {
label: 'بارگزاری تصاویر غیردانشنامهای', // localized
summary: 'یادآوری کلی: بارگزاری تصاویر غیردانشنامهای' // localized
},
level2: {
label: 'بارگزاری تصاویر غیردانشنامهای', // localized
summary: 'اخطار: بارگزاری تصاویر غیردانشنامهای' // localized
},
level3: {
label: 'بارگزاری تصاویر غیردانشنامهای', // localized
summary: 'هشدار: بارگزاری تصاویر غیردانشنامهای' // localized
},
level4: {
label: 'بارگزاری تصاویر غیردانشنامهای', // localized
summary: 'آخرین هشدار: بارگزاری تصاویر غیردانشنامهای' // localized
},
level4im: {
label: 'بارگزاری تصاویر غیردانشنامهای', // localized
summary: 'تنها هشدار: بارگزاری تصاویر غیردانشنامهای' // localized
}
}
}
},
singlenotice: {
/*
'uw-aiv': {
label: 'Bad AIV report',
summary: 'Notice: Bad AIV report'
},
*/ // localized [removed]
'uw-autobiography': {
label: 'ساخت خودزندگینامه', // localized
summary: 'اعلان: ساخت خودزندگینامه' // localized
},
'uw-badcat': {
label: 'افزودن ردههای اشتباه', // localized
summary: 'اعلان: افزودن ردههای اشتباه' // localized
},
'uw-badlistentry': {
label: 'افزودن مدخلهای نامناسب به فهرستها', // localized
summary: 'اعلان: افزودن مدخلهای نامناسب به فهرستها' // localized
},
'uw-bite': {
label: 'استقبال از تازهواردها با «چماق»', // localized
summary: 'اعلان: استقبال از تازهواردها با «چماق»', // localized
suppressArticleInSummary: true // non-standard (user name, not article), and not necessary
},
'uw-coi': {
label: 'تعارض منافع', // localized
summary: 'اعلان: تعارض منافع', // localized
heading: 'مهار کردن تعارض منافع' // localized
},
'uw-controversial': {
label: 'معرفی محتوای بحثبرانگیز', // localized
summary: 'اعلان: معرفی محتوای بحثبرانگیز' // localized
},
'uw-copying': {
label: 'کپیکردن متن به یک صفحهٔ دیگر', // localized
summary: 'اعلان: کپیکردن متن به یک صفحهٔ دیگر' // localized
},
'uw-crystal': {
label: 'افزودن حدس و گمان یا اطلاعات تأییدنشده', // localized
summary: 'اعلان: افزودن حدس و گمان یا اطلاعات تأییدنشده' // localized
},
'uw-c&pmove': {
label: 'انتقال متن بهجای انتقال صفحه', // localized
summary: 'اعلان: انتقال متن بهجای انتقال صفحه' // localized
},
'uw-dab': {
label: 'ویرایش نادرست در یک صفحهٔ ابهامزدایی', // localized
summary: 'اعلان: ویرایش نادرست در یک صفحهٔ ابهامزدایی' // localized
},
'uw-date': {
label: 'تغییر نالازم در قالب تاریخ', // localized
summary: 'اعلان: تغییر نالازم در قالب تاریخ' // localized
},
'uw-deadlink': {
label: 'حذف منابع صحیح دارای پیوندهای مرده', // localized
summary: 'اعلان: حذف منابع صحیح دارای پیوندهای مرده' // localized
},
'uw-draftfirst': {
label: 'ساخت پیشنویس در صفحهٔ تمرین', // localized
summary: 'اعلان: ساخت پیشنویس در صفحهٔ تمرین خودتان' // localized
},
'uw-editsummary': {
label: 'عدم استفاده از خلاصه ویرایش', // localized
summary: 'اعلان: عدم استفاده از خلاصه ویرایش' // localized
},
'uw-elinbody': {
label: 'افزودن پیوند بیرونی به بدنهٔ یک مقاله', // localized
summary: 'اعلان: پیوندهای بیرونی را در بخش پیوند به بیرون در پایین صفحهٔ مقاله نگهدارید' // localized
},
/*
'uw-english': {
label: 'Not communicating in English',
summary: 'Notice: Not communicating in English'
},
*/ // localized [[removed]]
'uw-hasty': {
label: 'افزودن عجولانهٔ برچسبّای حذف سریع', // localized
summary: 'اعلان: پیش از قرار دادن برچسب حذف سریع، به ایجادکنندگان فرصت دهید تا مقالهٔ خود را بهبود بخشند' // localized
},
'uw-italicize': {
label: 'ایتالیک (کج) نوشتن عنوان کتابها، فیلمها، آلبومها، مجلهها، مجموعههای تلویزیونی و غیره در مقالهها', // localized
summary: 'اعلان: عنوان کتابها، فیلمها، آلبومها، مجلهها، مجموعههای تلویزیونی و غیره را در مقالهها ایتالیک (کج) بنویسید' // localized
},
/*
'uw-lang': {
label: 'Unnecessarily changing between British and American English',
summary: 'Notice: Unnecessarily changing between British and American English',
heading: 'National varieties of English'
},
*/ // localized [removed]
'uw-linking': {
label: 'افزودن بیش از اندازهٔ پیوندهای قرمز یا پیوندهای آبی تکراری', // localized
summary: 'اعلان: افزودن بیش از اندازهٔ پیوندهای قرمز یا پیوندهای آبی تکراری' // localized
},
'uw-minor': {
label: 'استفادهٔ نادرست از گزینهٔ «ویرایش جزئی»', // localized
summary: 'اعلان: استفادهٔ نادرست از گزینهٔ «ویرایش جزئی»' // localized
},
/*
'uw-notenglish': {
label: 'Creating non-English articles',
summary: 'Notice: Creating non-English articles'
},
*/ // localized
'uw-notvote': {
label: 'ما از احماع استفاده میکنیم، نه رأیگیری', // localized
summary: 'اعلان: ما از احماع استفاده میکنیم، نه رأیگیری' // localized
},
'uw-plagiarism': {
label: 'کپیکاری از منابع تحت مالکیت عمومی بدون انتساب', // localized
summary: 'اعلان: کپیکاری از منابع تحت مالکیت عمومی بدون انتساب' // localized
},
'uw-preview': {
label: 'برای پیشگیری از اشتباه، از دکمهٔ پیشنمایش استفاده کنید', // localized
summary: 'اعلان: برای پیشگیری از اشتباه، از دکمهٔ پیشنمایش استفاده کنید' // localized
},
'uw-redlink': {
label: 'حذف بیوقفهٔ پیوندهای قرمز', // localized
summary: 'اعلان: بههنگام حذف پیوندهای قرمز بیشتر دقت کنید' // localized
},
'uw-selfrevert': {
label: 'واگردانی آزمایشهای شخصی', // localized
summary: 'اعلان: واگردانی آزمایشهای شخصی' // localized
},
'uw-socialnetwork': {
label: 'ویکیپدیا شبکهٔ اجتماعی نیست', // localized
summary: 'اعلان: ویکیپدیا شبکهٔ اجتماعی نیست' // localized
},
'uw-sofixit': {
label: 'جسور باشید و موارد را خودتان اصلاح کنید', // localized
summary: 'اعلان: جسور باشید و موارد را خودتان اصلاح کنید' // localized
},
'uw-spoiler': {
label: 'افزودن هشدار لوث شدن یا حذف اسپویلرها از بخشهای مناسب', // localized
summary: "اعلان: اسپویلرها را از مقالههای ویکیپدیا حذف نکنید یا آنها را علامتگذاری نکنید" // localized
},
'uw-talkinarticle': {
label: 'بحث در مقاله', // localized
summary: 'اعلان: بحث در مقاله' // localized
},
'uw-tilde': {
label: 'امضا نکردن پیامها', // localized
summary: 'اعلان: امضا نکردن پیامها' // localized
},
'uw-toppost': {
label: 'ارسال پیام در بالای صفحههای بحث', // localized
summary: 'اعلان: ارسال پیام در بالای صفحههای بحث' // localized
},
'uw-userspace draft finish': {
label: 'پیشنویس رها شده در فضای نام کاربری', // localized
summary: 'اعلان: پیشنویس رها شده در فضای نام کاربری' // localized
},
'uw-vgscope': {
label: 'افزودن راهنمای قدم به قدم، رمزهای تقلب یا دستورالعملهای بازیهای ویدئویی', // localized
summary: 'اعلان: افزودن راهنمای قدم به قدم، رمزهای تقلب یا دستورالعملهای بازیهای ویدئویی' // localized
},
'uw-warn': {
label: 'قرار دادن الگوهای هشدار به کاربر در زمان خنثیسازی خرابکاری', // localized
summary: 'اعلان: در زمان خنثیسازی خرابکاری، میتوانید از الگوهای هشدار به کاربر استفاده کنید' // localized
},
'uw-wrongsummary': {
label: 'استفاده از خلاصه ویرایشهای نادقیق یا نامناسب', // localized
summary: 'هشدار: استفاده از خلاصه ویرایشهای نادقیق یا نامناسب' // localized
}
},
singlewarn: {
'هشدار نقض قاعده سه برگردان': { // localized
label: 'نقض محتمل قاعدهٔ سهبرگردان؛ هشدار جنگ ویرایشی را نیز ببینید', // localized
summary: 'هشدار: قاعدهٔ سهبرگردان'
},
/*
'uw-affiliate': {
label: 'فروش رابطهای', // localized
summary: 'هشدار: فروش رابطهای' // localized
},
*/ // localized [removed]
'uw-agf-sock': {
label: 'استفاده از چند حساب کاربری (با فرض حسن نیت)', // localized
summary: 'هشدار: استفاده از چند حساب کاربری' // localized
},
'uw-attack': {
label: 'ساخت صفحهٔ حمله', // localized
summary: 'هشدار: ساخت صفحهٔ حمله', // localized
suppressArticleInSummary: true
},
'uw-botun': {
label: 'نام کاربری ربات', // localized
summary: 'هشدار: نام کاربری ربات' // localized
},
'uw-canvass': {
label: 'جارزنی', // localized
summary: 'هشدار: جارزنی' // localized
},
'uw-copyright': {
label: 'نقض حق تکثیر', // localized
summary: 'هشدار: نقض حق تکثیر' // localized
},
'uw-copyright-link': {
label: 'پیونددهی به نقض حقوق کارهای دارای حق تکثیر', // localized
summary: 'هشدار: پیونددهی به نقض حقوق کارهای دارای حق تکثیر' // localized
},
'uw-copyright-new': {
label: 'نقض حق تکثیر (همراه با توضیحات برای کاربران جدید)', // localized
summary: 'اعلان: دوری جستن از مشکلات حق تکثیر', // localized
heading: 'ویکیپدیا و حق تکثیر' // localized
},
'uw-copyright-remove': {
label: 'حذف الگوهای {{نقض حق تکثیر}} از مقالهها', // localized
summary: 'هشدار: حذف الگوهای {{نقض حق تکثیر}}' // localized
},
'uw-efsummary': {
label: 'خلاصه ویرایشی که پالایهٔ ویرایش را فعال میکند', // localized
summary: 'هشدار: خلاصه ویرایشی که پالایهٔ ویرایش را فعال میکند' // localized
},
'uw-ew': {
label: 'جنگ ویرایشی (جملهبندی محکمتر)', // localized
summary: 'هشدار: جنگ ویرایشی' // localized
},
'هشدار جنگ ویرایشی-تازهوارد': { // localized
label: 'جنگ ویرایشی (جملهبندی ملایمتر برای تازهواردان)', // localized
summary: 'هشدار: جنگ ویرایشی' // localized
},
'uw-hijacking': {
label: 'دستبرد زدن به مقالهها', // localized
summary: 'هشدار: دستبرد زدن به مقالهها' // localized
},
'uw-hoax': {
label: 'کلکزنی', // localized
summary: 'هشدار: کلکزنی' // localized
},
'uw-legal': {
label: 'تهدید قانونی', // localized
summary: 'هشدار: تهدید قانونی' // localized
},
'uw-login': {
label: 'ویرایش پس از خروج از سامانه', // localized
summary: 'هشدار: ویرایش پس از خروج از سامانه' // localized
},
'uw-multipleIPs': {
label: 'استفاده از چند نشانی آیپی', // localized
summary: 'هشدار: خرابکاری با استفاده از چند نشانی آیپی' // localized
},
'uw-pinfo': {
label: 'اطلاعات خصوصی', // localized
summary: 'هشدار: اطلاعات خصوصی' // localized
},
'uw-salt': {
label: 'ساخت دوبارهٔ مقالهٔ محافظتشده در برابر ایجاد با استفاده از عنوان متفاوت', // localized
summary: 'اعلان: ساخت دوبارهٔ مقالههای محافظتشده در برابر ایجاد با استفاده از عنوان متفاوت' // localized
},
'uw-socksuspect': {
label: 'زاپاسبازی', // localized
summary: 'هشدار: شما یک [[وپ:زاپاس|حساب زاپاس]] شناساییشده هستید' // of User:... // localized
},
'uw-upv': {
label: 'خرابکاری در فضای نام کاربری', // localized
summary: 'هشدار: خرابکاری در فضای نام کاربری' // localized
},
'uw-username': {
label: 'نام کاربری مغایر با سیاست', // localized
summary: 'هشدار: نام کاربری شما با سیاست نام کاربری مغایرت دارد', // localized
suppressArticleInSummary: true // not relevant for this template
},
'uw-coi-username': {
label: 'مغایرت نام کاربری با سیاست نام کاربری و تعارض منافع', // localized
summary: 'هشدار: سیاست نام کاربری و تعارض منافع', // localized
heading: 'نام کاربری شما' // localized
},
'uw-userpage': {
label: 'صفحهٔ کاربری یا زیرصفحهٔ مغایر با سیاست', // localized
summary: 'هشدار: صفحهٔ کاربری یا زیرصفحه با سیاست مغایرت دارد' // localized
}
}
};
// Used repeatedly below across menu rebuilds
Twinkle.warn.prev_article = null;
Twinkle.warn.prev_reason = null;
Twinkle.warn.talkpageObj = null;
Twinkle.warn.callback.change_category = function twinklewarnCallbackChangeCategory(e) {
var value = e.target.value;
var sub_group = e.target.root.sub_group;
sub_group.main_group = value;
var old_subvalue = sub_group.value;
var old_subvalue_re;
if (old_subvalue) {
if (value === 'kitchensink') { // Exact match possible in kitchensink menu
old_subvalue_re = new RegExp(mw.util.escapeRegExp(old_subvalue));
} else {
old_subvalue = old_subvalue.replace(/\d*(im)?$/, '');
old_subvalue_re = new RegExp(mw.util.escapeRegExp(old_subvalue) + '(\\d*(?:im)?)$');
}
}
while (sub_group.hasChildNodes()) {
sub_group.removeChild(sub_group.firstChild);
}
var selected = false;
// worker function to create the combo box entries
var createEntries = function(contents, container, wrapInOptgroup, val) {
val = typeof val !== 'undefined' ? val : value; // IE doesn't support default parameters
// level2->2, singlewarn->''; also used to distinguish the
// scaled levels from singlenotice, singlewarn, and custom
var level = val.replace(/^\D+/g, '');
// due to an apparent iOS bug, we have to add an option-group to prevent truncation of text
// (search WT:TW archives for "Problem selecting warnings on an iPhone")
if (wrapInOptgroup && $.client.profile().platform === 'iphone') {
var wrapperOptgroup = new Morebits.quickForm.element({
type: 'optgroup',
label: 'الگوهای موجود' // localized
});
wrapperOptgroup = wrapperOptgroup.render();
container.appendChild(wrapperOptgroup);
container = wrapperOptgroup;
}
$.each(contents, function(itemKey, itemProperties) {
// Skip if the current template doesn't have a version for the current level
if (!!level && !itemProperties[val]) {
return;
}
var key = typeof itemKey === 'string' ? itemKey : itemProperties.value;
var template = key + level;
var elem = new Morebits.quickForm.element({
type: 'option',
label: '{{' + template + '}}: ' + (level ? itemProperties[val].label : itemProperties.label),
value: template
});
// Select item best corresponding to previous selection
if (!selected && old_subvalue && old_subvalue_re.test(template)) {
elem.data.selected = selected = true;
}
var elemRendered = container.appendChild(elem.render());
$(elemRendered).data('messageData', itemProperties);
});
};
switch (value) {
case 'singlenotice':
case 'singlewarn':
createEntries(Twinkle.warn.messages[value], sub_group, true);
break;
case 'singlecombined':
var unSortedSinglets = $.extend({}, Twinkle.warn.messages.singlenotice, Twinkle.warn.messages.singlewarn);
var sortedSingletMessages = {};
Object.keys(unSortedSinglets).sort().forEach(function(key) {
sortedSingletMessages[key] = unSortedSinglets[key];
});
createEntries(sortedSingletMessages, sub_group, true);
break;
case 'custom':
createEntries(Twinkle.getPref('customWarningList'), sub_group, true);
break;
case 'kitchensink':
['level1', 'level2', 'level3', 'level4', 'level4im'].forEach(function(lvl) {
$.each(Twinkle.warn.messages.levels, function(_, levelGroup) {
createEntries(levelGroup, sub_group, true, lvl);
});
});
createEntries(Twinkle.warn.messages.singlenotice, sub_group, true);
createEntries(Twinkle.warn.messages.singlewarn, sub_group, true);
createEntries(Twinkle.getPref('customWarningList'), sub_group, true);
break;
case 'level1':
case 'level2':
case 'level3':
case 'level4':
case 'level4im':
// Creates subgroup regardless of whether there is anything to place in it;
// leaves "Removal of deletion tags" empty for 4im
$.each(Twinkle.warn.messages.levels, function(groupLabel, groupContents) {
var optgroup = new Morebits.quickForm.element({
type: 'optgroup',
label: groupLabel
});
optgroup = optgroup.render();
sub_group.appendChild(optgroup);
// create the options
createEntries(groupContents, optgroup, false);
});
break;
case 'autolevel':
// Check user page to determine appropriate level
var autolevelProc = function() {
var wikitext = Twinkle.warn.talkpageObj.getPageText();
// history not needed for autolevel
var latest = Twinkle.warn.callbacks.dateProcessing(wikitext)[0];
// Pseudo-params with only what's needed to parse the level i.e. no messageData
var params = {
sub_group: old_subvalue,
article: e.target.root.article.value
};
var lvl = 'level' + Twinkle.warn.callbacks.autolevelParseWikitext(wikitext, params, latest)[1];
// Identical to level1, etc. above but explicitly provides the level
$.each(Twinkle.warn.messages.levels, function(groupLabel, groupContents) {
var optgroup = new Morebits.quickForm.element({
type: 'optgroup',
label: groupLabel
});
optgroup = optgroup.render();
sub_group.appendChild(optgroup);
// create the options
createEntries(groupContents, optgroup, false, lvl);
});
// Trigger subcategory change, add select menu, etc.
Twinkle.warn.callback.postCategoryCleanup(e);
};
if (Twinkle.warn.talkpageObj) {
autolevelProc();
} else {
var usertalk_page = new Morebits.wiki.page('بحث کاربر:' + mw.config.get('wgRelevantUserName'), 'بارگیری هشدارهای قبلی'); // localized
usertalk_page.setFollowRedirect(true);
usertalk_page.load(function(pageobj) {
Twinkle.warn.talkpageObj = pageobj; // Update talkpageObj
autolevelProc();
});
}
break;
default:
alert('Unknown warning group in twinklewarn');
break;
}
// Trigger subcategory change, add select menu, etc.
// Here because of the async load for autolevel
if (value !== 'autolevel') {
// reset any autolevel-specific messages while we're here
$('#twinkle-warn-autolevel-message').remove();
Twinkle.warn.callback.postCategoryCleanup(e);
}
};
Twinkle.warn.callback.postCategoryCleanup = function twinklewarnCallbackPostCategoryCleanup(e) {
// clear overridden label on article textbox
Morebits.quickForm.setElementTooltipVisibility(e.target.root.article, true);
Morebits.quickForm.resetElementLabel(e.target.root.article);
// Trigger custom label/change on main category change
Twinkle.warn.callback.change_subcategory(e);
// Use select2 to make the select menu searchable
if (!Twinkle.getPref('oldSelect')) {
$('select[name=sub_group]')
.select2({
width: '100%',
matcher: Morebits.select2.matchers.optgroupFull,
templateResult: Morebits.select2.highlightSearchMatches,
language: {
searching: Morebits.select2.queryInterceptor
}
})
.change(Twinkle.warn.callback.change_subcategory);
$('.select2-selection').keydown(Morebits.select2.autoStart);
mw.util.addCSS(
// prevent dropdown from appearing behind the dialog, just in case
'.select2-container { z-index: 10000; }' +
// Increase height
'.select2-container .select2-dropdown .select2-results > .select2-results__options { max-height: 350px; }' +
// Reduce padding
'.select2-results .select2-results__option { padding-top: 1px; padding-bottom: 1px; }' +
'.select2-results .select2-results__group { padding-top: 1px; padding-bottom: 1px; } ' +
// Adjust font size
'.select2-container .select2-dropdown .select2-results { font-size: 13px; }' +
'.select2-container .selection .select2-selection__rendered { font-size: 13px; }'
);
}
};
Twinkle.warn.callback.change_subcategory = function twinklewarnCallbackChangeSubcategory(e) {
var main_group = e.target.form.main_group.value;
var value = e.target.form.sub_group.value;
// Tags that don't take a linked article, but something else (often a username).
// The value of each tag is the label next to the input field
var notLinkedArticle = {
'uw-agf-sock': 'اختیاری: نام کاربری حساب دیگر (بدون پیشوند کاربر:) ', // localized
'uw-bite': "نام کاربری کاربر «چماقخورده» (بدون پیشوند کاربر:) ", // localized
'uw-socksuspect': 'نام کاربری حساب اصلی، در صورت اطلاع (بدون پیشوند کاربر:) ', // localized
'uw-username': 'نام کاربری ناقض سیاست است زیرا... ', // localized
'uw-aiv': 'اختیاری: نام کاربری گزارششده (بدون پیشوند کاربر:) ' // localized
};
if (['singlenotice', 'singlewarn', 'singlecombined', 'kitchensink'].indexOf(main_group) !== -1) {
if (notLinkedArticle[value]) {
if (Twinkle.warn.prev_article === null) {
Twinkle.warn.prev_article = e.target.form.article.value;
}
e.target.form.article.notArticle = true;
e.target.form.article.value = '';
// change form labels according to the warning selected
Morebits.quickForm.setElementTooltipVisibility(e.target.form.article, false);
Morebits.quickForm.overrideElementLabel(e.target.form.article, notLinkedArticle[value]);
} else if (e.target.form.article.notArticle) {
if (Twinkle.warn.prev_article !== null) {
e.target.form.article.value = Twinkle.warn.prev_article;
Twinkle.warn.prev_article = null;
}
e.target.form.article.notArticle = false;
Morebits.quickForm.setElementTooltipVisibility(e.target.form.article, true);
Morebits.quickForm.resetElementLabel(e.target.form.article);
}
}
// add big red notice, warning users about how to use {{uw-[coi-]username}} appropriately
$('#tw-warn-red-notice').remove();
var $redWarning;
if (value === 'uw-username') {
$redWarning = $("<div style='color: red;' id='tw-warn-red-notice'>{{نام کاربری نامناسب}} <b>نباید</b> برای موارد نقض <b>آشکار</b> سیاستها استفاده شود. " + // localized
"نقضهای آشکار باید مستقیماً در [[وپ:تامنام]] گزارش شوند (با استفاده از زبانهٔ بررسی و گزارش پیشرفتهٔ توینکل). " + // localized
'{{نام کاربری نامناسب}} باید تنها در موارد لبمرزی و جهت ورود به گفتگو با کاربر استفاده شود.</div>'); // localized
$redWarning.insertAfter(Morebits.quickForm.getElementLabelObject(e.target.form.reasonGroup));
} else if (value === 'uw-coi-username') {
$redWarning = $("<div style='color: red;' id='tw-warn-red-notice'>{{uw-coi-username}} <b>نباید</b> برای موارد نقض <b>آشکار</b>سیاست نام کاربری استفاده شود. " + // localized
"نقضهای آشکار باید مستقیماً در [[وپ:تامنام]] گزارش شوند (با استفاده از زبانهٔ بررسی و گزارش پیشرفتهٔ توینکل). " + // localized
'{{uw-coi-username}} باید تنها در موارد لبمرزی و جهت ورود به گفتگو با کاربر استفاده شود.</div>'); // localized
$redWarning.insertAfter(Morebits.quickForm.getElementLabelObject(e.target.form.reasonGroup));
}
};
Twinkle.warn.callbacks = {
getWarningWikitext: function(templateName, article, reason, isCustom) {
var text = '{{subst:' + templateName;
// add linked article for user warnings
if (article) {
// c&pmove has the source as the first parameter
if (templateName === 'uw-c&pmove') {
text += '|to=' + article;
} else {
text += '|1=' + article;
}
}
if (reason && !isCustom) {
// add extra message
if (templateName === 'uw-csd' || templateName === 'uw-probation' ||
templateName === 'uw-userspacenoindex' || templateName === 'uw-userpage') {
text += "|3=''" + reason + "''";
} else {
text += "|2=''" + reason + "''";
}
}
text += '}}';
if (reason && isCustom) {
// we assume that custom warnings lack a {{{2}}} parameter
text += " ''" + reason + "''";
}
return text + ' ~~~~';
},
showPreview: function(form, templatename) {
// Provided on autolevel, not otherwise
templatename = templatename || form.sub_group.value;
var linkedarticle = form.article.value;
var templatetext;
templatetext = Twinkle.warn.callbacks.getWarningWikitext(templatename, linkedarticle,
form.reason.value, form.main_group.value === 'custom');
form.previewer.beginRender(templatetext, 'User_talk:' + mw.config.get('wgRelevantUserName')); // Force wikitext/correct username
},
// Just a pass-through unless the autolevel option was selected
preview: function(form) {
if (form.main_group.value === 'autolevel') {
// Always get a new, updated talkpage for autolevel processing
var usertalk_page = new Morebits.wiki.page('بحث کاربر:' + mw.config.get('wgRelevantUserName'), 'بارگیری هشدارهای قبلی'); // localized
usertalk_page.setFollowRedirect(true);
usertalk_page.load(function(pageobj) {
Twinkle.warn.talkpageObj = pageobj; // Update talkpageObj
var wikitext = pageobj.getPageText();
// history not needed for autolevel
var latest = Twinkle.warn.callbacks.dateProcessing(wikitext)[0];
var params = {
sub_group: form.sub_group.value,
article: form.article.value,
messageData: $(form.sub_group).find('option[value="' + $(form.sub_group).val() + '"]').data('messageData')
};
var template = Twinkle.warn.callbacks.autolevelParseWikitext(wikitext, params, latest)[0];
Twinkle.warn.callbacks.showPreview(form, template);
// If the templates have diverged, fake a change event
// to reload the menu with the updated pageobj
if (form.sub_group.value !== template) {
var evt = document.createEvent('Event');
evt.initEvent('change', true, true);
form.main_group.dispatchEvent(evt);
}
});
} else {
Twinkle.warn.callbacks.showPreview(form);
}
},
/**
* Used in the main and autolevel loops to determine when to warn
* about excessively recent, stale, or identical warnings.
* @param {string} wikitext The text of a user's talk page, from getPageText()
* @returns {Object[]} - Array of objects: latest contains most recent
* warning and date; history lists all prior warnings
*/
dateProcessing: function(wikitext) {
var history_re = /<!--\s?Template:([uU]w-.*?)\s?-->.*?(\d{1,2}:\d{1,2}, \d{1,2} \w+ \d{4} \(UTC\))/g;
var history = {};
var latest = { date: new Morebits.date(0), type: '' };
var current;
while ((current = history_re.exec(wikitext)) !== null) {
var template = current[1], current_date = new Morebits.date(current[2]);
if (!(template in history) || history[template].isBefore(current_date)) {
history[template] = current_date;
}
if (!latest.date.isAfter(current_date)) {
latest.date = current_date;
latest.type = template;
}
}
return [latest, history];
},
/**
* Main loop for deciding what the level should increment to. Most of
* this is really just error catching and updating the subsequent data.
* May produce up to two notices in a twinkle-warn-autolevel-messages div
*
* @param {string} wikitext The text of a user's talk page, from getPageText() (required)
* @param {Object} params Params object: sub_group is the template (required);
* article is the user-provided article (form.article) used to link ARV on recent level4 warnings;
* messageData is only necessary if getting the full template, as it's
* used to ensure a valid template of that level exists
* @param {Object} latest First element of the array returned from
* dateProcessing. Provided here rather than processed within to avoid
* repeated call to dateProcessing
* @param {(Date|Morebits.date)} date Date from which staleness is determined
* @param {Morebits.status} statelem Status element, only used for handling error in final execution
*
* @returns {Array} - Array that contains the full template and just the warning level
*/
autolevelParseWikitext: function(wikitext, params, latest, date, statelem) {
var template = params.sub_group.replace(/(.*)\d$/, '$1');
var level; // undefined rather than '' means the isNaN below will return true
if (/\d(?:im)?$/.test(latest.type)) { // level1-4im
level = parseInt(latest.type.replace(/.*(\d)(?:im)?$/, '$1'), 10);
} else if (latest.type) { // Non-numbered warning
// Try to leverage existing categorization of
// warnings, all but one are universally lowercased
var loweredType = /uw-multipleIPs/i.test(template) ? 'uw-multipleIPs' : template.toLowerCase();
// It would be nice to account for blocks, but in most
// cases the hidden message is terminal, not the sig
if (Twinkle.warn.messages.singlewarn[loweredType]) {
level = 3;
} else {
level = 1; // singlenotice or not found
}
}
var $autolevelMessage = $('<div/>', {'id': 'twinkle-warn-autolevel-message'});
if (isNaN(level)) { // No prior warnings found, this is the first
level = 1;
} else if (level > 4 || level < 1) { // Shouldn't happen
var message = 'Unable to parse previous warning level, please manually select a warning level.';
if (statelem) {
statelem.error(message);
} else {
alert(message);
}
return;
} else {
date = date || new Date();
var autoTimeout = new Morebits.date(latest.date.getTime()).add(parseInt(Twinkle.getPref('autolevelStaleDays'), 10), 'days');
if (autoTimeout.isAfter(date)) {
if (level === 4) {
level = 4;
// Basically indicates whether we're in the final Main evaluation or not,
// and thus whether we can continue or need to display the warning and link
if (!statelem) {
var $link = $('<a/>', {
'href': '#',
'text': 'برای باز کردن ابزار بررسی و هشدار پیشرفته اینجا کلیک کنید.', // localized
'css': { 'fontWeight': 'bold' },
'click': function() {
Morebits.wiki.actionCompleted.redirect = null;
Twinkle.warn.dialog.close();
Twinkle.arv.callback(mw.config.get('wgRelevantUserName'));
$('input[name=page]').val(params.article); // Target page
$('input[value=final]').prop('checked', true); // Vandalism after final
}
});
var statusNode = $('<div/>', {
'text': mw.config.get('wgRelevantUserName') + ' اخیراً یک هشدار سطح ۴ دریافت کردهاست (' + latest.type + ') بنابراین احتمالاً گزارش کاربر گزینهٔ بهتری است; ', // localized
'css': {'color': 'red' }
});
statusNode.append($link[0]);
$autolevelMessage.append(statusNode);
}
} else { // Automatically increase severity
level += 1;
}
} else { // Reset warning level if most-recent warning is too old
level = 1;
}
}
// Validate warning level, falling back to the uw-generic series.
// Only a few items are missing a level, and in all but a handful
// of cases, the uw-generic series is explicitly used elsewhere per WP:UTM.
if (params.messageData && !params.messageData['level' + level]) {
template = 'uw-generic';
}
template += level;
$autolevelMessage.prepend($('<div>Will issue a <span style="font-weight: bold;">level ' + level + '</span> template.</div>'));
// After the only other message: the (text-only) staleness note
$('#twinkle-warn-autolevel-message').remove(); // clean slate
$autolevelMessage.insertAfter($('#twinkle-warn-warning-message'));
return [template, level];
},
main: function(pageobj) {
var text = pageobj.getPageText();
var statelem = pageobj.getStatusElement();
var params = pageobj.getCallbackParameters();
var messageData = params.messageData;
// JS somehow didn't get destructured assignment until ES6 so of course IE doesn't support it
var warningHistory = Twinkle.warn.callbacks.dateProcessing(text);
var latest = warningHistory[0];
var history = warningHistory[1];
var now = new Morebits.date(pageobj.getLoadTime());
Twinkle.warn.talkpageObj = pageobj; // Update talkpageObj, just in case
if (params.main_group === 'autolevel') {
// [template, level]
var templateAndLevel = Twinkle.warn.callbacks.autolevelParseWikitext(text, params, latest, now, statelem);
// Only if there's a change from the prior display/load
if (params.sub_group !== templateAndLevel[0] && !confirm('Will issue a {{' + templateAndLevel[0] + '}} template to the user, okay?')) {
statelem.error('aborted per user request');
return;
}
// Update params now that we've selected a warning
params.sub_group = templateAndLevel[0];
messageData = params.messageData['level' + templateAndLevel[1]];
} else if (params.sub_group in history) {
if (new Morebits.date(history[params.sub_group]).add(1, 'day').isAfter(now)) {
if (!confirm('یک ' + params.sub_group + ' همسان در ۲۴ ساعت گذشته صادر شدهاست. \nهمچنان مایل هستید این هشدار/اعلان را بیافزایید؟')) { // localized
statelem.error('به درخواست کاربر لغو شد'); // localized
return;
}
}
}
latest.date.add(1, 'minute'); // after long debate, one minute is max
if (latest.date.isAfter(now)) {
if (!confirm('A ' + latest.type + ' در یک دقیقهٔ گذشته صادر شدهاست. \nهمچنان مایل هستید این هشدار/اعلان را بیافزایید؟')) { // localized
statelem.error('به درخواست کاربر لغو شد'); // localized
return;
}
}
var dateHeaderRegex = now.monthHeaderRegex(), dateHeaderRegexLast, dateHeaderRegexResult;
while ((dateHeaderRegexLast = dateHeaderRegex.exec(text)) !== null) {
dateHeaderRegexResult = dateHeaderRegexLast;
}
// If dateHeaderRegexResult is null then lastHeaderIndex is never checked. If it is not null but
// \n== is not found, then the date header must be at the very start of the page. lastIndexOf
// returns -1 in this case, so lastHeaderIndex gets set to 0 as desired.
var lastHeaderIndex = text.lastIndexOf('\n==') + 1;
if (text.length > 0) {
text += '\n\n';
}
if (messageData.heading) {
text += '== ' + messageData.heading + ' ==\n';
} else if (!dateHeaderRegexResult || dateHeaderRegexResult.index !== lastHeaderIndex) {
Morebits.status.info('Info', 'یک سرتیتر سطح ۲ برای تاریخ خواهد ساخت، زیرا هیچ سرتیتری برای این ماه یافت نشد'); // localized
text += now.monthHeader() + '\n';
}
text += Twinkle.warn.callbacks.getWarningWikitext(params.sub_group, params.article,
params.reason, params.main_group === 'custom');
if (Twinkle.getPref('showSharedIPNotice') && mw.util.isIPAddress(mw.config.get('wgTitle'))) {
Morebits.status.info('Info', 'افزودن اعلان آیپی مشترک'); // localized
text += '\n{{subst:آگاهی آیپی مشترک}}'; // localized
}
// build the edit summary
var summary;
if (params.main_group === 'custom') {
switch (params.sub_group.substr(-1)) {
case '1':
summary = 'یادآوری کلی'; // localized
break;
case '2':
summary = 'اخطار'; // localized
break;
case '3':
summary = 'هشدار'; // localized
break;
case '4':
summary = 'آخرین هشدار'; // localized
break;
case 'm':
if (params.sub_group.substr(-3) === '4im') {
summary = 'تنها هشدار'; // localized
break;
}
summary = 'اعلان'; // localized
break;
default:
summary = 'اعلان'; // localized
break;
}
summary += ': ' + Morebits.string.toUpperCaseFirstChar(messageData.label);
} else {
// Normalize kitchensink to the 1-4im style
if (params.main_group === 'kitchensink' && !/^D+$/.test(params.sub_group)) {
var sub = params.sub_group.substr(-1);
if (sub === 'm') {
sub = params.sub_group.substr(-3);
}
// Don't overwrite uw-3rr, technically unnecessary
if (/\d/.test(sub)) {
params.main_group = 'level' + sub;
}
}
summary = /^\D+$/.test(params.main_group) ? messageData.summary : messageData[params.main_group].summary;
if (messageData.suppressArticleInSummary !== true && params.article) {
if (params.sub_group === 'uw-agf-sock' ||
params.sub_group === 'uw-socksuspect' ||
params.sub_group === 'uw-aiv') { // these templates require a username
summary += ' of [[:کاربر:' + params.article + ']]'; // localized
} else {
summary += ' on [[:' + params.article + ']]';
}
}
}
summary += '.' + Twinkle.getPref('summaryAd');
pageobj.setPageText(text);
pageobj.setEditSummary(summary);
pageobj.setWatchlist(Twinkle.getPref('watchWarnings'));
pageobj.save();
}
};
Twinkle.warn.callback.evaluate = function twinklewarnCallbackEvaluate(e) {
var userTalkPage = 'بحث_کاربر:' + mw.config.get('wgRelevantUserName');
// First, check to make sure a reason was filled in if uw-username was selected
if (e.target.sub_group.value === 'uw-username' && e.target.article.value.trim() === '') {
alert('لازم است که برای الگوی {{نام کاربری نامناسب}} یک دلیل ارائه کنید.'); // localized
return;
}
// Find the selected <option> element so we can fetch the data structure
var selectedEl = $(e.target.sub_group).find('option[value="' + $(e.target.sub_group).val() + '"]');
// Then, grab all the values provided by the form
var params = {
reason: e.target.reason.value,
main_group: e.target.main_group.value,
sub_group: e.target.sub_group.value,
article: e.target.article.value, // .replace( /^(Image|Category):/i, ':$1:' ), -- apparently no longer needed...
messageData: selectedEl.data('messageData')
};
Morebits.simpleWindow.setButtonsEnabled(false);
Morebits.status.init(e.target);
Morebits.wiki.actionCompleted.redirect = userTalkPage;
Morebits.wiki.actionCompleted.notice = 'هشدار دادن کامل شد، بارگیری صفحهٔ بحث تا چند ثانیهٔ دیگر'; // localized
var wikipedia_page = new Morebits.wiki.page(userTalkPage, 'User talk page modification');
wikipedia_page.setCallbackParameters(params);
wikipedia_page.setFollowRedirect(true);
wikipedia_page.load(Twinkle.warn.callbacks.main);
};
})(jQuery);
// </nowiki>