52 $translateRcFilterDefault = $this->config->get(
'TranslateRcFilterDefault' );
54 if ( $pageName !==
'Recentchanges' || $this->isStructuredFilterUiEnabled() ) {
58 $request = RequestContext::getMain()->getRequest();
59 $translations = $request->getVal(
'translations', $translateRcFilterDefault );
60 $opts->add(
'translations', $translateRcFilterDefault );
61 $opts->setValue(
'translations', $translations );
63 $dbr = $this->dbProvider->getReplicaDatabase();
65 $namespaces = $this->getTranslateNamespaces();
67 if ( $translations ===
'only' ) {
68 $conds[] =
'rc_namespace IN (' . $dbr->makeList( $namespaces ) .
')';
69 $conds[] =
'rc_title like \'%%/%%\'';
70 } elseif ( $translations ===
'filter' ) {
71 $conds[] =
'rc_namespace NOT IN (' . $dbr->makeList( $namespaces ) .
')';
72 } elseif ( $translations ===
'site' ) {
73 $conds[] =
'rc_namespace IN (' . $dbr->makeList( $namespaces ) .
')';
74 $conds[] =
'rc_title not like \'%%/%%\'';
95 if ( $this->isStructuredFilterUiEnabled() ) {
99 $opts->consumeValue(
'translations' );
100 $default = $opts->getValue(
'translations' );
102 $label = Html::label(
103 wfMessage(
'translate-rc-translation-filter' )->text(),
104 'mw-translation-filter'
106 $select =
new XmlSelect(
'translations',
'mw-translation-filter', $default );
108 wfMessage(
'translate-rc-translation-filter-no' )->text(),
111 $select->addOption( wfMessage(
'translate-rc-translation-filter-only' )->text(),
'only' );
113 wfMessage(
'translate-rc-translation-filter-filter' )->text(),
116 $select->addOption( wfMessage(
'translate-rc-translation-filter-site' )->text(),
'site' );
118 $extraOpts[
'translations'] = [ $label, $select->getHTML() ];
136 $translateRcFilterDefault = $this->config->get(
'TranslateRcFilterDefault' );
137 $defaultFilter = $translateRcFilterDefault !==
'noaction' ?
138 $translateRcFilterDefault :
139 ChangesListStringOptionsFilterGroup::NONE;
141 $translationsGroup =
new ChangesListStringOptionsFilterGroup(
143 'name' =>
'translations',
144 'title' =>
'translate-rcfilters-translations',
146 'default' => $defaultFilter,
147 'isFullCoverage' =>
true,
151 'label' =>
'translate-rcfilters-translations-only-label',
152 'description' =>
'translate-rcfilters-translations-only-desc',
153 'cssClassSuffix' =>
'only',
154 'isRowApplicableCallable' =>
function ( IContextSource $ctx, RecentChange $rc ) {
155 $namespaces = $this->getTranslateNamespaces();
157 return in_array( $rc->getAttribute(
'rc_namespace' ), $namespaces ) &&
158 str_contains( $rc->getAttribute(
'rc_title' ),
'/' );
163 'label' =>
'translate-rcfilters-translations-site-label',
164 'description' =>
'translate-rcfilters-translations-site-desc',
165 'cssClassSuffix' =>
'site',
166 'isRowApplicableCallable' =>
function ( IContextSource $ctx, RecentChange $rc ) {
167 $namespaces = $this->getTranslateNamespaces();
169 return in_array( $rc->getAttribute(
'rc_namespace' ), $namespaces ) &&
170 !str_contains( $rc->getAttribute(
'rc_title' ),
'/' );
175 'label' =>
'translate-rcfilters-translations-filter-label',
176 'description' =>
'translate-rcfilters-translations-filter-desc',
177 'cssClassSuffix' =>
'filter',
178 'isRowApplicableCallable' =>
function ( IContextSource $ctx, RecentChange $rc ) {
179 $namespaces = $this->getTranslateNamespaces();
181 return !in_array( $rc->getAttribute(
'rc_namespace' ), $namespaces );
185 'name' =>
'filter-translation-pages',
186 'label' =>
'translate-rcfilters-translations-filter-translation-pages-label',
187 'description' =>
'translate-rcfilters-translations-filter-translation-pages-desc',
188 'cssClassSuffix' =>
'filter-translation-pages',
189 'isRowApplicableCallable' =>
static function ( IContextSource $ctx, RecentChange $rc ) {
190 $tags = explode(
', ', $rc->getAttribute(
'ts_tags' ) ??
'' );
191 return !in_array(
'translate-filter-translation-pages', $tags );
196 'queryCallable' =>
function (
197 string $specialClassName,
199 IReadableDatabase $dbr,
203 array &$query_options,
205 array $selectedValues
207 $fields = array_merge( $fields, [
'rc_title',
'rc_namespace' ] );
210 $filterRenderedIndex = array_search(
'filter-translation-pages', $selectedValues );
211 if ( $filterRenderedIndex !==
false ) {
212 unset( $selectedValues[$filterRenderedIndex] );
213 $selectedValues = array_values( $selectedValues );
215 $changeTagDefStore = MediaWikiServices::getInstance()->getChangeTagDefStore();
217 $renderedPage = $changeTagDefStore->getId(
'translate-translation-pages' );
219 $tables[
'translatetags'] =
'change_tag';
220 $join_conds[
'translatetags'] = [
222 [
'translatetags.ct_rc_id=rc_id',
'translatetags.ct_tag_id' => $renderedPage ]
224 $conds[
'translatetags.ct_tag_id'] =
null;
225 }
catch ( NameTableAccessException ) {
230 $namespaces = $this->getTranslateNamespaces();
231 $inNamespaceCond =
'rc_namespace IN (' .
232 $dbr->makeList( $namespaces ) .
')';
233 $notInNamespaceCond =
'rc_namespace NOT IN (' .
234 $dbr->makeList( $namespaces ) .
')';
236 $onlyCond = $dbr->makeList( [
239 $dbr->buildLike( $dbr->anyString(),
'/', $dbr->anyString() )
241 $siteCond = $dbr->makeList( [
244 $dbr->buildLike( $dbr->anyString(),
'/', $dbr->anyString() )
247 if ( count( $selectedValues ) === 3 ) {
252 if ( $selectedValues === [
'filter',
'only' ] ) {
253 $conds[] = $dbr->makeList( [
260 if ( $selectedValues === [
'filter',
'site' ] ) {
261 $conds[] = $dbr->makeList( [
268 if ( $selectedValues === [
'only',
'site' ] ) {
269 $conds[] = $inNamespaceCond;
273 if ( $selectedValues === [
'filter' ] ) {
274 $conds[] = $notInNamespaceCond;
278 if ( $selectedValues === [
'only' ] ) {
279 $conds[] = $onlyCond;
283 if ( $selectedValues === [
'site' ] ) {
284 $conds[] = $siteCond;
290 $special->registerFilterGroup( $translationsGroup );