/**
* @param Title $title
- * @param Title $origTitle
+ * @param ForeignTitle $foreignTitle
* @param int $revisionCount
* @param int $successCount
* @param array $pageInfo
* @return void
*/
- public function reportPage( $title, $origTitle, $revisionCount, $successCount, $pageInfo ) {
+ public function reportPage( $title, $foreignTitle, $revisionCount, $successCount, $pageInfo ) {
// Add a result entry
$r = [];
$this->mResultArr[] = $r;
// Piggyback on the parent to do the logging
- parent::reportPage( $title, $origTitle, $revisionCount, $successCount, $pageInfo );
+ parent::reportPage( $title, $foreignTitle, $revisionCount, $successCount, $pageInfo );
}
public function getData() {
* @ingroup Dump
*/
class DumpFileOutput extends DumpOutput {
- protected $handle = false, $filename;
+ /** @var resource|false */
+ protected $handle = false;
+ /** @var string */
+ protected $filename;
/**
* @param string $file
}
/**
- * @param array $newname
+ * @param string|string[] $newname
* @return string
* @throws MWException
*/
* various row objects and XML output for filtering. Filters
* can be chained or used as callbacks.
*
- * @param DumpOutput &$sink
+ * @param DumpOutput|DumpFilter &$sink
*/
public function setOutputSink( &$sink ) {
$this->sink =& $sink;
* Not called by default (depends on $this->list_authors)
* Can be set by Special:Export when not exporting whole history
*
- * @param array $cond
+ * @param string $cond
*/
protected function do_list_authors( $cond ) {
$this->author_list = "<contributors>";
/**
* Notify the callback function when a new "<page>" is reached.
- * @param Title $title
+ * @param array $title
*/
function pageCallback( $title ) {
if ( isset( $this->mPageCallback ) ) {
/**
* @since 1.12.2
- * @param array $params
+ * @param string $params
*/
public function setParams( $params ) {
$this->params = $params;
: self::FOR_PUBLIC;
}
+ /**
+ * Check if a log item type can be displayed
+ * @return bool
+ */
+ public function canViewLogType() {
+ // If the user doesn't have the right permission to view the specific
+ // log type, return false
+ $logRestrictions = $this->context->getConfig()->get( 'LogRestrictions' );
+ $type = $this->entry->getType();
+ return !isset( $logRestrictions[$type] )
+ || $this->context->getUser()->isAllowed( $logRestrictions[$type] );
+ }
+
/**
* Check if a log item can be displayed
* @param int $field LogPage::DELETED_* constant
protected function canView( $field ) {
if ( $this->audience == self::FOR_THIS_USER ) {
return LogEventsList::userCanBitfield(
- $this->entry->getDeleted(), $field, $this->context->getUser() );
+ $this->entry->getDeleted(), $field, $this->context->getUser() ) &&
+ self::canViewLogType();
} else {
- return !$this->entry->isDeleted( $field );
+ return !$this->entry->isDeleted( $field ) && self::canViewLogType();
}
}
/**
* @param UserIdentity $user
- * @param TitleValue[] $titles
+ * @param LinkTarget[] $titles
* @return bool
* @throws MWException
*/
"Elbasyouny",
"Omar Ghrida",
"AHmed Khaled",
- "البراء صالح"
+ "البراء صالح",
+ "Dyolf77 (WMF)"
]
},
"tog-underline": "سطر تحت الوصلات:",
"password-change-forbidden": "لا يمكنك تغيير كلمات السر على هذا الويكي.",
"externaldberror": "هناك إما خطأ في دخول قاعدة البيانات الخارجية أو أنه غير مسموح لك بتحديث حسابك الخارجي.",
"login": "تسجيل الدخول",
- "login-security": "توكيد هويتك",
+ "login-security": "تأكيد هويتك",
"nav-login-createaccount": "دخول / إنشاء حساب",
"logout": "تسجيل الخروج",
"userlogout": "خروج",
"changeemail-no-info": "يجب تسجيل الدخول للوصول إلى هذه الصفحة مباشرة.",
"changeemail-oldemail": "عنوان البريد الإلكتروني الحالي:",
"changeemail-newemail": "عنوان البريد الإلكتروني الجديد:",
- "changeemail-newemail-help": "هذا الحقل ينبغي أن يترك فارغا في حالة لو كنت تريد إزالة عنوان البريد الإلكتروني الخاص بك. أنت لن تكون قادرا على إعادة ضبط كلمة سر ضائعة ولن تتلقى رسئل بريد إلكتروني من هذه الويكي لو أزيل عنوان البريد الإلكتروني.",
+ "changeemail-newemail-help": "هذا الحقل يجب أن يترك فارغا لو كنت تريد إزالة عنوان البريد الإلكتروني الخاص بك. لو أزيل عنوان البريد الإلكتروني لن تكون قادرا على إعادة ضبط كلمة سر ضائعة ولن تتلقى رسائل بريد إلكتروني من هذه الويكي.",
"changeemail-none": "(لا شيء)",
"changeemail-password": "كلمة سر {{SITENAME}} الخاصة بك:",
"changeemail-submit": "غيّر البريد الإلكتروني",
"accmailtext": "[[User talk:$1|$1]]-ৰ কাৰণে যাদৃচ্ছিকভাৱে উৎপন্ন কৰা গুপ্তশব্দ $2লৈ পঠোৱা হ'ল । \nএই নতুন একাউন্টত প্ৰৱেশ কৰি ''[[Special:ChangePassword|গুপ্তশব্দ সলনি কৰক]]'' পৃষ্ঠাখনত শব্দতো সলনি কৰি ল’ব পাৰিব ।",
"newarticle": "(নতুন)",
"newarticletext": "আপুনি বিচৰা প্ৰবন্ধটো বিচাৰি পোৱা নগ'ল।\n\nইচ্ছা কৰিলে আপুনিয়েই এই প্ৰবন্ধটো লিখা আৰম্ভ কৰিব পাৰে। [$1 ইয়াত] সহায় পাব।\n\nআপুনি যদি ইয়ালৈ ভুলতে আহিছে, তেনেহলে আপোনাৰ ব্ৰাওজাৰৰ '''BACK''' বুটামত টিপা মাৰক।",
- "anontalkpagetext": "----''এইখন আলোচনা পৃষ্ঠা বেনামী সদস্যৰ বাবে, যিয়ে নিজা একাউণ্ট সৃষ্টি কৰা নাই বা যিয়ে সেই একাউণ্ট ব্যৱহাৰ নকৰে।\nএতেকে আমি তেখেতসকলক আই-পি ঠিকনাৰে চিনাক্ত কৰিবলৈ বাধ্য।\nসেই একেই আই-পি ঠিকনা অনেকেই ব্যৱহাৰ কৰিব পাৰে।\nআপুনি যদি এজন বেনামী সদস্য আৰু যদি আপুনি অনুভৱ কৰে যে আপোনাৰ প্ৰতি অপ্ৰাসঙ্গিক মন্তব্য কৰা হৈছে, তেনেহলে আন বেনামী সদস্যৰ পৰা পৃথক কৰিবলৈ \n[[Special:CreateAccount|একাউণ্ট সৃষ্টি কৰক]] বা [[Special:UserLogin|প্ৰৱেশ কৰক]] ।''",
+ "anontalkpagetext": "----\n<em>এইখন আলোচনা পৃষ্ঠা বেনামী সদস্যৰ বাবে, যিয়ে নিজা একাউণ্ট সৃষ্টি কৰা নাই বা যিয়ে সেই একাউণ্ট ব্যৱহাৰ নকৰে।</em>\nএতেকে আমি তেখেতসকলক আই-পি ঠিকনাৰে চিনাক্ত কৰিবলৈ বাধ্য।\nসেই একেই আই-পি ঠিকনা অনেকেই ব্যৱহাৰ কৰিব পাৰে।\nআপুনি যদি এজন বেনামী সদস্য আৰু যদি আপুনি অনুভৱ কৰে যে আপোনাৰ প্ৰতি অপ্ৰাসঙ্গিক মন্তব্য কৰা হৈছে, তেনেহলে আন বেনামী সদস্যৰ পৰা পৃথক কৰিবলৈ [[Special:CreateAccount|এ টাএকাউণ্ট সৃষ্টি কৰক]] বা [[Special:UserLogin|প্ৰৱেশ কৰক]]।",
"noarticletext": "এই পৃষ্ঠাত বৰ্তমান কোনো পাঠ্য নাই ।\nআপুনি আন পৃষ্ঠাত [[Special:Search/{{PAGENAME}}|এই শিৰোনামা সন্ধান কৰিব পাৰে]],\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} সম্পৰ্কীয় অভিলেখ সন্ধান কৰিব পাৰে],\nবা [{{fullurl:{{FULLPAGENAME}}|action=edit}} এই পৃষ্ঠা সৃষ্টি কৰিব পাৰে]</span>",
"noarticletext-nopermission": "এই পৃষ্ঠাত বৰ্তমান কোনো পাঠ্য নাই।\nআপুনি আন পৃষ্ঠাত [[Special:Search/{{PAGENAME}}|এই শিৰোনামা সন্ধান কৰিব পাৰে]],\nবা <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} সম্পৰ্কীয় অভিলেখ সন্ধান কৰিব পাৰে]</span>, কিন্তু এই পৃষ্ঠা সৃষ্টি কৰিবলৈ আপোনাৰ অনুমতি নাই।",
"missing-revision": "\"{{FULLPAGENAME}}\" নামৰ পৃষ্ঠাৰ #$1 সংশোধনৰ অস্তিত্ব নাই।\n\nসাধাৰণতে বিলোপ কৰা এখন পৃষ্ঠাৰ পুৰণা ইতিহাস লিংক অনুসৰণ কৰিলে এনে হয়।\n[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} বিলোপন ল'গ]ত অধিক তথ্য পাব।",
"page_first": "প্ৰথম",
"page_last": "অন্তিম",
"histlegend": "পাৰ্থক্য বাছনি: পাৰ্থক্য চাবলৈ সংকলনবোৰৰ সম্মুখত থকা ৰেডিঅ' বুটামবোৰ বাচনী কৰি এণ্টাৰ টিপক অথবা একেবাৰে তলত দিয়া বুটামতো ক্লিক কৰক <br />\nলিজেণ্ড: '''({{int:cur}})''' = বৰ্তমানৰ সংকলনৰ লগত পাৰ্থক্য,\n'''({{int:last}})''' = আগৰ সংকলনৰ লগত পাৰ্থক্য, '''{{int:minoreditletter}}'' = অগুৰুত্বপূৰ্ণ সম্পাদনা।",
- "history-fieldset-title": "সংশোধিত সংস্কৰণ সন্ধান কৰক",
+ "history-fieldset-title": "সংশোধিত সংস্কৰণ",
"history-show-deleted": "মাথোঁ বিলোপ কৰা",
"histfirst": "আটাইতকৈ পুৰণি",
"histlast": "শেহতীয়া",
"editundo": "পূৰ্ববত কৰক",
"diff-empty": "(কোনো পাৰ্থক্য নাই)",
"diff-multi-sameuser": "একেজন সদস্যই কৰা ({{PLURAL:$1|এটা মধ্যৱৰ্তী সংশোধন|$1 মধ্যৱৰ্তী সংশোধন}} দেখুওৱা হোৱা নাই)",
- "diff-multi-otherusers": "({{PLURAL:$2|আন এজন সদস্যই|$2জন সদস্যই}} কৰা ({{PLURAL:$1|এটা মধ্যৱৰ্তী সংশোধন|$1টা মধ্যৱৰ্তী সংশোধন}} দেখুওৱা হোৱা নাই)",
+ "diff-multi-otherusers": "({{PLURAL:$2|আন এজন সদস্য|$2জন সদস্য}}ই কৰা {{PLURAL:$1|এটা মধ্যৱৰ্তী সংশোধন|$1টা মধ্যৱৰ্তী সংশোধন}} দেখুওৱা হোৱা নাই)",
"diff-multi-manyusers": "({{PLURAL:$2|এজনতকৈ|$2-জনতকৈ}} অধিক সদস্যৰ দ্বাৰা {{PLURAL:$1|এটা মধ্যৱৰ্তী সংশোধন|$1-টা মধ্যৱৰ্তী সংশোধন}} দেখুওৱা হোৱা নাই)",
"difference-missing-revision": "{{PLURAL:$2|এটা সংস্কৰণ|$2 সংস্কৰণসমূহৰ}} সংশোধনৰ পাৰ্থক্য ($1) {{PLURAL:$2| পোৱা নগ’ল}}।\n\n\nসাধাৰণতে বিলোপ কৰা এখন পৃষ্ঠাৰ পুৰণা ইতিহাস লিংক অনুসৰণ কৰিলে এনে হয়।\n[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} বিলোপন অভিলেখ] চালে অধিক তথ্য পাব।",
"searchresults": "অনুসন্ধানৰ ফলাফল",
"filehist-comment": "মন্তব্য",
"imagelinks": "ফাইল ব্যৱহাৰ",
"linkstoimage": "তলত দিয়া {{PLURAL:$1|পৃষ্ঠাটোৱে|$1 পৃষ্ঠাবোৰে}} এই ফাইলটো ব্যৱহাৰ কৰে:",
- "linkstoimage-more": "à¦\8fà¦\87 ফাà¦\87লৰ লà¦\97ত $1ৰà§\8b বà§\87à¦\9bি {{PLURAL:$1|পà§\83ষà§\8dঠা সà¦\82যà§\8bà¦\97|পà§\83ষà§\8dঠা সà¦\82যà§\8bà¦\97}} হà§\88 à¦\86à¦\9bà§\87 ।\nতলৰ তালিà¦\95াত {{PLURAL:$1|পà§\8dৰথম পà§\83ষà§\8dঠা সà¦\82যà§\8bà¦\97|পà§\8dৰথম $1 পà§\83ষà§\8dঠা সà¦\82যà§\8bà¦\97}} দà§\87à¦\96à§\81à¦\93ৱা হà§\88à¦\9bà§\87 ।\nà¦\8fà¦\96ন [[Special:WhatLinksHere/$2|সমà§\8dপà§\82ৰà§\8dণ তালিà¦\95া]]à¦\93 পাব ।",
+ "linkstoimage-more": "à¦\8fà¦\87 ফাà¦\87লà¦\9fà§\8b $1ৰà§\8b বà§\87à¦\9bি {{PLURAL:$1|পà§\83ষà§\8dঠাà¦\87 বà§\8dযৱহাৰ}} à¦\95ৰà§\87।\nতলৰ তালিà¦\95াত সà¦\82যà§\8bà¦\9cিত {{PLURAL:$1|পà§\8dৰথম পà§\83ষà§\8dঠা|পà§\8dৰথম $1à¦\9fা পà§\83ষà§\8dঠা}} দà§\87à¦\96à§\81à¦\93ৱা হà§\88à¦\9bà§\87।\n[[Special:WhatLinksHere/$2|সমà§\8dপà§\82ৰà§\8dণ তালিà¦\95া à¦\87য়াত]] পাব। $1 {{PLURAL:$1|page uses|pages use}} this file.\nThe following list shows the {{PLURAL:$1|first page|first $1 pages}} that use this file only.\nA [[Special:WhatLinksHere/$2|full list]] is available.",
"nolinkstoimage": "এই ফাইলটো কোনো পৃষ্ঠাই ব্যৱহাৰ কৰা নাই",
"morelinkstoimage": "এই ফাইলৰ [[Special:WhatLinksHere/$1|অধিক সংযোগ]] চাওক ।",
"linkstoimage-redirect": "$1 (ফাইল পুনৰ্নিৰ্দেশ) $2",
"htmlform-cloner-create": "আৰু যোগ কৰক",
"htmlform-cloner-delete": "আঁতৰাওক",
"logentry-delete-delete": "$3 পৃষ্ঠাটো $1ৰদ্বাৰা {{GENDER:$2|বিলোপ কৰা হ'ল}}",
- "logentry-delete-restore": "$1-এ $3 পৃষ্ঠাটো {{GENDER:$2|পুনৰ্সংৰক্ষণ কৰিলে}}",
+ "logentry-delete-restore": "$1-এ $3 ($4) পৃষ্ঠাটো {{GENDER:$2|পুনৰ্সংৰক্ষণ কৰিলে}}",
"logentry-delete-event": "$3: $4 -ত {{PLURAL:$5|এটা লগ ঘটনা|$5 লগ ঘটনাসমূহ}} -ৰ $1 পৰিৱৰ্তন কৰা দৃশ্যমানতা",
"logentry-delete-revision": "পৃষ্ঠা $3ত {{PLURAL:$5|এটা সংশোধন|$5 সংশোধনসমূহ}}ৰ দৃশ্যমানতা $1 {{GENDER:$2|য়ে সলালে}}: $4",
"logentry-delete-event-legacy": "$3ত ল'গ ঘটনাসমূহৰ দৃশ্যমানতা $1 {{GENDER:$2|ৰদ্বাৰা সলোৱা হ'ল}}",
"logentry-move-move_redir": "পুনৰ্নিৰ্দেশৰে পৃষ্ঠা $3ৰ পৰা $4 $1লৈ স্থানান্তৰ কৰা হ’ল",
"logentry-move-move_redir-noredirect": "পুনৰ্নিৰ্দেশ নেৰাকৈ এটা পুনৰ্নিৰ্দেশৰ ওপৰেৰে পৃষ্ঠা $3 -ৰ পৰা $4 $1 স্থানান্তৰ কৰা হল",
"logentry-patrol-patrol": "পৃষ্ঠা $3 -ৰ $1 চিহ্নিত সংশোধন $4 নিৰীক্ষণ কৰা হ'ল",
- "logentry-patrol-patrol-auto": "পৃষ্ঠা $3 -ৰ $1 চিহ্নিত সংশোধন $4 স্বচালিতভাৱে নিৰীক্ষণ কৰা হ'ল",
+ "logentry-patrol-patrol-auto": "$1 স্বচালিতভাৱে $3 পৃষ্ঠাৰ $4 নং সংশোধন নিৰীক্ষণ কৰা হ'ল বুলি {{GENDER:$2|চিহ্নিত}} কৰিছে",
"logentry-newusers-newusers": "ব্যৱহাৰকাৰী একাউণ্ট $1 সৃষ্টি কৰা হ'ল",
"logentry-newusers-create": "ব্যৱহাৰকাৰী একাউণ্ট $1 {{GENDER:$2|সৃষ্টি কৰা হ'ল}}",
"logentry-newusers-create2": "$1ৰ দ্বাৰা এটা ব্যৱহাৰকাৰী একাউণ্ট $3 {{GENDER:$2|সৃষ্টি কৰা হ'ল}}",
"helppage-top-gethelp": "Даведка",
"mainpage": "Галоўная старонка",
"mainpage-description": "Першая старонка",
- "policy-url": "Project:Ð\90Ñ\80ганÑ\96заÑ\86Ñ\8bйнаÑ\8f палÑ\96Ñ\82Ñ\8bка",
+ "policy-url": "Project:СпÑ\96Ñ\81 пÑ\80авÑ\96л Ñ\96 Ñ\80Ñ\8dкамендаÑ\86Ñ\8bй",
"portal": "Супольнасць",
"portal-url": "Project:Супольнасць",
"privacy": "Палітыка прыватнасці",
"delete-legend": "Выдаліць",
"historywarning": "<strong>Увага:</strong> Старонка, якую вы хочаце выдаліць, мае гісторыю з прыблізна $1 {{PLURAL:$1|праўку|праўкі|правак}}:",
"historyaction-submit": "Паказаць",
- "confirmdeletetext": "Ð\92Ñ\8b збÑ\96Ñ\80аеÑ\86еÑ\81Ñ\8f вÑ\8bдалÑ\96Ñ\86Ñ\8c Ñ\81Ñ\82аÑ\80онкÑ\83 Ñ\80азам з Ñ\83Ñ\81Ñ\91й Ñ\8fе гÑ\96Ñ\81Ñ\82оÑ\80Ñ\8bÑ\8fй пÑ\80авак.\nÐ\9fаÑ\86веÑ\80дзÑ\96Ñ\86е Ñ\81вой намеÑ\80 зÑ\80абÑ\96Ñ\86Ñ\8c гÑ\8dÑ\82а, Ñ\81ваÑ\91 Ñ\80азÑ\83менне наÑ\81Ñ\82Ñ\83пÑ\81Ñ\82ваÑ\9e, Ñ\96 Ñ\88Ñ\82о Ð\92Ñ\8b Ñ\80обÑ\96Ñ\86е гÑ\8dÑ\82а Ñ\9e адпаведнаÑ\81Ñ\86Ñ\96 з [[{{MediaWiki:Policy-url}}|палÑ\96Ñ\82Ñ\8bкай (аÑ\81ноÑ\9eнÑ\8bмÑ\96 пÑ\80авÑ\96ламÑ\96)]].",
+ "confirmdeletetext": "Ð\92Ñ\8b збÑ\96Ñ\80аеÑ\86еÑ\81Ñ\8f вÑ\8bдалÑ\96Ñ\86Ñ\8c Ñ\81Ñ\82аÑ\80онкÑ\83 Ñ\80азам з Ñ\83Ñ\81Ñ\91й Ñ\8fе гÑ\96Ñ\81Ñ\82оÑ\80Ñ\8bÑ\8fй пÑ\80авак.\nÐ\9fаÑ\86веÑ\80дзÑ\96Ñ\86е Ñ\81вой намеÑ\80 зÑ\80абÑ\96Ñ\86Ñ\8c гÑ\8dÑ\82а, Ñ\81ваÑ\91 Ñ\80азÑ\83менне наÑ\81Ñ\82Ñ\83пÑ\81Ñ\82ваÑ\9e, Ñ\96 Ñ\88Ñ\82о Ð\92Ñ\8b Ñ\80обÑ\96Ñ\86е гÑ\8dÑ\82а Ñ\9e адпаведнаÑ\81Ñ\86Ñ\96 з [[{{MediaWiki:Policy-url}}|аÑ\81ноÑ\9eнÑ\8bмÑ\96 пÑ\80авÑ\96ламÑ\96 пÑ\80аекÑ\82а]].",
"actioncomplete": "Завершана аперацыя",
"actionfailed": "Памылка дзеяння",
"deletedtext": "Старонка \"$1\" была выдалена.\nЗапісы аб нядаўніх выдаленнях гл. ў $2.",
"McDutchie",
"Johanna Strodt (WMDE)",
"Andi-3",
- "1233qwer1234qwer4"
+ "1233qwer1234qwer4",
+ "MarkusRost"
]
},
"tog-underline": "Links unterstreichen:",
"mainpage": "Hauptseite",
"mainpage-description": "Hauptseite",
"policy-url": "Project:Richtlinien",
- "portal": "Gemeinschaftsportal",
+ "portal": "Gemeinschafts­portal",
"portal-url": "Project:Gemeinschaftsportal",
"privacy": "Datenschutz",
"privacypage": "Project:Datenschutz",
"authors": [
"Don Alessandro",
"Ильнар",
- "Рашат Якупов"
+ "Рашат Якупов",
+ "Ерней"
]
},
"exif-imagewidth": "Киңлек",
"exif-colorspace": "Төсләр тирәлеге",
"exif-componentsconfiguration": "Төсләр төзелешенең конфигурациясе",
"exif-compressedbitsperpixel": "Кысылудан соң төснең тирәнлеге",
- "exif-pixelxdimension": "Ð Ó\99Ñ\81емнең киңлеге",
- "exif-pixelydimension": "Ð Ó\99Ñ\81емнең биеклеге",
+ "exif-pixelxdimension": "СÑ\83Ñ\80Ó\99Ñ\82 киңлеге",
+ "exif-pixelydimension": "СÑ\83Ñ\80Ó\99Ñ\82 биеклеге",
"exif-usercomment": "Өстәмә җавап",
"exif-relatedsoundfile": "Тавыш файлы җавабы",
"exif-datetimeoriginal": "Чын вакыты",
"statistics-pages-desc": "Omna pagini dil Wiki, inkluzite pagini por facar diskuti, ridirektadi, edc.",
"statistics-files": "Adkargita arkivi",
"statistics-edits": "Quanto di redakti pos ke {{SITENAME}} kreesis",
- "statistics-edits-average": "Mezavalora quanto di redakti per pagino",
+ "statistics-edits-average": "Mezavalora quanto di redakti po pagino",
"statistics-users": "Enrejistrita uzeri",
"statistics-users-active": "Aktiva uzeri",
"statistics-users-active-desc": "Uzeri qui facis ula agado dum la lasta {{PLURAL:$1|dio|$1 dii}}",
"cachedspecial-refresh-now": "Vidar la lasta.",
"categories": "Kategorii",
"categories-submit": "Montrez",
+ "categoriespagetext": "La sequanta {{PLURAL:$1|kategorio|kategorii}} existas en ca wiki, e povas uzesar, o ne.\nVidez anke [[Special:WantedCategories|dezirata kategorii]].",
"categoriesfrom": "Montrez kategorii komencante en:",
"deletedcontributions": "Efacita uzero-kontributaji",
"deletedcontributions-title": "Efacita uzero-kontributaji",
"search-interwiki-more": "(meer)",
"search-interwiki-more-results": "meer resultaten",
"search-relatedarticle": "Gerelateerd",
+ "search-invalid-sort-order": "De sorteervolgorde $1 is onbekend, de normale sorteervolgorde is in plaats daarvan toegepast. Geldige sorteervolgorden zijn: $2",
+ "search-unknown-profile": "Het zoekprofiel $1 is onbekend. Het standaard zoekprofiel zal worden toegepast.",
"searchrelated": "gerelateerd",
"searchall": "alle",
"showingresults": "Hieronder {{PLURAL:$1|staat '''1''' resultaat|staan '''$1''' resultaten}} vanaf #'''$2'''.",
"editingcomment": "(ߛߌ߰ߘߊ߬ ߞߎߘߊ߫) ߡߊߦߟߍ߬ߡߊ߲ ߦߴߌ ߘߐ߫ $1",
"editconflict": "ߝߐߢߐ߲߯ߞߐ ߡߊߦߟߍ߬ߡߊ߲߬: $1",
"yourtext": "ߌ ߟߊ߫ ߛߓߍߟߌ",
+ "storedversion": "ߟߢߊ߬ߟߌ߬ ߟߊߞߎ߲߬ߘߎ߬ߣߍ߲",
+ "editingold": "<strong>ߖߊ߲߬ߓߌ߬ߟߊ߬ߟߌ: ߌ ߦߋ߫ ߟߢߊ߬ߟߌ ߕߎ߬ߡߊ ߕߊ߬ߡߌ߲߬ߣߍ߲ ߠߋ߬ ߡߊߦߟߍߡߊ߲ ߞߊ߲߬ ߞߐߜߍ ߣߌ߲߬ ߘߐ߫ ߣߌ߲߬.</strong> \nߣߴߌ ߞߵߊ߬ ߟߊߞߎ߲߬ߘߎ߫߸ ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߝߋ߲߫-ߋ-ߝߋ߲߫ ߞߍߣߍ߲߫ ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߣߌ߲߬ ߞߐ߫߸ ߓߣߐ߬ ߘߌ߫ ߞߴߏ߬ ߓߍ߯ ߘߐ߫.",
+ "unicode-support-fail": "ߊ߬ ߛߓߍߣߍ߲߫ ߦߋ߫ ߞߏ߫ ߞߏ߫ ߌ ߟߊ߫ ߛߏ߲߯ߓߊߟߊ߲ ߘߌ߬ߢߍ߬ߣߍ߲߬ ߕߍ߫ ߎߣߌߞߐߘ ߡߊ߬.ߞߐߜߍ ߡߊߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߞߊ߬ߣߌ߲߬ ߣߍ߲߫߸ ߏ߬ ߘߐ߫ ߌ ߟߊ߫ ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߕߎ߲߬ ߡߊ߫ ߟߊߞߎ߲߬ߘߎ߬ ߡߎߣߎ߲߬.",
+ "yourdiff": "ߓߐߣߍ߲ߢߐ߲߰ߡߊ ߟߎ߬",
+ "editpage-cannot-use-custom-model": "ߞߐߜߍ ߣߌ߲߬ ߞߣߐߘߐ ߛߎ߮ߦߊ ߕߍߣߊ߬ ߛߐ߲߬ ߠߊ߫ ߡߊߦߟߍ߬ߡߊ߲߫ ߠߊ߫.",
"templatesused": "{{PLURAL:$1|ߞߙߊߞߏ|ߞߙߊߞߏ ߟߎ߫}} ߟߎ߫ ߟߊߓߊ߯ߙߊ߫ ߘߊ߫ ߞߐߜߍ ߣߌ߲߬ ߘߐ߫",
"templatesusedpreview": "{{PLURAL:$1|ߞߙߊߞߏ|ߞߙߊߞߏ ߟߎ߬}} ߟߋ߬ ߟߊߓߊ߯ߙߊ߫ ߣߍ߲߫ ߢߍߦߋߟߌ ߣߌ߲߬ ߘߐ߫",
"template-protected": "(ߊ߬ ߡߊߞߊ߲ߞߊ߲ߣߍ߲߫ ߠߋ߬)",
"search-filter-title-prefix-reset": "ߞߐߜߍ ߓߍ߯ ߢߌߣߌ߲߫",
"searchresults-title": "ߣߌ߲߬ \"$1\" ߢߌߣߌ߲ߠߌ߲ ߞߐߝߟߌ",
"titlematches": "ߞߐߜߍ ߞߎ߲߬ߕߐ߮ ߓߍ߲߬ߢߐ߲߰ߡߊ߬ߣߍ߲߫",
+ "textmatches": "ߞߐߜߍ ߞߟߏߜߍ ߦߋ߫ ߦߋ߲߬",
+ "notextmatches": "ߞߐߜߍ ߞߟߏߜߍ߫ ߕߴߦߋ߲߬",
"prevn": "ߕߊ߬ߡߌ߲߬ߣߍ߲ ߠߎ߬ {{PLURAL:$1|$1}}",
"nextn": "ߟߊߕߎ߲߰ߠߊ {{PLURAL:$1|$1}}",
"prev-page": "ߞߐߜߍ ߢߍߕߊ",
"prefs-changeswatchlist": "ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߓߘߊ߫ ߦߌ߬ߘߊ߬",
"prefs-pageswatchlist": "ߞߐߜߍ߫ ߜߋ߬ߟߎ߲߬ߣߍ߲ ߠߎ߬",
"prefs-tokenwatchlist": "ߖߐߟߐ߲ߞߐ",
+ "prefs-diffs": "ߓߐߣߍ߲ߢߐ߲߰ߡߊ ߟߎ߬",
"prefs-help-prefershttps": "ߟߊ߬ߝߌ߬ߛߦߊ߬ߟߌ ߣߌ߲߬ ߘߴߊ߬ ߝߏ߲߬ߝߏ߲ ߟߴߌ ߟߊ߫ ߜߊ߲߬ߞߎ߲߬ߠߌ߲ ߣߊ߬ߕߐ ߞߊ߲߬.",
"userrights": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߤߊߞߍ",
"userrights-lookup-user": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߘߏ߫ ߛߎߥߊ߲ߘߌ߫",
"rcfilters-filter-user-experience-level-unregistered-label": "ߕߐ߯ߛߓߍߓߊߟߌ",
"rcfilters-filter-user-experience-level-unregistered-description": "ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߊ ߡߍ߲ ߜߊ߲߬ߞߎ߲߬ߣߍ߲߬ ߕߍ߫.",
"rcfilters-filter-user-experience-level-learner-label": "ߞߊ߬ߙߊ߲߬ߠߊ ߟߎ߬",
+ "rcfilters-filter-user-experience-level-experienced-label": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ߫ ߖߊߙߌ߲ߒߕߋ",
"rcfilters-filter-user-experience-level-experienced-description": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ߬ ߕߐ߯ߛߓߍߣߍ߲ ߡߍ߲ ߠߊ߫ ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߓߘߊ߫ ߕߊ߬ߡߌ߲߬ ߅߀߀ ߞߊ߲߬ ߕߟߋ߬ ߃߀ ߓߊ߯ߙߊ߫ ߣߐ.",
+ "rcfilters-filtergroup-automated": "ߞߍߒߖߘߍߦߋ߫ ߓߟߏߓߌߟߊߢߐ߲߯ߞߊ߲",
"rcfilters-filter-bots-label": "ߓߏߕ",
"rcfilters-filter-bots-description": "ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߡߍ߲ ߠߎ߬ ߛߌ߲ߘߌߣߍ߲߫ ߞߍߒߖߘߍߦߋ߫ ߖߐ߯ߙߊ߲ ߠߎ߬ ߘߐ߫.",
"rcfilters-filter-humans-label": "ߡߐ߱ (ߓߏߕ ߕߍ߫)",
"rcfilters-filter-watchlist-watched-description": "ߊ߬ ߡߊߝߊ߬ߟߋ߲߬ ߌ ߟߊ߫ ߜߋ߬ߟߎ߲߬ߠߌ߲߬ ߛߙߍߘߍ ߞߐߜߍ ߟߎ߬ ߘߐ߫.",
"rcfilters-filter-watchlist-watchednew-label": "ߜߋ߬ߟߎ߲߬ߠߌ߲߬ ߛߙߍߘߍ߫ ߞߎߘߊ߫ ߓߘߊ߫ ߡߊߦߟߍ߬ߡߊ߲߫",
"rcfilters-filter-watchlist-notwatched-label": "ߊ߬ ߕߍ߫ ߜߋ߬ߟߎ߲߬ߠߌ߲߬ ߛߙߍߘߍ ߘߐ߫",
+ "rcfilters-filtergroup-watchlistactivity": "ߜߋ߬ߟߎ߲߬ߠߌ߲߬ ߛߙߍߘߍ ߡߛߍ߬ߞߍ߬ߡߛߍߞߍ",
+ "rcfilters-filter-watchlistactivity-unseen-label": "ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲߬ ߦߋߓߊߟߌ ߟߎ߬",
+ "rcfilters-filter-watchlistactivity-seen-label": "ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ ߠߎ߫ ߦߋ߫",
"rcfilters-filtergroup-changetype": "ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߛߎ߯ߦߊ",
"rcfilters-filter-pageedits-label": "ߞߐߜߐ ߡߊߦߟߍ߬ߡߊ߲߫",
"rcfilters-filter-pageedits-description": "ߞߐߜߍ ߛߌ߲ߘߟߌ",
"uploadwarning-text": "ߞߐߕߐ߮ ߘߎ߰ߟߊ߬ߘߐ߫ ߞߊ߲ߛߓߍߟߌ ߡߊ߬ߦߟߍ߬ߡߊ߲߫ ߖߊ߰ߣߌ߲߬߸ ߞߵߊ߬ ߡߊߝߍߣߍ߲߫ ߕߎ߲߯.",
"savefile": "ߞߐߕߐ߮ ߟߊߞߎ߲߬ߘߎ߬",
"upload-source": "ߞߐߕߐ߮ ߛߎ߲",
+ "sourcefilename": "ߞߐߕߐ߮ ߕߐ߮ ߛߎ߲:",
"sourceurl": "URL ߛߎ߲:",
"destfilename": "ߞߐߕߐ߮ ߕߐ߮ ߞߎ߲߬ߕߋߟߋ߲:",
"upload-maxfilesize": "ߞߐߕߐ߮ ߢߊ߲ߞߊ߲ ߞߐߘߊ߲: $1",
"upload-dialog-button-upload": "ߟߊ߬ߦߟߍ߬ߟߌ",
"upload-form-label-infoform-title": "ߝߊߙߊ߲ߝߊ߯ߛߟߌ",
"upload-form-label-infoform-name": "ߕߐ߮",
+ "upload-form-label-infoform-description": "ߞߊ߲߬ߛߓߍߟߌ",
"upload-form-label-usage-title": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߌ",
"upload-form-label-usage-filename": "ߞߐߕߐ߮ ߕߐ߮",
"upload-form-label-own-work": "ߒ ߖߘߍ߬ߞߊ߬ߣߌ߲߬ ߓߊ߯ߙߊ ߟߋ߬",
"license-header": "ߟߊ߬ߘߌ߬ߢߍ߬ߟߌ ߦߴߌ ߘߐ߫",
"nolicense": "ߊ߬ ߡߊ߫ ߓߊߕߐ߬ߡߐ߲߬",
"listfiles-delete": "ߊ߬ ߖߏ߬ߛߌ߬",
+ "listfiles_search_for": "ߡߍ߲ߕߊߦߋߕߊ ߕߐ߮ ߢߌߣߌ߲ߠߌ߲:",
+ "listfiles-userdoesnotexist": "ߟߊ߬ߓߊ߰ߙߊ߬ ߖߊߕߋߘߊ \"$1\" ߟߊߞߎ߲߬ߘߎ߬ߣߍ߲߫ ߕߍ߫.",
"imgfile": "ߞߐߕߐ߮",
"listfiles": "ߞߐߕߐ߮ ߛߙߍߘߍ",
"listfiles_thumb": "ߞߝߊ߬ߟߋ߲ߛߋ߲",
"search-interwiki-more-results": "Więcej wyników",
"search-relatedarticle": "Pokrewne",
"search-invalid-sort-order": "Kolejność sortowania $1 jest nierozpoznawana. Zastosowane zostanie domyślne sortowanie. Właściwymi kolejnościami są: $2",
+ "search-unknown-profile": "Profil wyszukiwania $1 jest nierozpoznawany. Zostanie zastosowany domyślny profil.",
"searchrelated": "pokrewne",
"searchall": "wszystkie",
"showingresults": "Poniżej znajduje się lista {{PLURAL:$1|z '''1''' wynikiem|'''$1''' wyników}}, rozpoczynając od wyniku numer '''$2'''.",
/Firefox/.test( navigator.userAgent ) ||
// Disabled by configuration.
- !mw.config.get( 'wgResourceLoaderStorageEnabled' )
+ !mw.config.get( 'wgResourceLoaderStorageEnabled' ) ||
+
+ // Disable module store in debug mode context
+ mw.config.get( 'debug' )
) {
// Clear any previous store to free up space. (T66721)
this.clear();
this.enabled = false;
return;
}
- if ( mw.config.get( 'debug' ) ) {
- // Disable module store in debug mode
- this.enabled = false;
- return;
- }
try {
// This a string we stored, or `null` if the key does not (yet) exist.
* @dataProvider provideSuppressBlockLogDatabaseRows
*/
public function testSuppressBlockLogDatabaseRows( $row, $extra ) {
+ $this->setMwGlobals(
+ 'wgGroupPermissions',
+ [
+ 'oversight' => [
+ 'viewsuppressed' => true,
+ 'suppressionlog' => true,
+ ],
+ ]
+ );
+ $this->doTestLogFormatter( $row, $extra, [ 'oversight' ] );
+ }
+
+ /**
+ * Provide different rows from the logging table to test
+ * for backward compatibility.
+ * Do not change the existing data, just add a new database row
+ */
+ public static function provideSuppressBlockLogDatabaseRowsNonPrivileged() {
+ return [
+ // Current log format
+ [
+ [
+ 'type' => 'suppress',
+ 'action' => 'block',
+ 'comment' => 'Block comment',
+ 'user' => 0,
+ 'user_text' => 'Sysop',
+ 'namespace' => NS_USER,
+ 'title' => 'Logtestuser',
+ 'params' => [
+ '5::duration' => 'infinite',
+ '6::flags' => 'anononly',
+ ],
+ ],
+ [
+ 'text' => '(username removed) (log details removed)',
+ 'api' => [
+ 'duration' => 'infinite',
+ 'flags' => [ 'anononly' ],
+ ],
+ ],
+ ],
+
+ // legacy log
+ [
+ [
+ 'type' => 'suppress',
+ 'action' => 'block',
+ 'comment' => 'Block comment',
+ 'user' => 0,
+ 'user_text' => 'Sysop',
+ 'namespace' => NS_USER,
+ 'title' => 'Logtestuser',
+ 'params' => [
+ 'infinite',
+ 'anononly',
+ ],
+ ],
+ [
+ 'legacy' => true,
+ 'text' => '(username removed) (log details removed)',
+ 'api' => [
+ 'duration' => 'infinite',
+ 'flags' => [ 'anononly' ],
+ ],
+ ],
+ ],
+ ];
+ }
+
+ /**
+ * @dataProvider provideSuppressBlockLogDatabaseRowsNonPrivileged
+ */
+ public function testSuppressBlockLogDatabaseRowsNonPrivileged( $row, $extra ) {
+ $this->user = $this->getTestUser()->getUser();
$this->doTestLogFormatter( $row, $extra );
}
* @dataProvider provideSuppressReblockLogDatabaseRows
*/
public function testSuppressReblockLogDatabaseRows( $row, $extra ) {
+ $this->setMwGlobals(
+ 'wgGroupPermissions',
+ [
+ 'oversight' => [
+ 'viewsuppressed' => true,
+ 'suppressionlog' => true,
+ ],
+ ]
+ );
+ $this->doTestLogFormatter( $row, $extra, [ 'oversight' ] );
+ }
+
+ /**
+ * Provide different rows from the logging table to test
+ * for backward compatibility.
+ * Do not change the existing data, just add a new database row
+ */
+ public static function provideSuppressReblockLogDatabaseRowsNonPrivileged() {
+ return [
+ // Current log format
+ [
+ [
+ 'type' => 'suppress',
+ 'action' => 'reblock',
+ 'comment' => 'Block comment',
+ 'user' => 0,
+ 'user_text' => 'Sysop',
+ 'namespace' => NS_USER,
+ 'title' => 'Logtestuser',
+ 'params' => [
+ '5::duration' => 'infinite',
+ '6::flags' => 'anononly',
+ ],
+ ],
+ [
+ 'text' => '(username removed) (log details removed)',
+ 'api' => [
+ 'duration' => 'infinite',
+ 'flags' => [ 'anononly' ],
+ ],
+ ],
+ ],
+
+ // Legacy format
+ [
+ [
+ 'type' => 'suppress',
+ 'action' => 'reblock',
+ 'comment' => 'Block comment',
+ 'user' => 0,
+ 'user_text' => 'Sysop',
+ 'namespace' => NS_USER,
+ 'title' => 'Logtestuser',
+ 'params' => [
+ 'infinite',
+ 'anononly',
+ ],
+ ],
+ [
+ 'legacy' => true,
+ 'text' => '(username removed) (log details removed)',
+ 'api' => [
+ 'duration' => 'infinite',
+ 'flags' => [ 'anononly' ],
+ ],
+ ],
+ ],
+ ];
+ }
+
+ /**
+ * @dataProvider provideSuppressReblockLogDatabaseRowsNonPrivileged
+ */
+ public function testSuppressReblockLogDatabaseRowsNonPrivileged( $row, $extra ) {
+ $this->user = $this->getTestUser()->getUser();
$this->doTestLogFormatter( $row, $extra );
}
* @dataProvider provideSuppressRevisionLogDatabaseRows
*/
public function testSuppressRevisionLogDatabaseRows( $row, $extra ) {
+ $this->setMwGlobals(
+ 'wgGroupPermissions',
+ [
+ 'oversight' => [
+ 'viewsuppressed' => true,
+ 'suppressionlog' => true,
+ ],
+ ]
+ );
+ $this->doTestLogFormatter( $row, $extra, [ 'oversight' ] );
+ }
+
+ /**
+ * Provide different rows from the logging table to test
+ * for backward compatibility.
+ * Do not change the existing data, just add a new database row
+ */
+ public static function provideSuppressRevisionLogDatabaseRowsNonPrivileged() {
+ return [
+ // Current format
+ [
+ [
+ 'type' => 'suppress',
+ 'action' => 'revision',
+ 'comment' => 'Suppress comment',
+ 'namespace' => NS_MAIN,
+ 'title' => 'Page',
+ 'params' => [
+ '4::type' => 'archive',
+ '5::ids' => [ '1', '3', '4' ],
+ '6::ofield' => '1',
+ '7::nfield' => '10',
+ ],
+ ],
+ [
+ 'text' => '(username removed) (log details removed)',
+ 'api' => [
+ 'type' => 'archive',
+ 'ids' => [ '1', '3', '4' ],
+ 'old' => [
+ 'bitmask' => 1,
+ 'content' => true,
+ 'comment' => false,
+ 'user' => false,
+ 'restricted' => false,
+ ],
+ 'new' => [
+ 'bitmask' => 10,
+ 'content' => false,
+ 'comment' => true,
+ 'user' => false,
+ 'restricted' => true,
+ ],
+ ],
+ ],
+ ],
+
+ // Legacy format
+ [
+ [
+ 'type' => 'suppress',
+ 'action' => 'revision',
+ 'comment' => 'Suppress comment',
+ 'namespace' => NS_MAIN,
+ 'title' => 'Page',
+ 'params' => [
+ 'archive',
+ '1,3,4',
+ 'ofield=1',
+ 'nfield=10',
+ ],
+ ],
+ [
+ 'legacy' => true,
+ 'text' => '(username removed) (log details removed)',
+ 'api' => [
+ 'type' => 'archive',
+ 'ids' => [ '1', '3', '4' ],
+ 'old' => [
+ 'bitmask' => 1,
+ 'content' => true,
+ 'comment' => false,
+ 'user' => false,
+ 'restricted' => false,
+ ],
+ 'new' => [
+ 'bitmask' => 10,
+ 'content' => false,
+ 'comment' => true,
+ 'user' => false,
+ 'restricted' => true,
+ ],
+ ],
+ ],
+ ],
+ ];
+ }
+
+ /**
+ * @dataProvider provideSuppressRevisionLogDatabaseRowsNonPrivileged
+ */
+ public function testSuppressRevisionLogDatabaseRowsNonPrivileged( $row, $extra ) {
+ $this->user = $this->getTestUser()->getUser();
$this->doTestLogFormatter( $row, $extra );
}
* @dataProvider provideSuppressEventLogDatabaseRows
*/
public function testSuppressEventLogDatabaseRows( $row, $extra ) {
+ $this->setMwGlobals(
+ 'wgGroupPermissions',
+ [
+ 'oversight' => [
+ 'viewsuppressed' => true,
+ 'suppressionlog' => true,
+ ],
+ ]
+ );
+ $this->doTestLogFormatter( $row, $extra, [ 'oversight' ] );
+ }
+
+ /**
+ * Provide different rows from the logging table to test
+ * for backward compatibility.
+ * Do not change the existing data, just add a new database row
+ */
+ public static function provideSuppressEventLogDatabaseRowsNonPrivileged() {
+ return [
+ // Current format
+ [
+ [
+ 'type' => 'suppress',
+ 'action' => 'event',
+ 'comment' => 'Suppress comment',
+ 'namespace' => NS_MAIN,
+ 'title' => 'Page',
+ 'params' => [
+ '4::ids' => [ '1', '3', '4' ],
+ '5::ofield' => '1',
+ '6::nfield' => '10',
+ ],
+ ],
+ [
+ 'text' => '(username removed) (log details removed)',
+ 'api' => [
+ 'type' => 'logging',
+ 'ids' => [ '1', '3', '4' ],
+ 'old' => [
+ 'bitmask' => 1,
+ 'content' => true,
+ 'comment' => false,
+ 'user' => false,
+ 'restricted' => false,
+ ],
+ 'new' => [
+ 'bitmask' => 10,
+ 'content' => false,
+ 'comment' => true,
+ 'user' => false,
+ 'restricted' => true,
+ ],
+ ],
+ ],
+ ],
+
+ // Legacy format
+ [
+ [
+ 'type' => 'suppress',
+ 'action' => 'event',
+ 'comment' => 'Suppress comment',
+ 'namespace' => NS_MAIN,
+ 'title' => 'Page',
+ 'params' => [
+ '1,3,4',
+ 'ofield=1',
+ 'nfield=10',
+ ],
+ ],
+ [
+ 'legacy' => true,
+ 'text' => '(username removed) (log details removed)',
+ 'api' => [
+ 'type' => 'logging',
+ 'ids' => [ '1', '3', '4' ],
+ 'old' => [
+ 'bitmask' => 1,
+ 'content' => true,
+ 'comment' => false,
+ 'user' => false,
+ 'restricted' => false,
+ ],
+ 'new' => [
+ 'bitmask' => 10,
+ 'content' => false,
+ 'comment' => true,
+ 'user' => false,
+ 'restricted' => true,
+ ],
+ ],
+ ],
+ ],
+ ];
+ }
+
+ /**
+ * @dataProvider provideSuppressEventLogDatabaseRowsNonPrivileged
+ */
+ public function testSuppressEventLogDatabaseRowsNonPrivileged( $row, $extra ) {
+ $this->user = $this->getTestUser()->getUser();
$this->doTestLogFormatter( $row, $extra );
}
* @dataProvider provideSuppressDeleteLogDatabaseRows
*/
public function testSuppressDeleteLogDatabaseRows( $row, $extra ) {
+ $this->setMwGlobals(
+ 'wgGroupPermissions',
+ [
+ 'oversight' => [
+ 'viewsuppressed' => true,
+ 'suppressionlog' => true,
+ ],
+ ]
+ );
+ $this->doTestLogFormatter( $row, $extra, [ 'oversight' ] );
+ }
+
+ /**
+ * Provide different rows from the logging table to test
+ * for backward compatibility.
+ * Do not change the existing data, just add a new database row
+ */
+ public static function provideSuppressDeleteLogDatabaseRowsNonPrivileged() {
+ return [
+ // Current format
+ [
+ [
+ 'type' => 'suppress',
+ 'action' => 'delete',
+ 'comment' => 'delete comment',
+ 'namespace' => NS_MAIN,
+ 'title' => 'Page',
+ 'params' => [],
+ ],
+ [
+ 'text' => '(username removed) (log details removed)',
+ 'api' => [],
+ ],
+ ],
+
+ // Legacy format
+ [
+ [
+ 'type' => 'suppress',
+ 'action' => 'delete',
+ 'comment' => 'delete comment',
+ 'namespace' => NS_MAIN,
+ 'title' => 'Page',
+ 'params' => [],
+ ],
+ [
+ 'legacy' => true,
+ 'text' => '(username removed) (log details removed)',
+ 'api' => [],
+ ],
+ ],
+ ];
+ }
+
+ /**
+ * @dataProvider provideSuppressDeleteLogDatabaseRowsNonPrivileged
+ */
+ public function testSuppressDeleteLogDatabaseRowsNonPrivileged( $row, $extra ) {
+ $this->user = $this->getTestUser()->getUser();
$this->doTestLogFormatter( $row, $extra );
}
}
*/
abstract class LogFormatterTestCase extends MediaWikiLangTestCase {
- public function doTestLogFormatter( $row, $extra ) {
+ public function doTestLogFormatter( $row, $extra, $userGroups = [] ) {
RequestContext::resetMain();
$row = $this->expandDatabaseRow( $row, $this->isLegacy( $extra ) );
+ $context = new RequestContext();
+ $context->setUser( $this->getTestUser( $userGroups )->getUser() );
+
$formatter = LogFormatter::newFromRow( $row );
+ $formatter->setContext( $context );
$this->assertEquals(
$extra['text'],