19 public function __construct(
21 private readonly LinkBatchFactory $linkBatchFactory,
25 public function getSubpagesPerType(
TranslatableBundle $bundle,
bool $fetchTalkPages ): array {
26 $classifiedSubPages = $this->getEmptyResultSet();
33 $allSubpages = $bundle->
getTitle()->getSubpages();
36 $allSubpagesIndexed = [];
37 foreach ( $allSubpages as $page ) {
38 $allSubpagesIndexed[ $page->getPrefixedDBkey() ] = $page;
42 foreach ( $classifiedSubPages[
'translationPages' ] as $translationPage ) {
43 if ( isset( $allSubpagesIndexed[ $translationPage->getPrefixedDBkey() ] ) ) {
44 unset( $allSubpagesIndexed[ $translationPage->getPrefixedDBkey() ] );
49 foreach ( $allSubpagesIndexed as $index => $subpage ) {
50 if ( $this->bundleFactory->getBundle( $subpage ) ) {
51 $classifiedSubPages[
'translatableSubpages'][] = $subpage;
52 unset( $allSubpagesIndexed[$index] );
57 $allSubpagesIndexed = $this->filterOtherTranslationPages(
58 $allSubpagesIndexed, $classifiedSubPages[
'translatableSubpages']
61 $classifiedSubPages[
'normalSubpages'] = $allSubpagesIndexed;
63 if ( $fetchTalkPages && !$bundle->
getTitle()->isTalkPage() ) {
65 $talkPages = $this->getTalkPages(
68 $classifiedSubPages[
'translationPages'],
69 $classifiedSubPages[
'translationUnitPages'],
70 $classifiedSubPages[
'normalSubpages']
74 $translatableTalkPages = [];
75 foreach ( $talkPages as $key => $talkPage ) {
76 if ( $talkPage ===
null ) {
80 if ( $this->bundleFactory->getBundle( $talkPage ) ) {
81 $translatableTalkPages[] = $talkPage;
82 unset( $talkPages[$key] );
86 $classifiedSubPages[
'talkPages'] = $talkPages;
87 $classifiedSubPages[
'translatableTalkPages'] = $translatableTalkPages;
90 return $classifiedSubPages;
93 public function getEmptyResultSet(): array {
95 'translationPages' => [],
96 'translatableSubpages' => [],
97 'translationUnitPages' => [],
98 'normalSubpages' => [],
100 'translatableTalkPages' => []
109 private function filterOtherTranslationPages( array $allPages, array $translatablePages ): array {
110 $mappedTranslatablePages = [];
111 foreach ( $translatablePages as $index => $page ) {
112 $mappedTranslatablePages[ $page->getText() ] = $index;
115 foreach ( $allPages as $prefixedDbKeyTitle => $subpage ) {
117 if ( isset( $mappedTranslatablePages[ $key ] ) ) {
118 unset( $allPages[ $prefixedDbKeyTitle ] );
132 private function getTalkPages( array $pages ): array {
133 $lb = $this->linkBatchFactory->newLinkBatch();
136 foreach ( $pages as $page ) {
137 $talkPage = $page->getTalkPageIfDefined();
138 $talkPageList[ $page->getPrefixedDBkey() ] = $talkPage;
140 $lb->addObj( $talkPage );
144 $lb->setCaller( __METHOD__ )->execute();
145 foreach ( $talkPageList as $index => $talkPage ) {
146 if ( !$talkPage || !$talkPage->exists() ) {
147 $talkPageList[$index] =
null;
151 return $talkPageList;