22 private $linkRenderer;
24 public function __construct( MessageLocalizer $localizer, LinkRenderer $linkRenderer ) {
25 $this->localizer = $localizer;
26 $this->linkRenderer = $linkRenderer;
31 sort( $groupsInSync );
33 if ( !$groupsInSync ) {
34 return Html::rawElement(
36 [
'class' => $wrapperClass ],
37 $this->localizer->msg(
'translate-smg-no-groups-in-sync' )->escaped()
38 . $this->addGroupSyncHelp( $wrapperClass )
43 foreach ( $groupsInSync as $groupId ) {
44 $htmlGroupItems[] = Html::element(
'li', [], $groupId );
47 return $this->getGroupSyncInfoHtml(
49 'translate-smg-groups-in-sync',
50 'translate-smg-groups-in-sync-list',
51 Html::rawElement(
'ul', [], implode(
'', $htmlGroupItems ) ),
52 $this->addGroupSyncHelp( $wrapperClass )
56 public function getHtmlForGroupsWithError(
57 GroupSynchronizationCache $groupSynchronizationCache,
61 $groupsWithErrors = $groupSynchronizationCache->getGroupsWithErrors();
62 if ( !$groupsWithErrors ) {
67 foreach ( $groupsWithErrors as $groupId ) {
68 $groupErrorResponse = $groupSynchronizationCache->getGroupErrorInfo( $groupId );
69 $htmlGroupItems[] = $this->getHtmlForGroupErrors( $groupErrorResponse, $currentLang, $wrapperClass );
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 )
80 private function addGroupSyncHelp(
string $wrapperClass ): string {
84 'href' =>
'https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Extension:Translate/' .
85 'Group_management#Strong_synchronization',
87 'class' =>
"{$wrapperClass}__help",
89 '[' . $this->localizer->msg(
'translate-smg-strong-sync-help' )->text() .
']'
93 private function getGroupSyncInfoHtml(
95 string $summaryMsgKey,
96 string $descriptionMsgKey,
98 string $preHtmlContent =
null
100 $output = Html::openElement(
'div', [
'class' => $className ] );
101 if ( $preHtmlContent ) {
102 $output .= $preHtmlContent;
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' );
115 private function getHtmlForGroupErrors(
116 GroupSynchronizationResponse $groupErrorResponse,
120 $groupId = $groupErrorResponse->getGroupId();
121 $output = Html::openElement(
123 [
'class' =>
"{$wrapperClass}__group_errors js-group-sync-group-errors" ]
126 $groupResolveAction = Html::linkButton(
127 $this->localizer->msg(
'translate-smg-group-action-resolve' )->text(),
129 'class' =>
"{$wrapperClass}__resolve-action js-group-sync-group-resolve",
131 'data-group-id' => $groupId,
135 $output .= Html::rawElement(
141 [
'class' =>
"{$wrapperClass}__sync-actions" ],
142 $this->localizer->msg(
'parentheses' )
143 ->rawParams( $groupResolveAction )->escaped()
148 $errorMessages = $groupErrorResponse->getRemainingMessages();
150 $output .= Html::openElement(
'ol' );
151 foreach ( $errorMessages as $message ) {
152 $output .= Html::rawElement(
154 [
'class' =>
"{$wrapperClass}__message-error js-group-sync-message-error" ],
155 $this->getErrorMessageHtml( $groupId, $message, $language, $wrapperClass )
158 $output .= Html::closeElement(
'ol' );
160 $output .= Html::closeElement(
'details' );
165 private function getErrorMessageHtml(
167 MessageUpdateParameter $message,
171 $messageTitle = Title::newFromText( $message->getPageName() );
173 if ( $messageTitle->exists() ) {
174 $output = $this->linkRenderer->makeLink( $messageTitle, $message->getPageName() );
175 $actions[] = $this->linkRenderer->makeLink(
177 $this->localizer->msg(
'translate-smg-group-message-action-history' )->text(),
179 [
'action' =>
'history' ]
182 $output = $this->linkRenderer->makeBrokenLink( $messageTitle, $message->getPageName() );
185 $actions[] = Html::linkButton(
186 $this->localizer->msg(
'translate-smg-group-action-resolve' )->text(),
188 'class' =>
"{$wrapperClass}__resolve-action js-group-sync-message-resolve",
190 'data-group-id' => $groupId,
191 'data-msg-title' => $message->getPageName(),
195 $output .=
' ' . Html::rawElement(
197 [
'class' =>
"{$wrapperClass}__sync-actions" ],
198 $this->localizer->msg(
'parentheses' )
199 ->rawParams( $language->pipeList( $actions ) )->escaped()
202 $output .= $this->getMessageInfoHtml( $message, $language );
207 private function getMessageInfoHtml( MessageUpdateParameter $message, Language $language ): string {
208 $output = Html::openElement(
'dl' );
211 if ( $message->isFuzzy() ) {
212 $tags[] = $this->localizer->msg(
'translate-smg-group-message-tag-outdated' )->text();
215 if ( $message->isRename() ) {
216 $tags[] = $this->localizer->msg(
'translate-smg-group-message-tag-rename' )->text();
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 )
227 $output .= $this->getMessagePropHtml(
228 $this->localizer->msg(
'translate-smg-group-message-message-content' )->text(),
229 $message->getContent()
232 if ( $message->isRename() ) {
233 $output .= $this->getMessagePropHtml(
234 $this->localizer->msg(
'translate-smg-group-message-message-target' )->text(),
235 $message->getTargetValue()
238 $output .= $this->getMessagePropHtml(
239 $this->localizer->msg(
'translate-smg-group-message-message-replacement' )->text(),
240 $message->getReplacementValue()
243 if ( $message->getOtherLangs() ) {
244 $output .= $this->getMessagePropHtml(
245 $this->localizer->msg(
'translate-smg-group-message-message-other-langs' )->text(),
247 $this->localizer->msg(
'comma-separator' )->text(),
248 array_keys( $message->getOtherLangs() )
254 $output .= Html::closeElement(
'dl' );
258 private function getMessagePropHtml(
string $label,
string $value ): string {
259 return Html::element(
'dt', [], $label ) . Html::element(
'dd', [], $value );
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:GroupSynchronizationCache'=> static function(MediaWikiServices $services):GroupSynchronizationCache { return new GroupSynchronizationCache( $services->get( 'Translate:PersistentCache'));}, 'Translate:MessageBundleStore'=> static function(MediaWikiServices $services):MessageBundleStore { return new MessageBundleStore(new RevTagStore(), $services->getJobQueueGroup(), $services->getLanguageNameUtils(), $services->get( 'Translate:MessageIndex'));}, 'Translate:MessageGroupReview'=> static function(MediaWikiServices $services):MessageGroupReview { return new MessageGroupReview($services->getDBLoadBalancer(), $services->getHookContainer());}, 'Translate:MessageGroupStatsTableFactory'=> static function(MediaWikiServices $services):MessageGroupStatsTableFactory { return new MessageGroupStatsTableFactory($services->get( 'Translate:ProgressStatsTableFactory'), $services->getDBLoadBalancer(), $services->getLinkRenderer(), $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:SubpageListBuilder'=> static function(MediaWikiServices $services):SubpageListBuilder { return new SubpageListBuilder($services->get( 'Translate:TranslatableBundleFactory'), $services->getLinkBatchFactory());}, 'Translate:TranslatableBundleFactory'=> static function(MediaWikiServices $services):TranslatableBundleFactory { return new TranslatableBundleFactory($services->get( 'Translate:TranslatablePageStore'), $services->get( 'Translate:MessageBundleStore'));}, '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(), new RevTagStore(), $services->getDBLoadBalancer(), $services->get( 'Translate:TranslatableBundleStatusStore'));}, 'Translate:TranslationStashReader'=> static function(MediaWikiServices $services):TranslationStashReader { $db=$services->getDBLoadBalancer() ->getConnectionRef(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());}, '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