Translate extension for MediaWiki
 
Loading...
Searching...
No Matches
DisplayGroupSynchronizationInfo.php
1<?php
2declare( strict_types = 1 );
3
5
6use Html;
7use Language;
8use MediaWiki\Linker\LinkRenderer;
9use MessageLocalizer;
10use Title;
11
20 private $localizer;
22 private $linkRenderer;
23
24 public function __construct( MessageLocalizer $localizer, LinkRenderer $linkRenderer ) {
25 $this->localizer = $localizer;
26 $this->linkRenderer = $linkRenderer;
27 }
28
30 public function getGroupsInSyncHtml( array $groupsInSync, string $wrapperClass ): string {
31 sort( $groupsInSync );
32
33 if ( !$groupsInSync ) {
34 return Html::rawElement(
35 'p',
36 [ 'class' => $wrapperClass ],
37 $this->localizer->msg( 'translate-smg-no-groups-in-sync' )->escaped()
38 . $this->addGroupSyncHelp( $wrapperClass )
39 );
40 }
41
42 $htmlGroupItems = [];
43 foreach ( $groupsInSync as $groupId ) {
44 $htmlGroupItems[] = Html::element( 'li', [], $groupId );
45 }
46
47 return $this->getGroupSyncInfoHtml(
48 $wrapperClass,
49 'translate-smg-groups-in-sync',
50 'translate-smg-groups-in-sync-list',
51 Html::rawElement( 'ul', [], implode( '', $htmlGroupItems ) ),
52 $this->addGroupSyncHelp( $wrapperClass )
53 );
54 }
55
56 public function getHtmlForGroupsWithError(
57 GroupSynchronizationCache $groupSynchronizationCache,
58 string $wrapperClass,
59 Language $currentLang
60 ): string {
61 $groupsWithErrors = $groupSynchronizationCache->getGroupsWithErrors();
62 if ( !$groupsWithErrors ) {
63 return '';
64 }
65
66 $htmlGroupItems = [];
67 foreach ( $groupsWithErrors as $groupId ) {
68 $groupErrorResponse = $groupSynchronizationCache->getGroupErrorInfo( $groupId );
69 $htmlGroupItems[] = $this->getHtmlForGroupErrors( $groupErrorResponse, $currentLang, $wrapperClass );
70 }
71
72 return $this->getGroupSyncInfoHtml(
73 $wrapperClass . ' js-group-sync-groups-with-error',
74 'translate-smg-groups-with-error-title',
75 'translate-smg-groups-with-error-desc',
76 implode( '', $htmlGroupItems )
77 );
78 }
79
80 private function addGroupSyncHelp( string $wrapperClass ): string {
81 return Html::element(
82 'a',
83 [
84 'href' => 'https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Extension:Translate/' .
85 'Group_management#Strong_synchronization',
86 'target' => '_blank',
87 'class' => "{$wrapperClass}__help",
88 ],
89 '[' . $this->localizer->msg( 'translate-smg-strong-sync-help' )->text() . ']'
90 );
91 }
92
93 private function getGroupSyncInfoHtml(
94 string $className,
95 string $summaryMsgKey,
96 string $descriptionMsgKey,
97 string $htmlContent,
98 string $preHtmlContent = null
99 ): string {
100 $output = Html::openElement( 'div', [ 'class' => $className ] );
101 if ( $preHtmlContent ) {
102 $output .= $preHtmlContent;
103 }
104
105 $output .= Html::openElement( 'details' );
106 $output .= Html::element( 'summary', [], $this->localizer->msg( $summaryMsgKey )->text() );
107 $output .= Html::element( 'p', [], $this->localizer->msg( $descriptionMsgKey )->text() );
108 $output .= $htmlContent;
109 $output .= Html::closeElement( 'details' );
110 $output .= Html::closeElement( 'div' );
111
112 return $output;
113 }
114
115 private function getHtmlForGroupErrors(
116 GroupSynchronizationResponse $groupErrorResponse,
117 Language $language,
118 string $wrapperClass
119 ): string {
120 $groupId = $groupErrorResponse->getGroupId();
121 $output = Html::openElement(
122 'details',
123 [ 'class' => "{$wrapperClass}__group_errors js-group-sync-group-errors" ]
124 );
125
126 $groupResolveAction = Html::linkButton(
127 $this->localizer->msg( 'translate-smg-group-action-resolve' )->text(),
128 [
129 'class' => "{$wrapperClass}__resolve-action js-group-sync-group-resolve",
130 'href' => '#',
131 'data-group-id' => $groupId,
132 ]
133 );
134
135 $output .= Html::rawElement(
136 'summary',
137 [],
138 $groupId . ' ' .
139 Html::rawElement(
140 'span',
141 [ 'class' => "{$wrapperClass}__sync-actions" ],
142 $this->localizer->msg( 'parentheses' )
143 ->rawParams( $groupResolveAction )->escaped()
144
145 )
146 );
147
148 $errorMessages = $groupErrorResponse->getRemainingMessages();
149
150 $output .= Html::openElement( 'ol' );
151 foreach ( $errorMessages as $message ) {
152 $output .= Html::rawElement(
153 'li',
154 [ 'class' => "{$wrapperClass}__message-error js-group-sync-message-error" ],
155 $this->getErrorMessageHtml( $groupId, $message, $language, $wrapperClass )
156 );
157 }
158 $output .= Html::closeElement( 'ol' );
159
160 $output .= Html::closeElement( 'details' );
161
162 return $output;
163 }
164
165 private function getErrorMessageHtml(
166 string $groupId,
167 MessageUpdateParameter $message,
168 Language $language,
169 string $wrapperClass
170 ): string {
171 $messageTitle = Title::newFromText( $message->getPageName() );
172 $actions = [];
173 if ( $messageTitle->exists() ) {
174 $output = $this->linkRenderer->makeLink( $messageTitle, $message->getPageName() );
175 $actions[] = $this->linkRenderer->makeLink(
176 $messageTitle,
177 $this->localizer->msg( 'translate-smg-group-message-action-history' )->text(),
178 [],
179 [ 'action' => 'history' ]
180 );
181 } else {
182 $output = $this->linkRenderer->makeBrokenLink( $messageTitle, $message->getPageName() );
183 }
184
185 $actions[] = Html::linkButton(
186 $this->localizer->msg( 'translate-smg-group-action-resolve' )->text(),
187 [
188 'class' => "{$wrapperClass}__resolve-action js-group-sync-message-resolve",
189 'href' => '#',
190 'data-group-id' => $groupId,
191 'data-msg-title' => $message->getPageName(),
192 ]
193 );
194
195 $output .= ' ' . Html::rawElement(
196 'span',
197 [ 'class' => "{$wrapperClass}__sync-actions" ],
198 $this->localizer->msg( 'parentheses' )
199 ->rawParams( $language->pipeList( $actions ) )->escaped()
200 );
201
202 $output .= $this->getMessageInfoHtml( $message, $language );
203
204 return $output;
205 }
206
207 private function getMessageInfoHtml( MessageUpdateParameter $message, Language $language ): string {
208 $output = Html::openElement( 'dl' );
209
210 $tags = [];
211 if ( $message->isFuzzy() ) {
212 $tags[] = $this->localizer->msg( 'translate-smg-group-message-tag-outdated' )->text();
213 }
214
215 if ( $message->isRename() ) {
216 $tags[] = $this->localizer->msg( 'translate-smg-group-message-tag-rename' )->text();
217 }
218
219 if ( $tags ) {
220 $output .= $this->getMessagePropHtml(
221 $this->localizer->msg( 'translate-smg-group-message-tag-label' )
222 ->numParams( count( $tags ) )->text(),
223 implode( $this->localizer->msg( 'pipe-separator' )->text(), $tags )
224 );
225 }
226
227 $output .= $this->getMessagePropHtml(
228 $this->localizer->msg( 'translate-smg-group-message-message-content' )->text(),
229 $message->getContent()
230 );
231
232 if ( $message->isRename() ) {
233 $output .= $this->getMessagePropHtml(
234 $this->localizer->msg( 'translate-smg-group-message-message-target' )->text(),
235 $message->getTargetValue()
236 );
237
238 $output .= $this->getMessagePropHtml(
239 $this->localizer->msg( 'translate-smg-group-message-message-replacement' )->text(),
240 $message->getReplacementValue()
241 );
242
243 $otherLangs = $message->getOtherLangs();
244 if ( $otherLangs ) {
245 $output .= $this->getMessagePropHtml(
246 $this->localizer->msg( 'translate-smg-group-message-message-other-langs' )->text(),
247 implode(
248 $this->localizer->msg( 'comma-separator' )->text(),
249 array_keys( $otherLangs )
250 )
251 );
252 }
253 }
254
255 $output .= Html::closeElement( 'dl' );
256 return $output;
257 }
258
259 private function getMessagePropHtml( string $label, string $value ): string {
260 return Html::element( 'dt', [], $label ) . Html::element( 'dd', [], $value );
261 }
262}
return[ 'Translate:ConfigHelper'=> static function():ConfigHelper { return new ConfigHelper();}, 'Translate:CsvTranslationImporter'=> static function(MediaWikiServices $services):CsvTranslationImporter { return new CsvTranslationImporter( $services->getWikiPageFactory());}, 'Translate:EntitySearch'=> static function(MediaWikiServices $services):EntitySearch { return new EntitySearch($services->getMainWANObjectCache(), $services->getCollationFactory() ->makeCollation( 'uca-default-u-kn'), MessageGroups::singleton(), $services->getNamespaceInfo(), $services->get( 'Translate:MessageIndex'), $services->getTitleParser(), $services->getTitleFormatter());}, 'Translate:ExternalMessageSourceStateImporter'=> static function(MediaWikiServices $services):ExternalMessageSourceStateImporter { return new ExternalMessageSourceStateImporter($services->getMainConfig(), $services->get( 'Translate:GroupSynchronizationCache'), $services->getJobQueueGroup(), LoggerFactory::getInstance( 'Translate.GroupSynchronization'), $services->get( 'Translate:MessageIndex'));}, 'Translate:FileFormatFactory'=> static function(MediaWikiServices $services):FileFormatFactory { return new FileFormatFactory( $services->getObjectFactory());}, 'Translate:GroupSynchronizationCache'=> static function(MediaWikiServices $services):GroupSynchronizationCache { return new GroupSynchronizationCache( $services->get( 'Translate:PersistentCache'));}, 'Translate:HookRunner'=> static function(MediaWikiServices $services):HookRunner { return new HookRunner( $services->getHookContainer());}, 'Translate:MessageBundleStore'=> static function(MediaWikiServices $services):MessageBundleStore { return new MessageBundleStore($services->get( 'Translate:RevTagStore'), $services->getJobQueueGroup(), $services->getLanguageNameUtils(), $services->get( 'Translate:MessageIndex'));}, 'Translate:MessageGroupReviewStore'=> static function(MediaWikiServices $services):MessageGroupReviewStore { return new MessageGroupReviewStore($services->getDBLoadBalancer(), $services->get( 'Translate:HookRunner'));}, 'Translate:MessageGroupStatsTableFactory'=> static function(MediaWikiServices $services):MessageGroupStatsTableFactory { return new MessageGroupStatsTableFactory($services->get( 'Translate:ProgressStatsTableFactory'), $services->getDBLoadBalancer(), $services->getLinkRenderer(), $services->get( 'Translate:MessageGroupReviewStore'), $services->getMainConfig() ->get( 'TranslateWorkflowStates') !==false);}, 'Translate:MessageIndex'=> static function(MediaWikiServices $services):MessageIndex { $params=$services->getMainConfig() ->get( 'TranslateMessageIndex');if(is_string( $params)) { $params=(array) $params;} $class=array_shift( $params);return new $class( $params);}, 'Translate:MessagePrefixStats'=> static function(MediaWikiServices $services):MessagePrefixStats { return new MessagePrefixStats( $services->getTitleParser());}, 'Translate:ParsingPlaceholderFactory'=> static function():ParsingPlaceholderFactory { return new ParsingPlaceholderFactory();}, 'Translate:PersistentCache'=> static function(MediaWikiServices $services):PersistentCache { return new PersistentDatabaseCache($services->getDBLoadBalancer(), $services->getJsonCodec());}, 'Translate:ProgressStatsTableFactory'=> static function(MediaWikiServices $services):ProgressStatsTableFactory { return new ProgressStatsTableFactory($services->getLinkRenderer(), $services->get( 'Translate:ConfigHelper'));}, 'Translate:RevTagStore'=> static function(MediaWikiServices $services):RevTagStore { return new RevTagStore($services->getDBLoadBalancerFactory());}, 'Translate:SubpageListBuilder'=> static function(MediaWikiServices $services):SubpageListBuilder { return new SubpageListBuilder($services->get( 'Translate:TranslatableBundleFactory'), $services->getLinkBatchFactory());}, 'Translate:TranslatableBundleExporter'=> static function(MediaWikiServices $services):TranslatableBundleExporter { return new TranslatableBundleExporter($services->get( 'Translate:SubpageListBuilder'), $services->getWikiExporterFactory(), $services->getDBLoadBalancer());}, 'Translate:TranslatableBundleFactory'=> static function(MediaWikiServices $services):TranslatableBundleFactory { return new TranslatableBundleFactory($services->get( 'Translate:TranslatablePageStore'), $services->get( 'Translate:MessageBundleStore'));}, 'Translate:TranslatableBundleImporter'=> static function(MediaWikiServices $services):TranslatableBundleImporter { return new TranslatableBundleImporter($services->getWikiImporterFactory(), $services->get( 'Translate:TranslatablePageParser'), $services->getRevisionLookup());}, 'Translate:TranslatableBundleMover'=> static function(MediaWikiServices $services):TranslatableBundleMover { return new TranslatableBundleMover($services->getMovePageFactory(), $services->getJobQueueGroup(), $services->getLinkBatchFactory(), $services->get( 'Translate:TranslatableBundleFactory'), $services->get( 'Translate:SubpageListBuilder'), $services->getMainConfig() ->get( 'TranslatePageMoveLimit'));}, 'Translate:TranslatableBundleStatusStore'=> static function(MediaWikiServices $services):TranslatableBundleStatusStore { return new TranslatableBundleStatusStore($services->getDBLoadBalancer() ->getConnection(DB_PRIMARY), $services->getCollationFactory() ->makeCollation( 'uca-default-u-kn'), $services->getDBLoadBalancer() ->getMaintenanceConnectionRef(DB_PRIMARY));}, 'Translate:TranslatablePageParser'=> static function(MediaWikiServices $services):TranslatablePageParser { return new TranslatablePageParser($services->get( 'Translate:ParsingPlaceholderFactory'));}, 'Translate:TranslatablePageStore'=> static function(MediaWikiServices $services):TranslatablePageStore { return new TranslatablePageStore($services->get( 'Translate:MessageIndex'), $services->getJobQueueGroup(), $services->get( 'Translate:RevTagStore'), $services->getDBLoadBalancer(), $services->get( 'Translate:TranslatableBundleStatusStore'), $services->get( 'Translate:TranslatablePageParser'),);}, 'Translate:TranslationStashReader'=> static function(MediaWikiServices $services):TranslationStashReader { $db=$services->getDBLoadBalancer() ->getConnection(DB_REPLICA);return new TranslationStashStorage( $db);}, 'Translate:TranslationStatsDataProvider'=> static function(MediaWikiServices $services):TranslationStatsDataProvider { return new TranslationStatsDataProvider(new ServiceOptions(TranslationStatsDataProvider::CONSTRUCTOR_OPTIONS, $services->getMainConfig()), $services->getObjectFactory(), $services->getDBLoadBalancer());}, 'Translate:TranslationUnitStoreFactory'=> static function(MediaWikiServices $services):TranslationUnitStoreFactory { return new TranslationUnitStoreFactory( $services->getDBLoadBalancer());}, 'Translate:TranslatorActivity'=> static function(MediaWikiServices $services):TranslatorActivity { $query=new TranslatorActivityQuery($services->getMainConfig(), $services->getDBLoadBalancer());return new TranslatorActivity($services->getMainObjectStash(), $query, $services->getJobQueueGroup());}, 'Translate:TtmServerFactory'=> static function(MediaWikiServices $services):TtmServerFactory { $config=$services->getMainConfig();$default=$config->get( 'TranslateTranslationDefaultService');if( $default===false) { $default=null;} return new TtmServerFactory( $config->get( 'TranslateTranslationServices'), $default);}]
@phpcs-require-sorted-array
Finds external changes for file based message groups.