r104081 MediaWiki - Code Review archive

Repository:MediaWiki
Revision:r104080‎ | r104081 | r104082 >
Date:20:14, 23 November 2011
Author:catrope
Status:ok
Tags:
Comment:
1.18wmf1: Rebranch MoodBar from trunk
Modified paths:
  • /branches/wmf/1.18wmf1/extensions/MoodBar (added) (history)

Diff [purge]

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
1560 + 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
1196 + 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. &#x25B6;
 36+ 'moodbar-what-expanded' => '▼', // Ignore, do not translate. &#x25BC;
 37+ 'moodbar-respond-collapsed' => '▶', // Optional, only change e.g. for RTL languages. &#x25B6;
 38+ 'moodbar-respond-expanded' => '▼', // Ignore, do not translate. &#x25BC;
 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&rlm; $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
13293 + 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
1281 + 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
194 + 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
1116 + 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
1127 + 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
139 + 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
17 + 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
127 + 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
17 + 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
17 + 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
16 + 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
14 + 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
1191 + Id
Added: svn:eol-style
2192 + 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
117 + 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
194 + Id
Added: svn:eol-style
295 + 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
1288 + 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
155 + 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
174 + 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
1201 + 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
1331 + 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
2332 + 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
3333 + 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
4334 + 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
5335 + 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
6336 + 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
7337 + 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
8338 + 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
9339 + 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
10340 + 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
11341 + 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
12342 + 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
13343 + 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
14344 + 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
15345 + 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
16346 + 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
17347 + 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
18348 + 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
19349 + 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
20350 + 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
21351 + 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
122 + 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
1482 + native
Added: svn:executable
2483 + *
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
1280 + 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">&nbsp;</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">&nbsp;</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">&nbsp;</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
1571 + 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
2572 + 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
3573 + 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
4574 + 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
5575 + 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
6576 + 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
7577 + 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
8578 + 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
9579 + 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
10580 + 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
11581 + 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
12582 + 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
13583 + 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
14584 + 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
1213 + 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
1124 + 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
1104 + 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
195 + Id
Added: svn:eol-style
296 + native

Status & tagging log