Merge "build: Updating development dependencies"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Sat, 27 Jun 2015 04:17:16 +0000 (04:17 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Sat, 27 Jun 2015 04:17:16 +0000 (04:17 +0000)
83 files changed:
.gitattributes
RELEASE-NOTES-1.26
autoload.php
composer.json
docs/extension.schema.json
docs/hooks.txt
includes/DefaultSettings.php
includes/MimeMagic.php
includes/Setup.php
includes/User.php
includes/actions/InfoAction.php
includes/api/ApiFeedWatchlist.php
includes/api/ApiFormatPhp.php
includes/api/i18n/de.json
includes/api/i18n/es.json
includes/api/i18n/gl.json
includes/api/i18n/he.json
includes/api/i18n/qqq.json
includes/cache/MessageCache.php
includes/changes/ChangesList.php
includes/changes/EnhancedChangesList.php
includes/db/Database.php
includes/db/DatabaseMysql.php
includes/db/DatabaseMysqlBase.php
includes/db/DatabaseMysqli.php
includes/db/LoadBalancer.php
includes/db/LoadMonitor.php
includes/htmlform/HTMLTextAreaField.php
includes/htmlform/HTMLTextField.php
includes/installer/i18n/uk.json
includes/jobqueue/JobRunner.php
includes/libs/BufferingStatsdDataFactory.php
includes/libs/RiffExtractor.php [new file with mode: 0644]
includes/libs/composer/ComposerLock.php
includes/libs/normal/UtfNormalUtil.php
includes/media/Bitmap.php
includes/media/FormatMetadata.php
includes/media/WebP.php [new file with mode: 0644]
includes/parser/ParserCache.php
includes/poolcounter/PoolCounter.php
includes/profiler/output/ProfilerOutputDump.php
includes/profiler/output/ProfilerOutputText.php
includes/specialpage/SpecialPage.php
includes/specialpage/SpecialPageFactory.php
includes/specials/SpecialVersion.php
includes/title/MalformedTitleException.php
languages/i18n/be-tarask.json
languages/i18n/bs.json
languages/i18n/cs.json
languages/i18n/dty.json
languages/i18n/en.json
languages/i18n/fi.json
languages/i18n/fr.json
languages/i18n/hr.json
languages/i18n/ia.json
languages/i18n/it.json
languages/i18n/ja.json
languages/i18n/kn.json
languages/i18n/lrc.json
languages/i18n/nan.json
languages/i18n/ne.json
languages/i18n/or.json
languages/i18n/pa.json
languages/i18n/pl.json
languages/i18n/qqq.json
languages/i18n/roa-tara.json
languages/i18n/sk.json
languages/i18n/sl.json
languages/i18n/sr-ec.json
languages/i18n/sv.json
languages/i18n/uk.json
languages/messages/MessagesBs.php
maintenance/convertExtensionToRegistration.php
resources/src/mediawiki.less/mediawiki.ui/mixins.less
resources/src/mediawiki.less/mediawiki.ui/variables.less
resources/src/mediawiki.special/mediawiki.special.version.css
resources/src/mediawiki.ui/components/buttons.less
resources/src/mediawiki/mediawiki.js
tests/phpunit/data/media/2_webp_a.webp [new file with mode: 0644]
tests/phpunit/data/media/2_webp_ll.webp [new file with mode: 0644]
tests/phpunit/data/media/webp_animated.webp [new file with mode: 0644]
tests/phpunit/includes/libs/composer/ComposerLockTest.php
tests/phpunit/includes/media/WebPTest.php [new file with mode: 0644]

index 69d7b1b..09f86a3 100644 (file)
@@ -1,2 +1,3 @@
 *.sh eol=lf
 *.icc binary
+*.webp binary
index c2228ae..518a233 100644 (file)
@@ -30,6 +30,12 @@ production.
 * (T68699) The expiration of the UserID and Token login cookies
   ($wgExtendedLoginCookieExpiration) can be configured independently of the
   expiration of all other cookies ($wgCookieExpiration).
+* (T50519) Support for generating JPEG/PNG thumbnails from WebP images added
+  if ImageMagick is used as image scaler ($wgUseImageMagick = true). Uploading
+  of WebP images still disabled by default. Add $wgFileExtensions[] =
+  'webp'; to LocalSettings.php to enable uploading of WebP images.
+* Added a new hook 'EnhancedChangesListModifyLineData', to
+  modify the data used to build lines in enhanced recentchanges and watchlist.
 
 ==== External libraries ====
 * Update es5-shim from v4.0.0 to v4.1.5.
@@ -39,7 +45,7 @@ production.
 * Added mediawiki/at-ease 1.0.0
 
 === Bug fixes in 1.26 ===
-* (bug 51283) load.php sometimes sends 304 response without full headers
+* (T53283) load.php sometimes sends 304 response without full headers
 * (T65198) Talk page tabs now have a "rel=discussion" attribute
 
 === Action API changes in 1.26 ===
@@ -111,7 +117,9 @@ changes to languages because of Bugzilla reports.
   instead of many optional positional arguments. Calling the constructor the old
   way will issue a deprecation warning.
 * The jquery.mwExtension module was deprecated.
-
+* $wgSpecialPageGroups was removed (deprecated in 1.21).
+* SpecialPageFactory::setGroup was removed (deprecated in 1.21).
+* SpecialPageFactory::getGroup was removed (deprecated in 1.21).
 
 == Compatibility ==
 
@@ -178,4 +186,3 @@ going to run a public MediaWiki, so you can be notified of security fixes.
 == IRC help ==
 
 There's usually someone online in #mediawiki on irc.freenode.net.
-
index 504eaf2..917b022 100644 (file)
@@ -1040,6 +1040,7 @@ $wgAutoloadLocalClasses = array(
        'RevisionList' => __DIR__ . '/includes/RevisionList.php',
        'RevisionListBase' => __DIR__ . '/includes/RevisionList.php',
        'RevisiondeleteAction' => __DIR__ . '/includes/actions/RevisiondeleteAction.php',
+       'RiffExtractor' => __DIR__ . '/includes/libs/RiffExtractor.php',
        'RightsLogFormatter' => __DIR__ . '/includes/logging/RightsLogFormatter.php',
        'RollbackAction' => __DIR__ . '/includes/actions/RollbackAction.php',
        'RollbackEdits' => __DIR__ . '/maintenance/rollbackEdits.php',
@@ -1342,6 +1343,7 @@ $wgAutoloadLocalClasses = array(
        'WebInstallerUpgrade' => __DIR__ . '/includes/installer/WebInstallerPage.php',
        'WebInstallerUpgradeDoc' => __DIR__ . '/includes/installer/WebInstallerPage.php',
        'WebInstallerWelcome' => __DIR__ . '/includes/installer/WebInstallerPage.php',
+       'WebPHandler' => __DIR__ . '/includes/media/WebP.php',
        'WebRequest' => __DIR__ . '/includes/WebRequest.php',
        'WebRequestUpload' => __DIR__ . '/includes/WebRequest.php',
        'WebResponse' => __DIR__ . '/includes/WebResponse.php',
index 1b2de96..f72e7e4 100644 (file)
@@ -26,7 +26,7 @@
                "psr/log": "1.0.0",
                "wikimedia/cdb": "1.0.1",
                "wikimedia/assert": "0.2.2",
-               "wikimedia/composer-merge-plugin": "1.1.0",
+               "wikimedia/composer-merge-plugin": "1.2.0",
                "wikimedia/utfnormal": "1.0.2",
                "zordius/lightncandy": "0.21"
        },
index d7d9e47..c9f629c 100644 (file)
                        "type": "object"
                },
                "FilterLogTypes": {
-                       "type": "array"
+                       "type": "object"
                },
                "LogNames": {
                        "type": "object"
index 8cfdee9..bcdfa40 100644 (file)
@@ -1304,6 +1304,13 @@ $changesList: EnhancedChangesList object
 &$links: The links that were generated by EnhancedChangesList
 $block: The RecentChanges objects in that block
 
+'EnhancedChangesListModifyLineData': to alter data used to build
+a recent change inner line in EnhancedChangesList.
+$changesList: EnhancedChangesList object
+&$data: An array with all the components that will be joined in order to create the line
+$block: An array of RecentChange objects in that block
+$rc: The RecentChange object for this line
+
 'ExemptFromAccountCreationThrottle': Exemption from the account creation
 throttle.
 $ip: The ip address of the user
@@ -2403,7 +2410,9 @@ such as Special:MyPage and Special:MyTalk.
 &$redirectParams: An array of parameters preserved by redirecting special pages.
 
 'RejectParserCacheValue': Return false to reject an otherwise usable
-cached value from the Parser cache.
+cached value from the Parser cache. NOTE: CARELESS USE OF THIS HOOK CAN
+HAVE CATASTROPHIC CONSEQUENCES FOR HIGH-TRAFFIC INSTALLATIONS. USE WITH
+EXTREME CARE.
 $parserOutput: ParserOutput value.
 $wikiPage: WikiPage object.
 $parserOptions: ParserOptions object.
index 0e6ff16..6f2f5b9 100644 (file)
@@ -884,6 +884,7 @@ $wgMediaHandlers = array(
        'image/png' => 'PNGHandler',
        'image/gif' => 'GIFHandler',
        'image/tiff' => 'TiffHandler',
+       'image/webp' => 'WebPHandler',
        'image/x-ms-bmp' => 'BmpHandler',
        'image/x-bmp' => 'BmpHandler',
        'image/x-xcf' => 'XCFHandler',
@@ -6968,14 +6969,6 @@ $wgAllowSpecialInclusion = true;
  */
 $wgDisableQueryPageUpdate = false;
 
-/**
- * List of special pages, followed by what subtitle they should go under
- * at Special:SpecialPages
- *
- * @deprecated since 1.21 Override SpecialPage::getGroupName instead
- */
-$wgSpecialPageGroups = array();
-
 /**
  * On Special:Unusedimages, consider images "used", if they are put
  * into a category. Default (false) is not to count those as used.
index 3b06525..2b240c3 100644 (file)
@@ -695,7 +695,7 @@ class MimeMagic {
                }
 
                /* Look for WebP */
-               if ( strncmp( $head, "RIFF", 4 ) == 0 && strncmp( substr( $head, 8, 8 ), "WEBPVP8 ", 8 ) == 0 ) {
+               if ( strncmp( $head, "RIFF", 4 ) == 0 && strncmp( substr( $head, 8, 7 ), "WEBPVP8", 7 ) == 0 ) {
                        wfDebug( __METHOD__ . ": recognized file as image/webp\n" );
                        return "image/webp";
                }
index a97cfa6..90fbf61 100644 (file)
@@ -536,7 +536,9 @@ if ( $wgTmpDirectory === false ) {
 
 // We don't use counters anymore. Left here for extensions still
 // expecting this to exist. Should be removed sometime 1.26 or later.
-$wgDisableCounters = true;
+if ( !isset( $wgDisableCounters ) ) {
+       $wgDisableCounters = true;
+}
 
 if ( $wgMainWANCache === false ) {
        // Setup a WAN cache from $wgMainCacheType with no relayer.
index 1ee8173..21c09cc 100644 (file)
@@ -378,7 +378,7 @@ class User implements IDBAccessObject {
         * @param integer $flags User::READ_* constant bitfield
         * @return bool False if the ID does not exist, true otherwise
         */
-       public function loadFromId( $flags = self::READ_LATEST ) {
+       public function loadFromId( $flags = self::READ_NORMAL ) {
                if ( $this->mId == 0 ) {
                        $this->loadDefaults();
                        return false;
index 203c687..0c34ddb 100644 (file)
@@ -234,7 +234,7 @@ class InfoAction extends FormlessAction {
 
                // Display title
                $displayTitle = $title->getPrefixedText();
-               if ( !empty( $pageProperties['displaytitle'] ) ) {
+               if ( isset( $pageProperties['displaytitle'] ) ) {
                        $displayTitle = $pageProperties['displaytitle'];
                }
 
@@ -259,7 +259,7 @@ class InfoAction extends FormlessAction {
 
                // Default sort key
                $sortKey = $title->getCategorySortkey();
-               if ( !empty( $pageProperties['defaultsort'] ) ) {
+               if ( isset( $pageProperties['defaultsort'] ) ) {
                        $sortKey = $pageProperties['defaultsort'];
                }
 
@@ -448,7 +448,8 @@ class InfoAction extends FormlessAction {
                                }
                        }
                        $expiry = $title->getRestrictionExpiry( $restrictionType );
-                       $formattedexpiry = $this->msg( 'parentheses', $this->getLanguage()->formatExpiry( $expiry ) )->escaped();
+                       $formattedexpiry = $this->msg( 'parentheses',
+                               $this->getLanguage()->formatExpiry( $expiry ) )->escaped();
                        $message .= $this->msg( 'word-separator' )->escaped() . $formattedexpiry;
 
                        // Messages: restriction-edit, restriction-move, restriction-create,
index d1beef8..853b138 100644 (file)
@@ -126,7 +126,8 @@ class ApiFeedWatchlist extends ApiBase {
 
                        $msg = wfMessage( 'watchlist' )->inContentLanguage()->text();
 
-                       $feedTitle = $this->getConfig()->get( 'Sitename' ) . ' - ' . $msg . ' [' . $this->getConfig()->get( 'LanguageCode' ) . ']';
+                       $feedTitle = $this->getConfig()->get( 'Sitename' ) . ' - ' . $msg .
+                               ' [' . $this->getConfig()->get( 'LanguageCode' ) . ']';
                        $feedUrl = SpecialPage::getTitleFor( 'Watchlist' )->getFullURL();
 
                        $feed = new $feedClasses[$params['feedformat']] (
index d88dd40..6420a5b 100644 (file)
@@ -68,7 +68,8 @@ class ApiFormatPhp extends ApiFormatBase {
                        preg_match( '/\<\s*cross-domain-policy\s*\>/i', $text )
                ) {
                        $this->dieUsage(
-                               'This response cannot be represented using format=php. See https://bugzilla.wikimedia.org/show_bug.cgi?id=66776',
+                               'This response cannot be represented using format=php. ' .
+                               'See https://bugzilla.wikimedia.org/show_bug.cgi?id=66776',
                                'internalerror'
                        );
                }
index 228dc24..0f0f548 100644 (file)
        "apihelp-imagerotate-param-rotation": "Anzahl der Grad, um die das Bild im Uhrzeigersinn gedreht werden soll.",
        "apihelp-imagerotate-example-simple": "<kbd>Datei:Beispiel.png</kbd> um <kbd>90</kbd> Grad drehen.",
        "apihelp-imagerotate-example-generator": "Alle Bilder in der <kbd>Kategorie:Flip</kbd> um <kbd>180</kbd> Grad drehen.",
-       "apihelp-import-description": "Importiert eine Seite von einem anderen Wiki oder einer XML-Datei.\n\nBitte beachte, dass der HTTP-POST-Vorgang als Dateiupload ausgeführt werden muss (z.B. durch multipart/form-data), um eine Datei über den <var>xml</var>-Parameter zu senden.",
+       "apihelp-import-description": "Importiert eine Seite aus einem anderen Wiki oder von einer XML-Datei.\n\nBitte beachte, dass der HTTP-POST-Vorgang als Dateiupload ausgeführt werden muss (z.B. durch multipart/form-data), um eine Datei über den <var>xml</var>-Parameter zu senden.",
        "apihelp-import-param-summary": "Import-Zusammenfassung.",
        "apihelp-import-param-xml": "Hochgeladene XML-Datei.",
        "apihelp-import-param-interwikisource": "Für Interwiki-Importe: Wiki, von dem importiert werden soll.",
index 97c38a6..1923dc9 100644 (file)
@@ -9,7 +9,8 @@
                        "Edslov",
                        "Carlos Cristia",
                        "Ryo567",
-                       "Csbotero"
+                       "Csbotero",
+                       "Chris TR"
                ]
        },
        "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|Documentación]]\n* [[mw:API:FAQ|Preguntas frecuentes]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Lista de correos]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API de anuncios]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Errores y peticiones]\n</div>\n<strong>Estado:</strong> Todas las características que se muestran en esta página debería funcionar, pero la API aún está en desarrollo activo y puede cambiar en cualquier momento. Suscríbete a [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ la lista de correo de mediawiki-api-announce] para estar al día de las actualizaciones.\n\n<strong>Solicitudes erróneas:</strong> Cuando se envían solicitudes erróneas a la API, se envía un encabezado HTTP con la clave \"MediaWiki-API-Error\" y ambos valores, del encabezado y el código de error, se establecerán en el mismo valor. Para más información, véase [[mw:API:Errors_and_warnings|API: Errores y advertencias]].",
@@ -17,6 +18,7 @@
        "apihelp-main-param-format": "El formato de la salida.",
        "apihelp-main-param-smaxage": "Establece el encabezado <code>s-maxage</code> durante estos segundos. Los errores nunca se almacenan en caché.",
        "apihelp-main-param-maxage": "Establece el encabezado <code>max-age</code> durante estos segundos. Los errores nunca se almacenan en caché.",
+       "apihelp-main-param-assert": "Comprobar que el usuario haya iniciado sesión si el valor es <kbd>user</kbd> o si tiene el permiso de bot si <kbd>bot</kbd>.",
        "apihelp-main-param-requestid": "Cualquier valor dado aquí se incluirá en la respuesta. Se puede utilizar para distinguir solicitudes.",
        "apihelp-main-param-servedby": "Incluir el nombre del host que ha servido la solicitud en los resultados.",
        "apihelp-main-param-curtimestamp": "Incluir la marca de tiempo actual en el resultado.",
index d87bc30..7a3355a 100644 (file)
        "api-help-param-type-limit": "Tipo: enteiro ou <kbd>max</kbd>",
        "api-help-param-type-integer": "Tipo: {{PLURAL:$1|1=enteiro|2=lista de enteiros}}",
        "api-help-param-type-boolean": "Tipo: booleano ([[Special:ApiHelp/main#main/datatypes|detalles]])",
-       "api-help-param-type-password": "",
        "api-help-param-type-timestamp": "Tipo: {{PLURAL:$1|1=selo de tempo|2=lista de selos de tempo}} ([[Special:ApiHelp/main#main/datatypes|formatos permitidos]])",
        "api-help-param-type-user": "Tipo: {{PLURAL:$1|1=nome de usuario|2=lista de nomes de usuarios}}",
        "api-help-param-list": "{{PLURAL:$1|1=Un valor|2=Valores (separados con <kbd>{{!}}</kbd>)}}: $2",
index c1c96e7..d3a76ba 100644 (file)
        "apihelp-block-param-nocreate": "מניעת יצירת חשבונות",
        "apihelp-block-param-autoblock": "חסימה אוטומטית גם של כתובת ה־IP האחרונה שהשתמש בה ושל כל כתובת IP שינסה להשתמש בה בעתיד.",
        "apihelp-block-param-reblock": "אם המשתמש כבר חסום, לדרוס את החסימה הנוכחית.",
+       "apihelp-block-param-watchuser": "לעקוב אחרי דף המשתמש ודף השיחה של המשתמש או של כתובת ה־IP.",
+       "apihelp-checktoken-param-type": "סוג האסימון שבבדיקה.",
+       "apihelp-checktoken-param-token": "איזה אסימון לבדוק.",
+       "apihelp-checktoken-param-maxtokenage": "הגיל המרבי המותר של האסימון, בשניות.",
+       "apihelp-checktoken-example-simple": "בדיקת התקינות של אסימון <kbd>csrf</kbd>.",
        "apihelp-compare-param-fromtitle": "כותרת ראשונה להשוואה.",
        "apihelp-compare-param-fromid": "מס׳ זיהוי של העמוד הראשון להשוואה.",
        "apihelp-compare-param-fromrev": "גרסה ראשונה להשוואה.",
        "apihelp-delete-param-unwatch": "הסרת הדף מרשימת המעקב של של המשתמש הנוכחי.",
        "apihelp-delete-example-simple": "מחיקת <kbd>Main Page</kbd>.",
        "apihelp-delete-example-reason": "מחיקת <kbd>Main Page</kbd>. סיבה: <kbd>Preparing for move</kbd>.",
+       "apihelp-disabled-description": "היחידה הזאת כובתה.",
        "apihelp-edit-description": "יצירה ועריכה של דפים.",
        "apihelp-edit-param-title": "שם הדף לעריכה. לא לשימוש עם <var>$1pageid</var>.",
        "apihelp-edit-param-pageid": "מזהה הדף לעריכה. לא לשימוש עם <var>$1title</var>.",
+       "apihelp-edit-param-section": "מספר הפסקה <kbd>0</kbd> לפסקה העליונה, <kbd>new</kbd> לפסקה חדשה.",
+       "apihelp-edit-param-sectiontitle": "הכותרת לפסקה החדשה.",
        "apihelp-edit-param-text": "תוכן הדף.",
+       "apihelp-edit-param-summary": "תקציר עריכה. גם גותרת פסקה כש־$1section=new ו־$1sectiontitle אינו מוגדר.",
        "apihelp-edit-param-tags": "אילו תגי שינוי להחיל על הגרסה.",
        "apihelp-edit-param-minor": "עריכה משנית.",
        "apihelp-edit-param-notminor": "שינוי לא משני.",
        "apihelp-edit-param-bot": "סימון עריכה זו כבוט.",
+       "apihelp-edit-param-basetimestamp": "חותם־זמן של גרסת הבסיס, משמש לזיהוי התנגשויות עריכה. אפשר לקבל אותו באמצעות [[Special:ApiHelp/query+revisions|action=query&prop=revisions&rvprop=timestamp]].",
+       "apihelp-edit-param-recreate": "לעקוב את כל הטעויות על כך שהדף נמחק בינתיים.",
+       "apihelp-edit-param-createonly": "לא לערוך את הדף אם הוא כבר קיים.",
+       "apihelp-edit-param-nocreate": "לזרוק שגיאה אם הדף אינו קיים.",
        "apihelp-edit-param-watch": "הוספת העמוד לרשימת המעקב של המשתמש הנוכחי.",
        "apihelp-edit-param-unwatch": "הסרת הדף מרשימת המעקב של של המשתמש הנוכחי.",
+       "apihelp-edit-param-watchlist": "להוסיף את הדף לרשימת המעקב של המשתמש הנוכחי או להסיר אותו משם, להשתמש בהעדפות, או לא לשנות את מצב המעקב.",
        "apihelp-edit-example-edit": "עריכת דף",
        "apihelp-emailuser-description": "שליחת דוא\"ל למשתמש.",
+       "apihelp-emailuser-param-target": "לאיזה משתמש לשלוח דוא\"ל.",
+       "apihelp-emailuser-param-subject": "כותרת נושא.",
+       "apihelp-emailuser-param-text": "גוף הדואר.",
+       "apihelp-emailuser-param-ccme": "שליחת עותק של הדואר הזה אליי.",
+       "apihelp-expandtemplates-description": "הרחבת כל התבניות בקוד הוויקי.",
        "apihelp-expandtemplates-param-title": "כותרת הדף.",
+       "apihelp-expandtemplates-param-text": "איזה קוד ויקי להמיר.",
+       "apihelp-expandtemplates-paramvalue-prop-wikitext": "קוד הוויקי המורחב.",
        "apihelp-expandtemplates-paramvalue-prop-jsconfigvars": "נותן משתני הגדרות של JavaScript שייחודיים לדף הזה.",
        "apihelp-expandtemplates-paramvalue-prop-encodedjsconfigvars": "נותן משתני הגדרות של JavaScript שייחודיים לדף הזה בתור מחרוזת JSON.",
+       "apihelp-expandtemplates-paramvalue-prop-parsetree": "עץ פענוח XML של הקלט.",
+       "apihelp-expandtemplates-param-includecomments": "האם לכלול הערות HTML בפלט.",
+       "apihelp-expandtemplates-param-generatexml": "יצירת עץ פענוח XML (מוחלף ב־$1prop=parsetree).",
+       "apihelp-feedcontributions-description": "החזרת הזנת תרומות משתמש.",
        "apihelp-feedcontributions-param-feedformat": "תסדיר ההזנה.",
+       "apihelp-feedcontributions-param-user": "לקבל תרומות של אילו משמשים.",
+       "apihelp-feedcontributions-param-namespace": "לפי איזה מרחב שם לסנן את התרומות.",
        "apihelp-feedcontributions-param-year": "החל משנה (ולפני כן).",
        "apihelp-feedcontributions-param-month": "החל מחודש (ולפני כן).",
        "apihelp-feedcontributions-param-tagfilter": "סינון תרומות בעלות התגיות הבאות.",
        "apihelp-feedcontributions-param-deletedonly": "הצגת תרומות שנמחקו בלבד.",
        "apihelp-feedcontributions-param-toponly": "הצגת עריכות שהן הגרסה העדכנית ביותר בלבד.",
+       "apihelp-feedcontributions-param-newonly": "להציג רק עריכות שהן יצירות דפים.",
+       "apihelp-feedcontributions-param-showsizediff": "להציג את ההבדל בגודל בין גרסאות.",
        "apihelp-feedcontributions-example-simple": "החזרת תרומות עבור המשתמש <kbd>Example</kbd>.",
+       "apihelp-feedrecentchanges-description": "להחזיר הזנת שינויים אחרונים.",
        "apihelp-feedrecentchanges-param-feedformat": "תסדיר ההזנה.",
+       "apihelp-feedrecentchanges-param-namespace": "לאיזה מרחב שם להגביל את התוצאות.",
+       "apihelp-feedrecentchanges-param-invert": "כל מרחבי השם למעט זה שנבחר.",
+       "apihelp-feedrecentchanges-param-associated": "לכלול מרחב שם משויך (שיחה או ראשי).",
+       "apihelp-feedrecentchanges-param-days": "לכמה ימים להגביל את התוצאות.",
+       "apihelp-feedrecentchanges-param-limit": "המספר המרבי של התוצאות להחזיר.",
+       "apihelp-feedrecentchanges-param-from": "להציג תוצאות מאז.",
        "apihelp-feedrecentchanges-param-hideminor": "הסתרת שינוים משניים.",
        "apihelp-feedrecentchanges-param-hidebots": "הסתרת שינויים שנעשו על ידי בוטים.",
        "apihelp-feedrecentchanges-param-hideanons": "הסתרת שינויים שנעשו על ידי אנונימים.",
        "apihelp-feedrecentchanges-param-hidemyself": "הסתרת שינוים שנעשו על ידי המשתמש הנוכחי.",
        "apihelp-feedrecentchanges-param-tagfilter": "סינון לפי תגית.",
        "apihelp-feedrecentchanges-param-target": "הצגת שינויים שנעשו בדפים המקושרים לדף זה בלבד.",
+       "apihelp-feedrecentchanges-param-showlinkedto": "להציג את השינויים בדפים שמקושרים לדף שנבחר במקום זה.",
        "apihelp-feedrecentchanges-example-simple": "הצגת שינויים אחרונים.",
        "apihelp-feedrecentchanges-example-30days": "הצגת שינויים אחרונים עבור 30 ימים.",
+       "apihelp-feedwatchlist-description": "החזרת הזנת רשימת מעקב.",
        "apihelp-feedwatchlist-param-feedformat": "תסדיר ההזנה.",
+       "apihelp-feedwatchlist-param-hours": "רשימת דפים ששונו בתוך מספר כזה של שעות מעכשיו.",
+       "apihelp-feedwatchlist-param-linktosections": "לקשר ישר לפסקאות ששונו אם אפשר.",
+       "apihelp-feedwatchlist-example-default": "הצגת הזנת רשימת מעקב.",
+       "apihelp-feedwatchlist-example-all6hrs": "להציג את כל השינויים בדפים שבמעקב ב־6 השעות האחרונות.",
+       "apihelp-filerevert-description": "לשחזר את הקובץ לגרסה ישנה יותר.",
+       "apihelp-filerevert-param-filename": "שם קובץ היעד, ללא התחילית File:.",
+       "apihelp-filerevert-param-comment": "הערת העלאה.",
+       "apihelp-filerevert-param-archivename": "שם הארכיון של הגרסה שאליה ישוחזר הקובץ.",
        "apihelp-help-description": "הצגת עזרה עבור היחידות שצוינו.",
+       "apihelp-help-param-recursivesubmodules": "לכלול עזרה לתת־יחידות באופן רקורסיבי.",
        "apihelp-help-param-helpformat": "תסדיר פלט העזרה.",
        "apihelp-help-param-toc": "לכלול תוכן עניינים בפלט HTML.",
-       "apihelp-help-example-main": "×¢×\96ר×\94 ×\9c×\9e×\95×\93×\95×\9c ×\94ר×\90ש×\99.",
+       "apihelp-help-example-main": "×¢×\96ר×\94 ×\9c×\99×\97×\99×\93×\94 ×\94ר×\90ש×\99ת.",
        "apihelp-help-example-recursive": "כל העזרה בדף אחד.",
        "apihelp-help-example-help": "עזרה ליחידת העזרה עצמה.",
        "apihelp-help-example-query": "עזרה לשתי תת־יחידות של שאילתה.",
        "apihelp-opensearch-param-search": "מחרוזת לחיפוש.",
        "apihelp-opensearch-param-namespace": "שמות מתחם לחיפוש.",
        "apihelp-opensearch-param-format": "תסדיר הפלט.",
+       "apihelp-options-param-reset": "אתחול ההעדפות לבררות המחדל של האתר.",
+       "apihelp-options-example-reset": "אתחול כל ההעדפות.",
+       "apihelp-paraminfo-description": "קבלת מידע על יחידות של API.",
+       "apihelp-paraminfo-param-helpformat": "תסדיר מחרוזות העזרה.",
+       "apihelp-paraminfo-param-pagesetmodule": "קבלת מידע גם על יחידת pageset (שמספק את titles=‎ וידידיו).",
+       "apihelp-parse-param-summary": "התקציר שצריך לפענח.",
+       "apihelp-parse-param-prop": "אילו פריטי מידע לקבל:",
+       "apihelp-parse-paramvalue-prop-text": "נותן טקסט מפוענח של קוד הוויקי.",
+       "apihelp-parse-paramvalue-prop-langlinks": "נותן קישורי שפה בקוד הוויקי המפוענח.",
+       "apihelp-parse-paramvalue-prop-categories": "נותן קטגוריות בקוד ויקי מפוענח.",
+       "apihelp-parse-paramvalue-prop-categorieshtml": "נותן את גרסת ה־HTML של הקטגוריות.",
+       "apihelp-parse-paramvalue-prop-links": "נותן קישורים פנימיים בקוד הוויקי המפוענח.",
+       "apihelp-parse-paramvalue-prop-templates": "נותן תבניות בקוד הוויקי המפוענח.",
+       "apihelp-parse-paramvalue-prop-images": "נותן תמונות בקוד הוויקי המפוענח.",
        "apihelp-parse-paramvalue-prop-jsconfigvars": "נותן משתני הגדרות של JavaScript שייחודיים לדף הזה.",
        "apihelp-parse-paramvalue-prop-encodedjsconfigvars": "נותן משתני הגדרות של JavaScript שייחודיים לדף הזה בתור מחרוזת JSON.",
        "apihelp-protect-param-watchlist": "הוספה או הסרה של הדף ללא תנאי מרשימת המעקב של המשתמש הנוכחי, להשתמש בהעדפות או לא לשנות את המעקב.",
        "apihelp-query-param-list": "אילו רשימות לקבל.",
        "apihelp-query+allcategories-description": "מניין של כל הקטגוריות.",
        "apihelp-query+allcategories-param-from": "הקטגוריה ממנה להתחיל למנות.",
+       "apihelp-query+allcategories-param-to": "באיזו קטגוריה להפסיק לרשום.",
+       "apihelp-query+allcategories-param-prefix": "חיפוש כל כותרות הקטגוריות שמתחילות בערך הזה.",
        "apihelp-query+allcategories-param-dir": "באיזה כיוון למיין.",
+       "apihelp-query+allcategories-param-min": "להחזיר רק קטגוריות עם מספר כזה לפחות של חברים.",
+       "apihelp-query+allcategories-param-max": "להחזיר רק קטגוריות עם מספר כזה לכל היותר של חברים.",
        "apihelp-query+allcategories-param-limit": "כמה קטגוריות להחזיר.",
+       "apihelp-query+allcategories-param-prop": "אילו מאפיינים לקבל:\n;size:הוספת מספר הדפים בקטגוריה.\n;hidden:מתייג קטגוריות מוסתרות עם _&#95;HIDDENCAT_&#95;.",
+       "apihelp-query+allcategories-example-size": "רשימת קטגוריות עם מידע על מספר הדפים בכל אחת מהן.",
        "apihelp-query+alldeletedrevisions-param-start": "באיזה חותם זמן להתחיל לרשום.",
        "apihelp-query+alldeletedrevisions-param-end": "באיזה חותם זמן להפסיק לרשום.",
        "apihelp-query+alldeletedrevisions-param-from": "להתחיל את הרשימה בשם הזה.",
        "api-help-lead": "זהו דף תיעוד של API שנוצר באופן אוטומטי.\n\nתיעוד ודוגמאות: https://www.mediawiki.org/wiki/API",
        "api-help-main-header": "יחידה ראשית",
        "api-help-flag-deprecated": "יחידה זו אינה מומלצת לשימוש.",
-       "api-help-flag-internal": "<strong>×\99×\97×\99×\93×\94 ×\96×\95 ×\94×\99×\90 ×¤× ×\99×\9e×\99ת ×\90×\95 ×\9c×\90 ×\99צ×\99×\91×\94.</strong>\n×\94פע×\95×\9c×\94 ×©×\9c×\94 ×¢×©×\95×\99ה להשתנות ללא הודעה מוקדמת.",
+       "api-help-flag-internal": "<strong>×\94×\99×\97×\99×\93×\94 ×\94×\96×\90ת ×\94×\99×\90 ×¤× ×\99×\9e×\99ת ×\90×\95 ×\91×\9cת×\99Ö¾×\99צ×\99×\91×\94.</strong> ×\94פע×\95×\9c×\94 ×©×\9c×\94 ×\99×\9b×\95×\9cה להשתנות ללא הודעה מוקדמת.",
        "api-help-flag-readrights": "יחידה זו דורשת הרשאות קריאה.",
        "api-help-flag-writerights": "יחידה זו דורשת הרשאות כתיבה.",
        "api-help-flag-mustbeposted": "יחידה זו מקבלת רק בקשות POST.",
-       "api-help-flag-generator": "×\94×\99×\97×\99×\93×\94 ×\94×\96×\90ת ×\99×\9b×\95×\9c×\94 ×\9c×\94×\99×\95ת מחולל.",
+       "api-help-flag-generator": "×\90פשר ×\9c×\94שת×\9eש ×\91×\99×\97×\99×\93×\94 ×\94×\96×\90ת ×\91ת×\95ר מחולל.",
        "api-help-source": "מקור: $1",
        "api-help-source-unknown": "מקור: <span class=\"apihelp-unknown\">לא ידוע</span>",
        "api-help-license": "רישיון: <span dir=\"auto\">[[$1|$2]]</span>",
        "api-help-param-deprecated": "מיושן.",
        "api-help-param-required": "פרמטר זה נדרש.",
        "api-help-datatypes-header": "סוגי נתונים",
+       "api-help-datatypes": "חלק מסוגי הפרמטרים בבקשות API דורשים הסבר נוסף:\n;בוליאני (boolean)\n:פרמטרים בוליאניים עובדים כמו תיבות סימון של HTML: אם הפרמטר צוין, בלי קשר לערך שלו, הוא אמת (true). בשביל ערך שקר (false), יש להשמיט את הפרמטר לגמרי.\n;חותם־זמן (timestamp)\n:אפשר לכתוב חותמי־זמן במספר תסדירים. תאריך ושעה לפי ISO 8601 הוא הדבר המומלת. כל הזמנים מצוינים ב־ UTC, לא תהיה השפעה לשום אזור זמן שיצוין.\n:* תאריך ושעה לפי ISO 8601‏, <kbd><var>2001</var>-<var>01</var>-<var>15</var>T<var>14</var>:<var>56</var>:<var>00</var>Z</kbd> (לא חובה לכתוב פיסוק ו־<kbd>Z</kbd>)\n:* תאריך ושעה לפי ISO 8601 עם חלקי שנייה (שלא תהיה להם שום השפעה), <kbd><var>2001</var>-<var>01</var>-<var>15</var>T<var>14</var>:<var>56</var>:<var>00</var>.<var>00001</var>Z</kbd> (לא חובה לכתוב קווים מפרידים, נקודתיים ו־<kbd>Z</kbd>)\n:* תסדיר MediaWiki‏, <kbd><var>2001</var><var>01</var><var>15</var><var>14</var><var>56</var><var>00</var></kbd>\n:* תסדיר מספרי כללי, <kbd><var>2001</var>-<var>01</var>-<var>15</var> <var>14</var>:<var>56</var>:<var>00</var></kbd> (לאזור זמן אופציונלי של <kbd>GMT</kbd>‏, <kbd dir=\"ltr\">+<var>##</var></kbd>, או <kbd dir=\"ltr\">-<var>##</var></kbd> אין השפעה)\n:* תסדיר EXIF‏, <kbd><var>2001</var>:<var>01</var>:<var>15</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* תסדיר RFC 2822 (אפשר להשמיט את אזור הזמן), <kbd><var>Mon</var>, <var>15</var> <var>Jan</var> <var>2001</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* תסדיר RFC 850 (אפשר להשמיט את אזור הזמן), <kbd><var>Monday</var>, <var>15</var>-<var>Jan</var>-<var>2001</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* תסדיר C ctime‏, <kbd><var>Mon</var> <var>Jan</var> <var>15</var> <var>14</var>:<var>56</var>:<var>00</var> <var>2001</var></kbd>\n:* שניות מאז 1970-01-01T00:00:00Z בתור מספר שלך בין 1 ל־13 (לא כולל <kbd>0</kbd>)\n:* המחרוזת <kbd>now</kbd>",
        "api-help-param-type-integer": "סוג: {{PLURAL:$1|1=מספר שלם|2=רשימת מספרים שלמים}}",
        "api-help-param-type-boolean": "סוג: בוליאני ([[Special:ApiHelp/main#main/datatypes|פרטים]])",
        "api-help-param-list": "{{PLURAL:$1|1=ערך אחד|2=ערכים (מופרדים באמצעות \"<kbd>{{!}}</kbd>\")}}: $2",
index 051ef07..c436d4f 100644 (file)
@@ -8,7 +8,9 @@
                        "McDutchie",
                        "Raymond",
                        "Anomie",
-                       "Nemo bis"
+                       "Nemo bis",
+                       "Amire80",
+                       "Siebrand"
                ]
        },
        "apihelp-main-description": "{{doc-apihelp-description|main}}",
        "apihelp-feedwatchlist-example-all6hrs": "{{doc-apihelp-example|feedwatchlist}}",
        "apihelp-filerevert-description": "{{doc-apihelp-description|filerevert}}",
        "apihelp-filerevert-param-filename": "{{doc-apihelp-param|filerevert|filename}}",
-       "apihelp-filerevert-param-comment": "{{doc-apihelp-param|filerevert|comment}}",
+       "apihelp-filerevert-param-comment": "Translate as \"a comment about the upload\".\n\n{{doc-apihelp-param|filerevert|comment}}",
        "apihelp-filerevert-param-archivename": "{{doc-apihelp-param|filerevert|archivename}}",
        "apihelp-filerevert-example-revert": "{{doc-apihelp-example|filerevert}}",
        "apihelp-help-description": "{{doc-apihelp-description|help}}",
        "api-help-fallback-description": "{{notranslate}}",
        "api-help-fallback-parameter": "{{notranslate}}",
        "api-help-fallback-example": "{{notranslate}}",
-       "api-help-flags": "{{optional}} Label for the API help flags box\n\nParameters:\n* $1 - Number of flags to be displayed",
+       "api-help-flags": "{{ignored}} Label for the API help flags box\n\nParameters:\n* $1 - Number of flags to be displayed",
        "api-help-flag-deprecated": "Flag displayed for an API module that is deprecated",
        "api-help-flag-internal": "Flag displayed for an API module that is considered internal or unstable",
        "api-help-flag-readrights": "Flag displayed for an API module that requires read rights",
        "api-help-license": "Displayed in the flags box to indicate the license of an API module.\n\nParameters:\n* $1 - Page to link to display the full license text\n* $2 - Display text for the link\n\nSee also:\n* {{msg-mw|api-help-license-noname}}\n* {{msg-mw|api-help-license-unknown}}",
        "api-help-license-noname": "Displayed in the flags box to indicate the license of an API module, when the tag for the license is not known.\n\nParameters:\n* $1 - Page to link to display the full license text\n\nSee also:\n* {{msg-mw|api-help-license}}\n* {{msg-mw|api-help-license-unknown}}",
        "api-help-license-unknown": "Displayed in the flags box to indicate that the license of the API module is not known.\n\nSee also:\n* {{msg-mw|api-help-license}}\n* {{msg-mw|api-help-license-noname}}",
-       "api-help-help-urls": "{{optional}} Label for the API help urls section\n\nParameters:\n* $1 - Number of urls to be displayed",
+       "api-help-help-urls": "{{ignored}} Label for the API help urls section\n\nParameters:\n* $1 - Number of urls to be displayed",
        "api-help-parameters": "Label for the API help parameters section\n\nParameters:\n* $1 - Number of parameters to be displayed\n{{Identical|Parameter}}",
        "api-help-param-deprecated": "Displayed in the API help for any deprecated parameter\n{{Identical|Deprecated}}",
        "api-help-param-required": "Displayed in the API help for any required parameter",
        "api-help-param-type-limit": "{{technical}} {{doc-important|Do not translate text inside &lt;kbd%gt; tags}} Used to indicate that a parameter is a \"limit\" type. Parameters:\n* $1 - Always 1.\nSee also:\n* {{msg-mw|api-help-datatypes}}\n* [[Special:PrefixIndex/MediaWiki:api-help-param-type]]",
        "api-help-param-type-integer": "{{technical}} Used to indicate that a parameter is an integer or list of integers. Parameters:\n* $1 - 1 if the parameter takes one value, 2 if the parameter takes a list of values.\nSee also:\n* {{msg-mw|api-help-datatypes}}\n* [[Special:PrefixIndex/MediaWiki:api-help-param-type]]",
        "api-help-param-type-boolean": "{{technical}} {{doc-important|Do not translate <code>Special:ApiHelp</code> in this message.}} Used to indicate that a parameter is a boolean. Parameters:\n* $1 - Always 1.\nSee also:\n* {{msg-mw|api-help-datatypes}}\n* [[Special:PrefixIndex/MediaWiki:api-help-param-type]]",
-       "api-help-param-type-password": "{{optional}}{{technical}} Used to indicate that a parameter is a password or list of passwords. Parameters:\n* $1 - 1 if the parameter takes one value, 2 if the parameter takes a list of values.\nSee also:\n* {{msg-mw|api-help-datatypes}}\n* [[Special:PrefixIndex/MediaWiki:api-help-param-type]]",
+       "api-help-param-type-password": "{{ignored}}{{technical}} Used to indicate that a parameter is a password or list of passwords. Parameters:\n* $1 - 1 if the parameter takes one value, 2 if the parameter takes a list of values.\nSee also:\n* {{msg-mw|api-help-datatypes}}\n* [[Special:PrefixIndex/MediaWiki:api-help-param-type]]",
        "api-help-param-type-timestamp": "{{technical}} {{doc-important|Do not translate <code>Special:ApiHelp</code> in this message.}} Used to indicate that a parameter is a timestamp or list of timestamps. Parameters:\n* $1 - 1 if the parameter takes one value, 2 if the parameter takes a list of values.\nSee also:\n* {{msg-mw|api-help-datatypes}}\n* [[Special:PrefixIndex/MediaWiki:api-help-param-type]]",
        "api-help-param-type-user": "{{technical}} Used to indicate that a parameter is a username or list of usernames. Parameters:\n* $1 - 1 if the parameter takes one value, 2 if the parameter takes a list of values.\nSee also:\n* {{msg-mw|api-help-datatypes}}\n* [[Special:PrefixIndex/MediaWiki:api-help-param-type]]",
        "api-help-param-list": "Used to display the possible values for a parameter taking a list of values\n\nParameters:\n* $1 - 1 if the parameter takes one value, 2 if the parameter takes any number of values\n* $2 - Comma-separated list of values, possibly formatted using {{msg-mw|api-help-param-list-can-be-empty}}\n{{Identical|Value}}",
index 79f4d6c..585fcd3 100644 (file)
@@ -1113,7 +1113,8 @@ class MessageCache {
 
                if ( !$title || !$title instanceof Title ) {
                        global $wgTitle;
-                       wfDebugLog( 'GlobalTitleFail', __METHOD__ . ' called by ' . wfGetAllCallers( 5 ) . ' with no title set.' );
+                       wfDebugLog( 'GlobalTitleFail', __METHOD__ . ' called by ' .
+                               wfGetAllCallers( 5 ) . ' with no title set.' );
                        $title = $wgTitle;
                }
                // Sometimes $wgTitle isn't set either...
index 932006d..8989b2a 100644 (file)
@@ -204,7 +204,8 @@ class ChangesList extends ContextSource {
                $code = $lang->getCode();
                static $fastCharDiff = array();
                if ( !isset( $fastCharDiff[$code] ) ) {
-                       $fastCharDiff[$code] = $config->get( 'MiserMode' ) || $context->msg( 'rc-change-size' )->plain() === '$1';
+                       $fastCharDiff[$code] = $config->get( 'MiserMode' )
+                               || $context->msg( 'rc-change-size' )->plain() === '$1';
                }
 
                $formattedSize = $lang->formatNum( $szdiff );
@@ -542,6 +543,17 @@ class ChangesList extends ContextSource {
                }
        }
 
+       /**
+        * @param RecentChange $rc
+        * @return string
+        * @since 1.26
+        */
+       public function getRollback( RecentChange $rc ) {
+               $s = '';
+               $this->insertRollback( $s, $rc );
+               return $s;
+       }
+
        /**
         * @param string $s
         * @param RecentChange $rc
@@ -560,6 +572,18 @@ class ChangesList extends ContextSource {
                $s .= ' ' . $tagSummary;
        }
 
+       /**
+        * @param RecentChange $rc
+        * @param array $classes
+        * @return string
+        * @since 1.26
+        */
+       public function getTags( RecentChange $rc, array &$classes ) {
+               $s = '';
+               $this->insertTags( $s, $rc, $classes );
+               return $s;
+       }
+
        public function insertExtra( &$s, &$rc, &$classes ) {
                // Empty, used for subclasses to add anything special.
        }
index 54cde0d..545ea26 100644 (file)
@@ -304,18 +304,18 @@ class EnhancedChangesList extends ChangesList {
                        # Classes to apply -- TODO implement
                        $classes = array();
                        $type = $rcObj->mAttribs['rc_type'];
+                       $data = array();
 
                        $trClass = $rcObj->watched && $rcObj->mAttribs['rc_timestamp'] >= $rcObj->watched
                                ? ' class="mw-enhanced-watched"' : '';
+                       $separator = ' <span class="mw-changeslist-separator">. .</span> ';
 
-                       $r .= '<tr' . $trClass . '><td></td><td class="mw-enhanced-rc">';
-                       $r .= $this->recentChangesFlags( array(
+                       $data['recentChangesFlags'] = array(
                                'newpage' => $type == RC_NEW,
                                'minor' => $rcObj->mAttribs['rc_minor'],
                                'unpatrolled' => $rcObj->unpatrolled,
                                'bot' => $rcObj->mAttribs['rc_bot'],
-                       ) );
-                       $r .= '&#160;</td><td class="mw-enhanced-rc-nested"><span class="mw-enhanced-rc-time">';
+                       );
 
                        $params = $queryParams;
 
@@ -340,40 +340,65 @@ class EnhancedChangesList extends ChangesList {
                                        $link = '<span class="history-deleted">' . $link . '</span> ';
                                }
                        }
-                       $r .= $link . '</span>';
+                       $data['timestampLink'] = $link;
 
+                       $currentAndLastLinks = '';
                        if ( !$type == RC_LOG || $type == RC_NEW ) {
-                               $r .= ' ' . $this->msg( 'parentheses' )->rawParams(
+                               $currentAndLastLinks .= ' ' . $this->msg( 'parentheses' )->rawParams(
                                        $rcObj->curlink .
                                                $this->message['pipe-separator'] .
                                                $rcObj->lastlink
                                )->escaped();
                        }
-                       $r .= ' <span class="mw-changeslist-separator">. .</span> ';
+                       $data['currentAndLastLinks'] = $currentAndLastLinks;
+                       $data['separatorAfterCurrentAndLastLinks'] = $separator;
 
                        # Character diff
                        if ( $RCShowChangedSize ) {
                                $cd = $this->formatCharacterDifference( $rcObj );
                                if ( $cd !== '' ) {
-                                       $r .= $cd . ' <span class="mw-changeslist-separator">. .</span> ';
+                                       $data['characterDiff'] = $cd;
+                                       $data['separatorAfterCharacterDiff'] = $separator;
                                }
                        }
 
                        if ( $rcObj->mAttribs['rc_type'] == RC_LOG ) {
-                               $r .= $this->insertLogEntry( $rcObj );
+                               $data['logEntry'] = $this->insertLogEntry( $rcObj );
                        } else {
                                # User links
-                               $r .= $rcObj->userlink;
-                               $r .= $rcObj->usertalklink;
-                               $r .= $this->insertComment( $rcObj );
+                               $data['userLink'] = $rcObj->userlink;
+                               $data['userTalkLink'] = $rcObj->usertalklink;
+                               $data['comment'] = $this->insertComment( $rcObj );
                        }
 
                        # Rollback
-                       $this->insertRollback( $r, $rcObj );
+                       $data['rollback'] = $this->getRollback( $rcObj );
+
                        # Tags
-                       $this->insertTags( $r, $rcObj, $classes );
+                       $data['tags'] = $this->getTags( $rcObj, $classes );
+
+                       // give the hook a chance to modify the data
+                       Hooks::run( 'EnhancedChangesListModifyLineData',
+                               array( $this, &$data, $block, $rcObj ) );
+
+                       $line = '<tr' . $trClass . '><td></td><td class="mw-enhanced-rc">';
+                       if ( isset( $data['recentChangesFlags'] ) ) {
+                               $line .= $this->recentChangesFlags( $data['recentChangesFlags'] );
+                               unset( $data['recentChangesFlags'] );
+                       }
+                       $line .= '&#160;</td><td class="mw-enhanced-rc-nested">';
+
+                       if ( isset( $data['timestampLink'] ) ) {
+                               $line .= '<span class="mw-enhanced-rc-time">' . $data['timestampLink'] . '</span>';
+                               unset( $data['timestampLink'] );
+                       }
+
+                       // everything else: makes it easier for extensions to add or remove data
+                       $line .= implode( '', $data );
+
+                       $line .= "</td></tr>\n";
 
-                       $r .= "</td></tr>\n";
+                       $r .= $line;
                }
                $r .= "</table>\n";
 
index 94cf1f2..2b8cfe2 100644 (file)
@@ -3829,6 +3829,7 @@ abstract class DatabaseBase implements IDatabase {
         * @param string $prefix Only show tables with this prefix, e.g. mw_
         * @param string $fname Calling function name
         * @throws MWException
+        * @return array
         */
        function listTables( $prefix = null, $fname = __METHOD__ ) {
                throw new MWException( 'DatabaseBase::listTables is not implemented in descendant class' );
@@ -3851,6 +3852,7 @@ abstract class DatabaseBase implements IDatabase {
         * @param string $prefix Only show VIEWs with this prefix, eg. unit_test_
         * @param string $fname Name of calling function
         * @throws MWException
+        * @return array
         * @since 1.22
         */
        public function listViews( $prefix = null, $fname = __METHOD__ ) {
@@ -3862,6 +3864,7 @@ abstract class DatabaseBase implements IDatabase {
         *
         * @param string $name Name of the database-structure to test.
         * @throws MWException
+        * @return bool
         * @since 1.22
         */
        public function isView( $name ) {
index 823d9b6..b69efac 100644 (file)
@@ -33,10 +33,12 @@ class DatabaseMysql extends DatabaseMysqlBase {
         * @return resource False on error
         */
        protected function doQuery( $sql ) {
+               $conn = $this->getBindingHandle();
+
                if ( $this->bufferResults() ) {
-                       $ret = mysql_query( $sql, $this->mConn );
+                       $ret = mysql_query( $sql, $conn );
                } else {
-                       $ret = mysql_unbuffered_query( $sql, $this->mConn );
+                       $ret = mysql_unbuffered_query( $sql, $conn );
                }
 
                return $ret;
@@ -48,8 +50,7 @@ class DatabaseMysql extends DatabaseMysqlBase {
         * @throws DBConnectionError
         */
        protected function mysqlConnect( $realServer ) {
-               # Fail now
-               # Otherwise we get a suppressed fatal error, which is very hard to track down
+               # Avoid a suppressed fatal error, which is very hard to track down
                if ( !extension_loaded( 'mysql' ) ) {
                        throw new DBConnectionError(
                                $this,
@@ -93,8 +94,10 @@ class DatabaseMysql extends DatabaseMysqlBase {
         * @return bool
         */
        protected function mysqlSetCharset( $charset ) {
+               $conn = $this->getBindingHandle();
+
                if ( function_exists( 'mysql_set_charset' ) ) {
-                       return mysql_set_charset( $charset, $this->mConn );
+                       return mysql_set_charset( $charset, $conn );
                } else {
                        return $this->query( 'SET NAMES ' . $charset, __METHOD__ );
                }
@@ -104,14 +107,18 @@ class DatabaseMysql extends DatabaseMysqlBase {
         * @return bool
         */
        protected function closeConnection() {
-               return mysql_close( $this->mConn );
+               $conn = $this->getBindingHandle();
+
+               return mysql_close( $conn );
        }
 
        /**
         * @return int
         */
        function insertId() {
-               return mysql_insert_id( $this->mConn );
+               $conn = $this->getBindingHandle();
+
+               return mysql_insert_id( $conn );
        }
 
        /**
@@ -129,7 +136,9 @@ class DatabaseMysql extends DatabaseMysqlBase {
         * @return int
         */
        function affectedRows() {
-               return mysql_affected_rows( $this->mConn );
+               $conn = $this->getBindingHandle();
+
+               return mysql_affected_rows( $conn );
        }
 
        /**
@@ -137,9 +146,11 @@ class DatabaseMysql extends DatabaseMysqlBase {
         * @return bool
         */
        function selectDB( $db ) {
+               $conn = $this->getBindingHandle();
+
                $this->mDBname = $db;
 
-               return mysql_select_db( $db, $this->mConn );
+               return mysql_select_db( $db, $conn );
        }
 
        protected function mysqlFreeResult( $res ) {
@@ -183,10 +194,14 @@ class DatabaseMysql extends DatabaseMysqlBase {
        }
 
        protected function mysqlRealEscapeString( $s ) {
-               return mysql_real_escape_string( $s, $this->mConn );
+               $conn = $this->getBindingHandle();
+
+               return mysql_real_escape_string( $s, $conn );
        }
 
        protected function mysqlPing() {
-               return mysql_ping( $this->mConn );
+               $conn = $this->getBindingHandle();
+
+               return mysql_ping( $conn );
        }
 }
index a189648..4085fa9 100644 (file)
@@ -586,9 +586,12 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
        function ping() {
                $ping = $this->mysqlPing();
                if ( $ping ) {
+                       // Connection was good or lost but reconnected...
+                       // @note: mysqlnd (php 5.6+) does not support this (PHP bug 52561)
                        return true;
                }
 
+               // Try a full disconnect/reconnect cycle if ping() failed
                $this->closeConnection();
                $this->mOpened = false;
                $this->mConn = false;
@@ -1058,6 +1061,28 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
                        ( $this->lastErrno() == 1290 && strpos( $this->lastError(), '--read-only' ) !== false );
        }
 
+       /**
+        * Get the underlying binding handle, mConn
+        *
+        * Makes sure that mConn is set (disconnects and ping() failure can unset it).
+        * This catches broken callers than catch and ignore disconnection exceptions.
+        * Unlike checking isOpen(), this is safe to call inside of open().
+        *
+        * @return resource|object
+        * @throws DBUnexpectedError
+        * @since 1.26
+        */
+       protected function getBindingHandle() {
+               if ( !$this->mConn ) {
+                       throw new DBUnexpectedError(
+                               $this,
+                               'DB connection was already closed or the connection dropped.'
+                       );
+               }
+
+               return $this->mConn;
+       }
+
        /**
         * @param string $oldName
         * @param string $newName
index d2b5ecb..8b51d81 100644 (file)
@@ -34,10 +34,12 @@ class DatabaseMysqli extends DatabaseMysqlBase {
         * @return resource
         */
        protected function doQuery( $sql ) {
+               $conn = $this->getBindingHandle();
+
                if ( $this->bufferResults() ) {
-                       $ret = $this->mConn->query( $sql );
+                       $ret = $conn->query( $sql );
                } else {
-                       $ret = $this->mConn->query( $sql, MYSQLI_USE_RESULT );
+                       $ret = $conn->query( $sql, MYSQLI_USE_RESULT );
                }
 
                return $ret;
@@ -50,8 +52,8 @@ class DatabaseMysqli extends DatabaseMysqlBase {
         */
        protected function mysqlConnect( $realServer ) {
                global $wgDBmysql5;
-               # Fail now
-               # Otherwise we get a suppressed fatal error, which is very hard to track down
+
+               # Avoid suppressed fatal error, which is very hard to track down
                if ( !function_exists( 'mysqli_init' ) ) {
                        throw new DBConnectionError( $this, "MySQLi functions missing,"
                                . " have you compiled PHP with the --with-mysqli option?\n" );
@@ -116,8 +118,10 @@ class DatabaseMysqli extends DatabaseMysqlBase {
         * @return bool
         */
        protected function mysqlSetCharset( $charset ) {
-               if ( method_exists( $this->mConn, 'set_charset' ) ) {
-                       return $this->mConn->set_charset( $charset );
+               $conn = $this->getBindingHandle();
+
+               if ( method_exists( $conn, 'set_charset' ) ) {
+                       return $conn->set_charset( $charset );
                } else {
                        return $this->query( 'SET NAMES ' . $charset, __METHOD__ );
                }
@@ -127,14 +131,18 @@ class DatabaseMysqli extends DatabaseMysqlBase {
         * @return bool
         */
        protected function closeConnection() {
-               return $this->mConn->close();
+               $conn = $this->getBindingHandle();
+
+               return $conn->close();
        }
 
        /**
         * @return int
         */
        function insertId() {
-               return (int)$this->mConn->insert_id;
+               $conn = $this->getBindingHandle();
+
+               return (int)$conn->insert_id;
        }
 
        /**
@@ -152,7 +160,9 @@ class DatabaseMysqli extends DatabaseMysqlBase {
         * @return int
         */
        function affectedRows() {
-               return $this->mConn->affected_rows;
+               $conn = $this->getBindingHandle();
+
+               return $conn->affected_rows;
        }
 
        /**
@@ -160,9 +170,11 @@ class DatabaseMysqli extends DatabaseMysqlBase {
         * @return bool
         */
        function selectDB( $db ) {
+               $conn = $this->getBindingHandle();
+
                $this->mDBname = $db;
 
-               return $this->mConn->select_db( $db );
+               return $conn->select_db( $db );
        }
 
        /**
@@ -289,11 +301,15 @@ class DatabaseMysqli extends DatabaseMysqlBase {
         * @return string
         */
        protected function mysqlRealEscapeString( $s ) {
-               return $this->mConn->real_escape_string( $s );
+               $conn = $this->getBindingHandle();
+
+               return $conn->real_escape_string( $s );
        }
 
        protected function mysqlPing() {
-               return $this->mConn->ping();
+               $conn = $this->getBindingHandle();
+
+               return $conn->ping();
        }
 
        /**
index 069185b..52dca08 100644 (file)
@@ -60,8 +60,6 @@ class LoadBalancer {
        private $mLastError = 'Unknown error';
        /** @var integer Total connections opened */
        private $connsOpened = 0;
-       /** @var ProcessCacheLRU */
-       private $mProcCache;
 
        /** @var integer Warn when this many connection are held */
        const CONN_HELD_WARN_THRESHOLD = 10;
@@ -113,8 +111,6 @@ class LoadBalancer {
                                }
                        }
                }
-
-               $this->mProcCache = new ProcessCacheLRU( 30 );
        }
 
        /**
@@ -650,10 +646,7 @@ class LoadBalancer {
        public function openConnection( $i, $wiki = false ) {
                if ( $wiki !== false ) {
                        $conn = $this->openForeignConnection( $i, $wiki );
-
-                       return $conn;
-               }
-               if ( isset( $this->mConns['local'][$i][0] ) ) {
+               } elseif ( isset( $this->mConns['local'][$i][0] ) ) {
                        $conn = $this->mConns['local'][$i][0];
                } else {
                        $server = $this->mServers[$i];
@@ -670,6 +663,15 @@ class LoadBalancer {
                        }
                }
 
+               if ( $conn && !$conn->isOpen() ) {
+                       // Connection was made but later unrecoverably lost for some reason.
+                       // Do not return a handle that will just throw exceptions on use,
+                       // but let the calling code (e.g. getReaderIndex) try another server.
+                       // See DatabaseMyslBase::ping() for how this can happen.
+                       $this->mErrorConnection = $conn;
+                       $conn = false;
+               }
+
                return $conn;
        }
 
@@ -1234,16 +1236,8 @@ class LoadBalancer {
                        return array( 0 => 0 ); // no replication = no lag
                }
 
-               if ( $this->mProcCache->has( 'slave_lag', 'times', 1 ) ) {
-                       return $this->mProcCache->get( 'slave_lag', 'times' );
-               }
-
                # Send the request to the load monitor
-               $times = $this->getLoadMonitor()->getLagTimes( array_keys( $this->mServers ), $wiki );
-
-               $this->mProcCache->set( 'slave_lag', 'times', $times );
-
-               return $times;
+               return $this->getLoadMonitor()->getLagTimes( array_keys( $this->mServers ), $wiki );
        }
 
        /**
@@ -1270,8 +1264,10 @@ class LoadBalancer {
 
        /**
         * Clear the cache for slag lag delay times
+        *
+        * This is only used for testing
         */
        public function clearLagTimeCache() {
-               $this->mProcCache->clear( 'slave_lag' );
+               $this->getLoadMonitor()->clearCaches();
        }
 }
index 8c4d0ed..7dc2da0 100644 (file)
@@ -75,13 +75,17 @@ class LoadMonitorMySQL implements LoadMonitor {
        /** @var LoadBalancer */
        public $parent;
        /** @var BagOStuff */
-       protected $cache;
+       protected $srvCache;
+       /** @var BagOStuff */
+       protected $mainCache;
 
        public function __construct( $parent ) {
                global $wgMemc;
 
                $this->parent = $parent;
-               $this->cache = $wgMemc ?: wfGetMainCache();
+
+               $this->srvCache = ObjectCache::newAccelerator( array(), 'hash' );
+               $this->mainCache = $wgMemc ?: wfGetMainCache();
        }
 
        public function scaleLoads( &$loads, $group = false, $wiki = false ) {
@@ -89,65 +93,79 @@ class LoadMonitorMySQL implements LoadMonitor {
 
        public function getLagTimes( $serverIndexes, $wiki ) {
                if ( count( $serverIndexes ) == 1 && reset( $serverIndexes ) == 0 ) {
-                       // Single server only, just return zero without caching
+                       # Single server only, just return zero without caching
                        return array( 0 => 0 );
                }
 
-               $expiry = 5;
-               $requestRate = 10;
-
-               $cache = $this->cache;
-               $masterName = $this->parent->getServerName( 0 );
-               $memcKey = wfMemcKey( 'lag_times', $masterName );
-               $times = $cache->get( $memcKey );
-               if ( is_array( $times ) ) {
-                       # Randomly recache with probability rising over $expiry
-                       $elapsed = time() - $times['timestamp'];
-                       $chance = max( 0, ( $expiry - $elapsed ) * $requestRate );
-                       if ( mt_rand( 0, $chance ) != 0 ) {
-                               unset( $times['timestamp'] ); // hide from caller
-
-                               return $times;
-                       }
-                       wfIncrStats( 'lag_cache.miss.expired' );
-               } else {
-                       wfIncrStats( 'lag_cache.miss.absent' );
+               $key = $this->getLagTimeCacheKey();
+               # Randomize TTLs to reduce stampedes (4.0 - 5.0 sec)
+               $ttl = mt_rand( 4e6, 5e6 ) / 1e6;
+               # Keep keys around longer as fallbacks
+               $staleTTL = 60;
+
+               # (a) Check the local APC cache
+               $value = $this->srvCache->get( $key );
+               if ( $value && $value['timestamp'] > ( microtime( true ) - $ttl ) ) {
+                       wfDebugLog( 'replication',  __FUNCTION__ . ": got lag times ($key) from local cache" );
+                       return $value['lagTimes']; // cache hit
+               }
+               $staleValue = $value ?: false;
+
+               # (b) Check the shared cache and backfill APC
+               $value = $this->mainCache->get( $key );
+               if ( $value && $value['timestamp'] > ( microtime( true ) - $ttl ) ) {
+                       $this->srvCache->set( $key, $value, $staleTTL );
+                       wfDebugLog( 'replication',  __FUNCTION__ . ": got lag times ($key) from main cache" );
+
+                       return $value['lagTimes']; // cache hit
                }
+               $staleValue = $value ?: $staleValue;
 
-               # Cache key missing or expired
-               if ( $cache->lock( $memcKey, 0, 10 ) ) {
+               # (c) Cache key missing or expired; regenerate and backfill
+               if ( $this->mainCache->lock( $key, 0, 10 ) ) {
                        # Let this process alone update the cache value
-                       $unlocker = new ScopedCallback( function () use ( $cache, $memcKey ) {
-                               $cache->unlock( $memcKey );
+                       $cache = $this->mainCache;
+                       $unlocker = new ScopedCallback( function () use ( $cache, $key ) {
+                               $cache->unlock( $key );
                        } );
-               } elseif ( is_array( $times ) ) {
+               } elseif ( $staleValue ) {
                        # Could not acquire lock but an old cache exists, so use it
-                       unset( $times['timestamp'] ); // hide from caller
-
-                       return $times;
+                       return $value['lagTimes'];
                }
 
-               $times = array();
+               $lagTimes = array();
                foreach ( $serverIndexes as $i ) {
                        if ( $i == 0 ) { # Master
-                               $times[$i] = 0;
+                               $lagTimes[$i] = 0;
                        } elseif ( false !== ( $conn = $this->parent->getAnyOpenConnection( $i ) ) ) {
-                               $times[$i] = $conn->getLag();
+                               $lagTimes[$i] = $conn->getLag();
                        } elseif ( false !== ( $conn = $this->parent->openConnection( $i, $wiki ) ) ) {
-                               $times[$i] = $conn->getLag();
-                               // Close the connection to avoid sleeper connections piling up.
-                               // Note that the caller will pick one of these DBs and reconnect,
-                               // which is slightly inefficient, but this only matters for the lag
-                               // time cache miss cache, which is far less common that cache hits.
+                               $lagTimes[$i] = $conn->getLag();
+                               # Close the connection to avoid sleeper connections piling up.
+                               # Note that the caller will pick one of these DBs and reconnect,
+                               # which is slightly inefficient, but this only matters for the lag
+                               # time cache miss cache, which is far less common that cache hits.
                                $this->parent->closeConnection( $conn );
                        }
                }
 
                # Add a timestamp key so we know when it was cached
-               $times['timestamp'] = time();
-               $cache->set( $memcKey, $times, $expiry + 10 );
-               unset( $times['timestamp'] ); // hide from caller
+               $value = array( 'lagTimes' => $lagTimes, 'timestamp' => microtime( true ) );
+               $this->mainCache->set( $key, $value, $staleTTL );
+               $this->srvCache->set( $key, $value, $staleTTL );
+               wfDebugLog( 'replication',  __FUNCTION__ . ": re-calculated lag times ($key)" );
+
+               return $value['lagTimes'];
+       }
+
+       public function clearCaches() {
+               $key = $this->getLagTimeCacheKey();
+               $this->srvCache->delete( $key );
+               $this->mainCache->delete( $key );
+       }
 
-               return $times;
+       private function getLagTimeCacheKey() {
+               # Lag is per-server, not per-DB, so key on the master DB name
+               return wfForeignMemcKey( $this->parent->getServerName( 0 ), '', 'lag_times' );
        }
 }
index a4ed95f..e4f78b2 100644 (file)
@@ -14,7 +14,7 @@ class HTMLTextAreaField extends HTMLFormField {
 
        function getSpellCheck() {
                $val = isset( $this->mParams['spellcheck'] ) ? $this->mParams['spellcheck'] : null;
-               if( is_bool( $val ) ) {
+               if ( is_bool( $val ) ) {
                        // "spellcheck" attribute literally requires "true" or "false" to work.
                        return $val === true ? 'true' : 'false';
                }
index 06b397f..9c5b868 100644 (file)
@@ -7,7 +7,7 @@ class HTMLTextField extends HTMLFormField {
 
        function getSpellCheck() {
                $val = isset( $this->mParams['spellcheck'] ) ? $this->mParams['spellcheck'] : null;
-               if( is_bool( $val ) ) {
+               if ( is_bool( $val ) ) {
                        // "spellcheck" attribute literally requires "true" or "false" to work.
                        return $val === true ? 'true' : 'false';
                }
index 345b475..73e1764 100644 (file)
@@ -68,7 +68,7 @@
        "config-magic-quotes-sybase": "'''Проблема: Опція PHP [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] увімкнена!'''\nЦя опція призводить до непередбачуваного пошкодження даних.\nВи не можете встановити і використовувати MediaWiki, поки не буде вимкнено цю опцію.",
        "config-mbstring": "'''Проблема: Опція PHP [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] увімкнена!'''\nЦя опція призводить до непередбачуваного пошкодження даних.\nВи не можете встановити і використовувати MediaWiki, поки не буде вимкнено цю опцію.",
        "config-safe-mode": "'''Увага:''' Опція PHP [http://www.php.net/features.safe-mode «безпечний режим»] увімкнена.\nЦе може спричинити проблеми, зокрема із завантаженням файлів та вставкою математичних формул.",
-       "config-xml-bad": "XML-модÑ\83Ñ\82Ñ\8c PHP Ð²Ñ\96дÑ\81Ñ\83Ñ\82нÑ\96й.\nMediaWiki Ð½ÐµÐ¾Ð±Ñ\85Ñ\96днÑ\96 Ð¹Ð¾Ð³Ð¾ Ñ\84Ñ\83нкÑ\86Ñ\96Ñ\97, Ð±ÐµÐ· Ñ\86Ñ\8cого Ð¼Ð¾Ð´Ñ\83лÑ\8f Ð²Ð¾Ð½Ð° Ð¿Ñ\80аÑ\86Ñ\8eваÑ\82и Ð½Ðµ Ð±Ñ\83де.\nЯкÑ\89о Ð\92и Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83Ñ\94Ñ\82е Mandrake, Ð²Ñ\81Ñ\82ановÑ\96Ñ\82Ñ\8c php-xml пакет.",
+       "config-xml-bad": "XML-модÑ\83Ñ\82Ñ\8c PHP Ð²Ñ\96дÑ\81Ñ\83Ñ\82нÑ\96й.\nMediaWiki Ð½ÐµÐ¾Ð±Ñ\85Ñ\96днÑ\96 Ð¹Ð¾Ð³Ð¾ Ñ\84Ñ\83нкÑ\86Ñ\96Ñ\97, Ð±ÐµÐ· Ñ\86Ñ\8cого Ð¼Ð¾Ð´Ñ\83лÑ\8f Ð²Ð¾Ð½Ð° Ð¿Ñ\80аÑ\86Ñ\8eваÑ\82и Ð½Ðµ Ð±Ñ\83де.\nÐ\92ам Ð¼Ð¾Ð¶Ðµ Ð·Ð½Ð°Ð´Ð¾Ð±Ð¸Ñ\82иÑ\81Ñ\8f Ð²Ñ\81Ñ\82ановиÑ\82и php-xml RPM пакет.",
        "config-pcre-old": "'''Фатальна помилка:''' потрібно PCRE версії $1 або пізнішої.\nВаш виконуваний файл PHP пов'язаний з PCRE версії $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Подробиці].",
        "config-pcre-no-utf8": "'''Помилка''': PCRE-модуть PHP, вочевидь, було зібрано без підтримки PCRE_UTF8.\nMediaWiki вимагає підтримку UTF-8 для коректної роботи.",
        "config-memory-raised": "Обмеження пам'яті PHP (<code>memory_limit</code>) $1, піднято до $2.",
index 77c4238..3dfffae 100644 (file)
@@ -203,8 +203,8 @@ class JobRunner implements LoggerAwareInterface {
                                if ( $queuedTs ) {
                                        // Record time to run for the job type
                                        $pickupDelay = $popTime - $queuedTs;
-                                       $stats->timing( 'jobqueue.pickup_delay.all', $queuedTs );
-                                       $stats->timing( "jobqueue.pickup_delay.$jType", $queuedTs );
+                                       $stats->timing( 'jobqueue.pickup_delay.all', $pickupDelay );
+                                       $stats->timing( "jobqueue.pickup_delay.$jType", $pickupDelay );
                                }
 
                                // Mark the job as done on success or when the job cannot be retried
index 457237a..0caf90b 100644 (file)
@@ -23,7 +23,6 @@
 use Liuggio\StatsdClient\Entity\StatsdDataInterface;
 use Liuggio\StatsdClient\Factory\StatsdDataFactory;
 
-
 /**
  * A factory for application metric data.
  *
diff --git a/includes/libs/RiffExtractor.php b/includes/libs/RiffExtractor.php
new file mode 100644 (file)
index 0000000..f987c59
--- /dev/null
@@ -0,0 +1,100 @@
+<?php
+/**
+ * Extractor for the Resource Interchange File Format
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @author Bryan Tong Minh
+ * @ingroup Media
+ */
+
+class RiffExtractor {
+       public static function findChunksFromFile( $filename, $maxChunks = -1 ) {
+               $file = fopen( $filename, 'rb' );
+               $info = self::findChunks( $file, $maxChunks );
+               fclose( $file );
+               return $info;
+       }
+
+       public static function findChunks( $file, $maxChunks = -1 ) {
+               $riff = fread( $file, 4 );
+               if ( $riff !== 'RIFF' ) {
+                       return false;
+               }
+
+               // Next four bytes are fileSize
+               $fileSize = fread( $file, 4 );
+               if ( !$fileSize || strlen( $fileSize ) != 4 ) {
+                       return false;
+               }
+
+               // Next four bytes are the FourCC
+               $fourCC = fread( $file, 4 );
+               if ( !$fourCC || strlen( $fourCC ) != 4 ) {
+                       return false;
+               }
+
+               // Create basic info structure
+               $info = array(
+                       'fileSize' => self::extractUInt32( $fileSize ),
+                       'fourCC' => $fourCC,
+                       'chunks' => array(),
+               );
+               $numberOfChunks = 0;
+
+               // Find out the chunks
+               while ( !feof( $file ) && !( $numberOfChunks >= $maxChunks && $maxChunks >= 0 ) ) {
+                       $chunkStart = ftell( $file );
+
+                       $chunkFourCC = fread( $file, 4 );
+                       if ( !$chunkFourCC || strlen( $chunkFourCC ) != 4 ) {
+                               return $info;
+                       }
+
+                       $chunkSize = fread( $file, 4 );
+                       if ( !$chunkSize || strlen( $chunkSize ) != 4 ) {
+                               return $info;
+                       }
+                       $intChunkSize = self::extractUInt32( $chunkSize );
+
+                       // Add chunk info to the info structure
+                       $info['chunks'][] = array(
+                               'fourCC' => $chunkFourCC,
+                               'start' => $chunkStart,
+                               'size' => $intChunkSize
+                       );
+
+                       // Uneven chunks have padding bytes
+                       $padding = $intChunkSize % 2;
+                       // Seek to the next chunk
+                       fseek( $file, $intChunkSize + $padding, SEEK_CUR );
+
+               }
+
+               return $info;
+       }
+
+       /**
+        * Extract a little-endian uint32 from a 4 byte string
+        * @param string $string 4-byte string
+        * @return int
+        */
+       public static function extractUInt32( $string ) {
+               $unpacked = unpack( 'V', $string );
+               return $unpacked[1];
+       }
+};
index 9c7bf2f..22c3319 100644 (file)
@@ -30,6 +30,9 @@ class ComposerLock {
                        $deps[$installed['name']] = array(
                                'version' => ComposerJson::normalizeVersion( $installed['version'] ),
                                'type' => $installed['type'],
+                               'licenses' => isset( $installed['license'] ) ? $installed['license'] : array(),
+                               'authors' => isset( $installed['authors'] ) ? $installed['authors'] : array(),
+                               'description' => isset( $installed['description'] ) ? $installed['description']: '',
                        );
                }
 
index ad9a2b9..9ed9bc2 100644 (file)
@@ -27,6 +27,7 @@
 
 
 use UtfNormal\Utils;
+
 /**
  * Return UTF-8 sequence for a given Unicode code point.
  *
index 5af7fbe..4be20b2 100644 (file)
@@ -93,9 +93,8 @@ class BitmapHandler extends TransformationalImageHandler {
                                // JPEG decoder hint to reduce memory, available since IM 6.5.6-2
                                $decoderHint = array( '-define', "jpeg:size={$params['physicalDimensions']}" );
                        }
-               } elseif ( $params['mimeType'] == 'image/png' ) {
+               } elseif ( $params['mimeType'] == 'image/png' || $params['mimeType'] == 'image/webp' ) {
                        $quality = array( '-quality', '95' ); // zlib 9, adaptive filtering
-
                } elseif ( $params['mimeType'] == 'image/gif' ) {
                        if ( $this->getImageArea( $image ) > $wgMaxAnimatedGifArea ) {
                                // Extract initial frame only; we're so big it'll
index 17e3dda..0fee8cc 100644 (file)
@@ -1732,8 +1732,9 @@ class FormatMetadata extends ContextSource {
        }
 
        /**
-        * Turns an XMP-style multivalue array into a single value by dropping all but the first value.
-        * If the value is not a multivalue array (or a multivalue array inside a multilang array), it is returned unchanged.
+        * Turns an XMP-style multivalue array into a single value by dropping all but the first
+        * value. If the value is not a multivalue array (or a multivalue array inside a multilang
+        * array), it is returned unchanged.
         * See mediawiki.org/wiki/Manual:File_metadata_handling#Multi-language_array_format
         * @param mixed $value
         * @return mixed The value, or the first value if there were multiple ones
@@ -1742,7 +1743,8 @@ class FormatMetadata extends ContextSource {
        protected function resolveMultivalueValue( $value ) {
                if ( !is_array( $value ) ) {
                        return $value;
-               } elseif ( isset( $value['_type'] ) && $value['_type'] === 'lang' ) { // if this is a multilang array, process fields separately
+               } elseif ( isset( $value['_type'] ) && $value['_type'] === 'lang' ) {
+                       // if this is a multilang array, process fields separately
                        $newValue = array();
                        foreach ( $value as $k => $v ) {
                                $newValue[$k] = $this->resolveMultivalueValue( $v );
diff --git a/includes/media/WebP.php b/includes/media/WebP.php
new file mode 100644 (file)
index 0000000..05d12c4
--- /dev/null
@@ -0,0 +1,306 @@
+<?php
+/**
+ * Handler for Google's WebP format <https://developers.google.com/speed/webp/>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Media
+ */
+
+/**
+ * Handler for Google's WebP format <https://developers.google.com/speed/webp/>
+ *
+ * @ingroup Media
+ */
+class WebPHandler extends BitmapHandler {
+       const BROKEN_FILE = '0'; // value to store in img_metadata if error extracting metadata.
+       /**
+        * @var int Minimum chunk header size to be able to read all header types
+        */
+       const MINIMUM_CHUNK_HEADER_LENGTH = 18;
+       /**
+        * @var int version of the metadata stored in db records
+        */
+       const _MW_WEBP_VERSION = 1;
+
+       const VP8X_ICC = 32;
+       const VP8X_ALPHA = 16;
+       const VP8X_EXIF = 8;
+       const VP8X_XMP = 4;
+       const VP8X_ANIM = 2;
+
+       public function getMetadata( $image, $filename ) {
+               $parsedWebPData = self::extractMetadata( $filename );
+               if ( !$parsedWebPData ) {
+                       return self::BROKEN_FILE;
+               }
+
+               $parsedWebPData['metadata']['_MW_WEBP_VERSION'] = self::_MW_WEBP_VERSION;
+               return serialize( $parsedWebPData );
+       }
+
+       public function getMetadataType( $image ) {
+               return 'parsed-webp';
+       }
+
+       public function isMetadataValid( $image, $metadata ) {
+               if ( $metadata === self::BROKEN_FILE ) {
+                               // Do not repetitivly regenerate metadata on broken file.
+                               return self::METADATA_GOOD;
+               }
+
+               wfSuppressWarnings();
+               $data = unserialize( $metadata );
+               wfRestoreWarnings();
+
+               if ( !$data || !is_array( $data ) ) {
+                               wfDebug( __METHOD__ . " invalid WebP metadata\n" );
+
+                               return self::METADATA_BAD;
+               }
+
+               if ( !isset( $data['metadata']['_MW_WEBP_VERSION'] )
+                               || $data['metadata']['_MW_WEBP_VERSION'] != self::_MW_WEBP_VERSION
+               ) {
+                               wfDebug( __METHOD__ . " old but compatible WebP metadata\n" );
+
+                               return self::METADATA_COMPATIBLE;
+               }
+               return self::METADATA_GOOD;
+       }
+
+       /**
+        * Extracts the image size and WebP type from a file
+        *
+        * @param string $chunks Chunks as extracted by RiffExtractor
+        * @return array|bool Header data array with entries 'compression', 'width' and 'height',
+        * where 'compression' can be 'lossy', 'lossless', 'animated' or 'unknown'. False if
+        * file is not a valid WebP file.
+        */
+       public static function extractMetadata( $filename ) {
+               wfDebugLog( 'WebP', __METHOD__ . ": Extracting metadata from $filename\n" );
+
+               $info = RiffExtractor::findChunksFromFile( $filename, 100 );
+               if ( $info === false ) {
+                       wfDebugLog( 'WebP', __METHOD__ . ": Not a valid RIFF file\n" );
+                       return false;
+               }
+
+               if ( $info['fourCC'] != 'WEBP' ) {
+                       wfDebugLog( 'WebP', __METHOD__ . ': FourCC was not WEBP: ' .
+                               bin2hex( $info['fourCC'] ) .  " \n" );
+                       return false;
+               }
+
+               $metadata = self::extractMetadataFromChunks( $info['chunks'], $filename );
+               if ( !$metadata ) {
+                       wfDebugLog( 'WebP', __METHOD__ . ": No VP8 chunks found\n" );
+                       return false;
+               }
+
+               return $metadata;
+       }
+
+       /**
+        * Extracts the image size and WebP type from a file based on the chunk list
+        * @param array $chunks Chunks as extracted by RiffExtractor
+        * @return array Header data array with entries 'compression', 'width' and 'height', where
+        * 'compression' can be 'lossy', 'lossless', 'animated' or 'unknown'
+        */
+       public static function extractMetadataFromChunks( $chunks, $filename ) {
+               $vp8Info = array();
+
+               foreach ( $chunks as $chunk ) {
+                       if ( !in_array( $chunk['fourCC'], array( 'VP8 ', 'VP8L', 'VP8X' ) ) ) {
+                               // Not a chunk containing interesting metadata
+                               continue;
+                       }
+
+                       $chunkHeader = file_get_contents( $filename, false, null,
+                               $chunk['start'], self::MINIMUM_CHUNK_HEADER_LENGTH );
+                       wfDebugLog( 'WebP', __METHOD__ . ": {$chunk['fourCC']}\n" );
+
+                       switch ( $chunk['fourCC'] ) {
+                               case 'VP8 ':
+                                       return array_merge( $vp8Info,
+                                               self::decodeLossyChunkHeader( $chunkHeader ) );
+                               case 'VP8L':
+                                       return array_merge( $vp8Info,
+                                               self::decodeLosslessChunkHeader( $chunkHeader ) );
+                               case 'VP8X':
+                                       $vp8Info = array_merge( $vp8Info,
+                                               self::decodeExtendedChunkHeader( $chunkHeader ) );
+                                       // Continue looking for other chunks to improve the metadata
+                                       break;
+                       }
+               }
+               return $vp8Info;
+       }
+
+       /**
+        * Decodes a lossy chunk header
+        * @param string $header Header string
+        * @return boolean|array See WebPHandler::decodeHeader
+        */
+       protected static function decodeLossyChunkHeader( $header ) {
+               // Bytes 0-3 are 'VP8 '
+               // Bytes 4-7 are the VP8 stream size
+               // Bytes 8-10 are the frame tag
+               // Bytes 11-13 are 0x9D 0x01 0x2A called the sync code
+               $syncCode = substr( $header, 11, 3 );
+               if ( $syncCode != "\x9D\x01\x2A" ) {
+                       wfDebugLog( 'WebP', __METHOD__ . ': Invalid sync code: ' .
+                               bin2hex( $syncCode ) . "\n" );
+                       return array();
+               }
+               // Bytes 14-17 are image size
+               $imageSize = unpack( 'v2', substr( $header, 14, 4 ) );
+               // Image sizes are 14 bit, 2 MSB are scaling parameters which are ignored here
+               return array(
+                       'compression' => 'lossy',
+                       'width' => $imageSize[1] & 0x3FFF,
+                       'height' => $imageSize[2] & 0x3FFF
+               );
+       }
+
+       /**
+        * Decodes a lossless chunk header
+        * @param string $header Header string
+        * @return boolean|array See WebPHandler::decodeHeader
+        */
+       public static function decodeLosslessChunkHeader( $header ) {
+               // Bytes 0-3 are 'VP8L'
+               // Bytes 4-7 are chunk stream size
+               // Byte 8 is 0x2F called the signature
+               if ( $header{8} != "\x2F" ) {
+                       wfDebugLog( 'WebP',  __METHOD__ . ': Invalid signature: ' .
+                               bin2hex( $header{8} ) . "\n" );
+                       return array();
+               }
+               // Bytes 9-12 contain the image size
+               // Bits 0-13 are width-1; bits 15-27 are height-1
+               $imageSize = unpack( 'C4', substr( $header, 9, 4 ) );
+               return array(
+                               'compression' => 'lossless',
+                               'width' => ( $imageSize[1] | ( ( $imageSize[2] & 0x3F ) << 8 ) ) + 1,
+                               'height' => ( ( ( $imageSize[2] & 0xC0 ) >> 6 ) |
+                                               ( $imageSize[3] << 2 ) | ( ( $imageSize[4] & 0x03 ) << 10 ) ) + 1
+               );
+       }
+
+       /**
+        * Decodes an extended chunk header
+        * @param string $header Header string
+        * @return boolean|array See WebPHandler::decodeHeader
+        */
+       public static function decodeExtendedChunkHeader( $header ) {
+               // Bytes 0-3 are 'VP8X'
+               // Byte 4-7 are chunk length
+               // Byte 8-11 are a flag bytes
+               $flags = unpack( 'c', substr( $header, 8, 1 ) );
+
+               // Byte 12-17 are image size (24 bits)
+               $width = unpack( 'V', substr( $header, 12, 3 ) . "\x00" );
+               $height = unpack( 'V', substr( $header, 15, 3 ) . "\x00" );
+
+               return array(
+                       'compression' => 'unknown',
+                       'animated' => ($flags[1] & self::VP8X_ANIM) == self::VP8X_ANIM,
+                       'transparency' => ($flags[1] & self::VP8X_ALPHA) == self::VP8X_ALPHA,
+                       'width' => ( $width[1] & 0xFFFFFF ) + 1,
+                       'height' => ( $height[1] & 0xFFFFFF ) + 1
+               );
+       }
+
+       public function getImageSize( $file, $path, $metadata = false ) {
+               if ( $file === null ) {
+                       $metadata = self::getMetadata( $file, $path );
+               }
+               if ( $metadata === false ) {
+                       $metadata = $file->getMetadata();
+               }
+
+               wfSuppressWarnings();
+               $metadata = unserialize( $metadata );
+               wfRestoreWarnings();
+
+               if ( $metadata == false ) {
+                       return false;
+               }
+               return array( $metadata['width'], $metadata['height'] );
+       }
+
+       /**
+        * @param $file
+        * @return bool True, not all browsers support WebP
+        */
+       public function mustRender( $file ) {
+               return true;
+       }
+
+       /**
+        * @param $file
+        * @return bool False if we are unable to render this image
+        */
+       public function canRender( $file ) {
+               if ( self::isAnimatedImage( $file ) ) {
+                       return false;
+               }
+               return true;
+       }
+
+       /**
+        * @param File $image
+        * @return bool
+        */
+       public function isAnimatedImage( $image ) {
+               $ser = $image->getMetadata();
+               if ( $ser ) {
+                       $metadata = unserialize( $ser );
+                       if ( isset($metadata['animated']) && $metadata['animated'] === true ) {
+                               return true;
+                       }
+               }
+
+               return false;
+       }
+
+       public function canAnimateThumbnail( $file ) {
+               return false;
+       }
+
+       /**
+        * Render files as PNG
+        *
+        * @param $ext
+        * @param $mime
+        * @param $params
+        * @return array
+        */
+       public function getThumbType( $ext, $mime, $params = null ) {
+               return array( 'png', 'image/png' );
+       }
+
+       /**
+        * Must use "im" for XCF
+        *
+        * @return string
+        */
+       protected function getScalerType( $dstPath, $checkDstPath = true ) {
+               return 'im';
+       }
+}
index 117b6e7..44b0bc9 100644 (file)
@@ -217,7 +217,6 @@ class ParserCache {
                        ? $article->getPage()
                        : $article;
 
-
                if ( !$useOutdated && $value->expired( $touched ) ) {
                        wfIncrStats( "pcache.miss.expired" );
                        $cacheTime = $value->getCacheTime();
index 5692d73..1ec14aa 100644 (file)
@@ -192,10 +192,11 @@ abstract class PoolCounter {
        }
 
        /**
-        * Given a key (any string) and the number of lots, returns a slot number (an integer from the [0..($slots-1)] range).
-        * This is used for a global limit on the number of instances  of a given type that can acquire a lock.
-        * The hashing is deterministic so that PoolCounter::$workers is always an upper limit of how many instances with
-        * the same key can acquire a lock.
+        * Given a key (any string) and the number of lots, returns a slot number (an integer from
+        * the [0..($slots-1)] range). This is used for a global limit on the number of instances of
+        * a given type that can acquire a lock. The hashing is deterministic so that
+        * PoolCounter::$workers is always an upper limit of how many instances with the same key
+        * can acquire a lock.
         *
         * @param string $key PoolCounter instance key (any string)
         * @param int $slots The number of slots (max allowed value is 65536)
index bf4b85c..09f5688 100644 (file)
@@ -45,7 +45,11 @@ class ProfilerOutputDump extends ProfilerOutput {
 
        public function log( array $stats ) {
                $data = $this->collector->getRawData();
-               $filename = sprintf( "%s/%s.%s%s", $this->params['outputDir'], uniqid(), $this->collector->getProfileID(), $this->suffix );
+               $filename = sprintf( "%s/%s.%s%s",
+                       $this->params['outputDir'],
+                       uniqid(),
+                       $this->collector->getProfileID(),
+                       $this->suffix );
                file_put_contents( $filename, serialize( $data ) );
        }
 }
index 6752779..dc24f18 100644 (file)
@@ -35,7 +35,7 @@ class ProfilerOutputText extends ProfilerOutput {
                parent::__construct( $collector, $params );
                $this->thresholdMs = isset( $params['thresholdMs'] )
                        ? $params['thresholdMs']
-                       : .25;
+                       : 1.0;
        }
        public function log( array $stats ) {
                if ( $this->collector->getTemplated() ) {
index a7a43b0..eb18b8f 100644 (file)
@@ -662,7 +662,6 @@ class SpecialPage {
         */
        public function getFinalGroupName() {
                $name = $this->getName();
-               $specialPageGroups = $this->getConfig()->get( 'SpecialPageGroups' );
 
                // Allow overbidding the group from the wiki side
                $msg = $this->msg( 'specialpages-specialpagegroup-' . strtolower( $name ) )->inContentLanguage();
@@ -671,18 +670,6 @@ class SpecialPage {
                } else {
                        // Than use the group from this object
                        $group = $this->getGroupName();
-
-                       // Group '-' is used as default to have the chance to determine,
-                       // if the special pages overrides this method,
-                       // if not overridden, $wgSpecialPageGroups is checked for b/c
-                       if ( $group === '-' && isset( $specialPageGroups[$name] ) ) {
-                               $group = $specialPageGroups[$name];
-                       }
-               }
-
-               // never give '-' back, change to 'other'
-               if ( $group === '-' ) {
-                       $group = 'other';
                }
 
                return $group;
@@ -697,8 +684,6 @@ class SpecialPage {
         * @since 1.21
         */
        protected function getGroupName() {
-               // '-' used here to determine, if this group is overridden or has a hardcoded 'other'
-               // Needed for b/c in getFinalGroupName
-               return '-';
+               return 'other';
        }
 }
index 3786b36..055e588 100644 (file)
@@ -347,34 +347,6 @@ class SpecialPageFactory {
                return array( $name, $par );
        }
 
-       /**
-        * Add a page to a certain display group for Special:SpecialPages
-        *
-        * @param SpecialPage|string $page
-        * @param string $group
-        * @deprecated since 1.21 Override SpecialPage::getGroupName
-        */
-       public static function setGroup( $page, $group ) {
-               wfDeprecated( __METHOD__, '1.21' );
-
-               global $wgSpecialPageGroups;
-               $name = is_object( $page ) ? $page->getName() : $page;
-               $wgSpecialPageGroups[$name] = $group;
-       }
-
-       /**
-        * Get the group that the special page belongs in on Special:SpecialPage
-        *
-        * @param SpecialPage $page
-        * @return string
-        * @deprecated since 1.21 Use SpecialPage::getFinalGroupName
-        */
-       public static function getGroup( &$page ) {
-               wfDeprecated( __METHOD__, '1.21' );
-
-               return $page->getFinalGroupName();
-       }
-
        /**
         * Check if a given name exist as a special page or as a special page alias
         *
index 4442d81..0a91957 100644 (file)
@@ -522,6 +522,9 @@ class SpecialVersion extends SpecialPage {
                $out .= Html::openElement( 'tr' )
                        . Html::element( 'th', array(), $this->msg( 'version-libraries-library' )->text() )
                        . Html::element( 'th', array(), $this->msg( 'version-libraries-version' )->text() )
+                       . Html::element( 'th', array(), $this->msg( 'version-libraries-license' )->text() )
+                       . Html::element( 'th', array(), $this->msg( 'version-libraries-description' )->text() )
+                       . Html::element( 'th', array(), $this->msg( 'version-libraries-authors' )->text() )
                        . Html::closeElement( 'tr' );
 
                foreach ( $lock->getInstalledDependencies() as $name => $info ) {
@@ -530,13 +533,28 @@ class SpecialVersion extends SpecialPage {
                                // in their proper section
                                continue;
                        }
+                       $authors = array_map( function( $arr ) {
+                               // If a homepage is set, link to it
+                               if ( isset( $arr['homepage'] ) ) {
+                                       return "[{$arr['homepage']} {$arr['name']}]";
+                               }
+                               return $arr['name'];
+                       }, $info['authors'] );
+                       $authors = $this->listAuthors( $authors, false, "$IP/vendor/$name" );
                        $out .= Html::openElement( 'tr' )
                                . Html::rawElement(
                                        'td',
                                        array(),
-                                       Linker::makeExternalLink( "https://packagist.org/packages/$name", $name )
+                                       Linker::makeExternalLink(
+                                               "https://packagist.org/packages/$name", $name,
+                                               true, '',
+                                               array( 'class' => 'mw-version-library-name' )
+                                       )
                                )
                                . Html::element( 'td', array(), $info['version'] )
+                               . Html::element( 'td', array(), $this->listToText( $info['licenses'] ) )
+                               . Html::element( 'td', array(), $info['description'] )
+                               . Html::rawElement( 'td', array(), $authors )
                                . Html::closeElement( 'tr' );
                }
                $out .= Html::closeElement( 'table' );
@@ -959,7 +977,8 @@ class SpecialVersion extends SpecialPage {
         *   'and others' will be added to the end of the credits.
         *
         * @param string|array $authors
-        * @param string $extName Name of the extension for link creation
+        * @param string|bool $extName Name of the extension for link creation,
+        *   false if no links should be created
         * @param string $extDir Path to the extension root directory
         *
         * @return string HTML fragment
@@ -972,7 +991,7 @@ class SpecialVersion extends SpecialPage {
                        if ( $item == '...' ) {
                                $hasOthers = true;
 
-                               if ( $this->getExtAuthorsFileName( $extDir ) ) {
+                               if ( $extName && $this->getExtAuthorsFileName( $extDir ) ) {
                                        $text = Linker::link(
                                                $this->getPageTitle( "Credits/$extName" ),
                                                $this->msg( 'version-poweredby-others' )->escaped()
@@ -991,7 +1010,7 @@ class SpecialVersion extends SpecialPage {
                        }
                }
 
-               if ( !$hasOthers && $this->getExtAuthorsFileName( $extDir ) ) {
+               if ( $extName && !$hasOthers && $this->getExtAuthorsFileName( $extDir ) ) {
                        $list[] = $text = Linker::link(
                                $this->getPageTitle( "Credits/$extName" ),
                                $this->msg( 'version-poweredby-others' )->escaped()
index fb89e4f..0892ce4 100644 (file)
@@ -30,7 +30,8 @@ class MalformedTitleException extends Exception {
        /**
         * @param string $errorMessage Localisation message describing the error (since MW 1.26)
         * @param string $titleText The invalid title text (since MW 1.26)
-        * @param string[] $errorMessageParameters Additional parameters for the error message. $titleText will be appended if it's not null. (since MW 1.26)
+        * @param string[] $errorMessageParameters Additional parameters for the error message.
+        * $titleText will be appended if it's not null. (since MW 1.26)
         */
        public function __construct( $errorMessage = null, $titleText = null, $errorMessageParameters = array() ) {
                $this->errorMessage = $errorMessage;
index 4da533f..2cd377b 100644 (file)
        "tags-delete-not-allowed": "Меткі, вызначаныя пашырэньнем, ня могуць быць выдаленыя, акрамя выпадку, калі пашырэньне дазваляе гэта.",
        "tags-delete-not-found": "Метка «$1» не існуе.",
        "tags-delete-too-many-uses": "Метка «$1» выкарыстаная ў больш чым $2 {{PLURAL:$2|вэрсіі|вэрсіях}}, адпаведна, яна ня можа быць выдаленая.",
+       "tags-delete-warnings-after-delete": "Метка «$1» была пасьпяхова выдаленая, але {{PLURAL:$2|1=атрыманае наступнае папярэджаньне|атрыманыя наступныя папярэджаньні}}:",
        "comparepages": "Параўнаньне старонак",
        "compare-page1": "Старонка 1",
        "compare-page2": "Старонка 2",
index 6ca3827..e5d4fd8 100644 (file)
        "category-empty": "''Ova kategorija trenutno ne sadrži članke ni medije.''",
        "hidden-categories": "{{PLURAL:$1|Sakrivena kategorija|Sakrivene kategorije}}",
        "hidden-category-category": "Skrivene kategorije",
-       "category-subcat-count": "{{PLURAL:$2|Ova kategorija ima sljedeću potkategoriju.|Ova kategorija ima {{PLURAL:$1|sljedeću potkategoriju|sljedeće $1 potkategorije|sljedećih $1 potkategorija}}, od $2 ukupno.}}",
+       "category-subcat-count": "{{PLURAL:$2|Ova kategorija samo ima sljedeću potkategoriju.|Ova kategorija ima {{PLURAL:$1|sljedeću potkategoriju|sljedeće $1 potkategorije|sljedećih $1 potkategorija}}, od $2 ukupno.}}",
        "category-subcat-count-limited": "Ova kategorija sadrži {{PLURAL:$1|sljedeću $1 potkategoriju|sljedeće $1 potkategorije|sljedećih $1 potkategorija}}.",
        "category-article-count": "{{PLURAL:$2|U ovoj kategoriji nalazi se $1 članak.|{{PLURAL:$1|Prikazan je $1 članak|Prikazana su $1 članka|Prikazano je $1 članaka}} od ukupno $2 u ovoj kategoriji.}}",
        "category-article-count-limited": "{{PLURAL:$1|Slijedeća $1 stranica je|Slijedeće $1 stranice su|Slijedećih $1 stranica je}} u ovoj kategoriji.",
        "right-sendemail": "Slanje e-maila drugim korisnicima",
        "right-passwordreset": "Pogledaj e-mailove za obnavljanje šifre",
        "right-managechangetags": "Napravi i briši [[Special:Tags|oznake]] iz baze podataka",
+       "right-applychangetags": "Primijeni [[Special:Tags|oznake]] na nečije izmjene",
        "newuserlogpage": "Zapis novih korisnika",
        "newuserlogpagetext": "Ovo je zapis o registraciji novih korisnika.",
        "rightslog": "Zapisnik korisničkih prava",
        "action-createpage": "napravite stranicu",
        "action-createtalk": "kreirate stranice za razgovor",
        "action-createaccount": "napravite ovaj korisnički račun",
+       "action-history": "gledate historiju ove stranice",
        "action-minoredit": "da označite ovu izmjenu kao malu",
        "action-move": "premjestite ovu stranicu",
        "action-move-subpages": "premjestite ovu stranicu, i njene podstranice",
        "action-viewmywatchlist": "pogledajte svoj spisak praćenih stranica",
        "action-viewmyprivateinfo": "pogledajte svoje privatne informacije",
        "action-editmyprivateinfo": "uredite svoje privatne podatke",
+       "action-managechangetags": "napravite i uklonite oznake iz baze podataka",
        "nchanges": "$1 {{PLURAL:$1|promjena|promjene|promjena}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|izmjena od Vaše posljedne posjete}}",
        "enhancedrc-history": "historija",
        "recentchanges": "Nedavne izmjene",
        "recentchanges-legend": "Postavke nedavnih izmjena",
        "recentchanges-summary": "Na ovoj stranici možete pratiti nedavne izmjene.",
+       "recentchanges-noresult": "U zadanom vremenu nema promjena za zadane kriterije.",
        "recentchanges-feed-description": "Na ovoj stranici možete pratiti nedavne izmjene.",
        "recentchanges-label-newpage": "Ovom izmjenom pravi se nova stranica",
        "recentchanges-label-minor": "Ovo je mala izmjena",
        "lockfilenotwritable": "Datoteka zaključavanja baze je zaštićena za pisanje.\nAko želite otključati ili zaključati bazu, ova datoteka mora biti omogućena za pisanje od strane web servera.",
        "databasenotlocked": "Baza podataka nije zaključana.",
        "lockedbyandtime": "(od $1 dana $2 u $3)",
-       "move-page": "Premještanje $1",
-       "move-page-legend": "Premjestite stranicu",
+       "move-page": "Premjesti $1",
+       "move-page-legend": "Premjesti stranicu",
        "movepagetext": "Korištenjem ovog formulara možete preimenovati stranicu, premještajući cijelu historiju na novo ime.\nČlanak pod starim imenom postat će stranica koja preusmjerava na članak pod novim imenom. \nMožete automatski izmijeniti preusmjerenje do izvornog naslova.\nAko se ne odlučite na to, provjerite [[Special:DoubleRedirects|dvostruka]] ili [[Special:BrokenRedirects|neispravna preusmjeravanja]].\nDužni ste provjeriti da svi linkovi i dalje nastave voditi na prave stranice.\n\nImajte na umu da članak '''neće''' biti premješten ako već postoji članak pod imenom na koje ga namjeravate preusmjeriti osim u slučaju stranice za preusmjeravanje koja nema nikakvih starih izmjena.\nTo znači da možete vratiti stranicu na prethodno mjesto ako pogriješite, ali ne možete zamijeniti postojeću stranicu.\n\n'''Pažnja!'''\nOvo može biti drastična i neočekivana promjena kad su u pitanju popularne stranice.\nMolimo da dobro razmislite prije no što premjestite stranicu.",
-       "movepagetext-noredirectfixer": "Koristeći donji obrazac, preimenovat ćete stranicu i premjestiti cijelu njenu historiju na novi naziv.\nStari naziv postat će preusmjerenje na novi naziv.\nMolimo da provjerite postoje li [[Special:DoubleRedirects|dvostruka]] ili [[Special:BrokenRedirects|nedovršena preusmjerenja]].\nVi ste za to odgovorni te morate provjeriti jesu li linkovi ispravni i vode li tamo kamo bi trebali voditi.\n\nImajte na umu da stranica '''neće''' biti premještena ako već postoji stranica s tim imenom, osim ako je prazna ili je preusmjerenje ili nema ranije historije.\nOvo znači da možete preimenovati stranicu nazad gdje je ranije bila preimenovana ako ste pogriješili, ali ne možete ponovo preimenovati postojeću stranicu.\n\n'''Pažnja!'''\nImajte na umu da preusmjeravanje popularnog članka može biti\ndrastična i neočekivana promjena za korisnike; molimo da budete sigurni da ste shvatili posljedice prije no što nastavite.",
+       "movepagetext-noredirectfixer": "Koristeći donji obrazac, preimenovat ćete stranicu i premjestiti cijelu njenu historiju na novi naziv.\nStari naziv postat će preusmjerenje na novi naziv.\nMolimo da provjerite postoje li [[Special:DoubleRedirects|dvostruka]] ili [[Special:BrokenRedirects|nedovršena preusmjerenja]].\nVi ste za to odgovorni te morate provjeriti jesu li linkovi ispravni i vode li tamo kamo bi trebali voditi.\n\nImajte na umu da stranica '''neće''' biti premještena ako već postoji stranica s tim imenom, osim ako je prazna ili je preusmjerenje ili nema ranije historije.\nOvo znači da možete preimenovati stranicu nazad gdje je ranije bila preimenovana ako ste pogriješili, ali ne možete ponovo preimenovati postojeću stranicu.\n\n'''Pažnja!'''\nImajte na umu da premještanje popularnog članka može biti\ndrastična i neočekivana promjena za korisnike; molimo da budete sigurni da ste shvatili posljedice prije no što nastavite.",
        "movepagetalktext": "Odgovarajuća stranica za razgovor, ako postoji, automatski će biti pomjerena istovremeno '''osim ako:'''\n*pomjerate stranicu preko imenskih prostora\n*neprazna stranica za razgovor već postoji pod novim imenom\n*odčekirate donju kutiju.\n\nU tim slučajevima morat ćete ručno pomjeriti stranicu ako to želite.",
-       "movearticle": "Premjestite stranicu",
+       "movearticle": "Premjesti stranicu:",
        "moveuserpage-warning": "'''Upozorenje:''' Premještate korisničku stranicu. Molimo da zapamtite da će se samo stranica premjestiti a korisnik se ''neće'' preimenovati.",
        "movenologintext": "Morate biti registrovani korisnik i [[Special:UserLogin|prijavljeni]] da biste premjestili stranicu.",
        "movenotallowed": "Nemate dopuštenje za premještanje stranica.",
        "cant-move-to-user-page": "Nemate dopuštenje da premjestite stranicu na korisničku stranicu (osim na korisničku podstranicu).",
        "newtitle": "Novi naslov",
        "move-watch": "Prati ovu stranicu",
-       "movepagebtn": "premjestite stranicu",
+       "movepagebtn": "Premjesti članak",
        "pagemovedsub": "Premještanje uspjelo",
        "movepage-moved": "'''\"$1\" je premještena na \"$2\"'''",
        "movepage-moved-redirect": "Preusmjerenje je napravljeno.",
        "watchlistedit-clear-submit": "Isprazni spisak nadgledanja (Ovo je trajno!)",
        "watchlistedit-clear-done": "Vaš spisak praćenja je očišćen.",
        "watchlisttools-clear": "Očisti spisak nadgledanja",
-       "watchlisttools-view": "Pregled promjena praćenih stranica",
-       "watchlisttools-edit": "Pogledaj i uredi listu praćenih članaka.",
-       "watchlisttools-raw": "Uređivanje praćenih stranica u okviru praćenja.",
+       "watchlisttools-view": "Pogledaj srodne izmjene",
+       "watchlisttools-edit": "Pogledaj i uredi spisak praćenja",
+       "watchlisttools-raw": "Uredi spisak praćenja u okviru za uređivanje",
        "iranian-calendar-m1": "Farvardin (Iranski kalendar)",
        "iranian-calendar-m2": "Ordibehesht",
        "iranian-calendar-m3": "Khordad",
        "tags-delete-title": "Izbriši oznaku",
        "tags-delete-reason": "Razlog:",
        "tags-delete-not-found": "Oznaka \"$1\" ne postoji.",
+       "tags-activate-reason": "Razlog:",
+       "tags-activate-not-found": "Oznaka \"$1\" ne postoji.",
        "comparepages": "Usporedi stranice",
        "compare-page1": "Stranica 1",
        "compare-page2": "Stranica 2",
index 4def6dd..cd6951e 100644 (file)
        "yourdiff": "Rozdíly",
        "copyrightwarning": "Všechny příspěvky do {{grammar:2sg|{{SITENAME}}}} jsou zveřejňovány podle $2 (podrobnosti najdete na $1).\nPokud si nepřejete, aby váš text byl nemilosrdně upravován a volně šířen, pak ho do {{grammar:2sg|{{SITENAME}}}} neukládejte.<br />\nUložením příspěvku se zavazujete, že je vaším dílem nebo je zkopírován ze zdrojů, které nejsou chráněny autorským právem (tzv. <em>public domain</em>).\n'''NEVKLÁDEJTE DÍLA CHRÁNĚNÁ AUTORSKÝM PRÁVEM BEZ DOVOLENÍ!'''",
        "copyrightwarning2": "Uvědomte si, že všechny příspěvky do {{grammar:2sg|{{SITENAME}}}} mohou být ostatními uživateli upraveny, pozměněny či odstraněny. Pokud si nepřejete, aby váš text byl nemilosrdně upravován, pak ho do {{grammar:2sg|{{SITENAME}}}} neukládejte.<br />\nUložením příspěvku se zavazujete, že je vaším dílem nebo je zkopírován ze zdrojů, které nejsou chráněny autorským právem (tzv. <em>public domain</em>); podrobnosti najdete na $1. '''Nekopírujte díla chráněná autorským právem bez dovolení!'''",
+       "editpage-cannot-use-custom-model": "Model obsahu této stránky nelze změnit.",
        "longpageerror": "'''Chyba: Pokoušíte se uložit text o velikosti {{PLURAL:$1|$1 KiB}}, přičemž dovolené maximum je {{PLURAL:$2|$2 KiB}}.'''\nVaše změna nemůže být uložena.",
        "readonlywarning": "<strong>Varování: Databáze byla uzamčena kvůli údržbě, takže momentálně nebudete moci uložit své změny.</strong>\nMůžete si okopírovat text do souboru a uložit si ho na později.\n\nSprávce serveru, který databázi zamkl, poskytl toto zdůvodnění: $1",
        "protectedpagewarning": "'''Varování: Tato stránka byla zamčena, takže ji mohou editovat pouze správci.'''\nNíže je pro přehled zobrazen nejnovější protokolovací záznam:",
index bbb8d91..59175be 100644 (file)
        "hidetoc": "लुकाउन्या",
        "collapsible-collapse": "खुम्च्याउन्या",
        "collapsible-expand": "फैलाउ",
-       "confirmable-confirm": "तमरà¥\8b {{GENDER:$1|लिà¤\99à¥\8dà¤\97}} à¤¹à¥\8b?",
+       "confirmable-confirm": "à¤\95à¥\8dया {{GENDER:$1|तम}} à¤¸à¥\81निशà¥\8dà¤\9aित à¤\9bà¥\8c ?",
        "confirmable-yes": "हो",
        "confirmable-no": "नाइँ",
        "thisisdeleted": "$1 हेर्न्या या पैल्लीका रुपमी फर्काउन्या हो?",
        "editconflict": "सम्पादन बाँझ्यो: $1",
        "yourtext": "तमरा पाठहरू",
        "storedversion": "संग्रहित पुनरावलोकन",
+       "editingold": "<strong>चेतावनी: तम यै पानाको अति पुरानो अप्रचलित संशोधनलाई सम्पादन गद्द लाग्याछौ ।<strong>\nयदि तमीले यै परिवर्तनलाई सङ्ग्रह गर्यौ भण्या यै पछिका संशोधनहरू नष्ट हुन्याछन् ।",
        "yourdiff": "भिन्नताहरू",
+       "copyrightwarning2": "कृपया ध्यान देओ यै {{SITENAME}}मी दियाका योगदानहरूलाई अन्य योगदानकर्ताहरूद्वारा सम्पादन गरिन्याछ, परिवर्तन गरिन्याछ अथवा हटाइन्याछ । यदि तमरो लेखलाई निर्दयता पूर्वक सम्पादन गरेको चाहदैनौ भण्या त्यो यहाँ जनराख।<br />\nयदि तमी किटानसाथ भन्नाछौ कि यो लेख तम आफैले लेख्याको हो अथवा सार्वजनिक ज्ञानक्षेत्र अथवा मुक्त संसाधनबठे लियाको हो (विवरणकोलागि हेर $1 ). \n'''कपीराइट भयाको रचना अनुमति बिना  यहाँ जनराख!'''",
+       "readonlywarning": "<strong>चेतावनी: तथ्याङ्क मर्मतको निम्ति बन्द गरियाकोछ, यै कारण तमी आफ्नो सम्पादन अहिले सङ्ग्रह गद्द सक्द्याहौन ।</strong>\n\nयदि तमी चाहन्छौ भण्या अहिले यहाँ भयाका पाठलाई कपि गरि कतै टेक्स्ट फाइलमी पेस्ट गरिबर सङ्ग्रह गद्द सक्द्याहौ ।\n\nप्रवन्धक जनले यो बन्द गर्याको छ उनले यसो विवरण दियाको छ: $1",
        "protectedpagewarning": "<strong>सूचना: यै पानालाई सुरक्षित गरियाको छ यसकारण प्रवन्धकको विशेषाधिकार प्राप्त प्रयोगकर्ताहरूले मात्र यैलाई सम्पादन गद्द सक्द्याछन् ।</strong>\nसन्दर्भको लागि नविनतम लग प्रविष्टि तल दिइयाको छ:",
        "templatesused": "यै पानामी राखियाका {{PLURAL:$1|Template|ढाँचाहरू}} :",
        "template-protected": "(सुरक्षित)",
        "content-failed-to-parse": "$1 को लागि $2 सामग्रीलाई पार्स गर्न विफल, गल्ती: $3",
        "invalid-content-data": "अमान्य सामग्री डेटा",
        "content-not-allowed-here": "सामग्री \"$1\"  [[$2]] पानामी राख्न अनुमती छैन ।",
+       "editwarning-warning": "यै पानाबठे बाहिर जाँदा तमले गर्याको कुनै पनि परिवर्तन हराउन्याछ ।\nयदि तमले लग इन गर्याको छ भण्या तमी यै सूचनालाई धेकाउन आफ्नो रोजाईहरूको \"{{int:prefs-editing}}\" भागमी गइबर बन्द गद्द सक्द्याहौ।",
        "content-model-wikitext": "विकिपाठ",
        "content-model-text": "साधारण पाठ",
        "content-model-javascript": "जाभास्क्रिप्ट",
        "upload-recreate-warning": "'''चेतावनी: त्यस नाममी रह्याका फाइलहरू सारियाको या हटायाको छ।'''\n\nयै पानाको सारियाको र हटायाको लग तमरो सहजताको लागि दियाको छ।",
        "filedesc": "सारांश:",
        "large-file": "यो सिफारिस गर्याछकि फाइलहरूको आकार $1 भन्दा ठूला हुनु हुँदैन;\nयै फाइलको आकार $2 छ ।",
+       "fileexists": "यै नामको फाइल पैल्ली नैं छ, यदि तम परिवर्तन गद्या कुरडीमू सुनिश्चित छैनौ भण्या कृपया <strong>[[:$1]]</strong> जाँच गर।\n[[$1|thumb]]",
+       "filewasdeleted": "यै नामको एक फाइल पहिली पनि अपलोड गरिबर पछि हटाई सकियाको छ।\nपुनः अपलोड गद्दु पूर्व तम $1 लाई निक्करी जाँच गर ।",
        "uploadstash-nofiles": "तमरा कोइ पनि स्टाश गर्याका फाइलहरू नाइथिन् ।",
        "uploadstash-refresh": "फाइलहरूको सूची ताजा गर्न्या",
        "license-header": "कोइ केइ नाइथिन",
        "activeusers-hidesysops": "प्रवन्धकहरू लुकाउन्या",
        "activeusers-noresult": "प्रयोगकर्ताहरू भेटियानन्",
        "mailnologintext": "तमीले अरु प्रयोगकर्तानलाई ईमेल पठाउनको लागि आफु पहिली [[Special:UserLogin|प्रवेश(लगइन)गर्याको]] हुनुपडन्छ र [[Special:Preferences|आफ्नो रोजाइहरूमी]] एउटा वैध ईमेल ठेगाना भयाको हुनुपडन्छ ।",
+       "emailpagetext": "तल दियाको फार्मले तमी यै {{GENDER:$1|प्रयोगकर्ता}}लाई इमेल पठाउन सक्द्या हौ । तमीले जो ठेगाना [[Special:Preferences|आफ्नो प्रयोगकर्ता रोजाईहरू]]मी दियाका छियौ त्यो यै इमेललाई \"पठाउने\" को रूपमी आउन्याछ, अतः प्राप्तकर्ता तमीलाई सिधै जवाफ दिनसक्द्याछ ।",
+       "usermaildisabledtext": "यै विकिमी तम और प्रयोगकर्तानलाई ई-मेल पठाउन नाइसक्दा",
        "mywatchlist": "मेरो ध्यान सूची",
        "watch": "ध्यान राख",
        "watchthispage": "यै पानाको ध्यान राख",
        "notanarticle": "सामाग्री छैन",
        "enotif_reset": "सब्बै पानाहरू हेर्याको भनी चिनो लाउन्या",
        "enotif_body": "प्रिय $WATCHINGUSERNAME,\n\n\n{{SITENAME}}को पाना $PAGETITLE  $PAGEEDITDATE का दिन $PAGEEDITOR द्वारा $CHANGEDORCREATED, \nअहिलको संशोधनको निउती हेर  $PAGETITLE_URL ।\n\n$NEWPAGE\n\nसम्पादकको सारांश: $PAGESUMMARY $PAGEMINOREDIT\n\nसम्पादकसित सम्पर्क राख:\nमेल: $PAGEEDITOR_EMAIL\nविकि: $PAGEEDITOR_WIKI\n\nतमी यै पानामी नगयासम्म अब उसो कुनै परिवर्तन भयाका खण्डमी कुनै सूचना दिन्याछैन ।\nतमरा सम्पूर्ण ध्यान सूचीका पानानको लागि तमीले सूचना पताकालाई ध्यान सूचीमी पुनर्बहाली गद्द सक्द्या हौ । \n\n             तमरो मित्र {{SITENAME}} सूचना प्रणाली\n--\nइमेल सूचना व्यवस्था परिवर्तन गद्द, जाओ\n{{canonicalurl:{{#special:Preferences}}}}\n\nध्यान सूची व्यवस्थित गर्न, जाओ\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nध्यान सूची मेट्न, जाओ\n$UNWATCHURL\n\nप्रतिक्रिया र अन्य सहयोगका निउती:\n$HELPPAGE",
+       "confirmdeletetext": "तमी यो पानो र यैको इतिहास मेट्ट लाग्याछौ । कृपया पुष्टि गर कि [[{{MediaWiki:Policy-url}}|नियम]] मुताबिक तम मेट्ट लाग्याछौ।",
        "dellogpage": "मेटाइयाको लग",
        "delete-toobig": "यै पानाको सम्पादन इतिहास भौतै र  $1 {{PLURAL:$1|पुनरावलोक|पुनरावलोकहरू}}भन्दा बढी रह्याको छ।\n {{SITENAME}}मी दुर्घटनाको कारणले गडबडी आउनसक्द्या कुरडीलाई रोक्न यसा पानाहरूलाई मेट्नबठे निषेध गरियाको छ ।",
        "rollback": "सम्पादनहरू उल्टाउन्या",
        "contribslink": "योगदानहरू",
        "block-log-flags-anononly": "नाम नभयाका प्रयोकर्ताहरू मात्र",
        "ipbblocked": "तमी अरु प्रयोगकर्तानहरूलाई ब्लक गर्न वा उनीहरूको ब्लक खोल्न नाइसक्दा किनभने तमी आफै ब्लक भयाका छौ ।",
+       "lockdbtext": "डेटाबेसमी ताला लगाउनाले सबै प्रयोगकर्ता पृष्ठ सम्पादन, आफ्नो रौजाईमी परिवर्तन, आफ्नो ध्यानसूचीमी सम्पादन, र अन्य वस्तु जैको लागि डेटाबेसमी परिवर्तन गरें हुन्छ, त्यैबठे वन्चित हुन्याछ । कृपया यो सुनिश्चित गर कि तम यो गर्न चाहन्छौ, र तम रक्षण पश्चात ताला खोल्न्या हौ ।",
+       "movepagetext-noredirectfixer": "तल दियाको फारमले पानाको नाम परिवर्तन गद्याछ, उइको सबै इतिहास पनि नयाँ नामले धेकिन्याछ ।\nपुरानो शीर्षक नयाँ नाममी अनुप्रेषण गद्याछ ।\nमूल शीर्षक तर्फ लिएर जान्या सबै अनुप्रेषणहरूलाई तम स्वचालित रूपले परिवर्तन गद्द सक्द्या हौ ।\nयदि तम यसो नाइ गद्या भया कृपया [[Special:DoubleRedirects|दोहोरो]] पुनर्निर्देशन वा [[Special:BrokenRedirects|टुटेको पुनर्निर्देशन]]का लागि पक्कै जाँच गर ।\nलिङ्क आफ्नो स्थानमै रहोस्, यो सुनिश्चित गर्ने जिम्मेवारी तमरो हो ।\n\nयदि नयाँ शीर्षकको लेख पहिले देखि छ भण्या नाम परिवर्तन '''हुन''' सक्दैन । तर यदि नयाँ शीर्षक भयाको लेख खाली छ अथवा कतै अन्य स्थानमी अनुप्रेषित गद्दैछ र साथै उइको पुरानो संस्करण छैन भण्या त्यैको नाम परिवर्तन हुन्याछ ।\nयैको अभिप्राय यो हो कि यदि तमीबठे गल्ती भयाको छ भण्या तम फेरी पुरानो नाममी यस पानालाई सार्न सक्द्याछौ, र साथै तम कुनै पहिली बठे रह्याको पानाको सट्टा यो स्थानान्तरण गद्द सक्द्या हौन ।\n\n<strong>चेतावनी!<strong>\nयदि पानो खासै लोकप्रिय छ भण्या त्यैको लागि यो एउटा ठुलो र अकस्मात परिवर्तन हुन सक्छ;\nअगाडी बढ्नु भन्ना पहिली तमी यैको नतिजासँग परिचित भयाकाछौ ।",
        "cant-move-user-page": "तमसँग प्रयोगकर्ता पानाहरू साद्या अनुमती नाइथिन् (सहपानाहरू बाहेक)",
        "cant-move-to-user-page": "तमसँग पानाहरूलाई प्रयोगकर्ता पानामी साद्या अनुमती नाइथिन् (प्रयोगकर्ता सहपृष्ठहरूमी बाहेक)",
        "move-subpages": "उप पानाहरू सार्न्या($1 सम्मको)",
        "movenosubpage": "यै पानाको उपपाना नाइथी",
        "protectedpagemovewarning": "<strong>सूचना:</strong> यै पानालाई सुरक्षित गरियाको छ यसकारण प्रवन्धकको विशेषाधिकार प्राप्त प्रयोगकर्ताहरूले मात्र यैको नाम बदल्न सक्द्या छन् ।\nसन्दर्भको लागि नविनतम लग प्रविष्टि तल दियाको छ:",
        "export": "पानहरु पठौन्या",
+       "exporttext": "तमी विशिष्ठ पानाको विषय वस्तु र सम्पादन इतिहासलाई निर्यात गद्द सक्द्याहौ अथवा पानाहरूको समूहका केहि XML मी बेर्न सक्द्याहौ।\nयो [[Special:Import|आयात पाना]]को सहायताले मीडियाविकीको प्रयोग गरिवर दोश्रो विकीबठे आयात गद्द सकिन्याछ।\n\nपानाहरूको निर्यात गद्दका लागि, तल विषय वस्तु बाकसमी शीर्षक देओ, एक शीर्षक प्रति पङ्क्ति, र छान कि तम वर्तमान अवतरणसँग पुरानै अवतरण पनि चाहन्छौ वा चाहदैनौ, वा पछिल्लो सम्पादनका बारेमी जानकारीसँग मात्रै वर्तमान अवतरण चाहन्छौ।\n\nपछीको स्थितिको लागि तमी लिङ्कको पनि प्रयोग गद्द सक्द्याहौ, उदाहरणको लागि, \"[[{{MediaWiki:Mainpage}}]]\" पृष्ठको लागि [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]]।",
        "thumbnail-more": "ठूलो बनौन्या",
        "import-noarticle": "आयात गद्दाकी लाई पानाहरू नाइथिन्",
        "tooltip-pt-userpage": "तमरो प्रयोगकर्ता पानो",
        "exif-orientation-1": "सानतिनो",
        "namespacesall": "सब्बै",
        "monthsall": "सब्बै",
+       "confirmrecreate": "प्रयोगकर्ता [[User:$1|$1]] ([[User talk:$1|कुरडी]])ले  तमले  सम्पादन सुरु गर्यापछि यो पानो मेट्याकाछन् । कारण थ्यो:\n: ''$2''\nकृपया सुनिश्चित गर कि तम यो पानो साँच्चै निर्माण गद्द चाहन्छौ ।",
        "lag-warn-normal": " $1 {{PLURAL:$1|सेकेन्ड |सेकेन्डहरू}} भन्दा नौला फेरबदलहरू यै सूचीमी नधेकाउन सक्छ ।",
        "lag-warn-high": "डेटावेस सर्भरको मस्तै ढिलाको कारणले  $1 {{PLURAL:$1|सेकेन्ड|सेकेन्डहरू}} पछिका परिवर्तनहरू नधेकिन सक्छ ।",
        "watchlisttools-view": "आधारित फेरबदलीहरू हेर",
        "tag-filter": "[[Special:Tags|पुछड]] छानिन्या",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|ट्याग|ट्यागहरू}}]]: $2)",
        "tags-hitcount": "$1 {{PLURAL:$1|परिवर्तन|परिवर्तनहरू}}",
+       "tags-delete-explanation-warning": "यो क्रिया <strong>अपरिवर्तनीय</strong> हो र <strong>त्यसलाई परिवर्तन गर्न नाईसकिंदो</strong>, डेटाबेस प्रवन्धक पनि यैलाई केहि गद्द सक्दाइनन् । विश्वासपूर्ण रूपले तम तय गर कि तमी यै ट्यागलाई हटाउन चाहन्छौ ।",
        "logentry-delete-delete": "$1 बठे पानो $3 {{GENDER:$2|मेटाइयो}}",
        "logentry-move-move": "$1 {{GENDER:$2|द्वारा}} $3 पृष्ठलाई $4 मि सारियो",
        "logentry-newusers-create": "प्रयोगकर्ता खाता $1 {{GENDER:$2|खोलियो}}",
        "logentry-upload-upload": "$1 ले $3 {{GENDER:$2|अपलोड अरेका छन्}}",
+       "feedback-bugornote": "यदि तमी कुनै प्राविधिक समस्यालाई विस्तारले सम्झाउन तयार छौ भण्या कृपया [$1 बग राख]।\nयदि हैन, भण्या तमी तल दियाको सरल फारमको प्रयोग गद्दसक्द्याहौ । तमरो टिप्पणी, तमरो प्रयोगकर्ता नाम र तमरो ब्राउजरको नाम सहित \"[$3 $2]\" पानामी जोडिन्याछ ।",
        "searchsuggest-search": "खोज",
        "api-error-duplicate": "यै साइटमी पहिलीबठे यस्तै सामग्री {{PLURAL:$1|भयाको [$2 अर्को फाइल छ]|भयाका  [$2 केहि अरु फाइलहरू छन्]}} ।",
        "api-error-duplicate-archive": "यै साइटमी पहिलेबाट यस्तै सामग्री {{PLURAL:$1|भयाको [$2 अर्को फाइल थियो]|भयाका  [$2 केहि अरु फाइलहरू थिए]}} ।\nतर {{PLURAL:$1|यो मेट्याको थियो|यी मेटायाका थिए}} ।",
index 25ae0a2..b63ddf4 100644 (file)
        "version-libraries": "Installed libraries",
        "version-libraries-library": "Library",
        "version-libraries-version": "Version",
+       "version-libraries-license": "License",
+       "version-libraries-description": "Description",
+       "version-libraries-authors": "Authors",
        "redirect": "Redirect by file, user, page or revision ID",
        "redirect-legend": "Redirect to a file or page",
        "redirect-text": "",
index 82b0741..8181c7d 100644 (file)
        "yourdiff": "Eroavaisuudet",
        "copyrightwarning": "'''Muutoksesi astuvat voimaan välittömästi.''' Kaikki {{GRAMMAR:illative|{{SITENAME}}}} tehtävät tuotokset katsotaan julkaistuksi $2 -lisenssin mukaisesti ($1). Jos et halua, että kirjoitustasi muokataan armottomasti ja uudelleenkäytetään vapaasti, älä tallenna kirjoitustasi. Tallentamalla muutoksesi lupaat, että kirjoitit tekstisi itse, tai kopioit sen jostain vapaasta lähteestä. '''ÄLÄ KÄYTÄ TEKIJÄNOIKEUDEN ALAISTA MATERIAALIA ILMAN LUPAA!'''",
        "copyrightwarning2": "Huomaa, että kuka tahansa voi muokata, muuttaa ja poistaa kaikkia sivustolle tekemiäsi lisäyksiä ja muutoksia. Muokkaamalla sivustoa luovutat sivuston käyttäjille tämän oikeuden ja takaat, että lisäämäsi aineisto on joko itse kirjoittamaasi tai peräisin jostain vapaasta lähteestä. Lisätietoja sivulla $1. '''TEKIJÄNOIKEUDEN ALAISEN MATERIAALIN KÄYTTÄMINEN ILMAN LUPAA ON EHDOTTOMASTI KIELLETTYÄ!'''",
+       "editpage-cannot-use-custom-model": "Tämän sivun sisältömallia (content model) ei voida muuttaa.",
        "longpageerror": "'''Virhe: Lähettämäsi tekstin pituus on {{PLURAL:$1|kilotavu|$1 kilotavua}}. Tekstiä ei voida tallentaa, koska se on pitempi kuin sallittu enimmäispituus {{PLURAL:$2|yksi kilotavu|$2 kilotavua}}.'''",
        "readonlywarning": "'''Varoitus: Tietokanta on lukittu huoltoa varten, joten et pysty tallentamaan muokkauksiasi juuri nyt.'''\nSaattaa olla paras leikata ja liimata tekstisi omaan tekstitiedostoosi ja tallentaa se tänne myöhemmin.\n\nLukitsemisen syy: $1",
        "protectedpagewarning": "'''Varoitus: Tämä sivu on suojattu niin, että vain ylläpitäjät voivat muokata sitä.'''\nAlla on viimeisin lokitapahtuma:",
        "special-characters-title-endash": "ajatusviiva",
        "special-characters-title-emdash": "pitkä ajatusviiva",
        "special-characters-title-minus": "miinusmerkki",
-       "mw-widgets-titleinput-description-new-page": "sivua ei ole vielä olemassa",
-       "mw-widgets-titleinput-description-redirect": "ohjaus sivulle $1"
+       "mw-widgets-titleinput-description-new-page": "sivua ei ole olemassa vielä",
+       "mw-widgets-titleinput-description-redirect": "ohjaus kohteeseen $1"
 }
index 692e037..be8a55b 100644 (file)
        "invalidtitle-unknownnamespace": "Titre invalide avec le numéro d'espace de noms $1 et l'intitulé « $2 » inconnus",
        "exception-nologin": "Non connecté",
        "exception-nologin-text": "Veuillez vous connecter pour pouvoir accéder à cette page ou cette action.",
-       "exception-nologin-text-manual": "Veuillez $1 pour pouvoir accéder à cette page ou cette action.",
+       "exception-nologin-text-manual": "Veuillez vous $1 pour pouvoir accéder à cette page ou cette action.",
        "virus-badscanner": "Mauvaise configuration : scanneur de virus inconnu : ''$1''",
        "virus-scanfailed": "Échec de la recherche (code $1)",
        "virus-unknownscanner": "antivirus inconnu :",
        "blockedtext": "'''Votre compte utilisateur ou votre adresse IP a été bloqué.'''\n\nLe blocage a été effectué par $1.\nLa raison invoquée est la suivante : ''$2''.\n\n* Début du blocage : $8\n* Expiration du blocage : $6\n* Compte bloqué : $7.\n\nVous pouvez contacter $1 ou un autre [[{{MediaWiki:Grouppage-sysop}}|administrateur]] pour en discuter.\nVous ne pouvez utiliser la fonction « {{MediaWiki:emailpage}} » que si une adresse de courriel valide est spécifiée dans vos [[Special:Preferences|préférences]] et que si cette fonctionnalité n’a pas été bloquée.\nVotre adresse IP actuelle est $3 et votre identifiant de blocage est $5.\nVeuillez préciser ces indications dans toutes les requêtes que vous ferez.",
        "autoblockedtext": "Votre adresse IP a été bloquée automatiquement car elle a été utilisée par un autre utilisateur, lui-même bloqué par $1.\nLa raison invoquée est :\n\n:''$2''\n\n* Début du blocage : $8\n* Expiration du blocage : $6\n* Compte bloqué : $7\n\nVous pouvez contacter $1 ou l’un des autres [[{{MediaWiki:Grouppage-sysop}}|administrateurs]] pour discuter de ce blocage.\n\nNotez que vous ne pourrez utiliser la fonctionnalité d’envoi de courriel que si vous avez une adresse de courriel validée dans vos [[Special:Preferences|préférences]] et que si cette fonctionnalité n’a pas été désactivée.\n\nVotre adresse IP actuelle est $3, et le numéro de blocage est $5.\nVeuillez préciser ces indications dans toutes les requêtes que vous ferez.",
        "blockednoreason": "aucune raison donnée",
-       "whitelistedittext": "Vous devez être $1 pour avoir la permission de modifier le contenu.",
+       "whitelistedittext": "Vous devez vous $1 pour avoir la permission de modifier le contenu.",
        "confirmedittext": "Vous devez confirmer votre adresse de courriel avant de modifier les pages.\nVeuillez entrer et valider votre adresse de courriel dans vos [[Special:Preferences|préférences]].",
        "nosuchsectiontitle": "Impossible de trouver la section",
        "nosuchsectiontext": "Vous avez essayé de modifier une section qui n'existe pas.\nElle a peut-être été déplacée ou supprimée depuis que vous avez lu cette page.",
        "reuploaddesc": "Annuler et retourner au formulaire d'import",
        "upload-tryagain": "Envoyer la description du fichier modifiée",
        "uploadnologin": "Non connecté",
-       "uploadnologintext": "Vous devez $1 pour importer des fichiers.",
+       "uploadnologintext": "Vous devez vous $1 pour importer des fichiers.",
        "upload_directory_missing": "Le répertoire d’import de fichier ($1) est introuvable et n’a pas pu être créé par le serveur web.",
        "upload_directory_read_only": "Le répertoire d’import de fichier ($1) n’est pas accessible en écriture depuis le serveur web.",
        "uploaderror": "Erreur lors de l’import",
index 40c3757..616ba8e 100644 (file)
        "moredotdotdot": "Više...",
        "morenotlisted": "Ovaj popis nije potpun.",
        "mypage": "Stranica",
-       "mytalk": "Moj razgovor",
+       "mytalk": "Razgovor",
        "anontalk": "Razgovor za ovu IP adresu",
        "navigation": "Orijentacija",
        "and": "&#32;i",
        "searchdisabled": "<p>Oprostite! Pretraga po cjelokupnoj bazi je zbog bržeg rada projekta {{SITENAME}} trenutačno onemogućena. Možete se poslužiti tražilicom Google.</p>",
        "search-error": "Greška prilikom pretrage: $1",
        "preferences": "Postavke",
-       "mypreferences": "Moje postavke",
+       "mypreferences": "Postavke",
        "prefs-edits": "Broj uređivanja:",
        "prefsnologintext2": "Molimo Vas prijavite se da biste promijenili postavke.",
        "prefs-skin": "Izgled",
index 8754712..f2fc89e 100644 (file)
        "no-null-revision": "Non ha potite crear un nove version vacue del le pagina \"$1\"",
        "badtitle": "Titulo invalide",
        "badtitletext": "Le titulo de pagina requestate es invalide, vacue, o un titulo interlingual o interwiki incorrectemente ligate.\nEs possibile que illo contine un o plure characteres que non pote esser usate in titulos.",
+       "title-invalid-empty": "Le titulo de pagina requestate es vacue o contine solmente le nomine de un spatio de nomines.",
+       "title-invalid-utf8": "Le titulo de pagina requestate contine un sequentia UTF-8 invalide.",
+       "title-invalid-interwiki": "Le titulo de pagina requestate contine un ligamine interwiki que non pote esser usate in titulos.",
+       "title-invalid-talk-namespace": "Le titulo de pagina requestate refere a un pagina de discussion que non pote exister.",
        "perfcached": "Le sequente datos esseva recuperate del cache e possibilemente non es actual. Un maximo de {{PLURAL:$1|un resultato|$1 resultatos}} es disponibile in le cache.",
        "perfcachedts": "Le sequente datos esseva recuperate del cache e ha essite actualisate le $3 a $4. Un maximo de {{PLURAL:$4|un resultato|$4 resultatos}} es disponibile in le cache.",
        "querypage-no-updates": "Le actualisationes pro iste pagina es disactivate. Pro le momento, le datos hic non se cambiara.",
        "nmembers": "$1 {{PLURAL:$1|membro|membros}}",
        "nmemberschanged": "$1 → $2 {{PLURAL:$2|membro|membros}}",
        "nrevisions": "$1 {{PLURAL:$1|version|versiones}}",
-       "nviews": "$1 {{PLURAL:$1|visita|visitas}}",
        "nimagelinks": "Usate in $1 {{PLURAL:$1|pagina|paginas}}",
        "ntransclusions": "usate in $1 {{PLURAL:$1|pagina|paginas}}",
        "specialpage-empty": "Il non ha resultatos pro iste reporto.",
index bc123bb..f8d30a8 100644 (file)
        "special-characters-title-endash": "lineetta enne",
        "special-characters-title-emdash": "lineetta emme",
        "special-characters-title-minus": "segno meno",
-       "mw-widgets-titleinput-description-new-page": "Questa pagina non esiste ancora.",
+       "mw-widgets-titleinput-description-new-page": "questa pagina non esiste ancora",
        "mw-widgets-titleinput-description-redirect": "reindirizzamento a $1"
 }
index b6d4dba..318ac12 100644 (file)
        "tags-edit-existing-tags": "既存のタグ:",
        "tags-edit-existing-tags-none": "(なし)",
        "tags-edit-new-tags": "新しいタグ:",
+       "tags-edit-add": "これらのタグを追加:",
+       "tags-edit-remove": "これらのタグを除去:",
        "tags-edit-remove-all-tags": "(すべてのタグを除去)",
+       "tags-edit-chosen-placeholder": "いくつかのタグを選択",
        "tags-edit-chosen-no-results": "一致するタグが見つかりません",
        "tags-edit-reason": "理由:",
+       "tags-edit-revision-submit": "変更を {{PLURAL:$1|this revision|$1 revisions}} に適用",
+       "tags-edit-logentry-submit": "変更を {{PLURAL:$1|this log entry|$1 log entries}} に適用",
        "tags-edit-success": "変更が正常に適用されました。",
        "tags-edit-failure": "変更は適用できませんでした: $1",
        "tags-edit-nooldid-title": "無効な対象版",
        "log-description-pagelang": "これはページ言語の変更の記録です。",
        "logentry-pagelang-pagelang": "$1 がページ $3 の言語を $4 から $5 に{{GENDER:$2|変更しました}}",
        "default-skin-not-found": "おっと! あなたのウィキの既定の外装「<code>$1</code>」 (<code>$wgDefaultSkin</code>)は利用できません。\n\nあなたのインストールには以下の外装が含まれています。外装の有効化と既定の選択については、[https://www.mediawiki.org/wiki/Manual:Skin_configuration マニュアル: 外装設定] をご覧ください。\n\n$2\n\n; MediaWikiをインストールしたばかりの場合:\n: gitからインストールしたか、その他の何らかの方法でソースコードから直接インストールした場合には、これは期待されたとおりの動作です。\n:* [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org's skin directory] から外装をインストールしてみてください。\n:* [https://www.mediawiki.org/wiki/Download tarball installer] をダウンロードしてみてください。これにはいくつかの外装と拡張機能が含まれています。 <code>skins/</code> ディレクトリからコピー&ペーストできます。\n: あなたがMediaWiki開発者の場合、これを行うことであなたのgitリポジトリに干渉することはありません。\n\n; MediaWiki をアップグレードした場合:\n: MediaWiki 1.24 以降のバージョンでは、インストール済みの外装は自動的には有効になりません。 ([https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery マニュアル:外装の自動探索] をご覧ください)。<code>LocalSettings.php</code> に以下の行をペーストして、現在インストールされている外装を有効にできます。\n\n<pre>$3</pre>\n\n; <code>LocalSettings.php</code>を編集したばかりの場合:\n: 外装名に打ち間違いがないか再度確認してください。",
-       "default-skin-not-found-no-skins": "おっと! あなたのウィキの既定の外装「<code>$1</code>」 (<code>$wgDefaultSkin</code>)は利用できません。\n\n外装をインストールしていません。\n\n; MediaWikiをインストールしたばかりの場合:\n: gitからインストールしたか、その他の何らかの方法でソースコードから直接インストールした場合には、これは期待されたとおりの動作です。\n:* [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org's skin directory] から外装をインストールしてみてください。\n:* [https://www.mediawiki.org/wiki/Download tarball installer] をダウンロードしてみてください。これには外装と拡張機能がいくつか含まれています。 <code>skins/</code> ディレクトリからコピー&ペーストできます。\n: あなたがMediaWiki開発者の場合、これを行うことであなたのgitリポジトリに干渉することはありません。外装の有効化と既定の選択についての情報は、[https://www.mediawiki.org/wiki/Manual:Skin_configuration マニュアル:外装設定] をご覧ください。",
+       "default-skin-not-found-no-skins": "おっと! <code>$1</code>で定義されている、あなたのウィキの既定の外装 (<code>$wgDefaultSkin</code>)は利用できません。\n\n外装をインストールしていません。\n\n; MediaWikiをインストールしたばかりか更新したばかりの場合:\n: gitからインストールしたか、その他の何らかの方法でソースコードから直接インストールした場合には、これは期待されたとおりの動作です。MediaWikiの1.24およびそれ以降は、メインのリポジトリ内には任意の外装が含まれていません。[https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org's skin directory] から外装をインストールしてみてください。, by:\n:* 個々の外装 tarballs を[https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org] ダウンロードすること。\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins Using Git to download skins].\n: あなたがMediaWiki開発者の場合、これを行うことであなたのgitリポジトリに干渉することはありません。外装の有効化と既定の選択についての情報は、[https://www.mediawiki.org/wiki/Manual:Skin_configuration マニュアル:外装設定] をご覧ください。",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (有効)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''無効''')",
        "mediastatistics": "メディア統計",
        "special-characters-group-khmer": "クメール文字",
        "special-characters-title-endash": "en ダッシュ",
        "special-characters-title-emdash": "em ダッシュ",
-       "special-characters-title-minus": "マイナス記号"
+       "special-characters-title-minus": "マイナス記号",
+       "mw-widgets-titleinput-description-new-page": "ページは存在しません",
+       "mw-widgets-titleinput-description-redirect": "$1 へのリダイレクト"
 }
index 31a11c0..36d18d4 100644 (file)
@@ -22,7 +22,8 @@
                        "The Evil IP address",
                        "VASANTH S.N.",
                        "לערי ריינהארט",
-                       "아라"
+                       "아라",
+                       "Pavanaja"
                ]
        },
        "tog-underline": "ಕೊಂಡಿಗಳ ಕೆಳಗೆ ಗೆರೆ ತೋರಿಸಿ",
        "mailerror": "ಅಂಚೆ ಕಳುಹಿಸುವಲ್ಲಿ ದೋಷ: $1",
        "acct_creation_throttle_hit": "ಕ್ಷಮಿಸಿ, ನೀವಾಗಲೇ{{PLURAL:$1|೧ ಖಾತೆಯನ್ನು|$1 ಖಾತೆಗಳನ್ನು}} ತೆರೆದಿದ್ದೀರಿ.\nಇನ್ನು ಹೆಚ್ಚಿನ ಖಾತೆಗಳನ್ನು ತೆರೆಯಲಾಗುವುದಿಲ್ಲ.",
        "emailauthenticated": "ನಿಮ್ಮ ಇ-ಅಂಚೆ ವಿಳಾಸವು ದಿನಾಂಕ $2 ಸಮಯ $3 ಅಂದು ಧೃಡೀಕೃತವಾಗಿದೆ.",
-       "emailnotauthenticated": "ನಿಮà³\8dಮ à²\87-à²\85à²\82à²\9aà³\86 à²µà²¿à²³à²¾à²¸ à²\87ನà³\8dನà³\82 à²§à³\83ಡà³\80à²\95à³\83ತವಾà²\97ಿಲà³\8dಲ.\nà²\88 à²\95à³\86ಳà²\97ಿನ à²µà³\88ಶಿಷà³\8dà²\9fತೆಗಳಿಗೆ ಇ-ಅಂಚೆಯನ್ನು ನಿಮಗೆ ಕಳುಹಿಸಲು ಆಗುವುದಿಲ್ಲ.",
+       "emailnotauthenticated": "ನಿಮà³\8dಮ à²\87-à²\85à²\82à²\9aà³\86 à²µà²¿à²³à²¾à²¸ à²\87ನà³\8dನà³\82 à²§à³\83ಡà³\80à²\95à³\83ತವಾà²\97ಿಲà³\8dಲ.\nà²\88 à²\95à³\86ಳà²\97ಿನ à²\86ಯà³\8dà²\95ೆಗಳಿಗೆ ಇ-ಅಂಚೆಯನ್ನು ನಿಮಗೆ ಕಳುಹಿಸಲು ಆಗುವುದಿಲ್ಲ.",
        "noemailprefs": "ಈ ಸೌಲಭ್ಯಗಳು ಕೆಲಸ ಮಾಡಬೇಕಾದರೆ ಒಂದು ಇ-ಅಂಚೆ ವಿಳಾಸವನ್ನು ನಮೂದಿಸಿ.",
        "emailconfirmlink": "ನಿಮ್ಮ ಇ-ಅಂಚೆ ವಿಳಾಸವನ್ನು ಧೃಡೀಕರಿಸಿ",
        "invalidemailaddress": "ಈ ಇ-ಅಂಚೆ ವಿಳಾಸವು ಸರಿಯಾದ ಪ್ರಕಾರದಲ್ಲಿ ಇಲ್ಲದಿರುವುದರಿಂದ ಇದನ್ನು ಸ್ವೀಕಾರ ಮಾಡಲಾಗುವುದಿಲ್ಲ.\nದಯವಿಟ್ಟು ಸರಿಯಾದ ಪ್ರಕಾರದ ವಿಳಾಸವನ್ನು ಸೇರಿಸಿ ಅಥವ ಆ ಚೌಕವನ್ನು ಖಾಲಿ ಬಿಡಿ.",
        "nlinks": "$1 {{PLURAL:$1|ಸಂಪರ್ಕ|ಸಂಪರ್ಕಗಳು}}",
        "nmembers": "$1 {{PLURAL:$1|ಸದಸ್ಯ|ಸದಸ್ಯರು}}",
        "nrevisions": "$1 {{PLURAL:$1|ಬದಲಾವಣೆ|ಬದಲಾವಣೆಗಳು}}",
-       "nviews": "$1 {{PLURAL:$1|ನೋಟ|ನೋಟಗಳು}}",
        "lonelypages": "ಒಬ್ಬಂಟಿ ಪುಟಗಳು",
        "lonelypagestext": "ಈ ಕೆಳಗಿನ ಪುಟಗಳು {{SITENAME}} ಅಲ್ಲಿರುವ ಇತರ ಯಾವ ಪುಟದಿಂದಲೂ ಕೊಂಡಿಯನ್ನು ಹೊಂದಿಲ್ಲ.",
        "uncategorizedpages": "ಅವರ್ಗೀಕೃತ ಪುಟಗಳು",
index af04196..72d3fb7 100644 (file)
        "tog-numberheadings": "سأربألگە خود شمارئشت کو",
        "tog-showtoolbar": "نأڤار أڤزار ڤیرایئشت نە نئشو بیە",
        "tog-editondblclick": "بألگە یا نە ڤا د نۊ پوٙرنیئن ڤیرایئشت بأکیت",
-       "tog-editsectiononrightclick": "بهرجا ویرایشت نه وا راس پورنین د بهرجا داسونیا کنشتگر کو",
-       "tog-watchcreations": "بلگیایی که مه راس کمه و جانیایایی که مه سوار کمه اضاف کو د سیل برگه مه",
-       "tog-watchdefault": "بلگیا و جانیایی که مه ویرایشت کمه اضاف کو د سیل برگم",
-       "tog-watchmoves": "بلگیاو جانیایی  که مه جاوه جا کمه د سیل برگم اضاف کو",
-       "tog-watchdeletion": "بلگیا و جانیایی که مه پاک کمه اضاف کو د سیل برگم",
+       "tog-editsectiononrightclick": "بأرجا ڤیرایئشت نە ڤا راس پوٙرنییئن د بأرجا داسوٙنیا کونئشتگأر کو",
+       "tog-watchcreations": "بألگە یایی کئ مئ رأڤأندیاری کئمە و جانیایی کئ مئ سوڤار کئمە ئضاف کو د سئیل بأرگە مئ",
+       "tog-watchdefault": "بألگە یایی کئ مئ رأڤأندیاری کئمە و جانیایی کئ مئ سوڤار کئمە ئضاف کو د سئیل بأرگە مئ",
+       "tog-watchmoves": "بألگە یایی و جانیایی کئ مئ جا ڤئ جا کئمە ئضاف کو د سئیل بأرگە مئ",
+       "tog-watchdeletion": "بألگە یایی و جانیایی کئ مئ پاکسا کئمە ئضاف کو د سئیل بأرگە مئ",
        "tog-watchrollback": "همه بلگه یا نه د جایی که مه د سیل برگم می کم اضاف کو.",
        "tog-minordefault": "همه ویرایشتیا کؤچک نه وا پیش فرض بیئن نشو دار کو.",
        "tog-previewontop": "پیش سیل نه دما جعوه ویرایشت نشو بیئه",
@@ -47,8 +47,8 @@
        "tog-norollbackdiff": "فرخیا نه د بین بوریت نها یه گل عقو گرد کردن",
        "tog-useeditwarning": "د گاتی که آلشتیا اماییه نبیه د بلگه ویرایشت وه جا می نم خورم کو",
        "tog-prefershttps": "همیشه د گاتی که مه وامئن هئم د ارتواط امن وه کار بیئر",
-       "underline-always": "هميشه",
-       "underline-never": "هيژوخت",
+       "underline-always": "هأمیشە",
+       "underline-never": "هیژڤأخت",
        "underline-default": "پوسه یا دوارته نیئر پیش فرض",
        "editfont-style": "راساگه فونت شلک نه ویرایشت کو",
        "editfont-default": "دوارته نیئر پیش بینی بیه",
index e848ea5..6c8ecb0 100644 (file)
        "preview": "Seng khoàⁿ-māi",
        "showpreview": "Seng khoàⁿ-māi",
        "showdiff": "Khòaⁿ kái-piàn ê pō·-hūn",
-       "anoneditwarning": "'''Kéng-kò:''' Lí bô teng-ji̍p. Lí ê IP chū-chí ē kì tī pún ia̍h ê pian-chi̍p le̍k-sú lāi-bīn.",
+       "anoneditwarning": "'''thê-chhíⁿ:''' Lí bô teng-ji̍p. Lí nā ū kái mi̍h-kiāⁿ, lí ê IP ē hô͘ lâng khoàⁿ tio̍h. Lí nā <strong>[$1 teng-ji̍p]</strong> iah-sī <strong>[$2 khui chi̍t-ê kháu-chō]</strong>; lí kái ê mi̍h-kiāⁿ ē kái kì lí ê kháu-chō-miâ. Mā ū kî-thaⁿ ê hó-chhù.",
        "summary-preview": "Khài-iàu ê preview:",
        "subject-preview": "Ū-lám tê-bo̍k/piau-tê:",
        "blockednoreason": "無寫理由",
        "yourdiff": "Chha-pia̍t",
        "readonlywarning": "'''CHÙ-Ì: Chu-liāu-khò· taⁿ só tiâu leh thang pān î-siu khang-khòe, só·-í lí hiān-chú-sî bô thang pó-chûn jīn-hô phian-chi̍p hāng-bo̍k. Lí ē-sái kā siong-koan pō·-hūn tah--ji̍p-khì 1-ê bûn-jī tóng-àn pó-chûn, āu-chhiú chiah koh kè-sio̍k.'''",
        "protectedpagewarning": "'''KÉNG-KÒ: Pún ia̍h só tiâu leh. Kan-taⁿ ū hêng-chèng te̍k-koân ê iōng-chiá (sysop) ē-sái siu-kái.'''",
-       "templatesused": "Chit ia̍h iōng {{PLURAL:$1| ê pang-bô·| ê pang-bô·}} :",
+       "templatesused": "Chit ia̍h iōng {{PLURAL:$1| ê pang-bô·}} :",
        "templatesusedpreview": "Chit ê preview iōng chia ê pang-bô͘:",
        "templatesusedsection": "Chit ê section iōng chia ê pang-bô͘:",
        "template-protected": "(pó-hō͘)",
        "filehist-current": "hiān-chāi",
        "filehist-datetime": "Ji̍t-kî/ Sî-kan",
        "filehist-thumb": "細張圖",
+       "filehist-thumbtext": "$1版本的細圖",
        "filehist-user": "Iōng-chiá",
        "imagelinks": "tóng-àn sù-iōng ê chōng-hòng",
-       "linkstoimage": "ē-kha $1 ê ia̍h ū iōng tio̍h chit ê iáⁿ-siōng:",
+       "linkstoimage": "ē-kha {{PLURAL:$1|ê ia̍h}} ū iōng tio̍h chit ê iáⁿ-siōng:",
        "nolinkstoimage": "Bô poàⁿ ia̍h liân kàu chit tiuⁿ iáⁿ-siōng.",
        "mimesearch": "MIME chhiau-chhoē",
        "unwatchedpages": "Bô lâng kàm-sī ê ia̍h",
        "nbytes": "$1 {{PLURAL:$1|jī-goân|jī-goân}}",
        "ncategories": "$1 {{PLURAL:$1|ê lūi-pia̍t |ê lūi-pia̍t}}",
        "nlinks": "$1 ê liân-kiat",
-       "nmembers": "$1{{PLURAL:$1|ê sêng-oân|ê sêng-oân}}",
+       "nmembers": "$1{{PLURAL:$1|ê sêng-oân}}",
        "nrevisions": "$1 ê siu-tēng-pún",
        "lonelypages": "Ko·-ia̍h",
        "uncategorizedpages": "Bô lūi-pia̍t ê ia̍h",
        "tooltip-t-permalink": "Chi̍t ia̍h kái--koè pán-pún ê éng-kiú liân-kiat",
        "tooltip-ca-nstab-main": "khoàⁿ ia̍h ê loē-iông",
        "tooltip-ca-nstab-user": "Khoàⁿ iōng-chiá ê Ia̍h",
+       "tooltip-ca-nstab-special": "這是一个特殊頁,你袂使改這頁。",
        "tooltip-ca-nstab-image": "Khoàⁿ tóng-àn ia̍h",
        "tooltip-ca-nstab-category": "Khoàⁿ lūi-pia̍t ia̍h",
        "tooltip-minoredit": "記這是一个小改",
        "markaspatrolleddiff": "Phiau-sī sûn--kòe",
        "markedaspatrolledtext": "Í-keng phiau-sī chit ê siu-tēng-pún ū lâng sûn--kòe.",
        "deletedrevision": "Kū siu-tēng-pún $1 thâi-tiāu ā.",
-       "previousdiff": "← Khì chêng 1 ê diff",
-       "nextdiff": "Khì āu 1 ê diff →",
+       "previousdiff": "← 進前改的",
+       "nextdiff": "新改的 →",
        "imagemaxsize": "Iáⁿ-siōng biô-su̍t-ia̍h ê tô· ke̍k-ke hián-sī jōa tōa tiuⁿ:",
        "thumbsize": "Sok-tô· (thumbnail) jōa tōa tiuⁿ:",
        "file-nohires": "Bô khah koân ê kái-sek-tō͘.",
index f6025d8..70e0ff5 100644 (file)
        "hidetoc": "लुकाउनुहोस्",
        "collapsible-collapse": "खुम्च्याउने",
        "collapsible-expand": "फैलाउ",
-       "confirmable-confirm": "तपाà¤\88à¤\82 {{GENDER:$1|लिà¤\99à¥\8dà¤\97}} à¤¹à¥\8b?",
+       "confirmable-confirm": "à¤\95à¥\87 {{GENDER:$1|तपाà¤\88à¤\82}} à¤¸à¥\81निशà¥\8dà¤\9aित à¤¹à¥\81नà¥\81हà¥\81नà¥\8dà¤\9b ?",
        "confirmable-yes": "हो",
        "confirmable-no": "होइन",
        "thisisdeleted": "$1 हेर्ने या पूर्वरुपमा फर्काउने हो?",
        "yourtext": "तपाईंका पाठहरु",
        "storedversion": "संग्रहित पुनरावलोकन",
        "nonunicodebrowser": "<strong>चेतावनी: तपाईंको ब्राउजर युनिकोडलाई स्वीकार गर्दैन।</strong> \nतपाईंद्वारा सहि रुपले पृष्ठ सम्पादनको लागि: गैर-एयससिआइआइ क्यारेक्टर हेक्जाडेसिमल कोड (hexadecimal) मा देखाइनेछ।",
-       "editingold": "<strong>चेतावनी: तपाईं यस पृष्ठको अति पुरनो अप्रचलित संशोधनलाई सम्पादन गर्नुहुँदैछ।<strong>\nयदि तपाईंले यस परिवर्तनलाई सङ्ग्रह गर्नु भयो भने यस पछिका संशोधनहरू नष्ट हुनेछन्।",
+       "editingold": "<strong>à¤\9aà¥\87तावनà¥\80: à¤¤à¤ªà¤¾à¤\88à¤\82 à¤¯à¤¸ à¤ªà¥\83षà¥\8dठà¤\95à¥\8b à¤\85ति à¤ªà¥\81रानà¥\8b à¤\85पà¥\8dरà¤\9aलित à¤¸à¤\82शà¥\8bधनलाà¤\88 à¤¸à¤®à¥\8dपादन à¤\97रà¥\8dनà¥\81हà¥\81à¤\81दà¥\88à¤\9b।<strong>\nयदि à¤¤à¤ªà¤¾à¤\88à¤\82लà¥\87 à¤¯à¤¸ à¤ªà¤°à¤¿à¤µà¤°à¥\8dतनलाà¤\88 à¤¸à¤\99à¥\8dà¤\97à¥\8dरह à¤\97रà¥\8dनà¥\81 à¤­à¤¯à¥\8b à¤­à¤¨à¥\87 à¤¯à¤¸ à¤ªà¤\9bिà¤\95ा à¤¸à¤\82शà¥\8bधनहरà¥\82 à¤¨à¤·à¥\8dà¤\9f à¤¹à¥\81नà¥\87à¤\9bनà¥\8d।",
        "yourdiff": "भिन्नताहरु",
        "copyrightwarning": "कृपया ध्यान दिनुहोस् यस {{SITENAME}}मा दिइएका योगदानहरू $2को अनुसार सम्पादन र पुनर्वितरणकोलागि खुला मानिनेछ (विवरणकोलागि $1 हेर्नुहोस्) । यदि तपाईंको लेखलाई सम्पादन अथवा पुनः वितरण गराउन चाहनुहुन्न भने कृपया यहाँ तपाईंको लेख प्रस्तुत नगर्नुहोस् ।<br />       \nयदि तपाईं किटानसाथ भन्नुहुन्छ कि कुनै लेख मैले लेखेको हो अथवा सार्वजनिक ज्ञानक्षेत्र अथवा मुक्त संसाधनबाट लिइएको हो, '''यस्तो लेख कपिराइटबिना यहाँ नराख्नुहोस्!'''",
-       "copyrightwarning2": "à¤\95à¥\83पया à¤§à¥\8dयान à¤¦à¤¿à¤¨à¥\81हà¥\8bसà¥\8d à¤¯à¤¸ {{SITENAME}}मा à¤¦à¤¿à¤\87à¤\8fà¤\95ा à¤¯à¥\8bà¤\97दानहरà¥\81लाà¤\88 à¤\85नà¥\8dय à¤¯à¥\8bà¤\97दाताहरà¥\81दà¥\8dवारा à¤¸à¤®à¥\8dपादन à¤\97रिनà¥\87à¤\9b, à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤\97रिनà¥\87à¤\9b à¤\85थवा à¤¹à¤\9fाà¤\87नà¥\87à¤\9b। à¤¯à¤¦à¤¿  à¤¤à¤ªà¤¾à¤\88à¤\82à¤\95à¥\8b à¤²à¥\87à¤\96लाà¤\88 à¤¨à¤¿à¤°à¥\8dदयता à¤ªà¥\82रà¥\8dवà¤\95 à¤¸à¤®à¥\8dपादन à¤\97रà¥\87à¤\95à¥\8b à¤\9aाहनà¥\81हà¥\81नà¥\8dन à¤­à¤¨à¥\87à¤\82 à¤¤à¥\8dयà¥\8b à¤¯à¤¹à¤¾à¤\81 à¤¨à¤¦à¤¿à¤¨à¥\81हà¥\8bसà¥\8d।<br />\nयदि à¤¤à¤ªà¤¾à¤\88à¤\82 à¤\95िà¤\9fानसाथ à¤­à¤¨à¥\8dनà¥\81हà¥\81नà¥\8dà¤\9b à¤\95ि à¤¯à¥\8b à¤²à¥\87à¤\96 à¤¤à¤ªà¤¾à¤\88à¤\82 à¤\86फà¥\88 लेखेको हो अथवा सार्वजनिक ज्ञानक्षेत्र अथवा मुक्त संसाधनबाट लिइएको हो (विवरणकोलागि हेर्नुहोस् $1 ). \n'''कपीराइट भएको रचना अनुमति बिना  यहाँ नदिनुहोस्!'''",
+       "copyrightwarning2": "à¤\95à¥\83पया à¤§à¥\8dयान à¤¦à¤¿à¤¨à¥\81हà¥\8bसà¥\8d à¤¯à¤¸ {{SITENAME}}मा à¤¦à¤¿à¤\87à¤\8fà¤\95ा à¤¯à¥\8bà¤\97दानहरà¥\82लाà¤\88 à¤\85नà¥\8dय à¤¯à¥\8bà¤\97दानà¤\95रà¥\8dताहरà¥\82दà¥\8dवारा à¤¸à¤®à¥\8dपादन à¤\97रिनà¥\87à¤\9b, à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤\97रिनà¥\87à¤\9b à¤\85थवा à¤¹à¤\9fाà¤\87नà¥\87à¤\9b। à¤¯à¤¦à¤¿ à¤¤à¤ªà¤¾à¤\88à¤\82à¤\95à¥\8b à¤²à¥\87à¤\96लाà¤\88 à¤¨à¤¿à¤°à¥\8dदयता à¤ªà¥\82रà¥\8dवà¤\95 à¤¸à¤®à¥\8dपादन à¤\97रà¥\87à¤\95à¥\8b à¤\9aाहनà¥\81हà¥\81नà¥\8dन à¤­à¤¨à¥\87 à¤¤à¥\8dयà¥\8b à¤¯à¤¹à¤¾à¤\81 à¤¨à¤¦à¤¿à¤¨à¥\81हà¥\8bसà¥\8d।<br />\nयदि à¤¤à¤ªà¤¾à¤\88à¤\82 à¤\95िà¤\9fानसाथ à¤­à¤¨à¥\8dनà¥\81हà¥\81नà¥\8dà¤\9b à¤\95ि à¤¯à¥\8b à¤²à¥\87à¤\96 à¤¤à¤ªà¤¾à¤\88à¤\82 à¤\86फà¥\88लà¥\87 लेखेको हो अथवा सार्वजनिक ज्ञानक्षेत्र अथवा मुक्त संसाधनबाट लिइएको हो (विवरणकोलागि हेर्नुहोस् $1 ). \n'''कपीराइट भएको रचना अनुमति बिना  यहाँ नदिनुहोस्!'''",
        "longpageerror": "'''त्रुटि: तपाईंले बुझाएको पाठ {{PLURAL:$1|one किलोबाइट|$1 किलोबाइट}} लामो छ, जो अधिकतम {{PLURAL:$2|one किलोबाइट|$2 किलोबाइट}} भन्दा लामो छ।'''\nयो संग्रहित हुन सक्तैन।",
-       "readonlywarning": "<strong>चेतावनी: तथ्याक मर्मतको निम्ति बन्द गरिएकोछ, यस कारण तपाईं आफ्नो सम्पादन अहिले सङ्ग्रह गर्न सक्नुहुन्न।</strong>\n\nयदि तपाईं चाहनुहुन्छ भने अहिले यहाँ भएका पाठलाई कट गरि कतै टेक्स्ट फाइलमा पेस्ट गरेर सङ्ग्रह गर्न सक्नुहुन्छ।\n\nप्रवन्धक जसले यो बन्द गरेको छ उसले यस्तो विवरण दिएको छ: $1",
+       "readonlywarning": "<strong>à¤\9aà¥\87तावनà¥\80: à¤¤à¤¥à¥\8dयाà¤\99à¥\8dà¤\95 à¤®à¤°à¥\8dमतà¤\95à¥\8b à¤¨à¤¿à¤®à¥\8dति à¤¬à¤¨à¥\8dद à¤\97रिà¤\8fà¤\95à¥\8bà¤\9b, à¤¯à¤¸ à¤\95ारण à¤¤à¤ªà¤¾à¤\88à¤\82 à¤\86फà¥\8dनà¥\8b à¤¸à¤®à¥\8dपादन à¤\85हिलà¥\87 à¤¸à¤\99à¥\8dà¤\97à¥\8dरह à¤\97रà¥\8dन à¤¸à¤\95à¥\8dनà¥\81हà¥\81नà¥\8dन।</strong>\n\nयदि à¤¤à¤ªà¤¾à¤\88à¤\82 à¤\9aाहनà¥\81हà¥\81नà¥\8dà¤\9b à¤­à¤¨à¥\87 à¤\85हिलà¥\87 à¤¯à¤¹à¤¾à¤\81 à¤­à¤\8fà¤\95ा à¤ªà¤¾à¤ à¤²à¤¾à¤\88 à¤\95à¤\9f à¤\97रि à¤\95तà¥\88 à¤\9fà¥\87à¤\95à¥\8dसà¥\8dà¤\9f à¤«à¤¾à¤\87लमा à¤ªà¥\87सà¥\8dà¤\9f à¤\97रà¥\87र à¤¸à¤\99à¥\8dà¤\97à¥\8dरह à¤\97रà¥\8dन à¤¸à¤\95à¥\8dनà¥\81हà¥\81नà¥\8dà¤\9b।\n\nपà¥\8dरवनà¥\8dधà¤\95 à¤\9cसलà¥\87 à¤¯à¥\8b à¤¬à¤¨à¥\8dद à¤\97रà¥\87à¤\95à¥\8b à¤\9b à¤\89सलà¥\87 à¤¯à¤¸à¥\8dतà¥\8b à¤µà¤¿à¤µà¤°à¤£ à¤¦à¤¿à¤\8fà¤\95à¥\8b à¤\9b: $1",
        "protectedpagewarning": "<strong>सूचना: यस पृष्ठलाई सुरक्षित गरिएको छ यसकारण प्रवन्धकको विशेषाधिकार प्राप्त प्रयोगकर्ताहरूले मात्र यसलाई सम्पादन गर्न सक्छन् ।</strong>\nसन्दर्भको लागि नविनतम लग प्रविष्टि तल दिइएको छ:",
        "semiprotectedpagewarning": "<strong>सूचना:</strong> यो पृष्ठलाई सुरक्षित गरिएको हुँदा दर्ता भएका प्रयोगकर्ताहरूले मात्र यसलाई सम्पादन गर्न सक्छन् ।\nसन्दर्भको लागि नविनतम लग प्रविष्टि तल दिइएको छ:",
        "cascadeprotectedwarning": "<strong>चेतावनी:</strong> यस पृष्ठलाई सुरक्षित गरिएको छ यसकारण संशोधन प्रवन्धनको विशेषाधिकार प्राप्त प्रयोगकर्ताले मात्र सम्पादन गर्न सक्नेछन् किन भने यो {{PLURAL:$1|पृष्ठ|पृष्ठहरू}}को सुरक्षित निम्न सूचीमा सुरक्षित छ:",
        "content-failed-to-parse": "$1 को लागि $2 सामग्रीलाई पार्स गर्न विफल, त्रुटि: $3",
        "invalid-content-data": "अमान्य सामग्री डेटा",
        "content-not-allowed-here": "सामग्री \"$1\"  [[$2]] पृष्ठमा राख्न अनुमती छैन ।",
-       "editwarning-warning": "यस à¤ªà¥\83षà¥\8dठबाà¤\9f à¤¬à¤¾à¤¹à¤¿à¤° à¤\9cाà¤\81दा à¤¤à¤ªà¤¾à¤\88à¤\82 à¤¦à¥\8dवारा à¤\97रिà¤\8fà¤\95à¥\8b à¤\95à¥\81नà¥\88 à¤\95à¥\8bà¤\88 à¤ªà¤¨à¤¿ à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤¹à¤°à¤¾à¤\89नà¥\87à¤\9b।\nयदि à¤¤à¤ªà¤¾à¤\88à¤\82लà¥\87 à¤²à¤\97 à¤\87न à¤\97रà¥\8dनà¥\81भà¤\8fà¤\95à¥\8b à¤\9b à¤­à¤¨à¥\87 à¤¤à¤ªà¤¾à¤\88à¤\82 à¤¯à¤¸ à¤¸à¥\82à¤\9aनालाà¤\88 à¤¦à¥\87à¤\96ाà¤\89न à¤\86फà¥\8dनà¥\8b à¤\85भिरà¥\82à¤\9aà¥\80हरà¥\82à¤\95à¥\8b \"{{int:prefs-editing}}\" à¤­à¤¾à¤\97मा à¤\97à¤\8fर à¤¬à¤¨à¥\8dद à¤\97रà¥\8dन à¤¸à¤\95à¥\8dनà¥\81हà¥\81नà¥\8dà¤\9b।",
+       "editwarning-warning": "यà¥\8b à¤ªà¥\83षà¥\8dठबाà¤\9f à¤¬à¤¾à¤¹à¤¿à¤° à¤\9cाà¤\81दा à¤¤à¤ªà¤¾à¤\88à¤\82 à¤¦à¥\8dवारा à¤\97रिà¤\8fà¤\95à¥\8b à¤\95à¥\81नà¥\88 à¤ªà¤¨à¤¿ à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤¹à¤°à¤¾à¤\89नà¥\87à¤\9b।\nयदि à¤¤à¤ªà¤¾à¤\88à¤\82लà¥\87 à¤²à¤\97 à¤\87न à¤\97रà¥\8dनà¥\81भà¤\8fà¤\95à¥\8b à¤\9b à¤­à¤¨à¥\87 à¤¤à¤ªà¤¾à¤\88à¤\82 à¤¯à¤¸ à¤¸à¥\82à¤\9aनालाà¤\88 à¤¦à¥\87à¤\96ाà¤\89न à¤\86फà¥\8dनà¥\8b à¤\85भिरà¥\82à¤\9aà¥\80हरà¥\82à¤\95à¥\8b \"{{int:prefs-editing}}\" à¤­à¤¾à¤\97मा à¤\97à¤\8fर à¤¬à¤¨à¥\8dद à¤\97रà¥\8dन à¤¸à¤\95à¥\8dनà¥\81हà¥\81नà¥\8dà¤\9b।",
        "editpage-notsupportedcontentformat-title": "सामग्री प्रकार समर्थित छैन",
        "editpage-notsupportedcontentformat-text": "$1 सामग्री स्वरूप $2 सामग्री मोडलद्वारा समर्थित छैन।",
        "content-model-wikitext": "विकिपाठ",
        "largefileserver": "उर्ध्वभरण गरिएको फाइल सर्भरमा निर्धारित सीमा भन्दा ठूलो छ।",
        "emptyfile": "तपाईले उर्ध्वभरण गर्नुभएको फाइल रित्तो छ।\nयो फाइलनाम गलत राखिएको कारणले भएको हुनसक्छ\nयो फाइल साच्चै उर्ध्वभरण गर्नेकुरामा निश्चित हुनुहोस् ।",
        "windows-nonascii-filename": "विशेष वर्ण सहितका फाइलनामहरु यस विकिद्वारा समर्थित छैनन् ।",
-       "fileexists": "यो नामको फाइल पहिले नैं छ, यदि तपाईं परिवर्तन गर्ने कुरामा सुनिश्चित हुनुहुन्न भने कृपया <strong>[[:$1]]</strong> जाँच गर्नुहोस्।\n[[$1|thumb]]",
+       "fileexists": "यो नामको फाइल पहिले नैं छ, यदि तपाईं परिवर्तन गर्ने कुरामा सुनिश्चित हुनुहुन्न भने कृपया <strong>[[:$1]]</strong> जाँच गर्नुहोस्।\n[[$1|thumb]]",
        "filepageexists": "यस फाइलको लागि विवरण पृष्ठ पहिले नै <strong>[[:$1]]</strong> बनाइ सकिएको छ, तर यस नामको कुनै फाइल अहिले उपस्थित छैन। \nतपाईं जुन विवरण दिनुहुन्छ त्यो विवरण पृष्ठमा देखिंदैन। \nतपाईंको आफ्नो विवरणलाई त्यहाँ राख्न म्यानुअली सम्पादन गर्नु पर्नेछ।\n[[$1|thumb]]",
        "fileexists-extension": "यहि नामको एउटा फाइल पहिलेदेखि नैं छ: [[$2|thumb]]\n* उर्ध्वभरण हुँदै गरेको फाइलको नाम: <strong>[[:$1]]</strong>\n* पहिलेदेखि नैं भएको फाइलको नाम: <strong>[[:$2]]</strong>\nकृपया अर्कै नाम रोज्नुहोस्।",
        "fileexists-thumbnail-yes": "यो फाइल ठुलो चित्रको सानो आकार ''(थम्बनेल)'' जस्तो देखिन्छ। [[$1|thumb]]\n<strong>[[:$1]]</strong> फाइललाई हेर्ने।\nयदि जाँच गरिएको फाइल यसै आकारको छ भने सानो आकारको फाइल अपलोड गर्ने आवश्यकता छैन।",
        "upload-description": "फाइल वर्णन",
        "upload-options": "उर्ध्वभरण विकल्पहरु",
        "watchthisupload": "यो पृष्ठ निगरानी गर्नुहोस्",
-       "filewasdeleted": "यस नामको एक फाइल पहिले पनि अपलोड गरे पछि हटाई सकिएको छ।\nपुन अपलोड गर्नु पूर्व तपाईं $1 लाई राम्रो सँग जाँच गर्नुहोला।",
+       "filewasdeleted": "यस नामको एक फाइल पहिले पनि अपलोड गरे पछि हटाई सकिएको छ।\nपुनः अपलोड गर्नु पूर्व तपाईं $1 लाई राम्रोसँग जाँच गर्नुहोला।",
        "filename-bad-prefix": "तपाईं जुन फाइल अपलोड गर्दै हुनुहुन्छ त्यसको नाम <strong>\"$1\"</strong>बाट शुरू हुन्छ, जुन डिजिटल क्यामराद्वारा दिइएको नाम हो।\nकृपया यस फाइलको लागि कुनै दोश्रो अधिक जानकारीयुक्त नाम छान्नुहोस्।",
        "upload-success-subj": "उर्ध्वभरण सफल",
        "upload-success-msg": "[$2]बाट त्पाईंको उर्ध्वभरण सफल भयो। त्यो यहाँ पाउन सकिनेछ: [[:{{ns:file}}:$1]]",
        "emailuser-title-target": "{{GENDER:$1|प्रयोगकर्ता}}लाई इमेल गर्ने",
        "emailuser-title-notarget": "प्रयोगकर्तालाई इमेल गर्नुहोस्",
        "emailpage": "प्रयोगकर्तालाई इमेल गर्नुहोस्",
-       "emailpagetext": "तल दिइएको फर्मले तपाईं यस {{GENDER:$1|प्रयोगकर्ता}}लाई इमेल पठाउन सक्नुहुन्छ। तपाईं जुन ठेगाना [[Special:Preferences|आफ्नो प्रयोगकर्ता अभिरूचीहरू]]मा दिनुभएको थियो त्यो यस इमेललाई \"पठाउने\" को रूपमा आउनेछ, अतः प्राप्तकर्ता तपाईंलाई सिधै जवाफ दिनसक्छ।",
+       "emailpagetext": "तल दिइएको फर्मले तपाईं यस {{GENDER:$1|प्रयोगकर्ता}}लाई इमेल पठाउन सक्नुहुन्छ। तपाईंले जुन ठेगाना [[Special:Preferences|आफ्नो प्रयोगकर्ता अभिरूचीहरू]]मा दिनुभएको थियो त्यो यस इमेललाई \"पठाउने\" को रूपमा आउनेछ, अतः प्राप्तकर्ता तपाईंलाई सिधै जवाफ दिनसक्छ।",
        "defemailsubject": "{{SITENAME}} प्रयपोगकर्ता \"$1\" बाट इमेल",
        "usermaildisabled": "प्रयोगकर्ता इमेल निरस्त गरिएको",
        "usermaildisabledtext": "यस विकिमा तपाईं अरु प्रयोगकर्तालाई ई-मेल पठाउन सक्नुहुन्न",
        "ipbnounblockself": "तपाई आफैले आफैलाई रोक खुलाउन सक्नुहुन्न ।",
        "lockdb": "डेटाबेस ताल्चामार्ने",
        "unlockdb": "डेटाबेसको ताल्चा खोल्ने",
-       "lockdbtext": "डेटाबेसमा ताला लगाउनाले सबै प्रयोगकर्ता पृष्ठ सम्पादन, आफ्नो अभिरूचीमा परिवर्तन, आफ्नो ध्यानसूचीमा सम्पादन, र अन्य वस्तु जसको लागि डेटाबेसमा परिवर्तन गरें हुन्छ, त्यसबाट वन्चित हुनेछ। कृपया यो सुनिश्चित गर्नुहोस कि तपाईं यो गर्न चाहनुहुन्छ, र तपाईं रक्षण पश्चात ताला खोल्नुहुन्छ।",
+       "lockdbtext": "डेटाबेसमा ताला लगाउनाले सबै प्रयोगकर्ता पृष्ठ सम्पादन, आफ्नो अभिरूचीमा परिवर्तन, आफ्नो ध्यानसूचीमा सम्पादन, र अन्य वस्तु जसको लागि डेटाबेसमा परिवर्तन गरें हुन्छ, त्यसबाट वन्चित हुनेछ। कृपया यो सुनिश्चित गर्नुहोस् कि तपाईं यो गर्न चाहनुहुन्छ, र तपाईं रक्षण पश्चात ताला खोल्नुहुन्छ ।",
        "unlockdbtext": "डेटाबेसको ताला खोल्नका लागि सबै प्रयोगकर्ता पृष्ठ सम्पादन, आफ्नो अभिरूचीहरूमा परिवर्तन, आफ्नो ध्यानसूचीमा सम्पादन, र अन्य वस्तु जसको लागि डेटाबेसमा परिवर्तन गर्नु पर्छ, को सक्षमतालाई पुनर्स्थापित गर्नछ। कृपया यो सुनिश्चित गर्नुस कि तपाईं यो गर्न चाहनुहुन्छ।",
        "lockconfirm": "हो, म साँच्चिकै डेटाबेस थुन्न चाहन्छु।",
        "unlockconfirm": "हो , म साँच्चै  डेटाबेसको ताल्चा खोल्न चाहन्छु ।",
        "move-page": " $1 लाई सार्ने",
        "move-page-legend": "पृष्ठ सार्नुहोस्",
        "movepagetext": "तल दिएको फारमको उपयोगले पृष्ठ नाम परिवर्तन हुनेछ र पृष्ठको सम्पूर्ण इतिहास नयाँ नामको साथमा जानेछ।\nपुरानो शीर्षक नयाँ शीर्षककोलागि अनुप्रेषित पृष्ठ बनिनेछ।\nतपाईंले यो स्वचालित रूपले अनुप्रेषित पृष्ठलाई अपडेट गर्न सक्नुहुनेछ।\nयदि तपाईं हुँदैन चुन्नुहुन्छ भनें जाँचेर सुनिश्चित गर्नुहोस् कि [[Special:DoubleRedirects|दोहोरो]] अथवा [[Special:BrokenRedirects|टुटेको अनुप्रेषण]]।\nतपाईंमाथि यो सुनिश्चित गर्ने उत्तरदायित्व रहन्छ कि लिङ्क कुन विन्दुमा जानु पर्ने हो ।\n\nध्यान दिनुहोस् नयाँ नामको पृष्ठ पहिलेबाट नैं छ भनें पृष्ठ सारिने <strong>छैन</strong>। नयाँ नामको पृष्ठ पहिलेबाट भएर पनि यदि यो खालि छ अथवा अनुप्रेषित छ र सम्पादित इतिहास छैन भनें सारिनेछ।\nयसको अर्थ हुन्छ यदि कुनै गल्ती गरेमा तपाईंले पुनः पुरानै नाम दिनु पर्ने हुन्छ यसलाई अधिलेखन गर्नसक्नु हुनेछैन। \n\n<strong>चेतावनी!</strong>\nयो एक लोकप्रिय पृष्ठको लागि एउटा कठोर र अप्रत्याशित परिवर्तन हुनसक्नेछ;\nकृपया सुनिश्चित गर्नुहोस् कि तपाईंले यसको सही परिणाम बुझ्नु भएको छ अनि मात्र नयाँ नाम दिन अघि बढ्नुहोस्।",
-       "movepagetext-noredirectfixer": "तल दिइएको फारम पृष्ठको नाम परिवर्तन गर्नेछ, उसको सबै इतिहास पनि नयाँ नामले देखिनेछ।\nपुरानो शीर्षक नयाँ नाममा अनुप्रेषण गर्नेछ।\nमूल शीर्षक तर्फ लिएर जाने सबै अनुप्रेषणहरूलाई तपाईं स्वचालित रूपले परिवर्तन गर्न सक्नुहुन्छ।\nयदि तपाईं यसो गर्नुहुन्न भने कृपया [[Special:DoubleRedirects|दोहोरो]] पुनर्निर्देशन वा [[Special:BrokenRedirects|टुटेको पुनर्निर्देशन]]को लागि पक्कै जाँच गर्नुहोस।\nलिङ्क आफ्नो स्थानमै रहोस, यो सुनिश्चित गर्ने जिम्मेवारी तपाईंको हो।\n\nयदि नयाँ शीर्षकको लेख पहिले देखि छ भने स्थानान्तरण '''हुन''' सक्दैन। तर यदि नयाँ शीर्षक भएको लेख खाली छ अथवा कतै अन्य स्थानमा अनुप्रेषित गर्दैछ र साथै उसको पुरानो संस्करण छैन भने त्यो स्थानान्तरण हुनेछ।\nयसको अभिप्राय यो हो कि यदि तपाईंद्वारा गलती भएको छ भने तपाईं फेरी पुरानो नाममा यस पृष्ठलाई स्थानान्तरण गर्न सक्नुहुन्छ, र साथै तपाईं कुनै पहिले देखि रहेको पृष्ठको सट्टा यो स्थानान्तरण गर्न सक्नुहुन्न।\n\n<strong>चेतावनी!<strong>\nयदि पृष्ठ खासै लोकप्रिय छ भने त्यसको लागि यो एउटा ठुलो र अकस्मात परिवर्तन हुन सक्छ;\nअगाडी बढ्नु भन्दा पहिले तपाईं यसको नतिजासँग परिचित हुनुहुन्छ।",
+       "movepagetext-noredirectfixer": "तल दिइएको फारमले पृष्ठको नाम परिवर्तन गर्नेछ, उसको सबै इतिहास पनि नयाँ नामले देखिनेछ ।\nपुरानो शीर्षक नयाँ नाममा अनुप्रेषण गर्नेछ ।\nमूल शीर्षक तर्फ लिएर जाने सबै अनुप्रेषणहरूलाई तपाईं स्वचालित रूपले परिवर्तन गर्न सक्नुहुन्छ ।\nयदि तपाईं यसो गर्नुहुन्न भने कृपया [[Special:DoubleRedirects|दोहोरो]] पुनर्निर्देशन वा [[Special:BrokenRedirects|टुटेको पुनर्निर्देशन]]को लागि पक्कै जाँच गर्नुहोस् ।\nलिङ्क आफ्नो स्थानमै रहोस्, यो सुनिश्चित गर्ने जिम्मेवारी तपाईंको हो ।\n\nयदि नयाँ शीर्षकको लेख पहिले देखि छ भने नाम परिवर्तन '''हुन''' सक्दैन । तर यदि नयाँ शीर्षक भएको लेख खाली छ अथवा कतै अन्य स्थानमा अनुप्रेषित गर्दैछ र साथै उसको पुरानो संस्करण छैन भने त्यसको नाम परिवर्तन हुनेछ ।\nयसको अभिप्राय यो हो कि यदि तपाईंद्वारा गल्ती भएको छ भने तपाईं फेरी पुरानो नाममा यस पृष्ठलाई सार्न सक्नुहुन्छ, र साथै तपाईं कुनै पहिले देखि रहेको पृष्ठको सट्टा यो स्थानान्तरण गर्न सक्नुहुन्न।\n\n<strong>चेतावनी!<strong>\nयदि पृष्ठ खासै लोकप्रिय छ भने त्यसको लागि यो एउटा ठुलो र अकस्मात परिवर्तन हुन सक्छ;\nअगाडी बढ्नु भन्दा पहिले तपाईं यसको नतिजासँग परिचित हुनुहुन्छ।",
        "movepagetalktext": "संबद्ध वार्तालाप पृष्ठ स्वतः योसित जानेछ '''यदि'''\n* नयाँ नामको पृष्ठको वार्तालाप पृष्ठ रिक्त छैन अथवा\n* तपाईंले यसको सन्दूकमा अनचेक गर्नुहुन्छ भनें '''वार्तालाप पृष्ठ जानेछैन'''। \n\nयस्तो भएमा, तपाईंको इच्छाले आफैंले (manually) पृष्ठ सार्नु अथवा मिलाउनु पर्ने हुन्छ।",
        "movearticle": "पृष्ठ सार्नुहोस्",
        "moveuserpage-warning": "'''चेतावनी:''' तपाईंले प्रयोगकर्ता पृष्ठ सार्न आँट्नु भएकोछ। कृपया याद राख्नुहोस् पृष्ठ मात्र सारिने छ र प्रयोगकर्ताको अर्को नाम राख्न '''सकिंदैन'''।",
        "move-over-sharedrepo": "==फाइल पहिले देखि छ==\n[[$1]] एक साझा भण्डारमा पहिले देखि नै छ। यस नामको स्थानान्तरणले नयाँ फाइल साझा फाइललाई ओभरराइड गर्नेछ।",
        "file-exists-sharedrepo": "छानिएको फाइल नाम पहिले देखि नै साझा भण्डारमा प्रयोगमा छ। कृपया अन्य नाम छान्नुहोस्।",
        "export": "पृष्ठहरू निर्यात गर्ने",
-       "exporttext": "तपाईं विशिष्ठ पृष्ठको विषय वस्तु र सम्पादन इतिहासलाई निर्यात गर्न सक्नुहुन्छ अथवा पृष्ठहरूको समूहका केहि XML मा बेर्न सक्नुहुन्छ।\nयो [[Special:Import|आयात पृष्ठ]]को सहायताले मीडियाविकीको प्रयोग गरेर दोश्रो विकीबाट आयात गर्न सकिनेछ।\n\nपृष्ठहरूको निर्यात गर्नका लागि, तल विषय वस्तु बाकसमा शीर्षक दिनुहोस, एक शीर्षक प्रति पङ्क्ति, र छान्नुहोस् कि तपाईं वर्तमान अवतरणसँग पुरानै अवतरण पनि चाहनुहुन्छ वा चाहनुहुन्न, वा पछिल्लो सम्पादनको बारेमा जानकारीसँग मात्रै वर्तमान अवतरण चाहनुहुन्छ।\n\nपछीको स्थितिको लागि तपाईं लिङ्कको पनि प्रयोग गर्न सक्नुहुन्छ, उदाहरणको लागि, \"[[{{MediaWiki:Mainpage}}]]\" पृष्ठको लागि [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]]।",
+       "exporttext": "तपाईं विशिष्ठ पृष्ठको विषय वस्तु र सम्पादन इतिहासलाई निर्यात गर्न सक्नुहुन्छ अथवा पृष्ठहरूको समूहका केहि XML मा बेर्न सक्नुहुन्छ।\nयो [[Special:Import|आयात पृष्ठ]]को सहायताले मीडियाविकीको प्रयोग गरेर दोश्रो विकीबाट आयात गर्न सकिनेछ।\n\nपृष्ठहरूको निर्यात गर्नका लागि, तल विषय वस्तु बाकसमा शीर्षक दिनुहोस, एक शीर्षक प्रति पङ्क्ति, र छान्नुहोस् कि तपाईं वर्तमान अवतरणसँग पुरानै अवतरण पनि चाहनुहुन्छ वा चाहनुहुन्न, वा पछिल्लो सम्पादनको बारेमा जानकारीसँग मात्रै वर्तमान अवतरण चाहनुहुन्छ।\n\nपछीको स्थितिको लागि तपाईं लिङ्कको पनि प्रयोग गर्न सक्नुहुन्छ, उदाहरणको लागि, \"[[{{MediaWiki:Mainpage}}]]\" पृष्ठको लागि [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]]।",
        "exportall": "सबै पृष्ठहरू निर्यात गर्ने",
        "exportcuronly": "हालको संस्करण मात्र थप्ने ,पूरा इतिहास हैन",
        "exportnohistory": "----\n<strong>सूचना:</strong> यस फारमको प्रयोग गरेर पृष्ठको पुरै इतिहास निर्यात गर्दा प्रदर्शन कारणले अक्षम गरिएको छ।",
        "tags-delete-title": "ट्याग मेट्नुहोस्",
        "tags-delete-explanation-initial": "तपाईले ट्याग \"$1\" लाई डाटावेसबाट हटाउन खोज्दै हुनु हुन्छ ।",
        "tags-delete-explanation-in-use": "ट्यागलाई {{PLURAL:$2|$2 संशोधन वा लग प्रविष्टि|सबै $2 संशोधन र/वा लग प्रविष्टिहरू}}बाट हटाइनेछ जहाँ अहिले त्यसको प्रयोग गरिंदै छ।",
-       "tags-delete-explanation-warning": "यà¥\8b à¤\95à¥\8dरिया <strong>à¤\85परिवरà¥\8dतनà¥\80य</strong> à¤¹à¥\8b à¤° <strong>तà¥\8dयसलाà¤\88 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤\97रà¥\8dन à¤¸à¤\95िà¤\82दà¥\88न</strong>, à¤¡à¥\87à¤\9fाà¤\9fाबà¥\87स à¤ªà¥\8dरवनà¥\8dधà¤\95 à¤ªà¤¨à¤¿ à¤¯à¤¸à¤²à¤¾à¤\88 à¤\95à¥\87हि à¤\97रà¥\8dन à¤¸à¤\95à¥\8dदà¥\88ननà¥\8d। à¤µà¤¿à¤¶à¥\8dवासपà¥\82रà¥\8dण à¤°à¥\82पलà¥\87 à¤¤à¤ªà¤¾à¤\88à¤\82 à¤¤à¤¯ à¤\97रà¥\8dनà¥\81स कि तपाईं यस ट्यागलाई हटाउन चाहनुहुन्छ।",
+       "tags-delete-explanation-warning": "यà¥\8b à¤\95à¥\8dरिया <strong>à¤\85परिवरà¥\8dतनà¥\80य</strong> à¤¹à¥\8b à¤° <strong>तà¥\8dयसलाà¤\88 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤\97रà¥\8dन à¤¸à¤\95िà¤\82दà¥\88न</strong>, à¤¡à¥\87à¤\9fाबà¥\87स à¤ªà¥\8dरवनà¥\8dधà¤\95 à¤ªà¤¨à¤¿ à¤¯à¤¸à¤²à¤¾à¤\88 à¤\95à¥\87हि à¤\97रà¥\8dन à¤¸à¤\95à¥\8dदà¥\88ननà¥\8d। à¤µà¤¿à¤¶à¥\8dवासपà¥\82रà¥\8dण à¤°à¥\82पलà¥\87 à¤¤à¤ªà¤¾à¤\88à¤\82 à¤¤à¤¯ à¤\97रà¥\8dनà¥\81हà¥\8bसà¥\8d कि तपाईं यस ट्यागलाई हटाउन चाहनुहुन्छ।",
        "tags-delete-explanation-active": "<strong>ट्याग \"$1\" अहिले पनि सक्रिय छ, र यसको प्रयोग भविष्यमा पनि जारी रहनेछ।</strong> यसलाई रोकनका लागि, ती स्थानहरूमा जानुहोस जहाँ यस ट्यागको प्रयोग भइरहेको छ र त्यहाँ देखि यसलाई अक्षम गर्नुहोस।",
        "tags-delete-reason": "कारण:",
        "tags-delete-submit": "उल्टाउन नसकिने गरि यो ट्यागलाई मेटाउने",
        "feedback-back": "अघिल्लो",
        "feedback-bugcheck": "राम्रो! जाँच्नुस की कतै [ $1 ज्ञात बगहरू] पहिले देखि नै नहोस्।",
        "feedback-bugnew": "मैले जाँच गरिसके। नयाँ बगको खबर दिनुहोस्",
-       "feedback-bugornote": "यदि à¤¤à¤ªà¤¾à¤\88à¤\82 à¤\95à¥\81नà¥\88 à¤ªà¥\8dराविधिà¤\95 à¤¸à¤®à¤¸à¥\8dयालाà¤\88 à¤µà¤¿à¤¸à¥\8dतारलà¥\87 à¤¸à¤®à¤\9dाà¤\89न à¤¤à¤¯à¤¾à¤° à¤¹à¥\81नà¥\81हà¥\81नà¥\8dà¤\9b à¤­à¤¨à¥\87 à¤\95à¥\83पया [$1 à¤¬à¤\97 à¤°à¤¾à¤\96à¥\8dनà¥\81हà¥\8bस]।\nयदि à¤¹à¥\88न, à¤­à¤¨à¥\87 à¤¤à¤ªà¤¾à¤\88à¤\82 à¤¤à¤² à¤¦à¤¿à¤\87à¤\8fà¤\95à¥\8b à¤¸à¤°à¤² à¤«à¤¾à¤°à¤®à¤\95à¥\8b à¤ªà¥\8dरयà¥\8bà¤\97 à¤\97रà¥\8dनसà¤\95à¥\8dनà¥\81हà¥\81नà¥\8dà¤\9b। à¤¤à¤ªà¤¾à¤\88à¤\82à¤\95à¥\8b à¤\9fिपà¥\8dपणà¥\80 à¤¤à¤ªà¤¾à¤\88à¤\82à¤\95à¥\8b à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤¨à¤¾à¤® à¤° à¤¤à¤ªà¤¾à¤\88à¤\82à¤\95à¥\8b à¤¬à¥\8dराà¤\89à¤\9cरà¤\95à¥\8b à¤¨à¤¾à¤® à¤¸à¤¹à¤¿à¤¤ \"[$3 $2]\" à¤ªà¥\83षà¥\8dठ मा जोडिनेछ।",
+       "feedback-bugornote": "यदि à¤¤à¤ªà¤¾à¤\88à¤\82 à¤\95à¥\81नà¥\88 à¤ªà¥\8dराविधिà¤\95 à¤¸à¤®à¤¸à¥\8dयालाà¤\88 à¤µà¤¿à¤¸à¥\8dतारलà¥\87 à¤¸à¤®à¥\8dà¤\9dाà¤\89न à¤¤à¤¯à¤¾à¤° à¤¹à¥\81नà¥\81हà¥\81नà¥\8dà¤\9b à¤­à¤¨à¥\87 à¤\95à¥\83पया [$1 à¤¬à¤\97 à¤°à¤¾à¤\96à¥\8dनà¥\81हà¥\8bस]।\nयदि à¤¹à¥\88न, à¤­à¤¨à¥\87 à¤¤à¤ªà¤¾à¤\88à¤\82 à¤¤à¤² à¤¦à¤¿à¤\87à¤\8fà¤\95à¥\8b à¤¸à¤°à¤² à¤«à¤¾à¤°à¤®à¤\95à¥\8b à¤ªà¥\8dरयà¥\8bà¤\97 à¤\97रà¥\8dनसà¤\95à¥\8dनà¥\81हà¥\81नà¥\8dà¤\9b। à¤¤à¤ªà¤¾à¤\88à¤\82à¤\95à¥\8b à¤\9fिपà¥\8dपणà¥\80 à¤¤à¤ªà¤¾à¤\88à¤\82à¤\95à¥\8b à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤¨à¤¾à¤® à¤° à¤¤à¤ªà¤¾à¤\88à¤\82à¤\95à¥\8b à¤¬à¥\8dराà¤\89à¤\9cरà¤\95à¥\8b à¤¨à¤¾à¤® à¤¸à¤¹à¤¿à¤¤ \"[$3 $2]\" à¤ªà¥\83षà¥\8dठमा जोडिनेछ।",
        "feedback-cancel": "रद्द गर्ने",
        "feedback-close": "गरियो",
        "feedback-external-bug-report-button": "प्राविधिक कार्य पेश गर्नुहोस्",
index 7e67800..dd78e7e 100644 (file)
        "watchthis": "ଏହି ପୃଷ୍ଠାଟିକୁ ଦେଖିବେ",
        "savearticle": "ସାଇତିବେ [Save]",
        "preview": "ସାଇତିବା ଆଗରୁ ଦେଖନ୍ତୁ",
-       "showpreview": "ପà­\82ରà­\8dବଦà­\87à¬\96ଣା [Preview]",
+       "showpreview": "ଦେଖଣା [Preview]",
        "showdiff": "ବଦଳଗୁଡ଼ିକ ଦେଖାଇବେ",
        "blankarticle": "<strong>ଚେତାବନୀ:</strong> ଆପଣ ସମ୍ପାଦନା କରୁଥିବା ଏହି ପୃଷ୍ଠାଟି ଫାଙ୍କା ଅଛି ।\nଯଦି ଆପଣ \"{{int:savearticle}}\" ଉପରେ ଆଉଥରେ କ୍ଲିକ କରନ୍ତି, ପୃଷ୍ଠାଟି କୌଣସି ବିଷୟବସ୍ତୁ ନଥାଇ ତିଆରି ହୋଇଯିବ ।",
        "anoneditwarning": "<strong>ସାବଧାନ:</strong> ଆପଣ ଲଗ-ଇନ କରିନାହାନ୍ତି । ଅଧିକ ସମ୍ପାଦନା କଲେ ଆପଣଙ୍କ IP Address ଟି ସମସ୍ତଙ୍କୁ ଦେଖାଯିବ । <strong>[$1ଲଗ ଇନ କଲେ]</strong> କିମ୍ବା <strong>[$2 ନୂଆ ଖାତାଟିଏ ତିଆରି କଲେ]</strong>, ଆପଣଙ୍କ ସମ୍ପାଦନାର ଶ୍ରେୟ ଅନ୍ୟାନ୍ୟ ସୁବିଧା ସହିତ ଆପଣଙ୍କ ଇଉଜର ନାମରେ ଦିଆହେବ ।",
        "prefs-timeoffset": "ସମୟ ଆରମ୍ଭ",
        "prefs-advancedediting": "ସାଧାରଣ ବିକଳ୍ପ",
        "prefs-editor": "ସମ୍ପାଦକ",
-       "prefs-preview": "ପà­\82ରà­\8dବଦà­\87à¬\96ଣା",
+       "prefs-preview": "ଦେଖଣା",
        "prefs-advancedrc": "ଉନ୍ନତ ବିକଳ୍ପସମୂହ",
        "prefs-advancedrendering": "ଉନ୍ନତ ବିକଳ୍ପସମୂହ",
        "prefs-advancedsearchoptions": "ଉନ୍ନତ ବିକଳ୍ପସମୂହ",
        "expand_templates_remove_nowiki": "ଫଳାଫଳରେ <nowiki> ଟ୍ୟାଗମାନଙ୍କୁ ଦବାଇଦିଅନ୍ତୁ",
        "expand_templates_generate_xml": "XML ପାର୍ସ ସଂରଚନା ଦେଖାନ୍ତୁ",
        "expand_templates_generate_rawhtml": "କେବଳ HTML କୋଡ଼ ଦେଖାନ୍ତୁ",
-       "expand_templates_preview": "ପà­\82ରà­\8dବଦà­\87à¬\96ଣା",
+       "expand_templates_preview": "ଦେଖଣା",
        "pagelanguage": "ପୃଷ୍ଠା ଭାଷା ବଛା",
        "pagelang-name": "ପୃଷ୍ଠା",
        "pagelang-language": "ଭାଷା",
index f37779b..10a1e12 100644 (file)
        "searchrelated": "ਸਬੰਧਤ",
        "searchall": "ਸਭ",
        "showingresults": "ਹੇਠਾਂ #'''$2''' ਨਾਲ਼ ਸ਼ੁਰੂ ਹੋਣ ਵਾਲ਼ੇ {{PLURAL:\n$1|'''1''' ਨਤੀਜਾ|'''$1''' ਤੱਕ ਨਤੀਜੇ}} ਵਖਾਓ।",
+       "search-showingresults": "{{PLURAL:$4|<strong>$3</strong> ਵਿੱਚੋਂ <strong>$1</strong> ਨਤੀਜੇ| <strong>$3</strong> ਵਿੱਚੋਂ <strong>$1 - $2</strong> ਨਤੀਜੇ}}",
        "search-nonefound": "ਤੁਹਾਡੀ ਖੋਜ ਨਾਲ ਮੇਲ ਖਾਂਦੇ ਕੋਈ ਨਤੀਜੇ ਨਹੀਂ ਮਿਲੇ।",
        "powersearch-legend": "ਤਕਨੀਕੀ ਖੋਜ",
        "powersearch-ns": "ਨੇਮ-ਸਪੇਸ ਵਿੱਚ ਖੋਜ:",
index 01ddf9a..ca5db9a 100644 (file)
        "underline-never": "Nigdy",
        "underline-default": "według ustawień skórki lub przeglądarki",
        "editfont-style": "Styl czcionki w polu edycyjnym:",
-       "editfont-default": "Domyślna przeglądarka",
+       "editfont-default": "domyślny przeglądarki",
        "editfont-monospace": "czcionka o stałej szerokości",
        "editfont-sansserif": "czcionka bezszeryfowa",
        "editfont-serif": "czcionka szeryfowa",
index 7288066..11ea692 100644 (file)
        "version-libraries": "Header on [[Special:Version]] above a table that lists installed external libraries and their version numbers.",
        "version-libraries-library": "Column header for the library's name\n{{Identical|Library}}",
        "version-libraries-version": "Column header for the library's version number\n{{Identical|Version}}",
+       "version-libraries-license": "Column header for the library's license",
+       "version-libraries-description": "Column header for the library's description",
+       "version-libraries-authors": "Column header for the library's authors",
        "redirect": "{{doc-special|Redirect}}\nThis means \"Redirect by file'''name''', user '''ID''', page '''ID''', or revision ID\".",
        "redirect-legend": "Legend of fieldset around input box in [[Special:Redirect]]",
        "redirect-text": "Inside fieldset for [[Special:Redirect]]",
index 7d0cf38..5c36432 100644 (file)
        "yourdiff": "Differenze",
        "copyrightwarning": "Pe piacere vide ca tutte le condrebbute de {{SITENAME}} sonde considerete de essere rilasciete sotte 'a $2 (vide $1 pe le dettaglie).\nCe tu non ge vuè ca le condrebbute tue avènene ausete da otre o avènene cangete, non le scè mettènne proprie.<br />\nTu na promettere pure ca le cose ca scrive tu, sonde 'mbormaziune libbere o copiete da 'nu pubbleche dominie.<br />\n'''NON METTE' NISCIUNA FATJE CA JE' PROTETTE DA DERITTE SENZA PERMESSE!'''",
        "copyrightwarning2": "Pe piacere vide ca tutte le condrebbute de {{SITENAME}} ponne essere cangete, alterate o luvete da otre condrebbutore.\nCe tu non ge vuè ca quidde ca scrive avène cangete da tre, allore non scè scrivenne proprie aqquà.<br />\nTu ne stè promitte ca quidde ca scrive tu, o lè scritte cu 'u penziere tue o lè cupiate da risorse de pubbliche dominie o sembre robba libbere (vide $1 pe cchiù dettaglie).\n'''NO REGGISTRA' FATIJE CUPERTE DA 'U COPYRIGHT SENZA PERMESSE! NO FA STUDECARIE!'''",
+       "editpage-cannot-use-custom-model": "'U modelle de condenute de sta pàgene non ge pò essere cangiate.",
        "longpageerror": "'''ERRORE: 'U teste ca tu vuè ccu reggistre è luenghe {{PLURAL:$1|'nu kilobyte|$1 kilobyte}}, invece 'u limite massime jè de {{PLURAL:$2|'nu kilobyte|$2 kilobyte}}.'''\nNon ge puè reggistrà sta pàggene.",
        "readonlywarning": "'''FA ATTENZIO': 'U database ha state bloccate pe manutenzione, e allore tu non ge puè reggistrà le cangiaminde ca ste face mò.'''\nTu puè fa 'na bella cose, tagghie e 'nzicche le cangiaminde jndr'à 'nu file de teste sus a 'u combiuter tune e pò cchiù tarde le reggistre sus 'a Uicchi.\n\nL'amministratore ca ha bloccate 'u database ha date stu mutive: $1",
        "protectedpagewarning": "'''ATTENZIO': Sta pàgene ha state bloccate e allore sulamende le utinde cu le privilegge de ''sysop'' ponne cangiarle.'''\nL'urteme archivie de le trasute ha state previste aqquà sotte pe referimende:",
        "content-model-css": "CSS",
        "content-json-empty-object": "Oggette vacande",
        "content-json-empty-array": "Matrice vacande",
+       "duplicate-args-warning": "<strong>Attenziò:</strong> [[:$1]] ste chiame [[:$2]] cu cchiù de 'nu valore pu parametre \"$3\". Sulamende l'urteme valore date avène ausate.",
        "duplicate-args-category": "Pàggene ca ausane le argumende a doppie jndr'à le chiamate d'u template",
        "duplicate-args-category-desc": "'A pàgene téne chiamate a template ca ausane arguminde a doppie, cumme <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> o <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "Fà attenziò: Sta vosce tène 'nu sbuenne de funziune de chiamate a l'analizzatore.\n\nAvessere a essere mene de $2 {{PLURAL:$2|chiamate|chiamate}}, 'nvece mò {{PLURAL:$1|ste $1 chiamate|ne stonne $1 chiamate}}.",
        "uploaded-script-svg": "Acchiate elemende pe script \"$1\" jndr'à 'u file SVG carecate.",
        "uploaded-hostile-svg": "Acchiate 'nu CSS insecure ndr'à l'elemende de stile d'u file SVG carecate.",
        "uploaded-event-handler-on-svg": "'A 'mbostazione de le attribute de gestione de l'evende <code>$1=\"$2\"</code> non ge se pò ffà cu le file SVG.",
+       "uploaded-href-attribute-svg": "le attribbute href <code>&lt;$1 $2=\"$3\"&gt;</code> cu le destinaziune de fore (p.e. http://, javascript:, etc) non ge se ponne mettere jndr'à le file SVG.",
        "uploadscriptednamespace": "Stu file SVG tène 'nu namespace illegale '$1'",
        "uploadinvalidxml": "L'XML jndr'à 'u file carecate non ge pò essere analizzate.",
        "uploadvirus": "Alanga toje, 'u file condiene 'nu virus! Dettaglie: $1",
        "special-characters-group-khmer": "Khmer",
        "special-characters-title-endash": "trattine en",
        "special-characters-title-emdash": "trattine em",
-       "special-characters-title-minus": "segne mene"
+       "special-characters-title-minus": "segne mene",
+       "mw-widgets-titleinput-description-new-page": "'a pàgene non g'esiste angore",
+       "mw-widgets-titleinput-description-redirect": "redirezionate sus a $1"
 }
index 96d221d..9c50242 100644 (file)
        "prefs-tokenwatchlist": "Token",
        "prefs-diffs": "Rozdiely",
        "prefs-help-prefershttps": "Táto voľba sa prejaví pri vašom ďalšom prihlásení.",
-       "email-address-validity-valid": "Formát e-mailovej adresa vyzerá byť správny",
+       "prefswarning-warning": "Vykonali ste zmeny v nastaveniach, ktoré zatiaľ nie sú uložené. Ak túto stránku opustíte bez kliknutia na „$1“, vaše nastavenia sa neaktualizujú.",
+       "email-address-validity-valid": "Formát e-mailovej adresy sa zdá byť správny",
        "email-address-validity-invalid": "Zadajte platnú e-mailovú adresu",
        "userrights": "Spravovanie používateľských práv",
        "userrights-lookup-user": "Spravovať skupiny používateľov",
        "right-browsearchive": "Hľadať v zmazaných stránkach",
        "right-undelete": "Obnoviť zmazanú stránku",
        "right-suppressrevision": "Kontrolovať a obnovovať revízie skryté správcom",
+       "right-viewsuppressed": "Zobrazovať revízie skryté pred všetkými používateľmi",
        "right-suppressionlog": "Zobrazovať súkromné záznamy",
        "right-block": "Blokovať ostatných používateľov",
        "right-blockemail": "Zablokovať používateľovi posielanie emailu",
        "right-protect": "Meniť úroveň zamknutia a upravovať kaskádovito zamknuté stránky",
        "right-editprotected": "Upravovať stránky zamknuté ako „{{int:protect-level-sysop}}“",
        "right-editsemiprotected": "Upravovať stránky zamknuté ako „{{int:protect-level-autoconfirmed}}“",
+       "right-editcontentmodel": "Upravovať model obsahu stránky",
        "right-editinterface": "Upravovať správy používateľského rozhrania",
        "right-editusercssjs": "Upravovať CSS a JS súbory ostatných používateľov",
        "right-editusercss": "Upravovať CSS súbory ostatných používateľov",
        "action-viewmywatchlist": "zobraziť zoznam sledovaných stránok",
        "action-viewmyprivateinfo": "zobraziť vaše súkromné údaje",
        "action-editmyprivateinfo": "upraviť vaše súkromné údaje",
+       "action-editcontentmodel": "upraviť model obsahu stránky",
        "action-managechangetags": "vytvorte a odstráňte značky z databázy",
        "nchanges": "$1 {{PLURAL:$1|úprava|úpravy|úprav}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|od poslednej návštevy}}",
        "unusedimages": "Nepoužité obrázky",
        "wantedcategories": "Žiadané kategórie",
        "wantedpages": "Žiadané stránky",
+       "wantedpages-summary": "Zoznam neexistujúcich stránok, na ktoré smeruje najviac odkazov, s výnimkou stránok, na ktoré odkazujú len presmerovania. Pre zoznam neexistujúcich stránok, na ktoré odkazujú presmerovania, pozri [[{{#special:BrokenRedirects}}|zoznam pokazených presmerovaní]].",
        "wantedpages-badtitle": "Neplatný názov vo výsledkoch: $1",
        "wantedfiles": "Žiadané súbory",
        "wantedfiletext-cat": "Nasledovné súbory sa používajú, ale nie sú k dispozícii. Súbory z cudzích repozitárov môžu byť uvedené aj napriek tomu, že existujú. Takéto falošné poplachy budú <del>prečiarknuté</del>. Okrem toho stránky, ktoré obsahujú vložené súbory, ktoré nie sú k dispozícii sú uvedené na [[:$1]].",
        "deadendpagestext": "Nasledujúce stránky neodkazujú na žiadne iné stránky na {{GRAMMAR:lokál|{{SITENAME}}}}.",
        "protectedpages": "Zamknuté stránky",
        "protectedpages-indef": "Zamknutia iba na neurčito",
+       "protectedpages-summary": "Táto stránka obsahuje zoznam existujúcich stránok, ktoré sú momentálne zamknuté. Zoznam názvov zamknutých proti vytvoreniu nájdete na stránke [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]].",
        "protectedpages-cascade": "Iba kaskádové zamykanie",
        "protectedpages-noredirect": "Skryť presmerovania",
        "protectedpagesempty": "Momentálne nie sú žiadne stránky s týmito parametrami zamknuté.",
        "protectedpages-timestamp": "Dátum a čas",
        "protectedpages-page": "Stránka",
        "protectedpages-expiry": "Koniec platnosti",
+       "protectedpages-performer": "Zamkol",
        "protectedpages-params": "Nastavenie zámku",
        "protectedpages-reason": "Dôvod",
        "protectedpages-unknown-timestamp": "Neznáme",
        "protectedpages-unknown-performer": "Neznámy redaktor",
        "protectedtitles": "Zamknuté názvy",
+       "protectedtitles-summary": "Táto stránka obsahuje zoznam názvov, ktoré sú momentálne zamknuté proti vytvoreniu. Zoznam existujúcich zamknutých stránok nájdete na stránke [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
        "protectedtitlesempty": "Tieto parametre momentálne nezamykajú žiadne názvy stránok.",
        "listusers": "Zoznam používateľov",
        "listusers-editsonly": "Vynechať používateľov bez úprav",
index 4c7e55e..903bce1 100644 (file)
        "special-characters-group-khmer": "Kmerski",
        "special-characters-title-endash": "navaden pomišljaj",
        "special-characters-title-emdash": "dolgi pomišljaj",
-       "special-characters-title-minus": "znak za minus"
+       "special-characters-title-minus": "znak za minus",
+       "mw-widgets-titleinput-description-new-page": "stran še ne obstaja",
+       "mw-widgets-titleinput-description-redirect": "preusmeritev na $1"
 }
index 2793fa3..89f4154 100644 (file)
        "special-characters-group-thai": "тајландски",
        "special-characters-group-lao": "лаоски",
        "special-characters-group-khmer": "кмерски",
-       "mw-widgets-titleinput-description-new-page": "страница још увек не постоји"
+       "mw-widgets-titleinput-description-new-page": "страница још увек не постоји",
+       "mw-widgets-titleinput-description-redirect": "преусмерава на $1"
 }
index 6da7572..a341526 100644 (file)
        "yourdiff": "Skillnader",
        "copyrightwarning": "Observera att alla bidrag till {{SITENAME}} är att betrakta som utgivna under $2 (se $1 för detaljer). Om du inte vill att din text ska redigeras eller kopieras efter andras gottfinnande skall du inte skriva något här.<br />\nDu lovar oss också att du skrev texten själv, eller kopierade från kulturellt allmängods som inte skyddas av upphovsrätt, eller liknande källor. '''LÄGG INTE UT UPPHOVSRÄTTSSKYDDAT MATERIAL HÄR UTAN TILLÅTELSE!'''",
        "copyrightwarning2": "Observera att alla bidrag till {{SITENAME}} kan komma att redigeras, ändras, eller tas bort av andra deltagare. Om du inte vill se din text förändrad efter andras gottfinnade skall du inte skriva in någon text här.<br />\nDu lovar oss också att du skrev texten själv, eller kopierade från kulturellt allmängods som inte skyddas av upphovsrätt, eller liknande källor - se $1 för detaljer.\n'''LÄGG INTE UT UPPHOVSRÄTTSSKYDDAT MATERIAL HÄR UTAN TILLÅTELSE!'''",
+       "editpage-cannot-use-custom-model": "Innehållsmodellen för denna sida kan inte ändras.",
        "longpageerror": "'''FEL: Texten som du försöker spara är {{PLURAL:$1|en kilobyte|$1 kilobyte}}, vilket är mer än det maximalt tillåtna {{PLURAL:$2|en kilobyte|$2 kilobyte}}.'''\nDen kan inte sparas.",
        "readonlywarning": "'''VARNING: Databasen är tillfälligt låst för underhåll. Du kommer inte att kunna spara dina ändringar just nu.\nDet kan vara klokt att kopiera texten till ett textdokument som sparas på din dator tills vidare.'''\n\nAdministratören som låste databasen gav följande förklaring: $1",
        "protectedpagewarning": "'''Varning: Den här sidan har låsts så att bara användare med administratörsrättigheter kan redigera den.'''\nDen senaste loggposten tillhandahålls nedan som referens:",
index 3ec0241..f1b5c3f 100644 (file)
        "yourdiff": "Відмінності",
        "copyrightwarning": "Зверніть увагу, що будь-які додавання і зміни до {{grammar:genitive|{{SITENAME}}}} розглядаються як випущені на умовах ліцензії $2 (детальніше див. $1).\nЯкщо ви не бажаєте, щоб написане вами безжально редагувалось і розповсюджувалося за бажанням будь-кого, не пишіть тут.<br />\nВи також підтверджуєте, що написане вами тут належить вам або взяте з джерела, що є суспільним надбанням чи подібного вільного джерела.\n'''Не публікуйте тут без дозволу матеріали, захищені авторським правом!'''",
        "copyrightwarning2": "Будь ласка, зверніть увагу, що всі зміни, внесені вами до {{SITENAME}}, можуть редагуватися, доповнюватися або вилучатися іншими користувачами.\nЯкщо ви не бажаєте, щоб написане вами безжально редагувалось — не пишіть тут.<br />\nВи також підтверджуєте, що наведене тут написано вами особисто або запозичено з джерела, яке є суспільним надбанням, або подібного вільного джерела (див. $1).<br />\n'''Не публікуйте тут без дозволу матеріали, захищені авторським правом!'''",
+       "editpage-cannot-use-custom-model": "Модель вмісту цієї сторінки не може бути змінена.",
        "longpageerror": "'''Помилка: Поданий вами текст становить $1 {{PLURAL:$1|кілобайт|кілобайти|кілобайтів}}, що більше за встановлену межу у {{PLURAL:$2|кілобайт|кілобайти|кілобайтів}}.'''\nЙого неможливо зберегти.",
        "readonlywarning": "'''Попередження: База даних заблокована на обслуговування, тому, на даний момент, ви не можете записати ваші зміни.\nМожливо, вам варто скопіювати текст у файл на вашому комп'ютері й зберегти його на пізніше.'''\n\nАдміністратор, що заблокував базу даних, залишив наступне пояснення: $1",
        "protectedpagewarning": "'''Попередження: Ця сторінка була захищена від змін так, що тільки користувачі з правами адміністратора можуть її редагувати.'''\nОстанній запис журналу наведений нижче для довідки:",
        "badsig": "Неправильний підпис.\nПеревірте коректність HTML-тегів.",
        "badsiglength": "Ваш підпис дуже довгий.\nПовинно бути не більше $1 {{PLURAL:$1|символу|символів|символів}}.",
        "yourgender": "Стать:",
-       "gender-unknown": "Ð\9dе Ð²Ð¸Ð·Ð½Ð°Ñ\87ена",
+       "gender-unknown": "Ð\97гадÑ\83Ñ\8eÑ\87и Ð\92аÑ\81, Ð¿Ñ\80огÑ\80амне Ð·Ð°Ð±ÐµÐ·Ð¿ÐµÑ\87еннÑ\8f Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83ваÑ\82име Ð¿Ð¾ Ð·Ð¼Ð¾Ð·Ñ\96 Ð³ÐµÐ½Ð´ÐµÑ\80но Ð½ÐµÐ¹Ñ\82Ñ\80алÑ\8cнÑ\96 Ñ\81лова",
        "gender-male": "Чоловіча",
        "gender-female": "Жіноча",
        "prefs-help-gender": "Задання цього параметру — необов'язкове. Застосовується рушієм у тих звертаннях до користувача, які залежать від статі.\nЦя інформація загальнодоступна.",
        "nmembers": "$1 {{PLURAL:$1|об'єкт|об'єкти|об'єктів}}",
        "nmemberschanged": "$1 → $2 {{PLURAL:$2|член|члени|членів}}",
        "nrevisions": "$1 {{PLURAL:$1|версія|версії|версій}}",
-       "nviews": "$1 {{PLURAL:$1|перегляд|перегляди|переглядів}}",
        "nimagelinks": "Використовується на $1 {{PLURAL:$1|1=сторінці|сторінках}}",
        "ntransclusions": "використовується на $1 {{PLURAL:$1|1=сторінці|сторінках}}",
        "specialpage-empty": "Запит не дав результатів.",
        "special-characters-group-khmer": "Кхмерські",
        "special-characters-title-endash": "коротке тире",
        "special-characters-title-emdash": "довге тире",
-       "special-characters-title-minus": "мінус"
+       "special-characters-title-minus": "мінус",
+       "mw-widgets-titleinput-description-new-page": "сторінка ще не існує",
+       "mw-widgets-titleinput-description-redirect": "перенаправлення на $1"
 }
index 6fda808..e553b7f 100644 (file)
@@ -84,7 +84,7 @@ $specialPageAliases = array(
        'Mostlinkedcategories'      => array( 'Najviše_povezane_kategorije' ),
        'Mostlinkedtemplates'       => array( 'Najviše_povezani_šabloni' ),
        'Mostrevisions'             => array( 'Najviše_uređivane_stranice' ),
-       'Movepage'                  => array( 'PreusmjeriStranicu' ),
+       'Movepage'                  => array( 'Premjesti_stranicu', 'PreusmjeriStranicu' ),
        'Mycontributions'           => array( 'MojiDoprinosi' ),
        'Mypage'                    => array( 'MojaStranica' ),
        'Mytalk'                    => array( 'MojRazgovor' ),
index b7fe80b..3e86d8a 100644 (file)
@@ -31,7 +31,7 @@ class ConvertExtensionToRegistration extends Maintenance {
         * @var array
         */
        protected $noLongerSupportedGlobals = array(
-               'SpecialPageGroups' => 'deprecated',
+               'SpecialPageGroups' => 'deprecated', // Deprecated 1.21, removed in 1.26
        );
 
        /**
index 2d68457..db983a7 100644 (file)
 // Button styling
 // ----------------------------------------------------------------------------
 
-.button-colors(@bgColor) {
+.button-colors(@bgColor, @highlightColor) {
        background: @bgColor;
 
        &:hover {
                // The inner bottom bevel should match the active background color.
                box-shadow: 0 1px rgba(0, 0, 0, 10%), inset 0 -3px rgba(0, 0, 0, 20%);
-               border-bottom-color: mix(#000, @bgColor, 20%);
+               border-bottom-color: @highlightColor;
        }
 
        &:focus {
 
        &:active,
        &.mw-ui-checked {
-               // lessphp doesn't implement shade (https://github.com/leafo/lessphp/issues/528);
-               // it passes it through, then ResourceLoader drops it.
-               // background: shade(@bgColor, 20%);
-               background: mix(#000, @bgColor, 20%);
+               background: @highlightColor;
                box-shadow: none;
        }
 }
 
-.button-colors(@bgColor) when (lightness(@bgColor) >= 70%) {
+.button-colors(@bgColor, @highlightColor) when (lightness(@bgColor) >= 70%) {
        color: @colorButtonText;
        border: 1px solid @colorGray12;
 
@@ -86,7 +83,7 @@
        }
 }
 
-.button-colors(@bgColor) when (lightness(@bgColor) < 70%) {
+.button-colors(@bgColor, @highlightColor) when (lightness(@bgColor) < 70%) {
        color: #fff;
        // border of the same color as background so that light background and
        // dark background buttons are the same height and width
        }
 }
 
-.button-colors-quiet(@textColor) {
+.button-colors-quiet(@textColor, @highlightColor) {
        // Quiet buttons all start gray, and reveal
        // constructive/progressive/destructive color on hover and active.
        color: @colorButtonText;
 
        &:active,
        &.mw-ui-checked {
-               // lessphp doesn't implement shade, see above
-               // color: shade(@textColor, 20%);
-               color: mix(#000, @textColor, 20%);
+               color: @highlightColor;
        }
 
        &:disabled {
index f6bf382..8ffc6ed 100644 (file)
 // Semantic background colors
 // Blue; for contextual use of a continuing action
 @colorProgressive: #347bff;
+@colorProgressiveHighlight: #2962CC;
 // Green; for contextual use of a positive finalizing action
 @colorConstructive: #00af89;
+@colorConstructiveHighlight: #008C6D;
 // Orange; for contextual use of returning to a past action
 @colorRegressive: #FF5D00;
 // Red; for contextual use of a negative action of high severity
 @colorDestructive: #d11d13;
+@colorDestructiveHighlight: #A7170F;
 // Orange; for contextual use of a potentially negative action of medium severity
 @colorMediumSevere: #FF5D00;
 // Yellow; for contextual use of a potentially negative action of low severity
@@ -41,6 +44,7 @@
 @colorText: @colorGray2;
 @colorTextLight: @colorGray6;
 @colorButtonText: @colorGray5;
+@colorButtonTextHighlight: @colorGray7;
 @colorDisabledText: @colorGray12;
 @colorErrorText: #CC0000;
 
index b4efa9a..5b259e7 100644 (file)
@@ -1,7 +1,8 @@
 /*!
  * Styling for Special:Version
  */
-.mw-version-ext-name {
+.mw-version-ext-name,
+.mw-version-library-name {
        font-weight: bold;
 }
 
index f88f3ee..53e13b7 100644 (file)
@@ -47,7 +47,7 @@
        zoom: 1;
 
        // Container styling
-       .button-colors(#FFF);
+       .button-colors(#FFF, #CCC);
        border-radius: @borderRadius;
        min-width: 4em;
 
        // Styleguide 2.1.1.
        &.mw-ui-progressive,
        &.mw-ui-primary {
-               .button-colors(@colorProgressive);
+               .button-colors(@colorProgressive, @colorProgressiveHighlight);
 
                &.mw-ui-quiet {
-                       .button-colors-quiet(@colorProgressive);
+                       .button-colors-quiet(@colorProgressive, @colorProgressiveHighlight);
                }
        }
 
        //
        // Styleguide 2.1.2.
        &.mw-ui-constructive {
-               .button-colors(@colorConstructive);
+               .button-colors(@colorConstructive, @colorConstructiveHighlight);
 
                &.mw-ui-quiet {
-                       .button-colors-quiet(@colorConstructive);
+                       .button-colors-quiet(@colorConstructive, @colorConstructiveHighlight);
                }
        }
 
        //
        // Styleguide 2.1.3.
        &.mw-ui-destructive {
-               .button-colors(@colorDestructive);
+               .button-colors(@colorDestructive, @colorDestructiveHighlight);
 
                &.mw-ui-quiet {
-                       .button-colors-quiet(@colorDestructive);
+                       .button-colors-quiet(@colorDestructive, @colorDestructiveHighlight);
                }
        }
 
                background: transparent;
                border: none;
                text-shadow: none;
-               .button-colors-quiet(@colorButtonText);
+               .button-colors-quiet(@colorButtonText, @colorButtonTextHighlight);
 
                &:hover,
                &:focus {
index ec3c0c3..a815c99 100644 (file)
 
                                $.each( dependencies, function ( idx, module ) {
                                        var state = mw.loader.getState( module );
+                                       // Only queue modules that are still in the initial 'registered' state
+                                       // (not ones already loading, ready or error).
                                        if ( state === 'registered' && $.inArray( module, queue ) === -1 ) {
+                                               // Private modules must be embedded in the page. Don't bother queuing
+                                               // these as the server will deny them anyway (T101806).
+                                               if ( registry[module].group === 'private' ) {
+                                                       registry[module].state = 'error';
+                                                       handlePending( module );
+                                                       return;
+                                               }
                                                queue.push( module );
                                                if ( async ) {
                                                        registry[module].async = true;
diff --git a/tests/phpunit/data/media/2_webp_a.webp b/tests/phpunit/data/media/2_webp_a.webp
new file mode 100644 (file)
index 0000000..8764f06
Binary files /dev/null and b/tests/phpunit/data/media/2_webp_a.webp differ
diff --git a/tests/phpunit/data/media/2_webp_ll.webp b/tests/phpunit/data/media/2_webp_ll.webp
new file mode 100644 (file)
index 0000000..5794bbf
Binary files /dev/null and b/tests/phpunit/data/media/2_webp_ll.webp differ
diff --git a/tests/phpunit/data/media/webp_animated.webp b/tests/phpunit/data/media/webp_animated.webp
new file mode 100644 (file)
index 0000000..25c6a4d
Binary files /dev/null and b/tests/phpunit/data/media/webp_animated.webp differ
index b5fd5f6..cac3b10 100644 (file)
@@ -27,34 +27,95 @@ class ComposerLockTest extends MediaWikiTestCase {
                        'wikimedia/cdb' => array(
                                'version' => '1.0.1',
                                'type' => 'library',
+                               'licenses' => array( 'GPL-2.0' ),
+                               'authors' => array(
+                                       array(
+                                               'name' => 'Tim Starling',
+                                               'email' => 'tstarling@wikimedia.org',
+                                       ),
+                                       array(
+                                               'name' => 'Chad Horohoe',
+                                               'email' => 'chad@wikimedia.org',
+                                       ),
+                               ),
+                               'description' => 'Constant Database (CDB) wrapper library for PHP. Provides pure-PHP fallback when dba_* functions are absent.',
                        ),
                        'cssjanus/cssjanus' => array(
                                'version' => '1.1.1',
                                'type' => 'library',
+                               'licenses' => array( 'Apache-2.0' ),
+                               'authors' => array(),
+                               'description' => 'Convert CSS stylesheets between left-to-right and right-to-left.',
                        ),
                        'leafo/lessphp' => array(
                                'version' => '0.5.0',
                                'type' => 'library',
+                               'licenses' => array( 'MIT', 'GPL-3.0' ),
+                               'authors' => array(
+                                       array(
+                                               'name' => 'Leaf Corcoran',
+                                               'email' => 'leafot@gmail.com',
+                                               'homepage' => 'http://leafo.net',
+                                       ),
+                               ),
+                               'description' => 'lessphp is a compiler for LESS written in PHP.',
                        ),
                        'psr/log' => array(
                                'version' => '1.0.0',
                                'type' => 'library',
+                               'licenses' => array( 'MIT' ),
+                               'authors' => array(
+                                       array(
+                                               'name' => 'PHP-FIG',
+                                               'homepage' => 'http://www.php-fig.org/',
+                                       ),
+                               ),
+                               'description' => 'Common interface for logging libraries',
                        ),
                        'oojs/oojs-ui' => array(
                                'version' => '0.6.0',
                                'type' => 'library',
+                               'licenses' => array( 'MIT' ),
+                               'authors' => array(),
+                               'description' => '',
                        ),
                        'composer/installers' => array(
                                'version' => '1.0.19',
                                'type' => 'composer-installer',
+                               'licenses' => array( 'MIT' ),
+                               'authors' => array(
+                                       array(
+                                               'name' => 'Kyle Robinson Young',
+                                               'email' => 'kyle@dontkry.com',
+                                               'homepage' => 'https://github.com/shama',
+                                       ),
+                               ),
+                               'description' => 'A multi-framework Composer library installer',
                        ),
                        'mediawiki/translate' => array(
                                'version' => '2014.12',
                                'type' => 'mediawiki-extension',
+                               'licenses' => array( 'GPL-2.0+' ),
+                               'authors' => array(
+                                       array(
+                                               'name' => 'Niklas Laxström',
+                                               'email' => 'niklas.laxstrom@gmail.com',
+                                               'role' => 'Lead nitpicker',
+                                       ),
+                                       array(
+                                               'name' => 'Siebrand Mazeland',
+                                               'email' => 's.mazeland@xs4all.nl',
+                                               'role' => 'Developer',
+                                       ),
+                               ),
+                               'description' => 'The only standard solution to translate any kind of text with an avant-garde web interface within MediaWiki, including your documentation and software',
                        ),
                        'mediawiki/universal-language-selector' => array(
                                'version' => '2014.12',
                                'type' => 'mediawiki-extension',
+                               'licenses' => array( 'GPL-2.0+', 'MIT' ),
+                               'authors' => array(),
+                               'description' => 'The primary aim is to allow users to select a language and configure its support in an easy way. Main features are language selection, input methods and web fonts.',
                        ),
                ), $lock->getInstalledDependencies(), false, true );
        }
diff --git a/tests/phpunit/includes/media/WebPTest.php b/tests/phpunit/includes/media/WebPTest.php
new file mode 100644 (file)
index 0000000..d36710a
--- /dev/null
@@ -0,0 +1,127 @@
+<?php
+class WebPHandlerTest extends MediaWikiTestCase {
+       public function setUp() {
+               parent::setUp();
+               // Allocated file for testing
+               $this->tempFileName = tempnam( wfTempDir(), 'WEBP' );
+       }
+       public function tearDown() {
+               parent::tearDown();
+               unlink( $this->tempFileName );
+       }
+       /**
+        * @dataProvider provideTestExtractMetaData
+        */
+       public function testExtractMetaData( $header, $expectedResult ) {
+               // Put header into file
+               file_put_contents( $this->tempFileName, $header );
+
+               $this->assertEquals( $expectedResult, WebPHandler::extractMetadata( $this->tempFileName ) );
+       }
+       public function provideTestExtractMetaData() {
+               return array(
+                       // Files from https://developers.google.com/speed/webp/gallery2
+                       array( "\x52\x49\x46\x46\x90\x68\x01\x00\x57\x45\x42\x50\x56\x50\x38\x4C\x83\x68\x01\x00\x2F\x8F\x01\x4B\x10\x8D\x38\x6C\xDB\x46\x92\xE0\xE0\x82\x7B\x6C",
+                               array( 'compression' => 'lossless', 'width' => 400, 'height' => 301 ) ),
+                       array( "\x52\x49\x46\x46\x64\x5B\x00\x00\x57\x45\x42\x50\x56\x50\x38\x58\x0A\x00\x00\x00\x10\x00\x00\x00\x8F\x01\x00\x2C\x01\x00\x41\x4C\x50\x48\xE5\x0E",
+                               array( 'compression' => 'unknown', 'animated' => false, 'transparency' => true, 'width' => 400, 'height' => 301) ),
+                       array( "\x52\x49\x46\x46\xA8\x72\x00\x00\x57\x45\x42\x50\x56\x50\x38\x4C\x9B\x72\x00\x00\x2F\x81\x81\x62\x10\x8D\x40\x8C\x24\x39\x6E\x73\x73\x38\x01\x96",
+                               array( 'compression' => 'lossless', 'width' => 386, 'height' => 395 ) ),
+                       array( "\x52\x49\x46\x46\xE0\x42\x00\x00\x57\x45\x42\x50\x56\x50\x38\x58\x0A\x00\x00\x00\x10\x00\x00\x00\x81\x01\x00\x8A\x01\x00\x41\x4C\x50\x48\x56\x10",
+                               array( 'compression' => 'unknown', 'animated' => false, 'transparency' => true, 'width' => 386, 'height' => 395 ) ),
+                       array( "\x52\x49\x46\x46\x70\x61\x02\x00\x57\x45\x42\x50\x56\x50\x38\x4C\x63\x61\x02\x00\x2F\x1F\xC3\x95\x10\x8D\xC8\x72\xDB\xC8\x92\x24\xD8\x91\xD9\x91",
+                               array( 'compression' => 'lossless', 'width' => 800, 'height' => 600 ) ),
+                       array( "\x52\x49\x46\x46\x1C\x1D\x01\x00\x57\x45\x42\x50\x56\x50\x38\x58\x0A\x00\x00\x00\x10\x00\x00\x00\x1F\x03\x00\x57\x02\x00\x41\x4C\x50\x48\x25\x8B",
+                               array( 'compression' => 'unknown', 'animated' => false, 'transparency' => true, 'width' => 800, 'height' => 600 ) ),
+                       array( "\x52\x49\x46\x46\xFA\xC5\x00\x00\x57\x45\x42\x50\x56\x50\x38\x4C\xEE\xC5\x00\x00\x2F\xA4\x81\x28\x10\x8D\x40\x68\x24\xC9\x91\xA4\xAE\xF3\x97\x75",
+                               array( 'compression' => 'lossless', 'width' => 421, 'height' => 163 ) ),
+                       array( "\x52\x49\x46\x46\xF6\x5D\x00\x00\x57\x45\x42\x50\x56\x50\x38\x58\x0A\x00\x00\x00\x10\x00\x00\x00\xA4\x01\x00\xA2\x00\x00\x41\x4C\x50\x48\x38\x1A",
+                               array( 'compression' => 'unknown', 'animated' => false, 'transparency' => true, 'width' => 421, 'height' => 163 ) ),
+                       array( "\x52\x49\x46\x46\xC4\x96\x01\x00\x57\x45\x42\x50\x56\x50\x38\x4C\xB8\x96\x01\x00\x2F\x2B\xC1\x4A\x10\x11\x87\x6D\xDB\x48\x12\xFC\x60\xB0\x83\x24",
+                               array( 'compression' => 'lossless', 'width' => 300, 'height' => 300 ) ),
+                       array( "\x52\x49\x46\x46\x0A\x11\x01\x00\x57\x45\x42\x50\x56\x50\x38\x58\x0A\x00\x00\x00\x10\x00\x00\x00\x2B\x01\x00\x2B\x01\x00\x41\x4C\x50\x48\x67\x6E",
+                               array( 'compression' => 'unknown', 'animated' => false, 'transparency' => true, 'width' => 300, 'height' => 300 ) ),
+
+                       // Lossy files from https://developers.google.com/speed/webp/gallery1
+                       array( "\x52\x49\x46\x46\x68\x76\x00\x00\x57\x45\x42\x50\x56\x50\x38\x20\x5C\x76\x00\x00\xD2\xBE\x01\x9D\x01\x2A\x26\x02\x70\x01\x3E\xD5\x4E\x97\x43\xA2",
+                               array( 'compression' => 'lossy', 'width' => 550, 'height' => 368 ) ),
+                       array( "\x52\x49\x46\x46\xB0\xEC\x00\x00\x57\x45\x42\x50\x56\x50\x38\x20\xA4\xEC\x00\x00\xB2\x4B\x02\x9D\x01\x2A\x26\x02\x94\x01\x3E\xD1\x50\x96\x46\x26",
+                               array( 'compression' => 'lossy', 'width' => 550, 'height' => 404 ) ),
+                       array( "\x52\x49\x46\x46\x7A\x19\x03\x00\x57\x45\x42\x50\x56\x50\x38\x20\x6E\x19\x03\x00\xB2\xF8\x09\x9D\x01\x2A\x00\x05\xD0\x02\x3E\xAD\x46\x99\x4A\xA5",
+                               array( 'compression' => 'lossy', 'width' => 1280, 'height' => 720 ) ),
+                       array( "\x52\x49\x46\x46\x44\xB3\x02\x00\x57\x45\x42\x50\x56\x50\x38\x20\x38\xB3\x02\x00\x52\x57\x06\x9D\x01\x2A\x00\x04\x04\x03\x3E\xA5\x44\x96\x49\x26",
+                               array( 'compression' => 'lossy', 'width' => 1024, 'height' => 772) ),
+                       array( "\x52\x49\x46\x46\x02\x43\x01\x00\x57\x45\x42\x50\x56\x50\x38\x20\xF6\x42\x01\x00\x12\xC0\x05\x9D\x01\x2A\x00\x04\xF0\x02\x3E\x79\x34\x93\x47\xA4",
+                               array( 'compression' => 'lossy', 'width' => 1024, 'height' => 752) ),
+
+                       // Animated file from https://groups.google.com/a/chromium.org/d/topic/blink-dev/Y8tRC4mdQz8/discussion
+                       array( "\x52\x49\x46\x46\xD0\x0B\x02\x00\x57\x45\x42\x50\x56\x50\x38\x58\x0A\x00\x00\x00\x12\x00\x00\x00\x3F\x01\x00\x3F\x01\x00\x41\x4E",
+                               array( 'compression' => 'unknown', 'animated' => true, 'transparency' => true, 'width' => 320, 'height' => 320 ) ),
+
+                       // Error cases
+                       array( '', false ),
+                       array( '                                    ', false ),
+                       array( 'RIFF                                ', false ),
+                       array( 'RIFF1234WEBP                        ', false ),
+                       array( 'RIFF1234WEBPVP8                     ', false ),
+                       array( 'RIFF1234WEBPVP8L                    ', false ),
+               );
+       }
+
+       /**
+        * @dataProvider provideTestWithFileExtractMetaData
+        */
+       public function testWithFileExtractMetaData( $filename, $expectedResult ) {
+               $this->assertEquals( $expectedResult, WebPHandler::extractMetadata( $filename ) );
+       }
+       public function provideTestWithFileExtractMetaData() {
+               return array(
+                               array( __DIR__ . '/../../data/media/2_webp_ll.webp',
+                                       array( 'compression' => 'lossless', 'width' => 386, 'height' => 395 ) ),
+                               array( __DIR__ . '/../../data/media/2_webp_a.webp',
+                                       array( 'compression' => 'lossy', 'animated' => false, 'transparency' => true, 'width' => 386, 'height' => 395 ) ),
+               );
+       }
+
+       /**
+        * @dataProvider provideTestGetImageSize
+        */
+       public function testGetImageSize( $path, $expectedResult ) {
+               $handler = new WebPHandler();
+               $this->assertEquals( $expectedResult, $handler->getImageSize( null, $path ) );
+       }
+       public function provideTestGetImageSize() {
+               return array(
+                       // Public domain files from https://developers.google.com/speed/webp/gallery2
+                       array( __DIR__ . '/../../data/media/2_webp_a.webp', array( 386, 395 ) ),
+                       array( __DIR__ . '/../../data/media/2_webp_ll.webp', array( 386, 395 ) ),
+                       array( __DIR__ . '/../../data/media/webp_animated.webp', array( 300, 225 ) ),
+
+                       // Error cases
+                       array( __FILE__, false ),
+               );
+       }
+
+       /**
+        * Tests the WebP MIME detection. This should really be a separate test, but sticking it
+        * here for now.
+        *
+        * @dataProvider provideTestGetMimeType
+        */
+       public function testGuessMimeType( $path ) {
+               $mime = MimeMagic::singleton();
+               $this->assertEquals( 'image/webp', $mime->guessMimeType( $path, false ) );
+       }
+       public function provideTestGetMimeType() {
+               return array(
+                               // Public domain files from https://developers.google.com/speed/webp/gallery2
+                               array( __DIR__ . '/../../data/media/2_webp_a.webp' ),
+                               array( __DIR__ . '/../../data/media/2_webp_ll.webp' ),
+                               array( __DIR__ . '/../../data/media/webp_animated.webp' ),
+               );
+       }
+}
+
+/* Python code to extract a header and convert to PHP format:
+ * print '"%s"' % ''.join( '\\x%02X' % ord(c) for c in urllib.urlopen(url).read(36) )
+ */