"api-help-param-multi-separate": "Separera värden med <kbd>|</kbd> eller [[Special:ApiHelp/main#main/datatypes|alternativ]].",
"apierror-articleexists": "Artikeln du försökte skapa har redan skapats.",
"apierror-baddiff": "Diff kan inte hämtas. En eller båda sidversioner finns inte eller du har inte behörighet för att visa dem.",
+ "apierror-invalidoldimage": "Parametern <var>oldimage</var> har ett ogiltigt format.",
"apierror-invalidsection": "Parametern <var>section</var> måste vara ett giltigt avsnitts-ID eller <kbd>new</kbd>.",
"apierror-nosuchuserid": "Det finns ingen användare med ID $1.",
"apierror-protect-invalidaction": "Ogiltig skyddstyp \"$1\".",
* to true. It does not need to be set if the exact same filter is simply visible
* on both.
* $filterDefinition['default'] bool Default
- * $filterDefinition['isAllowedCallable'] callable Callable taking two parameters,
- * the class name of the special page and an IContextSource, and returning true
- * if and only if the current user is permitted to use this filter on the current
- * wiki. If it returns false, it will both hide the UI (in all UIs) and prevent
- * the DB query modification from taking effect. (optional, defaults to allowed)
* $filterDefinition['priority'] int Priority integer. Higher value means higher
* up in the group's filter list.
* $filterDefinition['queryCallable'] callable Callable accepting parameters, used
/**
* @inheritdoc
*/
- public function displaysOnUnstructuredUi( ChangesListSpecialPage $specialPage ) {
- return $this->showHide &&
- $this->isAllowed( $specialPage );
+ public function displaysOnUnstructuredUi() {
+ return !!$this->showHide;
}
/**
* @inheritdoc
*/
- public function isFeatureAvailableOnStructuredUi( ChangesListSpecialPage $specialPage ) {
+ public function isFeatureAvailableOnStructuredUi() {
return $this->isReplacedInStructuredUi ||
- parent::isFeatureAvailableOnStructuredUi( $specialPage );
+ parent::isFeatureAvailableOnStructuredUi();
}
/**
*/
protected $description;
- /**
- * Callable used to check whether this filter is allowed to take effect
- *
- * @var callable $isAllowedCallable
- */
- protected $isAllowedCallable;
-
/**
* List of conflicting groups
*
* $filterDefinition['label'] string i18n key of label for structured UI.
* $filterDefinition['description'] string i18n key of description for structured
* UI.
- * $filterDefinition['isAllowedCallable'] callable Callable taking two parameters,
- * the class name of the special page and an IContextSource, and returning true
- * if and only if the current user is permitted to use this filter on the current
- * wiki. If it returns false, it will both hide the UI (in all UIs) and prevent
- * the DB query modification from taking effect. (optional, defaults to allowed)
* $filterDefinition['priority'] int Priority integer. Higher value means higher
* up in the group's filter list.
*/
$this->description = $filterDefinition['description'];
}
- if ( isset( $filterDefinition['isAllowedCallable'] ) ) {
- $this->isAllowedCallable = $filterDefinition['isAllowedCallable'];
- }
-
$this->priority = $filterDefinition['priority'];
$this->group->registerFilter( $this );
/**
* Checks whether the filter should display on the unstructured UI
*
- * @param ChangesListSpecialPage $specialPage Current special page
* @return bool Whether to display
*/
- abstract public function displaysOnUnstructuredUi( ChangesListSpecialPage $specialPage );
+ abstract public function displaysOnUnstructuredUi();
/**
* Checks whether the filter should display on the structured UI
* This refers to the exact filter. See also isFeatureAvailableOnStructuredUi.
*
- * @param ChangesListSpecialPage $specialPage Current special page
* @return bool Whether to display
*/
- public function displaysOnStructuredUi( ChangesListSpecialPage $specialPage ) {
- return $this->label !== null && $this->isAllowed( $specialPage );
+ public function displaysOnStructuredUi() {
+ return $this->label !== null;
}
/**
*
* This can either be the exact filter, or a new filter that replaces it.
*/
- public function isFeatureAvailableOnStructuredUi( ChangesListSpecialPage $specialPage ) {
- return $this->displaysOnStructuredUi( $specialPage );
+ public function isFeatureAvailableOnStructuredUi() {
+ return $this->displaysOnStructuredUi();
}
/**
return $this->priority;
}
- /**
- * Checks whether the filter is allowed for the current context
- *
- * @param ChangesListSpecialPage $specialPage Current special page
- * @return bool Whether it is allowed
- */
- public function isAllowed( ChangesListSpecialPage $specialPage ) {
- if ( $this->isAllowedCallable === null ) {
- return true;
- } else {
- return call_user_func(
- $this->isAllowedCallable,
- get_class( $specialPage ),
- $specialPage->getContext()
- );
- }
- }
-
/**
* Gets the CSS class
*
/**
* Gets the JS data in the format required by the front-end of the structured UI
*
- * @param ChangesListSpecialPage $specialPage
* @return array|null Associative array, or null if there are no filters that
* display in the structured UI. messageKeys is a special top-level value, with
* the value being an array of the message keys to send to the client.
*/
- public function getJsData( ChangesListSpecialPage $specialPage ) {
+ public function getJsData() {
$output = [
'name' => $this->name,
'type' => $this->type,
} );
foreach ( $this->filters as $filterName => $filter ) {
- if ( $filter->displaysOnStructuredUi( $specialPage ) ) {
+ if ( $filter->displaysOnStructuredUi() ) {
$filterData = $filter->getJsData();
$output['messageKeys'] = array_merge(
$output['messageKeys'],
/**
* @inheritdoc
*/
- public function displaysOnUnstructuredUi( ChangesListSpecialPage $specialPage ) {
+ public function displaysOnUnstructuredUi() {
return false;
}
}
$allowedFilterNames = [];
foreach ( $this->filters as $filter ) {
- if ( $filter->isAllowed( $specialPage ) ) {
- $allowedFilterNames[] = $filter->getName();
- }
+ $allowedFilterNames[] = $filter->getName();
}
if ( $value === self::ALL ) {
/**
* @inheritdoc
*/
- public function getJsData( ChangesListSpecialPage $specialPage ) {
- $output = parent::getJsData( $specialPage );
+ public function getJsData() {
+ $output = parent::getJsData();
$output['separator'] = self::SEPARATOR;
$output['default'] = $this->getDefault();
"config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL] eo an dibab kentañ evit MediaWiki hag an hini skoret ar gwellañ. Mont a ra MediaWiki en-dro gant [{{int:version-db-mariadb-url}} MariaDB] ha [{{int:version-db-percona-url}} Percona Server] ivez, kenglotus o-daou gant MySQL. ([http://www.php.net/manual/en/mysqli.installation.php Penaos kempunañ PHP gant skor MySQL])",
"config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] zo anezhi ur reizhiad diaz roadennoù frank a wirioù brudet-mat a c'haller ober gantañ e plas MySQL. ([http://www.php.net/manual/en/pgsql.installation.php Penaos kempunañ PHP gant skor PostgreSQL])",
"config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite] zo anezhi ur reizhiad diaz roadennoù skañv skoret eus ar c'hentañ. ([http://www.php.net/manual/en/pdo.installation.php Penaos kempunañ PHP gant skor SQLite], implijout a ra PDO)",
- "config-dbsupport-oracle": "* $1 zo un diaz titouroù kenwerzhel. ([http://www.php.net/manual/en/oci8.installation.php Penaos kempunañ PHP gant skor OCI8])",
+ "config-dbsupport-oracle": "* Un embregerezh kenwerzhel diaz roadennoù eo [{{int:version-db-oracle-url}} Oracle]. ([http://www.php.net/manual/en/oci8.installation.php Penaos kempunañ PHP gant skor OCI8])",
+ "config-dbsupport-mssql": "* Un embregerezh kenwerzhel diaz roadennoù evit Windows eo [{{int:version-db-mssql-url}} Microsoft SQL Server]. ([http://www.php.net/manual/en/sqlsrv.installation.php Penaos kempunañ PHP gant skor SQLSRV])",
"config-header-mysql": "Arventennoù MySQL",
"config-header-postgres": "Arventennoù PostgreSQL",
"config-header-sqlite": "Arventennoù SQLite",
"config-missing-db-name": "Ret eo deoc'h merkañ un dalvoudenn evit \"{{int:config-db-name}}\".",
"config-missing-db-host": "Ret eo deoc'h merkañ un dalvoudenn evit \"{{int:config-db-host}}\"",
"config-missing-db-server-oracle": "Ret eo deoc'h merkañ un dalvoudenn evit \"{{int:config-db-host-oracle}}\".",
- "config-invalid-db-server-oracle": "Direizh eo anv TNS an diaz titouroù \"$1\".\nOber hepken gant lizherennoù ASCII (a-z, A-Z), sifroù (0-9), arouezennoù islinennañ (_) ha pikoù (.).",
+ "config-invalid-db-server-oracle": "Direizh eo anv TNS an diaz roadennoù \"$1\".\nOber gant an neudennad \"TNS Name\" pe c'hoazh gant \"Easy Connect ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Hentennoù envel Oracle]).",
"config-invalid-db-name": "Direizh eo anv an diaz titouroù \"$1\".\nOber hepken gant lizherennoù ASCII (a-z, A-Z), sifroù (0-9), arouezennoù islinennañ (_) ha tiredoù (-).",
"config-invalid-db-prefix": "Direizh eo rakger an diaz titouroù \"$1\".\nOber hepken gant lizherennoù ASCII (a-z, A-Z), sifroù (0-9), arouezennoù islinennañ (_) ha tiredoù (-).",
"config-connection-error": "$1.\n\nGwiriit anv an ostiz, an anv implijer, ar ger-tremen ha klaskit en-dro.",
*/
private $filterGroupDefinitions;
+ // Same format as filterGroupDefinitions, but for a single group (reviewStatus)
+ // that is registered conditionally.
+ private $reviewStatusFilterGroupDefinition;
+
+ // Single filter registered conditionally
+ private $hideCategorizationFilterDefinition;
+
/**
* Filter groups, and their contained filters
* This is an associative array (with group name as key) of ChangesListFilterGroup objects.
]
],
- [
- 'name' => 'reviewStatus',
- 'title' => 'rcfilters-filtergroup-reviewstatus',
- 'class' => ChangesListBooleanFilterGroup::class,
- 'filters' => [
- [
- 'name' => 'hidepatrolled',
- 'label' => 'rcfilters-filter-patrolled-label',
- 'description' => 'rcfilters-filter-patrolled-description',
- // rcshowhidepatr-show, rcshowhidepatr-hide
- // wlshowhidepatr
- 'showHideSuffix' => 'showhidepatr',
- 'default' => false,
- 'isAllowedCallable' => function ( $pageClassName, $context ) {
- return $context->getUser()->useRCPatrol();
- },
- 'queryCallable' => function ( $specialClassName, $ctx, $dbr, &$tables, &$fields, &$conds,
- &$query_options, &$join_conds ) {
-
- $conds[] = 'rc_patrolled = 0';
- },
- 'cssClassSuffix' => 'patrolled',
- 'isRowApplicableCallable' => function ( $ctx, $rc ) {
- return $rc->getAttribute( 'rc_patrolled' );
- },
- ],
- [
- 'name' => 'hideunpatrolled',
- 'label' => 'rcfilters-filter-unpatrolled-label',
- 'description' => 'rcfilters-filter-unpatrolled-description',
- 'default' => false,
- 'isAllowedCallable' => function ( $pageClassName, $context ) {
- return $context->getUser()->useRCPatrol();
- },
- 'queryCallable' => function ( $specialClassName, $ctx, $dbr, &$tables, &$fields, &$conds,
- &$query_options, &$join_conds ) {
-
- $conds[] = 'rc_patrolled = 1';
- },
- 'cssClassSuffix' => 'unpatrolled',
- 'isRowApplicableCallable' => function ( $ctx, $rc ) {
- return !$rc->getAttribute( 'rc_patrolled' );
- },
- ],
- ],
- ],
+ // reviewStatus (conditional)
[
'name' => 'significance',
'title' => 'rcfilters-filtergroup-significance',
'class' => ChangesListBooleanFilterGroup::class,
+ 'priority' => -6,
'filters' => [
[
'name' => 'hideminor',
'label' => 'rcfilters-filter-pageedits-label',
'description' => 'rcfilters-filter-pageedits-description',
'default' => false,
+ 'priority' => -2,
'queryCallable' => function ( $specialClassName, $ctx, $dbr, &$tables, &$fields, &$conds,
&$query_options, &$join_conds ) {
'label' => 'rcfilters-filter-newpages-label',
'description' => 'rcfilters-filter-newpages-description',
'default' => false,
+ 'priority' => -3,
'queryCallable' => function ( $specialClassName, $ctx, $dbr, &$tables, &$fields, &$conds,
&$query_options, &$join_conds ) {
return $rc->getAttribute( 'rc_source' ) === RecentChange::SRC_NEW;
},
],
+
+ // hidecategorization
+
[
- 'name' => 'hidecategorization',
- 'label' => 'rcfilters-filter-categorization-label',
- 'description' => 'rcfilters-filter-categorization-description',
- // rcshowhidecategorization-show, rcshowhidecategorization-hide.
- // wlshowhidecategorization
- 'showHideSuffix' => 'showhidecategorization',
- 'isAllowedCallable' => function ( $pageClassName, $context ) {
- return $context->getConfig()->get( 'RCWatchCategoryMembership' );
+ 'name' => 'hidelog',
+ 'label' => 'rcfilters-filter-logactions-label',
+ 'description' => 'rcfilters-filter-logactions-description',
+ 'default' => false,
+ 'priority' => -5,
+ 'queryCallable' => function ( $specialClassName, $ctx, $dbr, &$tables, &$fields, &$conds,
+ &$query_options, &$join_conds ) {
+
+ $conds[] = 'rc_type != ' . $dbr->addQuotes( RC_LOG );
},
+ 'cssClassSuffix' => 'src-mw-log',
+ 'isRowApplicableCallable' => function ( $ctx, $rc ) {
+ return $rc->getAttribute( 'rc_source' ) === RecentChange::SRC_LOG;
+ }
+ ],
+ ],
+ ],
+ ];
+
+ $this->reviewStatusFilterGroupDefinition = [
+ [
+ 'name' => 'reviewStatus',
+ 'title' => 'rcfilters-filtergroup-reviewstatus',
+ 'class' => ChangesListBooleanFilterGroup::class,
+ 'priority' => -5,
+ 'filters' => [
+ [
+ 'name' => 'hidepatrolled',
+ 'label' => 'rcfilters-filter-patrolled-label',
+ 'description' => 'rcfilters-filter-patrolled-description',
+ // rcshowhidepatr-show, rcshowhidepatr-hide
+ // wlshowhidepatr
+ 'showHideSuffix' => 'showhidepatr',
'default' => false,
'queryCallable' => function ( $specialClassName, $ctx, $dbr, &$tables, &$fields, &$conds,
&$query_options, &$join_conds ) {
- $conds[] = 'rc_type != ' . $dbr->addQuotes( RC_CATEGORIZE );
+ $conds[] = 'rc_patrolled = 0';
},
- 'cssClassSuffix' => 'src-mw-categorize',
+ 'cssClassSuffix' => 'patrolled',
'isRowApplicableCallable' => function ( $ctx, $rc ) {
- return $rc->getAttribute( 'rc_source' ) === RecentChange::SRC_CATEGORIZE;
+ return $rc->getAttribute( 'rc_patrolled' );
},
],
[
- 'name' => 'hidelog',
- 'label' => 'rcfilters-filter-logactions-label',
- 'description' => 'rcfilters-filter-logactions-description',
+ 'name' => 'hideunpatrolled',
+ 'label' => 'rcfilters-filter-unpatrolled-label',
+ 'description' => 'rcfilters-filter-unpatrolled-description',
'default' => false,
'queryCallable' => function ( $specialClassName, $ctx, $dbr, &$tables, &$fields, &$conds,
&$query_options, &$join_conds ) {
- $conds[] = 'rc_type != ' . $dbr->addQuotes( RC_LOG );
+ $conds[] = 'rc_patrolled = 1';
},
- 'cssClassSuffix' => 'src-mw-log',
+ 'cssClassSuffix' => 'unpatrolled',
'isRowApplicableCallable' => function ( $ctx, $rc ) {
- return $rc->getAttribute( 'rc_source' ) === RecentChange::SRC_LOG;
- }
+ return !$rc->getAttribute( 'rc_patrolled' );
+ },
],
],
- ],
+ ]
+ ];
+
+ $this->hideCategorizationFilterDefinition = [
+ 'name' => 'hidecategorization',
+ 'label' => 'rcfilters-filter-categorization-label',
+ 'description' => 'rcfilters-filter-categorization-description',
+ // rcshowhidecategorization-show, rcshowhidecategorization-hide.
+ // wlshowhidecategorization
+ 'showHideSuffix' => 'showhidecategorization',
+ 'default' => false,
+ 'priority' => -4,
+ 'queryCallable' => function ( $specialClassName, $ctx, $dbr, &$tables, &$fields, &$conds,
+ &$query_options, &$join_conds ) {
+
+ $conds[] = 'rc_type != ' . $dbr->addQuotes( RC_CATEGORIZE );
+ },
+ 'cssClassSuffix' => 'src-mw-categorize',
+ 'isRowApplicableCallable' => function ( $ctx, $rc ) {
+ return $rc->getAttribute( 'rc_source' ) === RecentChange::SRC_CATEGORIZE;
+ },
];
}
}
/**
- * Register all filters and their groups, plus conflicts
+ * Register all filters and their groups (including those from hooks), plus handle
+ * conflicts and defaults.
*
* You might want to customize these in the same method, in subclasses. You can
* call getFilterGroup to access a group, and (on the group) getFilter to access a
protected function registerFilters() {
$this->registerFiltersFromDefinitions( $this->filterGroupDefinitions );
+ // Make sure this is not being transcluded (we don't want to show this
+ // information to all users just because the user that saves the edit can
+ // patrol)
+ if ( !$this->including() && $this->getUser()->useRCPatrol() ) {
+ $this->registerFiltersFromDefinitions( $this->reviewStatusFilterGroupDefinition );
+ }
+
+ $changeTypeGroup = $this->getFilterGroup( 'changeType' );
+
+ if ( $this->getConfig()->get( 'RCWatchCategoryMembership' ) ) {
+ $transformedHideCategorizationDef = $this->transformFilterDefinition(
+ $this->hideCategorizationFilterDefinition
+ );
+
+ $transformedHideCategorizationDef['group'] = $changeTypeGroup;
+
+ $hideCategorization = new ChangesListBooleanFilter(
+ $transformedHideCategorizationDef
+ );
+ }
+
Hooks::run( 'ChangesListSpecialPageStructuredFilters', [ $this ] );
$unstructuredGroupDefinition =
'rcfilters-filter-unregistered-conflicts-user-experience-level'
);
- $changeTypeGroup = $this->getFilterGroup( 'changeType' );
$categoryFilter = $changeTypeGroup->getFilter( 'hidecategorization' );
$logactionsFilter = $changeTypeGroup->getFilter( 'hidelog' );
$pagecreationFilter = $changeTypeGroup->getFilter( 'hidenewpages' );
$significanceTypeGroup = $this->getFilterGroup( 'significance' );
$hideMinorFilter = $significanceTypeGroup->getFilter( 'hideminor' );
- $hideMinorFilter->conflictsWith(
- $categoryFilter,
- 'rcfilters-hideminor-conflicts-typeofchange-global',
- 'rcfilters-hideminor-conflicts-typeofchange',
- 'rcfilters-typeofchange-conflicts-hideminor'
- );
+ // categoryFilter is conditional; see registerFilters
+ if ( $categoryFilter !== null ) {
+ $hideMinorFilter->conflictsWith(
+ $categoryFilter,
+ 'rcfilters-hideminor-conflicts-typeofchange-global',
+ 'rcfilters-hideminor-conflicts-typeofchange',
+ 'rcfilters-typeofchange-conflicts-hideminor'
+ );
+ }
$hideMinorFilter->conflictsWith(
$logactionsFilter,
'rcfilters-hideminor-conflicts-typeofchange-global',
);
}
+ /**
+ * Transforms filter definition to prepare it for constructor.
+ *
+ * See overrides of this method as well.
+ *
+ * @param array $filterDefinition Original filter definition
+ *
+ * @return array Transformed definition
+ */
+ protected function transformFilterDefinition( array $filterDefinition ) {
+ return $filterDefinition;
+ }
+
/**
* Register filters from a definition object
*
* Array specifying groups and their filters; see Filter and
* ChangesListFilterGroup constructors.
*
- * There is light processing to simplify core maintenance. See overrides
- * of this method as well.
+ * There is light processing to simplify core maintenance.
*/
protected function registerFiltersFromDefinitions( array $definition ) {
- $priority = -1;
+ $autoFillPriority = -1;
foreach ( $definition as $groupDefinition ) {
- $groupDefinition['priority'] = $priority;
- $priority--;
+ if ( !isset( $groupDefinition['priority'] ) ) {
+ $groupDefinition['priority'] = $autoFillPriority;
+ } else {
+ // If it's explicitly specified, start over the auto-fill
+ $autoFillPriority = $groupDefinition['priority'];
+ }
+
+ $autoFillPriority--;
$className = $groupDefinition['class'];
unset( $groupDefinition['class'] );
+
+ foreach ( $groupDefinition['filters'] as &$filterDefinition ) {
+ $filterDefinition = $this->transformFilterDefinition( $filterDefinition );
+ }
+
$this->registerFilterGroup( new $className( $groupDefinition ) );
}
}
$query_options, $join_conds, $opts[$filterGroup->getName()] );
} else {
foreach ( $filterGroup->getFilters() as $filter ) {
- if ( $opts[$filter->getName()] && $filter->isAllowed( $this ) ) {
+ if ( $opts[$filter->getName()] ) {
$filter->modifyQuery( $dbr, $this, $tables, $fields, $conds,
$query_options, $join_conds );
}
/**
* @inheritdoc
*/
- protected function registerFiltersFromDefinitions( array $definition ) {
- foreach ( $definition as $groupName => &$groupDefinition ) {
- foreach ( $groupDefinition['filters'] as &$filterDefinition ) {
- if ( isset( $filterDefinition['showHideSuffix'] ) ) {
- $filterDefinition['showHide'] = 'rc' . $filterDefinition['showHideSuffix'];
- }
- }
+ protected function transformFilterDefinition( array $filterDefinition ) {
+ if ( isset( $filterDefinition['showHideSuffix'] ) ) {
+ $filterDefinition['showHide'] = 'rc' . $filterDefinition['showHideSuffix'];
}
- parent::registerFiltersFromDefinitions( $definition );
+ return $filterDefinition;
}
/**
$hideBots->setDefault( true );
$reviewStatus = $this->getFilterGroup( 'reviewStatus' );
- $hidePatrolled = $reviewStatus->getFilter( 'hidepatrolled' );
- $hidePatrolled->setDefault( $user->getBoolOption( 'hidepatrolled' ) );
+ if ( $reviewStatus !== null ) {
+ // Conditional on feature being available and rights
+ $hidePatrolled = $reviewStatus->getFilter( 'hidepatrolled' );
+ $hidePatrolled->setDefault( $user->getBoolOption( 'hidepatrolled' ) );
+ }
$changeType = $this->getFilterGroup( 'changeType' );
$hideCategorization = $changeType->getFilter( 'hidecategorization' );
- $hideCategorization->setDefault( $user->getBoolOption( 'hidecategorization' ) );
+ if ( $hideCategorization !== null ) {
+ // Conditional on feature being available
+ $hideCategorization->setDefault( $user->getBoolOption( 'hidecategorization' ) );
+ }
}
/**
/**
* @inheritdoc
*/
- protected function registerFiltersFromDefinitions( array $definition ) {
- foreach ( $definition as $groupName => &$groupDefinition ) {
- foreach ( $groupDefinition['filters'] as &$filterDefinition ) {
- if ( isset( $filterDefinition['showHideSuffix'] ) ) {
- $filterDefinition['showHide'] = 'wl' . $filterDefinition['showHideSuffix'];
- }
- }
+ protected function transformFilterDefinition( array $filterDefinition ) {
+ if ( isset( $filterDefinition['showHideSuffix'] ) ) {
+ $filterDefinition['showHide'] = 'wl' . $filterDefinition['showHideSuffix'];
}
- parent::registerFiltersFromDefinitions( $definition );
+ return $filterDefinition;
}
/**
$hideLiu->setDefault( $user->getBoolOption( 'watchlisthideliu' ) );
$reviewStatus = $this->getFilterGroup( 'reviewStatus' );
- $hidePatrolled = $reviewStatus->getFilter( 'hidepatrolled' );
- $hidePatrolled->setDefault( $user->getBoolOption( 'watchlisthidepatrolled' ) );
+ if ( $reviewStatus !== null ) {
+ // Conditional on feature being available and rights
+ $hidePatrolled = $reviewStatus->getFilter( 'hidepatrolled' );
+ $hidePatrolled->setDefault( $user->getBoolOption( 'watchlisthidepatrolled' ) );
+ }
$authorship = $this->getFilterGroup( 'authorship' );
$hideMyself = $authorship->getFilter( 'hidemyself' );
$changeType = $this->getFilterGroup( 'changeType' );
$hideCategorization = $changeType->getFilter( 'hidecategorization' );
- $hideCategorization->setDefault( $user->getBoolOption( 'watchlisthidecategorization' ) );
+ if ( $hideCategorization !== null ) {
+ // Conditional on feature being available
+ $hideCategorization->setDefault( $user->getBoolOption( 'watchlisthidecategorization' ) );
+ }
}
/**
"login": "گیریش",
"login-security": "کیملیگینیزی تائید ائدین",
"nav-login-createaccount": "گیریش / حساب یارات",
- "userlogin": "گیریش / حساب یارات",
- "userloginnocreate": "گیریش",
"logout": "چیخیش",
"userlogout": "چیخیش",
"notloggedin": "گیرمهمیسینیز",
"userlogin-noaccount": "حسابینیز یوخدورمو؟",
"userlogin-joinproject": "{{SITENAME}}-ه قوشولون",
- "nologin": "حسابینیز یوخدومو؟ $1.",
- "nologinlink": "حساب یارات",
"createaccount": "حساب یارات",
- "gotaccount": "اؤنجهدن حسابینیز وارمی؟ $1.",
- "gotaccountlink": "گیریش",
- "userlogin-resetlink": "گیریش بیلگیلرینیزی اونوتموسونوز؟",
"userlogin-resetpassword-link": "رمزینیزی اونوتموسوز مو؟",
"userlogin-helplink2": "گیریش ایله کؤمک",
"userlogin-loggedin": "سیر حال حاضیردا {{GENDER:$1|$1}} عونوانیندا گیریش ائدیب سیز.\nآشاغیداکی فورمودان بیر آیری ایشلدن عونوانیندا گیریش اوچون ایشلدین.",
"createacct-another-email-ph": "ایمیل آدرسینیزی یازین",
"createaccountmail": "بیر گئچیجی راستگله رمز ایشلت و اونو آشاغیدا بللندیرن ایمیل آدرسینه گؤندر",
"createacct-realname": "دوغرو آد (ایستگه باغلی)",
- "createaccountreason": "نَدَنلیک:",
"createacct-reason": "سبب",
"createacct-reason-ph": "ندن سیز باشقا حساب یارادیرسینیز",
"createacct-reason-help": "حساب یاراتماق لیستینده گؤستریلن مساژ",
"savearticle": "صفحهنی ذخیره ائت",
"savechanges": "دَییشیکلیکلری ذخیره ائت",
"publishpage": "صفحهنی یاییملا",
- "publishchanges": "دَییشیکلیکلری یاییملا",
+ "publishchanges": "دَییشیکلیکلری یای",
"preview": "اؤنگؤستریش",
"showpreview": "سیناق گؤستریش",
"showdiff": "دَییشیکلیکلری گؤستر",
"log-name-managetags": "اِتیکت ایداره گئچمیشی",
"log-name-tag": "اِتیکت ژورنالی",
"rightsnone": "(هئچ)",
- "revdelete-summary": "دَییشدیرمه قیساسی",
"feedback-adding": "صحیفهیه گئری-بیلدیریم آرتیریلیر...",
"feedback-back": "دالی",
"feedback-bugcheck": "گؤزل! فقط لوطفاً باخین او [$1 تانینمیش خطالار]دان اولماسین.",
"newimages-summary": "Гэтая спэцыяльная старонка паказвае нядаўна загружаныя файлы.",
"newimages-legend": "Фільтар",
"newimages-label": "Назва файла (альбо яе частка):",
+ "newimages-user": "IP-адрас ці імя ўдзельніка",
"newimages-showbots": "Паказаць загружаныя робатамі",
"newimages-hidepatrolled": "Схаваць патруляваныя загрузкі",
"noimages": "Выявы адсутнічаюць.",
"logentry-import-interwiki": "$1 অন্য একটি উইকিতে থেকে $3 {{GENDER:$2|আমদানি করেছে}}",
"logentry-import-interwiki-details": "$1 $5 থেকে $3 {{GENDER:$2|আমদানি করেছেন}} ($4টি {{PLURAL:$4|সংশোধন}})",
"logentry-merge-merge": "$1 $4-এ $3 {{GENDER:$2|একত্রীকরণ করেছেন}} ($5 তারিখের সংশোধন পর্যন্ত)",
- "logentry-move-move": "$1 ব্যবহারকারী $3 পাতাটিকে $4 শিরোনামে {{GENDER:$2|স্থানান্তর}} করেছেন",
- "logentry-move-move-noredirect": "$1 ব্যবহারকারী $3 পাতাটিকে $4 শিরোনামে কোনো পুনর্নির্দেশনা ছাড়াই {{GENDER:$2|স্থানান্তর}} করেছেন",
- "logentry-move-move_redir": "$1 ব্যবহারকারী $3 পাতাটিকে $4 শিরোনামে পুনির্নির্দেশনার মাধ্যমে {{GENDER:$2|স্থানান্তর}} করেছেন",
- "logentry-move-move_redir-noredirect": "$1 ব্যবহারকারী $3 পাতাটিকে $4 শিরোনামে পুনর্নির্দেশনা ছাড়াই {{GENDER:$2|স্থানান্তর}} করেছেন",
+ "logentry-move-move": "$1 $3 কে $4 শিরোনামে {{GENDER:$2|স্থানান্তর}} করেছেন",
+ "logentry-move-move-noredirect": "$1 $3 পাতাটিকে $4 শিরোনামে কোনো পুনর্নির্দেশনা ছাড়াই {{GENDER:$2|স্থানান্তর}} করেছেন",
+ "logentry-move-move_redir": "$1 $3 পাতাটিকে $4 শিরোনামে পুনির্নির্দেশনার মাধ্যমে {{GENDER:$2|স্থানান্তর}} করেছেন",
+ "logentry-move-move_redir-noredirect": "$1 $3 পাতাটিকে $4 শিরোনামে পুনর্নির্দেশনা ছাড়াই {{GENDER:$2|স্থানান্তর}} করেছেন",
"logentry-patrol-patrol": "$1 ব্যবহারকারী $3 পাতার $4 নম্বর সংস্করণ পরীক্ষিত বলে {{GENDER:$2|চিহ্নিত}} করেছেন",
"logentry-patrol-patrol-auto": "$1 ব্যবহারকারী স্বয়ংক্রিয়ভাবে $3 পাতার $4 নম্বর সংস্করণ পরীক্ষিত বলে {{GENDER:$2|চিহ্নিত}} করেছেন",
"logentry-newusers-newusers": "$1 ব্যবহারকারী অ্যাকাউন্টটি {{GENDER:$2|তৈরি করা}} হয়েছে",
"restrictionsfield-label": "অনুমোদিত আইপি পরিসীমা:",
"restrictionsfield-help": "লাইন প্রতি একটি আইপি ঠিকানা বা CIDR পরিসীমা। সবকিছু সক্রিয় করতে ব্যবহার করুন: :<pre>0.0.0.0/0\n::/0</pre>",
"revid": "সংশোধন $1",
- "pageid": "পাতার আইডি $1"
+ "pageid": "পাতার আইডি $1",
+ "rawhtml-notallowed": "<html> ট্যাগ স্বাভাবিক পৃষ্ঠাগুলির বাহিরে ব্যবহার করা যাবে না।"
}
"restrictionsfield-label": "Lijorennoù IP aotreet :",
"restrictionsfield-help": "Ur chomlec'h IP pe un esaouenn CIDR dre linenn. Evit gweredekaat pep tra, ober gant <pre>0.0.0.0/0\n::/0</pre>",
"revid": "Adweladenn $1",
- "pageid": "ID ar bajenn $1"
+ "pageid": "ID ar bajenn $1",
+ "rawhtml-notallowed": "N'hall an tikedennoù <html> bezañ implijet nemet er pajennoù normal."
}
"restrictionsfield-label": "Erlaubte IP-Adressbereiche:",
"restrictionsfield-help": "Eine IP-Adresse oder ein CIDR-Bereich pro Zeile. Um alles zu aktivieren, verwende:\n<pre>\n0.0.0.0/0\n::/0\n</pre>",
"revid": "Version $1",
- "pageid": "Seitenkennung $1"
+ "pageid": "Seitenkennung $1",
+ "rawhtml-notallowed": "<html>-Tags können nicht außerhalb von normalen Seiten verwendet werden."
}
"savearticle": "Perre qeyd ke",
"savechanges": "Vırnayışan qeyd kerê",
"publishpage": "Riperri bare ke",
- "publishchanges": "Vırnayışan aşkera ke",
+ "publishchanges": "Vırnayışan qeyd ke",
"preview": "Verqayt",
"showpreview": "Verasayışi bımocne",
"showdiff": "Vurnayışan bımotne",
"login": "प्रवेश (लगईन)",
"login-security": "तमरो पहिचान जाचँ गर",
"nav-login-createaccount": "प्रवेश गर्ने/नयाँ खाता बनाउन्या",
- "userlogin": "प्रवेश गर्ने / नयाँ खाता बनाउन्या",
- "userloginnocreate": "प्रवेश",
"logout": "बाहिर निस्कन्या",
"userlogout": "बाहिर निस्कन्या",
"notloggedin": "प्रवेश (लग ईन) नगरिएको",
"userlogin-noaccount": "के खाता छैन ?",
"userlogin-joinproject": "{{SITENAME}} मी खाता खोल ।",
- "nologin": "तमरो खाता छैन? $1।",
- "nologinlink": "नयाँ खाता खोल",
"createaccount": "खाता खोल",
- "gotaccount": "तमरो खाता छनोई छ? $1।",
- "gotaccountlink": "प्रवेश",
- "userlogin-resetlink": "प्रवेश सम्बन्धी विवरणहरू बिसरया भयो?",
"userlogin-resetpassword-link": "पासवर्ड भुलिगया?",
"userlogin-helplink2": "प्रवेश गद्दलाई सहयोग",
"userlogin-loggedin": "तमी {{GENDER:$1|$1}}को रूपमी प्रवेश (लग इन) भइ सक्यौ ।\nअर्को प्रयोगकर्ताको रूपमी प्रवेश (लग इन) गर्न तलको फारम प्रयोग गर ।",
"createacct-email-ph": "तमरो इमेल ठेगाना भरऽ",
"createacct-another-email-ph": "इमेल ठेगाना भर",
"createacct-realname": "वास्तविक नाम (ऐच्छिक)",
- "createaccountreason": "कारण:",
"createacct-reason": "कारण",
"createacct-reason-ph": "क्याई तम नयाँ खाता खोल्ला छौ?",
"createacct-submit": "तमरो खाता बनाऽ",
"newimages": "नौला फाइलहरूको ग्यालरी",
"imagelisttext": " '''$1''' {{PLURAL:$1|फाइल|फाइलहरू}} को निम्न सुची ,क्रमवद्ध $2.",
"newimages-summary": "यै खास पानाले अन्तिम अपलोड गर्याका फाइलहरू धेकाउँन्छ ।",
+ "newimages-user": "आइपी(IP) ठेगाना या प्रयोगकर्ता नाउँ",
"days": "{{PLURAL:$1|$1 दिन|$1 दिनहरू}}",
"metadata": "मेटाडेटा",
"metadata-help": "यै फाइलमि अतिरिक्त जानकारीहरू छन्, यैलाई बणुउन सम्भवतः डिजिटल क्यामरा और स्क्यानर प्रयोग गरियाको हुनसकन्छ । यदि यै फाइललाई खास अवस्थाबठे फेरबदल गरियाको हो भण्या यै फाइलले सब्बै विवरण प्रतिबिम्बित गद्द सक्यानाइथी ।",
"post-expand-template-argument-warning": "Aviso: Esta página contiene al menos un parámetro de plantilla con un tamaño de expansión demasiado grande.\nSe han descartado esos parámetros.",
"post-expand-template-argument-category": "Páginas que contienen plantillas con parámetros descartados",
"parser-template-loop-warning": "Se ha detectado un bucle de plantilla: [[$1]]",
+ "template-loop-category": "Páginas con bucles de plantillas",
+ "template-loop-category-desc": "Esta página contiene un bucle de plantillas, es decir, una plantilla que se llama a sí misma recursivamente.",
"parser-template-recursion-depth-warning": "Se ha superado el límite de profundidad de la recursividad de plantillas ($1)",
"language-converter-depth-warning": "Se ha superado el límite de profundidad del convertidor de idioma ($1)",
"node-count-exceeded-category": "Páginas que sobrepasan la cantidad de nodos",
"restrictionsfield-label": "Plages IP autorisées :",
"restrictionsfield-help": "Une adresse IP ou une plage CIDR par ligne. Pour tout activer, utiliser <pre>0.0.0.0/0\n::/0</pre>",
"revid": "version $1",
- "pageid": "ID de page $1"
+ "pageid": "ID de page $1",
+ "rawhtml-notallowed": "Les balises <html> ne peuvent pas être utilisées en dehors des pages normales."
}
"restrictionsfield-label": "טווחי כתובות IP מותרים:",
"restrictionsfield-help": "כתובת IP אחת או טווח CIDR אחד בשורה. כדי לאפשר את הכול, ניתן להשתמש ב:<pre>0.0.0.0/0\n::/0</pre>",
"revid": "גרסה $1",
- "pageid": "מזהה דף $1"
+ "pageid": "מזהה דף $1",
+ "rawhtml-notallowed": "לא ניתן להשתמש בתגיות <html> מחוץ לדפים רגילים."
}
"restrictionsfield-label": "Intervalli IP consentiti:",
"restrictionsfield-help": "Un indirizzo IP o intervallo CIDR per linea. Per consentire tutto, utilizza:<pre>0.0.0.0/0\n::/0</pre>",
"revid": "versione $1",
- "pageid": "ID della pagina $1"
+ "pageid": "ID della pagina $1",
+ "rawhtml-notallowed": "I tag <html> non possono essere utilizzati al di fuori delle normali pagine."
}
"recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (uga deleng [[Special:NewPages|pratélaning kaca-kaca anyar]])",
"recentchanges-legend-plusminus": "(''±123'')",
"recentchanges-submit": "Tuduhaké",
+ "rcfilters-activefilters": "Saringan murub",
+ "rcfilters-restore-default-filters": "Pulihaké saringan gawan",
+ "rcfilters-search-placeholder": "Saring owah-owahan anyar (lurua utawa wiwita ngetik)",
+ "rcfilters-invalid-filter": "Saringan ora sah",
+ "rcfilters-filterlist-title": "Saringan",
+ "rcfilters-filterlist-feedbacklink": "Wènèhi saran ngenani saringan (béta) singa anyar",
+ "rcfilters-filterlist-noresults": "Saringan ora katemu",
"rcnotefrom": "Ing ngisor iki owah-owahan wiwit <strong>$2</strong> (kapacak nganti <strong>$1</strong> owah-owahan).",
"rclistfrom": "Tuduhaké owah-owahan anyar kawit $2, $3",
"rcshowhideminor": "$1 besutan cilik",
"newimages-summary": "Оваа службена страница ги покажува скоро подигнатите податотеки.",
"newimages-legend": "Филтрирај",
"newimages-label": "Име на податотека (или дел од името):",
+ "newimages-user": "IP-адреса или корисничко име",
"newimages-showbots": "Прикажувај подигања од ботови",
"newimages-hidepatrolled": "Сокриј испатролриани подигања",
"noimages": "Нема ништо.",
"restrictionsfield-label": "Допуштени IP-опсези:",
"restrictionsfield-help": "Една IP-адреса или CIDR-опсег по ред. За да овозможите сè, користете<br /><code>0.0.0.0/0</code><br /><code>::/0</code>",
"revid": "преработка $1",
- "pageid": "назнака на страницата $1"
+ "pageid": "назнака на страницата $1",
+ "rawhtml-notallowed": "<html>-ознаките не може да се користат вон нормалните страници."
}
"post-expand-template-argument-warning": "Uwaga – strona zawiera co najmniej jeden argument szablonu, który po rozwinięciu jest zbyt duży.\nArgument ten będzie pominięty.",
"post-expand-template-argument-category": "Strony, w których użyto szablon z pominięciem argumentów",
"parser-template-loop-warning": "Wykryto pętlę w szablonie [[$1]]",
+ "template-loop-category": "Strony z pętlami szablonów",
"template-loop-category-desc": "Strona zawiera pętlę szablonów, czyli szablon, który wywołuje sam siebie rekursywnie.",
"parser-template-recursion-depth-warning": "Przekroczno limit głębokości rekurencji szablonu ($1)",
"language-converter-depth-warning": "Przekroczono ograniczenie ($1) głębokości zagnieżdżenia konwersji językowej",
"restrictionsfield-label": "Dozwolone zakresy adresów IP:",
"restrictionsfield-help": "Jeden adres IP lub zakres CIDR w wierszu. Aby zaznaczyć wszystkie, użyj:<pre>0.0.0.0/0\n::/0</pre>",
"revid": "wersja $1",
- "pageid": "ID strony: $1"
+ "pageid": "ID strony: $1",
+ "rawhtml-notallowed": "Znaczniki <html> nie mogą być stosowane poza zwykłymi stronami."
}
"restrictionsfield-label": "Dovoljeni IP-obsegi:",
"restrictionsfield-help": "En IP-naslov ali CIDR-območje na vrstico. Da omogočite vse, uporabite:\n<pre>0.0.0.0/0\n::/0</pre>",
"revid": "redakcija $1",
- "pageid": "ID strani $1"
+ "pageid": "ID strani $1",
+ "rawhtml-notallowed": "Oznak <html> ni možno uporabljati izven normalnih strani."
}
"restrictionsfield-label": "Tillåtna IP-intervall:",
"restrictionsfield-help": "En IP-adress eller CIDR-intervall per rad. För att aktivera allting, använd<br /><code>0.0.0.0/0</code><br /><code>::/0</code>",
"revid": "sidversion $1",
- "pageid": "sid-ID $1"
+ "pageid": "sid-ID $1",
+ "rawhtml-notallowed": "<html>-taggar kan inte användas utanför normala sidor."
}
},
"tog-underline": "Bağlantıların altını çizme:",
"tog-hideminor": "Son değişiklikler sayfasında küçük düzenlemeleri gizle",
- "tog-hidepatrolled": "Son değişikliklerdeki devriyenin gördüğü düzenlemeleri gizle",
+ "tog-hidepatrolled": "Son değişiklikler sayfasında devriyenin gördüğü düzenlemeleri gizle",
"tog-newpageshidepatrolled": "Yeni sayfalar listesinde devriyenin gördüğü sayfaları gizle",
"tog-hidecategorization": "Sayfa kategorilendirmesini gizle",
"tog-extendwatchlist": "İzleme listesini sadece en son değil, tüm değişiklikleri gösterecek şekilde genişlet",
"tog-watchdeletion": "Sildiğim sayfaları ve dosyaları izleme listeme ekle",
"tog-watchuploads": "Yüklediğim yeni dosyaları izleme listeme ekle",
"tog-watchrollback": "Eski hâline getirdiğim sayfaları izleme listeme ekle",
- "tog-minordefault": "Varsayılan olarak, bütün düzenlemeleri küçük düzenleme olarak işaretle",
- "tog-previewontop": "Ön izlemeyi, düzenleme kutusunun öncesinde göster",
- "tog-previewonfirst": "İlk düzenlemede ön izlemeyi göster",
+ "tog-minordefault": "Tüm düzenlemeleri varsayılan olarak küçük düzenleme olarak işaretle",
+ "tog-previewontop": "Düzenleme kutusu öncesinde önizleme göster",
+ "tog-previewonfirst": "İlk düzenlemede önizleme göster",
"tog-enotifwatchlistpages": "İzleme listemdeki bir sayfa veya dosya değiştirilirse bana e-posta gönder",
"tog-enotifusertalkpages": "Kullanıcı mesaj sayfamda değişiklik olduğunda bana e-posta gönder",
- "tog-enotifminoredits": "Sayfalardaki ve dosyalardaki küçük değişikliklerde de bana e-posta gönder",
- "tog-enotifrevealaddr": "Bildirim postalarında benim eposta adresimi açıkça göster",
+ "tog-enotifminoredits": "Sayfalardaki ve dosyalardaki küçük düzenlemelerde de bana e-posta gönder",
+ "tog-enotifrevealaddr": "Bildirim e-postalarında e-posta adresimi açıkça göster",
"tog-shownumberswatching": "İzleyen kullanıcı sayısını göster",
"tog-oldsig": "Mevcut imzanız:",
- "tog-fancysig": "İmzaya vikimetin muamelesi yap (otomatik bir bağlantı olmadan)",
- "tog-uselivepreview": "Canlı ön izlemeyi kullan",
- "tog-forceeditsummary": "Özeti boş bıraktığımda beni uyar",
- "tog-watchlisthideown": "İzleme listemde benim değişkliklerimi gizle",
- "tog-watchlisthidebots": "İzleme listemde bot değişikliklerini gizle",
- "tog-watchlisthideminor": "İzleme listemde küçük değişiklikleri gizle",
- "tog-watchlisthideliu": "İzleme listemde, kayıtlı kullanıcılar tarafından yapılan değişiklikleri gizle",
- "tog-watchlistreloadautomatically": "Filtre değiştiğinde izleme listesini otomatik yenile (JavaScript gerekir)",
- "tog-watchlisthideanons": "İzleme listemde, anonim kullanıcılar tarafından yapılan değişiklikleri gizle",
- "tog-watchlisthidepatrolled": "İzleme listesinde, devriye görmüş değişiklikleri gizle",
+ "tog-fancysig": "İmzayı viki metni olarak (otomatik bağlantı olmadan) işle",
+ "tog-uselivepreview": "Canlı önizleme kullan",
+ "tog-forceeditsummary": "Boş bir düzenleme özeti girdiğimde bana sor",
+ "tog-watchlisthideown": "Düzenlemelerimi izleme listesinde gizle",
+ "tog-watchlisthidebots": "Bot düzenlemelerini izleme listesinde gizle",
+ "tog-watchlisthideminor": "Küçük düzenlemeleri izleme listesinde gizle",
+ "tog-watchlisthideliu": "Oturum açmış kullanıcıların düzenlemelerini izleme listesinde gizle",
+ "tog-watchlistreloadautomatically": "Her süzgeç değişikliği olduğunda izleme listesini otomatik olarak yeniden yükle (JavaScript gerekir)",
+ "tog-watchlisthideanons": "Anonim kullanıcıların düzenlemelerini izleme listesinde gizle",
+ "tog-watchlisthidepatrolled": "Devriyenin gördüğü düzenlemeleri izleme listesinde gizle",
"tog-watchlisthidecategorization": "Sayfa kategorilendirmesini gizle",
- "tog-ccmeonemails": "Diğer kullanıcılara gönderdiğim e-postaların bir kopyasını bana da gönder",
- "tog-diffonly": "Sayfa içeriğini, sürüm farklarının altında gösterme",
+ "tog-ccmeonemails": "Diğer kullanıcılara gönderdiğim e-postaların kopyalarını bana gönder",
+ "tog-diffonly": "Farkların altında sayfa içeriğini gösterme",
"tog-showhiddencats": "Gizli kategorileri göster",
- "tog-norollbackdiff": "Geri döndürme uygulandıktan sonra farkları gösterme",
- "tog-useeditwarning": "Yaptığım değişiklikleri kaydetmeden sayfayı kapatırken beni uyar",
- "tog-prefershttps": "Oturum açarken her zaman güvenli bağlantı kullanın",
- "underline-always": "Daima",
- "underline-never": "Asla",
- "underline-default": "Tema ya da tarayıcı varsayılanı",
- "editfont-style": "Düzenleme alanının yazı tipi:",
+ "tog-norollbackdiff": "Eski hâline getirdikten sonra farkı gösterme",
+ "tog-useeditwarning": "Bir düzenleme sayfasından değişiklikleri kaydetmeden ayrılırken beni uyar",
+ "tog-prefershttps": "Oturum açıkken her zaman güvenli bir bağlantı kullan",
+ "underline-always": "Her zaman",
+ "underline-never": "Hiçbir zaman",
+ "underline-default": "Görünüm ya da tarayıcı varsayılanı",
+ "editfont-style": "Düzenleme alanının yazı tipi biçemi:",
"editfont-default": "Tarayıcı varsayılanı",
- "editfont-monospace": "Sabit aralıklı yazı tipi",
- "editfont-sansserif": "Çıkıntısız (Sans-serif) yazı tipi",
- "editfont-serif": "Çıkıntılı (serif) yazı tipi",
+ "editfont-monospace": "Tek aralıklı yazı tipi",
+ "editfont-sansserif": "Sans-serif yazı tipi",
+ "editfont-serif": "Serif yazı tipi",
"sunday": "Pazar",
"monday": "Pazartesi",
"tuesday": "Salı",
"december-date": "$1 Aralık",
"period-am": "ÖÖ",
"period-pm": "ÖS",
- "pagecategories": "{{PLURAL:$1|Kategori|Kategoriler}}",
+ "pagecategories": "$1 kategori",
"category_header": "\"$1\" kategorisindeki sayfalar",
"subcategories": "Alt kategoriler",
- "category-media-header": "\"$1\" kategorisindeki dosyalar",
- "category-empty": "<em>Bu kategoride henüz herhangi bir sayfa ya da dosya bulunmamaktadır.</em>",
- "hidden-categories": "{{PLURAL:$1|Gizli kategori|Gizli kategoriler}}",
+ "category-media-header": "\"$1\" kategorisindeki ortamlar",
+ "category-empty": "<em>Şu anda bu kategoride herhangi bir sayfa ya da Ortam bulunmuyor.</em>",
+ "hidden-categories": "$1 gizli kategori",
"hidden-category-category": "Gizli kategoriler",
- "category-subcat-count": "{{PLURAL:$2|Bu kategori sadece aşağıdaki alt kategoriyi içermektedir.|Bu kategoride aşağıdaki {{PLURAL:$1|alt kategori|$1 alt kategori}} dahil $2 alt kategori vardır.}}",
+ "category-subcat-count": "{{PLURAL:$2|Bu kategori sadece aşağıdaki alt kategoriyi içermektedir.|Bu kategoride aşağıdaki $1 alt kategori dâhil toplam $2 alt kategori vardır.}}",
"category-subcat-count-limited": "Bu kategori aşağıdaki {{PLURAL:$1|alt kategoriye|$1 alt kategoriye}} sahiptir.",
"category-article-count": "{{PLURAL:$2|Bu kategori sadece aşağıdaki sayfayı içermektedir.|Toplam $2 taneden, aşağıdaki {{PLURAL:$1|sayfa|$1 sayfa}} bu kategoridedir.}}",
"category-article-count-limited": "Bu kategoride {{PLURAL:$1|sayfa|$1 sayfa}} bulunmaktadır.",
"post-expand-template-argument-warning": "'''Увага:''' Ця сторінка містить принаймні один аргумент шаблону, який має надто великий розмір для розгортання.\nЦі аргументи були проігноровані.",
"post-expand-template-argument-category": "Сторінки, які містять пропущені аргументи шаблонів",
"parser-template-loop-warning": "Виявлена петля у шаблонах: [[$1]]",
+ "template-loop-category": "Сторінки з петлями шаблонів",
+ "template-loop-category-desc": "Ця сторінка містить петлю шаблонів, тобто шаблон, який рекурсивно викликає сам себе.",
"parser-template-recursion-depth-warning": "Перевищене обмеження глибини рекурсії шаблону ($1)",
"language-converter-depth-warning": "Перевищене обмеження глибини мовного конвертора ($1)",
"node-count-exceeded-category": "Сторінки, на яких перевищено лічильник вузлів",
"page_first": "перша",
"page_last": "остання",
"histlegend": "Вибір версії: Позначте у круглих віконцях версії для порівняння і натисніть «Enter» або кнопку внизу.\n\nПояснення: (поточн.) = відмінності від поточної версії,\n(ост.) = відмінності від попередньої версії, '''м''' = незначне редагування",
- "history-fieldset-title": "Ð\9fеÑ\80еглÑ\8fнÑ\83Ñ\82и Ñ\96Ñ\81Ñ\82оÑ\80Ñ\96Ñ\8e",
- "history-show-deleted": "ТÑ\96лÑ\8cки вилÑ\83Ñ\87енÑ\96",
+ "history-fieldset-title": "Ð\9fоÑ\88Ñ\83к веÑ\80Ñ\81Ñ\96й",
+ "history-show-deleted": "Ð\9bиÑ\88е вилÑ\83Ñ\87енÑ\96 веÑ\80Ñ\81Ñ\96Ñ\97",
"histfirst": "найдавніші",
"histlast": "найновіші",
"historysize": "($1 {{PLURAL:$1|байт|байти|байтів}})",
"prefs-help-prefershttps": "Цей параметр набуде чинності при вашому наступному вході у систему.",
"prefswarning-warning": "Ви внесли в свої налаштування зміни, які ще не були збережені.\nЯкщо ви залишите цю сторінку, не натиснувши \"$1\", налаштування не будуть оновлені.",
"prefs-tabs-navigation-hint": "Порада: Ви можете використовувати клавіші стрілок вліво і вправо для переходу між вкладками в списку вкладок.",
- "userrights": "Ð\9aеÑ\80Ñ\83ваннÑ\8f пÑ\80авами користувачів",
+ "userrights": "Ð\9fÑ\80ава користувачів",
"userrights-lookup-user": "Виберіть користувача",
"userrights-user-editname": "Введіть ім'я користувача:",
"editusergroup": "Завантажити групи користувачів",
"rcfilters-invalid-filter": "Недійсний фільтр",
"rcfilters-empty-filter": "Без фільтрів. Показано всі зміни.",
"rcfilters-filterlist-title": "Фільтри",
+ "rcfilters-filterlist-whatsthis": "Що це?",
"rcfilters-filterlist-feedbacklink": "Надайте відгук про нові (бета) фільтри",
"rcfilters-highlightbutton-title": "Виділити результати",
"rcfilters-highlightmenu-title": "Вибрати колір",
"rcfilters-highlightmenu-help": "Вибрати колір, щоб виділити цю властивість",
"rcfilters-filterlist-noresults": "Фільтри не знайдено",
+ "rcfilters-noresults-conflict": "Результатів не знайдено через конфлікт у пошукових критеріях",
+ "rcfilters-state-message-subset": "Цей фільтр не має впливу, оскільки його результати включені в результати {{PLURAL:$2|цього, ширшого, фільтра|цих, ширших, фільтрів}} (спробуйте увімкнути виділення, щоб вирізнити їх): $1",
+ "rcfilters-state-message-fullcoverage": "Вибір усіх фільтрів у групі — це все одно, що не вибирати жодного з них, тобто таке фільтрування не має впливу. Гупа містить: $1",
"rcfilters-filtergroup-registration": "Реєстрація користувача",
"rcfilters-filter-registered-label": "Зареєстровані",
"rcfilters-filter-registered-description": "Користувачі, що увійшли в систему.",
"rcfilters-filter-unregistered-label": "Незареєстровані",
"rcfilters-filter-unregistered-description": "Користувачі, які не ввійшли в систему.",
- "rcfilters-filter-unregistered-conflicts-user-experience-level": "ФÑ\96лÑ\8cÑ\82Ñ\80 «Ð\9dезаÑ\80еÑ\94Ñ\81Ñ\82Ñ\80ованÑ\96» неакÑ\82ивний, оÑ\81кÑ\96лÑ\8cки його вплив нÑ\96велÑ\8eÑ\94Ñ\82Ñ\8cÑ\81Ñ\8f {{PLURAL:$2|таким фільтром|такими фільтрами}} досвіду, {{PLURAL:$2|який знаходить|які знаходять}} лише зареєстрованих користувачів: $1",
+ "rcfilters-filter-unregistered-conflicts-user-experience-level": "Цей Ñ\84Ñ\96лÑ\8cÑ\82Ñ\80 конÑ\84лÑ\96кÑ\82Ñ\83Ñ\94 з {{PLURAL:$2|таким фільтром|такими фільтрами}} досвіду, {{PLURAL:$2|який знаходить|які знаходять}} лише зареєстрованих користувачів: $1",
"rcfilters-filtergroup-authorship": "Авторство редагувань",
"rcfilters-filter-editsbyself-label": "Ваші власні редагування",
"rcfilters-filter-editsbyself-description": "Редагування, зроблені Вами.",
"rcfilters-filter-editsbyother-label": "Редагування, зроблені іншими",
"rcfilters-filter-editsbyother-description": "Редагування, виконані іншими користувачами (не Вами).",
"rcfilters-filtergroup-userExpLevel": "Рівень досвіду (тільки для зареєстрованих користувачів)",
- "rcfilters-filtergroup-user-experience-level-conflicts-unregistered": "Цей Ñ\84Ñ\96лÑ\8cÑ\82Ñ\80 неакÑ\82ивний, оÑ\81кÑ\96лÑ\8cки вÑ\96н знаÑ\85одиÑ\82Ñ\8c лиÑ\88е заÑ\80еÑ\94Ñ\81Ñ\82Ñ\80ованиÑ\85 коÑ\80иÑ\81Ñ\82Ñ\83ваÑ\87Ñ\96в, Ñ\82ож Ñ\84Ñ\96лÑ\8cÑ\82Ñ\80 «Ð\9dезаÑ\80еÑ\94Ñ\81Ñ\82Ñ\80ованÑ\96» нÑ\96велÑ\8eÑ\94 його вплив.",
- "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "ФÑ\96лÑ\8cÑ\82Ñ\80 «Ð\9dезаÑ\80еÑ\94Ñ\81Ñ\82Ñ\80ованÑ\96» пеÑ\80ебÑ\83ваÑ\94 в конÑ\84лÑ\96кÑ\82Ñ\96 з одним або бÑ\96лÑ\8cÑ\88е Ñ\84Ñ\96лÑ\8cÑ\82Ñ\80Ñ\96в доÑ\81вÑ\96дÑ\83. ФÑ\96лÑ\8cÑ\82Ñ\80и доÑ\81вÑ\96дÑ\83 знаÑ\85одÑ\8fÑ\82Ñ\8c лиÑ\88е заÑ\80еÑ\94Ñ\81Ñ\82Ñ\80ованиÑ\85 коÑ\80иÑ\81Ñ\82Ñ\83ваÑ\87Ñ\96в. Ð\9aонÑ\84лÑ\96кÑ\82нÑ\96 Ñ\84Ñ\96лÑ\8cÑ\82Ñ\80и познаÑ\87енÑ\96 виÑ\89е Ñ\8fк неакÑ\82ивнÑ\96.",
+ "rcfilters-filtergroup-user-experience-level-conflicts-unregistered": "ФÑ\96лÑ\8cÑ\82Ñ\80и доÑ\81вÑ\96дÑ\83 знаÑ\85одÑ\8fÑ\82Ñ\8c лиÑ\88е заÑ\80еÑ\94Ñ\81Ñ\82Ñ\80ованиÑ\85 коÑ\80иÑ\81Ñ\82Ñ\83ваÑ\87Ñ\96в, Ñ\82ож Ñ\86ей Ñ\84Ñ\96лÑ\8cÑ\82Ñ\80 конÑ\84лÑ\96кÑ\82Ñ\83Ñ\94 з Ñ\84Ñ\96лÑ\8cÑ\82Ñ\80ом «Ð\9dезаÑ\80еÑ\94Ñ\81Ñ\82Ñ\80ованÑ\96».",
+ "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "ФÑ\96лÑ\8cÑ\82Ñ\80 «Ð\9dезаÑ\80еÑ\94Ñ\81Ñ\82Ñ\80ованÑ\96» конÑ\84лÑ\96кÑ\82Ñ\83Ñ\94 з одним або бÑ\96лÑ\8cÑ\88е Ñ\84Ñ\96лÑ\8cÑ\82Ñ\80ами доÑ\81вÑ\96дÑ\83, Ñ\8fкÑ\96 знаÑ\85одÑ\8fÑ\82Ñ\8c лиÑ\88е заÑ\80еÑ\94Ñ\81Ñ\82Ñ\80ованиÑ\85 коÑ\80иÑ\81Ñ\82Ñ\83ваÑ\87Ñ\96в. Ð\9aонÑ\84лÑ\96кÑ\82нÑ\96 Ñ\84Ñ\96лÑ\8cÑ\82Ñ\80и познаÑ\87енÑ\96 виÑ\89е в дÑ\96лÑ\8fнÑ\86Ñ\96 акÑ\82ивниÑ\85 Ñ\84Ñ\96лÑ\8cÑ\82Ñ\80Ñ\96в.",
"rcfilters-filter-user-experience-level-newcomer-label": "Новачки",
"rcfilters-filter-user-experience-level-newcomer-description": "Менше ніж 10 редагувань і 4 дні активності.",
"rcfilters-filter-user-experience-level-learner-label": "Учні",
"rcfilters-filter-categorization-description": "Записи про додавання або вилучення сторінок з категорій.",
"rcfilters-filter-logactions-label": "Журнальні дії",
"rcfilters-filter-logactions-description": "Адміністративні дії, створення облікових записів, видалення сторінок, завантаження файлів тощо.",
+ "rcfilters-hideminor-conflicts-typeofchange-global": "Фільтр «Незначні редагування» конфліктує з одним або більше фільтрів за типом змін, оскільки певні типи змін не можна позначити як «незначні». Конфліктні фільтри позначені в ділянці активних фільтрів угорі.",
+ "rcfilters-hideminor-conflicts-typeofchange": "Певні типи змін не можна позначити як «незначні», тож цей фільтр конфліктує з такими фільтрами за типом змін: $1",
+ "rcfilters-typeofchange-conflicts-hideminor": "Цей фільтр за типом змін конфліктує з фільтром «Незначні редагування». Певні типи змін не можна позначати як «незначні».",
"rcnotefrom": "Нижче знаходяться {{PLURAL:$5|редагування}} з <strong>$3, $4</strong> (відображено до <strong>$1</strong>).",
"rclistfrom": "Показати редагування починаючи з $3 $2.",
"rcshowhideminor": "$1 незначні редагування",
"newimages-summary": "Ця спеціальна сторінка показує останні завантажені файли.",
"newimages-legend": "Фільтр",
"newimages-label": "Назва файлу (або її частина):",
+ "newimages-user": "IP-адреса або ім'я користувача.",
"newimages-showbots": "Показати завантаження ботами",
"newimages-hidepatrolled": "Приховати відпатрульовані завантаження",
"noimages": "Файли відсутні.",
"restrictionsfield-label": "Дозволені діапазони IP-адрес:",
"restrictionsfield-help": "Одна IP-адреса або CIDR-діапазон на рядок. Щоб увімкнути все, використайте:<pre>0.0.0.0/0\n::/0</pre>",
"revid": "версія $1",
- "pageid": "ID сторінки $1"
+ "pageid": "ID сторінки $1",
+ "rawhtml-notallowed": "Теги <html> не можна використовувати за межами звичайних сторінок."
}
"restrictionsfield-label": "允许的IP段:",
"restrictionsfield-help": "每行一个IP地址或CIDR段。要启用任何地址或地址段,可使用:<pre>0.0.0.0/0\n::/0</pre>",
"revid": "修订版本$1",
- "pageid": "页面ID$1"
+ "pageid": "页面ID$1",
+ "rawhtml-notallowed": "<html>标签不能在一般页面以外使用。"
}
$group = new ChangesListBooleanFilterGroup( $definition );
- $specialPage = $this->getMockBuilder( 'ChangesListSpecialPage' )
- ->setConstructorArgs( [
- 'ChangesListSpecialPage',
- '',
- ] )
- ->getMockForAbstractClass();
-
$this->assertArrayEquals(
[
'name' => 'some-group',
],
],
- $group->getJsData( $specialPage ),
+ $group->getJsData(),
/** ordered= */ false,
/** named= */ true
);
}
public function testIsFeatureAvailableOnStructuredUi() {
- $specialPage = $this->getMockBuilder( 'ChangesListSpecialPage' )
- ->setConstructorArgs( [
- 'ChangesListSpecialPage',
- '',
- ] )
- ->getMockForAbstractClass();
-
$groupA = new ChangesListBooleanFilterGroup( [
'name' => 'groupA',
'priority' => 1,
$this->assertEquals(
true,
- $foo->isFeatureAvailableOnStructuredUi( $specialPage ),
+ $foo->isFeatureAvailableOnStructuredUi(),
'Same filter appears on both'
);
$this->assertEquals(
false,
- $bar->isFeatureAvailableOnStructuredUi( $specialPage ),
+ $bar->isFeatureAvailableOnStructuredUi(),
'Only on unstructured UI'
);
$this->assertEquals(
true,
- $baz->isFeatureAvailableOnStructuredUi( $specialPage ),
+ $baz->isFeatureAvailableOnStructuredUi(),
'Legacy filter does not appear directly in new UI, but equivalent ' .
'does and is marked with isReplacedInStructuredUi'
);
[
'name' => 'foo',
],
- [
- 'name' => 'bar',
- 'isAllowedCallable' => function () {
- return false;
- },
- ],
[
'name' => 'baz',
],
}
public function provideNoOpModifyQuery() {
- $isAllowedFalse = [
- 'isAllowedCallable' => function () {
- return false;
- },
- ];
-
- $allDisallowedFilters = [
- [
- 'name' => 'disallowed1',
- ] + $isAllowedFalse,
-
- [
- 'name' => 'disallowed2',
- ] + $isAllowedFalse,
-
- [
- 'name' => 'disallowed3',
- ] + $isAllowedFalse,
- ];
+ $noFilters = [];
$normalFilters = [
[
return [
[
- $allDisallowedFilters,
+ $noFilters,
'disallowed1;disallowed3',
- 'The queryCallable should not be called if no filters are allowed',
+ 'The queryCallable should not be called if there are no filters',
],
[
$group = new ChangesListStringOptionsFilterGroup( $definition );
- $specialPage = $this->getSpecialPage();
-
$this->assertArrayEquals(
[
'name' => 'some-group',
'foo-description',
],
],
- $group->getJsData( $specialPage ),
+ $group->getJsData(),
/** ordered= */ false,
/** named= */ true
);
*/
protected $changesListSpecialPage;
+ protected $oldPatrollersGroup;
+
protected function setUp() {
+ global $wgGroupPermissions;
+
parent::setUp();
$this->setMwGlobals( 'wgRCWatchCategoryMembership', true );
+
+ if ( isset( $wgGroupPermissions['patrollers'] ) ) {
+ $this->oldPatrollersGroup = $wgGroupPermissions['patrollers'];
+ }
+
+ $wgGroupPermissions['patrollers'] = [
+ 'patrol' => true,
+ ];
+ }
+
+ protected function tearDown() {
+ global $wgGroupPermissions;
+
+ parent::tearDown();
+
+ if ( $this->oldPatrollersGroup !== null ) {
+ $wgGroupPermissions['patrollers'] = $this->oldPatrollersGroup;
+ }
}
/**
* @dataProvider provideParseParameters
*/
public function testParseParameters( $params, $expected ) {
+ $context = $this->changesListSpecialPage->getContext();
+ $context = new DerivativeContext( $context );
+ $context->setUser( $this->getTestUser( [ 'patrollers' ] )->getUser() );
+ $this->changesListSpecialPage->setContext( $context );
+
$this->changesListSpecialPage->registerFilters();
$opts = new FormOptions();
<?php
class MockChangesListFilter extends ChangesListFilter {
- public function displaysOnUnstructuredUi( ChangesListSpecialPage $specialPage ) {
+ public function displaysOnUnstructuredUi() {
throw new MWException(
'Not implemented: If the test relies on this, put it one of the ' .
'subclasses\' tests (e.g. ChangesListBooleanFilterTest) ' .