r71724 MediaWiki - Code Review archive

Repository:MediaWiki
Revision:r71723‎ | r71724 | r71725 >
Date:18:44, 26 August 2010
Author:tomasz
Status:deferred
Tags:
Comment:
Sync'ing up to trunk head at 71720
Modified paths:
  • /branches/wmf/1.16wmf4/extensions/CentralNotice (modified) (history)
  • /branches/wmf/1.16wmf4/extensions/CentralNotice/CentralNotice.alias.php (modified) (history)
  • /branches/wmf/1.16wmf4/extensions/CentralNotice/CentralNotice.db.php (modified) (history)
  • /branches/wmf/1.16wmf4/extensions/CentralNotice/CentralNotice.i18n.php (modified) (history)
  • /branches/wmf/1.16wmf4/extensions/CentralNotice/CentralNotice.pg.psql (deleted) (history)
  • /branches/wmf/1.16wmf4/extensions/CentralNotice/CentralNotice.php (modified) (history)
  • /branches/wmf/1.16wmf4/extensions/CentralNotice/CentralNotice.sql (modified) (history)
  • /branches/wmf/1.16wmf4/extensions/CentralNotice/SpecialCentralNotice.php (modified) (history)
  • /branches/wmf/1.16wmf4/extensions/CentralNotice/SpecialNoticeTemplate.php (modified) (history)
  • /branches/wmf/1.16wmf4/extensions/CentralNotice/SpecialNoticeText.php (modified) (history)
  • /branches/wmf/1.16wmf4/extensions/CentralNotice/TemplatePager.php (added) (history)
  • /branches/wmf/1.16wmf4/extensions/CentralNotice/centralnotice.css (added) (history)
  • /branches/wmf/1.16wmf4/extensions/CentralNotice/centralnotice.js (added) (history)
  • /branches/wmf/1.16wmf4/extensions/CentralNotice/down-arrow.png (added) (history)
  • /branches/wmf/1.16wmf4/extensions/CentralNotice/newCentralNotice.js (added) (history)
  • /branches/wmf/1.16wmf4/extensions/CentralNotice/patch-add-preferred.sql (deleted) (history)
  • /branches/wmf/1.16wmf4/extensions/CentralNotice/patches (added) (history)
  • /branches/wmf/1.16wmf4/extensions/CentralNotice/up-arrow.png (added) (history)

Diff [purge]

Index: branches/wmf/1.16wmf4/extensions/CentralNotice/patch-add-preferred.sql
@@ -1,6 +0,0 @@
2 -# Support for one notice to supercede all others. This allows one notice to
3 -# cancel out all the templates that a non preffered notice might have if they
4 -# overlap. Use case is to be able to use one all language and projects notice
5 -# and have it superceded by a specific one for en wikipedia.
6 -
7 -ALTER TABLE cn_notices ADD COLUMN not_preferred bool NOT NULL default '0';
Index: branches/wmf/1.16wmf4/extensions/CentralNotice/CentralNotice.pg.psql
@@ -1,29 +0,0 @@
2 -
3 -BEGIN;
4 -CREATE TABLE cn_notices (
5 - not_id SERIAL PRIMARY KEY,
6 - not_name TEXT NOT NULL,
7 - not_start TIMESTAMPTZ NOT NULL,
8 - not_end TIMESTAMPTZ NOT NULL,
9 - not_enabled SMALLINT NOT NULL DEFAULT 0,
10 - not_preferred SMALLINT NOT NULL DEFAULT 0,
11 - not_locked SMALLINT NOT NULL DEFAULT 0,
12 - not_language TEXT NOT NULL,
13 - not_project TEXT NOT NULL
14 -);
15 -
16 -CREATE TABLE cn_assignments (
17 - asn_id SERIAL PRIMARY KEY,
18 - not_id INTEGER NOT NULL,
19 - tmp_id INTEGER NOT NULL,
20 - tmp_weight INTEGER NOT NULL
21 -);
22 -
23 -CREATE TABLE cn_templates (
24 - tmp_id SERIAL PRIMARY KEY,
25 - tmp_name TEXT
26 -);
27 -COMMIT;
Index: branches/wmf/1.16wmf4/extensions/CentralNotice/newCentralNotice.js
@@ -0,0 +1,77 @@
 2+/*
 3+ * New Central Notice Javascript
 4+ *
 5+ * Mostly stubbed functionallity for central notice improvements
 6+ * May or may not be used, definitely will be changed.
 7+ * More of a sketch of what we think needs to be done.
 8+ *
 9+ * QUESTIONS:
 10+ * 1. How do I determin if a user is logged in or not?
 11+ * 2. How do I determin a users location?
 12+ *
 13+ */
 14+( function( $ ) {
 15+ $.centralNotice = {
 16+ 'data': {
 17+ 'getVars': {}
 18+ },
 19+ 'fn': {
 20+ 'loadBanner': function( bannerName ) {
 21+ // get the requested banner from /centralnotice/banners/<bannername>/<wgUserLanguage>.js
 22+ var request = $.ajax( {
 23+ url: 'response.html',
 24+ dataType: 'html',
 25+ success: function( data ) {
 26+ $.centralNotice.fn.displayBanner( data );
 27+ }
 28+ });
 29+ },
 30+ 'loadCampaign': function( timestamp ) {
 31+ var listURL;
 32+ if ( timestamp ) {
 33+ listURL = "TBD"
 34+ } else {
 35+ listURL = "/centralnotice/<project type>/<wgContentLanguage>.js"
 36+ }
 37+ var request = $.ajax( {
 38+ url: listURL,
 39+ dataType: 'json',
 40+ success: function( data ) {
 41+ $.centralNotice.fn.chooseBanner( data );
 42+ }
 43+ } );
 44+ },
 45+ 'chooseBanner': function( bannerList ) {
 46+ // pick a banner based on logged-in status and geotargetting
 47+ var bannerHTML = bannerList[0].html;
 48+ $.centralNotice.fn.displayBanner( bannerHTML );
 49+ },
 50+ 'displayBanner': function( bannerHTML ) {
 51+ // inject the banner html into the page
 52+ $( '#centralNotice' ).replaceWith( bannerHTML );
 53+ },
 54+ 'getQueryStringVariables': function() {
 55+ document.location.search.replace( /\??(?:([^=]+)=([^&]*)&?)/g, function () {
 56+ function decode( s ) {
 57+ return decodeURIComponent( s.split( "+" ).join( " " ) );
 58+ }
 59+ $.centralNotice.data.getVars[decode( arguments[1] )] = decode( arguments[2] );
 60+ } );
 61+ }
 62+ }
 63+ }
 64+ $( document ).ready( function () {
 65+ // initialize the query string vars
 66+ $.centralNotice.fn.getQueryStringVariables();
 67+ if( $.centralNotice.data.getVars['forceBanner'] ) {
 68+ // if we're forcing one banner
 69+ $.centralNotice.fn.loadBanner( $.centralNotice.data.getVars['forceBanner'] );
 70+ } else if ( $.centralNotice.data.getVars['forceTimestamp'] ) {
 71+ // if we're forcing a future campaign time
 72+ $.centralNotice.fn.loadCampaign( $.centralNotice.data.getVars['forceTimestamp'] );
 73+ } else {
 74+ // look for banners ready to go NOW
 75+ $.centralNotice.fn.loadCampaign( );
 76+ }
 77+ } ); //document ready
 78+} )( jQuery );
Property changes on: branches/wmf/1.16wmf4/extensions/CentralNotice/newCentralNotice.js
___________________________________________________________________
Added: svn:eol-style
179 + native
Index: branches/wmf/1.16wmf4/extensions/CentralNotice/CentralNotice.php
@@ -13,6 +13,9 @@
1414 //
1515 $wgNoticeCentralPath = false;
1616
 17+// Whether to use local notice loader
 18+$wgNoticeUseLocalNotice = false;
 19+
1720 // This guy does much the same, but with the local sitenotice/anonnotice.
1821 // Static generation isn't quite supported yet.
1922 //
@@ -111,14 +114,22 @@
112115
113116 function efCentralNoticeSetup() {
114117 global $wgHooks, $wgNoticeInfrastructure, $wgAutoloadClasses, $wgSpecialPages;
115 - global $wgCentralNoticeLoader;
 118+ global $wgCentralNoticeLoader, $wgNoticeUseLocalNotice;
116119
117120 $dir = dirname( __FILE__ ) . '/';
118121
119122 if ( $wgCentralNoticeLoader ) {
 123+ $wgHooks['LoadExtensionSchemaUpdates'][] = 'efCentralNoticeSchema';
120124 $wgHooks['BeforePageDisplay'][] = 'efCentralNoticeLoader';
121 - $wgHooks['SiteNoticeAfter'][] = 'efCentralNoticeDisplay';
122125 $wgHooks['MakeGlobalVariablesScript'][] = 'efCentralNoticeDefaults';
 126+
 127+ if ( $wgNoticeUseLocalNotice ) {
 128+ $wgSpecialPages['NoticeLocal'] = 'SpecialNoticeLocal';
 129+ $wgAutoloadClasses['SpecialNoticeLocal'] = $dir . 'SpecialNoticeLocal.php';
 130+ $wgHooks['SiteNoticeBefore'][] = 'efCentralNoticeDisplayBefore';
 131+ } else {
 132+ $wgHooks['SiteNoticeAfter'][] = 'efCentralNoticeDisplayAfter';
 133+ }
123134 }
124135
125136 $wgAutoloadClasses['NoticePage'] = $dir . 'NoticePage.php';
@@ -133,63 +144,81 @@
134145
135146 $wgSpecialPages['NoticeTemplate'] = 'SpecialNoticeTemplate';
136147 $wgAutoloadClasses['SpecialNoticeTemplate'] = $dir . 'SpecialNoticeTemplate.php';
 148+
137149 $wgAutoloadClasses['CentralNoticeDB'] = $dir . 'CentralNotice.db.php';
 150+ $wgAutoloadClasses['TemplatePager'] = $dir . 'TemplatePager.php';
138151 }
139152 }
140153
 154+function efCentralNoticeSchema() {
 155+ global $wgDBtype, $wgExtNewTables, $wgExtNewFields;
 156+
 157+ $base = dirname( __FILE__ );
 158+ if ( $wgDBtype == 'mysql' ) {
 159+ $wgExtNewTables[] = array( 'cn_notices', $base . '/CentralNotice.sql' );
 160+ $wgExtNewFields[] = array( 'cn_notices', 'not_preferred', $base . '/patches/patch-notice_preferred.sql' );
 161+ $wgExtNewTables[] = array( 'cn_notice_languages', $base . '/patches/patch-notice_languages.sql' );
 162+ $wgExtNewFields[] = array( 'cn_templates', 'tmp_display_anon', $base . '/patches/patch-template_settings.sql' );
 163+ }
 164+ return true;
 165+}
 166+
141167 function efCentralNoticeLoader( $out, $skin ) {
142 - global $wgScript, $wgUser, $wgOut, $wgLang;
143 - global $wgStyleVersion, $wgJsMimeType;
144 - global $wgNoticeProject;
 168+ global $wgUser, $wgOut, $wgLang;
 169+ global $wgNoticeProject, $wgNoticeCentralPath, $wgNoticeLocalPath, $wgNoticeUseLocalNotice;
145170
146 - global $wgNoticeCentralPath;
147 - global $wgNoticeLocalPath;
148 -
149171 $lang = $wgLang->getCode();
150172 $centralNotice = "$wgNoticeProject/$lang/centralnotice.js";
151 - /*
152 - $localNotice = ( is_object( $wgUser ) && $wgUser->isLoggedIn() )
153 - ? 'sitenotice.js'
154 - : 'anonnotice.js';
155 - */
156173
157 -
158174 if ( $wgNoticeCentralPath === false ) {
159175 $centralLoader = SpecialPage::getTitleFor( 'NoticeText', $centralNotice )->getLocalUrl();
160176 } else {
161177 $centralLoader = "$wgNoticeCentralPath/$centralNotice";
162178 }
163 - $encCentralLoader = htmlspecialchars( $centralLoader );
164179
165 - /*
166 - if ( $wgNoticeLocalPath === false ) {
167 - $localLoader = SpecialPage::getTitleFor( 'NoticeLocal', $localNotice )->getLocalUrl();
168 - } else {
169 - $localLoader = "$wgNoticeLocalPath/$localNotice";
 180+ // Load the notice text from <head>
 181+ $wgOut->addScriptFile( $centralLoader );
 182+
 183+ if ( $wgNoticeUseLocalNotice ) {
 184+ $localNotice = ( is_object( $wgUser ) && $wgUser->isLoggedIn() )
 185+ ? 'sitenotice.js'
 186+ : 'anonnotice.js';
 187+ if ( $wgNoticeLocalPath === false ) {
 188+ $localLoader = SpecialPage::getTitleFor( 'NoticeLocal', $localNotice )->getLocalUrl();
 189+ } else {
 190+ $localLoader = "$wgNoticeLocalPath/$localNotice";
 191+ }
 192+ $wgOut->addScriptFile( $localLoader );
170193 }
171 - $encLocalLoader = htmlspecialchars( $localLoader );
172 - */
173194
174 - // Load the notice text from <head>
175 - $wgOut->addScript( "<script type=\"{$wgJsMimeType}\" src=\"$encCentralLoader?$wgStyleVersion\"></script>\n" );
176 -
177195 return true;
178196 }
179197
180198 function efCentralNoticeDefaults( &$vars ) {
 199+ global $wgNoticeUseLocalNotice;
 200+
181201 // Initialize these variables to empty, so if the notice script fails
182202 // we don't have any surprises.
183203 $vars['wgNotice'] = '';
184 - $vars['wgNoticeLocal'] = '';
 204+ if ( $wgNoticeUseLocalNotice ) {
 205+ $vars['wgNoticeLocal'] = '';
 206+ }
185207 return true;
186208 }
187209
188 -function efCentralNoticeDisplay( &$notice ) {
 210+function efCentralNoticeDisplayAfter( &$notice ) {
189211 // Slip in load of the data...
190212 $notice =
191 - "<script type='text/javascript'>" .
192 - "if (wgNotice != '') document.writeln(wgNotice);" .
193 - "</script>" .
 213+ Html::inlineScript( "if (wgNotice != '') document.writeln(wgNotice);" ) .
194214 $notice;
195215 return true;
196216 }
 217+
 218+function efCentralNoticeDisplayBefore( &$notice ) {
 219+ // Slip in load of the data...
 220+ $notice = Html::inlineScript(
 221+ "if (wgNotice != '') document.writeln(wgNotice);" .
 222+ " if (wgNoticeLocal != '') document.writeln(wgNoticeLocal);"
 223+ );
 224+ return false;
 225+}
Index: branches/wmf/1.16wmf4/extensions/CentralNotice/TemplatePager.php
@@ -0,0 +1,112 @@
 2+<?php
 3+
 4+class TemplatePager extends ReverseChronologicalPager {
 5+ var $onRemoveChange, $viewPage, $special;
 6+ var $editable;
 7+
 8+ function __construct( $special ) {
 9+ $this->special = $special;
 10+ $this->editable = $special->editable;
 11+ parent::__construct();
 12+
 13+ // Override paging defaults
 14+ list( $this->mLimit, /* $offset */ ) = $this->mRequest->getLimitOffset( 20, '' );
 15+ $this->mLimitsShown = array( 20, 50, 100 );
 16+
 17+ $msg = Xml::encodeJsVar( wfMsg( 'centralnotice-confirm-delete' ) );
 18+ $this->onRemoveChange = "if( this.checked ) { this.checked = confirm( $msg ) }";
 19+ $this->viewPage = SpecialPage::getTitleFor( 'NoticeTemplate', 'view' );
 20+ }
 21+
 22+ function getQueryInfo() {
 23+ // Return all the banners in the database
 24+ return array(
 25+ 'tables' => 'cn_templates',
 26+ 'fields' => array( 'tmp_name', 'tmp_id' ),
 27+ );
 28+ }
 29+
 30+ /**
 31+ * Sort the banner list by tmp_id
 32+ */
 33+ function getIndexField() {
 34+ return 'tmp_id';
 35+ }
 36+
 37+ /**
 38+ * Generate the content of each table row (1 row = 1 banner)
 39+ */
 40+ function formatRow( $row ) {
 41+
 42+ // Begin banner row
 43+ $htmlOut = Xml::openElement( 'tr' );
 44+
 45+ if ( $this->editable ) {
 46+ // Remove box
 47+ $htmlOut .= Xml::tags( 'td', array( 'valign' => 'top' ),
 48+ Xml::check( 'removeTemplates[]', false,
 49+ array(
 50+ 'value' => $row->tmp_name,
 51+ 'onchange' => $this->onRemoveChange
 52+ )
 53+ )
 54+ );
 55+ }
 56+
 57+ // Link and Preview
 58+ $viewPage = SpecialPage::getTitleFor( 'NoticeTemplate', 'view' );
 59+ $render = new SpecialNoticeText();
 60+ $render->project = 'wikipedia';
 61+ $render->language = $this->mRequest->getVal( 'wpUserLanguage' );
 62+ $htmlOut .= Xml::tags( 'td', array( 'valign' => 'top' ),
 63+ $this->getSkin()->makeLinkObj( $this->viewPage,
 64+ htmlspecialchars( $row->tmp_name ),
 65+ 'template=' . urlencode( $row->tmp_name ) ) .
 66+ Xml::fieldset( wfMsg( 'centralnotice-preview' ),
 67+ $render->getHtmlNotice( $row->tmp_name ),
 68+ array( 'class' => 'cn-bannerpreview')
 69+ )
 70+ );
 71+
 72+ // End banner row
 73+ $htmlOut .= Xml::closeElement( 'tr' );
 74+
 75+ return $htmlOut;
 76+ }
 77+
 78+ /**
 79+ * Specify table headers
 80+ */
 81+ function getStartBody() {
 82+ $htmlOut = '';
 83+ $htmlOut .= Xml::openElement( 'table', array( 'cellpadding' => 9 ) );
 84+ $htmlOut .= Xml::openElement( 'tr' );
 85+ if ( $this->editable ) {
 86+ $htmlOut .= Xml::element( 'th', array( 'align' => 'left', 'width' => '5%' ),
 87+ wfMsg ( 'centralnotice-remove' )
 88+ );
 89+ }
 90+ $htmlOut .= Xml::element( 'th', array( 'align' => 'left' ),
 91+ wfMsg ( 'centralnotice-templates' )
 92+ );
 93+ $htmlOut .= Xml::closeElement( 'tr' );
 94+ return $htmlOut;
 95+ }
 96+
 97+ /**
 98+ * Close table and add Submit button
 99+ */
 100+ function getEndBody() {
 101+ global $wgUser;
 102+ $htmlOut = '';
 103+ $htmlOut .= Xml::closeElement( 'table' );
 104+ if ( $this->editable ) {
 105+ $htmlOut .= Xml::hidden( 'authtoken', $wgUser->editToken() );
 106+ $htmlOut .= Xml::tags( 'div',
 107+ array( 'class' => 'cn-buttons' ),
 108+ Xml::submitButton( wfMsg( 'centralnotice-modify' ) )
 109+ );
 110+ }
 111+ return $htmlOut;
 112+ }
 113+}
Property changes on: branches/wmf/1.16wmf4/extensions/CentralNotice/TemplatePager.php
___________________________________________________________________
Added: svn:eol-style
1114 + native
Index: branches/wmf/1.16wmf4/extensions/CentralNotice/SpecialCentralNotice.php
@@ -6,26 +6,34 @@
77 }
88
99 class CentralNotice extends SpecialPage {
10 -
 10+ var $centralNoticeDB;
1111 /* Functions */
1212
1313 function CentralNotice() {
1414 // Register special page
15 - SpecialPage::SpecialPage( 'CentralNotice' );
 15+ parent::SpecialPage( 'CentralNotice' );
1616
1717 // Internationalization
1818 wfLoadExtensionMessages( 'CentralNotice' );
 19+
 20+ $this->centralNoticeDB = new CentralNoticeDB();
1921 }
20 -
 22+
 23+ /**
 24+ * Handle different types of page requests
 25+ */
2126 function execute( $sub ) {
22 - global $wgOut, $wgUser, $wgRequest;
 27+ global $wgOut, $wgUser, $wgRequest, $wgExtensionAssetsPath;
2328
2429 // Begin output
2530 $this->setHeaders();
26 -
27 - // Get current skin
28 - $sk = $wgUser->getSkin();
29 -
 31+
 32+ // Add style file to the output headers
 33+ $wgOut->addExtensionStyle( "$wgExtensionAssetsPath/CentralNotice/centralnotice.css" );
 34+
 35+ // Add script file to the output headers
 36+ $wgOut->addScriptFile( "$wgExtensionAssetsPath/CentralNotice/centralnotice.js" );
 37+
3038 // Check permissions
3139 $this->editable = $wgUser->isAllowed( 'centralnotice-admin' );
3240
@@ -34,200 +42,187 @@
3543
3644 // Show header
3745 $this->printHeader( $sub );
38 -
 46+
 47+ // Begin Campaigns tab content
 48+ $wgOut->addHTML( Xml::openElement( 'div', array( 'id' => 'preferences' ) ) );
 49+
3950 $method = $wgRequest->getVal( 'method' );
40 - // Handle form sumissions
 51+
 52+ // Handle form submissions
4153 if ( $this->editable && $wgRequest->wasPosted() ) {
42 -
43 - // Handle removing
44 - $toRemove = $wgRequest->getArray( 'removeNotices' );
45 - if ( isset( $toRemove ) ) {
46 - // Remove notices in list
47 - foreach ( $toRemove as $template ) {
48 - $this->removeNotice( $template );
 54+
 55+ // Check authentication token
 56+ if ( $wgUser->matchEditToken( $wgRequest->getVal( 'authtoken' ) ) ) {
 57+
 58+ // Handle removing campaigns
 59+ $toRemove = $wgRequest->getArray( 'removeNotices' );
 60+ if ( isset( $toRemove ) ) {
 61+ // Remove campaigns in list
 62+ foreach ( $toRemove as $notice ) {
 63+ $this->removeNotice( $notice );
 64+ }
 65+
 66+ // Show list of campaigns
 67+ $this->listNotices();
 68+ $wgOut->addHTML( Xml::closeElement( 'div' ) );
 69+ return;
4970 }
5071
51 - // Show list of notices
52 - $this->listNotices();
53 - return;
54 - }
55 -
56 - // Handle locking/unlocking
57 - $lockedNotices = $wgRequest->getArray( 'locked' );
58 - if ( isset( $lockedNotices ) ) {
59 - if ( $method == 'listNoticeDetail' ) {
60 - $notice = $wgRequest->getVal ( 'notice' );
61 - $this->updateLock( $notice, '1' );
62 - } else {
63 - // Build list of notices to lock
64 - $unlockedNotices = array_diff( $this->getNoticesName(), $lockedNotices );
65 -
66 - // Set locked/unlocked flag accordingly
67 - foreach ( $lockedNotices as $notice ) {
 72+ // Handle locking/unlocking campaigns
 73+ $lockedNotices = $wgRequest->getArray( 'locked' );
 74+ if ( isset( $lockedNotices ) ) {
 75+ if ( $method == 'listNoticeDetail' ) {
 76+ $notice = $wgRequest->getVal ( 'notice' );
6877 $this->updateLock( $notice, '1' );
 78+ } else {
 79+ // Build list of campaigns to lock
 80+ $unlockedNotices = array_diff( $this->getNoticesName(), $lockedNotices );
 81+
 82+ // Set locked/unlocked flag accordingly
 83+ foreach ( $lockedNotices as $notice ) {
 84+ $this->updateLock( $notice, '1' );
 85+ }
 86+ foreach ( $unlockedNotices as $notice ) {
 87+ $this->updateLock( $notice, '0' );
 88+ }
6989 }
70 - foreach ( $unlockedNotices as $notice ) {
71 - $this->updateLock( $notice, '0' );
72 - }
7390 }
74 - }
7591
76 - // Handle enabling/disabling
77 - $enabledNotices = $wgRequest->getArray( 'enabled' );
78 - if ( isset( $enabledNotices ) ) {
79 - if ( $method == 'listNoticeDetail' ) {
80 - $notice = $wgRequest->getVal ( 'notice' );
81 - $this->updateEnabled( $notice, '1' );
82 - } else {
83 - // Build list of notices to disable
84 - $disabledNotices = array_diff( $this->getNoticesName(), $enabledNotices );
85 -
86 - // Set enabled/disabled flag accordingly
87 - foreach ( $enabledNotices as $notice ) {
 92+ // Handle enabling/disabling campaigns
 93+ $enabledNotices = $wgRequest->getArray( 'enabled' );
 94+ if ( isset( $enabledNotices ) ) {
 95+ if ( $method == 'listNoticeDetail' ) {
 96+ $notice = $wgRequest->getVal ( 'notice' );
8897 $this->updateEnabled( $notice, '1' );
 98+ } else {
 99+ // Build list of campaigns to disable
 100+ $disabledNotices = array_diff( $this->getNoticesName(), $enabledNotices );
 101+
 102+ // Set enabled/disabled flag accordingly
 103+ foreach ( $enabledNotices as $notice ) {
 104+ $this->updateEnabled( $notice, '1' );
 105+ }
 106+ foreach ( $disabledNotices as $notice ) {
 107+ $this->updateEnabled( $notice, '0' );
 108+ }
89109 }
90 - foreach ( $disabledNotices as $notice ) {
91 - $this->updateEnabled( $notice, '0' );
 110+ }
 111+
 112+ // Handle setting preferred campaigns
 113+ $preferredNotices = $wgRequest->getArray( 'preferred' );
 114+ if ( isset( $preferredNotices ) ) {
 115+ // Set since this is a single display
 116+ if ( $method == 'listNoticeDetail' ) {
 117+ $notice = $wgRequest->getVal ( 'notice' );
 118+ $this->centralNoticeDB->updatePreferred( $notice, '1' );
92119 }
 120+ else {
 121+ // Build list of campaigns to unset
 122+ $unsetNotices = array_diff( $this->getNoticesName(), $preferredNotices );
 123+
 124+ // Set flag accordingly
 125+ foreach ( $preferredNotices as $notice ) {
 126+ $this->centralNoticeDB->updatePreferred( $notice, '1' );
 127+ }
 128+ foreach ( $unsetNotices as $notice ) {
 129+ $this->centralNoticeDB->updatePreferred( $notice, '0' );
 130+ }
 131+ }
93132 }
94 - }
95133
96 - // Handle setting preferred
97 - $preferredNotices = $wgRequest->getArray( 'preferred' );
98 - if ( isset( $preferredNotices ) ) {
99 - // Set since this is a single display
100 - if ( $method == 'listNoticeDetail' ) {
101 - $notice = $wgRequest->getVal ( 'notice' );
102 - CentralNoticeDB::updatePreferred( $notice, '1' );
 134+ $noticeName = $wgRequest->getVal( 'notice' );
 135+
 136+ // Handle range setting
 137+ $start = $wgRequest->getArray( 'start' );
 138+ $end = $wgRequest->getArray( 'end' );
 139+ if ( isset( $start ) && isset( $end ) ) {
 140+ $updatedStart = sprintf( "%04d%02d%02d%02d%02d00",
 141+ $start['year'],
 142+ $start['month'],
 143+ $start['day'],
 144+ $start['hour'],
 145+ $start['min'] );
 146+ $updatedEnd = sprintf( "%04d%02d%02d000000",
 147+ $end['year'],
 148+ $end['month'],
 149+ $end['day'] );
 150+ $this->updateNoticeDate( $noticeName, $updatedStart, $updatedEnd );
103151 }
104 - else {
105 - // Build list of notices to unset
106 - $unsetNotices = array_diff( $this->getNoticesName(), $preferredNotices );
107152
108 - // Set flag accordingly
109 - foreach ( $preferredNotices as $notice ) {
110 - CentralNoticeDB::updatePreferred( $notice, '1' );
 153+ // Handle updates if no post content came through
 154+ if ( !isset( $lockedNotices ) && $method !== 'addNotice' ) {
 155+ if ( $method == 'listNoticeDetail' ) {
 156+ $notice = $wgRequest->getVal ( 'notice' );
 157+ $this->updateLock( $notice, 0 );
 158+ } else {
 159+ $allNotices = $this->getNoticesName();
 160+ foreach ( $allNotices as $notice ) {
 161+ $this->updateLock( $notice, '0' );
 162+ }
111163 }
112 - foreach ( $unsetNotices as $notice ) {
113 - CentralNoticeDB::updatePreferred( $notice, '0' );
114 - }
115164 }
116 - }
117165
118 - $noticeName = $wgRequest->getVal( 'notice' );
119 -
120 - // Handle range setting
121 - $start = $wgRequest->getArray( 'start' );
122 - $end = $wgRequest->getArray( 'end' );
123 - if ( isset( $start ) && isset( $end ) ) {
124 - $updatedStart = sprintf( "%04d%02d%02d%02d%02d00",
125 - $start['year'],
126 - $start['month'],
127 - $start['day'],
128 - $start['hour'],
129 - $start['min'] );
130 - $updatedEnd = sprintf( "%04d%02d%02d000000",
131 - $end['year'],
132 - $end['month'],
133 - $end['day'] );
134 - $this->updateNoticeDate( $noticeName, $updatedStart, $updatedEnd );
135 - }
136 -
137 - // Handle updates if no post content came through
138 - if ( !isset( $lockedNotices ) && $method !== 'addNotice' ) {
139 - if ( $method == 'listNoticeDetail' ) {
140 - $notice = $wgRequest->getVal ( 'notice' );
141 - $this->updateLock( $notice, 0 );
142 - } else {
143 - $allNotices = $this->getNoticesName();
144 - foreach ( $allNotices as $notice ) {
145 - $this->updateLock( $notice, '0' );
 166+ if ( !isset( $enabledNotices ) && $method !== 'addNotice' ) {
 167+ if ( $method == 'listNoticeDetail' ) {
 168+ $notice = $wgRequest->getVal ( 'notice' );
 169+ $this->updateEnabled( $notice, 0 );
 170+ } else {
 171+ $allNotices = $this->getNoticesName();
 172+ foreach ( $allNotices as $notice ) {
 173+ $this->updateEnabled( $notice, '0' );
 174+ }
146175 }
147176 }
148 - }
149177
150 - if ( !isset( $enabledNotices ) && $method !== 'addNotice' ) {
151 - if ( $method == 'listNoticeDetail' ) {
152 - $notice = $wgRequest->getVal ( 'notice' );
153 - $this->updateEnabled( $notice, 0 );
154 - } else {
155 - $allNotices = $this->getNoticesName();
156 - foreach ( $allNotices as $notice ) {
157 - $this->updateEnabled( $notice, '0' );
 178+ if ( !isset( $preferredNotices ) && $method !== 'addNotice' ) {
 179+ if ( $method == 'listNoticeDetail' ) {
 180+ $notice = $wgRequest->getVal ( 'notice' );
 181+ $this->centralNoticeDB->updatePreferred( $notice, 0 );
 182+ } else {
 183+ $allNotices = $this->getNoticesName();
 184+ foreach ( $allNotices as $notice ) {
 185+ $this->centralNoticeDB->updatePreferred( $notice, '0' );
 186+ }
158187 }
159188 }
160 - }
161189
162 - if ( !isset( $preferredNotices ) && $method !== 'addNotice' ) {
163 - if ( $method == 'listNoticeDetail' ) {
164 - $notice = $wgRequest->getVal ( 'notice' );
165 - CentralNoticeDB::updatePreferred( $notice, 0 );
166 - } else {
167 - $allNotices = $this->getNoticesName();
168 - foreach ( $allNotices as $notice ) {
169 - CentralNoticeDB::updatePreferred( $notice, '0' );
 190+ // Handle adding of campaign
 191+ if ( $method == 'addNotice' ) {
 192+ $noticeName = $wgRequest->getVal( 'noticeName' );
 193+ $start = $wgRequest->getArray( 'start' );
 194+ $project_name = $wgRequest->getVal( 'project_name' );
 195+ $project_languages = $wgRequest->getArray( 'project_languages' );
 196+ if ( $noticeName == '' ) {
 197+ $wgOut->wrapWikiMsg( "<div class='cn-error'>\n$1\n</div>", 'centralnotice-null-string' );
 198+ } else {
 199+ $this->addNotice( $noticeName, '0', $start, $project_name, $project_languages );
170200 }
171201 }
172 - }
173 - // Handle weight change
174 - $updatedWeights = $wgRequest->getArray( 'weight' );
175 - if ( isset( $updatedWeights ) ) {
176 - foreach ( $updatedWeights as $templateName => $weight ) {
177 - $this->updateWeight( $noticeName, $templateName, $weight );
178 - }
179 - }
180 - }
181202
182 - // Handle adding
183 - $this->showAll = $wgRequest->getVal( 'showAll' );
184 - if ( $this->editable && $method == 'addNotice' ) {
185 - $noticeName = $wgRequest->getVal( 'noticeName' );
186 - $start = $wgRequest->getArray( 'start' );
187 - $project_name = $wgRequest->getVal( 'project_name' );
188 - $project_language = $wgRequest->getVal( 'wpUserLanguage' );
189 - if ( $noticeName == '' ) {
190 - $wgOut->addWikiMsg ( 'centralnotice-null-string' );
 203+ } else {
 204+ $wgOut->wrapWikiMsg( "<div class='cn-error'>\n$1\n</div>", 'sessionfailure' );
191205 }
192 - else {
193 - $this->addNotice( $noticeName, '0', $start, $project_name, $project_language );
194 - }
195 - }
196206
197 - // Handle removing
198 - if ( $this->editable && $method == 'removeNotice' ) {
199 - $noticeName = $wgRequest->getVal ( 'noticeName' );
200 - $this->removeNotice ( $noticeName );
201207 }
202208
203 - // Handle adding of template
204 - if ( $this->editable && $method == 'addTemplateTo' ) {
205 - $noticeName = $wgRequest->getVal( 'noticeName' );
206 - $templateName = $wgRequest->getVal( 'templateName' );
207 - $templateWeight = $wgRequest->getVal ( 'weight' );
208 - $this->addTemplateTo( $noticeName, $templateName, $weight );
209 - $this->listNoticeDetail( $noticeName );
210 - return;
211 - }
212 -
213 - // Handle removing of template
214 - if ( $this->editable && $method == 'removeTemplateFor' ) {
215 - $noticeName = $wgRequest->getVal ( 'noticeName' );
216 - $templateName = $wgRequest->getVal ( 'templateName ' );
217 - $this->removeTemplateFor( $noticeName , $templateName );
218 - }
219 -
220 - // Handle showing detail
 209+ // Handle showing campaign detail
221210 if ( $method == 'listNoticeDetail' ) {
222211 $notice = $wgRequest->getVal ( 'notice' );
223212 $this->listNoticeDetail( $notice );
 213+ $wgOut->addHTML( Xml::closeElement( 'div' ) );
224214 return;
225215 }
226216
227 - // Show list of notices
 217+ // Show list of campaigns
228218 $this->listNotices();
 219+
 220+ // End Campaigns tab content
 221+ $wgOut->addHTML( Xml::closeElement( 'div' ) );
229222 }
230223
231 - // Update the enabled/disabled state of notice
 224+ /**
 225+ * Update the enabled/disabled state of a campaign
 226+ */
232227 private function updateEnabled( $notice, $state ) {
233228 $dbw = wfGetDB( DB_MASTER );
234229 $dbw->begin();
@@ -238,7 +233,7 @@
239234 $dbw->commit();
240235 }
241236
242 - static public function printHeader() {
 237+ public static function printHeader() {
243238 global $wgOut, $wgTitle, $wgUser;
244239 $sk = $wgUser->getSkin();
245240
@@ -246,56 +241,59 @@
247242 'CentralNotice' => wfMsg( 'centralnotice-notices' ),
248243 'NoticeTemplate' => wfMsg ( 'centralnotice-templates' )
249244 );
250 - $htmlOut = Xml::openElement( 'table', array( 'cellpadding' => 9 ) );
251 - $htmlOut .= Xml::openElement( 'tr' );
 245+ $htmlOut = Xml::openElement( 'ul', array( 'id' => 'preftoc' ) );
252246 foreach ( $pages as $page => $msg ) {
253247 $title = SpecialPage::getTitleFor( $page );
254 -
255 - $style = array( 'style' => 'border-bottom:solid 1px silver;' );
256 - if ( $page == $wgTitle->getText() ) {
257 - $style = array( 'style' => 'border-bottom:solid 1px black;' );
 248+ $attribs = array();
 249+ if ( $wgTitle->equals( $title ) ) {
 250+ $attribs['class'] = 'selected';
258251 }
259 -
260 - $htmlOut .= Xml::tags( 'td', $style,
 252+ $htmlOut .= Xml::tags( 'li', $attribs,
261253 $sk->makeLinkObj( $title, htmlspecialchars( $msg ) )
262254 );
263255 }
264 - $htmlOut .= Xml::closeElement( 'tr' );
265 - $htmlOut .= Xml::closeElement( 'table' );
 256+ $htmlOut .= Xml::closeElement( 'ul' );
266257
267258 $wgOut->addHTML( $htmlOut );
268259 }
269260
 261+ /**
 262+ * Get all the campaigns in the database
 263+ * @return an array of campaign names
 264+ */
270265 function getNoticesName() {
271266 $dbr = wfGetDB( DB_SLAVE );
272 - $res = $dbr->select( 'cn_notices', 'not_name' );
 267+ $res = $dbr->select( 'cn_notices', 'not_name', null, __METHOD__ );
273268 $notices = array();
274269 while ( $row = $dbr->fetchObject( $res ) ) {
275 - array_push( $notices, $row->not_name );
 270+ $notices[] = $row->not_name;
276271 }
277272 return $notices;
278273 }
279274
280 - function tableRow( $fields, $element = 'td' ) {
 275+ /**
 276+ * Build a table row. Needed since Xml::buildTableRow escapes all HTML.
 277+ */
 278+ function tableRow( $fields, $element = 'td', $attribs = array() ) {
281279 $cells = array();
282280 foreach ( $fields as $field ) {
283281 $cells[] = Xml::tags( $element, array(), $field );
284282 }
285 - return Xml::tags( 'tr', array(), implode( "\n", $cells ) ) . "\n";
 283+ return Xml::tags( 'tr', $attribs, implode( "\n", $cells ) ) . "\n";
286284 }
287285
288286 function dateSelector( $prefix, $timestamp = null ) {
289287 if ( $this->editable ) {
290288 // Default ranges...
291 - $years = range( 2007, 2012 );
 289+ $years = range( 2008, 2014 );
292290 $months = range( 1, 12 );
293291 $months = array_map( array( $this, 'addZero' ), $months );
294292 $days = range( 1 , 31 );
295293 $days = array_map( array( $this, 'addZero' ), $days );
296294
297 - // Normalize timestamp format...
 295+ // Normalize timestamp format. If no timestamp passed, defaults to now.
298296 $ts = wfTimestamp( TS_MW, $timestamp );
299 -
 297+
300298 $fields = array(
301299 array( "month", "centralnotice-month", $months, substr( $ts, 4, 2 ) ),
302300 array( "day", "centralnotice-day", $days, substr( $ts, 6, 2 ) ),
@@ -344,15 +342,11 @@
345343 return $out;
346344 }
347345
348 - /*
349 - * listNotices
350 - *
 346+ /**
351347 * Print out all campaigns found in db
352348 */
353 -
354349 function listNotices() {
355 - global $wgOut, $wgRequest, $wgScript, $wgUser;
356 - global $wgNoticeProject, $wgUserLang;
 350+ global $wgOut, $wgUser, $wgLang, $wgRequest;
357351
358352 // Get connection
359353 $dbr = wfGetDB( DB_SLAVE );
@@ -363,83 +357,61 @@
364358 $readonly = array( 'disabled' => 'disabled' );
365359 }
366360
367 - /*
368 - * This is temporarily hard-coded
369 - */
370 - $this->showAll = 'Y';
371 -
372 - // If all languages should be shown
373 - if ( isset( $this->showAll ) ) {
374 - // Get only notices for all languages
375 - $res = $dbr->select( 'cn_notices',
 361+ // Get all campaigns from the database
 362+ $res = $dbr->select( 'cn_notices',
 363+ array(
 364+ 'not_name',
 365+ 'not_start',
 366+ 'not_end',
 367+ 'not_enabled',
 368+ 'not_preferred',
 369+ 'not_project',
 370+ 'not_locked'
 371+ ),
 372+ null,
 373+ __METHOD__,
 374+ array( 'ORDER BY' => 'not_id DESC' )
 375+ );
 376+
 377+ // Begin building HTML
 378+ $htmlOut = '';
 379+
 380+ // Begin Manage campaigns fieldset
 381+ $htmlOut .= Xml::openElement( 'fieldset', array( 'class' => 'prefsection' ) );
 382+
 383+ // If there are campaigns to show...
 384+ if ( $dbr->numRows( $res ) >= 1 ) {
 385+ if ( $this->editable ) {
 386+ $htmlOut .= Xml::openElement( 'form', array( 'method' => 'post' ) );
 387+ }
 388+ $htmlOut .= Xml::element( 'h2', null, wfMsg( 'centralnotice-manage' ) );
 389+
 390+ // Begin table of campaigns
 391+ $htmlOut .= Xml::openElement( 'table',
376392 array(
377 - 'not_name',
378 - 'not_start',
379 - 'not_end',
380 - 'not_enabled',
381 - 'not_preferred',
382 - 'not_project',
383 - 'not_language',
384 - 'not_locked'
385 - ),
386 - null,
387 - __METHOD__,
388 - array( 'ORDER BY' => 'not_id' )
 393+ 'cellpadding' => 9,
 394+ 'width' => '100%',
 395+ 'class' => 'wikitable sortable'
 396+ )
389397 );
390 - } else {
391 - // Get only notices for this language
392 - $res = $dbr->select( 'cn_notices',
393 - array(
394 - 'not_name',
395 - 'not_start',
396 - 'not_end',
397 - 'not_enabled',
398 - 'not_preferred',
399 - 'not_project',
400 - 'not_locked'
401 - ),
402 - array ( 'not_language' => $wgUserLang ),
403 - __METHOD__,
404 - array( 'ORDER BY' => 'not_id' )
 398+
 399+ // Table headers
 400+ $headers = array(
 401+ wfMsgHtml( 'centralnotice-notice-name' ),
 402+ wfMsgHtml( 'centralnotice-project-name' ),
 403+ wfMsgHtml( 'centralnotice-project-lang' ),
 404+ wfMsgHtml( 'centralnotice-start-date' ),
 405+ wfMsgHtml( 'centralnotice-end-date' ),
 406+ wfMsgHtml( 'centralnotice-enabled' ),
 407+ wfMsgHtml( 'centralnotice-preferred' ),
 408+ wfMsgHtml( 'centralnotice-locked' ),
405409 );
406 - }
407 -
408 - // Build HTML
409 - $htmlOut = '';
410 - if ( $this->editable ) {
411 - $htmlOut .= Xml::openElement( 'form',
412 - array(
413 - 'method' => 'post',
414 - 'action' => SpecialPage::getTitleFor( 'CentralNotice' )->getFullUrl()
415 - )
416 - );
417 - }
418 - $htmlOut .= Xml::fieldset( wfMsg( "centralnotice-manage" ) );
419 - $htmlOut .= Xml::openElement( 'table',
420 - array(
421 - 'cellpadding' => 9,
422 - 'width' => '100%'
423 - )
424 - );
425 -
426 - // Headers
427 - $headers = array(
428 - wfMsgHtml( 'centralnotice-notice-name' ),
429 - wfMsgHtml( 'centralnotice-project-name' ),
430 - wfMsgHtml( 'centralnotice-project-lang' ),
431 - wfMsgHtml( 'centralnotice-start-date' ),
432 - wfMsgHtml( 'centralnotice-end-date' ),
433 - wfMsgHtml( 'centralnotice-enabled' ),
434 - wfMsgHtml( 'centralnotice-preferred' ),
435 - wfMsgHtml( 'centralnotice-locked' ),
436 - );
437 - if ( $this->editable ) {
438 - $headers[] = wfMsgHtml( 'centralnotice-remove' );
439 - }
440 - $htmlOut .= $this->tableRow( $headers, 'th' );
441 -
442 - // Rows
443 - if ( $dbr->numRows( $res ) >= 1 ) {
 410+ if ( $this->editable ) {
 411+ $headers[] = wfMsgHtml( 'centralnotice-remove' );
 412+ }
 413+ $htmlOut .= $this->tableRow( $headers, 'th' );
 414+
 415+ // Table rows
444416 while ( $row = $dbr->fetchObject( $res ) ) {
445417 $fields = array();
446418
@@ -451,10 +423,17 @@
452424 // Project
453425 $fields[] = htmlspecialchars( $this->getProjectName( $row->not_project ) );
454426
455 - // Language
456 - if ( isset ( $this->showAll ) ) {
457 - $fields[] = htmlspecialchars( $row->not_language );
 427+ // Languages
 428+ $project_langs = array();
 429+ $project_langs = $this->getNoticeLanguages( $row->not_name );
 430+ $language_count = count( $project_langs );
 431+ $languageList = '';
 432+ if ( $language_count > 3 ) {
 433+ $languageList = wfMsg ( 'centralnotice-multiple_languages', $language_count );
 434+ } elseif ( $language_count > 0 ) {
 435+ $languageList = $wgLang->commaList( $project_langs );
458436 }
 437+ $fields[] = $languageList;
459438
460439 // Date and time calculations
461440 $start_timestamp = wfTimestamp( TS_MW, $row->not_start );
@@ -478,105 +457,131 @@
479458 $fields[] =
480459 Xml::check( 'enabled[]', ( $row->not_enabled == '1' ),
481460 wfArrayMerge( $readonly,
482 - array( 'value' => $row->not_name ) ) );
 461+ array( 'value' => $row->not_name, 'class' => 'noshiftselect' ) ) );
483462
484463 // Preferred
485464 $fields[] =
486465 Xml::check( 'preferred[]', ( $row->not_preferred == '1' ),
487466 wfArrayMerge( $readonly,
488 - array( 'value' => $row->not_name ) ) );
 467+ array( 'value' => $row->not_name, 'class' => 'noshiftselect' ) ) );
489468
490469 // Locked
491470 $fields[] =
492471 Xml::check( 'locked[]', ( $row->not_locked == '1' ),
493472 wfArrayMerge( $readonly,
494 - array( 'value' => $row->not_name ) ) );
 473+ array( 'value' => $row->not_name, 'class' => 'noshiftselect' ) ) );
495474
496475 if ( $this->editable ) {
497476 // Remove
498477 $fields[] = Xml::check( 'removeNotices[]', false,
499 - array( 'value' => $row->not_name ) );
 478+ array( 'value' => $row->not_name, 'class' => 'noshiftselect' ) );
500479 }
501 -
502 - $htmlOut .= $this->tableRow( $fields );
 480+
 481+ // If campaign is currently active, set special class on table row.
 482+ $attribs = array();
 483+ if ( wfTimestamp() > wfTimestamp( TS_UNIX , $row->not_start ) && wfTimestamp() < wfTimestamp( TS_UNIX , $row->not_end ) && $row->not_enabled == '1' ) {
 484+ $attribs = array( 'class' => 'cn-active-campaign' );
 485+ }
 486+
 487+ $htmlOut .= $this->tableRow( $fields, 'td', $attribs );
503488 }
 489+ // End table of campaigns
 490+ $htmlOut .= Xml::closeElement( 'table' );
 491+
504492 if ( $this->editable ) {
505 - $htmlOut .= $this->tableRow(
 493+ $htmlOut .= Xml::hidden( 'authtoken', $wgUser->editToken() );
 494+ $htmlOut .= Xml::openElement( 'div', array( 'class' => 'cn-buttons' ) );
 495+ $htmlOut .= Xml::submitButton( wfMsg( 'centralnotice-modify' ),
506496 array(
507 - Xml::submitButton( wfMsg( 'centralnotice-modify' ),
508 - array(
509 - 'id' => 'centralnoticesubmit',
510 - 'name' => 'centralnoticesubmit'
511 - )
512 - )
 497+ 'id' => 'centralnoticesubmit',
 498+ 'name' => 'centralnoticesubmit'
513499 )
514500 );
515 - }
516 -
517 - $htmlOut .= Xml::closeElement( 'table' );
518 - $htmlOut .= Xml::closeElement( 'fieldset' );
519 - if ( $this->editable ) {
 501+ $htmlOut .= Xml::closeElement( 'div' );
520502 $htmlOut .= Xml::closeElement( 'form' );
521503 }
522504
523 -
524 - // No notices to show
 505+ // No campaigns to show
525506 } else {
526 - $htmlOut = wfMsg( 'centralnotice-no-notices-exist' );
 507+ $htmlOut .= wfMsg( 'centralnotice-no-notices-exist' );
527508 }
 509+
 510+ // End Manage Campaigns fieldset
 511+ $htmlOut .= Xml::closeElement( 'fieldset' );
528512
529513 if ( $this->editable ) {
530 - // Notice Adding
531 - $htmlOut .= Xml::openElement( 'form',
532 - array(
533 - 'method' => 'post',
534 - 'action' => SpecialPage::getTitleFor( 'CentralNotice' )->getLocalUrl()
535 - )
536 - );
537 - $htmlOut .= Xml::openElement( 'fieldset' );
538 - $htmlOut .= Xml::element( 'legend', null, wfMsg( 'centralnotice-add-notice' ) );
 514+
 515+ // If there was an error, we'll need to restore the state of the form
 516+ if ( $wgRequest->wasPosted() && ( $wgRequest->getVal( 'method' ) == 'addNotice' ) ) {
 517+ $startArray = $wgRequest->getArray( 'start' );
 518+ $startTimestamp = $startArray['year'] .
 519+ $startArray['month'] .
 520+ $startArray['day'] .
 521+ $startArray['hour'] .
 522+ $startArray['min'] . '00'
 523+ ;
 524+ $projectSelected = $wgRequest->getVal( 'project_name' );
 525+ if ( $wgRequest->getArray( 'project_languages' ) ) {
 526+ $noticeLanguages = $wgRequest->getArray( 'project_languages' );
 527+ } else {
 528+ $noticeLanguages = array();
 529+ }
 530+ } else { // Defaults
 531+ $startTimestamp = null;
 532+ $projectSelected = '';
 533+ $noticeLanguages = array();
 534+ }
 535+
 536+ // Begin Add a campaign fieldset
 537+ $htmlOut .= Xml::openElement( 'fieldset', array( 'class' => 'prefsection' ) );
 538+
 539+ // Form for adding a campaign
 540+ $htmlOut .= Xml::openElement( 'form', array( 'method' => 'post' ) );
 541+ $htmlOut .= Xml::element( 'h2', null, wfMsg( 'centralnotice-add-notice' ) );
539542 $htmlOut .= Xml::hidden( 'title', $this->getTitle()->getPrefixedText() );
540543 $htmlOut .= Xml::hidden( 'method', 'addNotice' );
541544
542545 $htmlOut .= Xml::openElement( 'table', array ( 'cellpadding' => 9 ) );
543 -
544 - $table = array(
545 - // Name
546 - array(
547 - wfMsgHtml( 'centralnotice-notice-name' ),
548 - Xml::inputLabel( '', 'noticeName', 'noticeName', 25 ),
549 - ),
550 - // Start Date
551 - array(
552 - Xml::label( wfMsg( 'centralnotice-start-date' ), 'start-date' ),
553 - $this->dateSelector( 'start' ),
554 - ),
555 - // Start Time
556 - array(
557 - wfMsgHtml( 'centralnotice-start-hour' ) . "(GMT)",
558 - $this->timeSelector( 'start' ),
559 - ),
560 - // Project
561 - array(
562 - wfMsgHtml( 'centralnotice-project-name' ),
563 - $this->projectDropDownList(),
564 - ),
565 - // Languages + All
566 - $this->languageDropDownList( $wgUserLang ),
567 - // Submit
568 - array(
569 - Xml::submitButton( wfMsg( 'centralnotice-modify' ) ),
570 - ),
 546+
 547+ // Name
 548+ $htmlOut .= Xml::openElement( 'tr' );
 549+ $htmlOut .= Xml::tags( 'td', array(), wfMsgHtml( 'centralnotice-notice-name' ) );
 550+ $htmlOut .= Xml::tags( 'td', array(), Xml::input( 'noticeName', 25, $wgRequest->getVal( 'noticeName' ) ) );
 551+ $htmlOut .= Xml::closeElement( 'tr' );
 552+ // Start Date
 553+ $htmlOut .= Xml::openElement( 'tr' );
 554+ $htmlOut .= Xml::tags( 'td', array(), wfMsgHtml( 'centralnotice-start-date' ) );
 555+ $htmlOut .= Xml::tags( 'td', array(), $this->dateSelector( 'start', $startTimestamp ) );
 556+ $htmlOut .= Xml::closeElement( 'tr' );
 557+ // Start Time
 558+ $htmlOut .= Xml::openElement( 'tr' );
 559+ $htmlOut .= Xml::tags( 'td', array(), wfMsgHtml( 'centralnotice-start-hour' ) );
 560+ $htmlOut .= Xml::tags( 'td', array(), $this->timeSelector( 'start', $startTimestamp ) );
 561+ $htmlOut .= Xml::closeElement( 'tr' );
 562+ // Project
 563+ $htmlOut .= Xml::openElement( 'tr' );
 564+ $htmlOut .= Xml::tags( 'td', array(), wfMsgHtml( 'centralnotice-project-name' ) );
 565+ $htmlOut .= Xml::tags( 'td', array(), $this->projectDropDownList( $projectSelected ) );
 566+ $htmlOut .= Xml::closeElement( 'tr' );
 567+ // Languages
 568+ $htmlOut .= Xml::openElement( 'tr' );
 569+ $htmlOut .= Xml::tags( 'td', array( 'valign' => 'top' ), wfMsgHtml( 'yourlanguage' ) );
 570+ $htmlOut .= Xml::tags( 'td', array(), $this->languageMultiSelector( $noticeLanguages ) );
 571+ $htmlOut .= Xml::closeElement( 'tr' );
 572+ $htmlOut .= Xml::closeElement( 'table' );
 573+ $htmlOut .= Xml::hidden( 'change', 'weight' );
 574+ $htmlOut .= Xml::hidden( 'authtoken', $wgUser->editToken() );
 575+
 576+ // Submit button
 577+ $htmlOut .= Xml::tags( 'div',
 578+ array( 'class' => 'cn-buttons' ),
 579+ Xml::submitButton( wfMsg( 'centralnotice-modify' ) )
571580 );
572 -
573 - foreach ( $table as $cells ) {
574 - $htmlOut .= $this->tableRow( $cells );
575 - }
576 -
577 - $htmlOut .= Xml::hidden( 'change', 'weight' );
578 - $htmlOut .= Xml::closeElement( 'table' );
 581+
 582+ $htmlOut .= Xml::closeElement( 'form' );
 583+
 584+ // End Add a campaign fieldset
579585 $htmlOut .= Xml::closeElement( 'fieldset' );
580 - $htmlOut .= Xml::closeElement( 'form' );
581586 }
582587
583588 // Output HTML
@@ -585,98 +590,130 @@
586591
587592 function listNoticeDetail( $notice ) {
588593 global $wgOut, $wgRequest, $wgUser;
589 -
 594+
590595 if ( $wgRequest->wasPosted() ) {
591 - // Handle removing of templates
592 - $templateToRemove = $wgRequest->getArray( 'removeTemplates' );
593 - if ( isset( $templateToRemove ) ) {
594 - foreach ( $templateToRemove as $template ) {
595 - $this->removeTemplateFor( $notice, $template );
 596+
 597+ // Check authentication token
 598+ if ( $wgUser->matchEditToken( $wgRequest->getVal( 'authtoken' ) ) ) {
 599+
 600+ // Handle adding of banners to the campaign
 601+ $templatesToAdd = $wgRequest->getArray( 'addTemplates' );
 602+ if ( isset( $templatesToAdd ) ) {
 603+ $weight = $wgRequest->getArray( 'weight' );
 604+ foreach ( $templatesToAdd as $templateName ) {
 605+ $templateId = $this->getTemplateId( $templateName );
 606+ $this->addTemplateTo( $notice, $templateName, $weight[$templateId] );
 607+ }
596608 }
597 - }
 609+
 610+ // Handle removing of banners from the campaign
 611+ $templateToRemove = $wgRequest->getArray( 'removeTemplates' );
 612+ if ( isset( $templateToRemove ) ) {
 613+ foreach ( $templateToRemove as $template ) {
 614+ $this->removeTemplateFor( $notice, $template );
 615+ }
 616+ }
 617+
 618+ // Handle new project name
 619+ $projectName = $wgRequest->getVal( 'project_name' );
 620+ if ( isset( $projectName ) ) {
 621+ $this->updateProjectName ( $notice, $projectName );
 622+ }
 623+
 624+ // Handle new project languages
 625+ $projectLangs = $wgRequest->getArray( 'project_languages' );
 626+ if ( isset( $projectLangs ) ) {
 627+ $this->updateProjectLanguages( $notice, $projectLangs );
 628+ }
 629+
 630+ // Handle weight change
 631+ $updatedWeights = $wgRequest->getArray( 'weight' );
 632+ if ( isset( $updatedWeights ) ) {
 633+ foreach ( $updatedWeights as $templateId => $weight ) {
 634+ $this->updateWeight( $noticeName, $templateId, $weight );
 635+ }
 636+ }
598637
599 - // Handle new project name
600 - $projectName = $wgRequest->getVal( 'project_name' );
601 - if ( isset( $projectName ) ) {
602 - $this->updateProjectName ( $notice, $projectName );
 638+ $wgOut->redirect( $this->getTitle()->getLocalUrl( "method=listNoticeDetail&notice=$notice" ) );
 639+ return;
 640+
 641+ } else {
 642+ $wgOut->wrapWikiMsg( "<div class='cn-error'>\n$1\n</div>", 'sessionfailure' );
603643 }
604 -
605 - // Handle new user language
606 - $projectLang = $wgRequest->getVal( 'wpUserLanguage' );
607 - if ( isset( $projectLang ) ) {
608 - $this->updateProjectLanguage( $notice, $projectLang );
 644+
 645+ }
 646+
 647+ $noticeId = $this->getNoticeId( $notice );
 648+
 649+ // Make sure notice exists
 650+ if ( !$noticeId ) {
 651+ $wgOut->wrapWikiMsg( "<div class='cn-error'>\n$1\n</div>", 'centralnotice-notice-doesnt-exist' );
 652+ } else {
 653+ $htmlOut = '';
 654+
 655+ // Begin Campaign detail fieldset
 656+ $htmlOut .= Xml::openElement( 'fieldset', array( 'class' => 'prefsection' ) );
 657+
 658+ if ( $this->editable ) {
 659+ $htmlOut .= Xml::openElement( 'form',
 660+ array(
 661+ 'method' => 'post',
 662+ 'action' => $this->getTitle()->getLocalUrl( "method=listNoticeDetail&notice=$notice" )
 663+ )
 664+ );
609665 }
610 -
611 - // Handle adding of templates
612 - $templatesToAdd = $wgRequest->getArray( 'addTemplates' );
613 - if ( isset( $templatesToAdd ) ) {
614 - $weight = $wgRequest->getArray( 'weight' );
615 - foreach ( $templatesToAdd as $template ) {
616 - $this->addTemplateTo( $notice, $template, $weight[$template] );
 666+
 667+ $output_detail = $this->noticeDetailForm( $notice );
 668+ $output_assigned = $this->assignedTemplatesForm( $notice );
 669+ $output_templates = $this->addTemplatesForm( $notice );
 670+
 671+ $htmlOut .= $output_detail;
 672+
 673+ // Catch for no banners so that we don't double message
 674+ if ( $output_assigned == '' && $output_templates == '' ) {
 675+ $htmlOut .= wfMsg( 'centralnotice-no-templates' );
 676+ $htmlOut .= Xml::element( 'p' );
 677+ $newPage = $this->getTitleFor( 'NoticeTemplate', 'add' );
 678+ $sk = $wgUser->getSkin();
 679+ $htmlOut .= $sk->makeLinkObj( $newPage, wfMsgHtml( 'centralnotice-add-template' ) );
 680+ $htmlOut .= Xml::element( 'p' );
 681+ } elseif ( $output_assigned == '' ) {
 682+ $htmlOut .= Xml::fieldset( wfMsg( 'centralnotice-assigned-templates' ) );
 683+ $htmlOut .= wfMsg( 'centralnotice-no-templates-assigned' );
 684+ $htmlOut .= Xml::closeElement( 'fieldset' );
 685+ if ( $this->editable ) {
 686+ $htmlOut .= $output_templates;
617687 }
 688+ } else {
 689+ $htmlOut .= $output_assigned;
 690+ if ( $this->editable ) {
 691+ $htmlOut .= $output_templates;
 692+ }
618693 }
619 - $wgOut->redirect( SpecialPage::getTitleFor( 'CentralNotice' )->getLocalUrl( "method=listNoticeDetail&notice=$notice" ) );
620 - return;
621 - }
622 -
623 - $htmlOut = '';
624 - if ( $this->editable ) {
625 - $htmlOut .= Xml::openElement( 'form',
626 - array(
627 - 'method' => 'post',
628 - 'action' => SpecialPage::getTitleFor( 'CentralNotice' )->getLocalUrl( "method=listNoticeDetail&notice=$notice" )
629 - )
630 - );
631 - }
632 -
633 - /*
634 - * Temporarily hard coded
635 - */
636 - $this->showAll = 'Y';
637 -
638 - $output_detail = $this->noticeDetailForm( $notice );
639 - $output_assigned = $this->assignedTemplatesForm( $notice );
640 - $output_templates = $this->addTemplatesForm( $notice );
641 -
642 - // No notices returned
643 - if ( $output_detail == '' ) {
644 - $htmlOut .= wfMsg( 'centralnotice-no-notices-exist' );
645 - } else {
646 - $htmlOut .= $output_detail;
647 - }
648 -
649 - // Catch for no templates so that we dont' double message
650 - if ( $output_assigned == '' && $output_templates == '' ) {
651 - $htmlOut .= wfMsg( 'centralnotice-no-templates' );
652 - $htmlOut .= Xml::element( 'p' );
653 - $newPage = SpecialPage::getTitleFor( 'NoticeTemplate', 'add' );
654 - $sk = $wgUser->getSkin();
655 - $htmlOut .= $sk->makeLinkObj( $newPage, wfMsgHtml( 'centralnotice-add-template' ) );
656 - $htmlOut .= Xml::element( 'p' );
657 - } elseif ( $output_assigned == '' ) {
658 - $htmlOut .= wfMsg( 'centralnotice-no-templates-assigned' );
659694 if ( $this->editable ) {
660 - $htmlOut .= $output_templates;
 695+ $htmlOut .= Xml::hidden( 'authtoken', $wgUser->editToken() );
 696+
 697+ // Submit button
 698+ $htmlOut .= Xml::tags( 'div',
 699+ array( 'class' => 'cn-buttons' ),
 700+ Xml::submitButton( wfMsg( 'centralnotice-modify' ) )
 701+ );
661702 }
662 - } else {
663 - $htmlOut .= $output_assigned;
 703+
664704 if ( $this->editable ) {
665 - $htmlOut .= $output_templates;
 705+ $htmlOut .= Xml::closeElement( 'form' );
666706 }
 707+ $htmlOut .= Xml::closeElement( 'fieldset' );
 708+ $wgOut->addHTML( $htmlOut );
667709 }
668 -
669 - if ( $this->editable ) {
670 - $htmlOut .= Xml::tags( 'tr', null,
671 - Xml::tags( 'td', array( 'collspan' => 2 ),
672 - Xml::submitButton( wfMsg( 'centralnotice-modify' ) )
673 - )
674 - );
675 - $htmlOut .= Xml::closeElement( 'form' );
676 - }
677 - $wgOut->addHTML( $htmlOut );
678710 }
679 -
 711+
 712+ /**
 713+ * Create form for managing campaign settings (start date, end date, languages, etc.)
 714+ */
680715 function noticeDetailForm( $notice ) {
 716+ global $wgRequest;
 717+
681718 if ( $this->editable ) {
682719 $readonly = array();
683720 } else {
@@ -684,6 +721,7 @@
685722 }
686723 $dbr = wfGetDB( DB_SLAVE );
687724
 725+ // Get campaign info from database
688726 $row = $dbr->selectRow( 'cn_notices',
689727 array(
690728 'not_id',
@@ -693,85 +731,100 @@
694732 'not_enabled',
695733 'not_preferred',
696734 'not_project',
697 - 'not_language',
698735 'not_locked'
699736 ),
700737 array( 'not_name' => $notice ),
701 - __METHOD__,
702 - array( 'ORDER BY' => 'not_id' )
 738+ __METHOD__
703739 );
704 -
 740+
705741 if ( $row ) {
 742+
 743+ // If there was an error, we'll need to restore the state of the form
 744+ if ( $wgRequest->wasPosted() ) {
 745+ $startArray = $wgRequest->getArray( 'start' );
 746+ $startTimestamp = $startArray['year'] .
 747+ $startArray['month'] .
 748+ $startArray['day'] .
 749+ $startArray['hour'] .
 750+ $startArray['min'] . '00'
 751+ ;
 752+ $endArray = $wgRequest->getArray( 'end' );
 753+ $endTimestamp = $endArray['year'] .
 754+ $endArray['month'] .
 755+ $endArray['day'] . '000000'
 756+ ;
 757+ $projectSelected = $wgRequest->getVal( 'project_name' );
 758+ $noticeLanguages = $wgRequest->getArray( 'project_languages' );
 759+ } else { // Defaults
 760+ $startTimestamp = $row->not_start;
 761+ $endTimestamp = $row->not_end;
 762+ $projectSelected = $row->not_project;
 763+ $noticeLanguages = $this->getNoticeLanguages( $notice );
 764+ }
 765+
706766 // Build Html
707 - $htmlOut = Xml::fieldset( $notice );
 767+ $htmlOut = '';
 768+ $htmlOut .= Xml::tags( 'h2', null, wfMsg( 'centralnotice-notice-heading', $notice ) );
708769 $htmlOut .= Xml::openElement( 'table', array( 'cellpadding' => 9 ) );
709770
710771 // Rows
711 - $table = array(
712 - // Day
713 - array(
714 - wfMsgHtml( 'centralnotice-start-date' ),
715 - $this->dateSelector( "start", $row->not_start ),
716 - ),
717 - // Time of day
718 - array(
719 - wfMsgHtml( 'centralnotice-start-time' ),
720 - $this->timeSelector( "start", $row->not_start, "[$row->not_name]" ),
721 - ),
722 - // End
723 - array(
724 - wfMsgHtml( 'centralnotice-end-date' ),
725 - $this->dateSelector( "end", $row->not_end, "[$row->not_name]" ),
726 - ),
727 - // Project
728 - array(
729 - wfMsgHtml( 'centralnotice-project-name' ),
730 - $this->projectDropDownList( $row->not_project )
731 - ),
732 - // Language
733 - $this->languageDropDownList( $row->not_language ),
734 - // Enabled
735 - array(
736 - wfMsgHtml( 'centralnotice-enabled' ),
737 - Xml::check( 'enabled[]', ( $row->not_enabled == '1' ),
738 - wfArrayMerge( $readonly,
739 - array( 'value' => $row->not_name ) ) )
740 - ),
741 - // Preferred
742 - array(
743 - wfMsgHtml( 'centralnotice-preferred' ),
744 - Xml::check( 'preferred[]', ( $row->not_preferred == '1' ),
745 - wfArrayMerge( $readonly,
746 - array( 'value' => $row->not_name ) ) ),
747 - ),
 772+ // Start Date
 773+ $htmlOut .= Xml::openElement( 'tr' );
 774+ $htmlOut .= Xml::tags( 'td', array(), wfMsgHtml( 'centralnotice-start-date' ) );
 775+ $htmlOut .= Xml::tags( 'td', array(), $this->dateSelector( 'start', $startTimestamp ) );
 776+ $htmlOut .= Xml::closeElement( 'tr' );
 777+ // Start Time
 778+ $htmlOut .= Xml::openElement( 'tr' );
 779+ $htmlOut .= Xml::tags( 'td', array(), wfMsgHtml( 'centralnotice-start-hour' ) . "(GMT)" );
 780+ $htmlOut .= Xml::tags( 'td', array(), $this->timeSelector( 'start', $startTimestamp ) );
 781+ $htmlOut .= Xml::closeElement( 'tr' );
 782+ // End Date
 783+ $htmlOut .= Xml::openElement( 'tr' );
 784+ $htmlOut .= Xml::tags( 'td', array(), wfMsgHtml( 'centralnotice-end-date' ) );
 785+ $htmlOut .= Xml::tags( 'td', array(), $this->dateSelector( 'end', $endTimestamp ) );
 786+ $htmlOut .= Xml::closeElement( 'tr' );
 787+ // Project
 788+ $htmlOut .= Xml::openElement( 'tr' );
 789+ $htmlOut .= Xml::tags( 'td', array(), wfMsgHtml( 'centralnotice-project-name' ) );
 790+ $htmlOut .= Xml::tags( 'td', array(), $this->projectDropDownList( $projectSelected ) );
 791+ $htmlOut .= Xml::closeElement( 'tr' );
 792+ // Languages
 793+ $htmlOut .= Xml::openElement( 'tr' );
 794+ $htmlOut .= Xml::tags( 'td', array( 'valign' => 'top' ), wfMsgHtml( 'yourlanguage' ) );
 795+ $htmlOut .= Xml::tags( 'td', array(), $this->languageMultiSelector( $noticeLanguages ) );
 796+ $htmlOut .= Xml::closeElement( 'tr' );
 797+ // Enabled
 798+ $htmlOut .= Xml::openElement( 'tr' );
 799+ $htmlOut .= Xml::tags( 'td', array(), Xml::label( wfMsgHtml( 'centralnotice-enabled' ), 'enabled[]' ) );
 800+ $htmlOut .= Xml::tags( 'td', array(), Xml::check( 'enabled[]', ( $row->not_enabled == '1' ), wfArrayMerge( $readonly, array( 'value' => $row->not_name, 'id' => 'enabled[]' ) ) ) );
 801+ $htmlOut .= Xml::closeElement( 'tr' );
 802+ // Preferred
 803+ $htmlOut .= Xml::openElement( 'tr' );
 804+ $htmlOut .= Xml::tags( 'td', array(), Xml::label( wfMsgHtml( 'centralnotice-preferred' ), 'preferred[]' ) );
 805+ $htmlOut .= Xml::tags( 'td', array(), Xml::check( 'preferred[]', ( $row->not_preferred == '1' ), wfArrayMerge( $readonly, array( 'value' => $row->not_name, 'id' => 'preferred[]' ) ) ) );
 806+ $htmlOut .= Xml::closeElement( 'tr' );
 807+ // Locked
 808+ $htmlOut .= Xml::openElement( 'tr' );
 809+ $htmlOut .= Xml::tags( 'td', array(), Xml::label( wfMsgHtml( 'centralnotice-locked' ), 'locked[]' ) );
 810+ $htmlOut .= Xml::tags( 'td', array(), Xml::check( 'locked[]', ( $row->not_locked == '1' ), wfArrayMerge( $readonly, array( 'value' => $row->not_name, 'id' => 'locked[]' ) ) ) );
 811+ $htmlOut .= Xml::closeElement( 'tr' );
 812+ if ( $this->editable ) {
748813 // Locked
749 - array(
750 - wfMsgHtml( 'centralnotice-locked' ),
751 - Xml::check( 'locked[]', ( $row->not_locked == '1' ),
752 - wfArrayMerge( $readonly,
753 - array( 'value' => $row->not_name ) ) ),
754 - ),
755 - );
756 - if ( $this->editable ) {
757 - // Remove
758 - $table[] = array(
759 - wfMsgHtml( 'centralnotice-remove' ),
760 - Xml::check( 'removeNotices[]', false,
761 - array( 'value' => $row->not_name ) )
762 - );
 814+ $htmlOut .= Xml::openElement( 'tr' );
 815+ $htmlOut .= Xml::tags( 'td', array(), Xml::label( wfMsgHtml( 'centralnotice-remove' ), 'removeNotices[]' ) );
 816+ $htmlOut .= Xml::tags( 'td', array(), Xml::check( 'removeNotices[]', false, array( 'value' => $row->not_name, 'id' => 'removeNotices[]' ) ) );
 817+ $htmlOut .= Xml::closeElement( 'tr' );
763818 }
764 - foreach ( $table as $cells ) {
765 - $htmlOut .= $this->tableRow( $cells );
766 - }
767819 $htmlOut .= Xml::closeElement( 'table' );
768 - $htmlOut .= Xml::closeElement( 'fieldset' ) ;
769820 return $htmlOut;
770821 } else {
771822 return '';
772823 }
773824 }
774825
775 -
 826+ /**
 827+ * Create form for managing banners assigned to a campaign
 828+ */
776829 function assignedTemplatesForm( $notice ) {
777830 global $wgUser;
778831 $sk = $wgUser->getSkin();
@@ -784,6 +837,7 @@
785838 'cn_templates'
786839 ),
787840 array(
 841+ 'cn_templates.tmp_id',
788842 'cn_templates.tmp_name',
789843 'cn_assignments.tmp_weight'
790844 ),
@@ -796,12 +850,12 @@
797851 array( 'ORDER BY' => 'cn_notices.not_id' )
798852 );
799853
800 - // No templates found
 854+ // No banners found
801855 if ( $dbr->numRows( $res ) < 1 ) {
802856 return;
803857 }
804858
805 - // Build Assigned Template HTML
 859+ // Build Assigned banners HTML
806860 $htmlOut = Xml::hidden( 'change', 'weight' );
807861 $htmlOut .= Xml::fieldset( wfMsg( 'centralnotice-assigned-templates' ) );
808862 $htmlOut .= Xml::openElement( 'table',
@@ -819,7 +873,7 @@
820874 $htmlOut .= Xml::element( 'th', array( 'align' => 'left', 'width' => '70%' ),
821875 wfMsg ( "centralnotice-templates" ) );
822876
823 - // Rows
 877+ // Table rows
824878 while ( $row = $dbr->fetchObject( $res ) ) {
825879
826880 $htmlOut .= Xml::openElement( 'tr' );
@@ -833,10 +887,10 @@
834888
835889 // Weight
836890 $htmlOut .= Xml::tags( 'td', array( 'valign' => 'top' ),
837 - $this->weightDropDown( "weight[$row->tmp_name]", $row->tmp_weight )
 891+ $this->weightDropDown( "weight[$row->tmp_id]", $row->tmp_weight )
838892 );
839893
840 - $viewPage = SpecialPage::getTitleFor( 'NoticeTemplate/view' );
 894+ $viewPage = $this->getTitleFor( 'NoticeTemplate', 'view' );
841895 $render = new SpecialNoticeText();
842896 $render->project = 'wikipedia';
843897 global $wgRequest;
@@ -846,7 +900,8 @@
847901 htmlspecialchars( $row->tmp_name ),
848902 'template=' . urlencode( $row->tmp_name ) ) .
849903 Xml::fieldset( wfMsg( 'centralnotice-preview' ),
850 - $render->getHtmlNotice( $row->tmp_name )
 904+ $render->getHtmlNotice( $row->tmp_name ),
 905+ array( 'class' => 'cn-bannerpreview')
851906 )
852907 );
853908
@@ -872,87 +927,23 @@
873928 }
874929 }
875930
876 -
 931+ /**
 932+ * Create form for adding banners to a campaign
 933+ */
877934 function addTemplatesForm( $notice ) {
878 - global $wgUser;
879 - $sk = $wgUser->getSkin();
 935+ $pager = new CentralNoticePager( $this );
880936 $dbr = wfGetDB( DB_SLAVE );
881937 $res = $dbr->select( 'cn_templates', 'tmp_name', '', '', array( 'ORDER BY' => 'tmp_id' ) );
882 -
883 - $res_assignments = $dbr->select(
884 - array(
885 - 'cn_notices',
886 - 'cn_assignments',
887 - 'cn_templates'
888 - ),
889 - array(
890 - 'cn_templates.tmp_name',
891 - ),
892 - array(
893 - 'cn_notices.not_name' => $notice,
894 - 'cn_notices.not_id = cn_assignments.not_id',
895 - 'cn_assignments.tmp_id = cn_templates.tmp_id'
896 - ),
897 - __METHOD__,
898 - array( 'ORDER BY' => 'cn_notices.not_id' )
899 - );
900 -
 938+
901939 if ( $dbr->numRows( $res ) > 0 ) {
902940 // Build HTML
903941 $htmlOut = Xml::fieldset( wfMsg( "centralnotice-available-templates" ) );
904 - $htmlOut .= Xml::openElement( 'table', array( 'cellpadding' => 9 ) );
905 -
906 -
907 - $htmlOut .= Xml::element( 'th', array( 'align' => 'left', 'width' => '5%' ),
908 - wfMsg ( "centralnotice-add" ) );
909 - $htmlOut .= Xml::element( 'th', array( 'align' => 'left', 'width' => '5%' ),
910 - wfMsg ( "centralnotice-weight" ) );
911 - $htmlOut .= Xml::element( 'th', array( 'align' => 'left', 'width' => '70%' ),
912 - wfMsg ( "centralnotice-templates" ) );
913 -
914 - // Find dups
915 - $templatesAssigned = $this->selectTemplatesAssigned( $notice );
916 -
917 - // Build rows
918 - while ( $row = $dbr->fetchObject( $res ) ) {
919 - if ( !in_array ( $row->tmp_name, $templatesAssigned ) ) {
920 - $htmlOut .= Xml::openElement( 'tr' );
921 -
922 - // Add
923 - $htmlOut .= Xml::tags( 'td', array( 'valign' => 'top' ),
924 - Xml::check( 'addTemplates[]', '', array ( 'value' => $row->tmp_name ) )
925 - );
926 -
927 - // Weight
928 - $htmlOut .= Xml::tags( 'td', array( 'valign' => 'top' ),
929 - Xml::listDropDown( "weight[$row->tmp_name]",
930 - $this->dropDownList( wfMsg( 'centralnotice-weight' ), range ( 0, 100, 5 ) ) ,
931 - '',
932 - '25',
933 - '',
934 - '' )
935 - );
936 -
937 - // Render preview
938 - $viewPage = SpecialPage::getTitleFor( 'NoticeTemplate/view' );
939 - $render = new SpecialNoticeText();
940 - $render->project = 'wikipedia';
941 - global $wgRequest;
942 - $render->language = $wgRequest->getVal( 'wpUserLanguage' );
943 - $htmlOut .= Xml::tags( 'td', array( 'valign' => 'top' ),
944 - $sk->makeLinkObj( $viewPage,
945 - htmlspecialchars( $row->tmp_name ),
946 - 'template=' . urlencode( $row->tmp_name ) ) .
947 - Xml::fieldset( wfMsg( 'centralnotice-preview' ),
948 - $render->getHtmlNotice( $row->tmp_name )
949 - )
950 - );
951 -
952 - $htmlOut .= Xml::closeElement( 'tr' );
953 - }
954 - }
955 -
956 - $htmlOut .= Xml::closeElement( 'table' );
 942+
 943+ // Show paginated list of banners
 944+ $htmlOut .= Xml::tags( 'div', array( 'class' => 'cn-pager' ), $pager->getNavigationBar() );
 945+ $htmlOut .= $pager->getBody();
 946+ $htmlOut .= Xml::tags( 'div', array( 'class' => 'cn-pager' ), $pager->getNavigationBar() );
 947+
957948 $htmlOut .= Xml::closeElement( 'fieldset' );
958949 } else {
959950 // Nothing found
@@ -961,36 +952,11 @@
962953 return $htmlOut;
963954 }
964955
965 -
966 - function selectTemplatesAssigned ( $notice ) {
967 - $dbr = wfGetDB( DB_SLAVE );
968 - $res = $dbr->select(
969 - array(
970 - 'cn_notices',
971 - 'cn_assignments',
972 - 'cn_templates'
973 - ),
974 - array(
975 - 'cn_templates.tmp_name',
976 - ),
977 - array(
978 - 'cn_notices.not_name' => $notice,
979 - 'cn_notices.not_id = cn_assignments.not_id',
980 - 'cn_assignments.tmp_id = cn_templates.tmp_id'
981 - ),
982 - __METHOD__,
983 - array( 'ORDER BY' => 'cn_notices.not_id' )
984 - );
985 - $templateNames = array();
986 - foreach ( $res as $row ) {
987 - array_push( $templateNames, $row->tmp_name ) ;
988 - }
989 - return $templateNames;
990 - }
991 -
992956 /**
993 - * Lookup function for active notice under a given language and project
994 - * Returns an id for the running notice
 957+ * Lookup function for active banners under a given language and project. This function is
 958+ * called by SpecialNoticeText::getJsOutput() in order to build the static Javascript files for
 959+ * each project.
 960+ * @return A 2D array of running banners with associated weights and settings
995961 */
996962 static function selectNoticeTemplates( $project, $language ) {
997963 $dbr = wfGetDB( DB_SLAVE );
@@ -998,44 +964,54 @@
999965 $res = $dbr->select(
1000966 array(
1001967 'cn_notices',
 968+ 'cn_notice_languages',
1002969 'cn_assignments',
1003 - 'cn_templates',
 970+ 'cn_templates'
1004971 ),
1005972 array(
1006973 'tmp_name',
1007 - 'SUM(tmp_weight) AS total_weight'
 974+ 'SUM(tmp_weight) AS total_weight',
 975+ 'tmp_display_anon',
 976+ 'tmp_display_account'
1008977 ),
1009978 array (
1010979 "not_start <= $encTimestamp",
1011980 "not_end >= $encTimestamp",
1012981 "not_enabled = 1",
1013 - "not_language" => array( '', $language ),
 982+ 'nl_notice_id = cn_notices.not_id',
 983+ 'nl_language' => $language,
1014984 "not_project" => array( '', $project ),
1015985 'cn_notices.not_id=cn_assignments.not_id',
1016 - 'cn_assignments.tmp_id=cn_templates.tmp_id',
 986+ 'cn_assignments.tmp_id=cn_templates.tmp_id'
1017987 ),
1018988 __METHOD__,
1019989 array(
1020 - 'GROUP BY' => 'tmp_name',
 990+ 'GROUP BY' => 'tmp_name'
1021991 )
1022992 );
1023 - $templateWeights = array();
 993+ $templates = array();
1024994 foreach ( $res as $row ) {
1025 - $name = $row->tmp_name;
1026 - $weight = intval( $row->total_weight );
1027 - $templateWeights[$name] = $weight;
 995+ $template = array();
 996+ $template['name'] = $row->tmp_name;
 997+ $template['weight'] = intval( $row->total_weight );
 998+ $template['display_anon'] = intval( $row->tmp_display_anon );
 999+ $template['display_account'] = intval( $row->tmp_display_account );
 1000+ $templates[] = $template;
10281001 }
1029 - return $templateWeights;
 1002+ return $templates;
10301003 }
10311004
1032 - function addNotice( $noticeName, $enabled, $start, $project_name, $project_language ) {
 1005+ function addNotice( $noticeName, $enabled, $start, $project_name, $project_languages ) {
10331006 global $wgOut;
10341007
10351008 $dbr = wfGetDB( DB_SLAVE );
10361009 $res = $dbr->select( 'cn_notices', 'not_name', array( 'not_name' => $noticeName ) );
10371010 if ( $dbr->numRows( $res ) > 0 ) {
1038 - $wgOut->addWikiMsg( 'centralnotice-notice-exists' );
 1011+ $wgOut->wrapWikiMsg( "<div class='cn-error'>\n$1\n</div>", 'centralnotice-notice-exists' );
10391012 return;
 1013+ } elseif ( empty( $project_languages ) ) {
 1014+ $wgOut->wrapWikiMsg( "<div class='cn-error'>\n$1\n</div>", 'centralnotice-no-language' );
 1015+ return;
10401016 } else {
10411017 $dbw = wfGetDB( DB_MASTER );
10421018 $dbw->begin();
@@ -1059,10 +1035,18 @@
10601036 'not_enabled' => $enabled,
10611037 'not_start' => $dbr->timestamp( $startTs ),
10621038 'not_end' => $dbr->timestamp( $endTs ),
1063 - 'not_project' => $project_name,
1064 - 'not_language' => $project_language
 1039+ 'not_project' => $project_name
10651040 )
10661041 );
 1042+ $not_id = $dbw->insertId();
 1043+
 1044+ // Do multi-row insert for campaign languages
 1045+ $insertArray = array();
 1046+ foreach( $project_languages as $code ) {
 1047+ $insertArray[] = array( 'nl_notice_id' => $not_id, 'nl_language' => $code );
 1048+ }
 1049+ $res = $dbw->insert( 'cn_notice_languages', $insertArray, __METHOD__, array( 'IGNORE' ) );
 1050+
10671051 $dbw->commit();
10681052 return;
10691053 }
@@ -1076,12 +1060,12 @@
10771061 array( 'not_name' => $noticeName )
10781062 );
10791063 if ( $dbr->numRows( $res ) < 1 ) {
1080 - $wgOut->addWikiMsg( 'centralnotice-notice-doesnt-exist' );
 1064+ $wgOut->wrapWikiMsg( "<div class='cn-error'>\n$1\n</div>", 'centralnotice-remove-notice-doesnt-exist' );
10811065 return;
10821066 }
10831067 $row = $dbr->fetchObject( $res );
10841068 if ( $row->not_locked == '1' ) {
1085 - $wgOut->addWikiMsg( 'centralnotice-notice-is-locked' );
 1069+ $wgOut->wrapWikiMsg( "<div class='cn-error'>\n$1\n</div>", 'centralnotice-notice-is-locked' );
10861070 return;
10871071 } else {
10881072 $dbw = wfGetDB( DB_MASTER );
@@ -1089,6 +1073,7 @@
10901074 $noticeId = htmlspecialchars( $this->getNoticeId( $noticeName ) );
10911075 $res = $dbw->delete( 'cn_assignments', array ( 'not_id' => $noticeId ) );
10921076 $res = $dbw->delete( 'cn_notices', array ( 'not_name' => $noticeName ) );
 1077+ $res = $dbw->delete( 'cn_notice_languages', array ( 'nl_notice_id' => $noticeId ) );
10931078 $dbw->commit();
10941079 return;
10951080 }
@@ -1109,7 +1094,7 @@
11101095 )
11111096 );
11121097 if ( $dbr->numRows( $res ) > 0 ) {
1113 - $wgOut->addWikiMsg( 'centralnotice-template-already-exists' );
 1098+ $wgOut->wrapWikiMsg( "<div class='cn-error'>\n$1\n</div>", 'centralnotice-template-already-exists' );
11141099 } else {
11151100 $dbw = wfGetDB( DB_MASTER );
11161101 $dbw->begin();
@@ -1125,23 +1110,35 @@
11261111 }
11271112 }
11281113
1129 - function getNoticeId ( $noticeName ) {
 1114+ /**
 1115+ * Lookup the ID for a campaign based on the campaign name
 1116+ */
 1117+ public static function getNoticeId( $noticeName ) {
11301118 $dbr = wfGetDB( DB_SLAVE );
11311119 $eNoticeName = htmlspecialchars( $noticeName );
1132 - $res = $dbr->select( 'cn_notices', 'not_id', array( 'not_name' => $eNoticeName ) );
1133 - $row = $dbr->fetchObject( $res );
1134 - return $row->not_id;
 1120+ $row = $dbr->selectRow( 'cn_notices', 'not_id', array( 'not_name' => $eNoticeName ) );
 1121+ if ( $row ) {
 1122+ return $row->not_id;
 1123+ } else {
 1124+ return;
 1125+ }
11351126 }
11361127
1137 - function getNoticeLanguage ( $noticeName ) {
1138 - $dbr = wfGetDB( DB_SLAVE );
1139 - $eNoticeName = htmlspecialchars( $noticeName );
1140 - $res = $dbr->select( 'cn_notices', 'not_language', array( 'not_name' => $eNoticeName ) );
1141 - $row = $dbr->fetchObject( $res );
1142 - return $row->not_language;
 1128+ function getNoticeLanguages( $noticeName ) {
 1129+ $dbr = wfGetDB( DB_SLAVE );
 1130+ $eNoticeName = htmlspecialchars( $noticeName );
 1131+ $row = $dbr->selectRow( 'cn_notices', 'not_id', array( 'not_name' => $eNoticeName ) );
 1132+ $languages = array();
 1133+ if ( $row ) {
 1134+ $res = $dbr->select( 'cn_notice_languages', 'nl_language', array( 'nl_notice_id' => $row->not_id ) );
 1135+ foreach ( $res as $langRow ) {
 1136+ $languages[] = $langRow->nl_language;
 1137+ }
 1138+ }
 1139+ return $languages;
11431140 }
11441141
1145 - function getNoticeProjectName ( $noticeName ) {
 1142+ function getNoticeProjectName( $noticeName ) {
11461143 $dbr = wfGetDB( DB_SLAVE );
11471144 $eNoticeName = htmlspecialchars( $noticeName );
11481145 $res = $dbr->select( 'cn_notices', 'not_project', array( 'not_name' => $eNoticeName ) );
@@ -1149,7 +1146,7 @@
11501147 return $row->not_project;
11511148 }
11521149
1153 - function getTemplateId ( $templateName ) {
 1150+ function getTemplateId( $templateName ) {
11541151 $dbr = wfGetDB( DB_SLAVE );
11551152 $templateName = htmlspecialchars ( $templateName );
11561153 $res = $dbr->select( 'cn_templates', 'tmp_id', array( 'tmp_name' => $templateName ) );
@@ -1158,33 +1155,29 @@
11591156 }
11601157
11611158 function removeTemplateFor( $noticeName, $templateName ) {
1162 - global $wgOut;
1163 -
11641159 $dbw = wfGetDB( DB_MASTER );
11651160 $dbw->begin();
11661161 $noticeId = $this->getNoticeId( $noticeName );
11671162 $templateId = $this->getTemplateId( $templateName );
1168 - $res = $dbw->delete( 'cn_assignments', array ( 'tmp_id' => $templateId, 'not_id' => $noticeId ) );
 1163+ $dbw->delete( 'cn_assignments', array ( 'tmp_id' => $templateId, 'not_id' => $noticeId ) );
11691164 $dbw->commit();
11701165 }
11711166
1172 - function updateNoticeDate ( $noticeName, $start, $end ) {
 1167+ function updateNoticeDate( $noticeName, $start, $end ) {
11731168 global $wgOut;
11741169
11751170 $dbr = wfGetDB( DB_SLAVE );
1176 - $project_name = $this->getNoticeProjectname( $noticeName );
1177 - $project_language = $this->getNoticeLanguage( $noticeName );
11781171
1179 - // Start / end dont line up
 1172+ // Start/end don't line up
11801173 if ( $start > $end || $end < $start ) {
1181 - $wgOut->addWikiMsg( 'centralnotice-invalid-date-range3' );
 1174+ $wgOut->wrapWikiMsg( "<div class='cn-error'>\n$1\n</div>", 'centralnotice-invalid-date-range3' );
11821175 return;
11831176 }
11841177
1185 - // Invalid notice name
 1178+ // Invalid campaign name
11861179 $res = $dbr->select( 'cn_notices', 'not_name', array( 'not_name' => $noticeName ) );
11871180 if ( $dbr->numRows( $res ) < 1 ) {
1188 - $wgOut->addWikiMsg( 'centralnotice-doesnt-exist' );
 1181+ $wgOut->wrapWikiMsg( "<div class='cn-error'>\n$1\n</div>", 'centralnotice-notice-doesnt-exist' );
11891182 }
11901183
11911184 // Overlap over a date within the same project and language
@@ -1203,7 +1196,7 @@
12041197 $dbw->commit();
12051198 }
12061199
1207 - function updateLock ( $noticeName, $isLocked ) {
 1200+ function updateLock( $noticeName, $isLocked ) {
12081201 global $wgOut;
12091202
12101203 $dbr = wfGetDB( DB_SLAVE );
@@ -1211,7 +1204,7 @@
12121205 array( 'not_name' => $noticeName )
12131206 );
12141207 if ( $dbr->numRows( $res ) < 1 ) {
1215 - $wgOut->addWikiMsg( 'centralnotice-doesnt-exist' );
 1208+ $wgOut->wrapWikiMsg( "<div class='cn-error'>\n$1\n</div>", 'centralnotice-doesnt-exist' );
12161209 } else {
12171210 $dbw = wfGetDB( DB_MASTER );
12181211 $dbw->begin();
@@ -1223,19 +1216,16 @@
12241217 }
12251218 }
12261219
1227 - function updateWeight ( $noticeName, $templateName, $weight ) {
 1220+ function updateWeight( $noticeName, $templateId, $weight ) {
12281221 $dbw = wfGetDB( DB_MASTER );
1229 - $dbw->begin();
12301222 $noticeId = $this->getNoticeId( $noticeName );
1231 - $templateId = $this->getTemplateId( $templateName );
1232 - $res = $dbw->update( 'cn_assignments',
 1223+ $dbw->update( 'cn_assignments',
12331224 array ( 'tmp_weight' => $weight ),
12341225 array(
12351226 'tmp_id' => $templateId,
12361227 'not_id' => $noticeId
12371228 )
12381229 );
1239 - $dbw->commit();
12401230 }
12411231
12421232 function projectDropDownList( $selected = '' ) {
@@ -1257,50 +1247,62 @@
12581248 }
12591249 }
12601250 }
 1251+
 1252+ /**
 1253+ * Generates a multiple select list of all languages.
 1254+ * @param $selected The language codes of the selected languages
 1255+ * @param $customisedOnly If true only languages which have some content are listed
 1256+ * @return multiple select list
 1257+ */
 1258+ function languageMultiSelector( $selected = array(), $customisedOnly = true ) {
 1259+ global $wgContLanguageCode, $wgExtensionAssetsPath, $wgLang;
 1260+ $scriptPath = "$wgExtensionAssetsPath/CentralNotice";
 1261+ // Make sure the site language is in the list; a custom language code might not have a defined name...
 1262+ $languages = Language::getLanguageNames( $customisedOnly );
 1263+ if( !array_key_exists( $wgContLanguageCode, $languages ) ) {
 1264+ $languages[$wgContLanguageCode] = $wgContLanguageCode;
 1265+ }
 1266+ ksort( $languages );
12611267
1262 - function languageDropDownList( $selected = '' ) {
1263 - // Language
1264 - list( $lsLabel, $lsSelect ) = Xml::languageSelector( $selected );
1265 -
 1268+ $options = "\n";
 1269+ foreach( $languages as $code => $name ) {
 1270+ $options .= Xml::option(
 1271+ wfMsg( 'centralnotice-language-listing', $code, $name ),
 1272+ $code,
 1273+ in_array( $code, $selected )
 1274+ ) . "\n";
 1275+ }
 1276+ $htmlOut = '';
12661277 if ( $this->editable ) {
1267 - /*
1268 - * Dirty hack to add our very own "All" option
1269 - */
1270 - // Strip selected flag
1271 - if ( $selected == '' ) {
1272 - $lsSelect = str_replace( ' selected="selected"', '', $lsSelect );
1273 - }
1274 -
1275 - // Find the first select tag
1276 - $insertPoint = stripos( $lsSelect , '<option' );
1277 -
1278 - // Create our own option
1279 - $option = Xml::option( 'All languages', '', ( $selected == '' ) );
1280 -
1281 - // Insert our option
1282 - $lsSelect = substr( $lsSelect, 0, $insertPoint ) . $option . substr( $lsSelect, $insertPoint );
1283 -
1284 - return array( $lsLabel, $lsSelect );
 1278+ $htmlOut .= Xml::tags( 'select',
 1279+ array( 'multiple' => 'multiple', 'size' => 4, 'id' => 'project_languages[]', 'name' => 'project_languages[]' ),
 1280+ $options
 1281+ );
 1282+ $buttons = array();
 1283+ $buttons[] = '<a href="#" onclick="selectLanguages(true);return false;">' . wfMsg( 'powersearch-toggleall' ) . '</a>';
 1284+ $buttons[] = '<a href="#" onclick="selectLanguages(false);return false;">' . wfMsg( 'powersearch-togglenone' ) . '</a>';
 1285+ $buttons[] = '<a href="#" onclick="top10Languages();return false;">' . wfMsg( 'centralnotice-top-ten-languages' ) . '</a>';
 1286+ $htmlOut .= Xml::tags( 'div',
 1287+ array( 'style' => 'margin-top: 0.2em;' ),
 1288+ '<img src="'.$scriptPath.'/up-arrow.png" style="vertical-align:baseline;"/>' . wfMsg( 'centralnotice-select', $wgLang->commaList( $buttons ) )
 1289+ );
12851290 } else {
1286 - if ( $selected == '' ) {
1287 - $lang = 'All languages';
1288 - } else {
1289 - global $wgLang;
1290 - $name = $wgLang->getLanguageName( $selected );
1291 - $lang = htmlspecialchars( "$selected - $name" );
1292 - }
1293 - return array( $lsLabel, $lang );
 1291+ $htmlOut .= Xml::tags( 'select',
 1292+ array( 'multiple' => 'multiple', 'size' => 4, 'id' => 'project_languages[]', 'name' => 'project_languages[]', 'disabled' => 'disabled' ),
 1293+ $options
 1294+ );
12941295 }
 1296+ return $htmlOut;
12951297 }
1296 -
 1298+
12971299 function getProjectName( $value ) {
12981300 return $value; // @fixme -- use wfMsg()
12991301 }
13001302
13011303 function updateProjectName( $notice, $projectName ) {
1302 - $dbw = wfGetDB( DB_MASTER );
1303 - $dbw->begin();
1304 - $res = $dbw->update( 'cn_notices',
 1304+ $dbw = wfGetDB( DB_MASTER );
 1305+ $dbw->begin();
 1306+ $res = $dbw->update( 'cn_notices',
13051307 array ( 'not_project' => $projectName ),
13061308 array(
13071309 'not_name' => $notice
@@ -1309,19 +1311,37 @@
13101312 $dbw->commit();
13111313 }
13121314
1313 - function updateProjectLanguage( $notice, $language ) {
1314 - $dbw = wfGetDB( DB_MASTER );
1315 - $dbw->begin();
1316 - $res = $dbw->update( 'cn_notices',
1317 - array ( 'not_language' => $language ),
1318 - array(
1319 - 'not_name' => $notice
1320 - )
1321 - );
 1315+ function updateProjectLanguages( $notice, $newLanguages ) {
 1316+ $dbw = wfGetDB( DB_MASTER );
 1317+ $dbw->begin();
 1318+
 1319+ // Get the previously assigned languages
 1320+ $oldLanguages = array();
 1321+ $oldLanguages = $this->getNoticeLanguages( $notice );
 1322+
 1323+ // Get the notice id
 1324+ $row = $this->getNoticeId( $notice );
 1325+
 1326+ // Add newly assigned languages
 1327+ $addLanguages = array_diff( $newLanguages, $oldLanguages );
 1328+ $insertArray = array();
 1329+ foreach( $addLanguages as $code ) {
 1330+ $insertArray[] = array( 'nl_notice_id' => $row->not_id, 'nl_language' => $code );
 1331+ }
 1332+ $res = $dbw->insert( 'cn_notice_languages', $insertArray, __METHOD__, array( 'IGNORE' ) );
 1333+
 1334+ // Remove disassociated languages
 1335+ $removeLanguages = array_diff( $oldLanguages, $newLanguages );
 1336+ if ( $removeLanguages ) {
 1337+ $res = $dbw->delete( 'cn_notice_languages',
 1338+ array( 'nl_notice_id' => $row->not_id, 'nl_language' => $removeLanguages )
 1339+ );
 1340+ }
 1341+
13221342 $dbw->commit();
13231343 }
13241344
1325 - function dropDownList ( $text, $values ) {
 1345+ public static function dropDownList( $text, $values ) {
13261346 $dropDown = "* {$text}\n";
13271347 foreach ( $values as $value ) {
13281348 $dropDown .= "**{$value}\n";
@@ -1329,7 +1349,7 @@
13301350 return $dropDown;
13311351 }
13321352
1333 - function addZero ( $text ) {
 1353+ function addZero( $text ) {
13341354 // Prepend a 0 for text needing it
13351355 if ( strlen( $text ) == 1 ) {
13361356 $text = "0{$text}";
@@ -1337,3 +1357,118 @@
13381358 return $text;
13391359 }
13401360 }
 1361+
 1362+
 1363+class CentralNoticePager extends TemplatePager {
 1364+ var $viewPage, $special;
 1365+ var $editable;
 1366+
 1367+ function __construct( $special ) {
 1368+ parent::__construct( $special );
 1369+ }
 1370+
 1371+ /**
 1372+ * Pull banners from the database
 1373+ */
 1374+ function getQueryInfo() {
 1375+ $notice = $this->mRequest->getVal( 'notice' );
 1376+ $noticeId = CentralNotice::getNoticeId( $notice );
 1377+ if ( $noticeId ) {
 1378+ // Return all the banners not already assigned to the current campaign
 1379+ return array(
 1380+ 'tables' => array( 'cn_assignments', 'cn_templates' ),
 1381+ 'fields' => array( 'cn_templates.tmp_name', 'cn_templates.tmp_id' ),
 1382+ 'conds' => array( 'cn_assignments.tmp_id IS NULL' ),
 1383+ 'join_conds' => array(
 1384+ 'cn_assignments' => array(
 1385+ 'LEFT JOIN',
 1386+ "cn_assignments.tmp_id = cn_templates.tmp_id AND cn_assignments.not_id = $noticeId"
 1387+ )
 1388+ )
 1389+ );
 1390+ } else {
 1391+ // Return all the banners in the database
 1392+ return array(
 1393+ 'tables' => 'cn_templates',
 1394+ 'fields' => array( 'tmp_name', 'tmp_id' ),
 1395+ );
 1396+ }
 1397+ }
 1398+
 1399+ /**
 1400+ * Generate the content of each table row (1 row = 1 banner)
 1401+ */
 1402+ function formatRow( $row ) {
 1403+
 1404+ // Begin banner row
 1405+ $htmlOut = Xml::openElement( 'tr' );
 1406+
 1407+ if ( $this->editable ) {
 1408+ // Add box
 1409+ $htmlOut .= Xml::tags( 'td', array( 'valign' => 'top' ),
 1410+ Xml::check( 'addTemplates[]', '', array ( 'value' => $row->tmp_name ) )
 1411+ );
 1412+ // Weight select
 1413+ $htmlOut .= Xml::tags( 'td', array( 'valign' => 'top' ),
 1414+ Xml::listDropDown( "weight[$row->tmp_id]",
 1415+ CentralNotice::dropDownList( wfMsg( 'centralnotice-weight' ), range ( 0, 100, 5 ) ) ,
 1416+ '',
 1417+ '25',
 1418+ '',
 1419+ '' )
 1420+ );
 1421+ }
 1422+
 1423+ // Link and Preview
 1424+ $viewPage = SpecialPage::getTitleFor( 'NoticeTemplate', 'view' );
 1425+ $render = new SpecialNoticeText();
 1426+ $render->project = 'wikipedia';
 1427+ $render->language = $this->mRequest->getVal( 'wpUserLanguage' );
 1428+ $htmlOut .= Xml::tags( 'td', array( 'valign' => 'top' ),
 1429+ $this->getSkin()->makeLinkObj( $this->viewPage,
 1430+ htmlspecialchars( $row->tmp_name ),
 1431+ 'template=' . urlencode( $row->tmp_name ) ) .
 1432+ Xml::fieldset( wfMsg( 'centralnotice-preview' ),
 1433+ $render->getHtmlNotice( $row->tmp_name ),
 1434+ array( 'class' => 'cn-bannerpreview')
 1435+ )
 1436+ );
 1437+
 1438+ // End banner row
 1439+ $htmlOut .= Xml::closeElement( 'tr' );
 1440+
 1441+ return $htmlOut;
 1442+ }
 1443+
 1444+ /**
 1445+ * Specify table headers
 1446+ */
 1447+ function getStartBody() {
 1448+ $htmlOut = '';
 1449+ $htmlOut .= Xml::openElement( 'table', array( 'cellpadding' => 9 ) );
 1450+ $htmlOut .= Xml::openElement( 'tr' );
 1451+ if ( $this->editable ) {
 1452+ $htmlOut .= Xml::element( 'th', array( 'align' => 'left', 'width' => '5%' ),
 1453+ wfMsg ( "centralnotice-add" )
 1454+ );
 1455+ $htmlOut .= Xml::element( 'th', array( 'align' => 'left', 'width' => '5%' ),
 1456+ wfMsg ( "centralnotice-weight" )
 1457+ );
 1458+ }
 1459+ $htmlOut .= Xml::element( 'th', array( 'align' => 'left' ),
 1460+ wfMsg ( 'centralnotice-templates' )
 1461+ );
 1462+ $htmlOut .= Xml::closeElement( 'tr' );
 1463+ return $htmlOut;
 1464+ }
 1465+
 1466+ /**
 1467+ * Close table
 1468+ */
 1469+ function getEndBody() {
 1470+ global $wgUser;
 1471+ $htmlOut = '';
 1472+ $htmlOut .= Xml::closeElement( 'table' );
 1473+ return $htmlOut;
 1474+ }
 1475+}
Index: branches/wmf/1.16wmf4/extensions/CentralNotice/centralnotice.css
@@ -0,0 +1,62 @@
 2+/* Stylesheet for the CentralNotice extension.
 3+ *
 4+ * @file
 5+ * @ingroup Extensions
 6+ * @author Ryan Kaldari <rkaldari@wikimedia.org>
 7+ * @copyright © 2010 by Ryan Kaldari
 8+ * @licence GNU General Public Licence 2.0 or later
 9+ */
 10+
 11+#preferences fieldset.prefsection {
 12+ margin:0;
 13+ padding: 1em;
 14+ border-top: 1px solid;
 15+}
 16+#preferences fieldset.prefsection:first-child {
 17+ border-top: none;
 18+}
 19+#preferences fieldset.prefsection h2 {
 20+ border:none;
 21+}
 22+#preferences div.cn-pager {
 23+ margin:1em 0;
 24+}
 25+#preferences div.cn-error {
 26+ color:#AA0000;
 27+ margin:1em;
 28+}
 29+#preferences fieldset.prefsection div.cn-error {
 30+ margin:0;
 31+}
 32+#preferences table tr.cn-active-campaign {
 33+ background-color: #ddffdd;
 34+}
 35+#preferences div.cn-buttons {
 36+ padding:1em;
 37+}
 38+#preferences fieldset.prefsection div.cn-buttons {
 39+ padding:0;
 40+}
 41+#preferences div.cn-buttons input {
 42+ margin-right:0.25em;
 43+}
 44+#preferences input#clone {
 45+ margin-left:0.25em;
 46+}
 47+#preferences fieldset.prefsection fieldset.cn-bannerpreview {
 48+ border-style: solid;
 49+ border-width: 1px;
 50+}
 51+
 52+/* Vector-specific definitions */
 53+body.skin-vector #preferences fieldset.prefsection {
 54+ border-color:#CCCCCC;
 55+}
 56+body.skin-vector #preferences fieldset.prefsection fieldset.cn-bannerpreview {
 57+ border-color:#CCCCCC;
 58+}
 59+
 60+/* Monobook-specific definitions */
 61+body.skin-monobook #preferences fieldset.prefsection {
 62+ border-color:#AAAAAA;
 63+}
\ No newline at end of file
Property changes on: branches/wmf/1.16wmf4/extensions/CentralNotice/centralnotice.css
___________________________________________________________________
Added: svn:eol-style
164 + native
Index: branches/wmf/1.16wmf4/extensions/CentralNotice/down-arrow.png
Cannot display: file marked as a binary type.
svn:mime-type = image/png
Property changes on: branches/wmf/1.16wmf4/extensions/CentralNotice/down-arrow.png
___________________________________________________________________
Added: svn:mime-type
265 + image/png
Index: branches/wmf/1.16wmf4/extensions/CentralNotice/patches/patch-notice_languages.sql
@@ -0,0 +1,7 @@
 2+-- Update to allow for any number of languages per notice.
 3+
 4+CREATE TABLE IF NOT EXISTS /*$wgDBprefix*/cn_notice_languages (
 5+ `nl_notice_id` int unsigned NOT NULL,
 6+ `nl_language` varchar(32) NOT NULL
 7+) /*$wgDBTableOptions*/;
 8+CREATE UNIQUE INDEX /*i*/nl_notice_id_language ON /*$wgDBprefix*/cn_notice_languages (nl_notice_id, nl_language);
Property changes on: branches/wmf/1.16wmf4/extensions/CentralNotice/patches/patch-notice_languages.sql
___________________________________________________________________
Added: svn:eol-style
19 + native
Index: branches/wmf/1.16wmf4/extensions/CentralNotice/patches/patch-template_settings.sql
@@ -0,0 +1,7 @@
 2+-- Update to support controlling whether banners are displayed to anon and/or logged in users.
 3+-- Two flags are stored in the database for each banner, one indicating whether or not the banner
 4+-- is displayed to anonymous users, the other indicating whether or not the banner is displayed
 5+-- to logged in users.
 6+
 7+ALTER TABLE /*$wgDBprefix*/cn_templates ADD `tmp_display_anon` BOOLEAN NOT NULL DEFAULT 1;
 8+ALTER TABLE /*$wgDBprefix*/cn_templates ADD `tmp_display_account` BOOLEAN NOT NULL DEFAULT 1;
Property changes on: branches/wmf/1.16wmf4/extensions/CentralNotice/patches/patch-template_settings.sql
___________________________________________________________________
Added: svn:eol-style
19 + native
Index: branches/wmf/1.16wmf4/extensions/CentralNotice/patches/patch-notice_preferred.sql
@@ -0,0 +1,6 @@
 2+-- Support for one notice to supercede all others. This allows one notice to
 3+-- cancel out all the templates that a non preffered notice might have if they
 4+-- overlap. Use case is to be able to use one all language and projects notice
 5+-- and have it superceded by a specific one for en wikipedia.
 6+
 7+ALTER TABLE /*$wgDBprefix*/cn_notices ADD COLUMN not_preferred bool NOT NULL default '0';
Property changes on: branches/wmf/1.16wmf4/extensions/CentralNotice/patches/patch-notice_preferred.sql
___________________________________________________________________
Added: svn:eol-style
18 + native
Index: branches/wmf/1.16wmf4/extensions/CentralNotice/CentralNotice.sql
@@ -1,26 +1,32 @@
2 -CREATE TABLE `cn_notices` (
3 - `not_id` int NOT NULL auto_increment,
4 - `not_name` varchar(255) NOT NULL,
5 - `not_start` char(14) NOT NULL,
6 - `not_end` char(14) NOT NULL,
7 - `not_enabled` bool NOT NULL default '0',
8 - `not_preferred` bool NOT NULL default '0',
9 - `not_locked` bool NOT NULL default '0',
10 - `not_language` varchar(32) NOT NULL,
11 - `not_project` varchar(255) NOT NULL,
12 - PRIMARY KEY (`not_id`)
 2+CREATE TABLE IF NOT EXISTS /*$wgDBprefix*/cn_notices (
 3+ `not_id` int NOT NULL PRIMARY KEY auto_increment,
 4+ `not_name` varchar(255) NOT NULL,
 5+ `not_start` char(14) NOT NULL,
 6+ `not_end` char(14) NOT NULL,
 7+ `not_enabled` bool NOT NULL default '0',
 8+ `not_preferred` bool NOT NULL default '0',
 9+ `not_locked` bool NOT NULL default '0',
 10+ `not_language` varchar(32) NOT NULL,
 11+ `not_project` varchar(255) NOT NULL
1312 ) /*$wgDBTableOptions*/;
1413
15 -CREATE TABLE `cn_assignments` (
16 - `asn_id` int NOT NULL auto_increment,
17 - `not_id` int NOT NULL,
18 - `tmp_id` int NOT NULL,
19 - `tmp_weight` int NOT NULL,
20 - PRIMARY KEY (`asn_id`)
 14+CREATE TABLE IF NOT EXISTS /*$wgDBprefix*/cn_assignments (
 15+ `asn_id` int NOT NULL PRIMARY KEY auto_increment,
 16+ `not_id` int NOT NULL,
 17+ `tmp_id` int NOT NULL,
 18+ `tmp_weight` int NOT NULL
2119 ) /*$wgDBTableOptions*/;
2220
23 -CREATE TABLE `cn_templates` (
24 - `tmp_id` int NOT NULL auto_increment,
25 - `tmp_name` varchar(255) default NULL,
26 - PRIMARY KEY (`tmp_id`)
 21+-- FIXME: make tmp_name UNIQUE
 22+CREATE TABLE IF NOT EXISTS /*$wgDBprefix*/cn_templates (
 23+ `tmp_id` int NOT NULL PRIMARY KEY auto_increment,
 24+ `tmp_name` varchar(255) default NULL,
 25+ `tmp_display_anon` BOOLEAN NOT NULL DEFAULT 1,
 26+ `tmp_display_account` BOOLEAN NOT NULL DEFAULT 1
2727 ) /*$wgDBTableOptions*/;
 28+
 29+CREATE TABLE IF NOT EXISTS /*$wgDBprefix*/cn_notice_languages (
 30+ `nl_notice_id` int unsigned NOT NULL,
 31+ `nl_language` varchar(32) NOT NULL
 32+) /*$wgDBTableOptions*/;
 33+CREATE UNIQUE INDEX /*i*/nl_notice_id_language ON /*$wgDBprefix*/cn_notice_languages (nl_notice_id, nl_language);
Index: branches/wmf/1.16wmf4/extensions/CentralNotice/CentralNotice.i18n.php
@@ -7,87 +7,119 @@
88
99 $messages = array();
1010
 11+// Don't create a message named "centralnotice-template" or beginning with "centralnotice-template-" since those terms are reserved in CentralNotice
 12+
1113 $messages['en'] = array(
1214 'centralnotice' => 'Central notice admin',
13 - 'noticetemplate' => 'Central notice template',
 15+ 'noticetemplate' => 'Central notice banner',
1416 'centralnotice-desc' => 'Adds a central sitenotice',
1517 'centralnotice-summary' => 'This module allows you to edit your currently setup central notices.
1618 It can also be used to add or remove old notices.',
17 - 'centralnotice-query' => 'Modify current notices',
18 - 'centralnotice-notice-name' => 'Notice name',
 19+ 'centralnotice-query' => 'Modify current campaigns',
 20+ 'centralnotice-notice-name' => 'Campaign name',
1921 'centralnotice-end-date' => 'End date',
2022 'centralnotice-enabled' => 'Enabled',
2123 'centralnotice-modify' => 'Submit',
 24+ 'centralnotice-save-banner' => 'Save banner',
2225 'centralnotice-preview' => 'Preview',
23 - 'centralnotice-add-new' => 'Add a new central notice',
 26+ 'centralnotice-add-new' => 'Add a new campaign',
2427 'centralnotice-remove' => 'Remove',
2528 'centralnotice-translate-heading' => 'Translation for $1',
26 - 'centralnotice-manage' => 'Manage central notice',
 29+ 'centralnotice-manage' => 'Manage campaigns',
 30+ 'centralnotice-manage-templates' => 'Manage banners',
2731 'centralnotice-add' => 'Add',
28 - 'centralnotice-add-notice' => 'Add a notice',
29 - 'centralnotice-add-template' => 'Add a template',
30 - 'centralnotice-show-notices' => 'Show notices',
31 - 'centralnotice-list-templates' => 'List templates',
 32+ 'centralnotice-add-notice' => 'Add a campaign',
 33+ 'centralnotice-edit-notice' => 'Edit campaign',
 34+ 'centralnotice-add-template' => 'Add a banner',
 35+ 'centralnotice-show-notices' => 'Show campaigns',
 36+ 'centralnotice-list-templates' => 'List banners',
 37+ 'centralnotice-multiple_languages' => 'multiple ($1)',
 38+ 'centralnotice-language-listing' => '$1 - $2',
3239 'centralnotice-translations' => 'Translations',
3340 'centralnotice-translate-to' => 'Translate to',
3441 'centralnotice-translate' => 'Translate',
3542 'centralnotice-english' => 'English',
36 - 'centralnotice-template-name' => 'Template name',
37 - 'centralnotice-templates' => 'Templates',
 43+ 'centralnotice-banner-name' => 'Banner name:',
 44+ 'centralnotice-banner' => 'Banner',
 45+ 'centralnotice-banner-heading' => 'Banner: $1',
 46+ 'centralnotice-templates' => 'Banners',
3847 'centralnotice-weight' => 'Weight',
3948 'centralnotice-locked' => 'Locked',
40 - 'centralnotice-notices' => 'Notices',
41 - 'centralnotice-notice-exists' => 'Notice already exists.
42 -Not adding',
43 - 'centralnotice-template-exists' => 'Template already exists.
44 -Not adding',
45 - 'centralnotice-notice-doesnt-exist' => 'Notice does not exist.
46 -Nothing to remove',
47 - 'centralnotice-template-still-bound' => 'Template is still bound to a notice.
 49+ 'centralnotice-notice' => 'Campaign',
 50+ 'centralnotice-notice-heading' => 'Campaign: $1',
 51+ 'centralnotice-notices' => 'Campaigns',
 52+ 'centralnotice-notice-exists' => 'Campaign already exists.
 53+Not adding.',
 54+ 'centralnotice-no-language' => 'No language was selected for the campaign. Not adding.',
 55+ 'centralnotice-template-exists' => 'Banner already exists.
 56+Not adding.',
 57+ 'centralnotice-notice-doesnt-exist' => 'Campaign does not exist.',
 58+ 'centralnotice-remove-notice-doesnt-exist' => 'Campaign does not exist.
 59+Nothing to remove.',
 60+ 'centralnotice-template-still-bound' => 'Banner is still bound to a campaign.
4861 Not removing.',
49 - 'centralnotice-template-body' => 'Template body:',
 62+ 'centralnotice-template-body' => 'Banner body:',
5063 'centralnotice-day' => 'Day',
5164 'centralnotice-year' => 'Year',
5265 'centralnotice-month' => 'Month',
5366 'centralnotice-hours' => 'Hour',
5467 'centralnotice-min' => 'Minute',
5568 'centralnotice-project-lang' => 'Project language',
 69+ 'centralnotice-select' => 'Select: $1',
 70+ 'centralnotice-top-ten-languages' => 'Top 10 languages',
5671 'centralnotice-project-name' => 'Project name',
5772 'centralnotice-start-date' => 'Start date',
5873 'centralnotice-start-time' => 'Start time (UTC)',
59 - 'centralnotice-assigned-templates' => 'Assigned templates',
60 - 'centralnotice-no-templates' => 'No templates found.
 74+ 'centralnotice-assigned-templates' => 'Assigned banners',
 75+ 'centralnotice-no-templates' => 'No banners found.
6176 Add some!',
62 - 'centralnotice-no-templates-assigned' => 'No templates assigned to notice.
 77+ 'centralnotice-no-templates-assigned' => 'No banners assigned to campaign.
6378 Add some!',
64 - 'centralnotice-available-templates' => 'Available templates',
65 - 'centralnotice-template-already-exists' => 'Template is already tied to campaign.
66 -Not adding',
67 - 'centralnotice-preview-template' => 'Preview template',
68 - 'centralnotice-start-hour' => 'Start time',
 79+ 'centralnotice-available-templates' => 'Available banners',
 80+ 'centralnotice-template-already-exists' => 'Banner is already tied to campaign.
 81+Not adding.',
 82+ 'centralnotice-preview-template' => 'Preview banner',
 83+ 'centralnotice-start-hour' => 'Start time (GMT)',
6984 'centralnotice-change-lang' => 'Change translation language',
7085 'centralnotice-weights' => 'Weights',
71 - 'centralnotice-notice-is-locked' => 'Notice is locked.
72 -Not removing',
73 - 'centralnotice-overlap' => 'Notice overlaps within the time of another notice.
74 -Not adding',
 86+ 'centralnotice-notice-is-locked' => 'Campaign is locked.
 87+Not removing.',
 88+ 'centralnotice-overlap' => 'Campaign overlaps within the time of another campaign.
 89+Not adding.',
7590 'centralnotice-invalid-date-range' => 'Invalid date range.
76 -Not updating',
 91+Not updating.',
7792 'centralnotice-null-string' => 'Cannot add a null string.
78 -Not adding',
 93+Not adding.',
7994 'centralnotice-confirm-delete' => 'Are you sure you want to delete this item?
8095 This action will be unrecoverable.',
81 - 'centralnotice-no-notices-exist' => 'No notices exist.
 96+ 'centralnotice-no-notices-exist' => 'No campaigns exist.
8297 Add one below.',
83 - 'centralnotice-no-templates-translate' => 'There are not any templates to edit translations for',
 98+ 'centralnotice-no-templates-translate' => 'There are not any banners to edit translations for.',
8499 'centralnotice-number-uses' => 'Uses',
85 - 'centralnotice-edit-template' => 'Edit template',
 100+ 'centralnotice-settings' => 'Settings',
 101+ 'centralnotice-edit-template' => 'Edit banner',
 102+ 'centralnotice-edit-template-summary' => 'To create a localizable message, enclose a hyphenated string in three curly brackets, e.g. {{{jimbo-quote}}}.',
86103 'centralnotice-message' => 'Message',
87104 'centralnotice-message-not-set' => 'Message not set',
88105 'centralnotice-clone' => 'Clone',
89 - 'centralnotice-clone-notice' => 'Create a copy of the template',
90 - 'centralnotice-preview-all-template-translations' => 'Preview all available translations of template',
91 -
 106+ 'centralnotice-clone-notice' => 'Create a copy of the banner',
 107+ 'centralnotice-clone-name' => 'Name:',
 108+ 'centralnotice-preview-all-template-translations' => 'Preview all available translations of banner',
 109+ 'centralnotice-insert' => 'Insert: $1',
 110+ 'centralnotice-hide-button' => '{{int:centralnotice-shared-hide}} button',
 111+ 'centralnotice-collapse-button' => '{{int:centralnotice-shared-collapse}} button',
 112+ 'centralnotice-expand-button' => '{{int:centralnotice-shared-expand}} button',
 113+ 'centralnotice-translate-button' => 'Help translate button',
 114+ 'centralnotice-donate-button' => 'Donate button',
 115+ 'centralnotice-expanded-banner' => 'Expanded banner',
 116+ 'centralnotice-collapsed-banner' => 'Collapsed banner',
 117+ 'centralnotice-banner-display' => 'Display to:',
 118+ 'centralnotice-banner-anonymous' => 'Anonymous users',
 119+ 'centralnotice-banner-logged-in' => 'Logged in users',
 120+ 'centralnotice-banner-type' => 'Banner type:',
 121+ 'centralnotice-banner-hidable' => 'Static/Hidable',
 122+ 'centralnotice-banner-collapsible' => 'Collapsible',
 123+
92124 'right-centralnotice-admin' => 'Manage central notices',
93125 'right-centralnotice-translate' => 'Translate central notices',
94126
@@ -99,33 +131,41 @@
100132 /** Message documentation (Message documentation)
101133 * @author Bennylin
102134 * @author Darth Kule
 135+ * @author EugeneZelenko
103136 * @author Fryed-peach
 137+ * @author Hamilton Abreu
104138 * @author Jon Harald Søby
105139 * @author Lloffiwr
106140 * @author Nike
107141 * @author Purodha
 142+ * @author The Evil IP address
108143 */
109144 $messages['qqq'] = array(
110145 'centralnotice' => 'Name of Special:CentralNotice in Special:SpecialPages and title of the page',
111146 'noticetemplate' => 'Title of Special:NoticeTemplate',
112 - 'centralnotice-desc' => 'Short description of the Centralnotice extension, shown in [[Special:Version]]. Do not translate or change links.',
 147+ 'centralnotice-desc' => '{{desc}}',
113148 'centralnotice-summary' => 'Used in Special:CentralNotice',
114149 'centralnotice-end-date' => '{{Identical|End date}}',
115150 'centralnotice-enabled' => '{{Identical|Enabled}}',
116151 'centralnotice-modify' => '{{Identical|Submit}}',
 152+ 'centralnotice-save-banner' => 'Label for the submit button which saves a CentralNotice banner.',
117153 'centralnotice-preview' => '{{Identical|Preview}}',
118154 'centralnotice-remove' => '{{Identical|Remove}}',
119155 'centralnotice-translate-heading' => 'Fieldset label. $1 is a name of a template.',
120156 'centralnotice-add' => '{{Identical|Add}}',
 157+ 'centralnotice-multiple_languages' => '$1 is a number. More precisely, the number of languages a notice is available in. It is always greater than 3.',
 158+ 'centralnotice-language-listing' => 'A language listing for the language multi-select box. First parameter is the language code. Second parameter is the name of the language.',
121159 'centralnotice-translate' => '{{Identical|Translate}}',
122 - 'centralnotice-notice-exists' => 'Errore message displayed in Special:CentralNotice when trying to add a notice with the same name of another notice',
123 - 'centralnotice-template-exists' => 'Errore message displayed in Special:NoticeTemplate when trying to add a template with the same name of another template',
 160+ 'centralnotice-notice-exists' => 'Error message displayed in Special:CentralNotice when trying to add a notice with the same name of another notice',
 161+ 'centralnotice-template-exists' => 'Error message displayed in Special:NoticeTemplate when trying to add a template with the same name of another template',
 162+ 'centralnotice-day' => '{{Identical|Day}}',
 163+ 'centralnotice-select' => '{{Identical|Select}}',
124164 'centralnotice-start-date' => 'Used in Special:CentralNotice.
125165
126166 {{Identical|Start date}}',
127167 'centralnotice-start-time' => 'Used in Special:CentralNotice',
128168 'centralnotice-available-templates' => 'Used in Special:NoticeTemplate',
129 - 'centralnotice-notice-is-locked' => 'Errore message displayed in Special:CentralNotice when trying to delete a locked notice',
 169+ 'centralnotice-notice-is-locked' => 'Error message displayed in Special:CentralNotice when trying to delete a locked notice',
130170 'centralnotice-invalid-date-range' => '{{Identical|Date}}',
131171 'centralnotice-no-notices-exist' => 'Used in Special:CentralNotice when there are no notices',
132172 'centralnotice-number-uses' => 'Column header in table with sitenotice campaign information.
@@ -134,6 +174,8 @@
135175
136176 Maximum length of the message is 5% of the total width of the table.',
137177 'centralnotice-message' => '{{Identical|Message}}',
 178+ 'centralnotice-clone-name' => '{{Identical|Name}}',
 179+ 'centralnotice-insert' => '{{Identical|Insert}}',
138180 'right-centralnotice-admin' => '{{doc-right}}',
139181 'right-centralnotice-translate' => '{{doc-right}}',
140182 'action-centralnotice-admin' => '{{doc-action}}',
@@ -166,7 +208,7 @@
167209 'centralnotice-translate-to' => 'Vertaal na',
168210 'centralnotice-translate' => 'Vertaal',
169211 'centralnotice-english' => 'Engels',
170 - 'centralnotice-template-name' => 'Sjabloonnaam',
 212+ 'centralnotice-banner-name' => 'Sjabloonnaam',
171213 'centralnotice-templates' => 'Sjablone',
172214 'centralnotice-weight' => 'Gewig',
173215 'centralnotice-locked' => 'Gesluit',
@@ -255,7 +297,7 @@
256298 'centralnotice-translate-to' => 'Translate në',
257299 'centralnotice-translate' => 'Përkthej',
258300 'centralnotice-english' => 'Anglisht',
259 - 'centralnotice-template-name' => 'Emri Template',
 301+ 'centralnotice-banner-name' => 'Emri Template',
260302 'centralnotice-templates' => 'Templates',
261303 'centralnotice-weight' => 'Peshë',
262304 'centralnotice-locked' => 'I bllokuar',
@@ -278,13 +320,15 @@
279321 * @author Juanpabl
280322 */
281323 $messages['an'] = array(
282 - 'centralnotice-desc' => 'Adibe una "sitenotice" zentral',
 324+ 'centralnotice-desc' => 'Adibe una "sitenotice" central',
283325 'centralnotice-end-date' => 'Calendata final',
284326 'centralnotice-modify' => 'Ninviar',
285 - 'centralnotice-start-date' => 'Calendata de prenzipio',
 327+ 'centralnotice-preview' => 'Previsualizar',
 328+ 'centralnotice-start-date' => 'Calendata de prencipio',
286329 'centralnotice-invalid-date-range' => "Rango de datos no conforme.
287330 No s'está adautando.",
288331 'centralnotice-message' => 'Mensache',
 332+ 'centralnotice-insert' => 'Insertar: $1',
289333 );
290334
291335 /** Arabic (العربية)
@@ -317,7 +361,7 @@
318362 'centralnotice-translate-to' => 'ترجم إلى',
319363 'centralnotice-translate' => 'ترجم',
320364 'centralnotice-english' => 'الإنجليزية',
321 - 'centralnotice-template-name' => 'اسم القالب',
 365+ 'centralnotice-banner-name' => 'اسم القالب',
322366 'centralnotice-templates' => 'القوالب',
323367 'centralnotice-weight' => 'الوزن',
324368 'centralnotice-locked' => 'مغلق',
@@ -425,7 +469,7 @@
426470 'centralnotice-translate-to' => 'ترجم لـ',
427471 'centralnotice-translate' => 'ترجم',
428472 'centralnotice-english' => 'انجليزى',
429 - 'centralnotice-template-name' => 'اسم القالب',
 473+ 'centralnotice-banner-name' => 'اسم القالب',
430474 'centralnotice-templates' => 'قوالب',
431475 'centralnotice-weight' => 'الوزن',
432476 'centralnotice-locked' => 'مقفول',
@@ -528,6 +572,8 @@
529573 * @author EugeneZelenko
530574 * @author Jim-by
531575 * @author Red Winged Duck
 576+ * @author Wizardist
 577+ * @author Александр Сигачёв
532578 */
533579 $messages['be-tarask'] = array(
534580 'centralnotice' => 'Кіраваньне цэнтралізаванымі паведамленьнямі',
@@ -535,80 +581,108 @@
536582 'centralnotice-desc' => 'Дадае цэнтралізаванае паведамленьне сайту',
537583 'centralnotice-summary' => 'Гэты модуль дазваляе Вам рэдагаваць Вашыя актуальныя цэнтралізаваныя паведамленьні.
538584 Ён таксама можа выкарыстоўвацца для даданьня ці выдаленьня старых паведамленьняў.',
539 - 'centralnotice-query' => 'Зьмяніць цяперашняе паведамленьне',
540 - 'centralnotice-notice-name' => 'Назва паведамленьня',
 585+ 'centralnotice-query' => 'Зьмяніць цяперашнюю кампанію',
 586+ 'centralnotice-notice-name' => 'Назва кампаніі',
541587 'centralnotice-end-date' => 'Дата заканчэньня',
542588 'centralnotice-enabled' => 'Уключана',
543589 'centralnotice-modify' => 'Захаваць',
 590+ 'centralnotice-save-banner' => 'Захаваць банэр',
544591 'centralnotice-preview' => 'Папярэдні прагляд',
545 - 'centralnotice-add-new' => 'Дадаць новае цэнтралізаванае паведамленьне',
 592+ 'centralnotice-add-new' => 'Дадаць новую кампанію',
546593 'centralnotice-remove' => 'Выдаліць',
547594 'centralnotice-translate-heading' => 'Пераклад для $1',
548 - 'centralnotice-manage' => 'Кіраваньне цэнтралізаванымі паведамленьнямі',
 595+ 'centralnotice-manage' => 'Кіраваньне кампаніямі',
 596+ 'centralnotice-manage-templates' => 'Кіраваньне паведамленьнямі',
549597 'centralnotice-add' => 'Дадаць',
550 - 'centralnotice-add-notice' => 'Дадаць паведамленьне',
551 - 'centralnotice-add-template' => 'Дадаць шаблён',
552 - 'centralnotice-show-notices' => 'Паказаць паведамленьні',
553 - 'centralnotice-list-templates' => 'Сьпіс шаблёнаў',
 598+ 'centralnotice-add-notice' => 'Дадаць кампанію',
 599+ 'centralnotice-edit-notice' => 'Рэдагаваць кампанію',
 600+ 'centralnotice-add-template' => 'Дадаць паведамленьне',
 601+ 'centralnotice-show-notices' => 'Паказаць кампаніі',
 602+ 'centralnotice-list-templates' => 'Сьпіс паведамленьняў',
 603+ 'centralnotice-multiple_languages' => 'некалькі ($1)',
554604 'centralnotice-translations' => 'Пераклады',
555605 'centralnotice-translate-to' => 'Пераклад на',
556606 'centralnotice-translate' => 'Пераклад',
557607 'centralnotice-english' => 'Ангельская',
558 - 'centralnotice-template-name' => 'Назва шаблёну',
559 - 'centralnotice-templates' => 'Шаблёны',
 608+ 'centralnotice-banner-name' => 'Назва паведамленьня',
 609+ 'centralnotice-banner' => 'Паведамленьне',
 610+ 'centralnotice-banner-heading' => 'Банэр: $1',
 611+ 'centralnotice-templates' => 'Паведамленьні',
560612 'centralnotice-weight' => 'Вага',
561613 'centralnotice-locked' => 'Заблякаваны',
562 - 'centralnotice-notices' => 'Паведамленьні',
563 - 'centralnotice-notice-exists' => 'Паведамленьне ўжо існуе.
564 -Новае не было дададзенае',
565 - 'centralnotice-template-exists' => 'Шаблён ужо існуе.
566 -Новы шаблён ня быў дададзены',
567 - 'centralnotice-notice-doesnt-exist' => 'Паведамленьне не існуе.
 614+ 'centralnotice-notice' => 'Кампанія',
 615+ 'centralnotice-notice-heading' => 'Кампанія: $1',
 616+ 'centralnotice-notices' => 'Кампаніі',
 617+ 'centralnotice-notice-exists' => 'Кампанія ўжо існуе.
 618+Новая не дададзеная.',
 619+ 'centralnotice-no-language' => 'Для кампаніі ня выбраная мова. Не дададзеная.',
 620+ 'centralnotice-template-exists' => 'Паведамленьне ужо існуе.
 621+Новае паведамленьне не дададзенае.',
 622+ 'centralnotice-notice-doesnt-exist' => 'Кампанія не існуе.',
 623+ 'centralnotice-remove-notice-doesnt-exist' => 'Кампанія не існуе.
568624 Няма чаго выдаляць',
569 - 'centralnotice-template-still-bound' => 'Шаблён па-ранейшаму зьвязаны з паведамленьнем.
 625+ 'centralnotice-template-still-bound' => 'Паведамленьне па-ранейшаму зьвязанае з кампаніяй.
570626 Не выдаляецца.',
571 - 'centralnotice-template-body' => 'Зьмест шаблёну:',
 627+ 'centralnotice-template-body' => 'Зьмест паведамленьня:',
572628 'centralnotice-day' => 'Дзень',
573629 'centralnotice-year' => 'Год',
574630 'centralnotice-month' => 'Месяц',
575631 'centralnotice-hours' => 'Гадзіна',
576632 'centralnotice-min' => 'Хвіліна',
577633 'centralnotice-project-lang' => 'Мова праекту',
 634+ 'centralnotice-select' => 'Выбраць: $1',
 635+ 'centralnotice-top-ten-languages' => '10 моваў',
578636 'centralnotice-project-name' => 'Назва праекту',
579637 'centralnotice-start-date' => 'Дата пачатку',
580638 'centralnotice-start-time' => 'Час пачатку (UTC)',
581 - 'centralnotice-assigned-templates' => 'Прызначаныя шаблёны',
582 - 'centralnotice-no-templates' => 'Шаблёны ня знойдзеныя.
 639+ 'centralnotice-assigned-templates' => 'Прызначаныя паведамленьні',
 640+ 'centralnotice-no-templates' => 'Паведамленьні ня знойдзеныя.
583641 Дадайце якія-небудзь!',
584 - 'centralnotice-no-templates-assigned' => 'Няма зьвязаных з паведамленьнем шаблёнаў.
585 -Дадайце які-небудзь!',
586 - 'centralnotice-available-templates' => 'Даступныя шаблёны',
587 - 'centralnotice-template-already-exists' => 'Шаблён ужо выкарыстоўваецца ў кампаніі.
588 -Ня быў дададзены',
589 - 'centralnotice-preview-template' => 'Папярэдні прагляд шаблёну',
590 - 'centralnotice-start-hour' => 'Час пачатку',
 642+ 'centralnotice-no-templates-assigned' => 'Няма зьвязаных з кампаніяй паведамленьняў.
 643+Дадайце якое-небудзь!',
 644+ 'centralnotice-available-templates' => 'Даступныя паведамленьні',
 645+ 'centralnotice-template-already-exists' => 'Паведамленьне ужо выкарыстоўваецца ў кампаніі.
 646+Не дададзенае.',
 647+ 'centralnotice-preview-template' => 'Папярэдні прагляд паведамленьня',
 648+ 'centralnotice-start-hour' => 'Час пачатку (GMT)',
591649 'centralnotice-change-lang' => 'Зьмяніць мову перакладу',
592650 'centralnotice-weights' => 'Вагі',
593 - 'centralnotice-notice-is-locked' => 'Паведамленьне заблякаванае.
594 -Не выдаляецца',
595 - 'centralnotice-overlap' => 'Час паведамленьня перакрываецца часам іншага паведамленьня.
596 -Новае паведамленьне не было дададзенае',
 651+ 'centralnotice-notice-is-locked' => 'Кампанія заблякаванае.
 652+Не выдаляецца.',
 653+ 'centralnotice-overlap' => 'Час кампаніі перакрываецца часам іншай кампаніі.
 654+Не дададзеная.',
597655 'centralnotice-invalid-date-range' => 'Няслушны дыяпазон датаў.
598656 Не абнаўляецца',
599657 'centralnotice-null-string' => 'Немагчыма дадаць пусты радок.
600658 Не дадаецца',
601659 'centralnotice-confirm-delete' => 'Вы ўпэўнены, што жадаеце выдаліць гэты элемэнт?
602660 Гэта дзеяньне немагчыма будзе адмяніць.',
603 - 'centralnotice-no-notices-exist' => 'Паведамленьняў няма.
604 -Дадайце адно ніжэй',
605 - 'centralnotice-no-templates-translate' => 'Няма шаблёнаў для рэдагаваньня перакладаў для',
 661+ 'centralnotice-no-notices-exist' => 'Кампаніяў няма.
 662+Дадайце адну ніжэй.',
 663+ 'centralnotice-no-templates-translate' => 'Няма паведамленьняў для рэдагаваньня перакладаў',
606664 'centralnotice-number-uses' => 'Выкарыстоўвае',
607 - 'centralnotice-edit-template' => 'Рэдагаваць шаблён',
 665+ 'centralnotice-edit-template' => 'Рэдагаваць паведамленьне',
 666+ 'centralnotice-edit-template-summary' => 'Каб стварыць лякалізуемае паведамленьне, атачыце дэфісны радок у тры фігурныя дужкі, напрыклад, {{{цытата-джымба}}}.',
608667 'centralnotice-message' => 'Паведамленьне',
609668 'centralnotice-message-not-set' => 'Паведамленьне не ўсталяванае',
610669 'centralnotice-clone' => 'Копія',
611 - 'centralnotice-clone-notice' => 'Стварыць копію шаблёну',
612 - 'centralnotice-preview-all-template-translations' => 'Праглядзець усе даступныя пераклады шаблёну',
 670+ 'centralnotice-clone-notice' => 'Стварыць копію паведамленьня',
 671+ 'centralnotice-clone-name' => 'Назва:',
 672+ 'centralnotice-preview-all-template-translations' => 'Праглядзець усе даступныя пераклады паведамленьня',
 673+ 'centralnotice-insert' => 'Уставіць: $1',
 674+ 'centralnotice-hide-button' => '{{int:centralnotice-shared-hide}} кнопку',
 675+ 'centralnotice-collapse-button' => '{{int:centralnotice-shared-collapse}} кнопку',
 676+ 'centralnotice-expand-button' => '{{int:centralnotice-shared-expand}} кнопку',
 677+ 'centralnotice-translate-button' => 'Кнопка дапамогі ў перакладзе',
 678+ 'centralnotice-donate-button' => 'Кнопка ахвяраваньняў',
 679+ 'centralnotice-expanded-banner' => 'Разгорнуты банэр',
 680+ 'centralnotice-collapsed-banner' => 'Згорнуты банэр',
 681+ 'centralnotice-banner-display' => 'Паказваць у:',
 682+ 'centralnotice-banner-anonymous' => 'Ананімныя ўдзельнікі',
 683+ 'centralnotice-banner-logged-in' => 'Удзельнікі:',
 684+ 'centralnotice-banner-type' => 'Тып банэра:',
 685+ 'centralnotice-banner-hidable' => 'Фіксаваны / Хаваемы',
 686+ 'centralnotice-banner-collapsible' => 'Згортваемы',
613687 'right-centralnotice-admin' => 'Кіраваньне цэнтральнымі паведамленьнямі',
614688 'right-centralnotice-translate' => 'пераклад цэнтралізаваных паведамленьняў',
615689 'action-centralnotice-admin' => 'кіраваньне цэнтралізаванымі паведамленьнямі',
@@ -647,7 +721,7 @@
648722 'centralnotice-translate-to' => 'Превеждане на',
649723 'centralnotice-translate' => 'Превеждане',
650724 'centralnotice-english' => 'Английски',
651 - 'centralnotice-template-name' => 'Име на шаблона',
 725+ 'centralnotice-banner-name' => 'Име на шаблона',
652726 'centralnotice-templates' => 'Шаблони',
653727 'centralnotice-weight' => 'Тежест',
654728 'centralnotice-locked' => 'Заключено',
@@ -705,7 +779,7 @@
706780 'centralnotice-translate-to' => 'যে ভাষায় অনুবাদ করা হচ্ছে তা হল',
707781 'centralnotice-translate' => 'অনুবাদ',
708782 'centralnotice-english' => 'ইংরেজি',
709 - 'centralnotice-template-name' => 'টেম্পলেটের নাম',
 783+ 'centralnotice-banner-name' => 'টেম্পলেটের নাম',
710784 'centralnotice-templates' => 'টেম্পলেট',
711785 'centralnotice-weight' => 'ওজন',
712786 'centralnotice-locked' => 'অবরুদ্ধ',
@@ -766,6 +840,7 @@
767841 /** Breton (Brezhoneg)
768842 * @author Fohanno
769843 * @author Fulup
 844+ * @author Gwendal
770845 * @author Y-M D
771846 */
772847 $messages['br'] = array(
@@ -793,7 +868,8 @@
794869 'centralnotice-translate-to' => 'Treiñ e',
795870 'centralnotice-translate' => 'Treiñ',
796871 'centralnotice-english' => 'Saozneg',
797 - 'centralnotice-template-name' => 'Anv ar patrom',
 872+ 'centralnotice-banner-name' => 'Anv ar patrom',
 873+ 'centralnotice-banner' => 'Giton',
798874 'centralnotice-templates' => 'Patromoù',
799875 'centralnotice-weight' => 'Pouez',
800876 'centralnotice-locked' => 'Prennet',
@@ -804,6 +880,8 @@
805881 N'eo ket bet ouzhpennet.",
806882 'centralnotice-notice-doesnt-exist' => "N'eus ket seus an ali-mañ.
807883 N'eus netra da zilemel",
 884+ 'centralnotice-remove-notice-doesnt-exist' => "N'eus ket seus an ali-mañ.
 885+N'eus netra da zilemel",
808886 'centralnotice-template-still-bound' => "Liammet eo c'hoazh ar patrom gant un ali.
809887 N'eo ket bet dilammet.",
810888 'centralnotice-template-body' => 'Korf ar patrom :',
@@ -813,6 +891,8 @@
814892 'centralnotice-hours' => 'Eur',
815893 'centralnotice-min' => 'Munutenn',
816894 'centralnotice-project-lang' => 'Yezh ar raktres',
 895+ 'centralnotice-select' => 'Diuzit : $1',
 896+ 'centralnotice-top-ten-languages' => 'An 10 yezh implijetañ',
817897 'centralnotice-project-name' => 'Anv ar raktres',
818898 'centralnotice-start-date' => 'Deiziad kregiñ',
819899 'centralnotice-start-time' => 'Eur kregiñ (UTC)',
@@ -825,7 +905,7 @@
826906 'centralnotice-template-already-exists' => "Liammet eo c'hoazh ar patrom gant ur c'houlzad.
827907 N'eo ket bet ouzhpennet.",
828908 'centralnotice-preview-template' => 'Rakwelet ar patrom',
829 - 'centralnotice-start-hour' => 'Eurvezh kregiñ',
 909+ 'centralnotice-start-hour' => 'Eurvezh kregiñ (GMT)',
830910 'centralnotice-change-lang' => 'Cheñch yezh an droidigezh',
831911 'centralnotice-weights' => 'Pouezioù',
832912 'centralnotice-notice-is-locked' => "Prenet eo an ali.
@@ -843,11 +923,23 @@
844924 'centralnotice-no-templates-translate' => "N'eus patrom ebet da dreiñ",
845925 'centralnotice-number-uses' => 'Implijoù',
846926 'centralnotice-edit-template' => 'Kemmañ ar patrom',
 927+ 'centralnotice-edit-template-summary' => "Da grouiñ ur gemennadenn da vezañ lec'helaet, enklozañ un neudennad gant ur varrennig-stagañ etre teir briataenn, da skouer {{{jimbo-quote}}}.",
847928 'centralnotice-message' => 'Kemennadenn',
848929 'centralnotice-message-not-set' => "N'eo ket bet savet ar gemennadenn",
849930 'centralnotice-clone' => 'Eilañ',
850931 'centralnotice-clone-notice' => 'Krouiñ un eiladenn eus ar patrom',
 932+ 'centralnotice-clone-name' => 'Anv :',
851933 'centralnotice-preview-all-template-translations' => 'Rakwellit an holl droidigezhioù a zo evit ar patrom-mañ',
 934+ 'centralnotice-insert' => "Ensoc'hañ : $1",
 935+ 'centralnotice-hide-button' => 'Bouton {{int:centralnotice-shared-hide}}',
 936+ 'centralnotice-collapse-button' => 'Bouton {{int:centralnotice-shared-collapse}}',
 937+ 'centralnotice-expand-button' => 'Bouton {{int:centralnotice-shared-expand}}',
 938+ 'centralnotice-translate-button' => 'Bouton sikour evit an droidigezh',
 939+ 'centralnotice-donate-button' => 'Bouton donezonadur',
 940+ 'centralnotice-banner-anonymous' => 'Implijerien dizanv',
 941+ 'centralnotice-banner-logged-in' => 'Implijerien kevreet',
 942+ 'centralnotice-banner-hidable' => 'Statek/Masklus',
 943+ 'centralnotice-banner-collapsible' => 'Digreskus',
852944 'right-centralnotice-admin' => 'Merañ an alioù kreiz',
853945 'right-centralnotice-translate' => 'Treiñ an alioù kreiz',
854946 'action-centralnotice-admin' => 'merañ an alioù kreiz',
@@ -883,17 +975,17 @@
884976 'centralnotice-translate-to' => 'Prevedi na',
885977 'centralnotice-translate' => 'Prijevod',
886978 'centralnotice-english' => 'engleski jezik',
887 - 'centralnotice-template-name' => 'Naslov šablona',
 979+ 'centralnotice-banner-name' => 'Naslov šablona',
888980 'centralnotice-templates' => 'Šabloni',
889981 'centralnotice-weight' => 'Težina',
890982 'centralnotice-locked' => 'Zaključano',
 983+ 'centralnotice-notice-heading' => 'Kampanja: $1',
891984 'centralnotice-notices' => 'Obavještenja',
892985 'centralnotice-notice-exists' => 'Obavještenje već postoji.
893986 Ne može se dodati',
894987 'centralnotice-template-exists' => 'Šablon već postoji.
895988 Ne dodaje se',
896 - 'centralnotice-notice-doesnt-exist' => 'Obavještenje ne postoji.
897 -Ništa se ne uklanja',
 989+ 'centralnotice-notice-doesnt-exist' => 'Kampanja ne postoji.',
898990 'centralnotice-template-still-bound' => 'Šablon je još uvijek povezan sa obavještenje.
899991 Ne uklanja se',
900992 'centralnotice-template-body' => 'Tijelo šablona:',
@@ -915,7 +1007,7 @@
9161008 'centralnotice-template-already-exists' => 'Šablon je već povezan sa kampanjom.
9171009 Ne dodaje se',
9181010 'centralnotice-preview-template' => 'Izgled šablona',
919 - 'centralnotice-start-hour' => 'Vrijeme početka',
 1011+ 'centralnotice-start-hour' => 'Početno vrijeme (UTC)',
9201012 'centralnotice-change-lang' => 'Promjena jezika prijevoda',
9211013 'centralnotice-weights' => 'Težina',
9221014 'centralnotice-notice-is-locked' => 'Obavještenje je zaključano.
@@ -937,7 +1029,9 @@
9381030 'centralnotice-message-not-set' => 'Poruka nije postavljena',
9391031 'centralnotice-clone' => 'Klon',
9401032 'centralnotice-clone-notice' => 'Pravi kopiju šablona',
 1033+ 'centralnotice-clone-name' => 'Ime:',
9411034 'centralnotice-preview-all-template-translations' => 'Pregled svih dostupnih prijevoda za šablon',
 1035+ 'centralnotice-insert' => 'Ubaci: $1',
9421036 'right-centralnotice-admin' => 'Uređivanje središnjeg obavještenja',
9431037 'right-centralnotice-translate' => 'Prevođenje središnjeg obavještenja',
9441038 'action-centralnotice-admin' => 'uređujete središnje obavještenje',
@@ -979,7 +1073,7 @@
9801074 'centralnotice-translate-to' => 'Tradueix a',
9811075 'centralnotice-translate' => 'Tradueix',
9821076 'centralnotice-english' => 'Anglès',
983 - 'centralnotice-template-name' => 'Nom de la plantilla',
 1077+ 'centralnotice-banner-name' => 'Nom de la plantilla',
9841078 'centralnotice-templates' => 'Plantilles',
9851079 'centralnotice-weight' => 'Pes',
9861080 'centralnotice-locked' => 'Bloquejat',
@@ -1040,6 +1134,11 @@
10411135 'centralnotice-preferred' => 'Preferit',
10421136 );
10431137
 1138+/** Sorani (کوردی) */
 1139+$messages['ckb'] = array(
 1140+ 'centralnotice-modify' => 'ناردن',
 1141+);
 1142+
10441143 /** Czech (Česky)
10451144 * @author Danny B.
10461145 * @author Li-sung
@@ -1056,28 +1155,39 @@
10571156 'centralnotice-end-date' => 'Datum konce',
10581157 'centralnotice-enabled' => 'Zapnuto',
10591158 'centralnotice-modify' => 'Odeslat',
 1159+ 'centralnotice-save-banner' => 'Uložit banner',
10601160 'centralnotice-preview' => 'Náhled',
10611161 'centralnotice-add-new' => 'Přidat nové centrální oznámení',
10621162 'centralnotice-remove' => 'Odstranit',
10631163 'centralnotice-translate-heading' => 'Překlad šablony „$1“',
10641164 'centralnotice-manage' => 'Spravovat centralizovaná oznámení',
 1165+ 'centralnotice-manage-templates' => 'Správa bannerů',
10651166 'centralnotice-add' => 'Přidat',
10661167 'centralnotice-add-notice' => 'Přidat oznámení',
 1168+ 'centralnotice-edit-notice' => 'Upravit kampaň',
10671169 'centralnotice-add-template' => 'Přidat šablonu',
10681170 'centralnotice-show-notices' => 'Zobrazit oznámení',
10691171 'centralnotice-list-templates' => 'Seznam šablon',
 1172+ 'centralnotice-multiple_languages' => 'více ($1)',
10701173 'centralnotice-translations' => 'Překlady',
10711174 'centralnotice-translate-to' => 'Přeložit do jazyka',
10721175 'centralnotice-translate' => 'Přeložit',
10731176 'centralnotice-english' => 'Anglicky',
1074 - 'centralnotice-template-name' => 'Název šablony',
 1177+ 'centralnotice-banner-name' => 'Název šablony',
 1178+ 'centralnotice-banner' => 'Banner',
 1179+ 'centralnotice-banner-heading' => 'Banner: $1',
10751180 'centralnotice-templates' => 'Šablony',
10761181 'centralnotice-weight' => 'Váha',
10771182 'centralnotice-locked' => 'Uzamčeno',
 1183+ 'centralnotice-notice' => 'Kampaň',
 1184+ 'centralnotice-notice-heading' => 'Kampaň: $1',
10781185 'centralnotice-notices' => 'Oznámení',
10791186 'centralnotice-notice-exists' => 'Oznámení už existuje. Nepřidáno.',
 1187+ 'centralnotice-no-language' => 'Pro kampaň nebyl vybrán žádný jazyk. Oznámení nebylo přidáno.',
10801188 'centralnotice-template-exists' => 'Šablona už existuje. Nepřidána.',
1081 - 'centralnotice-notice-doesnt-exist' => 'Oznámení neexistuje. Není co odstranit.',
 1189+ 'centralnotice-notice-doesnt-exist' => 'Kampaň neexistuje.',
 1190+ 'centralnotice-remove-notice-doesnt-exist' => 'Kampaň neexistuje.
 1191+Není co odstranit.',
10821192 'centralnotice-template-still-bound' => 'Šablona je stále navázána na oznámení. Nebude odstraněna.',
10831193 'centralnotice-template-body' => 'Tělo šablony:',
10841194 'centralnotice-day' => 'Den',
@@ -1086,6 +1196,8 @@
10871197 'centralnotice-hours' => 'Hodiny',
10881198 'centralnotice-min' => 'Minuty',
10891199 'centralnotice-project-lang' => 'Jazyk projektu',
 1200+ 'centralnotice-select' => 'Vybrat: $1',
 1201+ 'centralnotice-top-ten-languages' => '10 největších jazyků',
10901202 'centralnotice-project-name' => 'Název projektu',
10911203 'centralnotice-start-date' => 'Datum začátku',
10921204 'centralnotice-start-time' => 'Čas začátku (UTC)',
@@ -1096,7 +1208,7 @@
10971209 'centralnotice-template-already-exists' => 'Šablona už byla s kampaní svázána.
10981210 Nebude přidána.',
10991211 'centralnotice-preview-template' => 'Náhled šablony',
1100 - 'centralnotice-start-hour' => 'Čas začátku',
 1212+ 'centralnotice-start-hour' => 'Čas začátku (GMT)',
11011213 'centralnotice-change-lang' => 'Změnit překládaný jazyk',
11021214 'centralnotice-weights' => 'Váhy',
11031215 'centralnotice-notice-is-locked' => 'Oznámení je uzamčeno. Nebude odstraněno.',
@@ -1110,11 +1222,27 @@
11111223 'centralnotice-no-templates-translate' => 'Nejsou žádné šablony, které by šlo přeložit',
11121224 'centralnotice-number-uses' => 'Použití',
11131225 'centralnotice-edit-template' => 'Upravit šablonu',
 1226+ 'centralnotice-edit-template-summary' => 'Lokalizovatelnou zprávu vytvoříte uzavřením identifikátoru se spojovníky do složených závorek, např. {{{citát-jimbo}}}.',
11141227 'centralnotice-message' => 'Zpráva',
11151228 'centralnotice-message-not-set' => 'Zpráva nebyla nastavena',
11161229 'centralnotice-clone' => 'Naklonovat',
11171230 'centralnotice-clone-notice' => 'Vytvořit kopii šablony',
 1231+ 'centralnotice-clone-name' => 'Název:',
11181232 'centralnotice-preview-all-template-translations' => 'Náhled všech dostupných překladů šablony',
 1233+ 'centralnotice-insert' => 'Vložit: $1',
 1234+ 'centralnotice-hide-button' => 'Tlačítko „{{int:centralnotice-shared-hide}}“',
 1235+ 'centralnotice-collapse-button' => 'Tlačítko „{{int:centralnotice-shared-collapse}}“',
 1236+ 'centralnotice-expand-button' => 'Tlačítko „{{int:centralnotice-shared-expand}}“',
 1237+ 'centralnotice-translate-button' => 'Tlačítko „Pomozte s překladem“',
 1238+ 'centralnotice-donate-button' => 'Tlačítko „Přispějte“',
 1239+ 'centralnotice-expanded-banner' => 'Rozbalený banner',
 1240+ 'centralnotice-collapsed-banner' => 'Sbalený banner',
 1241+ 'centralnotice-banner-display' => 'Zobrazovat:',
 1242+ 'centralnotice-banner-anonymous' => 'Anonymním uživatelům',
 1243+ 'centralnotice-banner-logged-in' => 'Přihlášeným uživatelům',
 1244+ 'centralnotice-banner-type' => 'Typ banneru:',
 1245+ 'centralnotice-banner-hidable' => 'Statický/skrývatelný',
 1246+ 'centralnotice-banner-collapsible' => 'Sbalitelný',
11191247 'right-centralnotice-admin' => 'Správa centralizovaných oznámení',
11201248 'right-centralnotice-translate' => 'Překlad centralizovaných oznámení',
11211249 'action-centralnotice-admin' => 'spravovat centralizovaná oznámení',
@@ -1124,6 +1252,7 @@
11251253
11261254 /** Welsh (Cymraeg)
11271255 * @author Lloffiwr
 1256+ * @author Xxglennxx
11281257 */
11291258 $messages['cy'] = array(
11301259 'centralnotice' => "Gweinyddu'r hysbysiad canolog",
@@ -1150,15 +1279,19 @@
11511280 'centralnotice-translate-to' => "Cyfieithu i'r",
11521281 'centralnotice-translate' => 'Cyfieithu',
11531282 'centralnotice-english' => 'Saesneg',
1154 - 'centralnotice-template-name' => "Enw'r nodyn",
 1283+ 'centralnotice-banner-name' => "Enw'r nodyn",
11551284 'centralnotice-templates' => 'Nodiadau',
11561285 'centralnotice-weight' => 'Pwys',
11571286 'centralnotice-locked' => 'Ar glo',
11581287 'centralnotice-notices' => 'Hysbysiadau',
11591288 'centralnotice-notice-exists' => "Mae'r hysbysiad eisoes ar gael.
11601289 Ni chaiff ei ychwanegu",
1161 - 'centralnotice-notice-doesnt-exist' => "Nid yw'r hysbysiad ar gael.
1162 -Dim i gael gwared ohono",
 1290+ 'centralnotice-template-exists' => "Mae'r faner yn bodoli'n barod.
 1291+Ddim yn ychwanegu",
 1292+ 'centralnotice-notice-doesnt-exist' => "Nid yw'r ymgyrch i gael.",
 1293+ 'centralnotice-template-still-bound' => "Mae'r faner yn perthyn i ymgyrch o hyd.
 1294+Ddim yn tynnu.",
 1295+ 'centralnotice-template-body' => 'Corff y faner:',
11631296 'centralnotice-day' => 'Dydd',
11641297 'centralnotice-year' => 'Blwyddyn',
11651298 'centralnotice-month' => 'Mis',
@@ -1168,6 +1301,8 @@
11691302 'centralnotice-project-name' => "Enw'r prosiect",
11701303 'centralnotice-start-date' => 'Dyddiad cychwyn',
11711304 'centralnotice-start-time' => 'Amser cychwyn (UTC)',
 1305+ 'centralnotice-no-templates' => 'Ni chanfuwyd unrhyw faner.
 1306+Ychwanegu rhai!',
11721307 'centralnotice-start-hour' => 'Amser dechrau',
11731308 'centralnotice-weights' => 'Pwysau',
11741309 'centralnotice-notice-is-locked' => "Mae'r hysbysiad wedi ei gloi.
@@ -1192,7 +1327,7 @@
11931328 'centralnotice-preview' => 'Forhåndsvisning',
11941329 'centralnotice-add' => 'Tilføj',
11951330 'centralnotice-english' => 'Engelsk',
1196 - 'centralnotice-template-name' => 'Skabelonnavn',
 1331+ 'centralnotice-banner-name' => 'Skabelonnavn',
11971332 'centralnotice-templates' => 'Skabeloner',
11981333 'centralnotice-locked' => 'Låst',
11991334 'centralnotice-day' => 'Dag',
@@ -1210,15 +1345,18 @@
12111346 );
12121347
12131348 /** German (Deutsch)
 1349+ * @author Kghbln
 1350+ * @author McDutchie
12141351 * @author Metalhead64
12151352 * @author Purodha
12161353 * @author Raimond Spekking
 1354+ * @author The Evil IP address
12171355 * @author Umherirrender
12181356 */
12191357 $messages['de'] = array(
1220 - 'centralnotice' => 'Administrierung der zentralen Meldungen',
1221 - 'noticetemplate' => 'Zentrale Meldungs-Vorlage',
1222 - 'centralnotice-desc' => "Fügt eine zentrale ''sitenotice'' hinzu",
 1358+ 'centralnotice' => 'Verwaltung zentraler Meldungen',
 1359+ 'noticetemplate' => 'Vorlage für die zentrale Meldung',
 1360+ 'centralnotice-desc' => 'Ermöglicht es, zentrale Meldungen für das Wiki zu erstellen',
12231361 'centralnotice-summary' => 'Diese Erweiterung erlaubt die Konfiguration zentraler Meldungen.
12241362 Sie kann auch zur Erstellung neuer und Löschung alter Meldungen verwendet werden.',
12251363 'centralnotice-query' => 'Aktuelle Meldung ändern',
@@ -1226,31 +1364,41 @@
12271365 'centralnotice-end-date' => 'Enddatum',
12281366 'centralnotice-enabled' => 'Aktiviert',
12291367 'centralnotice-modify' => 'OK',
 1368+ 'centralnotice-save-banner' => 'Banner speichern',
12301369 'centralnotice-preview' => 'Vorschau',
12311370 'centralnotice-add-new' => 'Füge eine neue zentrale Meldung hinzu',
12321371 'centralnotice-remove' => 'Entfernen',
12331372 'centralnotice-translate-heading' => 'Übersetzung von „$1“',
12341373 'centralnotice-manage' => 'Zentrale Meldungen verwalten',
 1374+ 'centralnotice-manage-templates' => 'Banner verwalten',
12351375 'centralnotice-add' => 'Hinzufügen',
12361376 'centralnotice-add-notice' => 'Hinzufügen einer Meldung',
 1377+ 'centralnotice-edit-notice' => 'Meldung bearbeiten',
12371378 'centralnotice-add-template' => 'Hinzufügen einer Vorlage',
12381379 'centralnotice-show-notices' => 'Zeige Meldungen',
12391380 'centralnotice-list-templates' => 'Vorlagen auflisten',
 1381+ 'centralnotice-multiple_languages' => 'mehrere ($1)',
12401382 'centralnotice-translations' => 'Übersetzungen',
12411383 'centralnotice-translate-to' => 'Übersetzen in',
12421384 'centralnotice-translate' => 'Übersetzen',
12431385 'centralnotice-english' => 'Englisch',
1244 - 'centralnotice-template-name' => 'Name der Vorlage',
 1386+ 'centralnotice-banner-name' => 'Name der Vorlage',
 1387+ 'centralnotice-banner' => 'Vorlage',
 1388+ 'centralnotice-banner-heading' => 'Vorlage: $1',
12451389 'centralnotice-templates' => 'Vorlagen',
12461390 'centralnotice-weight' => 'Gewicht',
12471391 'centralnotice-locked' => 'Gesperrt',
 1392+ 'centralnotice-notice' => 'Meldung',
 1393+ 'centralnotice-notice-heading' => 'Meldung: $1',
12481394 'centralnotice-notices' => 'Meldungen',
12491395 'centralnotice-notice-exists' => 'Meldung ist bereits vorhanden.
1250 -Nicht hinzugefügt.',
 1396+Sie wird daher nicht hinzugefügt.',
 1397+ 'centralnotice-no-language' => 'Für die Meldung wurde keine Sprache ausgewählt. Sie wird daher nicht hinzugefügt.',
12511398 'centralnotice-template-exists' => 'Vorlage ist bereits vorhanden.
1252 -Nicht hinzugefügt.',
1253 - 'centralnotice-notice-doesnt-exist' => 'Meldung ist nicht vorhanden.
1254 -Entfernung nicht möglich.',
 1399+Sie wird daher nicht hinzugefügt.',
 1400+ 'centralnotice-notice-doesnt-exist' => 'Meldung ist nicht vorhanden.',
 1401+ 'centralnotice-remove-notice-doesnt-exist' => 'Die Meldung ist nicht vorhanden.
 1402+Entfernen nicht möglich.',
12551403 'centralnotice-template-still-bound' => 'Vorlage ist noch an eine Meldung gebunden.
12561404 Entfernung nicht möglich.',
12571405 'centralnotice-template-body' => 'Vorlagentext:',
@@ -1260,53 +1408,75 @@
12611409 'centralnotice-hours' => 'Stunde',
12621410 'centralnotice-min' => 'Minute',
12631411 'centralnotice-project-lang' => 'Projektsprache',
 1412+ 'centralnotice-select' => 'Auswählen: $1',
 1413+ 'centralnotice-top-ten-languages' => 'Top-10-Sprachen',
12641414 'centralnotice-project-name' => 'Projektname',
12651415 'centralnotice-start-date' => 'Startdatum',
12661416 'centralnotice-start-time' => 'Startzeit (UTC)',
12671417 'centralnotice-assigned-templates' => 'Zugewiesene Vorlagen',
1268 - 'centralnotice-no-templates' => 'Es sind keine Vorlagen im System vorhanden.',
 1418+ 'centralnotice-no-templates' => 'Es sind keine Vorlagen gefunden worden.
 1419+Füge eine hinzu.',
12691420 'centralnotice-no-templates-assigned' => 'Es sind keine Vorlagen an Meldungen zugewiesen.
12701421 Füge eine hinzu.',
12711422 'centralnotice-available-templates' => 'Verfügbare Vorlagen',
1272 - 'centralnotice-template-already-exists' => 'Vorlage ist bereits an die Kampagne gebunden.
1273 -Nicht hinzugefügt.',
 1423+ 'centralnotice-template-already-exists' => 'Vorlage ist bereits mit der Meldung verbunden.
 1424+Sie wird daher nicht hinzugefügt.',
12741425 'centralnotice-preview-template' => 'Vorschau Vorlage',
1275 - 'centralnotice-start-hour' => 'Startzeit',
 1426+ 'centralnotice-start-hour' => 'Startzeit (GMT)',
12761427 'centralnotice-change-lang' => 'Übersetzungssprache ändern',
12771428 'centralnotice-weights' => 'Gewicht',
12781429 'centralnotice-notice-is-locked' => 'Meldung ist gesperrt.
1279 -Entfernung nicht möglich.',
 1430+Sie wird daher nicht entfernt.',
12801431 'centralnotice-overlap' => 'Die Meldung überschneidet sich mit dem Zeitraum einer anderen Meldung.
1281 -Nicht hinzugefügt.',
 1432+Sie wird daher nicht hinzugefügt.',
12821433 'centralnotice-invalid-date-range' => 'Ungültiger Zeitraum.
1283 -Nicht aktualisiert.',
1284 - 'centralnotice-null-string' => 'Es kann kein Nullstring hinzugefügt werden.
1285 -Nichts hinzugefügt.',
 1434+Er wird daher nicht aktualisiert.',
 1435+ 'centralnotice-null-string' => 'Es kann keine leere Meldung hinzugefügt werden.
 1436+Sie wird daher nicht hinzugefügt.',
12861437 'centralnotice-confirm-delete' => 'Bist du sicher, dass du den Eintrag löschen möchtest?
12871438 Die Aktion kann nicht rückgängig gemacht werden.',
12881439 'centralnotice-no-notices-exist' => 'Es sind keine Meldungen vorhanden.
12891440 Füge eine hinzu.',
12901441 'centralnotice-no-templates-translate' => 'Es gibt keine Vorlagen, für die Übersetzungen zu bearbeiten wären',
12911442 'centralnotice-number-uses' => 'Nutzungen',
 1443+ 'centralnotice-settings' => 'Einstellungen',
12921444 'centralnotice-edit-template' => 'Vorlage bearbeiten',
 1445+ 'centralnotice-edit-template-summary' => 'Um eine zu übersetzende Nachricht zu erstellen, füge einen von drei geschweiften Klammern und mit Bindestrich umgebenen Text ein, z. B. {{{jimbo-zitat}}}.',
12931446 'centralnotice-message' => 'Nachricht',
12941447 'centralnotice-message-not-set' => 'Nachricht nicht gesetzt',
12951448 'centralnotice-clone' => 'Klon erstellen',
12961449 'centralnotice-clone-notice' => 'Erstelle eine Kopie der Vorlage',
 1450+ 'centralnotice-clone-name' => 'Name:',
12971451 'centralnotice-preview-all-template-translations' => 'Vorschau aller verfügbaren Übersetzungen einer Vorlage',
 1452+ 'centralnotice-insert' => 'Einfügen: $1',
 1453+ 'centralnotice-hide-button' => 'Button {{int:centralnotice-shared-hide}}',
 1454+ 'centralnotice-collapse-button' => 'Button {{int:centralnotice-shared-collapse}}',
 1455+ 'centralnotice-expand-button' => 'Button {{int:centralnotice-shared-collapse}}',
 1456+ 'centralnotice-translate-button' => 'Übersetzungshilfen-Button',
 1457+ 'centralnotice-donate-button' => 'Spendenbutton',
 1458+ 'centralnotice-expanded-banner' => 'Ausgeklappte Vorlage',
 1459+ 'centralnotice-collapsed-banner' => 'Eingeklappte Vorlage',
 1460+ 'centralnotice-banner-display' => 'Anzeigen für:',
 1461+ 'centralnotice-banner-anonymous' => 'Unangemeldete Benutzer',
 1462+ 'centralnotice-banner-logged-in' => 'Angemeldete Benutzer',
 1463+ 'centralnotice-banner-type' => 'Bannertyp:',
 1464+ 'centralnotice-banner-hidable' => 'Statisch/Ausblendbar',
 1465+ 'centralnotice-banner-collapsible' => 'Einklappbar',
12981466 'right-centralnotice-admin' => 'Zentrale Meldungen verwalten',
12991467 'right-centralnotice-translate' => 'Zentrale Meldungen übersetzen',
1300 - 'action-centralnotice-admin' => 'Zentrale Seitennotiz verwalten',
 1468+ 'action-centralnotice-admin' => 'zentrale Meldungen verwalten',
13011469 'action-centralnotice-translate' => 'Zentrale Seitennotiz übersetzen',
13021470 'centralnotice-preferred' => 'Bevorzugt',
13031471 );
13041472
13051473 /** German (formal address) (Deutsch (Sie-Form))
13061474 * @author Imre
 1475+ * @author Kghbln
13071476 */
13081477 $messages['de-formal'] = array(
13091478 'centralnotice-confirm-delete' => 'Sind Sie sicher, dass Sie den Eintrag löschen möchten?
13101479 Die Aktion kann nicht rückgängig gemacht werden.',
 1480+ 'centralnotice-edit-template-summary' => 'Um eine zu übersetzende Nachricht zu erstellen, fügen Sie einen von drei geschweiften Klammern und mit Bindestrich umgebenen Text ein, z. B. {{{jimbo-zitat}}}.',
13111481 );
13121482
13131483 /** Zazaki (Zazaki)
@@ -1337,7 +1507,7 @@
13381508 'centralnotice-translate-to' => 'Ci ra çarnayîş bike',
13391509 'centralnotice-translate' => 'Çarnayiş',
13401510 'centralnotice-english' => 'Ingilizkî',
1341 - 'centralnotice-template-name' => 'Nameyê templateyî',
 1511+ 'centralnotice-banner-name' => 'Nameyê templateyî',
13421512 'centralnotice-templates' => 'Templetan',
13431513 'centralnotice-weight' => 'Ebat',
13441514 'centralnotice-locked' => 'Kafilnaye',
@@ -1387,6 +1557,7 @@
13881558 'centralnotice-no-templates-translate' => 'Hin templeteyan çino ke ti biçarne',
13891559 'centralnotice-number-uses' => 'Ça de kar keno',
13901560 'centralnotice-edit-template' => 'Template bivurne',
 1561+ 'centralnotice-edit-template-summary' => 'Seba mesajanê lokali viraştişi, yew tire u hire paranatezi de bikefilne, mesela {{{jimbo-quote}}}.',
13911562 'centralnotice-message' => 'Mesaj',
13921563 'centralnotice-message-not-set' => 'Mesaj nişiravt',
13931564 'centralnotice-clone' => 'Kopye bike',
@@ -1413,31 +1584,41 @@
14141585 'centralnotice-end-date' => 'Kóńcny datum',
14151586 'centralnotice-enabled' => 'Zmóžnjony',
14161587 'centralnotice-modify' => 'Wótpósłaś',
 1588+ 'centralnotice-save-banner' => 'Chórgoj składowaś',
14171589 'centralnotice-preview' => 'Pśeglěd',
14181590 'centralnotice-add-new' => 'Nowu centralnu powěźeńku pśidaś',
14191591 'centralnotice-remove' => 'Wótwónoźeś',
14201592 'centralnotice-translate-heading' => 'Pśełožk za $1',
14211593 'centralnotice-manage' => 'Centralne powěźeńki zastojaś',
 1594+ 'centralnotice-manage-templates' => 'Chórgoje zrědowaś',
14221595 'centralnotice-add' => 'Pśidaś',
14231596 'centralnotice-add-notice' => 'Powěźeńku pśidaś',
 1597+ 'centralnotice-edit-notice' => 'Kampanju wobźěłaś',
14241598 'centralnotice-add-template' => 'Pśedłogu pśidaś',
14251599 'centralnotice-show-notices' => 'Powěźeńki pokazaś',
14261600 'centralnotice-list-templates' => 'Pśedłogi nalistowaś',
 1601+ 'centralnotice-multiple_languages' => 'někotare ($1)',
14271602 'centralnotice-translations' => 'Pśełožki',
14281603 'centralnotice-translate-to' => 'Pśełoźiś do',
14291604 'centralnotice-translate' => 'Pśełožiś',
14301605 'centralnotice-english' => 'Engelšćina',
1431 - 'centralnotice-template-name' => 'Mě pśedłogi',
 1606+ 'centralnotice-banner-name' => 'Mě pśedłogi',
 1607+ 'centralnotice-banner' => 'Chórgoj',
 1608+ 'centralnotice-banner-heading' => 'Chórgoj: $1',
14321609 'centralnotice-templates' => 'Pśedłogi',
14331610 'centralnotice-weight' => 'Wažnosć',
14341611 'centralnotice-locked' => 'Zastajony',
 1612+ 'centralnotice-notice' => 'Kampanja',
 1613+ 'centralnotice-notice-heading' => 'Kampanja: $1',
14351614 'centralnotice-notices' => 'Powěźeńki',
14361615 'centralnotice-notice-exists' => 'Powěźeńka južo eksistěrujo.
14371616 Žedno pśidaśe',
 1617+ 'centralnotice-no-language' => 'Za kampanju njejo se žedna rěč wubrała. Pśidawa se nic.',
14381618 'centralnotice-template-exists' => 'Pśedłoga južo eksistěrujo.
14391619 Žedno pśidaśe',
1440 - 'centralnotice-notice-doesnt-exist' => 'Powěźeńka njeeksistěrujo.
1441 -Žedno wótpóranje',
 1620+ 'centralnotice-notice-doesnt-exist' => 'Kampanja njeeksistěrujo.',
 1621+ 'centralnotice-remove-notice-doesnt-exist' => 'Kampanja njeeksistěrujo.
 1622+Njejo nic za wótpóranje.',
14421623 'centralnotice-template-still-bound' => 'Pśedłoga jo hyšći z powěźeńku zwězana.
14431624 Žedno wótpóranje.',
14441625 'centralnotice-template-body' => 'Tekst pśedłogi:',
@@ -1447,6 +1628,8 @@
14481629 'centralnotice-hours' => 'Góźina',
14491630 'centralnotice-min' => 'Minuta',
14501631 'centralnotice-project-lang' => 'Projektowa rěc',
 1632+ 'centralnotice-select' => 'Wubraś: $1',
 1633+ 'centralnotice-top-ten-languages' => 'Nejlěpšych 10 rěcow',
14511634 'centralnotice-project-name' => 'Projektowe mě',
14521635 'centralnotice-start-date' => 'Startowy datum',
14531636 'centralnotice-start-time' => 'Startowy cas (UTC)',
@@ -1459,7 +1642,7 @@
14601643 'centralnotice-template-already-exists' => 'Pśedłoga jo južo z kampanju zwězana.
14611644 Žedno pśidaśe',
14621645 'centralnotice-preview-template' => 'Pśeglěd pśedłogi',
1463 - 'centralnotice-start-hour' => 'Startowy cas',
 1646+ 'centralnotice-start-hour' => 'Startowy cas (GMT)',
14641647 'centralnotice-change-lang' => 'Pśełožkowu rěc změniś',
14651648 'centralnotice-weights' => 'Wagi',
14661649 'centralnotice-notice-is-locked' => 'Powěźeńka jo zastajona.
@@ -1477,11 +1660,27 @@
14781661 'centralnotice-no-templates-translate' => 'Njejsu pśedłogi, za kótarež deje se pśełožki wobźěłaś',
14791662 'centralnotice-number-uses' => 'Wužyśa',
14801663 'centralnotice-edit-template' => 'Pśedłogu wobźěłaś',
 1664+ 'centralnotice-edit-template-summary' => 'Aby lokalizěrujobnu powěźeńku napórał, wobdaj znamuškowy rěd z wězawku z wuzgibnjonymi spinkami, na pś. {{{citat-jimbo}}}.',
14811665 'centralnotice-message' => 'Powěźeńka',
14821666 'centralnotice-message-not-set' => 'Powěźeńka njestajona',
14831667 'centralnotice-clone' => 'Klonowaś',
14841668 'centralnotice-clone-notice' => 'Kopiju pśedłogi napóraś',
 1669+ 'centralnotice-clone-name' => 'Mě:',
14851670 'centralnotice-preview-all-template-translations' => 'Pśeglěd wšych k dispoziciji stojecych pśełožkow pśedłogi',
 1671+ 'centralnotice-insert' => 'Zasunuś: $1',
 1672+ 'centralnotice-hide-button' => 'Tłocašk {{int:centralnotice-shared-hide}}',
 1673+ 'centralnotice-collapse-button' => 'Tłocašk {{int:centralnotice-shared-collapse}}',
 1674+ 'centralnotice-expand-button' => 'Tłocašk {{int:centralnotice-shared-expand}}',
 1675+ 'centralnotice-translate-button' => 'Tłocašk pśełožowańskeje pomocy',
 1676+ 'centralnotice-donate-button' => 'Pósćiwański tłocašk',
 1677+ 'centralnotice-expanded-banner' => 'Wótcynjona chórgoj',
 1678+ 'centralnotice-collapsed-banner' => 'Złožona chórgoj',
 1679+ 'centralnotice-banner-display' => 'Zwobrazniś za:',
 1680+ 'centralnotice-banner-anonymous' => 'Anonymne wužywarje',
 1681+ 'centralnotice-banner-logged-in' => 'Pśizjawjone wužywarje',
 1682+ 'centralnotice-banner-type' => 'Chórgojowy typ:',
 1683+ 'centralnotice-banner-hidable' => 'Statiski/Chowajobny',
 1684+ 'centralnotice-banner-collapsible' => 'Fałdujobny',
14861685 'right-centralnotice-admin' => 'Centralne powěźeńki zastojaś',
14871686 'right-centralnotice-translate' => 'Centralne powěźeńki pśełožiś',
14881687 'action-centralnotice-admin' => 'Centralne powěźeńki zastojaś',
@@ -1498,6 +1697,7 @@
14991698
15001699 /** Greek (Ελληνικά)
15011700 * @author Badseed
 1701+ * @author Crazymadlover
15021702 * @author K sal 15
15031703 * @author Lou
15041704 * @author Omnipaedista
@@ -1529,10 +1729,12 @@
15301730 'centralnotice-translate-to' => 'Μετάφραση σε',
15311731 'centralnotice-translate' => 'Μετάφραση',
15321732 'centralnotice-english' => 'Αγγλικά',
1533 - 'centralnotice-template-name' => 'Όνομα προτύπου',
 1733+ 'centralnotice-banner-name' => 'Όνομα προτύπου',
 1734+ 'centralnotice-banner' => 'Διαφημιστικό',
15341735 'centralnotice-templates' => 'Πρότυπα',
15351736 'centralnotice-weight' => 'Βάρος',
15361737 'centralnotice-locked' => 'Κλειδωμένο',
 1738+ 'centralnotice-notice' => 'Εκστρατεία',
15371739 'centralnotice-notices' => 'Ανακοινώσεις',
15381740 'centralnotice-notice-exists' => 'Η σημείωση υπάρχει ήδη.
15391741 Δεν προστίθεται',
@@ -1592,6 +1794,7 @@
15931795 );
15941796
15951797 /** Esperanto (Esperanto)
 1798+ * @author Michawiki
15961799 * @author Yekrats
15971800 */
15981801 $messages['eo'] = array(
@@ -1605,13 +1808,16 @@
16061809 'centralnotice-end-date' => 'Fina dato',
16071810 'centralnotice-enabled' => 'Ŝaltita',
16081811 'centralnotice-modify' => 'Enigi',
 1812+ 'centralnotice-save-banner' => 'Konservi rubandon',
16091813 'centralnotice-preview' => 'Antaŭrigardo',
16101814 'centralnotice-add-new' => 'Aldoni novan centralan noticon',
16111815 'centralnotice-remove' => 'Forigi',
16121816 'centralnotice-translate-heading' => 'Traduko por $1',
16131817 'centralnotice-manage' => 'Administri centralan noticon',
 1818+ 'centralnotice-manage-templates' => 'Administri rubandojn',
16141819 'centralnotice-add' => 'Aldoni',
16151820 'centralnotice-add-notice' => 'Aldoni noticon',
 1821+ 'centralnotice-edit-notice' => 'Redakti kampanjon',
16161822 'centralnotice-add-template' => 'Aldoni ŝablonon',
16171823 'centralnotice-show-notices' => 'Montri noticojn',
16181824 'centralnotice-list-templates' => 'Rigardi ŝablonojn',
@@ -1619,17 +1825,22 @@
16201826 'centralnotice-translate-to' => 'Traduki al',
16211827 'centralnotice-translate' => 'Traduki',
16221828 'centralnotice-english' => 'Angla',
1623 - 'centralnotice-template-name' => 'Ŝablona nomo',
 1829+ 'centralnotice-banner-name' => 'Ŝablona nomo',
 1830+ 'centralnotice-banner' => 'Paĝrubando',
 1831+ 'centralnotice-banner-heading' => 'Rubando: $1',
16241832 'centralnotice-templates' => 'Ŝablonoj',
16251833 'centralnotice-weight' => 'Graveco',
16261834 'centralnotice-locked' => 'Ŝlosita',
 1835+ 'centralnotice-notice' => 'Kampanjo',
 1836+ 'centralnotice-notice-heading' => 'Kampanjo: $1',
16271837 'centralnotice-notices' => 'Noticoj',
16281838 'centralnotice-notice-exists' => 'Notico jam ekzistas.
16291839 Ne aldonante',
16301840 'centralnotice-template-exists' => 'Ŝablono jam ekzistas.
16311841 Ne aldonante',
1632 - 'centralnotice-notice-doesnt-exist' => 'Notico ne ekzistas.
1633 -Neniu forigi',
 1842+ 'centralnotice-notice-doesnt-exist' => 'Kampanjo ne ekzistas.',
 1843+ 'centralnotice-remove-notice-doesnt-exist' => 'Kampanjo ne ekzistas.
 1844+Nenio por forigi.',
16341845 'centralnotice-template-still-bound' => 'Ŝablono ankoraŭ estas ligita al notico.
16351846 Ne forigante.',
16361847 'centralnotice-template-body' => 'Ŝablona korpo:',
@@ -1639,6 +1850,8 @@
16401851 'centralnotice-hours' => 'Horo',
16411852 'centralnotice-min' => 'Minuto',
16421853 'centralnotice-project-lang' => 'Projekta lingvo',
 1854+ 'centralnotice-select' => 'Elekti: $1',
 1855+ 'centralnotice-top-ten-languages' => '10 plej gravaj lingvoj',
16431856 'centralnotice-project-name' => 'Projekta nomo',
16441857 'centralnotice-start-date' => 'Komenca dato',
16451858 'centralnotice-start-time' => 'Komenca tempo (UTC)',
@@ -1673,7 +1886,19 @@
16741887 'centralnotice-message-not-set' => 'Mesaĝo ne estis ŝaltita',
16751888 'centralnotice-clone' => 'Kloni',
16761889 'centralnotice-clone-notice' => 'Krei duplikaton de la ŝablono',
 1890+ 'centralnotice-clone-name' => 'Nomo:',
16771891 'centralnotice-preview-all-template-translations' => 'Antaŭvidi ĉiujn haveblajn tradukojn de ŝablono',
 1892+ 'centralnotice-insert' => 'Enmeti: $1',
 1893+ 'centralnotice-hide-button' => 'butono {{int:centralnotice-shared-hide}}',
 1894+ 'centralnotice-collapse-button' => 'butono {{int:centralnotice-shared-collapse}}',
 1895+ 'centralnotice-expand-button' => 'butono {{int:centralnotice-shared-expand}}',
 1896+ 'centralnotice-translate-button' => 'Butono de helpo al la tradukado',
 1897+ 'centralnotice-donate-button' => 'Donaca butono',
 1898+ 'centralnotice-expanded-banner' => 'Etendita rubando',
 1899+ 'centralnotice-collapsed-banner' => 'Maletendita rubando',
 1900+ 'centralnotice-banner-type' => 'Rubanda tipo:',
 1901+ 'centralnotice-banner-hidable' => 'Statika/Kaŝebla',
 1902+ 'centralnotice-banner-collapsible' => 'Maletendebla',
16781903 'right-centralnotice-admin' => 'Administri centralajn noticojn',
16791904 'right-centralnotice-translate' => 'Traduki centralajn noticojn',
16801905 'action-centralnotice-admin' => 'administri centralajn noticojn',
@@ -1682,6 +1907,7 @@
16831908 );
16841909
16851910 /** Spanish (Español)
 1911+ * @author Crazymadlover
16861912 * @author Imre
16871913 * @author Locos epraix
16881914 * @author McDutchie
@@ -1700,13 +1926,16 @@
17011927 'centralnotice-end-date' => 'Fecha de fin',
17021928 'centralnotice-enabled' => 'Habilitado',
17031929 'centralnotice-modify' => 'Enviar',
 1930+ 'centralnotice-save-banner' => 'Grabar banner',
17041931 'centralnotice-preview' => 'Previsualizar',
17051932 'centralnotice-add-new' => 'Añadir un nuevo aviso central',
17061933 'centralnotice-remove' => 'Quitar',
17071934 'centralnotice-translate-heading' => 'Traducción para $1',
17081935 'centralnotice-manage' => 'Gestionar aviso central',
 1936+ 'centralnotice-manage-templates' => 'Gestionar banners',
17091937 'centralnotice-add' => 'Añadir',
17101938 'centralnotice-add-notice' => 'Añadir un aviso',
 1939+ 'centralnotice-edit-notice' => 'Editar campaña',
17111940 'centralnotice-add-template' => 'Añadir una plantilla',
17121941 'centralnotice-show-notices' => 'Mostrar avisos',
17131942 'centralnotice-list-templates' => 'Listar plantillas',
@@ -1714,17 +1943,22 @@
17151944 'centralnotice-translate-to' => 'Traducir al',
17161945 'centralnotice-translate' => 'Traducir',
17171946 'centralnotice-english' => 'Inglés',
1718 - 'centralnotice-template-name' => 'Nombre de la plantilla',
 1947+ 'centralnotice-banner-name' => 'Nombre de la plantilla',
 1948+ 'centralnotice-banner' => 'Banner',
 1949+ 'centralnotice-banner-heading' => 'Banner: $1',
17191950 'centralnotice-templates' => 'Plantillas',
17201951 'centralnotice-weight' => 'Peso',
17211952 'centralnotice-locked' => 'Cerrada con llave',
 1953+ 'centralnotice-notice' => 'Campaña',
 1954+ 'centralnotice-notice-heading' => 'Campaña: $1',
17221955 'centralnotice-notices' => 'Avisos',
17231956 'centralnotice-notice-exists' => 'El aviso ya existe.
17241957 No se ha añadido',
17251958 'centralnotice-template-exists' => 'La plantilla ya exixte.
17261959 No se ha añadido',
1727 - 'centralnotice-notice-doesnt-exist' => 'El aviso no existe.
1728 -No hay nada que borrar',
 1960+ 'centralnotice-notice-doesnt-exist' => 'La campaña no existe.',
 1961+ 'centralnotice-remove-notice-doesnt-exist' => 'La campaña no existe.
 1962+Nada que remover.',
17291963 'centralnotice-template-still-bound' => 'La plantilla todavía está enlazada a un aviso.
17301964 No se borrará.',
17311965 'centralnotice-template-body' => 'Cuerpo de la plantilla:',
@@ -1734,6 +1968,8 @@
17351969 'centralnotice-hours' => 'Hora',
17361970 'centralnotice-min' => 'Minuto',
17371971 'centralnotice-project-lang' => 'Idioma del proyecto',
 1972+ 'centralnotice-select' => 'Seleccionar: $1',
 1973+ 'centralnotice-top-ten-languages' => 'Idiomas top 10',
17381974 'centralnotice-project-name' => 'Nombre del proyecto',
17391975 'centralnotice-start-date' => 'Fecha de inicio',
17401976 'centralnotice-start-time' => 'Hora de inicio (UTC)',
@@ -1764,11 +2000,24 @@
17652001 'centralnotice-no-templates-translate' => 'No hay plantillas de las que editar traducciones',
17662002 'centralnotice-number-uses' => 'Usos',
17672003 'centralnotice-edit-template' => 'Editar plantilla',
 2004+ 'centralnotice-edit-template-summary' => 'Para crear un mensaje localizable, encierre una cadena con guión dentro de tres llaves, por ejemplo {{{jimbo-quote}}}.',
17682005 'centralnotice-message' => 'Mensaje',
17692006 'centralnotice-message-not-set' => 'No se ha establecido un mensaje',
17702007 'centralnotice-clone' => 'Clonar',
17712008 'centralnotice-clone-notice' => 'Crear una copia de la plantilla',
 2009+ 'centralnotice-clone-name' => 'Nombre:',
17722010 'centralnotice-preview-all-template-translations' => 'Previsualizar todas las traducciones disponibles de la plantilla',
 2011+ 'centralnotice-insert' => 'Insertar: $1',
 2012+ 'centralnotice-hide-button' => 'Ocultar botón',
 2013+ 'centralnotice-collapse-button' => 'Colapsar botón',
 2014+ 'centralnotice-expand-button' => 'Expandir botón',
 2015+ 'centralnotice-translate-button' => 'Botón de ayuda a la traducción',
 2016+ 'centralnotice-donate-button' => 'Botón de donación',
 2017+ 'centralnotice-expanded-banner' => 'Banner expandido',
 2018+ 'centralnotice-collapsed-banner' => 'Banner colapsado',
 2019+ 'centralnotice-banner-type' => 'Tipo de banner:',
 2020+ 'centralnotice-banner-hidable' => 'Estático/Ocultable',
 2021+ 'centralnotice-banner-collapsible' => 'Colapsable',
17732022 'right-centralnotice-admin' => 'Gestionar avisos centrales',
17742023 'right-centralnotice-translate' => 'Traducir avisos centrales',
17752024 'action-centralnotice-admin' => 'gestionar avisos centrales',
@@ -1804,7 +2053,7 @@
18052054 'centralnotice-translate-to' => 'Tõlgi',
18062055 'centralnotice-translate' => 'Tõlgi',
18072056 'centralnotice-english' => 'Inglise',
1808 - 'centralnotice-template-name' => 'Malli nimi',
 2057+ 'centralnotice-banner-name' => 'Malli nimi',
18092058 'centralnotice-templates' => 'Mallid',
18102059 'centralnotice-weight' => 'Kaal',
18112060 'centralnotice-locked' => 'Lukustatud',
@@ -1815,9 +2064,7 @@
18162065 'centralnotice-template-exists' => 'Mall on juba olemas.
18172066
18182067 Ei lisatud.',
1819 - 'centralnotice-notice-doesnt-exist' => 'Teadet ei ole.
1820 -
1821 -Ei ole midagi eemaldada',
 2068+ 'centralnotice-notice-doesnt-exist' => 'Teadet pole.',
18222069 'centralnotice-template-still-bound' => 'Mall on ikka teatega seotud.
18232070 Ei eemaldata',
18242071 'centralnotice-template-body' => 'Malli sisu:',
@@ -1840,7 +2087,7 @@
18412088 'centralnotice-template-already-exists' => 'Mall on juba kampaaniaga seotud.
18422089 Ei lisata',
18432090 'centralnotice-preview-template' => 'Malli eelvaade',
1844 - 'centralnotice-start-hour' => 'Algusaeg',
 2091+ 'centralnotice-start-hour' => 'Algusaeg (UTC)',
18452092 'centralnotice-change-lang' => 'Tõlkekeele vahetamine',
18462093 'centralnotice-weights' => 'Raskused',
18472094 'centralnotice-notice-is-locked' => 'Teade on lukustatud.
@@ -1876,7 +2123,7 @@
18772124 'centralnotice-end-date' => 'Bukaera data',
18782125 'centralnotice-enabled' => 'Gaitua',
18792126 'centralnotice-modify' => 'Bidali',
1880 - 'centralnotice-preview' => 'Aurreikusi',
 2127+ 'centralnotice-preview' => 'Aurrikusi',
18812128 'centralnotice-add-new' => 'Mezu orokor berri bat gehitu',
18822129 'centralnotice-remove' => 'Ezabatu',
18832130 'centralnotice-translate-heading' => '$1(r)entzat itzulpena',
@@ -1889,11 +2136,12 @@
18902137 'centralnotice-translations' => 'Itzulpenak',
18912138 'centralnotice-translate-to' => 'Hona itzuli',
18922139 'centralnotice-translate' => 'Itzuli',
1893 - 'centralnotice-english' => 'Ingelera',
1894 - 'centralnotice-template-name' => 'Txantiloi izena',
 2140+ 'centralnotice-english' => 'Ingelesa',
 2141+ 'centralnotice-banner-name' => 'Txantiloi izena',
18952142 'centralnotice-templates' => 'Txantiloiak',
18962143 'centralnotice-weight' => 'Pisua',
18972144 'centralnotice-locked' => 'Babesturik',
 2145+ 'centralnotice-notice' => 'Kanpaina',
18982146 'centralnotice-notices' => 'Berriak',
18992147 'centralnotice-notice-exists' => 'Berria badago dagoeneko.
19002148 Ez da gehituko',
@@ -1914,11 +2162,16 @@
19152163 'centralnotice-edit-template' => 'Txantiloia aldatu',
19162164 'centralnotice-message' => 'Mezua',
19172165 'centralnotice-clone-notice' => 'Txantiloia honen kopia sortu',
 2166+ 'centralnotice-clone-name' => 'Izena',
19182167 );
19192168
19202169 /** Persian (فارسی)
 2170+ * @author Bersam
 2171+ * @author Ebraminio
19212172 * @author Huji
19222173 * @author Komeil 4life
 2174+ * @author Sahim
 2175+ * @author Wayiran
19232176 */
19242177 $messages['fa'] = array(
19252178 'centralnotice' => 'مدیر اعلان متمرکز',
@@ -1931,31 +2184,41 @@
19322185 'centralnotice-end-date' => 'تاریخ پایان',
19332186 'centralnotice-enabled' => 'فعال',
19342187 'centralnotice-modify' => 'ارسال',
 2188+ 'centralnotice-save-banner' => 'پرچم ذخیره',
19352189 'centralnotice-preview' => 'پیش‌نمایش',
19362190 'centralnotice-add-new' => 'افزودن یک اعلان متمرکز جدید',
19372191 'centralnotice-remove' => 'حذف',
19382192 'centralnotice-translate-heading' => 'ترجمه از $1',
19392193 'centralnotice-manage' => 'مدیریت اعلان متمرکز',
 2194+ 'centralnotice-manage-templates' => 'پرچم‌های مدیریت',
19402195 'centralnotice-add' => 'اضافه کردن',
19412196 'centralnotice-add-notice' => 'اضافه کردن خبر',
 2197+ 'centralnotice-edit-notice' => 'ویرایش کمپین',
19422198 'centralnotice-add-template' => 'اضافه کردن الگو',
19432199 'centralnotice-show-notices' => 'نمایش اعلان‌ها',
19442200 'centralnotice-list-templates' => 'فهرست الگوها',
 2201+ 'centralnotice-multiple_languages' => 'چندگانه ($1)',
19452202 'centralnotice-translations' => 'ترجمه‌ها',
19462203 'centralnotice-translate-to' => 'ترجمه به',
19472204 'centralnotice-translate' => 'ترجمه کردن',
19482205 'centralnotice-english' => 'انگلیسی',
1949 - 'centralnotice-template-name' => 'نام الگو',
 2206+ 'centralnotice-banner-name' => 'نام الگو',
 2207+ 'centralnotice-banner' => 'پرچم',
 2208+ 'centralnotice-banner-heading' => 'پرچم: $1',
19502209 'centralnotice-templates' => 'الگوها',
19512210 'centralnotice-weight' => 'وزن',
19522211 'centralnotice-locked' => 'قفل شده',
 2212+ 'centralnotice-notice' => 'کمپین',
 2213+ 'centralnotice-notice-heading' => 'کمپین: $1',
19532214 'centralnotice-notices' => 'اعلانات',
19542215 'centralnotice-notice-exists' => 'اعلان از قبل وجود دارد.
19552216 افزوده نشد',
 2217+ 'centralnotice-no-language' => 'هیچ زبانی برای کمپین انتخاب نشده است. اضاقه نشده است.',
19562218 'centralnotice-template-exists' => 'الگو از قبل وجود دارد.
19572219 افزوده نشد',
1958 - 'centralnotice-notice-doesnt-exist' => 'اعلان وجود ندارد.
1959 -چیزی برای حذف وجود ندارد',
 2220+ 'centralnotice-notice-doesnt-exist' => 'کمپین وجود ندارد.',
 2221+ 'centralnotice-remove-notice-doesnt-exist' => 'کمپین وجود ندارد.
 2222+چیزی برای حذف نیست.',
19602223 'centralnotice-template-still-bound' => 'الگو هنوز در اتصال با یک اعلان است.
19612224 حذف نشد',
19622225 'centralnotice-template-body' => 'بدنه قالب:',
@@ -1965,6 +2228,8 @@
19662229 'centralnotice-hours' => 'ساعت',
19672230 'centralnotice-min' => 'دقیقه',
19682231 'centralnotice-project-lang' => 'زبان پروژه',
 2232+ 'centralnotice-select' => 'انتخاب: $1',
 2233+ 'centralnotice-top-ten-languages' => '۱۰ زبان برتر',
19692234 'centralnotice-project-name' => 'نام پروژه',
19702235 'centralnotice-start-date' => 'تاریخ آغاز',
19712236 'centralnotice-start-time' => 'زمان آغاز',
@@ -1977,7 +2242,7 @@
19782243 'centralnotice-template-already-exists' => 'الگو از قبل به اعلان گره خورده است.
19792244 افزوده نشد',
19802245 'centralnotice-preview-template' => 'الگو نمایش',
1981 - 'centralnotice-start-hour' => 'زمان شروع',
 2246+ 'centralnotice-start-hour' => 'زمان شروع (GMT)',
19822247 'centralnotice-change-lang' => 'تغییر زبان ترجمه',
19832248 'centralnotice-weights' => 'وزن‌ها',
19842249 'centralnotice-notice-is-locked' => 'اعلان قفل شده‌است.
@@ -1994,12 +2259,29 @@
19952260 یکی اضافه کنید',
19962261 'centralnotice-no-templates-translate' => 'الگویی وجود ندارد که ترجمه‌اش را ویرایش کنید',
19972262 'centralnotice-number-uses' => 'کاربردها',
 2263+ 'centralnotice-settings' => 'تنظیمات',
19982264 'centralnotice-edit-template' => 'الگو ویرایش',
 2265+ 'centralnotice-edit-template-summary' => 'برای ساختن یک پیغام قابل محلی‌سازی، یک رشتهٔ قابل شکستن را در سه کروشه قرار دهید. مانند {{{jimbo-quote}}}.',
19992266 'centralnotice-message' => 'پیام',
20002267 'centralnotice-message-not-set' => 'پیغام تنظیم نشده',
20012268 'centralnotice-clone' => 'کلون',
20022269 'centralnotice-clone-notice' => 'ایجاد یک کپی از الگو',
 2270+ 'centralnotice-clone-name' => 'نام:',
20032271 'centralnotice-preview-all-template-translations' => 'پیش‌نمایش تمام ترجمه‌های موجود از الگو',
 2272+ 'centralnotice-insert' => 'درج: $1',
 2273+ 'centralnotice-hide-button' => '{{int:centralnotice-shared-hide}} دکمه',
 2274+ 'centralnotice-collapse-button' => '{{int:centralnotice-shared-collapse}} دکمه',
 2275+ 'centralnotice-expand-button' => '{{int:centralnotice-shared-expand}} دکمه',
 2276+ 'centralnotice-translate-button' => 'راهنمای ترجمهٔ دکمه',
 2277+ 'centralnotice-donate-button' => 'دکمهٔ کمک مالی',
 2278+ 'centralnotice-expanded-banner' => 'پرچم گسترده‌شده:',
 2279+ 'centralnotice-collapsed-banner' => 'پرچم متلاشی‌شده',
 2280+ 'centralnotice-banner-display' => 'نمایش به:',
 2281+ 'centralnotice-banner-anonymous' => 'کاربران ناشناس',
 2282+ 'centralnotice-banner-logged-in' => 'کاربران واردشده',
 2283+ 'centralnotice-banner-type' => 'نوع پرچم:',
 2284+ 'centralnotice-banner-hidable' => 'ایستا/نهفتنی',
 2285+ 'centralnotice-banner-collapsible' => 'متلاشی‌پذیر',
20042286 'right-centralnotice-admin' => 'مدیریت اعلان‌های متمرکز',
20052287 'right-centralnotice-translate' => 'ترجمهٔ اعلان‌های متمرکز',
20062288 'action-centralnotice-admin' => 'مدیریت اعلان‌های متمرکز',
@@ -2008,6 +2290,7 @@
20092291 );
20102292
20112293 /** Finnish (Suomi)
 2294+ * @author Centerlink
20122295 * @author Crt
20132296 * @author Nike
20142297 * @author Tarmo
@@ -2037,7 +2320,7 @@
20382321 'centralnotice-translate-to' => 'Käännös:',
20392322 'centralnotice-translate' => 'Käännä',
20402323 'centralnotice-english' => 'Englanniksi',
2041 - 'centralnotice-template-name' => 'Mallineen nimi',
 2324+ 'centralnotice-banner-name' => 'Mallineen nimi',
20422325 'centralnotice-templates' => 'Mallineet',
20432326 'centralnotice-weight' => 'Paino',
20442327 'centralnotice-locked' => 'Lukittu',
@@ -2087,6 +2370,7 @@
20882371 'centralnotice-no-templates-translate' => 'Ei mallineita, joiden käännöksiä voisi muokata',
20892372 'centralnotice-number-uses' => 'Käyttää',
20902373 'centralnotice-edit-template' => 'Muokkaa mallinetta',
 2374+ 'centralnotice-edit-template-summary' => 'Käännettävän viestin luomiseksi sisällytä tavutettu merkkijono kolmen aaltosulkeen sisään, esim. {{{jimbo-quote}}}.',
20912375 'centralnotice-message' => 'Viesti',
20922376 'centralnotice-message-not-set' => 'Viestiä ei ole asetettu',
20932377 'centralnotice-clone' => 'Kahdenna',
@@ -2103,8 +2387,10 @@
21042388 * @author Crochet.david
21052389 * @author Grondin
21062390 * @author IAlex
 2391+ * @author Jean-Frédéric
21072392 * @author McDutchie
21082393 * @author Meithal
 2394+ * @author Peter17
21092395 * @author PieRRoMaN
21102396 * @author Sherbrooke
21112397 * @author Urhixidur
@@ -2121,31 +2407,41 @@
21222408 'centralnotice-end-date' => 'Date de fin',
21232409 'centralnotice-enabled' => 'Activé',
21242410 'centralnotice-modify' => 'Soumettre',
 2411+ 'centralnotice-save-banner' => 'Enregistrer la bannière',
21252412 'centralnotice-preview' => 'Prévisualiser',
21262413 'centralnotice-add-new' => 'Ajouter un nouvel avis central',
21272414 'centralnotice-remove' => 'Supprimer',
21282415 'centralnotice-translate-heading' => 'Traduction de l’avis « $1 »',
21292416 'centralnotice-manage' => 'Gérer les avis centraux',
 2417+ 'centralnotice-manage-templates' => 'Gérer les bannières',
21302418 'centralnotice-add' => 'Ajouter',
21312419 'centralnotice-add-notice' => 'Ajouter un avis',
 2420+ 'centralnotice-edit-notice' => 'Modifier la campagne',
21322421 'centralnotice-add-template' => 'Ajouter un modèle',
21332422 'centralnotice-show-notices' => 'Afficher les avis',
21342423 'centralnotice-list-templates' => 'Lister les modèles',
 2424+ 'centralnotice-multiple_languages' => 'multiple ($1)',
21352425 'centralnotice-translations' => 'Traductions',
21362426 'centralnotice-translate-to' => 'Traduire en',
21372427 'centralnotice-translate' => 'Traduire',
21382428 'centralnotice-english' => 'anglais',
2139 - 'centralnotice-template-name' => 'Nom du modèle',
 2429+ 'centralnotice-banner-name' => 'Nom du modèle',
 2430+ 'centralnotice-banner' => 'Bannière',
 2431+ 'centralnotice-banner-heading' => 'Bannière : $1',
21402432 'centralnotice-templates' => 'Modèles',
21412433 'centralnotice-weight' => 'Poids',
21422434 'centralnotice-locked' => 'Verrouillé',
 2435+ 'centralnotice-notice' => 'Campagne',
 2436+ 'centralnotice-notice-heading' => 'Campagne : $1',
21432437 'centralnotice-notices' => 'Avis',
21442438 'centralnotice-notice-exists' => 'L’avis existe déjà.
21452439 Il n’a pas été ajouté.',
 2440+ 'centralnotice-no-language' => 'Aucune langue n’a été sélectionnée pour la campagne. Non ajoutée.',
21462441 'centralnotice-template-exists' => 'Le modèle existe déjà.
21472442 Il n’a pas été ajouté.',
2148 - 'centralnotice-notice-doesnt-exist' => 'L’avis n’existe pas.
2149 -Il n’y a rien à supprimer.',
 2443+ 'centralnotice-notice-doesnt-exist' => 'La campagne n’existe pas.',
 2444+ 'centralnotice-remove-notice-doesnt-exist' => 'La campagne n’existe pas.
 2445+Rien à supprimer.',
21502446 'centralnotice-template-still-bound' => 'Le modèle est encore lié à un avis.
21512447 Il n’a pas été supprimé.',
21522448 'centralnotice-template-body' => 'Corps du modèle :',
@@ -2155,6 +2451,8 @@
21562452 'centralnotice-hours' => 'Heure',
21572453 'centralnotice-min' => 'Minute',
21582454 'centralnotice-project-lang' => 'Langue du projet',
 2455+ 'centralnotice-select' => 'Sélectionnez : $1',
 2456+ 'centralnotice-top-ten-languages' => 'Les 10 langues les plus utilisées',
21592457 'centralnotice-project-name' => 'Nom du projet',
21602458 'centralnotice-start-date' => 'Date de début',
21612459 'centralnotice-start-time' => 'Heure de début (UTC)',
@@ -2167,7 +2465,7 @@
21682466 'centralnotice-template-already-exists' => 'Le modèle est déjà attaché à une campagne.
21692467 Il n’a pas été ajouté.',
21702468 'centralnotice-preview-template' => 'Prévisualiser le modèle',
2171 - 'centralnotice-start-hour' => 'Heure de début',
 2469+ 'centralnotice-start-hour' => 'Heure de départ (GMT)',
21722470 'centralnotice-change-lang' => 'Modifier la langue de traduction',
21732471 'centralnotice-weights' => 'Poids',
21742472 'centralnotice-notice-is-locked' => 'L’avis est verrouillé.
@@ -2185,11 +2483,27 @@
21862484 'centralnotice-no-templates-translate' => 'Il n’y a aucun modèle à traduire',
21872485 'centralnotice-number-uses' => 'Utilisations',
21882486 'centralnotice-edit-template' => 'Modifier le modèle',
 2487+ 'centralnotice-edit-template-summary' => 'Pour créer un message localisable, entourez une chaîne à trait d’union de trois accolades, par exemple {{{jimbo-quote}}}.',
21892488 'centralnotice-message' => 'Message',
21902489 'centralnotice-message-not-set' => 'Message non renseigné',
21912490 'centralnotice-clone' => 'Dupliquer',
21922491 'centralnotice-clone-notice' => 'Créer une copie du modèle',
 2492+ 'centralnotice-clone-name' => 'Nom :',
21932493 'centralnotice-preview-all-template-translations' => 'Prévisualiser toutes les traductions disponibles du modèle',
 2494+ 'centralnotice-insert' => 'Insérer : $1',
 2495+ 'centralnotice-hide-button' => '{{int:centralnotice-shared-hide}} le bouton',
 2496+ 'centralnotice-collapse-button' => '{{int:centralnotice-shared-collapse}} le bouton',
 2497+ 'centralnotice-expand-button' => '{{int:centralnotice-shared-expand}} le bouton',
 2498+ 'centralnotice-translate-button' => "Bouton d'aide à la traduction",
 2499+ 'centralnotice-donate-button' => 'Bouton de donation',
 2500+ 'centralnotice-expanded-banner' => 'Bannière étendue',
 2501+ 'centralnotice-collapsed-banner' => 'Bannière réduite',
 2502+ 'centralnotice-banner-display' => 'Afficher aux :',
 2503+ 'centralnotice-banner-anonymous' => 'Utilisateurs anonymes',
 2504+ 'centralnotice-banner-logged-in' => 'Utilisateurs identifiés',
 2505+ 'centralnotice-banner-type' => 'Type de bannière :',
 2506+ 'centralnotice-banner-hidable' => 'Statique/masquable',
 2507+ 'centralnotice-banner-collapsible' => 'Réductible',
21942508 'right-centralnotice-admin' => 'Gérer les avis centraux',
21952509 'right-centralnotice-translate' => 'Traduire les avis centraux',
21962510 'action-centralnotice-admin' => 'gérer les avis centraux',
@@ -2203,19 +2517,24 @@
22042518 $messages['frp'] = array(
22052519 'centralnotice' => 'Administracion des avis centrâls',
22062520 'noticetemplate' => 'Modèlo des avis centrâls',
2207 - 'centralnotice-desc' => 'Apond un sitenotice centrâl.',
 2521+ 'centralnotice-desc' => 'Apond un avis centrâl du seto.',
 2522+ 'centralnotice-summary' => 'Ceti modulo vos pèrmèt de changiér voutros paramètres d’avis centrâls.
 2523+Pôt asse-ben étre utilisâ por apondre des avis ou ben nen enlevar los ples vielys.',
22082524 'centralnotice-query' => 'Changiér los avis d’ora',
22092525 'centralnotice-notice-name' => 'Nom de l’avis',
22102526 'centralnotice-end-date' => 'Dâta de fin',
22112527 'centralnotice-enabled' => 'Activâ',
22122528 'centralnotice-modify' => 'Sometre',
 2529+ 'centralnotice-save-banner' => 'Encartar lo modèlo',
22132530 'centralnotice-preview' => 'Prèvisualisacion',
2214 - 'centralnotice-add-new' => 'Apondre un novél avis centrâl',
2215 - 'centralnotice-remove' => 'Suprimar',
2216 - 'centralnotice-translate-heading' => 'Traduccion de l’avis « $1 »',
2217 - 'centralnotice-manage' => 'Administrar los avis centrâls',
 2531+ 'centralnotice-add-new' => 'Apondre un novél avis',
 2532+ 'centralnotice-remove' => 'Enlevar',
 2533+ 'centralnotice-translate-heading' => 'Traduccion de « $1 »',
 2534+ 'centralnotice-manage' => 'Administrar los avis',
 2535+ 'centralnotice-manage-templates' => 'Administrar los modèlos',
22182536 'centralnotice-add' => 'Apondre',
22192537 'centralnotice-add-notice' => 'Apondre un avis',
 2538+ 'centralnotice-edit-notice' => 'Changiér l’avis',
22202539 'centralnotice-add-template' => 'Apondre un modèlo',
22212540 'centralnotice-show-notices' => 'Fâre vêre los avis',
22222541 'centralnotice-list-templates' => 'Listar los modèlos',
@@ -2223,19 +2542,24 @@
22242543 'centralnotice-translate-to' => 'Traduire en',
22252544 'centralnotice-translate' => 'Traduire',
22262545 'centralnotice-english' => 'Anglès',
2227 - 'centralnotice-template-name' => 'Nom du modèlo',
 2546+ 'centralnotice-banner-name' => 'Nom du modèlo',
 2547+ 'centralnotice-banner' => 'Modèlo',
 2548+ 'centralnotice-banner-heading' => 'Modèlo : $1',
22282549 'centralnotice-templates' => 'Modèlos',
22292550 'centralnotice-weight' => 'Pêds',
22302551 'centralnotice-locked' => 'Vèrrolyê',
 2552+ 'centralnotice-notice' => 'Avis',
 2553+ 'centralnotice-notice-heading' => 'Avis : $1',
22312554 'centralnotice-notices' => 'Avis',
22322555 'centralnotice-notice-exists' => 'L’avis ègziste ja.
22332556 Il at pas étâ apondu.',
22342557 'centralnotice-template-exists' => 'Lo modèlo ègziste ja.
22352558 Il at pas étâ apondu.',
2236 - 'centralnotice-notice-doesnt-exist' => 'L’avis ègziste pas.
2237 -Y at ren a suprimar.',
 2559+ 'centralnotice-notice-doesnt-exist' => 'L’avis ègziste pas.',
 2560+ 'centralnotice-remove-notice-doesnt-exist' => 'L’avis ègziste pas.
 2561+Y at ren a enlevar.',
22382562 'centralnotice-template-still-bound' => 'Lo modèlo est adés liyê a un avis.
2239 -Il at pas étâ suprimâ.',
 2563+Il at pas étâ enlevâ.',
22402564 'centralnotice-template-body' => 'Côrp du modèlo :',
22412565 'centralnotice-day' => 'Jorn',
22422566 'centralnotice-year' => 'An',
@@ -2243,6 +2567,8 @@
22442568 'centralnotice-hours' => 'Hora',
22452569 'centralnotice-min' => 'Menuta',
22462570 'centralnotice-project-lang' => 'Lengoua du projèt',
 2571+ 'centralnotice-select' => 'Chouèsésséd : $1',
 2572+ 'centralnotice-top-ten-languages' => 'Les 10 lengoues les ples utilisâs',
22472573 'centralnotice-project-name' => 'Nom du projèt',
22482574 'centralnotice-start-date' => 'Dâta de comencement',
22492575 'centralnotice-start-time' => 'Hora de comencement (UTC)',
@@ -2252,32 +2578,45 @@
22532579 'centralnotice-no-templates-assigned' => 'Gins de modèlo assignê a l’avis.
22542580 Apondéd-nen !',
22552581 'centralnotice-available-templates' => 'Modèlos disponiblos',
2256 - 'centralnotice-template-already-exists' => 'Lo modèlo est ja atachiê a una propaganda.
 2582+ 'centralnotice-template-already-exists' => 'Lo modèlo est ja atachiê a un avis.
22572583 Il at pas étâ apondu.',
22582584 'centralnotice-preview-template' => 'Prèvisualisacion du modèlo',
2259 - 'centralnotice-start-hour' => 'Hora de comencement',
 2585+ 'centralnotice-start-hour' => 'Hora de comencement (UTC)',
22602586 'centralnotice-change-lang' => 'Changiér la lengoua de traduccion',
22612587 'centralnotice-weights' => 'Pêds',
22622588 'centralnotice-notice-is-locked' => 'L’avis est vèrrolyê.
2263 -Il at pas étâ suprimâ.',
 2589+Il at pas étâ enlevâ.',
22642590 'centralnotice-overlap' => 'L’avis côvre tot ou ben partia du temps d’un ôtro avis.
22652591 Il at pas étâ apondu.',
22662592 'centralnotice-invalid-date-range' => 'Entèrvalo de dâtes fôx por l’avis.
22672593 Il at pas étâ betâ a jorn.',
22682594 'centralnotice-null-string' => 'Empossiblo d’apondre un avis vouedo.
22692595 Il at pas étâ apondu.',
2270 - 'centralnotice-confirm-delete' => 'Éte-vos de sûr de volêr suprimar ceti èlèment ?
 2596+ 'centralnotice-confirm-delete' => 'Éte-vos de sûr de volêr enlevar ceti èlèment ?
22712597 Cela accion porrat pas étre rècupèrâ.',
22722598 'centralnotice-no-notices-exist' => 'Nion avis ègziste.
22732599 Apondéd-nen ce-desot.',
2274 - 'centralnotice-no-templates-translate' => 'Y at gins de modèlo a traduire',
 2600+ 'centralnotice-no-templates-translate' => 'Y at gins de modèlo a traduire.',
22752601 'centralnotice-number-uses' => 'Usâjos',
22762602 'centralnotice-edit-template' => 'Changiér lo modèlo',
 2603+ 'centralnotice-edit-template-summary' => 'Por fâre un mèssâjo localisâblo, entremâd una chêna a trèt d’union de três colâdes, per ègzemplo {{{jimbo-quote}}}.',
22772604 'centralnotice-message' => 'Mèssâjo',
22782605 'centralnotice-message-not-set' => 'Mèssâjo pas rensègnê',
22792606 'centralnotice-clone' => 'Copiyér',
22802607 'centralnotice-clone-notice' => 'Fâre una copia du modèlo',
 2608+ 'centralnotice-clone-name' => 'Nom :',
22812609 'centralnotice-preview-all-template-translations' => 'Prèvisualisar totes les traduccions disponibles du modèlo',
 2610+ 'centralnotice-insert' => 'Entrebetar : $1',
 2611+ 'centralnotice-hide-button' => 'Boton {{int:centralnotice-shared-hide}}',
 2612+ 'centralnotice-collapse-button' => 'Boton {{int:centralnotice-shared-collapse}}',
 2613+ 'centralnotice-expand-button' => 'Boton {{int:centralnotice-shared-expand}}',
 2614+ 'centralnotice-translate-button' => 'Boton d’éde a la traduccion',
 2615+ 'centralnotice-donate-button' => 'Boton de donacion',
 2616+ 'centralnotice-expanded-banner' => 'Modèlo ètendu',
 2617+ 'centralnotice-collapsed-banner' => 'Modèlo rèduit',
 2618+ 'centralnotice-banner-type' => 'Tipo de modèlo:',
 2619+ 'centralnotice-banner-hidable' => 'Statico / cachâblo',
 2620+ 'centralnotice-banner-collapsible' => 'Rèductiblo',
22822621 'right-centralnotice-admin' => 'Administrar los avis centrâls',
22832622 'right-centralnotice-translate' => 'Traduire los avis centrâls',
22842623 'action-centralnotice-admin' => 'administrar los avis centrâls',
@@ -2306,31 +2645,41 @@
23072646 'centralnotice-end-date' => 'Data da fin',
23082647 'centralnotice-enabled' => 'Permitido',
23092648 'centralnotice-modify' => 'Enviar',
 2649+ 'centralnotice-save-banner' => 'Gardar o cartel',
23102650 'centralnotice-preview' => 'Vista previa',
23112651 'centralnotice-add-new' => 'Engadir un novo aviso central',
23122652 'centralnotice-remove' => 'Eliminar',
23132653 'centralnotice-translate-heading' => 'Traducións de "$1"',
23142654 'centralnotice-manage' => 'Xestionar o aviso central',
 2655+ 'centralnotice-manage-templates' => 'Xestionar os carteis',
23152656 'centralnotice-add' => 'Engadir',
23162657 'centralnotice-add-notice' => 'Engadir un aviso',
 2658+ 'centralnotice-edit-notice' => 'Editar o aviso',
23172659 'centralnotice-add-template' => 'Engadir un modelo',
23182660 'centralnotice-show-notices' => 'Amosar os avisos',
23192661 'centralnotice-list-templates' => 'Listar os modelos',
 2662+ 'centralnotice-multiple_languages' => 'múltiple ($1)',
23202663 'centralnotice-translations' => 'Traducións',
23212664 'centralnotice-translate-to' => 'Traducir ao',
23222665 'centralnotice-translate' => 'Traducir',
23232666 'centralnotice-english' => 'inglés',
2324 - 'centralnotice-template-name' => 'Nome do modelo',
 2667+ 'centralnotice-banner-name' => 'Nome do modelo',
 2668+ 'centralnotice-banner' => 'Cartel',
 2669+ 'centralnotice-banner-heading' => 'Cartel: $1',
23252670 'centralnotice-templates' => 'Modelos',
23262671 'centralnotice-weight' => 'Peso',
23272672 'centralnotice-locked' => 'Bloqueado',
 2673+ 'centralnotice-notice' => 'Aviso',
 2674+ 'centralnotice-notice-heading' => 'Aviso: $1',
23282675 'centralnotice-notices' => 'Avisos',
23292676 'centralnotice-notice-exists' => 'O aviso xa existe.
23302677 Non se engade',
 2678+ 'centralnotice-no-language' => 'Non se seleccionou ningunha lingua para o aviso. Non se engade.',
23312679 'centralnotice-template-exists' => 'O modelo xa existe.
23322680 Non se engade',
2333 - 'centralnotice-notice-doesnt-exist' => 'O aviso non existe.
2334 -Non hai nada que eliminar',
 2681+ 'centralnotice-notice-doesnt-exist' => 'O aviso non existe.',
 2682+ 'centralnotice-remove-notice-doesnt-exist' => 'O aviso non existe.
 2683+Non hai nada que eliminar.',
23352684 'centralnotice-template-still-bound' => 'O modelo aínda está ligado a un aviso.
23362685 Non se elimina.',
23372686 'centralnotice-template-body' => 'Corpo do modelo:',
@@ -2340,6 +2689,8 @@
23412690 'centralnotice-hours' => 'Hora',
23422691 'centralnotice-min' => 'Minuto',
23432692 'centralnotice-project-lang' => 'Lingua do proxecto',
 2693+ 'centralnotice-select' => 'Seleccionar: $1',
 2694+ 'centralnotice-top-ten-languages' => 'As 10 linguas máis empregadas',
23442695 'centralnotice-project-name' => 'Nome do proxecto',
23452696 'centralnotice-start-date' => 'Data de inicio',
23462697 'centralnotice-start-time' => 'Hora de inicio (UTC)',
@@ -2352,7 +2703,7 @@
23532704 'centralnotice-template-already-exists' => 'O modelo xa está atado á campaña.
23542705 Non se engade',
23552706 'centralnotice-preview-template' => 'Vista previa do modelo',
2356 - 'centralnotice-start-hour' => 'Hora de inicio',
 2707+ 'centralnotice-start-hour' => 'Hora de inicio (GMT)',
23572708 'centralnotice-change-lang' => 'Cambiar a lingua de tradución',
23582709 'centralnotice-weights' => 'Pesos',
23592710 'centralnotice-notice-is-locked' => 'O aviso está bloqueado.
@@ -2369,12 +2720,29 @@
23702721 Engada algún embaixo',
23712722 'centralnotice-no-templates-translate' => 'Non hai modelos que traducir',
23722723 'centralnotice-number-uses' => 'Usos',
 2724+ 'centralnotice-settings' => 'Configuracións',
23732725 'centralnotice-edit-template' => 'Editar o modelo',
 2726+ 'centralnotice-edit-template-summary' => 'Para crear unha mensaxe que se poida traducir, coloque a cadea entre tres corchetes; por exemplo, {{{jimbo-quote}}}.',
23742727 'centralnotice-message' => 'Mensaxe',
23752728 'centralnotice-message-not-set' => 'Mensaxe sen fixar',
23762729 'centralnotice-clone' => 'Clonar',
23772730 'centralnotice-clone-notice' => 'Crear unha copia do modelo',
 2731+ 'centralnotice-clone-name' => 'Nome:',
23782732 'centralnotice-preview-all-template-translations' => 'Mostrar a vista previa de todas as traducións dispoñibles do modelo',
 2733+ 'centralnotice-insert' => 'Inserir: $1',
 2734+ 'centralnotice-hide-button' => 'Botón "{{int:centralnotice-shared-hide}}"',
 2735+ 'centralnotice-collapse-button' => 'Botón "{{int:centralnotice-shared-collapse}}"',
 2736+ 'centralnotice-expand-button' => 'Botón "{{int:centralnotice-shared-expand}}"',
 2737+ 'centralnotice-translate-button' => 'Botón de axudar coas traducións',
 2738+ 'centralnotice-donate-button' => 'Botón de doar',
 2739+ 'centralnotice-expanded-banner' => 'Cartel expandido',
 2740+ 'centralnotice-collapsed-banner' => 'Cartel de contraer',
 2741+ 'centralnotice-banner-display' => 'Mostrar aos:',
 2742+ 'centralnotice-banner-anonymous' => 'Usuarios anónimos',
 2743+ 'centralnotice-banner-logged-in' => 'Usuarios rexistrados',
 2744+ 'centralnotice-banner-type' => 'Tipo de cartel:',
 2745+ 'centralnotice-banner-hidable' => 'Estático/Agochable',
 2746+ 'centralnotice-banner-collapsible' => 'Contraíble',
23792747 'right-centralnotice-admin' => 'Xestionar os avisos centrais',
23802748 'right-centralnotice-translate' => 'Traducir os avisos centrais',
23812749 'action-centralnotice-admin' => 'xestionar os avisos centrais',
@@ -2421,30 +2789,40 @@
24222790 'centralnotice-end-date' => 'Änddatum',
24232791 'centralnotice-enabled' => 'Aktiviert',
24242792 'centralnotice-modify' => 'In Ornig',
 2793+ 'centralnotice-save-banner' => 'Banner spychere',
24252794 'centralnotice-preview' => 'Vorschau',
24262795 'centralnotice-add-new' => 'Fieg e neiji zentrali Mäldig zue',
24272796 'centralnotice-remove' => 'Useneh',
24282797 'centralnotice-translate-heading' => 'Ibersetzig vu „$1“',
24292798 'centralnotice-manage' => 'Zentrali Mäldige verwalte',
 2799+ 'centralnotice-manage-templates' => 'Banner verwalte',
24302800 'centralnotice-add' => 'Zuefiege',
24312801 'centralnotice-add-notice' => 'Zuefiege vun ere Mäldig',
 2802+ 'centralnotice-edit-notice' => 'Kampagne bearbeite',
24322803 'centralnotice-add-template' => 'Zuefiege vun ere Vorlag',
24332804 'centralnotice-show-notices' => 'Zeig Mäldige',
24342805 'centralnotice-list-templates' => 'Vorlage uflischte',
 2806+ 'centralnotice-multiple_languages' => 'mehreri ($1)',
24352807 'centralnotice-translations' => 'Ibersetzige',
24362808 'centralnotice-translate-to' => 'Ibersetze in',
24372809 'centralnotice-translate' => 'Ibersetze',
24382810 'centralnotice-english' => 'Änglisch',
2439 - 'centralnotice-template-name' => 'Name vu dr Vorlag',
 2811+ 'centralnotice-banner-name' => 'Name vu dr Vorlag',
 2812+ 'centralnotice-banner' => 'Banner',
 2813+ 'centralnotice-banner-heading' => 'Banner: $1',
24402814 'centralnotice-templates' => 'Vorlage',
24412815 'centralnotice-weight' => 'Gwicht',
24422816 'centralnotice-locked' => 'Gsperrt',
 2817+ 'centralnotice-notice' => 'Kampagne',
 2818+ 'centralnotice-notice-heading' => 'Kampagne: $1',
24432819 'centralnotice-notices' => 'Mäldige',
24442820 'centralnotice-notice-exists' => 'Mäldig git s scho.
24452821 Nyt zuegfiegt.',
 2822+ 'centralnotice-no-language' => 'Fir d Kampagne isch kei Sproch uusgwehlt wore. Si wird wäge däm nit zuegfiegt.',
24462823 'centralnotice-template-exists' => 'Vorlag git s scho.
24472824 Nyt zuegfiegt.',
2448 - 'centralnotice-notice-doesnt-exist' => 'Mäldig isch nit vorhande.
 2825+ 'centralnotice-notice-doesnt-exist' => 'Kampagne isch nit vorhande.',
 2826+ 'centralnotice-remove-notice-doesnt-exist' => 'Kampagne isch nit vorhande.
24492827 Useneh isch nit megli.',
24502828 'centralnotice-template-still-bound' => 'Vorlag isch no an e Mäldig bunde.
24512829 Useneh nit megli.',
@@ -2455,6 +2833,8 @@
24562834 'centralnotice-hours' => 'Stund',
24572835 'centralnotice-min' => 'Minut',
24582836 'centralnotice-project-lang' => 'Projäktsproch',
 2837+ 'centralnotice-select' => 'Uuswehle: $1',
 2838+ 'centralnotice-top-ten-languages' => 'Top-10-Sproche',
24592839 'centralnotice-project-name' => 'Projäktname',
24602840 'centralnotice-start-date' => 'Startdatum',
24612841 'centralnotice-start-time' => 'Startzyt (UTC)',
@@ -2466,7 +2846,7 @@
24672847 'centralnotice-template-already-exists' => 'Vorlage isch scho an d Kampagne bunde.
24682848 Nit zuegfiegt.',
24692849 'centralnotice-preview-template' => 'Vorschau-Vorlag',
2470 - 'centralnotice-start-hour' => 'Startzyt',
 2850+ 'centralnotice-start-hour' => 'Startzyt (UTC)',
24712851 'centralnotice-change-lang' => 'Ibersetzigssproch ändere',
24722852 'centralnotice-weights' => 'Gwicht',
24732853 'centralnotice-notice-is-locked' => 'Mäldig isch gsperrt.
@@ -2483,12 +2863,29 @@
24842864 Fieg eini zue.',
24852865 'centralnotice-no-templates-translate' => 'S git kei Vorlage, wu Ibersetzige derfir z bearbeite wäre',
24862866 'centralnotice-number-uses' => 'Nutzige',
 2867+ 'centralnotice-settings' => 'Yystellige',
24872868 'centralnotice-edit-template' => 'Vorlag bearbeite',
 2869+ 'centralnotice-edit-template-summary' => 'Go ne lokalisierbari Nochricht aalege, lueg ass es e Bindestrich het in drej gschwerifte Chlammere, z. B. {{{jimbo-quote}}}.',
24882870 'centralnotice-message' => 'Nochricht',
24892871 'centralnotice-message-not-set' => 'Nochricht nit gsetzt',
24902872 'centralnotice-clone' => 'Klon aalege',
24912873 'centralnotice-clone-notice' => 'Leg e Kopii vu dr Vorlag aa',
 2874+ 'centralnotice-clone-name' => 'Name:',
24922875 'centralnotice-preview-all-template-translations' => 'Vorschau vu allene verfiegbare Ibersetzige vun ere Vorlag',
 2876+ 'centralnotice-insert' => 'Yyfiege: $1',
 2877+ 'centralnotice-hide-button' => 'Chnopf {{int:centralnotice-shared-hide}}',
 2878+ 'centralnotice-collapse-button' => 'Chnopf "{{int:centralnotice-shared-collapse}}"',
 2879+ 'centralnotice-expand-button' => 'Chnopf {{int:centralnotice-shared-collapse}}',
 2880+ 'centralnotice-translate-button' => 'Ibersetzigshilfe-Chnopf',
 2881+ 'centralnotice-donate-button' => 'Spändechnopf',
 2882+ 'centralnotice-expanded-banner' => 'Uusklappt Banner',
 2883+ 'centralnotice-collapsed-banner' => 'Yyklappt Banner',
 2884+ 'centralnotice-banner-display' => 'Aazeige fir:',
 2885+ 'centralnotice-banner-anonymous' => 'Nit aagmäldeti Benutzer',
 2886+ 'centralnotice-banner-logged-in' => 'Aagmäldeti Benutzer',
 2887+ 'centralnotice-banner-type' => 'Bannertyp:',
 2888+ 'centralnotice-banner-hidable' => 'Statisch/Uusbländbar',
 2889+ 'centralnotice-banner-collapsible' => 'Yyklappbar',
24932890 'right-centralnotice-admin' => 'Zentrali Mäldige verwalte',
24942891 'right-centralnotice-translate' => 'Zentrali Mäldige ibersetze',
24952892 'action-centralnotice-admin' => 'Zentrali Sytenotize verwalte',
@@ -2498,6 +2895,7 @@
24992896
25002897 /** Hebrew (עברית)
25012898 * @author Rotem Liss
 2899+ * @author Rotemliss
25022900 */
25032901 $messages['he'] = array(
25042902 'centralnotice' => 'ניהול ההודעה המרכזית',
@@ -2524,7 +2922,7 @@
25252923 'centralnotice-translate-to' => 'תרגום ל',
25262924 'centralnotice-translate' => 'תרגום',
25272925 'centralnotice-english' => 'אנגלית',
2528 - 'centralnotice-template-name' => 'שם התבנית',
 2926+ 'centralnotice-banner-name' => 'שם ההודעה',
25292927 'centralnotice-templates' => 'תבניות',
25302928 'centralnotice-weight' => 'משקל',
25312929 'centralnotice-locked' => 'נעול',
@@ -2622,7 +3020,7 @@
26233021 'centralnotice-translate-to' => 'Prevedi na',
26243022 'centralnotice-translate' => 'Prevedi',
26253023 'centralnotice-english' => 'Engleski',
2626 - 'centralnotice-template-name' => 'Naziv predloška',
 3024+ 'centralnotice-banner-name' => 'Naziv predloška',
26273025 'centralnotice-templates' => 'Predlošci',
26283026 'centralnotice-weight' => 'Težina',
26293027 'centralnotice-locked' => 'Zaključano',
@@ -2698,30 +3096,40 @@
26993097 'centralnotice-end-date' => 'Kónčny datum',
27003098 'centralnotice-enabled' => 'Zmóžnjeny',
27013099 'centralnotice-modify' => 'Wotpósłać',
 3100+ 'centralnotice-save-banner' => 'Chorhoj składować',
27023101 'centralnotice-preview' => 'Přehlad',
27033102 'centralnotice-add-new' => 'Nowu centralnu zdźělenku přidać',
27043103 'centralnotice-remove' => 'Wotstronić',
27053104 'centralnotice-translate-heading' => 'Přełožk za $1',
27063105 'centralnotice-manage' => 'Centralne powěsće zrjadować',
 3106+ 'centralnotice-manage-templates' => 'Chorhoje zrjadować',
27073107 'centralnotice-add' => 'Přidać',
27083108 'centralnotice-add-notice' => 'Powěsć přidać',
 3109+ 'centralnotice-edit-notice' => 'Kampanju wobdźěłać',
27093110 'centralnotice-add-template' => 'Předłohu přidać',
27103111 'centralnotice-show-notices' => 'Zdźělenki pokazać',
27113112 'centralnotice-list-templates' => 'Předłohi nalistować',
 3113+ 'centralnotice-multiple_languages' => 'wjacore ($1)',
27123114 'centralnotice-translations' => 'Přełožki',
27133115 'centralnotice-translate-to' => 'Přełožić do',
27143116 'centralnotice-translate' => 'Přełožić',
27153117 'centralnotice-english' => 'Jendźelšćina',
2716 - 'centralnotice-template-name' => 'Mjeno předłohi',
 3118+ 'centralnotice-banner-name' => 'Mjeno předłohi',
 3119+ 'centralnotice-banner' => 'Chorhoj',
 3120+ 'centralnotice-banner-heading' => 'Chorhoj: $1',
27173121 'centralnotice-templates' => 'Předłohi',
27183122 'centralnotice-weight' => 'Waha',
27193123 'centralnotice-locked' => 'Zawrjeny',
 3124+ 'centralnotice-notice' => 'Kampanja',
 3125+ 'centralnotice-notice-heading' => 'Kampanja: $1',
27203126 'centralnotice-notices' => 'Powěsće',
27213127 'centralnotice-notice-exists' => 'Powěsć hižo eksistuje.
27223128 Njepřidawa so.',
 3129+ 'centralnotice-no-language' => 'Za kampanju njeje so rěč wubrała. Přidawa so ničo.',
27233130 'centralnotice-template-exists' => 'Předłoha hižo eksistuje.
27243131 Njepřidawa so.',
2725 - 'centralnotice-notice-doesnt-exist' => 'Powěsć njeeksistuje.
 3132+ 'centralnotice-notice-doesnt-exist' => 'Kampanja njeeksistuje.',
 3133+ 'centralnotice-remove-notice-doesnt-exist' => 'Kampanja njeeksistuje.
27263134 Njewotstroni so ničo.',
27273135 'centralnotice-template-still-bound' => 'Předłoha je hišće na powěsć zwjazana.
27283136 Njewotstronja so.',
@@ -2732,6 +3140,8 @@
27333141 'centralnotice-hours' => 'Hodźina',
27343142 'centralnotice-min' => 'Mjeńšina',
27353143 'centralnotice-project-lang' => 'Projektowa rěč',
 3144+ 'centralnotice-select' => 'Wubrać: $1',
 3145+ 'centralnotice-top-ten-languages' => 'Najlěpšich 10 rěčow',
27363146 'centralnotice-project-name' => 'Projektowe mjeno',
27373147 'centralnotice-start-date' => 'Startowy datum',
27383148 'centralnotice-start-time' => 'Startowy čas (UTC)',
@@ -2744,7 +3154,7 @@
27453155 'centralnotice-template-already-exists' => 'Předłoha je hižo z kampanju zwjazana.
27463156 Njepřidawa so',
27473157 'centralnotice-preview-template' => 'Přehlad předłohi',
2748 - 'centralnotice-start-hour' => 'Startowy čas',
 3158+ 'centralnotice-start-hour' => 'Startowy čas (GMT)',
27493159 'centralnotice-change-lang' => 'Přełožowansku rěč změnić',
27503160 'centralnotice-weights' => 'Wahi',
27513161 'centralnotice-notice-is-locked' => 'Powěsć je zawrjena.
@@ -2762,11 +3172,27 @@
27633173 'centralnotice-no-templates-translate' => 'Njejsu předłohi, za kotrež dyrbjeli so přełožki wobdźěłać',
27643174 'centralnotice-number-uses' => 'Wužića',
27653175 'centralnotice-edit-template' => 'Předłohu wobdźěłać',
 3176+ 'centralnotice-edit-template-summary' => '↓ Zo by lokalizujomnu stronu wutowrił, wobdaj znamješkowy rjećazk z wjazawku z třomi zhibowanymi spinkami. na př. {{{citat-jimbo}}}.',
27663177 'centralnotice-message' => 'Powěsć',
27673178 'centralnotice-message-not-set' => 'Powěsć njepostajena',
27683179 'centralnotice-clone' => 'Klonować',
27693180 'centralnotice-clone-notice' => 'Kopiju předłohi wutworić',
 3181+ 'centralnotice-clone-name' => 'Mjeno:',
27703182 'centralnotice-preview-all-template-translations' => 'Přehlad wšěch k dispoziciji stejacych přełožkow předłohi',
 3183+ 'centralnotice-insert' => 'Zasunyć: $1',
 3184+ 'centralnotice-hide-button' => 'Tłóčatko {{int:centralnotice-shared-hide}}',
 3185+ 'centralnotice-collapse-button' => 'Tłóčatko {{int:centralnotice-shared-collapse}}',
 3186+ 'centralnotice-expand-button' => 'Tłóčatko {{int:centralnotice-shared-expand}}',
 3187+ 'centralnotice-translate-button' => 'Tłóčatko přełožowanskeje pomocy',
 3188+ 'centralnotice-donate-button' => 'Darjenske tłóčatko',
 3189+ 'centralnotice-expanded-banner' => 'Rozfałdowana chorhoj',
 3190+ 'centralnotice-collapsed-banner' => 'Fałdowana chorhoj',
 3191+ 'centralnotice-banner-display' => 'Zwobraznić za:',
 3192+ 'centralnotice-banner-anonymous' => 'Anonymni wužiwarjo',
 3193+ 'centralnotice-banner-logged-in' => 'Přizjewjeni wužiwarjo',
 3194+ 'centralnotice-banner-type' => 'Chorhojowy typ:',
 3195+ 'centralnotice-banner-hidable' => 'Statiski/Chowajomny',
 3196+ 'centralnotice-banner-collapsible' => 'Fałdujomny',
27713197 'right-centralnotice-admin' => 'Centralne powěsće zrjadować',
27723198 'right-centralnotice-translate' => 'Centralne powěsće přełožić',
27733199 'action-centralnotice-admin' => 'Centralne powěsće zrjadować',
@@ -2802,7 +3228,7 @@
28033229 'centralnotice-translate-to' => 'Lefordítás',
28043230 'centralnotice-translate' => 'Lefordítás',
28053231 'centralnotice-english' => 'angol',
2806 - 'centralnotice-template-name' => 'Sablonnév',
 3232+ 'centralnotice-banner-name' => 'Sablonnév',
28073233 'centralnotice-templates' => 'Sablonok',
28083234 'centralnotice-weight' => 'Súly',
28093235 'centralnotice-locked' => 'Lezárva',
@@ -2869,84 +3295,112 @@
28703296 */
28713297 $messages['ia'] = array(
28723298 'centralnotice' => 'Administration de avisos central',
2873 - 'noticetemplate' => 'Patrono de avisos central',
 3299+ 'noticetemplate' => 'Bandiera pro avisos central',
28743300 'centralnotice-desc' => 'Adde un aviso de sito central',
28753301 'centralnotice-summary' => 'Iste modulo permitte modificar le avisos central actualmente configurate.
28763302 Illo pote tamben esser usate pro adder o remover avisos ancian.',
2877 - 'centralnotice-query' => 'Modificar avisos actual',
2878 - 'centralnotice-notice-name' => 'Nomine del aviso',
 3303+ 'centralnotice-query' => 'Modificar campanias actual',
 3304+ 'centralnotice-notice-name' => 'Nomine del campania',
28793305 'centralnotice-end-date' => 'Data de fin',
28803306 'centralnotice-enabled' => 'Active',
28813307 'centralnotice-modify' => 'Submitter',
 3308+ 'centralnotice-save-banner' => 'Salveguardar bandiera',
28823309 'centralnotice-preview' => 'Previsualisar',
2883 - 'centralnotice-add-new' => 'Adder un nove aviso central',
 3310+ 'centralnotice-add-new' => 'Adder un nove campania',
28843311 'centralnotice-remove' => 'Remover',
28853312 'centralnotice-translate-heading' => 'Traduction de $1',
2886 - 'centralnotice-manage' => 'Gerer aviso central',
 3313+ 'centralnotice-manage' => 'Gerer campanias',
 3314+ 'centralnotice-manage-templates' => 'Gerer bandieras',
28873315 'centralnotice-add' => 'Adder',
2888 - 'centralnotice-add-notice' => 'Adder un aviso',
2889 - 'centralnotice-add-template' => 'Adder un patrono',
2890 - 'centralnotice-show-notices' => 'Monstrar avisos',
2891 - 'centralnotice-list-templates' => 'Listar patronos',
 3316+ 'centralnotice-add-notice' => 'Adder un campania',
 3317+ 'centralnotice-edit-notice' => 'Modificar campania',
 3318+ 'centralnotice-add-template' => 'Adder un bandiera',
 3319+ 'centralnotice-show-notices' => 'Monstrar campanias',
 3320+ 'centralnotice-list-templates' => 'Listar bandieras',
 3321+ 'centralnotice-multiple_languages' => 'multiple ($1)',
28923322 'centralnotice-translations' => 'Traductiones',
28933323 'centralnotice-translate-to' => 'Traducer in',
28943324 'centralnotice-translate' => 'Traducer',
28953325 'centralnotice-english' => 'Anglese',
2896 - 'centralnotice-template-name' => 'Nomine del patrono',
2897 - 'centralnotice-templates' => 'Patronos',
 3326+ 'centralnotice-banner-name' => 'Nomine del bandiera',
 3327+ 'centralnotice-banner' => 'Bandiera',
 3328+ 'centralnotice-banner-heading' => 'Bandiera: $1',
 3329+ 'centralnotice-templates' => 'Bandieras',
28983330 'centralnotice-weight' => 'Peso',
28993331 'centralnotice-locked' => 'Serrate',
2900 - 'centralnotice-notices' => 'Avisos',
2901 - 'centralnotice-notice-exists' => 'Aviso existe ja.
2902 -Non es addite',
2903 - 'centralnotice-template-exists' => 'Patrono existe ja.
2904 -Non es addite',
2905 - 'centralnotice-notice-doesnt-exist' => 'Aviso non existe.
2906 -Nihil a remover',
2907 - 'centralnotice-template-still-bound' => 'Patrono es ancora ligate a un aviso.
 3332+ 'centralnotice-notice' => 'Campania',
 3333+ 'centralnotice-notice-heading' => 'Campania: $1',
 3334+ 'centralnotice-notices' => 'Campanias',
 3335+ 'centralnotice-notice-exists' => 'Le campania ja existe.
 3336+Non es addite.',
 3337+ 'centralnotice-no-language' => 'Nulle lingua esseva seligite pro le campania. Non es addite.',
 3338+ 'centralnotice-template-exists' => 'Le bandiera ja existe.
 3339+Non es addite.',
 3340+ 'centralnotice-notice-doesnt-exist' => 'Campania non existe.',
 3341+ 'centralnotice-remove-notice-doesnt-exist' => 'Campania non existe.
 3342+Nihil a remover.',
 3343+ 'centralnotice-template-still-bound' => 'Le bandiera es ancora ligate a un campania.
29083344 Non es removite.',
2909 - 'centralnotice-template-body' => 'Corpore del patrono:',
 3345+ 'centralnotice-template-body' => 'Texto del bandiera:',
29103346 'centralnotice-day' => 'Die',
29113347 'centralnotice-year' => 'Anno',
29123348 'centralnotice-month' => 'Mense',
29133349 'centralnotice-hours' => 'Hora',
29143350 'centralnotice-min' => 'Minuta',
29153351 'centralnotice-project-lang' => 'Lingua del projecto',
 3352+ 'centralnotice-select' => 'Seliger: $1',
 3353+ 'centralnotice-top-ten-languages' => 'Le prime 10 linguas',
29163354 'centralnotice-project-name' => 'Nomine del projecto',
29173355 'centralnotice-start-date' => 'Data de initio',
2918 - 'centralnotice-start-time' => 'Tempore de initio (UTC)',
2919 - 'centralnotice-assigned-templates' => 'Patronos assignate',
2920 - 'centralnotice-no-templates' => 'Nulle patrono trovate.
 3356+ 'centralnotice-start-time' => 'Hora de initio (UTC)',
 3357+ 'centralnotice-assigned-templates' => 'Bandieras assignate',
 3358+ 'centralnotice-no-templates' => 'Nulle bandiera trovate.
29213359 Adde alcunes!',
2922 - 'centralnotice-no-templates-assigned' => 'Nulle patronos assignate al aviso.
 3360+ 'centralnotice-no-templates-assigned' => 'Nulle bandiera assignate al campania.
29233361 Adde alcunes!',
2924 - 'centralnotice-available-templates' => 'Patronos disponibile',
2925 - 'centralnotice-template-already-exists' => 'Le patrono es ja ligate a un campania.
2926 -Non es addite',
2927 - 'centralnotice-preview-template' => 'Previsualisar patrono',
2928 - 'centralnotice-start-hour' => 'Tempore de initio',
 3362+ 'centralnotice-available-templates' => 'Bandieras disponibile',
 3363+ 'centralnotice-template-already-exists' => 'Le bandiera es ja ligate a un campania.
 3364+Non es addite.',
 3365+ 'centralnotice-preview-template' => 'Previsualisar bandiera',
 3366+ 'centralnotice-start-hour' => 'Hora de initio (GMT)',
29293367 'centralnotice-change-lang' => 'Cambiar lingua de traduction',
29303368 'centralnotice-weights' => 'Pesos',
2931 - 'centralnotice-notice-is-locked' => 'Aviso es serrate.
2932 -Non es removite',
2933 - 'centralnotice-overlap' => 'Aviso imbrica in le tempore de un altere aviso.
2934 -Non es addite',
 3369+ 'centralnotice-notice-is-locked' => 'Le campania es serrate.
 3370+Non es removite.',
 3371+ 'centralnotice-overlap' => 'Le campania coincide con le tempore de un altere campania.
 3372+Non es addite.',
29353373 'centralnotice-invalid-date-range' => 'Intervallo incorrecte de datas.
29363374 Non es actualisate',
29373375 'centralnotice-null-string' => 'Non pote adder un catena de characteres vacue.
29383376 Non es addite',
2939 - 'centralnotice-confirm-delete' => 'Es tu secur que tu vole deler iste articulo?
 3377+ 'centralnotice-confirm-delete' => 'Es tu secur que tu vole deler iste elemento?
29403378 Iste action essera irrecuperabile.',
2941 - 'centralnotice-no-notices-exist' => 'Nulle aviso existe.
2942 -Adde un infra',
2943 - 'centralnotice-no-templates-translate' => 'Non existe alcun patrono a traducer',
 3379+ 'centralnotice-no-notices-exist' => 'Nulle campania existe.
 3380+Adde un hic infra.',
 3381+ 'centralnotice-no-templates-translate' => 'Non existe bandieras pro le quales modificar traductiones.',
29443382 'centralnotice-number-uses' => 'Usos',
2945 - 'centralnotice-edit-template' => 'Modificar patrono',
 3383+ 'centralnotice-edit-template' => 'Modificar bandiera',
 3384+ 'centralnotice-edit-template-summary' => 'Pro crear un message localisabile, include un texto con tracto de union in tres accolladas, p.ex. {{{jimbo-quote}}}.',
29463385 'centralnotice-message' => 'Message',
29473386 'centralnotice-message-not-set' => 'Message non definite',
29483387 'centralnotice-clone' => 'Clonar',
2949 - 'centralnotice-clone-notice' => 'Crear un copia del patrono',
2950 - 'centralnotice-preview-all-template-translations' => 'Previsualiar tote le traductiones disponibile del patrono',
 3388+ 'centralnotice-clone-notice' => 'Crear un copia del bandiera',
 3389+ 'centralnotice-clone-name' => 'Nomine:',
 3390+ 'centralnotice-preview-all-template-translations' => 'Previsualiar tote le traductiones disponibile del bandiera',
 3391+ 'centralnotice-insert' => 'Inserer: $1',
 3392+ 'centralnotice-hide-button' => 'Button "{{int:centralnotice-shared-hide}}"',
 3393+ 'centralnotice-collapse-button' => 'Button "{{int:centralnotice-shared-collapse}}"',
 3394+ 'centralnotice-expand-button' => 'Button "{{int:centralnotice-shared-expand}}"',
 3395+ 'centralnotice-translate-button' => 'Button "Adjuta de traduction"',
 3396+ 'centralnotice-donate-button' => 'Button "Donar"',
 3397+ 'centralnotice-expanded-banner' => 'Bandiera expandite',
 3398+ 'centralnotice-collapsed-banner' => 'Bandiera plicate',
 3399+ 'centralnotice-banner-display' => 'Presentar a:',
 3400+ 'centralnotice-banner-anonymous' => 'Usatores anonyme',
 3401+ 'centralnotice-banner-logged-in' => 'Usatores authenticate',
 3402+ 'centralnotice-banner-type' => 'Typo de bandiera:',
 3403+ 'centralnotice-banner-hidable' => 'Static/Celabile',
 3404+ 'centralnotice-banner-collapsible' => 'Plicabile',
29513405 'right-centralnotice-admin' => 'Gerer avisos central',
29523406 'right-centralnotice-translate' => 'Traducer avisos central',
29533407 'action-centralnotice-admin' => 'gerer avisos central',
@@ -2956,6 +3410,8 @@
29573411
29583412 /** Indonesian (Bahasa Indonesia)
29593413 * @author Bennylin
 3414+ * @author Farras
 3415+ * @author Irwangatot
29603416 * @author IvanLanin
29613417 * @author Rex
29623418 */
@@ -2970,31 +3426,41 @@
29713427 'centralnotice-end-date' => 'Tanggal selesai',
29723428 'centralnotice-enabled' => 'Diaktifkan',
29733429 'centralnotice-modify' => 'Kirim',
 3430+ 'centralnotice-save-banner' => 'Panji simpan',
29743431 'centralnotice-preview' => 'Pratayang',
29753432 'centralnotice-add-new' => 'Buat pengumuman sentral baru',
29763433 'centralnotice-remove' => 'Hapus',
29773434 'centralnotice-translate-heading' => 'Terjemahan untuk $1',
29783435 'centralnotice-manage' => 'Pengaturan pengumuman sentral',
 3436+ 'centralnotice-manage-templates' => 'Kelola spanduk',
29793437 'centralnotice-add' => 'Tambahkan',
29803438 'centralnotice-add-notice' => 'Tambah pengumuman',
 3439+ 'centralnotice-edit-notice' => 'Sunting kampanye',
29813440 'centralnotice-add-template' => 'Tambah templat',
29823441 'centralnotice-show-notices' => 'Tampilkan pengumuman',
29833442 'centralnotice-list-templates' => 'Daftar templat',
 3443+ 'centralnotice-multiple_languages' => 'ganda ($1)',
29843444 'centralnotice-translations' => 'Terjemahan',
29853445 'centralnotice-translate-to' => 'Terjemahkan ke',
29863446 'centralnotice-translate' => 'Terjemahkan',
29873447 'centralnotice-english' => 'Bahasa Inggris',
2988 - 'centralnotice-template-name' => 'Nama templat',
 3448+ 'centralnotice-banner-name' => 'Nama templat',
 3449+ 'centralnotice-banner' => 'Spanduk',
 3450+ 'centralnotice-banner-heading' => 'Panji: $1',
29893451 'centralnotice-templates' => 'Templat',
29903452 'centralnotice-weight' => 'Bobot',
29913453 'centralnotice-locked' => 'Terkunci',
 3454+ 'centralnotice-notice' => 'Kampanye',
 3455+ 'centralnotice-notice-heading' => 'Kampanye: $1',
29923456 'centralnotice-notices' => 'Pengumuman',
29933457 'centralnotice-notice-exists' => 'Pengumuman sudah ada.
29943458 Batal menambahkan',
 3459+ 'centralnotice-no-language' => 'Tidak ada bahasa yang dipilih untuk kampanye. Tidak menambahkan.',
29953460 'centralnotice-template-exists' => 'Templat sudah ada.
29963461 Batal menambahkan',
2997 - 'centralnotice-notice-doesnt-exist' => 'Pengumuman tidak ditemukan.
2998 -Batal menghapus',
 3462+ 'centralnotice-notice-doesnt-exist' => 'Kampanye tidak ditemukan.',
 3463+ 'centralnotice-remove-notice-doesnt-exist' => 'Kampanye tidak ditemukan.
 3464+Tidak ada yang perlu dihapus.',
29993465 'centralnotice-template-still-bound' => 'Templat masih digunakan dalam suatu pengumuman.
30003466 Batal menghapus',
30013467 'centralnotice-template-body' => 'Isi templat:',
@@ -3004,6 +3470,8 @@
30053471 'centralnotice-hours' => 'Jam',
30063472 'centralnotice-min' => 'Menit',
30073473 'centralnotice-project-lang' => 'Bahasa proyek',
 3474+ 'centralnotice-select' => 'Pilih: $1',
 3475+ 'centralnotice-top-ten-languages' => '10 bahasa teratas',
30083476 'centralnotice-project-name' => 'Nama proyek',
30093477 'centralnotice-start-date' => 'Tanggal mulai',
30103478 'centralnotice-start-time' => 'Waktu mulai (UTC)',
@@ -3016,7 +3484,7 @@
30173485 'centralnotice-template-already-exists' => 'Templat sudah digunakan dalam kampanye.
30183486 Batal menambahkan',
30193487 'centralnotice-preview-template' => 'Lihat pratayang templat',
3020 - 'centralnotice-start-hour' => 'Waktu mulai',
 3488+ 'centralnotice-start-hour' => 'Waktu mulai (GMT)',
30213489 'centralnotice-change-lang' => 'Ubah bahasa terjemahan',
30223490 'centralnotice-weights' => 'Bobot',
30233491 'centralnotice-notice-is-locked' => 'Pengumuman terkunci.
@@ -3034,11 +3502,27 @@
30353503 'centralnotice-no-templates-translate' => 'Tidak ada templat yang dapat diterjemahkan',
30363504 'centralnotice-number-uses' => 'Menggunakan',
30373505 'centralnotice-edit-template' => 'Sunting templat',
 3506+ 'centralnotice-edit-template-summary' => 'Untuk membuat dilokalisasi pesan, sertakan string ditulis dengan tanda penghubung di tiga kurung, misalnya {{{jimbo-quote}}}.',
30383507 'centralnotice-message' => 'Pesan',
30393508 'centralnotice-message-not-set' => 'Pengaturan pesan tidak dilakukan',
30403509 'centralnotice-clone' => 'Duplikat',
30413510 'centralnotice-clone-notice' => 'Buat duplikat templat ini',
 3511+ 'centralnotice-clone-name' => 'Nama:',
30423512 'centralnotice-preview-all-template-translations' => 'Lihat pratayang semua terjemahan templat yang tersedia',
 3513+ 'centralnotice-insert' => 'Sisipkan: $1',
 3514+ 'centralnotice-hide-button' => 'Tombol {{int:centralnotice-shared-hide}}',
 3515+ 'centralnotice-collapse-button' => 'Tombol {{int:centralnotice-shared-collapse}}',
 3516+ 'centralnotice-expand-button' => 'Tombol {{int:centralnotice-shared-expand}}',
 3517+ 'centralnotice-translate-button' => 'Tombol bantu terjemahkan',
 3518+ 'centralnotice-donate-button' => 'Tombol sumbangan',
 3519+ 'centralnotice-expanded-banner' => 'Panji perluas',
 3520+ 'centralnotice-collapsed-banner' => 'Panji buka',
 3521+ 'centralnotice-banner-display' => 'Tampilkan ke:',
 3522+ 'centralnotice-banner-anonymous' => 'Pengguna anonim',
 3523+ 'centralnotice-banner-logged-in' => 'Pengguna telah masuk log',
 3524+ 'centralnotice-banner-type' => 'Jenis panji:',
 3525+ 'centralnotice-banner-hidable' => 'Statis/Dapat disembunyikan',
 3526+ 'centralnotice-banner-collapsible' => 'Dapat dibuka',
30433527 'right-centralnotice-admin' => 'Mengatur pengumuman sentral',
30443528 'right-centralnotice-translate' => 'Menerjemahkan pengumuman sentral',
30453529 'action-centralnotice-admin' => 'mengatur pengumuman sentral',
@@ -3046,9 +3530,29 @@
30473531 'centralnotice-preferred' => 'Preferensi',
30483532 );
30493533
3050 -/** Igbo (Igbo) */
 3534+/** Igbo (Igbo)
 3535+ * @author Ukabia
 3536+ */
30513537 $messages['ig'] = array(
 3538+ 'centralnotice-modify' => 'Dànyé',
 3539+ 'centralnotice-preview' => 'Lètú',
 3540+ 'centralnotice-remove' => 'Wéfù',
 3541+ 'centralnotice-add' => 'Tinyé',
 3542+ 'centralnotice-translations' => 'Nkuwaria na asụsụ ozor',
 3543+ 'centralnotice-translate-to' => 'Kuwaria na',
 3544+ 'centralnotice-translate' => 'Kuwaria na asụsụ ozor',
 3545+ 'centralnotice-english' => 'Inglish',
 3546+ 'centralnotice-weight' => 'Ọ zá',
 3547+ 'centralnotice-locked' => 'Gbàchịrị',
 3548+ 'centralnotice-day' => 'Úbọchi',
 3549+ 'centralnotice-year' => 'Afọr',
 3550+ 'centralnotice-month' => 'Önwa',
 3551+ 'centralnotice-hours' => 'Àmànì',
 3552+ 'centralnotice-project-lang' => 'Asụsụ orürü',
 3553+ 'centralnotice-project-name' => 'Áhà orürü',
 3554+ 'centralnotice-start-date' => 'Bìdó ubochi',
30523555 'centralnotice-message' => 'Ozi',
 3556+ 'centralnotice-clone-name' => 'Áhà',
30533557 );
30543558
30553559 /** Ido (Ido)
@@ -3068,6 +3572,7 @@
30693573 'centralnotice-month' => 'Monato',
30703574 'centralnotice-hours' => 'Horo',
30713575 'centralnotice-min' => 'Minuto',
 3576+ 'centralnotice-number-uses' => 'Uzadi',
30723577 );
30733578
30743579 /** Icelandic (Íslenska)
@@ -3107,7 +3612,7 @@
31083613 'centralnotice-translate-to' => 'Traduci in',
31093614 'centralnotice-translate' => 'Traduci',
31103615 'centralnotice-english' => 'Inglese',
3111 - 'centralnotice-template-name' => 'Nome template',
 3616+ 'centralnotice-banner-name' => 'Nome template',
31123617 'centralnotice-templates' => 'Template',
31133618 'centralnotice-weight' => 'Dimensione',
31143619 'centralnotice-locked' => 'Bloccato',
@@ -3163,6 +3668,8 @@
31643669 * @author Fryed-peach
31653670 * @author Hosiryuhosi
31663671 * @author JtFuruhata
 3672+ * @author Klutzy
 3673+ * @author 青子守歌
31673674 */
31683675 $messages['ja'] = array(
31693676 'centralnotice' => '中央管理通知の管理',
@@ -3174,28 +3681,39 @@
31753682 'centralnotice-end-date' => '終了日',
31763683 'centralnotice-enabled' => '有効',
31773684 'centralnotice-modify' => '投稿',
 3685+ 'centralnotice-save-banner' => 'テンプレートを保存',
31783686 'centralnotice-preview' => 'プレビュー',
3179 - 'centralnotice-add-new' => '新しい中央管理通知を追加する',
 3687+ 'centralnotice-add-new' => '新しい通知を追加する',
31803688 'centralnotice-remove' => '除去',
31813689 'centralnotice-translate-heading' => '$1の翻訳',
3182 - 'centralnotice-manage' => '中央管理通知の管理',
 3690+ 'centralnotice-manage' => '通知の管理',
 3691+ 'centralnotice-manage-templates' => 'テンプレートを管理',
31833692 'centralnotice-add' => '追加',
31843693 'centralnotice-add-notice' => '通知を追加',
 3694+ 'centralnotice-edit-notice' => '通知を編集',
31853695 'centralnotice-add-template' => 'テンプレートを追加',
31863696 'centralnotice-show-notices' => '通知を表示',
31873697 'centralnotice-list-templates' => 'テンプレートを一覧表示',
 3698+ 'centralnotice-multiple_languages' => '複数($1)',
31883699 'centralnotice-translations' => '翻訳',
31893700 'centralnotice-translate-to' => '翻訳先',
31903701 'centralnotice-translate' => '翻訳',
31913702 'centralnotice-english' => '英語',
3192 - 'centralnotice-template-name' => 'テンプレート名',
 3703+ 'centralnotice-banner-name' => 'テンプレート名',
 3704+ 'centralnotice-banner' => 'テンプレート',
 3705+ 'centralnotice-banner-heading' => 'テンプレート:$1',
31933706 'centralnotice-templates' => 'テンプレート',
31943707 'centralnotice-weight' => '重さ',
31953708 'centralnotice-locked' => 'ロック中',
 3709+ 'centralnotice-notice' => '通知',
 3710+ 'centralnotice-notice-heading' => '通知:$1',
31963711 'centralnotice-notices' => '通知一覧',
31973712 'centralnotice-notice-exists' => '通知がすでに存在します。追加できませんでした。',
 3713+ 'centralnotice-no-language' => '通知する言語が指定されませんでした。追加されません。',
31983714 'centralnotice-template-exists' => 'テンプレートがすでに存在します。追加できませんでした。',
3199 - 'centralnotice-notice-doesnt-exist' => '通知が存在しません。除去できませんでした。',
 3715+ 'centralnotice-notice-doesnt-exist' => '通知が存在しません。',
 3716+ 'centralnotice-remove-notice-doesnt-exist' => '通知は存在しません。
 3717+除去できませんでした。',
32003718 'centralnotice-template-still-bound' => 'そのテンプレートはまだ通知に使用されています。除去できませんでした。',
32013719 'centralnotice-template-body' => '翻訳本文:',
32023720 'centralnotice-day' => '日',
@@ -3204,6 +3722,8 @@
32053723 'centralnotice-hours' => '時',
32063724 'centralnotice-min' => '分',
32073725 'centralnotice-project-lang' => 'プロジェクト言語',
 3726+ 'centralnotice-select' => '選択:$1',
 3727+ 'centralnotice-top-ten-languages' => '上位10言語',
32083728 'centralnotice-project-name' => 'プロジェクト名',
32093729 'centralnotice-start-date' => '開始日',
32103730 'centralnotice-start-time' => '開始時間 (UTC)',
@@ -3213,7 +3733,7 @@
32143734 'centralnotice-available-templates' => '利用可能なテンプレート',
32153735 'centralnotice-template-already-exists' => 'テンプレートが特定の目的に使用されています。追加できません。',
32163736 'centralnotice-preview-template' => 'テンプレートをプレビューする',
3217 - 'centralnotice-start-hour' => '開始時刻',
 3737+ 'centralnotice-start-hour' => '開始時刻(UTC)',
32183738 'centralnotice-change-lang' => '翻訳言語を変更する',
32193739 'centralnotice-weights' => '重要性',
32203740 'centralnotice-notice-is-locked' => '通知がロックされています。除去できません。',
@@ -3225,11 +3745,27 @@
32263746 'centralnotice-no-templates-translate' => '翻訳すべきテンプレートはありません。',
32273747 'centralnotice-number-uses' => '使用目的',
32283748 'centralnotice-edit-template' => 'テンプレートを編集する',
 3749+ 'centralnotice-edit-template-summary' => 'ローカライズ可能なメッセージを作成するには、ハイフンで結合した文字列を3つの波括弧で囲います。例: {{{jimbo-quote}}}。',
32293750 'centralnotice-message' => 'メッセージ',
32303751 'centralnotice-message-not-set' => 'メッセージ未指定',
32313752 'centralnotice-clone' => '複製',
32323753 'centralnotice-clone-notice' => 'テンプレートの複製を作成する',
 3754+ 'centralnotice-clone-name' => '名前:',
32333755 'centralnotice-preview-all-template-translations' => 'テンプレートのすべての利用可能な翻訳をプレビューする',
 3756+ 'centralnotice-insert' => '挿入:$1',
 3757+ 'centralnotice-hide-button' => '{{int:centralnotice-shared-hide}}ボタン',
 3758+ 'centralnotice-collapse-button' => '{{int:centralnotice-shared-collapse}}ボタン',
 3759+ 'centralnotice-expand-button' => '{{int:centralnotice-shared-expand}}ボタン',
 3760+ 'centralnotice-translate-button' => '翻訳協力ボタン',
 3761+ 'centralnotice-donate-button' => '寄付ボタン',
 3762+ 'centralnotice-expanded-banner' => '展開されたテンプレート',
 3763+ 'centralnotice-collapsed-banner' => '折りたたまれたテンプレート',
 3764+ 'centralnotice-banner-display' => '表示:',
 3765+ 'centralnotice-banner-anonymous' => '匿名利用者',
 3766+ 'centralnotice-banner-logged-in' => 'ログイン利用者',
 3767+ 'centralnotice-banner-type' => 'テンプレートの種類:',
 3768+ 'centralnotice-banner-hidable' => '固定/非表示可',
 3769+ 'centralnotice-banner-collapsible' => '折りたたみ',
32343770 'right-centralnotice-admin' => '中央管理通知の管理',
32353771 'right-centralnotice-translate' => '中央管理通知の翻訳',
32363772 'action-centralnotice-admin' => '中央管理通知の管理',
@@ -3273,7 +3809,7 @@
32743810 'centralnotice-translate-to' => 'Terjemahaké menyang',
32753811 'centralnotice-translate' => 'Terjemah',
32763812 'centralnotice-english' => 'Basa Inggris',
3277 - 'centralnotice-template-name' => 'Jeneng cithakan',
 3813+ 'centralnotice-banner-name' => 'Jeneng cithakan',
32783814 'centralnotice-templates' => 'Cithakan',
32793815 'centralnotice-weight' => 'Bobot',
32803816 'centralnotice-locked' => 'Kakunci',
@@ -3356,7 +3892,7 @@
33573893 'centralnotice-translate-to' => 'გადათარგმნა',
33583894 'centralnotice-translate' => 'თარგმნა',
33593895 'centralnotice-english' => 'ინგლისური',
3360 - 'centralnotice-template-name' => 'თარგების სახელი',
 3896+ 'centralnotice-banner-name' => 'თარგების სახელი',
33613897 'centralnotice-templates' => 'თარგები',
33623898 'centralnotice-weight' => 'სიგანე',
33633899 'centralnotice-locked' => 'დაბლოკილი',
@@ -3387,6 +3923,7 @@
33883924 'centralnotice-message-not-set' => 'შეტყობინება არ არის',
33893925 'centralnotice-clone' => 'კლონირება',
33903926 'centralnotice-clone-notice' => 'თარგის ასლის შექმნა',
 3927+ 'right-centralnotice-translate' => 'ცენტრალური შეტყობინებების თარგმანი',
33913928 );
33923929
33933930 /** Khmer (ភាសាខ្មែរ)
@@ -3406,7 +3943,7 @@
34073944 'centralnotice-translate-to' => 'បកប្រែ​ទៅ',
34083945 'centralnotice-translate' => 'បកប្រែ',
34093946 'centralnotice-english' => 'ភាសាអង់គ្លេស',
3410 - 'centralnotice-template-name' => 'ឈ្មោះទំព័រគំរូ',
 3947+ 'centralnotice-banner-name' => 'ឈ្មោះទំព័រគំរូ',
34113948 'centralnotice-templates' => 'ទំព័រគំរូ',
34123949 'centralnotice-weight' => 'ទម្ងន់​',
34133950 'centralnotice-locked' => 'បានចាក់សោ',
@@ -3442,6 +3979,7 @@
34433980 );
34443981
34453982 /** Korean (한국어)
 3983+ * @author Gapo
34463984 * @author Klutzy
34473985 * @author Kwj2772
34483986 * @author Yknok29
@@ -3461,8 +3999,10 @@
34624000 'centralnotice-remove' => '제거',
34634001 'centralnotice-translate-heading' => '$1에 대한 번역',
34644002 'centralnotice-manage' => '중앙 공지 관리',
 4003+ 'centralnotice-manage-templates' => '배너 관리하기',
34654004 'centralnotice-add' => '추가',
34664005 'centralnotice-add-notice' => '알림을 추가하기',
 4006+ 'centralnotice-edit-notice' => '전체공지 편집',
34674007 'centralnotice-add-template' => '틀을 추가하기',
34684008 'centralnotice-show-notices' => '공지 표시하기',
34694009 'centralnotice-list-templates' => '템플릿 목록 표시하기',
@@ -3470,15 +4010,17 @@
34714011 'centralnotice-translate-to' => '번역할 언어',
34724012 'centralnotice-translate' => '번역하기',
34734013 'centralnotice-english' => '영어',
3474 - 'centralnotice-template-name' => '틀 이름',
 4014+ 'centralnotice-banner-name' => '틀 이름',
34754015 'centralnotice-templates' => '틀',
34764016 'centralnotice-weight' => '중요도',
34774017 'centralnotice-locked' => '잠김',
 4018+ 'centralnotice-notice' => '전체공지',
34784019 'centralnotice-notices' => '공지',
34794020 'centralnotice-notice-exists' => '이미 공지가 존재합니다. 공지를 추가할 수 없습니다.',
34804021 'centralnotice-template-exists' => '틀이 이미 존재합니다.
34814022 추가하지 않았습니다.',
3482 - 'centralnotice-notice-doesnt-exist' => '공지가 없습니다. 삭제할 수 없습니다.',
 4023+ 'centralnotice-notice-doesnt-exist' => '전체공지가 존재하지 않습니다.',
 4024+ 'centralnotice-remove-notice-doesnt-exist' => '전체공지가 존재하지 않습니다. 삭제할 수 없습니다.',
34834025 'centralnotice-template-still-bound' => '템플릿이 공지에 사용되고 있습니다. 삭제할 수 없습니다.',
34844026 'centralnotice-template-body' => '템플릿 내용:',
34854027 'centralnotice-day' => '일',
@@ -3496,7 +4038,7 @@
34974039 'centralnotice-available-templates' => '사용 가능한 템플릿 목록',
34984040 'centralnotice-template-already-exists' => '템플릿이 이미 설정되어 있습니다. 추가할 수 없습니다.',
34994041 'centralnotice-preview-template' => '틀 미리 보기',
3500 - 'centralnotice-start-hour' => '시작 시간',
 4042+ 'centralnotice-start-hour' => '시작 시간 (GMT)',
35014043 'centralnotice-change-lang' => '번역할 언어 변경',
35024044 'centralnotice-weights' => '중요도',
35034045 'centralnotice-notice-is-locked' => '공지가 잠겼습니다.
@@ -3510,10 +4052,12 @@
35114053 'centralnotice-no-templates-translate' => '번역해야 할 템플릿이 없습니다.',
35124054 'centralnotice-number-uses' => '사용 횟수',
35134055 'centralnotice-edit-template' => '틀 편집하기',
 4056+ 'centralnotice-edit-template-summary' => '번역이 가능한 메세지를 만드려면, {{{jimbo-quote}}}와 같이 중괄호로 세 번 감싸주면 됩니다.',
35144057 'centralnotice-message' => '메시지',
35154058 'centralnotice-message-not-set' => '메시지가 정의되지 않았습니다.',
35164059 'centralnotice-clone' => '사본',
35174060 'centralnotice-clone-notice' => '이 틀의 사본을 만들기',
 4061+ 'centralnotice-clone-name' => '이름:',
35184062 'centralnotice-preview-all-template-translations' => '템플렛의 모든 번역 미리 보기',
35194063 'right-centralnotice-admin' => '중앙 공지 관리',
35204064 'right-centralnotice-translate' => '중앙 공지 번역',
@@ -3550,7 +4094,7 @@
35514095 'centralnotice-translate-to' => 'Övversäze noh',
35524096 'centralnotice-translate' => 'Övversäze',
35534097 'centralnotice-english' => 'Englesch',
3554 - 'centralnotice-template-name' => 'Dä Schablon iere Name',
 4098+ 'centralnotice-banner-name' => 'Dä Schablon iere Name',
35554099 'centralnotice-templates' => 'Schablone',
35564100 'centralnotice-weight' => 'Jeweesch',
35574101 'centralnotice-locked' => 'jespert',
@@ -3618,10 +4162,10 @@
36194163 */
36204164 $messages['kw'] = array(
36214165 'centralnotice-english' => 'Sowsnek',
3622 - 'centralnotice-day' => 'Dydh',
 4166+ 'centralnotice-day' => 'Dedh',
36234167 'centralnotice-year' => 'Bledhen',
36244168 'centralnotice-month' => 'Mis',
3625 - 'centralnotice-edit-template' => 'Chanjya skantlyn',
 4169+ 'centralnotice-edit-template' => 'Chanjya an baner',
36264170 );
36274171
36284172 /** Luxembourgish (Lëtzebuergesch)
@@ -3638,33 +4182,43 @@
36394183 'centralnotice-end-date' => 'Schlussdatum',
36404184 'centralnotice-enabled' => 'Aktivéiert',
36414185 'centralnotice-modify' => 'Späicheren',
 4186+ 'centralnotice-save-banner' => 'Banner späicheren',
36424187 'centralnotice-preview' => 'Weisen ouni ze späicheren',
36434188 'centralnotice-add-new' => 'Eng nei zentral Matdeelung derbäisetzen',
36444189 'centralnotice-remove' => 'Ewechhuelen',
36454190 'centralnotice-translate-heading' => 'Iwwersetzung vu(n) $1',
36464191 'centralnotice-manage' => 'Zentralmatdeelunge geréieren',
 4192+ 'centralnotice-manage-templates' => 'Bannere geréieren',
36474193 'centralnotice-add' => 'Derbäisetzen',
36484194 'centralnotice-add-notice' => 'Eng Matdeelung derbäisetzen',
3649 - 'centralnotice-add-template' => 'Eng Schabloun derbäisetzen',
 4195+ 'centralnotice-edit-notice' => 'Campagne änneren',
 4196+ 'centralnotice-add-template' => 'E Banner derbäisetzen',
36504197 'centralnotice-show-notices' => 'Matdeelunge weisen',
3651 - 'centralnotice-list-templates' => 'Lëscht vun de Schablounen',
 4198+ 'centralnotice-list-templates' => 'Lëscht vun de Banneren',
 4199+ 'centralnotice-multiple_languages' => 'méi ($1)',
36524200 'centralnotice-translations' => 'Iwwersetzungen',
36534201 'centralnotice-translate-to' => 'Iwwersetzen op',
36544202 'centralnotice-translate' => 'Iwwersetzen',
36554203 'centralnotice-english' => 'Englesch',
3656 - 'centralnotice-template-name' => 'Numm vun der Schabloun',
3657 - 'centralnotice-templates' => 'Schablounen',
 4204+ 'centralnotice-banner-name' => 'Numm vum Banner',
 4205+ 'centralnotice-banner' => 'Banner',
 4206+ 'centralnotice-banner-heading' => 'Banner: $1',
 4207+ 'centralnotice-templates' => 'Banneren',
36584208 'centralnotice-weight' => 'Gewiicht',
36594209 'centralnotice-locked' => 'Gespaart',
 4210+ 'centralnotice-notice' => 'Campagne',
 4211+ 'centralnotice-notice-heading' => 'Campagne: $1',
36604212 'centralnotice-notices' => 'Matdeelungen',
36614213 'centralnotice-notice-exists' => "D'Matdeelung gëtt et schonn.
36624214 Si konnt net derbäigesat ginn.",
3663 - 'centralnotice-template-exists' => "D'Schabloun gëtt et schonn.
3664 -Et gouf näischt derbäigsat.",
3665 - 'centralnotice-notice-doesnt-exist' => "D'Matdeelung gëtt et net.
 4215+ 'centralnotice-no-language' => "Fir d'Campagne gouf keng Sprooch erausgesicht. Se gëtt net derbäigesat.",
 4216+ 'centralnotice-template-exists' => 'De Banner gëtt et schonn.
 4217+Net derbäisetzen.',
 4218+ 'centralnotice-notice-doesnt-exist' => "D'Campagne gëtt et net.",
 4219+ 'centralnotice-remove-notice-doesnt-exist' => "D'Campagne gëtt et net.
36664220 Et gëtt näischt fir ewechzehuelen.",
3667 - 'centralnotice-template-still-bound' => "D'Schabloun ass nach ëmmer mat enger Notiz verbonn.
3668 -Si kann net ewechegeholl ginn",
 4221+ 'centralnotice-template-still-bound' => 'De Banner ass nach ëmmer mat enger Campagne verbonn.
 4222+Net ewechhuelen.',
36694223 'centralnotice-template-body' => 'Text vun der Schabloun:',
36704224 'centralnotice-day' => 'Dag',
36714225 'centralnotice-year' => 'Joer',
@@ -3672,18 +4226,21 @@
36734227 'centralnotice-hours' => 'Stonn',
36744228 'centralnotice-min' => 'Minutt',
36754229 'centralnotice-project-lang' => 'Sprooch vum Projet',
 4230+ 'centralnotice-select' => 'Eraussichen: $1',
 4231+ 'centralnotice-top-ten-languages' => 'Top 10 Sproochen',
36764232 'centralnotice-project-name' => 'Numm vum Projet',
36774233 'centralnotice-start-date' => 'Ufanksdatum',
36784234 'centralnotice-start-time' => 'Ufankszäit (UTC)',
3679 - 'centralnotice-assigned-templates' => 'Zougewise Schablounen',
3680 - 'centralnotice-no-templates' => 'Et gëtt keng Schablounen am System',
3681 - 'centralnotice-no-templates-assigned' => 'Keng Schabloune matt der Meldung verbonn.
 4235+ 'centralnotice-assigned-templates' => 'Zougewise Banneren',
 4236+ 'centralnotice-no-templates' => 'Keng Bannere fonnt.
36824237 Setzt der derbäi!',
3683 - 'centralnotice-available-templates' => 'Disponibel Schablounen',
3684 - 'centralnotice-template-already-exists' => "D'Schabloun ass schonn enger Campagne zougedeelt.
3685 -Net derbäisetzen",
 4238+ 'centralnotice-no-templates-assigned' => 'Keng Bannere mat der Campagne verbonn.
 4239+Setzt der derbäi!',
 4240+ 'centralnotice-available-templates' => 'Disponibel Banneren',
 4241+ 'centralnotice-template-already-exists' => 'De Banner ass schonn enger Campagne zougedeelt.
 4242+Net derbäisetzen',
36864243 'centralnotice-preview-template' => 'Schabloun weisen ouni ze späicheren',
3687 - 'centralnotice-start-hour' => 'Ufankszäit',
 4244+ 'centralnotice-start-hour' => 'Ufankszäit (GMT)',
36884245 'centralnotice-change-lang' => 'Sprooch vun der Iwwersetzung änneren',
36894246 'centralnotice-weights' => 'Gewiicht',
36904247 'centralnotice-notice-is-locked' => "D'Matdeelung ass gespaart.
@@ -3698,14 +4255,31 @@
36994256 Dës Aktioun kann net réckgängeg gemaach ginn.',
37004257 'centralnotice-no-notices-exist' => 'Et gëtt keng Matdeelung.
37014258 Setzt eng hei ënnendrënner bäi.',
3702 - 'centralnotice-no-templates-translate' => "Et gëtt keng Schablounen fir déi Iwwersetzungen z'ännere sinn",
 4259+ 'centralnotice-no-templates-translate' => "Et gëtt keng Bannere fir déi Iwwersetzungen z'ännere sinn",
37034260 'centralnotice-number-uses' => 'gëtt benotzt',
 4261+ 'centralnotice-settings' => 'Astellungen',
37044262 'centralnotice-edit-template' => 'Schabloun änneren',
 4263+ 'centralnotice-edit-template-summary' => 'Fir e lokaliséierbare Message unzeleeën, setzt eng Zeecheketten tëschent dräi geschweefte Klameren dran, z. Bsp. {{{jimbo-quote}}}.',
37054264 'centralnotice-message' => 'Message',
37064265 'centralnotice-message-not-set' => 'Message net gepäichert',
37074266 'centralnotice-clone' => 'Eng Kopie maachen',
3708 - 'centralnotice-clone-notice' => 'Eng Kopie vun der Schabloun maachen',
3709 - 'centralnotice-preview-all-template-translations' => 'All disponibel Iwwersetzunge vun der Schabloun weisen ouni ofzespäicheren',
 4267+ 'centralnotice-clone-notice' => 'Eng Kopie vum Banner maachen',
 4268+ 'centralnotice-clone-name' => 'Numm:',
 4269+ 'centralnotice-preview-all-template-translations' => 'All disponibel Iwwersetzunge vum Banner weisen ouni ofzespäicheren',
 4270+ 'centralnotice-insert' => 'Drasetzen: $1',
 4271+ 'centralnotice-hide-button' => 'Knäppche {{int:centralnotice-shared-hide}}',
 4272+ 'centralnotice-collapse-button' => 'Knäppchen {{int:centralnotice-shared-collapse}}',
 4273+ 'centralnotice-expand-button' => 'Knäppchen {{int:centralnotice-shared-expand}}',
 4274+ 'centralnotice-translate-button' => "Knäppchen 'Hëllef iwwersetzen'",
 4275+ 'centralnotice-donate-button' => "Knäppchen 'Spenden'",
 4276+ 'centralnotice-expanded-banner' => 'Erweiderte Banner',
 4277+ 'centralnotice-collapsed-banner' => 'Zesummegeklappte Banner',
 4278+ 'centralnotice-banner-display' => 'Weise fir:',
 4279+ 'centralnotice-banner-anonymous' => 'Anonym Benotzer',
 4280+ 'centralnotice-banner-logged-in' => 'Ageloggte Benotzer',
 4281+ 'centralnotice-banner-type' => 'Bannertyp:',
 4282+ 'centralnotice-banner-hidable' => 'Statesch/Ka verstoppt ginn',
 4283+ 'centralnotice-banner-collapsible' => 'Aklappbar',
37104284 'right-centralnotice-admin' => 'Zentralmatdeelunge geréieren',
37114285 'right-centralnotice-translate' => 'Zentralmatdeelungen iwwersetzen',
37124286 'action-centralnotice-admin' => 'Zentralmatdeelungen ze geréieren',
@@ -3748,14 +4322,19 @@
37494323 'centralnotice-add-template' => 'Sjabloon biedoon',
37504324 'centralnotice-show-notices' => 'Sitemitdeilinge waergaeve',
37514325 'centralnotice-list-templates' => 'Sjablone waergaeve',
 4326+ 'centralnotice-multiple_languages' => 'meerdere ($1)',
37524327 'centralnotice-translations' => 'Euverzèttinge',
37534328 'centralnotice-translate-to' => 'Euverzètte nao',
37544329 'centralnotice-translate' => 'Euverzètte',
37554330 'centralnotice-english' => 'Ingels',
3756 - 'centralnotice-template-name' => 'Sjabloonnaam',
 4331+ 'centralnotice-banner-name' => 'Sjabloonnaam',
 4332+ 'centralnotice-banner' => 'Vaan',
 4333+ 'centralnotice-banner-heading' => 'Vaan: $1',
37574334 'centralnotice-templates' => 'Sjablone',
37584335 'centralnotice-weight' => 'Gewich',
37594336 'centralnotice-locked' => 'Aafgesjlaote',
 4337+ 'centralnotice-notice' => 'Kampanj',
 4338+ 'centralnotice-notice-heading' => 'Kampanj: $1',
37604339 'centralnotice-notices' => 'Sitemitdeilinge',
37614340 'centralnotice-notice-exists' => 'De sitemitdeiling besjteit al.
37624341 Deze weurt neet biegedoon.',
@@ -3784,7 +4363,7 @@
37854364 'centralnotice-template-already-exists' => "'t Sjabloon is al gekoppeld aan 'n campagne.
37864365 't Weurt neet biegedoon.",
37874366 'centralnotice-preview-template' => 'Veursjouw sjabloon',
3788 - 'centralnotice-start-hour' => 'Sjtarttied',
 4367+ 'centralnotice-start-hour' => 'Sjtarttied (GMT)',
37894368 'centralnotice-change-lang' => 'Euver te zètte taal verangere',
37904369 'centralnotice-weights' => 'Gewichte',
37914370 'centralnotice-notice-is-locked' => 'De sitenotice is toe.
@@ -3806,7 +4385,22 @@
38074386 'centralnotice-message-not-set' => "'t Berich is neet ingesjtèld",
38084387 'centralnotice-clone' => 'Kopiëre',
38094388 'centralnotice-clone-notice' => "'n Kopie van 't sjabloon make",
 4389+ 'centralnotice-clone-name' => 'Naam:',
38104390 'centralnotice-preview-all-template-translations' => "Alle besjikbare euverzèttinge van 't sjabloon betrachte",
 4391+ 'centralnotice-insert' => 'Voog in: $1',
 4392+ 'centralnotice-hide-button' => '{{int:centralnotice-shared-hide}}knoep',
 4393+ 'centralnotice-collapse-button' => '{{int:centralnotice-shared-collapse}}knoep',
 4394+ 'centralnotice-expand-button' => '{{int:centralnotice-shared-expand}}knoep',
 4395+ 'centralnotice-translate-button' => 'Euverzèttingshölpknoep',
 4396+ 'centralnotice-donate-button' => 'Gaefknoep',
 4397+ 'centralnotice-expanded-banner' => 'Oetgeklap vaan',
 4398+ 'centralnotice-collapsed-banner' => 'Ingeklap vaan',
 4399+ 'centralnotice-banner-display' => 'Tuun veur:',
 4400+ 'centralnotice-banner-anonymous' => 'Anoniem gebroekers',
 4401+ 'centralnotice-banner-logged-in' => 'Aangemeldje gebroekers',
 4402+ 'centralnotice-banner-type' => 'Vaantiep:',
 4403+ 'centralnotice-banner-hidable' => 'Statisch/verbergbaar',
 4404+ 'centralnotice-banner-collapsible' => 'inklapbaar',
38114405 'right-centralnotice-admin' => 'Centrale sitemitdeilinge behere',
38124406 'right-centralnotice-translate' => 'Centrale sitenotices vertale',
38134407 'action-centralnotice-admin' => 'beheer centrale sitemitdeilinge',
@@ -3864,7 +4458,7 @@
38654459 'centralnotice-translate-to' => "Dikao amin'ny",
38664460 'centralnotice-translate' => 'Dikao',
38674461 'centralnotice-english' => 'Anglisy',
3868 - 'centralnotice-template-name' => "Anaran'ilay endrika",
 4462+ 'centralnotice-banner-name' => "Anaran'ilay endrika",
38694463 'centralnotice-templates' => 'Endrika',
38704464 'centralnotice-weight' => 'Lanja',
38714465 'centralnotice-locked' => 'Voaaro/voasakana',
@@ -3918,31 +4512,41 @@
39194513 'centralnotice-end-date' => 'Истекува',
39204514 'centralnotice-enabled' => 'Овозможено',
39214515 'centralnotice-modify' => 'Испрати',
 4516+ 'centralnotice-save-banner' => 'Зачувај плакат',
39224517 'centralnotice-preview' => 'Преглед',
39234518 'centralnotice-add-new' => 'Додај ново централно известување',
39244519 'centralnotice-remove' => 'Тргни',
39254520 'centralnotice-translate-heading' => 'Превод на $1',
39264521 'centralnotice-manage' => 'Раководење со централното известување',
 4522+ 'centralnotice-manage-templates' => 'Раководење со плакати',
39274523 'centralnotice-add' => 'Додај',
39284524 'centralnotice-add-notice' => 'Додај известување',
 4525+ 'centralnotice-edit-notice' => 'Уреди кампања',
39294526 'centralnotice-add-template' => 'Додај шаблон',
39304527 'centralnotice-show-notices' => 'Прикажи известувања',
39314528 'centralnotice-list-templates' => 'Наведи шаблони',
 4529+ 'centralnotice-multiple_languages' => 'повеќе ($1)',
39324530 'centralnotice-translations' => 'Преводи',
39334531 'centralnotice-translate-to' => 'Преведи на',
39344532 'centralnotice-translate' => 'Преведи',
39354533 'centralnotice-english' => 'англиски',
3936 - 'centralnotice-template-name' => 'Назив на шаблонот',
 4534+ 'centralnotice-banner-name' => 'Назив на шаблонот',
 4535+ 'centralnotice-banner' => 'Плакат',
 4536+ 'centralnotice-banner-heading' => 'Плакат: $1',
39374537 'centralnotice-templates' => 'Шаблони',
39384538 'centralnotice-weight' => 'Тежина',
39394539 'centralnotice-locked' => 'Заклучено',
 4540+ 'centralnotice-notice' => 'Кампања',
 4541+ 'centralnotice-notice-heading' => 'Кампања: $1',
39404542 'centralnotice-notices' => 'Известувања',
39414543 'centralnotice-notice-exists' => 'Известувањето веќе постои.
39424544 Не е додадено',
 4545+ 'centralnotice-no-language' => 'Не е избран јазик за кампањата. Не е додадено.',
39434546 'centralnotice-template-exists' => 'Шаблонот веќе постои.
39444547 Не е додаден',
3945 - 'centralnotice-notice-doesnt-exist' => 'Известувањето не постои.
3946 -Нема ништо за бришење',
 4548+ 'centralnotice-notice-doesnt-exist' => 'Кампањата не постои.',
 4549+ 'centralnotice-remove-notice-doesnt-exist' => 'Кампањата не постои.
 4550+Нема што да се отстранува.',
39474551 'centralnotice-template-still-bound' => 'Шаблонот сè уште е врзан за известување.
39484552 Нема да биде отстранет.',
39494553 'centralnotice-template-body' => 'Тело на шаблонот:',
@@ -3952,6 +4556,8 @@
39534557 'centralnotice-hours' => 'Час',
39544558 'centralnotice-min' => 'Минута',
39554559 'centralnotice-project-lang' => 'Јазик на проект',
 4560+ 'centralnotice-select' => 'Одбери: $1',
 4561+ 'centralnotice-top-ten-languages' => '10 најприсутни јазици',
39564562 'centralnotice-project-name' => 'Име на проект',
39574563 'centralnotice-start-date' => 'Почетен датум',
39584564 'centralnotice-start-time' => 'Почетен датум (UTC)',
@@ -3964,7 +4570,7 @@
39654571 'centralnotice-template-already-exists' => 'Шаблонот е веќе врзан за кампањата.
39664572 Нема да биде додаден',
39674573 'centralnotice-preview-template' => 'Преглед на шаблонот',
3968 - 'centralnotice-start-hour' => 'Започнува',
 4574+ 'centralnotice-start-hour' => 'Започнува (GMT):',
39694575 'centralnotice-change-lang' => 'Смени јазик на превод',
39704576 'centralnotice-weights' => 'Тегови',
39714577 'centralnotice-notice-is-locked' => 'Известувањето е заклучено.
@@ -3981,12 +4587,29 @@
39824588 Додајте известување подолу.',
39834589 'centralnotice-no-templates-translate' => 'Нема шаблони за кои можете да уредите преведувања',
39844590 'centralnotice-number-uses' => 'Користи',
 4591+ 'centralnotice-settings' => 'Нагодувања',
39854592 'centralnotice-edit-template' => 'Уреди шаблон',
 4593+ 'centralnotice-edit-template-summary' => 'За да создадете порака што ќе може да се локализира, напишете низа со цртичка и ставете ја во три кадрави загради, на пр. {{{цитат-џимбо}}}.',
39864594 'centralnotice-message' => 'Порака',
39874595 'centralnotice-message-not-set' => 'Порката не е поставена',
39884596 'centralnotice-clone' => 'Клонирај',
39894597 'centralnotice-clone-notice' => 'Создај копија на шаблонот',
 4598+ 'centralnotice-clone-name' => 'Име:',
39904599 'centralnotice-preview-all-template-translations' => 'Преглед на сите расположиви преводи на шаблонот',
 4600+ 'centralnotice-insert' => 'Вметни: $1',
 4601+ 'centralnotice-hide-button' => 'копче „{{int:centralnotice-shared-hide}}“',
 4602+ 'centralnotice-collapse-button' => 'копче „{{int:centralnotice-shared-collapse}}“',
 4603+ 'centralnotice-expand-button' => 'копче „{{int:centralnotice-shared-expand}}“',
 4604+ 'centralnotice-translate-button' => 'Копче за помош со преводите',
 4605+ 'centralnotice-donate-button' => 'Копче за донации',
 4606+ 'centralnotice-expanded-banner' => 'Расклопен плакат',
 4607+ 'centralnotice-collapsed-banner' => 'Склопен плакат',
 4608+ 'centralnotice-banner-display' => 'Прикажи во:',
 4609+ 'centralnotice-banner-anonymous' => 'Анонимни корисници',
 4610+ 'centralnotice-banner-logged-in' => 'Најавени корисници',
 4611+ 'centralnotice-banner-type' => 'Тип на плакат:',
 4612+ 'centralnotice-banner-hidable' => 'Статичен/Склоплив',
 4613+ 'centralnotice-banner-collapsible' => 'Расклоплив',
39914614 'right-centralnotice-admin' => 'Раководење со централни известувања',
39924615 'right-centralnotice-translate' => 'Преведување на централни известувања',
39934616 'action-centralnotice-admin' => 'раководење со централни известувања',
@@ -4014,26 +4637,32 @@
40154638 'centralnotice-remove' => 'നീക്കംചെയ്യുക',
40164639 'centralnotice-translate-heading' => '$1 എന്നതിനുള്ള തർജ്ജമ',
40174640 'centralnotice-manage' => 'കേന്ദ്രീകൃത അറിയിപ്പ് കൈകാര്യം ചെയ്യുക',
 4641+ 'centralnotice-manage-templates' => 'ബാനറുകൾ കൈകാര്യം ചെയ്യുക',
40184642 'centralnotice-add' => 'കൂട്ടിച്ചേർക്കുക',
40194643 'centralnotice-add-notice' => 'ഒരു അറിയിപ്പ് കൂട്ടിച്ചേർക്കുക',
 4644+ 'centralnotice-edit-notice' => 'പ്രചരണപ്രവർത്തനം തിരുത്തുക',
40204645 'centralnotice-add-template' => 'ഫലകം കൂട്ടിച്ചേർക്കുക',
40214646 'centralnotice-show-notices' => 'അറിയിപ്പുകൾ പ്രദർശിപ്പിക്കുക',
40224647 'centralnotice-list-templates' => 'ഫലകങ്ങൾ പട്ടികവത്കരിക്കുക',
 4648+ 'centralnotice-multiple_languages' => 'നിരവധി ($1)',
40234649 'centralnotice-translations' => 'തർജ്ജമകൾ',
40244650 'centralnotice-translate-to' => 'ഇതിലേയ്ക്ക് തർജ്ജമ ചെയ്യുക',
40254651 'centralnotice-translate' => 'തർജ്ജമ ചെയ്യുക',
40264652 'centralnotice-english' => 'ഇംഗ്ലീഷ്',
4027 - 'centralnotice-template-name' => 'ഫലകത്തിന്റെ പേര്',
 4653+ 'centralnotice-banner-name' => 'ഫലകത്തിന്റെ പേര്',
 4654+ 'centralnotice-banner' => 'ബാനർ',
40284655 'centralnotice-templates' => 'ഫലകങ്ങൾ',
40294656 'centralnotice-weight' => 'ഘനം',
40304657 'centralnotice-locked' => 'പൂട്ടിയിരിക്കുന്നു',
 4658+ 'centralnotice-notice' => 'പ്രചാരണപ്രവർത്തനം',
40314659 'centralnotice-notices' => 'അറിയിപ്പുകൾ',
40324660 'centralnotice-notice-exists' => 'അറിയിപ്പ് ഇപ്പോൾ തന്നെ ഉണ്ട്.
40334661 കൂട്ടിച്ചേർക്കുന്നില്ല',
40344662 'centralnotice-template-exists' => 'ഫലകം നിലവിലുണ്ട്.
40354663 കൂട്ടിച്ചേർക്കുന്നില്ല',
4036 - 'centralnotice-notice-doesnt-exist' => 'അറിയിപ്പ് നിലനിൽപ്പില്ല.
4037 -നീക്കംചെയ്യാനൊന്നുമില്ല',
 4664+ 'centralnotice-notice-doesnt-exist' => 'പ്രചാരണപ്രവർത്തനം നിലനിൽക്കുന്നില്ല',
 4665+ 'centralnotice-remove-notice-doesnt-exist' => 'പ്രചാരണപ്രവർത്തനം നിലനിൽക്കുന്നില്ല.
 4666+നീക്കംചെയ്യാൻ ഒന്നുമില്ല.',
40384667 'centralnotice-template-still-bound' => 'ഫലകം ഇപ്പോഴും ഒരു അറിയിപ്പുമായി ബന്ധപ്പെട്ടിരിക്കുന്നു.
40394668 നീക്കം ചെയ്യുന്നില്ല.',
40404669 'centralnotice-template-body' => 'ഫലകത്തിന്റെ ഉള്ളടക്കം:',
@@ -4043,6 +4672,8 @@
40444673 'centralnotice-hours' => 'മണിക്കൂർ',
40454674 'centralnotice-min' => 'മിനിട്ട്',
40464675 'centralnotice-project-lang' => 'പദ്ധതിയുടെ ഭാഷ',
 4676+ 'centralnotice-select' => 'തിരഞ്ഞെടുക്കുക: $1',
 4677+ 'centralnotice-top-ten-languages' => 'ആദ്യ 10 ഭാഷകൾ',
40474678 'centralnotice-project-name' => 'പദ്ധതിയുടെ പേര്',
40484679 'centralnotice-start-date' => 'ആരംഭിക്കുന്ന തീയതി',
40494680 'centralnotice-start-time' => 'ആരംഭിക്കുന്ന സമയം (UTC)',
@@ -4055,7 +4686,7 @@
40564687 'centralnotice-template-already-exists' => 'ഫലകം പ്രചരണപ്രവർത്തനവുമായി ബന്ധിച്ചിരിക്കുന്നു.
40574688 കൂട്ടിച്ചേർക്കുന്നില്ല',
40584689 'centralnotice-preview-template' => 'ഫലകത്തിന്റെ പ്രിവ്യൂ കാണുക',
4059 - 'centralnotice-start-hour' => 'ആരംഭിക്കുന്ന സമയം',
 4690+ 'centralnotice-start-hour' => 'തുടങ്ങേണ്ട സമയം (ജി.എം.റ്റി.)',
40604691 'centralnotice-change-lang' => 'തർജ്ജമയുടെ ഭാഷ മാറ്റുക',
40614692 'centralnotice-weights' => 'ഘനങ്ങൾ',
40624693 'centralnotice-notice-is-locked' => 'അറിയിപ്പ് പൂട്ടപ്പെട്ടിരിക്കുന്നു.
@@ -4073,11 +4704,24 @@
40744705 'centralnotice-no-templates-translate' => 'ഇതിന്റെ തർജ്ജമകൾ തിരുത്താനായി ഒരു ഫലകവും ഇപ്പോഴില്ല',
40754706 'centralnotice-number-uses' => 'ഉപയോഗങ്ങൾ',
40764707 'centralnotice-edit-template' => 'ഫലകം തിരുത്തുക',
 4708+ 'centralnotice-edit-template-summary' => 'പ്രാദേശീകരിക്കാവുന്ന സന്ദേശം സൃഷ്ടിക്കാൻ, മൂന്ന് വളയൻ കോഷ്ഠകങ്ങൾക്കുള്ളിൽ ഹൈഫൻ ഉപയോഗിച്ച് ചേർത്ത പദങ്ങൾ നൽകുക, ഉദാ: {{{jimbo-quote}}}.',
40774709 'centralnotice-message' => 'സന്ദേശം',
40784710 'centralnotice-message-not-set' => 'സന്ദേശം നിശ്ചിതപ്പെടുത്തിയില്ല.',
40794711 'centralnotice-clone' => 'സമപ്പകർപ്പ്',
40804712 'centralnotice-clone-notice' => 'ഫലകത്തിന്റെ പകർപ്പ് സൃഷ്ടിക്കുക',
 4713+ 'centralnotice-clone-name' => 'പേര്:',
40814714 'centralnotice-preview-all-template-translations' => 'ഫലകത്തിന്റെ ലഭ്യമായ എല്ലാ തർജ്ജമകളുടേയും പ്രിവ്യൂ കാണുക',
 4715+ 'centralnotice-insert' => 'ഉൾപ്പെടുത്തുക: $1',
 4716+ 'centralnotice-hide-button' => '{{int:centralnotice-shared-hide}} ബട്ടൺ',
 4717+ 'centralnotice-collapse-button' => '{{int:centralnotice-shared-collapse}} ബട്ടൺ',
 4718+ 'centralnotice-expand-button' => '{{int:centralnotice-shared-expand}} ബട്ടൺ',
 4719+ 'centralnotice-translate-button' => 'പരിഭാഷാസഹായി ബട്ടൺ',
 4720+ 'centralnotice-donate-button' => 'സംഭാവനാ ബട്ടൺ',
 4721+ 'centralnotice-banner-display' => 'പ്രദർശിപ്പിക്കേണ്ടത്:',
 4722+ 'centralnotice-banner-anonymous' => 'അജ്ഞാത ഉപയോക്താക്കൾ',
 4723+ 'centralnotice-banner-logged-in' => 'പ്രവേശിച്ചിട്ടുള്ള ഉപയോക്താക്കൾ',
 4724+ 'centralnotice-banner-hidable' => 'സ്ഥിരസ്ഥിതി/മറയ്ക്കാവുന്നത്',
 4725+ 'centralnotice-banner-collapsible' => 'ചുരുക്കാവുന്നത്',
40824726 'right-centralnotice-admin' => 'കേന്ദ്രീകൃത അറിയിപ്പുകൾ കൈകാര്യം ചെയ്യുക',
40834727 'right-centralnotice-translate' => 'കേന്ദ്രീകൃത അറിയിപ്പുകൾ തർജ്ജമ ചെയ്യുക',
40844728 'action-centralnotice-admin' => 'കേന്ദ്രീകൃത അറിയിപ്പുകൾ കൈകാര്യം ചെയ്യുക',
@@ -4087,9 +4731,49 @@
40884732
40894733 /** Marathi (मराठी)
40904734 * @author Mahitgar
 4735+ * @author V.narsikar
40914736 */
40924737 $messages['mr'] = array(
40934738 'centralnotice-desc' => 'संकेतस्थळाचा मध्यवर्ती सूचना फलक',
 4739+ 'centralnotice-end-date' => 'अंतिम तारीख',
 4740+ 'centralnotice-add-new' => 'नव्या मोहीमेची सुरूवात करा',
 4741+ 'centralnotice-translate-heading' => '$1 चे भाषांतर',
 4742+ 'centralnotice-manage' => 'मोहीम हाताळा',
 4743+ 'centralnotice-add-notice' => 'नव्या मोहीमेची भर घाला',
 4744+ 'centralnotice-add-template' => 'नविन मथळा लावा',
 4745+ 'centralnotice-translations' => 'भाषांतरे',
 4746+ 'centralnotice-translate-to' => '(Language name) या भाषेत भाषांतर करा',
 4747+ 'centralnotice-banner-name' => 'मथळ्याचे नाव',
 4748+ 'centralnotice-day' => 'दिनांक',
 4749+ 'centralnotice-hours' => 'तास',
 4750+ 'centralnotice-project-lang' => 'प्रकल्प भाषा',
 4751+ 'centralnotice-project-name' => 'प्रकल्पाचे नाव',
 4752+ 'centralnotice-start-date' => 'सुरू केल्याचा दिनांक',
 4753+ 'centralnotice-start-time' => 'सुरू केल्याची वेळ (युटीसी)',
 4754+ 'centralnotice-no-templates' => 'मथळे सापडले नाहीत.काहींची भर घाला',
 4755+ 'centralnotice-available-templates' => 'उपलब्ध मथळे',
 4756+ 'centralnotice-template-already-exists' => 'मोहीमेस मथळा पूर्वीच दिलेला आहे. आता जोडू नका.',
 4757+ 'centralnotice-preview-template' => 'मथळ्याची झलक पाहा.',
 4758+ 'centralnotice-change-lang' => 'भाषांतरासाठी भाषेत बदल करा',
 4759+ 'centralnotice-notice-is-locked' => 'मथळ्यास ताळा लावला आहे. काढु नका.',
 4760+ 'centralnotice-confirm-delete' => 'आपणास हा मजकुर नक्की गाळावयाचा आहे काय?
 4761+ही कृती परतविता येणार नाही.',
 4762+ 'centralnotice-no-notices-exist' => 'मथळा अस्तित्वात नाही.
 4763+एक मथळा खाली जोडा.',
 4764+ 'centralnotice-no-templates-translate' => '↓ भाषांतरे संपादीत करण्याकरिता कोणतेही मुखशीर्षक (बॅनर) उपलब्ध नाही',
 4765+ 'centralnotice-number-uses' => '↓ उपयोग',
 4766+ 'centralnotice-edit-template' => '↓ मुखशीर्षक (बॅनर) संपादीत करा',
 4767+ 'centralnotice-edit-template-summary' => '↓ स्थानिकीकरण संदेश तयार करण्याकरिता, तीहेरी महिरपीकंस संयोगचिन्ह(-) असलेले सूत्राने (स्ट्रींग)भरा, उदाहरणार्थ. {{{jimbo-quote}}}.',
 4768+ 'centralnotice-message' => 'संदेश',
 4769+ 'centralnotice-message-not-set' => '↓ संदेश स्थापित केलेला नाही',
 4770+ 'centralnotice-clone' => '↓ कृत्तक (क्लोन)',
 4771+ 'centralnotice-clone-notice' => '↓ मुखशीर्षकाची(बॅनरची प्रत बनवा)',
 4772+ 'centralnotice-preview-all-template-translations' => '↓ मुखशीर्षकांच्या सर्व उपलब्ध भाषांतराची झलक पहा',
 4773+ 'right-centralnotice-admin' => '↓ मध्यवर्ती सूचनांचे प्रबंधन करा',
 4774+ 'right-centralnotice-translate' => '↓ मध्यवर्ती सूचनांचे भाषांतरकरा',
 4775+ 'action-centralnotice-admin' => 'मध्यवर्ती सूचनांचे प्रबंधन करा',
 4776+ 'action-centralnotice-translate' => 'मध्यवर्ती सूचनांचे भाषांतरकरा',
 4777+ 'centralnotice-preferred' => 'प्राधान्य',
40944778 );
40954779
40964780 /** Malay (Bahasa Melayu)
@@ -4120,7 +4804,7 @@
41214805 'centralnotice-translate-to' => 'Terjemah',
41224806 'centralnotice-translate' => 'Terjemah',
41234807 'centralnotice-english' => 'Bahasa Inggeris',
4124 - 'centralnotice-template-name' => 'Nama templat',
 4808+ 'centralnotice-banner-name' => 'Nama templat',
41254809 'centralnotice-templates' => 'Templat',
41264810 'centralnotice-weight' => 'Berat',
41274811 'centralnotice-locked' => 'Dikunci',
@@ -4174,7 +4858,7 @@
41754859 */
41764860 $messages['mt'] = array(
41774861 'centralnotice-add-template' => 'Żid mudell',
4178 - 'centralnotice-template-name' => 'Isem tal-mudell',
 4862+ 'centralnotice-banner-name' => 'Isem tal-mudell',
41794863 'centralnotice-number-uses' => 'Użi',
41804864 'centralnotice-message' => 'Messaġġ',
41814865 );
@@ -4185,7 +4869,7 @@
41864870 $messages['myv'] = array(
41874871 'centralnotice-add' => 'Поладомс',
41884872 'centralnotice-add-template' => 'Поладомс лопа парцун',
4189 - 'centralnotice-template-name' => 'Лопа парцунонь лем',
 4873+ 'centralnotice-banner-name' => 'Лопа парцунонь лем',
41904874 'centralnotice-templates' => 'Лопа парцунт',
41914875 'centralnotice-weight' => 'Сталмо',
41924876 'centralnotice-template-body' => 'Лопа парцунонть рунгозо:',
@@ -4227,7 +4911,7 @@
42284912 'centralnotice-translate-to' => 'Översetten na',
42294913 'centralnotice-translate' => 'Översetten',
42304914 'centralnotice-english' => 'Engelsch',
4231 - 'centralnotice-template-name' => 'Vörlagennaam',
 4915+ 'centralnotice-banner-name' => 'Vörlagennaam',
42324916 'centralnotice-templates' => 'Vörlagen',
42334917 'centralnotice-weight' => 'Gewicht',
42344918 'centralnotice-locked' => 'Afslaten',
@@ -4303,6 +4987,7 @@
43044988
43054989 /** Dutch (Nederlands)
43064990 * @author Siebrand
 4991+ * @author Tvdm
43074992 */
43084993 $messages['nl'] = array(
43094994 'centralnotice' => 'Beheer centrale sitenotice',
@@ -4315,30 +5000,41 @@
43165001 'centralnotice-end-date' => 'Einddatum',
43175002 'centralnotice-enabled' => 'Actief',
43185003 'centralnotice-modify' => 'Opslaan',
4319 - 'centralnotice-preview' => 'Bekijken',
 5004+ 'centralnotice-save-banner' => 'Banner opslaan',
 5005+ 'centralnotice-preview' => 'Voorvertoning',
43205006 'centralnotice-add-new' => 'Nieuwe centrale sitenotice toevoegen',
43215007 'centralnotice-remove' => 'Verwijderen',
43225008 'centralnotice-translate-heading' => 'Vertaling voor $1',
43235009 'centralnotice-manage' => 'Centrale sitenotice beheren',
 5010+ 'centralnotice-manage-templates' => 'Banners beheren',
43245011 'centralnotice-add' => 'Toevoegen',
43255012 'centralnotice-add-notice' => 'Sitenotice toevoegen',
 5013+ 'centralnotice-edit-notice' => 'Campagne bewerken',
43265014 'centralnotice-add-template' => 'Sjabloon toevoegen',
43275015 'centralnotice-show-notices' => 'Sitenotices weergeven',
43285016 'centralnotice-list-templates' => 'Sjablonen weergeven',
 5017+ 'centralnotice-multiple_languages' => 'meerdere ($1)',
43295018 'centralnotice-translations' => 'Vertalingen',
43305019 'centralnotice-translate-to' => 'Vertalen naar',
43315020 'centralnotice-translate' => 'Vertalen',
43325021 'centralnotice-english' => 'Engels',
4333 - 'centralnotice-template-name' => 'Sjabloonnaam',
 5022+ 'centralnotice-banner-name' => 'Sjabloonnaam',
 5023+ 'centralnotice-banner' => 'Banner',
 5024+ 'centralnotice-banner-heading' => 'Banner: $1',
43345025 'centralnotice-templates' => 'Sjablonen',
43355026 'centralnotice-weight' => 'Gewicht',
43365027 'centralnotice-locked' => 'Afgesloten',
 5028+ 'centralnotice-notice' => 'Campagne',
 5029+ 'centralnotice-notice-heading' => 'Campagne: $1',
43375030 'centralnotice-notices' => 'Sitenotices',
43385031 'centralnotice-notice-exists' => 'De sitenotice bestaat al.
43395032 Deze wordt niet toegevoegd.',
 5033+ 'centralnotice-no-language' => 'Er is geen taal geselecteerd voor de campagne.
 5034+Er wordt niets toegevoegd.',
43405035 'centralnotice-template-exists' => 'Het sjabloon bestaat al.
43415036 Dit wordt niet toegevoegd.',
4342 - 'centralnotice-notice-doesnt-exist' => 'De sitenotice bestaat niet.
 5037+ 'centralnotice-notice-doesnt-exist' => 'De campagne bestaat niet.',
 5038+ 'centralnotice-remove-notice-doesnt-exist' => 'De campagne bestaat niet.
43435039 Er is niets te verwijderen',
43445040 'centralnotice-template-still-bound' => 'Het sjabloon is nog gekoppeld aan een sitenotice.
43455041 Het wordt niet verwijderd.',
@@ -4349,8 +5045,10 @@
43505046 'centralnotice-hours' => 'Uur',
43515047 'centralnotice-min' => 'Minuut',
43525048 'centralnotice-project-lang' => 'Projecttaal',
 5049+ 'centralnotice-select' => 'Selecteer: $1',
 5050+ 'centralnotice-top-ten-languages' => 'Top-10 talen',
43535051 'centralnotice-project-name' => 'Projectnaam',
4354 - 'centralnotice-start-date' => 'Startdatum',
 5052+ 'centralnotice-start-date' => 'Begindatum',
43555053 'centralnotice-start-time' => 'Starttijd (UTC)',
43565054 'centralnotice-assigned-templates' => 'Toegewezen sjablonen',
43575055 'centralnotice-no-templates' => 'Er zijn geen sjablonen beschikbaar in het systeem',
@@ -4358,31 +5056,48 @@
43595057 Die moet u toevoegen.',
43605058 'centralnotice-available-templates' => 'Beschikbare sjablonen',
43615059 'centralnotice-template-already-exists' => 'Het sjabloon is al gekoppeld aan een campagne.
4362 -Het wordt niet toegevoegd',
 5060+Het wordt niet toegevoegd.',
43635061 'centralnotice-preview-template' => 'Voorvertoning sjabloon',
4364 - 'centralnotice-start-hour' => 'Starttijd',
 5062+ 'centralnotice-start-hour' => 'Starttijd (in GMT)',
43655063 'centralnotice-change-lang' => 'Te vertalen taal wijzigen',
43665064 'centralnotice-weights' => 'Gewichten',
43675065 'centralnotice-notice-is-locked' => 'De sitenotice is afgesloten.
4368 -Deze wordt niet verwijderd',
 5066+Deze wordt niet verwijderd.',
43695067 'centralnotice-overlap' => 'De sitenotice overlapt met een andere sitenotice.
4370 -Deze wordt niet toegevoegd',
 5068+Deze wordt niet toegevoegd.',
43715069 'centralnotice-invalid-date-range' => 'Ongeldige datumreeks.
4372 -Er wordt niet bijgewerkt',
 5070+Er wordt niet bijgewerkt.',
43735071 'centralnotice-null-string' => 'U kunt geen leeg tekstveld toevoegen.
43745072 Er wordt niet toegevoegd.',
43755073 'centralnotice-confirm-delete' => 'Weet u zeker dat u dit item wilt verwijderen?
43765074 Deze handeling is niet terug te draaien.',
43775075 'centralnotice-no-notices-exist' => 'Er zijn geen sitenotices.
4378 -U kunt er hieronder een toevoegen',
 5076+U kunt er hieronder een toevoegen.',
43795077 'centralnotice-no-templates-translate' => 'Er zijn geen sjablonen waarvoor vertalingen gemaakt kunnen worden',
43805078 'centralnotice-number-uses' => 'Keren gebruikt',
 5079+ 'centralnotice-settings' => 'Instellingen',
43815080 'centralnotice-edit-template' => 'Sjabloon bewerken',
 5081+ 'centralnotice-edit-template-summary' => 'Sluit een stuk tekst in met drie accolades, bijvoorbeeld {{{jimo-quote}}}, om de tekst vertaalbaar te maken.',
43825082 'centralnotice-message' => 'Bericht',
43835083 'centralnotice-message-not-set' => 'Het bericht is niet ingesteld',
43845084 'centralnotice-clone' => 'Kopiëren',
43855085 'centralnotice-clone-notice' => 'Een kopie van het sjabloon maken',
 5086+ 'centralnotice-clone-name' => 'Naam:',
43865087 'centralnotice-preview-all-template-translations' => 'Alle beschikbare vertalingen van het sjabloon bekijken',
 5088+ 'centralnotice-insert' => 'Invoegen: $1',
 5089+ 'centralnotice-hide-button' => 'Knop "{{int:centralnotice-shared-hide}}"',
 5090+ 'centralnotice-collapse-button' => 'Knop "{{int:centralnotice-shared-collapse}}"',
 5091+ 'centralnotice-expand-button' => 'Knop "{{int:centralnotice-shared-expand}}"',
 5092+ 'centralnotice-translate-button' => 'Knop "help met vertalen"',
 5093+ 'centralnotice-donate-button' => 'Knop "doneren"',
 5094+ 'centralnotice-expanded-banner' => 'Uitgeklapte banner',
 5095+ 'centralnotice-collapsed-banner' => 'Ingeklapte banner',
 5096+ 'centralnotice-banner-display' => 'Weergeven voor:',
 5097+ 'centralnotice-banner-anonymous' => 'Anonieme gebruikers',
 5098+ 'centralnotice-banner-logged-in' => 'Aangemelde gebruikers',
 5099+ 'centralnotice-banner-type' => 'Bannertype:',
 5100+ 'centralnotice-banner-hidable' => 'Statisch/te verbergen',
 5101+ 'centralnotice-banner-collapsible' => 'In te klappen',
43875102 'right-centralnotice-admin' => 'Centrale sitenotices beheren',
43885103 'right-centralnotice-translate' => 'Centrale sitenotices vertalen',
43895104 'action-centralnotice-admin' => 'centrale sitenotices beheren',
@@ -4418,7 +5133,7 @@
44195134 'centralnotice-translate-to' => 'Omset til',
44205135 'centralnotice-translate' => 'Omset',
44215136 'centralnotice-english' => 'Engelsk',
4422 - 'centralnotice-template-name' => 'Malnamn',
 5137+ 'centralnotice-banner-name' => 'Malnamn',
44235138 'centralnotice-templates' => 'Malar',
44245139 'centralnotice-weight' => 'Vekt',
44255140 'centralnotice-locked' => 'Låst',
@@ -4462,6 +5177,7 @@
44635178 'centralnotice-message-not-set' => 'Melding ikkje gjeve',
44645179 'centralnotice-clone' => 'Kopi',
44655180 'centralnotice-clone-notice' => 'Opprett ein kopi av malen',
 5181+ 'centralnotice-clone-name' => 'Namn:',
44665182 'centralnotice-preview-all-template-translations' => 'Førehandsvis alle tilgjengelege omsetjingar av malen',
44675183 'right-centralnotice-admin' => 'Handtera sentrale merknader',
44685184 'right-centralnotice-translate' => 'Omsetja sentrale merknader',
@@ -4487,31 +5203,41 @@
44885204 'centralnotice-end-date' => 'Sluttdato',
44895205 'centralnotice-enabled' => 'Aktivert',
44905206 'centralnotice-modify' => 'Lagre',
 5207+ 'centralnotice-save-banner' => 'Lagre banner',
44915208 'centralnotice-preview' => 'Forhåndsvisning',
44925209 'centralnotice-add-new' => 'Legg til en ny sentralmelding',
44935210 'centralnotice-remove' => 'Fjern',
44945211 'centralnotice-translate-heading' => 'Oversettelse for $1',
44955212 'centralnotice-manage' => 'Håndter sentralemeldinger',
 5213+ 'centralnotice-manage-templates' => 'Behandle bannere',
44965214 'centralnotice-add' => 'Legg til',
44975215 'centralnotice-add-notice' => 'Legg til en melding',
 5216+ 'centralnotice-edit-notice' => 'Rediger kampanje',
44985217 'centralnotice-add-template' => 'Legg til en mal',
44995218 'centralnotice-show-notices' => 'Vis meldinger',
45005219 'centralnotice-list-templates' => 'Vis maler',
 5220+ 'centralnotice-multiple_languages' => 'flere ($1)',
45015221 'centralnotice-translations' => 'Oversettelser',
45025222 'centralnotice-translate-to' => 'Oversett til',
45035223 'centralnotice-translate' => 'Oversett',
45045224 'centralnotice-english' => 'Engelsk',
4505 - 'centralnotice-template-name' => 'Malnavn',
 5225+ 'centralnotice-banner-name' => 'Malnavn',
 5226+ 'centralnotice-banner' => 'Banner',
 5227+ 'centralnotice-banner-heading' => 'Banner: $1',
45065228 'centralnotice-templates' => 'Maler',
45075229 'centralnotice-weight' => 'Vekt',
45085230 'centralnotice-locked' => 'Låst',
 5231+ 'centralnotice-notice' => 'Kampanje',
 5232+ 'centralnotice-notice-heading' => 'Kampanje: $1',
45095233 'centralnotice-notices' => 'Meldinger',
45105234 'centralnotice-notice-exists' => 'Melding eksisterer allerede.
45115235 Ikke lagt inn.',
 5236+ 'centralnotice-no-language' => 'Ingen språk ble valgt for kampanjen. Ikke lagt til.',
45125237 'centralnotice-template-exists' => 'Mal finnes allerede.
45135238 Ikke lagt inn',
4514 - 'centralnotice-notice-doesnt-exist' => 'Melding finnes ikke.
4515 -Ingenting å slette',
 5239+ 'centralnotice-notice-doesnt-exist' => 'Kampanje finnes ikke.',
 5240+ 'centralnotice-remove-notice-doesnt-exist' => 'Kampanje eksisterer ikke.
 5241+Ingenting å fjerne.',
45165242 'centralnotice-template-still-bound' => 'Mal er fortsatt koblet til en melding.
45175243 Ikke fjernet',
45185244 'centralnotice-template-body' => 'Malinnhold:',
@@ -4521,6 +5247,8 @@
45225248 'centralnotice-hours' => 'Timer',
45235249 'centralnotice-min' => 'Minutt',
45245250 'centralnotice-project-lang' => 'Prosjektspråk',
 5251+ 'centralnotice-select' => 'Velg: $1',
 5252+ 'centralnotice-top-ten-languages' => 'Topp 10 språk',
45255253 'centralnotice-project-name' => 'Prosjektnavn',
45265254 'centralnotice-start-date' => 'Startdato',
45275255 'centralnotice-start-time' => 'Starttid (UTC)',
@@ -4533,7 +5261,7 @@
45345262 'centralnotice-template-already-exists' => 'Mal er allerede knyttet til kampanje.
45355263 Ikke lagt inn',
45365264 'centralnotice-preview-template' => 'Forhåndsvis mal',
4537 - 'centralnotice-start-hour' => 'Starttid',
 5265+ 'centralnotice-start-hour' => 'Starttid (GMT)',
45385266 'centralnotice-change-lang' => 'Endre oversettelsesspråk',
45395267 'centralnotice-weights' => 'Tyngder',
45405268 'centralnotice-notice-is-locked' => 'Melding er låst.
@@ -4551,11 +5279,26 @@
45525280 'centralnotice-no-templates-translate' => 'Det finnes ingen maler å redigere oversettelser for',
45535281 'centralnotice-number-uses' => 'Anvendelser',
45545282 'centralnotice-edit-template' => 'Rediger mal',
 5283+ 'centralnotice-edit-template-summary' => 'For å opprette en lokaliserbar melding, legg ved en bindestreks-streng inni tre krøllparanteser, for eksempel {{{jimbo-quote}}}.',
45555284 'centralnotice-message' => 'Melding',
45565285 'centralnotice-message-not-set' => 'Melding ikke satt',
45575286 'centralnotice-clone' => 'Klon',
45585287 'centralnotice-clone-notice' => 'Lag en kopi av malen',
 5288+ 'centralnotice-clone-name' => 'Navn:',
45595289 'centralnotice-preview-all-template-translations' => 'Forhåndsvis alle tilgjengelige oversettelser av malen',
 5290+ 'centralnotice-insert' => 'Sett inn: $1',
 5291+ 'centralnotice-hide-button' => '{{int:centralnotice-shared-hide}} knapp',
 5292+ 'centralnotice-collapse-button' => '{{int:centralnotice-shared-collape}} knapp',
 5293+ 'centralnotice-expand-button' => '{{int:centralnotice-shared-expand}} knapp',
 5294+ 'centralnotice-translate-button' => 'Hjelp med oversettelse-knapp',
 5295+ 'centralnotice-donate-button' => 'Doner-knapp',
 5296+ 'centralnotice-expanded-banner' => 'Utvidet banner',
 5297+ 'centralnotice-collapsed-banner' => 'Kollapset banner',
 5298+ 'centralnotice-banner-display' => 'Vis til:',
 5299+ 'centralnotice-banner-anonymous' => 'Anonyme brukere',
 5300+ 'centralnotice-banner-logged-in' => 'Innloggede brukere',
 5301+ 'centralnotice-banner-type' => 'Banner type:',
 5302+ 'centralnotice-banner-hidable' => 'Statisk/skjulbar',
45605303 'right-centralnotice-admin' => 'Håndtere sentrale meldinger',
45615304 'right-centralnotice-translate' => 'Oversett sentrale meldinger',
45625305 'action-centralnotice-admin' => 'administrere sentrale meldinger',
@@ -4590,7 +5333,7 @@
45915334 'centralnotice-translate-to' => 'Traduire en',
45925335 'centralnotice-translate' => 'Traduire',
45935336 'centralnotice-english' => 'Anglés',
4594 - 'centralnotice-template-name' => 'Nom del modèl',
 5337+ 'centralnotice-banner-name' => 'Nom del modèl',
45955338 'centralnotice-templates' => 'Modèls',
45965339 'centralnotice-weight' => 'Pes',
45975340 'centralnotice-locked' => 'Varrolhat',
@@ -4667,6 +5410,7 @@
46685411 * @author Xqt
46695412 */
46705413 $messages['pdc'] = array(
 5414+ 'centralnotice-preview' => 'Aagucke',
46715415 'centralnotice-add' => 'Dezu duh',
46725416 'centralnotice-list-templates' => 'Lischt vun Moddle',
46735417 'centralnotice-translations' => 'Iwwersetzinge',
@@ -4698,28 +5442,39 @@
46995443 'centralnotice-end-date' => 'Data zakończenia',
47005444 'centralnotice-enabled' => 'Włączony',
47015445 'centralnotice-modify' => 'Zapisz',
 5446+ 'centralnotice-save-banner' => 'Zapisz baner',
47025447 'centralnotice-preview' => 'Podgląd',
47035448 'centralnotice-add-new' => 'Dodaj nowy wspólny komunikat',
47045449 'centralnotice-remove' => 'Usuń',
47055450 'centralnotice-translate-heading' => 'Tłumaczenie dla $1',
47065451 'centralnotice-manage' => 'Zarządzaj wspólnymi komunikatami',
 5452+ 'centralnotice-manage-templates' => 'Zarządzanie banerami',
47075453 'centralnotice-add' => 'Dodaj',
47085454 'centralnotice-add-notice' => 'Dodaj komunikat',
 5455+ 'centralnotice-edit-notice' => 'Edycja kampanii',
47095456 'centralnotice-add-template' => 'Dodaj szablon',
47105457 'centralnotice-show-notices' => 'Pokaż komunikaty',
47115458 'centralnotice-list-templates' => 'Lista szablonów',
 5459+ 'centralnotice-multiple_languages' => 'wiele ($1)',
47125460 'centralnotice-translations' => 'Tłumaczenia',
47135461 'centralnotice-translate-to' => 'Przetłumacz na',
47145462 'centralnotice-translate' => 'Przetłumacz',
47155463 'centralnotice-english' => 'Angielski',
4716 - 'centralnotice-template-name' => 'Nazwa szablonu',
4717 - 'centralnotice-templates' => 'Szablony',
 5464+ 'centralnotice-banner-name' => 'Nazwa szablonu',
 5465+ 'centralnotice-banner' => 'Baner',
 5466+ 'centralnotice-banner-heading' => 'Baner – $1',
 5467+ 'centralnotice-templates' => 'Banery',
47185468 'centralnotice-weight' => 'Waga',
47195469 'centralnotice-locked' => 'Zablokowany',
 5470+ 'centralnotice-notice' => 'Kampania',
 5471+ 'centralnotice-notice-heading' => 'Kampania – $1',
47205472 'centralnotice-notices' => 'Komunikaty',
47215473 'centralnotice-notice-exists' => 'Komunikat o podanej nazwie już istnieje. Nowy komunikat nie został dodany.',
 5474+ 'centralnotice-no-language' => 'Ponieważ nie wybrano języka kampanii, nie została ona dodana.',
47225475 'centralnotice-template-exists' => 'Szablon o podanej nazwie już istnieje. Nowy szablon nie został dodany.',
4723 - 'centralnotice-notice-doesnt-exist' => 'Komunikat nie istnieje. Nie ma czego usunąć.',
 5476+ 'centralnotice-notice-doesnt-exist' => 'Kampania nie istnieje.',
 5477+ 'centralnotice-remove-notice-doesnt-exist' => 'Kampania nie istnieje.
 5478+Usunięcie jest niemożliwe.',
47245479 'centralnotice-template-still-bound' => 'Szablon nie może zostać usunięty. Jest ciągle używany przez komunikat.',
47255480 'centralnotice-template-body' => 'Treść szablonu:',
47265481 'centralnotice-day' => 'Dzień',
@@ -4728,6 +5483,8 @@
47295484 'centralnotice-hours' => 'Godzina',
47305485 'centralnotice-min' => 'Minuta',
47315486 'centralnotice-project-lang' => 'Język projektu',
 5487+ 'centralnotice-select' => 'Wybierz: $1',
 5488+ 'centralnotice-top-ten-languages' => '10 najważniejszych języków',
47325489 'centralnotice-project-name' => 'Nazwa projektu',
47335490 'centralnotice-start-date' => 'Data rozpoczęcia',
47345491 'centralnotice-start-time' => 'Czas rozpoczęcia (UTC)',
@@ -4739,7 +5496,7 @@
47405497 'centralnotice-template-already-exists' => 'Szablon nie został dodany.
47415498 Jest już wykorzystany w kampani.',
47425499 'centralnotice-preview-template' => 'Podgląd szablonu',
4743 - 'centralnotice-start-hour' => 'Czas rozpoczęcia',
 5500+ 'centralnotice-start-hour' => 'Czas rozpoczęcia (UTC)',
47445501 'centralnotice-change-lang' => 'Zmień język tłumaczenia',
47455502 'centralnotice-weights' => 'Wagi',
47465503 'centralnotice-notice-is-locked' => 'Komunikat nie może zostać usunięty, ponieważ jest zablokowany.',
@@ -4753,12 +5510,29 @@
47545511 Dodaj nowy poniżej.',
47555512 'centralnotice-no-templates-translate' => 'Nie ma żadnych szablonów do zmiany tłumaczeń dla',
47565513 'centralnotice-number-uses' => 'Zastosowania',
 5514+ 'centralnotice-settings' => 'Ustawienia',
47575515 'centralnotice-edit-template' => 'Edycja szablonu',
 5516+ 'centralnotice-edit-template-summary' => 'Lokalizowalny komunikat należy tworzyć poprzez zapisanie ciągu znaków rozdzielanych znakiem odejmowania w trzech nawiasach klamrowych, np {{{cytat-jimbo}}}.',
47585517 'centralnotice-message' => 'Wiadomość',
47595518 'centralnotice-message-not-set' => 'Wiadomość nie jest ustawiona',
47605519 'centralnotice-clone' => 'Kopia',
47615520 'centralnotice-clone-notice' => 'Utwórz kopię szablonu',
 5521+ 'centralnotice-clone-name' => 'Nazwa',
47625522 'centralnotice-preview-all-template-translations' => 'Zobacz wszystkie dostępne tłumaczenia szablonu',
 5523+ 'centralnotice-insert' => 'Wstaw: $1',
 5524+ 'centralnotice-hide-button' => 'Przycisk „{{int:centralnotice-shared-hide}}”',
 5525+ 'centralnotice-collapse-button' => 'Przycisk „{{int:centralnotice-shared-collapse}}”',
 5526+ 'centralnotice-expand-button' => 'Przycisk „{{int:centralnotice-shared-expand}}”',
 5527+ 'centralnotice-translate-button' => 'Przycisk „Pomóż w tłumaczeniu”',
 5528+ 'centralnotice-donate-button' => 'Przycisk „Wspomóż”',
 5529+ 'centralnotice-expanded-banner' => 'Rozwinięty baner',
 5530+ 'centralnotice-collapsed-banner' => 'Zwinięty baner',
 5531+ 'centralnotice-banner-display' => 'Wyświetlaj',
 5532+ 'centralnotice-banner-anonymous' => 'użytkownikom anonimowym',
 5533+ 'centralnotice-banner-logged-in' => 'użytkownikom zalogowanym',
 5534+ 'centralnotice-banner-type' => 'Typ banera:',
 5535+ 'centralnotice-banner-hidable' => 'Statyczny czy ukrywalny',
 5536+ 'centralnotice-banner-collapsible' => 'Zwijalny',
47635537 'right-centralnotice-admin' => 'Zarządzanie wspólnymi komunikatami',
47645538 'right-centralnotice-translate' => 'Tłumaczenie wspólnych dla projektów ogłoszeń',
47655539 'action-centralnotice-admin' => 'zarządzaj centralnymi komunikatami',
@@ -4781,31 +5555,41 @@
47825556 'centralnotice-end-date' => 'Data fin',
47835557 'centralnotice-enabled' => 'Abilità',
47845558 'centralnotice-modify' => 'Spediss',
 5559+ 'centralnotice-save-banner' => 'Salvé ël tilèt',
47855560 'centralnotice-preview' => 'Previsualisassion',
47865561 'centralnotice-add-new' => 'Gionta na Neuva Sentral neuva',
47875562 'centralnotice-remove' => 'Gava',
47885563 'centralnotice-translate-heading' => 'Tradussion për $1',
47895564 'centralnotice-manage' => 'Gestiss neuva sentral',
 5565+ 'centralnotice-manage-templates' => 'Gestì ij tilet',
47905566 'centralnotice-add' => 'Gionta',
47915567 'centralnotice-add-notice' => 'Gionta na neuva',
 5568+ 'centralnotice-edit-notice' => 'Modifiché la campagna',
47925569 'centralnotice-add-template' => 'Gionta në stamp',
47935570 'centralnotice-show-notices' => 'Mostra neuva',
47945571 'centralnotice-list-templates' => 'Lista stamp',
 5572+ 'centralnotice-multiple_languages' => 'mùltipl ($1)',
47955573 'centralnotice-translations' => 'Tradussion',
47965574 'centralnotice-translate-to' => 'Volté an',
47975575 'centralnotice-translate' => 'Volté',
47985576 'centralnotice-english' => 'Anglèis',
4799 - 'centralnotice-template-name' => 'Nòm ëd lë stamp',
 5577+ 'centralnotice-banner-name' => 'Nòm ëd lë stamp',
 5578+ 'centralnotice-banner' => 'Tilèt',
 5579+ 'centralnotice-banner-heading' => 'Tilèt: $1',
48005580 'centralnotice-templates' => 'Stamp',
48015581 'centralnotice-weight' => 'Pèis',
48025582 'centralnotice-locked' => 'Blocà',
 5583+ 'centralnotice-notice' => 'Campagna',
 5584+ 'centralnotice-notice-heading' => 'Campagna: $1',
48035585 'centralnotice-notices' => 'Neuve',
48045586 'centralnotice-notice-exists' => 'La neuva a esist già.
48055587 Pa giontà',
 5588+ 'centralnotice-no-language' => "Gnun-a lenga a l'é stàita selessionà për la campagna. Pa giontà.",
48065589 'centralnotice-template-exists' => 'Lë stamp a esist già.
48075590 Pa giontà',
4808 - 'centralnotice-notice-doesnt-exist' => 'La neuva a esist pa.
4809 -A-i é gnente da gavé',
 5591+ 'centralnotice-notice-doesnt-exist' => 'La campagna a esist pa.',
 5592+ 'centralnotice-remove-notice-doesnt-exist' => 'La campagna a esist pa.
 5593+Pa gnente da gavé.',
48105594 'centralnotice-template-still-bound' => "Lë stamp a l'é ancó gropà a na neuva.
48115595 Pa gavà.",
48125596 'centralnotice-template-body' => 'Còrp ëd lë stamp:',
@@ -4815,6 +5599,8 @@
48165600 'centralnotice-hours' => 'Ora',
48175601 'centralnotice-min' => 'Minuta',
48185602 'centralnotice-project-lang' => 'Lenga dël proget',
 5603+ 'centralnotice-select' => 'Selessioné: $1',
 5604+ 'centralnotice-top-ten-languages' => 'Prime 10 lenghe',
48195605 'centralnotice-project-name' => 'Nòm dël proget',
48205606 'centralnotice-start-date' => "Data d'inissi",
48215607 'centralnotice-start-time' => "Ora d'inissi (UTC)",
@@ -4827,7 +5613,7 @@
48285614 'centralnotice-template-already-exists' => "Lë stamp a l'é già gropà a na campagna.
48295615 Pa giontà",
48305616 'centralnotice-preview-template' => 'Previsualisassion stamp',
4831 - 'centralnotice-start-hour' => "Ora d'inissi",
 5617+ 'centralnotice-start-hour' => "Ora d'inissi (GMT)",
48325618 'centralnotice-change-lang' => 'Cangé lenga ëd tradussion',
48335619 'centralnotice-weights' => 'Pèis',
48345620 'centralnotice-notice-is-locked' => 'Neuva blocà.
@@ -4844,12 +5630,29 @@
48455631 Ch'a na gionta un-a sì-sota.",
48465632 'centralnotice-no-templates-translate' => 'A-i é gnun ëstamp dont modifiché la tradussion',
48475633 'centralnotice-number-uses' => 'Usagi',
 5634+ 'centralnotice-settings' => 'Regolassion',
48485635 'centralnotice-edit-template' => 'Modìfica stamp',
 5636+ 'centralnotice-edit-template-summary' => 'Për creé un mëssagi localisàbil, sara na stringa con tratin ant tre paréntesi grafe, p.e. {{{jimbo-quote}}}.',
48495637 'centralnotice-message' => 'Mëssagi',
48505638 'centralnotice-message-not-set' => 'Mëssagi pa ampostà',
48515639 'centralnotice-clone' => 'Clon-a',
48525640 'centralnotice-clone-notice' => 'Crea na còpia ëd lë stamp',
 5641+ 'centralnotice-clone-name' => 'Nòm:',
48535642 'centralnotice-preview-all-template-translations' => 'Previsualisa tute le tradussion disponìbij ëd lë stamp',
 5643+ 'centralnotice-insert' => 'Anserì: $1',
 5644+ 'centralnotice-hide-button' => 'Boton {{int:centralnotice-shared-hide}}',
 5645+ 'centralnotice-collapse-button' => 'Boton {{int:centralnotice-shared-collapse}}',
 5646+ 'centralnotice-expand-button' => 'Boton {{int:centralnotice-shared-expand}}',
 5647+ 'centralnotice-translate-button' => 'Boton për giuté a volté',
 5648+ 'centralnotice-donate-button' => "Boton për fé dj'oferte",
 5649+ 'centralnotice-expanded-banner' => 'Tilèt ëslargà',
 5650+ 'centralnotice-collapsed-banner' => 'Tilèt ëstrenzù',
 5651+ 'centralnotice-banner-display' => 'Smon-e a :',
 5652+ 'centralnotice-banner-anonymous' => 'Utent anònim',
 5653+ 'centralnotice-banner-logged-in' => 'Utent intrà ant ël sistema',
 5654+ 'centralnotice-banner-type' => 'Sòrt ëd tilèt:',
 5655+ 'centralnotice-banner-hidable' => 'Stàtich/Stërmàbil',
 5656+ 'centralnotice-banner-collapsible' => 'Strenzìbil',
48545657 'right-centralnotice-admin' => 'Gestì le neuve sentraj',
48555658 'right-centralnotice-translate' => 'Volté le neuve sentraj',
48565659 'action-centralnotice-admin' => 'gestì le neuve sentraj',
@@ -4878,7 +5681,7 @@
48795682 'centralnotice-translations' => 'ژباړې',
48805683 'centralnotice-translate' => 'ژباړل',
48815684 'centralnotice-english' => 'انګرېزي',
4882 - 'centralnotice-template-name' => 'د کينډۍ نوم',
 5685+ 'centralnotice-banner-name' => 'د کينډۍ نوم',
48835686 'centralnotice-templates' => 'کينډۍ',
48845687 'centralnotice-day' => 'ورځ',
48855688 'centralnotice-year' => 'کال',
@@ -4892,10 +5695,13 @@
48935696 'centralnotice-available-templates' => 'شته کينډۍ',
48945697 'centralnotice-start-hour' => 'د پيل وخت',
48955698 'centralnotice-change-lang' => 'د ژباړې ژبه بدلول',
 5699+ 'centralnotice-number-uses' => 'کاروي',
48965700 'centralnotice-message' => 'پيغام',
 5701+ 'centralnotice-clone-name' => 'نوم',
48975702 );
48985703
48995704 /** Portuguese (Português)
 5705+ * @author Crazymadlover
49005706 * @author Hamilton Abreu
49015707 * @author Malafaya
49025708 */
@@ -4910,31 +5716,41 @@
49115717 'centralnotice-end-date' => 'Data fim',
49125718 'centralnotice-enabled' => 'Activo',
49135719 'centralnotice-modify' => 'Submeter',
 5720+ 'centralnotice-save-banner' => 'Gravar modelo',
49145721 'centralnotice-preview' => 'Antevisão',
49155722 'centralnotice-add-new' => 'Adicionar um novo aviso centralizado',
49165723 'centralnotice-remove' => 'Remover',
49175724 'centralnotice-translate-heading' => 'Tradução para $1',
49185725 'centralnotice-manage' => 'Gerir aviso centralizado',
 5726+ 'centralnotice-manage-templates' => 'Administrar modelos',
49195727 'centralnotice-add' => 'Adicionar',
49205728 'centralnotice-add-notice' => 'Adicionar um aviso',
 5729+ 'centralnotice-edit-notice' => 'Editar aviso',
49215730 'centralnotice-add-template' => 'Adicionar um modelo',
49225731 'centralnotice-show-notices' => 'Mostrar avisos',
49235732 'centralnotice-list-templates' => 'Listar modelos',
 5733+ 'centralnotice-multiple_languages' => 'múltiplas ($1)',
49245734 'centralnotice-translations' => 'Traduções',
49255735 'centralnotice-translate-to' => 'Traduzir para',
49265736 'centralnotice-translate' => 'Traduzir',
49275737 'centralnotice-english' => 'Inglês',
4928 - 'centralnotice-template-name' => 'Nome do modelo',
 5738+ 'centralnotice-banner-name' => 'Nome do modelo',
 5739+ 'centralnotice-banner' => 'Modelo',
 5740+ 'centralnotice-banner-heading' => 'Modelo: $1',
49295741 'centralnotice-templates' => 'Modelos',
49305742 'centralnotice-weight' => 'Peso',
49315743 'centralnotice-locked' => 'Bloqueado',
 5744+ 'centralnotice-notice' => 'Aviso',
 5745+ 'centralnotice-notice-heading' => 'Aviso centralizado: $1',
49325746 'centralnotice-notices' => 'Avisos',
49335747 'centralnotice-notice-exists' => 'O aviso já existe.
49345748 Não adicionado',
 5749+ 'centralnotice-no-language' => 'Não foi seleccionada uma língua para o aviso centralizado. O aviso não será adicionado.',
49355750 'centralnotice-template-exists' => 'O modelo já existe.
49365751 Não adicionado',
4937 - 'centralnotice-notice-doesnt-exist' => 'O aviso não existe.
4938 -Nada a remover',
 5752+ 'centralnotice-notice-doesnt-exist' => 'O aviso não existe.',
 5753+ 'centralnotice-remove-notice-doesnt-exist' => 'O aviso não existe.
 5754+Não há nada para remover.',
49395755 'centralnotice-template-still-bound' => 'O modelo ainda está ligado a um aviso.
49405756 Não removido.',
49415757 'centralnotice-template-body' => 'Conteúdo do modelo:',
@@ -4944,6 +5760,8 @@
49455761 'centralnotice-hours' => 'Hora',
49465762 'centralnotice-min' => 'Minuto',
49475763 'centralnotice-project-lang' => 'Língua do projecto',
 5764+ 'centralnotice-select' => 'Seleccionar: $1',
 5765+ 'centralnotice-top-ten-languages' => 'As 10 línguas de topo',
49485766 'centralnotice-project-name' => 'Nome do projecto',
49495767 'centralnotice-start-date' => 'Data início',
49505768 'centralnotice-start-time' => 'Hora início (UTC)',
@@ -4953,10 +5771,10 @@
49545772 'centralnotice-no-templates-assigned' => 'Nenhum modelo atribuído a avisos.
49555773 Adicione alguns!',
49565774 'centralnotice-available-templates' => 'Modelos disponíveis',
4957 - 'centralnotice-template-already-exists' => 'O modelo já está ligado a uma campanha.
4958 -Não adicionado',
 5775+ 'centralnotice-template-already-exists' => 'O modelo já está ligado a um aviso.
 5776+Não adicionado.',
49595777 'centralnotice-preview-template' => 'Antever modelo',
4960 - 'centralnotice-start-hour' => 'Hora início',
 5778+ 'centralnotice-start-hour' => 'Hora de início (GMT)',
49615779 'centralnotice-change-lang' => 'Alterar língua de tradução',
49625780 'centralnotice-weights' => 'Pesos',
49635781 'centralnotice-notice-is-locked' => 'O aviso está bloqueado.
@@ -4973,12 +5791,29 @@
49745792 Adicione um abaixo',
49755793 'centralnotice-no-templates-translate' => 'Não há quaisquer modelos para os quais seja possível editar traduções',
49765794 'centralnotice-number-uses' => 'Utilizações',
 5795+ 'centralnotice-settings' => 'Configurações',
49775796 'centralnotice-edit-template' => 'Editar modelo',
 5797+ 'centralnotice-edit-template-summary' => 'Para criar uma mensagem localizável, coloque entre três chavetas um texto que contenha um hífen; por exemplo, {{{citar-jimbo}}}.',
49785798 'centralnotice-message' => 'Mensagem',
49795799 'centralnotice-message-not-set' => 'Mensagem não estabelecida',
49805800 'centralnotice-clone' => 'Clonar',
49815801 'centralnotice-clone-notice' => 'Criar uma cópia do modelo',
 5802+ 'centralnotice-clone-name' => 'Nome:',
49825803 'centralnotice-preview-all-template-translations' => 'Antever todas as traduções disponíveis do modelo',
 5804+ 'centralnotice-insert' => 'Inserir: $1',
 5805+ 'centralnotice-hide-button' => 'Botão {{int:centralnotice-shared-hide}}',
 5806+ 'centralnotice-collapse-button' => 'Botão {{int:centralnotice-shared-collapse}}',
 5807+ 'centralnotice-expand-button' => 'Botão {{int:centralnotice-shared-expand}}',
 5808+ 'centralnotice-translate-button' => 'Botão Ajudar a traduzir',
 5809+ 'centralnotice-donate-button' => 'Botão Donativo',
 5810+ 'centralnotice-expanded-banner' => 'Modelo expandido',
 5811+ 'centralnotice-collapsed-banner' => 'Modelo colapsado',
 5812+ 'centralnotice-banner-display' => 'Apresentar a:',
 5813+ 'centralnotice-banner-anonymous' => 'Utilizadores anónimos',
 5814+ 'centralnotice-banner-logged-in' => 'Utilizadores autenticados',
 5815+ 'centralnotice-banner-type' => 'Tipo de modelo:',
 5816+ 'centralnotice-banner-hidable' => 'Estático/Ocultável',
 5817+ 'centralnotice-banner-collapsible' => 'Colapsável',
49835818 'right-centralnotice-admin' => 'Gerir avisos centralizados',
49845819 'right-centralnotice-translate' => 'Traduzir avisos centralizados',
49855820 'action-centralnotice-admin' => 'gerir avisos centralizados',
@@ -4988,6 +5823,7 @@
49895824
49905825 /** Brazilian Portuguese (Português do Brasil)
49915826 * @author Eduardo.mps
 5827+ * @author Giro720
49925828 * @author Heldergeovane
49935829 */
49945830 $messages['pt-br'] = array(
@@ -5001,31 +5837,41 @@
50025838 'centralnotice-end-date' => 'Data de fim',
50035839 'centralnotice-enabled' => 'Ativo',
50045840 'centralnotice-modify' => 'Enviar',
 5841+ 'centralnotice-save-banner' => 'Salvar modelo',
50055842 'centralnotice-preview' => 'Previsão',
50065843 'centralnotice-add-new' => 'Adicionar um novo aviso centralizado',
50075844 'centralnotice-remove' => 'Remover',
50085845 'centralnotice-translate-heading' => 'Tradução de $1',
50095846 'centralnotice-manage' => 'Gerenciar aviso centralizado',
 5847+ 'centralnotice-manage-templates' => 'Administrar modelos',
50105848 'centralnotice-add' => 'Adicionar',
50115849 'centralnotice-add-notice' => 'Adicionar um aviso',
 5850+ 'centralnotice-edit-notice' => 'Editar aviso',
50125851 'centralnotice-add-template' => 'Adicionar um modelo',
50135852 'centralnotice-show-notices' => 'Mostrar avisos',
50145853 'centralnotice-list-templates' => 'Listar modelos',
 5854+ 'centralnotice-multiple_languages' => 'múltiplas ($1)',
50155855 'centralnotice-translations' => 'Traduções',
50165856 'centralnotice-translate-to' => 'Traduzir para',
50175857 'centralnotice-translate' => 'Traduzir',
50185858 'centralnotice-english' => 'Inglês',
5019 - 'centralnotice-template-name' => 'Nome do modelo',
 5859+ 'centralnotice-banner-name' => 'Nome do modelo',
 5860+ 'centralnotice-banner' => 'Banner',
 5861+ 'centralnotice-banner-heading' => 'Banner: $1',
50205862 'centralnotice-templates' => 'Modelos',
50215863 'centralnotice-weight' => 'Peso',
50225864 'centralnotice-locked' => 'Bloqueado',
 5865+ 'centralnotice-notice' => 'Campanha',
 5866+ 'centralnotice-notice-heading' => 'Campanha: $1',
50235867 'centralnotice-notices' => 'Avisos',
50245868 'centralnotice-notice-exists' => 'O aviso já existe.
50255869 Não adicionado',
 5870+ 'centralnotice-no-language' => 'Não foi selecionada uma língua para o aviso centralizado. O aviso não será adicionado.',
50265871 'centralnotice-template-exists' => 'O modelo já existe.
50275872 Não adicionado',
5028 - 'centralnotice-notice-doesnt-exist' => 'O aviso não existe.
5029 -Nada a remover',
 5873+ 'centralnotice-notice-doesnt-exist' => 'O aviso não existe.',
 5874+ 'centralnotice-remove-notice-doesnt-exist' => 'O aviso não existe.
 5875+Não há nada para remover.',
50305876 'centralnotice-template-still-bound' => 'O modelo ainda está ligado a um aviso.
50315877 Não removido.',
50325878 'centralnotice-template-body' => 'Conteúdo do modelo:',
@@ -5035,6 +5881,8 @@
50365882 'centralnotice-hours' => 'Hora',
50375883 'centralnotice-min' => 'Minuto',
50385884 'centralnotice-project-lang' => 'Língua do projeto',
 5885+ 'centralnotice-select' => 'Seleccionar: $1',
 5886+ 'centralnotice-top-ten-languages' => 'As 10 línguas mais usadas',
50395887 'centralnotice-project-name' => 'Nome do projeto',
50405888 'centralnotice-start-date' => 'Data início',
50415889 'centralnotice-start-time' => 'Hora início (UTC)',
@@ -5047,7 +5895,7 @@
50485896 'centralnotice-template-already-exists' => 'O modelo já está ligado a campanha.
50495897 Não adicionado',
50505898 'centralnotice-preview-template' => 'Prever modelo',
5051 - 'centralnotice-start-hour' => 'Hora início',
 5899+ 'centralnotice-start-hour' => 'Hora de início (GMT)',
50525900 'centralnotice-change-lang' => 'Alterar língua de tradução',
50535901 'centralnotice-weights' => 'Pesos',
50545902 'centralnotice-notice-is-locked' => 'O aviso está bloqueado.
@@ -5065,11 +5913,27 @@
50665914 'centralnotice-no-templates-translate' => 'Não há quaisquer modelos para os quais seja possível editar traduções',
50675915 'centralnotice-number-uses' => 'Utilizações',
50685916 'centralnotice-edit-template' => 'Editar modelo',
 5917+ 'centralnotice-edit-template-summary' => 'Para criar uma mensagem localizável, coloque entre três chaves um texto que contenha um hífen; por exemplo, {{{texto-citado}}}.',
50695918 'centralnotice-message' => 'Mensagem',
50705919 'centralnotice-message-not-set' => 'Mensagem não estabelecida',
50715920 'centralnotice-clone' => 'Clonar',
50725921 'centralnotice-clone-notice' => 'Criar uma cópia do modelo',
 5922+ 'centralnotice-clone-name' => 'Nome:',
50735923 'centralnotice-preview-all-template-translations' => 'Prever todas as traduções disponíveis do modelo',
 5924+ 'centralnotice-insert' => 'Inserir: $1',
 5925+ 'centralnotice-hide-button' => 'Botão {{int:centralnotice-shared-hide}}',
 5926+ 'centralnotice-collapse-button' => 'Botão {{int:centralnotice-shared-collapse}}',
 5927+ 'centralnotice-expand-button' => 'Botão {{int:centralnotice-shared-expand}}',
 5928+ 'centralnotice-translate-button' => 'Botão Ajudar a traduzir',
 5929+ 'centralnotice-donate-button' => 'Botão Donativo',
 5930+ 'centralnotice-expanded-banner' => 'Modelo expandido',
 5931+ 'centralnotice-collapsed-banner' => 'Modelo colapsado',
 5932+ 'centralnotice-banner-display' => 'Apresentar a:',
 5933+ 'centralnotice-banner-anonymous' => 'Usuários anônimos',
 5934+ 'centralnotice-banner-logged-in' => 'Usuários autenticados',
 5935+ 'centralnotice-banner-type' => 'Tipo de banner:',
 5936+ 'centralnotice-banner-hidable' => 'Estático/Ocultável',
 5937+ 'centralnotice-banner-collapsible' => 'Colapsável',
50745938 'right-centralnotice-admin' => 'Gerenciar avisos centralizados',
50755939 'right-centralnotice-translate' => 'Traduzir avisos centralizados',
50765940 'action-centralnotice-admin' => 'gerenciar avisos centralizados',
@@ -5091,13 +5955,16 @@
50925956 'centralnotice-end-date' => "Tukuna p'unchaw",
50935957 'centralnotice-enabled' => 'Saqillasqa',
50945958 'centralnotice-modify' => 'Kachay',
 5959+ 'centralnotice-save-banner' => 'Unanchata waqaychay',
50955960 'centralnotice-preview' => 'Ñawpaqta qhawallay',
50965961 'centralnotice-add-new' => 'Musuq chawpi willayta yapay',
50975962 'centralnotice-remove' => 'Qichuy',
50985963 'centralnotice-translate-heading' => "$1-paq t'ikrasqa",
50995964 'centralnotice-manage' => 'Chawpi willayta kamachiy',
 5965+ 'centralnotice-manage-templates' => 'Unanchakunata kamachiy',
51005966 'centralnotice-add' => 'Yapay',
51015967 'centralnotice-add-notice' => 'Willayta yapay',
 5968+ 'centralnotice-edit-notice' => "Kampañata llamk'apuy",
51025969 'centralnotice-add-template' => 'Plantillata yapay',
51035970 'centralnotice-show-notices' => 'Willaykunata rikuchiy',
51045971 'centralnotice-list-templates' => 'Plantillakunata sutisuyupi rikuchiy',
@@ -5105,17 +5972,22 @@
51065973 'centralnotice-translate-to' => "Kayman t'ikray:",
51075974 'centralnotice-translate' => "T'ikray",
51085975 'centralnotice-english' => 'Inlish simipi',
5109 - 'centralnotice-template-name' => 'Plantilla suti',
 5976+ 'centralnotice-banner-name' => 'Plantilla suti',
 5977+ 'centralnotice-banner' => 'Unancha',
 5978+ 'centralnotice-banner-heading' => 'Unancha: $1',
51105979 'centralnotice-templates' => 'Plantillakuna',
51115980 'centralnotice-weight' => 'Llasay',
51125981 'centralnotice-locked' => "Llawiwan wichq'asqa",
 5982+ 'centralnotice-notice' => 'Kampaña',
 5983+ 'centralnotice-notice-heading' => 'Kampaña: $1',
51135984 'centralnotice-notices' => 'Willaykuna',
51145985 'centralnotice-notice-exists' => 'Willayqa kachkañam.
51155986 Manam yapasqachu',
51165987 'centralnotice-template-exists' => 'Plantillaqa kachkañam.
51175988 Manam yapasqachu',
5118 - 'centralnotice-notice-doesnt-exist' => 'Willayqa manam kanchu.
5119 -Manam qichunallachu',
 5989+ 'centralnotice-notice-doesnt-exist' => 'Kampañaqa manam kanchu.',
 5990+ 'centralnotice-remove-notice-doesnt-exist' => 'Kampañaqa manam kanchu.
 5991+Manam qichunallachu.',
51205992 'centralnotice-template-still-bound' => 'Plantillaqa willaymanraqmi watasqa.
51215993 Manam qichusqa kanqachu.',
51225994 'centralnotice-template-body' => 'Plantilla kurku:',
@@ -5125,6 +5997,8 @@
51265998 'centralnotice-hours' => 'Ura',
51275999 'centralnotice-min' => 'Minutu',
51286000 'centralnotice-project-lang' => 'Ruraykamaypa rimaynin',
 6001+ 'centralnotice-select' => 'Akllay: $1',
 6002+ 'centralnotice-top-ten-languages' => 'Ñawpaq 10 rimaykuna',
51296003 'centralnotice-project-name' => 'Ruraykamaypa sutin',
51306004 'centralnotice-start-date' => "Qallarisqanpa p'unchawnin",
51316005 'centralnotice-start-time' => 'Qallarisqanpa pachan (UTC)',
@@ -5134,6 +6008,8 @@
51356009 'centralnotice-no-templates-assigned' => 'Manam kanchu willayman haypusqa plantillakuna.
51366010 Yapay!',
51376011 'centralnotice-available-templates' => 'Aypanalla plantillakuna',
 6012+ 'centralnotice-template-already-exists' => 'Unanchaqa huk kampañamanmi watasqaña.
 6013+Mana yapaspa',
51386014 'centralnotice-preview-template' => 'Plantillata ñawpaqta qhawallay',
51396015 'centralnotice-start-hour' => 'Qallarisqanpa pachan',
51406016 'centralnotice-change-lang' => "T'ikrana rimayta hukchay",
@@ -5153,11 +6029,24 @@
51546030 'centralnotice-no-templates-translate' => "Manam kanchu plantillakuna, imapaqchus t'ikrasqa llamk'apunalla kanman",
51556031 'centralnotice-number-uses' => "Llamk'achin",
51566032 'centralnotice-edit-template' => "Plantillata llamk'apuy",
 6033+ 'centralnotice-edit-template-summary' => "Maypichanalla willayta kamarinaykipaqqa, aspiyuq qillqallata kimsa chhurku wichq'achiqpi wichq'ay, ahinataq {{{jimbo-quote}}}.",
51576034 'centralnotice-message' => 'Willay',
51586035 'centralnotice-message-not-set' => 'Manam kanchu churasqa willay',
51596036 'centralnotice-clone' => 'Iskayllachay',
51606037 'centralnotice-clone-notice' => 'Plantillamanta iskaychasqanta kamariy',
 6038+ 'centralnotice-clone-name' => 'Suti:',
51616039 'centralnotice-preview-all-template-translations' => "Tukuy aypanalla plantillamanta t'ikrasqakunata ñawpaqta qhawallay",
 6040+ 'centralnotice-insert' => "Sat'iy: $1",
 6041+ 'centralnotice-hide-button' => 'Pakay butun',
 6042+ 'centralnotice-collapse-button' => 'Thuñichiy butun',
 6043+ 'centralnotice-expand-button' => "Mast'ariy butun",
 6044+ 'centralnotice-translate-button' => "T'ikraysiy butun",
 6045+ 'centralnotice-donate-button' => 'Qaray butun',
 6046+ 'centralnotice-expanded-banner' => "Mast'arisqa unancha",
 6047+ 'centralnotice-collapsed-banner' => 'Thuñichisqa unancha',
 6048+ 'centralnotice-banner-type' => 'Unancha laya:',
 6049+ 'centralnotice-banner-hidable' => 'Ranuy/Pakana',
 6050+ 'centralnotice-banner-collapsible' => 'Thuñichina',
51626051 'right-centralnotice-admin' => 'Chawpi willaykunata kamachiy',
51636052 'right-centralnotice-translate' => "Chawpi willaykunata t'ikray",
51646053 'action-centralnotice-admin' => 'chawpi willaykunata kamachiy',
@@ -5166,9 +6055,11 @@
51676056 );
51686057
51696058 /** Romanian (Română)
 6059+ * @author Cin
51706060 * @author Firilacroco
51716061 * @author KlaudiuMihaila
51726062 * @author Mihai
 6063+ * @author Minisarm
51736064 * @author Stelistcristi
51746065 */
51756066 $messages['ro'] = array(
@@ -5192,7 +6083,7 @@
51936084 'centralnotice-translate-to' => 'Tradu în',
51946085 'centralnotice-translate' => 'Tradu',
51956086 'centralnotice-english' => 'engleză',
5196 - 'centralnotice-template-name' => 'Numele formatului',
 6087+ 'centralnotice-banner-name' => 'Numele formatului',
51976088 'centralnotice-templates' => 'Formate',
51986089 'centralnotice-weight' => 'Greutate',
51996090 'centralnotice-locked' => 'Blocat',
@@ -5207,14 +6098,14 @@
52086099 'centralnotice-start-date' => 'Data de începere',
52096100 'centralnotice-start-time' => 'Data de începere (UTC)',
52106101 'centralnotice-available-templates' => 'Formate disponibile',
5211 - 'centralnotice-preview-template' => 'Previzualizare formate',
 6102+ 'centralnotice-preview-template' => 'Previzualizare format',
52126103 'centralnotice-start-hour' => 'Ora de început',
52136104 'centralnotice-change-lang' => 'Schimbă limba de traducere',
52146105 'centralnotice-weights' => 'Greutăți',
52156106 'centralnotice-edit-template' => 'Modifică format',
52166107 'centralnotice-message' => 'Mesaj',
5217 - 'centralnotice-clone' => 'Clonați',
5218 - 'centralnotice-clone-notice' => 'Creează o copie a formatului',
 6108+ 'centralnotice-clone' => 'Clonează',
 6109+ 'centralnotice-clone-notice' => 'Creează o copie a bannerului',
52196110 'right-centralnotice-translate' => 'Traduce anunțurile centrale',
52206111 'action-centralnotice-admin' => 'administrați anunțurile centrale',
52216112 'action-centralnotice-translate' => 'traduceți anunțurile centrale',
@@ -5232,7 +6123,10 @@
52336124
52346125 /** Russian (Русский)
52356126 * @author Aleksandrit
 6127+ * @author Eleferen
52366128 * @author Ferrer
 6129+ * @author G0rn
 6130+ * @author Rubin
52376131 * @author Александр Сигачёв
52386132 */
52396133 $messages['ru'] = array(
@@ -5246,31 +6140,41 @@
52476141 'centralnotice-end-date' => 'Дата окончания',
52486142 'centralnotice-enabled' => 'Включено',
52496143 'centralnotice-modify' => 'Отправить',
 6144+ 'centralnotice-save-banner' => 'Сохранить баннер',
52506145 'centralnotice-preview' => 'Предпросмотр',
52516146 'centralnotice-add-new' => 'Добавить новое централизованное уведомление',
52526147 'centralnotice-remove' => 'Удалить',
52536148 'centralnotice-translate-heading' => 'Перевод для $1',
52546149 'centralnotice-manage' => 'Управление централизованными уведомлениями',
 6150+ 'centralnotice-manage-templates' => 'Управление баннерами',
52556151 'centralnotice-add' => 'Добавить',
52566152 'centralnotice-add-notice' => 'Добавить уведомление',
 6153+ 'centralnotice-edit-notice' => 'Изменить кампанию',
52576154 'centralnotice-add-template' => 'Добавить шаблон',
52586155 'centralnotice-show-notices' => 'Показать уведомления',
52596156 'centralnotice-list-templates' => 'Вывести список шаблонов',
 6157+ 'centralnotice-multiple_languages' => 'несколько ($1)',
52606158 'centralnotice-translations' => 'Переводы',
52616159 'centralnotice-translate-to' => 'Перевод на',
52626160 'centralnotice-translate' => 'Перевод',
52636161 'centralnotice-english' => 'английский',
5264 - 'centralnotice-template-name' => 'Название шаблона',
 6162+ 'centralnotice-banner-name' => 'Название баннера',
 6163+ 'centralnotice-banner' => 'Баннер',
 6164+ 'centralnotice-banner-heading' => 'Баннер: $1',
52656165 'centralnotice-templates' => 'Шаблоны',
52666166 'centralnotice-weight' => 'Ширина',
52676167 'centralnotice-locked' => 'Заблокированный',
 6168+ 'centralnotice-notice' => 'Кампания',
 6169+ 'centralnotice-notice-heading' => 'Кампания: $1',
52686170 'centralnotice-notices' => 'уведомления',
52696171 'centralnotice-notice-exists' => 'Уведомление уже существует.
52706172 Не добавляется',
 6173+ 'centralnotice-no-language' => 'Не выбран язык для этой кампании. Не добавлено.',
52716174 'centralnotice-template-exists' => 'Шаблон уже существует.
52726175 Не добавляется',
5273 - 'centralnotice-notice-doesnt-exist' => 'Уведомления не существует.
5274 -Нечего удалять',
 6176+ 'centralnotice-notice-doesnt-exist' => 'Кампания не существует.',
 6177+ 'centralnotice-remove-notice-doesnt-exist' => 'Кампания не существует.
 6178+Нечего удалять.',
52756179 'centralnotice-template-still-bound' => 'Шаблон по-прежнему связан с уведомлением.
52766180 Не удаляется.',
52776181 'centralnotice-template-body' => 'Тело шаблона:',
@@ -5280,6 +6184,8 @@
52816185 'centralnotice-hours' => 'Час',
52826186 'centralnotice-min' => 'Минута',
52836187 'centralnotice-project-lang' => 'Язык проекта',
 6188+ 'centralnotice-select' => 'Выборка: $1',
 6189+ 'centralnotice-top-ten-languages' => '10 языков',
52846190 'centralnotice-project-name' => 'Название проекта',
52856191 'centralnotice-start-date' => 'Дата начала',
52866192 'centralnotice-start-time' => 'Время начала (UTC)',
@@ -5292,7 +6198,7 @@
52936199 'centralnotice-template-already-exists' => 'Шаблон уже привязан.
52946200 Не добавлен',
52956201 'centralnotice-preview-template' => 'Предпросмотр шаблона',
5296 - 'centralnotice-start-hour' => 'Время начала',
 6202+ 'centralnotice-start-hour' => 'Время начала (GMT)',
52976203 'centralnotice-change-lang' => 'Изменить язык перевода',
52986204 'centralnotice-weights' => 'Веса',
52996205 'centralnotice-notice-is-locked' => 'Уведомление заблокировано.
@@ -5309,12 +6215,29 @@
53106216 Можно добавить',
53116217 'centralnotice-no-templates-translate' => 'Нет ни одного шаблона для правки перевода',
53126218 'centralnotice-number-uses' => 'Используются',
 6219+ 'centralnotice-settings' => 'Настройки',
53136220 'centralnotice-edit-template' => 'Править шаблон',
 6221+ 'centralnotice-edit-template-summary' => 'Чтобы создать локализуемое сообщение, заключите дефисную строку в три фигурные скобки, например {{{цитата-джимбо}}}.',
53146222 'centralnotice-message' => 'Сообщение',
53156223 'centralnotice-message-not-set' => 'Сообщение не установлено',
53166224 'centralnotice-clone' => 'Клонирование',
53176225 'centralnotice-clone-notice' => 'Создать копию шаблона',
 6226+ 'centralnotice-clone-name' => 'Имя:',
53186227 'centralnotice-preview-all-template-translations' => 'Просмотреть все доступные переводы шаблона',
 6228+ 'centralnotice-insert' => 'Вставка: $1',
 6229+ 'centralnotice-hide-button' => '{{int:centralnotice-shared-hide}} кнопку',
 6230+ 'centralnotice-collapse-button' => '{{int:centralnotice-shared-collapse}} кнопку',
 6231+ 'centralnotice-expand-button' => '{{int:centralnotice-shared-expand}} кнопку',
 6232+ 'centralnotice-translate-button' => 'Кнопка помощи в переводе',
 6233+ 'centralnotice-donate-button' => 'Кнопка пожертвований',
 6234+ 'centralnotice-expanded-banner' => 'Расширенный баннер',
 6235+ 'centralnotice-collapsed-banner' => 'Сложенный баннер',
 6236+ 'centralnotice-banner-display' => 'Показывать в:',
 6237+ 'centralnotice-banner-anonymous' => 'Анонимные участники',
 6238+ 'centralnotice-banner-logged-in' => 'Пользователи:',
 6239+ 'centralnotice-banner-type' => 'Тип баннера:',
 6240+ 'centralnotice-banner-hidable' => 'Статический / Скрываемый',
 6241+ 'centralnotice-banner-collapsible' => 'Сворачиваемый',
53196242 'right-centralnotice-admin' => 'управление централизованными уведомлениями',
53206243 'right-centralnotice-translate' => 'перевод централизованных уведомлений',
53216244 'action-centralnotice-admin' => 'управление централизованными уведомлениями',
@@ -5322,6 +6245,35 @@
53236246 'centralnotice-preferred' => 'Желательно',
53246247 );
53256248
 6249+/** Rusyn (русиньскый язык)
 6250+ * @author Gazeb
 6251+ */
 6252+$messages['rue'] = array(
 6253+ 'centralnotice-translations' => 'Переклады',
 6254+ 'centralnotice-translate-to' => 'Переклад до',
 6255+ 'centralnotice-translate' => 'Переложыти',
 6256+ 'centralnotice-english' => 'анґліцькы',
 6257+ 'centralnotice-banner-name' => 'Назва шаблоны',
 6258+ 'centralnotice-templates' => 'Шаблоны',
 6259+ 'centralnotice-weight' => 'Вага',
 6260+ 'centralnotice-locked' => 'Замкнуто',
 6261+ 'centralnotice-day' => 'День',
 6262+ 'centralnotice-year' => 'Рік',
 6263+ 'centralnotice-month' => 'Місяць',
 6264+ 'centralnotice-hours' => 'Годины',
 6265+ 'centralnotice-min' => 'Мінуты',
 6266+ 'centralnotice-project-lang' => 'Язык проєкту',
 6267+ 'centralnotice-project-name' => 'Назва проєкту',
 6268+ 'centralnotice-start-date' => 'Датум початку',
 6269+ 'centralnotice-start-time' => 'Час початку (UTC)',
 6270+ 'centralnotice-available-templates' => 'Доступны шаблоны',
 6271+ 'centralnotice-start-hour' => 'Час початку',
 6272+ 'centralnotice-change-lang' => 'Змінити язык перекладу',
 6273+ 'centralnotice-weights' => 'Вагы',
 6274+ 'centralnotice-number-uses' => 'Хоснує',
 6275+ 'centralnotice-message' => 'Ознам',
 6276+);
 6277+
53266278 /** Yakut (Саха тыла)
53276279 * @author HalanTul
53286280 */
@@ -5350,7 +6302,7 @@
53516303 'centralnotice-translate-to' => 'Манна тылбаас',
53526304 'centralnotice-translate' => 'Тылбаас',
53536305 'centralnotice-english' => 'Аҥылычаан',
5354 - 'centralnotice-template-name' => 'Халыып аата',
 6306+ 'centralnotice-banner-name' => 'Халыып аата',
53556307 'centralnotice-templates' => 'Халыыптар',
53566308 'centralnotice-weight' => 'Кэтитэ',
53576309 'centralnotice-locked' => 'Хааччахтаммыт/бобуллубут',
@@ -5440,7 +6392,7 @@
54416393 'centralnotice-translate-to' => 'Tradùci n',
54426394 'centralnotice-translate' => 'Traduci',
54436395 'centralnotice-english' => 'Ngrisi',
5444 - 'centralnotice-template-name' => 'Nomu dû template',
 6396+ 'centralnotice-banner-name' => 'Nomu dû template',
54456397 'centralnotice-templates' => 'Template',
54466398 'centralnotice-weight' => 'Pisu',
54476399 'centralnotice-locked' => 'Bluccatu',
@@ -5531,7 +6483,7 @@
55326484 'centralnotice-translate-to' => 'Preložiť do jazyka',
55336485 'centralnotice-translate' => 'Preložiť',
55346486 'centralnotice-english' => 'angličtina',
5535 - 'centralnotice-template-name' => 'Názov šablóny',
 6487+ 'centralnotice-banner-name' => 'Názov šablóny',
55366488 'centralnotice-templates' => 'Šablóny',
55376489 'centralnotice-weight' => 'Váha',
55386490 'centralnotice-locked' => 'Zamknutý',
@@ -5581,6 +6533,16 @@
55826534 'centralnotice-preferred' => 'Uprednostňované',
55836535 );
55846536
 6537+/** Slovenian (Slovenščina)
 6538+ * @author Dbc334
 6539+ */
 6540+$messages['sl'] = array(
 6541+ 'centralnotice-message' => 'Sporočilo',
 6542+ 'centralnotice-message-not-set' => 'Sporočilo ni določeno',
 6543+ 'centralnotice-clone' => 'Kloniraj',
 6544+ 'centralnotice-clone-notice' => 'Ustvarite kopijo pasice',
 6545+);
 6546+
55856547 /** Serbian Cyrillic ekavian (Српски (ћирилица))
55866548 * @author Millosh
55876549 * @author Јованвб
@@ -5607,7 +6569,7 @@
56086570 'centralnotice-translate-to' => 'Преведи на',
56096571 'centralnotice-translate' => 'Преведи',
56106572 'centralnotice-english' => 'Енглески',
5611 - 'centralnotice-template-name' => 'Име шаблона',
 6573+ 'centralnotice-banner-name' => 'Име шаблона',
56126574 'centralnotice-templates' => 'Шаблони',
56136575 'centralnotice-weight' => 'Тежина',
56146576 'centralnotice-locked' => 'Закључано',
@@ -5678,7 +6640,7 @@
56796641 'centralnotice-translate-to' => 'Prevedi na',
56806642 'centralnotice-translate' => 'Prevedi',
56816643 'centralnotice-english' => 'Engleski',
5682 - 'centralnotice-template-name' => 'Ime šablona',
 6644+ 'centralnotice-banner-name' => 'Ime šablona',
56836645 'centralnotice-templates' => 'Šabloni',
56846646 'centralnotice-weight' => 'Težina',
56856647 'centralnotice-locked' => 'Zaključano',
@@ -5753,7 +6715,7 @@
57546716 'centralnotice-translate-to' => 'Uursätte in',
57556717 'centralnotice-translate' => 'Uursätte',
57566718 'centralnotice-english' => 'Ängelsk',
5757 - 'centralnotice-template-name' => 'Noome fon ju Foarloage',
 6719+ 'centralnotice-banner-name' => 'Noome fon ju Foarloage',
57586720 'centralnotice-templates' => 'Foarloagen',
57596721 'centralnotice-weight' => 'Gewicht',
57606722 'centralnotice-locked' => 'Speerd',
@@ -5852,7 +6814,7 @@
58536815 'centralnotice-translate-to' => 'Översätt till',
58546816 'centralnotice-translate' => 'Översätt',
58556817 'centralnotice-english' => 'Engelska',
5856 - 'centralnotice-template-name' => 'Mallnamn',
 6818+ 'centralnotice-banner-name' => 'Mallnamn',
58576819 'centralnotice-templates' => 'Mallar',
58586820 'centralnotice-weight' => 'Tyngd',
58596821 'centralnotice-locked' => 'Låst',
@@ -5902,6 +6864,7 @@
59036865 'centralnotice-no-templates-translate' => 'Det finns inga mallar att redigera översättningar för',
59046866 'centralnotice-number-uses' => 'Användningar',
59056867 'centralnotice-edit-template' => 'Redigera mall',
 6868+ 'centralnotice-edit-template-summary' => 'För att skapa ett meddelande som kan lokalanpassas, inkludera en bindestrecks-sträng inom tre klammerparenteser, t.ex. {{{jimbo-quote}}}.',
59066869 'centralnotice-message' => 'Budskap',
59076870 'centralnotice-message-not-set' => 'Budskap inte satt',
59086871 'centralnotice-clone' => 'Klon',
@@ -5936,7 +6899,7 @@
59376900 'centralnotice-translations' => 'అనువాదాలు',
59386901 'centralnotice-translate' => 'అనువదించండి',
59396902 'centralnotice-english' => 'ఇంగ్లీష్',
5940 - 'centralnotice-template-name' => 'మూస పేరు',
 6903+ 'centralnotice-banner-name' => 'మూస పేరు',
59416904 'centralnotice-templates' => 'మూసలు',
59426905 'centralnotice-weight' => 'భారం',
59436906 'centralnotice-notices' => 'గమనికలు',
@@ -6018,7 +6981,7 @@
60196982 'centralnotice-translate-to' => 'Тарҷума ба',
60206983 'centralnotice-translate' => 'Тарҷума',
60216984 'centralnotice-english' => 'Англисӣ',
6022 - 'centralnotice-template-name' => 'Унвони шаблон',
 6985+ 'centralnotice-banner-name' => 'Унвони шаблон',
60236986 'centralnotice-templates' => 'Шаблонҳо',
60246987 'centralnotice-weight' => 'Вазн',
60256988 'centralnotice-locked' => 'Басташуда',
@@ -6108,7 +7071,7 @@
61097072 'centralnotice-translate-to' => 'Tarçuma ba',
61107073 'centralnotice-translate' => 'Tarçuma',
61117074 'centralnotice-english' => 'Anglisī',
6112 - 'centralnotice-template-name' => 'Unvoni şablon',
 7075+ 'centralnotice-banner-name' => 'Unvoni şablon',
61137076 'centralnotice-templates' => 'Şablonho',
61147077 'centralnotice-weight' => 'Vazn',
61157078 'centralnotice-locked' => 'Bastaşuda',
@@ -6201,7 +7164,7 @@
62027165 'centralnotice-translate-to' => 'แปลเป็นภาษา',
62037166 'centralnotice-translate' => 'แปล',
62047167 'centralnotice-english' => 'อังกฤษ',
6205 - 'centralnotice-template-name' => 'ชื่อแม่แบบ',
 7168+ 'centralnotice-banner-name' => 'ชื่อแม่แบบ',
62067169 'centralnotice-templates' => 'แม่แบบ',
62077170 'centralnotice-weight' => 'น้ำหนัก',
62087171 'centralnotice-locked' => 'ถูกล็อก',
@@ -6291,7 +7254,7 @@
62927255 'centralnotice-translate-to' => 'Şu dile terjime et:',
62937256 'centralnotice-translate' => 'Terjime et',
62947257 'centralnotice-english' => 'iňlisçe',
6295 - 'centralnotice-template-name' => 'Şablon ady',
 7258+ 'centralnotice-banner-name' => 'Şablon ady',
62967259 'centralnotice-templates' => 'Şablonlar',
62977260 'centralnotice-weight' => 'Agram',
62987261 'centralnotice-locked' => 'Gulply',
@@ -6380,7 +7343,7 @@
63817344 'centralnotice-translate-to' => 'Isalinwika patungong',
63827345 'centralnotice-translate' => 'Isalinwika',
63837346 'centralnotice-english' => 'Ingles',
6384 - 'centralnotice-template-name' => 'Pangalan ng suleras',
 7347+ 'centralnotice-banner-name' => 'Pangalan ng suleras',
63857348 'centralnotice-templates' => 'Mga suleras',
63867349 'centralnotice-weight' => 'Timbang',
63877350 'centralnotice-locked' => 'Nakakandado',
@@ -6430,6 +7393,7 @@
64317394 'centralnotice-no-templates-translate' => 'Walang mga suleras na mapagsasagawaan ng mga pagbabagong pangsalinwika',
64327395 'centralnotice-number-uses' => 'Mga mapaggagamitan',
64337396 'centralnotice-edit-template' => 'Baguhin ang suleras',
 7397+ 'centralnotice-edit-template-summary' => 'Upang makalikha ng isang maisakakatubong mensahe, maglakip ng isang ginitlingang bagting sa loob ng tatlong kulot na mga braket, halimbawa na ang {{{jimbo-sipi}}}.',
64347398 'centralnotice-message' => 'Mensahe',
64357399 'centralnotice-message-not-set' => 'Hindi nakatakda ang mensahe',
64367400 'centralnotice-clone' => 'Kopyang kahawig na kahawig ng pinaggayahan',
@@ -6445,6 +7409,7 @@
64467410 /** Turkish (Türkçe)
64477411 * @author Joseph
64487412 * @author Karduelis
 7413+ * @author Srhat
64497414 */
64507415 $messages['tr'] = array(
64517416 'centralnotice' => 'Merkezi uyarı yöneticisi',
@@ -6471,7 +7436,7 @@
64727437 'centralnotice-translate-to' => 'Şu dile çevir',
64737438 'centralnotice-translate' => 'Çevir',
64747439 'centralnotice-english' => 'İngilizce',
6475 - 'centralnotice-template-name' => 'Şablon adı',
 7440+ 'centralnotice-banner-name' => 'Şablon adı',
64767441 'centralnotice-templates' => 'Şablonlar',
64777442 'centralnotice-weight' => 'Önem',
64787443 'centralnotice-locked' => 'Kilitli',
@@ -6521,6 +7486,7 @@
65227487 'centralnotice-no-templates-translate' => 'Çevirileri değiştirmek için hiç şablon yok',
65237488 'centralnotice-number-uses' => 'Kullanımlar',
65247489 'centralnotice-edit-template' => 'Şablonu değiştir',
 7490+ 'centralnotice-edit-template-summary' => 'Yerelleştirilebilir bir mesaj oluşturmak için, tireli bir metni üç köşeli parantez arasına yazın, örnek {{{jimbo-quote}}}',
65257491 'centralnotice-message' => 'Mesaj',
65267492 'centralnotice-message-not-set' => 'Mesaj ayarlanmadı',
65277493 'centralnotice-clone' => 'Klonla',
@@ -6533,6 +7499,90 @@
65347500 'centralnotice-preferred' => 'Tercih edilen',
65357501 );
65367502
 7503+/** Tatar (Cyrillic) (Татарча/Tatarça (Cyrillic))
 7504+ * @author Ильнар
 7505+ */
 7506+$messages['tt-cyrl'] = array(
 7507+ 'centralnotice' => 'Хәбәрләр белән идарә итү үзәге',
 7508+ 'noticetemplate' => 'Үзәк хәбәрләр үрнәге',
 7509+ 'centralnotice-desc' => 'Сәхифәнең гомуми хатларын йөкли',
 7510+ 'centralnotice-summary' => 'Бу модуль Сезгә хәбәрләрегезне үзгәртергә ярдәм итә. Ул тагын яңа хәбәрләр өстәргә яки искеләрен юкка чыгарырга ярдәм итәчәк.',
 7511+ 'centralnotice-query' => 'Әлеге хәбәрне үзгәртү',
 7512+ 'centralnotice-notice-name' => 'Хәбәрнең исеме',
 7513+ 'centralnotice-end-date' => 'Бетү вакыты',
 7514+ 'centralnotice-enabled' => 'Ачылган',
 7515+ 'centralnotice-modify' => 'Җибәрү',
 7516+ 'centralnotice-preview' => 'Алдан карау',
 7517+ 'centralnotice-add-new' => 'Яңа хәбәр өстәү',
 7518+ 'centralnotice-remove' => 'Бетерү',
 7519+ 'centralnotice-translate-heading' => '$1 өчен тәрҗемә',
 7520+ 'centralnotice-manage' => 'Хәбәрләр белән идарә итү',
 7521+ 'centralnotice-add' => 'Өстәргә',
 7522+ 'centralnotice-add-notice' => 'Яңа хәбәр өстәү',
 7523+ 'centralnotice-edit-notice' => 'Хәбәрне үзгәртү',
 7524+ 'centralnotice-add-template' => 'Үрнәк өстәү',
 7525+ 'centralnotice-show-notices' => 'Хәбәрне ачарга',
 7526+ 'centralnotice-list-templates' => 'Үрнәкләр исемлеге',
 7527+ 'centralnotice-translations' => 'Тәрҗемәләр',
 7528+ 'centralnotice-translate-to' => 'Тәрҗемә',
 7529+ 'centralnotice-translate' => 'Тәрҗемә',
 7530+ 'centralnotice-english' => 'инглиз',
 7531+ 'centralnotice-banner-name' => 'Үрнәкнең исеме',
 7532+ 'centralnotice-templates' => 'Үрнәкләр',
 7533+ 'centralnotice-weight' => 'Киңлек',
 7534+ 'centralnotice-locked' => 'Чикләнгән',
 7535+ 'centralnotice-notices' => 'хәбәрләр',
 7536+ 'centralnotice-notice-exists' => 'Мондый хәбәр бар инде',
 7537+ 'centralnotice-template-exists' => 'Мондый үрнәк бар инде',
 7538+ 'centralnotice-notice-doesnt-exist' => 'Мондый хәбәр юк',
 7539+ 'centralnotice-remove-notice-doesnt-exist' => 'Мондый хәбәрне юкка чыгару мөмкин түгел, чөнки ул юк',
 7540+ 'centralnotice-template-still-bound' => 'Үрнәк һаман хәбәргә бәйләнгән, юкка чыгарырга мөмкин түгел.',
 7541+ 'centralnotice-template-body' => 'Үрнәкнең эчтәлеге:',
 7542+ 'centralnotice-day' => 'Көн',
 7543+ 'centralnotice-year' => 'Ел',
 7544+ 'centralnotice-month' => 'Ай',
 7545+ 'centralnotice-hours' => 'Сәгать',
 7546+ 'centralnotice-min' => 'Минут',
 7547+ 'centralnotice-project-lang' => 'Проектның теле',
 7548+ 'centralnotice-project-name' => 'Проектның исеме',
 7549+ 'centralnotice-start-date' => 'Башлау вакыты',
 7550+ 'centralnotice-start-time' => 'Башлау сәгате (UTC)',
 7551+ 'centralnotice-assigned-templates' => 'Куелган үрнәкләр',
 7552+ 'centralnotice-no-templates' => 'Үрнәкләр табылмады',
 7553+ 'centralnotice-no-templates-assigned' => 'Үрнәккә бәйләнгән хәбәрләр юк',
 7554+ 'centralnotice-available-templates' => 'Үрнәкләр',
 7555+ 'centralnotice-template-already-exists' => 'Үрнәк өстәлмәде',
 7556+ 'centralnotice-preview-template' => 'Алдан карау',
 7557+ 'centralnotice-start-hour' => 'Башлау сәгате (GMT)',
 7558+ 'centralnotice-change-lang' => 'Тәрҗемә телен үзгәртү',
 7559+ 'centralnotice-weights' => 'Үлчәү',
 7560+ 'centralnotice-notice-is-locked' => 'Хәбәр чикләнде',
 7561+ 'centralnotice-overlap' => 'Хәбәр башка хәбәр белән чикләнә',
 7562+ 'centralnotice-invalid-date-range' => 'Вакыт дөрес түгел',
 7563+ 'centralnotice-null-string' => 'Буш юлны өстәү мөмкин түгел',
 7564+ 'centralnotice-confirm-delete' => 'Сез моны бетерергә ризамы?',
 7565+ 'centralnotice-no-notices-exist' => 'Хәбәрләр юк',
 7566+ 'centralnotice-no-templates-translate' => 'Тәрҗемәне карау өчен үрнәк юк',
 7567+ 'centralnotice-number-uses' => 'Кулланыла',
 7568+ 'centralnotice-edit-template' => 'Үрнәкне үзгәртергә',
 7569+ 'centralnotice-edit-template-summary' => 'Локалләштерелгән хат язу өчен, сез җөмләне өчле фигуралы җәяләргә алырга тиешсез. Мәсәлән {{{өземтә-Сәлам}}}.',
 7570+ 'centralnotice-message' => 'Хат',
 7571+ 'centralnotice-message-not-set' => 'Хат тикшерелмәде',
 7572+ 'centralnotice-clone' => 'Кабатлау',
 7573+ 'centralnotice-clone-notice' => 'Үрнәне кабатлап ясау',
 7574+ 'centralnotice-clone-name' => 'Исеме:',
 7575+ 'centralnotice-preview-all-template-translations' => 'Үрнәкнең мөмкин булган тәрҗемәләрен карарга',
 7576+ 'centralnotice-insert' => 'Өстәү: $1',
 7577+ 'centralnotice-hide-button' => '{{int:centralnotice-shared-hide}} төймәсе',
 7578+ 'centralnotice-collapse-button' => '{{int:centralnotice-shared-collapse}} төймәсе',
 7579+ 'centralnotice-expand-button' => '{{int:centralnotice-shared-expand}} төймәсе',
 7580+ 'right-centralnotice-admin' => 'Үзәкләштерелгән идарә иту системасы',
 7581+ 'right-centralnotice-translate' => 'Хәбәрләрне тәрҗемә итү',
 7582+ 'action-centralnotice-admin' => 'үзәкләштерелгән идарә иту системасы',
 7583+ 'action-centralnotice-translate' => 'хәбәрләрне тәрҗемә итү',
 7584+ 'centralnotice-preferred' => 'Катгый рәвештә',
 7585+);
 7586+
65377587 /** Udmurt (Удмурт)
65387588 * @author Kaganer
65397589 */
@@ -6543,6 +7593,9 @@
65447594 /** Ukrainian (Українська)
65457595 * @author Ahonc
65467596 * @author Aleksandrit
 7597+ * @author Riwnodennyk
 7598+ * @author Ytsukeng Fyvaprol
 7599+ * @author Тест
65477600 */
65487601 $messages['uk'] = array(
65497602 'centralnotice' => 'Управління централізованими сповіщеннями',
@@ -6560,8 +7613,10 @@
65617614 'centralnotice-remove' => 'Вилучити',
65627615 'centralnotice-translate-heading' => 'Переклад для $1',
65637616 'centralnotice-manage' => 'Управління централізованими сповіщеннями',
 7617+ 'centralnotice-manage-templates' => 'Управління банерами',
65647618 'centralnotice-add' => 'Додати',
65657619 'centralnotice-add-notice' => 'Додати повідомлення',
 7620+ 'centralnotice-edit-notice' => 'Змінити кампанію',
65667621 'centralnotice-add-template' => 'Додати шаблон',
65677622 'centralnotice-show-notices' => 'Показати повідомлення',
65687623 'centralnotice-list-templates' => 'Cписок шаблонів',
@@ -6569,17 +7624,21 @@
65707625 'centralnotice-translate-to' => 'Переклад на',
65717626 'centralnotice-translate' => 'Переклад',
65727627 'centralnotice-english' => 'англійську',
6573 - 'centralnotice-template-name' => 'Назва шаблону',
 7628+ 'centralnotice-banner-name' => 'Назва шаблону',
 7629+ 'centralnotice-banner' => 'Банер',
 7630+ 'centralnotice-banner-heading' => 'Банер: $1',
65747631 'centralnotice-templates' => 'Шаблони',
65757632 'centralnotice-weight' => 'Ширина',
65767633 'centralnotice-locked' => 'Заблокований',
 7634+ 'centralnotice-notice' => 'Кампанія',
65777635 'centralnotice-notices' => 'повідомлення',
65787636 'centralnotice-notice-exists' => 'Повідомлення вже існує.
65797637 Не додається',
65807638 'centralnotice-template-exists' => 'Шаблон вже існує.
65817639 Не додається',
6582 - 'centralnotice-notice-doesnt-exist' => 'Повідомлення не існує.
6583 -Нема чого видаляти',
 7640+ 'centralnotice-notice-doesnt-exist' => 'Кампанії не існує.',
 7641+ 'centralnotice-remove-notice-doesnt-exist' => 'Кампанії не існує.
 7642+Нема чого вилучати.',
65847643 'centralnotice-template-still-bound' => "Шаблон, як і раніше, пов'язаний з повідомленням.
65857644 Не видаляється.",
65867645 'centralnotice-template-body' => 'Тіло шаблону:',
@@ -6601,7 +7660,7 @@
66027661 'centralnotice-template-already-exists' => "Шаблон вже прив'язаний.
66037662 Не доданий",
66047663 'centralnotice-preview-template' => 'Попередній перегляд шаблону',
6605 - 'centralnotice-start-hour' => 'Час початку',
 7664+ 'centralnotice-start-hour' => 'Час початку (GMT)',
66067665 'centralnotice-change-lang' => 'Змінити мову перекладу',
66077666 'centralnotice-weights' => 'Ваги',
66087667 'centralnotice-notice-is-locked' => 'Повідомлення заблоковано.
@@ -6619,11 +7678,16 @@
66207679 'centralnotice-no-templates-translate' => 'Не має ні одного шаблону для редагування перекладу',
66217680 'centralnotice-number-uses' => 'Використовуються',
66227681 'centralnotice-edit-template' => 'Редагувати шаблон',
 7682+ 'centralnotice-edit-template-summary' => 'Щоб створити повідомлення, яке можна локалізувати, укладіть рядок з дефісом в три фігурні дужки, наприклад {{{цитата-джимбо}}}.',
66237683 'centralnotice-message' => 'Повідомлення',
66247684 'centralnotice-message-not-set' => 'Повідомлення не встановлено',
66257685 'centralnotice-clone' => 'Клонування',
66267686 'centralnotice-clone-notice' => 'Створити копію шаблона',
 7687+ 'centralnotice-clone-name' => 'Назва:',
66277688 'centralnotice-preview-all-template-translations' => 'Переглянути всі доступні переклади шаблону',
 7689+ 'centralnotice-donate-button' => 'Ґудзик для пожертв',
 7690+ 'centralnotice-banner-anonymous' => 'Анонімні користувачі',
 7691+ 'centralnotice-banner-type' => 'Тип банера:',
66287692 'right-centralnotice-admin' => 'Управління централізованими сповіщеннями',
66297693 'right-centralnotice-translate' => 'Переклад централізованих повідомлень',
66307694 'action-centralnotice-admin' => 'управління централізованими сповіщеннями',
@@ -6660,7 +7724,7 @@
66617725 'centralnotice-translate-to' => 'Tradusi con',
66627726 'centralnotice-translate' => 'Tradusi',
66637727 'centralnotice-english' => 'Inglese',
6664 - 'centralnotice-template-name' => 'Nome modeło',
 7728+ 'centralnotice-banner-name' => 'Nome modeło',
66657729 'centralnotice-templates' => 'Modèi',
66667730 'centralnotice-weight' => 'Peso',
66677731 'centralnotice-locked' => 'Blocà',
@@ -6727,7 +7791,7 @@
67287792 */
67297793 $messages['vi'] = array(
67307794 'centralnotice' => 'Quản lý các thông báo chung',
6731 - 'noticetemplate' => 'Bản mẫu thông báo chung',
 7795+ 'noticetemplate' => 'Bảng thông báo chung',
67327796 'centralnotice-desc' => 'Thêm thông báo ở đầu các trang tại hơn một wiki',
67337797 'centralnotice-summary' => 'Dùng phần này, bạn có thể sửa đổi các thông báo chung đã được thiết lập, cũng như thêm thông báo mới hoặc dời thông báo cũ.',
67347798 'centralnotice-query' => 'Sửa đổi các thông báo hiện hành',
@@ -6735,63 +7799,93 @@
67367800 'centralnotice-end-date' => 'Ngày kết thúc',
67377801 'centralnotice-enabled' => 'Đang hiện',
67387802 'centralnotice-modify' => 'Lưu các thông báo',
 7803+ 'centralnotice-save-banner' => 'Lưu bảng',
67397804 'centralnotice-preview' => 'Xem trước',
67407805 'centralnotice-add-new' => 'Thêm thông báo chung mới',
67417806 'centralnotice-remove' => 'Dời',
67427807 'centralnotice-translate-heading' => 'Dịch $1',
67437808 'centralnotice-manage' => 'Quản lý thông báo chung',
 7809+ 'centralnotice-manage-templates' => 'Quản lý bảng',
67447810 'centralnotice-add' => 'Thêm',
67457811 'centralnotice-add-notice' => 'Thêm thông báo',
6746 - 'centralnotice-add-template' => 'Thêm bản mẫu',
 7812+ 'centralnotice-edit-notice' => 'Sửa đổi cuộc vận động',
 7813+ 'centralnotice-add-template' => 'Thêm bảng',
67477814 'centralnotice-show-notices' => 'Xem các thông báo',
6748 - 'centralnotice-list-templates' => 'Liệt kê các bản mẫu',
 7815+ 'centralnotice-list-templates' => 'Liệt kê các bảng',
 7816+ 'centralnotice-multiple_languages' => 'đa ngữ ($1)',
67497817 'centralnotice-translations' => 'Bản dịch',
67507818 'centralnotice-translate-to' => 'Dịch ra',
67517819 'centralnotice-translate' => 'Biên dịch',
67527820 'centralnotice-english' => 'tiếng Anh',
6753 - 'centralnotice-template-name' => 'Tên bản mẫu',
6754 - 'centralnotice-templates' => 'Bản mẫu',
 7821+ 'centralnotice-banner-name' => 'Tên bảng',
 7822+ 'centralnotice-banner' => 'Bảng',
 7823+ 'centralnotice-banner-heading' => 'Bảng: $1',
 7824+ 'centralnotice-templates' => 'Bảng',
67557825 'centralnotice-weight' => 'Mức ưu tiên',
67567826 'centralnotice-locked' => 'Bị khóa',
 7827+ 'centralnotice-notice' => 'Cuộc vận động',
 7828+ 'centralnotice-notice-heading' => 'Cuộc vận động: $1',
67577829 'centralnotice-notices' => 'Thông báo',
67587830 'centralnotice-notice-exists' => 'Không thêm được: thông báo đã tồn tại.',
6759 - 'centralnotice-template-exists' => 'Không thêm được: bản mẫu đã tồn tại.',
6760 - 'centralnotice-notice-doesnt-exist' => 'Không dời được: thông báo không tồn tại.',
6761 - 'centralnotice-template-still-bound' => 'Không dời được: có thông báo dựa theo bản mẫu.',
6762 - 'centralnotice-template-body' => 'Nội dung bản mẫu:',
 7831+ 'centralnotice-no-language' => 'Không thêm được: chưa chọn ngôn ngữ cho cuộc vận động.',
 7832+ 'centralnotice-template-exists' => 'Không thêm được: bảng đã tồn tại.',
 7833+ 'centralnotice-notice-doesnt-exist' => 'Cuộc vận động không tồn tại.',
 7834+ 'centralnotice-remove-notice-doesnt-exist' => 'Cuộc vận động không tồn tại.
 7835+Không có gì để dời.',
 7836+ 'centralnotice-template-still-bound' => 'Không dời được: có thông báo dựa theo cuộc vận động.',
 7837+ 'centralnotice-template-body' => 'Nội dung bảng:',
67637838 'centralnotice-day' => 'Ngày',
67647839 'centralnotice-year' => 'Năm',
67657840 'centralnotice-month' => 'Tháng',
67667841 'centralnotice-hours' => 'Giờ',
67677842 'centralnotice-min' => 'Phút',
67687843 'centralnotice-project-lang' => 'Ngôn ngữ của dự án',
 7844+ 'centralnotice-select' => 'Chọn: $1',
 7845+ 'centralnotice-top-ten-languages' => 'Top 10 ngôn ngữ',
67697846 'centralnotice-project-name' => 'Tên dự án',
67707847 'centralnotice-start-date' => 'Ngày bắt đầu',
67717848 'centralnotice-start-time' => 'Lúc bắt đầu (UTC)',
6772 - 'centralnotice-assigned-templates' => 'Bản mẫu được sử dụng',
6773 - 'centralnotice-no-templates' => 'Hệ thống không chứa bản mẫu.
 7849+ 'centralnotice-assigned-templates' => 'Bảng được sử dụng',
 7850+ 'centralnotice-no-templates' => 'Hệ thống không chứa bảng.
67747851 Hãy thêm vào!',
6775 - 'centralnotice-no-templates-assigned' => 'Thông báo không dùng bản mẫu nào. Hãy chỉ định bản mẫu!',
6776 - 'centralnotice-available-templates' => 'Bản mẫu có sẵn',
6777 - 'centralnotice-template-already-exists' => 'Không chỉ định được: thông báo đã sử dụng bản mẫu.',
6778 - 'centralnotice-preview-template' => 'Xem trước bản mẫu',
6779 - 'centralnotice-start-hour' => 'Lúc bắt đầu',
 7852+ 'centralnotice-no-templates-assigned' => 'Cuộc vận động không dùng bảng nào. Hãy chỉ định bảng!',
 7853+ 'centralnotice-available-templates' => 'Bảng có sẵn',
 7854+ 'centralnotice-template-already-exists' => 'Không chỉ định được: thông báo đã sử dụng bảng.',
 7855+ 'centralnotice-preview-template' => 'Xem trước bảng',
 7856+ 'centralnotice-start-hour' => 'Lúc bắt đầu (UTC)',
67807857 'centralnotice-change-lang' => 'Thay đổi ngôn ngữ của bản dịch',
67817858 'centralnotice-weights' => 'Mức ưu tiên',
67827859 'centralnotice-notice-is-locked' => 'Không dời được: thông báo bị khóa.',
67837860 'centralnotice-overlap' => 'Không thêm được: thông báo sẽ hiện cùng lúc với thông báo khác.',
67847861 'centralnotice-invalid-date-range' => 'Không cập nhật được: thời gian không hợp lệ.',
67857862 'centralnotice-null-string' => 'Không thêm được: chuỗi rỗng.',
6786 - 'centralnotice-confirm-delete' => 'Bạn có chắc muốn xóa thông báo hoặc bản mẫu này không? Không thể phục hồi nó.',
 7863+ 'centralnotice-confirm-delete' => 'Bạn có chắc muốn xóa không? Không thể lùi lại tác vụ này.',
67877864 'centralnotice-no-notices-exist' => 'Chưa có thông báo. Hãy thêm thông báo ở dưới.',
67887865 'centralnotice-no-templates-translate' => 'Không có bản mẫu để dịch',
67897866 'centralnotice-number-uses' => 'Số thông báo dùng',
 7867+ 'centralnotice-settings' => 'Thiết lập',
67907868 'centralnotice-edit-template' => 'Sửa đổi bản mẫu',
 7869+ 'centralnotice-edit-template-summary' => 'Để tạo thông điệp có thể bản địa hóa, đóng chuỗi ngắt trong ba dấu ngoặc kép, ví dụ {{{jimbo-quote}}}.',
67917870 'centralnotice-message' => 'Thông báo',
67927871 'centralnotice-message-not-set' => 'Thông báo chưa được thiết lập',
67937872 'centralnotice-clone' => 'Sao',
67947873 'centralnotice-clone-notice' => 'Tạo bản sao của bản mẫu',
6795 - 'centralnotice-preview-all-template-translations' => 'Xem trước các bản dịch có sẵn của bản mẫu',
 7874+ 'centralnotice-clone-name' => 'Tên:',
 7875+ 'centralnotice-preview-all-template-translations' => 'Xem trước các bản dịch có sẵn của bảng',
 7876+ 'centralnotice-insert' => 'Chèn: $1',
 7877+ 'centralnotice-hide-button' => 'Nút {{int:centralnotice-shared-hide}}',
 7878+ 'centralnotice-collapse-button' => 'Nút {{int:centralnotice-shared-collapse}}',
 7879+ 'centralnotice-expand-button' => 'Nút {{int:centralnotice-shared-expand}}',
 7880+ 'centralnotice-translate-button' => 'Nút giúp dịch',
 7881+ 'centralnotice-donate-button' => 'Nút quyên góp',
 7882+ 'centralnotice-expanded-banner' => 'Bảng mở rộng',
 7883+ 'centralnotice-collapsed-banner' => 'Bảng thu nhỏ',
 7884+ 'centralnotice-banner-display' => 'Hiển thị cho:',
 7885+ 'centralnotice-banner-anonymous' => 'Người dùng vô danh',
 7886+ 'centralnotice-banner-logged-in' => 'Thành viên đã đăng nhập',
 7887+ 'centralnotice-banner-type' => 'Kiểu bảng:',
 7888+ 'centralnotice-banner-hidable' => 'Cố định / Ẩn được',
 7889+ 'centralnotice-banner-collapsible' => 'Thu nhỏ được',
67967890 'right-centralnotice-admin' => 'Quản lý thông báo chung',
67977891 'right-centralnotice-translate' => 'Dịch thông báo chung',
67987892 'action-centralnotice-admin' => 'quản lý thông báo chung',
@@ -6818,7 +7912,7 @@
68197913 'centralnotice-translate-to' => 'Tradutön ini',
68207914 'centralnotice-translate' => 'Tradutön',
68217915 'centralnotice-english' => 'Linglänapük',
6822 - 'centralnotice-template-name' => 'Nem samafomota',
 7916+ 'centralnotice-banner-name' => 'Nem samafomota',
68237917 'centralnotice-templates' => 'Samafomots',
68247918 'centralnotice-locked' => 'Pelökofärmükon',
68257919 'centralnotice-template-exists' => 'Samafomot ya dabinon.
@@ -6861,7 +7955,7 @@
68627956 'centralnotice-translate-to' => 'פֿאַרטייטשן אויף',
68637957 'centralnotice-translate' => 'פֿאַרטייטשן',
68647958 'centralnotice-english' => 'ענגליש',
6865 - 'centralnotice-template-name' => 'מוסטער נאמען',
 7959+ 'centralnotice-banner-name' => 'מוסטער נאמען',
68667960 'centralnotice-templates' => 'מוסטערן',
68677961 'centralnotice-locked' => 'פֿאַרשלאסן',
68687962 'centralnotice-notices' => 'נאטיצן',
@@ -6887,9 +7981,11 @@
68887982 );
68897983
68907984 /** Cantonese (粵語)
 7985+ * @author Horacewai2
68917986 * @author Shinjiman
68927987 */
68937988 $messages['yue'] = array(
 7989+ 'centralnotice' => '統一通告管理',
68947990 'centralnotice-desc' => '加入一個中央公告欄',
68957991 );
68967992
@@ -6899,6 +7995,7 @@
69007996 * @author Gzdavidwong
69017997 * @author Liangent
69027998 * @author Wmr89502270
 7999+ * @author Xiaomingyan
69038000 */
69048001 $messages['zh-hans'] = array(
69058002 'centralnotice' => '中央通告管理',
@@ -6925,7 +8022,7 @@
69268023 'centralnotice-translate-to' => '翻译到',
69278024 'centralnotice-translate' => '翻译',
69288025 'centralnotice-english' => '英语',
6929 - 'centralnotice-template-name' => '模板名称',
 8026+ 'centralnotice-banner-name' => '模板名称',
69308027 'centralnotice-templates' => '模板',
69318028 'centralnotice-weight' => '权重',
69328029 'centralnotice-locked' => '已锁定',
@@ -6938,13 +8035,14 @@
69398036 没有东西移除',
69408037 'centralnotice-template-still-bound' => '模板不存在。
69418038 没有东西移除。',
6942 - 'centralnotice-template-body' => '模板体:',
 8039+ 'centralnotice-template-body' => '模板主体:',
69438040 'centralnotice-day' => '日',
69448041 'centralnotice-year' => '年',
69458042 'centralnotice-month' => '月',
69468043 'centralnotice-hours' => '时',
69478044 'centralnotice-min' => '分',
69488045 'centralnotice-project-lang' => '计划语言',
 8046+ 'centralnotice-select' => '选定',
69498047 'centralnotice-project-name' => '计划名称',
69508048 'centralnotice-start-date' => '开始日期',
69518049 'centralnotice-start-time' => '开始时间(UTC)',
@@ -6975,11 +8073,14 @@
69768074 'centralnotice-no-templates-translate' => '没有任何可以编辑翻译的模板',
69778075 'centralnotice-number-uses' => '使用',
69788076 'centralnotice-edit-template' => '编辑模板',
 8077+ 'centralnotice-edit-template-summary' => '要创建一个可本地化的消息,使用三个{,例如{{{jimbo-quote}}}。',
69798078 'centralnotice-message' => '消息',
69808079 'centralnotice-message-not-set' => '没有设置消息',
69818080 'centralnotice-clone' => '建立副本',
69828081 'centralnotice-clone-notice' => '创建一个模板的副本',
 8082+ 'centralnotice-clone-name' => '名称',
69838083 'centralnotice-preview-all-template-translations' => '预览模板的所有可用翻译',
 8084+ 'centralnotice-insert' => '插入',
69848085 'right-centralnotice-admin' => '管理中央通告',
69858086 'right-centralnotice-translate' => '翻译中央通告',
69868087 'action-centralnotice-admin' => '管理中央通告',
@@ -6989,6 +8090,7 @@
69908091
69918092 /** Traditional Chinese (‪中文(繁體)‬)
69928093 * @author Alex S.H. Lin
 8094+ * @author Frankou
69938095 * @author Horacewai2
69948096 * @author Liangent
69958097 * @author Wrightbus
@@ -7018,7 +8120,7 @@
70198121 'centralnotice-translate-to' => '翻譯到',
70208122 'centralnotice-translate' => '翻譯',
70218123 'centralnotice-english' => '英語',
7022 - 'centralnotice-template-name' => '模板名稱',
 8124+ 'centralnotice-banner-name' => '模板名稱',
70238125 'centralnotice-templates' => '模板',
70248126 'centralnotice-weight' => '權重',
70258127 'centralnotice-locked' => '已鎖定',
@@ -7068,6 +8170,7 @@
70698171 'centralnotice-no-templates-translate' => '沒有任何可以編輯翻譯的模板',
70708172 'centralnotice-number-uses' => '使用',
70718173 'centralnotice-edit-template' => '編輯模板',
 8174+ 'centralnotice-edit-template-summary' => '要創建一個可本地化的消息,使用三個大括號,例如{{{jimbo-quote}}}。',
70728175 'centralnotice-message' => '消息',
70738176 'centralnotice-message-not-set' => '沒有設置消息',
70748177 'centralnotice-clone' => '建立副本',
Index: branches/wmf/1.16wmf4/extensions/CentralNotice/up-arrow.png
Cannot display: file marked as a binary type.
svn:mime-type = image/png
Property changes on: branches/wmf/1.16wmf4/extensions/CentralNotice/up-arrow.png
___________________________________________________________________
Added: svn:mime-type
70758178 + image/png
Index: branches/wmf/1.16wmf4/extensions/CentralNotice/SpecialNoticeTemplate.php
@@ -6,54 +6,30 @@
77 }
88
99 class SpecialNoticeTemplate extends UnlistedSpecialPage {
10 - public $limitsShown = array( 20, 50, 100 );
11 - public $defaultLimit = 20;
12 - public $mOffset, $mLimit;
13 - protected $indexField = 'tmp_id';
14 - protected $mDb;
15 -
16 - /* Functions */
 10+ var $editable;
1711
1812 function __construct() {
19 - // Initialize special page
20 - global $wgRequest;
21 - $this->mRequest = $wgRequest;
22 -
23 - # NB: the offset is quoted, not validated. It is treated as an
24 - # arbitrary string to support the widest variety of index types. Be
25 - # careful outputting it into HTML!
26 - $this->mOffset = $this->mRequest->getText( 'offset' );
27 -
28 - # Set the limit, default to 20, ignore User default
29 - $limit = $this->mRequest->getInt( 'limit', 0 );
30 - if ( $limit <= 0 ) {
31 - $limit = 20;
32 - }
33 - if ( $limit > 5000 ) {
34 - $limit = 5000; # We have *some* limits...
35 - }
36 - $this->mLimit = $limit;
37 -
38 - $this->mDb = wfGetDB( DB_SLAVE );
39 -
4013 parent::__construct( 'NoticeTemplate' );
4114
4215 // Internationalization
4316 wfLoadExtensionMessages( 'CentralNotice' );
4417 }
4518
46 - /*
47 - * Handle different types of page requests.
 19+ /**
 20+ * Handle different types of page requests
4821 */
4922 function execute( $sub ) {
50 - global $wgOut, $wgUser, $wgRequest;
 23+ global $wgOut, $wgUser, $wgRequest, $wgScriptPath;
5124
5225 // Begin output
5326 $this->setHeaders();
 27+
 28+ // Add style file to the output headers
 29+ $wgOut->addExtensionStyle( "$wgScriptPath/extensions/CentralNotice/centralnotice.css" );
 30+
 31+ // Add script file to the output headers
 32+ $wgOut->addScriptFile( "$wgScriptPath/extensions/CentralNotice/centralnotice.js" );
5433
55 - // Get current skin
56 - $sk = $wgUser->getSkin();
57 -
5834 // Check permissions
5935 $this->editable = $wgUser->isAllowed( 'centralnotice-admin' );
6036
@@ -63,14 +39,21 @@
6440 // Show header
6541 CentralNotice::printHeader();
6642
67 - if ( $this->editable ) {
68 - // Handle forms
69 - if ( $wgRequest->wasPosted() ) {
 43+ // Begin Banners tab content
 44+ $wgOut->addHTML( Xml::openElement( 'div', array( 'id' => 'preferences' ) ) );
 45+
 46+ $method = $wgRequest->getVal( 'wpMethod' );
 47+
 48+ // Handle form submissions
 49+ if ( $this->editable && $wgRequest->wasPosted() ) {
 50+
 51+ // Check authentication token
 52+ if ( $wgUser->matchEditToken( $wgRequest->getVal( 'authtoken' ) ) ) {
7053
71 - // Handle removing
 54+ // Handle removing banners
7255 $toRemove = $wgRequest->getArray( 'removeTemplates' );
7356 if ( isset( $toRemove ) ) {
74 - // Remove templates in list
 57+ // Remove banners in list
7558 foreach ( $toRemove as $template ) {
7659 $this->removeTemplate( $template );
7760 }
@@ -78,429 +61,485 @@
7962
8063 // Handle translation message update
8164 $update = $wgRequest->getArray( 'updateText' );
82 - $token = $wgRequest->getArray( 'token' );
8365 if ( isset ( $update ) ) {
8466 foreach ( $update as $lang => $messages ) {
8567 foreach ( $messages as $text => $translation ) {
8668 // If we actually have text
8769 if ( $translation ) {
88 - $this->updateMessage( $text, $translation, $lang, $token );
 70+ $this->updateMessage( $text, $translation, $lang );
8971 }
9072 }
9173 }
9274 }
93 - }
9475
95 - // Handle adding
96 - // FIXME: getText()? weak comparison
97 - if ( $wgRequest->getVal( 'wpMethod' ) == 'addTemplate' ) {
98 - $this->addTemplate(
99 - $wgRequest->getVal( 'templateName' ),
100 - $wgRequest->getVal( 'templateBody' )
101 - );
102 - $sub = 'view';
 76+ // Handle adding banner
 77+ // FIXME: getText()? weak comparison
 78+ if ( $method == 'addTemplate' ) {
 79+ $newTemplateName = $wgRequest->getVal( 'templateName' );
 80+ $newTemplateBody = $wgRequest->getVal( 'templateBody' );
 81+ if ( $newTemplateName != '' && $newTemplateBody != '' ) {
 82+ $this->addTemplate(
 83+ $newTemplateName,
 84+ $newTemplateBody,
 85+ $wgRequest->getBool( 'displayAnon' ),
 86+ $wgRequest->getBool( 'displayAccount' )
 87+ );
 88+ $sub = 'view';
 89+ } else {
 90+ $wgOut->wrapWikiMsg( "<div class='cn-error'>\n$1\n</div>", 'centralnotice-null-string' );
 91+ }
 92+ }
 93+
 94+ // Handle editing banner
 95+ if ( $method == 'editTemplate' ) {
 96+ $this->editTemplate(
 97+ $wgRequest->getVal( 'template' ),
 98+ $wgRequest->getVal( 'templateBody' ),
 99+ $wgRequest->getBool( 'displayAnon' ),
 100+ $wgRequest->getBool( 'displayAccount' )
 101+ );
 102+ $sub = 'view';
 103+ }
 104+
 105+ } else {
 106+ $wgOut->wrapWikiMsg( "<div class='cn-error'>\n$1\n</div>", 'sessionfailure' );
103107 }
104 - if ( $wgRequest->getVal( 'wpMethod' ) == 'editTemplate' ) {
105 - $this->editTemplate(
106 - $wgRequest->getVal( 'template' ),
107 - $wgRequest->getVal( 'templateBody' )
108 - );
109 - $sub = 'view';
110 - }
 108+
111109 }
112110
113 - // Handle viewiing of a template in all languages
 111+ // Handle viewing of a banner in all languages
114112 if ( $sub == 'view' && $wgRequest->getVal( 'wpUserLanguage' ) == 'all' ) {
115113 $template = $wgRequest->getVal( 'template' );
116114 $this->showViewAvailable( $template );
 115+ $wgOut->addHTML( Xml::closeElement( 'div' ) );
117116 return;
118117 }
119118
120 - // Handle viewing a specific template
 119+ // Handle viewing a specific banner
121120 if ( $sub == 'view' && $wgRequest->getText( 'template' ) != '' ) {
122121 $this->showView();
 122+ $wgOut->addHTML( Xml::closeElement( 'div' ) );
123123 return;
124124 }
125125
126126 if ( $this->editable ) {
127 - // Handle viewing a specific template
 127+ // Handle showing "Add a banner" interface
128128 if ( $sub == 'add' ) {
129129 $this->showAdd();
 130+ $wgOut->addHTML( Xml::closeElement( 'div' ) );
130131 return;
131132 }
132 -
 133+
 134+ // Handle cloning a specific banner
133135 if ( $sub == 'clone' ) {
134 - $oldTemplate = $wgRequest->getVal( 'oldTemplate' );
135 - $newTemplate = $wgRequest->getVal( 'newTemplate' );
136 - // We use the returned name in case any special characters had to be removed
137 - $template = $this->cloneTemplate( $oldTemplate, $newTemplate );
138 - $wgOut->redirect( SpecialPage::getTitleFor( 'NoticeTemplate', 'view' )->getLocalUrl( "template=$template" ) );
139 - return;
 136+
 137+ // Check authentication token
 138+ if ( $wgUser->matchEditToken( $wgRequest->getVal( 'authtoken' ) ) ) {
 139+
 140+ $oldTemplate = $wgRequest->getVal( 'oldTemplate' );
 141+ $newTemplate = $wgRequest->getVal( 'newTemplate' );
 142+ // We use the returned name in case any special characters had to be removed
 143+ $template = $this->cloneTemplate( $oldTemplate, $newTemplate );
 144+ $wgOut->redirect( $this->getTitle( 'view' )->getLocalUrl( "template=$template" ) );
 145+ return;
 146+
 147+ } else {
 148+ $wgOut->wrapWikiMsg( "<div class='cn-error'>\n$1\n</div>", 'sessionfailure' );
 149+ }
 150+
140151 }
 152+
141153 }
142154
143 - // Show list by default
 155+ // Show list of banners by default
144156 $this->showList();
 157+
 158+ // End Banners tab content
 159+ $wgOut->addHTML( Xml::closeElement( 'div' ) );
145160 }
146161
147 - /*
148 - * Show a list of available templates. Newer templates are shown first.
 162+ /**
 163+ * Show a list of available banners. Newer banners are shown first.
149164 */
150165 function showList() {
151 - global $wgOut, $wgUser, $wgRequest, $wgLang;
 166+ global $wgOut, $wgUser;
152167
153168 $sk = $wgUser->getSkin();
154 -
155 - // Templates
156 - $offset = $wgRequest->getVal( 'offset' );
157 - if ( $wgRequest->getVal( 'limit' ) ) {
158 - $limit = $wgRequest->getVal( 'limit' );
159 - } else {
160 - $limit = $this->defaultLimit;
161 - }
162 -
163 - $templates = $this->queryTemplates($offset, $limit);
 169+ $pager = new TemplatePager( $this );
 170+
 171+ // Begin building HTML
164172 $htmlOut = '';
165 - if ( count( $templates ) > 0 ) {
166173
 174+ // Begin Manage Banners fieldset
 175+ $htmlOut .= Xml::openElement( 'fieldset', array( 'class' => 'prefsection' ) );
 176+
 177+ if ( !$pager->getNumRows() ) {
 178+ $htmlOut .= Xml::element( 'p', null, wfMsg( 'centralnotice-no-templates' ) );
 179+ } else {
167180 if ( $this->editable ) {
168 - $htmlOut .= Xml::openElement( 'form',
169 - array(
170 - 'method' => 'post',
171 - 'action' => ''
172 - )
173 - );
 181+ $htmlOut .= Xml::openElement( 'form', array( 'method' => 'post' ) );
174182 }
175 - $htmlOut .= Xml::fieldset( wfMsg( 'centralnotice-available-templates' ) );
 183+ $htmlOut .= Xml::element( 'h2', null, wfMsg( 'centralnotice-manage-templates' ) );
176184
177 - //Show pagination links
178 - $opts = array( 'parsemag', 'escapenoentities' );
179 - $linkTexts = array(
180 - 'prev' => wfMsgExt( 'prevn', $opts, $wgLang->formatNum( $this->mLimit ) ),
181 - 'next' => wfMsgExt( 'nextn', $opts, $wgLang->formatNum($this->mLimit ) ),
182 - 'first' => wfMsgExt( 'page_first', $opts ),
183 - 'last' => wfMsgExt( 'page_last', $opts )
184 - );
185 - $pagingLinks = $this->getPagingLinks( $linkTexts, $offset, $limit );
186 - $limitLinks = $this->getLimitLinks();
187 - $limits = $wgLang->pipeList( $limitLinks );
188 - $htmlOut .= wfMsgHTML( 'viewprevnext', $pagingLinks['prev'], $pagingLinks['next'], $limits );
189 -
190 - $htmlOut .= Xml::openElement( 'table',
191 - array(
192 - 'cellpadding' => 9,
193 - 'width' => '100%'
194 - )
195 - );
 185+ // Show paginated list of banners
 186+ $htmlOut .= Xml::tags( 'div', array( 'class' => 'cn-pager' ), $pager->getNavigationBar() );
 187+ $htmlOut .= $pager->getBody();
 188+ $htmlOut .= Xml::tags( 'div', array( 'class' => 'cn-pager' ), $pager->getNavigationBar() );
 189+
196190 if ( $this->editable ) {
197 - $htmlOut .= Xml::element( 'th', array( 'align' => 'left', 'width' => '5%' ),
198 - wfMsg ( 'centralnotice-remove' )
199 - );
200 - }
201 - $htmlOut .= Xml::element( 'th', array( 'align' => 'left' ),
202 - wfMsg ( 'centralnotice-template-name' )
203 - );
204 -
205 - $msgConfirmDelete = wfMsgHTML( 'centralnotice-confirm-delete' );
206 -
207 - foreach ( $templates as $templateName ) {
208 - $viewPage = SpecialPage::getTitleFor( 'NoticeTemplate', 'view' );
209 - $htmlOut .= Xml::openElement( 'tr' );
210 -
211 - if ( $this->editable ) {
212 - // Remove box
213 - $htmlOut .= Xml::tags( 'td', array( 'valign' => 'top' ),
214 - Xml::check( 'removeTemplates[]', false,
215 - array(
216 - 'value' => $templateName,
217 - 'onchange' => "if(this.checked){this.checked=confirm('{$msgConfirmDelete}')}"
218 - )
219 - )
220 - );
221 - }
222 -
223 - // Link and Preview
224 - $render = new SpecialNoticeText();
225 - $render->project = 'wikipedia';
226 - $render->language = $wgRequest->getVal( 'wpUserLanguage' );
227 - $htmlOut .= Xml::tags( 'td', array( 'valign' => 'top' ),
228 - $sk->makeLinkObj( $viewPage,
229 - htmlspecialchars( $templateName ),
230 - 'template=' . urlencode( $templateName ) ) .
231 - Xml::fieldset( wfMsg( 'centralnotice-preview' ),
232 - $render->getHtmlNotice( $templateName )
233 - )
234 - );
235 -
236 - $htmlOut .= Xml::closeElement( 'tr' );
237 - }
238 - if ( $this->editable ) {
239 - $htmlOut .= Xml::tags( 'tr', null,
240 - Xml::tags( 'td', array( 'colspan' => 3 ),
241 - Xml::submitButton( wfMsg( 'centralnotice-modify' ) )
242 - )
243 - );
244 - }
245 - $htmlOut .= Xml::closeElement( 'table' );
246 -
247 - //Show pagination links
248 - $htmlOut .= wfMsgHTML( 'viewprevnext', $pagingLinks['prev'], $pagingLinks['next'], $limits );
249 -
250 - $htmlOut .= Xml::closeElement( 'fieldset' );
251 - if ( $this->editable ) {
252191 $htmlOut .= Xml::closeElement( 'form' );
253192 }
254 -
255 - } else {
256 - $htmlOut .= Xml::element( 'p', null, wfMsg( 'centralnotice-no-templates' ) );
257193 }
258 -
 194+
259195 if ( $this->editable ) {
260196 $htmlOut .= Xml::element( 'p' );
261 - $newPage = SpecialPage::getTitleFor( 'NoticeTemplate', 'add' );
 197+ $newPage = $this->getTitle( 'add' );
262198 $htmlOut .= $sk->makeLinkObj( $newPage, wfMsgHtml( 'centralnotice-add-template' ) );
263199 }
 200+
 201+ // End Manage Banners fieldset
 202+ $htmlOut .= Xml::closeElement( 'fieldset' );
264203
265 - // Output HTML
266204 $wgOut->addHTML( $htmlOut );
267205 }
268206
 207+ /**
 208+ * Show "Add a banner" interface
 209+ */
269210 function showAdd() {
270 - global $wgOut, $wgUser;
 211+ global $wgOut, $wgUser, $wgScriptPath, $wgLang, $wgRequest;
 212+ $scriptPath = "$wgScriptPath/extensions/CentralNotice";
271213
272214 // Build HTML
273 - $htmlOut = Xml::openElement( 'form', array( 'method' => 'post' ) );
274 - $htmlOut .= Xml::openElement( 'fieldset' );
275 - $htmlOut .= Xml::element( 'legend', null, wfMsg( 'centralnotice-add-template' ) );
 215+ $htmlOut = '';
 216+ $htmlOut .= Xml::openElement( 'fieldset', array( 'class' => 'prefsection' ) );
 217+ $htmlOut .= Xml::openElement( 'form', array( 'method' => 'post' ) );
 218+ $htmlOut .= Xml::element( 'h2', null, wfMsg( 'centralnotice-add-template' ) );
276219 $htmlOut .= Xml::hidden( 'wpMethod', 'addTemplate' );
277220 $htmlOut .= Xml::tags( 'p', null,
278 - Xml::inputLabel(
279 - wfMsg( 'centralnotice-template-name' ),
280 - 'templateName',
281 - 'templateName',
282 - 25
283 - )
 221+ Xml::inputLabel( wfMsg( 'centralnotice-banner-name' ), 'templateName', 'templateName', 25, $wgRequest->getVal( 'templateName' ) )
284222 );
285 - $htmlOut .= Xml::tags( 'p', null,
286 - Xml::textarea( 'templateBody', '', 60, 20 )
 223+
 224+ $htmlOut .= Xml::openElement( 'p', null );
 225+ $htmlOut .= wfMsg( 'centralnotice-banner-display' );
 226+ if ( $wgRequest->wasPosted() ) {
 227+ $displayAnon = $wgRequest->getCheck( 'displayAnon' ); // Restore checkbox state in event of error
 228+ } else {
 229+ $displayAnon = true; // Default is checked
 230+ }
 231+ $htmlOut .= Xml::check( 'displayAnon', $displayAnon, array( 'id' => 'displayAnon' ) );
 232+ $htmlOut .= Xml::label( wfMsg( 'centralnotice-banner-anonymous' ), 'displayAnon' );
 233+ if ( $wgRequest->wasPosted() ) {
 234+ $displayAccount = $wgRequest->getCheck( 'displayAccount' ); // Restore checkbox state in event of error
 235+ } else {
 236+ $displayAccount = true; // Default is checked
 237+ }
 238+ $htmlOut .= Xml::check( 'displayAccount', $displayAccount, array( 'id' => 'displayAccount' ) );
 239+ $htmlOut .= Xml::label( wfMsg( 'centralnotice-banner-logged-in' ), 'displayAccount' );
 240+ $htmlOut .= Xml::closeElement( 'p' );
 241+
 242+ $htmlOut .= Xml::fieldset( wfMsg( 'centralnotice-banner' ) );
 243+ $htmlOut .= wfMsg( 'centralnotice-edit-template-summary' );
 244+ $buttons = array();
 245+ $buttons[] = '<a href="#" onclick="insertButton(\'hide\');return false;">' . wfMsg( 'centralnotice-hide-button' ) . '</a>';
 246+ $buttons[] = '<a href="#" onclick="insertButton(\'translate\');return false;">' . wfMsg( 'centralnotice-translate-button' ) . '</a>';
 247+ $htmlOut .= Xml::tags( 'div',
 248+ array( 'style' => 'margin-bottom: 0.2em;' ),
 249+ '<img src="'.$scriptPath.'/down-arrow.png" style="vertical-align:baseline;"/>' . wfMsg( 'centralnotice-insert', $wgLang->commaList( $buttons ) )
287250 );
288 - $htmlOut .= Xml::tags( 'p', null,
289 - Xml::submitButton( wfMsg( 'centralnotice-modify' ) )
290 - );
 251+
 252+ // Restore banner body state in the event of an error on form submit
 253+ $body = $wgRequest->getVal( 'templateBody', '' );
 254+
 255+ $htmlOut .= Xml::textarea( 'templateBody', $body, 60, 20 );
291256 $htmlOut .= Xml::closeElement( 'fieldset' );
 257+ $htmlOut .= Xml::hidden( 'authtoken', $wgUser->editToken() );
 258+
 259+ // Submit button
 260+ $htmlOut .= Xml::tags( 'div',
 261+ array( 'class' => 'cn-buttons' ),
 262+ Xml::submitButton( wfMsg( 'centralnotice-save-banner' ) )
 263+ );
 264+
292265 $htmlOut .= Xml::closeElement( 'form' );
 266+ $htmlOut .= Xml::closeElement( 'fieldset' );
293267
294268 // Output HTML
295269 $wgOut->addHTML( $htmlOut );
296270 }
297 -
 271+
 272+ /**
 273+ * View or edit an individual banner
 274+ */
298275 private function showView() {
299 - global $wgOut, $wgUser, $wgRequest, $wgContLanguageCode;
300 -
 276+ global $wgOut, $wgUser, $wgRequest, $wgContLanguageCode, $wgScriptPath, $wgLang;
 277+
 278+ $scriptPath = "$wgScriptPath/extensions/CentralNotice";
301279 $sk = $wgUser->getSkin();
 280+
302281 if ( $this->editable ) {
303282 $readonly = array();
 283+ $disabled = array();
304284 } else {
305285 $readonly = array( 'readonly' => 'readonly' );
 286+ $disabled = array( 'disabled' => 'disabled' );
306287 }
307288
308 - // Get token
309 - $token = $wgUser->editToken();
310 -
311289 // Get user's language
312290 $wpUserLang = $wgRequest->getVal( 'wpUserLanguage' ) ? $wgRequest->getVal( 'wpUserLanguage' ) : $wgContLanguageCode;
313291
314 - // Get current template
 292+ // Get current banner
315293 $currentTemplate = $wgRequest->getText( 'template' );
 294+
 295+ // Pull banner settings from database
 296+ $dbr = wfGetDB( DB_SLAVE );
 297+ $row = $dbr->selectRow( 'cn_templates',
 298+ array(
 299+ 'tmp_display_anon',
 300+ 'tmp_display_account'
 301+ ),
 302+ array( 'tmp_name' => $currentTemplate ),
 303+ __METHOD__
 304+ );
 305+
 306+ // Begin building HTML
 307+ $htmlOut = '';
 308+
 309+ // Begin View Banner fieldset
 310+ $htmlOut .= Xml::openElement( 'fieldset', array( 'class' => 'prefsection' ) );
 311+
 312+ $htmlOut .= Xml::element( 'h2', null, wfMsg( 'centralnotice-banner-heading', $currentTemplate ) );
316313
317 - // Show preview
 314+ // Show preview of banner
318315 $render = new SpecialNoticeText();
319316 $render->project = 'wikipedia';
320317 $render->language = $wgRequest->getVal( 'wpUserLanguage' );
321 - $htmlOut = Xml::fieldset( wfMsg( 'centralnotice-preview' ),
322 - $render->getHtmlNotice( $wgRequest->getText( 'template' ) )
323 - );
324 -
325 - // Build HTML
326 - if ( $this->editable ) {
327 - $htmlOut .= Xml::openElement( 'form', array( 'method' => 'post' ) );
 318+ if ( $render->language != '' ) {
 319+ $htmlOut .= Xml::fieldset( wfMsg( 'centralnotice-preview' ) . " ($render->language)",
 320+ $render->getHtmlNotice( $wgRequest->getText( 'template' ) )
 321+ );
 322+ } else {
 323+ $htmlOut .= Xml::fieldset( wfMsg( 'centralnotice-preview' ),
 324+ $render->getHtmlNotice( $wgRequest->getText( 'template' ) )
 325+ );
328326 }
329 - $htmlOut .= Xml::fieldset( wfMsg( 'centralnotice-translate-heading', $currentTemplate ) );
330 - $htmlOut .= Xml::openElement( 'table',
331 - array (
332 - 'cellpadding' => 9,
333 - 'width' => '100%'
334 - )
335 - );
336327
337 - // Headers
338 - $htmlOut .= Xml::element( 'th', array( 'width' => '15%' ), wfMsg( 'centralnotice-message' ) );
339 - $htmlOut .= Xml::element( 'th', array( 'width' => '5%' ), wfMsg ( 'centralnotice-number-uses' ) );
340 - $htmlOut .= Xml::element( 'th', array( 'width' => '40%' ), wfMsg ( 'centralnotice-english' ) );
341 - $languages = Language::getLanguageNames();
342 - $htmlOut .= Xml::element( 'th', array( 'width' => '40%' ), $languages[$wpUserLang] );
343 -
344 - // Pull text and respect any inc: markup
 328+ // Pull banner text and respect any inc: markup
345329 $bodyPage = Title::newFromText( "Centralnotice-template-{$currentTemplate}", NS_MEDIAWIKI );
346330 $curRev = Revision::newFromTitle( $bodyPage );
347331 $body = $curRev ? $curRev->getText() : '';
348 -
 332+
 333+ // Extract message fields from the banner body
349334 $fields = array();
350 - preg_match_all( '/\{\{\{([A-Za-z0-9\_\-}]+)\}\}\}/', $body, $fields );
351 -
352 - // Remove duplicates
353 - $filteredFields = array();
354 - foreach ( $fields[1] as $field ) {
355 - $filteredFields[$field] = array_key_exists( $field, $filteredFields ) ? $filteredFields[$field] + 1 : 1;
356 - }
357 -
358 - // Rows
359 - foreach ( $filteredFields as $field => $count ) {
360 - // Message
361 - $message = ( $wpUserLang == 'en' ) ? "Centralnotice-{$currentTemplate}-{$field}" : "Centralnotice-{$currentTemplate}-{$field}/{$wpUserLang}";
362 -
363 - // English value
364 - $htmlOut .= Xml::openElement( 'tr' );
365 -
366 - $title = Title::newFromText( "MediaWiki:{$message}" );
367 - $htmlOut .= Xml::tags( 'td', null,
368 - $sk->makeLinkObj( $title, htmlspecialchars( $field ) )
369 - );
370 -
371 - $htmlOut .= Xml::element( 'td', null, $count );
372 -
373 - // English text
374 - $englishText = wfMsg( 'centralnotice-message-not-set' );
375 - $englishTextExists = false;
376 - if ( Title::newFromText( "Centralnotice-{$currentTemplate}-{$field}", NS_MEDIAWIKI )->exists() ) {
377 - $englishText = wfMsgExt( "Centralnotice-{$currentTemplate}-{$field}",
378 - array( 'language' => 'en' )
379 - );
380 - $englishTextExists = true;
 335+ $allowedChars = Title::legalChars();
 336+ preg_match_all( "/\{\{\{([$allowedChars]+)\}\}\}/u", $body, $fields );
 337+
 338+ // Restore banner body state in the event of an error on form submit
 339+ $body = $wgRequest->getVal( 'templateBody', $body );
 340+
 341+ // If there are any message fields in the banner, display translation tools.
 342+ if ( count( $fields[0] ) > 0 ) {
 343+ if ( $this->editable ) {
 344+ $htmlOut .= Xml::openElement( 'form', array( 'method' => 'post' ) );
381345 }
382 - $htmlOut .= Xml::tags( 'td', null,
383 - Xml::element( 'span',
384 - array( 'style' => 'font-style:italic;' . ( !$englishTextExists ? 'color:silver' : '' ) ),
385 - $englishText
 346+ $htmlOut .= Xml::fieldset(
 347+ wfMsg( 'centralnotice-translate-heading', $currentTemplate ),
 348+ false,
 349+ array( 'id' => 'mw-centralnotice-translations-for' )
 350+ );
 351+ $htmlOut .= Xml::openElement( 'table',
 352+ array (
 353+ 'cellpadding' => 9,
 354+ 'width' => '100%'
386355 )
387356 );
388 -
389 - // Foreign text input
390 - $foreignText = '';
391 - $foreignTextExists = false;
392 - if ( Title::newFromText( $message, NS_MEDIAWIKI )->exists() ) {
393 - $foreignText = wfMsgExt( "Centralnotice-{$currentTemplate}-{$field}",
394 - array( 'language' => $wpUserLang )
 357+
 358+ // Table headers
 359+ $htmlOut .= Xml::element( 'th', array( 'width' => '15%' ), wfMsg( 'centralnotice-message' ) );
 360+ $htmlOut .= Xml::element( 'th', array( 'width' => '5%' ), wfMsg ( 'centralnotice-number-uses' ) );
 361+ $htmlOut .= Xml::element( 'th', array( 'width' => '40%' ), wfMsg ( 'centralnotice-english' ) );
 362+ $languages = Language::getLanguageNames();
 363+ $htmlOut .= Xml::element( 'th', array( 'width' => '40%' ), $languages[$wpUserLang] );
 364+
 365+ // Remove duplicate message fields
 366+ $filteredFields = array();
 367+ foreach ( $fields[1] as $field ) {
 368+ $filteredFields[$field] = array_key_exists( $field, $filteredFields ) ? $filteredFields[$field] + 1 : 1;
 369+ }
 370+
 371+ // Table rows
 372+ foreach ( $filteredFields as $field => $count ) {
 373+ // Message
 374+ $message = ( $wpUserLang == 'en' ) ? "Centralnotice-{$currentTemplate}-{$field}" : "Centralnotice-{$currentTemplate}-{$field}/{$wpUserLang}";
 375+
 376+ // English value
 377+ $htmlOut .= Xml::openElement( 'tr' );
 378+
 379+ $title = Title::newFromText( "MediaWiki:{$message}" );
 380+ $htmlOut .= Xml::tags( 'td', null,
 381+ $sk->makeLinkObj( $title, htmlspecialchars( $field ) )
395382 );
396 - $foreignTextExists = true;
 383+
 384+ $htmlOut .= Xml::element( 'td', null, $count );
 385+
 386+ // English text
 387+ $englishText = wfMsg( 'centralnotice-message-not-set' );
 388+ $englishTextExists = false;
 389+ if ( Title::newFromText( "Centralnotice-{$currentTemplate}-{$field}", NS_MEDIAWIKI )->exists() ) {
 390+ $englishText = wfMsgExt( "Centralnotice-{$currentTemplate}-{$field}",
 391+ array( 'language' => 'en' )
 392+ );
 393+ $englishTextExists = true;
 394+ }
 395+ $htmlOut .= Xml::tags( 'td', null,
 396+ Xml::element( 'span',
 397+ array( 'style' => 'font-style:italic;' . ( !$englishTextExists ? 'color:silver' : '' ) ),
 398+ $englishText
 399+ )
 400+ );
 401+
 402+ // Foreign text input
 403+ $foreignText = '';
 404+ $foreignTextExists = false;
 405+ if ( Title::newFromText( $message, NS_MEDIAWIKI )->exists() ) {
 406+ $foreignText = wfMsgExt( "Centralnotice-{$currentTemplate}-{$field}",
 407+ array( 'language' => $wpUserLang )
 408+ );
 409+ $foreignTextExists = true;
 410+ }
 411+ $htmlOut .= Xml::tags( 'td', null,
 412+ Xml::input( "updateText[{$wpUserLang}][{$currentTemplate}-{$field}]", '', $foreignText,
 413+ wfArrayMerge( $readonly,
 414+ array( 'style' => 'width:100%;' . ( !$foreignTextExists ? 'color:red' : '' ) ) )
 415+ )
 416+ );
 417+ $htmlOut .= Xml::closeElement( 'tr' );
397418 }
398 - $htmlOut .= Xml::tags( 'td', null,
399 - Xml::input( "updateText[{$wpUserLang}][{$currentTemplate}-{$field}]", '', $foreignText,
400 - wfArrayMerge( $readonly,
401 - array( 'style' => 'width:100%;' . ( !$foreignTextExists ? 'color:red' : '' ) ) )
 419+ $htmlOut .= Xml::closeElement( 'table' );
 420+
 421+ if ( $this->editable ) {
 422+ $htmlOut .= Xml::hidden( 'wpUserLanguage', $wpUserLang );
 423+ $htmlOut .= Xml::hidden( 'authtoken', $wgUser->editToken() );
 424+ $htmlOut .= Xml::tags( 'div',
 425+ array( 'class' => 'cn-buttons' ),
 426+ Xml::submitButton( wfMsg( 'centralnotice-modify' ), array( 'name' => 'update' ) )
 427+ );
 428+ }
 429+
 430+ $htmlOut .= Xml::closeElement( 'fieldset' );
 431+
 432+ if ( $this->editable ) {
 433+ $htmlOut .= Xml::closeElement( 'form' );
 434+ }
 435+
 436+ // Show language selection form
 437+ $htmlOut .= Xml::openElement( 'form', array( 'method' => 'post' ) );
 438+ $htmlOut .= Xml::fieldset( wfMsg( 'centralnotice-change-lang' ) );
 439+ $htmlOut .= Xml::openElement( 'table', array ( 'cellpadding' => 9 ) );
 440+ list( $lsLabel, $lsSelect ) = Xml::languageSelector( $wpUserLang );
 441+
 442+ $newPage = $this->getTitle( 'view' );
 443+
 444+ $htmlOut .= Xml::tags( 'tr', null,
 445+ Xml::tags( 'td', null, $lsLabel ) .
 446+ Xml::tags( 'td', null, $lsSelect ) .
 447+ Xml::tags( 'td', array( 'colspan' => 2 ),
 448+ Xml::submitButton( wfMsg( 'centralnotice-modify' ) )
402449 )
403450 );
404 - $htmlOut .= Xml::closeElement( 'tr' );
405 - }
406 - if ( $this->editable ) {
407 - $htmlOut .= Xml::hidden( 'token', $token );
408 - $htmlOut .= Xml::hidden( 'wpUserLanguage', $wpUserLang );
409 - $htmlOut .= Xml::openElement( 'tr' );
410 - $htmlOut .= Xml::tags( 'td', array( 'colspan' => 4 ),
411 - Xml::submitButton( wfMsg( 'centralnotice-modify' ), array( 'name' => 'update' ) )
 451+ $htmlOut .= Xml::tags( 'tr', null,
 452+ Xml::tags( 'td', null, '' ) .
 453+ Xml::tags( 'td', null, $sk->makeLinkObj( $newPage, wfMsgHtml( 'centralnotice-preview-all-template-translations' ), "template=$currentTemplate&wpUserLanguage=all" ) )
412454 );
413 - $htmlOut .= Xml::closeElement( 'tr' );
414 - }
415 -
416 - $htmlOut .= Xml::closeElement( 'table' );
417 - $htmlOut .= Xml::closeElement( 'fieldset' );
418 -
419 - if ( $this->editable ) {
 455+ $htmlOut .= Xml::closeElement( 'table' );
 456+ $htmlOut .= Xml::hidden( 'authtoken', $wgUser->editToken() );
 457+ $htmlOut .= Xml::closeElement( 'fieldset' );
420458 $htmlOut .= Xml::closeElement( 'form' );
421459 }
422460
423 - /*
424 - * Show language selection form
425 - */
426 - $htmlOut .= Xml::openElement( 'form', array( 'method' => 'post' ) );
427 - $htmlOut .= Xml::fieldset( wfMsg( 'centralnotice-change-lang' ) );
428 - $htmlOut .= Xml::openElement( 'table', array ( 'cellpadding' => 9 ) );
429 - list( $lsLabel, $lsSelect ) = Xml::languageSelector( $wpUserLang );
430 -
431 - $newPage = SpecialPage::getTitleFor( 'NoticeTemplate', 'view' );
432 -
433 - $htmlOut .= Xml::tags( 'tr', null,
434 - Xml::tags( 'td', null, $lsLabel ) .
435 - Xml::tags( 'td', null, $lsSelect ) .
436 - Xml::tags( 'td', array( 'colspan' => 2 ),
437 - Xml::submitButton( wfMsg( 'centralnotice-modify' ) )
438 - )
439 - );
440 - $htmlOut .= Xml::tags( 'tr', null,
441 - Xml::tags( 'td', null, '' ) .
442 - Xml::tags( 'td', null, $sk->makeLinkObj( $newPage, wfMsgHtml( 'centralnotice-preview-all-template-translations' ), "template=$currentTemplate&wpUserLanguage=all" ) )
443 - );
444 - $htmlOut .= Xml::closeElement( 'table' );
445 - $htmlOut .= Xml::closeElement( 'fieldset' );
446 - $htmlOut .= Xml::closeElement( 'form' );
447 -
448 - /*
449 - * Show edit form
450 - */
 461+ // Show edit form
451462 if ( $this->editable ) {
452463 $htmlOut .= Xml::openElement( 'form', array( 'method' => 'post' ) );
453464 $htmlOut .= Xml::hidden( 'wpMethod', 'editTemplate' );
454465 }
455 - $htmlOut .= Xml::fieldset( wfMsg( 'centralnotice-edit-template' ) );
456 - $htmlOut .= Xml::openElement( 'table',
457 - array(
458 - 'cellpadding' => 9,
459 - 'width' => '100%'
460 - )
461 - );
462 - $htmlOut .= Xml::tags( 'tr', null,
463 - Xml::tags( 'td', null, Xml::textarea( 'templateBody', $body, 60, 20, $readonly ) )
464 - );
 466+
 467+ // Show banner settings
 468+ $htmlOut .= Xml::fieldset( wfMsg( 'centralnotice-settings' ) );
 469+ $htmlOut .= Xml::openElement( 'p', null );
 470+ $htmlOut .= wfMsg( 'centralnotice-banner-display' );
 471+ if ( $wgRequest->wasPosted() ) {
 472+ $displayAnon = $wgRequest->getCheck( 'displayAnon' ); // Restore checkbox state in event of error
 473+ } else {
 474+ $displayAnon = ( $row->tmp_display_anon == 1 ); // Default to saved state
 475+ }
 476+ $htmlOut .= Xml::check( 'displayAnon', $displayAnon, wfArrayMerge( $disabled, array( 'id' => 'displayAnon' ) ) );
 477+ $htmlOut .= Xml::label( wfMsg( 'centralnotice-banner-anonymous' ), 'displayAnon' );
 478+ if ( $wgRequest->wasPosted() ) {
 479+ $displayAccount = $wgRequest->getCheck( 'displayAccount' ); // Restore checkbox state in event of error
 480+ } else {
 481+ $displayAccount = ( $row->tmp_display_account == 1 ); // Default to saved state
 482+ }
 483+ $htmlOut .= Xml::check( 'displayAccount', $displayAccount, wfArrayMerge( $disabled, array( 'id' => 'displayAccount' ) ) );
 484+ $htmlOut .= Xml::label( wfMsg( 'centralnotice-banner-logged-in' ), 'displayAccount' );
 485+ $htmlOut .= Xml::closeElement( 'p' );
 486+ $htmlOut .= Xml::closeElement( 'fieldset' );
465487 if ( $this->editable ) {
466 - $htmlOut .= Xml::tags( 'tr', null,
467 - Xml::tags( 'td', null, Xml::submitButton( wfMsg( 'centralnotice-modify' ) ) )
 488+ $htmlOut .= Xml::fieldset( wfMsg( 'centralnotice-edit-template' ) );
 489+ $htmlOut .= wfMsg( 'centralnotice-edit-template-summary' );
 490+ $buttons = array();
 491+ $buttons[] = '<a href="#" onclick="insertButton(\'hide\');return false;">' . wfMsg( 'centralnotice-hide-button' ) . '</a>';
 492+ $buttons[] = '<a href="#" onclick="insertButton(\'translate\');return false;">' . wfMsg( 'centralnotice-translate-button' ) . '</a>';
 493+ $htmlOut .= Xml::tags( 'div',
 494+ array( 'style' => 'margin-bottom: 0.2em;' ),
 495+ '<img src="'.$scriptPath.'/down-arrow.png" style="vertical-align:baseline;"/>' . wfMsg( 'centralnotice-insert', $wgLang->commaList( $buttons ) )
468496 );
 497+ } else {
 498+ $htmlOut .= Xml::fieldset( wfMsg( 'centralnotice-banner' ) );
469499 }
470 - $htmlOut .= Xml::closeElement( 'table' );
 500+ $htmlOut .= Xml::textarea( 'templateBody', $body, 60, 20, $readonly );
471501 $htmlOut .= Xml::closeElement( 'fieldset' );
472502 if ( $this->editable ) {
 503+ $htmlOut .= Xml::hidden( 'authtoken', $wgUser->editToken() );
 504+ $htmlOut .= Xml::tags( 'div',
 505+ array( 'class' => 'cn-buttons' ),
 506+ Xml::submitButton( wfMsg( 'centralnotice-save-banner' ) )
 507+ );
473508 $htmlOut .= Xml::closeElement( 'form' );
474509 }
475510
476 - /*
477 - * Show Clone form
478 - */
 511+ // Show clone form
479512 if ( $this->editable ) {
480513 $htmlOut .= Xml::openElement ( 'form',
481514 array(
482515 'method' => 'post',
483 - 'action' => SpecialPage::getTitleFor( 'NoticeTemplate', 'clone' )->getLocalUrl()
 516+ 'action' => $this->getTitle( 'clone' )->getLocalUrl()
484517 )
485518 );
486519
487520 $htmlOut .= Xml::fieldset( wfMsg( 'centralnotice-clone-notice' ) );
488521 $htmlOut .= Xml::openElement( 'table', array( 'cellpadding' => 9 ) );
489522 $htmlOut .= Xml::openElement( 'tr' );
490 - // FIXME: hardcoded text?
491 - $htmlOut .= Xml::inputLabel( 'Name:', 'newTemplate', 'newTemplate, 25' );
 523+ $htmlOut .= Xml::inputLabel( wfMsg( 'centralnotice-clone-name' ), 'newTemplate', 'newTemplate', '25' );
492524 $htmlOut .= Xml::submitButton( wfMsg( 'centralnotice-clone' ), array ( 'id' => 'clone' ) );
493525 $htmlOut .= Xml::hidden( 'oldTemplate', $currentTemplate );
494526
495527 $htmlOut .= Xml::closeElement( 'tr' );
496528 $htmlOut .= Xml::closeElement( 'table' );
 529+ $htmlOut .= Xml::hidden( 'authtoken', $wgUser->editToken() );
497530 $htmlOut .= Xml::closeElement( 'fieldset' );
498531 $htmlOut .= Xml::closeElement( 'form' );
499532 }
 533+
 534+ // End View Banner fieldset
 535+ $htmlOut .= Xml::closeElement( 'fieldset' );
500536
501537 // Output HTML
502538 $wgOut->addHTML( $htmlOut );
503539 }
504 -
 540+
 541+ /**
 542+ * Preview all available translations of a banner
 543+ */
505544 public function showViewAvailable( $template ) {
506545 global $wgOut, $wgUser;
507546
@@ -509,13 +548,18 @@
510549
511550 $sk = $wgUser->getSkin();
512551
513 - // Pull all available text for a template
 552+ // Pull all available text for a banner
514553 $langs = array_keys( $this->getTranslations( $template ) );
515554 $htmlOut = '';
 555+
 556+ // Begin View Banner fieldset
 557+ $htmlOut .= Xml::openElement( 'fieldset', array( 'class' => 'prefsection' ) );
 558+
 559+ $htmlOut .= Xml::element( 'h2', null, wfMsg( 'centralnotice-banner-heading', $template ) );
516560
517561 foreach ( $langs as $lang ) {
518562 // Link and Preview all available translations
519 - $viewPage = SpecialPage::getTitleFor( 'NoticeTemplate', 'view' );
 563+ $viewPage = $this->getTitle( 'view' );
520564 $render = new SpecialNoticeText();
521565 $render->project = 'wikipedia';
522566 $render->language = $lang;
@@ -524,16 +568,22 @@
525569 $lang,
526570 'template=' . urlencode( $template ) . "&wpUserLanguage=$lang" ) .
527571 Xml::fieldset( wfMsg( 'centralnotice-preview' ),
528 - $render->getHtmlNotice( $template )
 572+ $render->getHtmlNotice( $template ),
 573+ array( 'class' => 'cn-bannerpreview')
529574 )
530575 );
531576 }
 577+
 578+ // End View Banner fieldset
 579+ $htmlOut .= Xml::closeElement( 'fieldset' );
 580+
532581 return $wgOut->addHtml( $htmlOut );
533582 }
534 -
535 - private function updateMessage( $text, $translation, $lang, $token = false ) {
536 - global $wgUser;
537 -
 583+
 584+ /**
 585+ * Add or update a message
 586+ */
 587+ private function updateMessage( $text, $translation, $lang ) {
538588 $title = Title::newFromText(
539589 ( $lang == 'en' ) ? "Centralnotice-{$text}" : "Centralnotice-{$text}/{$lang}",
540590 NS_MEDIAWIKI
@@ -542,41 +592,7 @@
543593 $article->doEdit( $translation, '', EDIT_FORCE_BOT );
544594 }
545595
546 - /*
547 - * Return an array of templates constrained by offset and limit parameters.
548 - */
549 - function queryTemplates( $offset, $limit ) {
550 - $dbr = wfGetDB( DB_SLAVE );
551 - $conds = array();
552 - $options['ORDER BY'] = $this->indexField . ' DESC';
553 - $options['LIMIT'] = intval( $limit );
554 - $operator = '<';
555 - if ( $offset ) {
556 - $conds[] = $this->indexField . $operator . $this->mDb->addQuotes( $offset );
557 - $res = $dbr->select( 'cn_templates',
558 - array( 'tmp_name', 'tmp_id' ),
559 - $conds,
560 - __METHOD__,
561 - $options
562 - );
563 - } else {
564 - $res = $dbr->select( 'cn_templates',
565 - array( 'tmp_name', 'tmp_id' ),
566 - '',
567 - __METHOD__,
568 - $options
569 - );
570 - }
571 - $templates = array();
572 - foreach ( $res as $row ) {
573 - array_push( $templates, $row->tmp_name );
574 - }
575 - return $templates;
576 - }
577 -
578596 private function getTemplateId ( $templateName ) {
579 - global $wgOut, $egCentralNoticeTables;
580 -
581597 $dbr = wfGetDB( DB_SLAVE );
582598 $res = $dbr->select( 'cn_templates', 'tmp_id',
583599 array( 'tmp_name' => $templateName ),
@@ -591,21 +607,14 @@
592608 }
593609
594610 private function removeTemplate ( $name ) {
595 - global $wgOut, $egCentralNoticeTables;
 611+ global $wgOut;
596612
597 - // FIXME: weak comparison
598 - if ( $name == '' ) {
599 - // FIXME: message not defined?
600 - $wgOut->addWikiMsg( 'centralnotice-template-doesnt-exist' );
601 - return;
602 - }
603 -
604613 $id = $this->getTemplateId( $name );
605614 $dbr = wfGetDB( DB_SLAVE );
606615 $res = $dbr->select( 'cn_assignments', 'asn_id', array( 'tmp_id' => $id ), __METHOD__ );
607616
608617 if ( $dbr->numRows( $res ) > 0 ) {
609 - $wgOut->addWikiMsg( 'centralnotice-template-still-bound' );
 618+ $wgOut->wrapWikiMsg( "<div class='cn-error'>\n$1\n</div>", 'centralnotice-template-still-bound' );
610619 return;
611620 } else {
612621 $dbw = wfGetDB( DB_MASTER );
@@ -623,16 +632,19 @@
624633 }
625634 }
626635
627 - private function addTemplate ( $name, $body ) {
628 - global $wgOut, $egCentralNoticeTables;
 636+ /**
 637+ * Create a new banner
 638+ */
 639+ private function addTemplate( $name, $body, $displayAnon, $displayAccount ) {
 640+ global $wgOut;
629641
630642 if ( $body == '' || $name == '' ) {
631 - $wgOut->addWikiMsg( 'centralnotice-null-string' );
 643+ $wgOut->wrapWikiMsg( "<div class='cn-error'>\n$1\n</div>", 'centralnotice-null-string' );
632644 return;
633645 }
634646
635647 // Format name so there are only letters, numbers, and underscores
636 - $name = ereg_replace( '[^A-Za-z0-9\_]', '', $name );
 648+ $name = preg_replace( '/[^A-Za-z0-9_]/', '', $name );
637649
638650 $dbr = wfGetDB( DB_SLAVE );
639651 $res = $dbr->select(
@@ -643,21 +655,20 @@
644656 );
645657
646658 if ( $dbr->numRows( $res ) > 0 ) {
647 - $wgOut->addWikiMsg( 'centralnotice-template-exists' );
 659+ $wgOut->wrapWikiMsg( "<div class='cn-error'>\n$1\n</div>", 'centralnotice-template-exists' );
648660 return false;
649661 } else {
650662 $dbw = wfGetDB( DB_MASTER );
651 - $dbw->begin();
652 - $res = $dbw->insert(
653 - 'cn_templates',
654 - array( 'tmp_name' => $name ),
 663+ $res = $dbw->insert( 'cn_templates',
 664+ array(
 665+ 'tmp_name' => $name,
 666+ 'tmp_display_anon' => $displayAnon,
 667+ 'tmp_display_account' => $displayAccount
 668+ ),
655669 __METHOD__
656670 );
657 - $dbw->commit();
658671
659 - /*
660 - * Perhaps these should move into the db as blob
661 - */
 672+ // Perhaps these should move into the db as blob
662673 $article = new Article(
663674 Title::newFromText( "centralnotice-template-{$name}", NS_MEDIAWIKI )
664675 );
@@ -666,11 +677,14 @@
667678 }
668679 }
669680
670 - private function editTemplate ( $name, $body ) {
671 - global $wgOut, $egCentralNoticeTables;
 681+ /**
 682+ * Update a banner
 683+ */
 684+ private function editTemplate( $name, $body, $displayAnon, $displayAccount ) {
 685+ global $wgOut;
672686
673687 if ( $body == '' || $name == '' ) {
674 - $wgOut->addWikiMsg( 'centralnotice-null-string' );
 688+ $wgOut->wrapWikiMsg( "<div class='cn-error'>\n$1\n</div>", 'centralnotice-null-string' );
675689 return;
676690 }
677691
@@ -680,10 +694,17 @@
681695 __METHOD__
682696 );
683697
684 - if ( $dbr->numRows( $res ) > 0 ) {
685 - /*
686 - * Perhaps these should move into the db as blob
687 - */
 698+ if ( $dbr->numRows( $res ) == 1 ) {
 699+ $dbw = wfGetDB( DB_MASTER );
 700+ $res = $dbw->update( 'cn_templates',
 701+ array(
 702+ 'tmp_display_anon' => $displayAnon,
 703+ 'tmp_display_account' => $displayAccount
 704+ ),
 705+ array( 'tmp_name' => $name )
 706+ );
 707+
 708+ // Perhaps these should move into the db as blob
688709 $article = new Article(
689710 Title::newFromText( "centralnotice-template-{$name}", NS_MEDIAWIKI )
690711 );
@@ -692,23 +713,39 @@
693714 }
694715 }
695716
696 - /*
697 - * Copy all the data from one template to another
 717+ /**
 718+ * Copy all the data from one banner to another
698719 */
699720 public function cloneTemplate( $source, $dest ) {
 721+
700722 // Reset the timer as updates on meta take a long time
701723 set_time_limit( 300 );
 724+
702725 // Pull all possible langs
703726 $langs = $this->getTranslations( $source );
704727
705728 // Normalize name
706 - $dest = ereg_replace( '[^A-Za-z0-9\_]', '', $dest );
 729+ $dest = preg_replace( '/[^A-Za-z0-9_]/', '', $dest );
 730+
 731+ // Pull banner settings from database
 732+ $dbr = wfGetDB( DB_SLAVE );
 733+ $row = $dbr->selectRow( 'cn_templates',
 734+ array(
 735+ 'tmp_display_anon',
 736+ 'tmp_display_account'
 737+ ),
 738+ array( 'tmp_name' => $source ),
 739+ __METHOD__
 740+ );
 741+ $displayAnon = $row->tmp_display_anon;
 742+ $displayAccount = $row->tmp_display_account;
707743
708 - // Pull text and respect any inc: markup
 744+ // Pull banner text and respect any inc: markup
709745 $bodyPage = Title::newFromText( "Centralnotice-template-{$source}", NS_MEDIAWIKI );
710746 $template_body = Revision::newFromTitle( $bodyPage )->getText();
711747
712 - if ( $this->addTemplate( $dest, $template_body ) ) {
 748+ // Create new banner
 749+ if ( $this->addTemplate( $dest, $template_body, $displayAnon, $displayAccount ) ) {
713750
714751 // Populate the fields
715752 foreach ( $langs as $lang => $fields ) {
@@ -720,16 +757,17 @@
721758 }
722759 }
723760
724 - /*
725 - * Find all fields set for a template
 761+ /**
 762+ * Find all message fields set for a banner
726763 */
727764 private function findFields( $template ) {
728765 $messages = array();
729766 $body = wfMsg( "Centralnotice-template-{$template}" );
730767
731 - // Generate fields from parsing the body
 768+ // Generate list of message fields from parsing the body
732769 $fields = array();
733 - preg_match_all( '/\{\{\{([A-Za-z0-9\_\-}]+)\}\}\}/', $body, $fields );
 770+ $allowedChars = Title::legalChars();
 771+ preg_match_all( "/\{\{\{([$allowedChars]+)\}\}\}/u", $body, $fields );
734772
735773 // Remove duplicates
736774 $filteredFields = array();
@@ -740,8 +778,9 @@
741779 return $filteredFields;
742780 }
743781
744 - /*
745 - * Given a template return a list of every set field in every language
 782+ /**
 783+ * Get all the translations of all the messages for a banner
 784+ * @return a 2D array of every set message in every language for one banner
746785 */
747786 public function getTranslations( $template ) {
748787 $translations = array();
@@ -749,14 +788,14 @@
750789 // Pull all language codes to enumerate
751790 $allLangs = array_keys( Language::getLanguageNames() );
752791
753 - // Lookup all the possible fields for a template
 792+ // Lookup all the message fields for a banner
754793 $fields = $this->findFields( $template );
755794
756795 // Iterate through all possible languages to find matches
757796 foreach ( $allLangs as $lang ) {
758 - // Iterate through all possible fields
 797+ // Iterate through all possible message fields
759798 foreach ( $fields as $field => $count ) {
760 - // Put all fields together for a lookup
 799+ // Put all message fields together for a lookup
761800 $message = ( $lang == 'en' ) ? "Centralnotice-{$template}-{$field}" : "Centralnotice-{$template}-{$field}/{$lang}";
762801 if ( Title::newFromText( $message, NS_MEDIAWIKI )->exists() ) {
763802 $translations[$lang][$field] = wfMsgExt(
@@ -768,181 +807,4 @@
769808 }
770809 return $translations;
771810 }
772 -
773 - /* Begin methods copied (and modified) from Pager class */
774 -
775 - /**
776 - * Get a URL query array for the prev and next links.
777 - */
778 - function getPagingQueries( $offset, $limit ) {
779 - $dbr = wfGetDB( DB_SLAVE );
780 - if ( $offset ) {
781 - // Build previous link
782 - $templates = array();
783 - $conds = array();
784 - $options['ORDER BY'] = $this->indexField . ' ASC';
785 - $options['LIMIT'] = intval( $limit + 1);
786 - $conds[] = $this->indexField . '>=' . $this->mDb->addQuotes( $offset );
787 - $res = $dbr->select( 'cn_templates',
788 - array( 'tmp_name', 'tmp_id' ),
789 - $conds,
790 - __METHOD__,
791 - $options
792 - );
793 - foreach ( $res as $row ) {
794 - array_push( $templates, $row->tmp_id );
795 - }
796 - if ( count( $templates ) == $limit + 1 ) {
797 - $prev = array( 'offset' => end( $templates ), 'limit' => $limit );
798 - } else {
799 - $prev = array( 'offset' => '0', 'limit' => $limit );
800 - }
801 - // Build next link
802 - $templates = array();
803 - $conds = array();
804 - $conds[] = $this->indexField . '<' . $this->mDb->addQuotes( $offset );
805 - $options['ORDER BY'] = $this->indexField . ' DESC';
806 - $options['LIMIT'] = intval( $limit ) + 1;
807 - $res = $dbr->select( 'cn_templates',
808 - array( 'tmp_name', 'tmp_id' ),
809 - $conds,
810 - __METHOD__,
811 - $options
812 - );
813 - foreach ( $res as $row ) {
814 - array_push( $templates, $row->tmp_id );
815 - }
816 - if ( count( $templates ) == $limit + 1 ) {
817 - end( $templates );
818 - $next = array( 'offset' => prev( $templates ), 'limit' => $limit );
819 - } else {
820 - $next = false;
821 - }
822 - } else {
823 - // No previous link needed
824 - $prev = false;
825 - // Build next link
826 - $templates = array();
827 - $options['ORDER BY'] = $this->indexField . ' DESC';
828 - $options['LIMIT'] = intval( $limit ) + 1;
829 - $res = $dbr->select( 'cn_templates',
830 - array( 'tmp_name', 'tmp_id' ),
831 - '',
832 - __METHOD__,
833 - $options
834 - );
835 - while ( $row = $dbr->fetchObject( $res ) ) {
836 - array_push( $templates, $row->tmp_id );
837 - }
838 - if ( count( $templates ) == $limit + 1 ) {
839 - end( $templates );
840 - $next = array( 'offset' => prev( $templates ), 'limit' => $limit );
841 - } else {
842 - $next = false;
843 - }
844 - }
845 - return array( 'prev' => $prev, 'next' => $next );
846 - }
847 -
848 - /**
849 - * Get paging links. If a link is disabled, the item from $disabledTexts
850 - * will be used. If there is no such item, the unlinked text from
851 - * $linkTexts will be used. Both $linkTexts and $disabledTexts are arrays
852 - * of HTML.
853 - */
854 - function getPagingLinks( $linkTexts, $offset, $limit, $disabledTexts = array() ) {
855 - $queries = $this->getPagingQueries( $offset, $limit );
856 - $links = array();
857 - foreach ( $queries as $type => $query ) {
858 - if ( $query !== false ) {
859 - $links[$type] = $this->makeLink( $linkTexts[$type], $queries[$type], $type );
860 - } elseif ( isset( $disabledTexts[$type] ) ) {
861 - $links[$type] = $disabledTexts[$type];
862 - } else {
863 - $links[$type] = $linkTexts[$type];
864 - }
865 - }
866 - return $links;
867 - }
868 -
869 - /**
870 - * Get limit links, i.e. the links that change the query limit. This list
871 - * is based on the limitsShown array.
872 - */
873 - function getLimitLinks() {
874 - global $wgLang;
875 - $links = array();
876 - $offset = $this->mOffset;
877 - foreach ( $this->limitsShown as $limit ) {
878 - $links[] = $this->makeLink(
879 - $wgLang->formatNum( $limit ),
880 - array( 'offset' => $offset, 'limit' => $limit ),
881 - 'num'
882 - );
883 - }
884 - return $links;
885 - }
886 -
887 - /**
888 - * Make a self-link
889 - */
890 - function makeLink($text, $query = null, $type=null) {
891 - if ( $query === null ) {
892 - return $text;
893 - }
894 -
895 - $attrs = array();
896 - if( in_array( $type, array( 'first', 'prev', 'next', 'last' ) ) ) {
897 - # HTML5 rel attributes
898 - $attrs['rel'] = $type;
899 - }
900 -
901 - if( $type ) {
902 - $attrs['class'] = "mw-{$type}link";
903 - }
904 - return $this->getSkin()->link( $this->getTitle(), $text,
905 - $attrs, $query + $this->getDefaultQuery(), array('noclasses','known') );
906 - }
907 -
908 - /**
909 - * Set the offset from an other source than $wgRequest
910 - */
911 - function setOffset( $offset ) {
912 - $this->mOffset = $offset;
913 - }
914 - /**
915 - * Set the limit from an other source than $wgRequest
916 - */
917 - function setLimit( $limit ) {
918 - $this->mLimit = $limit;
919 - }
920 -
921 - /**
922 - * Get the current skin. This can be overridden if necessary.
923 - */
924 - function getSkin() {
925 - if ( !isset( $this->mSkin ) ) {
926 - global $wgUser;
927 - $this->mSkin = $wgUser->getSkin();
928 - }
929 - return $this->mSkin;
930 - }
931 -
932 - /**
933 - * Get an array of query parameters that should be put into self-links.
934 - * By default, all parameters passed in the URL are used, except for a
935 - * short blacklist.
936 - */
937 - function getDefaultQuery() {
938 - if ( !isset( $this->mDefaultQuery ) ) {
939 - $this->mDefaultQuery = $_GET;
940 - unset( $this->mDefaultQuery['title'] );
941 - unset( $this->mDefaultQuery['offset'] );
942 - unset( $this->mDefaultQuery['limit'] );
943 - }
944 - return $this->mDefaultQuery;
945 - }
946 -
947 - /* End methods copied from Pager class */
948 -
949 -}
\ No newline at end of file
 811+}
Index: branches/wmf/1.16wmf4/extensions/CentralNotice/CentralNotice.db.php
@@ -10,9 +10,6 @@
1111 /* Functions */
1212
1313 function CentralNoticeDB() {
14 - // Register special page
15 - SpecialPage::SpecialPage( 'CentralNotice' );
16 -
1714 // Internationalization
1815 wfLoadExtensionMessages( 'CentralNotice' );
1916 }
@@ -21,19 +18,29 @@
2219 * Return notices in the system within given constraints
2320 * Optional: return both enabled and disabled notices
2421 */
25 - public function getNotices( $project = false, $language = false , $date = false , $enabled = true, $preferred = false ) {
 22+ public function getNotices( $project = false, $language = false, $date = false, $enabled = true, $preferred = false ) {
2623 // Database setup
2724 $dbr = wfGetDB( DB_SLAVE );
 25+
 26+ $tables[] = "cn_notices";
 27+ if ( $language ) {
 28+ $tables[] = "cn_notice_languages";
 29+ }
2830
2931 // Use whatever conditional arguments got passed in
30 - if ( $project )
 32+ if ( $project ) {
3133 $conds[] = "not_project =" . $dbr->addQuotes( $project );
32 - if ( $language )
33 - $conds[] = "not_language =" . $dbr->addQuotes( $language );
34 - if ( $preferred )
 34+ }
 35+ if ( $language ) {
 36+ $conds[] = "nl_notice_id = cn_notices.not_id";
 37+ $conds[] = "nl_language =" . $dbr->addQuotes( $language );
 38+ }
 39+ if ( $preferred ) {
3540 $conds[] = "not_preferred = 1";
36 - if ( !$date )
 41+ }
 42+ if ( !$date ) {
3743 $date = $dbr->timestamp();
 44+ }
3845
3946 $conds[] = ( $date ) ? "not_start <= " . $dbr->addQuotes( $date ) : "not_start <= " . $dbr->addQuotes( $dbr->timestamp( $date ) );
4047 $conds[] = ( $date ) ? "not_end >= " . $dbr->addQuotes( $date ) : "not_end >= " . $dbr->addQuotes( $dbr->timestamp( $date ) );
@@ -41,21 +48,19 @@
4249
4350 // Pull db data
4451 $res = $dbr->select(
 52+ $tables,
4553 array(
46 - 'cn_notices',
47 - ),
48 - array(
4954 'not_name',
5055 'not_project',
51 - 'not_language',
5256 'not_locked',
5357 'not_enabled',
54 - 'not_preferred',
 58+ 'not_preferred'
5559 ),
5660 $conds,
5761 __METHOD__
5862 );
5963
 64+ // If no matching notices, return NULL
6065 if ( $dbr->numRows( $res ) < 1 ) {
6166 return;
6267 }
@@ -65,7 +70,6 @@
6671 while ( $row = $dbr->fetchObject( $res ) ) {
6772 $notice = $row->not_name;
6873 $notices[$notice]['project'] = $row->not_project;
69 - $notices[$notice]['language'] = $row->not_language;
7074 $notices[$notice]['preferred'] = $row->not_preferred;
7175 $notices[$notice]['locked'] = $row->not_locked;
7276 $notices[$notice]['enabled'] = $row->not_enabled;
@@ -75,7 +79,7 @@
7680 }
7781
7882 /*
79 - * Given a notice return all templates bound to it
 83+ * Given a notice return all banners bound to it
8084 */
8185 public function selectTemplatesAssigned( $notice ) {
8286 $dbr = wfGetDB( DB_SLAVE );
@@ -88,8 +92,10 @@
8993 'cn_templates'
9094 ),
9195 array(
92 - 'cn_templates.tmp_name',
 96+ 'tmp_name',
9397 'SUM(tmp_weight) AS total_weight',
 98+ 'tmp_display_anon',
 99+ 'tmp_display_account'
94100 ),
95101 array(
96102 'cn_notices.not_name' => $notice,
@@ -101,13 +107,16 @@
102108 'GROUP BY' => 'tmp_name'
103109 )
104110 );
105 - $templateWeights = array();
 111+ $templates = array();
106112 foreach ( $res as $row ) {
107 - $name = $row->tmp_name;
108 - $weight = intval( $row->total_weight );
109 - $templateWeights[$name] = $weight;
 113+ $template = array();
 114+ $template['name'] = $row->tmp_name;
 115+ $template['weight'] = intval( $row->total_weight );
 116+ $template['display_anon'] = intval( $row->tmp_display_anon );
 117+ $template['display_account'] = intval( $row->tmp_display_account );
 118+ $templates[] = $template;
110119 }
111 - return $templateWeights;
 120+ return $templates;
112121 }
113122
114123 public function updatePreferred( $notice, $preferred ) {
Index: branches/wmf/1.16wmf4/extensions/CentralNotice/centralnotice.js
@@ -0,0 +1,45 @@
 2+function selectLanguages(selectAll) {
 3+ var selectBox = document.getElementById('project_languages[]');
 4+ var firstSelect = selectBox.options.length - 1;
 5+ for (var i = firstSelect; i >= 0; i--) {
 6+ selectBox.options[i].selected = selectAll;
 7+ }
 8+}
 9+function top10Languages() {
 10+ var selectBox = document.getElementById('project_languages[]');
 11+ var top10 = new Array('en','de','fr','it','pt','ja','es','pl','ru','nl');
 12+ selectLanguages(false);
 13+ for (var i = 0; i < selectBox.options.length; i++) {
 14+ var lang = selectBox.options[i].value;
 15+ if (top10.toString().indexOf(lang)!==-1) {
 16+ selectBox.options[i].selected = true;
 17+ }
 18+ }
 19+}
 20+function insertButton( buttonType ) {
 21+ var bannerField = document.getElementById('templateBody');
 22+ switch( buttonType ) {
 23+ case 'translate':
 24+ var buttonValue = '[<a href="http://meta.wikimedia.org/wiki/CentralNotice">{{int:centralnotice-shared-help-translate}}</a>]';
 25+ break;
 26+ case 'hide':
 27+ var buttonValue = '[<a href="#" onclick="toggleNotice();return false">{{int:centralnotice-shared-hide}}</a>]';
 28+ break;
 29+ }
 30+ if (document.selection) {
 31+ // IE support
 32+ bannerField.focus();
 33+ sel = document.selection.createRange();
 34+ sel.text = buttonValue;
 35+ } else if (bannerField.selectionStart || bannerField.selectionStart == '0') {
 36+ // Mozilla support
 37+ var startPos = bannerField.selectionStart;
 38+ var endPos = bannerField.selectionEnd;
 39+ bannerField.value = bannerField.value.substring(0, startPos)
 40+ + buttonValue
 41+ + bannerField.value.substring(endPos, bannerField.value.length);
 42+ } else {
 43+ bannerField.value += buttonValue;
 44+ }
 45+ bannerField.focus();
 46+}
\ No newline at end of file
Property changes on: branches/wmf/1.16wmf4/extensions/CentralNotice/centralnotice.js
___________________________________________________________________
Added: svn:eol-style
147 + native
Index: branches/wmf/1.16wmf4/extensions/CentralNotice/CentralNotice.alias.php
@@ -9,26 +9,69 @@
1010 'CentralNotice' => array( 'CentralNotice' ),
1111 'NoticeText' => array( 'NoticeText' ),
1212 'NoticeTemplate' => array( 'NoticeTemplate' ),
 13+ 'NoticeLocal' => array( 'NoticeLocal' ),
1314 );
1415
15 -/** Arabic (العربية) */
1616 $aliases['ar'] = array(
17 - 'CentralNotice' => array( 'ملاحظة_مركزية' ),
18 - 'NoticeText' => array( 'نص_الملاحظة' ),
19 - 'NoticeTemplate' => array( 'قالب_الملاحظة' ),
 17+ 'CentralNotice' => array( 'ملاحظة_مركزية' ),
 18+ 'NoticeText' => array( 'نص_الملاحظة' ),
 19+ 'NoticeTemplate' => array( 'قالب_الملاحظة' ),
2020 );
2121
22 -/** Japanese (日本語) */
 22+$aliases['arz'] = array(
 23+ 'CentralNotice' => array( 'ملاحظة_مركزية' ),
 24+ 'NoticeText' => array( 'نص_الملاحظة' ),
 25+ 'NoticeTemplate' => array( 'قالب_الملاحظة' ),
 26+);
 27+
 28+$aliases['fa'] = array(
 29+ 'CentralNotice' => array( 'اعلامیه_مرکزی' ),
 30+ 'NoticeText' => array( 'متن_اعلامیه' ),
 31+ 'NoticeTemplate' => array( 'الگوی_اعلامیه' ),
 32+ 'NoticeLocal' => array( 'اعلامیه_محلی' ),
 33+);
 34+
2335 $aliases['ja'] = array(
24 - 'CentralNotice' => array( '中央管理通知' ),
25 - 'NoticeText' => array( '通知文' ),
26 - 'NoticeTemplate' => array( '通知テンプレート' ),
 36+ 'CentralNotice' => array( '中央管理通知' ),
 37+ 'NoticeText' => array( '通知文' ),
 38+ 'NoticeTemplate' => array( '通知テンプレート' ),
2739 );
2840
29 -/** Malayalam (മലയാളം) */
 41+$aliases['lad'] = array(
 42+ 'CentralNotice' => array( 'AvisoCentral' ),
 43+ 'NoticeText' => array( 'Teksto_de_aviso' ),
 44+ 'NoticeTemplate' => array( 'Xabblón_de_aviso' ),
 45+ 'NoticeLocal' => array( 'AvisoLocal' ),
 46+);
 47+
3048 $aliases['ml'] = array(
31 - 'CentralNotice' => array( 'കേന്ദ്രീകൃതഅറിയിപ്പ്' ),
32 - 'NoticeText' => array( 'അറിയിപ്പ്‌‌എഴുത്ത്' ),
33 - 'NoticeTemplate' => array( 'അറിയിപ്പ്ഫലകം' ),
 49+ 'CentralNotice' => array( 'കേന്ദ്രീകൃതഅറിയിപ്പ്' ),
 50+ 'NoticeText' => array( 'അറിയിപ്പ്‌‌എഴുത്ത്' ),
 51+ 'NoticeTemplate' => array( 'അറിയിപ്പ്ഫലകം' ),
 52+ 'NoticeLocal' => array( 'പ്രാദേശിക‌‌അറിയിപ്പ്' ),
3453 );
3554
 55+$aliases['nn'] = array(
 56+ 'CentralNotice' => array( 'Sentralmerknad' ),
 57+ 'NoticeText' => array( 'Merknadstekst' ),
 58+ 'NoticeTemplate' => array( 'Merknadsmal' ),
 59+);
 60+
 61+$aliases['no'] = array(
 62+ 'CentralNotice' => array( 'Sentralnotis' ),
 63+ 'NoticeText' => array( 'Notistekst' ),
 64+ 'NoticeTemplate' => array( 'Notismal' ),
 65+);
 66+
 67+$aliases['pl'] = array(
 68+ 'CentralNotice' => array( 'Globalny_komunikat' ),
 69+ 'NoticeText' => array( 'Treść_komunikatu' ),
 70+ 'NoticeTemplate' => array( 'Szablon_komunikatu' ),
 71+);
 72+
 73+$aliases['zh-hant'] = array(
 74+ 'CentralNotice' => array( '中央通告' ),
 75+ 'NoticeText' => array( '通告內文' ),
 76+ 'NoticeTemplate' => array( '通告模板' ),
 77+ 'NoticeLocal' => array( '本地化通告' ),
 78+);
Index: branches/wmf/1.16wmf4/extensions/CentralNotice/SpecialNoticeText.php
@@ -1,11 +1,17 @@
22 <?php
33
 4+/**
 5+ * Generates content for static Javascript files
 6+ */
47 class SpecialNoticeText extends NoticePage {
58 var $project = 'wikipedia';
69 var $language = 'en';
 10+ var $centralNoticeDB;
711
812 function __construct() {
913 parent::__construct( "NoticeText" );
 14+
 15+ $this->centralNoticeDB = new CentralNoticeDB();
1016 }
1117
1218 /**
@@ -18,7 +24,12 @@
1925 return 86400 * 7;
2026 }
2127
 28+ /**
 29+ * Given a project key, generate the body for a static Javascript file
 30+ */
2231 function getJsOutput( $par ) {
 32+
 33+ // Break $par into separate parameters and assign to $this->project and $this->language
2334 $this->setLanguage( $par );
2435
2536 // Quick short circuit to be able to show preferred notices
@@ -26,14 +37,14 @@
2738
2839 if ( $this->language == 'en' && $this->project != null ) {
2940 // See if we have any preferred notices for all of en
30 - $notices = CentralNoticeDB::getNotices( '', 'en', '', '', 1 );
 41+ $notices = $this->centralNoticeDB->getNotices( '', 'en', '', '', 1 );
3142
3243 if ( $notices ) {
3344 // Pull out values
3445 foreach ( $notices as $notice => $val ) {
3546 // Either match against ALL project or a specific project
3647 if ( $val['project'] == '' || $val['project'] == $this->project ) {
37 - $templates = CentralNoticeDB::selectTemplatesAssigned( $notice );
 48+ $templates = $this->centralNoticeDB->selectTemplatesAssigned( $notice );
3849 break;
3950 }
4051 }
@@ -41,16 +52,13 @@
4253 }
4354
4455 if ( !$templates && $this->project == 'wikipedia' ) {
45 - $notices = CentralNoticeDB::getNotices( 'wikipedia', '', '', '', 1 );
46 - if ( $notices && is_array( $notices ) ) {
47 - foreach ( $notices as $notice => $val ) {
48 - if ( $val['language'] == '' ||
49 - $val['language'] == $this->language ) {
50 - $templates = CentralNoticeDB::selectTemplatesAssigned( $notice );
51 - break;
52 - }
53 - }
 56+ $notices = $this->centralNoticeDB->getNotices( 'wikipedia', $this->language, '', '', 1 );
 57+ if ( $notices && is_array( $notices ) ) {
 58+ foreach ( $notices as $notice => $val ) {
 59+ $templates = $this->centralNoticeDB->selectTemplatesAssigned( $notice );
 60+ break;
5461 }
 62+ }
5563 }
5664
5765 // Didn't find any preferred matches so do an old style lookup
@@ -58,7 +66,18 @@
5967 $templates = CentralNotice::selectNoticeTemplates( $this->project, $this->language );
6068 }
6169
62 - $templateNames = array_keys( $templates );
 70+ // Slice the columns of the $templates array into separate arrays.
 71+ // This is required due to how pickTemplate() currently works.
 72+ $templateNames = array();
 73+ $templateWeights = array();
 74+ $templateDisplayAnons = array();
 75+ $templateDisplayAccounts = array();
 76+ foreach ( $templates as $template ) {
 77+ $templateNames[] = $template['name'];
 78+ $templateWeights[] = $template['weight'];
 79+ $templateDisplayAnons[] = $template['display_anon'];
 80+ $templateDisplayAccounts[] = $template['display_account'];
 81+ }
6382
6483 $templateTexts = array_map(
6584 array( $this, 'getHtmlNotice' ),
@@ -67,27 +86,27 @@
6887 if ( preg_grep( "/&lt;centralnotice-template-\w{1,}&gt;\z/", $templateTexts ) ) {
6988 return false; // Bailing out if we have a failed cache lookup
7089 }
71 -
72 - $weights = array_values( $templates );
73 -
 90+
7491 return
7592 $this->getScriptFunctions() .
7693 $this->getToggleScripts() .
7794 'wgNotice=pickTemplate(' .
7895 Xml::encodeJsVar( $templateTexts ) .
7996 "," .
80 - Xml::encodeJsVar( $weights ) .
 97+ Xml::encodeJsVar( $templateWeights ) .
 98+ "," .
 99+ Xml::encodeJsVar( $templateDisplayAnons ) .
 100+ "," .
 101+ Xml::encodeJsVar( $templateDisplayAccounts ) .
81102 ");\n" .
82103 "if (wgNotice != '')\n" .
83104 "wgNotice='<div id=\"centralNotice\" class=\"' + " .
84105 "(wgNoticeToggleState ? 'expanded' : 'collapsed') + " .
85 - "' ' + " .
86 - "(wgUserName ? 'usernotice' : 'anonnotice' ) + " .
87 - "'\">' + wgNotice+'</div>';\n";
 106+ "'\">' + wgNotice+'</div>';\n";
88107 }
89108
90 - function getHtmlNotice( $noticeName ) {
91 - $this->noticeName = $noticeName;
 109+ function getHtmlNotice( $templateName ) {
 110+ $this->templateName = $templateName;
92111 return preg_replace_callback(
93112 '/{{{(.*?)}}}/',
94113 array( $this, 'getNoticeField' ),
@@ -97,15 +116,15 @@
98117 function getToggleScripts() {
99118 $showStyle = <<<END
100119 <style type="text/css">
101 -#centralNotice .siteNoticeSmall{display:none;}
102 -#centralNotice .siteNoticeSmallAnon{display:none;}
103 -#centralNotice .siteNoticeSmallUser{display:none;}
104 -#centralNotice.collapsed .siteNoticeBig{display:none;}
105 -#centralNotice.collapsed .siteNoticeSmall{display:block;}
106 -#centralNotice.collapsed .siteNoticeSmallUser{display:block;}
107 -#centralNotice.collapsed .siteNoticeSmallAnon{display:block;}
108 -#centralNotice.anonnotice .siteNoticeSmallUser{display:none !important;}
109 -#centralNotice.usernotice .siteNoticeSmallAnon{display:none !important;}
 120+#centralNotice .siteNoticeSmall {display:none;}
 121+#centralNotice .siteNoticeSmallAnon {display:none;}
 122+#centralNotice .siteNoticeSmallUser {display:none;}
 123+#centralNotice.collapsed .siteNoticeBig {display:none;}
 124+#centralNotice.collapsed .siteNoticeSmall {display:block;}
 125+#centralNotice.collapsed .siteNoticeSmallUser {display:block;}
 126+#centralNotice.collapsed .siteNoticeSmallAnon {display:block;}
 127+#centralNotice.anonnotice .siteNoticeSmallUser {display:none !important;}
 128+#centralNotice.usernotice .siteNoticeSmallAnon {display:none !important;}
110129 </style>
111130 END;
112131 $encShowStyle = Xml::encodeJsVar( $showStyle );
@@ -140,25 +159,27 @@
141160 var work='hidesnmessage='+state+'; expires=' + e.toGMTString() + '; path=/';
142161 document.cookie = work;
143162 }
144 -function pickTemplate(templates, weights) {
 163+function pickTemplate(templates, weights, displayAnons, displayAccounts) {
145164 var weightedTemplates = new Array();
146165 var currentTemplate = 0;
147166 var totalWeight = 0;
148167
149168 if (templates.length == 0)
150169 return '';
151 -
 170+
152171 while (currentTemplate < templates.length) {
153 - totalWeight += weights[currentTemplate];
154 - for (i=0; i<weights[currentTemplate]; i++) {
155 - weightedTemplates[weightedTemplates.length] = templates[currentTemplate];
 172+ if ((wgUserName && displayAccounts[currentTemplate]) || (!wgUserName && displayAnons[currentTemplate])) {
 173+ totalWeight += weights[currentTemplate];
 174+ for (var i=0; i<weights[currentTemplate]; i++) {
 175+ weightedTemplates[weightedTemplates.length] = templates[currentTemplate];
 176+ }
156177 }
157178 currentTemplate++;
158179 }
159 -
 180+
160181 if (totalWeight == 0)
161182 return '';
162 -
 183+
163184 var randomnumber=Math.floor(Math.random()*totalWeight);
164185 return weightedTemplates[randomnumber];
165186 }\n\n";
@@ -188,7 +209,7 @@
189210 }
190211
191212 function getNoticeTemplate() {
192 - return $this->getMessage( "centralnotice-template-{$this->noticeName}" );
 213+ return $this->getMessage( "centralnotice-template-{$this->templateName}" );
193214 }
194215
195216 function getNoticeField( $matches ) {
@@ -197,7 +218,7 @@
198219 if ( $field == 'amount' ) {
199220 $params = array( $this->formatNum( $this->getDonationAmount() ) );
200221 }
201 - $message = "centralnotice-{$this->noticeName}-$field";
 222+ $message = "centralnotice-{$this->templateName}-$field";
202223 $source = $this->getMessage( $message, $params );
203224 return $source;
204225 }
@@ -227,7 +248,7 @@
228249 }
229250
230251 private function projectName() {
231 - global $wgConf, $IP;
 252+ global $wgConf;
232253
233254 $wgConf->loadFullData();
234255
Property changes on: branches/wmf/1.16wmf4/extensions/CentralNotice
___________________________________________________________________
Modified: svn:mergeinfo
235256 Merged /trunk/extensions/CentralNotice:r67559-71720

Status & tagging log