Index: branches/wmf/1.18wmf1/extensions/MoodBar/SpecialFeedbackDashboard.php |
— | — | @@ -0,0 +1,558 @@ |
| 2 | +<?php |
| 3 | +/** |
| 4 | + * Special:FeedbackDashboard. Special page for viewing moodbar comments. |
| 5 | + */ |
| 6 | +class SpecialFeedbackDashboard extends SpecialPage { |
| 7 | + protected $showHidden = false; |
| 8 | + protected $action = false; |
| 9 | + |
| 10 | + public function __construct() { |
| 11 | + parent::__construct( 'FeedbackDashboard' ); |
| 12 | + } |
| 13 | + |
| 14 | + public function getDescription() { |
| 15 | + return wfMessage( 'moodbar-feedback-title' )->plain(); |
| 16 | + } |
| 17 | + |
| 18 | + public function execute( $par ) { |
| 19 | + global $wgOut, $wgRequest; |
| 20 | + |
| 21 | + $limit = 20; |
| 22 | + $offset = false; |
| 23 | + $filterType = ''; |
| 24 | + $id = intval( $par ); |
| 25 | + if ( $id > 0 ) { |
| 26 | + // Special:FeedbackDashboard/123 is an ID/permalink view |
| 27 | + $filters = array( 'id' => $id ); |
| 28 | + $filterType = 'id'; |
| 29 | + if ( $wgRequest->getCheck( 'show-feedback' ) ) { |
| 30 | + $this->showHidden = true; |
| 31 | + } |
| 32 | + |
| 33 | + if ( $wgRequest->getCheck( 'restore-feedback' ) ) { |
| 34 | + $this->action = 'restore'; |
| 35 | + } elseif ( $wgRequest->getCheck( 'hide-feedback' ) ) { |
| 36 | + $this->action = 'hide'; |
| 37 | + } |
| 38 | + } else { |
| 39 | + // Determine filters and offset from the query string |
| 40 | + $filters = array(); |
| 41 | + $type = $wgRequest->getArray( 'type' ); |
| 42 | + if ( $type ) { |
| 43 | + $filters['type'] = $type; |
| 44 | + } |
| 45 | + $username = strval( $wgRequest->getVal( 'username' ) ); |
| 46 | + if ( $username !== '' ) { |
| 47 | + $filters['username'] = $username; |
| 48 | + } |
| 49 | + $offset = $wgRequest->getVal( 'offset', $offset ); |
| 50 | + if ( count( $filters ) ) { |
| 51 | + $filterType = 'filtered'; |
| 52 | + } |
| 53 | + } |
| 54 | + // Do the query |
| 55 | + $backwards = $wgRequest->getVal( 'dir' ) === 'prev'; |
| 56 | + $res = $this->doQuery( $filters, $limit, $offset, $backwards ); |
| 57 | + |
| 58 | + // Output HTML |
| 59 | + $wgOut->setPageTitle( wfMsg( 'moodbar-feedback-title' ) ); |
| 60 | + $wgOut->addHTML( $this->buildForm( $filterType ) ); |
| 61 | + $wgOut->addHTML( $this->buildList( $res ) ); |
| 62 | + $wgOut->addModuleStyles( 'ext.moodBar.dashboard.styles' ); |
| 63 | + $wgOut->addModules( 'ext.moodBar.dashboard' ); |
| 64 | + } |
| 65 | + |
| 66 | + /** |
| 67 | + * Build the filter form. The state of each form element is preserved |
| 68 | + * using data in $wgRequest. |
| 69 | + * @param $filterType string Value to pass in the <form>'s data-filtertype attribute |
| 70 | + * @return string HTML |
| 71 | + */ |
| 72 | + public function buildForm( $filterType ) { |
| 73 | + global $wgRequest, $wgMoodBarConfig; |
| 74 | + $filtersMsg = wfMessage( 'moodbar-feedback-filters' )->escaped(); |
| 75 | + $typeMsg = wfMessage( 'moodbar-feedback-filters-type' )->escaped(); |
| 76 | + $praiseMsg = wfMessage( 'moodbar-feedback-filters-type-happy' )->escaped(); |
| 77 | + $confusionMsg = wfMessage( 'moodbar-feedback-filters-type-confused' )->escaped(); |
| 78 | + $issuesMsg = wfMessage( 'moodbar-feedback-filters-type-sad' )->escaped(); |
| 79 | + $usernameMsg = wfMessage( 'moodbar-feedback-filters-username' )->escaped(); |
| 80 | + $setFiltersMsg = wfMessage( 'moodbar-feedback-filters-button' )->escaped(); |
| 81 | + $whatIsMsg = wfMessage( 'moodbar-feedback-whatis' )->escaped(); |
| 82 | + $whatIsURL = htmlspecialchars( $wgMoodBarConfig['infoUrl'] ); |
| 83 | + $actionURL = htmlspecialchars( $this->getTitle()->getLinkURL() ); |
| 84 | + |
| 85 | + $types = $wgRequest->getArray( 'type', array() ); |
| 86 | + $happyCheckbox = Xml::check( 'type[]', in_array( 'happy', $types ), |
| 87 | + array( 'id' => 'fbd-filters-type-praise', 'value' => 'happy' ) ); |
| 88 | + $confusedCheckbox = Xml::check( 'type[]', in_array( 'confused', $types ), |
| 89 | + array( 'id' => 'fbd-filters-type-confusion', 'value' => 'confused' ) ); |
| 90 | + $sadCheckbox = Xml::check( 'type[]', in_array( 'sad', $types ), |
| 91 | + array( 'id' => 'fbd-filters-type-issues', 'value' => 'sad' ) ); |
| 92 | + $usernameTextbox = Html::input( 'username', $wgRequest->getText( 'username' ), 'text', |
| 93 | + array( 'id' => 'fbd-filters-username', 'class' => 'fbd-filters-input' ) ); |
| 94 | + $filterType = htmlspecialchars( $filterType ); |
| 95 | + |
| 96 | + return <<<HTML |
| 97 | + <div id="fbd-filters"> |
| 98 | + <form action="$actionURL" data-filtertype="$filterType"> |
| 99 | + <h3 id="fbd-filters-title">$filtersMsg</h3> |
| 100 | + <fieldset id="fbd-filters-types"> |
| 101 | + <legend class="fbd-filters-label">$typeMsg</legend> |
| 102 | + <ul> |
| 103 | + <li> |
| 104 | + $happyCheckbox |
| 105 | + <label for="fbd-filters-type-praise" id="fbd-filters-type-praise-label">$praiseMsg</label> |
| 106 | + </li> |
| 107 | + <li> |
| 108 | + $confusedCheckbox |
| 109 | + <label for="fbd-filters-type-confusion" id="fbd-filters-type-confusion-label">$confusionMsg</label> |
| 110 | + </li> |
| 111 | + <li> |
| 112 | + $sadCheckbox |
| 113 | + <label for="fbd-filters-type-issues" id="fbd-filters-type-issues-label">$issuesMsg</label> |
| 114 | + </li> |
| 115 | + </ul> |
| 116 | + </fieldset> |
| 117 | + <label for="fbd-filters-username" class="fbd-filters-label">$usernameMsg</label> |
| 118 | + $usernameTextbox |
| 119 | + <button type="submit" id="fbd-filters-set">$setFiltersMsg</button> |
| 120 | + </form> |
| 121 | + <a href="$whatIsURL" id="fbd-about">$whatIsMsg</a> |
| 122 | + </div> |
| 123 | +HTML; |
| 124 | + } |
| 125 | + |
| 126 | + /** |
| 127 | + * Format a single list item from a database row. |
| 128 | + * @param $row Database row object |
| 129 | + * @param $params An array of flags. Valid flags: |
| 130 | + * * admin (user can show/hide feedback items) |
| 131 | + * * show-anyway (user has asked to see this hidden item) |
| 132 | + * @return string HTML |
| 133 | + */ |
| 134 | + public static function formatListItem( $row, $params = array() ) { |
| 135 | + global $wgLang, $wgUser; |
| 136 | + |
| 137 | + $classes = array('fbd-item'); |
| 138 | + $toolLinks = array(); |
| 139 | + |
| 140 | + //in case there is an error constructing the feedbackitem object, |
| 141 | + //we don't want to throw an error for the entire page. |
| 142 | + try { |
| 143 | + $feedbackItem = MBFeedbackItem::load( $row ); |
| 144 | + } |
| 145 | + catch (Exception $e) { |
| 146 | + $error_message = wfMessage('moodbar-feedback-load-record-error')->escaped(); |
| 147 | + return <<<HTML |
| 148 | + <li class="$classes"> |
| 149 | + <div class="fbd-item-message" dir="auto">$error_message</div> |
| 150 | + <div style="clear:both"></div> |
| 151 | + </li> |
| 152 | +HTML; |
| 153 | + } |
| 154 | + |
| 155 | + // Type |
| 156 | + $type = $feedbackItem->getProperty('type'); |
| 157 | + $typeMsg = wfMessage( "moodbar-type-$type" )->params( $feedbackItem->getProperty('user') )->escaped(); |
| 158 | + |
| 159 | + // Timestamp |
| 160 | + $now = wfTimestamp( TS_UNIX ); |
| 161 | + $timestamp = wfTimestamp( TS_UNIX, $feedbackItem->getProperty('timestamp') ); |
| 162 | + $time = $wgLang->formatTimePeriod( $now - $timestamp, |
| 163 | + array( 'avoid' => 'avoidminutes', 'noabbrevs' => true ) |
| 164 | + ); |
| 165 | + $timeMsg = wfMessage( 'ago' )->params( $time )->escaped(); |
| 166 | + |
| 167 | + // Comment |
| 168 | + $comment = htmlspecialchars( $feedbackItem->getProperty('comment') ); |
| 169 | + |
| 170 | + // User information |
| 171 | + $userInfo = self::buildUserInfo( $feedbackItem ); |
| 172 | + |
| 173 | + // Tool links |
| 174 | + $toolLinks[] = self::getPermalink( $feedbackItem ); |
| 175 | + |
| 176 | + // Continuation data |
| 177 | + $id = $feedbackItem->getProperty('id'); |
| 178 | + $continueData = wfTimestamp( TS_MW, $timestamp ) . '|' . intval( $id ); |
| 179 | + |
| 180 | + // Now handle hiding, showing, etc |
| 181 | + if ( $feedbackItem->getProperty('hidden-state') > 0 ) { |
| 182 | + $toolLinks = array(); |
| 183 | + if ( !in_array('show-anyway', $params) ) { |
| 184 | + $userInfo = wfMessage('moodbar-user-hidden')->escaped(); |
| 185 | + $comment = wfMessage('moodbar-comment-hidden')->escaped(); |
| 186 | + $type = 'hidden'; |
| 187 | + $typeMsg = ''; |
| 188 | + $classes[] = 'fbd-hidden'; |
| 189 | + } |
| 190 | + |
| 191 | + if ( in_array('admin', $params) ) { |
| 192 | + if ( in_array('show-anyway', $params) ) { |
| 193 | + $toolLinks[] = self::getHiddenFooter($feedbackItem, 'shown'); |
| 194 | + } else { |
| 195 | + $toolLinks[] = self::getHiddenFooter($feedbackItem, 'hidden'); |
| 196 | + } |
| 197 | + } |
| 198 | + |
| 199 | + } elseif ( in_array('admin', $params) ) { |
| 200 | + $toolLinks[] = self::getHideLink( $feedbackItem ); |
| 201 | + |
| 202 | + } |
| 203 | + |
| 204 | + //only show response elements if feedback is not hidden, and user is logged in |
| 205 | + if ($feedbackItem->getProperty('hidden-state') == false |
| 206 | + && !$wgUser->isAnon() ) { |
| 207 | + $respondToThis = "<span>".wfMessage('moodbar-respond-collapsed')->escaped().'</span> '.wfMessage("moodbar-respond-text")->escaped(); |
| 208 | + $responseElements = <<<HTML |
| 209 | + <div class="fbd-item-response"> |
| 210 | + <a class="fbd-respond-link">$respondToThis</a> |
| 211 | + </div> |
| 212 | +HTML; |
| 213 | + } |
| 214 | + |
| 215 | + $classes = Sanitizer::encodeAttribute( implode(' ', $classes) ); |
| 216 | + $toolLinks = implode("\n", $toolLinks ); |
| 217 | + if (!isset($responseElements)) { |
| 218 | + $responseElements = ""; |
| 219 | + } |
| 220 | + |
| 221 | + return <<<HTML |
| 222 | + <li class="$classes" data-mbccontinue="$continueData"> |
| 223 | + <div class="fbd-item-emoticon fbd-item-emoticon-$type"> |
| 224 | + <span class="fbd-item-emoticon-label">$typeMsg</span> |
| 225 | + </div> |
| 226 | + <div class="fbd-item-time">$timeMsg</div> |
| 227 | + $userInfo |
| 228 | + <div class="fbd-item-message" dir="auto">$comment</div> |
| 229 | + $toolLinks |
| 230 | + $responseElements |
| 231 | + <div style="clear:both"></div> |
| 232 | + </li> |
| 233 | +HTML; |
| 234 | + } |
| 235 | + |
| 236 | + /** |
| 237 | + * Build the "user information" part of an item on the feedback dashboard. |
| 238 | + * @param $feedbackItem MBFeedbackItem representing the feedback to show |
| 239 | + * @return string HTML |
| 240 | + */ |
| 241 | + protected static function buildUserInfo( $feedbackItem ) { |
| 242 | + $user = $feedbackItem->getProperty('user'); |
| 243 | + $username = htmlspecialchars( $user->getName() ); |
| 244 | + |
| 245 | + //$links = Linker::userToolLinks( $user->getId(), $username ); |
| 246 | + // 1.17wmf1 compat |
| 247 | + $links = $GLOBALS['wgUser']->getSkin() |
| 248 | + ->userToolLinks( $user->getId(), $username ); |
| 249 | + |
| 250 | + $userPageUrl = htmlspecialchars($user->getUserPage()->getLocalURL()); |
| 251 | + |
| 252 | + $userLink = Linker::userLink( $user->getId(), $username ); |
| 253 | + |
| 254 | + return <<<HTML |
| 255 | + <div class="fbd-item-userName"> |
| 256 | + $userLink |
| 257 | + <span class="fbd-item-userLinks"> |
| 258 | + $links |
| 259 | + </span> |
| 260 | + </div> |
| 261 | +HTML; |
| 262 | + } |
| 263 | + |
| 264 | + /** |
| 265 | + * Gets a permanent link to a given feedback item |
| 266 | + * @param $feedbackItem MBFeedbackItem to get a link for |
| 267 | + * @return string HTML |
| 268 | + */ |
| 269 | + protected static function getPermalink( $feedbackItem ) { |
| 270 | + $id = $feedbackItem->getProperty('id'); |
| 271 | + $permalinkTitle = SpecialPage::getTitleFor( 'FeedbackDashboard', $id ); |
| 272 | + $permalinkText = wfMessage( 'moodbar-feedback-permalink' )->escaped(); |
| 273 | + $permalink = $GLOBALS['wgUser']->getSkin()->link( $permalinkTitle, $permalinkText ); |
| 274 | + return Xml::tags( 'div', array( 'class' => 'fbd-item-permalink' ), "($permalink)" ); |
| 275 | + } |
| 276 | + |
| 277 | + /** |
| 278 | + * Gets the footer for a hidden comment |
| 279 | + * @param $feedbackItem The feedback item in question. |
| 280 | + * @param $mode The mode to show in. Either 'shown' or 'hidden' |
| 281 | + * @return string HTML |
| 282 | + */ |
| 283 | + protected static function getHiddenFooter( $feedbackItem, $mode ) { |
| 284 | + global $wgLang; |
| 285 | + |
| 286 | + $id = $feedbackItem->getProperty('id'); |
| 287 | + $permalinkTitle = SpecialPage::getTitleFor( 'FeedbackDashboard', $id ); |
| 288 | + if ( $mode === 'shown' ) { |
| 289 | + $linkText = wfMessage( 'moodbar-feedback-restore' )->escaped(); |
| 290 | + $query = array('restore-feedback' => '1'); |
| 291 | + $link = $GLOBALS['wgUser']->getSkin() |
| 292 | + ->link( $permalinkTitle, $linkText, array(), $query ); |
| 293 | + $link = Xml::tags( 'span', array( 'class' => 'fbd-item-restore' ), "($link)" ); |
| 294 | + |
| 295 | + $feedback_hidden_detail = self::getFeedbackHiddenDetail($id); |
| 296 | + |
| 297 | + if($feedback_hidden_detail === false) { |
| 298 | + $footer = wfMessage('moodbar-hidden-footer-without-log')-> |
| 299 | + rawParams( $link )->escaped(); |
| 300 | + } |
| 301 | + else { |
| 302 | + $footer = wfMessage('moodbar-hidden-footer')-> |
| 303 | + rawParams( htmlspecialchars( $feedback_hidden_detail->log_user_text ), |
| 304 | + $wgLang->date($feedback_hidden_detail->log_timestamp), |
| 305 | + $wgLang->time($feedback_hidden_detail->log_timestamp), |
| 306 | + htmlspecialchars( $feedback_hidden_detail->log_comment ), |
| 307 | + $link )->escaped(); |
| 308 | + } |
| 309 | + |
| 310 | + return Xml::tags( 'div', array( 'class' => 'error' ), $footer ); |
| 311 | + } elseif ( $mode === 'hidden' ) { |
| 312 | + $linkText = wfMessage('moodbar-feedback-show')->escaped(); |
| 313 | + $query = array('show-feedback' => '1'); |
| 314 | + $link = $GLOBALS['wgUser']->getSkin() |
| 315 | + ->link( $permalinkTitle, $linkText, array(), $query ); |
| 316 | + return Xml::tags( 'div', array( 'class' => 'fbd-item-show' ), "($link)" ); |
| 317 | + } |
| 318 | + } |
| 319 | + |
| 320 | + /** |
| 321 | + * Gets a link to hide the current feedback item from view |
| 322 | + * @param $feedbackItem The feedback item to show a hide link for |
| 323 | + * @return string HTML |
| 324 | + */ |
| 325 | + protected static function getHideLink( $feedbackItem ) { |
| 326 | + $id = $feedbackItem->getProperty('id'); |
| 327 | + $permalinkTitle = SpecialPage::getTitleFor( 'FeedbackDashboard', $id ); |
| 328 | + $permalinkText = wfMessage( 'moodbar-feedback-hide' )->escaped(); |
| 329 | + $link = $GLOBALS['wgUser']->getSkin() |
| 330 | + ->link( $permalinkTitle, $permalinkText, |
| 331 | + array(), array('hide-feedback' => '1') ); |
| 332 | + return Xml::tags( 'div', array( 'class' => 'fbd-item-hide' ), "($link)" ); |
| 333 | + } |
| 334 | + |
| 335 | + |
| 336 | + /** |
| 337 | + * Build a comment list from a query result |
| 338 | + * @param $res array Return value of doQuery() |
| 339 | + * @return string HTML |
| 340 | + */ |
| 341 | + public function buildList( $res ) { |
| 342 | + global $wgRequest, $wgUser; |
| 343 | + $list = ''; |
| 344 | + |
| 345 | + $params = array(); |
| 346 | + if ( $wgUser->isAllowed('moodbar-admin') ) { |
| 347 | + $params[] = 'admin'; |
| 348 | + |
| 349 | + if ( $this->showHidden ) { |
| 350 | + $params[] = 'show-anyway'; |
| 351 | + } |
| 352 | + } |
| 353 | + |
| 354 | + foreach ( $res['rows'] as $row ) { |
| 355 | + $list .= self::formatListItem( $row, $params ); |
| 356 | + } |
| 357 | + |
| 358 | + if ( $list === '' ) { |
| 359 | + return '<div id="fbd-list">' . wfMessage( 'moodbar-feedback-noresults' )->escaped() . '</div>'; |
| 360 | + } else { |
| 361 | + // FIXME: We also need to show the More link (hidden) if there were no results |
| 362 | + $olderRow = $res['olderRow']; |
| 363 | + $newerRow = $res['newerRow']; |
| 364 | + $html = "<ul id=\"fbd-list\">$list</ul>"; |
| 365 | + |
| 366 | + // Only set for showing an individual row. |
| 367 | + $form = null; |
| 368 | + if ( $this->action == 'restore' ) { |
| 369 | + $form = new MBRestoreForm( $row->mbf_id ); |
| 370 | + } elseif ( $this->action == 'hide' ) { |
| 371 | + $form = new MBHideForm( $row->mbf_id ); |
| 372 | + } |
| 373 | + |
| 374 | + if ( $form ) { |
| 375 | + $result = $form->show(); |
| 376 | + if ( $result === true ) { |
| 377 | + global $wgOut; |
| 378 | + $title = SpecialPage::getTitleFor( 'FeedbackDashboard', |
| 379 | + $row->mbf_id ); |
| 380 | + $wgOut->redirect( $title->getFullURL() ); |
| 381 | + } else { |
| 382 | + $html .= "\n$result\n"; |
| 383 | + } |
| 384 | + } |
| 385 | + |
| 386 | + // Output the "More" link |
| 387 | + $moreText = wfMessage( 'moodbar-feedback-more' )->escaped(); |
| 388 | + $attribs = array( 'id' => 'fbd-list-more' ); |
| 389 | + if ( !$olderRow ) { |
| 390 | + // There are no more rows. Hide the More link |
| 391 | + // We still need to output it because the JS may need it later |
| 392 | + $attribs['style'] = 'display: none;'; |
| 393 | + } |
| 394 | + $html .= Html::rawElement( 'div', $attribs, '<a href="#">' . $moreText . '</a>' ); |
| 395 | + |
| 396 | + // Paging links for no-JS clients |
| 397 | + $olderURL = $newerURL = false; |
| 398 | + if ( $olderRow ) { |
| 399 | + $olderOffset = wfTimestamp( TS_MW, $olderRow->mbf_timestamp ) . '|' . intval( $olderRow->mbf_id ); |
| 400 | + $olderURL = htmlspecialchars( $this->getTitle()->getLinkURL( $this->getQuery( $olderOffset, false ) ) ); |
| 401 | + } |
| 402 | + if ( $newerRow ) { |
| 403 | + $newerOffset = wfTimestamp( TS_MW, $newerRow->mbf_timestamp ) . '|' . intval( $newerRow->mbf_id ); |
| 404 | + $newerURL = htmlspecialchars( $this->getTitle()->getLinkURL( $this->getQuery( $newerOffset, true ) ) ); |
| 405 | + } |
| 406 | + $olderText = wfMessage( 'moodbar-feedback-older' )->escaped(); |
| 407 | + $newerText = wfMessage( 'moodbar-feedback-newer' )->escaped(); |
| 408 | + $html .= '<div id="fbd-list-newer-older"><div id="fbd-list-newer">'; |
| 409 | + if ( $newerURL ) { |
| 410 | + $html .= "<a href=\"$newerURL\">$newerText</a>"; |
| 411 | + } else { |
| 412 | + $html .= "<span class=\"fbd-page-disabled\">$newerText</span>"; |
| 413 | + } |
| 414 | + $html .= '</div><div id="fbd-list-older">'; |
| 415 | + if ( $olderURL ) { |
| 416 | + $html .= "<a href=\"$olderURL\">$olderText</a>"; |
| 417 | + } else { |
| 418 | + $html .= "<span class=\"fbd-page-disabled\">$olderText</span>"; |
| 419 | + } |
| 420 | + $html .= '</div></div><div style="clear: both;"></div>'; |
| 421 | + return $html; |
| 422 | + } |
| 423 | + } |
| 424 | + |
| 425 | + /** |
| 426 | + * Get a set of comments from the database. |
| 427 | + * |
| 428 | + * The way paging is handled by this function is a bit weird. $offset is taken from |
| 429 | + * the last row that was displayed, as opposed to the first row that was not displayed. |
| 430 | + * This means that if $offset is set, the first row in the result (the one matching $offset) |
| 431 | + * is dropped, as well as the last row. The dropped rows are only used to detect the presence |
| 432 | + * or absence of more rows in each direction, the offset values for paging are taken from the |
| 433 | + * first and last row that are actually shown. |
| 434 | + * |
| 435 | + * $retval['olderRow'] is the row whose offset should be used to display older rows, or null if |
| 436 | + * there are no older rows. This means that, if there are older rows, $retval['olderRow'] is set |
| 437 | + * to the oldest row in $retval['rows']. $retval['newerRows'] is set similarly. |
| 438 | + * |
| 439 | + * @param $filters array Array of filters to apply. Recognized keys are 'type' (array), 'username' (string) and 'id' (int) |
| 440 | + * @param $limit int Number of comments to fetch |
| 441 | + * @param $offset string Query offset. Timestamp and ID of the last shown result, formatted as 'timestamp|id' |
| 442 | + * @param $backwards bool If true, page in ascending order rather than descending order, i.e. get $limit rows after $offset rather than before $offset. The result will still be sorted in descending order |
| 443 | + * @return array( 'rows' => array( row, row, ... ), 'olderRow' => row|null, 'newerRow' => row|null ) |
| 444 | + */ |
| 445 | + public function doQuery( $filters, $limit, $offset, $backwards ) { |
| 446 | + global $wgUser; |
| 447 | + |
| 448 | + $dbr = wfGetDB( DB_SLAVE ); |
| 449 | + |
| 450 | + // Set $conds based on $filters |
| 451 | + $conds = array(); |
| 452 | + if ( isset( $filters['type'] ) ) { |
| 453 | + $conds['mbf_type'] = $filters['type']; |
| 454 | + } |
| 455 | + if ( isset( $filters['username'] ) ) { |
| 456 | + $user = User::newFromName( $filters['username'] ); // Returns false for IPs |
| 457 | + if ( !$user || $user->isAnon() ) { |
| 458 | + $conds['mbf_user_id'] = 0; |
| 459 | + $conds['mbf_user_ip'] = $filters['username']; |
| 460 | + } else { |
| 461 | + $conds['mbf_user_id'] = $user->getID(); |
| 462 | + $conds[] = 'mbf_user_ip IS NULL'; |
| 463 | + } |
| 464 | + } |
| 465 | + if ( isset( $filters['id'] ) ) { |
| 466 | + $conds['mbf_id'] = $filters['id']; |
| 467 | + } elseif ( !$wgUser->isAllowed('moodbar-admin') ) { |
| 468 | + $conds['mbf_hidden_state'] = 0; |
| 469 | + } |
| 470 | + |
| 471 | + // Process $offset |
| 472 | + if ( $offset !== false ) { |
| 473 | + $arr = explode( '|', $offset, 2 ); |
| 474 | + $ts = $dbr->addQuotes( $dbr->timestamp( $arr[0] ) ); |
| 475 | + $id = isset( $arr[1] ) ? intval( $arr[1] ) : 0; |
| 476 | + $op = $backwards ? '>' : '<'; |
| 477 | + $conds[] = "mbf_timestamp $op $ts OR (mbf_timestamp = $ts AND mbf_id $op= $id)"; |
| 478 | + } |
| 479 | + |
| 480 | + // Do the actual query |
| 481 | + $desc = $backwards ? '' : ' DESC'; |
| 482 | + $res = $dbr->select( array( 'moodbar_feedback', 'user' ), array( |
| 483 | + 'user_name', 'mbf_id', 'mbf_type', |
| 484 | + 'mbf_timestamp', 'mbf_user_id', 'mbf_user_ip', 'mbf_comment', |
| 485 | + 'mbf_anonymous', 'mbf_hidden_state', |
| 486 | + ), |
| 487 | + $conds, |
| 488 | + __METHOD__, |
| 489 | + array( 'LIMIT' => $limit + 2, 'ORDER BY' => "mbf_timestamp$desc, mbf_id$desc" ), |
| 490 | + array( 'user' => array( 'LEFT JOIN', 'user_id=mbf_user_id' ) ) |
| 491 | + ); |
| 492 | + $rows = iterator_to_array( $res, /*$use_keys=*/false ); |
| 493 | + |
| 494 | + // Figure out whether there are newer and older rows |
| 495 | + $olderRow = $newerRow = null; |
| 496 | + $count = count( $rows ); |
| 497 | + if ( $offset && $count > 0 ) { |
| 498 | + // If there is an offset, drop the first row |
| 499 | + if ( $count > 1 ) { |
| 500 | + array_shift( $rows ); |
| 501 | + $count--; |
| 502 | + } |
| 503 | + // We now know there is a previous row |
| 504 | + $newerRow = $rows[0]; |
| 505 | + } |
| 506 | + if ( $count > $limit ) { |
| 507 | + // If there are rows past the limit, drop them |
| 508 | + array_splice( $rows, $limit ); |
| 509 | + // We now know there is a next row |
| 510 | + $olderRow = $rows[$limit - 1]; |
| 511 | + } |
| 512 | + |
| 513 | + // If we got things backwards, reverse them |
| 514 | + if ( $backwards ) { |
| 515 | + $rows = array_reverse( $rows ); |
| 516 | + list( $olderRow, $newerRow ) = array( $newerRow, $olderRow ); |
| 517 | + } |
| 518 | + return array( 'rows' => $rows, 'olderRow' => $olderRow, 'newerRow' => $newerRow ); |
| 519 | + } |
| 520 | + |
| 521 | + /** |
| 522 | + * Get a query string array for a given offset, using filter parameters obtained from $wgRequest. |
| 523 | + * @param $offset string Value for &offset= |
| 524 | + * @param $backwards bool If true, set &dir=prev |
| 525 | + * @return array |
| 526 | + */ |
| 527 | + protected function getQuery( $offset, $backwards ) { |
| 528 | + global $wgRequest; |
| 529 | + $query = array( |
| 530 | + 'type' => $wgRequest->getArray( 'type', array() ), |
| 531 | + 'username' => $wgRequest->getVal( 'username' ), |
| 532 | + 'offset' => $offset, |
| 533 | + ); |
| 534 | + if ( $backwards ) { |
| 535 | + $query['dir'] = 'prev'; |
| 536 | + } |
| 537 | + return $query; |
| 538 | + } |
| 539 | + |
| 540 | + /** |
| 541 | + * Get admin's username/timestamp/reason for hiding a feedback |
| 542 | + * @param $mbf_id primary key for moodbar_feedback |
| 543 | + * @return ResultWrapper|bool |
| 544 | + */ |
| 545 | + protected static function getFeedbackHiddenDetail( $mbf_id ) { |
| 546 | + $dbr = wfGetDB( DB_SLAVE ); |
| 547 | + |
| 548 | + return $dbr->selectRow( array( 'logging' ), |
| 549 | + array( 'log_user_text', 'log_timestamp', 'log_comment' ), |
| 550 | + array( 'log_namespace' => NS_SPECIAL, |
| 551 | + 'log_title' => 'FeedbackDashboard/' . intval( $mbf_id ), |
| 552 | + 'log_action' => 'hide', |
| 553 | + 'log_type' => 'moodbar' ), |
| 554 | + __METHOD__, |
| 555 | + array( 'LIMIT' => 1, 'ORDER BY' => "log_timestamp DESC" ) |
| 556 | + ); |
| 557 | + } |
| 558 | + |
| 559 | +} |
Property changes on: branches/wmf/1.18wmf1/extensions/MoodBar/SpecialFeedbackDashboard.php |
___________________________________________________________________ |
Added: svn:eol-style |
1 | 560 | + native |
Index: branches/wmf/1.18wmf1/extensions/MoodBar/DashboardForms.php |
— | — | @@ -0,0 +1,194 @@ |
| 2 | +<?php |
| 3 | +/** |
| 4 | + * Contains assorted forms associated with the Feedback Dashboards |
| 5 | + */ |
| 6 | + |
| 7 | + |
| 8 | +abstract class MBDashboardForm { |
| 9 | + /** |
| 10 | + * Gets an HTMLForm object suitable for showing this form |
| 11 | + */ |
| 12 | + public function getForm() { |
| 13 | + $form = new HTMLForm( $this->getFormDescriptor() ); |
| 14 | + $form->setSubmitCallback( array( $this, 'submit' ) ); |
| 15 | + |
| 16 | + return $form; |
| 17 | + } |
| 18 | + |
| 19 | + /** |
| 20 | + * Shows the form, but returns the output as HTML instead of sending it to $wgOut |
| 21 | + */ |
| 22 | + public function show() { |
| 23 | + global $wgOut; |
| 24 | + |
| 25 | + $oldText = $wgOut->getHTML(); |
| 26 | + $wgOut->clearHTML(); |
| 27 | + |
| 28 | + $result = $this->getForm()->show(); |
| 29 | + |
| 30 | + $output = $wgOut->getHTML(); |
| 31 | + $wgOut->clearHTML( ); |
| 32 | + $wgOut->addHTML( $oldText ); |
| 33 | + |
| 34 | + if ( $result === true ) { |
| 35 | + return true; |
| 36 | + } |
| 37 | + |
| 38 | + return $output; |
| 39 | + } |
| 40 | + |
| 41 | + /** |
| 42 | + * Gets the HTMLForm form descriptor |
| 43 | + * @return A structured array suitable for the HTMLForm constructor. |
| 44 | + */ |
| 45 | + public abstract function getFormDescriptor(); |
| 46 | + |
| 47 | + /** |
| 48 | + * Submits the form. |
| 49 | + */ |
| 50 | + public abstract function submit( $data ); |
| 51 | +} |
| 52 | + |
| 53 | +abstract class MBActionForm extends MBDashboardForm { |
| 54 | + public function __construct( $id ) { |
| 55 | + $this->id = $id; |
| 56 | + } |
| 57 | + |
| 58 | + public function getForm() { |
| 59 | + $form = parent::getForm(); |
| 60 | + |
| 61 | + $title = SpecialPage::getTitleFor( 'FeedbackDashboard', $this->id ); |
| 62 | + $form->setTitle( $title ); |
| 63 | + |
| 64 | + return $form; |
| 65 | + } |
| 66 | + |
| 67 | + /** |
| 68 | + * Adds an 'item' field to provide built in support for doing actions to feedback items. |
| 69 | + */ |
| 70 | + public function getFormDescriptor() { |
| 71 | + $template = array( |
| 72 | + 'item' => array( |
| 73 | + 'type' => 'hidden', |
| 74 | + 'required' => true, |
| 75 | + 'readonly' => 'readonly', |
| 76 | + 'label-message' => 'moodbar-action-item', |
| 77 | + 'default' => $this->id, |
| 78 | + ), |
| 79 | + 'reason' => array( |
| 80 | + 'type' => 'text', |
| 81 | + 'size' => '60', |
| 82 | + 'maxlength' => '200', |
| 83 | + 'label-message' => 'movereason', |
| 84 | + ), |
| 85 | + ); |
| 86 | + |
| 87 | + return $template; |
| 88 | + } |
| 89 | + |
| 90 | + /** |
| 91 | + * Load our item and do our thing |
| 92 | + */ |
| 93 | + public function submit( $data ) { |
| 94 | + $id = $data['item']; |
| 95 | + $dbr = wfGetDB( DB_SLAVE ); |
| 96 | + |
| 97 | + $row = $dbr->selectRow( 'moodbar_feedback', '*', |
| 98 | + array( 'mbf_id' => $id ), __METHOD__ ); |
| 99 | + |
| 100 | + if ( ! $row ) { |
| 101 | + return wfMessage( 'moodbar-invalid-item' )->parse(); |
| 102 | + } |
| 103 | + |
| 104 | + $feedbackItem = MBFeedbackItem::load( $row ); |
| 105 | + |
| 106 | + $this->manipulateItem( $feedbackItem, $data ); |
| 107 | + |
| 108 | + return true; |
| 109 | + } |
| 110 | + |
| 111 | + /** |
| 112 | + * Do whatever action you need to do to the $feedbackItem in this function |
| 113 | + * @param $feedbackItem MBFeedbackItem to manipulate. |
| 114 | + * @param $data The form data. |
| 115 | + */ |
| 116 | + protected abstract function manipulateItem( $feedbackItem, $data ); |
| 117 | +} |
| 118 | + |
| 119 | +class MBHideForm extends MBActionForm { |
| 120 | + public function getFormDescriptor() { |
| 121 | + $desc = parent::getFormDescriptor(); |
| 122 | + $desc += array( |
| 123 | + 'hide-feedback' => array( |
| 124 | + 'type' => 'hidden', |
| 125 | + 'default' => '1', |
| 126 | + 'name' => 'hide-feedback', |
| 127 | + ), |
| 128 | + ); |
| 129 | + |
| 130 | + return $desc; |
| 131 | + } |
| 132 | + |
| 133 | + protected function manipulateItem( $feedbackItem, $data ) { |
| 134 | + $feedbackItem->setProperty('hidden-state', 255); |
| 135 | + $feedbackItem->save(); |
| 136 | + |
| 137 | + $title = SpecialPage::getTitleFor( 'FeedbackDashboard', |
| 138 | + $feedbackItem->getProperty('id') ); |
| 139 | + |
| 140 | + $logPage = new LogPage('moodbar'); |
| 141 | + $logPage->addEntry( 'hide', $title, $data['reason'] ); |
| 142 | + } |
| 143 | + |
| 144 | + public function getForm() { |
| 145 | + $form = parent::getForm(); |
| 146 | + |
| 147 | + $header = Html::rawElement( 'h3', null, |
| 148 | + wfMessage( 'moodbar-hide-header' )->parse() ); |
| 149 | + |
| 150 | + $header .= wfMessage( 'moodbar-hide-intro' )->parse(); |
| 151 | + |
| 152 | + $form->addPreText( $header ); |
| 153 | + |
| 154 | + return $form; |
| 155 | + } |
| 156 | +} |
| 157 | + |
| 158 | +class MBRestoreForm extends MBActionForm { |
| 159 | + public function getFormDescriptor() { |
| 160 | + $desc = parent::getFormDescriptor(); |
| 161 | + $desc += array( |
| 162 | + 'restore-feedback' => array( |
| 163 | + 'type' => 'hidden', |
| 164 | + 'default' => '1', |
| 165 | + 'name' => 'restore-feedback', |
| 166 | + ), |
| 167 | + ); |
| 168 | + |
| 169 | + return $desc; |
| 170 | + } |
| 171 | + |
| 172 | + protected function manipulateItem( $feedbackItem, $data ) { |
| 173 | + $feedbackItem->setProperty('hidden-state', 0); |
| 174 | + $feedbackItem->save(); |
| 175 | + |
| 176 | + $title = SpecialPage::getTitleFor( 'FeedbackDashboard', |
| 177 | + $feedbackItem->getProperty('id') ); |
| 178 | + |
| 179 | + $logPage = new LogPage('moodbar'); |
| 180 | + $logPage->addEntry( 'restore', $title, $data['reason'] ); |
| 181 | + } |
| 182 | + |
| 183 | + public function getForm() { |
| 184 | + $form = parent::getForm(); |
| 185 | + |
| 186 | + $header = Html::rawElement( 'h3', null, |
| 187 | + wfMessage( 'moodbar-restore-header' )->parse() ); |
| 188 | + |
| 189 | + $header .= wfMessage( 'moodbar-restore-intro' )->parse(); |
| 190 | + |
| 191 | + $form->addPreText( $header ); |
| 192 | + |
| 193 | + return $form; |
| 194 | + } |
| 195 | +} |
Property changes on: branches/wmf/1.18wmf1/extensions/MoodBar/DashboardForms.php |
___________________________________________________________________ |
Added: svn:eol-style |
1 | 196 | + native |
Index: branches/wmf/1.18wmf1/extensions/MoodBar/MoodBar.i18n.php |
— | — | @@ -0,0 +1,3291 @@ |
| 2 | +<?php |
| 3 | +/** |
| 4 | + * Internationalisation file for MoodBar extension. |
| 5 | + * |
| 6 | + * @file |
| 7 | + * @ingroup Extensions |
| 8 | + */ |
| 9 | + |
| 10 | +$messages = array(); |
| 11 | + |
| 12 | +/** English |
| 13 | + * @author Andrew Garrett |
| 14 | + */ |
| 15 | +$messages['en'] = array( |
| 16 | + 'moodbar-desc' => 'Allows specified users to provide feedback on their editing experience', |
| 17 | + // Portlet link |
| 18 | + 'moodbar-trigger-feedback' => 'Feedback about editing', |
| 19 | + 'moodbar-trigger-share' => 'Share your experience', |
| 20 | + 'moodbar-trigger-editing' => 'Editing $1...', |
| 21 | + 'tooltip-p-moodbar-trigger-feedback' => '', |
| 22 | + 'tooltip-p-moodbar-trigger-share' => '', |
| 23 | + 'tooltip-p-moodbar-trigger-editing' => '', |
| 24 | + // Overlay |
| 25 | + 'moodbar-close' => '(close)', |
| 26 | + 'moodbar-intro-feedback' => 'Editing $1 made me...', |
| 27 | + 'moodbar-intro-share' => 'My experience on $1 made me...', |
| 28 | + 'moodbar-intro-editing' => 'Editing $1 made me...', |
| 29 | + 'moodbar-type-happy-title' => 'Happy', |
| 30 | + 'moodbar-type-sad-title' => 'Sad', |
| 31 | + 'moodbar-type-confused-title' => 'Confused', |
| 32 | + 'tooltip-moodbar-what' => 'Learn more about this feature', |
| 33 | + 'moodbar-what-target' => 'http://www.mediawiki.org/wiki/MoodBar', |
| 34 | + 'moodbar-what-label' => 'What is this?', |
| 35 | + 'moodbar-what-collapsed' => '▶', // Optional, only change e.g. for RTL languages. ▶ |
| 36 | + 'moodbar-what-expanded' => '▼', // Ignore, do not translate. ▼ |
| 37 | + 'moodbar-respond-collapsed' => '▶', // Optional, only change e.g. for RTL languages. ▶ |
| 38 | + 'moodbar-respond-expanded' => '▼', // Ignore, do not translate. ▼ |
| 39 | + 'moodbar-respond-text' => 'Respond to this', |
| 40 | + 'moodbar-response-add' => 'Add a response', |
| 41 | + 'moodbar-response-nosig' => 'signature not required', |
| 42 | + 'moodbar-response-btn' => 'Send response', |
| 43 | + 'moodbar-what-content' => 'This feature is designed to help the community understand the experience of people editing the site. |
| 44 | +For more information, please visit the $1.', |
| 45 | + 'moodbar-what-link' => 'feature page', |
| 46 | + 'moodbar-privacy' => 'By submitting, you agree to transparency under these $1.', |
| 47 | + 'moodbar-privacy-link' => 'terms', |
| 48 | + 'moodbar-disable-link' => "I'm not interested. Please disable this feature.", |
| 49 | + 'moodbar-form-title' => 'Because...', |
| 50 | + 'moodbar-form-note' => '140 character maximum', |
| 51 | + 'moodbar-form-note-dynamic' => '$1 characters remaining', |
| 52 | + 'moodbar-form-submit' => 'Share feedback', |
| 53 | + 'moodbar-form-policy-text' => 'By submitting, $1', |
| 54 | + 'moodbar-form-policy-label' => 'our policy', |
| 55 | + 'moodbar-loading-title' => 'Sharing...', |
| 56 | + 'moodbar-success-title' => 'Thanks!', |
| 57 | + 'moodbar-error-title' => 'Oops!', |
| 58 | + 'moodbar-loading-subtitle' => 'We are sharing your feedback…', |
| 59 | + 'moodbar-success-subtitle' => 'Sharing your editing experience helps us improve $1.', |
| 60 | + 'moodbar-error-subtitle' => 'Something went wrong! Please try sharing your feedback again later.', |
| 61 | + // Special:MoodBar |
| 62 | + 'right-moodbar-view' => 'View and export MoodBar feedback', |
| 63 | + 'right-moodbar-admin' => 'Alter visibility on the feedback dashboard', |
| 64 | + 'moodbar-admin-title' => 'MoodBar feedback', |
| 65 | + 'moodbar-admin-intro' => 'This page allows you to view feedback submitted with the MoodBar.', |
| 66 | + 'moodbar-admin-empty' => 'No results', |
| 67 | + 'moodbar-header-id' => 'Feedback ID', |
| 68 | + 'moodbar-header-timestamp' => 'Timestamp', |
| 69 | + 'moodbar-header-type' => 'Type', |
| 70 | + 'moodbar-header-page' => 'Page', |
| 71 | + 'moodbar-header-usertype' => 'User type', |
| 72 | + 'moodbar-header-user' => 'User', |
| 73 | + 'moodbar-header-editmode' => 'Edit mode', |
| 74 | + 'moodbar-header-bucket' => 'Testing bucket', |
| 75 | + 'moodbar-header-system' => 'System type', |
| 76 | + 'moodbar-header-locale' => 'Locale', |
| 77 | + 'moodbar-header-useragent' => 'User agent', |
| 78 | + 'moodbar-header-comment' => 'Comments', |
| 79 | + 'moodbar-header-user-editcount' => 'User edit count', |
| 80 | + 'moodbar-header-namespace' => 'Namespace', |
| 81 | + 'moodbar-header-own-talk' => 'Own talk page', |
| 82 | + // Special:MoodBarFeedback |
| 83 | + 'moodbar-feedback-title' => 'Feedback dashboard', |
| 84 | + 'moodbar-feedback-response-title' => 'Feedback dashboard response', |
| 85 | + 'moodbar-feedback-view-link' => '(View the feedback)', |
| 86 | + 'moodbar-feedback-filters' => 'Filters', |
| 87 | + 'moodbar-feedback-filters-type' => 'Mood:', |
| 88 | + 'moodbar-feedback-filters-type-happy' => 'Happy', |
| 89 | + 'moodbar-feedback-filters-type-confused' => 'Confused', |
| 90 | + 'moodbar-feedback-filters-type-sad' => 'Sad', |
| 91 | + 'moodbar-feedback-filters-username' => 'Username', |
| 92 | + 'moodbar-feedback-filters-button' => 'Set filters', |
| 93 | + 'moodbar-feedback-whatis' => 'What is this feature?', |
| 94 | + 'moodbar-feedback-permalink' => 'link to here', |
| 95 | + 'moodbar-feedback-noresults' => 'There are no comments that match your filters.', |
| 96 | + 'moodbar-feedback-more' => 'More', |
| 97 | + 'moodbar-feedback-nomore' => 'There are no more results to show.', |
| 98 | + 'moodbar-feedback-newer' => 'Newer', |
| 99 | + 'moodbar-feedback-older' => 'Older', |
| 100 | + 'moodbar-feedback-ajaxerror' => 'An error occurred while fetching more results.', |
| 101 | + 'moodbar-feedback-load-record-error' => 'An error occurred while loading a record.', |
| 102 | + 'moodbar-user-hidden' => '(User hidden)', |
| 103 | + 'moodbar-comment-hidden' => '(Feedback hidden by administrative action)', |
| 104 | + 'moodbar-feedback-show' => 'show hidden feedback', |
| 105 | + 'moodbar-feedback-hide' => 'hide feedback', |
| 106 | + 'moodbar-feedback-action-confirm' => 'Confirm', |
| 107 | + 'moodbar-feedback-action-cancel' => 'Cancel', |
| 108 | + 'moodbar-hidden-footer' => 'Hidden feedback by $1 on $2 $3, reason: $4 $5', |
| 109 | + 'moodbar-hidden-footer-without-log' => 'Hidden feedback $1', |
| 110 | + 'moodbar-feedback-restore' => 'restore hidden feedback', |
| 111 | + 'moodbar-action-item' => 'Feedback item:', |
| 112 | + 'moodbar-action-reason' => 'Reason:', |
| 113 | + 'moodbar-action-reason-required' => 'Please provide a reason.', |
| 114 | + 'moodbar-hide-header' => 'Hide this item from view', |
| 115 | + 'moodbar-hide-intro' => '', |
| 116 | + 'moodbar-restore-header' => "Restore this item's visibility", |
| 117 | + 'moodbar-restore-intro' => '', |
| 118 | + 'moodbar-invalid-item' => 'The system was unable to find the correct feedback item.', |
| 119 | + 'moodbar-feedback-action-error' => 'An error occurred when trying to perform this action.', |
| 120 | + // Mood types |
| 121 | + 'moodbar-type-happy' => '{{GENDER:$1|Happy}}', |
| 122 | + 'moodbar-type-sad' => '{{GENDER:$1|Sad}}', |
| 123 | + 'moodbar-type-confused' => '{{GENDER:$1|Confused}}', |
| 124 | + // User types |
| 125 | + 'moodbar-user-anonymized' => 'Anonymized', |
| 126 | + 'moodbar-user-ip' => 'IP address', |
| 127 | + 'moodbar-user-user' => 'Registered user', |
| 128 | + // Log types |
| 129 | + 'moodbar-log-name' => 'Feedback log', |
| 130 | + 'moodbar-log-header' => 'This is the log of actions taken on feedback items listed on the [[Special:FeedbackDashboard|feedback dashboard]].', |
| 131 | + 'moodbar-log-hide' => 'hid [[$1]]', |
| 132 | + 'moodbar-log-restore' => 'restored the visibility for [[$1]]', |
| 133 | + //Feedback Response |
| 134 | + 'moodbar-response-ula' => 'By clicking the "$1" button, you agree to the $2, and you irrevocably agree to release your contribution under the under the $3 license and the $4. |
| 135 | +You agree that a hyperlink or URL is sufficient attribution under the Creative Commons license.', |
| 136 | + 'moodbar-response-terms-of-use' => 'Terms of use', |
| 137 | + 'moodbar-response-terms-of-use-link' => '#', |
| 138 | + 'moodbar-response-cc' => 'Creative Commons', |
| 139 | + 'moodbar-response-cc-link' => 'http://creativecommons.org/licenses/by-sa/3.0/us/legalcode', |
| 140 | + 'moodbar-response-gfdl' => 'GFDL', |
| 141 | + 'moodbar-response-gfdl-link' => 'http://www.gnu.org/copyleft/fdl.html', |
| 142 | + 'feedbackresponse-success' => 'Thank you. Your response was added to the user\'s talk page.', |
| 143 | +); |
| 144 | + |
| 145 | +/** Message documentation (Message documentation) |
| 146 | + * @author EugeneZelenko |
| 147 | + * @author IAlex |
| 148 | + * @author Lloffiwr |
| 149 | + * @author McDutchie |
| 150 | + * @author Purodha |
| 151 | + * @author Raymond |
| 152 | + * @author SPQRobin |
| 153 | + * @author Siebrand |
| 154 | + * @author Umherirrender |
| 155 | + */ |
| 156 | +$messages['qqq'] = array( |
| 157 | + 'moodbar-desc' => '{{desc}} |
| 158 | +This is a feature in development. See [[mw:MoodBar 0.1/Design]] for background information.', |
| 159 | + 'moodbar-trigger-feedback' => 'Link text of the MoodBar overlay trigger. $1 is the SITENAME.', |
| 160 | + 'moodbar-trigger-editing' => "Link text of the MoodBar overlay trigger. \$1 is the SITENAME. The implied sentence is ''\"Using [Sitename] made me happy/sad/...\"''. See [[mw:MoodBar 0.1/Design]] for background development information.", |
| 161 | + 'moodbar-close' => 'Link text of the close-button. Make sure to include parentheses. |
| 162 | + |
| 163 | +See also: |
| 164 | +* {{msg|parentheses}} |
| 165 | +{{Identical|Close}}', |
| 166 | + 'moodbar-intro-feedback' => 'Intro title of the MoodBar overlay trigger. $1 is the SITENAME.', |
| 167 | + 'moodbar-intro-editing' => '[[File:MoodBar-Step-1.png|right|200px]] |
| 168 | +Intro title of the MoodBar overlay trigger. $1 is the SITENAME.', |
| 169 | + 'moodbar-type-happy-title' => 'No gender support ([[bugzilla:30071|bug 30071]])', |
| 170 | + 'moodbar-type-sad-title' => 'No gender support ([[bugzilla:30071|bug 30071]])', |
| 171 | + 'moodbar-type-confused-title' => 'No gender support ([[bugzilla:30071|bug 30071]])', |
| 172 | + 'tooltip-moodbar-what' => 'Tooltip displayed when hovering the What-link. |
| 173 | + |
| 174 | +See also: |
| 175 | +* {{msg|moodbar-what-label}}', |
| 176 | + 'moodbar-what-label' => 'Link text for the page where more info abut MoodBar can be found. |
| 177 | +{{Identical|What is this}}', |
| 178 | + 'moodbar-what-collapsed' => '{{optional}} |
| 179 | +This should normally only be changed for right-to-left (RTL) languages like Arabic and Hebrew, to change it into an arrow in the other direction: ◄ (equals <code>& #x25C4;</code>, without the whitespace).', |
| 180 | + 'moodbar-respond-collapsed' => 'Special character for response form collapsed', |
| 181 | + 'moodbar-respond-expanded' => 'Special character for response form expanded', |
| 182 | + 'moodbar-respond-text' => 'Text for Response toggle', |
| 183 | + 'moodbar-response-add' => 'Text for Response heading', |
| 184 | + 'moodbar-response-nosig' => 'Text explaining signature is not required', |
| 185 | + 'moodbar-response-btn' => 'Text for Response button', |
| 186 | + 'moodbar-what-content' => '$1 is the message {{msg-mw|moodbar-what-link}} which links to the page [[mw:MoodBar|MoodBar]] on MediaWiki.org.', |
| 187 | + 'moodbar-what-link' => 'This is the link embedded as parameter $1 in {{msg-mw|moodbar-what-content}}.', |
| 188 | + 'moodbar-privacy' => 'Parameters: |
| 189 | +*$1 - a link having the anchor text {{msg-mw|moodbar-privacy-link}} |
| 190 | + |
| 191 | +The link is to the privacy policy of the wiki. |
| 192 | + |
| 193 | +See [[Thread:Support/About MediaWiki:Moodbar-privacy/en (2)/reply (4)|discussion]].', |
| 194 | + 'moodbar-privacy-link' => 'This is the anchor text being used in the link replacing $1 in the message {{msg-mw|moodbar-privacy}}', |
| 195 | + 'moodbar-form-note-dynamic' => 'Should support plural.', |
| 196 | + 'moodbar-form-policy-text' => 'Text displayed below the input area. |
| 197 | + |
| 198 | +See also: |
| 199 | +* {{msg|moodbar-form-policy-label}}', |
| 200 | + 'moodbar-form-policy-label' => 'Label text for the link to the privacy policy,. |
| 201 | + |
| 202 | +See also: |
| 203 | +* {{msg|moodbar-form-policy-text}}', |
| 204 | + 'moodbar-loading-title' => 'Title of the screen when the widget is loading.', |
| 205 | + 'moodbar-success-title' => 'Title of the screen after the feedback was successfully submitted.', |
| 206 | + 'moodbar-error-title' => 'Title of the screen when after an error occurred and submission aborted.', |
| 207 | + 'moodbar-success-subtitle' => 'Subtitle of screen when feedback was successfullyully submitted. $1 is the SITENAME', |
| 208 | + 'moodbar-error-subtitle' => 'Subtitle of screen when an error occurred. $1 is the SITENAME', |
| 209 | + 'right-moodbar-view' => '{{doc-right|moodbar-view}}', |
| 210 | + 'right-moodbar-admin' => '{{doc-right|moodbar-admin}}', |
| 211 | + 'moodbar-header-timestamp' => '{{Identical|Timestamp}}', |
| 212 | + 'moodbar-header-type' => '{{Identical|Type}}', |
| 213 | + 'moodbar-header-page' => '{{Identical|Page}}', |
| 214 | + 'moodbar-header-user' => '{{Identical|User}}', |
| 215 | + 'moodbar-header-comment' => '{{Identical|Comment}}', |
| 216 | + 'moodbar-header-namespace' => '{{Identical|Namespace}}', |
| 217 | + 'moodbar-feedback-response-title' => 'The title for appending feedback response text to a user talk page', |
| 218 | + 'moodbar-feedback-view-link' => 'link to an individual feedback', |
| 219 | + 'moodbar-feedback-filters' => '{{Identical|Filter}}', |
| 220 | + 'moodbar-feedback-filters-type' => '{{Identical|Mood}}', |
| 221 | + 'moodbar-feedback-filters-type-happy' => 'Used on Special:FeedbackDashboard to filter by "happy" feedback entries', |
| 222 | + 'moodbar-feedback-filters-type-confused' => 'Used on Special:FeedbackDashboard to filter by "confused" feedback entries', |
| 223 | + 'moodbar-feedback-filters-type-sad' => 'Used on Special:FeedbackDashboard to filter by "sad" feedback entries', |
| 224 | + 'moodbar-feedback-filters-username' => '{{Identical|Username}}', |
| 225 | + 'moodbar-feedback-more' => 'Text of the link that the user can click to see more results. Only visible if JavaScript is enabled. |
| 226 | +{{Identical|More}}', |
| 227 | + 'moodbar-feedback-newer' => 'Text of the link that the user can click to go back to more recent results. Only visible if JavaScript is not enabled.', |
| 228 | + 'moodbar-feedback-older' => 'Text of the link that the user can click to see less recent results. Only visible if JavaScript is not enabled.', |
| 229 | + 'moodbar-feedback-load-record-error' => 'Error message for errors in loading a feedback or response to a feedback', |
| 230 | + 'moodbar-feedback-action-confirm' => 'Text for admin action confirm button', |
| 231 | + 'moodbar-feedback-action-cancel' => 'Text for admin action cancel button', |
| 232 | + 'moodbar-hidden-footer' => '* $1 is the username of the user that gave the feedback |
| 233 | +* $2 is a date |
| 234 | +* $3 is a time |
| 235 | +* $4 is the reason for hiding the feedback |
| 236 | +* $5 is a link to restore the item displaying {{msg-mw|moodbar-feedback-restore}}', |
| 237 | + 'moodbar-hidden-footer-without-log' => '* $1 is a link to restore the item displaying {{msg-mw|moodbar-feedback-restore}}', |
| 238 | + 'moodbar-action-reason' => 'Text for Admin action reason', |
| 239 | + 'moodbar-action-reason-required' => 'Text explaining admin action reason is required', |
| 240 | + 'moodbar-type-happy' => '$1 is the username that can be used for GENDER', |
| 241 | + 'moodbar-type-sad' => '$1 is the username that can be used for GENDER', |
| 242 | + 'moodbar-type-confused' => '$1 is the username that can be used for GENDER', |
| 243 | + 'moodbar-user-ip' => '{{Identical|IP Address}}', |
| 244 | + 'moodbar-response-ula' => 'Text of the user license agreement. Parameters: |
| 245 | +* $1 {{msg-mw|moodbar-response-btn}} |
| 246 | +* $2 {{msg-mw|moodbar-response-terms-of-use}} |
| 247 | +* $3 {{msg-mw|moodbar-response-cc}} |
| 248 | +* $4 {{msg-mw|moodbar-response-gfdl}}', |
| 249 | + 'moodbar-response-terms-of-use' => 'Terms of Use Text', |
| 250 | + 'moodbar-response-cc' => 'Creative Commons Text', |
| 251 | + 'moodbar-response-gfdl' => 'GFDL Text', |
| 252 | + 'feedbackresponse-success' => 'Text for successful feedback response', |
| 253 | +); |
| 254 | + |
| 255 | +/** Afrikaans (Afrikaans) |
| 256 | + * @author Naudefj |
| 257 | + */ |
| 258 | +$messages['af'] = array( |
| 259 | + 'moodbar-desc' => 'Laat spesifieke gebruikers toe om hulle gemoedstoestand aan die webwerf se operateur terug te stuur', |
| 260 | + 'moodbar-trigger-editing' => 'Die wysiging van $1...', |
| 261 | + 'moodbar-close' => '(sluit)', |
| 262 | + 'moodbar-type-happy-title' => 'Bly', |
| 263 | + 'moodbar-type-sad-title' => 'Afgehaal', |
| 264 | + 'moodbar-type-confused-title' => 'Verward', |
| 265 | + 'moodbar-what-label' => 'Wat is dit?', |
| 266 | + 'moodbar-privacy-link' => 'voorwaardes', |
| 267 | + 'moodbar-disable-link' => 'Ek stel nie belang nie. Deaktiveer die funksie.', |
| 268 | + 'moodbar-form-title' => 'Omdat...', |
| 269 | + 'moodbar-form-policy-label' => 'ons beleid', |
| 270 | + 'moodbar-loading-title' => 'Deel...', |
| 271 | + 'moodbar-success-title' => 'Dankie!', |
| 272 | + 'moodbar-error-title' => 'Oeps!', |
| 273 | + 'moodbar-admin-empty' => 'Geen resultate', |
| 274 | + 'moodbar-header-id' => 'Terugvoer-ID', |
| 275 | + 'moodbar-header-timestamp' => 'Tydstip', |
| 276 | + 'moodbar-header-type' => 'Tipe', |
| 277 | + 'moodbar-header-page' => 'Bladsy', |
| 278 | + 'moodbar-header-usertype' => 'Gebruikerstipe', |
| 279 | + 'moodbar-header-user' => 'Gebruiker', |
| 280 | + 'moodbar-header-editmode' => 'Wysig-modus', |
| 281 | + 'moodbar-header-bucket' => 'Toetgroep', |
| 282 | + 'moodbar-header-system' => 'Stelseltipe', |
| 283 | + 'moodbar-header-locale' => 'Lokaal', |
| 284 | + 'moodbar-header-useragent' => 'User-agent', |
| 285 | + 'moodbar-header-comment' => 'Opmerkings', |
| 286 | + 'moodbar-header-namespace' => 'Naamruimte', |
| 287 | + 'moodbar-header-own-talk' => 'Eie besprekingsblad', |
| 288 | + 'moodbar-type-happy' => 'Bly', |
| 289 | + 'moodbar-type-sad' => 'Afgehaal', |
| 290 | + 'moodbar-type-confused' => 'Verward', |
| 291 | + 'moodbar-user-anonymized' => 'Geanonimiseerd', |
| 292 | + 'moodbar-user-ip' => 'IP-adres', |
| 293 | + 'moodbar-user-user' => 'Geregistreerde gebruiker', |
| 294 | +); |
| 295 | + |
| 296 | +/** Arabic (العربية) |
| 297 | + * @author AwamerT |
| 298 | + * @author OsamaK |
| 299 | + * @author روخو |
| 300 | + * @author زكريا |
| 301 | + */ |
| 302 | +$messages['ar'] = array( |
| 303 | + 'moodbar-desc' => 'يسمح للمستخدمين المعينين بالتعليق على خبرتهم التحريرية', |
| 304 | + 'moodbar-trigger-feedback' => 'تعليق على التحرير', |
| 305 | + 'moodbar-trigger-share' => 'تبادل الخبرات', |
| 306 | + 'moodbar-trigger-editing' => 'تعديل $1...', |
| 307 | + 'moodbar-close' => '(إغلاق)', |
| 308 | + 'moodbar-intro-feedback' => 'تعديل $1 جعلني...', |
| 309 | + 'moodbar-intro-share' => 'تجربتي في $1 جعلتني...', |
| 310 | + 'moodbar-intro-editing' => 'تعديل $1 جعلني...', |
| 311 | + 'moodbar-type-happy-title' => 'سعيد', |
| 312 | + 'moodbar-type-sad-title' => 'حزين', |
| 313 | + 'moodbar-type-confused-title' => 'مرتبك', |
| 314 | + 'tooltip-moodbar-what' => 'اعرف المزيد عن هذه الخاصية', |
| 315 | + 'moodbar-what-label' => 'ما هذا؟', |
| 316 | + 'moodbar-what-collapsed' => '◄', |
| 317 | + 'moodbar-what-content' => 'هذه الخاصية مخصصة لمساعدة المجتمع على إدراك الخبرة التي يتمتع بها المحررون في الموقع. |
| 318 | +لمزيد من المعلومات، زر $1.', |
| 319 | + 'moodbar-what-link' => 'صفحة الخاصية', |
| 320 | + 'moodbar-privacy' => 'عند الحفظ تكون قد وافقت بالشفافية على هذه $1.', |
| 321 | + 'moodbar-privacy-link' => 'الشروط', |
| 322 | + 'moodbar-disable-link' => 'لا أبالي. عطل الخاصية.', |
| 323 | + 'moodbar-form-title' => 'السبب...', |
| 324 | + 'moodbar-form-note' => '140 حرفا على الأكثر', |
| 325 | + 'moodbar-form-note-dynamic' => '$1 عدد الأحرف المتبقية', |
| 326 | + 'moodbar-form-submit' => 'شارك التقييم', |
| 327 | + 'moodbar-form-policy-text' => 'عند الحفظ، $1', |
| 328 | + 'moodbar-form-policy-label' => 'سياستنا', |
| 329 | + 'moodbar-loading-title' => 'مشاركة...', |
| 330 | + 'moodbar-success-title' => 'شكرا!', |
| 331 | + 'moodbar-error-title' => 'آه!', |
| 332 | + 'moodbar-success-subtitle' => 'مشاركة تجربتك التحريرية تساعدك على تحسين $1.', |
| 333 | + 'moodbar-error-subtitle' => 'لقد حصل خطأ! كرر محاولة مشاركة التعليقات لاحقا.', |
| 334 | + 'right-moodbar-view' => 'انظر تعليقات شريط المزاج وصدرها', |
| 335 | + 'right-moodbar-admin' => 'غير مستوى الظهور على لوحة الملاحظات', |
| 336 | + 'moodbar-admin-title' => 'تعليقات شريط المزاج', |
| 337 | + 'moodbar-admin-intro' => 'تتيح هذه الصفحة الاطلاع على التعليقات المرسلة باستعمال شريط المزاج.', |
| 338 | + 'moodbar-admin-empty' => 'لا نتائج', |
| 339 | + 'moodbar-header-id' => 'معرف التعليقات', |
| 340 | + 'moodbar-header-timestamp' => 'طابع زمني', |
| 341 | + 'moodbar-header-type' => 'نوع', |
| 342 | + 'moodbar-header-page' => 'صفحة', |
| 343 | + 'moodbar-header-usertype' => 'نوع المستخدم', |
| 344 | + 'moodbar-header-user' => 'مستخدم', |
| 345 | + 'moodbar-header-editmode' => 'تعديل الوضع', |
| 346 | + 'moodbar-header-bucket' => 'مختبر', |
| 347 | + 'moodbar-header-system' => 'نوع النظام', |
| 348 | + 'moodbar-header-locale' => 'موضع', |
| 349 | + 'moodbar-header-useragent' => 'وكيل مستخدم', |
| 350 | + 'moodbar-header-comment' => 'تعليقات', |
| 351 | + 'moodbar-header-user-editcount' => 'عداد تعديلات المستخدم', |
| 352 | + 'moodbar-header-namespace' => 'نطاق', |
| 353 | + 'moodbar-header-own-talk' => 'الصفحة النقاش الخاصة', |
| 354 | + 'moodbar-feedback-title' => 'لوحة الملاحظات', |
| 355 | + 'moodbar-feedback-filters' => 'مرشحات', |
| 356 | + 'moodbar-feedback-filters-type' => 'النوع:', |
| 357 | + 'moodbar-feedback-filters-type-happy' => 'شكر', |
| 358 | + 'moodbar-feedback-filters-type-confused' => 'إرتباك', |
| 359 | + 'moodbar-feedback-filters-type-sad' => 'قضايا', |
| 360 | + 'moodbar-feedback-filters-username' => 'اسم المستخدم', |
| 361 | + 'moodbar-feedback-filters-button' => 'إضبط المرشحات', |
| 362 | + 'moodbar-feedback-whatis' => 'ماهذه الميزة؟', |
| 363 | + 'moodbar-feedback-permalink' => 'وصلة تصل الى هنا', |
| 364 | + 'moodbar-feedback-noresults' => 'لا يوجد تعليقات مطابقة للمرشحات الخاصة بك.', |
| 365 | + 'moodbar-feedback-more' => 'المزيد', |
| 366 | + 'moodbar-feedback-nomore' => 'لا يوجد نتائج أكثر لإظهارها.', |
| 367 | + 'moodbar-feedback-newer' => 'احدث', |
| 368 | + 'moodbar-feedback-older' => 'أقدم', |
| 369 | + 'moodbar-feedback-ajaxerror' => 'حدث خطأ عند المحاولة في جلب المزيد من النتائج.', |
| 370 | + 'moodbar-user-hidden' => '(مستخدم مخفي)', |
| 371 | + 'moodbar-comment-hidden' => '(الملاحظات مخفية بواسطة إجراءات إدارية)', |
| 372 | + 'moodbar-feedback-show' => 'أظهر الملاحظات المخفية', |
| 373 | + 'moodbar-feedback-hide' => 'إخف الملاحظات', |
| 374 | + 'moodbar-hidden-footer' => 'الملاحظات المخفية$1', |
| 375 | + 'moodbar-feedback-restore' => 'إستعد الملاحظات المخفية', |
| 376 | + 'moodbar-action-item' => 'بند الملاحظات:', |
| 377 | + 'moodbar-hide-header' => 'إخف هذا العنصر من الظهور', |
| 378 | + 'moodbar-restore-header' => 'إستعد ظهور هذا العنصر', |
| 379 | + 'moodbar-invalid-item' => 'لم يتمكن النظام من العثور على عنصر الملاحظات الصحيح.', |
| 380 | + 'moodbar-feedback-action-error' => 'حدث خطأ عند محاولة تنفيذ هذا الإجراء.', |
| 381 | + 'moodbar-type-happy' => 'سعيد', |
| 382 | + 'moodbar-type-sad' => 'حزين', |
| 383 | + 'moodbar-type-confused' => 'مرتبك', |
| 384 | + 'moodbar-user-anonymized' => 'مجهّل', |
| 385 | + 'moodbar-user-ip' => 'عنوان بروتوكول إنترنت', |
| 386 | + 'moodbar-user-user' => 'مستخدم مسجل', |
| 387 | + 'moodbar-log-name' => 'سجل الملاحظات', |
| 388 | + 'moodbar-log-header' => 'هذا هو سجل الإجراءات المتخذة بشأن عناصر الملاحظات المدرجة في [[Special:FeedbackDashboard|feedback dashboard]].', |
| 389 | + 'moodbar-log-hide' => 'تم إخفاء "[[$1]]"', |
| 390 | + 'moodbar-log-restore' => 'تم استعادة الظهور لـ [[ $1 ]]', |
| 391 | +); |
| 392 | + |
| 393 | +/** Azerbaijani (Azərbaycanca) |
| 394 | + * @author Cekli829 |
| 395 | + */ |
| 396 | +$messages['az'] = array( |
| 397 | + 'moodbar-close' => '(bağlı)', |
| 398 | + 'moodbar-type-happy-title' => 'Xoşbəxt', |
| 399 | + 'moodbar-what-label' => 'Bu nədir?', |
| 400 | + 'moodbar-privacy-link' => 'terminlər', |
| 401 | + 'moodbar-success-title' => 'Təşəkkürlər!', |
| 402 | + 'moodbar-header-type' => 'Tipi', |
| 403 | + 'moodbar-header-page' => 'Səhifə', |
| 404 | + 'moodbar-header-user' => 'İstifadəçi', |
| 405 | + 'moodbar-header-comment' => 'Şərhlər', |
| 406 | + 'moodbar-type-happy' => 'Xoşbəxt', |
| 407 | +); |
| 408 | + |
| 409 | +/** Belarusian (Taraškievica orthography) (Беларуская (тарашкевіца)) |
| 410 | + * @author EugeneZelenko |
| 411 | + * @author Jim-by |
| 412 | + */ |
| 413 | +$messages['be-tarask'] = array( |
| 414 | + 'moodbar-desc' => 'Дазваляе вызначаным удзельнікам дасылаць іх водгук пра вопыт у рэдагаваньні', |
| 415 | + 'moodbar-trigger-feedback' => 'Водгук пра рэдагаваньне', |
| 416 | + 'moodbar-trigger-share' => 'Падзяліцца Вашым вопытам', |
| 417 | + 'moodbar-trigger-editing' => 'Выкарыстоўваючы $1…', |
| 418 | + 'moodbar-close' => '(зачыніць)', |
| 419 | + 'moodbar-intro-feedback' => 'Рэдагаваньне {{GRAMMAR:родны|$1}} дало мне…', |
| 420 | + 'moodbar-intro-share' => 'Мой вопыт на {{GRAMMAR:родны|$1}} даў мне…', |
| 421 | + 'moodbar-intro-editing' => 'Рэдагаваньне {{GRAMMAR:родны|$1}} дало мне…', |
| 422 | + 'moodbar-type-happy-title' => 'Задавальненьне', |
| 423 | + 'moodbar-type-sad-title' => 'Расчараваньне', |
| 424 | + 'moodbar-type-confused-title' => 'Зьмешаныя пачуцьці', |
| 425 | + 'tooltip-moodbar-what' => 'Даведацца болей пра гэтую магчымасьць', |
| 426 | + 'moodbar-what-label' => 'Што гэта?', |
| 427 | + 'moodbar-what-content' => 'Гэтая магчымасьць распрацаваная для дапамогі супольнасьці зразумець вопыт людзей, якія рэдагуюць сайт. |
| 428 | +Для дадатковай інфармацыі, калі ласка, наведайце $1.', |
| 429 | + 'moodbar-what-link' => 'старонка магчымасьці', |
| 430 | + 'moodbar-privacy' => 'Дасылаючы, Вы пагаджаецеся на доступ на гэтых $1.', |
| 431 | + 'moodbar-privacy-link' => 'умовах', |
| 432 | + 'moodbar-disable-link' => 'Мне не цікава. Калі ласка, адключыце гэтую магчымасьць.', |
| 433 | + 'moodbar-form-title' => 'Таму што…', |
| 434 | + 'moodbar-form-note' => 'максымум 140 сымбаляў', |
| 435 | + 'moodbar-form-note-dynamic' => 'засталося $1 сымбаляў', |
| 436 | + 'moodbar-form-submit' => 'Падзяліцца водгукам', |
| 437 | + 'moodbar-form-policy-text' => 'Дасылаючы, $1', |
| 438 | + 'moodbar-form-policy-label' => 'нашыя правілы', |
| 439 | + 'moodbar-loading-title' => 'Адкрыцьцё доступу…', |
| 440 | + 'moodbar-success-title' => 'Дзякуй!', |
| 441 | + 'moodbar-error-title' => 'Ой!', |
| 442 | + 'moodbar-success-subtitle' => 'Адкрыцьцё доступу да Вашага вопыту рэдагаваньня дапамагае палепшыць {{GRAMMAR:вінавальны|$1}}.', |
| 443 | + 'moodbar-error-subtitle' => 'Нешта пайшло ня так! Калі ласка, паспрабуйце адкрыць доступ да вашага водгуку потым.', |
| 444 | + 'right-moodbar-view' => 'прагляд і экспарт водгукаў MoodBar', |
| 445 | + 'right-moodbar-admin' => 'зьмяненьне бачнасьці на дошцы водгукаў', |
| 446 | + 'moodbar-admin-title' => 'Водгукі MoodBar', |
| 447 | + 'moodbar-admin-intro' => 'Гэтая старонка дазваляе Вам праглядаць водгукі пакінутыя праз MoodBar.', |
| 448 | + 'moodbar-admin-empty' => 'Вынікаў няма', |
| 449 | + 'moodbar-header-id' => 'Ідэнтыфікатар водгуку', |
| 450 | + 'moodbar-header-timestamp' => 'Дата/час', |
| 451 | + 'moodbar-header-type' => 'Тып', |
| 452 | + 'moodbar-header-page' => 'Старонка', |
| 453 | + 'moodbar-header-usertype' => 'Тып удзельніка', |
| 454 | + 'moodbar-header-user' => 'Удзельнік', |
| 455 | + 'moodbar-header-editmode' => 'Рэжым рэдагаваньня', |
| 456 | + 'moodbar-header-bucket' => 'Асяродзьдзе праверкі', |
| 457 | + 'moodbar-header-system' => 'Тып сыстэмы', |
| 458 | + 'moodbar-header-locale' => 'Моўныя асаблівасьці', |
| 459 | + 'moodbar-header-useragent' => 'Браўзэр', |
| 460 | + 'moodbar-header-comment' => 'Камэнтары', |
| 461 | + 'moodbar-header-user-editcount' => 'Колькасьць рэдагаваньняў удзельнікаў', |
| 462 | + 'moodbar-header-namespace' => 'Прастора назваў', |
| 463 | + 'moodbar-header-own-talk' => 'Уласная старонка гутарак', |
| 464 | + 'moodbar-feedback-title' => 'Дошка водгукаў', |
| 465 | + 'moodbar-feedback-filters' => 'Фільтры', |
| 466 | + 'moodbar-feedback-filters-type' => 'Тып:', |
| 467 | + 'moodbar-feedback-filters-type-happy' => 'Пахвала', |
| 468 | + 'moodbar-feedback-filters-type-confused' => 'Блытаніна', |
| 469 | + 'moodbar-feedback-filters-type-sad' => 'Праблемы', |
| 470 | + 'moodbar-feedback-filters-username' => 'Імя ўдзельніка', |
| 471 | + 'moodbar-feedback-filters-button' => 'Наладзіць фільтры', |
| 472 | + 'moodbar-feedback-whatis' => 'Што гэта за магчымасьць?', |
| 473 | + 'moodbar-feedback-permalink' => 'спасылка сюды', |
| 474 | + 'moodbar-feedback-noresults' => 'Няма камэнтараў, якія адпавядаюць Вашым фільтрам.', |
| 475 | + 'moodbar-feedback-more' => 'Болей', |
| 476 | + 'moodbar-feedback-nomore' => 'Болей няма вынікаў для паказу.', |
| 477 | + 'moodbar-feedback-newer' => 'Навейшыя', |
| 478 | + 'moodbar-feedback-older' => 'Старэйшыя', |
| 479 | + 'moodbar-feedback-ajaxerror' => 'Узьнікла памылка падчас атрыманьня дадатковых вынікаў.', |
| 480 | + 'moodbar-user-hidden' => '(Удзельнік схаваны)', |
| 481 | + 'moodbar-type-happy' => 'Шчасьлівы', |
| 482 | + 'moodbar-type-sad' => 'Смутны', |
| 483 | + 'moodbar-type-confused' => 'Зьмешаныя пачуцьці', |
| 484 | + 'moodbar-user-anonymized' => 'Ананімны', |
| 485 | + 'moodbar-user-ip' => 'ІР-адрас', |
| 486 | + 'moodbar-user-user' => 'Зарэгістраваны ўдзельнік', |
| 487 | +); |
| 488 | + |
| 489 | +/** Bulgarian (Български) |
| 490 | + * @author Spiritia |
| 491 | + */ |
| 492 | +$messages['bg'] = array( |
| 493 | + 'moodbar-what-label' => 'Какво е това?', |
| 494 | + 'moodbar-what-content' => 'Тази функционалност е предназначена да помогне на общността да проучи опита на хората, които редактират този сайт. |
| 495 | +За повече информация посетете $1.', |
| 496 | + 'moodbar-form-note' => 'Максимум 140 символа', |
| 497 | + 'moodbar-form-note-dynamic' => 'Остават $1 символа', |
| 498 | + 'moodbar-success-title' => 'Благодарим!', |
| 499 | + 'moodbar-error-title' => 'Опа!', |
| 500 | + 'moodbar-success-subtitle' => 'Като споделяте опита си като редактор ни помагате да подобрим $1.', |
| 501 | + 'moodbar-error-subtitle' => 'Нещо се обърка! Моля, опитайте отново да споделите вашето мнение по-късно.', |
| 502 | + 'moodbar-header-usertype' => 'Тип потребител', |
| 503 | + 'moodbar-header-user' => 'Потребител', |
| 504 | + 'moodbar-header-editmode' => 'Режим на редактиране', |
| 505 | + 'moodbar-header-comment' => 'Коментари', |
| 506 | + 'moodbar-header-user-editcount' => 'Брой потребителски приноси', |
| 507 | + 'moodbar-header-namespace' => 'Именно пространство', |
| 508 | + 'moodbar-header-own-talk' => 'Лична беседа', |
| 509 | + 'moodbar-user-ip' => 'IP-адрес', |
| 510 | + 'moodbar-user-user' => 'Регистриран потребител', |
| 511 | +); |
| 512 | + |
| 513 | +/** Bakhtiari (بختياري) */ |
| 514 | +$messages['bqi'] = array( |
| 515 | + 'moodbar-what-collapsed' => '◄', |
| 516 | +); |
| 517 | + |
| 518 | +/** Breton (Brezhoneg) |
| 519 | + * @author Fulup |
| 520 | + * @author Y-M D |
| 521 | + */ |
| 522 | +$messages['br'] = array( |
| 523 | + 'moodbar-desc' => "Talvezout a ra d'an implijerien spisaet da lavaret ar pezh o soñj goude bezañ amprouet an traoù", |
| 524 | + 'moodbar-trigger-feedback' => 'Ho soñj war an doare da zegas kemmoù', |
| 525 | + 'moodbar-trigger-share' => 'Rannit ho skiant-prenañ ganeomp', |
| 526 | + 'moodbar-trigger-editing' => "Oc'h aozañ $1...", |
| 527 | + 'moodbar-close' => '(serriñ)', |
| 528 | + 'moodbar-intro-feedback' => 'Degas kemmoù e $1 en deus ma lakaet da vezañ...', |
| 529 | + 'moodbar-intro-share' => 'Ma zamm troiad war $1 en deus ma lakaet da vezañ...', |
| 530 | + 'moodbar-intro-editing' => 'Degas kemmoù e $1 en deus ma lakaet da vezañ...', |
| 531 | + 'moodbar-type-happy-title' => 'Laouen', |
| 532 | + 'moodbar-type-sad-title' => 'Trist', |
| 533 | + 'moodbar-type-confused-title' => 'Trubuilhet', |
| 534 | + 'tooltip-moodbar-what' => "Gouzout hiroc'h diwar-benn ar perzh-mañ", |
| 535 | + 'moodbar-what-label' => 'Petra eo se ?', |
| 536 | + 'moodbar-privacy-link' => 'termenoù', |
| 537 | + 'moodbar-disable-link' => "N'on ket dedennet. Diweredekaat ar perzh-mañ.", |
| 538 | + 'moodbar-form-title' => 'Peogwir...', |
| 539 | + 'moodbar-form-note' => "140 arouezenn d'ar muiañ", |
| 540 | + 'moodbar-form-note-dynamic' => '$1 a chom', |
| 541 | + 'moodbar-form-policy-text' => 'En ur gas, $1', |
| 542 | + 'moodbar-form-policy-label' => 'hor politikerezh', |
| 543 | + 'moodbar-loading-title' => 'O rannañ...', |
| 544 | + 'moodbar-success-title' => 'Trugarez !', |
| 545 | + 'moodbar-error-title' => 'Chaous !', |
| 546 | + 'moodbar-admin-empty' => "Disoc'h ebet", |
| 547 | + 'moodbar-header-timestamp' => 'Deiziad hag eur', |
| 548 | + 'moodbar-header-type' => 'Seurt', |
| 549 | + 'moodbar-header-page' => 'Pajenn', |
| 550 | + 'moodbar-header-usertype' => 'Seurt implijer', |
| 551 | + 'moodbar-header-user' => 'Implijer', |
| 552 | + 'moodbar-header-editmode' => 'Mod kemmañ', |
| 553 | + 'moodbar-header-system' => 'Seurt reizhiad', |
| 554 | + 'moodbar-header-locale' => "Lec'hel", |
| 555 | + 'moodbar-header-comment' => 'Evezhiadennoù', |
| 556 | + 'moodbar-header-user-editcount' => 'Niver a gemmoù degaset gant an implijer', |
| 557 | + 'moodbar-header-namespace' => 'Esaouenn anv', |
| 558 | + 'moodbar-feedback-filters' => 'Siloù', |
| 559 | + 'moodbar-feedback-filters-type' => 'Seurt :', |
| 560 | + 'moodbar-feedback-filters-type-happy' => 'Laouen', |
| 561 | + 'moodbar-feedback-filters-type-confused' => 'Trubuilhet', |
| 562 | + 'moodbar-feedback-filters-type-sad' => 'Trist', |
| 563 | + 'moodbar-feedback-filters-username' => 'Anv implijer', |
| 564 | + 'moodbar-feedback-whatis' => 'Petra eo kement-mañ ?', |
| 565 | + 'moodbar-feedback-more' => "Muioc'h", |
| 566 | + 'moodbar-feedback-nomore' => "N'eus disoc'h ebet all da ziskouez.", |
| 567 | + 'moodbar-feedback-newer' => "Nevesoc'h", |
| 568 | + 'moodbar-feedback-older' => "Koshoc'h", |
| 569 | + 'moodbar-feedback-ajaxerror' => "Ur fazi zo bet en ur glask disoc'hoù all.", |
| 570 | + 'moodbar-hide-header' => 'Kuzhat an elfenn-mañ evit na vefe ket gwelet', |
| 571 | + 'moodbar-type-happy' => 'Laouen', |
| 572 | + 'moodbar-type-sad' => 'Trist', |
| 573 | + 'moodbar-type-confused' => 'Trubuilhet', |
| 574 | + 'moodbar-user-anonymized' => 'Dianavezet', |
| 575 | + 'moodbar-user-ip' => "Chomlec'h IP", |
| 576 | + 'moodbar-user-user' => 'Implijer enrollet', |
| 577 | + 'moodbar-log-hide' => 'en deus kuzhet "[[$1]]"', |
| 578 | + 'moodbar-log-restore' => 'zo bet assavet gweleduster [[$1]] gantañ', |
| 579 | +); |
| 580 | + |
| 581 | +/** Danish (Dansk) |
| 582 | + * @author Peter Alberti |
| 583 | + */ |
| 584 | +$messages['da'] = array( |
| 585 | + 'moodbar-desc' => 'Tillader udvalgte brugere at give feedback om deres redigeringsoplevelse', |
| 586 | + 'moodbar-trigger-feedback' => 'Feedback om redigering', |
| 587 | + 'moodbar-trigger-share' => 'Del din oplevelse', |
| 588 | + 'moodbar-trigger-editing' => 'Redigerer $1...', |
| 589 | + 'moodbar-close' => '(luk)', |
| 590 | + 'moodbar-intro-feedback' => 'At redigere $1 gjorde mig...', |
| 591 | + 'moodbar-intro-share' => 'Mine erfaringer med $1 gjorde mig...', |
| 592 | + 'moodbar-intro-editing' => 'At redigere $1 gjorde mig...', |
| 593 | + 'moodbar-type-happy-title' => 'Glad', |
| 594 | + 'moodbar-type-sad-title' => 'Trist', |
| 595 | + 'moodbar-type-confused-title' => 'Forvirret', |
| 596 | + 'tooltip-moodbar-what' => 'Lær mere om denne funktion', |
| 597 | + 'moodbar-what-label' => 'Hvad er dette?', |
| 598 | + 'moodbar-what-content' => 'Denne funktion er beregnet til at hjælpe fællesskabet med at forstå hvordan folk oplever det at redigere denne hjemmeside. |
| 599 | +For yderligere oplysninger, besøg venligst $1.', |
| 600 | + 'moodbar-what-link' => 'funktionsside', |
| 601 | + 'moodbar-privacy' => 'Ved at sende, accepterer du gennemsigtighed under disse $1.', |
| 602 | + 'moodbar-privacy-link' => 'vilkår', |
| 603 | + 'moodbar-disable-link' => 'Jeg er ikke interesseret. Slå denne funktion fra.', |
| 604 | + 'moodbar-form-title' => 'Fordi...', |
| 605 | + 'moodbar-form-note' => 'maksimalt 140 tegn', |
| 606 | + 'moodbar-form-note-dynamic' => '$1 tegn tilbage', |
| 607 | + 'moodbar-form-submit' => 'Del Feedback', |
| 608 | + 'moodbar-form-policy-text' => 'Ved at indsende, $1', |
| 609 | + 'moodbar-form-policy-label' => 'vores politik', |
| 610 | + 'moodbar-loading-title' => 'Deler...', |
| 611 | + 'moodbar-success-title' => 'Tak!', |
| 612 | + 'moodbar-error-title' => 'Ups!', |
| 613 | + 'moodbar-success-subtitle' => 'Ved at dele din redigeringsoplevelse hjælper du os med at forbedre $1.', |
| 614 | + 'moodbar-error-subtitle' => 'Noget gik galt! Prøv at dele din feedback igen senere.', |
| 615 | + 'right-moodbar-view' => 'Se og eksporter MoodBar feedback', |
| 616 | + 'moodbar-admin-title' => 'MoodBar feedback', |
| 617 | + 'moodbar-admin-intro' => 'På denne side kan du se feedback, som blev indsendt med MoodBar.', |
| 618 | + 'moodbar-admin-empty' => 'Ingen resultater', |
| 619 | + 'moodbar-header-id' => 'Feedback-ID', |
| 620 | + 'moodbar-header-timestamp' => 'Tidsstempel', |
| 621 | + 'moodbar-header-type' => 'Type', |
| 622 | + 'moodbar-header-page' => 'Side', |
| 623 | + 'moodbar-header-usertype' => 'Brugertype', |
| 624 | + 'moodbar-header-user' => 'Bruger', |
| 625 | + 'moodbar-header-editmode' => 'Redigeringstilstand', |
| 626 | + 'moodbar-header-bucket' => 'Testspand', |
| 627 | + 'moodbar-header-system' => 'Systemtype', |
| 628 | + 'moodbar-header-locale' => 'Sprogindstilling', |
| 629 | + 'moodbar-header-useragent' => 'Brugeragent', |
| 630 | + 'moodbar-header-comment' => 'Kommentarer', |
| 631 | + 'moodbar-header-user-editcount' => 'Brugerens antal redigeringer', |
| 632 | + 'moodbar-header-namespace' => 'Navnerum', |
| 633 | + 'moodbar-header-own-talk' => 'Egen diskussionsside', |
| 634 | + 'moodbar-type-happy' => 'Glad', |
| 635 | + 'moodbar-type-sad' => 'Trist', |
| 636 | + 'moodbar-type-confused' => 'Forvirret', |
| 637 | + 'moodbar-user-anonymized' => 'Anonymiseret', |
| 638 | + 'moodbar-user-ip' => 'IP-adresse', |
| 639 | + 'moodbar-user-user' => 'Registreret bruger', |
| 640 | +); |
| 641 | + |
| 642 | +/** German (Deutsch) |
| 643 | + * @author Kghbln |
| 644 | + * @author Metalhead64 |
| 645 | + * @author Purodha |
| 646 | + */ |
| 647 | +$messages['de'] = array( |
| 648 | + 'moodbar-desc' => 'Ermöglicht es bestimmten Benutzern eine Rückmeldung bezüglich des Bearbeitens von Seiten zu geben', |
| 649 | + 'moodbar-trigger-feedback' => 'Rückmeldung zum Bearbeiten', |
| 650 | + 'moodbar-trigger-share' => 'Teile uns deinen Eindruck mit', |
| 651 | + 'moodbar-trigger-editing' => 'Bearbeite $1 …', |
| 652 | + 'moodbar-close' => '(schließen)', |
| 653 | + 'moodbar-intro-feedback' => '$1 zu bearbeiten macht mich …', |
| 654 | + 'moodbar-intro-share' => 'Meine Erfahrung auf $1 macht mich …', |
| 655 | + 'moodbar-intro-editing' => '$1 zu bearbeiten macht mich …', |
| 656 | + 'moodbar-type-happy-title' => 'glücklich', |
| 657 | + 'moodbar-type-sad-title' => 'traurig', |
| 658 | + 'moodbar-type-confused-title' => 'verwirrt', |
| 659 | + 'tooltip-moodbar-what' => 'Mehr zu dieser Funktion in Erfahrung bringen', |
| 660 | + 'moodbar-what-label' => 'Worum handelt es sich?', |
| 661 | + 'moodbar-respond-collapsed' => '▶', |
| 662 | + 'moodbar-respond-expanded' => '▼', |
| 663 | + 'moodbar-respond-text' => 'Hierauf antworten', |
| 664 | + 'moodbar-response-add' => 'Eine Antwort hinzufügen', |
| 665 | + 'moodbar-response-nosig' => 'Eine Signatur ist nicht erforderlich.', |
| 666 | + 'moodbar-response-btn' => 'Antwort senden', |
| 667 | + 'moodbar-what-content' => 'Diese Funktion wurde entwickelt, damit man eine Rückmeldung geben kann, wie man sich beim Bearbeiten von Seiten dieser Website fühlt. |
| 668 | +Weitere Informationen hierzu sind an der folgenden Stelle zu finden: $1.', |
| 669 | + 'moodbar-what-link' => 'Seite zu den Funktionen', |
| 670 | + 'moodbar-privacy' => 'Mit dem Speichern erklärst du dich mit diesen $1 einverstanden.', |
| 671 | + 'moodbar-privacy-link' => 'Bedingungen', |
| 672 | + 'moodbar-disable-link' => 'Ich bin nicht interessiert. Bitte diese Funktion deaktivieren.', |
| 673 | + 'moodbar-form-title' => 'Weil …', |
| 674 | + 'moodbar-form-note' => 'Maximal 140 Zeichen', |
| 675 | + 'moodbar-form-note-dynamic' => '$1 Zeichen verbleibend', |
| 676 | + 'moodbar-form-submit' => 'Rückmeldung senden', |
| 677 | + 'moodbar-form-policy-text' => 'Mit dem Senden, $1', |
| 678 | + 'moodbar-form-policy-label' => 'unserer Richtlinie', |
| 679 | + 'moodbar-loading-title' => 'Am senden ...', |
| 680 | + 'moodbar-success-title' => 'Vielen Dank!', |
| 681 | + 'moodbar-error-title' => 'Hoppla!', |
| 682 | + 'moodbar-success-subtitle' => 'Uns deine Stimmung mitzuteilen hilft uns dabei $1 weiter zu verbessern.', |
| 683 | + 'moodbar-error-subtitle' => 'Etwas ist schief gelaufen. Bitte versuche es später noch einmal uns deine Rückmeldung mitzuteilen.', |
| 684 | + 'right-moodbar-view' => 'Rückmeldung zur Stimmung ansehen und exportieren', |
| 685 | + 'right-moodbar-admin' => 'Sichtbarkeit auf der Übersichts- und Verwaltungsseite der Rückmeldungen ändern', |
| 686 | + 'moodbar-admin-title' => 'Rückmeldung zur Stimmung', |
| 687 | + 'moodbar-admin-intro' => 'Auf dieser Seite können die Rückmeldungen zur Stimmung angesehen werden', |
| 688 | + 'moodbar-admin-empty' => 'Keine Ergebnisse', |
| 689 | + 'moodbar-header-id' => 'Rückmeldungskennung', |
| 690 | + 'moodbar-header-timestamp' => 'Zeitstempel', |
| 691 | + 'moodbar-header-type' => 'Typ', |
| 692 | + 'moodbar-header-page' => 'Seite', |
| 693 | + 'moodbar-header-usertype' => 'Benutzerart', |
| 694 | + 'moodbar-header-user' => 'Benutzer', |
| 695 | + 'moodbar-header-editmode' => 'Bearbeitungsmodus', |
| 696 | + 'moodbar-header-bucket' => 'Testumgebung', |
| 697 | + 'moodbar-header-system' => 'Systemtyp', |
| 698 | + 'moodbar-header-locale' => 'Gebietsschema', |
| 699 | + 'moodbar-header-useragent' => 'Browser', |
| 700 | + 'moodbar-header-comment' => 'Kommentare', |
| 701 | + 'moodbar-header-user-editcount' => 'Bearbeitungszähler', |
| 702 | + 'moodbar-header-namespace' => 'Namensraum', |
| 703 | + 'moodbar-header-own-talk' => 'Eigene Diskussionsseite', |
| 704 | + 'moodbar-feedback-title' => 'Rückmeldungen', |
| 705 | + 'moodbar-feedback-response-title' => 'Administrations- und Übersichtsseite zu Rückmeldungen', |
| 706 | + 'moodbar-feedback-view-link' => '(Rückmeldungen ansehen)', |
| 707 | + 'moodbar-feedback-filters' => 'Filter', |
| 708 | + 'moodbar-feedback-filters-type' => 'Stimmung:', |
| 709 | + 'moodbar-feedback-filters-type-happy' => 'Glücklich', |
| 710 | + 'moodbar-feedback-filters-type-confused' => 'Verwirrt', |
| 711 | + 'moodbar-feedback-filters-type-sad' => 'Traurig', |
| 712 | + 'moodbar-feedback-filters-username' => 'Benutzername', |
| 713 | + 'moodbar-feedback-filters-button' => 'Filter setzen', |
| 714 | + 'moodbar-feedback-whatis' => 'Über dieses Feature', |
| 715 | + 'moodbar-feedback-permalink' => 'Nach hier verlinken', |
| 716 | + 'moodbar-feedback-noresults' => 'Es gibt keine zutreffenden Kommentare.', |
| 717 | + 'moodbar-feedback-more' => 'Weitere', |
| 718 | + 'moodbar-feedback-nomore' => 'Es gibt keine weiteren Ergebnisse zum Anzeigen.', |
| 719 | + 'moodbar-feedback-newer' => 'Aktuellere', |
| 720 | + 'moodbar-feedback-older' => 'Ältere', |
| 721 | + 'moodbar-feedback-ajaxerror' => 'Beim Abrufen weiterer Ergebnisse ist ein Fehler aufgetreten.', |
| 722 | + 'moodbar-feedback-load-record-error' => 'Beim Abrufen eines Datensatzes ist ein Fehler aufgetreten.', |
| 723 | + 'moodbar-user-hidden' => '(Benutzer ausgeblendet)', |
| 724 | + 'moodbar-comment-hidden' => '(Rückmeldung vom Administrator ausgeblendet)', |
| 725 | + 'moodbar-feedback-show' => 'ausgeblendete Rückmeldung anzeigen', |
| 726 | + 'moodbar-feedback-hide' => 'Rückmeldung ausblenden', |
| 727 | + 'moodbar-feedback-action-confirm' => 'Bestätigen', |
| 728 | + 'moodbar-feedback-action-cancel' => 'Abbrechen', |
| 729 | + 'moodbar-hidden-footer' => 'Ausgeblendete Rückmeldung von $1 am $2, Grund: $3 $4', |
| 730 | + 'moodbar-hidden-footer-without-log' => 'Ausgeblendete Rückmeldung $1', |
| 731 | + 'moodbar-feedback-restore' => 'ausgeblendete Rückmeldung wieder einblenden', |
| 732 | + 'moodbar-action-item' => 'Teil der Rückmeldung:', |
| 733 | + 'moodbar-action-reason' => 'Grund:', |
| 734 | + 'moodbar-action-reason-required' => 'Bitte einen Grund angeben.', |
| 735 | + 'moodbar-hide-header' => 'diesen Teil der Rückmeldung verstecken', |
| 736 | + 'moodbar-restore-header' => 'versteckten Teil der Rückmeldung wiederherstellen', |
| 737 | + 'moodbar-invalid-item' => 'Das System konnte den richtigen Teil der Rückmeldung nicht finden.', |
| 738 | + 'moodbar-feedback-action-error' => 'Während des Ausführens dieser Aktion ist ein Fehler aufgetreten.', |
| 739 | + 'moodbar-type-happy' => 'glücklich', |
| 740 | + 'moodbar-type-sad' => 'traurig', |
| 741 | + 'moodbar-type-confused' => 'verwirrt', |
| 742 | + 'moodbar-user-anonymized' => 'Anonymisiert', |
| 743 | + 'moodbar-user-ip' => 'IP-Adresse', |
| 744 | + 'moodbar-user-user' => 'Registrierter Benutzer', |
| 745 | + 'moodbar-log-name' => 'Rückmeldungs-Logbuch', |
| 746 | + 'moodbar-log-header' => 'Dies ist das Logbuch der Aktionen zu den Rückmeldungen, die auf der [[Special:FeedbackDashboard|Administrations- und Übersichtsseite]] der Rückmeldungen angezeigt werden.', |
| 747 | + 'moodbar-log-hide' => 'blendete [[$1]] aus', |
| 748 | + 'moodbar-log-restore' => 'blendete [[$1]] wieder ein', |
| 749 | + 'moodbar-response-ula' => 'Durch Klicken auf die Schaltfläche „$1“ stimmst du den $2 zu. Zudem bist du unwiderruflich damit einverstanden, deinen Beitrag gemäß der $3-Lizenz sowie der $4 zu veröffentlichen. |
| 750 | +Du stimmst auch zu, dass ein Hyperlink oder die Angabe einer URL für die Namensnennung gemäß der $3-Lizenz ausreichend ist.', |
| 751 | + 'moodbar-response-terms-of-use' => 'Nutzungsbedingungen', |
| 752 | + 'moodbar-response-cc' => 'Creative-Commons', |
| 753 | + 'moodbar-response-gfdl' => 'GFDL', |
| 754 | + 'feedbackresponse-success' => 'Vielen Dank. Deine Antwort wurde auf der Diskussionsseite des Benutzers hinzugefügt.', |
| 755 | +); |
| 756 | + |
| 757 | +/** German (formal address) (Deutsch (Sie-Form)) |
| 758 | + * @author Kghbln |
| 759 | + */ |
| 760 | +$messages['de-formal'] = array( |
| 761 | + 'moodbar-trigger-share' => 'Teilen Sie uns Ihren Eindruck mit', |
| 762 | + 'moodbar-privacy' => 'Mit dem Speichern erklären Sie sich mit diesen $1 einverstanden.', |
| 763 | + 'moodbar-success-subtitle' => 'Uns Ihre Stimmung mitzuteilen hilft uns dabei $1 weiter zu verbessern.', |
| 764 | + 'moodbar-error-subtitle' => 'Etwas ist schief gelaufen. Bitte versuchen Sie es später noch einmal uns Ihre Rückmeldung mitzuteilen.', |
| 765 | + 'moodbar-response-ula' => 'Durch Klicken auf die Schaltfläche „$1“ stimmen Sie den $2 zu. Zudem sind Sie unwiderruflich damit einverstanden, Ihrem Beitrag gemäß der $3-Lizenz sowie der $4 zu veröffentlichen. |
| 766 | +Sie stimmen auch zu, dass ein Hyperlink oder die Angabe einer URL für die Namensnennung gemäß der $3-Lizenz ausreichend ist.', |
| 767 | + 'feedbackresponse-success' => 'Vielen Dank. Ihre Antwort wurde auf der Diskussionsseite des Benutzers hinzugefügt.', |
| 768 | +); |
| 769 | + |
| 770 | +/** Greek (Ελληνικά) |
| 771 | + * @author ZaDiak |
| 772 | + */ |
| 773 | +$messages['el'] = array( |
| 774 | + 'moodbar-trigger-feedback' => 'Ανατροφοδότηση σχετικά με την επεξεργασία', |
| 775 | + 'moodbar-trigger-editing' => 'Επεξεργασία $1...', |
| 776 | + 'moodbar-close' => '(κλείσιμο)', |
| 777 | + 'moodbar-type-happy-title' => 'Χαρούμενος', |
| 778 | + 'moodbar-type-sad-title' => 'Θλιμμένος', |
| 779 | + 'moodbar-type-confused-title' => 'Μπερδεμένος', |
| 780 | + 'tooltip-moodbar-what' => 'Μάθετε περισσότερα σχετικά με αυτό το χαρακτηριστικό', |
| 781 | + 'moodbar-what-label' => 'Τι είναι αυτό;', |
| 782 | + 'moodbar-what-link' => 'σελίδα χαρακτηριστικού', |
| 783 | + 'moodbar-privacy-link' => 'όροι', |
| 784 | + 'moodbar-form-title' => 'Επειδή...', |
| 785 | + 'moodbar-form-note' => '140 χαρακτήρες το μέγιστο', |
| 786 | + 'moodbar-form-note-dynamic' => '$1 χαρακτήρες απομένουν', |
| 787 | + 'moodbar-form-submit' => 'Κοινοποίηση Ανατροφοδότησης', |
| 788 | + 'moodbar-form-policy-text' => 'Με την υποβολή, $1', |
| 789 | + 'moodbar-form-policy-label' => 'η πολιτική μας', |
| 790 | + 'moodbar-loading-title' => 'Κοινοποίηση...', |
| 791 | + 'moodbar-success-title' => 'Ευχαριστούμε!', |
| 792 | + 'moodbar-error-title' => 'Ουπς!', |
| 793 | + 'moodbar-admin-empty' => 'Κανένα αποτέλεσμα', |
| 794 | + 'moodbar-header-id' => 'Ταυτότητα Ανατροφοδότησης', |
| 795 | + 'moodbar-header-timestamp' => 'Ημερομηνία', |
| 796 | + 'moodbar-header-type' => 'Τύπος', |
| 797 | + 'moodbar-header-page' => 'Σελίδα', |
| 798 | + 'moodbar-header-usertype' => 'Τύπος χρήστη', |
| 799 | + 'moodbar-header-user' => 'Χρήστης', |
| 800 | + 'moodbar-header-editmode' => 'Λειτουργία επεξεργασίας', |
| 801 | + 'moodbar-header-system' => 'Τύπος συστήματος', |
| 802 | + 'moodbar-header-comment' => 'Σχόλια', |
| 803 | + 'moodbar-header-user-editcount' => 'Αριθμός επεξεργασιών χρήστη', |
| 804 | + 'moodbar-header-namespace' => 'Περιοχή ονομάτων', |
| 805 | + 'moodbar-header-own-talk' => 'Ίδια σελίδα συζήτησης', |
| 806 | + 'moodbar-type-happy' => 'Χαρούμενος', |
| 807 | + 'moodbar-type-sad' => 'Θλιμμένος', |
| 808 | + 'moodbar-type-confused' => 'Μπερδεμένος', |
| 809 | + 'moodbar-user-anonymized' => 'Ανώνυμα', |
| 810 | + 'moodbar-user-ip' => 'Διεύθυνση IP', |
| 811 | + 'moodbar-user-user' => 'Εγγεγραμμένος χρήστης', |
| 812 | +); |
| 813 | + |
| 814 | +/** Esperanto (Esperanto) |
| 815 | + * @author Yekrats |
| 816 | + */ |
| 817 | +$messages['eo'] = array( |
| 818 | + 'moodbar-desc' => 'Permesas al specifigitaj uzantoj por provizi opiniaron pri ties opinio de redaktado.', |
| 819 | + 'moodbar-trigger-feedback' => 'Komentoj pri redaktado', |
| 820 | + 'moodbar-trigger-share' => 'Komentu pri via opinio', |
| 821 | + 'moodbar-trigger-editing' => 'Redaktante $1...', |
| 822 | + 'moodbar-close' => '(fermi)', |
| 823 | + 'moodbar-intro-feedback' => 'Redaktante $1 mi sentis...', |
| 824 | + 'moodbar-intro-share' => 'Dum mia sperto en $1, mi sentis...', |
| 825 | + 'moodbar-intro-editing' => 'Redaktante $1 mi sentis...', |
| 826 | + 'moodbar-type-happy-title' => 'Ĝoja', |
| 827 | + 'moodbar-type-sad-title' => 'Malĝoja', |
| 828 | + 'moodbar-type-confused-title' => 'Konfuzita', |
| 829 | + 'tooltip-moodbar-what' => 'Lerni pli pri ĉi tiu funkcio', |
| 830 | + 'moodbar-what-label' => 'Kio estas?', |
| 831 | + 'moodbar-what-content' => 'Ĉi tiu funkcio estas farita por helpi al la komunumo kompreni la opiniojn de ties redaktantojn |
| 832 | +Por pli informo, bonvolu viziti la $1n.', |
| 833 | + 'moodbar-what-link' => 'celpaĝo', |
| 834 | + 'moodbar-privacy' => 'Sendante, vi konsentas al travidebleco sub ĉi tiuj $1.', |
| 835 | + 'moodbar-privacy-link' => 'kondiĉoj', |
| 836 | + 'moodbar-disable-link' => 'Mi ne interesas. Bonvolu malŝalti ĉi tiun econ.', |
| 837 | + 'moodbar-form-title' => 'Ĉar...', |
| 838 | + 'moodbar-form-note' => 'Maksimumo de 140 signoj', |
| 839 | + 'moodbar-form-note-dynamic' => '$1 signoj restas', |
| 840 | + 'moodbar-form-submit' => 'Doni Komenton', |
| 841 | + 'moodbar-form-policy-text' => 'Enigante $1', |
| 842 | + 'moodbar-form-policy-label' => 'nia regularo', |
| 843 | + 'moodbar-loading-title' => 'Komentante...', |
| 844 | + 'moodbar-success-title' => 'Dankon!', |
| 845 | + 'moodbar-error-title' => 'Ho ve!', |
| 846 | + 'moodbar-success-subtitle' => 'Via opinio pri via redaktado helpos al ni plibonigi $1.', |
| 847 | + 'moodbar-error-subtitle' => 'Io fuŝis! Bonvolu reprovu doni komenton baldaŭ.', |
| 848 | + 'right-moodbar-view' => 'Vidi kaj eksporti opiniojn pri MoodBar', |
| 849 | + 'moodbar-admin-title' => 'Komenti pri MoodBar', |
| 850 | + 'moodbar-admin-intro' => 'Ĉi tiu paĝo permesas al vi por vidi opiniaron senditan de la MoodBar.', |
| 851 | + 'moodbar-admin-empty' => 'Mankas rezultoj', |
| 852 | + 'moodbar-header-id' => 'Identigo de komentaro', |
| 853 | + 'moodbar-header-timestamp' => 'Tempindiko', |
| 854 | + 'moodbar-header-type' => 'Tipo', |
| 855 | + 'moodbar-header-page' => 'Paĝo', |
| 856 | + 'moodbar-header-usertype' => 'Tipo de uzanto', |
| 857 | + 'moodbar-header-user' => 'Uzanto', |
| 858 | + 'moodbar-header-editmode' => 'Redakta reĝimo', |
| 859 | + 'moodbar-header-bucket' => 'Testejo', |
| 860 | + 'moodbar-header-system' => 'Tipo de sistemo', |
| 861 | + 'moodbar-header-locale' => 'Lokaĵaro', |
| 862 | + 'moodbar-header-useragent' => 'Klienta Aplikaĵo', |
| 863 | + 'moodbar-header-comment' => 'Komentoj', |
| 864 | + 'moodbar-header-user-editcount' => 'Konto de redaktoj', |
| 865 | + 'moodbar-header-namespace' => 'Nomspaco', |
| 866 | + 'moodbar-header-own-talk' => 'Propra diskuto-paĝo', |
| 867 | + 'moodbar-type-happy' => 'Ĝoja', |
| 868 | + 'moodbar-type-sad' => 'Malĝoja', |
| 869 | + 'moodbar-type-confused' => 'Konfuzita', |
| 870 | + 'moodbar-user-anonymized' => 'Anonima', |
| 871 | + 'moodbar-user-ip' => 'IP-adreso', |
| 872 | + 'moodbar-user-user' => 'Registrita Uzanto', |
| 873 | +); |
| 874 | + |
| 875 | +/** Spanish (Español) |
| 876 | + * @author Crazymadlover |
| 877 | + * @author Fitoschido |
| 878 | + */ |
| 879 | +$messages['es'] = array( |
| 880 | + 'moodbar-desc' => 'Permite a usuarios específicos enviar comentarios sobre su experiencia de edición', |
| 881 | + 'moodbar-trigger-feedback' => 'Comentarios acerca de la edición', |
| 882 | + 'moodbar-trigger-share' => 'Comparte tu experiencia', |
| 883 | + 'moodbar-trigger-editing' => 'Editar $1...', |
| 884 | + 'moodbar-close' => '(cerrar)', |
| 885 | + 'moodbar-intro-feedback' => 'Editar $1 me hizo...', |
| 886 | + 'moodbar-intro-share' => 'Mi experiencia en $1 me hizo...', |
| 887 | + 'moodbar-intro-editing' => 'El editar $1 me hace...', |
| 888 | + 'moodbar-type-happy-title' => 'Feliz', |
| 889 | + 'moodbar-type-sad-title' => 'Triste', |
| 890 | + 'moodbar-type-confused-title' => 'Confundido', |
| 891 | + 'tooltip-moodbar-what' => 'Más información sobre esta característica', |
| 892 | + 'moodbar-what-label' => '¿Qué es esto?', |
| 893 | + 'moodbar-privacy-link' => 'términos', |
| 894 | + 'moodbar-disable-link' => 'No me interesa. Por favor, desactiven esta función.', |
| 895 | + 'moodbar-form-title' => 'Porque...', |
| 896 | + 'moodbar-form-note' => '140 caracteres máximo', |
| 897 | + 'moodbar-form-note-dynamic' => 'Quedan $1 caracteres', |
| 898 | + 'moodbar-form-submit' => 'Compartir comentarios', |
| 899 | + 'moodbar-form-policy-text' => 'Al enviar, $1', |
| 900 | + 'moodbar-form-policy-label' => 'nuestra política', |
| 901 | + 'moodbar-loading-title' => 'Compartiendo...', |
| 902 | + 'moodbar-success-title' => '¡Gracias!', |
| 903 | + 'moodbar-error-title' => '¡Vaya!', |
| 904 | + 'moodbar-success-subtitle' => 'El compartir tu experiencia nos ayuda a mejorar $1.', |
| 905 | + 'moodbar-error-subtitle' => '¡Algo salió mal! Por favor, comparte tus comentarios más tarde.', |
| 906 | + 'right-moodbar-view' => 'Ver y exportar comentarios de MoodBar', |
| 907 | + 'moodbar-admin-title' => 'Comentarios de MoodBar', |
| 908 | + 'moodbar-admin-intro' => 'Esta página permite ver los comentarios enviados con MoodBar.', |
| 909 | + 'moodbar-admin-empty' => 'No hay resultados', |
| 910 | + 'moodbar-header-id' => 'ID de comentario', |
| 911 | + 'moodbar-header-timestamp' => 'Fecha y hora', |
| 912 | + 'moodbar-header-type' => 'Tipo', |
| 913 | + 'moodbar-header-page' => 'Página', |
| 914 | + 'moodbar-header-usertype' => 'Tipo de usuario', |
| 915 | + 'moodbar-header-user' => 'Usuario', |
| 916 | + 'moodbar-header-editmode' => 'Modo de edición', |
| 917 | + 'moodbar-header-system' => 'Tipo de sistema', |
| 918 | + 'moodbar-header-useragent' => 'Agente de usuario', |
| 919 | + 'moodbar-header-comment' => 'Comentarios', |
| 920 | + 'moodbar-header-user-editcount' => 'Número de ediciones de usuario', |
| 921 | + 'moodbar-header-namespace' => 'Espacio de nombres', |
| 922 | + 'moodbar-header-own-talk' => 'Propia página de discusión', |
| 923 | + 'moodbar-type-happy' => 'Feliz', |
| 924 | + 'moodbar-type-sad' => 'Triste', |
| 925 | + 'moodbar-type-confused' => 'Confundido', |
| 926 | + 'moodbar-user-anonymized' => 'Anonimizado', |
| 927 | + 'moodbar-user-ip' => 'Dirección IP', |
| 928 | + 'moodbar-user-user' => 'Usuario registrado', |
| 929 | +); |
| 930 | + |
| 931 | +/** Persian (فارسی) |
| 932 | + * @author Mjbmr |
| 933 | + */ |
| 934 | +$messages['fa'] = array( |
| 935 | + 'moodbar-desc' => 'به کاربران مشخص این اجازه را میدهد که بازخوردی از تجربهٔ ویرایشهایشان، ارائه دهند', |
| 936 | + 'moodbar-trigger-feedback' => 'بازخود دربارهٔ ویرایش کردن', |
| 937 | + 'moodbar-trigger-share' => 'به اشتراک گذاشتن تجربهٔ خود', |
| 938 | + 'moodbar-trigger-editing' => 'در حال ویرایش $1...', |
| 939 | + 'moodbar-close' => '(بستن)', |
| 940 | + 'moodbar-intro-feedback' => 'ویرایش $1 باعث شد من...', |
| 941 | + 'moodbar-intro-share' => 'تجربه من در $1 باعث شد من...', |
| 942 | + 'moodbar-intro-editing' => 'ویرایش $1 باعث شد من...', |
| 943 | + 'moodbar-type-happy-title' => 'شاد', |
| 944 | + 'moodbar-type-sad-title' => 'غمگین', |
| 945 | + 'moodbar-type-confused-title' => 'گیج', |
| 946 | + 'tooltip-moodbar-what' => 'دربارهٔ این ویژگی بیشتر مطالعه کنید', |
| 947 | + 'moodbar-what-label' => 'این چیست؟', |
| 948 | + 'moodbar-what-collapsed' => '◄', |
| 949 | + 'moodbar-what-content' => 'این ویژگی طوری طراحی شده است که به جامعه برای فهم تجربهٔ مردم از ویرایش در این تارنما کمک میکند. |
| 950 | +برای اطلاعات بیشتر، به $1 مراجعه کنید.', |
| 951 | + 'moodbar-what-link' => 'صفحهٔ ویژگی', |
| 952 | + 'moodbar-privacy' => 'با ثبت کردن، شما به شفافیت با این $1 موافقت میکنید.', |
| 953 | + 'moodbar-privacy-link' => 'شرایط', |
| 954 | + 'moodbar-disable-link' => 'من علاقهای ندارم. لطفاً این ویژگی را غیرفعال کنید.', |
| 955 | + 'moodbar-form-title' => 'زیرا...', |
| 956 | + 'moodbar-form-note' => 'حداکثر ۱۴۰ نویسه', |
| 957 | + 'moodbar-form-note-dynamic' => '$1 نویسه باقی مانده', |
| 958 | + 'moodbar-form-submit' => 'اشتراک گذاشتن بازخورد', |
| 959 | + 'moodbar-form-policy-text' => 'توسط ثبت، $1', |
| 960 | + 'moodbar-form-policy-label' => 'سیاست ما', |
| 961 | + 'moodbar-loading-title' => 'در حال اشتراک گذاشتن...', |
| 962 | + 'moodbar-success-title' => 'سپاس!', |
| 963 | + 'moodbar-error-title' => 'اوه!', |
| 964 | + 'moodbar-success-subtitle' => 'به اشتراک گذاشتن تجربهٔ شما به ما کمک میکند که $1 را بهبود بخشیم.', |
| 965 | + 'moodbar-error-subtitle' => 'چیزی اشتباه پیش رفت! لطفاً بعداً مجدد سعی به اشتراک گذاری بازخورد خود کنید.', |
| 966 | + 'right-moodbar-view' => 'مشاهده و خروجی گرفتن از بازخورد نوار خُلق', |
| 967 | + 'moodbar-admin-title' => 'بازخورد نوار خُلق', |
| 968 | + 'moodbar-admin-intro' => 'این صفحه به شما اجازه می دهد که بازخوردهایی که توسط نوار خُلق ثبت شدهاند را مشاهده نمائید.', |
| 969 | + 'moodbar-admin-empty' => 'بدون نتیجه', |
| 970 | + 'moodbar-header-id' => 'شماره بازخورد', |
| 971 | + 'moodbar-header-timestamp' => 'برچسب زمان', |
| 972 | + 'moodbar-header-type' => 'نوع', |
| 973 | + 'moodbar-header-page' => 'صفحه', |
| 974 | + 'moodbar-header-usertype' => 'نوع کاربر', |
| 975 | + 'moodbar-header-user' => 'کاربر', |
| 976 | + 'moodbar-header-editmode' => 'حالت ویرایش', |
| 977 | + 'moodbar-header-bucket' => 'سطل آزمایش', |
| 978 | + 'moodbar-header-system' => 'نوع سامانه', |
| 979 | + 'moodbar-header-locale' => 'محلی', |
| 980 | + 'moodbar-header-useragent' => 'عامل کاربر', |
| 981 | + 'moodbar-header-comment' => 'نظرها', |
| 982 | + 'moodbar-header-user-editcount' => 'شمار ویرایشهای کاربر', |
| 983 | + 'moodbar-header-namespace' => 'فضای نام', |
| 984 | + 'moodbar-header-own-talk' => 'صفحهٔ بحث خود', |
| 985 | + 'moodbar-type-happy' => 'شاد', |
| 986 | + 'moodbar-type-sad' => 'غمگین', |
| 987 | + 'moodbar-type-confused' => 'گیج', |
| 988 | + 'moodbar-user-anonymized' => 'گمنام', |
| 989 | + 'moodbar-user-ip' => 'نشانی آیپی', |
| 990 | + 'moodbar-user-user' => 'کاربر ثبت شده', |
| 991 | +); |
| 992 | + |
| 993 | +/** Finnish (Suomi) |
| 994 | + * @author Crt |
| 995 | + * @author Olli |
| 996 | + */ |
| 997 | +$messages['fi'] = array( |
| 998 | + 'moodbar-desc' => 'Sallii tiettyjen käyttäjien antaa palautetta heidän muokkauskokemuksesta', |
| 999 | + 'moodbar-trigger-feedback' => 'Palautetta muokkaamisesta', |
| 1000 | + 'moodbar-trigger-share' => 'Jaa kokemuksesi', |
| 1001 | + 'moodbar-trigger-editing' => 'Muokataan $1...', |
| 1002 | + 'moodbar-close' => '(sulje)', |
| 1003 | + 'moodbar-intro-feedback' => 'Sivuston $1 muokkaaminen sai minut...', |
| 1004 | + 'moodbar-intro-share' => 'Kokemukseni sivustolla $1 sai minut...', |
| 1005 | + 'moodbar-intro-editing' => 'Sivuston $1 muokkaaminen sai minut...', |
| 1006 | + 'moodbar-type-happy-title' => 'Iloiseksi', |
| 1007 | + 'moodbar-type-sad-title' => 'Surulliseksi', |
| 1008 | + 'moodbar-type-confused-title' => 'Hämmentyneeksi', |
| 1009 | + 'tooltip-moodbar-what' => 'Lue lisää tästä ominaisuudesta', |
| 1010 | + 'moodbar-what-label' => 'Mikä tämä on?', |
| 1011 | + 'moodbar-what-content' => 'Tämä ominaisuus on tehty, jotta yhteisö ymmärtäisi paremmin, mitä ihmiset tuntevat muokatessaan sivustoa. Saadaksesi lisätietoja, käy $1.', |
| 1012 | + 'moodbar-what-link' => 'ominaisuussivulla', |
| 1013 | + 'moodbar-privacy' => 'Lähettämällä, sallit avoimuuden $1 alaisena.', |
| 1014 | + 'moodbar-privacy-link' => 'ehtojen', |
| 1015 | + 'moodbar-disable-link' => 'En ole kiinnostunut. Poista käytöstä ominaisuus.', |
| 1016 | + 'moodbar-form-title' => 'Koska...', |
| 1017 | + 'moodbar-form-note' => 'Enintään 140 merkkiä', |
| 1018 | + 'moodbar-form-note-dynamic' => '$1 merkkiä jäljellä', |
| 1019 | + 'moodbar-form-submit' => 'Jaa palautetta', |
| 1020 | + 'moodbar-form-policy-text' => 'Lähettämällä, $1', |
| 1021 | + 'moodbar-form-policy-label' => 'käytäntömme', |
| 1022 | + 'moodbar-loading-title' => 'Jakamalla...', |
| 1023 | + 'moodbar-success-title' => 'Kiitos!', |
| 1024 | + 'moodbar-error-title' => 'Hups!', |
| 1025 | + 'moodbar-success-subtitle' => 'Muokkauskokemuksesi jakaminen auttaa meitä kehittämään $1.', |
| 1026 | + 'moodbar-error-subtitle' => 'Joku meni vikaan! Yritä palautteesi jakamista myöhemmin.', |
| 1027 | + 'right-moodbar-view' => 'Näytä ja vie MoodBar-palautetta', |
| 1028 | + 'moodbar-admin-title' => 'MoodBar-palaute', |
| 1029 | + 'moodbar-admin-intro' => 'Tällä sivulla voit katsella MoodBarin kautta lähetettyä palautetta.', |
| 1030 | + 'moodbar-admin-empty' => 'Ei tuloksia', |
| 1031 | + 'moodbar-header-id' => 'Palautteen tunniste', |
| 1032 | + 'moodbar-header-timestamp' => 'Aikaleima', |
| 1033 | + 'moodbar-header-type' => 'Tyyppi', |
| 1034 | + 'moodbar-header-page' => 'Sivu', |
| 1035 | + 'moodbar-header-usertype' => 'Käyttäjän tyyppi', |
| 1036 | + 'moodbar-header-user' => 'Käyttäjä', |
| 1037 | + 'moodbar-header-editmode' => 'Muokkaustila', |
| 1038 | + 'moodbar-header-bucket' => 'Testauspaikka', |
| 1039 | + 'moodbar-header-system' => 'Järjestelmän tyyppi', |
| 1040 | + 'moodbar-header-locale' => 'Kieli', |
| 1041 | + 'moodbar-header-useragent' => 'Selain', |
| 1042 | + 'moodbar-header-comment' => 'Kommentit', |
| 1043 | + 'moodbar-header-user-editcount' => 'Käyttäjän muokkausmäärä', |
| 1044 | + 'moodbar-header-namespace' => 'Nimiavaruus', |
| 1045 | + 'moodbar-header-own-talk' => 'Oma keskustelusivu', |
| 1046 | + 'moodbar-type-happy' => 'Iloinen', |
| 1047 | + 'moodbar-type-sad' => 'Surullinen', |
| 1048 | + 'moodbar-type-confused' => 'Hämmentynyt', |
| 1049 | + 'moodbar-user-anonymized' => 'Nimetön', |
| 1050 | + 'moodbar-user-ip' => 'IP-osoite', |
| 1051 | + 'moodbar-user-user' => 'Rekisteröitynyt käyttäjä', |
| 1052 | +); |
| 1053 | + |
| 1054 | +/** French (Français) |
| 1055 | + * @author ChrisPtDe |
| 1056 | + * @author Crochet.david |
| 1057 | + * @author Gomoko |
| 1058 | + * @author Hashar |
| 1059 | + * @author IAlex |
| 1060 | + * @author Tpt |
| 1061 | + */ |
| 1062 | +$messages['fr'] = array( |
| 1063 | + 'moodbar-desc' => "Permet aux utilisateurs spécifiés de fournir leur ressenti sur leur expérience d'édition", |
| 1064 | + 'moodbar-trigger-feedback' => 'Vos commentaires sur la modification', |
| 1065 | + 'moodbar-trigger-share' => 'Partagez votre expérience', |
| 1066 | + 'moodbar-trigger-editing' => 'Modifier $1 ...', |
| 1067 | + 'moodbar-close' => '(fermer)', |
| 1068 | + 'moodbar-intro-feedback' => "Modifier $1 m'a rendu ...", |
| 1069 | + 'moodbar-intro-share' => "Mon expérience sur $1 m'a rendu...", |
| 1070 | + 'moodbar-intro-editing' => "Modifier $1 m'a rendu ...", |
| 1071 | + 'moodbar-type-happy-title' => 'Heureux', |
| 1072 | + 'moodbar-type-sad-title' => 'Triste', |
| 1073 | + 'moodbar-type-confused-title' => 'Confus', |
| 1074 | + 'tooltip-moodbar-what' => 'En savoir plus sur cette fonctionnalité', |
| 1075 | + 'moodbar-what-label' => "Qu'est-ce que c'est?", |
| 1076 | + 'moodbar-what-content' => "Cette fonctionnalité est conçue pour aider la communauté à comprendre le ressenti des personnes éditant le site. |
| 1077 | +Pour plus d'information, consultez la $1.", |
| 1078 | + 'moodbar-what-link' => 'page décrivant la fonction', |
| 1079 | + 'moodbar-privacy' => 'En soumettant, vous acceptez une transparence en accord avec ces $1.', |
| 1080 | + 'moodbar-privacy-link' => 'conditions', |
| 1081 | + 'moodbar-disable-link' => 'Je ne suis pas intéressé. Désactiver cette fonctionnalité.', |
| 1082 | + 'moodbar-form-title' => 'Parce que ...', |
| 1083 | + 'moodbar-form-note' => '140 caractères maximum', |
| 1084 | + 'moodbar-form-note-dynamic' => '$1 caractères restants', |
| 1085 | + 'moodbar-form-submit' => 'Partager son ressenti', |
| 1086 | + 'moodbar-form-policy-text' => 'En soumettant, $1', |
| 1087 | + 'moodbar-form-policy-label' => 'notre politique', |
| 1088 | + 'moodbar-loading-title' => 'Partager...', |
| 1089 | + 'moodbar-success-title' => 'Merci !', |
| 1090 | + 'moodbar-error-title' => 'Oups !', |
| 1091 | + 'moodbar-success-subtitle' => 'Partager votre expérience nous aide à améliorer $1.', |
| 1092 | + 'moodbar-error-subtitle' => "Quelque chose s'est mal passé ! Essayer de partager vos commentaires plus tard.", |
| 1093 | + 'right-moodbar-view' => 'Afficher et exporter vos ressentis MoodBar', |
| 1094 | + 'right-moodbar-admin' => 'Modifier la visibilité sur le tableau de bord des commentaires', |
| 1095 | + 'moodbar-admin-title' => 'Ressenti MoodBar', |
| 1096 | + 'moodbar-admin-intro' => "Cette page vous permet d'afficher les ressentis fournis avec ModdBar.", |
| 1097 | + 'moodbar-admin-empty' => 'Aucun résultat', |
| 1098 | + 'moodbar-header-id' => 'ID de ressenti', |
| 1099 | + 'moodbar-header-timestamp' => 'Horodatage', |
| 1100 | + 'moodbar-header-type' => 'Type', |
| 1101 | + 'moodbar-header-page' => 'Page', |
| 1102 | + 'moodbar-header-usertype' => "Type d'utilisateur", |
| 1103 | + 'moodbar-header-user' => 'Utilisateur', |
| 1104 | + 'moodbar-header-editmode' => 'Mode édition', |
| 1105 | + 'moodbar-header-bucket' => 'Ensemble de test', |
| 1106 | + 'moodbar-header-system' => 'Type de système', |
| 1107 | + 'moodbar-header-locale' => 'Régional', |
| 1108 | + 'moodbar-header-useragent' => 'Agent utilisateur', |
| 1109 | + 'moodbar-header-comment' => 'Commentaires', |
| 1110 | + 'moodbar-header-user-editcount' => "Compteur d'édition", |
| 1111 | + 'moodbar-header-namespace' => 'Espace de noms', |
| 1112 | + 'moodbar-header-own-talk' => 'Page de discussion personnelle', |
| 1113 | + 'moodbar-feedback-title' => 'Tableau de bord des ressentis', |
| 1114 | + 'moodbar-feedback-view-link' => '(Voir les commentaires)', |
| 1115 | + 'moodbar-feedback-filters' => 'Filtres', |
| 1116 | + 'moodbar-feedback-filters-type' => 'Humeur:', |
| 1117 | + 'moodbar-feedback-filters-type-happy' => 'Heureux', |
| 1118 | + 'moodbar-feedback-filters-type-confused' => 'Confus', |
| 1119 | + 'moodbar-feedback-filters-type-sad' => 'Triste', |
| 1120 | + 'moodbar-feedback-filters-username' => "Nom d'utilisateur", |
| 1121 | + 'moodbar-feedback-filters-button' => 'Positionner les filtres', |
| 1122 | + 'moodbar-feedback-whatis' => "Qu'est-ce que cette fonctionnalité?", |
| 1123 | + 'moodbar-feedback-permalink' => 'faire un lien vers ici', |
| 1124 | + 'moodbar-feedback-noresults' => "Il n'y a aucun commentaire qui correspond à vos filtres.", |
| 1125 | + 'moodbar-feedback-more' => 'Plus', |
| 1126 | + 'moodbar-feedback-nomore' => "Il n'y a plus de résultats à afficher.", |
| 1127 | + 'moodbar-feedback-newer' => 'Plus récent', |
| 1128 | + 'moodbar-feedback-older' => 'Plus ancien', |
| 1129 | + 'moodbar-feedback-ajaxerror' => "Une erreur s'est produite en recherchant plus de résultats.", |
| 1130 | + 'moodbar-feedback-load-record-error' => 'Une erreur s’est produite pendant le chargement d’un enregistrement.', |
| 1131 | + 'moodbar-user-hidden' => '(Utilisateur caché)', |
| 1132 | + 'moodbar-comment-hidden' => '(Commentaire caché par mesure administrative)', |
| 1133 | + 'moodbar-feedback-show' => 'afficher les commentaires cachés', |
| 1134 | + 'moodbar-feedback-hide' => 'masquer les commentaires', |
| 1135 | + 'moodbar-hidden-footer' => 'Avis caché de $1 sur $2, motif: $3 $4', |
| 1136 | + 'moodbar-hidden-footer-without-log' => 'Commentaire caché $1', |
| 1137 | + 'moodbar-feedback-restore' => 'restaurer les commentaires cachés', |
| 1138 | + 'moodbar-action-item' => 'Objet du commentaire :', |
| 1139 | + 'moodbar-action-reason' => 'Motif:', |
| 1140 | + 'moodbar-action-reason-required' => 'Veuillez fournir une raison.', |
| 1141 | + 'moodbar-hide-header' => "Cacher cet élément de l'affichage", |
| 1142 | + 'moodbar-restore-header' => 'Restaurer la visibilité de cet élément', |
| 1143 | + 'moodbar-invalid-item' => 'Le système a été incapable de trouver le commentaire correct.', |
| 1144 | + 'moodbar-feedback-action-error' => "Une erreur s'est produite lorsque vous avez essayé d'effectuer cette action.", |
| 1145 | + 'moodbar-type-happy' => '{{GENDER:$1|Heureux|Heureuse}}', |
| 1146 | + 'moodbar-type-sad' => '{{GENDER:$1|Triste}}', |
| 1147 | + 'moodbar-type-confused' => '{{GENDER:$1|Confus|Confuse}}', |
| 1148 | + 'moodbar-user-anonymized' => 'Anonymisé', |
| 1149 | + 'moodbar-user-ip' => 'Adresse IP', |
| 1150 | + 'moodbar-user-user' => 'Utilisateur enregistré', |
| 1151 | + 'moodbar-log-name' => 'Journal des commentaires', |
| 1152 | + 'moodbar-log-header' => 'Ceci est le journal des actions prises sur les commentaires listés sur [[Special:FeedbackDashboard|tableau de bord de commentaires]].', |
| 1153 | + 'moodbar-log-hide' => 'a caché [[$1]]', |
| 1154 | + 'moodbar-log-restore' => 'a restauré la visibilité de [[$1]]', |
| 1155 | +); |
| 1156 | + |
| 1157 | +/** Franco-Provençal (Arpetan) |
| 1158 | + * @author ChrisPtDe |
| 1159 | + */ |
| 1160 | +$messages['frp'] = array( |
| 1161 | + 'moodbar-desc' => 'Pèrmèt ux utilisators spècefiâs de balyér lor avis sur lor èxpèrience d’èdicion.', |
| 1162 | + 'moodbar-trigger-feedback' => 'Voutros avis sur lo changement', |
| 1163 | + 'moodbar-trigger-share' => 'Partagiéd voutra èxpèrience', |
| 1164 | + 'moodbar-trigger-editing' => 'Changement de $1...', |
| 1165 | + 'moodbar-close' => '(cllôre)', |
| 1166 | + 'moodbar-intro-feedback' => 'Changiér $1 m’at rendu...', |
| 1167 | + 'moodbar-intro-share' => 'Mon èxpèrience dessus $1 m’at rendu...', |
| 1168 | + 'moodbar-intro-editing' => 'Changiér $1 m’at rendu...', |
| 1169 | + 'moodbar-type-happy-title' => 'Herox', |
| 1170 | + 'moodbar-type-sad-title' => 'Tristo', |
| 1171 | + 'moodbar-type-confused-title' => 'Confondu', |
| 1172 | + 'tooltip-moodbar-what' => 'Nen savêr més sur cela fonccionalitât', |
| 1173 | + 'moodbar-what-label' => 'Qu’est-o qu’il est ?', |
| 1174 | + 'moodbar-what-content' => 'Ceta fonccionalitât est conçua por édiér la comunôtât a comprendre l’èxpèrience a les gens que chanjont lo seto. |
| 1175 | +Por més d’enformacions, volyéd visitar la $1.', |
| 1176 | + 'moodbar-what-link' => 'pâge que dècrit la fonccion', |
| 1177 | + 'moodbar-privacy' => 'En sometent, vos accèptâd una transparence en acôrd avouéc celes $1.', |
| 1178 | + 'moodbar-privacy-link' => 'condicions', |
| 1179 | + 'moodbar-disable-link' => 'Su pas entèrèssiê. Volyéd dèsactivar cela fonccionalitât.', |
| 1180 | + 'moodbar-form-title' => 'Perce que ...', |
| 1181 | + 'moodbar-form-note' => '140 caractèros u més', |
| 1182 | + 'moodbar-form-note-dynamic' => '$1 caractèros que réstont', |
| 1183 | + 'moodbar-form-submit' => 'Partagiér voutron avis', |
| 1184 | + 'moodbar-form-policy-text' => 'En sometent, $1', |
| 1185 | + 'moodbar-form-policy-label' => 'noutra politica', |
| 1186 | + 'moodbar-loading-title' => 'Partagiér...', |
| 1187 | + 'moodbar-success-title' => 'Grant-marci !', |
| 1188 | + 'moodbar-error-title' => 'Crenom !', |
| 1189 | + 'moodbar-success-subtitle' => 'Partagiér voutra èxpèrience nos éde a mèlyorar $1.', |
| 1190 | + 'moodbar-error-subtitle' => 'Quârque-ren s’est mâl passâ ! Volyéd tornar tâchiér de partagiér voutros avis ples târd.', |
| 1191 | + 'right-moodbar-view' => 'Fâre vêre et èxportar voutros avis MoodBar', |
| 1192 | + 'moodbar-admin-title' => 'Avis MoodBar', |
| 1193 | + 'moodbar-admin-intro' => 'Ceta pâge vos pèrmèt de fâre vêre los avis balyês avouéc MoodBar.', |
| 1194 | + 'moodbar-admin-empty' => 'Gins de rèsultat', |
| 1195 | + 'moodbar-header-id' => 'Numerô d’avis', |
| 1196 | + 'moodbar-header-timestamp' => 'Dâta et hora', |
| 1197 | + 'moodbar-header-type' => 'Tipo', |
| 1198 | + 'moodbar-header-page' => 'Pâge', |
| 1199 | + 'moodbar-header-usertype' => 'Tipo d’utilisator', |
| 1200 | + 'moodbar-header-user' => 'Utilisator', |
| 1201 | + 'moodbar-header-editmode' => 'Fôrma èdicion', |
| 1202 | + 'moodbar-header-bucket' => 'Ensemblo d’èprôva', |
| 1203 | + 'moodbar-header-system' => 'Tipo de sistèmo', |
| 1204 | + 'moodbar-header-locale' => 'Règ·ionâl', |
| 1205 | + 'moodbar-header-useragent' => 'Agent utilisator', |
| 1206 | + 'moodbar-header-comment' => 'Comentèros', |
| 1207 | + 'moodbar-header-user-editcount' => 'Comptor de changements a l’utilisator', |
| 1208 | + 'moodbar-header-namespace' => 'Èspâço de noms', |
| 1209 | + 'moodbar-header-own-talk' => 'Pâge de discussion a sè', |
| 1210 | + 'moodbar-feedback-title' => 'Tablô de bôrd des avis', |
| 1211 | + 'moodbar-feedback-filters' => 'Filtros', |
| 1212 | + 'moodbar-feedback-filters-type' => 'Caractèro :', |
| 1213 | + 'moodbar-feedback-filters-type-happy' => 'Herox', |
| 1214 | + 'moodbar-feedback-filters-type-confused' => 'Confondu', |
| 1215 | + 'moodbar-feedback-filters-type-sad' => 'Tristo', |
| 1216 | + 'moodbar-feedback-filters-username' => 'Nom d’utilisator', |
| 1217 | + 'moodbar-feedback-filters-button' => 'Posicionar los filtros', |
| 1218 | + 'moodbar-feedback-whatis' => 'Qu’est-o que cela fonccionalitât ?', |
| 1219 | + 'moodbar-feedback-permalink' => 'fâre un lim de vers ique', |
| 1220 | + 'moodbar-feedback-more' => 'Més', |
| 1221 | + 'moodbar-feedback-newer' => 'Ples novél', |
| 1222 | + 'moodbar-feedback-older' => 'Ples viely', |
| 1223 | + 'moodbar-user-hidden' => '(Cachiê per utilisator)', |
| 1224 | + 'moodbar-comment-hidden' => '(Avis cachiê per mesera administrativa)', |
| 1225 | + 'moodbar-feedback-show' => 'fâre vêre los avis cachiês', |
| 1226 | + 'moodbar-feedback-hide' => 'cachiér los avis', |
| 1227 | + 'moodbar-hidden-footer' => 'Avis cachiê per $1 lo $2 a $3, rêson : $4 $5', |
| 1228 | + 'moodbar-feedback-restore' => 'refâre los avis cachiês', |
| 1229 | + 'moodbar-action-item' => 'Chousa de l’avis :', |
| 1230 | + 'moodbar-action-reason' => 'Rêson :', |
| 1231 | + 'moodbar-type-happy' => 'Herox', |
| 1232 | + 'moodbar-type-sad' => 'Tristo', |
| 1233 | + 'moodbar-type-confused' => 'Confondu', |
| 1234 | + 'moodbar-user-anonymized' => 'Anonimisâ', |
| 1235 | + 'moodbar-user-ip' => 'Adrèce IP', |
| 1236 | + 'moodbar-user-user' => 'Utilisator encartâ', |
| 1237 | + 'moodbar-log-name' => 'Jornal des avis', |
| 1238 | + 'moodbar-log-hide' => 'at cachiê [[$1]]', |
| 1239 | + 'moodbar-log-restore' => 'at refêt la visibilitât de [[$1]]', |
| 1240 | +); |
| 1241 | + |
| 1242 | +/** Galician (Galego) |
| 1243 | + * @author Toliño |
| 1244 | + */ |
| 1245 | +$messages['gl'] = array( |
| 1246 | + 'moodbar-desc' => 'Permite que os usuarios especificados dean a súa opinión sobre a súa experiencia de edición', |
| 1247 | + 'moodbar-trigger-feedback' => 'Comentarios sobre a edición', |
| 1248 | + 'moodbar-trigger-share' => 'Comparta a súa experiencia', |
| 1249 | + 'moodbar-trigger-editing' => 'Editar $1...', |
| 1250 | + 'moodbar-close' => '(pechar)', |
| 1251 | + 'moodbar-intro-feedback' => 'Editar $1 fixo que agora estea...', |
| 1252 | + 'moodbar-intro-share' => 'A miña experiencia en $1 fixo que agora estea...', |
| 1253 | + 'moodbar-intro-editing' => 'Editar $1 fixo que agora estea...', |
| 1254 | + 'moodbar-type-happy-title' => 'Contento', |
| 1255 | + 'moodbar-type-sad-title' => 'Triste', |
| 1256 | + 'moodbar-type-confused-title' => 'Confuso', |
| 1257 | + 'tooltip-moodbar-what' => 'Máis información sobre esta característica', |
| 1258 | + 'moodbar-what-label' => 'Que é isto?', |
| 1259 | + 'moodbar-what-content' => 'Esta característica está deseñada para axudar á comunidade a entender a experiencia da xente á hora de editar o sitio. |
| 1260 | +Para obter máis información, bótelle unha ollada á $1 .', |
| 1261 | + 'moodbar-what-link' => 'páxina da característica', |
| 1262 | + 'moodbar-privacy' => 'Se envía os seus comentarios, acepta publicalos baixo estes $1.', |
| 1263 | + 'moodbar-privacy-link' => 'termos', |
| 1264 | + 'moodbar-disable-link' => 'Non estou interesado. Desactivar esta característica.', |
| 1265 | + 'moodbar-form-title' => 'Porque...', |
| 1266 | + 'moodbar-form-note' => '140 caracteres como máximo', |
| 1267 | + 'moodbar-form-note-dynamic' => '$1 caracteres restantes', |
| 1268 | + 'moodbar-form-submit' => 'Compartir os comentarios', |
| 1269 | + 'moodbar-form-policy-text' => 'Ao enviar, $1', |
| 1270 | + 'moodbar-form-policy-label' => 'a nosa política', |
| 1271 | + 'moodbar-loading-title' => 'Compartindo...', |
| 1272 | + 'moodbar-success-title' => 'Grazas!', |
| 1273 | + 'moodbar-error-title' => 'Vaites!', |
| 1274 | + 'moodbar-success-subtitle' => 'Compartir a súa experiencia na edición axúdanos a mellorar $1.', |
| 1275 | + 'moodbar-error-subtitle' => 'Algo foi mal! Intente compartir os seus comentarios máis tarde.', |
| 1276 | + 'right-moodbar-view' => 'Ver e exportar a barra de comentarios', |
| 1277 | + 'right-moodbar-admin' => 'Alterar a visibilidade no taboleiro de comentarios', |
| 1278 | + 'moodbar-admin-title' => 'Barra de comentarios', |
| 1279 | + 'moodbar-admin-intro' => 'Esta páxina permite ver as valoracións enviadas a través da barra de comentarios.', |
| 1280 | + 'moodbar-admin-empty' => 'Sen resultados', |
| 1281 | + 'moodbar-header-id' => 'ID do comentario', |
| 1282 | + 'moodbar-header-timestamp' => 'Data e hora', |
| 1283 | + 'moodbar-header-type' => 'Tipo', |
| 1284 | + 'moodbar-header-page' => 'Páxina', |
| 1285 | + 'moodbar-header-usertype' => 'Tipo de usuario', |
| 1286 | + 'moodbar-header-user' => 'Usuario', |
| 1287 | + 'moodbar-header-editmode' => 'Modo de edición', |
| 1288 | + 'moodbar-header-bucket' => 'Zona de probas', |
| 1289 | + 'moodbar-header-system' => 'Tipo de sistema', |
| 1290 | + 'moodbar-header-locale' => 'Local', |
| 1291 | + 'moodbar-header-useragent' => 'Axente de usuario', |
| 1292 | + 'moodbar-header-comment' => 'Comentarios', |
| 1293 | + 'moodbar-header-user-editcount' => 'Número de edición do usuario', |
| 1294 | + 'moodbar-header-namespace' => 'Espazo de nomes', |
| 1295 | + 'moodbar-header-own-talk' => 'Páxina de conversa propia', |
| 1296 | + 'moodbar-feedback-title' => 'Comentarios sobre o taboleiro', |
| 1297 | + 'moodbar-feedback-view-link' => '(Ollar os comentarios)', |
| 1298 | + 'moodbar-feedback-filters' => 'Filtros', |
| 1299 | + 'moodbar-feedback-filters-type' => 'Humor:', |
| 1300 | + 'moodbar-feedback-filters-type-happy' => 'Contento', |
| 1301 | + 'moodbar-feedback-filters-type-confused' => 'Confuso', |
| 1302 | + 'moodbar-feedback-filters-type-sad' => 'Triste', |
| 1303 | + 'moodbar-feedback-filters-username' => 'Nome de usuario', |
| 1304 | + 'moodbar-feedback-filters-button' => 'Definir os filtros', |
| 1305 | + 'moodbar-feedback-whatis' => 'Que é isto?', |
| 1306 | + 'moodbar-feedback-permalink' => 'ligazón cara aquí', |
| 1307 | + 'moodbar-feedback-noresults' => 'Non hai ningún comentario que coincida cos seus filtros.', |
| 1308 | + 'moodbar-feedback-more' => 'Máis', |
| 1309 | + 'moodbar-feedback-nomore' => 'Non hai máis resultados que mostrar.', |
| 1310 | + 'moodbar-feedback-newer' => 'Máis novos', |
| 1311 | + 'moodbar-feedback-older' => 'Máis vellos', |
| 1312 | + 'moodbar-feedback-ajaxerror' => 'Houbo un erro ao procurar máis resultados.', |
| 1313 | + 'moodbar-feedback-load-record-error' => 'Houbo un erro ao cargar un rexistro.', |
| 1314 | + 'moodbar-user-hidden' => '(Usuario agochado)', |
| 1315 | + 'moodbar-comment-hidden' => '(Comentario agochado por un administrador)', |
| 1316 | + 'moodbar-feedback-show' => 'mostrar o comentario agochado', |
| 1317 | + 'moodbar-feedback-hide' => 'agochar o comentario', |
| 1318 | + 'moodbar-hidden-footer' => 'Comentario agochado por $1 o $2 ás $3; motivo: $4 $5', |
| 1319 | + 'moodbar-hidden-footer-without-log' => 'Comentario agochado $1', |
| 1320 | + 'moodbar-feedback-restore' => 'restaurar o comentario agochado', |
| 1321 | + 'moodbar-action-item' => 'Elemento de valoración:', |
| 1322 | + 'moodbar-action-reason' => 'Motivo:', |
| 1323 | + 'moodbar-action-reason-required' => 'Cómpre achegar un motivo.', |
| 1324 | + 'moodbar-hide-header' => 'Agochar este elemento da vista', |
| 1325 | + 'moodbar-restore-header' => 'Restaurar a visibilidade deste elemento', |
| 1326 | + 'moodbar-invalid-item' => 'O sistema non puido atopar o elemento de valoración correcto.', |
| 1327 | + 'moodbar-feedback-action-error' => 'Produciuse un erro ao intentar levar a cabo esta acción.', |
| 1328 | + 'moodbar-type-happy' => 'Contento', |
| 1329 | + 'moodbar-type-sad' => 'Triste', |
| 1330 | + 'moodbar-type-confused' => 'Confuso', |
| 1331 | + 'moodbar-user-anonymized' => 'Anónimo', |
| 1332 | + 'moodbar-user-ip' => 'Enderezo IP', |
| 1333 | + 'moodbar-user-user' => 'Usuario rexistrado', |
| 1334 | + 'moodbar-log-name' => 'Rexistro de comentarios', |
| 1335 | + 'moodbar-log-header' => 'Este é o rexistro das accións levadas a cabo nos elementos de valoración listados no [[Special:FeedbackDashboard|taboleiro de comentarios]].', |
| 1336 | + 'moodbar-log-hide' => 'agochou "[[$1]]"', |
| 1337 | + 'moodbar-log-restore' => 'restaurou a visibilidade de "[[$1]]"', |
| 1338 | +); |
| 1339 | + |
| 1340 | +/** Swiss German (Alemannisch) |
| 1341 | + * @author Als-Chlämens |
| 1342 | + */ |
| 1343 | +$messages['gsw'] = array( |
| 1344 | + 'moodbar-trigger-feedback' => 'Ruggmäldig über Bearbeite', |
| 1345 | + 'moodbar-close' => '(zuemache)', |
| 1346 | + 'moodbar-type-happy-title' => 'Glicklig', |
| 1347 | + 'moodbar-type-sad-title' => 'Truurig', |
| 1348 | + 'moodbar-admin-empty' => 'Kei Ergebniss', |
| 1349 | + 'moodbar-header-id' => 'Ruggmäldigs-ID', |
| 1350 | + 'moodbar-header-timestamp' => 'Zytstämpfel', |
| 1351 | + 'moodbar-header-type' => 'Typ', |
| 1352 | + 'moodbar-header-page' => 'Syte', |
| 1353 | + 'moodbar-header-usertype' => 'Benutzerart', |
| 1354 | + 'moodbar-header-user' => 'Benutzer', |
| 1355 | + 'moodbar-header-editmode' => 'Bearbeitigsmodus', |
| 1356 | + 'moodbar-header-bucket' => 'Testumgäbig', |
| 1357 | + 'moodbar-header-system' => 'Systemtyp', |
| 1358 | + 'moodbar-header-locale' => 'Gebietsschema', |
| 1359 | + 'moodbar-header-useragent' => 'Browser', |
| 1360 | + 'moodbar-header-comment' => 'Kommentar', |
| 1361 | + 'moodbar-header-user-editcount' => 'Bearbeitigszääler', |
| 1362 | + 'moodbar-header-namespace' => 'Namensruum', |
| 1363 | + 'moodbar-header-own-talk' => 'Eigeni Diskussionssyte', |
| 1364 | + 'moodbar-feedback-title' => 'Ruggmäldigs-Brett', |
| 1365 | + 'moodbar-feedback-filters' => 'Filter', |
| 1366 | + 'moodbar-feedback-filters-type' => 'Launi', |
| 1367 | + 'moodbar-feedback-filters-type-happy' => 'Glicklig', |
| 1368 | + 'moodbar-feedback-filters-type-confused' => 'Verwirrt', |
| 1369 | + 'moodbar-feedback-filters-type-sad' => 'Truurig', |
| 1370 | + 'moodbar-feedback-filters-username' => 'Benutzername', |
| 1371 | + 'moodbar-feedback-filters-button' => 'Filter setze', |
| 1372 | + 'moodbar-type-happy' => 'Glicklig', |
| 1373 | + 'moodbar-type-sad' => 'Truurig', |
| 1374 | + 'moodbar-type-confused' => 'verwirrt', |
| 1375 | + 'moodbar-user-anonymized' => 'Anonymisiert', |
| 1376 | + 'moodbar-user-ip' => 'IP-Adräss', |
| 1377 | + 'moodbar-user-user' => 'Registrierte Benutzer', |
| 1378 | + 'moodbar-log-name' => 'Ruggmäldigs-Logbuech', |
| 1379 | + 'moodbar-log-hide' => 'het [[$1]] ussbländet', |
| 1380 | + 'moodbar-log-restore' => 'het [[$1]] wiider yybländet', |
| 1381 | +); |
| 1382 | + |
| 1383 | +/** Hebrew (עברית) |
| 1384 | + * @author Amire80 |
| 1385 | + */ |
| 1386 | +$messages['he'] = array( |
| 1387 | + 'moodbar-desc' => 'מתן אפשרות למשתמשים מסוימים לשלוח משוב על חוויות העריכה שלהם', |
| 1388 | + 'moodbar-trigger-feedback' => 'משוב על עריכה', |
| 1389 | + 'moodbar-trigger-share' => 'לשתף אותנו בחווייתך', |
| 1390 | + 'moodbar-trigger-editing' => 'עריכת $1...', |
| 1391 | + 'moodbar-close' => '(סגירה)', |
| 1392 | + 'moodbar-intro-feedback' => 'עריכת $1 גרמה לי...', |
| 1393 | + 'moodbar-intro-share' => 'החוויה שלי באתר $1 גרמה לי...', |
| 1394 | + 'moodbar-intro-editing' => 'עריכת $1 גרמה לי...', |
| 1395 | + 'moodbar-type-happy-title' => 'שמחה', |
| 1396 | + 'moodbar-type-sad-title' => 'עצב', |
| 1397 | + 'moodbar-type-confused-title' => 'בלבול', |
| 1398 | + 'tooltip-moodbar-what' => 'מידע נוסף על התכונה הזאת', |
| 1399 | + 'moodbar-what-label' => 'מה זה?', |
| 1400 | + 'moodbar-what-collapsed' => '◄', |
| 1401 | + 'moodbar-what-content' => 'התכונה הזאת נועדה לעזור לקהילה להבין את החוויה של האנשים שעורכים את האתר. |
| 1402 | +למידע נוסף, בקרו בדף $1.', |
| 1403 | + 'moodbar-what-link' => 'דף תכונה', |
| 1404 | + 'moodbar-privacy' => 'על־ידי שליחה, אתה מסכים לשקיפות לפי $1 הבאים.', |
| 1405 | + 'moodbar-privacy-link' => 'התנאים', |
| 1406 | + 'moodbar-disable-link' => 'אני לא רוצה. אנא כבו את האפשרות הזאת.', |
| 1407 | + 'moodbar-form-title' => 'כי...', |
| 1408 | + 'moodbar-form-note' => '140 תווים לכל היותר', |
| 1409 | + 'moodbar-form-note-dynamic' => 'נותר מקום {{PLURAL:$1|לתו אחד|ל־$1 תווים}}', |
| 1410 | + 'moodbar-form-submit' => 'שליחת משוב', |
| 1411 | + 'moodbar-form-policy-text' => 'על־ידי שליחה, $1', |
| 1412 | + 'moodbar-form-policy-label' => 'המדיניות שלנו', |
| 1413 | + 'moodbar-loading-title' => 'שיתוף...', |
| 1414 | + 'moodbar-success-title' => 'תודה!', |
| 1415 | + 'moodbar-error-title' => 'אוי!', |
| 1416 | + 'moodbar-success-subtitle' => 'שיתוף חוויית המשתמש שלך עוזר לנו לשפר את $1.', |
| 1417 | + 'moodbar-error-subtitle' => 'משהו השתבש! נא לנסות לשתף אותנו במשוב שלך מאוחר יותר.', |
| 1418 | + 'right-moodbar-view' => 'הצגה וייצוא של משוב מסרגל מצב הרוח', |
| 1419 | + 'right-moodbar-admin' => 'לשנות נראוּת בלוח הבקרה של המשוב', |
| 1420 | + 'moodbar-admin-title' => 'משוב על סרגל מצב הרוח', |
| 1421 | + 'moodbar-admin-intro' => 'הדף הזה מאפשר לך לראות משוב שנשלח באמצעות סרגל מצב הרוח.', |
| 1422 | + 'moodbar-admin-empty' => 'אין תוצאות', |
| 1423 | + 'moodbar-header-id' => 'מזהה משוב', |
| 1424 | + 'moodbar-header-timestamp' => 'חותם זמן', |
| 1425 | + 'moodbar-header-type' => 'סוג', |
| 1426 | + 'moodbar-header-page' => 'דף', |
| 1427 | + 'moodbar-header-usertype' => 'סוג משתמש', |
| 1428 | + 'moodbar-header-user' => 'משתמש', |
| 1429 | + 'moodbar-header-editmode' => 'מצב עריכה', |
| 1430 | + 'moodbar-header-bucket' => 'דלי ניסוי', |
| 1431 | + 'moodbar-header-system' => 'סוג מערכת', |
| 1432 | + 'moodbar-header-locale' => 'אזור', |
| 1433 | + 'moodbar-header-useragent' => 'User-Agent (דפדפן)', |
| 1434 | + 'moodbar-header-comment' => 'תגובות', |
| 1435 | + 'moodbar-header-user-editcount' => 'מספר עריכות', |
| 1436 | + 'moodbar-header-namespace' => 'מרחב שם', |
| 1437 | + 'moodbar-header-own-talk' => 'דף שיחה של עצמי', |
| 1438 | + 'moodbar-feedback-title' => 'לוח בקרה של משובים', |
| 1439 | + 'moodbar-feedback-filters' => 'מסננים', |
| 1440 | + 'moodbar-feedback-filters-type' => 'מצב רוח:', |
| 1441 | + 'moodbar-feedback-filters-type-happy' => 'שמחה', |
| 1442 | + 'moodbar-feedback-filters-type-confused' => 'בלבול', |
| 1443 | + 'moodbar-feedback-filters-type-sad' => 'עצב', |
| 1444 | + 'moodbar-feedback-filters-username' => 'שם משתמש', |
| 1445 | + 'moodbar-feedback-filters-button' => 'הגדרת מסננים', |
| 1446 | + 'moodbar-feedback-whatis' => 'מהי התכונה הזו?', |
| 1447 | + 'moodbar-feedback-permalink' => 'קישור לכאן', |
| 1448 | + 'moodbar-feedback-noresults' => 'אין עוד תגובות שתואמות את המסננים שלך.', |
| 1449 | + 'moodbar-feedback-more' => ' |
| 1450 | +עוד', |
| 1451 | + 'moodbar-feedback-nomore' => 'אין עוד תוצאות להציג.', |
| 1452 | + 'moodbar-feedback-newer' => 'חדשות יותר', |
| 1453 | + 'moodbar-feedback-older' => 'ישנות יותר', |
| 1454 | + 'moodbar-feedback-ajaxerror' => 'אירעה שגיאה בעת אחזור תוצאות נוספות.', |
| 1455 | + 'moodbar-user-hidden' => '(חשבון מוסתר)', |
| 1456 | + 'moodbar-comment-hidden' => '(המשוב הוסתר על־ידי פעולת מנהל)', |
| 1457 | + 'moodbar-feedback-show' => 'הצגת משוב מוסתר', |
| 1458 | + 'moodbar-feedback-hide' => 'הסתרת משוב', |
| 1459 | + 'moodbar-hidden-footer' => 'משוב מוסתר $1 מ־$2 $3, סיבה: $4‏ $5', |
| 1460 | + 'moodbar-feedback-restore' => 'שחזור משוב מוסתר', |
| 1461 | + 'moodbar-action-item' => 'פריט משוב:', |
| 1462 | + 'moodbar-hide-header' => 'הסתרת הפריט הזה מהתצוגה', |
| 1463 | + 'moodbar-restore-header' => 'שחזור הנראוּת של הפריט הזה', |
| 1464 | + 'moodbar-invalid-item' => 'המערכת לא הצליחה למצא את פריט המשוב הנכון.', |
| 1465 | + 'moodbar-feedback-action-error' => 'אירעה שגיאה בעת ניסיון לבצע את הפעולה הזאת.', |
| 1466 | + 'moodbar-type-happy' => 'שמחה', |
| 1467 | + 'moodbar-type-sad' => 'עצב', |
| 1468 | + 'moodbar-type-confused' => 'בלבול', |
| 1469 | + 'moodbar-user-anonymized' => 'ללא פרטים מזהים', |
| 1470 | + 'moodbar-user-ip' => 'כתובת IP', |
| 1471 | + 'moodbar-user-user' => 'משתמש רשום', |
| 1472 | + 'moodbar-log-name' => 'יומן משוב', |
| 1473 | + 'moodbar-log-header' => 'זהו יומן של פעולות שנעשו על פריטי משוב שרשומים ב[[Special:FeedbackDashboard|לוח הבקרה של המשוב]].', |
| 1474 | + 'moodbar-log-hide' => 'הסתיר את [[$1]]', |
| 1475 | + 'moodbar-log-restore' => 'שחזר את הנראוּת של [[$1]]', |
| 1476 | +); |
| 1477 | + |
| 1478 | +/** Upper Sorbian (Hornjoserbsce) |
| 1479 | + * @author Michawiki |
| 1480 | + */ |
| 1481 | +$messages['hsb'] = array( |
| 1482 | + 'moodbar-close' => '(začinić)', |
| 1483 | + 'moodbar-what-label' => 'Što to je?', |
| 1484 | + 'moodbar-header-type' => 'Typ', |
| 1485 | + 'moodbar-header-page' => 'Strona', |
| 1486 | + 'moodbar-header-user' => 'Wužiwar', |
| 1487 | + 'moodbar-header-comment' => 'Komentary', |
| 1488 | + 'moodbar-header-namespace' => 'Mjenowy rum', |
| 1489 | + 'moodbar-feedback-filters' => 'Filtry', |
| 1490 | + 'moodbar-feedback-filters-username' => 'Wužiwarske mjeno', |
| 1491 | +); |
| 1492 | + |
| 1493 | +/** Hungarian (Magyar) |
| 1494 | + * @author Dj |
| 1495 | + */ |
| 1496 | +$messages['hu'] = array( |
| 1497 | + 'moodbar-type-happy-title' => 'Boldog', |
| 1498 | + 'moodbar-type-sad-title' => 'Szomorú', |
| 1499 | + 'moodbar-type-confused-title' => 'Zavarodott', |
| 1500 | + 'moodbar-what-label' => 'Mi az?', |
| 1501 | + 'moodbar-success-title' => 'Köszönjük!', |
| 1502 | + 'moodbar-error-title' => 'Hupsz!', |
| 1503 | + 'moodbar-header-timestamp' => 'Időbélyeg', |
| 1504 | + 'moodbar-header-type' => 'Típus', |
| 1505 | + 'moodbar-header-page' => 'Lap', |
| 1506 | + 'moodbar-header-usertype' => 'Felhasználó típusa', |
| 1507 | + 'moodbar-header-comment' => 'Hozzászólások', |
| 1508 | + 'moodbar-header-namespace' => 'Névtér', |
| 1509 | + 'moodbar-feedback-filters-type' => 'Hangulat:', |
| 1510 | + 'moodbar-feedback-filters-type-happy' => 'Boldog', |
| 1511 | + 'moodbar-feedback-filters-type-sad' => 'Szomorú', |
| 1512 | + 'moodbar-feedback-filters-username' => 'Felhasználónév', |
| 1513 | +); |
| 1514 | + |
| 1515 | +/** Interlingua (Interlingua) |
| 1516 | + * @author McDutchie |
| 1517 | + */ |
| 1518 | +$messages['ia'] = array( |
| 1519 | + 'moodbar-desc' => 'Permitte al usatores specificate de fornir retroaction super lor experientia durante le modification', |
| 1520 | + 'moodbar-trigger-feedback' => 'Commentos super le modification', |
| 1521 | + 'moodbar-trigger-share' => 'Divider tu experientia', |
| 1522 | + 'moodbar-trigger-editing' => 'Modificar $1...', |
| 1523 | + 'moodbar-close' => '(clauder)', |
| 1524 | + 'moodbar-intro-feedback' => 'Modificar $1 me rendeva…', |
| 1525 | + 'moodbar-intro-share' => 'Mi experientia in $1 me rendeva…', |
| 1526 | + 'moodbar-intro-editing' => 'Modificar $1 me rendeva…', |
| 1527 | + 'moodbar-type-happy-title' => 'Felice', |
| 1528 | + 'moodbar-type-sad-title' => 'Triste', |
| 1529 | + 'moodbar-type-confused-title' => 'Confuse', |
| 1530 | + 'tooltip-moodbar-what' => 'Lege plus a proposito de iste function', |
| 1531 | + 'moodbar-what-label' => 'Que es isto?', |
| 1532 | + 'moodbar-what-content' => 'Iste function es concipite pro adjutar le communitate a comprender le experientia del personas qui modifica le sito. |
| 1533 | +Pro ulterior information, per favor visita le $1.', |
| 1534 | + 'moodbar-what-link' => 'pagina de function', |
| 1535 | + 'moodbar-privacy' => 'Per submitter, tu accepta que tu contribution essera usate publicamente sub iste $1.', |
| 1536 | + 'moodbar-privacy-link' => 'conditiones', |
| 1537 | + 'moodbar-disable-link' => 'Isto non me interessa. Per favor disactiva iste function.', |
| 1538 | + 'moodbar-form-title' => 'Perque...', |
| 1539 | + 'moodbar-form-note' => 'maximo 140 characteres', |
| 1540 | + 'moodbar-form-note-dynamic' => 'resta $1 characteres', |
| 1541 | + 'moodbar-form-submit' => 'Inviar commento', |
| 1542 | + 'moodbar-form-policy-text' => 'Per submitter, $1', |
| 1543 | + 'moodbar-form-policy-label' => 'nostre politica', |
| 1544 | + 'moodbar-loading-title' => 'Invio in curso...', |
| 1545 | + 'moodbar-success-title' => 'Gratias!', |
| 1546 | + 'moodbar-error-title' => 'Ups!', |
| 1547 | + 'moodbar-success-subtitle' => 'Per specificar tu experientia durante le modification, tu nos adjuta a meliorar $1.', |
| 1548 | + 'moodbar-error-subtitle' => 'Un problema ha occurrite! Per favor tenta specificar tu retroaction de novo plus tarde.', |
| 1549 | + 'right-moodbar-view' => 'Vider e exportar reactiones del Barra de Humor', |
| 1550 | + 'right-moodbar-admin' => 'Alterar le visibilitate sur le pannello de retroaction', |
| 1551 | + 'moodbar-admin-title' => 'Reactiones del Barra de Humor', |
| 1552 | + 'moodbar-admin-intro' => 'Iste pagina permitte vider reactiones submittite con le Barra de Humor', |
| 1553 | + 'moodbar-admin-empty' => 'Nulle resultato', |
| 1554 | + 'moodbar-header-id' => 'ID del reaction', |
| 1555 | + 'moodbar-header-timestamp' => 'Data e hora', |
| 1556 | + 'moodbar-header-type' => 'Typo', |
| 1557 | + 'moodbar-header-page' => 'Pagina', |
| 1558 | + 'moodbar-header-usertype' => 'Typo de usator', |
| 1559 | + 'moodbar-header-user' => 'Usator', |
| 1560 | + 'moodbar-header-editmode' => 'Modo de modification', |
| 1561 | + 'moodbar-header-bucket' => 'Situla de test', |
| 1562 | + 'moodbar-header-system' => 'Typo de systema', |
| 1563 | + 'moodbar-header-locale' => 'Region', |
| 1564 | + 'moodbar-header-useragent' => 'Agente usator', |
| 1565 | + 'moodbar-header-comment' => 'Commentos', |
| 1566 | + 'moodbar-header-user-editcount' => 'Numero de modificationes del usator', |
| 1567 | + 'moodbar-header-namespace' => 'Spatio de nomines', |
| 1568 | + 'moodbar-header-own-talk' => 'Pagina de discussion proprie', |
| 1569 | + 'moodbar-feedback-title' => 'Pannello de retroaction', |
| 1570 | + 'moodbar-feedback-filters' => 'Filtros', |
| 1571 | + 'moodbar-feedback-filters-type' => 'Humor:', |
| 1572 | + 'moodbar-feedback-filters-type-happy' => 'Felice', |
| 1573 | + 'moodbar-feedback-filters-type-confused' => 'Confuse', |
| 1574 | + 'moodbar-feedback-filters-type-sad' => 'Triste', |
| 1575 | + 'moodbar-feedback-filters-username' => 'Nomine de usator', |
| 1576 | + 'moodbar-feedback-filters-button' => 'Definir filtros', |
| 1577 | + 'moodbar-feedback-whatis' => 'Que es isto?', |
| 1578 | + 'moodbar-feedback-permalink' => 'ligamine a hic', |
| 1579 | + 'moodbar-feedback-noresults' => 'Il non ha commentos que corresponde con tu filtros.', |
| 1580 | + 'moodbar-feedback-more' => 'Plus', |
| 1581 | + 'moodbar-feedback-nomore' => 'Il non ha plus resultatos a monstrar.', |
| 1582 | + 'moodbar-feedback-newer' => 'Plus nove', |
| 1583 | + 'moodbar-feedback-older' => 'Plus ancian', |
| 1584 | + 'moodbar-feedback-ajaxerror' => 'Un error ha occurrite durante le obtention de altere resultatos.', |
| 1585 | + 'moodbar-feedback-load-record-error' => 'Un error occurreva durante le cargamento de un registro.', |
| 1586 | + 'moodbar-user-hidden' => '(Usator celate)', |
| 1587 | + 'moodbar-comment-hidden' => '(Commentario celate per action administrative)', |
| 1588 | + 'moodbar-feedback-show' => 'monstrar commentario celate', |
| 1589 | + 'moodbar-feedback-hide' => 'celar commentario', |
| 1590 | + 'moodbar-hidden-footer' => 'Commentario celate scribite per $1 le $2 a $3, motivo: $4 $5', |
| 1591 | + 'moodbar-hidden-footer-without-log' => 'Commentario celate $1', |
| 1592 | + 'moodbar-feedback-restore' => 'restaurar commentario celate', |
| 1593 | + 'moodbar-action-item' => 'Elemento de retroaction:', |
| 1594 | + 'moodbar-action-reason' => 'Motivo:', |
| 1595 | + 'moodbar-action-reason-required' => 'Per favor specifica un motivo.', |
| 1596 | + 'moodbar-hide-header' => 'Render iste elemento invisibile', |
| 1597 | + 'moodbar-restore-header' => 'Restaurar le visibilitate de iste elemento', |
| 1598 | + 'moodbar-invalid-item' => 'Le systema non poteva trovar le elemento de retroaction correcte.', |
| 1599 | + 'moodbar-feedback-action-error' => 'Un error occurreva durante le tentativa de exequer iste action.', |
| 1600 | + 'moodbar-type-happy' => 'Felice', |
| 1601 | + 'moodbar-type-sad' => 'Triste', |
| 1602 | + 'moodbar-type-confused' => 'Confuse', |
| 1603 | + 'moodbar-user-anonymized' => 'Anonymisate', |
| 1604 | + 'moodbar-user-ip' => 'Adresse IP', |
| 1605 | + 'moodbar-user-user' => 'Usator registrate', |
| 1606 | + 'moodbar-log-name' => 'Registro de retroaction', |
| 1607 | + 'moodbar-log-header' => 'Isto es le registro de actiones prendite sur elementos de retroaction listate in le [[Special:FeedbackDashboard|pannello de retroaction]].', |
| 1608 | + 'moodbar-log-hide' => 'celava [[$1]]', |
| 1609 | + 'moodbar-log-restore' => 'restaurava le visibilitate de [[$1]]', |
| 1610 | +); |
| 1611 | + |
| 1612 | +/** Khowar (کھوار) */ |
| 1613 | +$messages['khw'] = array( |
| 1614 | + 'moodbar-what-collapsed' => '◄', |
| 1615 | +); |
| 1616 | + |
| 1617 | +/** Colognian (Ripoarisch) |
| 1618 | + * @author Purodha |
| 1619 | + */ |
| 1620 | +$messages['ksh'] = array( |
| 1621 | + 'moodbar-close' => '(zohmaache)', |
| 1622 | + 'moodbar-privacy' => 'Wä heh jät enjitt, moß met dä $1 enverschtande sen, söns moß mer et blieve lohße.', |
| 1623 | + 'moodbar-privacy-link' => 'Begengonge', |
| 1624 | + 'moodbar-success-title' => 'Mer bedanke uns.', |
| 1625 | +); |
| 1626 | + |
| 1627 | +/** Luxembourgish (Lëtzebuergesch) |
| 1628 | + * @author Robby |
| 1629 | + */ |
| 1630 | +$messages['lb'] = array( |
| 1631 | + 'moodbar-desc' => 'Erméiglecht et spezifesche Benotzer fir dem Responsabele vum Site hir Erfarunge beim Änneren ze schécken', |
| 1632 | + 'moodbar-trigger-feedback' => "Feedback iwwert d'Änneren", |
| 1633 | + 'moodbar-trigger-share' => 'Deelt Är Erfahrungen', |
| 1634 | + 'moodbar-trigger-editing' => 'Ännert $1...', |
| 1635 | + 'moodbar-close' => '(zoumaachen)', |
| 1636 | + 'moodbar-intro-feedback' => '$1 ännere mécht mech ...', |
| 1637 | + 'moodbar-intro-share' => 'Meng Erfarung op $1 mécht mech...', |
| 1638 | + 'moodbar-intro-editing' => '$1 ännere mécht mech ...', |
| 1639 | + 'moodbar-type-happy-title' => 'Glécklech', |
| 1640 | + 'moodbar-type-sad-title' => 'Traureg', |
| 1641 | + 'moodbar-type-confused-title' => 'Duercherneen', |
| 1642 | + 'tooltip-moodbar-what' => 'Fir méi ze wëssen iwwer dës Fonctioun', |
| 1643 | + 'moodbar-what-label' => 'Wat ass dat?', |
| 1644 | + 'moodbar-what-content' => "Dës Fonctioun ass dofir geduecht fir der Gemeinschaft z'erlaben ze verstoen wéi déi Leit déi Ännerunge maachen de Site erliewen. |
| 1645 | +Fir méi Informatiounen, gitt w.e.g. op d'$1.", |
| 1646 | + 'moodbar-what-link' => 'Säit vun de Fonctiounen', |
| 1647 | + 'moodbar-privacy-link' => 'Bedingungen', |
| 1648 | + 'moodbar-disable-link' => 'Ech sinn net interesséiert. Schalt dës Fonctioun w.e.g. aus.', |
| 1649 | + 'moodbar-form-title' => 'Well...', |
| 1650 | + 'moodbar-form-note' => 'Maximal 140 Zeechen', |
| 1651 | + 'moodbar-form-note-dynamic' => 'Et bleiwen $1 Zeechen', |
| 1652 | + 'moodbar-form-submit' => 'Feedback matdeelen', |
| 1653 | + 'moodbar-form-policy-label' => 'eis Richtlinnen', |
| 1654 | + 'moodbar-success-title' => 'Merci!', |
| 1655 | + 'moodbar-error-title' => 'Ups!', |
| 1656 | + 'moodbar-success-subtitle' => 'Eis Är Erfarunge beim Ännere matzedeelen hëlleft eis $1 ze verbesseren.', |
| 1657 | + 'moodbar-admin-title' => 'MoodBar Feedback', |
| 1658 | + 'moodbar-admin-intro' => 'Dës Säit erméiglecht et Iech fir de Feedback dee mat MoodBar erageschéckt gouf ze gesinn.', |
| 1659 | + 'moodbar-admin-empty' => 'Keng Resultater', |
| 1660 | + 'moodbar-header-timestamp' => 'Zäitstempel', |
| 1661 | + 'moodbar-header-type' => 'Typ', |
| 1662 | + 'moodbar-header-page' => 'Säit', |
| 1663 | + 'moodbar-header-usertype' => 'Benotzer-Typ', |
| 1664 | + 'moodbar-header-user' => 'Benotzer', |
| 1665 | + 'moodbar-header-editmode' => 'Ännerungsmodus', |
| 1666 | + 'moodbar-header-useragent' => 'Browser', |
| 1667 | + 'moodbar-header-comment' => 'Bemierkungen', |
| 1668 | + 'moodbar-header-user-editcount' => 'Compteur vun den Ännerunge pro Benotzer', |
| 1669 | + 'moodbar-header-namespace' => 'Nummraum', |
| 1670 | + 'moodbar-header-own-talk' => 'Eegen Diskussiounssäit', |
| 1671 | + 'moodbar-feedback-filters' => 'Filteren', |
| 1672 | + 'moodbar-feedback-filters-type' => 'Stëmmung:', |
| 1673 | + 'moodbar-feedback-filters-type-happy' => 'Glécklech', |
| 1674 | + 'moodbar-feedback-filters-type-confused' => 'Duercherneen', |
| 1675 | + 'moodbar-feedback-filters-type-sad' => 'Traureg', |
| 1676 | + 'moodbar-feedback-filters-username' => 'Benotzernumm', |
| 1677 | + 'moodbar-feedback-filters-button' => 'Filtere setzen', |
| 1678 | + 'moodbar-feedback-whatis' => 'Wéi dës Fonctioun fonctionnéiert.', |
| 1679 | + 'moodbar-feedback-permalink' => 'Heihi verlinken', |
| 1680 | + 'moodbar-feedback-noresults' => 'Et gëtt keng Bemierkungen déi op Är Filtere passen.', |
| 1681 | + 'moodbar-feedback-more' => 'Méi', |
| 1682 | + 'moodbar-feedback-nomore' => 'Et gëtt ne tméi Resultater fir ze weisen.', |
| 1683 | + 'moodbar-feedback-newer' => 'Méi rezent', |
| 1684 | + 'moodbar-feedback-older' => 'Méi al', |
| 1685 | + 'moodbar-feedback-ajaxerror' => 'Am Sichen no méi Resultater ass e Feeler geschitt.', |
| 1686 | + 'moodbar-user-hidden' => '(Benotzer verstoppt)', |
| 1687 | + 'moodbar-feedback-show' => 'verstoppte Feedback weisen', |
| 1688 | + 'moodbar-feedback-hide' => 'Feedback verstoppen', |
| 1689 | + 'moodbar-hidden-footer' => 'Vum $1 den $2 ëm $3 verstoppte Feedback, Grond: $4 $5', |
| 1690 | + 'moodbar-action-reason' => 'Grond:', |
| 1691 | + 'moodbar-type-happy' => 'Glécklech', |
| 1692 | + 'moodbar-type-sad' => 'Traureg', |
| 1693 | + 'moodbar-type-confused' => 'Duercherneen', |
| 1694 | + 'moodbar-user-anonymized' => 'Anonymiséiert', |
| 1695 | + 'moodbar-user-ip' => 'IP-Adress', |
| 1696 | + 'moodbar-user-user' => 'Registréierte Benotzer', |
| 1697 | + 'moodbar-log-hide' => 'huet [[$1]] verstoppt', |
| 1698 | +); |
| 1699 | + |
| 1700 | +/** Lithuanian (Lietuvių) |
| 1701 | + * @author Eitvys200 |
| 1702 | + */ |
| 1703 | +$messages['lt'] = array( |
| 1704 | + 'moodbar-trigger-share' => 'Pasidalinkite savo patirtimi', |
| 1705 | + 'moodbar-trigger-editing' => 'Taisoma $1...', |
| 1706 | + 'moodbar-close' => '(uždaryti)', |
| 1707 | + 'moodbar-type-happy-title' => 'Laimingas', |
| 1708 | + 'moodbar-type-sad-title' => 'Liūdnas', |
| 1709 | + 'moodbar-type-confused-title' => 'Sutrikęs', |
| 1710 | + 'tooltip-moodbar-what' => 'Sužinokite daugiau apie šią funkciją', |
| 1711 | + 'moodbar-what-label' => 'Kas tai?', |
| 1712 | + 'moodbar-privacy-link' => 'sąlygos', |
| 1713 | + 'moodbar-form-title' => 'Nes...', |
| 1714 | + 'moodbar-form-note' => '140 simbolių daugiausia', |
| 1715 | + 'moodbar-form-policy-label' => 'mūsų politika', |
| 1716 | + 'moodbar-loading-title' => 'Dalijimasis ...', |
| 1717 | + 'moodbar-success-title' => 'Ačiū!', |
| 1718 | + 'moodbar-error-title' => 'Oi!', |
| 1719 | + 'moodbar-admin-empty' => 'Nėra rezultatų', |
| 1720 | + 'moodbar-header-id' => 'Atsiliepimo ID', |
| 1721 | + 'moodbar-header-timestamp' => 'Laiko žymė', |
| 1722 | + 'moodbar-header-type' => 'Tipas', |
| 1723 | + 'moodbar-header-page' => 'Puslapis', |
| 1724 | + 'moodbar-header-usertype' => 'Vartotojo tipas', |
| 1725 | + 'moodbar-header-user' => 'Vartotojas', |
| 1726 | + 'moodbar-header-editmode' => 'Redagavimo režimas', |
| 1727 | + 'moodbar-header-bucket' => 'Testavimo kibiras', |
| 1728 | + 'moodbar-header-system' => 'Sistemos tipas', |
| 1729 | + 'moodbar-header-comment' => 'Komentarai', |
| 1730 | + 'moodbar-type-happy' => 'Laimingas', |
| 1731 | + 'moodbar-type-sad' => 'Liūdnas', |
| 1732 | + 'moodbar-user-ip' => 'IP Adresas', |
| 1733 | +); |
| 1734 | + |
| 1735 | +/** Macedonian (Македонски) |
| 1736 | + * @author Bjankuloski06 |
| 1737 | + */ |
| 1738 | +$messages['mk'] = array( |
| 1739 | + 'moodbar-desc' => 'Им овозможува на одредени корисници да даваат мислење за уредувањето', |
| 1740 | + 'moodbar-trigger-feedback' => 'Мислења за уредувањето', |
| 1741 | + 'moodbar-trigger-share' => 'Споделете го вашето искуство', |
| 1742 | + 'moodbar-trigger-editing' => 'Уредување на $1...', |
| 1743 | + 'moodbar-close' => '(затвори)', |
| 1744 | + 'moodbar-intro-feedback' => 'Уредувањето на $1 ме...', |
| 1745 | + 'moodbar-intro-share' => 'Она што се случуваше на $1 ме...', |
| 1746 | + 'moodbar-intro-editing' => 'Уредувањето на $1 ме...', |
| 1747 | + 'moodbar-type-happy-title' => 'усреќи', |
| 1748 | + 'moodbar-type-sad-title' => 'натажи', |
| 1749 | + 'moodbar-type-confused-title' => 'збуни', |
| 1750 | + 'tooltip-moodbar-what' => 'Дознајте повеќе за оваа функција', |
| 1751 | + 'moodbar-what-label' => 'Што е ова?', |
| 1752 | + 'moodbar-respond-text' => 'Одговори на ова', |
| 1753 | + 'moodbar-response-add' => 'Додајте ваш одѕив', |
| 1754 | + 'moodbar-response-nosig' => 'потписот не е задолжителен', |
| 1755 | + 'moodbar-response-btn' => 'Испрати одѕив', |
| 1756 | + 'moodbar-what-content' => 'Оваа функција е предвидена да ѝ овозможува на заедницата да го осознае искуството на луѓето што го уредуваат мрежното место. |
| 1757 | +Повеќе информации ќе добиете на $1.', |
| 1758 | + 'moodbar-what-link' => 'страница за функцијата', |
| 1759 | + 'moodbar-privacy' => 'Поднесувајќи го ова, се согласувате на транспарентност под следниве $1.', |
| 1760 | + 'moodbar-privacy-link' => 'услови', |
| 1761 | + 'moodbar-disable-link' => 'Не сум заинтересиран. Оневозможи ја функцијава.', |
| 1762 | + 'moodbar-form-title' => 'Бидејќи...', |
| 1763 | + 'moodbar-form-note' => 'највеќе 140 знаци', |
| 1764 | + 'moodbar-form-note-dynamic' => 'Преостануваат $1 знаци', |
| 1765 | + 'moodbar-form-submit' => 'Сподели ▶', |
| 1766 | + 'moodbar-form-policy-text' => 'Поднесувајќи го ова, $1', |
| 1767 | + 'moodbar-form-policy-label' => 'нашите правила', |
| 1768 | + 'moodbar-loading-title' => 'Споделувам...', |
| 1769 | + 'moodbar-success-title' => 'Благодариме!', |
| 1770 | + 'moodbar-error-title' => 'Упс!', |
| 1771 | + 'moodbar-success-subtitle' => 'Споделувајќи го вашето уредувачко искуство ни помагате да ја подобриме $1.', |
| 1772 | + 'moodbar-error-subtitle' => 'Нешто не е во ред! Обидете се да го споделите вашето мислење подоцна.', |
| 1773 | + 'right-moodbar-view' => 'Преглед и извоз на мислења од MoodBar', |
| 1774 | + 'right-moodbar-admin' => 'Менување на видливоста на таблата за мислења', |
| 1775 | + 'moodbar-admin-title' => 'Мислења со MoodBar', |
| 1776 | + 'moodbar-admin-intro' => 'Оваа страница служи за преглед на мислења поднесени со MoodBar', |
| 1777 | + 'moodbar-admin-empty' => 'Нема резултати', |
| 1778 | + 'moodbar-header-id' => 'Назнака (ID) на мислењето', |
| 1779 | + 'moodbar-header-timestamp' => 'Време и датум', |
| 1780 | + 'moodbar-header-type' => 'Вид', |
| 1781 | + 'moodbar-header-page' => 'Страница', |
| 1782 | + 'moodbar-header-usertype' => 'Вид на корисник', |
| 1783 | + 'moodbar-header-user' => 'Корисник', |
| 1784 | + 'moodbar-header-editmode' => 'Уреднички режим', |
| 1785 | + 'moodbar-header-bucket' => 'Испробување', |
| 1786 | + 'moodbar-header-system' => 'Вид на систем', |
| 1787 | + 'moodbar-header-locale' => 'Место', |
| 1788 | + 'moodbar-header-useragent' => 'Корисник-вршител', |
| 1789 | + 'moodbar-header-comment' => 'Коментари', |
| 1790 | + 'moodbar-header-user-editcount' => 'Бр. на кориснички уредувања', |
| 1791 | + 'moodbar-header-namespace' => 'Именски простор', |
| 1792 | + 'moodbar-header-own-talk' => 'Сопствена страница за разговор', |
| 1793 | + 'moodbar-feedback-title' => 'Табла за мислења', |
| 1794 | + 'moodbar-feedback-response-title' => 'Одѕив на таблата за мислења', |
| 1795 | + 'moodbar-feedback-view-link' => '(Погл. мислењето)', |
| 1796 | + 'moodbar-feedback-filters' => 'Филтри', |
| 1797 | + 'moodbar-feedback-filters-type' => 'Расположение:', |
| 1798 | + 'moodbar-feedback-filters-type-happy' => 'Среќни', |
| 1799 | + 'moodbar-feedback-filters-type-confused' => 'Збунети', |
| 1800 | + 'moodbar-feedback-filters-type-sad' => 'Тажни', |
| 1801 | + 'moodbar-feedback-filters-username' => 'Корисничко име', |
| 1802 | + 'moodbar-feedback-filters-button' => 'Задај филтри', |
| 1803 | + 'moodbar-feedback-whatis' => 'Што прави оваа функција?', |
| 1804 | + 'moodbar-feedback-permalink' => 'врска до страницава', |
| 1805 | + 'moodbar-feedback-noresults' => 'Нема коментари што се совпаѓаат со филтрите.', |
| 1806 | + 'moodbar-feedback-more' => 'Повеќе', |
| 1807 | + 'moodbar-feedback-nomore' => 'Нема повеќе резултати за прикажување.', |
| 1808 | + 'moodbar-feedback-newer' => 'Понови', |
| 1809 | + 'moodbar-feedback-older' => 'Постари', |
| 1810 | + 'moodbar-feedback-ajaxerror' => 'Се појави грешка при обидот да добијам повеќе резултати.', |
| 1811 | + 'moodbar-feedback-load-record-error' => 'Се појави грешка при вчитувањето на записот.', |
| 1812 | + 'moodbar-user-hidden' => '(Корисникот е скриен)', |
| 1813 | + 'moodbar-comment-hidden' => '(Мислењата се скриени од администратор)', |
| 1814 | + 'moodbar-feedback-show' => 'прикажи скриени мислења', |
| 1815 | + 'moodbar-feedback-hide' => 'скриј мислења', |
| 1816 | + 'moodbar-feedback-action-confirm' => 'Потврди', |
| 1817 | + 'moodbar-feedback-action-cancel' => 'Откажи', |
| 1818 | + 'moodbar-hidden-footer' => 'Скриено мислењето на $1 од $2, причина: $3 $4', |
| 1819 | + 'moodbar-hidden-footer-without-log' => 'Скриено мислење $1', |
| 1820 | + 'moodbar-feedback-restore' => 'поврати скриени мислења', |
| 1821 | + 'moodbar-action-item' => 'Мислење:', |
| 1822 | + 'moodbar-action-reason' => 'Причина:', |
| 1823 | + 'moodbar-action-reason-required' => 'Наведете причина.', |
| 1824 | + 'moodbar-hide-header' => 'Скриј го мислењето', |
| 1825 | + 'moodbar-restore-header' => 'Врати ја видливоста на мислењето', |
| 1826 | + 'moodbar-invalid-item' => 'Системот не можеше да го најде бараното мислење', |
| 1827 | + 'moodbar-feedback-action-error' => 'Настана грешка при обидот да се изврши дејството.', |
| 1828 | + 'moodbar-type-happy' => 'Среќен', |
| 1829 | + 'moodbar-type-sad' => 'Тажен', |
| 1830 | + 'moodbar-type-confused' => 'Збунет', |
| 1831 | + 'moodbar-user-anonymized' => 'Анонимизирано', |
| 1832 | + 'moodbar-user-ip' => 'IP-адреса', |
| 1833 | + 'moodbar-user-user' => 'Регистриран корисник', |
| 1834 | + 'moodbar-log-name' => 'Дневник на мислења', |
| 1835 | + 'moodbar-log-header' => 'Ова е дневник на дејства што се однесуваат на мислењата искажани на [[Special:FeedbackDashboard|таблата за мислења и коментари]].', |
| 1836 | + 'moodbar-log-hide' => 'скриено [[$1]]', |
| 1837 | + 'moodbar-log-restore' => 'вратена видливоста на [[$1]]', |
| 1838 | + 'moodbar-response-ula' => 'Стискајќи на копчето „$1“ се согласувате со $2, и неотповикливо прифаќате да го објавите придонесеното под лиценците $3 и $4. |
| 1839 | +Се согласувате дека хиперврска или URL-адреса претставува достатно признание за авторство под лиценцата на Криејтив комонс.', |
| 1840 | + 'moodbar-response-terms-of-use' => 'Условите на употреба', |
| 1841 | + 'moodbar-response-cc' => 'Криејтив комонс', |
| 1842 | + 'moodbar-response-gfdl' => 'ГЛСД', |
| 1843 | + 'feedbackresponse-success' => 'Ви благодариме. Вашиот одѕив е поставен на корисничката страница за разговор.', |
| 1844 | +); |
| 1845 | + |
| 1846 | +/** Malayalam (മലയാളം) |
| 1847 | + * @author Praveenp |
| 1848 | + */ |
| 1849 | +$messages['ml'] = array( |
| 1850 | + 'moodbar-trigger-share' => 'താങ്കളുടെ അനുഭവം പങ്ക്വെയ്ക്കുക', |
| 1851 | + 'moodbar-trigger-editing' => '$1 തിരുത്തുമ്പോൾ...', |
| 1852 | + 'moodbar-close' => '(അടയ്ക്കുക)', |
| 1853 | + 'moodbar-intro-feedback' => '$1 തിരുത്തിയപ്പോൾ എനിക്ക്...', |
| 1854 | + 'moodbar-intro-share' => '$1 സംരംഭത്തിലെ എന്റെ അനുഭവം എന്നെ...', |
| 1855 | + 'moodbar-intro-editing' => '$1 തിരുത്തിയപ്പോൾ എനിക്ക്...', |
| 1856 | + 'moodbar-type-happy-title' => 'സന്തോഷമായി', |
| 1857 | + 'moodbar-type-sad-title' => 'ദുഃഖമായി', |
| 1858 | + 'moodbar-type-confused-title' => 'ആശയക്കുഴപ്പമായി', |
| 1859 | + 'tooltip-moodbar-what' => 'ഈ വിശേഷഗുണത്തെക്കുറിച്ച് കൂടുതൽ അറിയുക', |
| 1860 | + 'moodbar-what-label' => 'എന്താണിത്?', |
| 1861 | + 'moodbar-what-content' => 'വിജ്ഞാനകോശം തിരുത്തുന്നവരുടെ അനുഭവങ്ങൾ വിക്കിപീഡിയ സമൂഹത്തിനു മനസ്സിലാക്കാനായാണ് ഈ സൗകര്യം രൂപകല്പന ചെയ്തിരിക്കുന്നത്. |
| 1862 | +കൂടുതൽ വിവരങ്ങൾക്ക് ദയവായി $1 സന്ദർശിക്കുക.', |
| 1863 | + 'moodbar-what-link' => 'സവിശേഷതാ താൾ', |
| 1864 | + 'moodbar-privacy' => 'സമർപ്പിക്കുമ്പോൾ, $1 പ്രകാരമുള്ള സുതാര്യത താങ്കൾ അംഗീകരിക്കുന്നതായി കരുതപ്പെടുന്നതാണ്.', |
| 1865 | + 'moodbar-privacy-link' => 'നിബന്ധനകൾ', |
| 1866 | + 'moodbar-disable-link' => 'എനിക്കു താത്പര്യമില്ല. ദയവായി ഈ സൗകര്യം വേണ്ട.', |
| 1867 | + 'moodbar-form-title' => 'കാരണം...', |
| 1868 | + 'moodbar-form-note' => 'പരമാവധി 140 അക്ഷരങ്ങൾ', |
| 1869 | + 'moodbar-form-note-dynamic' => '$1 അക്ഷരങ്ങൾകൂടിയുണ്ട്', |
| 1870 | + 'moodbar-form-submit' => 'അഭിപ്രായങ്ങൾ പങ്ക്വെയ്ക്കുക', |
| 1871 | + 'moodbar-form-policy-text' => 'സമർപ്പിക്കുമ്പോൾ, $1', |
| 1872 | + 'moodbar-form-policy-label' => 'ഞങ്ങളുടെ നയം', |
| 1873 | + 'moodbar-loading-title' => 'പങ്ക്വെയ്ക്കുന്നു...', |
| 1874 | + 'moodbar-success-title' => 'നന്ദി!', |
| 1875 | + 'moodbar-error-title' => 'അയ്യോ!', |
| 1876 | + 'moodbar-success-subtitle' => 'താങ്കളുടെ തിരുത്തൽ അനുഭവങ്ങൾ പങ്ക് വെയ്ക്കുന്നതു $1 മെച്ചപ്പെടുത്താൻ സഹായകമാകും.', |
| 1877 | + 'moodbar-error-subtitle' => 'എന്തോ കുഴപ്പമുണ്ടായി! ദയവായി താങ്കളുടെ അഭിപ്രായം അല്പസമയത്തിനു ശേഷം പങ്ക് വെയ്ക്കുക.', |
| 1878 | + 'moodbar-admin-empty' => 'ഫലങ്ങൾ ഒന്നുമില്ല', |
| 1879 | + 'moodbar-header-timestamp' => 'സമയമുദ്ര', |
| 1880 | + 'moodbar-header-type' => 'തരം', |
| 1881 | + 'moodbar-header-page' => 'താൾ', |
| 1882 | + 'moodbar-header-usertype' => 'ഉപയോക്തൃതരം', |
| 1883 | + 'moodbar-header-user' => 'ഉപയോക്താവ്', |
| 1884 | + 'moodbar-header-editmode' => 'തിരുത്തൽ രൂപം', |
| 1885 | + 'moodbar-header-bucket' => 'പരീക്ഷണ തൊട്ടി', |
| 1886 | + 'moodbar-header-system' => 'സിസ്റ്റം തരം', |
| 1887 | + 'moodbar-header-comment' => 'അഭിപ്രായങ്ങൾ', |
| 1888 | + 'moodbar-header-user-editcount' => 'ഉപയോക്തൃ തിരുത്തലുകളുടെ എണ്ണം', |
| 1889 | + 'moodbar-header-namespace' => 'നാമമേഖല', |
| 1890 | + 'moodbar-header-own-talk' => 'സ്വന്തം സംവാദം താൾ', |
| 1891 | + 'moodbar-feedback-filters' => 'അരിപ്പകൾ', |
| 1892 | + 'moodbar-feedback-filters-type' => 'തരം:', |
| 1893 | + 'moodbar-feedback-filters-username' => 'ഉപയോക്തൃനാമം', |
| 1894 | + 'moodbar-feedback-filters-button' => 'അരിപ്പകൾ സജ്ജീകരിക്കുക', |
| 1895 | + 'moodbar-feedback-permalink' => 'ഇങ്ങോട്ടുള്ള കണ്ണികൾ', |
| 1896 | + 'moodbar-feedback-more' => 'കൂടുതൽ', |
| 1897 | + 'moodbar-feedback-nomore' => 'പ്രദർശിപ്പിക്കാൻ കൂടുതൽ ഫലങ്ങളിലില്ല.', |
| 1898 | + 'moodbar-feedback-newer' => 'പുതിയവ', |
| 1899 | + 'moodbar-feedback-older' => 'പഴയവ', |
| 1900 | + 'moodbar-feedback-ajaxerror' => 'കൂടുതൽ ഫലങ്ങൾ ശേഖരിക്കുന്നതിനിടെ പിഴവുണ്ടയി.', |
| 1901 | + 'moodbar-user-hidden' => '(ഉപയോക്താവ് മറയ്ക്കപ്പെട്ടിരിക്കുന്നു)', |
| 1902 | + 'moodbar-action-reason' => 'കാരണം:', |
| 1903 | + 'moodbar-action-reason-required' => 'ദയവായി ഒരു കാരണം നൽകുക.', |
| 1904 | + 'moodbar-type-happy' => 'സന്തോഷം', |
| 1905 | + 'moodbar-type-sad' => 'ദുഃഖം', |
| 1906 | + 'moodbar-type-confused' => 'ആശയക്കുഴപ്പം', |
| 1907 | + 'moodbar-user-anonymized' => 'അജ്ഞാതവത്കരിച്ചു', |
| 1908 | + 'moodbar-user-ip' => 'ഐ.പി. വിലാസം', |
| 1909 | + 'moodbar-user-user' => 'അംഗത്വമെടുത്ത ഉപയോക്താവ്', |
| 1910 | +); |
| 1911 | + |
| 1912 | +/** Malay (Bahasa Melayu) |
| 1913 | + * @author Anakmalaysia |
| 1914 | + */ |
| 1915 | +$messages['ms'] = array( |
| 1916 | + 'moodbar-desc' => 'Membolehkan pengguna tertentu menghantar maklum balas mereka kepada pengendali tapak', |
| 1917 | + 'moodbar-trigger-feedback' => 'Maklum balas tentang penyuntingan', |
| 1918 | + 'moodbar-trigger-share' => 'Kongsi pengalaman anda', |
| 1919 | + 'moodbar-trigger-editing' => 'Menyunting $1...', |
| 1920 | + 'moodbar-close' => '(tutup)', |
| 1921 | + 'moodbar-intro-feedback' => 'Menyunting $1 membuat saya...', |
| 1922 | + 'moodbar-intro-share' => 'Pengalaman saya di $1 membuat saya...', |
| 1923 | + 'moodbar-intro-editing' => 'Menyunting $1 membuat saya...', |
| 1924 | + 'moodbar-type-happy-title' => 'Gembira', |
| 1925 | + 'moodbar-type-sad-title' => 'Sedih', |
| 1926 | + 'moodbar-type-confused-title' => 'Keliru', |
| 1927 | + 'tooltip-moodbar-what' => 'Ketahui lebih lanjut mengenai ciri ini', |
| 1928 | + 'moodbar-what-label' => 'Apakah ini?', |
| 1929 | + 'moodbar-respond-text' => 'Balas', |
| 1930 | + 'moodbar-response-add' => 'Tulis balasan', |
| 1931 | + 'moodbar-response-nosig' => 'tandatangan tidak diperlukan', |
| 1932 | + 'moodbar-response-btn' => 'Hantar balasan', |
| 1933 | + 'moodbar-what-content' => 'Ciri ini direka untuk membantu komuniti memahami pengalaman sesiapa yang menyunting ensiklopedia ini. |
| 1934 | +Untuk maklumat lanjut, sila layari $1.', |
| 1935 | + 'moodbar-what-link' => 'laman ciri', |
| 1936 | + 'moodbar-privacy' => 'Dengan penyerahan ini, anda bersetuju dengan ketelusan di bawah $1 ini.', |
| 1937 | + 'moodbar-privacy-link' => 'syarat-syarat', |
| 1938 | + 'moodbar-disable-link' => 'Saya tak minat. Sila matikan ciri ini.', |
| 1939 | + 'moodbar-form-title' => 'Kerana...', |
| 1940 | + 'moodbar-form-note' => 'maksimum 140 aksara', |
| 1941 | + 'moodbar-form-note-dynamic' => '$1 aksara lagi', |
| 1942 | + 'moodbar-form-submit' => 'Kongsi Maklum Balas', |
| 1943 | + 'moodbar-form-policy-text' => 'Dengan penyerahan ini, $1', |
| 1944 | + 'moodbar-form-policy-label' => 'dasar kami', |
| 1945 | + 'moodbar-loading-title' => 'Berkongsi...', |
| 1946 | + 'moodbar-success-title' => 'Terima kasih!', |
| 1947 | + 'moodbar-error-title' => 'Alamak!', |
| 1948 | + 'moodbar-success-subtitle' => 'Berkongsi pengalaman menyunting anda membantu kami meningkatkan $1.', |
| 1949 | + 'moodbar-error-subtitle' => 'Ada yang tak kena! Sila cuba berkongsi maklum balas anda kemudian.', |
| 1950 | + 'right-moodbar-view' => 'Lihat dan eksport maklum balas MoodBar', |
| 1951 | + 'right-moodbar-admin' => 'Mengubah keterlihatan di papan pemuka maklum balas', |
| 1952 | + 'moodbar-admin-title' => 'Maklum balas MoodBar', |
| 1953 | + 'moodbar-admin-intro' => 'Laman ini membolehkan anda melihat maklum balas yang dihantar bersama MoodBar.', |
| 1954 | + 'moodbar-admin-empty' => 'Tiada hasil', |
| 1955 | + 'moodbar-header-id' => 'ID maklum balas', |
| 1956 | + 'moodbar-header-timestamp' => 'Cop masa', |
| 1957 | + 'moodbar-header-type' => 'Jenis', |
| 1958 | + 'moodbar-header-page' => 'Laman', |
| 1959 | + 'moodbar-header-usertype' => 'Jenis pengguna', |
| 1960 | + 'moodbar-header-user' => 'Pengguna', |
| 1961 | + 'moodbar-header-editmode' => 'Mod sunting', |
| 1962 | + 'moodbar-header-bucket' => 'Timba ujian', |
| 1963 | + 'moodbar-header-system' => 'Jenis sistem', |
| 1964 | + 'moodbar-header-locale' => 'Tempat', |
| 1965 | + 'moodbar-header-useragent' => 'Ejen Pengguna', |
| 1966 | + 'moodbar-header-comment' => 'Komen', |
| 1967 | + 'moodbar-header-user-editcount' => 'Kiraan suntingan pengguna', |
| 1968 | + 'moodbar-header-namespace' => 'Ruang nama', |
| 1969 | + 'moodbar-header-own-talk' => 'Laman perbincangan sendiri', |
| 1970 | + 'moodbar-feedback-title' => 'Papan pemuka maklum balas', |
| 1971 | + 'moodbar-feedback-response-title' => 'Respons papan pemuka maklum balas', |
| 1972 | + 'moodbar-feedback-view-link' => '(Baca maklum balas)', |
| 1973 | + 'moodbar-feedback-filters' => 'Penapis', |
| 1974 | + 'moodbar-feedback-filters-type' => 'Angin:', |
| 1975 | + 'moodbar-feedback-filters-type-happy' => 'Gembira', |
| 1976 | + 'moodbar-feedback-filters-type-confused' => 'Keliru', |
| 1977 | + 'moodbar-feedback-filters-type-sad' => 'Sedih', |
| 1978 | + 'moodbar-feedback-filters-username' => 'Nama pengguna', |
| 1979 | + 'moodbar-feedback-filters-button' => 'Tetapkan penapis', |
| 1980 | + 'moodbar-feedback-whatis' => 'Ciri ini apa?', |
| 1981 | + 'moodbar-feedback-permalink' => 'pautkan ke sini', |
| 1982 | + 'moodbar-feedback-noresults' => 'Tiada komen yang sepadan dengan tapisan anda.', |
| 1983 | + 'moodbar-feedback-more' => 'Lagi', |
| 1984 | + 'moodbar-feedback-nomore' => 'Tiada lagi hasil untuk ditunjukkan.', |
| 1985 | + 'moodbar-feedback-newer' => 'Lebih baru', |
| 1986 | + 'moodbar-feedback-older' => 'Lebih lama', |
| 1987 | + 'moodbar-feedback-ajaxerror' => 'Ralat berlaku ketika mengambil lebih banyak hasil.', |
| 1988 | + 'moodbar-feedback-load-record-error' => 'Berlakunya ralat ketika memuatkan rekod.', |
| 1989 | + 'moodbar-user-hidden' => '(Pengguna tersorok)', |
| 1990 | + 'moodbar-comment-hidden' => '(Maklum balas disorokkan oleh tindakan pentadbiran)', |
| 1991 | + 'moodbar-feedback-show' => 'tunjukkan maklum balas tersorok', |
| 1992 | + 'moodbar-feedback-hide' => 'sorokkan maklum balas', |
| 1993 | + 'moodbar-feedback-action-confirm' => 'Sahkan', |
| 1994 | + 'moodbar-feedback-action-cancel' => 'Batalkan', |
| 1995 | + 'moodbar-hidden-footer' => 'Maklum Balas Tersorok oleh $1 pada $2, sebab: $3 $4', |
| 1996 | + 'moodbar-hidden-footer-without-log' => 'Maklum Balas Tersorok $1', |
| 1997 | + 'moodbar-feedback-restore' => 'pulihkan maklum balas tersorok', |
| 1998 | + 'moodbar-action-item' => 'Butiran maklum balas:', |
| 1999 | + 'moodbar-action-reason' => 'Sebab:', |
| 2000 | + 'moodbar-action-reason-required' => 'Sila nyatakan sebab.', |
| 2001 | + 'moodbar-hide-header' => 'Sorokkan butiran ini dari pandangan', |
| 2002 | + 'moodbar-restore-header' => 'Perlihatkan semula butiran ini', |
| 2003 | + 'moodbar-invalid-item' => 'Sistem tidak dapat mencari butiran maklum balas yang betul.', |
| 2004 | + 'moodbar-feedback-action-error' => 'Ralat berlaku ketika cuba melakukan tindakan ini.', |
| 2005 | + 'moodbar-type-happy' => 'Gembira', |
| 2006 | + 'moodbar-type-sad' => 'Sedih', |
| 2007 | + 'moodbar-type-confused' => 'Keliru', |
| 2008 | + 'moodbar-user-anonymized' => 'Rahsia', |
| 2009 | + 'moodbar-user-ip' => 'Alamat IP', |
| 2010 | + 'moodbar-user-user' => 'Pengguna berdaftar', |
| 2011 | + 'moodbar-log-name' => 'Log maklum balas', |
| 2012 | + 'moodbar-log-header' => 'Inilah log tindakan kepada butiran maklum balas yang tersenarai dalam [[Special:FeedbackDashboard|papan pemuka maklum balas]].', |
| 2013 | + 'moodbar-log-hide' => 'menyorokkan [[$1]]', |
| 2014 | + 'moodbar-log-restore' => 'memperlihatkan semula [[$1]]', |
| 2015 | + 'moodbar-response-ula' => 'Dengan mengklik butang "$1", anda bersetuju dengan $2, dan anda bersetuju tanpa tertarik balik untuk melepaskan sumbangan-sumbangan anda di bawah Lesen $3 dan $4. |
| 2016 | +Anda bersetuju bahawa pautan hiper atau URL merupakan atribusi yang memadai di bawah lesen Creative Commons.', |
| 2017 | + 'moodbar-response-terms-of-use' => 'Syarat-syarat penggunaan', |
| 2018 | + 'moodbar-response-cc' => 'Creative Commons', |
| 2019 | + 'moodbar-response-gfdl' => 'GFDL', |
| 2020 | + 'feedbackresponse-success' => 'Terima kasih. Balasan anda telah dikirim kepada laman Perbincangan Pengguna itu.', |
| 2021 | +); |
| 2022 | + |
| 2023 | +/** Dutch (Nederlands) |
| 2024 | + * @author SPQRobin |
| 2025 | + * @author Saruman |
| 2026 | + * @author Siebrand |
| 2027 | + */ |
| 2028 | +$messages['nl'] = array( |
| 2029 | + 'moodbar-desc' => 'Maakt het voor bepaalde gebruikers mogelijk terugkoppeling te geven over hun ervaringen tijdens het bewerken', |
| 2030 | + 'moodbar-trigger-feedback' => 'Terugkoppeling over het bewerken', |
| 2031 | + 'moodbar-trigger-share' => 'Deel uw ervaringen', |
| 2032 | + 'moodbar-trigger-editing' => 'Het bewerken van $1...', |
| 2033 | + 'moodbar-close' => '(sluiten)', |
| 2034 | + 'moodbar-intro-feedback' => 'Het bewerken van $1 maakte mij...', |
| 2035 | + 'moodbar-intro-share' => 'Mijn ervaringen op $1 maakten mij...', |
| 2036 | + 'moodbar-intro-editing' => '$1 bewerken maakte mij...', |
| 2037 | + 'moodbar-type-happy-title' => 'Blij', |
| 2038 | + 'moodbar-type-sad-title' => 'Somber', |
| 2039 | + 'moodbar-type-confused-title' => 'Verward', |
| 2040 | + 'tooltip-moodbar-what' => 'Meer informatie over deze functie', |
| 2041 | + 'moodbar-what-label' => 'Wat is dit?', |
| 2042 | + 'moodbar-respond-collapsed' => '▶', |
| 2043 | + 'moodbar-respond-expanded' => '▼', |
| 2044 | + 'moodbar-respond-text' => 'Hierop reageren', |
| 2045 | + 'moodbar-response-add' => 'Reactie toevoegen', |
| 2046 | + 'moodbar-response-nosig' => 'ondertekening niet vereist', |
| 2047 | + 'moodbar-response-btn' => 'Antwoord verzenden', |
| 2048 | + 'moodbar-what-content' => 'Deze functie is ontworpen om de ervaring van mensen die de site bewerken te helpen begrijpen. |
| 2049 | +Ga naar de $1 voor mee informatie.', |
| 2050 | + 'moodbar-what-link' => 'pagina over deze functie', |
| 2051 | + 'moodbar-privacy' => 'Door op te slaan gaat u akkoord met transparantie onder deze $1.', |
| 2052 | + 'moodbar-privacy-link' => 'voorwaarden', |
| 2053 | + 'moodbar-disable-link' => 'Ik ben niet geïnteresseerd. Schakel deze functie uit.', |
| 2054 | + 'moodbar-form-title' => 'Omdat...', |
| 2055 | + 'moodbar-form-note' => 'Maximaal 140 tekens', |
| 2056 | + 'moodbar-form-note-dynamic' => '$1 tekens resterend', |
| 2057 | + 'moodbar-form-submit' => 'Terugkoppeling delen ▶', |
| 2058 | + 'moodbar-form-policy-text' => 'Door te delen, $1', |
| 2059 | + 'moodbar-form-policy-label' => 'ons beleid', |
| 2060 | + 'moodbar-loading-title' => 'Bezig met delen...', |
| 2061 | + 'moodbar-success-title' => 'Bedankt!', |
| 2062 | + 'moodbar-error-title' => 'Oeps!', |
| 2063 | + 'moodbar-success-subtitle' => 'Door het delen van uw ervaringen bij het bewerken, helpt u mee $1 te verbeteren.', |
| 2064 | + 'moodbar-error-subtitle' => 'Er is iets misgegaan! Probeer later opnieuw uw terugkoppeling te delen.', |
| 2065 | + 'right-moodbar-view' => 'MoodBar-terugkoppeling bekijken en exporteren', |
| 2066 | + 'right-moodbar-admin' => 'Zichtbaarheid van de terugkoppelingsdashboard wijzigen', |
| 2067 | + 'moodbar-admin-title' => 'MoodBar-terugkoppeling', |
| 2068 | + 'moodbar-admin-intro' => 'Via deze pagina terugkoppeling vanuit de MoodBar bekijken.', |
| 2069 | + 'moodbar-admin-empty' => 'Geen resultaten', |
| 2070 | + 'moodbar-header-id' => 'Nummer van de terugkoppeling', |
| 2071 | + 'moodbar-header-timestamp' => 'Tijdstip', |
| 2072 | + 'moodbar-header-type' => 'Type', |
| 2073 | + 'moodbar-header-page' => 'Pagina', |
| 2074 | + 'moodbar-header-usertype' => 'Gebruikerstype', |
| 2075 | + 'moodbar-header-user' => 'Gebruiker', |
| 2076 | + 'moodbar-header-editmode' => 'Bewerkingsmodus', |
| 2077 | + 'moodbar-header-bucket' => 'Testgroep', |
| 2078 | + 'moodbar-header-system' => 'Systeemtype', |
| 2079 | + 'moodbar-header-locale' => 'Taalinstelling', |
| 2080 | + 'moodbar-header-useragent' => 'User-Agent', |
| 2081 | + 'moodbar-header-comment' => 'Opmerkingen', |
| 2082 | + 'moodbar-header-user-editcount' => 'Aantal bewerkingen van de gebruiker', |
| 2083 | + 'moodbar-header-namespace' => 'Naamruimte', |
| 2084 | + 'moodbar-header-own-talk' => 'Eigen overlegpagina', |
| 2085 | + 'moodbar-feedback-title' => 'Dashboard voor terugkoppeling', |
| 2086 | + 'moodbar-feedback-response-title' => 'Dashboardreactie', |
| 2087 | + 'moodbar-feedback-view-link' => '(terugkoppeling bekijken)', |
| 2088 | + 'moodbar-feedback-filters' => 'Filters', |
| 2089 | + 'moodbar-feedback-filters-type' => 'Stemming:', |
| 2090 | + 'moodbar-feedback-filters-type-happy' => 'Blij', |
| 2091 | + 'moodbar-feedback-filters-type-confused' => 'Verward', |
| 2092 | + 'moodbar-feedback-filters-type-sad' => 'Somber', |
| 2093 | + 'moodbar-feedback-filters-username' => 'Gebruikersnaam', |
| 2094 | + 'moodbar-feedback-filters-button' => 'Filters instellen', |
| 2095 | + 'moodbar-feedback-whatis' => 'Wat doet deze functie?', |
| 2096 | + 'moodbar-feedback-permalink' => 'hierheen verwijzen', |
| 2097 | + 'moodbar-feedback-noresults' => 'Er zijn geen opmerkingen die voldoen aan uw filters.', |
| 2098 | + 'moodbar-feedback-more' => 'Meer', |
| 2099 | + 'moodbar-feedback-nomore' => 'Er zijn niet meer weer te geven resultaten.', |
| 2100 | + 'moodbar-feedback-newer' => 'Nieuwere', |
| 2101 | + 'moodbar-feedback-older' => 'Oudere', |
| 2102 | + 'moodbar-feedback-ajaxerror' => 'Er is een fout opgetreden bij het ophalen van meer resultaten.', |
| 2103 | + 'moodbar-feedback-load-record-error' => 'Er is een fout opgetreden tijdens het laden van een record.', |
| 2104 | + 'moodbar-user-hidden' => '(Gebruiker verborgen)', |
| 2105 | + 'moodbar-comment-hidden' => '(Terugkoppeling verborgen door een beheerder)', |
| 2106 | + 'moodbar-feedback-show' => 'verborgen terugkoppeling weergeven', |
| 2107 | + 'moodbar-feedback-hide' => 'terugkoppeling verbergen', |
| 2108 | + 'moodbar-feedback-action-confirm' => 'Bevestigen', |
| 2109 | + 'moodbar-feedback-action-cancel' => 'Annuleren', |
| 2110 | + 'moodbar-hidden-footer' => 'Verborgen terugkoppeling door $1 op $2. Reden: $3 $4', |
| 2111 | + 'moodbar-hidden-footer-without-log' => 'Verborgen terugkoppeling $1', |
| 2112 | + 'moodbar-feedback-restore' => 'verborgen terugkoppeling terugplaatsen', |
| 2113 | + 'moodbar-action-item' => 'Terugkoppelingsitem:', |
| 2114 | + 'moodbar-action-reason' => 'Reden:', |
| 2115 | + 'moodbar-action-reason-required' => 'Geef een reden op.', |
| 2116 | + 'moodbar-hide-header' => 'Dit item verbergen uit weergave', |
| 2117 | + 'moodbar-restore-header' => 'De zichtbaarheid van dit item herstellen', |
| 2118 | + 'moodbar-invalid-item' => 'Het systeem kon het juiste terugkoppelingsitem niet vinden.', |
| 2119 | + 'moodbar-feedback-action-error' => 'Er is een fout opgetreden tijdens het uitvoeren van deze handeling.', |
| 2120 | + 'moodbar-type-happy' => '{{GENDER:$1|Blij}}', |
| 2121 | + 'moodbar-type-sad' => '{{GENDER:$1|Somber}}', |
| 2122 | + 'moodbar-type-confused' => '{{GENDER:$1|Verward}}', |
| 2123 | + 'moodbar-user-anonymized' => 'Geanonimiseerd', |
| 2124 | + 'moodbar-user-ip' => 'IP-adres', |
| 2125 | + 'moodbar-user-user' => 'Geregistreerde gebruiker', |
| 2126 | + 'moodbar-log-name' => 'Terugkoppelingslogboek', |
| 2127 | + 'moodbar-log-header' => 'Dit is een logboek met uitgevoerde handelingen op items uit het [[Special:FeedbackDashboard|terugkoppelingsdashboard]].', |
| 2128 | + 'moodbar-log-hide' => 'heeft [[$1]] verborgen', |
| 2129 | + 'moodbar-log-restore' => 'heeft [[$1]] weer zichtbaar gemaakt', |
| 2130 | + 'moodbar-response-terms-of-use' => 'Gebruiksvoorwaarden', |
| 2131 | + 'feedbackresponse-success' => 'Dank u wel. Uw reactie is toegevoegd aan de overlegpagina van de gebruiker.', |
| 2132 | +); |
| 2133 | + |
| 2134 | +/** Norwegian (bokmål) (Norsk (bokmål)) |
| 2135 | + * @author Event |
| 2136 | + * @author Nghtwlkr |
| 2137 | + */ |
| 2138 | +$messages['no'] = array( |
| 2139 | + 'moodbar-close' => '(lukk)', |
| 2140 | + 'moodbar-type-happy-title' => 'Glad', |
| 2141 | + 'moodbar-type-sad-title' => 'Trist', |
| 2142 | + 'moodbar-type-confused-title' => 'Forvirret', |
| 2143 | + 'moodbar-form-title' => 'Fordi...', |
| 2144 | + 'moodbar-form-note' => 'maksimum 140 tegn', |
| 2145 | + 'moodbar-form-note-dynamic' => '$1 tegn igjen', |
| 2146 | + 'moodbar-success-title' => 'Takk!', |
| 2147 | + 'moodbar-error-title' => 'Ups!', |
| 2148 | + 'moodbar-admin-empty' => 'Ingen resultater', |
| 2149 | + 'moodbar-header-type' => 'Type', |
| 2150 | + 'moodbar-header-page' => 'Side', |
| 2151 | + 'moodbar-header-user' => 'Bruker', |
| 2152 | + 'moodbar-header-editmode' => 'Redigeringsmodus', |
| 2153 | + 'moodbar-header-bucket' => 'Testebøtte', |
| 2154 | + 'moodbar-header-system' => 'Systemtype', |
| 2155 | + 'moodbar-header-comment' => 'Kommentarer', |
| 2156 | + 'moodbar-header-user-editcount' => 'Brukerens antall redigeringer', |
| 2157 | + 'moodbar-header-namespace' => 'Navnerom', |
| 2158 | + 'moodbar-header-own-talk' => 'Egen diskusjonsside', |
| 2159 | + 'moodbar-type-happy' => 'Glad', |
| 2160 | + 'moodbar-type-sad' => 'Trist', |
| 2161 | + 'moodbar-type-confused' => 'Forvirret', |
| 2162 | + 'moodbar-user-anonymized' => 'Anonymisert', |
| 2163 | + 'moodbar-user-ip' => 'IP-adresse', |
| 2164 | + 'moodbar-user-user' => 'Registrert bruker', |
| 2165 | +); |
| 2166 | + |
| 2167 | +/** Oriya (ଓଡ଼ିଆ) |
| 2168 | + * @author Psubhashish |
| 2169 | + */ |
| 2170 | +$messages['or'] = array( |
| 2171 | + 'moodbar-header-timestamp' => 'ସମୟଚିହ୍ନ', |
| 2172 | +); |
| 2173 | + |
| 2174 | +/** Deitsch (Deitsch) |
| 2175 | + * @author Xqt |
| 2176 | + */ |
| 2177 | +$messages['pdc'] = array( |
| 2178 | + 'moodbar-form-title' => 'Weil…', |
| 2179 | + 'moodbar-header-page' => 'Blatt', |
| 2180 | + 'moodbar-header-user' => 'Yuuser', |
| 2181 | + 'moodbar-header-namespace' => 'Blatznaame', |
| 2182 | + 'moodbar-feedback-filters-username' => 'Yuuser-Naame', |
| 2183 | + 'moodbar-feedback-more' => 'Mehner', |
| 2184 | + 'moodbar-feedback-newer' => 'Neiere', |
| 2185 | +); |
| 2186 | + |
| 2187 | +/** Polish (Polski) |
| 2188 | + * @author Leinad |
| 2189 | + * @author Masti |
| 2190 | + * @author Sp5uhe |
| 2191 | + */ |
| 2192 | +$messages['pl'] = array( |
| 2193 | + 'moodbar-desc' => 'Pozwala określonym użytkownikom na wyrażenie opinii o posiadanym doświadczeniu w edytowaniu', |
| 2194 | + 'moodbar-trigger-feedback' => 'Opinia na temat edytowania', |
| 2195 | + 'moodbar-trigger-share' => 'Podziel się swoimi wrażeniami', |
| 2196 | + 'moodbar-trigger-editing' => 'Edytowanie {{GRAMMAR:D.lp|$1}}...', |
| 2197 | + 'moodbar-close' => '(zamknij)', |
| 2198 | + 'moodbar-intro-feedback' => 'Edytowanie {{GRAMMAR:D.lp|$1}} przyniosło mi...', |
| 2199 | + 'moodbar-intro-share' => 'Moje doświadczenie w {{GRAMMAR:MS.lp|$1}} przyniosło mi...', |
| 2200 | + 'moodbar-intro-editing' => 'Edytowanie {{GRAMMAR:D.lp|$1}} przyniosło mi...', |
| 2201 | + 'moodbar-type-happy-title' => 'bez problemu', |
| 2202 | + 'moodbar-type-sad-title' => 'koszmar', |
| 2203 | + 'moodbar-type-confused-title' => 'z kłopotami', |
| 2204 | + 'tooltip-moodbar-what' => 'Więcej informacji na temat tej funkcji', |
| 2205 | + 'moodbar-what-label' => 'O co tu chodzi?', |
| 2206 | + 'moodbar-what-content' => 'To narzędzie pomaga społeczności zrozumieć doświadczenia osób edytujących projekt. |
| 2207 | +Więcej informacji uzyskasz na $1.', |
| 2208 | + 'moodbar-what-link' => 'stronie opisu tego narzędzia', |
| 2209 | + 'moodbar-privacy' => 'Przesyłając, wyrażasz zgodę na udostępnienie na następujących $1.', |
| 2210 | + 'moodbar-privacy-link' => 'warunkach', |
| 2211 | + 'moodbar-disable-link' => 'Nie jestem zainteresowany. Proszę wyłączyć tę funkcję.', |
| 2212 | + 'moodbar-form-title' => 'Ponieważ...', |
| 2213 | + 'moodbar-form-note' => 'maksymalnie 140 znaków', |
| 2214 | + 'moodbar-form-note-dynamic' => 'pozostało $1 znaków', |
| 2215 | + 'moodbar-form-submit' => 'Udostępnij opinię', |
| 2216 | + 'moodbar-form-policy-text' => 'Przesyłając, $1', |
| 2217 | + 'moodbar-form-policy-label' => 'naszej polityki', |
| 2218 | + 'moodbar-loading-title' => 'Udostępnianie...', |
| 2219 | + 'moodbar-success-title' => 'Dziękujemy!', |
| 2220 | + 'moodbar-error-title' => 'Oj!', |
| 2221 | + 'moodbar-success-subtitle' => 'Wymiana doświadczeń w edytowaniu pomaga udoskonalać {{GRAMMAR:MS.lp|$1}}.', |
| 2222 | + 'moodbar-error-subtitle' => 'Coś poszło źle! Spróbuj udostępnić swoją opinię ponownie za jakiś czas.', |
| 2223 | + 'right-moodbar-view' => 'Widok i eksport opinii MoodBar', |
| 2224 | + 'right-moodbar-admin' => 'Zmiana widoczności elementów na tablicy otrzymanych opinii', |
| 2225 | + 'moodbar-admin-title' => 'Opinie MoodBar', |
| 2226 | + 'moodbar-admin-intro' => 'Strona umożliwia przeglądanie opinii zapisanych przy pomocy MoodBar.', |
| 2227 | + 'moodbar-admin-empty' => 'Brak wyników', |
| 2228 | + 'moodbar-header-id' => 'Identyfikator opinii', |
| 2229 | + 'moodbar-header-timestamp' => 'Sygnatura czasowa', |
| 2230 | + 'moodbar-header-type' => 'Typ', |
| 2231 | + 'moodbar-header-page' => 'Strona', |
| 2232 | + 'moodbar-header-usertype' => 'Typ użytkownika', |
| 2233 | + 'moodbar-header-user' => 'Użytkownik', |
| 2234 | + 'moodbar-header-editmode' => 'Tryb edycji', |
| 2235 | + 'moodbar-header-bucket' => 'Środowisko testowe', |
| 2236 | + 'moodbar-header-system' => 'Typ systemu', |
| 2237 | + 'moodbar-header-locale' => 'Preferencje językowe', |
| 2238 | + 'moodbar-header-useragent' => 'Aplikacja klienta', |
| 2239 | + 'moodbar-header-comment' => 'Komentarze', |
| 2240 | + 'moodbar-header-user-editcount' => 'Licznik edycji użytkownika', |
| 2241 | + 'moodbar-header-namespace' => 'Przestrzeń nazw', |
| 2242 | + 'moodbar-header-own-talk' => 'Własna strona dyskusji', |
| 2243 | + 'moodbar-feedback-title' => 'Tablica z otrzymanymi opiniami', |
| 2244 | + 'moodbar-feedback-filters' => 'Filtrowanie', |
| 2245 | + 'moodbar-feedback-filters-type' => 'Wrażenia', |
| 2246 | + 'moodbar-feedback-filters-type-happy' => 'Bez problemu', |
| 2247 | + 'moodbar-feedback-filters-type-confused' => 'Z kłopotami', |
| 2248 | + 'moodbar-feedback-filters-type-sad' => 'Koszmar', |
| 2249 | + 'moodbar-feedback-filters-username' => 'Nazwa użytkownika', |
| 2250 | + 'moodbar-feedback-filters-button' => 'Filtruj', |
| 2251 | + 'moodbar-feedback-whatis' => 'Jak działa to narzędzie?', |
| 2252 | + 'moodbar-feedback-permalink' => 'link do tej opinii', |
| 2253 | + 'moodbar-feedback-noresults' => 'Brak opinii pasujących do wybranego filtru.', |
| 2254 | + 'moodbar-feedback-more' => 'Więcej', |
| 2255 | + 'moodbar-feedback-nomore' => 'Nie ma więcej opinii do wyświetlenia.', |
| 2256 | + 'moodbar-feedback-newer' => 'Nowsze', |
| 2257 | + 'moodbar-feedback-older' => 'Starsze', |
| 2258 | + 'moodbar-feedback-ajaxerror' => 'Wystąpił błąd przy pobieraniu kolejnych wyników.', |
| 2259 | + 'moodbar-user-hidden' => '(Użytkownik ukryty)', |
| 2260 | + 'moodbar-comment-hidden' => '(Opinia ukryta na skutek działania administracyjnego)', |
| 2261 | + 'moodbar-feedback-show' => 'pokaż ukrytą opinię', |
| 2262 | + 'moodbar-feedback-hide' => 'ukryj opinię', |
| 2263 | + 'moodbar-feedback-restore' => 'przywróć ukrytą opinię', |
| 2264 | + 'moodbar-type-happy' => 'Bez problemu', |
| 2265 | + 'moodbar-type-sad' => 'Koszmar', |
| 2266 | + 'moodbar-type-confused' => 'Z kłopotami', |
| 2267 | + 'moodbar-user-anonymized' => 'Anonimowo', |
| 2268 | + 'moodbar-user-ip' => 'Adres IP', |
| 2269 | + 'moodbar-user-user' => 'Zarejestrowany użytkownik', |
| 2270 | +); |
| 2271 | + |
| 2272 | +/** Piedmontese (Piemontèis) |
| 2273 | + * @author Borichèt |
| 2274 | + * @author Dragonòt |
| 2275 | + */ |
| 2276 | +$messages['pms'] = array( |
| 2277 | + 'moodbar-desc' => "A përmët a j'utent spessificà ëd dé soa opinion su soa esperiensa ëd modìfica", |
| 2278 | + 'moodbar-trigger-feedback' => 'Coment an sla modìfica', |
| 2279 | + 'moodbar-trigger-share' => "Ch'a partagia soa esperiensa", |
| 2280 | + 'moodbar-trigger-editing' => 'Modifiché $1...', |
| 2281 | + 'moodbar-close' => '(saré)', |
| 2282 | + 'moodbar-intro-feedback' => "Modifiché $1 a l'ha fame...", |
| 2283 | + 'moodbar-intro-share' => "Mia esperiensa su $1 a l'ha fame...", |
| 2284 | + 'moodbar-intro-editing' => "Modifiché $1 a l'ha fame...", |
| 2285 | + 'moodbar-type-happy-title' => 'Content', |
| 2286 | + 'moodbar-type-sad-title' => 'Scontent', |
| 2287 | + 'moodbar-type-confused-title' => 'Confus', |
| 2288 | + 'tooltip-moodbar-what' => 'Amprende ëd pi su sta funsionalità', |
| 2289 | + 'moodbar-what-label' => "Lòn ch'a l'é sossì?", |
| 2290 | + 'moodbar-what-content' => "Sta funsionalità a l'é progetà për giuté la comunità a capì l'esperiensa ëd përson-e ch'a modifico ël sit. |
| 2291 | +Për savèjne ëd pi, për piasì vìsita ël $1.", |
| 2292 | + 'moodbar-what-link' => 'pàgina ëd funsionalità', |
| 2293 | + 'moodbar-privacy' => 'An sgnacand, a aceta na trasparensa conforma a coste $1.', |
| 2294 | + 'moodbar-privacy-link' => 'condission', |
| 2295 | + 'moodbar-disable-link' => 'I son pa anteressà. Për piasì disabìlita sta funsionalità-sì.', |
| 2296 | + 'moodbar-form-title' => 'Përchè...', |
| 2297 | + 'moodbar-form-note' => '140 caràter al pi', |
| 2298 | + 'moodbar-form-note-dynamic' => "$1 caràter ch'a resto", |
| 2299 | + 'moodbar-form-submit' => 'Partagé soa opinion', |
| 2300 | + 'moodbar-form-policy-text' => 'An sgnacand, $1', |
| 2301 | + 'moodbar-form-policy-label' => 'nòstre régole', |
| 2302 | + 'moodbar-loading-title' => 'Partagé...', |
| 2303 | + 'moodbar-success-title' => 'Mersì!', |
| 2304 | + 'moodbar-error-title' => 'Contacc!', |
| 2305 | + 'moodbar-success-subtitle' => 'Partagé soa esperiensa ëd modìfica an giuta a amelioré $1.', |
| 2306 | + 'moodbar-error-subtitle' => "Quaicòs a l'é andàit mal! Për piasì, ch'a preuva a partagé ij tò coment torna pi tard.", |
| 2307 | + 'right-moodbar-view' => "Smon-e e esporté lòn ch'a pensa ëd MoodBar", |
| 2308 | + 'moodbar-admin-title' => 'Opinion MoodBar', |
| 2309 | + 'moodbar-admin-intro' => "Costa pàgina a-j përmët ëd vëdde j'opinion mandà con ël MoodBar.", |
| 2310 | + 'moodbar-admin-empty' => 'Gnun arzultà', |
| 2311 | + 'moodbar-header-id' => "ID d'opinion", |
| 2312 | + 'moodbar-header-timestamp' => 'Stampin data e ora', |
| 2313 | + 'moodbar-header-type' => 'Sòrt', |
| 2314 | + 'moodbar-header-page' => 'Pàgina', |
| 2315 | + 'moodbar-header-usertype' => "Sòrt d'utent", |
| 2316 | + 'moodbar-header-user' => 'Utent', |
| 2317 | + 'moodbar-header-editmode' => 'Manera ëd modìfica', |
| 2318 | + 'moodbar-header-bucket' => 'Ansema ëd preuva', |
| 2319 | + 'moodbar-header-system' => 'Sòrt ëd sistema', |
| 2320 | + 'moodbar-header-locale' => 'Local', |
| 2321 | + 'moodbar-header-useragent' => 'Agent-Utent', |
| 2322 | + 'moodbar-header-comment' => 'Coment', |
| 2323 | + 'moodbar-header-user-editcount' => "Conteur ëd le modìfiche dl'utent", |
| 2324 | + 'moodbar-header-namespace' => 'Spassi nominal', |
| 2325 | + 'moodbar-header-own-talk' => 'Pàgina ëd discussion përsonal', |
| 2326 | + 'moodbar-type-happy' => 'Content', |
| 2327 | + 'moodbar-type-sad' => 'Scontent', |
| 2328 | + 'moodbar-type-confused' => 'Confus', |
| 2329 | + 'moodbar-user-anonymized' => 'Anonimisà', |
| 2330 | + 'moodbar-user-ip' => 'Adrëssa IP', |
| 2331 | + 'moodbar-user-user' => 'Utent registrà', |
| 2332 | +); |
| 2333 | + |
| 2334 | +/** Western Punjabi (پنجابی) */ |
| 2335 | +$messages['pnb'] = array( |
| 2336 | + 'moodbar-what-collapsed' => '◄', |
| 2337 | +); |
| 2338 | + |
| 2339 | +/** Pashto (پښتو) |
| 2340 | + * @author Ahmed-Najib-Biabani-Ibrahimkhel |
| 2341 | + */ |
| 2342 | +$messages['ps'] = array( |
| 2343 | + 'moodbar-close' => '(تړل)', |
| 2344 | + 'moodbar-type-happy-title' => 'خوښ', |
| 2345 | + 'moodbar-type-sad-title' => 'خپه', |
| 2346 | + 'moodbar-what-label' => 'دا څه دی؟', |
| 2347 | + 'moodbar-form-title' => 'د دې پخاطر...', |
| 2348 | + 'moodbar-success-title' => 'مننه!', |
| 2349 | + 'moodbar-admin-empty' => 'بې پايلو', |
| 2350 | + 'moodbar-header-page' => 'مخ', |
| 2351 | + 'moodbar-header-user' => 'کارن', |
| 2352 | + 'moodbar-feedback-filters' => 'چاڼګرونه', |
| 2353 | + 'moodbar-feedback-filters-type-happy' => 'خوښ', |
| 2354 | + 'moodbar-feedback-filters-username' => 'کارن-نوم', |
| 2355 | + 'moodbar-type-happy' => 'خوښ', |
| 2356 | + 'moodbar-type-sad' => 'خپه', |
| 2357 | +); |
| 2358 | + |
| 2359 | +/** Portuguese (Português) |
| 2360 | + * @author Hamilton Abreu |
| 2361 | + */ |
| 2362 | +$messages['pt'] = array( |
| 2363 | + 'moodbar-desc' => 'Permite que os utilizadores especificados enviem ao operador do site uma indicação da sua experiência de edição', |
| 2364 | + 'moodbar-trigger-feedback' => 'Comentários sobre edição', |
| 2365 | + 'moodbar-trigger-share' => 'Partilhe a sua experiência', |
| 2366 | + 'moodbar-trigger-editing' => 'A editar $1...', |
| 2367 | + 'moodbar-close' => '(fechar)', |
| 2368 | + 'moodbar-intro-feedback' => 'Editar a $1 fez-me sentir...', |
| 2369 | + 'moodbar-intro-share' => 'Visitar a $1 fez-me sentir...', |
| 2370 | + 'moodbar-intro-editing' => 'Usar a $1 tornou-me...', |
| 2371 | + 'moodbar-type-happy-title' => 'Feliz', |
| 2372 | + 'moodbar-type-sad-title' => 'Triste', |
| 2373 | + 'moodbar-type-confused-title' => 'Confuso', |
| 2374 | + 'tooltip-moodbar-what' => 'Saiba mais sobre esta funcionalidade', |
| 2375 | + 'moodbar-what-label' => 'O que é isto?', |
| 2376 | + 'moodbar-what-content' => 'Esta funcionalidade foi concebida para ajudar a comunidade a compreender a experiência das pessoas que editam o site. |
| 2377 | +Para mais informações, visite $1.', |
| 2378 | + 'moodbar-what-link' => 'a página da funcionalidade', |
| 2379 | + 'moodbar-privacy' => 'Ao gravar, concorda que os seus comentários podem ser tornados públicos tal como explicado $1.', |
| 2380 | + 'moodbar-privacy-link' => 'nas normas', |
| 2381 | + 'moodbar-disable-link' => 'Não estou interessado. Desactivar esta funcionalidade, por favor.', |
| 2382 | + 'moodbar-form-title' => 'Porque...', |
| 2383 | + 'moodbar-form-note' => 'máx. 140 caracteres', |
| 2384 | + 'moodbar-form-note-dynamic' => 'restam $1 caracteres', |
| 2385 | + 'moodbar-form-submit' => 'Partilhar Comentários', |
| 2386 | + 'moodbar-form-policy-text' => 'Ao gravar, $1', |
| 2387 | + 'moodbar-form-policy-label' => 'as nossas normas', |
| 2388 | + 'moodbar-loading-title' => 'A partilhar...', |
| 2389 | + 'moodbar-success-title' => 'Obrigado!', |
| 2390 | + 'moodbar-error-title' => 'Erro!', |
| 2391 | + 'moodbar-success-subtitle' => 'Partilhar connosco o seu estado de espírito ajuda-nos a melhorar a $1.', |
| 2392 | + 'moodbar-error-subtitle' => 'Algo correu mal! Tente enviar os seus comentários novamente mais tarde, por favor.', |
| 2393 | + 'right-moodbar-view' => 'Ver e exportar os comentários da MoodBar', |
| 2394 | + 'moodbar-admin-title' => 'Comentários da MoodBar', |
| 2395 | + 'moodbar-admin-intro' => 'Esta página permite-lhe ver os comentários enviados com a MoodBar', |
| 2396 | + 'moodbar-admin-empty' => 'Não foram encontrados resultados', |
| 2397 | + 'moodbar-header-id' => 'ID do comentário', |
| 2398 | + 'moodbar-header-timestamp' => 'Data e hora', |
| 2399 | + 'moodbar-header-type' => 'Tipo', |
| 2400 | + 'moodbar-header-page' => 'Página', |
| 2401 | + 'moodbar-header-usertype' => 'Tipo de utilizador', |
| 2402 | + 'moodbar-header-user' => 'Utilizador', |
| 2403 | + 'moodbar-header-editmode' => 'Modo de edição', |
| 2404 | + 'moodbar-header-bucket' => 'Zona de testes', |
| 2405 | + 'moodbar-header-system' => 'Tipo de sistema', |
| 2406 | + 'moodbar-header-locale' => 'Local', |
| 2407 | + 'moodbar-header-useragent' => 'User-Agent', |
| 2408 | + 'moodbar-header-comment' => 'Comentários', |
| 2409 | + 'moodbar-header-user-editcount' => 'Contagem de edições do utilizador', |
| 2410 | + 'moodbar-header-namespace' => 'Espaço nominal', |
| 2411 | + 'moodbar-header-own-talk' => 'Página de discussão própria', |
| 2412 | + 'moodbar-type-happy' => 'Feliz', |
| 2413 | + 'moodbar-type-sad' => 'Triste', |
| 2414 | + 'moodbar-type-confused' => 'Confuso', |
| 2415 | + 'moodbar-user-anonymized' => 'Tornado anónimo', |
| 2416 | + 'moodbar-user-ip' => 'Endereço IP', |
| 2417 | + 'moodbar-user-user' => 'Utilizador registado', |
| 2418 | +); |
| 2419 | + |
| 2420 | +/** Brazilian Portuguese (Português do Brasil) |
| 2421 | + * @author MetalBrasil |
| 2422 | + */ |
| 2423 | +$messages['pt-br'] = array( |
| 2424 | + 'moodbar-desc' => 'Permite que usuários específicados enviem ao operador do site uma indicação da sua experiência em edição', |
| 2425 | + 'moodbar-trigger-feedback' => 'Comentários sobre edição', |
| 2426 | + 'moodbar-trigger-share' => 'Partilhe sua experiência', |
| 2427 | + 'moodbar-trigger-editing' => 'Editando $1...', |
| 2428 | + 'moodbar-close' => '(fechar)', |
| 2429 | + 'moodbar-intro-feedback' => 'Editar a $1 fez-me sentir...', |
| 2430 | + 'moodbar-intro-share' => 'A minha experiência em $1 fez-me sentir...', |
| 2431 | + 'moodbar-intro-editing' => 'Editar a $1 fez-me sentir...', |
| 2432 | + 'moodbar-type-happy-title' => 'Feliz', |
| 2433 | + 'moodbar-type-sad-title' => 'Triste', |
| 2434 | + 'moodbar-type-confused-title' => 'Confuso', |
| 2435 | + 'tooltip-moodbar-what' => 'Saiba mais sobre esta função', |
| 2436 | + 'moodbar-what-label' => 'O que é isto?', |
| 2437 | + 'moodbar-what-content' => 'Este recurso foi programado para ajudar a comunidade a entender a experiência das pessoas que editam o site. Para mais informações, por favor, visite $1.', |
| 2438 | + 'moodbar-what-link' => 'Página do recurso', |
| 2439 | + 'moodbar-privacy' => 'Ao enviar, você estará concordando com a transparência nestas $1', |
| 2440 | + 'moodbar-privacy-link' => 'Termos', |
| 2441 | + 'moodbar-disable-link' => 'Não estou interessado. Por favor, desative este recurso.', |
| 2442 | + 'moodbar-form-title' => 'Porque...', |
| 2443 | + 'moodbar-form-note' => '140 caracteres no máximo', |
| 2444 | + 'moodbar-form-note-dynamic' => ' restam $1 caracteres', |
| 2445 | + 'moodbar-form-submit' => 'Compartilhar comentários', |
| 2446 | + 'moodbar-form-policy-text' => 'Ao enviar, $1', |
| 2447 | + 'moodbar-form-policy-label' => 'A nossa política', |
| 2448 | + 'moodbar-loading-title' => 'Compartilhando...', |
| 2449 | + 'moodbar-success-title' => 'Obrigado!', |
| 2450 | + 'moodbar-error-title' => 'Erro!', |
| 2451 | + 'moodbar-success-subtitle' => 'Compartilhar sua experiência de edição nos ajuda a melhorar $1.', |
| 2452 | + 'moodbar-error-subtitle' => 'Algo deu errado! Por favor, tente enviar o seus comentários de novo mais tarde.', |
| 2453 | + 'right-moodbar-view' => 'Visualizar e exportar os comentários da MoodBar', |
| 2454 | + 'moodbar-admin-title' => 'Comentários da MoodBar', |
| 2455 | + 'moodbar-admin-intro' => 'Essa página permite que você visualize comentários enviados com a MoodBar.', |
| 2456 | + 'moodbar-admin-empty' => 'Nenhum resultado.', |
| 2457 | + 'moodbar-header-id' => 'ID do comentário', |
| 2458 | + 'moodbar-header-timestamp' => 'Data e hora', |
| 2459 | + 'moodbar-header-type' => 'Tipo', |
| 2460 | + 'moodbar-header-page' => 'Página', |
| 2461 | + 'moodbar-header-usertype' => 'Tipo de usuário', |
| 2462 | + 'moodbar-header-user' => 'Usuário', |
| 2463 | + 'moodbar-header-editmode' => 'Modo de edição', |
| 2464 | + 'moodbar-header-bucket' => 'Zona de testes', |
| 2465 | + 'moodbar-header-system' => 'Tipo de sistema', |
| 2466 | + 'moodbar-header-locale' => 'Local', |
| 2467 | + 'moodbar-header-useragent' => 'Agente usuário', |
| 2468 | + 'moodbar-header-comment' => 'Comentários', |
| 2469 | + 'moodbar-header-user-editcount' => 'Contador de edições do usuário', |
| 2470 | + 'moodbar-header-namespace' => 'Espaço nominal', |
| 2471 | + 'moodbar-header-own-talk' => 'Página de conversa própria', |
| 2472 | + 'moodbar-type-happy' => 'Feliz', |
| 2473 | + 'moodbar-type-sad' => 'Triste', |
| 2474 | + 'moodbar-type-confused' => 'Confuso', |
| 2475 | + 'moodbar-user-anonymized' => 'Tornado anônimo', |
| 2476 | + 'moodbar-user-ip' => 'Endereço de IP', |
| 2477 | + 'moodbar-user-user' => 'Usuário cadastrado', |
| 2478 | +); |
| 2479 | + |
| 2480 | +/** Romanian (Română) |
| 2481 | + * @author Firilacroco |
| 2482 | + * @author Minisarm |
| 2483 | + */ |
| 2484 | +$messages['ro'] = array( |
| 2485 | + 'moodbar-desc' => 'Permite utilizatorilor specificați să își trimită părerea despre experiența lor din timpul editării', |
| 2486 | + 'moodbar-trigger-feedback' => 'Părerea dumneavoastră despre modificare', |
| 2487 | + 'moodbar-trigger-share' => 'Împărtășiți experiența dumneavoastră', |
| 2488 | + 'moodbar-trigger-editing' => 'Modificare $1...', |
| 2489 | + 'moodbar-close' => '(închide)', |
| 2490 | + 'moodbar-intro-feedback' => 'Contribuirea pe $1 m-a făcut...', |
| 2491 | + 'moodbar-intro-share' => 'Experiența mea pe $1 m-a făcut...', |
| 2492 | + 'moodbar-intro-editing' => 'Contribuirea la $1 m-a făcut...', |
| 2493 | + 'moodbar-type-happy-title' => 'Fericit', |
| 2494 | + 'moodbar-type-sad-title' => 'Trist', |
| 2495 | + 'moodbar-type-confused-title' => 'Confuz', |
| 2496 | + 'tooltip-moodbar-what' => 'Aflați mai multe despre această funcție', |
| 2497 | + 'moodbar-what-label' => 'Ce este aceasta?', |
| 2498 | + 'moodbar-what-content' => 'Această funcție este concepută să ajute comunitatea să înțeleagă experiențele oamenilor din timpul modificării site-ului. |
| 2499 | +Pentru mai multe informații, vizitați $1.', |
| 2500 | + 'moodbar-what-link' => 'pagina funcției', |
| 2501 | + 'moodbar-privacy' => 'Prin trimitere, sunteți de acord cu acești $1.', |
| 2502 | + 'moodbar-privacy-link' => 'termeni', |
| 2503 | + 'moodbar-disable-link' => 'Nu sunt interesat. Dezactivează această funcție.', |
| 2504 | + 'moodbar-form-title' => 'Deoarece...', |
| 2505 | + 'moodbar-form-note' => 'maximum 140 de caractere', |
| 2506 | + 'moodbar-form-note-dynamic' => '$1 caractere rămase', |
| 2507 | + 'moodbar-form-submit' => 'Trimite părerea', |
| 2508 | + 'moodbar-form-policy-text' => 'Prin trimitere, $1', |
| 2509 | + 'moodbar-form-policy-label' => 'politica noastră', |
| 2510 | + 'moodbar-loading-title' => 'Partajare...', |
| 2511 | + 'moodbar-success-title' => 'Mulțumesc!', |
| 2512 | + 'moodbar-error-title' => 'Ups!', |
| 2513 | + 'moodbar-success-subtitle' => 'Împărtășindu-ne experiența dumneavoastră ne ajutați să îmbunătățim $1.', |
| 2514 | + 'moodbar-error-subtitle' => 'Ceva nu a mers bine! Încercați din nou mai târziu.', |
| 2515 | + 'right-moodbar-view' => 'Vizualizați și exportați părerile trimise prin MoodBar', |
| 2516 | + 'moodbar-admin-title' => 'Feedback MoodBar', |
| 2517 | + 'moodbar-admin-intro' => 'Această pagină vă permite să vizualizați părerile trimise cu MoodBar.', |
| 2518 | + 'moodbar-admin-empty' => 'Niciun rezultat', |
| 2519 | + 'moodbar-header-id' => 'ID părere', |
| 2520 | + 'moodbar-header-timestamp' => 'Data și ora', |
| 2521 | + 'moodbar-header-type' => 'Tip', |
| 2522 | + 'moodbar-header-page' => 'Pagină', |
| 2523 | + 'moodbar-header-usertype' => 'Tip de utilizator', |
| 2524 | + 'moodbar-header-user' => 'Utilizator', |
| 2525 | + 'moodbar-header-editmode' => 'Modul de editare', |
| 2526 | + 'moodbar-header-system' => 'Tipul de sistem', |
| 2527 | + 'moodbar-header-locale' => 'Regional', |
| 2528 | + 'moodbar-header-useragent' => 'Agent utilizator', |
| 2529 | + 'moodbar-header-comment' => 'Comentarii', |
| 2530 | + 'moodbar-header-user-editcount' => 'Număr contribuții utilizator', |
| 2531 | + 'moodbar-header-namespace' => 'Spațiu de nume', |
| 2532 | + 'moodbar-header-own-talk' => 'Pagina proprie de discuții', |
| 2533 | + 'moodbar-feedback-filters' => 'Filtre', |
| 2534 | + 'moodbar-feedback-filters-type' => 'Stare de spirit:', |
| 2535 | + 'moodbar-feedback-filters-type-happy' => 'Fericit', |
| 2536 | + 'moodbar-feedback-filters-type-confused' => 'Confuz', |
| 2537 | + 'moodbar-feedback-filters-type-sad' => 'Trist', |
| 2538 | + 'moodbar-feedback-filters-username' => 'Nume de utilizator', |
| 2539 | + 'moodbar-feedback-more' => 'Mai multe', |
| 2540 | + 'moodbar-type-happy' => 'Fericit', |
| 2541 | + 'moodbar-type-sad' => 'Trist', |
| 2542 | + 'moodbar-type-confused' => 'Confuz', |
| 2543 | + 'moodbar-user-anonymized' => 'Transmise anonime', |
| 2544 | + 'moodbar-user-ip' => 'Adresă IP', |
| 2545 | + 'moodbar-user-user' => 'Utilizator înregistrat', |
| 2546 | +); |
| 2547 | + |
| 2548 | +/** Tarandíne (Tarandíne) |
| 2549 | + * @author Joetaras |
| 2550 | + */ |
| 2551 | +$messages['roa-tara'] = array( |
| 2552 | + 'moodbar-trigger-feedback' => 'Feedback sus a le cangiaminde', |
| 2553 | + 'moodbar-trigger-share' => "Condivide l'esperienza toje", |
| 2554 | + 'moodbar-trigger-editing' => 'Stoche a cange $1 ...', |
| 2555 | + 'moodbar-close' => '(chiude)', |
| 2556 | + 'moodbar-intro-feedback' => 'Cangiamende de $1 fatte da me...', |
| 2557 | + 'moodbar-intro-editing' => 'Cangiamende de $1 fatte da me...', |
| 2558 | + 'moodbar-type-happy-title' => 'Felice', |
| 2559 | + 'moodbar-type-sad-title' => 'Triste', |
| 2560 | + 'moodbar-type-confused-title' => 'Confuse', |
| 2561 | + 'moodbar-what-label' => 'Ce jè quiste?', |
| 2562 | + 'moodbar-what-link' => 'pàgene de dettaglie', |
| 2563 | + 'moodbar-privacy-link' => 'termine', |
| 2564 | + 'moodbar-form-title' => 'Purcé...', |
| 2565 | + 'moodbar-form-note' => '140 carattere massime', |
| 2566 | + 'moodbar-form-note-dynamic' => '$1 carattere rumaste', |
| 2567 | + 'moodbar-form-submit' => "Condivide 'u feedback", |
| 2568 | + 'moodbar-form-policy-text' => 'Da confermà, $1', |
| 2569 | + 'moodbar-form-policy-label' => 'le reghele nuèstre', |
| 2570 | + 'moodbar-loading-title' => 'Stoche a condivide...', |
| 2571 | + 'moodbar-success-title' => 'Grazie!', |
| 2572 | + 'moodbar-error-title' => "Ohhhhh! C'è scritte!", |
| 2573 | + 'right-moodbar-view' => "Vide e esporte 'u feedbacl de MoodBar", |
| 2574 | + 'moodbar-admin-title' => 'Feedback de MoodBar', |
| 2575 | + 'moodbar-admin-intro' => "Sta pàgene te face vedè le feedback tune confermate cu 'a MoodBar.", |
| 2576 | + 'moodbar-admin-empty' => 'Nisciune resultate', |
| 2577 | + 'moodbar-header-id' => "ID d'u feedback", |
| 2578 | + 'moodbar-header-timestamp' => 'Orarie de stambe', |
| 2579 | + 'moodbar-header-type' => 'Tipe', |
| 2580 | + 'moodbar-header-page' => 'Pàgene', |
| 2581 | + 'moodbar-header-usertype' => "Tipe d'utende", |
| 2582 | + 'moodbar-header-user' => 'Utende', |
| 2583 | + 'moodbar-header-editmode' => 'Mode pu cangiamende', |
| 2584 | + 'moodbar-header-bucket' => "Stoche a test 'u secchie", |
| 2585 | + 'moodbar-header-system' => 'Tipe de sisteme', |
| 2586 | + 'moodbar-header-locale' => 'Locale', |
| 2587 | + 'moodbar-header-useragent' => 'Utende agente', |
| 2588 | + 'moodbar-header-comment' => 'Commende', |
| 2589 | + 'moodbar-header-user-editcount' => "Condatore de le cangiaminde de l'utende", |
| 2590 | + 'moodbar-header-namespace' => 'Namespace', |
| 2591 | + 'moodbar-header-own-talk' => "Pàgene de le 'ngazzaminde meje", |
| 2592 | + 'moodbar-feedback-filters-username' => "Nome de l'utende", |
| 2593 | + 'moodbar-type-happy' => 'Felice', |
| 2594 | + 'moodbar-type-sad' => 'Triste', |
| 2595 | + 'moodbar-type-confused' => 'Confuse', |
| 2596 | + 'moodbar-user-anonymized' => 'Anonimate', |
| 2597 | + 'moodbar-user-ip' => 'Indirizze IP', |
| 2598 | + 'moodbar-user-user' => 'Utende reggistrate', |
| 2599 | + 'moodbar-log-hide' => 'scunne "[[$1]]"', |
| 2600 | +); |
| 2601 | + |
| 2602 | +/** Russian (Русский) |
| 2603 | + * @author Eleferen |
| 2604 | + * @author Engineering |
| 2605 | + * @author Ole Yves |
| 2606 | + * @author Александр Сигачёв |
| 2607 | + */ |
| 2608 | +$messages['ru'] = array( |
| 2609 | + 'moodbar-desc' => 'Позволяет определенным участникам размещать отзывы о своём редакторском опыте', |
| 2610 | + 'moodbar-trigger-feedback' => 'Отзыв о редактировании', |
| 2611 | + 'moodbar-trigger-share' => 'Поделитесь опытом', |
| 2612 | + 'moodbar-trigger-editing' => 'Редактирование $1...', |
| 2613 | + 'moodbar-close' => '(закрыть)', |
| 2614 | + 'moodbar-intro-feedback' => 'Редактирование {{GRAMMAR:genitive|$1}} принесло мне...', |
| 2615 | + 'moodbar-intro-share' => 'Мой опыт на $1 сделали меня...', |
| 2616 | + 'moodbar-intro-editing' => 'Редактирование $1 сделало меня...', |
| 2617 | + 'moodbar-type-happy-title' => 'Радость', |
| 2618 | + 'moodbar-type-sad-title' => 'Грусть', |
| 2619 | + 'moodbar-type-confused-title' => 'Замешательство', |
| 2620 | + 'tooltip-moodbar-what' => 'Подробнее об этой функции', |
| 2621 | + 'moodbar-what-label' => 'Что это?', |
| 2622 | + 'moodbar-what-content' => 'Эта функция предназначена для того, чтобы помочь сообществу понять опыт людей, редактирующих на сайте. |
| 2623 | +Для получения дополнительной информации, пожалуйста, посетите $1.', |
| 2624 | + 'moodbar-what-link' => 'следующую страницу', |
| 2625 | + 'moodbar-privacy' => 'Отправляя, вы соглашаетесь огласить эти данные на $1.', |
| 2626 | + 'moodbar-privacy-link' => 'следующих условиях', |
| 2627 | + 'moodbar-disable-link' => 'Мне неинтересно. Пожалуйста, отключите эту функцию.', |
| 2628 | + 'moodbar-form-title' => 'Потому что...', |
| 2629 | + 'moodbar-form-note' => 'не более 140 символов', |
| 2630 | + 'moodbar-form-note-dynamic' => 'осталось символов: $1', |
| 2631 | + 'moodbar-form-submit' => 'Поделиться мнением', |
| 2632 | + 'moodbar-form-policy-text' => 'Отправляя, $1', |
| 2633 | + 'moodbar-form-policy-label' => 'наши правила', |
| 2634 | + 'moodbar-loading-title' => 'Открытие доступа...', |
| 2635 | + 'moodbar-success-title' => 'Спасибо!', |
| 2636 | + 'moodbar-error-title' => 'Ой!', |
| 2637 | + 'moodbar-success-subtitle' => 'Поделившись своим опытом, вы поможете нам улучшить $1.', |
| 2638 | + 'moodbar-error-subtitle' => 'Что-то пошло не так! Пожалуйста, попробуйте отправить ваш отзыв позднее.', |
| 2639 | + 'right-moodbar-view' => 'Просмотр и экспорт отзывов MoodBar', |
| 2640 | + 'right-moodbar-admin' => 'Изменить видимость на панели отзывов', |
| 2641 | + 'moodbar-admin-title' => 'Отзыв MoodBar', |
| 2642 | + 'moodbar-admin-intro' => 'Эта страница позволяет просматривать отзывы, отправленные с помощью MoodBar.', |
| 2643 | + 'moodbar-admin-empty' => 'Нет данных', |
| 2644 | + 'moodbar-header-id' => 'ИД отзыва', |
| 2645 | + 'moodbar-header-timestamp' => 'Дата/время', |
| 2646 | + 'moodbar-header-type' => 'Тип', |
| 2647 | + 'moodbar-header-page' => 'Страница', |
| 2648 | + 'moodbar-header-usertype' => 'Тип участника', |
| 2649 | + 'moodbar-header-user' => 'Участник', |
| 2650 | + 'moodbar-header-editmode' => 'Режим редактирования', |
| 2651 | + 'moodbar-header-bucket' => 'Проверочная область', |
| 2652 | + 'moodbar-header-system' => 'Тип системы', |
| 2653 | + 'moodbar-header-locale' => 'Локаль', |
| 2654 | + 'moodbar-header-useragent' => 'Браузер', |
| 2655 | + 'moodbar-header-comment' => 'Примечания', |
| 2656 | + 'moodbar-header-user-editcount' => 'Число правок участника', |
| 2657 | + 'moodbar-header-namespace' => 'Пространство имён', |
| 2658 | + 'moodbar-header-own-talk' => 'Собственная страница обсуждения', |
| 2659 | + 'moodbar-feedback-title' => 'Панель отзывов', |
| 2660 | + 'moodbar-feedback-filters' => 'Фильтры', |
| 2661 | + 'moodbar-feedback-filters-type' => 'Настроение:', |
| 2662 | + 'moodbar-feedback-filters-type-happy' => 'Радость', |
| 2663 | + 'moodbar-feedback-filters-type-confused' => 'Замешательство', |
| 2664 | + 'moodbar-feedback-filters-type-sad' => 'Грусть', |
| 2665 | + 'moodbar-feedback-filters-username' => 'Имя участника', |
| 2666 | + 'moodbar-feedback-filters-button' => 'Установка фильтров', |
| 2667 | + 'moodbar-feedback-whatis' => 'Что это за функции?', |
| 2668 | + 'moodbar-feedback-permalink' => 'ссылка сюда', |
| 2669 | + 'moodbar-feedback-noresults' => 'Нет комментариев, соответствующих вашим фильтрам.', |
| 2670 | + 'moodbar-feedback-more' => 'Ещё', |
| 2671 | + 'moodbar-feedback-nomore' => 'Больше нет данных для отображения.', |
| 2672 | + 'moodbar-feedback-newer' => 'Более новые', |
| 2673 | + 'moodbar-feedback-older' => 'Более старые', |
| 2674 | + 'moodbar-feedback-ajaxerror' => 'Произошла ошибка при получении дополнительных данных.', |
| 2675 | + 'moodbar-user-hidden' => '(Участник скрыт)', |
| 2676 | + 'moodbar-comment-hidden' => '(Отзыв скрыт администратором)', |
| 2677 | + 'moodbar-feedback-show' => 'показать скрытый отзыв', |
| 2678 | + 'moodbar-feedback-hide' => 'скрыть отзыв', |
| 2679 | + 'moodbar-feedback-action-confirm' => 'Подтвердить', |
| 2680 | + 'moodbar-feedback-action-cancel' => 'Отменить', |
| 2681 | + 'moodbar-hidden-footer' => 'Скрытый отзыв $1 от $2 $3, по причине: $4 $5', |
| 2682 | + 'moodbar-hidden-footer-without-log' => 'Скрытый отзыв $1', |
| 2683 | + 'moodbar-feedback-restore' => 'восстановить скрытый отзыв', |
| 2684 | + 'moodbar-action-item' => 'Пункт Обратная связь:', |
| 2685 | + 'moodbar-action-reason' => 'Причина:', |
| 2686 | + 'moodbar-action-reason-required' => 'Пожалуйста, представьте причину.', |
| 2687 | + 'moodbar-hide-header' => 'Скрыть этот элемент из представления', |
| 2688 | + 'moodbar-restore-header' => 'Восстановить видимость этого пункта', |
| 2689 | + 'moodbar-invalid-item' => 'Системе не удалось найти правильного элемента обратной связи.', |
| 2690 | + 'moodbar-feedback-action-error' => 'При попытке выполнить это действие произошла ошибка.', |
| 2691 | + 'moodbar-type-happy' => 'Радость', |
| 2692 | + 'moodbar-type-sad' => 'Грусть', |
| 2693 | + 'moodbar-type-confused' => 'Замешательство', |
| 2694 | + 'moodbar-user-anonymized' => 'Аноним', |
| 2695 | + 'moodbar-user-ip' => 'IP-адрес', |
| 2696 | + 'moodbar-user-user' => 'Зарегистрированный участник', |
| 2697 | + 'moodbar-log-name' => 'Журнал обратной связи', |
| 2698 | + 'moodbar-log-header' => 'Это журнал действий, связанных с обратной связью, см. список на [[Специальный: FeedbackDashboard|панели обратной связи]].', |
| 2699 | + 'moodbar-log-hide' => 'скрыть [[$1]]', |
| 2700 | + 'moodbar-log-restore' => 'восстановил видимость для [[$1]]', |
| 2701 | + 'moodbar-response-terms-of-use' => 'Условия использования', |
| 2702 | +); |
| 2703 | + |
| 2704 | +/** Rusyn (Русиньскый) |
| 2705 | + * @author Gazeb |
| 2706 | + */ |
| 2707 | +$messages['rue'] = array( |
| 2708 | + 'moodbar-desc' => 'Доволює становленым хоснователям придати одозву з їх скусеностей з едітованя', |
| 2709 | + 'moodbar-trigger-feedback' => 'Одозва про едітованя', |
| 2710 | + 'moodbar-trigger-share' => 'Здїляти вашы скусености', |
| 2711 | + 'moodbar-trigger-editing' => 'Едітованя $1...', |
| 2712 | + 'moodbar-close' => '(заперти)', |
| 2713 | + 'moodbar-intro-feedback' => 'Едітованя $1 ня зробило...', |
| 2714 | + 'moodbar-intro-share' => 'Моя скусеность на $1 ня зробила...', |
| 2715 | + 'moodbar-intro-editing' => 'Едітованя $1 ня зробило...', |
| 2716 | + 'moodbar-type-happy-title' => 'Щастливый', |
| 2717 | + 'moodbar-type-sad-title' => 'Смутный', |
| 2718 | + 'moodbar-type-confused-title' => 'Ошаленый', |
| 2719 | + 'tooltip-moodbar-what' => 'Дізнайте ся веце про тоту функцію', |
| 2720 | + 'moodbar-what-label' => 'Што є тото?', |
| 2721 | + 'moodbar-what-content' => 'Тота функція є становлена про поміч комунітї порозуміти скусености людей, котры едітують сайт. |
| 2722 | +Про веце інформацій навщівте $1.', |
| 2723 | + 'moodbar-what-link' => 'наступну сторінку', |
| 2724 | + 'moodbar-privacy' => 'Одосланём сьте згодны з публічностёв дат під $1.', |
| 2725 | + 'moodbar-privacy-link' => 'условіях', |
| 2726 | + 'moodbar-disable-link' => 'Я не мам інтерес. Прошу выпнийте тоту функцію.', |
| 2727 | + 'moodbar-form-title' => 'Зато же...', |
| 2728 | + 'moodbar-form-note' => 'не веце 140 сімболів.', |
| 2729 | + 'moodbar-form-note-dynamic' => '$1 сімболів зістало', |
| 2730 | + 'moodbar-form-submit' => 'Подїлити ся одозвов', |
| 2731 | + 'moodbar-form-policy-text' => 'Посылаючі, $1', |
| 2732 | + 'moodbar-form-policy-label' => 'нашы правила', |
| 2733 | + 'moodbar-loading-title' => 'Здїляня...', |
| 2734 | + 'moodbar-success-title' => 'Дякуєме!', |
| 2735 | + 'moodbar-error-title' => 'Оёёй!', |
| 2736 | + 'moodbar-success-subtitle' => 'Здїляня вашых скусеностей з едітованём на поможе вылїпшыти $1.', |
| 2737 | + 'moodbar-error-subtitle' => 'Штось не добрї пішло! Просиме, спробуйте здїляти одозву знову пізнїше.', |
| 2738 | + 'right-moodbar-view' => 'Нагляд і експорт одозвы про MoodBar', |
| 2739 | + 'moodbar-admin-title' => 'Одозвы про MoodBar', |
| 2740 | + 'moodbar-admin-intro' => 'Тота сторінка доволює відїти одозвы посланы за помочі MoodBar.', |
| 2741 | + 'moodbar-admin-empty' => 'Жадны резултаты', |
| 2742 | + 'moodbar-header-id' => 'Ідентіфікатор одозвы', |
| 2743 | + 'moodbar-header-timestamp' => 'Часова значка', |
| 2744 | + 'moodbar-header-type' => 'Тіп', |
| 2745 | + 'moodbar-header-page' => 'Сторінка', |
| 2746 | + 'moodbar-header-usertype' => 'Тіп хоснователя', |
| 2747 | + 'moodbar-header-user' => 'Хоснователь', |
| 2748 | + 'moodbar-header-editmode' => 'Режім едітованя', |
| 2749 | + 'moodbar-header-bucket' => 'Область перевіркы', |
| 2750 | + 'moodbar-header-system' => 'Тіп сістемы', |
| 2751 | + 'moodbar-header-locale' => 'Локалны', |
| 2752 | + 'moodbar-header-useragent' => 'Кліентьскый проґрам', |
| 2753 | + 'moodbar-header-comment' => 'Коментарї', |
| 2754 | + 'moodbar-header-user-editcount' => 'Чісло едітовань хоснователя', |
| 2755 | + 'moodbar-header-namespace' => 'Простор назв', |
| 2756 | + 'moodbar-header-own-talk' => 'Властна сторінка діскузії', |
| 2757 | + 'moodbar-type-happy' => 'Щастливый', |
| 2758 | + 'moodbar-type-sad' => 'Смутный', |
| 2759 | + 'moodbar-type-confused' => 'Ошаленый', |
| 2760 | + 'moodbar-user-anonymized' => 'Анонім', |
| 2761 | + 'moodbar-user-ip' => 'IP адреса', |
| 2762 | + 'moodbar-user-user' => 'Реґістрованый хоснователь', |
| 2763 | +); |
| 2764 | + |
| 2765 | +/** Sinhala (සිංහල) |
| 2766 | + * @author Singhalawap |
| 2767 | + */ |
| 2768 | +$messages['si'] = array( |
| 2769 | + 'moodbar-success-title' => 'පිං !', |
| 2770 | + 'moodbar-error-title' => 'අයියෝ !', |
| 2771 | + 'moodbar-header-page' => 'පිටුව', |
| 2772 | + 'moodbar-type-happy' => 'සතුටු', |
| 2773 | + 'moodbar-type-sad' => 'දුක්මුසු', |
| 2774 | +); |
| 2775 | + |
| 2776 | +/** Slovenian (Slovenščina) |
| 2777 | + * @author Dbc334 |
| 2778 | + */ |
| 2779 | +$messages['sl'] = array( |
| 2780 | + 'moodbar-desc' => 'Omogoča določenim uporabnikom pošiljanje povratne informacije o svoji urejevalski izkušnji', |
| 2781 | + 'moodbar-trigger-feedback' => 'Povratne informacije o urejanju', |
| 2782 | + 'moodbar-trigger-share' => 'Delite svoje izkušnje', |
| 2783 | + 'moodbar-trigger-editing' => 'Urejanje $1 ...', |
| 2784 | + 'moodbar-close' => '(zapri)', |
| 2785 | + 'moodbar-intro-feedback' => 'Urejanje $1 me je naredilo ...', |
| 2786 | + 'moodbar-intro-share' => 'Moja izkušnja na $1 me je naredila ...', |
| 2787 | + 'moodbar-intro-editing' => 'Urejanje $1 me je naredilo ...', |
| 2788 | + 'moodbar-type-happy-title' => 'Vesel', |
| 2789 | + 'moodbar-type-sad-title' => 'Žalosten', |
| 2790 | + 'moodbar-type-confused-title' => 'Zmeden', |
| 2791 | + 'tooltip-moodbar-what' => 'Več informacij o tej funkciji', |
| 2792 | + 'moodbar-what-label' => 'Kaj je to?', |
| 2793 | + 'moodbar-what-content' => 'Funkcija je oblikovana kot pomoč skupnosti pri razumevanju izkušnje ljudi, ki urejajo stran. |
| 2794 | +Za več informacij obiščite $1.', |
| 2795 | + 'moodbar-what-link' => 'stran z opisom', |
| 2796 | + 'moodbar-privacy' => 'S potrditvijo se strinjate s preglednostjo pod naslednjimi $1.', |
| 2797 | + 'moodbar-privacy-link' => 'pogoji', |
| 2798 | + 'moodbar-disable-link' => 'Me ne zanima. Prosim, onemogoči to funkcijo.', |
| 2799 | + 'moodbar-form-title' => 'Ker ...', |
| 2800 | + 'moodbar-form-note' => 'največ 140 znakov', |
| 2801 | + 'moodbar-form-note-dynamic' => 'preostalo je $1 znakov', |
| 2802 | + 'moodbar-form-submit' => 'Deli povratne informacije', |
| 2803 | + 'moodbar-form-policy-text' => 'S potrditvijo $1', |
| 2804 | + 'moodbar-form-policy-label' => 'naša politika', |
| 2805 | + 'moodbar-loading-title' => 'Deljenje ...', |
| 2806 | + 'moodbar-success-title' => 'Hvala!', |
| 2807 | + 'moodbar-error-title' => 'Ups!', |
| 2808 | + 'moodbar-success-subtitle' => 'Deljenje vaše urejevalne izkušnje nam pomaga izboljšati $1.', |
| 2809 | + 'moodbar-error-subtitle' => 'Nekaj je šlo narobe! Prosimo, poskusite znova deliti svojo povratno informacijo pozneje.', |
| 2810 | + 'right-moodbar-view' => 'Ogled in izvoz povratnih informacij MoodBar', |
| 2811 | + 'right-moodbar-admin' => 'Spreminjanje vidnosti na pregledni plošči povratnih informacij', |
| 2812 | + 'moodbar-admin-title' => 'Povratne informacije MoodBar', |
| 2813 | + 'moodbar-admin-intro' => 'Ta stran vam omogoča ogled povratnih informacij, poslanih z MoodBar.', |
| 2814 | + 'moodbar-admin-empty' => 'Ni zadetkov', |
| 2815 | + 'moodbar-header-id' => 'ID povratne informacije', |
| 2816 | + 'moodbar-header-timestamp' => 'Časovni žig', |
| 2817 | + 'moodbar-header-type' => 'Vrsta', |
| 2818 | + 'moodbar-header-page' => 'Stran', |
| 2819 | + 'moodbar-header-usertype' => 'Vrsta uporabnika', |
| 2820 | + 'moodbar-header-user' => 'Uporabnik', |
| 2821 | + 'moodbar-header-editmode' => 'Način urejanja', |
| 2822 | + 'moodbar-header-bucket' => 'Preizkusno vedro', |
| 2823 | + 'moodbar-header-system' => 'Vrsta sistema', |
| 2824 | + 'moodbar-header-locale' => 'Jezik', |
| 2825 | + 'moodbar-header-useragent' => 'Uporabniški agent', |
| 2826 | + 'moodbar-header-comment' => 'Pripombe', |
| 2827 | + 'moodbar-header-user-editcount' => 'Števec urejanj uporabnika', |
| 2828 | + 'moodbar-header-namespace' => 'Imenski prostor', |
| 2829 | + 'moodbar-header-own-talk' => 'Lastna pogovorna stran', |
| 2830 | + 'moodbar-feedback-title' => 'Pregledna plošča povratnih informacij', |
| 2831 | + 'moodbar-feedback-response-title' => 'Odziv pregledne plošče povratnih informacij', |
| 2832 | + 'moodbar-feedback-view-link' => '(Ogled povratne informacije)', |
| 2833 | + 'moodbar-feedback-filters' => 'Filtri', |
| 2834 | + 'moodbar-feedback-filters-type' => 'Razpoloženje:', |
| 2835 | + 'moodbar-feedback-filters-type-happy' => 'Veselo', |
| 2836 | + 'moodbar-feedback-filters-type-confused' => 'Zmedeno', |
| 2837 | + 'moodbar-feedback-filters-type-sad' => 'Žalostno', |
| 2838 | + 'moodbar-feedback-filters-username' => 'Uporabniško ime', |
| 2839 | + 'moodbar-feedback-filters-button' => 'Nastavi filtre', |
| 2840 | + 'moodbar-feedback-whatis' => 'Kaj je ta funkcija?', |
| 2841 | + 'moodbar-feedback-permalink' => 'povezava do sem', |
| 2842 | + 'moodbar-feedback-noresults' => 'Vašemu filtru ne ustrezajo nobene pripombe.', |
| 2843 | + 'moodbar-feedback-more' => 'Več', |
| 2844 | + 'moodbar-feedback-nomore' => 'Ni več rezultatov za prikaz.', |
| 2845 | + 'moodbar-feedback-newer' => 'Novejše', |
| 2846 | + 'moodbar-feedback-older' => 'Starejše', |
| 2847 | + 'moodbar-feedback-ajaxerror' => 'Med pridobivanjem več rezultatov je prišlo do napake.', |
| 2848 | + 'moodbar-feedback-load-record-error' => 'Med nalaganjem zapisa je prišlo do napake.', |
| 2849 | + 'moodbar-user-hidden' => '(Uporabnik je skrit)', |
| 2850 | + 'moodbar-comment-hidden' => '(Povratno informacijo je skril ukrep administratorja)', |
| 2851 | + 'moodbar-feedback-show' => 'prikaži skrito povratno informacijo', |
| 2852 | + 'moodbar-feedback-hide' => 'skrij povratno informacijo', |
| 2853 | + 'moodbar-hidden-footer' => 'Skrita povratna informacija $1 dne $2 $3, razlog: $4 $5', |
| 2854 | + 'moodbar-hidden-footer-without-log' => 'Skrita povratna informacija $1', |
| 2855 | + 'moodbar-feedback-restore' => 'obnovi skrito povratno informacijo', |
| 2856 | + 'moodbar-action-item' => 'Predmet povratne informacije:', |
| 2857 | + 'moodbar-action-reason' => 'Razlog:', |
| 2858 | + 'moodbar-action-reason-required' => 'Prosimo, navedite razlog.', |
| 2859 | + 'moodbar-hide-header' => 'Skrij ta predmet iz pogleda', |
| 2860 | + 'moodbar-restore-header' => 'Obnovi vidljivost tega predmeta', |
| 2861 | + 'moodbar-invalid-item' => 'Sistem ni mogel najti ustreznega predmeta povratne informacije.', |
| 2862 | + 'moodbar-feedback-action-error' => 'Med poskusom izvedbe tega dejanja je prišlo do napake.', |
| 2863 | + 'moodbar-type-happy' => 'Veselega', |
| 2864 | + 'moodbar-type-sad' => 'Žalostnega', |
| 2865 | + 'moodbar-type-confused' => 'Zmedenega', |
| 2866 | + 'moodbar-user-anonymized' => 'Brezimen', |
| 2867 | + 'moodbar-user-ip' => 'IP-naslov', |
| 2868 | + 'moodbar-user-user' => 'Registriran uporabnik', |
| 2869 | + 'moodbar-log-name' => 'Dnevnik povratnih informacij', |
| 2870 | + 'moodbar-log-header' => 'To je dnevnik dejanj, izvedenih na predmetih povratnih informacij, navedenih na [[Special:FeedbackDashboard|pregledni plošči povratnih informacij]].', |
| 2871 | + 'moodbar-log-hide' => 'je skril(-a) [[$1]]', |
| 2872 | + 'moodbar-log-restore' => 'je obnovil(-a) vidljivost [[$1]]', |
| 2873 | +); |
| 2874 | + |
| 2875 | +/** Serbian (Cyrillic script) (Српски (ћирилица)) |
| 2876 | + * @author Rancher |
| 2877 | + */ |
| 2878 | +$messages['sr-ec'] = array( |
| 2879 | + 'moodbar-what-collapsed' => '▶', |
| 2880 | +); |
| 2881 | + |
| 2882 | +/** Swedish (Svenska) |
| 2883 | + * @author Ainali |
| 2884 | + * @author Diupwijk |
| 2885 | + * @author Lokal Profil |
| 2886 | + */ |
| 2887 | +$messages['sv'] = array( |
| 2888 | + 'moodbar-desc' => 'Tillåter enskilda användare att ge feedback på deras redigeringsupplevelse', |
| 2889 | + 'moodbar-trigger-feedback' => 'Feedback om redigering', |
| 2890 | + 'moodbar-trigger-share' => 'Dela din upplevelse', |
| 2891 | + 'moodbar-trigger-editing' => 'Redigerar $1...', |
| 2892 | + 'moodbar-close' => '(stäng)', |
| 2893 | + 'moodbar-intro-feedback' => 'Att redigera $1 gjorde mig...', |
| 2894 | + 'moodbar-intro-share' => 'Min upplevelse av $1 gjorde mig...', |
| 2895 | + 'moodbar-intro-editing' => 'Att redigera $1 gjorde mig...', |
| 2896 | + 'moodbar-type-happy-title' => 'Glad', |
| 2897 | + 'moodbar-type-sad-title' => 'Ledsen', |
| 2898 | + 'moodbar-type-confused-title' => 'Förvirrad', |
| 2899 | + 'tooltip-moodbar-what' => 'Läs mer om denna funktion', |
| 2900 | + 'moodbar-what-label' => 'Vad är det här?', |
| 2901 | + 'moodbar-what-content' => 'Denna funktion är utformad för att hjälpa gemenskapen att förstå upplevelserna hos de personer som redigerar projektet. |
| 2902 | +För mer information, besök $1 .', |
| 2903 | + 'moodbar-what-link' => 'funktionssidan', |
| 2904 | + 'moodbar-privacy' => 'Genom att skicka godkänner du transparens under dessa $1 .', |
| 2905 | + 'moodbar-privacy-link' => 'termer', |
| 2906 | + 'moodbar-disable-link' => 'Jag är inte intresserad. Inaktivera den här funktionen.', |
| 2907 | + 'moodbar-form-title' => 'Därför att...', |
| 2908 | + 'moodbar-form-note' => 'maximalt 140 tecken', |
| 2909 | + 'moodbar-form-note-dynamic' => '$1 tecken kvar', |
| 2910 | + 'moodbar-form-submit' => 'Dela Feedback', |
| 2911 | + 'moodbar-form-policy-text' => 'Genom att skicka in, $1', |
| 2912 | + 'moodbar-form-policy-label' => 'vår policy', |
| 2913 | + 'moodbar-loading-title' => 'Delar...', |
| 2914 | + 'moodbar-success-title' => 'Tack!', |
| 2915 | + 'moodbar-error-title' => 'Hoppsan!', |
| 2916 | + 'moodbar-success-subtitle' => 'Dela din redigeringsupplevelse så hjälper du oss att förbättra $1 .', |
| 2917 | + 'moodbar-error-subtitle' => 'Något gick fel! Prova att ge din feedback senare.', |
| 2918 | + 'right-moodbar-view' => 'Visa och exportera MoodBar feedback', |
| 2919 | + 'right-moodbar-admin' => 'Ändra synlighet på feedback instrumentpanelen', |
| 2920 | + 'moodbar-admin-title' => 'MoodBar feedback', |
| 2921 | + 'moodbar-admin-intro' => 'Den här sidan låter dig se feedback som har skickats in med MoodBar.', |
| 2922 | + 'moodbar-admin-empty' => 'Inga resultat', |
| 2923 | + 'moodbar-header-id' => 'Feedback-ID', |
| 2924 | + 'moodbar-header-timestamp' => 'Tidsstämpel', |
| 2925 | + 'moodbar-header-type' => 'Typ', |
| 2926 | + 'moodbar-header-page' => 'Sida', |
| 2927 | + 'moodbar-header-usertype' => 'Användartyp', |
| 2928 | + 'moodbar-header-user' => 'Användare', |
| 2929 | + 'moodbar-header-editmode' => 'Redigeringsläge', |
| 2930 | + 'moodbar-header-bucket' => 'Testhink', |
| 2931 | + 'moodbar-header-system' => 'Systemtyp', |
| 2932 | + 'moodbar-header-locale' => 'Plats', |
| 2933 | + 'moodbar-header-useragent' => 'Användaragent', |
| 2934 | + 'moodbar-header-comment' => 'Kommentarer', |
| 2935 | + 'moodbar-header-user-editcount' => 'Användarens antal redigeringar', |
| 2936 | + 'moodbar-header-namespace' => 'Namnrymd', |
| 2937 | + 'moodbar-header-own-talk' => 'Egen diskussionssida', |
| 2938 | + 'moodbar-feedback-title' => 'Feedback instrumentpanelen', |
| 2939 | + 'moodbar-feedback-filters' => 'Filter', |
| 2940 | + 'moodbar-feedback-filters-type' => 'Humör:', |
| 2941 | + 'moodbar-feedback-filters-type-happy' => 'Glad', |
| 2942 | + 'moodbar-feedback-filters-type-confused' => 'Förvirrad', |
| 2943 | + 'moodbar-feedback-filters-type-sad' => 'Ledsen', |
| 2944 | + 'moodbar-feedback-filters-username' => 'Användarnamn', |
| 2945 | + 'moodbar-feedback-filters-button' => 'Filtrera', |
| 2946 | + 'moodbar-feedback-whatis' => 'Vad är det här för funktion?', |
| 2947 | + 'moodbar-feedback-permalink' => 'Länka hit', |
| 2948 | + 'moodbar-feedback-noresults' => 'Det finns inga kommentarer som matchar ditt filter.', |
| 2949 | + 'moodbar-feedback-more' => 'Mer', |
| 2950 | + 'moodbar-feedback-nomore' => 'Det finns inga mer resultat att visa.', |
| 2951 | + 'moodbar-feedback-newer' => 'Nyare', |
| 2952 | + 'moodbar-feedback-older' => 'Äldre', |
| 2953 | + 'moodbar-feedback-ajaxerror' => 'Ett fel uppstod vid hämtandet av fler resultat.', |
| 2954 | + 'moodbar-user-hidden' => '(Användare dold)', |
| 2955 | + 'moodbar-comment-hidden' => '(Feedback dold genom administrativa åtgärder)', |
| 2956 | + 'moodbar-feedback-show' => 'Visa dold feedback', |
| 2957 | + 'moodbar-feedback-hide' => 'dölja feedback', |
| 2958 | + 'moodbar-hidden-footer' => 'Dold Feedback$1', |
| 2959 | + 'moodbar-feedback-restore' => 'återställa dold feedback', |
| 2960 | + 'moodbar-action-item' => 'Feedback objekt:', |
| 2961 | + 'moodbar-hide-header' => 'Dölj detta objekt från vyn', |
| 2962 | + 'moodbar-restore-header' => 'Återställa detta objekts synlighet', |
| 2963 | + 'moodbar-invalid-item' => 'Systemet kunde inte hitta korrekt feedbackobjekt.', |
| 2964 | + 'moodbar-feedback-action-error' => 'Ett fel inträffade när åtgärden utfördes.', |
| 2965 | + 'moodbar-type-happy' => 'Glad', |
| 2966 | + 'moodbar-type-sad' => 'Ledsen', |
| 2967 | + 'moodbar-type-confused' => 'Förvirrad', |
| 2968 | + 'moodbar-user-anonymized' => 'Anonymiserad', |
| 2969 | + 'moodbar-user-ip' => 'IP-adress', |
| 2970 | + 'moodbar-user-user' => 'Registrerad användare', |
| 2971 | + 'moodbar-log-name' => 'Feedback log', |
| 2972 | + 'moodbar-log-header' => 'Detta är loggen av åtgärder som vidtas på de feedback objekt som finns förtecknade på [[Special:FeedbackDashboard|feedback instrumentpanelen]].', |
| 2973 | + 'moodbar-log-hide' => 'dolde [[$1]]', |
| 2974 | + 'moodbar-log-restore' => 'återställde synlighet för [[$1]]', |
| 2975 | +); |
| 2976 | + |
| 2977 | +/** Telugu (తెలుగు) |
| 2978 | + * @author Veeven |
| 2979 | + */ |
| 2980 | +$messages['te'] = array( |
| 2981 | + 'moodbar-what-label' => 'ఇది ఏమిటి?', |
| 2982 | + 'moodbar-success-title' => 'కృతజ్ఞతలు!', |
| 2983 | + 'moodbar-header-type' => 'రకం', |
| 2984 | + 'moodbar-header-page' => 'పుట', |
| 2985 | + 'moodbar-header-usertype' => 'వాడుకరి రకం', |
| 2986 | + 'moodbar-header-user' => 'వాడుకరి', |
| 2987 | +); |
| 2988 | + |
| 2989 | +/** Ukrainian (Українська) |
| 2990 | + * @author Dim Grits |
| 2991 | + */ |
| 2992 | +$messages['uk'] = array( |
| 2993 | + 'moodbar-desc' => 'Дозволяє певним користувачам розміщувати відгуки про власний досвід редагування', |
| 2994 | + 'moodbar-trigger-feedback' => 'Відгук про редагування', |
| 2995 | + 'moodbar-trigger-share' => 'Поділіться власним досвідом', |
| 2996 | + 'moodbar-trigger-editing' => 'Редагування $1...', |
| 2997 | + 'moodbar-close' => '(закрити)', |
| 2998 | + 'moodbar-intro-feedback' => 'Редагування $1 зробило мене...', |
| 2999 | + 'moodbar-intro-share' => 'Мій досвід на $1 зробив мене...', |
| 3000 | + 'moodbar-intro-editing' => 'Редагування $1 зробило мене...', |
| 3001 | + 'moodbar-type-happy-title' => 'Щасливий', |
| 3002 | + 'moodbar-type-sad-title' => 'Сумний', |
| 3003 | + 'moodbar-type-confused-title' => 'Сконфужений', |
| 3004 | + 'tooltip-moodbar-what' => 'Дізнайтеся більше про цю функцію', |
| 3005 | + 'moodbar-what-label' => 'Що це?', |
| 3006 | + 'moodbar-what-content' => 'Ця функція призначена задля усвідомлення співтовариством досвіду людей, що редагують на сайті. |
| 3007 | +Для отримання додаткової інформації, будь ласка, відвідайте $1.', |
| 3008 | + 'moodbar-what-link' => 'наступну сторінку', |
| 3009 | + 'moodbar-privacy' => 'Відправляючи, ви погоджуєтесь з публічністю даних на $1.', |
| 3010 | + 'moodbar-privacy-link' => 'умовах', |
| 3011 | + 'moodbar-disable-link' => 'Я не зацікавлений. Будь ласка, вимкніть цю функцію.', |
| 3012 | + 'moodbar-form-title' => 'Тому що...', |
| 3013 | + 'moodbar-form-note' => 'не більше 140 символів.', |
| 3014 | + 'moodbar-form-note-dynamic' => '$1 символів залишилося', |
| 3015 | + 'moodbar-form-submit' => 'Поділитись власними думками', |
| 3016 | + 'moodbar-form-policy-text' => 'Надсилаючи, $1', |
| 3017 | + 'moodbar-form-policy-label' => 'Наші правила', |
| 3018 | + 'moodbar-loading-title' => 'Спільне використання...', |
| 3019 | + 'moodbar-success-title' => 'Дякуємо!', |
| 3020 | + 'moodbar-error-title' => 'Йой!', |
| 3021 | + 'moodbar-success-subtitle' => 'Ваш досвід допоможе нам покращити $1.', |
| 3022 | + 'moodbar-error-subtitle' => 'Щось пішло не так! Будь ласка, спробуйте відправити відгук пізніше.', |
| 3023 | + 'right-moodbar-view' => 'Перегляд і експорт відгуків MoodBar', |
| 3024 | + 'moodbar-admin-title' => 'Відгуки MoodBar', |
| 3025 | + 'moodbar-admin-intro' => 'Ця сторінка дозволяє переглянути відгуки, надіслані за допомогою MoodBar.', |
| 3026 | + 'moodbar-admin-empty' => 'Результатів не знайдено', |
| 3027 | + 'moodbar-header-id' => "Ідентифікатор зворотнього зв'язку", |
| 3028 | + 'moodbar-header-timestamp' => 'Дата / час', |
| 3029 | + 'moodbar-header-type' => 'Тип', |
| 3030 | + 'moodbar-header-page' => 'Сторінка', |
| 3031 | + 'moodbar-header-usertype' => 'Тип користувача', |
| 3032 | + 'moodbar-header-user' => 'Користувач', |
| 3033 | + 'moodbar-header-editmode' => 'Режим редагування', |
| 3034 | + 'moodbar-header-bucket' => 'Область перевірки', |
| 3035 | + 'moodbar-header-system' => 'Тип системи', |
| 3036 | + 'moodbar-header-locale' => 'Локальні', |
| 3037 | + 'moodbar-header-useragent' => 'Клієнтська програма', |
| 3038 | + 'moodbar-header-comment' => 'Коментарі', |
| 3039 | + 'moodbar-header-user-editcount' => 'Кількість правок користувача', |
| 3040 | + 'moodbar-header-namespace' => 'Простір імен', |
| 3041 | + 'moodbar-header-own-talk' => 'Власна сторінка обговорення', |
| 3042 | + 'moodbar-type-happy' => 'Щасливий', |
| 3043 | + 'moodbar-type-sad' => 'Сумний', |
| 3044 | + 'moodbar-type-confused' => 'Сконфужений', |
| 3045 | + 'moodbar-user-anonymized' => 'Анонім', |
| 3046 | + 'moodbar-user-ip' => 'IP-адреса', |
| 3047 | + 'moodbar-user-user' => 'Зареєстрований користувач', |
| 3048 | +); |
| 3049 | + |
| 3050 | +/** Vietnamese (Tiếng Việt) |
| 3051 | + * @author Minh Nguyen |
| 3052 | + * @author Trần Nguyễn Minh Huy |
| 3053 | + */ |
| 3054 | +$messages['vi'] = array( |
| 3055 | + 'moodbar-desc' => 'Cho phép những người dùng được chỉ định gửi thông tin phản hồi về quá trình sửa đổi', |
| 3056 | + 'moodbar-trigger-feedback' => 'Phản hồi về sửa đổi', |
| 3057 | + 'moodbar-trigger-share' => 'Chia sẻ ấn tượng của bạn', |
| 3058 | + 'moodbar-trigger-editing' => 'Việc sửa đổi $1…', |
| 3059 | + 'moodbar-close' => '(đóng)', |
| 3060 | + 'moodbar-intro-feedback' => 'Việc sửa đổi $1 làm cho tôi có vẻ…', |
| 3061 | + 'moodbar-intro-share' => 'Việc sử dụng $1 làm cho tôi có vẻ…', |
| 3062 | + 'moodbar-intro-editing' => 'Việc sửa đổi $1 làm cho tôi có vẻ…', |
| 3063 | + 'moodbar-type-happy-title' => 'Hài lòng', |
| 3064 | + 'moodbar-type-sad-title' => 'Bực mình', |
| 3065 | + 'moodbar-type-confused-title' => 'Bối rối', |
| 3066 | + 'tooltip-moodbar-what' => 'Tìm hiểu thêm về tính năng này', |
| 3067 | + 'moodbar-what-label' => 'Đây là gì?', |
| 3068 | + 'moodbar-what-content' => 'Tính năng này nhằm mục đích giúp cộng đồng hiểu biết những ấn tượng của người sửa đổi trang này. |
| 3069 | +Để biết thêm chi tiết, xin ghé vào $1.', |
| 3070 | + 'moodbar-what-link' => 'trang tính năng', |
| 3071 | + 'moodbar-privacy' => 'Bằng cách gửi thông tin, bạn đồng ý phát hành thông tin này công khai theo các $1 này.', |
| 3072 | + 'moodbar-privacy-link' => 'điều khoản', |
| 3073 | + 'moodbar-disable-link' => 'Thôi, xin tắt tính năng này.', |
| 3074 | + 'moodbar-form-title' => 'Bởi vì…', |
| 3075 | + 'moodbar-form-note' => 'tối đa 150 ký tự nữa', |
| 3076 | + 'moodbar-form-note-dynamic' => 'còn $1 ký tự', |
| 3077 | + 'moodbar-form-submit' => 'Chia sẻ phản hồi', |
| 3078 | + 'moodbar-form-policy-text' => 'Bằng cách gửi thông tin, $1', |
| 3079 | + 'moodbar-form-policy-label' => 'chính sách của chúng ta', |
| 3080 | + 'moodbar-loading-title' => 'Đang chia sẻ…', |
| 3081 | + 'moodbar-success-title' => 'Cám ơn!', |
| 3082 | + 'moodbar-error-title' => 'Oái!', |
| 3083 | + 'moodbar-success-subtitle' => 'Việc chia sẻ những ấn tượng về quá trình sửa đổi giúp chúng tôi cải thiện $1.', |
| 3084 | + 'moodbar-error-subtitle' => 'Oái, đã bị trục trặc! Xin vui lòng chia sẻ phản hồi của bạn lát nữa.', |
| 3085 | + 'right-moodbar-view' => 'Xem và xuất phản hồi MoodBar', |
| 3086 | + 'right-moodbar-admin' => 'Thay đổi mức hiển thị dùng bảng điều khiển phản hồi', |
| 3087 | + 'moodbar-admin-title' => 'Phản hồi về MoodBar', |
| 3088 | + 'moodbar-admin-intro' => 'Trang này cho phép đọc các phản hồi được gửi dùng MoodBar.', |
| 3089 | + 'moodbar-admin-empty' => 'Không có kết quả', |
| 3090 | + 'moodbar-header-id' => 'ID của bài phản hồi', |
| 3091 | + 'moodbar-header-timestamp' => 'Thời gian', |
| 3092 | + 'moodbar-header-type' => 'Kiểu', |
| 3093 | + 'moodbar-header-page' => 'Trang', |
| 3094 | + 'moodbar-header-usertype' => 'Kiểu người dùng', |
| 3095 | + 'moodbar-header-user' => 'Người dùng', |
| 3096 | + 'moodbar-header-editmode' => 'Chế độ sửa đổi', |
| 3097 | + 'moodbar-header-bucket' => 'Phiên bản thử nghiệm', |
| 3098 | + 'moodbar-header-system' => 'Loại hệ thống', |
| 3099 | + 'moodbar-header-locale' => 'Địa phương', |
| 3100 | + 'moodbar-header-useragent' => 'Trình duyệt', |
| 3101 | + 'moodbar-header-comment' => 'Bình luận', |
| 3102 | + 'moodbar-header-user-editcount' => 'Số lần sửa đổi của người dùng', |
| 3103 | + 'moodbar-header-namespace' => 'Không gian tên', |
| 3104 | + 'moodbar-header-own-talk' => 'Trang thảo luận của chính mình', |
| 3105 | + 'moodbar-feedback-title' => 'Bảng điều khiển phản hồi', |
| 3106 | + 'moodbar-feedback-filters' => 'Bộ lọc', |
| 3107 | + 'moodbar-feedback-filters-type' => 'Tâm trạng:', |
| 3108 | + 'moodbar-feedback-filters-type-happy' => 'Hài lòng', |
| 3109 | + 'moodbar-feedback-filters-type-confused' => 'Bối rối', |
| 3110 | + 'moodbar-feedback-filters-type-sad' => 'Bực mình', |
| 3111 | + 'moodbar-feedback-filters-username' => 'Tên người dùng', |
| 3112 | + 'moodbar-feedback-filters-button' => 'Áp dụng bộ lọc', |
| 3113 | + 'moodbar-feedback-whatis' => 'Tính năng này làm gì?', |
| 3114 | + 'moodbar-feedback-permalink' => 'liên kết đến đây', |
| 3115 | + 'moodbar-feedback-noresults' => 'Không có bình luận nào khớp với các bộ lọc của bạn.', |
| 3116 | + 'moodbar-feedback-more' => 'Thêm', |
| 3117 | + 'moodbar-feedback-nomore' => 'Không có thêm kết quả để hiển thị.', |
| 3118 | + 'moodbar-feedback-newer' => 'Mới hơn', |
| 3119 | + 'moodbar-feedback-older' => 'Cũ hơn', |
| 3120 | + 'moodbar-feedback-ajaxerror' => 'Lỗi đã xảy ra khi lấy thêm kết quả.', |
| 3121 | + 'moodbar-user-hidden' => '(Người dùng được ẩn)', |
| 3122 | + 'moodbar-comment-hidden' => '(Phản hồi được bảo quản viên ẩn)', |
| 3123 | + 'moodbar-feedback-show' => 'hiện phản hồi đã ẩn', |
| 3124 | + 'moodbar-feedback-hide' => 'ẩn phản hồi', |
| 3125 | + 'moodbar-hidden-footer' => 'Phản hồi ẩn của $1 vào $2 lúc $3 với lý do: $4 $5', |
| 3126 | + 'moodbar-hidden-footer-without-log' => 'Phản hồi ẩn $1', |
| 3127 | + 'moodbar-feedback-restore' => 'phục hồi phản hồi đã ẩn', |
| 3128 | + 'moodbar-action-item' => 'Khoản mục phản hồi:', |
| 3129 | + 'moodbar-action-reason' => 'Lý do:', |
| 3130 | + 'moodbar-action-reason-required' => 'Xin vui lòng đưa một lý do.', |
| 3131 | + 'moodbar-hide-header' => 'Ẩn khoản mục này khỏi danh sách', |
| 3132 | + 'moodbar-restore-header' => 'Phục hồi mức hiển thị của khoản mục này', |
| 3133 | + 'moodbar-invalid-item' => 'Không tìm thấy khoản mục phản hồi đúng.', |
| 3134 | + 'moodbar-feedback-action-error' => 'Có lỗi khi thực hiện tác vụ này.', |
| 3135 | + 'moodbar-type-happy' => 'Hài lòng', |
| 3136 | + 'moodbar-type-sad' => 'Bực mình', |
| 3137 | + 'moodbar-type-confused' => 'Bối rối', |
| 3138 | + 'moodbar-user-anonymized' => 'Ẩn danh', |
| 3139 | + 'moodbar-user-ip' => 'Địa chỉ IP', |
| 3140 | + 'moodbar-user-user' => 'Người dùng đăng ký', |
| 3141 | + 'moodbar-log-name' => 'Nhật trình phản hồi', |
| 3142 | + 'moodbar-log-header' => 'Nhật trình này liệt kê các tác vụ được thực hiện do các khoản mục phản hồi trên [[Special:FeedbackDashboard|bảng điều khiển phản hồi]].', |
| 3143 | + 'moodbar-log-hide' => 'đã ẩn [[$1]]', |
| 3144 | + 'moodbar-log-restore' => 'đã phục hồi mức hiển thị của [[$1]]', |
| 3145 | +); |
| 3146 | + |
| 3147 | +/** Yiddish (ייִדיש) |
| 3148 | + * @author פוילישער |
| 3149 | + */ |
| 3150 | +$messages['yi'] = array( |
| 3151 | + 'moodbar-type-happy-title' => 'צופֿרידן', |
| 3152 | + 'moodbar-type-sad-title' => 'אומערט', |
| 3153 | + 'moodbar-type-confused-title' => 'צעמישט', |
| 3154 | +); |
| 3155 | + |
| 3156 | +/** Simplified Chinese (中文(简体)) |
| 3157 | + * @author Bencmq |
| 3158 | + * @author PhiLiP |
| 3159 | + */ |
| 3160 | +$messages['zh-hans'] = array( |
| 3161 | + 'moodbar-desc' => '允许指定的用户提供他们的编辑体验反馈', |
| 3162 | + 'moodbar-trigger-feedback' => '有关编辑的反馈', |
| 3163 | + 'moodbar-trigger-share' => '分享你的经验', |
| 3164 | + 'moodbar-trigger-editing' => '编辑$1……', |
| 3165 | + 'moodbar-close' => '(关闭)', |
| 3166 | + 'moodbar-intro-feedback' => '编辑$1让我……', |
| 3167 | + 'moodbar-intro-share' => '我在$1上的经历让我……', |
| 3168 | + 'moodbar-intro-editing' => '编辑$1让我……', |
| 3169 | + 'moodbar-type-happy-title' => '开心', |
| 3170 | + 'moodbar-type-sad-title' => '不快', |
| 3171 | + 'moodbar-type-confused-title' => '困惑', |
| 3172 | + 'tooltip-moodbar-what' => '了解有关此功能的详细信息', |
| 3173 | + 'moodbar-what-label' => '这是什么?', |
| 3174 | + 'moodbar-what-content' => '此功能可以帮助社区了解人们在编辑此网站时的体验。详细信息请访问$1。', |
| 3175 | + 'moodbar-what-link' => '功能页面', |
| 3176 | + 'moodbar-privacy' => '提交后,您将同意在$1下的透明度。', |
| 3177 | + 'moodbar-privacy-link' => '条款', |
| 3178 | + 'moodbar-disable-link' => '我不感兴趣,请禁用此功能。', |
| 3179 | + 'moodbar-form-title' => '因为……', |
| 3180 | + 'moodbar-form-note' => '最多140字', |
| 3181 | + 'moodbar-form-note-dynamic' => '剩余$1字', |
| 3182 | + 'moodbar-form-submit' => '分享反馈', |
| 3183 | + 'moodbar-form-policy-text' => '提交后,$1', |
| 3184 | + 'moodbar-form-policy-label' => '我们的政策', |
| 3185 | + 'moodbar-loading-title' => '分享中……', |
| 3186 | + 'moodbar-success-title' => '感谢!', |
| 3187 | + 'moodbar-error-title' => '糟糕!', |
| 3188 | + 'moodbar-success-subtitle' => '分享您的编辑体验,帮助我们改善$1。', |
| 3189 | + 'moodbar-error-subtitle' => '出错啦!请重试分享您的反馈意见。', |
| 3190 | + 'right-moodbar-view' => '查看和导出MoodBar反馈', |
| 3191 | + 'moodbar-admin-title' => 'MoodBar反馈', |
| 3192 | + 'moodbar-admin-intro' => '此页面允许你查看通过MoodBar提交的反馈。', |
| 3193 | + 'moodbar-admin-empty' => '没有结果', |
| 3194 | + 'moodbar-header-id' => '反馈ID', |
| 3195 | + 'moodbar-header-timestamp' => '时间戳', |
| 3196 | + 'moodbar-header-type' => '类型', |
| 3197 | + 'moodbar-header-page' => '页面', |
| 3198 | + 'moodbar-header-usertype' => '用户类型', |
| 3199 | + 'moodbar-header-user' => '用户', |
| 3200 | + 'moodbar-header-editmode' => '编辑模式', |
| 3201 | + 'moodbar-header-bucket' => '分桶测试', |
| 3202 | + 'moodbar-header-system' => '系统类型', |
| 3203 | + 'moodbar-header-locale' => '地区', |
| 3204 | + 'moodbar-header-useragent' => '用户客户端', |
| 3205 | + 'moodbar-header-comment' => '评论', |
| 3206 | + 'moodbar-header-user-editcount' => '用户编辑次数', |
| 3207 | + 'moodbar-header-namespace' => '名字空间', |
| 3208 | + 'moodbar-header-own-talk' => '自己的讨论页', |
| 3209 | + 'moodbar-feedback-title' => '反馈面板', |
| 3210 | + 'moodbar-feedback-filters' => '过滤器', |
| 3211 | + 'moodbar-feedback-filters-type' => '类型:', |
| 3212 | + 'moodbar-feedback-filters-type-happy' => '表扬', |
| 3213 | + 'moodbar-feedback-filters-type-confused' => '困惑', |
| 3214 | + 'moodbar-feedback-filters-type-sad' => '问题', |
| 3215 | + 'moodbar-feedback-filters-username' => '用户名', |
| 3216 | + 'moodbar-feedback-filters-button' => '设置过滤器', |
| 3217 | + 'moodbar-feedback-whatis' => '这是什么功能?', |
| 3218 | + 'moodbar-feedback-permalink' => '本页链接', |
| 3219 | + 'moodbar-feedback-noresults' => '没有符合您过滤器设置的评论。', |
| 3220 | + 'moodbar-feedback-more' => '更多', |
| 3221 | + 'moodbar-feedback-nomore' => '没有更多的结果。', |
| 3222 | + 'moodbar-feedback-newer' => '较新的', |
| 3223 | + 'moodbar-feedback-older' => '更早的', |
| 3224 | + 'moodbar-feedback-ajaxerror' => '获取更多的结果时出错。', |
| 3225 | + 'moodbar-type-happy' => '开心', |
| 3226 | + 'moodbar-type-sad' => '不快', |
| 3227 | + 'moodbar-type-confused' => '困惑', |
| 3228 | + 'moodbar-user-anonymized' => '匿名', |
| 3229 | + 'moodbar-user-ip' => 'IP地址', |
| 3230 | + 'moodbar-user-user' => '注册用户', |
| 3231 | +); |
| 3232 | + |
| 3233 | +/** Traditional Chinese (中文(繁體)) |
| 3234 | + * @author Anakmalaysia |
| 3235 | + */ |
| 3236 | +$messages['zh-hant'] = array( |
| 3237 | + 'moodbar-desc' => '允許指定的用戶提供編輯體驗反饋', |
| 3238 | + 'moodbar-trigger-feedback' => '有關編輯的反饋', |
| 3239 | + 'moodbar-trigger-share' => '分享你的經驗', |
| 3240 | + 'moodbar-trigger-editing' => '編輯 $1……', |
| 3241 | + 'moodbar-close' => '(關閉)', |
| 3242 | + 'moodbar-intro-feedback' => '編輯$1使我……', |
| 3243 | + 'moodbar-intro-share' => '我在$1上的經歷使我……', |
| 3244 | + 'moodbar-intro-editing' => '編輯$1使我……', |
| 3245 | + 'moodbar-type-happy-title' => '開心', |
| 3246 | + 'moodbar-type-sad-title' => '不快', |
| 3247 | + 'moodbar-type-confused-title' => '困惑', |
| 3248 | + 'tooltip-moodbar-what' => '了解有關此功能的詳細信息', |
| 3249 | + 'moodbar-what-label' => '這是什麼?', |
| 3250 | + 'moodbar-what-content' => '此功能可以幫助社區了解人們在編輯此網站時的體驗。詳細信息請訪問$1。', |
| 3251 | + 'moodbar-what-link' => '功能頁面', |
| 3252 | + 'moodbar-privacy' => '提交後,您將同意在$1下的透明度。', |
| 3253 | + 'moodbar-privacy-link' => '條款', |
| 3254 | + 'moodbar-disable-link' => '我不感興趣,請禁用此功能。', |
| 3255 | + 'moodbar-form-title' => '因為……', |
| 3256 | + 'moodbar-form-note' => '最多140字', |
| 3257 | + 'moodbar-form-note-dynamic' => '剩餘$1字', |
| 3258 | + 'moodbar-form-submit' => '分享反饋', |
| 3259 | + 'moodbar-form-policy-text' => '提交後,$1', |
| 3260 | + 'moodbar-form-policy-label' => '我們的政策', |
| 3261 | + 'moodbar-loading-title' => '分享中……', |
| 3262 | + 'moodbar-success-title' => '謝謝!', |
| 3263 | + 'moodbar-error-title' => '糟糕!', |
| 3264 | + 'moodbar-success-subtitle' => '分享您的編輯體驗,幫助我們改善$1。', |
| 3265 | + 'moodbar-error-subtitle' => '出錯了!請重試分享您的反饋意見。', |
| 3266 | + 'right-moodbar-view' => '查看和導出MoodBar反饋', |
| 3267 | + 'moodbar-admin-title' => 'MoodBar反饋', |
| 3268 | + 'moodbar-admin-intro' => '此頁面允許你查看通過MoodBar提交的反饋。', |
| 3269 | + 'moodbar-admin-empty' => '沒有結果', |
| 3270 | + 'moodbar-header-id' => '反饋ID', |
| 3271 | + 'moodbar-header-timestamp' => '時間戳', |
| 3272 | + 'moodbar-header-type' => '類型', |
| 3273 | + 'moodbar-header-page' => '頁面', |
| 3274 | + 'moodbar-header-usertype' => '用戶類型', |
| 3275 | + 'moodbar-header-user' => '用戶', |
| 3276 | + 'moodbar-header-editmode' => '編輯模式', |
| 3277 | + 'moodbar-header-bucket' => '分桶測試', |
| 3278 | + 'moodbar-header-system' => '系統類型', |
| 3279 | + 'moodbar-header-locale' => '地區', |
| 3280 | + 'moodbar-header-useragent' => '用戶客戶端', |
| 3281 | + 'moodbar-header-comment' => '評論', |
| 3282 | + 'moodbar-header-user-editcount' => '用戶編輯次數', |
| 3283 | + 'moodbar-header-namespace' => '名字空間', |
| 3284 | + 'moodbar-header-own-talk' => '自己的討論頁', |
| 3285 | + 'moodbar-type-happy' => '開心', |
| 3286 | + 'moodbar-type-sad' => '不快', |
| 3287 | + 'moodbar-type-confused' => '困惑', |
| 3288 | + 'moodbar-user-anonymized' => '匿名', |
| 3289 | + 'moodbar-user-ip' => 'IP位址', |
| 3290 | + 'moodbar-user-user' => '註冊用戶', |
| 3291 | +); |
| 3292 | + |
Property changes on: branches/wmf/1.18wmf1/extensions/MoodBar/MoodBar.i18n.php |
___________________________________________________________________ |
Added: svn:eol-style |
1 | 3293 | + native |
Index: branches/wmf/1.18wmf1/extensions/MoodBar/FeedbackItem.php |
— | — | @@ -0,0 +1,279 @@ |
| 2 | +<?php |
| 3 | + |
| 4 | +/** |
| 5 | + * This class represents a single piece of MoodBar feedback. |
| 6 | + */ |
| 7 | +class MBFeedbackItem { |
| 8 | + /** Container for the data **/ |
| 9 | + protected $data; |
| 10 | + /** Valid data keys **/ |
| 11 | + protected $validMembers = array( |
| 12 | + // Feedback essentials |
| 13 | + 'id', // ID in the database |
| 14 | + 'comment', // The feedback itself |
| 15 | + 'page', // The page where it was submitted |
| 16 | + 'type', |
| 17 | + |
| 18 | + // Housekeeping |
| 19 | + 'timestamp', |
| 20 | + 'user', // User object who submitted the feedback |
| 21 | + 'anonymize', |
| 22 | + 'hidden-state', |
| 23 | + |
| 24 | + // Statistics |
| 25 | + 'useragent', |
| 26 | + 'system', |
| 27 | + 'locale', |
| 28 | + 'editmode', |
| 29 | + 'bucket', |
| 30 | + 'user-editcount', |
| 31 | + ); |
| 32 | + |
| 33 | + /** Valid values for the 'type' parameter. **/ |
| 34 | + protected static $validTypes = array( 'happy', 'sad', 'confused' ); |
| 35 | + |
| 36 | + /** |
| 37 | + * Default constructor. |
| 38 | + * Don't use this, use either MBFeedbackItem::newFromRow or MBFeedbackItem::create |
| 39 | + */ |
| 40 | + protected function __construct() { |
| 41 | + $this->data = array_fill_keys( $this->validMembers, null ); |
| 42 | + |
| 43 | + // Non-nullable boolean fields |
| 44 | + $this->setProperty('anonymize', false); |
| 45 | + $this->setProperty('editmode', false); |
| 46 | + $this->setProperty('hidden-state', 0 ); |
| 47 | + } |
| 48 | + |
| 49 | + /** |
| 50 | + * Factory function to create a new MBFeedbackItem |
| 51 | + * @param $info Associative array of values |
| 52 | + * Valid keys: type, user, comment, page, flags, timestamp, |
| 53 | + * useragent, system, locale, bucket, anonymize, hidden-state |
| 54 | + * @return MBFeedbackItem object. |
| 55 | + */ |
| 56 | + public static function create( $info ) { |
| 57 | + $newObject = new self(); |
| 58 | + $newObject->initialiseNew( $info ); |
| 59 | + return $newObject; |
| 60 | + } |
| 61 | + |
| 62 | + /** |
| 63 | + * Initialiser for new MBFeedbackItems |
| 64 | + * @param $info Associative array of values |
| 65 | + * @see MBFeedbackItem::create |
| 66 | + */ |
| 67 | + protected function initialiseNew( $info ) { |
| 68 | + global $wgUser; |
| 69 | + |
| 70 | + $template = array( |
| 71 | + 'user' => $wgUser, |
| 72 | + 'timestamp' => wfTimestampNow(), |
| 73 | + ); |
| 74 | + |
| 75 | + $this->setProperties( $template ); |
| 76 | + $this->setProperties( $info ); |
| 77 | + } |
| 78 | + |
| 79 | + /** |
| 80 | + * Factory function to load an MBFeedbackItem from a DB row. |
| 81 | + * @param $row A row, from DatabaseBase::fetchObject |
| 82 | + * @return MBFeedback object. |
| 83 | + */ |
| 84 | + public static function load( $row ) { |
| 85 | + $newObject = new self(); |
| 86 | + $newObject->initialiseFromRow( $row ); |
| 87 | + return $newObject; |
| 88 | + } |
| 89 | + |
| 90 | + /** |
| 91 | + * Initialiser for MBFeedbackItems loaded from the database |
| 92 | + * @param $row A row object from DatabaseBase::fetchObject |
| 93 | + * @see MBFeedbackItem::load |
| 94 | + */ |
| 95 | + protected function initialiseFromRow( $row ) { |
| 96 | + static $propMappings = array( |
| 97 | + 'id' => 'mbf_id', |
| 98 | + 'type' => 'mbf_type', |
| 99 | + 'comment' => 'mbf_comment', |
| 100 | + 'timestamp' => 'mbf_timestamp', |
| 101 | + 'anonymize' => 'mbf_anonymous', |
| 102 | + 'useragent' => 'mbf_user_agent', |
| 103 | + 'system' => 'mbf_system_type', |
| 104 | + 'locale' => 'mbf_locale', |
| 105 | + 'bucket' => 'mbf_bucket', |
| 106 | + 'editmode' => 'mbf_editing', |
| 107 | + 'user-editcount' => 'mbf_user_editcount', |
| 108 | + 'hidden-state' => 'mbf_hidden_state', |
| 109 | + ); |
| 110 | + |
| 111 | + $properties = array(); |
| 112 | + |
| 113 | + foreach( $propMappings as $property => $field ) { |
| 114 | + if ( isset( $row->$field ) ) { |
| 115 | + $properties[$property] = $row->$field; |
| 116 | + } |
| 117 | + } |
| 118 | + |
| 119 | + if ( isset( $row->mbf_namespace ) && isset( $row->mbf_title ) ) { |
| 120 | + $properties['page'] = Title::makeTitleSafe( $row->mbf_namespace, $row->mbf_title ); |
| 121 | + } |
| 122 | + |
| 123 | + if ( !empty($row->user_id) ) { |
| 124 | + $properties['user'] = User::newFromRow( $row ); |
| 125 | + } elseif ( $row->mbf_user_id > 0 ) { |
| 126 | + $properties['user'] = User::newFromId( $row->mbf_user_id ); |
| 127 | + } elseif ( $row->mbf_user_ip ) { |
| 128 | + $properties['user'] = User::newFromName( $row->mbf_user_ip ); |
| 129 | + } |
| 130 | + |
| 131 | + $this->setProperties( $properties , true ); |
| 132 | + } |
| 133 | + |
| 134 | + /** |
| 135 | + * Set a group of properties. Throws an exception on invalid property. |
| 136 | + * @param $values An associative array of properties to set. |
| 137 | + * @param $initialise_from_row bool if record is loaded from DB row |
| 138 | + */ |
| 139 | + public function setProperties( $values , $initialise_from_row = false) { |
| 140 | + foreach( $values as $key => $value ) { |
| 141 | + if ( ! $this->isValidKey($key) ) { |
| 142 | + throw new MWException( "Attempt to set invalid property $key" ); |
| 143 | + } |
| 144 | + |
| 145 | + if ( ! $this->validatePropertyValue($key, $value, $initialise_from_row) ) { |
| 146 | + throw new MWException( "Attempt to set invalid value for $key" ); |
| 147 | + } |
| 148 | + |
| 149 | + $this->data[$key] = $value; |
| 150 | + } |
| 151 | + } |
| 152 | + |
| 153 | + /** |
| 154 | + * Set a group of values. |
| 155 | + * @param $key The property to set. |
| 156 | + * @param $value The value to give it. |
| 157 | + */ |
| 158 | + public function setProperty( $key, $value ) { |
| 159 | + $this->setProperties( array( $key => $value ) ); |
| 160 | + } |
| 161 | + |
| 162 | + /** |
| 163 | + * Get a property. |
| 164 | + * @param $key The property to get |
| 165 | + * @return The property value. |
| 166 | + */ |
| 167 | + public function getProperty( $key ) { |
| 168 | + if ( ! $this->isValidKey($key) ) { |
| 169 | + throw new MWException( "Attempt to get invalid property $key" ); |
| 170 | + } |
| 171 | + |
| 172 | + return $this->data[$key]; |
| 173 | + } |
| 174 | + |
| 175 | + /** |
| 176 | + * Check a property key for validity. |
| 177 | + * If a property key is valid, it will be prefilled to NULL. |
| 178 | + * @param $key The property key to check. |
| 179 | + */ |
| 180 | + public function isValidKey( $key ) { |
| 181 | + return in_array( $key, $this->validMembers ); |
| 182 | + } |
| 183 | + |
| 184 | + /** |
| 185 | + * Check if a property value is valid for that property |
| 186 | + * @param $key The key of the property to check. |
| 187 | + * @param $value The value to check |
| 188 | + * @param $initialise_from_row bool if record is loaded from DB row |
| 189 | + * @return Boolean |
| 190 | + */ |
| 191 | + public function validatePropertyValue( $key, $value , $initialise_from_row = false ) { |
| 192 | + if ( $key == 'user' ) { |
| 193 | + return $value instanceof User; |
| 194 | + } elseif ( $key == 'page' ) { |
| 195 | + return $value instanceof Title; |
| 196 | + } elseif ( $key == 'type' ) { |
| 197 | + return in_array( $value, self::$validTypes ); |
| 198 | + } elseif ( $key == 'comment' ) { |
| 199 | + $comment_len = mb_strlen( $value ); |
| 200 | + //existing empty comment from database should be considered as valid |
| 201 | + if($initialise_from_row) { |
| 202 | + return $comment_len <= 140; |
| 203 | + } |
| 204 | + else { |
| 205 | + return $comment_len > 0 && $comment_len <= 140; |
| 206 | + } |
| 207 | + } |
| 208 | + |
| 209 | + return true; |
| 210 | + } |
| 211 | + |
| 212 | + /** |
| 213 | + * Writes this MBFeedbackItem to the database. |
| 214 | + * Throws an exception if this it is already in the database. |
| 215 | + * @return The MBFeedbackItem's new ID. |
| 216 | + */ |
| 217 | + public function save() { |
| 218 | + // Add edit count if necessary |
| 219 | + if ( $this->getProperty('user-editcount') === null && |
| 220 | + $this->getProperty('user') ) |
| 221 | + { |
| 222 | + $value = $this->getProperty('user'); |
| 223 | + |
| 224 | + if ( $value->isAnon() ) { |
| 225 | + $this->setProperty( 'user-editcount', 0 ); |
| 226 | + } else { |
| 227 | + $this->setProperty( 'user-editcount', $value->getEditCount() ); |
| 228 | + } |
| 229 | + } |
| 230 | + |
| 231 | + $dbw = wfGetDB( DB_MASTER ); |
| 232 | + |
| 233 | + $row = array( |
| 234 | + 'mbf_type' => $this->getProperty('type'), |
| 235 | + 'mbf_comment' => $this->getProperty('comment'), |
| 236 | + 'mbf_timestamp' => $dbw->timestamp($this->getProperty('timestamp')), |
| 237 | + 'mbf_anonymous' => $this->getProperty('anonymize'), |
| 238 | + 'mbf_user_agent' => $this->getProperty('useragent'), |
| 239 | + 'mbf_system_type' => $this->getProperty('system'), |
| 240 | + 'mbf_locale' => $this->getProperty('locale'), |
| 241 | + 'mbf_bucket' => $this->getProperty('bucket'), |
| 242 | + 'mbf_editing' => $this->getProperty('editmode'), |
| 243 | + 'mbf_user_editcount' => $this->getProperty('user-editcount'), |
| 244 | + 'mbf_hidden_state' => $this->getProperty('hidden-state'), |
| 245 | + ); |
| 246 | + |
| 247 | + $user = $this->getProperty('user'); |
| 248 | + if ( $user->isAnon() ) { |
| 249 | + $row['mbf_user_id'] = 0; |
| 250 | + $row['mbf_user_ip'] = $user->getName(); |
| 251 | + } else { |
| 252 | + $row['mbf_user_id'] = $user->getId(); |
| 253 | + } |
| 254 | + |
| 255 | + $page = $this->getProperty('page'); |
| 256 | + if ( $page ) { |
| 257 | + $row['mbf_namespace'] = $page->getNamespace(); |
| 258 | + $row['mbf_title'] = $page->getDBkey(); |
| 259 | + } |
| 260 | + |
| 261 | + if ( $this->getProperty('id') ) { |
| 262 | + $row['mbf_id'] = $this->getProperty('id'); |
| 263 | + $dbw->replace( 'moodbar_feedback', array('mbf_id'), $row, __METHOD__ ); |
| 264 | + } else { |
| 265 | + $row['mbf_id'] = $dbw->nextSequenceValue( 'moodbar_feedback_mbf_id' ); |
| 266 | + $dbw->insert( 'moodbar_feedback', $row, __METHOD__ ); |
| 267 | + $this->setProperty( 'id', $dbw->insertId() ); |
| 268 | + } |
| 269 | + |
| 270 | + return $this->getProperty('id'); |
| 271 | + } |
| 272 | + |
| 273 | + /** |
| 274 | + * Gets the valid types of a feedback item. |
| 275 | + */ |
| 276 | + public static function getValidTypes() { |
| 277 | + return self::$validTypes; |
| 278 | + } |
| 279 | + |
| 280 | +} |
Property changes on: branches/wmf/1.18wmf1/extensions/MoodBar/FeedbackItem.php |
___________________________________________________________________ |
Added: svn:eol-style |
1 | 281 | + native |
Index: branches/wmf/1.18wmf1/extensions/MoodBar/Formatter.php |
— | — | @@ -0,0 +1,92 @@ |
| 2 | +<?php |
| 3 | + |
| 4 | +/** |
| 5 | + * Set of utilities for formatting and processing MoodBar output. |
| 6 | + * @author Andrew Garrett |
| 7 | + */ |
| 8 | +abstract class MoodBarFormatter { |
| 9 | + /** |
| 10 | + * Gets the viewer's representation of $field from $data. |
| 11 | + * @param $data MBFeedbackItem to retrieve the data from. |
| 12 | + * @param $field String name of the field to fill. Valid values in $this->fields |
| 13 | + * @return String HTML for putting in the table. |
| 14 | + */ |
| 15 | + public static function getHTMLRepresentation( $data, $field ) { |
| 16 | + switch( $field ) { |
| 17 | + case 'page': |
| 18 | + $title = $data->getProperty('page'); |
| 19 | + |
| 20 | + global $wgUser; |
| 21 | + $linker = $wgUser->getSkin(); |
| 22 | + $outData = $linker->link( $title ); |
| 23 | + break; |
| 24 | + case 'timestamp': |
| 25 | + global $wgLang; |
| 26 | + $outData = $wgLang->timeanddate( $data->getProperty('timestamp') ); |
| 27 | + $outData = htmlspecialchars($outData); |
| 28 | + break; |
| 29 | + case 'type': |
| 30 | + $internal = self::getInternalRepresentation( $data, $field ); |
| 31 | + $outData = wfMessage("moodbar-type-$internal")->params( $data->getProperty('user') )->parse(); |
| 32 | + break; |
| 33 | + case 'usertype': |
| 34 | + $internal = self::getInternalRepresentation( $data, $field ); |
| 35 | + $outData = wfMessage("moodbar-user-$internal")->parse(); |
| 36 | + break; |
| 37 | + default: |
| 38 | + $outData = self::getInternalRepresentation($data, $field); |
| 39 | + $outData = htmlspecialchars( $outData ); |
| 40 | + break; |
| 41 | + } |
| 42 | + |
| 43 | + return $outData; |
| 44 | + } |
| 45 | + |
| 46 | + /** |
| 47 | + * Gets an internal representation of $field from $data. |
| 48 | + * @param $data MBFeedbackItem to retrieve the data from. |
| 49 | + * @param $field String name of the field to fill. Valid values in $this->fields |
| 50 | + * @return String value appropriate for putting in CSV |
| 51 | + */ |
| 52 | + public static function getInternalRepresentation( $data, $field ) { |
| 53 | + $outData = null; |
| 54 | + |
| 55 | + switch( $field ) { |
| 56 | + case 'namespace': |
| 57 | + $page = $data->getProperty('page'); |
| 58 | + $outData = $page->getNsText(); |
| 59 | + break; |
| 60 | + case 'own-talk': |
| 61 | + $page = $data->getProperty('page'); |
| 62 | + $user = $data->getProperty('user'); |
| 63 | + $userTalk = $user->getUserPage()->getTalkPage(); |
| 64 | + $outData = $page->equals( $userTalk ); |
| 65 | + break; |
| 66 | + case 'usertype': |
| 67 | + $user = $data->getProperty('user'); |
| 68 | + if ( $data->getProperty('anonymize') ) { |
| 69 | + $outData = 'anonymized'; |
| 70 | + } else if ( $user->isAnon() ) { |
| 71 | + $outData = 'ip'; |
| 72 | + } else { |
| 73 | + $outData = 'user'; |
| 74 | + } |
| 75 | + break; |
| 76 | + case 'user': |
| 77 | + $user = $data->getProperty('user'); |
| 78 | + if ( $data->getProperty('anonymize') ) { |
| 79 | + $outData = ''; |
| 80 | + } else { |
| 81 | + $outData = $user->getName(); |
| 82 | + } |
| 83 | + break; |
| 84 | + case 'page': |
| 85 | + $outData = $data->getProperty('page')->getPrefixedText(); |
| 86 | + break; |
| 87 | + default: |
| 88 | + $outData = $data->getProperty($field); |
| 89 | + } |
| 90 | + |
| 91 | + return $outData; |
| 92 | + } |
| 93 | +} |
Property changes on: branches/wmf/1.18wmf1/extensions/MoodBar/Formatter.php |
___________________________________________________________________ |
Added: svn:eol-style |
1 | 94 | + native |
Index: branches/wmf/1.18wmf1/extensions/MoodBar/ApiFeedbackDashboardResponse.php |
— | — | @@ -0,0 +1,114 @@ |
| 2 | +<?php |
| 3 | + |
| 4 | +class ApiFeedbackDashboardResponse extends ApiBase { |
| 5 | + |
| 6 | + public function execute() { |
| 7 | + global $wgRequest, $wgUser, $wgContLang; |
| 8 | + |
| 9 | + if ( $wgUser->isAnon() ) { |
| 10 | + $this->dieUsage( "You don't have permission to do that", 'permission-denied' ); |
| 11 | + } |
| 12 | + |
| 13 | + $params = $this->extractRequestParams(); |
| 14 | + |
| 15 | + //Response Object |
| 16 | + $item = MBFeedbackResponseItem::create( array() ); |
| 17 | + |
| 18 | + $setParams = array(); |
| 19 | + foreach( $params as $key => $value ) { |
| 20 | + if ( $item->isValidKey( $key ) ) { |
| 21 | + $setParams[$key] = $value; |
| 22 | + } |
| 23 | + } |
| 24 | + |
| 25 | + $item->setProperties( $setParams ); |
| 26 | + $item->save(); |
| 27 | + |
| 28 | + $commenter = $item->getProperty('feedbackitem')->getProperty('user'); |
| 29 | + |
| 30 | + if ( $commenter !== null && $commenter->isAnon() == false ) { |
| 31 | + $talkPage = $commenter->getTalkPage(); |
| 32 | + |
| 33 | + $api = new ApiMain( new FauxRequest( array( |
| 34 | + 'action' => 'edit', |
| 35 | + 'title' => $talkPage->getFullText(), |
| 36 | + 'appendtext' => ( $talkPage->exists() ? "\n\n" : '' ) . |
| 37 | + '==' . wfMessage('moodbar-feedback-response-title')->escaped() . '==' . "\n\n" . |
| 38 | + '[[' . $wgContLang->getNsText( NS_SPECIAL ) . ':FeedbackDashboard/' . $item->getProperty('feedback') . '|' . |
| 39 | + wfMessage('moodbar-feedback-view-link')->escaped() . ']]' . "\n\n". |
| 40 | + '[['. $wgUser->getTalkPage()->getFullText() . '|' . $wgUser->getName() . ']] ' . |
| 41 | + '<nowiki>' . $params['response'] . '</nowiki>', |
| 42 | + 'token' => $params['token'], |
| 43 | + 'summary' => '', |
| 44 | + 'notminor' => true, |
| 45 | + ), true, array( 'wsEditToken' => $wgRequest->getSessionData( 'wsEditToken' ) ) ), true ); |
| 46 | + |
| 47 | + $api->execute(); |
| 48 | + } |
| 49 | + |
| 50 | + $result = array( 'result' => 'success' ); |
| 51 | + $this->getResult()->addValue( null, $this->getModuleName(), $result ); |
| 52 | + } |
| 53 | + |
| 54 | + public function needsToken() { |
| 55 | + return true; |
| 56 | + } |
| 57 | + |
| 58 | + public function getTokenSalt() { |
| 59 | + return ''; |
| 60 | + } |
| 61 | + |
| 62 | + public function getAllowedParams() { |
| 63 | + return array( |
| 64 | + 'feedback' => array( |
| 65 | + ApiBase::PARAM_REQUIRED => true, |
| 66 | + ApiBase::PARAM_TYPE => 'integer' |
| 67 | + ), |
| 68 | + 'response' => array( |
| 69 | + ApiBase::PARAM_REQUIRED => true, |
| 70 | + ), |
| 71 | + 'anonymize' => array( |
| 72 | + ApiBase::PARAM_TYPE => 'boolean', |
| 73 | + ), |
| 74 | + 'editmode' => array( |
| 75 | + ApiBase::PARAM_TYPE => 'boolean', |
| 76 | + ), |
| 77 | + 'useragent' => null, |
| 78 | + 'system' => null, |
| 79 | + 'locale' => null, |
| 80 | + 'token' => null, |
| 81 | + ); |
| 82 | + } |
| 83 | + |
| 84 | + public function mustBePosted() { |
| 85 | + return true; |
| 86 | + } |
| 87 | + |
| 88 | + public function isWriteMode() { |
| 89 | + return true; |
| 90 | + } |
| 91 | + |
| 92 | + public function getVersion() { |
| 93 | + return __CLASS__ . ': $Id: ApiMoodBar.php 93113 2011-07-25 21:03:33Z reedy $'; |
| 94 | + } |
| 95 | + |
| 96 | + public function getParamDescription() { |
| 97 | + return array( |
| 98 | + 'feedback' => 'The moodbar feedback unique identifier', |
| 99 | + 'response' => 'The feedback text', |
| 100 | + 'anonymize' => 'Whether to hide user information', |
| 101 | + 'editmode' => 'Whether or not the feedback context is in edit mode', |
| 102 | + 'useragent' => 'The User-Agent header of the browser', |
| 103 | + 'system' => 'The operating system being used', |
| 104 | + 'locale' => 'The locale in use', |
| 105 | + 'token' => 'An edit token', |
| 106 | + ); |
| 107 | + } |
| 108 | + |
| 109 | + public function getDescription() { |
| 110 | + return 'Allows users to submit response to a feedback about their experiences on the site'; |
| 111 | + } |
| 112 | + |
| 113 | +} |
| 114 | + |
| 115 | +?> |
Property changes on: branches/wmf/1.18wmf1/extensions/MoodBar/ApiFeedbackDashboardResponse.php |
___________________________________________________________________ |
Added: svn:eol-style |
1 | 116 | + native |
Index: branches/wmf/1.18wmf1/extensions/MoodBar/MoodBar.hooks.php |
— | — | @@ -0,0 +1,125 @@ |
| 2 | +<?php |
| 3 | + |
| 4 | +class MoodBarHooks { |
| 5 | + /** |
| 6 | + * Adds MoodBar JS to the output if appropriate. |
| 7 | + * |
| 8 | + * @param $output OutputPage |
| 9 | + * @param $skin Skin |
| 10 | + */ |
| 11 | + public static function onPageDisplay( &$output, &$skin ) { |
| 12 | + if ( self::shouldShowMoodbar( $output, $skin ) ) { |
| 13 | + $output->addModules( array( 'ext.moodBar.init', 'ext.moodBar.core' ) ); |
| 14 | + } |
| 15 | + |
| 16 | + return true; |
| 17 | + } |
| 18 | + |
| 19 | + /** |
| 20 | + * Determines whether or not we should show the MoodBar. |
| 21 | + * |
| 22 | + * @param $output OutputPage |
| 23 | + * @param $skin Skin |
| 24 | + */ |
| 25 | + public static function shouldShowMoodbar( &$output, &$skin ) { |
| 26 | + // Front-end appends to header elements, which have different |
| 27 | + // locations and IDs in every skin. |
| 28 | + // Untill there is some kind of central registry of element-ids |
| 29 | + // that skins implement, or a fixed name for each of them, just |
| 30 | + // show it in Vector for now. |
| 31 | + if ( $skin->getSkinName() !== 'vector' ) { |
| 32 | + return false; |
| 33 | + } |
| 34 | + global $wgUser; |
| 35 | + $user = $wgUser; |
| 36 | + |
| 37 | + if ( $user->isAnon() ) { |
| 38 | + return false; |
| 39 | + } |
| 40 | + |
| 41 | + // Only show MoodBar for users registered after a certain time |
| 42 | + global $wgMoodBarCutoffTime; |
| 43 | + if ( $wgMoodBarCutoffTime && |
| 44 | + $user->getRegistration() < $wgMoodBarCutoffTime ) |
| 45 | + { |
| 46 | + return false; |
| 47 | + } |
| 48 | + |
| 49 | + if ( class_exists('EditPageTracking') ) { |
| 50 | + return ((bool)EditPageTracking::getFirstEditPage($user)); |
| 51 | + } |
| 52 | + |
| 53 | + return true; |
| 54 | + } |
| 55 | + |
| 56 | + /** |
| 57 | + * ResourceLoaderGetConfigVars hook |
| 58 | + */ |
| 59 | + public static function resourceLoaderGetConfigVars( &$vars ) { |
| 60 | + global $wgMoodBarConfig, $wgUser; |
| 61 | + $vars['mbConfig'] = array( |
| 62 | + 'validTypes' => MBFeedbackItem::getValidTypes(), |
| 63 | + 'userBuckets' => MoodBarHooks::getUserBuckets( $wgUser ), |
| 64 | + ) + $wgMoodBarConfig; |
| 65 | + return true; |
| 66 | + } |
| 67 | + |
| 68 | + public static function makeGlobalVariablesScript( &$vars ) { |
| 69 | + global $wgUser; |
| 70 | + $vars['mbEditToken'] = $wgUser->editToken(); |
| 71 | + return true; |
| 72 | + } |
| 73 | + |
| 74 | + /** |
| 75 | + * Runs MoodBar schema updates# |
| 76 | + * |
| 77 | + * @param $updater DatabasEUpdater |
| 78 | + */ |
| 79 | + public static function onLoadExtensionSchemaUpdates( $updater = null ) { |
| 80 | + $updater->addExtensionUpdate( array( 'addTable', 'moodbar_feedback', |
| 81 | + dirname(__FILE__).'/sql/MoodBar.sql', true ) ); |
| 82 | + |
| 83 | + $updater->addExtensionUpdate( array( 'addField', 'moodbar_feedback', |
| 84 | + 'mbf_user_editcount', dirname(__FILE__).'/sql/mbf_user_editcount.sql', true ) |
| 85 | + ); |
| 86 | + |
| 87 | + $db = $updater->getDB(); |
| 88 | + if ( $db->tableExists( 'moodbar_feedback' ) && |
| 89 | + $db->indexExists( 'moodbar_feedback', 'type_timestamp', __METHOD__ ) ) |
| 90 | + { |
| 91 | + $updater->addExtensionUpdate( array( 'addIndex', 'moodbar_feedback', |
| 92 | + 'mbf_type_timestamp_id', dirname( __FILE__ ) . '/sql/AddIDToIndexes.sql', true ) |
| 93 | + ); |
| 94 | + } |
| 95 | + $updater->addExtensionUpdate( array( 'dropIndex', 'moodbar_feedback', |
| 96 | + 'mbf_timestamp', dirname( __FILE__ ) . '/sql/AddIDToIndexes2.sql', true ) |
| 97 | + ); |
| 98 | + |
| 99 | + $updater->addExtensionUpdate( array( 'addIndex', 'moodbar_feedback', |
| 100 | + 'mbf_timestamp_id', dirname( __FILE__ ) . '/sql/mbf_timestamp_id.sql', true ) |
| 101 | + ); |
| 102 | + |
| 103 | + $updater->addExtensionUpdate( array( 'addField', 'moodbar_feedback', |
| 104 | + 'mbf_hidden_state', dirname(__FILE__).'/sql/mbf_hidden_state.sql', true ) ); |
| 105 | + |
| 106 | + $updater->addExtensionUpdate( array( 'addTable', 'moodbar_feedback_response', |
| 107 | + dirname(__FILE__).'/sql/moodbar_feedback_response.sql', true ) ); |
| 108 | + |
| 109 | + return true; |
| 110 | + } |
| 111 | + |
| 112 | + /** |
| 113 | + * Gets the MoodBar testing bucket that a user is in. |
| 114 | + * @param $user The user to check |
| 115 | + * @return array of bucket names |
| 116 | + */ |
| 117 | + public static function getUserBuckets( $user ) { |
| 118 | + $id = $user->getID(); |
| 119 | + $buckets = array(); |
| 120 | + |
| 121 | + // No show-time bucketing yet. This method is a stub. |
| 122 | + |
| 123 | + sort($buckets); |
| 124 | + return $buckets; |
| 125 | + } |
| 126 | +} |
Property changes on: branches/wmf/1.18wmf1/extensions/MoodBar/MoodBar.hooks.php |
___________________________________________________________________ |
Added: svn:eol-style |
1 | 127 | + native |
Index: branches/wmf/1.18wmf1/extensions/MoodBar/sql/MoodBar.sql |
— | — | @@ -0,0 +1,37 @@ |
| 2 | +CREATE TABLE /*_*/moodbar_feedback ( |
| 3 | + mbf_id int unsigned NOT NULL PRIMARY KEY auto_increment, -- Primary key |
| 4 | + mbf_type varchar(32) binary NOT NULL, -- Type of feedback |
| 5 | + |
| 6 | + -- User who provided the feedback |
| 7 | + mbf_user_id int unsigned NOT NULL, -- User ID, or zero |
| 8 | + mbf_user_ip varchar(255) binary NULL, -- If anonymous, user's IP address |
| 9 | + mbf_user_editcount int unsigned NOT NULL, -- Edit count of the user |
| 10 | + |
| 11 | + -- Page where the feedback was received |
| 12 | + -- Nullable. |
| 13 | + mbf_namespace int, |
| 14 | + mbf_title varchar(255) binary, |
| 15 | + |
| 16 | + -- The feedback itself |
| 17 | + mbf_comment varchar(255) binary, |
| 18 | + |
| 19 | + -- Options and context |
| 20 | + -- Whether or not the feedback item is hidden |
| 21 | + -- 0 = No; 255 = Yes (other values reserved for partial hiding) |
| 22 | + mbf_hidden_state tinyint unsigned not null default 0, |
| 23 | + mbf_anonymous tinyint unsigned not null default 0, -- Anonymity |
| 24 | + mbf_timestamp varchar(14) binary not null, -- When feedback was received |
| 25 | + mbf_system_type varchar(64) binary null, -- Operating System |
| 26 | + mbf_user_agent varchar(255) binary null, -- User-Agent header |
| 27 | + mbf_locale varchar(32) binary null, -- The locale of the user's browser |
| 28 | + mbf_editing tinyint unsigned not null, -- Whether or not the user was editing |
| 29 | + mbf_bucket varchar(128) binary null -- Bucket, for A/B testing |
| 30 | +) /*$wgDBTableOptions*/; |
| 31 | + |
| 32 | +-- A little overboard with the indexes perhaps, but we want to be able to dice this data a lot! |
| 33 | +CREATE INDEX /*i*/mbf_type_timestamp_id ON /*_*/moodbar_feedback (mbf_type,mbf_timestamp, mbf_id); |
| 34 | +CREATE INDEX /*i*/mbf_title_type_id ON /*_*/moodbar_feedback (mbf_namespace,mbf_title,mbf_type,mbf_timestamp, mbf_id); |
| 35 | +-- CREATE INDEX /*i*/mbf_namespace_title_timestamp ON /*_*/moodbar_feedback (mbf_namespace, mbf_title, mbf_timestamp, mbf_id); --maybe in the future if we actually do per-page filtering |
| 36 | +CREATE INDEX /*i*/mbf_userid_ip_timestamp_id ON /*_*/moodbar_feedback (mbf_user_id, mbf_user_ip, mbf_timestamp, mbf_id); |
| 37 | +CREATE INDEX /*i*/mbf_type_userid_ip_timestamp_id ON /*_*/moodbar_feedback (mbf_type, mbf_user_id, mbf_user_ip, mbf_timestamp, mbf_id); |
| 38 | +CREATE INDEX /*i*/mbf_timestamp_id ON /*_*/moodbar_feedback (mbf_timestamp, mbf_id); |
Property changes on: branches/wmf/1.18wmf1/extensions/MoodBar/sql/MoodBar.sql |
___________________________________________________________________ |
Added: svn:eol-style |
1 | 39 | + native |
Index: branches/wmf/1.18wmf1/extensions/MoodBar/sql/mbf_timestamp_id.sql |
— | — | @@ -0,0 +1,5 @@ |
| 2 | +-- Add some indexes to the moodbar_feedback table |
| 3 | + |
| 4 | +CREATE INDEX /*i*/mbf_userid_ip_timestamp_id ON /*_*/moodbar_feedback (mbf_user_id, mbf_user_ip, mbf_timestamp, mbf_id); |
| 5 | +CREATE INDEX /*i*/mbf_type_userid_ip_timestamp_id ON /*_*/moodbar_feedback (mbf_type, mbf_user_id, mbf_user_ip, mbf_timestamp, mbf_id); |
| 6 | +CREATE INDEX /*i*/mbf_timestamp_id ON /*_*/moodbar_feedback (mbf_timestamp, mbf_id); |
Property changes on: branches/wmf/1.18wmf1/extensions/MoodBar/sql/mbf_timestamp_id.sql |
___________________________________________________________________ |
Added: svn:eol-style |
1 | 7 | + native |
Index: branches/wmf/1.18wmf1/extensions/MoodBar/sql/moodbar_feedback_response.sql |
— | — | @@ -0,0 +1,25 @@ |
| 2 | +CREATE TABLE /*_*/moodbar_feedback_response ( |
| 3 | + mbfr_id int unsigned NOT NULL PRIMARY KEY auto_increment, -- Primary key |
| 4 | + |
| 5 | + mbfr_mbf_id int unsigned NOT NULL, -- Primary key of moodbar_feedback table |
| 6 | + |
| 7 | + -- User who provided the response |
| 8 | + mbfr_user_id int unsigned NOT NULL, -- User ID, or zero |
| 9 | + mbfr_user_ip varbinary(40) NULL, -- If anonymous, user's IP address |
| 10 | + |
| 11 | + mbfr_commenter_editcount int unsigned NOT NULL, -- number of edit for the user who writes the feedback |
| 12 | + mbfr_user_editcount int unsigned NOT NULL, -- number of edit for the responder |
| 13 | + |
| 14 | + -- The response itself |
| 15 | + mbfr_response_text text NOT NULL, |
| 16 | + |
| 17 | + -- Options and context |
| 18 | + mbfr_timestamp varchar(14) binary NOT NULL, -- When response was received |
| 19 | + mbfr_anonymous tinyint unsigned NOT NULL DEFAULT 0, -- Anonymity |
| 20 | + mbfr_system_type varchar(64) binary NULL, -- Operating System |
| 21 | + mbfr_user_agent varchar(255) binary NULL, -- User-Agent header |
| 22 | + mbfr_locale varchar(32) binary NULL, -- The locale of the user's browser |
| 23 | + mbfr_editing tinyint unsigned NOT NULL -- Whether or not the user was editing |
| 24 | +) /*$wgDBTableOptions*/; |
| 25 | + |
| 26 | +CREATE INDEX /*i*/mbfr_mbf_id ON /*_*/moodbar_feedback_response (mbfr_mbf_id); |
Property changes on: branches/wmf/1.18wmf1/extensions/MoodBar/sql/moodbar_feedback_response.sql |
___________________________________________________________________ |
Added: svn:eol-style |
1 | 27 | + native |
Index: branches/wmf/1.18wmf1/extensions/MoodBar/sql/AddIDToIndexes.sql |
— | — | @@ -0,0 +1,5 @@ |
| 2 | +-- Drop and recreate indexes to add mbf_id to the end |
| 3 | +DROP INDEX /*i*/type_timestamp ON /*_*/moodbar_feedback; |
| 4 | +DROP INDEX /*i*/title_type ON /*_*/moodbar_feedback; |
| 5 | +CREATE INDEX /*i*/mbf_type_timestamp_id ON /*_*/moodbar_feedback (mbf_type,mbf_timestamp, mbf_id); |
| 6 | +CREATE INDEX /*i*/mbf_title_type_id ON /*_*/moodbar_feedback (mbf_namespace,mbf_title,mbf_type,mbf_timestamp, mbf_id); |
\ No newline at end of file |
Property changes on: branches/wmf/1.18wmf1/extensions/MoodBar/sql/AddIDToIndexes.sql |
___________________________________________________________________ |
Added: svn:eol-style |
1 | 7 | + native |
Index: branches/wmf/1.18wmf1/extensions/MoodBar/sql/AddIDToIndexes2.sql |
— | — | @@ -0,0 +1,5 @@ |
| 2 | +-- Drop and recreate indexes to add mbf_id to the end |
| 3 | +DROP INDEX /*i*/mbf_userid_ip_timestamp ON /*_*/moodbar_feedback; |
| 4 | +DROP INDEX /*i*/mbf_type_userid_ip_timestamp ON /*_*/moodbar_feedback; |
| 5 | +DROP INDEX /*i*/mbf_timestamp ON /*_*/moodbar_feedback; |
| 6 | +-- Recreation is done in mbf_timestamp_id.sql |
Property changes on: branches/wmf/1.18wmf1/extensions/MoodBar/sql/AddIDToIndexes2.sql |
___________________________________________________________________ |
Added: svn:eol-style |
1 | 7 | + native |
Index: branches/wmf/1.18wmf1/extensions/MoodBar/sql/mbf_hidden_state.sql |
— | — | @@ -0,0 +1,4 @@ |
| 2 | +-- Adds the mbf_hidden_state field to the moodbar_feedback table, for |
| 3 | +-- hiding feedback from public view. |
| 4 | +-- Andrew Garrett, 2011-10-07 |
| 5 | +ALTER TABLE /*_*/moodbar_feedback ADD COLUMN mbf_hidden_state tinyint unsigned not null default 0; |
Property changes on: branches/wmf/1.18wmf1/extensions/MoodBar/sql/mbf_hidden_state.sql |
___________________________________________________________________ |
Added: svn:eol-style |
1 | 6 | + native |
Index: branches/wmf/1.18wmf1/extensions/MoodBar/sql/mbf_user_editcount.sql |
— | — | @@ -0,0 +1,2 @@ |
| 2 | +-- Adds the mbf_user_editcount |
| 3 | +ALTER TABLE /*_*/moodbar_feedback ADD COLUMN mbf_user_editcount int unsigned NOT NULL; |
Property changes on: branches/wmf/1.18wmf1/extensions/MoodBar/sql/mbf_user_editcount.sql |
___________________________________________________________________ |
Added: svn:eol-style |
1 | 4 | + native |
Index: branches/wmf/1.18wmf1/extensions/MoodBar/ApiQueryMoodBarComments.php |
— | — | @@ -0,0 +1,189 @@ |
| 2 | +<?php |
| 3 | + |
| 4 | +class ApiQueryMoodBarComments extends ApiQueryBase { |
| 5 | + public function __construct( $query, $moduleName ) { |
| 6 | + parent::__construct( $query, $moduleName, 'mbc' ); |
| 7 | + } |
| 8 | + |
| 9 | + public function execute() { |
| 10 | + global $wgLang, $wgUser; |
| 11 | + $params = $this->extractRequestParams(); |
| 12 | + $prop = array_flip( $params['prop'] ); |
| 13 | + |
| 14 | + // Build the query |
| 15 | + $this->addTables( array( 'moodbar_feedback', 'user' ) ); |
| 16 | + $this->addJoinConds( array( 'user' => array( 'LEFT JOIN', 'user_id=mbf_user_id' ) ) ); |
| 17 | + $this->addFields( array( 'user_name', 'mbf_id', 'mbf_type', 'mbf_timestamp', 'mbf_user_id', 'mbf_user_ip', |
| 18 | + 'mbf_comment', 'mbf_hidden_state' ) ); |
| 19 | + if ( count( $params['type'] ) ) { |
| 20 | + $this->addWhereFld( 'mbf_type', $params['type'] ); |
| 21 | + } |
| 22 | + if ( $params['user'] !== null ) { |
| 23 | + $user = User::newFromName( $params['user'] ); // returns false for IPs |
| 24 | + if ( !$user || $user->isAnon() ) { |
| 25 | + $this->addWhereFld( 'mbf_user_id', 0 ); |
| 26 | + $this->addWhereFld( 'mbf_user_ip', $params['user'] ); |
| 27 | + } else { |
| 28 | + $this->addWhereFld( 'mbf_user_id', $user->getID() ); |
| 29 | + $this->addWhere( 'mbf_user_ip IS NULL' ); |
| 30 | + } |
| 31 | + } |
| 32 | + |
| 33 | + if ( $params['continue'] !== null ) { |
| 34 | + $this->applyContinue( $params['continue'], $params['dir'] == 'older' ); |
| 35 | + } |
| 36 | + |
| 37 | + // Add ORDER BY mbf_timestamp {ASC|DESC}, mbf_id {ASC|DESC} |
| 38 | + $this->addWhereRange( 'mbf_timestamp', $params['dir'], null, null ); |
| 39 | + $this->addWhereRange( 'mbf_id', $params['dir'], null, null ); |
| 40 | + $this->addOption( 'LIMIT', $params['limit'] + 1 ); |
| 41 | + |
| 42 | + if ( ! $wgUser->isAllowed( 'moodbar-admin' ) ) { |
| 43 | + $this->addWhereFld( 'mbf_hidden_state', 0 ); |
| 44 | + } |
| 45 | + |
| 46 | + $res = $this->select( __METHOD__ ); |
| 47 | + $result = $this->getResult(); |
| 48 | + $count = 0; |
| 49 | + foreach ( $res as $row ) { |
| 50 | + if ( ++$count > $params['limit'] ) { |
| 51 | + // We've reached the one extra which shows that there are additional rows. Stop here |
| 52 | + $this->setContinueEnumParameter( 'continue', $this->getContinue( $row ) ); |
| 53 | + break; |
| 54 | + } |
| 55 | + |
| 56 | + $vals = $this->extractRowInfo( $row, $prop ); |
| 57 | + $fit = $result->addValue( array( 'query', $this->getModuleName() ), null, $vals ); |
| 58 | + if ( !$fit ) { |
| 59 | + $this->setContinueEnumParameter( 'continue', $this->getContinue( $row ) ); |
| 60 | + break; |
| 61 | + } |
| 62 | + } |
| 63 | + $result->setIndexedTagName_internal( array( 'query', $this->getModuleName() ), 'comment' ); |
| 64 | + } |
| 65 | + |
| 66 | + protected function getContinue( $row ) { |
| 67 | + $ts = wfTimestamp( TS_MW, $row->mbf_timestamp ); |
| 68 | + return "$ts|{$row->mbf_id}"; |
| 69 | + } |
| 70 | + |
| 71 | + protected function applyContinue( $continue, $sortDesc ) { |
| 72 | + $vals = explode( '|', $continue, 3 ); |
| 73 | + if ( count( $vals ) !== 2 ) { |
| 74 | + // TODO this should be a standard message in ApiBase |
| 75 | + $this->dieUsage( 'Invalid continue param. You should pass the original value returned by the previous query', 'badcontinue' ); |
| 76 | + } |
| 77 | + |
| 78 | + $db = $this->getDB(); |
| 79 | + $ts = $db->addQuotes( $db->timestamp( $vals[0] ) ); |
| 80 | + $id = intval( $vals[1] ); |
| 81 | + $op = $sortDesc ? '<' : '>'; |
| 82 | + // TODO there should be a standard way to do this in DatabaseBase or ApiQueryBase something |
| 83 | + $this->addWhere( "mbf_timestamp $op $ts OR " . |
| 84 | + "(mbf_timestamp = $ts AND " . |
| 85 | + "mbf_id $op= $id)" |
| 86 | + ); |
| 87 | + } |
| 88 | + |
| 89 | + protected function extractRowInfo( $row, $prop ) { |
| 90 | + global $wgUser; |
| 91 | + |
| 92 | + $r = array(); |
| 93 | + |
| 94 | + $showHidden = isset($prop['hidden']) && $wgUser->isAllowed('moodbar-admin'); |
| 95 | + $isHidden = $row->mbf_hidden_state > 0; |
| 96 | + |
| 97 | + if ( isset( $prop['metadata'] ) ) { |
| 98 | + $r += array( |
| 99 | + 'id' => intval( $row->mbf_id ), |
| 100 | + 'type' => $row->mbf_type, |
| 101 | + 'timestamp' => wfTimestamp( TS_ISO_8601, $row->mbf_timestamp ), |
| 102 | + 'userid' => intval( $row->mbf_user_id ), |
| 103 | + 'username' => $row->mbf_user_ip === null ? $row->user_name : $row->mbf_user_ip, |
| 104 | + ); |
| 105 | + ApiResult::setContent( $r, $row->mbf_comment ); |
| 106 | + } |
| 107 | + if ( isset( $prop['formatted'] ) ) { |
| 108 | + $params = array(); |
| 109 | + |
| 110 | + if ( $wgUser->isAllowed( 'moodbar-admin' ) ) { |
| 111 | + $params[] = 'admin'; |
| 112 | + } |
| 113 | + |
| 114 | + if ( $isHidden && $showHidden ) { |
| 115 | + $params[] = 'show-anyway'; |
| 116 | + } |
| 117 | + |
| 118 | + $r['formatted'] = SpecialFeedbackDashboard::formatListItem( $row, $params ); |
| 119 | + } |
| 120 | + |
| 121 | + if ( $isHidden && !$showHidden ) { |
| 122 | + unset($r['userid']); |
| 123 | + unset($r['username']); |
| 124 | + unset($r['type']); |
| 125 | + ApiResult::setContent( $r, '' ); |
| 126 | + $r['hidden'] = true; |
| 127 | + } |
| 128 | + |
| 129 | + return $r; |
| 130 | + } |
| 131 | + |
| 132 | + public function getAllowedParams() { |
| 133 | + return array( |
| 134 | + 'limit' => array( |
| 135 | + ApiBase::PARAM_DFLT => 10, |
| 136 | + ApiBase::PARAM_TYPE => 'limit', |
| 137 | + ApiBase::PARAM_MIN => 1, |
| 138 | + ApiBase::PARAM_MAX => ApiBase::LIMIT_BIG1, |
| 139 | + ApiBase::PARAM_MAX2 => ApiBase::LIMIT_BIG2 |
| 140 | + ), |
| 141 | + 'dir' => array( |
| 142 | + ApiBase::PARAM_DFLT => 'older', |
| 143 | + ApiBase::PARAM_TYPE => array( |
| 144 | + 'newer', |
| 145 | + 'older' |
| 146 | + ) |
| 147 | + ), |
| 148 | + 'continue' => null, |
| 149 | + 'type' => array( |
| 150 | + ApiBase::PARAM_TYPE => MBFeedbackItem::getValidTypes(), |
| 151 | + ApiBase::PARAM_ISMULTI => true, |
| 152 | + ApiBase::PARAM_DFLT => '', // all |
| 153 | + ), |
| 154 | + 'user' => array( |
| 155 | + ApiBase::PARAM_TYPE => 'user', |
| 156 | + ), |
| 157 | + 'prop' => array( |
| 158 | + ApiBase::PARAM_TYPE => array( 'metadata', 'formatted', 'hidden' ), |
| 159 | + ApiBase::PARAM_DFLT => 'metadata', |
| 160 | + ApiBase::PARAM_ISMULTI => true, |
| 161 | + ), |
| 162 | + ); |
| 163 | + } |
| 164 | + |
| 165 | + public function getVersion() { |
| 166 | + return __CLASS__ . ': $Id$'; |
| 167 | + } |
| 168 | + |
| 169 | + public function getParamDescription() { |
| 170 | + return array( |
| 171 | + 'limit' => 'How many comments to return', |
| 172 | + 'continue' => 'When more results are available, use this to continue', |
| 173 | + 'type' => 'Only return comments of the given type(s). If not set or empty, return all comments', |
| 174 | + 'user' => 'Only return comments submitted by the given user', |
| 175 | + 'prop' => array( 'Which properties to get:', |
| 176 | + ' metadata - Comment ID, type, timestamp, user', |
| 177 | + ' formatted - HTML that would be displayed for this comment on Special:MoodBarFeedback', |
| 178 | + ' hidden - Format the full HTML even if comments are hidden', |
| 179 | + ), |
| 180 | + ); |
| 181 | + } |
| 182 | + |
| 183 | + public function getDescription() { |
| 184 | + return 'List all feedback comments submitted through the MoodBar extension.'; |
| 185 | + } |
| 186 | + |
| 187 | + public function getCacheMode( $params ) { |
| 188 | + return isset($params['prop']['hidden']) ? 'private' : 'public'; |
| 189 | + } |
| 190 | +} |
Property changes on: branches/wmf/1.18wmf1/extensions/MoodBar/ApiQueryMoodBarComments.php |
___________________________________________________________________ |
Added: svn:keywords |
1 | 191 | + Id |
Added: svn:eol-style |
2 | 192 | + native |
Index: branches/wmf/1.18wmf1/extensions/MoodBar/MoodBar.alias.php |
— | — | @@ -0,0 +1,15 @@ |
| 2 | +<?php |
| 3 | +/** |
| 4 | + * Aliases for Special:Gadgets |
| 5 | + * |
| 6 | + * @file |
| 7 | + * @ingroup Extensions |
| 8 | + */ |
| 9 | + |
| 10 | +$specialPageAliases = array(); |
| 11 | + |
| 12 | +/** English (English) */ |
| 13 | +$specialPageAliases['en'] = array( |
| 14 | + 'MoodBar' => array( 'MoodBar' ), |
| 15 | + 'FeedbackDashboard' => array( 'FeedbackDashboard' ), |
| 16 | +); |
Property changes on: branches/wmf/1.18wmf1/extensions/MoodBar/MoodBar.alias.php |
___________________________________________________________________ |
Added: svn:eol-style |
1 | 17 | + native |
Index: branches/wmf/1.18wmf1/extensions/MoodBar/ApiMoodBar.php |
— | — | @@ -0,0 +1,92 @@ |
| 2 | +<?php |
| 3 | + |
| 4 | +class ApiMoodBar extends ApiBase { |
| 5 | + public function execute() { |
| 6 | + $params = $this->extractRequestParams(); |
| 7 | + |
| 8 | + $params['page'] = Title::newFromText( $params['page'] ); |
| 9 | + |
| 10 | + // Params are deliberately named the same as the properties, |
| 11 | + // just slurp them through. |
| 12 | + $item = MBFeedbackItem::create( array() ); |
| 13 | + |
| 14 | + $setParams = array(); |
| 15 | + foreach( $params as $key => $value ) { |
| 16 | + if ( $item->isValidKey( $key ) ) { |
| 17 | + $setParams[$key] = $value; |
| 18 | + } |
| 19 | + } |
| 20 | + |
| 21 | + $item->setProperties( $setParams ); |
| 22 | + |
| 23 | + $item->save(); |
| 24 | + |
| 25 | + $result = array( 'result' => 'success' ); |
| 26 | + $this->getResult()->addValue( null, $this->getModuleName(), $result ); |
| 27 | + } |
| 28 | + |
| 29 | + public function needsToken() { |
| 30 | + return true; |
| 31 | + } |
| 32 | + |
| 33 | + public function getTokenSalt() { |
| 34 | + return ''; |
| 35 | + } |
| 36 | + |
| 37 | + public function getAllowedParams() { |
| 38 | + return array( |
| 39 | + 'page' => array( |
| 40 | + ApiBase::PARAM_REQUIRED => true, |
| 41 | + ), |
| 42 | + 'type' => array( |
| 43 | + ApiBase::PARAM_REQUIRED => true, |
| 44 | + ApiBase::PARAM_TYPE => MBFeedbackItem::getValidTypes(), |
| 45 | + ), |
| 46 | + 'comment' => array( |
| 47 | + ApiBase::PARAM_REQUIRED => true, |
| 48 | + ), |
| 49 | + 'anonymize' => array( |
| 50 | + ApiBase::PARAM_TYPE => 'boolean', |
| 51 | + ), |
| 52 | + 'editmode' => array( |
| 53 | + ApiBase::PARAM_TYPE => 'boolean', |
| 54 | + ), |
| 55 | + 'useragent' => null, |
| 56 | + 'system' => null, |
| 57 | + 'locale' => null, |
| 58 | + 'bucket' => null, |
| 59 | + 'token' => null, |
| 60 | + ); |
| 61 | + } |
| 62 | + |
| 63 | + public function mustBePosted() { |
| 64 | + return true; |
| 65 | + } |
| 66 | + |
| 67 | + public function isWriteMode() { |
| 68 | + return true; |
| 69 | + } |
| 70 | + |
| 71 | + public function getVersion() { |
| 72 | + return __CLASS__ . ': $Id$'; |
| 73 | + } |
| 74 | + |
| 75 | + public function getParamDescription() { |
| 76 | + return array( |
| 77 | + 'page' => 'The page the feedback is on', |
| 78 | + 'type' => 'The type of feedback being provided', |
| 79 | + 'comment' => 'The feedback text', |
| 80 | + 'anonymize' => 'Whether to hide user information', |
| 81 | + 'editmode' => 'Whether or not the feedback context is in edit mode', |
| 82 | + 'bucket' => 'The testing bucket, if any', |
| 83 | + 'useragent' => 'The User-Agent header of the browser', |
| 84 | + 'system' => 'The operating system being used', |
| 85 | + 'locale' => 'The locale in use', |
| 86 | + 'token' => 'An edit token', |
| 87 | + ); |
| 88 | + } |
| 89 | + |
| 90 | + public function getDescription() { |
| 91 | + return 'Allows users to submit feedback about their experiences on the site'; |
| 92 | + } |
| 93 | +} |
Property changes on: branches/wmf/1.18wmf1/extensions/MoodBar/ApiMoodBar.php |
___________________________________________________________________ |
Added: svn:keywords |
1 | 94 | + Id |
Added: svn:eol-style |
2 | 95 | + native |
Index: branches/wmf/1.18wmf1/extensions/MoodBar/FeedbackResponseItem.php |
— | — | @@ -0,0 +1,286 @@ |
| 2 | +<?php |
| 3 | + |
| 4 | +/** |
| 5 | + * This class represents a single piece of MoodBar feedback response |
| 6 | + * @Todo: Make a base class for both MBFeedbackItem and MBFeedbackResponseItem |
| 7 | + * so common functions can be re-used |
| 8 | + */ |
| 9 | +class MBFeedbackResponseItem { |
| 10 | + /** Container for the data **/ |
| 11 | + protected $data; |
| 12 | + /** Valid data keys **/ |
| 13 | + protected $validMembers = array( |
| 14 | + // Feedback response essentials |
| 15 | + 'id', // ID in the database for response |
| 16 | + 'feedback', // ID in the database for moodbar_feedback |
| 17 | + 'feedbackitem', // the feedback that the user responds to |
| 18 | + 'user', // user object |
| 19 | + 'anonymize', |
| 20 | + 'commenter-editcount', // Number of edit for the user writes the feedback |
| 21 | + 'user-editcount', // Number of edit for the responder |
| 22 | + 'response', // The response itself |
| 23 | + 'timestamp', // When response was received |
| 24 | + 'system', // Operating System |
| 25 | + 'useragent' , // User-Agent header |
| 26 | + 'locale', // The locale of the user's browser |
| 27 | + 'editmode' // Whether or not the user was editing |
| 28 | + ); |
| 29 | + /** |
| 30 | + * Default constructor. |
| 31 | + * Don't use this, use MBFeedbackResponseItem::create |
| 32 | + */ |
| 33 | + protected function __construct() { |
| 34 | + $this->data = array_fill_keys( $this->validMembers, null ); |
| 35 | + |
| 36 | + // Non-nullable boolean fields |
| 37 | + $this->setProperty('anonymize', false); |
| 38 | + $this->setProperty('editmode', false); |
| 39 | + } |
| 40 | + |
| 41 | + /** |
| 42 | + * Factory function to create a new MBFeedbackResponseItem |
| 43 | + * @param $info Associative array of values |
| 44 | + * Valid keys: feedbackitem, user, response-text, timestamp, |
| 45 | + * useragent, system, locale |
| 46 | + * @return MBFeedbackItem object. |
| 47 | + */ |
| 48 | + public static function create( $info ) { |
| 49 | + $newObject = new self(); |
| 50 | + $newObject->initialiseNew( $info ); |
| 51 | + return $newObject; |
| 52 | + } |
| 53 | + |
| 54 | + /** |
| 55 | + * Initialiser for new MBFeedbackResponseItem |
| 56 | + * @param $info Associative array of values |
| 57 | + * @see MBFeedbackItem::create |
| 58 | + */ |
| 59 | + protected function initialiseNew( $info ) { |
| 60 | + global $wgUser; |
| 61 | + |
| 62 | + $template = array( |
| 63 | + 'user' => $wgUser, |
| 64 | + 'timestamp' => wfTimestampNow(), |
| 65 | + ); |
| 66 | + |
| 67 | + $this->setProperties( $template ); |
| 68 | + $this->setProperties( $info ); |
| 69 | + } |
| 70 | + |
| 71 | + /** |
| 72 | + * Factory function to load an MBFeedbackResponseItem from a DB row. |
| 73 | + * @param $row A row, from DatabaseBase::fetchObject |
| 74 | + * @return MBFeedResponseback object. |
| 75 | + */ |
| 76 | + public static function load( $row ) { |
| 77 | + $newObject = new self(); |
| 78 | + $newObject->initialiseFromRow( $row ); |
| 79 | + return $newObject; |
| 80 | + } |
| 81 | + |
| 82 | + /** |
| 83 | + * Initialiser for MBFeedbackResponseItems loaded from the database |
| 84 | + * @param $row A row object from DatabaseBase::fetchObject |
| 85 | + * @see MBFeedbackItem::load |
| 86 | + */ |
| 87 | + protected function initialiseFromRow( $row ) { |
| 88 | + static $propMappings = array( |
| 89 | + 'id' => 'mbfr_id', |
| 90 | + 'feedback' => 'mbfr_mbf_id', |
| 91 | + 'response' => 'mbfr_response_text', |
| 92 | + 'timestamp' => 'mbfr_timestamp', |
| 93 | + 'anonymize' => 'mbfr_anonymous', |
| 94 | + 'useragent' => 'mbfr_user_agent', |
| 95 | + 'system' => 'mbfr_system_type', |
| 96 | + 'locale' => 'mbfr_locale', |
| 97 | + 'editmode' => 'mbfr_editing', |
| 98 | + 'commenter-editcount', |
| 99 | + 'user-editcount' |
| 100 | + ); |
| 101 | + |
| 102 | + $properties = array(); |
| 103 | + |
| 104 | + foreach( $propMappings as $property => $field ) { |
| 105 | + if ( isset( $row->$field ) ) { |
| 106 | + $properties[$property] = $row->$field; |
| 107 | + } |
| 108 | + } |
| 109 | + |
| 110 | + if ( $row->mbfr_user_id > 0 ) { |
| 111 | + $properties['user'] = User::newFromId( $row->mbfr_user_id ); |
| 112 | + } elseif ( $row->mbfr_user_ip ) { |
| 113 | + $properties['user'] = User::newFromName( $row->mbfr_user_ip ); |
| 114 | + } |
| 115 | + else { |
| 116 | + //Error |
| 117 | + $properties['user'] = ''; |
| 118 | + } |
| 119 | + |
| 120 | + $this->setProperties( $properties ); |
| 121 | + |
| 122 | + } |
| 123 | + |
| 124 | + /** |
| 125 | + * Set a group of properties. Throws an exception on invalid property. |
| 126 | + * @param $values An associative array of properties to set. |
| 127 | + * @throws MWFeedbackResponseItemPropertyException |
| 128 | + */ |
| 129 | + public function setProperties( $values ) { |
| 130 | + |
| 131 | + foreach( $values as $key => $value ) { |
| 132 | + if ( ! $this->isValidKey($key) ) { |
| 133 | + throw new MWFeedbackResponseItemPropertyException( "Attempt to set invalid property $key" ); |
| 134 | + } |
| 135 | + |
| 136 | + if ( ! $this->validatePropertyValue($key, $value) ) { |
| 137 | + throw new MWFeedbackResponseItemPropertyException( "Attempt to set invalid value for $key" ); |
| 138 | + } |
| 139 | + |
| 140 | + $this->data[$key] = $value; |
| 141 | + } |
| 142 | + } |
| 143 | + |
| 144 | + /** |
| 145 | + * Set a group of values. |
| 146 | + * @param $key The property to set. |
| 147 | + * @param $value The value to give it. |
| 148 | + */ |
| 149 | + public function setProperty( $key, $value ) { |
| 150 | + $this->setProperties( array( $key => $value ) ); |
| 151 | + } |
| 152 | + |
| 153 | + /** |
| 154 | + * Get a property. |
| 155 | + * @param $key The property to get |
| 156 | + * @return The property value. |
| 157 | + * @throws MWFeedbackResponseItemPropertyException |
| 158 | + */ |
| 159 | + public function getProperty( $key ) { |
| 160 | + if ( ! $this->isValidKey($key) ) { |
| 161 | + throw new MWFeedbackResponseItemPropertyException( "Attempt to get invalid property $key" ); |
| 162 | + } |
| 163 | + |
| 164 | + return $this->data[$key]; |
| 165 | + } |
| 166 | + |
| 167 | + /** |
| 168 | + * Check a property key for validity. |
| 169 | + * If a property key is valid, it will be prefilled to NULL. |
| 170 | + * @param $key The property key to check. |
| 171 | + */ |
| 172 | + public function isValidKey( $key ) { |
| 173 | + return in_array( $key, $this->validMembers ); |
| 174 | + } |
| 175 | + |
| 176 | + /** |
| 177 | + * Check if a property value is valid for that property |
| 178 | + * @param $key The key of the property to check. |
| 179 | + * @param $value The value to check |
| 180 | + * @return Boolean |
| 181 | + */ |
| 182 | + public function validatePropertyValue( $key, $value ) { |
| 183 | + if ( $key == 'user' ) { |
| 184 | + return $value instanceof User; |
| 185 | + } elseif ( $key == 'feedback' ) { |
| 186 | + if( $value <= 0 ) { |
| 187 | + return false; |
| 188 | + } |
| 189 | + if( !$this->setFeedbackItem($value) ) { |
| 190 | + return false; |
| 191 | + } |
| 192 | + return true; |
| 193 | + } elseif ( $key == 'feedbackitem' ) { |
| 194 | + return $value instanceof MBFeedbackItem; |
| 195 | + } elseif ( $key == 'response' ) { |
| 196 | + $comment_len = mb_strlen( $value ); |
| 197 | + return $comment_len > 0 && $comment_len <= 5000; |
| 198 | + } |
| 199 | + |
| 200 | + return true; |
| 201 | + } |
| 202 | + |
| 203 | + /** |
| 204 | + * Writes this MBFeedbackItem to the database. |
| 205 | + * Throws an exception if this it is already in the database. |
| 206 | + * @return The MBFeedbackItem's new ID. |
| 207 | + */ |
| 208 | + public function save() { |
| 209 | + |
| 210 | + $user = $this->getProperty('user'); |
| 211 | + |
| 212 | + // Add edit count if necessary |
| 213 | + if ( $this->getProperty('user-editcount') === null && $user !== null ) |
| 214 | + { |
| 215 | + $this->setProperty( 'user-editcount', $user->isAnon() ? 0 : $user->getEditCount() ); |
| 216 | + |
| 217 | + } |
| 218 | + |
| 219 | + if($this->getProperty('commenter-editcount') === null) { |
| 220 | + $commenter = $this->getProperty('feedbackitem')->getProperty('user'); |
| 221 | + $this->setProperty( 'commenter-editcount', $commenter->isAnon() ? 0 : $commenter->getEditCount() ); |
| 222 | + } |
| 223 | + |
| 224 | + $dbw = wfGetDB( DB_MASTER ); |
| 225 | + |
| 226 | + $row = array( |
| 227 | + 'mbfr_mbf_id' => $this->getProperty('feedback'), |
| 228 | + 'mbfr_commenter_editcount' => $this->getProperty('commenter-editcount'), |
| 229 | + 'mbfr_user_editcount' => $this->getProperty('user-editcount'), |
| 230 | + 'mbfr_response_text' => $this->getProperty('response'), |
| 231 | + 'mbfr_timestamp' => $dbw->timestamp($this->getProperty('timestamp')), |
| 232 | + 'mbfr_system_type' => $this->getProperty('system'), |
| 233 | + 'mbfr_user_agent' => $this->getProperty('useragent'), |
| 234 | + 'mbfr_locale' => $this->getProperty('locale'), |
| 235 | + 'mbfr_editing' => $this->getProperty('editmode') |
| 236 | + ); |
| 237 | + |
| 238 | + if($user->isAnon()) { |
| 239 | + $row['mbfr_user_id'] = 0; |
| 240 | + $row['mbfr_user_ip'] = $user->getName(); |
| 241 | + } |
| 242 | + else { |
| 243 | + $row['mbfr_user_id'] = $user->getId(); |
| 244 | + } |
| 245 | + |
| 246 | + if ( $this->getProperty('id') ) { |
| 247 | + $row['mbfr_id'] = $this->getProperty('id'); |
| 248 | + $dbw->replace( 'moodbar_feedback_response', array('mbfr_id'), $row, __METHOD__ ); |
| 249 | + } else { |
| 250 | + $row['mbfr_id'] = $dbw->nextSequenceValue( 'moodbar_feedback_response_mbfr_id' ); |
| 251 | + $dbw->insert( 'moodbar_feedback_response', $row, __METHOD__ ); |
| 252 | + $this->setProperty( 'id', $dbw->insertId() ); |
| 253 | + } |
| 254 | + |
| 255 | + return $this->getProperty('id'); |
| 256 | + } |
| 257 | + |
| 258 | + /** |
| 259 | + * Gets the valid types of a feedback item. |
| 260 | + */ |
| 261 | + public static function getValidTypes() { |
| 262 | + return self::$validTypes; |
| 263 | + } |
| 264 | + |
| 265 | + /** |
| 266 | + * Set the Feedback Item this Response is associated to |
| 267 | + * @param $mbf_id mbfr_mbf_id in moodbar_feedback_response table |
| 268 | + * @return bool |
| 269 | + */ |
| 270 | + protected function setFeedbackItem($mbf_id) { |
| 271 | + $dbr = wfGetDB( DB_SLAVE ); |
| 272 | + |
| 273 | + $row = $dbr->selectRow( 'moodbar_feedback', '*', |
| 274 | + array( 'mbf_id' => $mbf_id ), __METHOD__ ); |
| 275 | + |
| 276 | + if( $row !== false ) { |
| 277 | + $this->setProperties( array ( 'feedbackitem' => MBFeedbackItem::load( $row ) ) ); |
| 278 | + return true; |
| 279 | + } |
| 280 | + else { |
| 281 | + return false; |
| 282 | + } |
| 283 | + } |
| 284 | + |
| 285 | +} |
| 286 | + |
| 287 | +class MWFeedbackResponseItemPropertyException extends MWException {}; |
Property changes on: branches/wmf/1.18wmf1/extensions/MoodBar/FeedbackResponseItem.php |
___________________________________________________________________ |
Added: svn:eol-style |
1 | 288 | + native |
Index: branches/wmf/1.18wmf1/extensions/MoodBar/modules/jquery.moodBar/jquery.moodBar.js |
— | — | @@ -0,0 +1,53 @@ |
| 2 | +/** |
| 3 | + * jquery.moodbar.js |
| 4 | + * JavaScript interface for the MoodBar backend. |
| 5 | + * |
| 6 | + * @author Andrew Garrett |
| 7 | + */ |
| 8 | +( function( $ ) { |
| 9 | + $.moodBar = { |
| 10 | + /** |
| 11 | + * Submit a MoodBar feedback item. |
| 12 | + * @param fbProps Object: Properties for the FeedbackItem: |
| 13 | + * - comment: The comments submitted |
| 14 | + * - bucket: A bucket, for A/B testing. |
| 15 | + * - anonymize: Boolean, whether or not to mark as anonymous |
| 16 | + * - callback: A function, accepts a single 'fbProps' parameter, to call when the |
| 17 | + * request completes. |
| 18 | + * - type: A string. |
| 19 | + * @return jqXHR |
| 20 | + */ |
| 21 | + 'submit': function( fbProps ) { |
| 22 | + var clientData = $.client.profile(), |
| 23 | + fbProps = $.extend( { |
| 24 | + 'page': mw.config.get( 'wgPageName' ), |
| 25 | + 'editmode': mw.config.get( 'wgAction' ) == 'edit' ? 1 : 0 |
| 26 | + }, fbProps ), |
| 27 | + apiRequest = { |
| 28 | + 'action': 'moodbar', |
| 29 | + 'page': fbProps.page, |
| 30 | + 'comment': fbProps.comment, |
| 31 | + 'anonymize': fbProps.anonymize, |
| 32 | + 'useragent': clientData.name + '/' + clientData.versionNumber, |
| 33 | + 'system': clientData.platform, |
| 34 | + 'bucket': fbProps.bucket, |
| 35 | + 'type': fbProps.type, |
| 36 | + 'token': mw.config.get('mbEditToken'), |
| 37 | + 'format': 'json' |
| 38 | + }; |
| 39 | + |
| 40 | + // API treats any value as true. |
| 41 | + if ( fbProps.editmode ) { |
| 42 | + apiRequest.editmode = true; |
| 43 | + } |
| 44 | + |
| 45 | + return $.ajax( { |
| 46 | + type: 'post', |
| 47 | + url: mw.util.wikiScript( 'api' ), |
| 48 | + data: apiRequest, |
| 49 | + success: fbProps.callback, |
| 50 | + dataType: 'json' |
| 51 | + } ); |
| 52 | + } |
| 53 | + }; |
| 54 | +} ) ( jQuery ); |
Property changes on: branches/wmf/1.18wmf1/extensions/MoodBar/modules/jquery.moodBar/jquery.moodBar.js |
___________________________________________________________________ |
Added: svn:eol-style |
1 | 55 | + native |
Index: branches/wmf/1.18wmf1/extensions/MoodBar/modules/ext.moodBar/ext.moodBar.init.js |
— | — | @@ -0,0 +1,72 @@ |
| 2 | +/** |
| 3 | + * Initialization script for the MoodBar MediaWiki extension |
| 4 | + * |
| 5 | + * @author Timo Tijhof, 2011 |
| 6 | + */ |
| 7 | +( function( $ ) { |
| 8 | + |
| 9 | + var mb = mw.moodBar = { |
| 10 | + |
| 11 | + conf: mw.config.get( 'mbConfig' ), |
| 12 | + |
| 13 | + cookiePrefix: function() { |
| 14 | + return 'ext.moodBar@' + mb.conf.bucketConfig.version + '-'; |
| 15 | + }, |
| 16 | + |
| 17 | + isDisabled: function() { |
| 18 | + var cookieDisabled = ($.cookie( mb.cookiePrefix() + 'disabled' ) == '1'); |
| 19 | + var browserDisabled = false; |
| 20 | + var clientInfo = $.client.profile(); |
| 21 | + |
| 22 | + if ( clientInfo.name == 'msie' && clientInfo.versionNumber < 7 ) { |
| 23 | + browserDisabled = true; |
| 24 | + } |
| 25 | + |
| 26 | + return cookieDisabled || browserDisabled; |
| 27 | + }, |
| 28 | + |
| 29 | + ui: { |
| 30 | + // jQuery objects |
| 31 | + pMoodbar: null, |
| 32 | + trigger: null, |
| 33 | + overlay: null |
| 34 | + }, |
| 35 | + |
| 36 | + init: function() { |
| 37 | + var ui = mb.ui; |
| 38 | + |
| 39 | + mb.conf.bucketKey = mw.user.bucket( |
| 40 | + 'moodbar-trigger', |
| 41 | + mb.conf.bucketConfig |
| 42 | + ); |
| 43 | + |
| 44 | + // Create portlet |
| 45 | + ui.pMoodbar = $( '<div id="p-moodbar"></div>' ); |
| 46 | + |
| 47 | + // Create trigger |
| 48 | + ui.trigger = $( '<a>' ) |
| 49 | + .attr( 'href', '#' ) |
| 50 | + .attr( 'title', mw.msg( 'tooltip-p-moodbar-trigger-' + mb.conf.bucketKey ) ) |
| 51 | + .text( mw.msg( 'moodbar-trigger-' + mb.conf.bucketKey, mw.config.get( 'wgSiteName' ) ) ); |
| 52 | + |
| 53 | + // Insert trigger into portlet |
| 54 | + ui.trigger |
| 55 | + .wrap( '<p>' ) |
| 56 | + .parent() |
| 57 | + .appendTo( ui.pMoodbar ); |
| 58 | + |
| 59 | + // Inject portlet into document, when document is ready |
| 60 | + $( mb.inject ); |
| 61 | + }, |
| 62 | + |
| 63 | + inject: function() { |
| 64 | + $( '#mw-head' ).append( mb.ui.pMoodbar ); |
| 65 | + } |
| 66 | + |
| 67 | + }; |
| 68 | + |
| 69 | + if ( !mb.isDisabled() ) { |
| 70 | + mb.init(); |
| 71 | + } |
| 72 | + |
| 73 | +} )( jQuery ); |
Property changes on: branches/wmf/1.18wmf1/extensions/MoodBar/modules/ext.moodBar/ext.moodBar.init.js |
___________________________________________________________________ |
Added: svn:eol-style |
1 | 74 | + native |
Index: branches/wmf/1.18wmf1/extensions/MoodBar/modules/ext.moodBar/ext.moodBar.core.css |
— | — | @@ -0,0 +1,199 @@ |
| 2 | +/* Overlay styling */ |
| 3 | +#mw-moodBar-overlayWrap { |
| 4 | + position: absolute; |
| 5 | + top: 3.5em; |
| 6 | + left: 10.2em; |
| 7 | + min-width: 100px; |
| 8 | + min-height: 100px; |
| 9 | + background: #fafafa; |
| 10 | + border: 1px solid #0645ad; |
| 11 | + -moz-border-radius: 40px; |
| 12 | + -webkit-border-radius: 40px; |
| 13 | + border-radius: 40px; |
| 14 | + box-shadow: 7px 7px 15px rgba(0, 0, 0, 0.5); |
| 15 | + display: none; |
| 16 | +} |
| 17 | + |
| 18 | +#mw-moodBar-overlay { |
| 19 | + margin: 22px 22px; |
| 20 | + position: relative; |
| 21 | +} |
| 22 | + |
| 23 | +#mw-moodBar-pokey { |
| 24 | + position: absolute; |
| 25 | + top: -59px; |
| 26 | + left: 14px; |
| 27 | + /* @embed */ |
| 28 | + background: transparent url(images/pokey.png) center top no-repeat; |
| 29 | + width: 49px; |
| 30 | + height: 37px; |
| 31 | +} |
| 32 | + |
| 33 | +.mw-moodBar-overlayTitle { |
| 34 | + font-size: 16px; |
| 35 | + white-space: nowrap; |
| 36 | +} |
| 37 | + |
| 38 | +.mw-moodBar-overlayClose { |
| 39 | + float: right; |
| 40 | + font-size: 10px; |
| 41 | +} |
| 42 | + |
| 43 | +.mw-moodBar-types { |
| 44 | + margin: 0 auto; |
| 45 | + width: auto; |
| 46 | + display: inline-block; |
| 47 | +/* display: inline;*/ |
| 48 | +} |
| 49 | + |
| 50 | +.mw-moodBar-type { |
| 51 | + min-width: 42px; |
| 52 | + margin: 15px; |
| 53 | + padding: 42px 0 5px 0; |
| 54 | + /* @embed */ |
| 55 | + background: transparent url(images/type-unknown.png) center top no-repeat; |
| 56 | + display: inline-block; |
| 57 | + /*display: inline;*/ |
| 58 | +} |
| 59 | + |
| 60 | +.mw-moodBar-types-container { |
| 61 | + text-align: center; |
| 62 | +} |
| 63 | + |
| 64 | +.mw-moodBar-type { |
| 65 | + cursor: pointer; |
| 66 | +} |
| 67 | + |
| 68 | +.mw-moodBar-typeTitle, |
| 69 | +.mw-moodBar-privacy, |
| 70 | +.mw-moodBar-overlayWhat { |
| 71 | + font-size: 12px; |
| 72 | +} |
| 73 | + |
| 74 | + |
| 75 | +.mw-moodBar-overlayWhatContent { |
| 76 | + display: none; |
| 77 | + overflow: hidden; |
| 78 | +} |
| 79 | + |
| 80 | +.mw-moodBar-form { |
| 81 | + overflow: hidden; |
| 82 | +} |
| 83 | + |
| 84 | +.mw-moodBar-formNote { |
| 85 | + float: right; |
| 86 | + font-size: 10px; |
| 87 | + color: #7e7e7e; |
| 88 | +} |
| 89 | + |
| 90 | +.mw-moodBar-formTitle { |
| 91 | + font-size: 16px; |
| 92 | +} |
| 93 | + |
| 94 | +.mw-moodBar-formInput { |
| 95 | + width: 100%; |
| 96 | + outline: none; |
| 97 | +} |
| 98 | + |
| 99 | +.mw-moodBar-privacy, |
| 100 | +.mw-moodBar-overlayWhatContent { |
| 101 | + font-size: 10px; |
| 102 | +} |
| 103 | + |
| 104 | +.mw-moodBar-formSubmit { |
| 105 | + float: right; |
| 106 | +} |
| 107 | + |
| 108 | +.mw-moodBar-form { |
| 109 | + padding-right: 5px; |
| 110 | +} |
| 111 | +.mw-moodBar-formInputs { |
| 112 | + padding-left: 1em; |
| 113 | +} |
| 114 | + |
| 115 | +.mw-moodBar-state-loading { |
| 116 | + /* @embed */ |
| 117 | + background: url(images/ajax-spinner.gif) left center no-repeat; |
| 118 | + padding: 20px 0 0 90px; |
| 119 | + height: 77px; |
| 120 | +} |
| 121 | + |
| 122 | +.mw-moodBar-state-title { |
| 123 | + font-weight: bold; |
| 124 | + font-size: 25px; |
| 125 | +} |
| 126 | + |
| 127 | +.mw-moodBar-state-subtitle { |
| 128 | + font-size: 14px; |
| 129 | + color: #7e7e7e; |
| 130 | +} |
| 131 | + |
| 132 | +/** |
| 133 | + * Types |
| 134 | + */ |
| 135 | + |
| 136 | +/* Happy */ |
| 137 | +.mw-moodBar-types .mw-moodBar-type-happy { |
| 138 | + /* @embed */ |
| 139 | + background-image: url(images/type-happy-normal.png); |
| 140 | +} |
| 141 | +.mw-moodBar-types-hover .mw-moodBar-type-happy { |
| 142 | + /* @embed */ |
| 143 | + background-image: url(images/type-happy-hoverside.png); |
| 144 | +} |
| 145 | +.mw-moodBar-types-hover .mw-moodBar-type-happy:hover { |
| 146 | + /* @embed */ |
| 147 | + background-image: url(images/type-happy-hovered.png); |
| 148 | +} |
| 149 | +.mw-moodBar-types-select .mw-moodBar-type-happy { |
| 150 | + /* @embed */ |
| 151 | + background-image: url(images/type-happy-dull.png); |
| 152 | +} |
| 153 | +.mw-moodBar-types-select .mw-moodBar-type-happy.mw-moodBar-happy-selected { |
| 154 | + /* @embed */ |
| 155 | + background-image: url(images/type-happy-selected.png); |
| 156 | +} |
| 157 | + |
| 158 | +/* Sad */ |
| 159 | +.mw-moodBar-types .mw-moodBar-type-sad { |
| 160 | + /* @embed */ |
| 161 | + background-image: url(images/type-sad-normal.png); |
| 162 | +} |
| 163 | +.mw-moodBar-types-hover .mw-moodBar-type-sad { |
| 164 | + /* @embed */ |
| 165 | + background-image: url(images/type-sad-hoverside.png); |
| 166 | +} |
| 167 | +.mw-moodBar-types-hover .mw-moodBar-type-sad:hover { |
| 168 | + /* @embed */ |
| 169 | + background-image: url(images/type-sad-hovered.png); |
| 170 | +} |
| 171 | +.mw-moodBar-types-select .mw-moodBar-type-sad { |
| 172 | + /* @embed */ |
| 173 | + background-image: url(images/type-sad-dull.png); |
| 174 | +} |
| 175 | +.mw-moodBar-types-select .mw-moodBar-type-sad.mw-moodBar-sad-selected { |
| 176 | + /* @embed */ |
| 177 | + background-image: url(images/type-sad-selected.png); |
| 178 | +} |
| 179 | + |
| 180 | +/* Confused */ |
| 181 | +.mw-moodBar-types .mw-moodBar-type-confused { |
| 182 | + /* @embed */ |
| 183 | + background-image: url(images/type-confused-normal.png); |
| 184 | +} |
| 185 | +.mw-moodBar-types-hover .mw-moodBar-type-confused { |
| 186 | + /* @embed */ |
| 187 | + background-image: url(images/type-confused-hoverside.png); |
| 188 | +} |
| 189 | +.mw-moodBar-types-hover .mw-moodBar-type-confused:hover { |
| 190 | + /* @embed */ |
| 191 | + background-image: url(images/type-confused-hovered.png); |
| 192 | +} |
| 193 | +.mw-moodBar-types-select .mw-moodBar-type-confused { |
| 194 | + /* @embed */ |
| 195 | + background-image: url(images/type-confused-dull.png); |
| 196 | +} |
| 197 | +.mw-moodBar-types-select .mw-moodBar-type-confused.mw-moodBar-confused-selected { |
| 198 | + /* @embed */ |
| 199 | + background-image: url(images/type-confused-selected.png); |
| 200 | +} |
Property changes on: branches/wmf/1.18wmf1/extensions/MoodBar/modules/ext.moodBar/ext.moodBar.core.css |
___________________________________________________________________ |
Added: svn:eol-style |
1 | 201 | + native |
Index: branches/wmf/1.18wmf1/extensions/MoodBar/modules/ext.moodBar/ext.moodBar.core.js |
— | — | @@ -0,0 +1,329 @@ |
| 2 | +/** |
| 3 | + * Front-end scripting core for the MoodBar MediaWiki extension |
| 4 | + * |
| 5 | + * @author Timo Tijhof, 2011 |
| 6 | + */ |
| 7 | +( function( $ ) { |
| 8 | + |
| 9 | + var mb = mw.moodBar; |
| 10 | + $.extend( mb, { |
| 11 | + |
| 12 | + tpl: { |
| 13 | + overlayBase: '\ |
| 14 | + <div id="mw-moodBar-overlayWrap"><div id="mw-moodBar-overlay">\ |
| 15 | + <div id="mw-moodBar-pokey"></div>\ |
| 16 | + <span class="mw-moodBar-overlayClose"><a href="#"><html:msg key="moodbar-close" /></a></span>\ |
| 17 | + <div class="mw-moodBar-overlayContent"></div>\ |
| 18 | + </div></div>', |
| 19 | + userinput: '\ |
| 20 | + <div class="mw-moodBar-overlayTitle"><span><html:msg key="INTROTITLE" /></span></div>\ |
| 21 | + <div class="mw-moodBar-types-container">\ |
| 22 | + <div class="mw-moodBar-types"></div>\ |
| 23 | + </div>\ |
| 24 | + <div class="mw-moodBar-form">\ |
| 25 | + <div class="mw-moodBar-formTitle">\ |
| 26 | + <span class="mw-moodBar-formNote"><span id="mw-moodBar-charCount"></span><html:msg key="moodbar-form-note-dynamic" /></span>\ |
| 27 | + <html:msg key="moodbar-form-title" />\ |
| 28 | + </div>\ |
| 29 | + <div class="mw-moodBar-formInputs">\ |
| 30 | + <textarea rows="3" maxlength="140" id="mw-moodBar-feedbackInput" class="mw-moodBar-formInput" /></textarea>\ |
| 31 | + <div class="mw-moodBar-privacy"></div>\ |
| 32 | + <input type="button" class="mw-moodBar-formSubmit" disabled="disabled" />\ |
| 33 | + </div>\ |
| 34 | + </div>\ |
| 35 | + <span class="mw-moodBar-overlayWhat">\ |
| 36 | + <a href="#" title-msg="tooltip-moodbar-what">\ |
| 37 | + <span class="mw-moodBar-overlayWhatTrigger"></span>\ |
| 38 | + <span class="mw-moodBar-overlayWhatLabel"><html:msg key="moodbar-what-label" /></span>\ |
| 39 | + </a>\ |
| 40 | + <div class="mw-moodBar-overlayWhatContent"></div>\ |
| 41 | + </span>', |
| 42 | + type: '\ |
| 43 | + <span class="mw-moodBar-type mw-moodBar-type-$1" rel="$1">\ |
| 44 | + <span class="mw-moodBar-typeTitle"><html:msg key="moodbar-type-$1-title" /></span>\ |
| 45 | + </span>', |
| 46 | + loading: '\ |
| 47 | + <div class="mw-moodBar-state mw-moodBar-state-loading">\ |
| 48 | + <div class="mw-moodBar-state-title"><html:msg key="moodbar-loading-title" /></div>\ |
| 49 | + <div class="mw-moodBar-state-subtitle"><html:msg key="moodbar-loading-subtitle" /></div>\ |
| 50 | + </div>', |
| 51 | + success: '\ |
| 52 | + <div class="mw-moodBar-state mw-moodBar-state-success">\ |
| 53 | + <div class="mw-moodBar-state-title"><html:msg key="moodbar-success-title" /></div>\ |
| 54 | + <div class="mw-moodBar-state-subtitle"><html:msg key="moodbar-success-subtitle" /></div>\ |
| 55 | + </div>', |
| 56 | + error: '\ |
| 57 | + <div class="mw-moodBar-state mw-moodBar-state-error">\ |
| 58 | + <div class="mw-moodBar-state-title"><html:msg key="moodbar-error-title" /></div>\ |
| 59 | + <div class="mw-moodBar-state-subtitle"><html:msg key="moodbar-error-subtitle" /></div>\ |
| 60 | + </div>' |
| 61 | + }, |
| 62 | + |
| 63 | + event: { |
| 64 | + trigger: function( e ) { |
| 65 | + e.preventDefault(); |
| 66 | + if ( mb.ui.overlay.is( ':hidden' ) ) { |
| 67 | + mb.swapContent( mb.tpl.userinput ); |
| 68 | + mb.ui.overlay.show(); |
| 69 | + } else { |
| 70 | + mb.ui.overlay.hide(); |
| 71 | + } |
| 72 | + }, |
| 73 | + |
| 74 | + disable: function( e ) { |
| 75 | + e.preventDefault(); |
| 76 | + $.cookie( |
| 77 | + mb.cookiePrefix() + 'disabled', |
| 78 | + '1', |
| 79 | + { 'path': '/', 'expires': Number( mb.conf.disableExpiration ) } |
| 80 | + ); |
| 81 | + mb.ui.overlay.fadeOut( 'fast' ); |
| 82 | + mb.ui.trigger.fadeOut( 'fast' ); |
| 83 | + } |
| 84 | + }, |
| 85 | + |
| 86 | + feedbackItem: { |
| 87 | + comment: '', |
| 88 | + bucket: mb.conf.bucketKey, |
| 89 | + type: 'unknown', |
| 90 | + callback: function( data ) { |
| 91 | + if ( data && data.moodbar && data.moodbar.result === 'success' ) { |
| 92 | + mb.swapContent( mb.tpl.success ); |
| 93 | + setTimeout( function() { |
| 94 | + mb.ui.overlay.fadeOut(); |
| 95 | + }, 3000 ); |
| 96 | + } else { |
| 97 | + mb.swapContent( mb.tpl.error ); |
| 98 | + } |
| 99 | + } |
| 100 | + }, |
| 101 | + |
| 102 | + prepareUserinputContent: function( overlay ) { |
| 103 | + overlay |
| 104 | + // Populate type selector |
| 105 | + .find( '.mw-moodBar-types' ) |
| 106 | + .append( function() { |
| 107 | + var $mwMoodBarTypes = $( this ), |
| 108 | + elems = []; |
| 109 | + $.each( mb.conf.validTypes, function( id, type ) { |
| 110 | + elems.push( |
| 111 | + $( mb.tpl.type.replace( /\$1/g, type ) ) |
| 112 | + .localize() |
| 113 | + .click( function( e ) { |
| 114 | + var $el = $( this ); |
| 115 | + mb.ui.overlay.find( '.mw-moodBar-formInput' ).focus(); |
| 116 | + $mwMoodBarTypes.addClass( 'mw-moodBar-types-select' ); |
| 117 | + mb.feedbackItem.type = $el.attr( 'rel' ); |
| 118 | + $el.addClass( 'mw-moodBar-selected' ) |
| 119 | + .addClass( 'mw-moodBar-' + mb.feedbackItem.type + '-selected' ); |
| 120 | + $el.parent() |
| 121 | + .find( '.mw-moodBar-selected' ) |
| 122 | + .not( $el ) |
| 123 | + .removeClass( 'mw-moodBar-selected' ) |
| 124 | + .removeClass( 'mw-moodBar-happy-selected' ) |
| 125 | + .removeClass( 'mw-moodBar-sad-selected' ) |
| 126 | + .removeClass( 'mw-moodBar-confused-selected' ); |
| 127 | + mb.validate(); |
| 128 | + } ) |
| 129 | + .get( 0 ) |
| 130 | + ); |
| 131 | + } ); |
| 132 | + return elems; |
| 133 | + } ) |
| 134 | + .hover( function() { |
| 135 | + $( this ).addClass( 'mw-moodBar-types-hover' ); |
| 136 | + }, function() { |
| 137 | + $( this ).removeClass( 'mw-moodBar-types-hover' ); |
| 138 | + } ) |
| 139 | + .end() |
| 140 | + // Link what-button |
| 141 | + .find( '.mw-moodBar-overlayWhatTrigger' ) |
| 142 | + .text( mw.msg( 'moodbar-what-collapsed' ) ) |
| 143 | + .end() |
| 144 | + .find( '.mw-moodBar-overlayWhat > a' ) |
| 145 | + .click( function( e ) { |
| 146 | + e.preventDefault(); |
| 147 | + mb.ui.overlay |
| 148 | + .find( '.mw-moodBar-overlayWhatContent' ) |
| 149 | + .each( function() { |
| 150 | + var $el = $( this ), |
| 151 | + $trigger = mb.ui.overlay.find( '.mw-moodBar-overlayWhatTrigger' ); |
| 152 | + if ( $el.is( ':visible' ) ) { |
| 153 | + $el.slideUp( 'fast' ); |
| 154 | + $trigger.html( mw.msg( 'moodbar-what-collapsed' ) ); |
| 155 | + } else { |
| 156 | + $el.slideDown( 'fast' ); |
| 157 | + $trigger.html( mw.msg( 'moodbar-what-expanded' ) ); |
| 158 | + } |
| 159 | + } ); |
| 160 | + } ) |
| 161 | + .end() |
| 162 | + .find( '.mw-moodBar-overlayWhatContent' ) |
| 163 | + .html( |
| 164 | + function() { |
| 165 | + var message, linkMessage, link, |
| 166 | + disableMsg, disableLink, out; |
| 167 | + |
| 168 | + message = mw.msg( 'moodbar-what-content' ); |
| 169 | + linkMessage = mw.msg( 'moodbar-what-link' ); |
| 170 | + link = mw.html.element( 'a', { |
| 171 | + 'href': mb.conf.infoUrl, |
| 172 | + 'title': linkMessage |
| 173 | + }, linkMessage ); |
| 174 | + |
| 175 | + out = mw.html.escape( message ) |
| 176 | + .replace( /\$1/, link ); |
| 177 | + out = mw.html.element( 'p', {}, |
| 178 | + new mw.html.Raw( out ) |
| 179 | + ); |
| 180 | + |
| 181 | + disableMsg = mw.msg( 'moodbar-disable-link' ); |
| 182 | + disableLink = mw.html.element( 'a', { |
| 183 | + 'href' : '#', |
| 184 | + 'class' : 'mw-moodBar-disable' |
| 185 | + }, disableMsg ); |
| 186 | + |
| 187 | + out += mw.html.element( 'p', {}, |
| 188 | + new mw.html.Raw( disableLink ) |
| 189 | + ); |
| 190 | + |
| 191 | + return out; |
| 192 | + } |
| 193 | + ) |
| 194 | + .find('.mw-moodBar-disable') |
| 195 | + .click( mb.event.disable ) |
| 196 | + .end() |
| 197 | + .end() |
| 198 | + .find( '.mw-moodBar-privacy' ) |
| 199 | + .html( |
| 200 | + function() { |
| 201 | + var message, linkMessage, link; |
| 202 | + |
| 203 | + message = mw.msg( 'moodbar-privacy' ); |
| 204 | + linkMessage = mw.msg( 'moodbar-privacy-link' ); |
| 205 | + link = mw.html.element( 'a', { |
| 206 | + 'href': mb.conf.privacyUrl, |
| 207 | + 'title': linkMessage |
| 208 | + }, linkMessage ); |
| 209 | + |
| 210 | + return mw.html.escape( message ) |
| 211 | + .replace( /\$1/, link ); |
| 212 | + } |
| 213 | + ) |
| 214 | + .end() |
| 215 | + // set up character count |
| 216 | + .find( '.mw-moodBar-formNote' ) |
| 217 | + .html( |
| 218 | + function() { |
| 219 | + var message, counterElement; |
| 220 | + message = mw.msg( 'moodbar-form-note-dynamic' ); |
| 221 | + counterElement = mw.html.element( 'span', { |
| 222 | + 'id': 'mw-moodBar-charCount' |
| 223 | + } ); |
| 224 | + return mw.html.escape( message ) |
| 225 | + .replace( /\$1/, counterElement ); |
| 226 | + } |
| 227 | + ) |
| 228 | + .end() |
| 229 | + |
| 230 | + |
| 231 | + // Submit |
| 232 | + .find( '.mw-moodBar-formSubmit' ) |
| 233 | + .val( mw.msg( 'moodbar-form-submit' ) ) |
| 234 | + .click( function() { |
| 235 | + mb.feedbackItem.comment = mb.ui.overlay.find( '.mw-moodBar-formInput' ).val(); |
| 236 | + if(mb.feedbackItem.comment){ |
| 237 | + mb.swapContent( mb.tpl.loading ); |
| 238 | + $.moodBar.submit( mb.feedbackItem ); |
| 239 | + } |
| 240 | + } ) |
| 241 | + .end() |
| 242 | + |
| 243 | + // Keypress |
| 244 | + .find( '#mw-moodBar-feedbackInput' ) |
| 245 | + .keyup( function(event) { |
| 246 | + mb.validate(); |
| 247 | + }) |
| 248 | + .end(); |
| 249 | + |
| 250 | + // Set up character counter |
| 251 | + // This is probably not the right way to do this. |
| 252 | + $( '#mw-moodBar-feedbackInput' ).NobleCount('#mw-moodBar-charCount', {max_chars:140}); |
| 253 | + |
| 254 | + }, |
| 255 | + |
| 256 | + core: function() { |
| 257 | + |
| 258 | + // Create overlay |
| 259 | + mb.ui.overlay = $( mb.tpl.overlayBase ) |
| 260 | + .localize() |
| 261 | + // Bind close-toggle |
| 262 | + .find( '.mw-moodBar-overlayClose' ) |
| 263 | + .click( mb.event.trigger ) |
| 264 | + .end(); |
| 265 | + mb.swapContent( mb.tpl.userinput ); |
| 266 | + |
| 267 | + mb.ui.overlay.appendTo( 'body' ); |
| 268 | + mb.ui.overlay.show(); |
| 269 | + |
| 270 | + // Get the width of the types element, and add 100px |
| 271 | + // 52px in known margins, 58px seems to be a necessary |
| 272 | + // fudge factor, plus 30px so the close button doesn't collide |
| 273 | + // with the rounded corners |
| 274 | + var newWidth = mb.ui.overlay |
| 275 | + .find('.mw-moodBar-types') |
| 276 | + .width() + 140; |
| 277 | + var titleWidth = mb.ui.overlay |
| 278 | + .find('.mw-moodBar-overlayTitle span') |
| 279 | + .width() + 100; |
| 280 | + |
| 281 | + if ( newWidth < titleWidth ) { |
| 282 | + newWidth = titleWidth; |
| 283 | + } |
| 284 | + |
| 285 | + mb.ui.overlay.width(newWidth); |
| 286 | + mb.ui.overlay.hide(); |
| 287 | + |
| 288 | + // Bind triger |
| 289 | + mb.ui.trigger.click( mb.event.trigger ); |
| 290 | + }, |
| 291 | + |
| 292 | + swapContent: function( tpl ) { |
| 293 | + var sitenameParams = [mw.config.get( 'wgSiteName' )], // Cache common params |
| 294 | + msgOptions = { |
| 295 | + keys: { |
| 296 | + INTROTITLE: 'moodbar-intro-' + mb.conf.bucketKey |
| 297 | + }, |
| 298 | + params: { |
| 299 | + INTROTITLE: sitenameParams, |
| 300 | + 'moodbar-loading-subtitle': sitenameParams, |
| 301 | + 'moodbar-success-subtitle': sitenameParams, |
| 302 | + 'moodbar-error-subtitle': sitenameParams |
| 303 | + } |
| 304 | + }; |
| 305 | + |
| 306 | + mb.ui.overlay |
| 307 | + .find( '.mw-moodBar-overlayContent' ) |
| 308 | + .html( tpl ) |
| 309 | + .localize( msgOptions ); |
| 310 | + |
| 311 | + if ( tpl == mb.tpl.userinput ) { |
| 312 | + mb.prepareUserinputContent( mb.ui.overlay ); |
| 313 | + } |
| 314 | + return true; |
| 315 | + }, |
| 316 | + |
| 317 | + validate: function() { |
| 318 | + if( $( '#mw-moodBar-feedbackInput' ).val() !== "" && $( '.mw-moodBar-selected').length ) { |
| 319 | + mb.ui.overlay.find( '.mw-moodBar-formSubmit').removeAttr('disabled'); |
| 320 | + } else { |
| 321 | + mb.ui.overlay.find( '.mw-moodBar-formSubmit').attr({'disabled':'true'}); |
| 322 | + } |
| 323 | + } |
| 324 | + } ); |
| 325 | + |
| 326 | + if ( !mb.isDisabled() ) { |
| 327 | + mb.core(); |
| 328 | + } |
| 329 | + |
| 330 | +} )( jQuery ); |
Property changes on: branches/wmf/1.18wmf1/extensions/MoodBar/modules/ext.moodBar/ext.moodBar.core.js |
___________________________________________________________________ |
Added: svn:eol-style |
1 | 331 | + native |
Index: branches/wmf/1.18wmf1/extensions/MoodBar/modules/ext.moodBar/images/icon-speechbubble-blue.png |
Cannot display: file marked as a binary type. |
svn:mime-type = image/png |
Property changes on: branches/wmf/1.18wmf1/extensions/MoodBar/modules/ext.moodBar/images/icon-speechbubble-blue.png |
___________________________________________________________________ |
Added: svn:mime-type |
2 | 332 | + image/png |
Index: branches/wmf/1.18wmf1/extensions/MoodBar/modules/ext.moodBar/images/type-happy-dull.png |
Cannot display: file marked as a binary type. |
svn:mime-type = image/png |
Property changes on: branches/wmf/1.18wmf1/extensions/MoodBar/modules/ext.moodBar/images/type-happy-dull.png |
___________________________________________________________________ |
Added: svn:mime-type |
3 | 333 | + image/png |
Index: branches/wmf/1.18wmf1/extensions/MoodBar/modules/ext.moodBar/images/speechbubble-icon-rndrectangle-blue.png |
Cannot display: file marked as a binary type. |
svn:mime-type = image/png |
Property changes on: branches/wmf/1.18wmf1/extensions/MoodBar/modules/ext.moodBar/images/speechbubble-icon-rndrectangle-blue.png |
___________________________________________________________________ |
Added: svn:mime-type |
4 | 334 | + image/png |
Index: branches/wmf/1.18wmf1/extensions/MoodBar/modules/ext.moodBar/images/type-confused-hoverside.png |
Cannot display: file marked as a binary type. |
svn:mime-type = image/png |
Property changes on: branches/wmf/1.18wmf1/extensions/MoodBar/modules/ext.moodBar/images/type-confused-hoverside.png |
___________________________________________________________________ |
Added: svn:mime-type |
5 | 335 | + image/png |
Index: branches/wmf/1.18wmf1/extensions/MoodBar/modules/ext.moodBar/images/type-confused-normal.png |
Cannot display: file marked as a binary type. |
svn:mime-type = image/png |
Property changes on: branches/wmf/1.18wmf1/extensions/MoodBar/modules/ext.moodBar/images/type-confused-normal.png |
___________________________________________________________________ |
Added: svn:mime-type |
6 | 336 | + image/png |
Index: branches/wmf/1.18wmf1/extensions/MoodBar/modules/ext.moodBar/images/type-confused-selected.png |
Cannot display: file marked as a binary type. |
svn:mime-type = image/png |
Property changes on: branches/wmf/1.18wmf1/extensions/MoodBar/modules/ext.moodBar/images/type-confused-selected.png |
___________________________________________________________________ |
Added: svn:mime-type |
7 | 337 | + image/png |
Index: branches/wmf/1.18wmf1/extensions/MoodBar/modules/ext.moodBar/images/type-sad-selected.png |
Cannot display: file marked as a binary type. |
svn:mime-type = image/png |
Property changes on: branches/wmf/1.18wmf1/extensions/MoodBar/modules/ext.moodBar/images/type-sad-selected.png |
___________________________________________________________________ |
Added: svn:mime-type |
8 | 338 | + image/png |
Index: branches/wmf/1.18wmf1/extensions/MoodBar/modules/ext.moodBar/images/type-sad-normal.png |
Cannot display: file marked as a binary type. |
svn:mime-type = image/png |
Property changes on: branches/wmf/1.18wmf1/extensions/MoodBar/modules/ext.moodBar/images/type-sad-normal.png |
___________________________________________________________________ |
Added: svn:mime-type |
9 | 339 | + image/png |
Index: branches/wmf/1.18wmf1/extensions/MoodBar/modules/ext.moodBar/images/type-sad-hoverside.png |
Cannot display: file marked as a binary type. |
svn:mime-type = image/png |
Property changes on: branches/wmf/1.18wmf1/extensions/MoodBar/modules/ext.moodBar/images/type-sad-hoverside.png |
___________________________________________________________________ |
Added: svn:mime-type |
10 | 340 | + image/png |
Index: branches/wmf/1.18wmf1/extensions/MoodBar/modules/ext.moodBar/images/type-confused-hovered.png |
Cannot display: file marked as a binary type. |
svn:mime-type = image/png |
Property changes on: branches/wmf/1.18wmf1/extensions/MoodBar/modules/ext.moodBar/images/type-confused-hovered.png |
___________________________________________________________________ |
Added: svn:mime-type |
11 | 341 | + image/png |
Index: branches/wmf/1.18wmf1/extensions/MoodBar/modules/ext.moodBar/images/type-sad-hovered.png |
Cannot display: file marked as a binary type. |
svn:mime-type = image/png |
Property changes on: branches/wmf/1.18wmf1/extensions/MoodBar/modules/ext.moodBar/images/type-sad-hovered.png |
___________________________________________________________________ |
Added: svn:mime-type |
12 | 342 | + image/png |
Index: branches/wmf/1.18wmf1/extensions/MoodBar/modules/ext.moodBar/images/ajax-spinner.gif |
Cannot display: file marked as a binary type. |
svn:mime-type = image/gif |
Property changes on: branches/wmf/1.18wmf1/extensions/MoodBar/modules/ext.moodBar/images/ajax-spinner.gif |
___________________________________________________________________ |
Added: svn:mime-type |
13 | 343 | + image/gif |
Index: branches/wmf/1.18wmf1/extensions/MoodBar/modules/ext.moodBar/images/type-confused-dull.png |
Cannot display: file marked as a binary type. |
svn:mime-type = image/png |
Property changes on: branches/wmf/1.18wmf1/extensions/MoodBar/modules/ext.moodBar/images/type-confused-dull.png |
___________________________________________________________________ |
Added: svn:mime-type |
14 | 344 | + image/png |
Index: branches/wmf/1.18wmf1/extensions/MoodBar/modules/ext.moodBar/images/type-sad-dull.png |
Cannot display: file marked as a binary type. |
svn:mime-type = image/png |
Property changes on: branches/wmf/1.18wmf1/extensions/MoodBar/modules/ext.moodBar/images/type-sad-dull.png |
___________________________________________________________________ |
Added: svn:mime-type |
15 | 345 | + image/png |
Index: branches/wmf/1.18wmf1/extensions/MoodBar/modules/ext.moodBar/images/type-happy-normal.png |
Cannot display: file marked as a binary type. |
svn:mime-type = image/png |
Property changes on: branches/wmf/1.18wmf1/extensions/MoodBar/modules/ext.moodBar/images/type-happy-normal.png |
___________________________________________________________________ |
Added: svn:mime-type |
16 | 346 | + image/png |
Index: branches/wmf/1.18wmf1/extensions/MoodBar/modules/ext.moodBar/images/type-happy-selected.png |
Cannot display: file marked as a binary type. |
svn:mime-type = image/png |
Property changes on: branches/wmf/1.18wmf1/extensions/MoodBar/modules/ext.moodBar/images/type-happy-selected.png |
___________________________________________________________________ |
Added: svn:mime-type |
17 | 347 | + image/png |
Index: branches/wmf/1.18wmf1/extensions/MoodBar/modules/ext.moodBar/images/type-happy-hoverside.png |
Cannot display: file marked as a binary type. |
svn:mime-type = image/png |
Property changes on: branches/wmf/1.18wmf1/extensions/MoodBar/modules/ext.moodBar/images/type-happy-hoverside.png |
___________________________________________________________________ |
Added: svn:mime-type |
18 | 348 | + image/png |
Index: branches/wmf/1.18wmf1/extensions/MoodBar/modules/ext.moodBar/images/pokey.png |
Cannot display: file marked as a binary type. |
svn:mime-type = image/png |
Property changes on: branches/wmf/1.18wmf1/extensions/MoodBar/modules/ext.moodBar/images/pokey.png |
___________________________________________________________________ |
Added: svn:mime-type |
19 | 349 | + image/png |
Index: branches/wmf/1.18wmf1/extensions/MoodBar/modules/ext.moodBar/images/speechbubble-icon-ellipse-blue.png |
Cannot display: file marked as a binary type. |
svn:mime-type = image/png |
Property changes on: branches/wmf/1.18wmf1/extensions/MoodBar/modules/ext.moodBar/images/speechbubble-icon-ellipse-blue.png |
___________________________________________________________________ |
Added: svn:mime-type |
20 | 350 | + image/png |
Index: branches/wmf/1.18wmf1/extensions/MoodBar/modules/ext.moodBar/images/type-happy-hovered.png |
Cannot display: file marked as a binary type. |
svn:mime-type = image/png |
Property changes on: branches/wmf/1.18wmf1/extensions/MoodBar/modules/ext.moodBar/images/type-happy-hovered.png |
___________________________________________________________________ |
Added: svn:mime-type |
21 | 351 | + image/png |
Index: branches/wmf/1.18wmf1/extensions/MoodBar/modules/ext.moodBar/ext.moodBar.init.css |
— | — | @@ -0,0 +1,20 @@ |
| 2 | +/* Based on p-personal */ |
| 3 | +#p-moodbar { |
| 4 | + position: absolute; |
| 5 | + left: 10.75em; |
| 6 | + top: 0px; |
| 7 | +} |
| 8 | + |
| 9 | +#p-moodbar p { |
| 10 | + margin-top: 0.5em; |
| 11 | + margin-right: 0.75em; |
| 12 | + font-size: 0.75em; |
| 13 | + white-space: nowrap; |
| 14 | + line-height: 1.125em; |
| 15 | + text-transform: none; |
| 16 | + /* @embed */ |
| 17 | + background: url(images/icon-speechbubble-blue.png); |
| 18 | + background-repeat: no-repeat; |
| 19 | + background-position: left; |
| 20 | + padding-left: 18px; |
| 21 | +} |
Property changes on: branches/wmf/1.18wmf1/extensions/MoodBar/modules/ext.moodBar/ext.moodBar.init.css |
___________________________________________________________________ |
Added: svn:eol-style |
1 | 22 | + native |
Index: branches/wmf/1.18wmf1/extensions/MoodBar/modules/jquery.NobleCount/jquery.NobleCount.js |
— | — | @@ -0,0 +1,480 @@ |
| 2 | +/****************************************************************************************************** |
| 3 | + |
| 4 | + jQuery.NobleCount |
| 5 | + |
| 6 | + Author Jeremy Horn |
| 7 | + Version 1.0 |
| 8 | + Date: 3/21/2010 |
| 9 | + |
| 10 | + Copyright (c) 2010 Jeremy Horn- jeremydhorn(at)gmail(dot)c0m | http://tpgblog.com |
| 11 | + Dual licensed under MIT and GPL. |
| 12 | + |
| 13 | + DESCRIPTION |
| 14 | + NobleCount... for a more 'proper' count of the characters remaining. |
| 15 | + |
| 16 | + NobleCount is a customizable jQuery plugin for a more the improved counting of the remaining |
| 17 | + characters, and resulting behaviors, of a text entry object, e.g. input textfield, textarea. |
| 18 | + |
| 19 | + As text is entered into the target text area an object for the purposes of tracking |
| 20 | + the total number of characters remaining, defined as the maximum number of characters |
| 21 | + minus the current total number of characters within the text entry object, and storing |
| 22 | + that information visually and/or within the DOM as an HTML 5 compliant data-* attribute. |
| 23 | + |
| 24 | + Events and CSS Class alterations, if defined, are triggered based on current user |
| 25 | + interaction with the target text entry object as well as the current state (positive or |
| 26 | + negative) of the character remaining value. |
| 27 | + |
| 28 | + NobleCount supports pre-existing text within the text object. |
| 29 | + NobleCount supports jQuery chaining. |
| 30 | + |
| 31 | + Within NobleCount context... |
| 32 | + NEGATIVE is defined as Integers < 0 |
| 33 | + POSITIVE is defined as Integers >= 0 [on_positive will fire when char_rem == 0] |
| 34 | + |
| 35 | + BY DEFAULT |
| 36 | + - maximum characters EQUAL 140 characters |
| 37 | + - no events defined |
| 38 | + - no class changes defined |
| 39 | + - no DOM attributes are created/altered |
| 40 | + - user permitted to type past the maximum number of characters limit, resulting in |
| 41 | + negative number of characters remaining |
| 42 | + |
| 43 | + IMPLEMENTATION |
| 44 | + |
| 45 | + $('#textarea1').NobleCount('#characters_remaining1'); |
| 46 | + $('#textfield2').NobleCount('#characters_remaining2', { / * OPTIONS * / }); |
| 47 | + |
| 48 | + COMPATIBILITY |
| 49 | + |
| 50 | + Tested in FF3.5, IE7 |
| 51 | + With jQuery 1.3.x, 1.4.x |
| 52 | + |
| 53 | + METHOD(S) |
| 54 | + To properly intialize, both the text entry object and the object that will store the |
| 55 | + total number of characters remaining must exist and be passed to NobleCount. |
| 56 | + |
| 57 | + $(TEXT_ENTRY_OBJECT).NobleCount(CHARACTERS_REMAINING_OBJECT); |
| 58 | + |
| 59 | + Any callback functions assigned to any of the availale events are passed the following |
| 60 | + parameters: t_obj, char_area, c_settings, char_rem |
| 61 | + |
| 62 | + t_obj text entry object |
| 63 | + |
| 64 | + char_area selection of the characters remaining object |
| 65 | + |
| 66 | + c_settings result of the options passed into NobleCount at time of |
| 67 | + initialization merged with the default options |
| 68 | + |
| 69 | + ** this is a GREAT way to pass in and remember other state |
| 70 | + information that will be needed upon the triggering of |
| 71 | + NobleCount events ** |
| 72 | + |
| 73 | + char_rem integer representation of the total number of characters |
| 74 | + remaining resulting from the calculated difference between |
| 75 | + the target maximum number of characters and the current |
| 76 | + number of characters currently within t_obj |
| 77 | + |
| 78 | + Both TEXT_ENTRY_OBJECT and CHARACTERS_REMAINING_OBJECT must be specified and valid. |
| 79 | + |
| 80 | + Upon successful initialization, all appropriate events and classes are applied to |
| 81 | + the CHARACTERS_REMAINING_OBJECT, including the storage (if not disabled) visually |
| 82 | + or only in the DOM (if enabled) of the integer representing the number of characters |
| 83 | + remaining. |
| 84 | + |
| 85 | + The target maximum number of characters (max_chars) are determined by the following |
| 86 | + precedence rules.... |
| 87 | + |
| 88 | + if max_chars passed via constructor |
| 89 | + max_chars = max_chars passed |
| 90 | + else if number exists within characters_remaining object and number > 0 |
| 91 | + max_chars = number within the text() of characters_remaining object |
| 92 | + else use the NobleCount's default max_chars |
| 93 | + |
| 94 | + CUSTOMIZATION |
| 95 | + |
| 96 | + NobleCount(c_obj, <OPTIONS>) |
| 97 | + e.g. $(t_obj).NobleCount(c_obj, {max_chars:100px}); |
| 98 | + |
| 99 | + |
| 100 | + on_negative class (STRING) or FUNCTION that is applied/called |
| 101 | + when characters remaining is negative IF DEFINED |
| 102 | + |
| 103 | + on_positive class (STRING) or FUNCTION that is applied/called |
| 104 | + when characters remaining is positive IF DEFINED |
| 105 | + |
| 106 | + on_update FUNCTION that is called when characters remaining changes |
| 107 | + |
| 108 | + max_chars target maximum number of characters |
| 109 | + |
| 110 | + block_negative if TRUE, then all attempts are made to block entering |
| 111 | + more than max_characters; not effective against user |
| 112 | + pasting in blocks of text that exceed the max_chars value |
| 113 | + otherwise, text area will let individual entering the text |
| 114 | + to exceed max_chars limit (characters remaining becomes |
| 115 | + negative) |
| 116 | + |
| 117 | + cloak: false, if TRUE, then no visual updates of characters remaining |
| 118 | + object (c_obj) will occur; this does not have any effect |
| 119 | + on the char_rem value returned via any event callbacks |
| 120 | + otherwise, the text within c_obj is constantly updated to |
| 121 | + represent the total number of characters remaining until |
| 122 | + the max_chars limit has been reached |
| 123 | + |
| 124 | + in_dom: false if TRUE and cloak is ALSO TRUE, then the number of characters |
| 125 | + remaining are stored as the attribute of c_obj |
| 126 | + named 'data-noblecount' |
| 127 | + |
| 128 | + !NOTE: if enabled, due to constant updating of a DOM element |
| 129 | + attribute user experience can appear sluggish while |
| 130 | + the individual is modifying the text entry object (t_obj) |
| 131 | + |
| 132 | + |
| 133 | + EXAMPLE OPTIONS = |
| 134 | + { |
| 135 | + on_negative: 'go_red', |
| 136 | + on_positive: 'go_green', |
| 137 | + max_chars: 25, |
| 138 | + on_update: function(t_obj, char_area, c_settings, char_rem){ |
| 139 | + if ((char_rem % 10) == 0) { |
| 140 | + char_area.css('font-weight', 'bold'); |
| 141 | + char_area.css('font-size', '300%'); |
| 142 | + } else { |
| 143 | + char_area.css('font-weight', 'normal'); |
| 144 | + char_area.css('font-size', '100%'); |
| 145 | + } |
| 146 | + } |
| 147 | + }; |
| 148 | + |
| 149 | + MORE |
| 150 | + |
| 151 | + For more details about NobleCount, its implementation, usage, and examples, go to: |
| 152 | + http://tpgblog.com/noblecount/ |
| 153 | + |
| 154 | +******************************************************************************************************/ |
| 155 | + |
| 156 | +(function($) { |
| 157 | + |
| 158 | + /********************************************************************************** |
| 159 | + |
| 160 | + FUNCTION |
| 161 | + NobleCount |
| 162 | + |
| 163 | + DESCRIPTION |
| 164 | + NobleCount method constructor |
| 165 | + |
| 166 | + allows for customization of maximum length and related update/length |
| 167 | + behaviors |
| 168 | + |
| 169 | + e.g. $(text_obj).NobleCount(characters_remaining_obj); |
| 170 | + |
| 171 | + REQUIRED: c_obj |
| 172 | + OPTIONAL: options |
| 173 | + |
| 174 | + **********************************************************************************/ |
| 175 | + |
| 176 | + $.fn.NobleCount = function(c_obj, options) { |
| 177 | + var c_settings; |
| 178 | + var mc_passed = false; |
| 179 | + |
| 180 | + // if c_obj is not specified, then nothing to do here |
| 181 | + if (typeof c_obj == 'string') { |
| 182 | + // check for new & valid options |
| 183 | + c_settings = $.extend({}, $.fn.NobleCount.settings, options); |
| 184 | + |
| 185 | + // was max_chars passed via options parameter? |
| 186 | + if (typeof options != 'undefined') { |
| 187 | + mc_passed = ((typeof options.max_chars == 'number') ? true : false); |
| 188 | + } |
| 189 | + |
| 190 | + // process all provided objects |
| 191 | + return this.each(function(){ |
| 192 | + var $this = $(this); |
| 193 | + |
| 194 | + // attach events to c_obj |
| 195 | + attach_nobility($this, c_obj, c_settings, mc_passed); |
| 196 | + }); |
| 197 | + } |
| 198 | + |
| 199 | + return this; |
| 200 | + }; |
| 201 | + |
| 202 | + |
| 203 | + /********************************************************************************** |
| 204 | + |
| 205 | + FUNCTION |
| 206 | + NobleCount.settings |
| 207 | + |
| 208 | + DESCRIPTION |
| 209 | + publically accessible data stucture containing the max_chars and |
| 210 | + event handling specifications for NobleCount |
| 211 | + |
| 212 | + can be directly accessed by '$.fn.NobleCount.settings = ... ;' |
| 213 | + |
| 214 | + **********************************************************************************/ |
| 215 | + $.fn.NobleCount.settings = { |
| 216 | + |
| 217 | + on_negative: null, // class (STRING) or FUNCTION that is applied/called |
| 218 | + // when characters remaining is negative |
| 219 | + on_positive: null, // class (STRING) or FUNCTION that is applied/called |
| 220 | + // when characters remaining is positive |
| 221 | + on_update: null, // FUNCTION that is called when characters remaining |
| 222 | + // changes |
| 223 | + max_chars: 140, // maximum number of characters |
| 224 | + block_negative: false, // if true, then all attempts are made to block entering |
| 225 | + // more than max_characters |
| 226 | + cloak: false, // if true, then no visual updates of characters |
| 227 | + // remaining (c_obj) occur |
| 228 | + in_dom: false // if true and cloak == true, then number of characters |
| 229 | + // remaining are stored as the attribute |
| 230 | + // 'data-noblecount' of c_obj |
| 231 | + |
| 232 | + }; |
| 233 | + |
| 234 | + |
| 235 | + ////////////////////////////////////////////////////////////////////////////////// |
| 236 | + |
| 237 | + // private functions and settings |
| 238 | + |
| 239 | + /********************************************************************************** |
| 240 | + |
| 241 | + FUNCTION |
| 242 | + attach_nobility |
| 243 | + |
| 244 | + DESCRIPTION |
| 245 | + performs all initialization routines and display initiation |
| 246 | + |
| 247 | + assigns both the keyup and keydown events to the target text entry |
| 248 | + object; both keyup and keydown are used to provide the smoothest |
| 249 | + user experience |
| 250 | + |
| 251 | + if max_chars_passed via constructor |
| 252 | + max_chars = max_chars_passed |
| 253 | + else if number exists within counting_object (and number > 0) |
| 254 | + max_chars = counting_object.number |
| 255 | + else use default max_chars |
| 256 | + |
| 257 | + PRE |
| 258 | + t_obj and c_obj EXIST |
| 259 | + c_settings and mc_passed initialized |
| 260 | + |
| 261 | + POST |
| 262 | + maximum number of characters for t_obj calculated and stored in max_char |
| 263 | + key events attached to t_obj |
| 264 | + |
| 265 | + **********************************************************************************/ |
| 266 | + |
| 267 | + function attach_nobility(t_obj, c_obj, c_settings, mc_passed){ |
| 268 | + var max_char = c_settings.max_chars; |
| 269 | + var char_area = $(c_obj); |
| 270 | + |
| 271 | + // first determine if max_char needs adjustment |
| 272 | + if (!mc_passed) { |
| 273 | + var tmp_num = char_area.text(); |
| 274 | + var isPosNumber = (/^[1-9]\d*$/).test(tmp_num); |
| 275 | + |
| 276 | + if (isPosNumber) { |
| 277 | + max_char = tmp_num; |
| 278 | + } |
| 279 | + } |
| 280 | + |
| 281 | + // initialize display of characters remaining |
| 282 | + // * note: initializing should not trigger on_update |
| 283 | + event_internals(t_obj, char_area, c_settings, max_char, true); |
| 284 | + |
| 285 | + // then attach the events -- seem to work better than keypress |
| 286 | + $(t_obj).keydown(function(e) { |
| 287 | + event_internals(t_obj, char_area, c_settings, max_char, false); |
| 288 | + |
| 289 | + // to block text entry, return false |
| 290 | + if (check_block_negative(e, t_obj, c_settings, max_char) == false) { |
| 291 | + return false; |
| 292 | + } |
| 293 | + }); |
| 294 | + |
| 295 | + $(t_obj).keyup(function(e) { |
| 296 | + event_internals(t_obj, char_area, c_settings, max_char, false); |
| 297 | + |
| 298 | + // to block text entry, return false |
| 299 | + if (check_block_negative(e, t_obj, c_settings, max_char) == false) { |
| 300 | + return false; |
| 301 | + } |
| 302 | + }); |
| 303 | + } |
| 304 | + |
| 305 | + |
| 306 | + /********************************************************************************** |
| 307 | + |
| 308 | + FUNCTION |
| 309 | + check_block_negative |
| 310 | + |
| 311 | + DESCRIPTION |
| 312 | + determines whether or not text entry within t_obj should be prevented |
| 313 | + |
| 314 | + PRE |
| 315 | + e EXISTS |
| 316 | + t_obj VALID |
| 317 | + c_settings and max_char initialized / calculated |
| 318 | + |
| 319 | + POST |
| 320 | + if t_obj text entry should be prevented FALSE is returned |
| 321 | + otherwise TRUE returned |
| 322 | + |
| 323 | + TODO |
| 324 | + improve selection detection and permissible behaviors experience |
| 325 | + ALSO |
| 326 | + doesnt CURRENTLY block from the pasting of large chunks of text that |
| 327 | + exceed max_char |
| 328 | + |
| 329 | + **********************************************************************************/ |
| 330 | + |
| 331 | + function check_block_negative(e, t_obj, c_settings, max_char){ |
| 332 | + if (c_settings.block_negative) { |
| 333 | + var char_code = e.which; |
| 334 | + var selected; |
| 335 | + |
| 336 | + // goofy handling required to work in both IE and FF |
| 337 | + if (typeof document.selection != 'undefined') { |
| 338 | + selected = (document.selection.createRange().text.length > 0); |
| 339 | + } else { |
| 340 | + selected = (t_obj[0].selectionStart != t_obj[0].selectionEnd); |
| 341 | + } |
| 342 | + |
| 343 | + //return false if can't write more |
| 344 | + if ((!((find_remaining(t_obj, max_char) < 1) && |
| 345 | + (char_code > 47 || char_code == 32 || char_code == 0 || char_code == 13) && |
| 346 | + !e.ctrlKey && |
| 347 | + !e.altKey && |
| 348 | + !selected)) == false) { |
| 349 | + |
| 350 | + // block text entry |
| 351 | + return false; |
| 352 | + } |
| 353 | + } |
| 354 | + |
| 355 | + // allow text entry |
| 356 | + return true; |
| 357 | + } |
| 358 | + |
| 359 | + |
| 360 | + /********************************************************************************** |
| 361 | + |
| 362 | + FUNCTION |
| 363 | + find_remaining |
| 364 | + |
| 365 | + DESCRIPTION |
| 366 | + determines of the number of characters permitted (max_char), the number of |
| 367 | + characters remaining until that limit has been reached |
| 368 | + |
| 369 | + PRE |
| 370 | + t_obj and max_char EXIST and are VALID |
| 371 | + |
| 372 | + POST |
| 373 | + returns integer of the difference between max_char and total number of |
| 374 | + characters within the text entry object (t_obj) |
| 375 | + |
| 376 | + **********************************************************************************/ |
| 377 | + |
| 378 | + function find_remaining(t_obj, max_char){ |
| 379 | + return max_char - ($(t_obj).val()).length; |
| 380 | + } |
| 381 | + |
| 382 | + |
| 383 | + /********************************************************************************** |
| 384 | + |
| 385 | + FUNCTION |
| 386 | + event_internals |
| 387 | + |
| 388 | + DESCRIPTION |
| 389 | + primarily used for the calculation of appropriate behavior resulting from |
| 390 | + any event attached to the text entry object (t_obj) |
| 391 | + |
| 392 | + whenever the char_rem and related display and/or DOM information needs |
| 393 | + updating this function is called |
| 394 | + |
| 395 | + if cloaking is being used, then no visual representation of the characters |
| 396 | + remaining, nor attempt by this plugin to change any of its visual |
| 397 | + characteristics will occur |
| 398 | + |
| 399 | + if cloaking and in_dom are both TRUE, then the number of characters |
| 400 | + remaining are stored within the HTML 5 compliant attribute of the |
| 401 | + character count remaining object (c_obj) labeled 'data-noblecount' |
| 402 | + |
| 403 | + PRE |
| 404 | + c_settings, init_disp initialized |
| 405 | + |
| 406 | + POST |
| 407 | + performs all updates to the DOM visual and otherwise required |
| 408 | + performs all relevant function calls |
| 409 | + |
| 410 | + **********************************************************************************/ |
| 411 | + |
| 412 | + function event_internals(t_obj, char_area, c_settings, max_char, init_disp) { |
| 413 | + var char_rem = find_remaining(t_obj, max_char); |
| 414 | + |
| 415 | + // is chararacters remaining positive or negative |
| 416 | + if (char_rem < 0) { |
| 417 | + toggle_states(c_settings.on_negative, c_settings.on_positive, t_obj, char_area, c_settings, char_rem); |
| 418 | + } else { |
| 419 | + toggle_states(c_settings.on_positive, c_settings.on_negative, t_obj, char_area, c_settings, char_rem); |
| 420 | + } |
| 421 | + |
| 422 | + // determine whether or not to update the text of the char_area (or c_obj) |
| 423 | + if (c_settings.cloak) { |
| 424 | + // this slows stuff down quite a bit; TODO: implement better method of publically accessible data storage |
| 425 | + if (c_settings.in_dom) { |
| 426 | + char_area.attr('data-noblecount', char_rem); |
| 427 | + } |
| 428 | + } else { |
| 429 | + // show the numbers of characters remaining |
| 430 | + char_area.text(char_rem); |
| 431 | + } |
| 432 | + |
| 433 | + // if event_internals isn't being called for initialization purposes and |
| 434 | + // on_update is a properly defined function then call it on this update |
| 435 | + if (!init_disp && jQuery.isFunction(c_settings.on_update)) { |
| 436 | + c_settings.on_update(t_obj, char_area, c_settings, char_rem); |
| 437 | + } |
| 438 | + } |
| 439 | + |
| 440 | + |
| 441 | + /********************************************************************************** |
| 442 | + |
| 443 | + FUNCTION |
| 444 | + toggle_states |
| 445 | + |
| 446 | + DESCRIPTION |
| 447 | + performs the toggling operations between the watched positive and negative |
| 448 | + characteristics |
| 449 | + |
| 450 | + first, enables/triggers/executes the toggle_on behavior/class |
| 451 | + second, disables the trigger_off class |
| 452 | + |
| 453 | + PRE |
| 454 | + toggle_on, toggle_off |
| 455 | + IF DEFINED, |
| 456 | + must be a string representation of a VALID class |
| 457 | + OR |
| 458 | + must be a VALID function |
| 459 | + |
| 460 | + POST |
| 461 | + toggle_on objects have been applied/executed |
| 462 | + toggle_off class has been removed (if it is a class) |
| 463 | + |
| 464 | + **********************************************************************************/ |
| 465 | + |
| 466 | + function toggle_states(toggle_on, toggle_off, t_obj, char_area, c_settings, char_rem){ |
| 467 | + if (toggle_on != null) { |
| 468 | + if (typeof toggle_on == 'string') { |
| 469 | + char_area.addClass(toggle_on); |
| 470 | + } else if (jQuery.isFunction(toggle_on)) { |
| 471 | + toggle_on(t_obj, char_area, c_settings, char_rem); |
| 472 | + } |
| 473 | + } |
| 474 | + |
| 475 | + if (toggle_off != null) { |
| 476 | + if (typeof toggle_off == 'string') { |
| 477 | + char_area.removeClass(toggle_off); |
| 478 | + } |
| 479 | + } |
| 480 | + } |
| 481 | +})(jQuery); |
Property changes on: branches/wmf/1.18wmf1/extensions/MoodBar/modules/jquery.NobleCount/jquery.NobleCount.js |
___________________________________________________________________ |
Added: svn:eol-style |
1 | 482 | + native |
Added: svn:executable |
2 | 483 | + * |
Index: branches/wmf/1.18wmf1/extensions/MoodBar/modules/ext.moodBar.dashboard/ext.moodBar.dashboard.css |
— | — | @@ -0,0 +1,278 @@ |
| 2 | +/* Filters */ |
| 3 | + |
| 4 | +#fbd-filters { |
| 5 | + position: absolute; |
| 6 | + width: 14em; |
| 7 | + left:0px; /* needed for ie6 & ie7 */ |
| 8 | +} |
| 9 | + |
| 10 | +#fbd-filters form { |
| 11 | + margin: 0; |
| 12 | + padding: 1em; |
| 13 | + background-color: #e8f2f8; |
| 14 | +} |
| 15 | + |
| 16 | +#fbd-about { |
| 17 | + display: inline-block; |
| 18 | + font-size: 0.8em; |
| 19 | + margin-top: 0.5em; |
| 20 | +} |
| 21 | + |
| 22 | +#fbd-filters-title { |
| 23 | + font-size: 1.2em; |
| 24 | + margin: 0; |
| 25 | + padding: 0; |
| 26 | + border-bottom: solid 1px black; |
| 27 | +} |
| 28 | + |
| 29 | +#fbd-filters-types { |
| 30 | + margin: 0.5em 0 0 0; |
| 31 | + padding: 0; |
| 32 | + border: none; |
| 33 | +} |
| 34 | + |
| 35 | +.fbd-filters-label { |
| 36 | + display: block; |
| 37 | + margin: 0.5em 0 0 0; |
| 38 | + padding: 0; |
| 39 | + font-weight: bold; |
| 40 | +} |
| 41 | + |
| 42 | +.fbd-filters-input { |
| 43 | + margin: 0.25em 0 0.25em 0.75em; |
| 44 | + width: 9em; |
| 45 | +} |
| 46 | + |
| 47 | +#fbd-filters-types ul { |
| 48 | + margin: 0; |
| 49 | + padding: 0; |
| 50 | + list-style: none; |
| 51 | + list-style-type:none; |
| 52 | +} |
| 53 | + |
| 54 | +#fbd-filters-types li { |
| 55 | + margin: 0 0 0 0.75em; |
| 56 | + padding: 0; |
| 57 | + list-style: none; |
| 58 | + list-style-image:none; /* ie 7 fix */ |
| 59 | +} |
| 60 | + |
| 61 | +#fbd-filters-types label { |
| 62 | + padding-left: 18px; |
| 63 | + background-position: left 45%; |
| 64 | + background-repeat: no-repeat; |
| 65 | +} |
| 66 | + |
| 67 | +#fbd-filters-type-praise-label { |
| 68 | + /* @embed */ |
| 69 | + background-image: url(images/filter-praise.png); |
| 70 | +} |
| 71 | + |
| 72 | +#fbd-filters-type-confusion-label { |
| 73 | + /* @embed */ |
| 74 | + background-image: url(images/filter-confusion.png); |
| 75 | +} |
| 76 | + |
| 77 | +#fbd-filters-type-issues-label { |
| 78 | + /* @embed */ |
| 79 | + background-image: url(images/filter-issues.png); |
| 80 | +} |
| 81 | + |
| 82 | +#fbd-filters-set { |
| 83 | + margin: 1em 0 0 0; |
| 84 | +} |
| 85 | + |
| 86 | +/* List */ |
| 87 | + |
| 88 | +#fbd-list { |
| 89 | + margin: 0px 20px 0px 15em; |
| 90 | + padding: 0px; |
| 91 | + min-height: 20em; |
| 92 | + list-style: none; |
| 93 | + list-style-image:none; /* ie 7 fix */ |
| 94 | +} |
| 95 | + |
| 96 | +.client-nojs #fbd-list-more { |
| 97 | + display: none; |
| 98 | +} |
| 99 | + |
| 100 | +.client-js #fbd-list-newer-older { |
| 101 | + display: none; |
| 102 | +} |
| 103 | + |
| 104 | +#fbd-list-more, #fbd-list-newer-older { |
| 105 | + margin: 1em 0 0 13em; |
| 106 | + padding: 0.5em; |
| 107 | + background-color: #e8f2f8; |
| 108 | +} |
| 109 | + |
| 110 | +#fbd-list-more a, #fbd-list-more span, |
| 111 | +#fbd-list-newer a, #fbd-list-older a, |
| 112 | +#fbd-list-newer .fbd-page-disabled, #fbd-list-older .fbd-page-disabled { |
| 113 | + font-size: 1.4em; |
| 114 | + background-repeat: no-repeat; |
| 115 | +} |
| 116 | + |
| 117 | +#fbd-list-more { |
| 118 | + text-align: center; |
| 119 | +} |
| 120 | + |
| 121 | +#fbd-list-more a { |
| 122 | + /* @embed */ |
| 123 | + background-image: url(images/page-more.png); |
| 124 | + background-position: left center; |
| 125 | + padding-left: 20px; |
| 126 | +} |
| 127 | + |
| 128 | +#fbd-list-newer { |
| 129 | + float: left; |
| 130 | +} |
| 131 | + |
| 132 | +#fbd-list-newer a, #fbd-list-newer .fbd-page-disabled { |
| 133 | + background-position: left center; |
| 134 | + padding-left: 20px; |
| 135 | +} |
| 136 | + |
| 137 | +#fbd-list-more.mw-ajax-loader { |
| 138 | + /* Undo the repositioning done in shared.css. Padding is set to 0.5em above. */ |
| 139 | + position: static; |
| 140 | +} |
| 141 | + |
| 142 | +/* The images here are named -ltr instead of -left and -rtl instead of -right |
| 143 | + * because ResourceLoader flips -ltr and -rtl in URLs, but not -left and -right |
| 144 | + */ |
| 145 | +#fbd-list-newer a { |
| 146 | + /* @embed */ |
| 147 | + background-image: url(images/page-active-ltr.png); |
| 148 | +} |
| 149 | + |
| 150 | +#fbd-list-newer .fbd-page-disabled { |
| 151 | + /* @embed */ |
| 152 | + background-image: url(images/page-disabled-ltr.png); |
| 153 | +} |
| 154 | + |
| 155 | +#fbd-list-older { |
| 156 | + float: right; |
| 157 | +} |
| 158 | + |
| 159 | +#fbd-list-older a, #fbd-list-older .fbd-page-disabled { |
| 160 | + background-position: right center; |
| 161 | + padding-right: 20px; |
| 162 | +} |
| 163 | + |
| 164 | +#fbd-list-older a { |
| 165 | + /* @embed */ |
| 166 | + background-image: url(images/page-active-rtl.png); |
| 167 | +} |
| 168 | + |
| 169 | +#fbd-list-older .fbd-page-disabled { |
| 170 | + /* @embed */ |
| 171 | + background-image: url(images/page-disabled-rtl.png); |
| 172 | +} |
| 173 | + |
| 174 | +.fbd-page-disabled { |
| 175 | + color: #c6c6c6; |
| 176 | +} |
| 177 | + |
| 178 | +.fbd-item { |
| 179 | + border-bottom: solid 1px silver; |
| 180 | + position: relative; |
| 181 | + margin-top:0.5em; |
| 182 | + margin-bottom:0.5em; |
| 183 | + |
| 184 | + padding:0; |
| 185 | +} |
| 186 | + |
| 187 | +.fbd-item-emoticon { |
| 188 | + float: left; |
| 189 | + margin-right: 0.5em; |
| 190 | + width: 75px; |
| 191 | + height: 90px; |
| 192 | + background-position: center top; |
| 193 | + background-repeat: no-repeat; |
| 194 | +} |
| 195 | + |
| 196 | +.fbd-item-emoticon-label { |
| 197 | + display: block; |
| 198 | + margin-top: 60px; |
| 199 | + text-align: center; |
| 200 | +} |
| 201 | + |
| 202 | +.fbd-item-emoticon-happy { |
| 203 | + /* @embed */ |
| 204 | + background-image: url(images/emoticon-happy.png); |
| 205 | +} |
| 206 | +.fbd-item-emoticon-confused { |
| 207 | + /* @embed */ |
| 208 | + background-image: url(images/emoticon-confused.png); |
| 209 | +} |
| 210 | +.fbd-item-emoticon-sad { |
| 211 | + /* @embed */ |
| 212 | + background-image: url(images/emoticon-sad.png); |
| 213 | +} |
| 214 | + |
| 215 | +.fbd-item-userName { |
| 216 | + font-size: 1.2em; |
| 217 | + margin: 0; |
| 218 | + padding: 0; |
| 219 | +} |
| 220 | + |
| 221 | +.fbd-item-userLinks{ |
| 222 | + font-size: 1em; |
| 223 | +} |
| 224 | + |
| 225 | +.fbd-item-time { |
| 226 | + font-size: 1.2em; |
| 227 | + float: right; |
| 228 | +} |
| 229 | + |
| 230 | +.fbd-item-message { |
| 231 | + font-size: 1.4em; |
| 232 | + margin-top: 0.25em; |
| 233 | + margin-left:81px; |
| 234 | + min-height:40px; |
| 235 | +} |
| 236 | + |
| 237 | +.fbd-item-permalink, |
| 238 | +.fbd-item-show, |
| 239 | +.fbd-item-hide, |
| 240 | +.fbd-item-reason { |
| 241 | + float: right; |
| 242 | + font-size: 0.8em; |
| 243 | + margin-left: 0.2em; |
| 244 | + margin-right: 0.2em; |
| 245 | +} |
| 246 | +.fbd-respond-link { |
| 247 | + font-size:1.1em; |
| 248 | + cursor:pointer; |
| 249 | + letter-spacing: -0.01em; |
| 250 | +} |
| 251 | +.fbd-respond-link:hover { |
| 252 | + text-decoration:none; |
| 253 | +} |
| 254 | +.fbd-item-restore { |
| 255 | + font-size: 0.8em; |
| 256 | + color: silver; |
| 257 | +} |
| 258 | +.fbd-hidden { |
| 259 | + color: silver; |
| 260 | +} |
| 261 | +.fbd-response-form { |
| 262 | + margin:0em 0px 1em 81px; |
| 263 | +} |
| 264 | +.fbd-response-form b { |
| 265 | + font-size:1em; |
| 266 | +} |
| 267 | +.fbd-response-form small{ |
| 268 | + font-size:0.8em; |
| 269 | + color:#262626; |
| 270 | +} |
| 271 | +.fbd-response-formNote { |
| 272 | + float:right; |
| 273 | +} |
| 274 | +.fbd-response-submit { |
| 275 | + float:right; |
| 276 | +} |
| 277 | +.center { |
| 278 | + text-align:center; |
| 279 | +} |
\ No newline at end of file |
Property changes on: branches/wmf/1.18wmf1/extensions/MoodBar/modules/ext.moodBar.dashboard/ext.moodBar.dashboard.css |
___________________________________________________________________ |
Added: svn:eol-style |
1 | 280 | + native |
Index: branches/wmf/1.18wmf1/extensions/MoodBar/modules/ext.moodBar.dashboard/ext.moodBar.dashboard.js |
— | — | @@ -0,0 +1,569 @@ |
| 2 | +/** |
| 3 | + * AJAX code for Special:MoodBarFeedback |
| 4 | + */ |
| 5 | +jQuery(function( $ ) { |
| 6 | + /** |
| 7 | + * Saved form state |
| 8 | + */ |
| 9 | + var formState = { types: [], username: '' }; |
| 10 | + |
| 11 | + /** |
| 12 | + * Save the current form state to formState |
| 13 | + */ |
| 14 | + function saveFormState() { |
| 15 | + formState.types = getSelectedTypes(); |
| 16 | + formState.username = $( '#fbd-filters-username' ).val(); |
| 17 | + } |
| 18 | + |
| 19 | + /** |
| 20 | + * Figure out which comment type filters have been selected. |
| 21 | + * @return array of comment types |
| 22 | + */ |
| 23 | + function getSelectedTypes() { |
| 24 | + var types = []; |
| 25 | + $( '#fbd-filters-type-praise, #fbd-filters-type-confusion, #fbd-filters-type-issues' ).each( function() { |
| 26 | + if ( $(this).prop( 'checked' ) ) { |
| 27 | + types.push( $(this).val() ); |
| 28 | + } |
| 29 | + } ); |
| 30 | + return types; |
| 31 | + } |
| 32 | + |
| 33 | + /** |
| 34 | + * Set the moodbar-feedback-types and moodbar-feedback-username cookies based on formState. |
| 35 | + * This function uses the form state saved in formState, so you may want to call saveFormState() first. |
| 36 | + */ |
| 37 | + function setCookies() { |
| 38 | + $.cookie( 'moodbar-feedback-types', formState.types.join( '|' ), { 'path': '/', 'expires': 7 } ); |
| 39 | + } |
| 40 | + |
| 41 | + /** |
| 42 | + * Load the form state from the moodbar-feedback-types and moodbar-feedback-username cookies. |
| 43 | + * This assumes the form is currently blank. |
| 44 | + * @return bool True if the form is no longer blank (i.e. at least one value was changed), false otherwise |
| 45 | + */ |
| 46 | + function loadFromCookies() { |
| 47 | + var cookieTypes = $.cookie( 'moodbar-feedback-types' ), |
| 48 | + changed = false; |
| 49 | + |
| 50 | + if ( cookieTypes ) { |
| 51 | + // Because calling .indexOf() on an array doesn't work in all browsers, |
| 52 | + // we'll use cookieTypes.indexOf( '|valueWereLookingFor' ) . In order for |
| 53 | + // that to work, we need to prepend a pipe first. |
| 54 | + cookieTypes = '|' + cookieTypes; |
| 55 | + $( '#fbd-filters-type-praise, #fbd-filters-type-confusion, #fbd-filters-type-issues' ).each( function() { |
| 56 | + if ( !$(this).prop( 'checked' ) && cookieTypes.indexOf( '|' + $(this).val() ) != -1 ) { |
| 57 | + $(this).prop( 'checked', true ); |
| 58 | + changed = true; |
| 59 | + } |
| 60 | + } ); |
| 61 | + } |
| 62 | + return changed; |
| 63 | + } |
| 64 | + |
| 65 | + /** |
| 66 | + * Show a message in the box that normally contains the More link. |
| 67 | + * This will hide the more link, remove any existing <span>s, |
| 68 | + * and add a <span> with the supplied text. |
| 69 | + * @param text string Message text |
| 70 | + */ |
| 71 | + function showMessage( text ) { |
| 72 | + $( '#fbd-list-more' ) |
| 73 | + .children( 'a' ) |
| 74 | + .hide() |
| 75 | + .end() |
| 76 | + .children( 'span' ) |
| 77 | + .remove() // Remove any previous messages |
| 78 | + .end() |
| 79 | + .append( $( '<span>' ).text( text ) ); |
| 80 | + } |
| 81 | + |
| 82 | + /** |
| 83 | + * Load a set of 20 comments into the list. In 'filter' mode, the list is |
| 84 | + * blanked before the new comments are loaded. In 'more' mode, the comments are |
| 85 | + * loaded at the end of the existing set. |
| 86 | + * |
| 87 | + * This function uses the form state saved in formState, so you may want to call saveFormState() first. |
| 88 | + * |
| 89 | + * @param mode string Either 'filter' or 'more' |
| 90 | + */ |
| 91 | + function loadComments( mode ) { |
| 92 | + var limit = 20, |
| 93 | + reqData; |
| 94 | + |
| 95 | + if ( mode == 'filter' ) { |
| 96 | + $( '#fbd-list' ).empty(); |
| 97 | + } |
| 98 | + // Hide the "More" link and put in a spinner |
| 99 | + $( '#fbd-list-more' ) |
| 100 | + .show() // may have been output with display: none; |
| 101 | + .addClass( 'mw-ajax-loader' ) |
| 102 | + .children( 'a' ) |
| 103 | + .css( 'visibility', 'hidden' ) // using .hide() cuts off the spinner |
| 104 | + .show() // showMessage() may have called .hide() |
| 105 | + .end() |
| 106 | + .children( 'span' ) |
| 107 | + .remove(); // Remove any message added by showMessage() |
| 108 | + |
| 109 | + // Build the API request |
| 110 | + // FIXME: in 'more' mode, changing the filters then clicking More will use the wrong criteria |
| 111 | + reqData = { |
| 112 | + 'action': 'query', |
| 113 | + 'list': 'moodbarcomments', |
| 114 | + 'format': 'json', |
| 115 | + 'mbcprop': 'formatted', |
| 116 | + 'mbclimit': limit + 2 // we drop the first and last result |
| 117 | + }; |
| 118 | + if ( mode == 'more' ) { |
| 119 | + reqData.mbccontinue = $( '#fbd-list').find( 'li:last' ).data( 'mbccontinue' ); |
| 120 | + } |
| 121 | + if ( formState.types.length ) { |
| 122 | + reqData.mbctype = formState.types.join( '|' ); |
| 123 | + } |
| 124 | + if ( formState.username.length ) { |
| 125 | + reqData.mbcuser = formState.username; |
| 126 | + } |
| 127 | + |
| 128 | + $.ajax( { |
| 129 | + 'url': mw.util.wikiScript( 'api' ), |
| 130 | + 'data': reqData, |
| 131 | + 'success': function( data ) { |
| 132 | + // Remove the spinner and restore the "More" link |
| 133 | + $( '#fbd-list-more' ) |
| 134 | + .removeClass( 'mw-ajax-loader' ) |
| 135 | + .children( 'a' ) |
| 136 | + .css( 'visibility', 'visible' ); // Undo visibility: hidden; |
| 137 | + |
| 138 | + if ( !data || !data.query || !data.query.moodbarcomments ) { |
| 139 | + showMessage( mw.msg( 'moodbar-feedback-ajaxerror' ) ); |
| 140 | + return; |
| 141 | + } |
| 142 | + |
| 143 | + var comments = data.query.moodbarcomments, |
| 144 | + len = comments.length, |
| 145 | + $ul = $( '#fbd-list' ), |
| 146 | + moreResults = false, |
| 147 | + i; |
| 148 | + if ( len === 0 ) { |
| 149 | + if ( mode == 'more' ) { |
| 150 | + showMessage( mw.msg( 'moodbar-feedback-nomore' ) ); |
| 151 | + } else { |
| 152 | + showMessage( mw.msg( 'moodbar-feedback-noresults' ) ); |
| 153 | + } |
| 154 | + return; |
| 155 | + } |
| 156 | + |
| 157 | + if ( mode == 'more' ) { |
| 158 | + // Drop the first element because it duplicates the last shown one |
| 159 | + comments.shift(); |
| 160 | + len--; |
| 161 | + } |
| 162 | + if ( len > limit ) { |
| 163 | + // Drop any elements past the limit. We do know there are more results now |
| 164 | + len = limit; |
| 165 | + moreResults = true; |
| 166 | + } |
| 167 | + |
| 168 | + for ( i = 0; i < len; i++ ) { |
| 169 | + $ul.append( comments[i].formatted ); |
| 170 | + } |
| 171 | + |
| 172 | + if ( !moreResults ) { |
| 173 | + if ( mode == 'more' ) { |
| 174 | + showMessage( mw.msg( 'moodbar-feedback-nomore' ) ); |
| 175 | + } else { |
| 176 | + $( '#fbd-list-more' ).hide(); |
| 177 | + } |
| 178 | + } |
| 179 | + }, |
| 180 | + 'error': function( jqXHR, textStatus, errorThrown ) { |
| 181 | + $( '#fbd-list-more' ).removeClass( 'mw-ajax-loader' ); |
| 182 | + showMessage( mw.msg( 'moodbar-feedback-ajaxerror' ) ); |
| 183 | + }, |
| 184 | + 'dataType': 'json' |
| 185 | + } ); |
| 186 | + } |
| 187 | + |
| 188 | + /** |
| 189 | + * Reload a comment, showing hidden comments if necessary |
| 190 | + * @param $item jQuery item containing the .fbd-item |
| 191 | + * @param show Set to true to show the comment despite its hidden status |
| 192 | + */ |
| 193 | + function reloadItem( $item, show ) { |
| 194 | + var cont = $item.data('mbccontinue'); |
| 195 | + |
| 196 | + var request = { |
| 197 | + 'action' : 'query', |
| 198 | + 'list' : 'moodbarcomments', |
| 199 | + 'format' : 'json', |
| 200 | + 'mbcprop' : 'formatted', |
| 201 | + 'mbclimit' : 1, |
| 202 | + 'mbccontinue' : cont |
| 203 | + }; |
| 204 | + |
| 205 | + if ( show ) { |
| 206 | + request.mbcprop = 'formatted|hidden'; |
| 207 | + } |
| 208 | + |
| 209 | + $.post( mw.util.wikiScript('api'), request, |
| 210 | + function( data ) { |
| 211 | + if ( data && data.query && data.query.moodbarcomments && |
| 212 | + data.query.moodbarcomments.length > 0 |
| 213 | + ) { |
| 214 | + var $content = $j(data.query.moodbarcomments[0].formatted); |
| 215 | + $item.replaceWith($content); |
| 216 | + } else { |
| 217 | + // Failure, just remove the link. |
| 218 | + $item.find('.fbd-item-show').remove(); |
| 219 | + $item.find('.mw-ajax-loader').remove(); |
| 220 | + showItemError( $item ); |
| 221 | + } |
| 222 | + }, 'json' ) |
| 223 | + .error( function() { showItemError( $item ); } ); |
| 224 | + } |
| 225 | + |
| 226 | + /** |
| 227 | + * Show a hidden comment |
| 228 | + */ |
| 229 | + function showHiddenItem(e) { |
| 230 | + var $item = $(this).closest('.fbd-item'); |
| 231 | + |
| 232 | + var $spinner = $('<span class="mw-ajax-loader"> </span>'); |
| 233 | + $item.find('.fbd-item-show').empty().append( $spinner ); |
| 234 | + |
| 235 | + reloadItem( $item, true ); |
| 236 | + |
| 237 | + e.preventDefault(); |
| 238 | + } |
| 239 | + |
| 240 | + /** |
| 241 | + * Show an error on an individual item |
| 242 | + * @param $item The .fbd-item to show the message on |
| 243 | + * @param message The message to show (currently ignored) |
| 244 | + */ |
| 245 | + function showItemError( $item, message ) { |
| 246 | + $item.find('.mw-ajax-loader').remove(); |
| 247 | + $('<div class="error"/>') |
| 248 | + .text( mw.msg('moodbar-feedback-action-error') ) |
| 249 | + .prependTo($item); |
| 250 | + } |
| 251 | + |
| 252 | + /** |
| 253 | + * Do this before administrative action to confirm action and provide reason |
| 254 | + * @param params to store action paramaters |
| 255 | + * @param $item jQuery item containing the .fbd-item |
| 256 | + */ |
| 257 | + function confirmAction(params, $item){ |
| 258 | + |
| 259 | + var inlineForm = $('<span>').attr('class', 'fbd-item-reason') |
| 260 | + .append( $('<span>').html(mw.msg( 'moodbar-action-reason' )) ) |
| 261 | + .append( $('<input />').attr({'class':'fbd-action-reason', 'name':'fbd-action-reason'}) ) |
| 262 | + .append( $('<button>').attr('class', 'fbd-action-confirm').html( mw.msg('moodbar-feedback-action-confirm')) ) |
| 263 | + .append( $('<button>').attr('class', 'fbd-action-cancel').html( mw.msg('moodbar-feedback-action-cancel')) ) |
| 264 | + .append( $('<span>').attr('class', 'fbd-item-reason-msg') ) |
| 265 | + .append( $('<div>').attr('class', 'fbd-item-reason-msg') ); |
| 266 | + |
| 267 | + var storedParams = params; |
| 268 | + var $storedItem = $item; |
| 269 | + |
| 270 | + $item.find('.fbd-item-hide, .fbd-item-restore, .fbd-item-permalink') |
| 271 | + .empty(); |
| 272 | + |
| 273 | + $item.find('.fbd-item-message') |
| 274 | + .append(inlineForm); |
| 275 | + |
| 276 | + $('.fbd-action-confirm').click( function() { |
| 277 | + storedParams.reason = $storedItem.find('.fbd-action-reason').val(); |
| 278 | + |
| 279 | + if( storedParams.reason ) { |
| 280 | + doAction(storedParams, $storedItem); |
| 281 | + } else { |
| 282 | + inlineMessage($storedItem.find('.fbd-item-reason'), mw.msg( 'moodbar-action-reason-required' ), function() { |
| 283 | + reloadItem( $storedItem, true ); |
| 284 | + }); |
| 285 | + } |
| 286 | + |
| 287 | + }); |
| 288 | + $('.fbd-action-cancel').click( function() { |
| 289 | + reloadItem( $storedItem, true ); |
| 290 | + }); |
| 291 | + |
| 292 | + } |
| 293 | + |
| 294 | + /** |
| 295 | + * Execute an action on an item |
| 296 | + * @param params contains action parameters |
| 297 | + * @param $item jQuery item containing the .fbd-item |
| 298 | + */ |
| 299 | + function doAction( params, $item ) { |
| 300 | + var item_id = $item.data('mbccontinue').split('|')[1]; |
| 301 | + |
| 302 | + var errorHandler = function(error_str) { |
| 303 | + showItemError( $item, error_str ); |
| 304 | + }; |
| 305 | + |
| 306 | + var $spinner = $('<span class="mw-ajax-loader"> </span>'); |
| 307 | + $item.find('.fbd-item-hide').empty().append( $spinner ); |
| 308 | + |
| 309 | + $.post( mw.util.wikiScript('api'), |
| 310 | + $.extend( { |
| 311 | + 'action' : 'feedbackdashboard', |
| 312 | + 'token' : mw.user.tokens.get('editToken'), |
| 313 | + 'item' : item_id, |
| 314 | + 'format' : 'json' |
| 315 | + }, params ), |
| 316 | + function(response) { |
| 317 | + if ( response && response.feedbackdashboard ) { |
| 318 | + if ( response.feedbackdashboard.result == 'success' ) { |
| 319 | + reloadItem( $item ); |
| 320 | + } else { |
| 321 | + errorHandler( response.feedbackdashboard.error ); |
| 322 | + } |
| 323 | + } else if ( response && response.error ) { |
| 324 | + errorHandler( response.error.message ); |
| 325 | + } else { |
| 326 | + errorHandler(); |
| 327 | + } |
| 328 | + } ) |
| 329 | + .error( errorHandler ); |
| 330 | + } |
| 331 | + |
| 332 | + /** |
| 333 | + * Restore a hidden item to full visibility (event handler) |
| 334 | + */ |
| 335 | + function restoreItem(e) { |
| 336 | + var $item = $(this).closest('.fbd-item'); |
| 337 | + |
| 338 | + confirmAction( { 'mbaction' : 'restore' }, $item ); |
| 339 | + e.preventDefault(); |
| 340 | + } |
| 341 | + |
| 342 | + /** |
| 343 | + * Hide a item from view (event handler) |
| 344 | + */ |
| 345 | + function hideItem(e) { |
| 346 | + var $item = $(this).closest('.fbd-item'); |
| 347 | + closeAllResponders(); //if any are open |
| 348 | + confirmAction( { 'mbaction' : 'hide' }, $item ); |
| 349 | + e.preventDefault(); |
| 350 | + } |
| 351 | + |
| 352 | + /** |
| 353 | + * Method to close all responders. |
| 354 | + * Remove all .fbd-response-form from the dashboard |
| 355 | + */ |
| 356 | + function closeAllResponders() { |
| 357 | + |
| 358 | + $( '.fbd-item').each(function(index, value){ |
| 359 | + |
| 360 | + $link = $( this ).find('.fbd-respond-link'); |
| 361 | + if( $link.hasClass('responder-expanded') ) { |
| 362 | + |
| 363 | + $link.find('span').text( mw.msg( 'moodbar-respond-collapsed' ) ) |
| 364 | + .parent() |
| 365 | + .removeClass('responder-expanded'); |
| 366 | + |
| 367 | + $( this ).find('.fbd-response-form').remove(); |
| 368 | + } |
| 369 | + }); |
| 370 | + } |
| 371 | + |
| 372 | + /** |
| 373 | + * Show the Response form for the item |
| 374 | + * Build the response form elements once |
| 375 | + * |
| 376 | + */ |
| 377 | + function showResponseForm(e){ |
| 378 | + |
| 379 | + if( $(this).hasClass('responder-expanded') ) { |
| 380 | + |
| 381 | + closeAllResponders(); |
| 382 | + |
| 383 | + } else { |
| 384 | + |
| 385 | + //init terms of use link |
| 386 | + var termsofuse = mw.html.element ('a', { |
| 387 | + 'href': mw.msg( 'moodbar-response-terms-of-use-link' ), |
| 388 | + 'title': mw.msg( 'moodbar-response-terms-of-use' ), |
| 389 | + 'target': '_new' |
| 390 | + }, mw.msg( 'moodbar-response-terms-of-use' ) ); |
| 391 | + |
| 392 | + //creative commons link |
| 393 | + var creativecommons = mw.html.element('a', { |
| 394 | + 'href': mw.msg ( 'moodbar-response-cc-link' ), |
| 395 | + 'title': mw.msg ( 'moodbar-response-cc' ), |
| 396 | + 'target': '_new' |
| 397 | + }, mw.msg ( 'moodbar-response-cc' ) ); |
| 398 | + |
| 399 | + //gfdl |
| 400 | + var gfdl = mw.html.element('a', { |
| 401 | + 'href': mw.msg( 'moodbar-response-gfdl-link' ), |
| 402 | + 'title': mw.msg( 'moodbar-response-gfdl' ), |
| 403 | + 'target': '_new' |
| 404 | + }, mw.msg( 'moodbar-response-gfdl' ) ); |
| 405 | + |
| 406 | + //ULA |
| 407 | + var ula = mw.msg( 'moodbar-response-ula' ) |
| 408 | + .replace ( /\$1/, mw.msg( 'moodbar-response-btn') ) |
| 409 | + .replace ( /\$2/, termsofuse) |
| 410 | + .replace ( /\$3/, creativecommons) |
| 411 | + .replace ( /\$4/, gfdl); |
| 412 | + |
| 413 | + //build form |
| 414 | + var inlineForm = $('<div>').attr( 'class', 'fbd-response-form' ) |
| 415 | + .append( |
| 416 | + $('<b>').html( mw.msg( 'moodbar-response-add' ) ) |
| 417 | + ).append( |
| 418 | + $('<small>').attr( 'class', 'fbd-text-gray' ).html( ' (' + mw.msg( 'moodbar-response-nosig' ) + ') ' ) |
| 419 | + ).append( |
| 420 | + $('<div>').attr( 'class', 'fbd-response-formNote' ) |
| 421 | + .append($('<small>') |
| 422 | + .append( |
| 423 | + $('<span>').attr( 'class', 'fbd-response-charCount' ) |
| 424 | + ).append( |
| 425 | + $('<span>').html( mw.msg( 'moodbar-form-note-dynamic' ).replace( /\$1/g, "" ) ) |
| 426 | + ) |
| 427 | + ) |
| 428 | + ).append( |
| 429 | + $('<textarea>').attr( { 'class':'fbd-response-text', 'name':'fbd-response-text' } ) |
| 430 | + ).append( |
| 431 | + $('<div>').attr('class', 'ula').html( ula ) |
| 432 | + ).append( |
| 433 | + $('<button>').attr( 'class', 'fbd-response-submit' ).html( mw.msg( 'moodbar-response-btn' ) + ' ' + mw.msg( 'moodbar-respond-collapsed' ) ) |
| 434 | + .attr({'disabled':'true'}) |
| 435 | + ).append( |
| 436 | + $('<div>').attr( 'style', 'clear:both' ) |
| 437 | + ); |
| 438 | + |
| 439 | + //get the feedbackItem |
| 440 | + var $item = $(this).closest('.fbd-item'); |
| 441 | + |
| 442 | + closeAllResponders(); |
| 443 | + |
| 444 | + $(this).find('span').text( mw.msg( 'moodbar-respond-expanded' ) ) |
| 445 | + .parent() |
| 446 | + .addClass( 'responder-expanded' ) |
| 447 | + .end(); |
| 448 | + |
| 449 | + $item.append(inlineForm) |
| 450 | + .find('.fbd-response-text') |
| 451 | + .NobleCount('.fbd-response-charCount', {max_chars:5000}) |
| 452 | + .end() |
| 453 | + .find('.fbd-response-text') |
| 454 | + .keyup( function(event) { |
| 455 | + validateResponse($item); |
| 456 | + }) |
| 457 | + .end() |
| 458 | + .find('.fbd-response-submit') |
| 459 | + .click (function () { |
| 460 | + var fbResponse = $item.find('.fbd-response-text').val(); |
| 461 | + if( fbResponse ){ |
| 462 | + var clientData = $.client.profile(), |
| 463 | + item_id = $item.data('mbccontinue').split('|')[1], |
| 464 | + resData = { |
| 465 | + 'action':'feedbackdashboardresponse', |
| 466 | + 'useragent': clientData.name + '/' + clientData.versionNumber, |
| 467 | + 'system': clientData.platform, |
| 468 | + 'token': mw.config.get('mbEditToken'), |
| 469 | + 'response': fbResponse, |
| 470 | + 'feedback': item_id, |
| 471 | + 'format':'json' |
| 472 | + }; |
| 473 | + $item.find('.fbd-item-response').remove(); //remove feedback response link for duration of request |
| 474 | + var $spinner = $('<span class="mw-ajax-loader"> </span>'); |
| 475 | + $responseForm = $item.find('.fbd-response-form').empty().append( $spinner ); |
| 476 | + |
| 477 | + //send response |
| 478 | + $.ajax( { |
| 479 | + 'type': 'POST', |
| 480 | + 'url': mw.util.wikiScript( 'api' ), |
| 481 | + 'data': resData, |
| 482 | + 'success': function (data) { |
| 483 | + inlineMessage($responseForm, mw.msg( 'feedbackresponse-success' ), function() { |
| 484 | + closeAllResponders(); |
| 485 | + reloadItem( $item, true ); |
| 486 | + }); |
| 487 | + }, |
| 488 | + 'error': function( jqXHR, textStatus, errorThrown ) { |
| 489 | + //ajax error |
| 490 | + inlineMessage($responseForm, mw.msg( 'moodbar-feedback-ajaxerror' ), function() { |
| 491 | + closeAllResponders(); |
| 492 | + reloadItem( $item, true ); |
| 493 | + }); |
| 494 | + |
| 495 | + }, |
| 496 | + 'dataType': 'json' |
| 497 | + } ); |
| 498 | + |
| 499 | + } |
| 500 | + }) |
| 501 | + .end(); |
| 502 | + } |
| 503 | + e.preventDefault(); |
| 504 | + |
| 505 | + } |
| 506 | + |
| 507 | + /** |
| 508 | + * Toggle submit button from enabled to disabled |
| 509 | + * Depends on value of .fbd-response-text |
| 510 | + * @param $item jQuery item containing the .fbd-item |
| 511 | + */ |
| 512 | + function validateResponse($item) { |
| 513 | + if( $item.find('.fbd-response-text').val() !== "" ) { |
| 514 | + $item.find( '.fbd-response-submit').removeAttr('disabled'); |
| 515 | + } else { |
| 516 | + $item.find( '.fbd-response-submit').attr({'disabled':'true'}); |
| 517 | + } |
| 518 | + } |
| 519 | + |
| 520 | + /** |
| 521 | + * Send Message to item in regards with response |
| 522 | + * @param $el Element to display message inside of and fadeout |
| 523 | + * @param msg text to display |
| 524 | + * @callback to execute after fadeOut |
| 525 | + */ |
| 526 | + function inlineMessage( $el, msg, callback) { |
| 527 | + $el.empty() |
| 528 | + .html( msg ) |
| 529 | + .delay(2000) |
| 530 | + .fadeOut('slow', callback); |
| 531 | + } |
| 532 | + |
| 533 | + |
| 534 | + // On-load stuff |
| 535 | + |
| 536 | + $('.fbd-item-show a').live( 'click', showHiddenItem ); |
| 537 | + |
| 538 | + $('.fbd-item-hide a').live( 'click', hideItem ); |
| 539 | + |
| 540 | + $('.fbd-item-restore').live( 'click', restoreItem ); |
| 541 | + |
| 542 | + $('.fbd-respond-link').live ('click', showResponseForm ); |
| 543 | + |
| 544 | + $( '#fbd-filters' ).children( 'form' ).submit( function( e ) { |
| 545 | + e.preventDefault(); |
| 546 | + saveFormState(); |
| 547 | + setCookies(); |
| 548 | + loadComments( 'filter' ); |
| 549 | + } ); |
| 550 | + |
| 551 | + $( '#fbd-list-more' ).children( 'a' ).click( function( e ) { |
| 552 | + e.preventDefault(); |
| 553 | + // We don't call saveFormState() here because we want to use the state of the form |
| 554 | + // at the time it was last filtered. Otherwise, you would see strange behavior if |
| 555 | + // you changed the form state then clicked More. |
| 556 | + loadComments( 'more' ); |
| 557 | + } ); |
| 558 | + |
| 559 | + saveFormState(); |
| 560 | + var filterType = $( '#fbd-filters' ).children( 'form' ).data( 'filtertype' ); |
| 561 | + // If filtering already happened on the PHP side, don't load the form state from cookies |
| 562 | + if ( filterType != 'filtered' ) { |
| 563 | + // Don't do an AJAX filter if we're on an ID view, or if the form is still blank after loadFromCookies() |
| 564 | + if ( loadFromCookies() && filterType != 'id' ) { |
| 565 | + saveFormState(); |
| 566 | + loadComments( 'filter' ); |
| 567 | + } |
| 568 | + } |
| 569 | + |
| 570 | +} ); |
Property changes on: branches/wmf/1.18wmf1/extensions/MoodBar/modules/ext.moodBar.dashboard/ext.moodBar.dashboard.js |
___________________________________________________________________ |
Added: svn:eol-style |
1 | 571 | + native |
Index: branches/wmf/1.18wmf1/extensions/MoodBar/modules/ext.moodBar.dashboard/images/emoticon-happy.png |
Cannot display: file marked as a binary type. |
svn:mime-type = image/png |
Property changes on: branches/wmf/1.18wmf1/extensions/MoodBar/modules/ext.moodBar.dashboard/images/emoticon-happy.png |
___________________________________________________________________ |
Added: svn:mime-type |
2 | 572 | + image/png |
Index: branches/wmf/1.18wmf1/extensions/MoodBar/modules/ext.moodBar.dashboard/images/page-more.png |
Cannot display: file marked as a binary type. |
svn:mime-type = image/png |
Property changes on: branches/wmf/1.18wmf1/extensions/MoodBar/modules/ext.moodBar.dashboard/images/page-more.png |
___________________________________________________________________ |
Added: svn:mime-type |
3 | 573 | + image/png |
Index: branches/wmf/1.18wmf1/extensions/MoodBar/modules/ext.moodBar.dashboard/images/filter-issues.png |
Cannot display: file marked as a binary type. |
svn:mime-type = image/png |
Property changes on: branches/wmf/1.18wmf1/extensions/MoodBar/modules/ext.moodBar.dashboard/images/filter-issues.png |
___________________________________________________________________ |
Added: svn:mime-type |
4 | 574 | + image/png |
Index: branches/wmf/1.18wmf1/extensions/MoodBar/modules/ext.moodBar.dashboard/images/page-disabled-ltr.png |
Cannot display: file marked as a binary type. |
svn:mime-type = image/png |
Property changes on: branches/wmf/1.18wmf1/extensions/MoodBar/modules/ext.moodBar.dashboard/images/page-disabled-ltr.png |
___________________________________________________________________ |
Added: svn:mime-type |
5 | 575 | + image/png |
Index: branches/wmf/1.18wmf1/extensions/MoodBar/modules/ext.moodBar.dashboard/images/page-disabled-rtl.png |
Cannot display: file marked as a binary type. |
svn:mime-type = image/png |
Property changes on: branches/wmf/1.18wmf1/extensions/MoodBar/modules/ext.moodBar.dashboard/images/page-disabled-rtl.png |
___________________________________________________________________ |
Added: svn:mime-type |
6 | 576 | + image/png |
Index: branches/wmf/1.18wmf1/extensions/MoodBar/modules/ext.moodBar.dashboard/images/emoticon-confused.png |
Cannot display: file marked as a binary type. |
svn:mime-type = image/png |
Property changes on: branches/wmf/1.18wmf1/extensions/MoodBar/modules/ext.moodBar.dashboard/images/emoticon-confused.png |
___________________________________________________________________ |
Added: svn:mime-type |
7 | 577 | + image/png |
Index: branches/wmf/1.18wmf1/extensions/MoodBar/modules/ext.moodBar.dashboard/images/emoticon-sad.png |
Cannot display: file marked as a binary type. |
svn:mime-type = image/png |
Property changes on: branches/wmf/1.18wmf1/extensions/MoodBar/modules/ext.moodBar.dashboard/images/emoticon-sad.png |
___________________________________________________________________ |
Added: svn:mime-type |
8 | 578 | + image/png |
Index: branches/wmf/1.18wmf1/extensions/MoodBar/modules/ext.moodBar.dashboard/images/page-active-ltr.png |
Cannot display: file marked as a binary type. |
svn:mime-type = image/png |
Property changes on: branches/wmf/1.18wmf1/extensions/MoodBar/modules/ext.moodBar.dashboard/images/page-active-ltr.png |
___________________________________________________________________ |
Added: svn:mime-type |
9 | 579 | + image/png |
Index: branches/wmf/1.18wmf1/extensions/MoodBar/modules/ext.moodBar.dashboard/images/page-active-rtl.png |
Cannot display: file marked as a binary type. |
svn:mime-type = image/png |
Property changes on: branches/wmf/1.18wmf1/extensions/MoodBar/modules/ext.moodBar.dashboard/images/page-active-rtl.png |
___________________________________________________________________ |
Added: svn:mime-type |
10 | 580 | + image/png |
Index: branches/wmf/1.18wmf1/extensions/MoodBar/modules/ext.moodBar.dashboard/images/filter-confusion.png |
Cannot display: file marked as a binary type. |
svn:mime-type = image/png |
Property changes on: branches/wmf/1.18wmf1/extensions/MoodBar/modules/ext.moodBar.dashboard/images/filter-confusion.png |
___________________________________________________________________ |
Added: svn:mime-type |
11 | 581 | + image/png |
Index: branches/wmf/1.18wmf1/extensions/MoodBar/modules/ext.moodBar.dashboard/images/filter-praise.png |
Cannot display: file marked as a binary type. |
svn:mime-type = image/png |
Property changes on: branches/wmf/1.18wmf1/extensions/MoodBar/modules/ext.moodBar.dashboard/images/filter-praise.png |
___________________________________________________________________ |
Added: svn:mime-type |
12 | 582 | + image/png |
Index: branches/wmf/1.18wmf1/extensions/MoodBar/modules/ext.moodBar.dashboard/images/button-white.png |
Cannot display: file marked as a binary type. |
svn:mime-type = image/png |
Property changes on: branches/wmf/1.18wmf1/extensions/MoodBar/modules/ext.moodBar.dashboard/images/button-white.png |
___________________________________________________________________ |
Added: svn:mime-type |
13 | 583 | + image/png |
Index: branches/wmf/1.18wmf1/extensions/MoodBar/modules/ext.moodBar.dashboard/images/button-gray.png |
Cannot display: file marked as a binary type. |
svn:mime-type = image/png |
Property changes on: branches/wmf/1.18wmf1/extensions/MoodBar/modules/ext.moodBar.dashboard/images/button-gray.png |
___________________________________________________________________ |
Added: svn:mime-type |
14 | 584 | + image/png |
Index: branches/wmf/1.18wmf1/extensions/MoodBar/MoodBar.php |
— | — | @@ -0,0 +1,211 @@ |
| 2 | +<?php |
| 3 | +/** |
| 4 | + * MoodBar extension |
| 5 | + * Allows specified users to send their "mood" back to the site operator. |
| 6 | + */ |
| 7 | + |
| 8 | +$wgExtensionCredits['other'][] = array( |
| 9 | + 'author' => array( 'Andrew Garrett', 'Timo Tijhof' ), |
| 10 | + 'descriptionmsg' => 'moodbar-desc', |
| 11 | + 'name' => 'MoodBar', |
| 12 | + 'url' => 'http://www.mediawiki.org/wiki/MoodBar', |
| 13 | + 'version' => '0.1', |
| 14 | + 'path' => __FILE__, |
| 15 | +); |
| 16 | + |
| 17 | +// Object model |
| 18 | +$wgAutoloadClasses['MBFeedbackItem'] = dirname(__FILE__).'/FeedbackItem.php'; |
| 19 | +$wgAutoloadClasses['MBFeedbackResponseItem'] = dirname(__FILE__).'/FeedbackResponseItem.php'; |
| 20 | +$wgAutoloadClasses['MoodBarFormatter'] = dirname(__FILE__).'/Formatter.php'; |
| 21 | + |
| 22 | +// API |
| 23 | +$wgAutoloadClasses['ApiMoodBar'] = dirname(__FILE__).'/ApiMoodBar.php'; |
| 24 | +$wgAPIModules['moodbar'] = 'ApiMoodBar'; |
| 25 | +$wgAutoloadClasses['ApiQueryMoodBarComments'] = dirname( __FILE__ ). '/ApiQueryMoodBarComments.php'; |
| 26 | +$wgAPIListModules['moodbarcomments'] = 'ApiQueryMoodBarComments'; |
| 27 | +$wgAutoloadClasses['ApiFeedbackDashboard'] = dirname(__FILE__).'/ApiFeedbackDashboard.php'; |
| 28 | +$wgAPIModules['feedbackdashboard'] = 'ApiFeedbackDashboard'; |
| 29 | +$wgAutoloadClasses['ApiFeedbackDashboardResponse'] = dirname(__FILE__).'/ApiFeedbackDashboardResponse.php'; |
| 30 | +$wgAPIModules['feedbackdashboardresponse'] = 'ApiFeedbackDashboardResponse'; |
| 31 | + |
| 32 | +// Hooks |
| 33 | +$wgAutoloadClasses['MoodBarHooks'] = dirname(__FILE__).'/MoodBar.hooks.php'; |
| 34 | +$wgHooks['BeforePageDisplay'][] = 'MoodBarHooks::onPageDisplay'; |
| 35 | +$wgHooks['ResourceLoaderGetConfigVars'][] = 'MoodBarHooks::resourceLoaderGetConfigVars'; |
| 36 | +$wgHooks['MakeGlobalVariablesScript'][] = 'MoodBarHooks::makeGlobalVariablesScript'; |
| 37 | +$wgHooks['LoadExtensionSchemaUpdates'][] = 'MoodBarHooks::onLoadExtensionSchemaUpdates'; |
| 38 | + |
| 39 | +// Special pages |
| 40 | +$wgAutoloadClasses['SpecialMoodBar'] = dirname(__FILE__).'/SpecialMoodBar.php'; |
| 41 | +$wgSpecialPages['MoodBar'] = 'SpecialMoodBar'; |
| 42 | +$wgAutoloadClasses['SpecialFeedbackDashboard'] = dirname( __FILE__ ) . '/SpecialFeedbackDashboard.php'; |
| 43 | +$wgSpecialPages['FeedbackDashboard'] = 'SpecialFeedbackDashboard'; |
| 44 | + |
| 45 | +$dashboardFormsPath = dirname(__FILE__) . '/DashboardForms.php'; |
| 46 | +$wgAutoloadClasses['MBDashboardForm'] = $dashboardFormsPath; |
| 47 | +$wgAutoloadClasses['MBActionForm'] = $dashboardFormsPath; |
| 48 | +$wgAutoloadClasses['MBHideForm'] = $dashboardFormsPath; |
| 49 | +$wgAutoloadClasses['MBRestoreForm'] = $dashboardFormsPath; |
| 50 | + |
| 51 | +$wgLogTypes[] = 'moodbar'; |
| 52 | +$wgLogNames['moodbar'] = 'moodbar-log-name'; |
| 53 | +$wgLogHeaders['moodbar'] = 'moodbar-log-header'; |
| 54 | +$wgLogActions += array( |
| 55 | + 'moodbar/hide' => 'moodbar-log-hide', |
| 56 | + 'moodbar/restore' => 'moodbar-log-restore', |
| 57 | +); |
| 58 | + |
| 59 | +// User rights |
| 60 | +$wgAvailableRights[] = 'moodbar-view'; |
| 61 | +$wgAvailableRights[] = 'moodbar-admin'; |
| 62 | + |
| 63 | +$wgGroupPermissions['sysop']['moodbar-admin'] = true; |
| 64 | + |
| 65 | +// Internationalisation |
| 66 | +$wgExtensionMessagesFiles['MoodBar'] = dirname(__FILE__).'/MoodBar.i18n.php'; |
| 67 | +$wgExtensionMessagesFiles['MoodBarAliases'] = dirname( __FILE__ ) . '/MoodBar.alias.php'; |
| 68 | + |
| 69 | +// Resources |
| 70 | +$mbResourceTemplate = array( |
| 71 | + 'localBasePath' => dirname(__FILE__) . '/modules', |
| 72 | + 'remoteExtPath' => 'MoodBar/modules' |
| 73 | +); |
| 74 | + |
| 75 | +$wgResourceModules['ext.moodBar.init'] = $mbResourceTemplate + array( |
| 76 | + 'styles' => 'ext.moodBar/ext.moodBar.init.css', |
| 77 | + 'scripts' => 'ext.moodBar/ext.moodBar.init.js', |
| 78 | + 'messages' => array( |
| 79 | + 'moodbar-trigger-feedback', |
| 80 | + 'moodbar-trigger-share', |
| 81 | + 'moodbar-trigger-editing', |
| 82 | + 'tooltip-p-moodbar-trigger-feedback', |
| 83 | + 'tooltip-p-moodbar-trigger-share', |
| 84 | + 'tooltip-p-moodbar-trigger-editing', |
| 85 | + ), |
| 86 | + 'position' => 'top', |
| 87 | + 'dependencies' => array( |
| 88 | + 'jquery.cookie', |
| 89 | + 'jquery.client', |
| 90 | + ), |
| 91 | +); |
| 92 | + |
| 93 | +$oldVersion = version_compare( $wgVersion, '1.17', '<=' ); |
| 94 | + |
| 95 | +if ( !$oldVersion ) { |
| 96 | + $wgResourceModules['ext.moodBar.init']['dependencies'][] = 'mediawiki.user'; |
| 97 | +} |
| 98 | + |
| 99 | + |
| 100 | +$wgResourceModules['jquery.NobleCount'] = $mbResourceTemplate + array( |
| 101 | + 'scripts' => 'jquery.NobleCount/jquery.NobleCount.js', |
| 102 | +); |
| 103 | + |
| 104 | +$wgResourceModules['ext.moodBar.core'] = $mbResourceTemplate + array( |
| 105 | + 'styles' => 'ext.moodBar/ext.moodBar.core.css', |
| 106 | + 'scripts' => 'ext.moodBar/ext.moodBar.core.js', |
| 107 | + 'messages' => array( |
| 108 | + 'moodbar-close', |
| 109 | + 'moodbar-intro-feedback', |
| 110 | + 'moodbar-intro-share', |
| 111 | + 'moodbar-intro-editing', |
| 112 | + 'moodbar-type-happy-title', |
| 113 | + 'moodbar-type-sad-title', |
| 114 | + 'moodbar-type-confused-title', |
| 115 | + 'tooltip-moodbar-what', |
| 116 | + 'moodbar-what-target', |
| 117 | + 'moodbar-what-label', |
| 118 | + 'moodbar-what-expanded', |
| 119 | + 'moodbar-what-collapsed', |
| 120 | + 'moodbar-what-content', |
| 121 | + 'moodbar-what-link', |
| 122 | + 'moodbar-form-title', |
| 123 | + 'moodbar-form-note', |
| 124 | + 'moodbar-form-note-dynamic', |
| 125 | + 'moodbar-form-policy-text', |
| 126 | + 'moodbar-form-policy-label', |
| 127 | + 'moodbar-form-submit', |
| 128 | + 'moodbar-privacy', |
| 129 | + 'moodbar-privacy-link', |
| 130 | + 'moodbar-disable-link', |
| 131 | + 'moodbar-loading-title', |
| 132 | + 'moodbar-error-title', |
| 133 | + 'moodbar-success-title', |
| 134 | + 'moodbar-loading-subtitle', |
| 135 | + 'moodbar-error-subtitle', |
| 136 | + 'moodbar-success-subtitle', |
| 137 | + ), |
| 138 | + 'dependencies' => array( |
| 139 | + 'mediawiki.util', |
| 140 | + 'ext.moodBar.init', // just in case |
| 141 | + 'jquery.localize', |
| 142 | + 'jquery.NobleCount', |
| 143 | + 'jquery.moodBar', |
| 144 | + ), |
| 145 | + 'position' => 'bottom', |
| 146 | +); |
| 147 | + |
| 148 | +$wgResourceModules['ext.moodBar.dashboard'] = $mbResourceTemplate + array( |
| 149 | + 'scripts' => 'ext.moodBar.dashboard/ext.moodBar.dashboard.js', |
| 150 | + 'dependencies' => array( |
| 151 | + 'mediawiki.util', |
| 152 | + 'jquery.NobleCount' |
| 153 | + ), |
| 154 | + 'messages' => array( |
| 155 | + 'moodbar-feedback-nomore', |
| 156 | + 'moodbar-feedback-noresults', |
| 157 | + 'moodbar-feedback-ajaxerror', |
| 158 | + 'moodbar-feedback-action-error', |
| 159 | + 'moodbar-action-reason', |
| 160 | + 'moodbar-action-reason-required', |
| 161 | + 'moodbar-feedback-action-confirm', |
| 162 | + 'moodbar-feedback-action-cancel', |
| 163 | + 'moodbar-respond-text', |
| 164 | + 'moodbar-respond-collapsed', |
| 165 | + 'moodbar-respond-expanded', |
| 166 | + 'moodbar-response-add', |
| 167 | + 'moodbar-response-nosig', |
| 168 | + 'moodbar-response-btn', |
| 169 | + 'moodbar-form-note-dynamic', |
| 170 | + 'moodbar-response-ula', |
| 171 | + 'moodbar-response-terms-of-use', |
| 172 | + 'moodbar-response-terms-of-use-link', |
| 173 | + 'moodbar-response-cc', |
| 174 | + 'moodbar-response-cc-link', |
| 175 | + 'moodbar-response-gfdl', |
| 176 | + 'moodbar-response-gfdl-link', |
| 177 | + 'feedbackresponse-success', |
| 178 | + ), |
| 179 | +); |
| 180 | + |
| 181 | +$wgResourceModules['ext.moodBar.dashboard.styles'] = $mbResourceTemplate + array( |
| 182 | + 'styles' => 'ext.moodBar.dashboard/ext.moodBar.dashboard.css', |
| 183 | +); |
| 184 | + |
| 185 | +$wgResourceModules['jquery.moodBar'] = $mbResourceTemplate + array( |
| 186 | + 'scripts' => 'jquery.moodBar/jquery.moodBar.js', |
| 187 | + 'dependencies' => array( |
| 188 | + 'mediawiki.util', |
| 189 | + ), |
| 190 | +); |
| 191 | + |
| 192 | +/** Configuration **/ |
| 193 | +/** The registration time after which users will be shown the MoodBar **/ |
| 194 | +$wgMoodBarCutoffTime = null; |
| 195 | + |
| 196 | +/** MoodBar configuration settings **/ |
| 197 | +$wgMoodBarConfig = array( |
| 198 | + 'bucketConfig' => |
| 199 | + array( |
| 200 | + 'buckets' => |
| 201 | + array( |
| 202 | + 'feedback' => 80, |
| 203 | + 'share' => 10, |
| 204 | + 'editing' => 10, |
| 205 | + ), |
| 206 | + 'version' => 3, |
| 207 | + 'expires' => 30, |
| 208 | + ), |
| 209 | + 'infoUrl' => 'http://www.mediawiki.org/wiki/MoodBar', |
| 210 | + 'privacyUrl' => 'about:blank', |
| 211 | + 'disableExpiration' => 365, |
| 212 | +); |
Property changes on: branches/wmf/1.18wmf1/extensions/MoodBar/MoodBar.php |
___________________________________________________________________ |
Added: svn:eol-style |
1 | 213 | + native |
Index: branches/wmf/1.18wmf1/extensions/MoodBar/SpecialMoodBar.php |
— | — | @@ -0,0 +1,122 @@ |
| 2 | +<?php |
| 3 | + |
| 4 | +class SpecialMoodBar extends SpecialPage { |
| 5 | + static $fields = array( |
| 6 | + 'mbf_id' => 'id', |
| 7 | + 'mbf_timestamp' => 'timestamp', |
| 8 | + 'mbf_type' => 'type', |
| 9 | + 'mbf_namespace' => 'namespace', |
| 10 | + 'mbf_title' => 'page', |
| 11 | + 'user-type' => 'usertype', |
| 12 | + 'mbs_user_id' => 'user', |
| 13 | + 'mbf_user_editcount' => 'user-editcount', |
| 14 | + 'mbf_editing' => 'editmode', |
| 15 | + 'mbf_bucket' => 'bucket', |
| 16 | + 'mbf_system_type' => 'system', |
| 17 | + 'mbf_locale' => 'locale', |
| 18 | + 'mbf_user_agent' => 'useragent', |
| 19 | + 'mbf_comment' => 'comment', |
| 20 | + ); |
| 21 | + |
| 22 | + function __construct() { |
| 23 | + parent::__construct( 'MoodBar', 'moodbar-view' ); |
| 24 | + } |
| 25 | + |
| 26 | + function getDescription() { |
| 27 | + return wfMessage( 'moodbar-admin-title' )->plain(); |
| 28 | + } |
| 29 | + |
| 30 | + function execute($par) { |
| 31 | + global $wgUser, $wgOut; |
| 32 | + |
| 33 | + if ( !$this->userCanExecute( $wgUser ) ) { |
| 34 | + $this->displayRestrictionError(); |
| 35 | + return; |
| 36 | + } |
| 37 | + |
| 38 | + $wgOut->setPageTitle( wfMsg( 'moodbar-admin-title' ) ); |
| 39 | + $wgOut->addWikiMsg( 'moodbar-admin-intro' ); |
| 40 | + |
| 41 | + $pager = new MoodBarPager(); |
| 42 | + |
| 43 | + if ( $pager->getNumRows() > 0 ) { |
| 44 | + $wgOut->addHTML( |
| 45 | + $pager->getNavigationBar() . |
| 46 | + $pager->getBody() . |
| 47 | + $pager->getNavigationBar() |
| 48 | + ); |
| 49 | + } else { |
| 50 | + $wgOut->addWikiMsg( 'moodbar-admin-empty' ); |
| 51 | + } |
| 52 | + } |
| 53 | +} |
| 54 | + |
| 55 | +class MoodBarPager extends TablePager { |
| 56 | + function getFieldNames() { |
| 57 | + static $headers = null; |
| 58 | + |
| 59 | + if ( is_null( $headers ) ) { |
| 60 | + $headers = array(); |
| 61 | + foreach( SpecialMoodBar::$fields as $field => $property ) { |
| 62 | + $headers[$field] = wfMessage("moodbar-header-$property")->text(); |
| 63 | + } |
| 64 | + } |
| 65 | + |
| 66 | + return $headers; |
| 67 | + } |
| 68 | + |
| 69 | + // Overridden from TablePager, it's just easier because |
| 70 | + // we're doing things with a proper object model |
| 71 | + function formatRow( $row ) { |
| 72 | + $out = ''; |
| 73 | + |
| 74 | + $data = MBFeedbackItem::load( $row ); |
| 75 | + $outData = null; |
| 76 | + |
| 77 | + foreach( SpecialMoodBar::$fields as $field ) { |
| 78 | + $outData = MoodBarFormatter::getHTMLRepresentation( $data, $field ); |
| 79 | + $out .= Xml::tags( 'td', null, $outData ); |
| 80 | + } |
| 81 | + |
| 82 | + $out = Xml::tags( 'tr', $this->getRowAttrs($row), $out ) . "\n"; |
| 83 | + return $out; |
| 84 | + } |
| 85 | + |
| 86 | + function formatValue( $name, $value ) { |
| 87 | + return ''; |
| 88 | + } |
| 89 | + |
| 90 | + function getQueryInfo() { |
| 91 | + $info = array( |
| 92 | + 'tables' => array('moodbar_feedback', 'user'), |
| 93 | + 'fields' => '*', |
| 94 | + 'join_conds' => array( |
| 95 | + 'user' => array( |
| 96 | + 'left join', |
| 97 | + 'user_id=mbf_user_id', |
| 98 | + ), |
| 99 | + ), |
| 100 | + ); |
| 101 | + |
| 102 | + return $info; |
| 103 | + } |
| 104 | + |
| 105 | + function getDefaultSort() { |
| 106 | + return 'mbf_id'; |
| 107 | + } |
| 108 | + |
| 109 | + function isFieldSortable( $name ) { |
| 110 | + $sortable = array( |
| 111 | + 'mbf_id', |
| 112 | + 'mbf_type', |
| 113 | + 'mbf_user_id', |
| 114 | + 'mbf_namespace', |
| 115 | + ); |
| 116 | + |
| 117 | + return in_array( $name, $sortable ); |
| 118 | + } |
| 119 | + |
| 120 | + function getTitle() { |
| 121 | + return SpecialPage::getTitleFor( 'MoodBar' ); |
| 122 | + } |
| 123 | +} |
Property changes on: branches/wmf/1.18wmf1/extensions/MoodBar/SpecialMoodBar.php |
___________________________________________________________________ |
Added: svn:eol-style |
1 | 124 | + native |
Index: branches/wmf/1.18wmf1/extensions/MoodBar/exportMoodBar.php |
— | — | @@ -0,0 +1,102 @@ |
| 2 | +<?php |
| 3 | + |
| 4 | +$IP = getenv( 'MW_INSTALL_PATH' ); |
| 5 | +if ( $IP === false ) { |
| 6 | + $IP = dirname( __FILE__ ) . '/../..'; |
| 7 | +} |
| 8 | +require( "$IP/maintenance/Maintenance.php" ); |
| 9 | + |
| 10 | +class ExportMoodBar extends Maintenance { |
| 11 | + protected $fields = array( |
| 12 | + 'id', |
| 13 | + 'timestamp', |
| 14 | + 'type', |
| 15 | + 'namespace', |
| 16 | + 'page', |
| 17 | + 'own-talk', |
| 18 | + 'usertype', |
| 19 | + 'user', |
| 20 | + 'user-editcount', |
| 21 | + 'editmode', |
| 22 | + 'bucket', |
| 23 | + 'system', |
| 24 | + 'locale', |
| 25 | + 'useragent', |
| 26 | + 'comment', |
| 27 | + ); |
| 28 | + |
| 29 | + public function __construct() { |
| 30 | + parent::__construct(); |
| 31 | + $this->mDescription = "Exports MoodBar feedback"; |
| 32 | + $this->addOption( 'since-id', 'Get feedback after this ID' ); |
| 33 | + $this->addOption( 'since-time', 'Get feedback after this time' ); |
| 34 | + } |
| 35 | + |
| 36 | + public function execute() { |
| 37 | + $dbr = wfGetDB( DB_SLAVE ); |
| 38 | + $lastRowCount = 1; |
| 39 | + $fh = fopen('php://stdout', 'w'); |
| 40 | + |
| 41 | + $offsetCond = array( 1 ); |
| 42 | + |
| 43 | + if ( $this->getOption('since-id') ) { |
| 44 | + $offsetCond[] = 'mbf_id > '.$dbr->addQuotes( $this->getArg('since-id') ); |
| 45 | + } |
| 46 | + |
| 47 | + if ( $this->getOption('since-time') ) { |
| 48 | + $ts = $dbr->timestamp( $this->getArg('since-id') ); |
| 49 | + $offsetCond[] = 'mbf_timestamp > '.$dbr->addQuotes( $ts ); |
| 50 | + } |
| 51 | + |
| 52 | + fputcsv( $fh, $this->fields ); |
| 53 | + $lastId = 0; |
| 54 | + |
| 55 | + while ( $lastRowCount > 0 ) { |
| 56 | + $res = $dbr->select( |
| 57 | + array('moodbar_feedback','user'), |
| 58 | + '*', |
| 59 | + $offsetCond, |
| 60 | + __METHOD__, |
| 61 | + array( 'LIMIT' => 500 ), |
| 62 | + array( |
| 63 | + 'user' => array( |
| 64 | + 'left join', |
| 65 | + 'user_id=mbf_user_id' |
| 66 | + ) |
| 67 | + ) |
| 68 | + ); |
| 69 | + |
| 70 | + $lastRowCount = $dbr->numRows( $res ); |
| 71 | + |
| 72 | + foreach( $res as $row ) { |
| 73 | + $this->outputRow( $fh, $row ); |
| 74 | + $lastId = $row->mbf_id; |
| 75 | + } |
| 76 | + |
| 77 | + $offsetCond = 'mbf_id > ' . $dbr->addQuotes( $lastId ); |
| 78 | + } |
| 79 | + } |
| 80 | + |
| 81 | + protected function outputRow( $fh, $row ) { |
| 82 | + //if there is an exception when setting this single record |
| 83 | + //record it so it won't stop the outputting of other records |
| 84 | + try { |
| 85 | + $item = MBFeedbackItem::load( $row ); |
| 86 | + |
| 87 | + $user = User::newFromRow( $row ); |
| 88 | + $outData = array(); |
| 89 | + |
| 90 | + foreach( $this->fields as $field ) { |
| 91 | + $outData[] = MoodBarFormatter::getInternalRepresentation( $item, $field ); |
| 92 | + } |
| 93 | + } |
| 94 | + catch (Exception $e) { |
| 95 | + $outData[] = wfMessage('moodbar-feedback-load-record-error')->escaped(); |
| 96 | + } |
| 97 | + |
| 98 | + fputcsv( $fh, $outData ); |
| 99 | + } |
| 100 | +} |
| 101 | + |
| 102 | +$maintClass = "ExportMoodBar"; |
| 103 | +require_once( DO_MAINTENANCE ); |
Property changes on: branches/wmf/1.18wmf1/extensions/MoodBar/exportMoodBar.php |
___________________________________________________________________ |
Added: svn:eol-style |
1 | 104 | + native |
Index: branches/wmf/1.18wmf1/extensions/MoodBar/ApiFeedbackDashboard.php |
— | — | @@ -0,0 +1,93 @@ |
| 2 | +<?php |
| 3 | + |
| 4 | +class ApiFeedbackDashboard extends ApiBase { |
| 5 | + public function execute() { |
| 6 | + global $wgUser; |
| 7 | + if ( ! $wgUser->isAllowed('moodbar-admin') ) { |
| 8 | + $this->dieUsage( "You don't have permission to do that", 'permission-denied' ); |
| 9 | + } |
| 10 | + |
| 11 | + $params = $this->extractRequestParams(); |
| 12 | + $form = null; |
| 13 | + |
| 14 | + if ( $params['mbaction'] == 'hide' ) { |
| 15 | + $form = new MBHideForm( $params['item'] ); |
| 16 | + } elseif ( $params['mbaction'] == 'restore' ) { |
| 17 | + $form = new MBRestoreForm( $params['item'] ); |
| 18 | + } else { |
| 19 | + throw new MWException( "Action {$params['action']} not implemented" ); |
| 20 | + } |
| 21 | + |
| 22 | + $data = array( |
| 23 | + 'reason' => $params['reason'], |
| 24 | + 'item' => $params['item'], |
| 25 | + ); |
| 26 | + |
| 27 | + $result = null; |
| 28 | + $output = $form->submit( $data ); |
| 29 | + if ( $output === true ) { |
| 30 | + $result = array( 'result' => 'success' ); |
| 31 | + } else { |
| 32 | + $result = array( 'result' => 'error', 'error' => $output ); |
| 33 | + } |
| 34 | + |
| 35 | + $this->getResult()->addValue( null, $this->getModuleName(), $result ); |
| 36 | + } |
| 37 | + |
| 38 | + public function needsToken() { |
| 39 | + return true; |
| 40 | + } |
| 41 | + |
| 42 | + public function getTokenSalt() { |
| 43 | + return ''; |
| 44 | + } |
| 45 | + |
| 46 | + public function getAllowedParams() { |
| 47 | + return array( |
| 48 | + 'mbaction' => array( |
| 49 | + ApiBase::PARAM_REQUIRED => true, |
| 50 | + ApiBase::PARAM_TYPE => array( |
| 51 | + 'hide', |
| 52 | + 'restore', |
| 53 | + ), |
| 54 | + ), |
| 55 | + |
| 56 | + 'item' => array( |
| 57 | + ApiBase::PARAM_REQUIRED => true, |
| 58 | + ApiBase::PARAM_TYPE => 'integer', |
| 59 | + ), |
| 60 | + |
| 61 | + 'reason' => array( |
| 62 | + ApiBase::PARAM_REQUIRED => true, |
| 63 | + ApiBase::PARAM_TYPE => 'string' |
| 64 | + ), |
| 65 | + 'token' => array( |
| 66 | + ApiBase::PARAM_REQUIRED => true, |
| 67 | + ), |
| 68 | + ); |
| 69 | + } |
| 70 | + |
| 71 | + public function mustBePosted() { |
| 72 | + return true; |
| 73 | + } |
| 74 | + |
| 75 | + public function isWriteMode() { |
| 76 | + return true; |
| 77 | + } |
| 78 | + |
| 79 | + public function getVersion() { |
| 80 | + return __CLASS__ . ': $Id$'; |
| 81 | + } |
| 82 | + |
| 83 | + public function getParamDescription() { |
| 84 | + return array( |
| 85 | + 'mbaction' => 'The action to take', |
| 86 | + 'item' => 'The feedback item to apply it to', |
| 87 | + 'reason' => 'The reason to specify in the log', |
| 88 | + ); |
| 89 | + } |
| 90 | + |
| 91 | + public function getDescription() { |
| 92 | + return 'Allows administrators to manage submissions to the feedback dashboard'; |
| 93 | + } |
| 94 | +} |
Property changes on: branches/wmf/1.18wmf1/extensions/MoodBar/ApiFeedbackDashboard.php |
___________________________________________________________________ |
Added: svn:keywords |
1 | 95 | + Id |
Added: svn:eol-style |
2 | 96 | + native |