Qeyd: Dəyişiklikləri yayımladıqdan sonra etdiyiniz dəyişikliklərin görünməsi üçün brauzerinizin keşinin təmizlənməsi lazım ola bilər.
- Firefox / Safari: Reload düyməsinə basılı tutarkən Shift düyməsinə basın, və ya Ctrl+F5 və ya Ctrl+R (Mac üçün ⌘-R )
- Google Chrome: Ctrl-Shift-R (Mac üçün ⌘-Shift-R)
- Edge: Ctrl düyməsini basılı tutarkən Refresh düyməsinə basın, və ya sadəcə Ctrl+F5.
// <nowiki>
(function($) {
/*
****************************************
*** twinkleconfig.js: Preferences module
****************************************
* Mode of invocation: Adds configuration form to Wikipedia:Twinkle/Preferences,
and adds an ad box to the top of user subpages belonging to the
currently logged-in user which end in '.js'
* Active on: What I just said. Yeah.
I, [[User:This, that and the other]], originally wrote this. If the code is misbehaving, or you have any
questions, don't hesitate to ask me. (This doesn't at all imply [[WP:OWN]]ership - it's just meant to
point you in the right direction.) -- TTO
*/
Twinkle.config = {};
Twinkle.config.watchlistEnums = {
'yes': 'İzləmə siyahısına əlavə et (müddətsiz)',
'no': "İzləmə siyahısına əlavə etmə",
'default': 'Sayt nizamlamalarına uyğun',
'1 week': '1 həftəlik izləmə siyahısına əlavə et',
'1 month': '1 aylıq izləmə siyahısına əlavə et',
'3 months': '3 aylıq izləmə siyahısına əlavə et',
'6 months': '6 aylıq izləmə siyahısına əlavə et'
};
Twinkle.config.commonSets = {
csdCriteria: {
db: 'Custom rationale ({{db}})',
g1: 'Ü1', g2: 'Ü2', g3: 'Ü3', g4: 'Ü4', g5: 'Ü5', g6: 'Ü6', g7: 'Ü7', g8: 'Ü8', g10: 'Ü10', g11: 'Ü11', g12: 'Ü12', g13: 'Ü13', g14: 'Ü14',
a1: 'M1', a2: 'M2', a3: 'M3', a5: 'M5', a7: 'M7', a9: 'M9', a10: 'M10', a11: 'M11',
u1: 'İS1', u2: 'İS2', u3: 'İS3', u5: 'İS5',
f1: 'F1', f2: 'F2', f3: 'F3', f7: 'F7', f8: 'F8', f9: 'F9', f10: 'F10',
c1: 'K1',
r2: 'İ2', r3: 'İ3', r4: 'İ4',
p1: 'P1', p2: 'P2'
},
csdCriteriaDisplayOrder: [
'db',
'g1', 'g2', 'g3', 'g4', 'g5', 'g6', 'g7', 'g8', 'g10', 'g11', 'g12', 'g13', 'g14',
'a1', 'a2', 'a3', 'a5', 'a7', 'a9', 'a10', 'a11',
'u1', 'u2', 'u3', 'u5',
'f1', 'f2', 'f3', 'f7', 'f8', 'f9', 'f10',
'c1',
'r2', 'r3', 'r4',
'p1', 'p2'
],
csdCriteriaNotification: {
db: 'Custom rationale ({{db}})',
g1: 'Ü1', g2: 'Ü2', g3: 'Ü3', g4: 'Ü4', g6: 'Ü6 ("copy-paste move" only)',
g10: 'Ü10', g11: 'Ü11', g12: 'Ü12', g13: 'Ü13', g14: 'Ü14',
a1: 'M1', a2: 'M2', a3: 'M3', a5: 'M5', a7: 'M7', a9: 'M9', a10: 'M10', a11: 'M11',
u3: 'İS3', u5: 'İS5',
f1: 'F1', f2: 'F2', f3: 'F3', f7: 'F7', f9: 'F9', f10: 'F10',
c1: 'K1',
r2: 'İ2', r3: 'İ3', r4: 'İ4',
p1: 'P1', p2: 'P2'
},
csdCriteriaNotificationDisplayOrder: [
'db',
'g1', 'g2', 'g3', 'g4', 'g6', 'g10', 'g11', 'g12', 'g13', 'g14',
'a1', 'a2', 'a3', 'a5', 'a7', 'a9', 'a10', 'a11',
'u3', 'u5',
'f1', 'f2', 'f3', 'f7', 'f9', 'f10',
'c1',
'r2', 'r3', 'r4',
'p1', 'p2'
],
csdAndDICriteria: {
db: 'Custom rationale ({{db}})',
g1: 'Ü1', g2: 'Ü2', g3: 'Ü3', g4: 'Ü4', g5: 'Ü5', g6: 'Ü6', g7: 'Ü7', g8: 'Ü8', g10: 'Ü10', g11: 'Ü11', g12: 'Ü12', g13: 'Ü13', g14: 'Ü14',
a1: 'M1', a2: 'M2', a3: 'M3', a5: 'M5', a7: 'M7', a9: 'M9', a10: 'M10', a11: 'M11',
u1: 'İS1', u2: 'İS2', u3: 'İS3', u5: 'İS5',
f1: 'F1', f2: 'F2', f3: 'F3', f4: 'F4', f5: 'F5', f6: 'F6', f7: 'F7', f8: 'F8', f9: 'F9', f10: 'F10', f11: 'F11',
c1: 'K1',
r2: 'İ2', r3: 'İ3', r4: 'İ4',
p1: 'P1', p2: 'P2'
},
csdAndDICriteriaDisplayOrder: [
'db',
'g1', 'g2', 'g3', 'g4', 'g5', 'g6', 'g7', 'g8', 'g10', 'g11', 'g12', 'g13', 'g14',
'a1', 'a2', 'a3', 'a5', 'a7', 'a9', 'a10', 'a11',
'u1', 'u2', 'u3', 'u5',
'f1', 'f2', 'f3', 'f4', 'f5', 'f6', 'f7', 'f8', 'f9', 'f10', 'f11',
'c1',
'r2', 'r3', 'r4',
'p1', 'p2'
],
namespacesNoSpecial: {
0: 'Məqalə',
1: 'Müzakirə (məqalə)',
2: 'İstifadəçi',
3: 'İstifadəçi müzakirəsi',
4: 'Vikipediya',
5: 'Vikipediya müzakirəsi',
6: 'Fayl',
7: 'Fayl müzakirəsi',
8: 'MediaViki',
9: 'MediaViki müzakirəsi',
10: 'Şablon',
11: 'Şablon müzakirəsi',
//12: 'Help',
//13: 'Help talk',
14: 'Kateqoriya',
15: 'Kateqoriya müzakirəsi',
100: 'Portal',
101: 'Portal müzakirəsi',
//108: 'Book',
//109: 'Book talk',
118: 'Qaralama',
119: 'Qaralama müzakirəsi',
//710: 'TimedText',
//711: 'TimedText talk',
828: 'Modul',
829: 'Modul müzakirəsi'
}
};
/**
* Section entry format:
*
* {
* title: <human-readable section title>,
* module: <name of the associated module, used to link to sections>,
* adminOnly: <true for admin-only sections>,
* hidden: <true for advanced preferences that rarely need to be changed - they can still be modified by manually editing twinkleoptions.js>,
* preferences: [
* {
* name: <TwinkleConfig property name>,
* label: <human-readable short description - used as a form label>,
* helptip: <(optional) human-readable text (using valid HTML) that complements the description, like limits, warnings, etc.>
* adminOnly: <true for admin-only preferences>,
* type: <string|boolean|integer|enum|set|customList> (customList stores an array of JSON objects { value, label }),
* enumValues: <for type = "enum": a JSON object where the keys are the internal names and the values are human-readable strings>,
* setValues: <for type = "set": a JSON object where the keys are the internal names and the values are human-readable strings>,
* setDisplayOrder: <(optional) for type = "set": an array containing the keys of setValues (as strings) in the order that they are displayed>,
* customListValueTitle: <for type = "customList": the heading for the left "value" column in the custom list editor>,
* customListLabelTitle: <for type = "customList": the heading for the right "label" column in the custom list editor>
* },
* . . .
* ]
* },
* . . .
*
*/
Twinkle.config.sections = [
{
title: 'Ümumi',
module: 'general',
preferences: [
// TwinkleConfig.userTalkPageMode may take arguments:
// 'window': open a new window, remember the opened window
// 'tab': opens in a new tab, if possible.
// 'blank': force open in a new window, even if such a window exists
{
name: 'userTalkPageMode',
label: 'İstifadəçi müzakirə səhifəsi açılsın',
type: 'enum',
enumValues: { window: 'Yeni pəncərədə, digər istifadəçi müzakirələrini əvəzləməklə', tab: 'Yeni pəncərədə', blank: 'Tamamilə yeni pəncərədə' }
},
// TwinkleConfig.dialogLargeFont (boolean)
{
name: 'dialogLargeFont',
label: '"Twinkle" mətnlərində daha böyük şriftlərdən istifadə et',
type: 'boolean'
},
// Twinkle.config.disabledModules (array)
{
name: 'disabledModules',
label: 'Seçilmiş modulları deaktiv et',
helptip: 'Burada seçdiyiniz modullar GÖSTƏRİLMƏYƏCƏK, ona görə də ehtiyatlı davranın. Yenidən aktivləşdirmək üçün işarəni silin.',
type: 'set',
setValues: { arv: 'Şikayət', warn: 'Xəbərdarlıq', welcome: 'Salam', /*shared: 'Shared IP',*/ talkback: 'Söhbət', speedy: 'SSK', /*prod: 'PROD',*/ xfd: 'SNS', image: 'Image (DI)', protect: 'Mühafizə', tag: 'Bildiriş', diff: 'Diff', unlink: 'Keçid-sil', fluff: 'Geri qaytarma' }
},
// Twinkle.config.disabledSysopModules (array)
{
name: 'disabledSysopModules',
label: 'İnzibatçılar üçün olan modulları deaktiv et',
helptip: 'Burada seçdiyiniz modullar GÖSTƏRİLMƏYƏCƏK, ona görə də ehtiyatlı davranın. Yenidən aktivləşdirmək üçün işarəni silin.',
adminOnly: true,
type: 'set',
setValues: { block: 'Blok', /*deprod: 'DePROD',*/ batchdelete: 'Kütləvi silmə', batchprotect: 'Kütləvi bloklama', batchundelete: 'Kütləvi bərpa' }
}
]
},
{
title: 'İstifadəçilərdən şikayət',
module: 'arv',
preferences: [
{
name: 'spiWatchReport',
label: 'Kukla şikayətləri səhifələrini izləmə siyahısına əlavə et',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
}
]
},
{
title: 'İstifadəçi bloklamaları',
module: 'block',
adminOnly: true,
preferences: [
// TwinkleConfig.defaultToBlock64 (boolean)
// Whether to default to just blocking the /64 on or off
{
name: 'defaultToBlock64',
label: 'IPv6 ünvanları üçün avtomatik olaraq /64 aralığını seç',
type: 'boolean'
},
// TwinkleConfig.defaultToPartialBlocks (boolean)
// Whether to default partial blocks on or off
{
name: 'defaultToPartialBlocks',
label: 'Bloklama menyusunu açdıqda avtomatik olaraq qismən bloklamanı seç',
helptip: 'Əgər istifadəçi artıq bloklanıbsa, hazırkı bloklama növünə üstünlük veriləcəkdir.',
type: 'boolean'
},
// TwinkleConfig.blankTalkpageOnIndefBlock (boolean)
// if true, blank the talk page when issuing an indef block notice (per [[WP:UWUL#Indefinitely blocked users]])
{
name: 'blankTalkpageOnIndefBlock',
label: 'İstifadəçini müddətsiz blokladıqda müzakirə səhifəsinin bütün məzmununu sil',
type: 'boolean'
}
]
},
{
title: 'Şəkil silmə',
module: 'image',
preferences: [
// TwinkleConfig.notifyUserOnDeli (boolean)
// If the user should be notified after placing a file deletion tag
{
name: 'notifyUserOnDeli',
label: '"Şəkli yükləyənə bildiriş göndər" seçimini avtomatik aktivləşdir',
type: 'boolean'
},
// TwinkleConfig.deliWatchPage (string)
// The watchlist setting of the page tagged for deletion.
{
name: 'deliWatchPage',
label: 'Bildiriş şablonu əlavə etdikdə şəkil səhifəsini izləmə siyahısına əlavə et',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
},
// TwinkleConfig.deliWatchUser (string)
// The watchlist setting of the user talk page if a notification is placed.
{
name: 'deliWatchUser',
label: 'Şəkli yükləyənə bildiriş göndərdikdə istifadəçinin müzakirə səhifəsini izləmə siyahısına əlavə et',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
}
]
},
{
title: 'Səhifələrin mühafizəsi'/* + (Morebits.userIsSysop ? '(PP)' : '(RPP)')*/,
module: 'protect',
preferences: [
{
name: 'watchRequestedPages',
label: 'Mühafizə tələb etdikdə səhifəni izləmə siyahısına əlavə et',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
},
{
name: 'watchPPTaggedPages',
label: 'Səhifəyə mühafizə şablonu əlavə etdikdə izləmə siyahısına əlavə et',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
},
{
name: 'watchProtectedPages',
label: 'Səhifəni mühafizə etdikdə izləmə siyahısına əlavə et',
helptip: 'Əgər mühafizədən sonra şablon əlavə edilsə, həmin seçim əsas götürüləcəkdir.',
adminOnly: true,
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
}
]
},
/*
{
title: 'Proposed deletion (PROD)',
module: 'prod',
preferences: [
// TwinkleConfig.watchProdPages (string)
// Watchlist setting when applying prod template to page
{
name: 'watchProdPages',
label: 'Add article to watchlist when tagging',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
},
// TwinkleConfig.markProdPagesAsPatrolled (boolean)
// If, when applying prod template to page, to mark the page as curated/patrolled (if the page was reached from NewPages)
{
name: 'markProdPagesAsPatrolled',
label: 'Mümkün olsa, bildiriş şablonu əlavə etdikdə səhifəni patrullanmış kimi işarələ',
helptip: 'Bu seçimi boş saxlamaq tövsiyə olunur.',
type: 'boolean'
},
// TwinkleConfig.prodReasonDefault (string)
// The prefilled PROD reason.
{
name: 'prodReasonDefault',
label: 'Prefilled PROD reason',
type: 'string'
},
{
name: 'logProdPages',
label: 'Keep a log in userspace of all pages you tag for PROD',
helptip: 'Since non-admins do not have access to their deleted contributions, the userspace log offers a good way to keep track of all pages you tag for PROD using Twinkle.',
type: 'boolean'
},
{
name: 'prodLogPageName',
label: 'Keep the PROD userspace log at this user subpage',
helptip: 'Enter a subpage name in this box. You will find your PROD log at User:<i>username</i>/<i>subpage name</i>. Only works if you turn on the PROD userspace log.',
type: 'string'
}
]
},
*/
{
title: 'Geri qaytarma', // twinklefluff module
module: 'fluff',
preferences: [
// TwinkleConfig.autoMenuAfterRollback (bool)
// Option to automatically open the warning menu if the user talk page is opened post-reversion
{
name: 'autoMenuAfterRollback',
label: 'Qadcetlə redaktələri geri qaytarılan istifadəçinin müzakirə səhifəsində xəbərdarlıq menyusunu aç',
helptip: 'Yalnız aşağıdakı qutunu seçdikdə işləyir.',
type: 'boolean'
},
// TwinkleConfig.openTalkPage (array)
// What types of actions that should result in opening of talk page
{
name: 'openTalkPage',
label: 'Open user talk page after these types of reversions',
type: 'set',
setValues: { agf: 'Xoşniyyətli geri qaytarma', norm: 'Normal geri qaytarma', vand: 'Vandalizmi geri qaytarma' }
},
// TwinkleConfig.openTalkPageOnAutoRevert (bool)
// Defines if talk page should be opened when calling revert from contribs or recent changes pages. If set to true, openTalkPage defines then if talk page will be opened.
{
name: 'openTalkPageOnAutoRevert',
label: 'Redaktələri töhfələrdən və ya son dəyişikliklərdən geri qaytardıqda istifadəçi müzakirə səhifəsini aç',
helptip: 'İşləməsini istədiyiniz seçimlər əvvəlki parametrdə aktivləşdirilməlidir.',
type: 'boolean'
},
// TwinkleConfig.rollbackInPlace (bool)
//
{
name: 'rollbackInPlace',
label: 'Redaktələri töhfələrdən və ya son dəyişikliklərdən geri qaytardıqda səhifəni yenidən yükləmə',
helptip: "Geri qaytarıldıqdan sonra töhfələri və ya son dəyişikliklər səhifəsini yenidən yükləməyəcək ki, bu da sizə eyni anda birdən çox redaktəni geri qaytarmağa imkan verəcək.",
type: 'boolean'
},
// TwinkleConfig.markRevertedPagesAsMinor (array)
// What types of actions that should result in marking edit as minor
{
name: 'markRevertedPagesAsMinor',
label: 'Bu geri qaytarma növlərini kiçik redaktə kimi qeyd et',
type: 'set',
setValues: { agf: 'Xoşniyyətli geri qaytarma', norm: 'Normal geri qaytarma', vand: 'Vandalizmi geri qaytarma' }
},
// TwinkleConfig.watchRevertedPages (array)
// What types of actions that should result in forced addition to watchlist
{
name: 'watchRevertedPages',
label: 'Bu geri qaytarmalar zamanı səhifəni izləmə siyahısına əlavə et',
type: 'set',
setValues: { agf: 'Xoşniyyətli geri qaytarma', norm: 'Normal geri qaytarma', vand: 'Vandalizmi geri qaytarma' }
},
// TwinkleConfig.watchRevertedExpiry
// If any of the above items are selected, whether to expire the watch
{
name: 'watchRevertedExpiry',
label: 'Redaktəni geri qaytararkən bu müddət ərzində səhifəni izlə',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
},
// TwinkleConfig.offerReasonOnNormalRevert (boolean)
// If to offer a prompt for extra summary reason for normal reverts, default to true
{
name: 'offerReasonOnNormalRevert',
label: 'Normal geri qaytarmalarda səbəb tələb et',
helptip: '"Normal" geri qaytarma ortada yerləşən [geri qaytar] düyməsidir.',
type: 'boolean'
},
{
name: 'confirmOnFluff',
label: 'Geri qaytarmazdan əvvəl təsdiqləmə tələbi (bütün cihazlar)',
helptip: 'Stiluslu və ya sensor ekranlı cihazlardan istifadə edənlər üçün.',
type: 'boolean'
},
{
name: 'confirmOnMobileFluff',
label: 'Geri qaytarmazdan əvvəl təsdiqləmə tələbi (yalnız mobil cihazlar)',
helptip: 'Mobil cihazlarda qeyri-ixtiyari geri qaytarmaların qarşısını almaq üçün.',
type: 'boolean'
},
// TwinkleConfig.showRollbackLinks (array)
// Where Twinkle should show rollback links:
// diff, others, mine, contribs, history, recent
// Note from TTO: |contribs| seems to be equal to |others| + |mine|, i.e. redundant, so I left it out heres
{
name: 'showRollbackLinks',
label: 'Bu səhifələrdə geri qaytarma düyməsini göstər',
type: 'set',
setValues: { diff: 'Redaktələrarası fərq səhifələrində ', others: 'Başqa istifadəçilərin töhfə səhifələrində', mine: 'Töhfələr səhifəmdə', recent: 'Son dəyişikliklər və ona bənzər xüsusi səhifələrdə', history: 'Tarixçə səhifələrində' }
}
]
},
/*
{
title: 'Shared IP tagging',
module: 'shared',
preferences: [
{
name: 'markSharedIPAsMinor',
label: 'Mark shared IP tagging as a minor edit',
type: 'boolean'
}
]
},
*/
{
title: 'Sürətli silmə (SSK)',
module: 'speedy',
preferences: [
{
name: 'speedySelectionStyle',
label: 'Səhifəyə silinmə şablonu əlavə edilsin və ya silinsin',
type: 'enum',
enumValues: { buttonClick: 'Təsdiqlədikdən dərhal sonra', radioClick: 'Seçim etdikdən dərhal sonra' }
},
// TwinkleConfig.watchSpeedyPages (array)
// Whether to add speedy tagged or deleted pages to watchlist
{
name: 'watchSpeedyPages',
label: 'Bu silmə kriteriyalarından istifadə etdikdə səhifəni izləmə siyahısına əlavə et',
type: 'set',
setValues: Twinkle.config.commonSets.csdCriteria,
setDisplayOrder: Twinkle.config.commonSets.csdCriteriaDisplayOrder
},
// TwinkleConfig.watchSpeedyExpiry
// If any of the above items are selected, whether to expire the watch
{
name: 'watchSpeedyExpiry',
label: 'Silmə şablonu əlavə etdikdən sonra səhifənin izləmə siyahısında saxlanma müddəti',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
},
// TwinkleConfig.markSpeedyPagesAsPatrolled (boolean)
// If, when applying speedy template to page, to mark the page as triaged/patrolled (if the page was reached from NewPages)
{
name: 'markSpeedyPagesAsPatrolled',
label: 'Mümkün olsa, bildiriş şablonu əlavə etdikdə səhifəni patrullanmış kimi işarələ',
helptip: 'Bu seçimi boş saxlamaq tövsiyə olunur.',
type: 'boolean'
},
// TwinkleConfig.watchSpeedyUser (string)
// The watchlist setting of the user talk page if they receive a notification.
{
name: 'watchSpeedyUser',
label: 'Add user talk page of initial contributor to watchlist (when notifying)',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
},
// TwinkleConfig.welcomeUserOnSpeedyDeletionNotification (array of strings)
// On what types of speedy deletion notifications shall the user be welcomed
// with a "firstarticle" notice if their talk page has not yet been created.
{
name: 'welcomeUserOnSpeedyDeletionNotification',
label: 'Bunlardan biri ilə sürətli silməyə təqdim etdikdə səhifəni yaradan istifadəçini salamla',
helptip: 'Salamlama yalnız istifadəçiyə silinmə barədə bildiriş göndərildikdə və istifadəçinin müzakirə səhifəsi olmadıqda edilir. Bu zaman {{ilk məqalə}} şablonundan istifadə olunur.',
type: 'set',
setValues: Twinkle.config.commonSets.csdCriteriaNotification,
setDisplayOrder: Twinkle.config.commonSets.csdCriteriaNotificationDisplayOrder
},
// TwinkleConfig.notifyUserOnSpeedyDeletionNomination (array)
// What types of actions should result in the author of the page being notified of nomination
{
name: 'notifyUserOnSpeedyDeletionNomination',
label: 'Bunlardan biri ilə sürətli silməyə təqdim etdikdə səhifəni yaradan istifadəçiyə bildiriş göndər',
helptip: 'SSK pəncərəsindən istifadəçiyə xəbərdarlıq etmə seçilsə belə, bildiriş sadəcə burada seçiləcək kriteriyalara əsasən müəyyənləşdiriləcək.',
type: 'set',
setValues: Twinkle.config.commonSets.csdCriteriaNotification,
setDisplayOrder: Twinkle.config.commonSets.csdCriteriaNotificationDisplayOrder
},
// TwinkleConfig.warnUserOnSpeedyDelete (array)
// What types of actions should result in the author of the page being notified of speedy deletion (admin only)
{
name: 'warnUserOnSpeedyDelete',
label: 'Bunlardan biri ilə sildikdə səhifəni yaradan istifadəçiyə bildiriş göndər',
helptip: 'SSK pəncərəsindən istifadəçiyə xəbərdarlıq etmə seçilsə belə, bildiriş sadəcə burada seçiləcək kriteriyalara əsasən müəyyənləşdiriləcək.',
adminOnly: true,
type: 'set',
setValues: Twinkle.config.commonSets.csdCriteriaNotification,
setDisplayOrder: Twinkle.config.commonSets.csdCriteriaNotificationDisplayOrder
},
// TwinkleConfig.promptForSpeedyDeletionSummary (array of strings)
{
name: 'promptForSpeedyDeletionSummary',
label: 'Bunlardan biri ilə sildikdə silinmə izahını redaktə etməyə icazə ver',
adminOnly: true,
type: 'set',
setValues: Twinkle.config.commonSets.csdAndDICriteria,
setDisplayOrder: Twinkle.config.commonSets.csdAndDICriteriaDisplayOrder
},
// TwinkleConfig.deleteTalkPageOnDelete (boolean)
// If talk page if exists should also be deleted (CSD G8) when spedying a page (admin only)
{
name: 'deleteTalkPageOnDelete',
label: '\"Müzakirə səhifəsini də sil\" qutusunu avtomatik olaraq seç',
adminOnly: true,
type: 'boolean'
},
{
name: 'deleteRedirectsOnDelete',
label: '\"Yönləndirmələri də sil\" qutusunu avtomatik olaraq seç',
adminOnly: true,
type: 'boolean'
},
// TwinkleConfig.deleteSysopDefaultToDelete (boolean)
// Make the CSD screen default to "delete" instead of "tag" (admin only)
{
name: 'deleteSysopDefaultToDelete',
label: 'Sürətli bildiriş şablonunun əlavəsi yerinə birbaşa silinməni göstər',
helptip: 'Əgər səhifədə \"Sil\" şablonu mövcuddursa, Twinkle \"Səhifəni sil\" düyməsini göstərəcək',
adminOnly: true,
type: 'boolean'
},
// TwinkleConfig.speedyWindowWidth (integer)
// Defines the width of the Twinkle SD window in pixels
{
name: 'speedyWindowWidth',
label: 'Sürətli silmə pəncərəsinin eni (piksellə)',
type: 'integer'
},
// TwinkleConfig.speedyWindowWidth (integer)
// Defines the width of the Twinkle SD window in pixels
{
name: 'speedyWindowHeight',
label: 'Sürətli silmə pəncərəsinin hündürlüyü (piksellə)',
helptip: 'Monitorunuz böyükdürsə, bu göstəricini artıra bilərsiniz.',
type: 'integer'
},
{
name: 'logSpeedyNominations',
label: 'Sürətli silinmə şablonu əlavə etdiyiniz səhifələrin qeyd dəftərini tut',
helptip: 'İnzibatçı hüququ olmayan istifadəçilər silinmə qeydlərinə baxa bilmədikləri üçün bu qeyd dəftərinin tutulması onların sürətli silinmə təklifi verdikləri səhifələri izləməsinə imkan yaradır. Bu siyahıya fayllar da daxil edilir.',
type: 'boolean'
},
{
name: 'speedyLogPageName',
label: 'Sürətli silinməsini təklif etdiyim səhifələri bu istifadəçi alt səhifəsində qeyd et',
helptip: 'Bu qutucuğa alt səhifənin adını daxil edin. SNS qeydləriniz İstifadəçi:istifadəçi/alt başlıq səhifəsində yerləşdiriləcəkdir. Bu, yalnız SSK qeyd dəftəri funksiyasını aktivləşdirdikdə işləyir.',
type: 'string'
},
{
name: 'noLogOnSpeedyNomination',
label: 'Bunlardan biri ilə sürətli silinməyə təqdim etdikdə istifadəçi səhifəsində qeyd dəftəri yaratma',
type: 'set',
setValues: Twinkle.config.commonSets.csdAndDICriteria,
setDisplayOrder: Twinkle.config.commonSets.csdAndDICriteriaDisplayOrder
}
]
},
{
title: 'Bildiriş şablonları',
module: 'tag',
preferences: [
{
name: 'watchTaggedVenues',
label: 'Bu səhifələrə bildiriş şablonları əlavə edərkən izləmə siyahısına əlavə et',
type: 'set',
setValues: { articles: 'Məqalələr', drafts: 'Qaralamalar', redirects: 'İstiqamətləndirmələr', files: 'Fayllar' }
},
{
name: 'watchTaggedPages',
label: 'Səhifəyə bildiriş şabonu əlavə etdikdən sonra izlə',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
},/*
{
name: 'watchMergeDiscussions',
label: 'Add talk pages to watchlist when starting merge discussions',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
},*/
{
name: 'markTaggedPagesAsMinor',
label: 'Bildiriş şablonları əlavə edərkən dəyişikliyi kiçik redaktə kimi qeyd et',
type: 'boolean'
},
{
name: 'markTaggedPagesAsPatrolled',
label: '\"Səhifəni patrulla\" qutusunu avtomatik seç',
type: 'boolean'
},
{
name: 'groupByDefault',
label: '\"{{Çoxsaylı problemlər}} şablonunda qruplaşdır" seçimini avtomatik aktivləşdir',
type: 'boolean'
},
{
name: 'tagArticleSortOrder',
label: 'Məqalə bildiriş şablonlarının sıramalası',
type: 'enum',
enumValues: { cat: 'Kateqoriyalar üzrə', alpha: 'Əlifba sırası üzrə' }
},
{
name: 'customTagList',
label: 'Məqalə və qaralamalar üçün göstəriləcək xüsusi bildiriş şablonları',
helptip: "Bu, bildiriş şablonları siyahısında əlavə seçim kimi görünəcək. Yaratdığınız bildiriş şablonu qadcetə əlavə edilməyibsə, bu funksiyadan istifadə edə bilərsiniz.",
type: 'customList',
customListValueTitle: 'Şablonun sadəcə adı (simvolsuz)',
customListLabelTitle: 'İşarələmə pəncərəsində göstəriləcək mətn'
},
{
name: 'customFileTagList',
label: 'Fayllar üçün göstəriləcək xüsusi bildiriş şablonları',
helptip: 'Additional tags that you wish to add for files.',
type: 'customList',
customListValueTitle: 'Şablonun sadəcə adı (simvolsuz)',
customListLabelTitle: 'İşarələmə pəncərəsində göstəriləcək mətn'
},
{
name: 'customRedirectTagList',
label: 'Kateqoriya yönləndirmələri üçün göstəriləcək xüsusi bildiriş şablonları',
helptip: 'Additional tags that you wish to add for redirects.',
type: 'customList',
customListValueTitle: 'Şablonun sadəcə adı (simvolsuz)',
customListLabelTitle: 'İşarələmə pəncərəsində göstəriləcək mətn'
}
]
},
{
title: 'Söhbət',
module: 'talkback',
preferences: [
{
name: 'markTalkbackAsMinor',
label: 'Söhbətləri kiçik redaktə kimi qeyd et',
type: 'boolean'
},
{
name: 'insertTalkbackSignature',
label: 'Söhbətlərdə imza əlavə et',
type: 'boolean'
},
{
name: 'talkbackHeading',
label: 'Söhbət və ya müraciət etdikdə açılacaq başlığın adı',
tooltip: 'Başlıqlar üçün nəzərdə tutulmuş qoşa bərabər işarəsindən ("==") istifadə EDİLMƏMƏLİDİR',
type: 'string'
},
{
name: 'mailHeading',
label: "\"Sizə məktub var\" bildirişləri üçün istifadə ediləcək başlığın adı",
tooltip: 'Başlıqlar üçün nəzərdə tutulmuş qoşa bərabər işarəsindən ("==") istifadə EDİLMƏMƏLİDİR',
type: 'string'
}
]
},
{
title: 'Keçid silmə',
module: 'unlink',
preferences: [
// TwinkleConfig.unlinkNamespaces (array)
// In what namespaces unlink should happen, default in 0 (article), 10 (template), 100 (portal), and 118 (draft)
{
name: 'unlinkNamespaces',
label: 'Bu ad fəzasında olan səhifələrdən keçidləri sil',
helptip: 'Müzakirə səhifələrini seçərkən diqqətli olun, çünki Twinkle arxiv müzakirələrinə verilmiş keçidləri silə bilər.',
type: 'set',
setValues: Twinkle.config.commonSets.namespacesNoSpecial
}
]
},
{
title: 'İstifadəçi xəbərdarlıqları',
module: 'warn',
preferences: [
// TwinkleConfig.defaultWarningGroup (int)
// Which level warning should be the default selected group, default is 1
{
name: 'defaultWarningGroup',
label: 'Standart xəbərdarlıq səviyyəsi',
type: 'enum',
enumValues: {
1: '1-ci səviyyə',
2: '2-ci səviyyə',
3: '3-cü səviyyə',
4: '4-cü səviyyə',
5: '4-cü səviyyə (son)',
6: 'Single-issue notices',
7: 'Single-issue warnings',
// 8 was used for block templates before #260
9: 'Xüsusi xəbərdarlıqlar',
10: 'Bütün xəbərdarlıq şablonları',
11: 'Səviyyənin avtomatik seçilməsi (1-4)'
}
},
// TwinkleConfig.combinedSingletMenus (boolean)
// if true, show one menu with both single-issue notices and warnings instead of two separately
{
name: 'combinedSingletMenus',
label: 'Replace the two separate single-issue menus into one combined menu',
helptip: 'Selecting either single-issue notices or single-issue warnings as your default will make this your default if enabled.',
type: 'boolean'
},
// TwinkleConfig.showSharedIPNotice may take arguments:
// true: to show shared ip notice if an IP address
// false: to not print the notice
/*{
name: 'showSharedIPNotice',
label: 'Add extra notice on shared IP talk pages',
helptip: 'Notice used is {{Shared IP advice}}',
type: 'boolean'
},*/
// TwinkleConfig.watchWarnings (string)
// Watchlist setting for the page which has been dispatched an warning or notice
{
name: 'watchWarnings',
label: 'İstifadəçiyə xəbərdarlıq göndərildikdə müzakirə səhifəsini izləmə siyahısına əlavə et',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
},
// TwinkleConfig.oldSelect (boolean)
// if true, use the native select menu rather the select2-based one
{
name: 'oldSelect',
label: 'Axtarış funksiyası olmayan klassik menyudan istifadə et',
type: 'boolean'
},
{
name: 'customWarningList',
label: 'Göstəriləcək xüsusi xəbərdarlıq şablonları',
helptip: 'Bura şablonları və ya istifadəçi alt səhifənizdə yerləşən şablonları əlavə edə bilərsiniz. Xüsusi xəbərdarlıqlar xəbərdarlıq qutusundakı eyniadlı kateqoriyada yerləşir.',
type: 'customList',
customListValueTitle: 'Şablonun adı (viki-işarəsiz)',
customListLabelTitle: 'Xəbərdarlıq siyahısında göstəriləcək mətn (redaktə izahında da göstəriləcək)'
}
]
},
{
title: 'İstifadəçiləri salamlama',
module: 'welcome',
preferences: [
{
name: 'topWelcomes',
label: '\"XG\" şablonunu istifadəçi müzakirə səhifəsinin ən yuxarısına yerləşdir',
type: 'boolean'
},
{
name: 'watchWelcomes',
label: 'İstifadəçiləri salamlayarkən müzakirə səhifəsini izləmə siyahısına əlavə et',
helptip: 'Bu seçimi aktivləşdirməklə yeni istifadəçilərin necə fəaliyyət göstərdiyini, üzləşdiyi çətinlikli görə və onlara daha asan köməklik göstərə bilərsiniz.',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
},
{
name: 'insertUsername',
label: 'Şablona istifadəçi adını əlavə et (mümkün olsa)',
helptip: "Bəzi salamlama şablonlarında istifadəçi adının qeyd edilməsi üçün xüsusi bölmə olur. Həmin şablonları istifadə edən zaman bu seçim aktiv olmasa, istifadəçi adınız görünməyə bilər.",
type: 'boolean'
},
{
name: 'quickWelcomeMode',
label: 'Dəyişiklik səhifəsində "salamlama"ya kliklədikdə',
helptip: 'Avtomatik salamlamanı aktivləşdirmisinizsə, aşağıdakı bölmədə qeyd edəcəyiniz şablon istifadə ediləcəkdir.',
type: 'enum',
enumValues: { auto: 'avtomatik salamla', norm: 'salamlama şablonu seç' }
},
{
name: 'quickWelcomeTemplate',
label: 'Avtomatik salamladıqda bu şablondan istifadə et',
helptip: 'Şablonun sadəcə adını yazın. Əlavə viki-işarələrə ehtiyac yoxdur.',
type: 'string'
},
{
name: 'customWelcomeList',
label: 'Göstəriləcək xüsusi salamlama şablonu',
helptip: "Bura başqa salamlama şablonlarını və ya alt səhifənizdə olan şablonları (\"İstifadəçi:\" prefiksli) əlavə edə bilərsiniz. Unutmayın ki, bu şablonlar istifadəçi səhifələrinə yerləşdirildikdə tərkibindəki kodlar açılacaqdır.",
type: 'customList',
customListValueTitle: 'Şablonun adı (viki-işarəsiz)',
customListLabelTitle: 'Salamlama dialoqunda göstəriləcək mətn'
},
{
name: 'customWelcomeSignature',
label: 'Xüsusi salamlama şablonlarına avtomatik olaraq imza əlavə et',
helptip: 'İstifadə edəcəyiniz xüsusi salamlama şablonunun tərkibində imza əlavə etmək funksiyası mövcuddursa, bu seçimi deaktiv edin.',
type: 'boolean'
}
]
},
{
title: 'Silinməyə namizəd səhifələr',
module: 'xfd',
preferences: [
{
name: 'logXfdNominations',
label: 'Silinməyə namizəd göstərdiyiniz səhifələrin qeyd dəftərini tut',
helptip: 'Bu, istifadəçi silinməyə namizəd göstərdiyiniz səhifələri izləməniz üçün istifadəçi səhifənizdə qeyd dəftəri yaradır.',
type: 'boolean'
},
{
name: 'xfdLogPageName',
label: 'Silinmə müzakirələrini bu istifadəçi alt səhifəsində qeyd et',
helptip: 'Bu qutucuğa alt səhifənin adını daxil edin. SNS qeydləriniz İstifadəçi:<i>istifadəçi</i>/<i>alt başlıq</i> səhifəsində yerləşdiriləcəkdir. Bu, yalnız SNS qeyd dəftəri funksiyasını aktivləşdirdikdə işləyir.',
type: 'string'
},/*
{
name: 'noLogOnXfdNomination',
label: 'Do not create a userspace log entry when nominating at this venue',
type: 'set',
setValues: { sns: 'SNS' }
},*/
// TwinkleConfig.xfdWatchPage (string)
// The watchlist setting of the page being nominated for XfD.
{
name: 'xfdWatchPage',
label: 'Silinməyə namizəd göstərilmiş səhifəni izləmə siyahısına əlavə et',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
},
// TwinkleConfig.xfdWatchDiscussion (string)
// The watchlist setting of the newly created XfD page (for those processes that create discussion pages for each nomination),
// or the list page for the other processes.
{
name: 'xfdWatchDiscussion',
label: 'Silinməyə namizəd göstərilmiş səhifəni izləmə siyahısına əlavə et',
helptip: 'Bu seçim namizədlik səhifəsi ("Vikipediya:Silinməyə namizəd səhifələr/Namizəd səhifə" kimi) yaradıldıqdan sonra səhifəni izləmə siyahınıza əlavə edir',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
},
// TwinkleConfig.xfdWatchList (string)
// The watchlist setting of the XfD list page, *if* the discussion is on a separate page.
/*{
name: 'xfdWatchList',
label: 'Add the daily log/list page to the watchlist (AfD and MfD)',
helptip: 'This only applies for AfD and MfD, where the discussions are transcluded onto a daily log page (for AfD) or the main MfD page (for MfD).',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
},*/
// TwinkleConfig.xfdWatchUser (string)
// The watchlist setting of the user talk page if they receive a notification.
{
name: 'xfdWatchUser',
label: 'Səhifəni yaradan istifadəçiyə bildiriş göndərdikdə müzakirə səhifəsini izləmə siyahısına əlavə et',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
},
// TwinkleConfig.xfdWatchRelated (string)
// The watchlist setting of the target of a redirect being nominated for RfD.
/*{
name: 'xfdWatchRelated',
label: "Add the redirect's target page to watchlist (when notifying)",
helptip: 'This only applies for RfD, when leaving a notification on the talk page of the target of the redirect',
type: 'enum',
enumValues: Twinkle.config.watchlistEnums
},*/
{
name: 'markXfdPagesAsPatrolled',
label: 'Mümkün olsa, səhifəni silinməyə namizəd göstərərkən patrulla',
type: 'boolean'
}
]
},
{
title: 'Hidden',
hidden: true,
preferences: [
// twinkle.js: portlet setup
{
name: 'portletArea',
type: 'string'
},
{
name: 'portletId',
type: 'string'
},
{
name: 'portletName',
type: 'string'
},
{
name: 'portletType',
type: 'string'
},
{
name: 'portletNext',
type: 'string'
},
// twinklefluff.js: defines how many revision to query maximum, maximum possible is 50, default is 50
{
name: 'revertMaxRevisions',
type: 'integer'
},
// twinklewarn.js: When using the autolevel select option, how many days makes a prior warning stale
// Huggle is three days ([[Special:Diff/918980316]] and [[Special:Diff/919417999]]) while ClueBotNG is two:
// https://github.com/DamianZaremba/cluebotng/blob/4958e25d6874cba01c75f11debd2e511fd5a2ce5/bot/action_functions.php#L62
{
name: 'autolevelStaleDays',
type: 'integer'
},
// How many pages should be queried by deprod and batchdelete/protect/undelete
{
name: 'batchMax',
type: 'integer',
adminOnly: true
},
// How many pages should be processed at a time by deprod and batchdelete/protect/undelete
{
name: 'batchChunks',
type: 'integer',
adminOnly: true
}
]
}
]; // end of Twinkle.config.sections
Twinkle.config.init = function twinkleconfigInit() {
// create the config page at Wikipedia:Twinkle/Preferences
if ((mw.config.get('wgNamespaceNumber') === mw.config.get('wgNamespaceIds').project && mw.config.get('wgTitle') === 'Twinkle/Nizamlamalar') &&
mw.config.get('wgAction') === 'view') {
if (!document.getElementById('twinkle-config')) {
return; // maybe the page is misconfigured, or something - but any attempt to modify it will be pointless
}
// set style (the url() CSS function doesn't seem to work from wikicode - ?!)
document.getElementById('twinkle-config-titlebar').style.backgroundImage = 'url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAkCAMAAAB%2FqqA%2BAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAEhQTFRFr73ZobTPusjdsMHZp7nVwtDhzNbnwM3fu8jdq7vUt8nbxtDkw9DhpbfSvMrfssPZqLvVztbno7bRrr7W1d%2Fs1N7qydXk0NjpkW7Q%2BgAAADVJREFUeNoMwgESQCAAAMGLkEIi%2FP%2BnbnbpdB59app5Vdg0sXAoMZCpGoFbK6ciuy6FX4ABAEyoAef0BXOXAAAAAElFTkSuQmCC)';
var contentdiv = document.getElementById('twinkle-config-content');
contentdiv.textContent = ''; // clear children
// let user know about possible conflict with skin js/common.js file
// (settings in that file will still work, but they will be overwritten by twinkleoptions.js settings)
if (window.TwinkleConfig || window.FriendlyConfig) {
var contentnotice = document.createElement('p');
contentnotice.innerHTML = '<table class="plainlinks ombox ombox-content"><tr><td class="mbox-image">' +
'<img alt="" src="https://upload.wikimedia.org/wikipedia/commons/3/38/Imbox_content.png" /></td>' +
'<td class="mbox-text"><p><big><b>Before modifying your settings here,</b> you must remove your old Twinkle and Friendly settings from your personal skin JavaScript.</big></p>' +
'<p>To do this, you can <a href="' + mw.util.getUrl('User:' + mw.config.get('wgUserName') + '/' + mw.config.get('skin') +
'.js', { action: 'edit' }) + '" target="_blank"><b>edit your personal skin javascript file</b></a> or <a href="' +
mw.util.getUrl('User:' + mw.config.get('wgUserName') + '/common.js', { action: 'edit'}) + '" target="_blank"><b>your common.js file</b></a>, removing all lines of code that refer to <code>TwinkleConfig</code> and <code>FriendlyConfig</code>.</p>' +
'</td></tr></table>';
contentdiv.appendChild(contentnotice);
}
// start a table of contents
var toctable = document.createElement('div');
toctable.className = 'toc';
toctable.style.marginLeft = '0.4em';
// create TOC title
var toctitle = document.createElement('div');
toctitle.id = 'toctitle';
var toch2 = document.createElement('h2');
toch2.textContent = 'Mündəricat ';
toctitle.appendChild(toch2);
// add TOC show/hide link
var toctoggle = document.createElement('span');
toctoggle.className = 'toctoggle';
toctoggle.appendChild(document.createTextNode('['));
var toctogglelink = document.createElement('a');
toctogglelink.className = 'internal';
toctogglelink.setAttribute('href', '#tw-tocshowhide');
toctogglelink.textContent = 'gizlə';
toctoggle.appendChild(toctogglelink);
toctoggle.appendChild(document.createTextNode(']'));
toctitle.appendChild(toctoggle);
toctable.appendChild(toctitle);
// create item container: this is what we add stuff to
var tocul = document.createElement('ul');
toctogglelink.addEventListener('click', function twinkleconfigTocToggle() {
var $tocul = $(tocul);
$tocul.toggle();
if ($tocul.find(':visible').length) {
toctogglelink.textContent = 'gizlə';
} else {
toctogglelink.textContent = 'göstər';
}
}, false);
toctable.appendChild(tocul);
contentdiv.appendChild(toctable);
var contentform = document.createElement('form');
contentform.setAttribute('action', 'javascript:void(0)'); // was #tw-save - changed to void(0) to work around Chrome issue
contentform.addEventListener('submit', Twinkle.config.save, true);
contentdiv.appendChild(contentform);
var container = document.createElement('table');
container.style.width = '100%';
contentform.appendChild(container);
$(Twinkle.config.sections).each(function(sectionkey, section) {
if (section.hidden || (section.adminOnly && !Morebits.userIsSysop)) {
return true; // i.e. "continue" in this context
}
// add to TOC
var tocli = document.createElement('li');
tocli.className = 'toclevel-1';
var toca = document.createElement('a');
toca.setAttribute('href', '#' + section.module);
toca.appendChild(document.createTextNode(section.title));
tocli.appendChild(toca);
tocul.appendChild(tocli);
var row = document.createElement('tr');
var cell = document.createElement('td');
cell.setAttribute('colspan', '3');
var heading = document.createElement('h4');
heading.style.borderBottom = '1px solid gray';
heading.style.marginTop = '0.2em';
heading.id = section.module;
heading.appendChild(document.createTextNode(section.title));
cell.appendChild(heading);
row.appendChild(cell);
container.appendChild(row);
var rowcount = 1; // for row banding
// add each of the preferences to the form
$(section.preferences).each(function(prefkey, pref) {
if (pref.adminOnly && !Morebits.userIsSysop) {
return true; // i.e. "continue" in this context
}
row = document.createElement('tr');
row.style.marginBottom = '0.2em';
// create odd row banding
if (rowcount++ % 2 === 0) {
row.style.backgroundColor = 'rgba(128, 128, 128, 0.1)';
}
cell = document.createElement('td');
var label, input, gotPref = Twinkle.getPref(pref.name);
switch (pref.type) {
case 'boolean': // create a checkbox
cell.setAttribute('colspan', '2');
label = document.createElement('label');
input = document.createElement('input');
input.setAttribute('type', 'checkbox');
input.setAttribute('id', pref.name);
input.setAttribute('name', pref.name);
if (gotPref === true) {
input.setAttribute('checked', 'checked');
}
label.appendChild(input);
label.appendChild(document.createTextNode(pref.label));
cell.appendChild(label);
break;
case 'string': // create an input box
case 'integer':
// add label to first column
cell.style.textAlign = 'right';
cell.style.paddingRight = '0.5em';
label = document.createElement('label');
label.setAttribute('for', pref.name);
label.appendChild(document.createTextNode(pref.label + ':'));
cell.appendChild(label);
row.appendChild(cell);
// add input box to second column
cell = document.createElement('td');
cell.style.paddingRight = '1em';
input = document.createElement('input');
input.setAttribute('type', 'text');
input.setAttribute('id', pref.name);
input.setAttribute('name', pref.name);
if (pref.type === 'integer') {
input.setAttribute('size', 6);
input.setAttribute('type', 'number');
input.setAttribute('step', '1'); // integers only
}
if (gotPref) {
input.setAttribute('value', gotPref);
}
cell.appendChild(input);
break;
case 'enum': // create a combo box
// add label to first column
// note: duplicates the code above, under string/integer
cell.style.textAlign = 'right';
cell.style.paddingRight = '0.5em';
label = document.createElement('label');
label.setAttribute('for', pref.name);
label.appendChild(document.createTextNode(pref.label + ':'));
cell.appendChild(label);
row.appendChild(cell);
// add input box to second column
cell = document.createElement('td');
cell.style.paddingRight = '1em';
input = document.createElement('select');
input.setAttribute('id', pref.name);
input.setAttribute('name', pref.name);
$.each(pref.enumValues, function(enumvalue, enumdisplay) {
var option = document.createElement('option');
option.setAttribute('value', enumvalue);
if ((gotPref === enumvalue) ||
// Hack to convert old boolean watchlist prefs
// to corresponding enums (added in v2.1)
(typeof gotPref === 'boolean' &&
((gotPref && enumvalue === 'yes') ||
(!gotPref && enumvalue === 'no')))) {
option.setAttribute('selected', 'selected');
}
option.appendChild(document.createTextNode(enumdisplay));
input.appendChild(option);
});
cell.appendChild(input);
break;
case 'set': // create a set of check boxes
// add label first of all
cell.setAttribute('colspan', '2');
label = document.createElement('label'); // not really necessary to use a label element here, but we do it for consistency of styling
label.appendChild(document.createTextNode(pref.label + ':'));
cell.appendChild(label);
var checkdiv = document.createElement('div');
checkdiv.style.paddingLeft = '1em';
var worker = function(itemkey, itemvalue) {
var checklabel = document.createElement('label');
checklabel.style.marginRight = '0.7em';
checklabel.style.display = 'inline-block';
var check = document.createElement('input');
check.setAttribute('type', 'checkbox');
check.setAttribute('id', pref.name + '_' + itemkey);
check.setAttribute('name', pref.name + '_' + itemkey);
if (gotPref && gotPref.indexOf(itemkey) !== -1) {
check.setAttribute('checked', 'checked');
}
// cater for legacy integer array values for unlinkNamespaces (this can be removed a few years down the track...)
if (pref.name === 'unlinkNamespaces') {
if (gotPref && gotPref.indexOf(parseInt(itemkey, 10)) !== -1) {
check.setAttribute('checked', 'checked');
}
}
checklabel.appendChild(check);
checklabel.appendChild(document.createTextNode(itemvalue));
checkdiv.appendChild(checklabel);
};
if (pref.setDisplayOrder) {
// add check boxes according to the given display order
$.each(pref.setDisplayOrder, function(itemkey, item) {
worker(item, pref.setValues[item]);
});
} else {
// add check boxes according to the order it gets fed to us (probably strict alphabetical)
$.each(pref.setValues, worker);
}
cell.appendChild(checkdiv);
break;
case 'customList':
// add label to first column
cell.style.textAlign = 'right';
cell.style.paddingRight = '0.5em';
label = document.createElement('label');
label.setAttribute('for', pref.name);
label.appendChild(document.createTextNode(pref.label + ':'));
cell.appendChild(label);
row.appendChild(cell);
// add button to second column
cell = document.createElement('td');
cell.style.paddingRight = '1em';
var button = document.createElement('button');
button.setAttribute('id', pref.name);
button.setAttribute('name', pref.name);
button.setAttribute('type', 'button');
button.addEventListener('click', Twinkle.config.listDialog.display, false);
// use jQuery data on the button to store the current config value
$(button).data({
value: gotPref,
pref: pref
});
button.appendChild(document.createTextNode('Dəyiş'));
cell.appendChild(button);
break;
default:
alert('twinkleconfig: unknown data type for preference ' + pref.name);
break;
}
row.appendChild(cell);
// add help tip
cell = document.createElement('td');
cell.style.fontSize = '90%';
cell.style.color = 'gray';
if (pref.helptip) {
// convert mentions of templates in the helptip to clickable links
cell.innerHTML = pref.helptip.replace(/{{(.+?)}}/g,
'{{<a href="' + mw.util.getUrl('Template:') + '$1" target="_blank">$1</a>}}');
}
// add reset link (custom lists don't need this, as their config value isn't displayed on the form)
if (pref.type !== 'customList') {
var resetlink = document.createElement('a');
resetlink.setAttribute('href', '#tw-reset');
resetlink.setAttribute('id', 'twinkle-config-reset-' + pref.name);
resetlink.addEventListener('click', Twinkle.config.resetPrefLink, false);
resetlink.style.cssFloat = 'right';
resetlink.style.margin = '0 0.6em';
resetlink.appendChild(document.createTextNode('Sıfırla'));
cell.appendChild(resetlink);
}
row.appendChild(cell);
container.appendChild(row);
return true;
});
return true;
});
var footerbox = document.createElement('div');
footerbox.setAttribute('id', 'twinkle-config-buttonpane');
footerbox.style.backgroundColor = '#BCCADF';
footerbox.style.padding = '0.5em';
var button = document.createElement('button');
button.setAttribute('id', 'twinkle-config-submit');
button.setAttribute('type', 'submit');
button.appendChild(document.createTextNode('Yadda saxla'));
footerbox.appendChild(button);
var footerspan = document.createElement('span');
footerspan.className = 'plainlinks';
footerspan.style.marginLeft = '2.4em';
footerspan.style.fontSize = '90%';
var footera = document.createElement('a');
footera.setAttribute('href', '#tw-reset-all');
footera.setAttribute('id', 'twinkle-config-resetall');
footera.addEventListener('click', Twinkle.config.resetAllPrefs, false);
footera.appendChild(document.createTextNode('Hamısını sıfırla'));
footerspan.appendChild(footera);
footerbox.appendChild(footerspan);
contentform.appendChild(footerbox);
// since all the section headers exist now, we can try going to the requested anchor
if (window.location.hash) {
var loc = window.location.hash;
window.location.hash = '';
window.location.hash = loc;
}
} else if (mw.config.get('wgNamespaceNumber') === mw.config.get('wgNamespaceIds').user &&
mw.config.get('wgTitle').indexOf(mw.config.get('wgUserName')) === 0 &&
mw.config.get('wgPageName').slice(-3) === '.js') {
var box = document.createElement('div');
// Styled in twinkle.css
box.setAttribute('id', 'twinkle-config-headerbox');
var link,
scriptPageName = mw.config.get('wgPageName').slice(mw.config.get('wgPageName').lastIndexOf('/') + 1,
mw.config.get('wgPageName').lastIndexOf('.js'));
if (scriptPageName === 'twinkleoptions') {
// place "why not try the preference panel" notice
box.setAttribute('class', 'config-twopt-box');
if (mw.config.get('wgArticleId') > 0) { // page exists
box.appendChild(document.createTextNode('This page contains your Twinkle preferences. You can change them using the '));
} else { // page does not exist
box.appendChild(document.createTextNode('You can customize Twinkle to suit your preferences by using the '));
}
link = document.createElement('a');
link.setAttribute('href', mw.util.getUrl(mw.config.get('wgFormattedNamespaces')[mw.config.get('wgNamespaceIds').project] + ':Twinkle/Nizamlamalar'));
link.appendChild(document.createTextNode('Twinkle preferences panel'));
box.appendChild(link);
box.appendChild(document.createTextNode(', or by editing this page.'));
$(box).insertAfter($('#contentSub'));
} else if (['monobook', 'vector', 'vector-2022', 'cologneblue', 'modern', 'timeless', 'minerva', 'common'].indexOf(scriptPageName) !== -1) {
// place "Looking for Twinkle options?" notice
box.setAttribute('class', 'config-userskin-box');
box.appendChild(document.createTextNode('Twinkle seçimlərini qurmaq istəyirsinizsə,'));
link = document.createElement('a');
link.setAttribute('href', mw.util.getUrl(mw.config.get('wgFormattedNamespaces')[mw.config.get('wgNamespaceIds').project] + ':Twinkle/Nizamlamalar'));
link.appendChild(document.createTextNode('Twinkle preferences panel'));
box.appendChild(link);
box.appendChild(document.createTextNode('istifadə edə bilərsiniz'));
box.appendChild(document.createTextNode('.'));
$(box).insertAfter($('#contentSub'));
}
}
};
// custom list-related stuff
Twinkle.config.listDialog = {};
Twinkle.config.listDialog.addRow = function twinkleconfigListDialogAddRow($dlgtable, value, label) {
var $contenttr, $valueInput, $labelInput;
$dlgtable.append(
$contenttr = $('<tr>').append(
$('<td>').append(
$('<button>')
.attr('type', 'button')
.on('click', function () {
$contenttr.remove();
})
.text('Sil')
),
$('<td>').append(
$valueInput = $('<input>')
.attr('type', 'text')
.addClass('twinkle-config-customlist-value')
.css('width', '97%')
),
$('<td>').append(
$labelInput = $('<input>')
.attr('type', 'text')
.addClass('twinkle-config-customlist-label')
.css('width', '98%')
)
)
);
if (value) {
$valueInput.val(value);
}
if (label) {
$labelInput.val(label);
}
};
Twinkle.config.listDialog.display = function twinkleconfigListDialogDisplay(e) {
var $prefbutton = $(e.target);
var curvalue = $prefbutton.data('value');
var curpref = $prefbutton.data('pref');
var dialog = new Morebits.simpleWindow(720, 400);
dialog.setTitle(curpref.label);
dialog.setScriptName('Twinkle preferences');
var $dlgtbody;
dialog.setContent(
$('<div>').append(
$('<table>')
.addClass('wikitable')
.css({
margin: '1.4em 1em',
width: 'auto'
})
.append(
$dlgtbody = $('<tbody>').append(
// header row
$('<tr>').append(
$('<th>') // top-left cell
.css('width', '5%'),
$('<th>') // value column header
.css('width', '35%')
.text(curpref.customListValueTitle ? curpref.customListValueTitle : 'Value'),
$('<th>') // label column header
.css('width', '60%')
.text(curpref.customListLabelTitle ? curpref.customListLabelTitle : 'Label')
)
),
$('<tfoot>').append(
$('<tr>').append(
$('<td>')
.attr('colspan', '3')
.append(
$('<button>')
.text('Əlavə et')
.css('min-width', '8em')
.attr('type', 'button')
.on('click', function () {
Twinkle.config.listDialog.addRow($dlgtbody);
})
)
)
)
),
$('<button>')
.text('Yadda saxla')
.attr('type', 'submit') // so Morebits.simpleWindow puts the button in the button pane
.on('click', function () {
Twinkle.config.listDialog.save($prefbutton, $dlgtbody);
dialog.close();
}),
$('<button>')
.text('Sıfırla')
.attr('type', 'submit')
.on('click', function () {
Twinkle.config.listDialog.reset($prefbutton, $dlgtbody);
}),
$('<button>')
.text('İmtina')
.attr('type', 'submit')
.on('click', function () {
dialog.close();
})
)[0]
);
// content rows
var gotRow = false;
$.each(curvalue, function(k, v) {
gotRow = true;
Twinkle.config.listDialog.addRow($dlgtbody, v.value, v.label);
});
// if there are no values present, add a blank row to start the user off
if (!gotRow) {
Twinkle.config.listDialog.addRow($dlgtbody);
}
dialog.display();
};
// Resets the data value, re-populates based on the new (default) value, then saves the
// old data value again (less surprising behaviour)
Twinkle.config.listDialog.reset = function twinkleconfigListDialogReset($button, $tbody) {
// reset value on button
var curpref = $button.data('pref');
var oldvalue = $button.data('value');
Twinkle.config.resetPref(curpref);
// reset form
$tbody.find('tr').slice(1).remove(); // all rows except the first (header) row
// add the new values
var curvalue = $button.data('value');
$.each(curvalue, function(k, v) {
Twinkle.config.listDialog.addRow($tbody, v.value, v.label);
});
// save the old value
$button.data('value', oldvalue);
};
Twinkle.config.listDialog.save = function twinkleconfigListDialogSave($button, $tbody) {
var result = [];
var current = {};
$tbody.find('input[type="text"]').each(function(inputkey, input) {
if ($(input).hasClass('twinkle-config-customlist-value')) {
current = { value: input.value };
} else {
current.label = input.value;
// exclude totally empty rows
if (current.value || current.label) {
result.push(current);
}
}
});
$button.data('value', result);
};
// reset/restore defaults
Twinkle.config.resetPrefLink = function twinkleconfigResetPrefLink(e) {
var wantedpref = e.target.id.substring(21); // "twinkle-config-reset-" prefix is stripped
// search tactics
$(Twinkle.config.sections).each(function(sectionkey, section) {
if (section.hidden || (section.adminOnly && !Morebits.userIsSysop)) {
return true; // continue: skip impossibilities
}
var foundit = false;
$(section.preferences).each(function(prefkey, pref) {
if (pref.name !== wantedpref) {
return true; // continue
}
Twinkle.config.resetPref(pref);
foundit = true;
return false; // break
});
if (foundit) {
return false; // break
}
});
return false; // stop link from scrolling page
};
Twinkle.config.resetPref = function twinkleconfigResetPref(pref) {
switch (pref.type) {
case 'boolean':
document.getElementById(pref.name).checked = Twinkle.defaultConfig[pref.name];
break;
case 'string':
case 'integer':
case 'enum':
document.getElementById(pref.name).value = Twinkle.defaultConfig[pref.name];
break;
case 'set':
$.each(pref.setValues, function(itemkey) {
if (document.getElementById(pref.name + '_' + itemkey)) {
document.getElementById(pref.name + '_' + itemkey).checked = Twinkle.defaultConfig[pref.name].indexOf(itemkey) !== -1;
}
});
break;
case 'customList':
$(document.getElementById(pref.name)).data('value', Twinkle.defaultConfig[pref.name]);
break;
default:
alert('twinkleconfig: unknown data type for preference ' + pref.name);
break;
}
};
Twinkle.config.resetAllPrefs = function twinkleconfigResetAllPrefs() {
// no confirmation message - the user can just refresh/close the page to abort
$(Twinkle.config.sections).each(function(sectionkey, section) {
if (section.hidden || (section.adminOnly && !Morebits.userIsSysop)) {
return true; // continue: skip impossibilities
}
$(section.preferences).each(function(prefkey, pref) {
if (!pref.adminOnly || Morebits.userIsSysop) {
Twinkle.config.resetPref(pref);
}
});
return true;
});
return false; // stop link from scrolling page
};
Twinkle.config.save = function twinkleconfigSave(e) {
Morebits.status.init(document.getElementById('twinkle-config-content'));
var userjs = mw.config.get('wgFormattedNamespaces')[mw.config.get('wgNamespaceIds').user] + ':' + mw.config.get('wgUserName') + '/twinkleoptions.js';
var wikipedia_page = new Morebits.wiki.page(userjs, 'Nizamlamalar ' + userjs + ' səhifəsinə yerləşdirilir');
wikipedia_page.setCallbackParameters(e.target);
wikipedia_page.load(Twinkle.config.writePrefs);
return false;
};
Twinkle.config.writePrefs = function twinkleconfigWritePrefs(pageobj) {
var form = pageobj.getCallbackParameters();
// this is the object which gets serialized into JSON; only
// preferences that this script knows about are kept
var newConfig = {optionsVersion: 2.1};
// a comparison function is needed later on
// it is just enough for our purposes (i.e. comparing strings, numbers, booleans,
// arrays of strings, and arrays of { value, label })
// and it is not very robust: e.g. compare([2], ["2"]) === true, and
// compare({}, {}) === false, but it's good enough for our purposes here
var compare = function(a, b) {
if (Array.isArray(a)) {
if (a.length !== b.length) {
return false;
}
var asort = a.sort(), bsort = b.sort();
for (var i = 0; asort[i]; ++i) {
// comparison of the two properties of custom lists
if ((typeof asort[i] === 'object') && (asort[i].label !== bsort[i].label ||
asort[i].value !== bsort[i].value)) {
return false;
} else if (asort[i].toString() !== bsort[i].toString()) {
return false;
}
}
return true;
}
return a === b;
};
$(Twinkle.config.sections).each(function(sectionkey, section) {
if (section.adminOnly && !Morebits.userIsSysop) {
return; // i.e. "continue" in this context
}
// reach each of the preferences from the form
$(section.preferences).each(function(prefkey, pref) {
var userValue; // = undefined
// only read form values for those prefs that have them
if (!pref.adminOnly || Morebits.userIsSysop) {
if (!section.hidden) {
switch (pref.type) {
case 'boolean': // read from the checkbox
userValue = form[pref.name].checked;
break;
case 'string': // read from the input box or combo box
case 'enum':
userValue = form[pref.name].value;
break;
case 'integer': // read from the input box
userValue = parseInt(form[pref.name].value, 10);
if (isNaN(userValue)) {
Morebits.status.warn('Saving', 'The value you specified for ' + pref.name + ' (' + pref.value + ') was invalid. The save will continue, but the invalid data value will be skipped.');
userValue = null;
}
break;
case 'set': // read from the set of check boxes
userValue = [];
if (pref.setDisplayOrder) {
// read only those keys specified in the display order
$.each(pref.setDisplayOrder, function(itemkey, item) {
if (form[pref.name + '_' + item].checked) {
userValue.push(item);
}
});
} else {
// read all the keys in the list of values
$.each(pref.setValues, function(itemkey) {
if (form[pref.name + '_' + itemkey].checked) {
userValue.push(itemkey);
}
});
}
break;
case 'customList': // read from the jQuery data stored on the button object
userValue = $(form[pref.name]).data('value');
break;
default:
alert('twinkleconfig: unknown data type for preference ' + pref.name);
break;
}
} else if (Twinkle.prefs) {
// Retain the hidden preferences that may have customised by the user from twinkleoptions.js
// undefined if not set
userValue = Twinkle.prefs[pref.name];
}
}
// only save those preferences that are *different* from the default
if (userValue !== undefined && !compare(userValue, Twinkle.defaultConfig[pref.name])) {
newConfig[pref.name] = userValue;
}
});
});
var text =
'// twinkleoptions.js: Bu, sizin fərdi Twinkle nizamlama səhifənizdir.\n' +
'//\n' +
'// Qeyd: Nizamlamaları dəyişməyin ən asan yolu Twinkle nizamlama \n' +
'// panelindən istifadə etməkdir ([[' + Morebits.pageNameNorm + ']]).\n' +
'//\n' +
'// Bu fayl avtomatik olaraq yaradılıb. Burada etdiyiniz dəyişiklər\n' +
'// Twinkle nizamlama panelində edilmiş dəyişikliklərə uyğun şəkildə yenilənəcəkdir.\n' +
'// Bu səhifəni redaktə edərkən JavaScript kodunun düzgün olduğundan əmin olun.\n' +
'// <no' + 'wiki>\n' +
'\n' +
'window.Twinkle.prefs = ';
text += JSON.stringify(newConfig, null, 2);
text +=
';\n' +
'\n' +
'// </no' + 'wiki>\n' +
'// Fərdi nizamlama səhifəsinin sonu\n';
pageobj.setPageText(text);
pageobj.setEditSummary('Twinkle nizamlamaları yadda saxlanılır. [[:' + Morebits.pageNameNorm + ']] səhifəsindən avtomatik olaraq yeniləndi');
pageobj.setChangeTags(Twinkle.changeTags);
pageobj.setCreateOption('recreate');
pageobj.save(Twinkle.config.saveSuccess);
};
Twinkle.config.saveSuccess = function twinkleconfigSaveSuccess(pageobj) {
pageobj.getStatusElement().info('uğurla yerinə yetirildi');
var noticebox = document.createElement('div');
noticebox.className = 'successbox';
noticebox.style.fontSize = '100%';
noticebox.style.marginTop = '2em';
noticebox.innerHTML = '<p><b>Twinkle nizamlamalarınız yadda saxlanıldı.</b></p><p>Dəyişiklikləri görmək üçün <b>brauzerinizin keşini təmizləyin</b>.</p>';
Morebits.status.root.appendChild(noticebox);
var noticeclear = document.createElement('br');
noticeclear.style.clear = 'both';
Morebits.status.root.appendChild(noticeclear);
};
Twinkle.addInitCallback(Twinkle.config.init);
})(jQuery);
// </nowiki>