Index: trunk/extensions/EducationProgram/EducationProgram.settings.php |
— | — | @@ -27,6 +27,11 @@ |
28 | 28 | * @return array |
29 | 29 | */ |
30 | 30 | protected static function getDefaultSettings() { |
| 31 | + global $wgExtensionAssetsPath, $wgScriptPath; |
| 32 | + |
| 33 | + $resourceDir = $egSWLScriptPath = $wgExtensionAssetsPath === false ? $wgScriptPath . '/extensions' : $wgExtensionAssetsPath; |
| 34 | + $resourceDir .= '/EducationProgram/resources/'; |
| 35 | + |
31 | 36 | return array( |
32 | 37 | 'enableTopLink' => true, |
33 | 38 | 'ambassadorPictureDomains' => array( |
— | — | @@ -35,7 +40,9 @@ |
36 | 41 | 'ambassadorCommonsUrl' => 'https://commons.wikimedia.org/wiki/Special:UploadWizard', |
37 | 42 | 'citylessCountries' => array( 'BT', 'BV', 'IO', 'VG', 'TD', 'CX', 'CC', 'KM', 'DJ', 'GQ', 'FK', 'FX', 'TF', 'GW', 'HM', 'KI', 'YT', 'MS', 'NR', 'NU', 'NF', 'PN', 'SH', 'PM', 'WS', 'SC', 'GS', 'SJ', 'TK', 'TP', 'TV', 'UM', 'VU', 'EH' ), |
38 | 43 | 'ambassadorImgWidth' => 140, |
39 | | - 'recentActivityLimit' => 24 * 60 * 60, |
| 44 | + 'recentActivityLimit' => 17 * 60 * 60, |
| 45 | + 'resourceDir' => $resourceDir, |
| 46 | + 'imageDir' => $resourceDir . 'images/', |
40 | 47 | ); |
41 | 48 | } |
42 | 49 | |
Index: trunk/extensions/EducationProgram/EducationProgram.php |
— | — | @@ -123,6 +123,7 @@ |
124 | 124 | $wgAutoloadClasses['EPInstructors'] = dirname( __FILE__ ) . '/includes/EPInstructors.php'; |
125 | 125 | $wgAutoloadClasses['EPRevisions'] = dirname( __FILE__ ) . '/includes/EPRevisions.php'; |
126 | 126 | $wgAutoloadClasses['EPArticles'] = dirname( __FILE__ ) . '/includes/EPArticles.php'; |
| 127 | +$wgAutoloadClasses['EPStudentActivityPager'] = dirname( __FILE__ ) . '/includes/EPStudentActivityPager.php'; |
127 | 128 | |
128 | 129 | $wgAutoloadClasses['CoursePage'] = dirname( __FILE__ ) . '/pages/CoursePage.php'; |
129 | 130 | $wgAutoloadClasses['EPPage'] = dirname( __FILE__ ) . '/pages/EPPage.php'; |
Index: trunk/extensions/EducationProgram/specials/SpecialStudentActivity.php |
— | — | @@ -34,9 +34,15 @@ |
35 | 35 | |
36 | 36 | $this->displayNavigation(); |
37 | 37 | |
| 38 | + $conds = array( 'last_active > ' . wfGetDB( DB_SLAVE )->addQuotes( |
| 39 | + wfTimestamp( TS_MW, time() - ( EPSettings::get( 'recentActivityLimit' ) ) ) |
| 40 | + ) ); |
| 41 | + |
| 42 | + $this->showStudentMeter( $conds ); |
| 43 | + |
38 | 44 | $out = $this->getOutput(); |
39 | 45 | |
40 | | - $pager = new EPStudentActivityPager( $this->getContext(), array() ); |
| 46 | + $pager = new EPStudentActivityPager( $this->getContext(), $conds ); |
41 | 47 | |
42 | 48 | if ( $pager->getNumRows() ) { |
43 | 49 | $out->addHTML( |
— | — | @@ -53,250 +59,23 @@ |
54 | 60 | } |
55 | 61 | } |
56 | 62 | |
57 | | -} |
| 63 | + public function showStudentMeter( array $conds ) { |
| 64 | + $studentCount = EPStudents::singleton()->count( $conds ); |
58 | 65 | |
59 | | - |
60 | | -/** |
61 | | - * Student pager, primarily for Special:Students. |
62 | | - * |
63 | | - * @since 0.1 |
64 | | - * |
65 | | - * @file EPStudentPager.php |
66 | | - * @ingroup EductaionProgram |
67 | | - * |
68 | | - * @licence GNU GPL v3 or later |
69 | | - * @author Jeroen De Dauw < jeroendedauw@gmail.com > |
70 | | - */ |
71 | | -class EPStudentActivityPager extends EPPager { |
72 | | - |
73 | | - /** |
74 | | - * List of user ids mapped to user names and real names, set in doBatchLookups. |
75 | | - * The real names will just hold the user name when no real name is set. |
76 | | - * user id => array( user name, real name ) |
77 | | - * |
78 | | - * @since 0.1 |
79 | | - * @var array |
80 | | - */ |
81 | | - protected $userNames = array(); |
82 | | - |
83 | | - /** |
84 | | - * List of course ids mapped to their title names. |
85 | | - * course id => course name |
86 | | - * |
87 | | - * @since 0.1 |
88 | | - * @var array |
89 | | - */ |
90 | | - protected $courseNames = array(); |
91 | | - |
92 | | - /** |
93 | | - * List of course ids pointing to the id of their org. |
94 | | - * course id => org id |
95 | | - * |
96 | | - * @since 0.1 |
97 | | - * @var array |
98 | | - */ |
99 | | - protected $courseOrgs = array(); |
100 | | - |
101 | | - /** |
102 | | - * List of org ids mapped to their title names. |
103 | | - * org id => org name |
104 | | - * |
105 | | - * @since 0.1 |
106 | | - * @var array |
107 | | - */ |
108 | | - protected $orgNames = array(); |
109 | | - |
110 | | - /** |
111 | | - * Constructor. |
112 | | - * |
113 | | - * @param IContextSource $context |
114 | | - * @param array $conds |
115 | | - */ |
116 | | - public function __construct( IContextSource $context, array $conds = array() ) { |
117 | | - $this->mDefaultDirection = true; |
118 | | - |
119 | | - $conds[] = 'last_active > ' . wfGetDB( DB_SLAVE )->addQuotes( |
120 | | - wfTimestamp( TS_MW, time() - ( EPSettings::get( 'recentActivityLimit' ) ) ) |
121 | | - ); |
122 | | - |
123 | | - parent::__construct( $context, $conds, EPStudents::singleton() ); |
124 | | - } |
125 | | - |
126 | | - /** |
127 | | - * (non-PHPdoc) |
128 | | - * @see EPPager::getFields() |
129 | | - */ |
130 | | - public function getFields() { |
131 | | - return array( |
132 | | - 'id', |
133 | | - 'user_id', |
134 | | - 'last_course', |
135 | | - 'last_active', |
136 | | - ); |
137 | | - } |
138 | | - |
139 | | - /** |
140 | | - * (non-PHPdoc) |
141 | | - * @see TablePager::getRowClass() |
142 | | - */ |
143 | | - function getRowClass( $row ) { |
144 | | - return 'ep-studentactivity-row'; |
145 | | - } |
146 | | - |
147 | | - /** |
148 | | - * (non-PHPdoc) |
149 | | - * @see TablePager::getTableClass() |
150 | | - */ |
151 | | - public function getTableClass() { |
152 | | - return 'TablePager ep-studentactivity'; |
153 | | - } |
154 | | - |
155 | | - /** |
156 | | - * (non-PHPdoc) |
157 | | - * @see EPPager::getFormattedValue() |
158 | | - */ |
159 | | - protected function getFormattedValue( $name, $value ) { |
160 | | - switch ( $name ) { |
161 | | - case 'user_id': |
162 | | - if ( array_key_exists( $value, $this->userNames ) ) { |
163 | | - list( $userName, $realName ) = $this->userNames[$value]; |
164 | | - $value = Linker::userLink( $value, $userName, $realName ) . Linker::userToolLinks( $value, $userName ); |
165 | | - } |
166 | | - else { |
167 | | - wfWarn( 'User id not in $this->userNames in ' . __METHOD__ ); |
168 | | - } |
169 | | - break; |
170 | | - case 'last_active': |
171 | | - $value = htmlspecialchars( $this->getLanguage()->timeanddate( $value ) ); |
172 | | - break; |
173 | | - case 'last_course': |
174 | | - if ( array_key_exists( $value, $this->courseNames ) ) { |
175 | | - $value = EPCourses::singleton()->getLinkFor( $this->courseNames[$value] ); |
176 | | - } |
177 | | - else { |
178 | | - // TODO: enable |
179 | | - //wfWarn( 'Course id not in $this->courseNames in ' . __METHOD__ ); |
180 | | - } |
181 | | - break; |
182 | | - case 'org_id': |
183 | | - $courseId = $this->currentObject->getField( 'last_course' ); |
184 | | - |
185 | | - if ( array_key_exists( $courseId, $this->courseOrgs ) ) { |
186 | | - $orgId = $this->courseOrgs[$courseId]; |
187 | | - |
188 | | - if ( array_key_exists( $orgId, $this->orgNames ) ) { |
189 | | - $value = EPOrgs::singleton()->getLinkFor( $this->orgNames[$orgId] ); |
190 | | - } |
191 | | - else { |
192 | | - wfWarn( 'Org id not in $this->orgNames in ' . __METHOD__ ); |
193 | | - } |
194 | | - } |
195 | | - else { |
196 | | - // TODO: enable |
197 | | - //wfWarn( 'Course id not in $this->courseOrgs in ' . __METHOD__ ); |
198 | | - } |
199 | | - break; |
| 66 | + if ( $studentCount < 10 ) { |
| 67 | + $image = $studentCount < 5 ? 0 : 5; |
200 | 68 | } |
201 | | - |
202 | | - return $value; |
203 | | - } |
204 | | - |
205 | | - /** |
206 | | - * (non-PHPdoc) |
207 | | - * @see EPPager::getSortableFields() |
208 | | - */ |
209 | | - protected function getSortableFields() { |
210 | | - return array( |
211 | | - ); |
212 | | - } |
213 | | - |
214 | | - /** |
215 | | - * (non-PHPdoc) |
216 | | - * @see EPPager::hasActionsColumn() |
217 | | - */ |
218 | | - protected function hasActionsColumn() { |
219 | | - return false; |
220 | | - } |
221 | | - |
222 | | - /** |
223 | | - * (non-PHPdoc) |
224 | | - * @see IndexPager::getDefaultSort() |
225 | | - */ |
226 | | - function getDefaultSort() { |
227 | | - return 'last_active'; |
228 | | - } |
229 | | - |
230 | | - /** |
231 | | - * (non-PHPdoc) |
232 | | - * @see EPPager::getFieldNames() |
233 | | - */ |
234 | | - public function getFieldNames() { |
235 | | - $fields = parent::getFieldNames(); |
236 | | - |
237 | | - unset( $fields['id'] ); |
238 | | - |
239 | | - $fields = wfArrayInsertAfter( $fields, array( 'org_id' => 'org-id' ), 'user_id' ); |
240 | | - |
241 | | - return $fields; |
242 | | - } |
243 | | - |
244 | | - /** |
245 | | - * (non-PHPdoc) |
246 | | - * @see IndexPager::doBatchLookups() |
247 | | - */ |
248 | | - protected function doBatchLookups() { |
249 | | - $userIds = array(); |
250 | | - $courseIds = array(); |
251 | | - |
252 | | - $userField = $this->table->getPrefixedField( 'user_id' ); |
253 | | - $courseField = $this->table->getPrefixedField( 'last_course' ); |
254 | | - |
255 | | - while( $student = $this->mResult->fetchObject() ) { |
256 | | - $userIds[] = (int)$student->$userField; |
257 | | - $courseIds[] = (int)$student->$courseField; |
| 69 | + else { |
| 70 | + $image = floor( $studentCount / 10 ); |
258 | 71 | } |
259 | 72 | |
260 | | - if ( !empty( $userIds ) ) { |
261 | | - $result = wfGetDB( DB_SLAVE )->select( |
262 | | - 'user', |
263 | | - array( 'user_id', 'user_name', 'user_real_name' ), |
264 | | - array( 'user_id' => $userIds ), |
265 | | - __METHOD__ |
266 | | - ); |
| 73 | + $message = $this->msg( 'ep-studentactivity-count', $studentCount )->escaped(); |
267 | 74 | |
268 | | - while( $user = $result->fetchObject() ) { |
269 | | - $real = $user->user_real_name === '' ? $user->user_name : $user->user_real_name; |
270 | | - $this->userNames[$user->user_id] = array( $user->user_name, $real ); |
271 | | - } |
272 | | - } |
273 | | - |
274 | | - if ( !empty( $courseIds ) ) { |
275 | | - $courses = EPCourses::singleton()->selectFields( |
276 | | - array( 'id', 'name', 'org_id' ), |
277 | | - array( 'id' => array_unique( $courseIds ) ) |
278 | | - ); |
279 | | - |
280 | | - $orgIds = array(); |
281 | | - |
282 | | - foreach ( $courses as $courseData ) { |
283 | | - $this->courseNames[$courseData['id']] = $courseData['name']; |
284 | | - $orgIds[] = $courseData['org_id']; |
285 | | - $this->courseOrgs[$courseData['id']] = $courseData['org_id']; |
286 | | - } |
287 | | - |
288 | | - $this->orgNames = EPOrgs::singleton()->selectFields( |
289 | | - array( 'id', 'name' ), |
290 | | - array( 'id' => array_unique( $orgIds ) ) |
291 | | - ); |
292 | | - } |
| 75 | + $this->getOutput()->addElement( 'img', array( |
| 76 | + 'src' => EPSettings::get( 'imageDir' ) . 'student-o-meter_morethan-' . $image . '.png', |
| 77 | + 'alt' => $message, |
| 78 | + 'title' => $message, |
| 79 | + ) ); |
293 | 80 | } |
294 | 81 | |
295 | | - /** |
296 | | - * (non-PHPdoc) |
297 | | - * @see EPPager::getMsg() |
298 | | - */ |
299 | | - protected function getMsg( $messageKey ) { |
300 | | - return wfMsg( strtolower( get_called_class() ) . '-' . str_replace( '_', '-', $messageKey ) ); |
301 | | - } |
302 | | - |
303 | | -} |
\ No newline at end of file |
| 82 | +} |
Index: trunk/extensions/EducationProgram/includes/EPStudentActivityPager.php |
— | — | @@ -0,0 +1,239 @@ |
| 2 | +<?php |
| 3 | + |
| 4 | +/** |
| 5 | + * Student pager, primarily for Special:Students. |
| 6 | + * |
| 7 | + * @since 0.1 |
| 8 | + * |
| 9 | + * @file EPStudentPager.php |
| 10 | + * @ingroup EductaionProgram |
| 11 | + * |
| 12 | + * @licence GNU GPL v3 or later |
| 13 | + * @author Jeroen De Dauw < jeroendedauw@gmail.com > |
| 14 | + */ |
| 15 | +class EPStudentActivityPager extends EPPager { |
| 16 | + |
| 17 | + /** |
| 18 | + * List of user ids mapped to user names and real names, set in doBatchLookups. |
| 19 | + * The real names will just hold the user name when no real name is set. |
| 20 | + * user id => array( user name, real name ) |
| 21 | + * |
| 22 | + * @since 0.1 |
| 23 | + * @var array |
| 24 | + */ |
| 25 | + protected $userNames = array(); |
| 26 | + |
| 27 | + /** |
| 28 | + * List of course ids mapped to their title names. |
| 29 | + * course id => course name |
| 30 | + * |
| 31 | + * @since 0.1 |
| 32 | + * @var array |
| 33 | + */ |
| 34 | + protected $courseNames = array(); |
| 35 | + |
| 36 | + /** |
| 37 | + * List of course ids pointing to the id of their org. |
| 38 | + * course id => org id |
| 39 | + * |
| 40 | + * @since 0.1 |
| 41 | + * @var array |
| 42 | + */ |
| 43 | + protected $courseOrgs = array(); |
| 44 | + |
| 45 | + /** |
| 46 | + * List of org ids mapped to their title names. |
| 47 | + * org id => org name |
| 48 | + * |
| 49 | + * @since 0.1 |
| 50 | + * @var array |
| 51 | + */ |
| 52 | + protected $orgNames = array(); |
| 53 | + |
| 54 | + /** |
| 55 | + * Constructor. |
| 56 | + * |
| 57 | + * @param IContextSource $context |
| 58 | + * @param array $conds |
| 59 | + */ |
| 60 | + public function __construct( IContextSource $context, array $conds = array() ) { |
| 61 | + $this->mDefaultDirection = true; |
| 62 | + parent::__construct( $context, $conds, EPStudents::singleton() ); |
| 63 | + } |
| 64 | + |
| 65 | + /** |
| 66 | + * (non-PHPdoc) |
| 67 | + * @see EPPager::getFields() |
| 68 | + */ |
| 69 | + public function getFields() { |
| 70 | + return array( |
| 71 | + 'id', |
| 72 | + 'user_id', |
| 73 | + 'last_course', |
| 74 | + 'last_active', |
| 75 | + ); |
| 76 | + } |
| 77 | + |
| 78 | + /** |
| 79 | + * (non-PHPdoc) |
| 80 | + * @see TablePager::getRowClass() |
| 81 | + */ |
| 82 | + function getRowClass( $row ) { |
| 83 | + return 'ep-studentactivity-row'; |
| 84 | + } |
| 85 | + |
| 86 | + /** |
| 87 | + * (non-PHPdoc) |
| 88 | + * @see TablePager::getTableClass() |
| 89 | + */ |
| 90 | + public function getTableClass() { |
| 91 | + return 'TablePager ep-studentactivity'; |
| 92 | + } |
| 93 | + |
| 94 | + /** |
| 95 | + * (non-PHPdoc) |
| 96 | + * @see EPPager::getFormattedValue() |
| 97 | + */ |
| 98 | + protected function getFormattedValue( $name, $value ) { |
| 99 | + switch ( $name ) { |
| 100 | + case 'user_id': |
| 101 | + if ( array_key_exists( $value, $this->userNames ) ) { |
| 102 | + list( $userName, $realName ) = $this->userNames[$value]; |
| 103 | + $value = Linker::userLink( $value, $userName, $realName ) . Linker::userToolLinks( $value, $userName ); |
| 104 | + } |
| 105 | + else { |
| 106 | + wfWarn( 'User id not in $this->userNames in ' . __METHOD__ ); |
| 107 | + } |
| 108 | + break; |
| 109 | + case 'last_active': |
| 110 | + $value = htmlspecialchars( $this->getLanguage()->timeanddate( $value ) ); |
| 111 | + break; |
| 112 | + case 'last_course': |
| 113 | + if ( array_key_exists( $value, $this->courseNames ) ) { |
| 114 | + $value = EPCourses::singleton()->getLinkFor( $this->courseNames[$value] ); |
| 115 | + } |
| 116 | + else { |
| 117 | + wfWarn( 'Course id not in $this->courseNames in ' . __METHOD__ ); |
| 118 | + } |
| 119 | + break; |
| 120 | + case 'org_id': |
| 121 | + $courseId = $this->currentObject->getField( 'last_course' ); |
| 122 | + |
| 123 | + if ( array_key_exists( $courseId, $this->courseOrgs ) ) { |
| 124 | + $orgId = $this->courseOrgs[$courseId]; |
| 125 | + |
| 126 | + if ( array_key_exists( $orgId, $this->orgNames ) ) { |
| 127 | + $value = EPOrgs::singleton()->getLinkFor( $this->orgNames[$orgId] ); |
| 128 | + } |
| 129 | + else { |
| 130 | + wfWarn( 'Org id not in $this->orgNames in ' . __METHOD__ ); |
| 131 | + } |
| 132 | + } |
| 133 | + else { |
| 134 | + wfWarn( 'Course id not in $this->courseOrgs in ' . __METHOD__ ); |
| 135 | + } |
| 136 | + break; |
| 137 | + } |
| 138 | + |
| 139 | + return $value; |
| 140 | + } |
| 141 | + |
| 142 | + /** |
| 143 | + * (non-PHPdoc) |
| 144 | + * @see EPPager::getSortableFields() |
| 145 | + */ |
| 146 | + protected function getSortableFields() { |
| 147 | + return array( |
| 148 | + ); |
| 149 | + } |
| 150 | + |
| 151 | + /** |
| 152 | + * (non-PHPdoc) |
| 153 | + * @see EPPager::hasActionsColumn() |
| 154 | + */ |
| 155 | + protected function hasActionsColumn() { |
| 156 | + return false; |
| 157 | + } |
| 158 | + |
| 159 | + /** |
| 160 | + * (non-PHPdoc) |
| 161 | + * @see IndexPager::getDefaultSort() |
| 162 | + */ |
| 163 | + function getDefaultSort() { |
| 164 | + return 'last_active'; |
| 165 | + } |
| 166 | + |
| 167 | + /** |
| 168 | + * (non-PHPdoc) |
| 169 | + * @see EPPager::getFieldNames() |
| 170 | + */ |
| 171 | + public function getFieldNames() { |
| 172 | + $fields = parent::getFieldNames(); |
| 173 | + |
| 174 | + unset( $fields['id'] ); |
| 175 | + |
| 176 | + $fields = wfArrayInsertAfter( $fields, array( 'org_id' => 'org-id' ), 'user_id' ); |
| 177 | + |
| 178 | + return $fields; |
| 179 | + } |
| 180 | + |
| 181 | + /** |
| 182 | + * (non-PHPdoc) |
| 183 | + * @see IndexPager::doBatchLookups() |
| 184 | + */ |
| 185 | + protected function doBatchLookups() { |
| 186 | + $userIds = array(); |
| 187 | + $courseIds = array(); |
| 188 | + |
| 189 | + $userField = $this->table->getPrefixedField( 'user_id' ); |
| 190 | + $courseField = $this->table->getPrefixedField( 'last_course' ); |
| 191 | + |
| 192 | + while( $student = $this->mResult->fetchObject() ) { |
| 193 | + $userIds[] = (int)$student->$userField; |
| 194 | + $courseIds[] = (int)$student->$courseField; |
| 195 | + } |
| 196 | + |
| 197 | + if ( !empty( $userIds ) ) { |
| 198 | + $result = wfGetDB( DB_SLAVE )->select( |
| 199 | + 'user', |
| 200 | + array( 'user_id', 'user_name', 'user_real_name' ), |
| 201 | + array( 'user_id' => $userIds ), |
| 202 | + __METHOD__ |
| 203 | + ); |
| 204 | + |
| 205 | + while( $user = $result->fetchObject() ) { |
| 206 | + $real = $user->user_real_name === '' ? $user->user_name : $user->user_real_name; |
| 207 | + $this->userNames[$user->user_id] = array( $user->user_name, $real ); |
| 208 | + } |
| 209 | + } |
| 210 | + |
| 211 | + if ( !empty( $courseIds ) ) { |
| 212 | + $courses = EPCourses::singleton()->selectFields( |
| 213 | + array( 'id', 'name', 'org_id' ), |
| 214 | + array( 'id' => array_unique( $courseIds ) ) |
| 215 | + ); |
| 216 | + |
| 217 | + $orgIds = array(); |
| 218 | + |
| 219 | + foreach ( $courses as $courseData ) { |
| 220 | + $this->courseNames[$courseData['id']] = $courseData['name']; |
| 221 | + $orgIds[] = $courseData['org_id']; |
| 222 | + $this->courseOrgs[$courseData['id']] = $courseData['org_id']; |
| 223 | + } |
| 224 | + |
| 225 | + $this->orgNames = EPOrgs::singleton()->selectFields( |
| 226 | + array( 'id', 'name' ), |
| 227 | + array( 'id' => array_unique( $orgIds ) ) |
| 228 | + ); |
| 229 | + } |
| 230 | + } |
| 231 | + |
| 232 | + /** |
| 233 | + * (non-PHPdoc) |
| 234 | + * @see EPPager::getMsg() |
| 235 | + */ |
| 236 | + protected function getMsg( $messageKey ) { |
| 237 | + return wfMsg( strtolower( get_called_class() ) . '-' . str_replace( '_', '-', $messageKey ) ); |
| 238 | + } |
| 239 | + |
| 240 | +} |
\ No newline at end of file |
Index: trunk/extensions/EducationProgram/EducationProgram.i18n.php |
— | — | @@ -775,6 +775,9 @@ |
776 | 776 | 'epca-profile-saved' => 'Your profile has been saved', |
777 | 777 | 'epca-profile-invalid-bio' => 'Your bio needs to be at least contain $1 {{PLURAL:$1|character|characters}}.', |
778 | 778 | 'epca-visible' => 'Publicly list me as Campus Ambassador', |
| 779 | + |
| 780 | + // Special:StudentActivity |
| 781 | + 'ep-studentactivity-count' => 'There {{PLURAL:$1|is|are}} currently $1 {{PLURAL:$1|student|students}} that where active in the last 24 hours.', |
779 | 782 | ); |
780 | 783 | |
781 | 784 | /** Message documentation (Message documentation) |
Index: trunk/extensions/EducationProgram/resources/images/flag_canada.png |
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes on: trunk/extensions/EducationProgram/resources/images/flag_canada.png |
___________________________________________________________________ |
Added: svn:mime-type |
782 | 785 | + application/octet-stream |
Index: trunk/extensions/EducationProgram/resources/images/flag_unitedstates.png |
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes on: trunk/extensions/EducationProgram/resources/images/flag_unitedstates.png |
___________________________________________________________________ |
Added: svn:mime-type |
783 | 786 | + application/octet-stream |
Index: trunk/extensions/EducationProgram/resources/images/student-o-meter_morethan-10.png |
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes on: trunk/extensions/EducationProgram/resources/images/student-o-meter_morethan-10.png |
___________________________________________________________________ |
Added: svn:mime-type |
784 | 787 | + application/octet-stream |
Index: trunk/extensions/EducationProgram/resources/images/flag_israel.png |
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes on: trunk/extensions/EducationProgram/resources/images/flag_israel.png |
___________________________________________________________________ |
Added: svn:mime-type |
785 | 788 | + application/octet-stream |
Index: trunk/extensions/EducationProgram/resources/images/student-o-meter_morethan-20.png |
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes on: trunk/extensions/EducationProgram/resources/images/student-o-meter_morethan-20.png |
___________________________________________________________________ |
Added: svn:mime-type |
786 | 789 | + application/octet-stream |
Index: trunk/extensions/EducationProgram/resources/images/student-o-meter_morethan-30.png |
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes on: trunk/extensions/EducationProgram/resources/images/student-o-meter_morethan-30.png |
___________________________________________________________________ |
Added: svn:mime-type |
787 | 790 | + application/octet-stream |
Index: trunk/extensions/EducationProgram/resources/images/student-o-meter_morethan-40.png |
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes on: trunk/extensions/EducationProgram/resources/images/student-o-meter_morethan-40.png |
___________________________________________________________________ |
Added: svn:mime-type |
788 | 791 | + application/octet-stream |
Index: trunk/extensions/EducationProgram/resources/images/student-o-meter_morethan-50.png |
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes on: trunk/extensions/EducationProgram/resources/images/student-o-meter_morethan-50.png |
___________________________________________________________________ |
Added: svn:mime-type |
789 | 792 | + application/octet-stream |
Index: trunk/extensions/EducationProgram/resources/images/student-o-meter_morethan-60.png |
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes on: trunk/extensions/EducationProgram/resources/images/student-o-meter_morethan-60.png |
___________________________________________________________________ |
Added: svn:mime-type |
790 | 793 | + application/octet-stream |
Index: trunk/extensions/EducationProgram/resources/images/flag_brazil.png |
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes on: trunk/extensions/EducationProgram/resources/images/flag_brazil.png |
___________________________________________________________________ |
Added: svn:mime-type |
791 | 794 | + application/octet-stream |
Index: trunk/extensions/EducationProgram/resources/images/flag_india.png |
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes on: trunk/extensions/EducationProgram/resources/images/flag_india.png |
___________________________________________________________________ |
Added: svn:mime-type |
792 | 795 | + application/octet-stream |
Index: trunk/extensions/EducationProgram/resources/images/flag_mexico.png |
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes on: trunk/extensions/EducationProgram/resources/images/flag_mexico.png |
___________________________________________________________________ |
Added: svn:mime-type |
793 | 796 | + application/octet-stream |
Index: trunk/extensions/EducationProgram/resources/images/flag_tchech republic.png |
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes on: trunk/extensions/EducationProgram/resources/images/flag_tchech republic.png |
___________________________________________________________________ |
Added: svn:mime-type |
794 | 797 | + application/octet-stream |
Index: trunk/extensions/EducationProgram/resources/images/flag_sweden.png |
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes on: trunk/extensions/EducationProgram/resources/images/flag_sweden.png |
___________________________________________________________________ |
Added: svn:mime-type |
795 | 798 | + application/octet-stream |
Index: trunk/extensions/EducationProgram/resources/images/flag_egypt.png |
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes on: trunk/extensions/EducationProgram/resources/images/flag_egypt.png |
___________________________________________________________________ |
Added: svn:mime-type |
796 | 799 | + application/octet-stream |
Index: trunk/extensions/EducationProgram/resources/images/student-o-meter_morethan-0.png |
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes on: trunk/extensions/EducationProgram/resources/images/student-o-meter_morethan-0.png |
___________________________________________________________________ |
Added: svn:mime-type |
797 | 800 | + application/octet-stream |
Index: trunk/extensions/EducationProgram/resources/images/flag_unitedkingdom.png |
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes on: trunk/extensions/EducationProgram/resources/images/flag_unitedkingdom.png |
___________________________________________________________________ |
Added: svn:mime-type |
798 | 801 | + application/octet-stream |
Index: trunk/extensions/EducationProgram/resources/images/flag_germany.png |
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes on: trunk/extensions/EducationProgram/resources/images/flag_germany.png |
___________________________________________________________________ |
Added: svn:mime-type |
799 | 802 | + application/octet-stream |
Index: trunk/extensions/EducationProgram/resources/images/student-o-meter_morethan-5.png |
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes on: trunk/extensions/EducationProgram/resources/images/student-o-meter_morethan-5.png |
___________________________________________________________________ |
Added: svn:mime-type |
800 | 803 | + application/octet-stream |