19 private $bundleFactory;
21 private $linkBatchFactory;
23 public function __construct(
25 LinkBatchFactory $linkBatchFactory
27 $this->bundleFactory = $bundleFactory;
28 $this->linkBatchFactory = $linkBatchFactory;
31 public function getSubpagesPerType(
TranslatableBundle $bundle,
bool $fetchTalkPages ): array {
32 $classifiedSubPages = $this->getEmptyResultSet();
39 $allSubpages = $bundle->
getTitle()->getSubpages();
42 $allSubpagesIndexed = [];
43 foreach ( $allSubpages as $page ) {
44 $allSubpagesIndexed[ $page->getPrefixedDBkey() ] = $page;
48 foreach ( $classifiedSubPages[
'translationPages' ] as $translationPage ) {
49 if ( isset( $allSubpagesIndexed[ $translationPage->getPrefixedDBkey() ] ) ) {
50 unset( $allSubpagesIndexed[ $translationPage->getPrefixedDBkey() ] );
55 foreach ( $allSubpagesIndexed as $index => $subpage ) {
56 if ( $this->bundleFactory->getBundle( $subpage ) ) {
57 $classifiedSubPages[
'translatableSubpages'][] = $subpage;
58 unset( $allSubpagesIndexed[$index] );
63 $allSubpagesIndexed = $this->filterOtherTranslationPages(
64 $allSubpagesIndexed, $classifiedSubPages[
'translatableSubpages']
67 $classifiedSubPages[
'normalSubpages'] = $allSubpagesIndexed;
69 if ( $fetchTalkPages && !$bundle->
getTitle()->isTalkPage() ) {
71 $talkPages = $this->getTalkPages(
74 $classifiedSubPages[
'translationPages'],
75 $classifiedSubPages[
'translationUnitPages'],
76 $classifiedSubPages[
'normalSubpages']
80 $translatableTalkPages = [];
81 foreach ( $talkPages as $key => $talkPage ) {
82 if ( $talkPage ===
null ) {
86 if ( $this->bundleFactory->getBundle( $talkPage ) ) {
87 $translatableTalkPages[] = $talkPage;
88 unset( $talkPages[$key] );
92 $classifiedSubPages[
'talkPages'] = $talkPages;
93 $classifiedSubPages[
'translatableTalkPages'] = $translatableTalkPages;
96 return $classifiedSubPages;
99 public function getEmptyResultSet(): array {
101 'translationPages' => [],
102 'translatableSubpages' => [],
103 'translationUnitPages' => [],
104 'normalSubpages' => [],
106 'translatableTalkPages' => []
115 private function filterOtherTranslationPages( array $allPages, array $translatablePages ): array {
116 $mappedTranslatablePages = [];
117 foreach ( $translatablePages as $index => $page ) {
118 $mappedTranslatablePages[ $page->getText() ] = $index;
121 foreach ( $allPages as $prefixedDbKeyTitle => $subpage ) {
122 [ $key, ] = Utilities::figureMessage( $subpage->getText() );
123 if ( isset( $mappedTranslatablePages[ $key ] ) ) {
124 unset( $allPages[ $prefixedDbKeyTitle ] );
138 private function getTalkPages( array $pages ): array {
139 $lb = $this->linkBatchFactory->newLinkBatch();
142 foreach ( $pages as $page ) {
143 $talkPage = $page->getTalkPageIfDefined();
144 $talkPageList[ $page->getPrefixedDBkey() ] = $talkPage;
146 $lb->addObj( $talkPage );
150 $lb->setCaller( __METHOD__ )->execute();
151 foreach ( $talkPageList as $index => $talkPage ) {
152 if ( !$talkPage || !$talkPage->exists() ) {
153 $talkPageList[$index] =
null;
157 return $talkPageList;