25 private ILoadBalancer $loadBalancer;
26 private LinkRenderer $linkRenderer;
27 private MessageLocalizer $localizer;
28 private Language $interfaceLanguage;
31 private bool $incompleteStats;
32 private array $languageNames;
33 private Title $translateTitle;
35 private array $states;
36 private bool $haveTranslateWorkflowStates;
38 public function __construct(
40 ILoadBalancer $loadBalancer,
41 LinkRenderer $linkRenderer,
42 MessageLocalizer $localizer,
43 Language $interfaceLanguage,
44 bool $haveTranslateWorkflowStates
46 $this->table = $table;
47 $this->loadBalancer = $loadBalancer;
48 $this->linkRenderer = $linkRenderer;
49 $this->incompleteStats =
false;
50 $this->localizer = $localizer;
51 $this->interfaceLanguage = $interfaceLanguage;
52 $this->haveTranslateWorkflowStates = $haveTranslateWorkflowStates;
53 $this->languageNames = Utilities::getLanguageNames( $this->interfaceLanguage->getCode() );
54 $this->translateTitle = SpecialPage::getTitleFor(
'Translate' );
65 $totals = MessageGroupStats::getEmptyStats();
66 $groupId = $group->getId();
68 $languages = array_keys(
69 Utilities::getLanguageNames( $this->interfaceLanguage->getCode() )
72 $this->filterPriorityLangs( $languages, $groupId, $stats );
75 if ( $this->haveTranslateWorkflowStates ) {
76 $this->table->addExtraColumn( $this->localizer->msg(
'translate-stats-workflow' ) );
79 foreach ( $languages as $code ) {
80 if ( $this->table->isExcluded( $group, $code ) ) {
84 $languageStats = $stats[$code];
85 $row = $this->makeRow(
97 $totals = MessageGroupStats::multiAdd( $totals, $languageStats );
102 $this->table->setMainColumnHeader( $this->localizer->msg(
'translate-mgs-column-language' ) );
103 $out = $this->table->createHeader() .
"\n" . $out;
104 $out .= Html::closeElement(
'tbody' );
106 $out .= Html::openElement(
'tfoot' );
107 $out .= $this->table->makeTotalRow(
108 $this->localizer->msg(
'translate-mgs-totals' )->numParams( $rowCount ),
111 $out .= Html::closeElement(
'tfoot' );
113 $out .= Html::closeElement(
'table' );
121 public function areStatsIncomplete():
bool {
122 return $this->incompleteStats;
125 private function getWorkflowStates(
string $groupId ): array {
126 $db = $this->loadBalancer->getConnection( DB_REPLICA );
128 'translate_groupreviews',
129 [
'tgr_state',
'tgr_lang' ],
130 [
'tgr_group' => $groupId ],
135 foreach ( $res as $row ) {
136 $states[$row->tgr_lang] = $row->tgr_state;
142 private function makeRow(
144 string $languageCode,
151 $total = $stats[MessageGroupStats::TOTAL];
152 $translated = $stats[MessageGroupStats::TRANSLATED];
153 $fuzzy = $stats[MessageGroupStats::FUZZY];
156 if ( $total ===
null ) {
157 $this->incompleteStats =
true;
159 if ( $noComplete && $fuzzy === 0 && $translated === $total ) {
163 if ( $noEmpty && $translated === 0 && $fuzzy === 0 ) {
168 if ( $noEmpty && ( $translated / $total ) < 0.02 ) {
172 if ( $translated === $total ) {
173 $extra = [
'action' =>
'proofread' ];
178 if ( $rowCount % 2 === 0 ) {
179 $rowParams[
'class' ] =
'tux-statstable-even';
182 $out =
"\t" . Html::openElement(
'tr', $rowParams );
183 $out .=
"\n\t\t" . $this->getMainColumnCell( $languageCode, $extra, $group->getId() );
185 $out .= $this->getWorkflowStateCell( $table, $languageCode, $group );
187 $out .=
"\n\t" . Html::closeElement(
'tr' ) .
"\n";
192 private function getMainColumnCell(
string $code, array $params,
string $groupId ):
string {
193 if ( isset( $this->languageNames[$code] ) ) {
194 $text =
"$code: {$this->languageNames[$code]}";
201 if ( $groupId ===
'!prefix' ) {
202 return Html::rawElement(
'td', [], $text );
205 $queryParameters = $params + [
210 $link = $this->linkRenderer->makeKnownLink(
211 $this->translateTitle,
217 return Html::rawElement(
'td', [], $link );
221 private function getWorkflowStateCell(
StatsTable $table,
string $language,
MessageGroup $group ):
string {
222 if ( !$this->haveTranslateWorkflowStates ) {
226 $this->states ??= $this->getWorkflowStates( $group->getId() );
227 return $table->makeWorkflowStateCell( $this->states[$language] ??
null, $group, $language );
235 private function filterPriorityLangs( array &$languages,
string $group, array $cache ):
void {
236 $filterLangs = TranslateMetadata::get( $group,
'prioritylangs' );
237 if ( $filterLangs ===
false || strlen( $filterLangs ) === 0 ) {
241 $filter = array_flip( explode(
',', $filterLangs ) );
242 foreach ( $languages as $id => $code ) {
243 if ( isset( $filter[$code] ) ) {
246 $translated = $cache[$code][1];
247 if ( $translated === 0 ) {
248 unset( $languages[$id] );