summaryrefslogtreecommitdiff
path: root/www/wiki/extensions/Translate/utils/StatsBar.php
blob: df2801a2eba03734e5b99bb708ac23bccae8bdd9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
<?php
/**
 * Compact stats.
 *
 * @file
 * @author Niklas Laxström
 * @copyright Copyright © 2012-2013 Niklas Laxström
 * @license GPL-2.0-or-later
 */

/**
 * Compact, colorful stats.
 * @since 2012-11-30
 */
class StatsBar {
	/**
	 * @see MessageGroupStats
	 * @var int[]
	 */
	protected $stats;

	/**
	 * @var string Message group id
	 */
	protected $group;

	/**
	 * @var string Language
	 */
	protected $language;

	/**
	 * @param string $group
	 * @param string $language
	 * @param array[]|null $stats
	 *
	 * @return self
	 */
	public static function getNew( $group, $language, array $stats = null ) {
		$self = new self();
		$self->group = $group;
		$self->language = $language;

		if ( is_array( $stats ) ) {
			$self->stats = $stats;
		} else {
			$self->stats = MessageGroupStats::forItem( $group, $language );
		}

		return $self;
	}

	/**
	 * @param IContextSource $context
	 *
	 * @return string HTML
	 */
	public function getHtml( IContextSource $context ) {
		$context->getOutput()->addModules( 'ext.translate.statsbar' );

		$total = $this->stats[MessageGroupStats::TOTAL];
		$proofread = $this->stats[MessageGroupStats::PROOFREAD];
		$translated = $this->stats[MessageGroupStats::TRANSLATED];
		$fuzzy = $this->stats[MessageGroupStats::FUZZY];

		if ( !$total ) {
			$untranslated = null;
			$wproofread = $wtranslated = $wfuzzy = $wuntranslated = 0;
		} else {
			// Proofread is subset of translated
			$untranslated = $total - $translated - $fuzzy;

			$wproofread = round( 100 * $proofread / $total, 2 );
			$wtranslated = round( 100 * ( $translated - $proofread ) / $total, 2 );
			$wfuzzy = round( 100 * $fuzzy / $total, 2 );
			$wuntranslated = round( 100 - $wproofread - $wtranslated - $wfuzzy, 2 );
		}

		return Html::rawElement( 'div', [
				'class' => 'tux-statsbar',
				'data-total' => $total,
				'data-group' => $this->group,
				'data-language' => $this->language,
			],
			Html::element( 'span', [
				'class' => 'tux-proofread',
				'style' => "width: $wproofread%",
				'data-proofread' => $proofread,
			] ) . Html::element( 'span', [
				'class' => 'tux-translated',
				'style' => "width: $wtranslated%",
				'data-translated' => $translated,
			] ) . Html::element( 'span', [
				'class' => 'tux-fuzzy',
				'style' => "width: $wfuzzy%",
				'data-fuzzy' => $fuzzy,
			] ) . Html::element( 'span', [
				'class' => 'tux-untranslated',
				'style' => "width: $wuntranslated%",
				'data-untranslated' => $untranslated,
			] )
		);
	}
}