oc, pl, pt, rm, ro, ru, rup, sco, sk, sl, smn, sq, sr, sv, tk, tl, tr, tt, uk,
uz, vi.
* Added 'CategoryAfterPageAdded' and 'CategoryAfterPageRemoved' hooks.
+* Added 'HistoryRevisionTools' and 'DiffRevisionTools' hooks.
* (bug 33186) Add image rotation api "imagerotate"
* (bug 34040) Add "User rights management" link on user page toolbox.
$old: the ?old= param value from the url
$new: the ?new= param value from the url
+'DiffRevisionTools': Override or extend the revision tools available from the
+diff view, i.e. undo, etc.
+$rev: Revision object
+&$links: Array of HTML links
+
'DiffViewHeader': Called before diff display
$diff: DifferenceEngine object that's calling
$oldRev: Revision object of the "old" revision (may be null/invalid)
Special:Version, use this to change the list.
&$extTypes: associative array of repo URLS to viewer URLs.
+'HistoryRevisionTools': Override or extend the revision tools available from the
+page history view, i.e. undo, rollback, etc.
+$rev: Revision object
+&$links: Array of HTML links
+
'ImageBeforeProduceHTML': Called before producing the HTML created by a wiki
image insertion. You can skip the default logic entirely by returning false, or
just modify a few things using call-by-reference.
'PageHistoryBeforeList': When a history page list is about to be constructed.
$article: the article that the history is loading for
+$out: OutputPage object
'PageHistoryLineEnding' : Right before the end <li> is added to a history line.
$row: the revision row for this line
}
class IcuCollation extends Collation {
+ const FIRST_LETTER_VERSION = 1;
+
var $primaryCollator, $mainCollator, $locale;
var $firstLetterData;
$cacheKey = wfMemcKey( 'first-letters', $this->locale );
$cacheEntry = $cache->get( $cacheKey );
- if ( $cacheEntry ) {
+ if ( $cacheEntry && isset( $cacheEntry['version'] )
+ && $cacheEntry['version'] == self::FIRST_LETTER_VERSION )
+ {
$this->firstLetterData = $cacheEntry;
return $this->firstLetterData;
}
ksort( $letterMap, SORT_STRING );
$data = array(
'chars' => array_values( $letterMap ),
- 'keys' => array_keys( $letterMap )
+ 'keys' => array_keys( $letterMap ),
+ 'version' => self::FIRST_LETTER_VERSION,
);
// Reduce memory usage before caching
'</fieldset></form>'
);
- wfRunHooks( 'PageHistoryBeforeList', array( &$this->page ) );
+ wfRunHooks( 'PageHistoryBeforeList', array( &$this->page, &$out ) );
// Create and output the list.
$pager = new HistoryPager( $this, $year, $month, $tagFilter, $conds );
$tools[] = "<span class=\"mw-history-undo\">{$undolink}</span>";
}
}
+ // Allow extension to add their own links here
+ wfRunHooks( 'HistoryRevisionTools', array( $rev, &$tools ) );
if ( $tools ) {
$s2 .= ' '. $this->msg( 'parentheses' )->rawParams( $lang->pipeList( $tools ) )->escaped();
$samePage = false;
}
+ $revisionTools = array();
if ( $samePage && $this->mNewPage->quickUserCan( 'edit', $user ) ) {
if ( $this->mNewRev->isCurrent() && $this->mNewPage->userCan( 'rollback', $user ) ) {
$rollbackLink = Linker::generateRollback( $this->mNewRev, $this->getContext() );
}
}
if ( !$this->mOldRev->isDeleted( Revision::DELETED_TEXT ) && !$this->mNewRev->isDeleted( Revision::DELETED_TEXT ) ) {
- $undoLink = ' ' . $this->msg( 'parentheses' )->rawParams(
- Html::element( 'a', array(
+ $undoLink = Html::element( 'a', array(
'href' => $this->mNewPage->getLocalUrl( array(
'action' => 'edit',
'undoafter' => $this->mOldid,
'title' => Linker::titleAttrib( 'undo' )
),
$this->msg( 'editundo' )->text()
- ) )->escaped();
+ );
+ $revisionTools[] = $undoLink;
}
}
# Handle RevisionDelete links...
$rdel = $this->revisionDeleteLink( $this->mNewRev );
- $newRevisionHeader = $this->getRevisionHeader( $this->mNewRev, 'complete' ) . $undoLink;
+
+ # Allow extensions to define their own revision tools
+ wfRunHooks( 'DiffRevisionTools', array( $this->mNewRev, &$revisionTools ) );
+ $formattedRevisionTools = array();
+ // Put each one in parentheses (poor man's button)
+ foreach ( $revisionTools as $tool ) {
+ $formattedRevisionTools[] = $this->msg( 'parentheses' )->rawParams( $tool )->escaped();
+ }
+ $newRevisionHeader = $this->getRevisionHeader( $this->mNewRev, 'complete' ) . ' ' . implode( ' ', $formattedRevisionTools );
$newHeader = '<div id="mw-diff-ntitle1"><strong>' . $newRevisionHeader . '</strong></div>' .
'<div id="mw-diff-ntitle2">' . Linker::revUserTools( $this->mNewRev, !$this->unhide ) .
$paths = array();
foreach ( $ops as $op ) {
if ( isset( $op['src'] ) ) {
- $paths[] = $op['src'];
+ // For things like copy/move/delete with "ignoreMissingSource" and there
+ // is no source file, nothing should happen and there should be no errors.
+ if ( empty( $op['ignoreMissingSource'] )
+ || $this->fileExists( array( 'src' => $op['src'] ) ) )
+ {
+ $paths[] = $op['src'];
+ }
}
if ( isset( $op['srcs'] ) ) {
$paths = array_merge( $paths, $op['srcs'] );
'loginreqlink' => 'teken in',
'loginreqpagetext' => 'U moet $1 om ander bladsye te bekyk.',
'accmailtitle' => 'Wagwoord gestuur.',
-'accmailtext' => "'n Lukraakgegenereerde wagwoord vir [[User talk:$1|$1]] is na $2 gestuur.
+'accmailtext' => "'n Lukrake wagwoord vir [[User talk:$1|$1]] is na $2 gestuur.
-Die wagwoord vir hierdie nuwe gebruiker kan verander word op die ''[[Special:ChangePassword|verander wagwoord]]'' bladsy nadat ingeteken is.",
+Die wagwoord vir hierdie nuwe gebruiker kan op die ''[[Special:ChangePassword|verander wagwoord]]''-bladsy verander word nadat ingeteken is.",
'newarticle' => '(Nuut)',
'newarticletext' => "Hierdie bladsy bestaan nie.
Tik iets in die invoerboks hier onder om 'n nuwe bladsy te skep. Meer inligting is op die [[{{MediaWiki:Helppage}}|hulpbladsy]] beskikbaar.
'cascadeprotectedwarning' => "'''Waarskuwing:''' Die bladsy was beveilig sodat dit slegs deur administrateurs gewysig kan word, omrede dit ingesluit is in die volgende {{PLURAL:$1|bladsy|bladsye}} wat kaskade-beskerming geniet:",
'titleprotectedwarning' => "'''WAARSKUWING: Hierdie bladsy is beveilig. Slegs gebruikers met [[Special:ListGroupRights|spesiale regte]] sal dit kan skep.'''
Die nuutste logboekinskrywing word hieronder ter verwysing vertoon:",
-'templatesused' => 'Hierdie bladsy {{PLURAL:$1|gebruik sjabloon|gebruik sjablone}}:',
+'templatesused' => '{{PLURAL:$1|Sjabloon|Sjablone}} gebruik op hierdie blad:',
'templatesusedpreview' => '{{PLURAL:$1|Sjabloon|Sjablone}} gebruik in hierdie voorskou:',
'templatesusedsection' => 'Die volgende {{PLURAL:$1|sjabloon|sjablone}} word in hierdie afdeling gebruik:',
'template-protected' => '(beskermd)',
Die aksie kan nie ongedaan gemaak word nie.',
'prefs-emailconfirm-label' => 'E-posbevestiging:',
'prefs-textboxsize' => 'Afmetings van die wysigingsvenster',
-'youremail' => 'E-pos',
+'youremail' => 'E-posadres:',
'username' => '{{GENDER:$1|Gebruikersnaam}}:',
'uid' => '{{GENDER:$1|Gebruikersnommer}}:',
'prefs-memberingroups' => '{{GENDER:$2|Lid}} van {{PLURAL:$1|groep|groepe}}:',
'specialpages-group-changes' => 'Onlangse wysigings en boekstawings',
'specialpages-group-media' => 'Media verslae en oplaai',
'specialpages-group-users' => 'Gebruikers en regte',
-'specialpages-group-highuse' => 'Baie gebruikte bladsye',
+'specialpages-group-highuse' => 'Mees gebruikte bladsye',
'specialpages-group-pages' => 'Lyste van bladsye',
'specialpages-group-pagetools' => 'Bladsyhulpmiddels',
'specialpages-group-wiki' => 'Data en hulpmiddels',
'sqlite-no-fts' => 'Weergawe $1 sonder ondersteuning vir vol-teks soektogte ("full-text search")',
# New logging system
-'logentry-delete-delete' => '$1 het die bladsy $3 verwyder',
-'logentry-delete-restore' => '$1 het die bladsy $3 teruggeplaas',
+'logentry-delete-delete' => '$1 het bladsy $3 verwyder',
+'logentry-delete-restore' => '$1 het bladsy $3 teruggeplaas',
'logentry-delete-event' => "$1 het die sigbaarheid van {{PLURAL:$5|'n logboekreël|$5 logboekreëls}} van $3 gewysig: $4",
'logentry-delete-revision' => "$1 het die sigbaarheid van {{PLURAL:$5|'n weergawe|$5 weergawes}} van bladsy $3 gewysig: $4",
'logentry-delete-event-legacy' => '$1 het die sigbaarheid van logboekreëls van $3 gewysig',
'duration-centuries' => '$1 {{PLURAL:$1|eeu|eeue}}',
'duration-millennia' => '$1 {{PLURAL:$1|millennium|millennia}}',
+# Image rotation
+'rotate-comment' => 'Beeld $1 {{PLURAL:$1|graad|grade} kloksgewys gedraai',
+
);
# General errors
'error' => 'ههڵه',
-'databaseerror' => 'Ú¾Û\95ÚµÛ\95Û\8c داتابÛ\95Û\8cس',
+'databaseerror' => 'Ú¾Û\95ÚµÛ\95Û\8c بÙ\86Ú©Û\95دراÙ\88Ù\87',
'dberrortext' => 'ھەڵەیەکی ڕستەنووسی لە داواکاریی بنکەیدراو ڕووی داوە.
لەوانەیە ئەوە نیشاندەری کەلێنێک لە نەرمامێرەکەدا بێت.
دوایین تێکۆشان بۆ داواکاری بنکەیدراو:
'underline-always' => 'Toririmo',
'underline-never' => 'Kada',
-'underline-default' => 'Pogigihum pongoiso',
+'underline-default' => 'Kourasai pogigihum sandad',
# Font style option in Special:Preferences
'editfont-style' => 'Poyanan mongidit gaya pimato:',
'newwindow' => '(ukabai id liligaon wagu)',
'cancel' => 'Kinsilo',
'moredotdotdot' => 'Gumu...',
-'mypage' => 'Bolikonku',
-'mytalk' => 'Pibabarasanku',
+'morenotlisted' => 'Susuai poh ii awu nokosurat...',
+'mypage' => 'Bolikon',
+'mytalk' => 'Pogibabarasan',
'anontalk' => 'Piboros montok diti nantadon IP',
'navigation' => 'Popotunud',
'and' => ' om',
'vector-action-protect' => 'Tingoligai',
'vector-action-undelete' => 'Kada pugaso',
'vector-action-unprotect' => 'Alanai tingolig',
-'vector-simplesearch-preference' => 'Pasagao pogigihum ponontonudon pinoingkawas (Pongulit tuntuduk nopo)',
+'vector-simplesearch-preference' => 'Pasagao pogigihum bar noinsanangan (Pongulit tuntuduk nopo)',
'vector-view-create' => 'Pomonsoi',
'vector-view-edit' => 'Idito',
'vector-view-history' => 'Intaai susuyan',
'namespaces' => 'Ponuratan ngaran',
'variants' => 'Kopogisuaian',
+'navigation-heading' => 'Pipilion usuyon',
'errorpagetitle' => 'Nosilopan',
'returnto' => 'Gumuli hilo $1.',
'tagline' => 'Mantad {{SITENAME}}',
'actionthrottled' => 'Momilos',
'actionthrottledtext' => 'Pinapanau lumawan-singkarap, Nantaban ko do mingguli momonsoi miagal dilo id timpu do osikap, om nagampot nu noh gisom diti.
Umbalan kawagu do katalib poh pipiro minit.',
-'protectedpagetext' => 'Bolikon diti notingoligan tu mangantob do pingiditan.',
+'protectedpagetext' => 'Bolikon diti notingoligan tu mangantob do pinsimbanan toi pingkukuroyon nopo.',
'viewsourcetext' => 'Pasagaon ko do mongintong om mangadalin wowonod diti bolikon:',
'viewyourtext' => "Milo nu do intangan om solinon ot wowonod '''niditannu''' id bolikon diti:",
'protectedinterface' => 'Bolikon diti kiharo sinuratan pongurasan montok posusuang-suangon, om notingoligan do momiara mantad pomirumbakan.
Milo ko do monilombus mongoguno {{SITENAME}} poinlisok, toi <span class='plainlinks'>[$1 sumuang log koh kawagu]</span> miagal ngaran di tiinu toi mongoguno ngaran suai.
Birio do kipipiro bolikon popokito do maso poinsuang log koh poh gisom no do opugas nu dangkob do pogigihumnu.",
+'welcomeuser' => 'Kotobian dongkorikatan, $1!',
+'welcomecreation-msg' => 'Nowonsoi noh akaunnu.
+Soroho noh do mongolon do [[Special:Preferences|{{SITENAME}} komoisaannu]].',
'yourname' => 'Ngarandait:',
'yourpassword' => 'Kaatalib:',
'yourpasswordagain' => 'Mintaipo kaatalib:',
'gotaccount' => 'Kitakaun? $1',
'gotaccountlink' => 'Sumuang log',
'userlogin-resetlink' => 'Nolihuan ahal loginnu?',
-'createaccountmail' => 'Maya surat-i',
+'createaccountmail' => 'Gunoo nunu nopo kaatalib om pootodo id surat-i ii poinsurat id siriba diti',
'createaccountreason' => 'Sabab:',
'badretype' => 'Kaatalib pinosuang awu kopisangai.',
'userexists' => 'Ngaranmoguno pinosuang noguno no.
'loginlanguagelabel' => 'Woyoboros: $1',
'suspicious-userlogout' => 'Awu naramit lumabus lognu tu pinaatod mantad pogigihum norumbak toi caching olon.',
-# E-mail sending
+# Email sending
'php-mail-error-unknown' => 'Awu nointutunan kinosilapan id don surat PHP () function',
'user-mail-no-addy' => 'Mogumbal do papaatod surat-i tingaa o paatadan.',
+'user-mail-no-body' => 'Minogumbal koh do papaatod surat-i do ingaa suang toi nadalaan koniba.',
# Change password dialog
'resetpass' => 'Alanai kaatalib',
'passwordreset-text' => 'Gonopo poom diti do mangaramit tongosurat-i ponorou do nokomoi id akaun.',
'passwordreset-legend' => 'Pudoliai kawagu kaatalib',
'passwordreset-disabled' => 'Pomudolian kawagu do kaatalib kitaantob id wiki diti.',
+'passwordreset-pretext' => '{{PLURAL:$1||Posuango iso data id siriba}}',
'passwordreset-username' => 'Ngarandait:',
+'passwordreset-domain' => 'Sumanganu:',
+'passwordreset-capture' => 'Intaai surat-i dii nowonsoi?',
+'passwordreset-capture-help' => 'Nung goritannu id kutak diti, surat-i (ii ki-kaa-talib daamot) mangan pokitanai montok dia om nogi porikoton montok momomoguno diti.',
+'passwordreset-email' => 'Porikatan surat-i:',
'passwordreset-emailtitle' => 'Kointalangan takaun id {{SITENAME}}',
'passwordreset-emailelement' => 'Ngaranmoguno: $1
Kaatalib daamot: $2',
'note' => "'''Pasoniba:'''",
'previewnote' => "'''Soroho no do iti nopo nga kopongintangan toomod.'''
Awu po moti nokogompi iri nopingalanannu!",
-'continue-editing' => 'Potilombuso do mongidit.',
+'continue-editing' => 'Ongoi doid pongiditan.',
'previewconflict' => 'Miagal no diti pongitanan do tik id boogian kawas kutak pongiditan tik nung pilionnu do popogompi.',
'session_fail_preview' => "'''Siou! Awu di dahai opongoh niditannu gisom no do natagakan data.'''
Mangai umbalai kawagu.
'nextn-title' => 'Sumusuhut $1 {{PLURAL:$1|kootuson|tongokootuson}}',
'shown-title' => 'Pokitono $1 {{PLURAL:$1|kootuson|tongokootuson}} monikid bolikon',
'viewprevnext' => 'Intaai ($1 {{int:pipe-separator}} $2) ($3)',
+'searchmenu-legend' => 'Pilion ihum-ihumon',
'searchmenu-exists' => "'''Haro no bolikon pinungaranan do \"[[:\$1]]\" hiti id wiki.'''",
'searchmenu-new' => "'''Pomonsoi do bolikon \"[[:\$1]]\"hiti id wiki!'''",
'searchhelp-url' => 'Help:Susuang',
# Preferences page
'preferences' => 'Pipilion',
-'mypreferences' => 'Komoisoonku',
+'mypreferences' => 'Pipilion',
'prefs-edits' => 'Ginumu niditan:',
'prefsnologin' => 'Amu nokolog sumuang',
'changepassword' => 'Alanai kaatalib',
'saveprefs' => 'Pogompio',
'resetprefs' => 'Pugaso nalanan awu nogompi',
'searchresultshead' => 'Ihumo',
+'servertime' => 'Timpu mamamalayan:',
+'guesstimezone' => 'Gunoo pinatantu do lalayagku',
+'timezoneregion-africa' => 'Aprika',
+'timezoneregion-america' => 'Amirika',
+'timezoneregion-antarctica' => 'Antartika',
+'timezoneregion-arctic' => 'Artik',
+'timezoneregion-asia' => 'Asia',
+'timezoneregion-atlantic' => 'Karahatan Atlantik',
+'timezoneregion-australia' => 'Astaralia',
'prefs-searchoptions' => 'Ihumo',
'prefs-namespaces' => 'Ponuratan ngaran',
'youremail' => 'Surat-i:',
'prefs-displaywatchlist' => 'Pomilian pongitanan',
'prefs-diffs' => 'Pisuaian',
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
'email-address-validity-valid' => 'Porikatan surat-i asaah',
'email-address-validity-invalid' => 'Posuango porikatan surat-i di asaah',
# Special:ListGroupRights
'listgrouprights-members' => '(lis do kinoruhangan)',
-# E-mail user
+# Email user
'emailuser' => 'Surat-i momomoguno diti',
# Watchlist
'viewsourcetext' => 'Puedes ver y copiar el código fuente de esta página:',
'viewyourtext' => "Puedes ver y copiar el código de '''tus ediciones''' a esta página:",
'protectedinterface' => 'Esta página proporciona el texto de la interfaz del software en este wiki, y está protegida para prevenir el abuso.
-Para agregar o cambiar las traducciones para todos los wikis, por favor use [//translatewiki.net/translatewiki.net], el proyecto de localización de MediaWiki.',
+Para agregar o cambiar las traducciones para todos los wikis, por favor, usa [//translatewiki.net/ translatewiki.net], el proyecto de localización de MediaWiki.',
'editinginterface' => "'''Aviso:''' Estás editando una página usada para proporcionar el texto de la interfaz para el software.
Los cambios en esta página afectarán a la apariencia de la interfaz para los demás usuarios de este wiki.
Para añadir o cambiar las traducciones, por favor considera usar [//translatewiki.net/ translatewiki.net], el proyecto de localización de MediaWiki.",
Vê-que la configuracion d’ora de la pâge '''$1''' :",
'protect-locked-access' => "Voutron compto at pas los drêts nècèssèros por changiér los nivéls de protèccion de pâges.
Vê-que la configuracion d’ora de la pâge '''$1''' :",
-'protect-cascadeon' => 'Ora, ceta pâge est protègiê perce qu’el est encllua dens {{PLURAL:$1|ceta pâge|cetes pâges}}, {{PLURAL:$1|qu’at étâ protègiê|qu’ont étâ protègiês}} avouéc lo chouèx « Protèccion en cascâda » activâ.
-Vos pouede changiér lo nivél de protèccion de ceta pâge sen que cen afècte la protèccion en cascâda.',
-'protect-default' => 'Ôtorisar tôs los usanciérs',
-'protect-fallback' => 'At fôta de la pèrmission « $1 »',
-'protect-level-autoconfirmed' => 'Blocar los novéls usanciérs et los usanciérs pas encartâs',
-'protect-level-sysop' => 'Solament los administrators',
+'protect-cascadeon' => 'Ora cela pâge-que est protègiêe, el est entrebetâye dedens {{PLURAL:$1|ceta pâge qu’est étâye protègiêe|cetes pâges que sont étâyes protègiêes}} avouéc lo chouèx « protèccion en cascâda » activâ.
+Vos pouede changiér lo nivél de protèccion de cela pâge sen que cen afècte la protèccion en cascâda.',
+'protect-default' => 'Ôtorisar tôs los utilisators',
+'protect-fallback' => 'Ôtorisar ren que los utilisators avouéc lo drêt « $1 »',
+'protect-level-autoconfirmed' => 'Ôtorisar ren que los utilisators ôtoconfirmâs',
+'protect-level-sysop' => 'Ôtorisar ren que los administrators',
'protect-summary-cascade' => 'protèccion en cascâda',
-'protect-expiring' => 'èxpire lo $1 (UTC)',
+'protect-expiring' => 'èxpire lo $2 a $3 (UTC)',
'protect-expiring-local' => 'èxpire lo $1',
'protect-expiry-indefinite' => 'sen fin',
-'protect-cascade' => 'Protège asse-ben les pâges encllues dens ceta (protèccion en cascâda).',
-'protect-cantedit' => 'Vos pouede pas changiér los nivéls de protèccion de ceta pâge perce que vos avéd pas la pèrmission de la changiér.',
+'protect-cascade' => 'Protègiér les pâges entrebetâyes dedens ceta (protèccion en cascâda)',
+'protect-cantedit' => 'Vos pouede pas changiér los nivéls de protèccion de ceta pâge, vos éd pas la pèrmission de la changiér.',
'protect-othertime' => 'Ôtra dâta d’èxpiracion :',
'protect-othertime-op' => 'ôtra dâta d’èxpiracion',
'protect-existing-expiry' => 'Dâta d’èxpiracion ègzistenta : $2 a $3',
'protect-expiry-options' => '1 hora:1 hour,1 jorn:1 day,1 semana:1 week,2 semanes:2 weeks,1 mês:1 month,3 mês:3 months,6 mês:6 months,1 an:1 year,sen fin:infinite',
'restriction-type' => 'Pèrmission :',
'restriction-level' => 'Nivél de rèstriccion :',
-'minimum-size' => 'Talye la ples petiôta',
-'maximum-size' => 'Talye la ples granta :',
+'minimum-size' => 'Talye minimon',
+'maximum-size' => 'Talye maximon :',
'pagesize' => '(octèts)',
# Restrictions (nouns)
'restriction-edit' => 'Changiér',
-'restriction-move' => 'Renomar',
+'restriction-move' => 'Dèplaciér',
'restriction-create' => 'Fâre',
'restriction-upload' => 'Tèlèchargiér',
# Restriction levels
-'restriction-level-sysop' => 'Protèccion complèta',
-'restriction-level-autoconfirmed' => 'Mié-protèccion',
-'restriction-level-all' => 'Tôs los nivéls',
+'restriction-level-sysop' => 'protèccion complèta',
+'restriction-level-autoconfirmed' => 'mié-protèccion',
+'restriction-level-all' => 'tôs los nivéls',
# Undelete
'undelete' => 'Vêre les pâges suprimâyes',
'undeletepage' => 'Vêre et refâre des pâges suprimâyes',
-'undeletepagetitle' => "'''Ceta lista contint des vèrsions suprimâs de [[:$1|$1]].'''",
+'undeletepagetitle' => "'''Ceta lista contint des vèrsions suprimâyes de [[:$1|$1]].'''",
'viewdeletedpage' => 'Vêre les pâges suprimâyes',
'undeletepagetext' => '{{PLURAL:$1|Ceta pâge at étâ suprimâ et sè trove|Cetes pâges ont étâ suprimâs et sè trovont}} dens les arch·ives, de yô que pô{{PLURAL:$1||von}}t adés étre refêt{{PLURAL:$1|a|es}}.
Les arch·ives pôvont étre èfaciês règuliérement.',
# Special:ListGroupRights
'listgrouprights-members' => 'ممبارانن فھرست',
-# E-mail user
+# Email user
'emailuser' => 'ممباروت بشلی کغاز انڅاوے',
# Watchlist
'usernamehasherror' => 'Divê karakterên xerab ji bo navê bikarhêner neyên bikaranîn',
'loginlanguagelabel' => 'Ziman: $1',
-# E-mail sending
+# Email sending
'user-mail-no-addy' => 'Hewl da e-nameyekê bê navnîşana e-nameyê bişîne',
# Change password dialog
'bold_tip' => 'Nivîsa stûr',
'italic_sample' => 'Nivîsa xwehr (îtalîk)',
'italic_tip' => 'Nivîsa xwehr (îtalîk)',
-'link_sample' => 'Navê lînkê',
+'link_sample' => 'Sernavê girêdanê',
'link_tip' => 'Girêdana navxweyî',
'extlink_sample' => 'http://www.example.com navê lînkê',
'extlink_tip' => 'Girêdana derve (http:// di destpêkê de ji bîr neke)',
'prefs-displaywatchlist' => 'Vebijarkan nîşan bide',
'prefs-diffs' => 'Cudahî',
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
'email-address-validity-valid' => 'E-name derbasdar e',
'email-address-validity-invalid' => 'E-nameyeke derbasdar binivîse',
'listgrouprights-addgroup-all' => 'Hemû koman tevlî bike',
'listgrouprights-removegroup-all' => 'Hemû koman jê bibe',
-# E-mail user
+# Email user
'mailnologin' => 'Navnîşanê neşîne',
'mailnologintext' => 'Te gireke xwe [[Special:UserLogin|qeydbikê]] û adrêsa e-nameyan di [[Special:Preferences|tercihên xwe]] da nivîsandibe ji bo şandina e-nameyan ji bikarhênerên din ra.',
'emailuser' => 'Ji bikarhêner re e-name bişîne',
'whatlinkshere-links' => '← girêdan',
'whatlinkshere-hideredirs' => 'Beralîkirinan $1',
'whatlinkshere-hidetrans' => 'Naverokan $1',
-'whatlinkshere-hidelinks' => 'Lînkan $1',
+'whatlinkshere-hidelinks' => 'Girêdanan $1',
'whatlinkshere-hideimages' => '$1 lînkên wêneyan',
'whatlinkshere-filters' => 'Parzûn',
'monthsall' => 'hemû',
'limitall' => 'hemû',
-# E-mail address confirmation
+# Email address confirmation
'confirmemail' => 'Adrêsa e-nameyan nasbike',
'confirmemail_noemail' => 'Te e-mail-adressê xwe di [[Special:Preferences|tercihên xwe da]] nenivîsandiye.',
'confirmemail_success' => 'E-Mail adrêsa te hate naskirin. Tu niha dikarî xwe qeydbikê û kêfkê.',
'duration-centuries' => '$1 {{PLURAL:$1|eeuw|eeuwen}}',
'duration-millennia' => '$1 {{PLURAL:$1|millennium|millennia}}',
+# Image rotation
+'rotate-comment' => 'Afbeelding gedraaid, $1 {{PLURAL:$1|graad|graden}} met de klok mee',
+
);
Text of the rollback link showing the number of edits to be rolled back. See also {{msg-mw|rollbacklink}}.
Parameters:
-* $1 - the number of edits that will be rollbacked. If $1 is over the value of <code>$wgShowRollbackEditCount</code> (default: 10) {{msg-mw|rollbacklinkcount-morethan}} is used.
+* $1 - the number of edits that will be rolled back. If $1 is over the value of <code>$wgShowRollbackEditCount</code> (default: 10) {{msg-mw|rollbacklinkcount-morethan}} is used.
The rollback link is displayed with a tooltip {{msg-mw|Tooltip-rollback}}',
'rollbacklinkcount-morethan' => 'Text of the rollback link when a greater number of edits is to be rolled back. See also {{msg-mw|rollbacklink}}.
{{Identical|Revert}}
{{Identical|Rollback}}',
'alreadyrolled' => "Appear when there's rollback and/or edit collision. Parameters:
-* $1 - the page to be rollbacked
-* $2 - the editor to be rollbacked of that page
+* $1 - the page to be rolled back
+* $2 - the editor to be rolled-back of that page
* $3 - the editor that cause collision
{{Identical|Rollback}}",
'editcomment' => "Only shown if there is an edit ''{{msg-mw|summary}}''",
'restriction-level-all' => 'orice nivel',
# Undelete
-'undelete' => 'Recuperează pagina ștearsă',
-'undeletepage' => 'Vizualizează și recuperează pagini șterse',
+'undelete' => 'Recuperare pagină ștearsă',
+'undeletepage' => 'Vizualizare și recuperare pagini șterse',
'undeletepagetitle' => "'''Această listă cuprinde versiuni șterse ale paginii [[:$1|$1]].'''",
'viewdeletedpage' => 'Vezi paginile șterse',
'undeletepagetext' => '{{PLURAL:$1|Următoarea pagină a fost ștearsă, dar încă se află în arhivă și poate fi recuperată|Următoarele $1 pagini au fost șterse, dar încă se află în arhivă și pot fi recuperate|Următoarele $1 de pagini au fost șterse, dar încă se află în arhivă și pot fi recuperate}}. Arhiva ar putea fi ștearsă periodic.',
-'undelete-fieldset-title' => 'Recuperează versiuni',
+'undelete-fieldset-title' => 'Recuperare versiuni',
'undeleteextrahelp' => "Pentru a restaura întregul istoric al paginii lăsați toate căsuțele nebifate și apăsați butonul '''''{{int:undeletebtn}}'''''.
Pentru a realiza o recuperare selectivă bifați versiunile pe care doriți să le recuperați și apăsați butonul '''''{{int:undeletebtn}}'''''.",
'undeleterevisions' => '$1 {{PLURAL:$1|versiune arhivată|versiuni arhivate|de versiuni arhivate}}',
'undeletedpage' => "'''$1 a fost recuperat'''
Consultați [[Special:Log/delete|jurnalul ștergerilor]] pentru a vedea toate ștergerile și recuperările recente.",
-'undelete-header' => 'Vezi [[Special:Log/delete|logul de ștergere]] pentru paginile șterse recent.',
+'undelete-header' => 'Consultați [[Special:Log/delete|jurnalul de ștergeri]] pentru paginile șterse recent.',
'undelete-search-title' => 'Căutare pagini șterse',
'undelete-search-box' => 'Caută pagini șterse',
'undelete-search-prefix' => 'Arată paginile care încep cu:',
'unblockip' => 'ปลดบล็อกผู้ใช้',
'unblockiptext' => 'ใช้แบบด้านล่างเพื่อคืนสิทธิการเข้าถึงการเขียนแก่เลขที่อยู่ไอพี หรือชื่อผู้ใช้ที่เคยถูกบล็อก',
'ipusubmit' => 'ยกเลิกการบล็อกนี้',
-'unblocked' => '[[User:$1|$1]] ถูกบล็อก',
+'unblocked' => '[[User:$1|$1]] à¸\96ูà¸\81à¸\9bลà¸\94à¸\9aลà¹\87à¸à¸\81',
'unblocked-range' => '$1 ถูกปลดบล็อกแล้ว',
'unblocked-id' => 'เลิกบล็อก $1',
'blocklist' => 'ผู้ใช้ที่ถูกบล็อก',
-- callers won't be using an index: fix this?
CREATE INDEX /*i*/cl_sortkey ON /*_*/categorylinks (cl_to,cl_type,cl_sortkey,cl_from);
--- Not really used?
+-- Used by the API (and some extensions)
CREATE INDEX /*i*/cl_timestamp ON /*_*/categorylinks (cl_to,cl_timestamp);
--- For finding rows with outdated collation
+-- FIXME: Not used, delete this
CREATE INDEX /*i*/cl_collation ON /*_*/categorylinks (cl_collation);
--
* @ingroup Maintenance
*/
class UpdateCollation extends Maintenance {
- const BATCH_SIZE = 50; // Number of rows to process in one batch
+ const BATCH_SIZE = 10000; // Number of rows to process in one batch
const SYNC_INTERVAL = 20; // Wait for slaves after this many batches
public $sizeHistogram = array();
$collation = Collation::singleton();
}
- $options = array( 'LIMIT' => self::BATCH_SIZE, 'STRAIGHT_JOIN' );
+ $options = array(
+ 'LIMIT' => self::BATCH_SIZE,
+ 'ORDER BY' => 'cl_to, cl_type, cl_from',
+ 'STRAIGHT_JOIN',
+ );
if ( $force || $dryRun ) {
- $options['ORDER BY'] = 'cl_from, cl_to';
$collationConds = array();
} else {
if ( $this->hasOption( 'previous-collation' ) ) {
);
}
- if ( !$wgMiserMode ) {
+ $count = $dbw->estimateRowCount(
+ 'categorylinks',
+ '*',
+ $collationConds,
+ __METHOD__
+ );
+ // Improve estimate if feasible
+ if ( $count < 1000000 ) {
$count = $dbw->selectField(
'categorylinks',
'COUNT(*)',
$collationConds,
__METHOD__
);
- } else {
- $count = $dbw->estimateRowCount(
- 'categorylinks',
- '*',
- $collationConds,
- __METHOD__
- );
}
if ( $count == 0 ) {
$this->output( "Collations up-to-date.\n" );
$res = $dbw->select(
array( 'categorylinks', 'page' ),
array( 'cl_from', 'cl_to', 'cl_sortkey_prefix', 'cl_collation',
- 'cl_sortkey', 'page_namespace', 'page_title'
+ 'cl_sortkey', 'cl_type', 'page_namespace', 'page_title'
),
array_merge( $collationConds, $batchConds, array( 'cl_from = page_id' ) ),
__METHOD__,
$dbw->commit( __METHOD__ );
}
- if ( ( $force || $dryRun ) && $row ) {
- $encFrom = $dbw->addQuotes( $row->cl_from );
- $encTo = $dbw->addQuotes( $row->cl_to );
- $batchConds = array(
- "(cl_from = $encFrom AND cl_to > $encTo) " .
- " OR cl_from > $encFrom" );
+ if ( $row ) {
+ $batchConds = array( $this->getBatchCondition( $row ) );
}
$count += $res->numRows();
}
}
+ /**
+ * Return an SQL expression selecting rows which sort above the given row,
+ * assuming an ordering of cl_to, cl_type, cl_from
+ */
+ function getBatchCondition( $row ) {
+ $dbw = $this->getDB( DB_MASTER );
+ $fields = array( 'cl_to', 'cl_type', 'cl_from' );
+ $first = true;
+ $cond = false;
+ $prefix = false;
+ foreach ( $fields as $field ) {
+ $encValue = $dbw->addQuotes( $row->$field );
+ $inequality = "$field > $encValue";
+ $equality = "$field = $encValue";
+ if ( $first ) {
+ $cond = $inequality;
+ $prefix = $equality;
+ $first = false;
+ } else {
+ $cond .= " OR ($prefix AND $inequality)";
+ $prefix .= " AND $equality";
+ }
+ }
+ return $cond;
+ }
+
function updateSortKeySizeHistogram( $key ) {
$length = strlen( $key );
if ( !isset( $this->sizeHistogram[$length] ) ) {
$dest, // dest
);
+ $op2 = $op;
+ $op2['ignoreMissingSource'] = true;
+ $cases[] = array(
+ $op2, // operation
+ self::baseStorePath() . '/unittest-cont-bad/e/file.txt', // source
+ $dest, // dest
+ );
+
return $cases;
}
$dest, // dest
);
+ $op2 = $op;
+ $op2['ignoreMissingSource'] = true;
+ $cases[] = array(
+ $op2, // operation
+ self::baseStorePath() . '/unittest-cont-bad/e/file.txt', // source
+ $dest, // dest
+ );
+
return $cases;
}
true // succeeds
);
+ $op['ignoreMissingSource'] = true;
+ $op['src'] = self::baseStorePath() . '/unittest-cont-bad/e/file.txt';
+ $cases[] = array(
+ $op, // operation
+ false, // without source
+ true // succeeds
+ );
+
return $cases;
}