From: jenkins-bot Date: Tue, 10 Nov 2015 00:22:04 +0000 (+0000) Subject: Merge "Don't apply CSS columns if less than 3 results were found on AllPages & Prefix... X-Git-Tag: 1.31.0-rc.0~9046 X-Git-Url: https://git.heureux-cyclage.org/?a=commitdiff_plain;h=2ea16fbfcd5749a5838fc43f85f1794d918dc3c6;hp=0968cce3f78b81dc32b0db097b5a6a61fffc5ce9;p=lhc%2Fweb%2Fwiklou.git Merge "Don't apply CSS columns if less than 3 results were found on AllPages & PrefixIndex" --- diff --git a/includes/api/i18n/es.json b/includes/api/i18n/es.json index ff80444ae9..91d8fafed6 100644 --- a/includes/api/i18n/es.json +++ b/includes/api/i18n/es.json @@ -168,6 +168,7 @@ "apihelp-help-param-helpformat": "Formato de salida de la ayuda.", "apihelp-help-param-toc": "Incluir una tabla de contenidos en la salida HTML.", "apihelp-help-example-main": "Ayuda del módulo principal", + "apihelp-help-example-submodules": "Ayuda para action=query y todos sus submódulos.", "apihelp-help-example-recursive": "Toda la ayuda en una página", "apihelp-help-example-help": "Ayuda del módulo de ayuda en sí", "apihelp-help-example-query": "Ayuda para dos submódulos de consulta.", diff --git a/includes/api/i18n/fr.json b/includes/api/i18n/fr.json index 4e7662c4d5..7eb49d22b7 100644 --- a/includes/api/i18n/fr.json +++ b/includes/api/i18n/fr.json @@ -194,6 +194,7 @@ "apihelp-help-param-wrap": "Inclut la sortie dans une structure de réponse API standard.", "apihelp-help-param-toc": "Inclure une table des matières dans la sortir HTML.", "apihelp-help-example-main": "Aide pour le module principal", + "apihelp-help-example-submodules": "Aide pour action=query et tous ses sous-modules.", "apihelp-help-example-recursive": "Toute l’aide sur une page", "apihelp-help-example-help": "Aide pour le module d’aide lui-même", "apihelp-help-example-query": "Aide pour deux sous-modules de recherche", @@ -968,6 +969,7 @@ "apihelp-query+revisions+base-param-section": "Récupérer uniquement le contenu de ce numéro de section.", "apihelp-query+revisions+base-param-diffto": "ID de révision à comparer à chaque révision. Utiliser prev, next et cur pour la version précédente, suivante et actuelle respectivement.", "apihelp-query+revisions+base-param-difftotext": "Texte auquel comparer chaque révision. Compare uniquement un nombre limité de révisions. Écrase $1diffto. Si $1section est positionné, seule cette section sera comparée avec ce texte", + "apihelp-query+revisions+base-param-difftotextpst": "Effectuer une transformation avant enregistrement sur le texte avant de le comparer. Valide uniquement quand c’est utilisé avec $1difftotext.", "apihelp-query+revisions+base-param-contentformat": "Format de sérialisation utilisé pour $1difftotext et attendu pour la sortie du contenu.", "apihelp-query+search-description": "Effectuer une recherche en texte intégral.", "apihelp-query+search-param-search": "Rechercher les titres de page ou le contenu correspondant à cette valeur. Vous pouvez utiliser la chaîne de recherche pour invoquer des fonctionnalités de recherche spéciales, selon ce que le serveur de recherche du wiki implémente.", @@ -1141,9 +1143,12 @@ "apihelp-query+watchlist-paramvalue-prop-notificationtimestamp": "Ajoute l’horodatage de la dernière notification de la modification à l’utilisateur.", "apihelp-query+watchlist-paramvalue-prop-loginfo": "Ajoute l’information de trace le cas échéant.", "apihelp-query+watchlist-param-show": "Afficher uniquement les éléments qui correspondent à ces critères. Par exemple, pour voir uniquement les modifications mineures faites par des utilisateurs connectés, mettre $1show=minor|!anon.", - "apihelp-query+watchlist-param-type": "Quels types de modification afficher :\n;edit:Modifications ordinaires de page.\n;external:Modifications externes.\n;new:Créations de page.\n;log:Entrées du journal.", + "apihelp-query+watchlist-param-type": "Quels types de modification afficher :", + "apihelp-query+watchlist-paramvalue-type-edit": "Modifications normales de page", + "apihelp-query+watchlist-paramvalue-type-external": "Modifications externes.", "apihelp-query+watchlist-paramvalue-type-new": "Créations de pages.", "apihelp-query+watchlist-paramvalue-type-log": "Entrées du journal.", + "apihelp-query+watchlist-paramvalue-type-categorize": "Modifications d’appartenance aux catégories.", "apihelp-query+watchlist-param-owner": "Utilisé avec $1token pour accéder à la liste de suivi d’un autre utilisateur.", "apihelp-query+watchlist-param-token": "Un jeton de sécurité (disponible dans les [[Special:Preferences#mw-prefsection-watchlist|préférences]] de l’utilsiateur) pour autoriser l’accès à la liste de suivi d&un autre utilisateur.", "apihelp-query+watchlist-example-simple": "Lister la révision de tête des pages récemment modifiées dans la liste de suivi de l’utilisateur actuel", diff --git a/includes/api/i18n/gl.json b/includes/api/i18n/gl.json index fd561d9e6c..db69e78364 100644 --- a/includes/api/i18n/gl.json +++ b/includes/api/i18n/gl.json @@ -183,6 +183,7 @@ "apihelp-help-param-wrap": "Incluír a saída nunha estrutura de resposta API estándar.", "apihelp-help-param-toc": "Incluír unha táboa de contidos na saída por HTML", "apihelp-help-example-main": "Axuda para o módulo principal", + "apihelp-help-example-submodules": "Axuda para action=query e todos os seus submódulos.", "apihelp-help-example-recursive": "Toda a axuda nunha páxina", "apihelp-help-example-help": "Axuda do módulo de axuda en si", "apihelp-help-example-query": "Axuda para dous submódulos de consulta.", diff --git a/includes/api/i18n/it.json b/includes/api/i18n/it.json index 89e270164a..78dd9b3f52 100644 --- a/includes/api/i18n/it.json +++ b/includes/api/i18n/it.json @@ -17,8 +17,8 @@ "apihelp-main-param-format": "Formato dell'output.", "apihelp-main-param-assert": "Verifica che l'utente sia loggato se si è impostato utente, o che abbia i permessi di bot se si è impostato bot.", "apihelp-main-param-requestid": "Tutti i valori forniti saranno implementati nella risposta. Potrebbero venir utilizzati per distinguere le richieste.", - "apihelp-main-param-servedby": "Includi nei risultati il nome dell'host che ha servito la richiesta.", - "apihelp-main-param-curtimestamp": "Includere il timestamp corrente nel risultato.", + "apihelp-main-param-servedby": "Includi nel risultato il nome dell'host che ha servito la richiesta.", + "apihelp-main-param-curtimestamp": "Includi nel risultato il timestamp attuale.", "apihelp-block-description": "Blocca un utente.", "apihelp-block-param-user": "Nome utente, indirizzo IP o range di IP da bloccare.", "apihelp-block-param-reason": "Motivo del blocco.", diff --git a/includes/api/i18n/uk.json b/includes/api/i18n/uk.json index 90685821a7..79e2e9c91e 100644 --- a/includes/api/i18n/uk.json +++ b/includes/api/i18n/uk.json @@ -181,6 +181,7 @@ "apihelp-help-param-wrap": "Помістити результат у стандартну структуру API-відповіді.", "apihelp-help-param-toc": "Включити зміст у HTML-результат.", "apihelp-help-example-main": "Довідка для головного модуля.", + "apihelp-help-example-submodules": "Довідка для action=query та усіх її підмодулів.", "apihelp-help-example-recursive": "Уся довідка на одній сторінці.", "apihelp-help-example-help": "Довідка для самого модуля довідки.", "apihelp-help-example-query": "Довідка для двох підмодулів запитів.", @@ -290,7 +291,7 @@ "apihelp-parse-param-pst": "Зробіть трансформацію вхідних даних перед збереженням і аналізом. Дійсне лише при використанні з текстом.", "apihelp-parse-param-onlypst": "Зробіть трансформацію вхідних даних перед збереженням (PST), але не аналізуйте. Видає той самий вікітекст, після застосування PST. Дійсне лише у разі використання з $1text.", "apihelp-parse-param-effectivelanglinks": "Включає мовні посилання, додані розширеннями (для використання з $1prop=langlinks).", - "apihelp-parse-param-section": "Видає вміст лише розділу з цим номером або при new створенні нового розділу.\n\nnew розділ відзначається лише при вказанні тексту text.", + "apihelp-parse-param-section": "Розібрати вміст лише розділу з цим номером .\n\nЯкщо new, розібрати $1text та $1sectiontitle, як ніби новий розділ додається на сторінку.\n\nnew дозволяється лише про вказаному text.", "apihelp-parse-param-sectiontitle": "Заголовок нового розділу, коли section має значення new.\n\nНа відміну від редагування сторінки, це не повертається до summary, якщо пропустити чи лишити порожнім.", "apihelp-parse-param-disablelimitreport": "Пропустити звіт про ліміти («NewPP limit report») на виході аналізу.", "apihelp-parse-param-disablepp": "Використати натомість $1disablelimitreport.", @@ -955,6 +956,7 @@ "apihelp-query+revisions+base-param-section": "Витягнути вміст лише розділу з цим номером.", "apihelp-query+revisions+base-param-diffto": "ID версії, з якою порівняти кожну версію. Використайте prev, next і cur для попередньої, наступної та поточної версій відповідно.", "apihelp-query+revisions+base-param-difftotext": "Текст, з яким порівняти кожну версію. Порівнює лише обмежену кількість версій. Перевизначає $1diffto. Якщо вказано $1section, лише ця версія буде порівняна з цим текстом.", + "apihelp-query+revisions+base-param-difftotextpst": "Виконати попередню трансформацію тексту перед виведенням дифу. Дійсне лише з використанням $1difftotext.", "apihelp-query+revisions+base-param-contentformat": "Формат серіалізації, використаний для $1difftotext й очікуваний для контенту-результату.", "apihelp-query+search-description": "Виконати повнотекстовий пошук.", "apihelp-query+search-param-search": "Шукати назви сторінок або вміст, що співпадає з цим значенням. Ви можете використати рядок пошуку для виклику спеціальних функцій пошуку, залежно від внутрішніх установок пошуку у вікі.", @@ -995,7 +997,7 @@ "apihelp-query+siteinfo-paramvalue-prop-usergroups": "Видає групи користувачів і пов'язані дозволи.", "apihelp-query+siteinfo-paramvalue-prop-libraries": "Видає бібліотеки, встановлені у вікі.", "apihelp-query+siteinfo-paramvalue-prop-extensions": "Видає розширення, встановлені у вікі.", - "apihelp-query+siteinfo-paramvalue-prop-fileextensions": "Видає список розширень файлів, які дозволено завантажувати.", + "apihelp-query+siteinfo-paramvalue-prop-fileextensions": "Видає список розширень файлів (типів файлів), які дозволено завантажувати.", "apihelp-query+siteinfo-paramvalue-prop-rightsinfo": "Видає інформацію щодо прав (ліцензії) вікі, якщо наявна.", "apihelp-query+siteinfo-paramvalue-prop-restrictions": "Видає інформацію про наявні типи обмежень (захисту).", "apihelp-query+siteinfo-paramvalue-prop-languages": "Видає список мов, які підтримує MediaWiki (за бажанням локалізовані через $1inlanguagecode).", @@ -1128,11 +1130,12 @@ "apihelp-query+watchlist-paramvalue-prop-notificationtimestamp": "Додає мітку часу, коли користувач був востаннє сповіщений про редагування.", "apihelp-query+watchlist-paramvalue-prop-loginfo": "Додає інформацію журналу, де це доречно.", "apihelp-query+watchlist-param-show": "Показати лише елементи, що задовільняють ці критерії. Наприклад, для перегляду лише незначних змін, здійснених користувачами, що увійшли до системи, вкажіть $1show=minor|!anon.", - "apihelp-query+watchlist-param-type": "Які типи змін показувати:\n;edit:Звичайні редагування сторінки.\n;external:Зовнішні зміни.\n;new:Створення сторінок.\n;log:Записи журналу.", + "apihelp-query+watchlist-param-type": "Які типи змін показувати:", "apihelp-query+watchlist-paramvalue-type-edit": "Регулярні сторінки правок.", "apihelp-query+watchlist-paramvalue-type-external": "Зовнішні зміни.", "apihelp-query+watchlist-paramvalue-type-new": "Сторінка створена.", "apihelp-query+watchlist-paramvalue-type-log": "Записи в журналі.", + "apihelp-query+watchlist-paramvalue-type-categorize": "Зміни членства в категорії.", "apihelp-query+watchlist-param-owner": "Використовується разом з $1token для доступу до списку спостереження різних користувачів.", "apihelp-query+watchlist-param-token": "Токен безпеки (доступний у [[Special:Preferences#mw-prefsection-watchlist|налаштуваннях]] користувача) для отримання доступу до списку спостереження іншого користувача.", "apihelp-query+watchlist-example-simple": "Перелічити верхні версії для нещодавно змінених сторінок у списку спостереження поточного користувача.", @@ -1267,7 +1270,7 @@ "apihelp-php-description": "Виводити дані у форматі серіалізованого PHP.", "apihelp-php-param-formatversion": "Форматування виводу:\n;1:Формат зворотної сумісності (булеви XML-стилю, * ключі для вузлів вмісту тощо).\n;2:Експериментальний сучасний формат. Деталі можуть змінюватись.\n;latest:Використовувати найостанніший формат (наразі 2). Може змінюватись без попередження.", "apihelp-phpfm-description": "Виводити дані у форматі серіалізованого PHP (вивід відформатованого коду за допомогою HTML).", - "apihelp-rawfm-description": "Виводити дані у форматі JSON разом з елементами налагодження (вивід відформатованого коду за допомогою HTML).", + "apihelp-rawfm-description": "Виводити дані, включно з елементами налагодження, у форматі JSON (вивід відформатованого коду за допомогою HTML).", "apihelp-txt-description": "Виводити дані у форматі PHP print_r().", "apihelp-txtfm-description": "Виводити дані у форматі PHP print_r() (вивід відформатованого коду за допомогою HTML).", "apihelp-xml-description": "Виводити дані у форматі XML.", diff --git a/includes/cache/LinkCache.php b/includes/cache/LinkCache.php index 93b4b57be2..5ea926bfb5 100644 --- a/includes/cache/LinkCache.php +++ b/includes/cache/LinkCache.php @@ -28,11 +28,11 @@ */ class LinkCache { /** - * @var MapCacheLRU + * @var HashBagOStuff */ private $mGoodLinks; /** - * @var MapCacheLRU + * @var HashBagOStuff */ private $mBadLinks; private $mForUpdate = false; @@ -49,8 +49,8 @@ class LinkCache { protected static $instance; public function __construct() { - $this->mGoodLinks = new MapCacheLRU( self::MAX_SIZE ); - $this->mBadLinks = new MapCacheLRU( self::MAX_SIZE ); + $this->mGoodLinks = new HashBagOStuff( array( 'maxKeys' => self::MAX_SIZE ) ); + $this->mBadLinks = new HashBagOStuff( array( 'maxKeys' => self::MAX_SIZE ) ); } /** @@ -58,32 +58,35 @@ class LinkCache { * * @return LinkCache */ - static function &singleton() { - if ( self::$instance ) { - return self::$instance; + public static function &singleton() { + if ( !self::$instance ) { + self::$instance = new LinkCache; } - self::$instance = new LinkCache; return self::$instance; } /** - * Destroy the singleton instance, a new one will be created next time - * singleton() is called. + * Destroy the singleton instance + * + * A new one will be created next time singleton() is called. + * * @since 1.22 */ - static function destroySingleton() { + public static function destroySingleton() { self::$instance = null; } /** * Set the singleton instance to a given object. + * * Since we do not have an interface for LinkCache, you have to be sure the * given object implements all the LinkCache public methods. + * * @param LinkCache $instance * @since 1.22 */ - static function setSingleton( LinkCache $instance ) { + public static function setSingleton( LinkCache $instance ) { self::$instance = $instance; } @@ -103,32 +106,30 @@ class LinkCache { /** * @param string $title - * @return int + * @return int Page ID or zero */ public function getGoodLinkID( $title ) { - if ( $this->mGoodLinks->has( $title ) ) { - $info = $this->mGoodLinks->get( $title ); - return $info['id']; - } else { + $info = $this->mGoodLinks->get( $title ); + if ( !$info ) { return 0; } + return $info['id']; } /** * Get a field of a title object from cache. - * If this link is not good, it will return NULL. + * If this link is not a cached good title, it will return NULL. * @param Title $title * @param string $field ('length','redirect','revision','model') - * @return string|null + * @return string|int|null */ public function getGoodLinkFieldObj( $title, $field ) { $dbkey = $title->getPrefixedDBkey(); - if ( $this->mGoodLinks->has( $dbkey ) ) { - $info = $this->mGoodLinks->get( $dbkey ); - return $info[$field]; - } else { + $info = $this->mGoodLinks->get( $dbkey ); + if ( !$info ) { return null; } + return $info[$field]; } /** @@ -136,8 +137,8 @@ class LinkCache { * @return bool */ public function isBadLink( $title ) { - // We need to use get here since has will not call ping. - return $this->mBadLinks->get( $title ) !== null; + // Use get() to ensure it records as used for LRU. + return $this->mBadLinks->get( $title ) !== false; } /** @@ -150,7 +151,7 @@ class LinkCache { * @param int $revision Latest revision's ID * @param string|null $model Latest revision's content model ID */ - public function addGoodLinkObj( $id, $title, $len = -1, $redir = null, + public function addGoodLinkObj( $id, Title $title, $len = -1, $redir = null, $revision = 0, $model = null ) { $dbkey = $title->getPrefixedDBkey(); @@ -170,7 +171,7 @@ class LinkCache { * @param stdClass $row Object which has the fields page_id, page_is_redirect, * page_latest and page_content_model */ - public function addGoodLinkObjFromRow( $title, $row ) { + public function addGoodLinkObjFromRow( Title $title, $row ) { $dbkey = $title->getPrefixedDBkey(); $this->mGoodLinks->set( $dbkey, array( 'id' => intval( $row->page_id ), @@ -184,7 +185,7 @@ class LinkCache { /** * @param Title $title */ - public function addBadLinkObj( $title ) { + public function addBadLinkObj( Title $title ) { $dbkey = $title->getPrefixedDBkey(); if ( !$this->isBadLink( $dbkey ) ) { $this->mBadLinks->set( $dbkey, 1 ); @@ -200,32 +201,31 @@ class LinkCache { */ public function clearLink( $title ) { $dbkey = $title->getPrefixedDBkey(); - $this->mBadLinks->clear( array( $dbkey ) ); - $this->mGoodLinks->clear( array( $dbkey ) ); + $this->mBadLinks->delete( $dbkey ); + $this->mGoodLinks->delete( $dbkey ); } /** * Add a title to the link cache, return the page_id or zero if non-existent * * @param string $title Title to add - * @return int + * @return int Page ID or zero */ public function addLink( $title ) { $nt = Title::newFromDBkey( $title ); - if ( $nt ) { - return $this->addLinkObj( $nt ); - } else { + if ( !$nt ) { return 0; } + return $this->addLinkObj( $nt ); } /** * Add a title to the link cache, return the page_id or zero if non-existent * * @param Title $nt Title object to add - * @return int + * @return int Page ID or zero */ - public function addLinkObj( $nt ) { + public function addLinkObj( Title $nt ) { global $wgContentHandlerUseDB; $key = $nt->getPrefixedDBkey(); @@ -241,25 +241,22 @@ class LinkCache { return 0; } - # Some fields heavily used for linking... - if ( $this->mForUpdate ) { - $db = wfGetDB( DB_MASTER ); - } else { - $db = wfGetDB( DB_SLAVE ); - } + // Some fields heavily used for linking... + $db = $this->mForUpdate ? wfGetDB( DB_MASTER ) : wfGetDB( DB_SLAVE ); - $f = array( 'page_id', 'page_len', 'page_is_redirect', 'page_latest' ); + $fields = array( 'page_id', 'page_len', 'page_is_redirect', 'page_latest' ); if ( $wgContentHandlerUseDB ) { - $f[] = 'page_content_model'; + $fields[] = 'page_content_model'; } - $s = $db->selectRow( 'page', $f, + $row = $db->selectRow( 'page', $fields, array( 'page_namespace' => $nt->getNamespace(), 'page_title' => $nt->getDBkey() ), - __METHOD__ ); - # Set fields... - if ( $s !== false ) { - $this->addGoodLinkObjFromRow( $nt, $s ); - $id = intval( $s->page_id ); + __METHOD__ + ); + + if ( $row !== false ) { + $this->addGoodLinkObjFromRow( $nt, $row ); + $id = intval( $row->page_id ); } else { $this->addBadLinkObj( $nt ); $id = 0; diff --git a/includes/cache/LocalisationCache.php b/includes/cache/LocalisationCache.php index 03841d6ac0..fad8ee856f 100644 --- a/includes/cache/LocalisationCache.php +++ b/includes/cache/LocalisationCache.php @@ -1147,29 +1147,32 @@ interface LCStore { * This will work on any MediaWiki installation. */ class LCStoreDB implements LCStore { + /** @var string */ private $currentLang; + /** @var bool */ private $writesDone = false; - - /** @var DatabaseBase */ + /** @var IDatabase */ private $dbw; /** @var array */ private $batch = array(); - + /** @var bool */ private $readOnly = false; public function get( $code, $key ) { - if ( $this->writesDone ) { - $db = wfGetDB( DB_MASTER ); + if ( $this->writesDone && $this->dbw ) { + $db = $this->dbw; // see the changes in finishWrite() } else { $db = wfGetDB( DB_SLAVE ); } - $row = $db->selectRow( 'l10n_cache', array( 'lc_value' ), - array( 'lc_lang' => $code, 'lc_key' => $key ), __METHOD__ ); - if ( $row ) { - return unserialize( $db->decodeBlob( $row->lc_value ) ); - } else { - return null; - } + + $value = $db->selectField( + 'l10n_cache', + 'lc_value', + array( 'lc_lang' => $code, 'lc_key' => $key ), + __METHOD__ + ); + + return ( $value !== false ) ? unserialize( $db->decodeBlob( $value ) ) : null; } public function startWrite( $code ) { @@ -1180,6 +1183,7 @@ class LCStoreDB implements LCStore { } $this->dbw = wfGetDB( DB_MASTER ); + $this->readOnly = $this->dbw->isReadOnly(); $this->currentLang = $code; $this->batch = array(); @@ -1192,10 +1196,13 @@ class LCStoreDB implements LCStore { throw new MWException( __CLASS__ . ': must call startWrite() before finishWrite()' ); } - $this->dbw->begin( __METHOD__ ); + $this->dbw->startAtomic( __METHOD__ ); try { - $this->dbw->delete( 'l10n_cache', - array( 'lc_lang' => $this->currentLang ), __METHOD__ ); + $this->dbw->delete( + 'l10n_cache', + array( 'lc_lang' => $this->currentLang ), + __METHOD__ + ); foreach ( array_chunk( $this->batch, 500 ) as $rows ) { $this->dbw->insert( 'l10n_cache', $rows, __METHOD__ ); } @@ -1207,7 +1214,7 @@ class LCStoreDB implements LCStore { throw $e; } } - $this->dbw->commit( __METHOD__ ); + $this->dbw->endAtomic( __METHOD__ ); $this->currentLang = null; $this->batch = array(); @@ -1223,7 +1230,8 @@ class LCStoreDB implements LCStore { $this->batch[] = array( 'lc_lang' => $this->currentLang, 'lc_key' => $key, - 'lc_value' => $this->dbw->encodeBlob( serialize( $value ) ) ); + 'lc_value' => $this->dbw->encodeBlob( serialize( $value ) ) + ); } } diff --git a/includes/cache/MessageBlobStore.php b/includes/cache/MessageBlobStore.php index 6290eaea01..ab7e1717c5 100644 --- a/includes/cache/MessageBlobStore.php +++ b/includes/cache/MessageBlobStore.php @@ -41,6 +41,16 @@ class MessageBlobStore { */ protected $blobCache = array(); + /* @var ResourceLoader */ + protected $resourceloader; + + /** + * @param ResourceLoader $resourceloader + */ + public function __construct( ResourceLoader $resourceloader = null ) { + $this->resourceloader = $resourceloader; + } + /** * Get the singleton instance * @@ -131,29 +141,14 @@ class MessageBlobStore { array( 'IGNORE' ) ); - if ( $success ) { - if ( $dbw->affectedRows() == 0 ) { - // Blob was already present, fetch it - $blob = $dbw->selectField( 'msg_resource', 'mr_blob', array( - 'mr_resource' => $name, - 'mr_lang' => $lang, - ), - __METHOD__ - ); - } else { - // Update msg_resource_links - $rows = array(); - - foreach ( $module->getMessages() as $key ) { - $rows[] = array( - 'mrl_resource' => $name, - 'mrl_message' => $key - ); - } - $dbw->insert( 'msg_resource_links', $rows, - __METHOD__, array( 'IGNORE' ) - ); - } + if ( $success && $dbw->affectedRows() == 0 ) { + // Blob was already present, fetch it + $blob = $dbw->selectField( 'msg_resource', 'mr_blob', array( + 'mr_resource' => $name, + 'mr_lang' => $lang, + ), + __METHOD__ + ); } } catch ( DBError $e ) { wfDebug( __METHOD__ . " failed to update DB: $e\n" ); @@ -180,8 +175,6 @@ class MessageBlobStore { return null; } - // Save the old and new blobs for later - $oldBlob = $row->mr_blob; $newBlob = $this->generateMessageBlob( $module, $lang ); try { @@ -196,36 +189,6 @@ class MessageBlobStore { array( array( 'mr_resource', 'mr_lang' ) ), $newRow, __METHOD__ ); - - // Figure out which messages were added and removed - $oldMessages = array_keys( FormatJson::decode( $oldBlob, true ) ); - $newMessages = array_keys( FormatJson::decode( $newBlob, true ) ); - $added = array_diff( $newMessages, $oldMessages ); - $removed = array_diff( $oldMessages, $newMessages ); - - // Delete removed messages, insert added ones - if ( $removed ) { - $dbw->delete( 'msg_resource_links', array( - 'mrl_resource' => $name, - 'mrl_message' => $removed - ), __METHOD__ - ); - } - - $newLinksRows = array(); - - foreach ( $added as $message ) { - $newLinksRows[] = array( - 'mrl_resource' => $name, - 'mrl_message' => $message - ); - } - - if ( $newLinksRows ) { - $dbw->insert( 'msg_resource_links', $newLinksRows, __METHOD__, - array( 'IGNORE' ) // just in case - ); - } } catch ( Exception $e ) { wfDebug( __METHOD__ . " failed to update DB: $e\n" ); } @@ -273,26 +236,36 @@ class MessageBlobStore { } } while ( count( $updates ) ); - // No need to update msg_resource_links because we didn't add - // or remove any messages, we just changed their contents. } catch ( Exception $e ) { wfDebug( __METHOD__ . " failed to update DB: $e\n" ); } } public function clear() { - // TODO: Give this some more thought try { // Not using TRUNCATE, because that needs extra permissions, // which maybe not granted to the database user. $dbw = wfGetDB( DB_MASTER ); $dbw->delete( 'msg_resource', '*', __METHOD__ ); - $dbw->delete( 'msg_resource_links', '*', __METHOD__ ); } catch ( Exception $e ) { wfDebug( __METHOD__ . " failed to update DB: $e\n" ); } } + /** + * @return ResourceLoader + */ + protected function getResourceLoader() { + // For back-compat this class supports instantiation without passing ResourceLoader + // Lazy-initialise this property because most callers don't need it. + if ( $this->resourceloader === null ) { + wfDebug( __CLASS__ . ' created without a ResourceLoader instance' ); + $this->resourceloader = new ResourceLoader(); + } + + return $this->resourceloader; + } + /** * Create an update queue for updateMessage() * @@ -304,11 +277,15 @@ class MessageBlobStore { $dbw = wfGetDB( DB_MASTER ); if ( is_null( $prevUpdates ) ) { + $rl = $this->getResourceLoader(); + $moduleNames = $rl->getModulesByMessage( $key ); // Fetch all blobs referencing $key $res = $dbw->select( - array( 'msg_resource', 'msg_resource_links' ), + array( 'msg_resource' ), array( 'mr_resource', 'mr_lang', 'mr_blob', 'mr_timestamp' ), - array( 'mrl_message' => $key, 'mr_resource=mrl_resource' ), + array( + 'mr_resource' => $moduleNames, + ), __METHOD__ ); } else { diff --git a/includes/cache/MessageCache.php b/includes/cache/MessageCache.php index ae746e3236..2818d2f122 100644 --- a/includes/cache/MessageCache.php +++ b/includes/cache/MessageCache.php @@ -578,7 +578,8 @@ class MessageCache { } // Update the message in the message blob store - $blobStore = new MessageBlobStore(); + $resourceloader = RequestContext::getMain()->getOutput()->getResourceLoader(); + $blobStore = $resourceloader->getMessageBlobStore(); $blobStore->updateMessage( $wgContLang->lcfirst( $msg ) ); Hooks::run( 'MessageCacheReplace', array( $title, $text ) ); diff --git a/includes/filebackend/SwiftFileBackend.php b/includes/filebackend/SwiftFileBackend.php index 8097549508..72a877d072 100644 --- a/includes/filebackend/SwiftFileBackend.php +++ b/includes/filebackend/SwiftFileBackend.php @@ -861,7 +861,7 @@ class SwiftFileBackend extends FileBackendStore { if ( !empty( $params['topOnly'] ) ) { $status = $this->objectListing( $fullCont, 'names', $limit, $after, $prefix, '/' ); if ( !$status->isOk() ) { - return $dirs; // error + throw new FileBackendError( "Iterator page I/O error: {$status->getMessage()}" ); } $objects = $status->value; foreach ( $objects as $object ) { // files and directories @@ -880,7 +880,7 @@ class SwiftFileBackend extends FileBackendStore { $status = $this->objectListing( $fullCont, 'names', $limit, $after, $prefix ); if ( !$status->isOk() ) { - return $dirs; // error + throw new FileBackendError( "Iterator page I/O error: {$status->getMessage()}" ); } $objects = $status->value; @@ -956,7 +956,7 @@ class SwiftFileBackend extends FileBackendStore { // Reformat this list into a list of (name, stat array or null) entries if ( !$status->isOk() ) { - return $files; // error + throw new FileBackendError( "Iterator page I/O error: {$status->getMessage()}" ); } $objects = $status->value; diff --git a/includes/filerepo/file/LocalFile.php b/includes/filerepo/file/LocalFile.php index cd64f0d127..12d400758c 100644 --- a/includes/filerepo/file/LocalFile.php +++ b/includes/filerepo/file/LocalFile.php @@ -1365,8 +1365,6 @@ class LocalFile extends File { $logId = $logEntry->insert(); if ( $descTitle->exists() ) { - // Page exists, do RC entry now (otherwise we wait for later) - $logEntry->publish( $logId ); // Use own context to get the action text in content language $formatter = LogFormatter::newFromEntry( $logEntry ); $formatter->setContext( RequestContext::newExtraneousContext( $descTitle ) ); @@ -1407,6 +1405,8 @@ class LocalFile extends File { ) { # Update memcache after the commit $that->invalidateCache(); + # Page exists, do RC entry now (otherwise we wait for later) + $logEntry->publish( $logId ); if ( $newPageContent ) { # New file page; create the description page. @@ -1423,7 +1423,6 @@ class LocalFile extends File { // Now that the page exists, make an RC entry. // This relies on the resetArticleID() call in WikiPage::insertOn(), // which is triggered on $descTitle by doEditContent() above. - $logEntry->publish( $logId ); if ( isset( $status->value['revision'] ) ) { /** @var $rev Revision */ $rev = $status->value['revision']; diff --git a/includes/installer/i18n/fr.json b/includes/installer/i18n/fr.json index 87f3374d88..370874b753 100644 --- a/includes/installer/i18n/fr.json +++ b/includes/installer/i18n/fr.json @@ -120,8 +120,6 @@ "config-db-install-account": "Compte d'utilisateur pour l'installation", "config-db-username": "Nom d’utilisateur de la base de données :", "config-db-password": "Mot de passe de la base de données :", - "config-db-password-empty": "Veuillez entrer un mot de passe pour le nouveau compte de la base de données : $1.\nBien qu'il soit possible de créer un compte sans mot de passe, ce n'est pas recommandé pour des questions de sécurité.", - "config-db-username-empty": "Vous devez entrer une valeur pour « {{int:config-db-username}} ».", "config-db-install-username": "Entrez le nom d’utilisateur qui sera utilisé pour se connecter à la base de données pendant le processus d'installation. Il ne s’agit pas du nom d’utilisateur du compte MediaWiki, mais du nom d’utilisateur pour votre base de données.", "config-db-install-password": "Entrez le mot de passe qui sera utilisé pour se connecter à la base de données pendant le processus d'installation. Il ne s’agit pas du mot de passe du compte MediaWiki, mais du mot de passe pour votre base de données.", "config-db-install-help": "Entrez le nom d'utilisateur et le mot de passe qui seront utilisés pour se connecter à la base de données pendant le processus d'installation.", @@ -344,5 +342,5 @@ "config-nofile": "Le fichier « $1 » est introuvable. A-t-il été supprimé ?", "config-extension-link": "Saviez-vous que votre wiki supporte [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions des extensions] ?\n\nVous pouvez consulter les [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category extensions par catégorie].", "mainpagetext": "MediaWiki a été installé avec succès.", - "mainpagedocfooter": "Consultez le [//meta.wikimedia.org/wiki/Help:Contents/fr Guide de l’utilisateur] pour plus d’informations sur l’utilisation de ce logiciel de wiki.\n\n== Pour démarrer ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Liste des paramètres de configuration]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/fr Questions courantes sur MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Liste de discussion sur les distributions de MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Adaptez MediaWiki dans votre langue]" + "mainpagedocfooter": "Consultez le [//meta.wikimedia.org/wiki/Help:Contents/fr Guide de l’utilisateur] pour plus d’informations sur l’utilisation de ce logiciel de wiki.\n\n== Pour démarrer ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Liste des paramètres de configuration]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/fr Questions courantes sur MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Liste de discussion sur les distributions de MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Adaptez MediaWiki dans votre langue]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Apprendre comment lutter contre le pourriel dans votre wiki]" } diff --git a/includes/installer/i18n/mr.json b/includes/installer/i18n/mr.json index 312f3ffa17..03f236beb4 100644 --- a/includes/installer/i18n/mr.json +++ b/includes/installer/i18n/mr.json @@ -61,5 +61,5 @@ "config-install-tables-failed": "त्रूटी:खालील त्रूटीमुळे सारणी बनविणे अयशस्वी:$1", "config-help": "साहाय्य", "mainpagetext": "'''मीडियाविकीचे इन्स्टॉलेशन पूर्ण.'''", - "mainpagedocfooter": "विकी सॉफ्टवेअर वापरण्याकरिता [//meta.wikimedia.org/wiki/Help:Contents यूजर गाईड] पहा.\n\n== सुरुवात ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings कॉन्फिगरेशन सेटींगची यादी]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ मीडियाविकी नेहमी विचारले जाणारे प्रश्न]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce मीडियाविकि मेलिंग लिस्ट]" + "mainpagedocfooter": "विकी सॉफ्टवेअर वापरण्याकरिता [//meta.wikimedia.org/wiki/Help:Contents यूजर गाईड] पहा.\n\n== सुरुवात करा ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings रचित मांडण्याची यादी]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ मिडियाविकि FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-मिडियाविकिची मेलिंग यादीचे विमोचनाची उद्घोषणाannounce MediaWiki release mailing list]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources आपल्या भाषेसाठी मिडियाविकिचे स्थानिकिकरण करा]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam आपल्या विकिवर स्पॅमशी दोन हात कशे करावे ते शिका]" } diff --git a/includes/installer/i18n/sl.json b/includes/installer/i18n/sl.json index d7f435eedc..f5eb7fa6d3 100644 --- a/includes/installer/i18n/sl.json +++ b/includes/installer/i18n/sl.json @@ -48,7 +48,6 @@ "config-env-bad": "Okolje je pregledano.\nNe morete namestiti MediaWiki.", "config-env-php": "Nameščen je PHP $1.", "config-env-hhvm": "HHVM $1 je nameščen.", - "config-unicode-using-utf8": "Uporaba utf8_normalize.so Briona Vibberja za normalizacijo unikoda.", "config-unicode-using-intl": "Uporaba [http://pecl.php.net/intl razširitve PECL intl] za normalizacijo unikoda.", "config-memory-raised": "PHP-jev memory_limit je $1, dvignjen na $2.", "config-xcache": "[http://xcache.lighttpd.net/ XCache] je nameščen", @@ -66,8 +65,6 @@ "config-db-install-account": "Uporabniški račun za namestitev", "config-db-username": "Uporabniško ime zbirke podatkov:", "config-db-password": "Geslo zbirke podatkov:", - "config-db-password-empty": "Prosimo, vnesite geslo za novega uporabnika podatkovne zbirke: $1. Morda je mogoče ustvarjati uporabnike brez gesel, ni pa varno.", - "config-db-username-empty": "Vnesti morate vrednost za \"{{int:config-db-username}}\".", "config-db-install-username": "Vnesite uporabniško ime za povezavo s podatkovno zbirko med postopkom nameščanja.\nTo ni uporabniško ime računa MediaWiki, pač pa uporabniško ime za vašo podatkovno zbirko.", "config-db-install-password": "Vnesite geslo za povezavo s podatkovno zbirko med postopkom nameščanja.\nTo ni geslo računa MediaWiki, pač pa geslo za vašo podatkovno zbirko.", "config-db-install-help": "Vnesite uporabniško ime in geslo za povezavo s podatkovno zbirko med postopkom nameščanja.", @@ -186,5 +183,5 @@ "config-download-localsettings": "Prenesi LocalSettings.php", "config-help": "pomoč", "mainpagetext": "'''Programje MediaWiki je bilo uspešno nameščeno.'''", - "mainpagedocfooter": "Oglejte si [//meta.wikimedia.org/wiki/Help:Contents Uporabniški priročnik] za informacije o uporabi programja wiki.\n\n== Kako začeti ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Seznam konfiguracijskih nastavitev]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Poogsto zastavljena vprašanja MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Poštni seznam izdaj MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Prevedite MediaWiki v svoj jezik]" + "mainpagedocfooter": "Oglejte si [//meta.wikimedia.org/wiki/Help:Contents Uporabniški priročnik] za informacije o uporabi programja wiki.\n\n== Kako začeti ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Seznam konfiguracijskih nastavitev]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Poogsto zastavljena vprašanja MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Poštni seznam izdaj MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Prevedite MediaWiki v svoj jezik]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Izvedite, kako se boriti proti smetju na svojem wikiju]" } diff --git a/includes/installer/i18n/vi.json b/includes/installer/i18n/vi.json index 3923f7e17e..3d85b7bcd2 100644 --- a/includes/installer/i18n/vi.json +++ b/includes/installer/i18n/vi.json @@ -4,7 +4,8 @@ "පසිඳු කාවින්ද", "Minh Nguyen", "Withoutaname", - "Dinhxuanduyet" + "Dinhxuanduyet", + "Nguyên Lê" ] }, "config-desc": "Trình cài đặt MediaWiki", @@ -22,7 +23,7 @@ "config-no-session": "Đã mất dữ liệu phiên làm việc của bạn! Kiểm tra tập tin php.ini và đảm bảo rằng session.save_path đã được đặt thành một thư mục thích hợp.", "config-your-language": "Ngôn ngữ của bạn:", "config-your-language-help": "Chọn một ngôn ngữ để sử dụng trong quá trình cài đặt.", - "config-wiki-language": "Ngôn ngữ wiki:", + "config-wiki-language": "Ngôn ngữ của wiki:", "config-wiki-language-help": "Chọn ngôn ngữ chủ yếu của nội dung trong wiki này.", "config-back": "← Lùi", "config-continue": "Tiếp →", diff --git a/includes/resourceloader/ResourceLoader.php b/includes/resourceloader/ResourceLoader.php index d9416e42da..6995642214 100644 --- a/includes/resourceloader/ResourceLoader.php +++ b/includes/resourceloader/ResourceLoader.php @@ -274,7 +274,7 @@ class ResourceLoader implements LoggerAwareInterface { $this->registerTestModules(); } - $this->setMessageBlobStore( new MessageBlobStore() ); + $this->setMessageBlobStore( new MessageBlobStore( $this ) ); } /** @@ -1069,6 +1069,23 @@ MESSAGE; return $out; } + /** + * Get names of modules that use a certain message. + * + * @param string $messageKey + * @return array List of module names + */ + public function getModulesByMessage( $messageKey ) { + $moduleNames = array(); + foreach ( $this->getModuleNames() as $moduleName ) { + $module = $this->getModule( $moduleName ); + if ( in_array( $messageKey, $module->getMessages() ) ) { + $moduleNames[] = $moduleName; + } + } + return $moduleNames; + } + /* Static Methods */ /** diff --git a/languages/i18n/ar.json b/languages/i18n/ar.json index 0f80cd1cfe..5fd8fc3f50 100644 --- a/languages/i18n/ar.json +++ b/languages/i18n/ar.json @@ -921,6 +921,7 @@ "showingresultsinrange": "بالأسفل {{PLURAL:$1|نتيجة واحدة|$1 نتائج|$1 نتيجة}} في النطاق من $2 إلى $3.", "search-showingresults": "{{PLURAL:$4|النتائج $1 من $3|النتائج $1 - $2 من أصل $3}}", "search-nonefound": "لا توجد نتائج تطابق الاستعلام.", + "search-nonefound-thiswiki": "لا توجد نتائج تطابق الاستعلام في هذا الموقع.", "powersearch-legend": "بحث متقدم", "powersearch-ns": "بحث في النطاقات:", "powersearch-togglelabel": "اختر:", @@ -1237,6 +1238,8 @@ "rcshowhidemine": "$1 تعديلاتي", "rcshowhidemine-show": "أظهر", "rcshowhidemine-hide": "أخف", + "rcshowhidecategorization-show": "أظهر", + "rcshowhidecategorization-hide": "أخف", "rclinks": "أظهر آخر $1 تعديل في آخر $2 يوم
$3", "diff": "فرق", "hist": "تاريخ", diff --git a/languages/i18n/be-tarask.json b/languages/i18n/be-tarask.json index 0171456c7e..a45a4d3e52 100644 --- a/languages/i18n/be-tarask.json +++ b/languages/i18n/be-tarask.json @@ -3200,6 +3200,7 @@ "logentry-block-reblock": "$1 {{GENDER:$2|зьмяніў|зьмяніла}} тэрмін блякаваньня {{GENDER:$4|$3}} на пэрыяд $5 $6", "logentry-suppress-block": "$1 {{GENDER:$2|заблякаваў|заблякавала}} {{GENDER:$4|$3}} на тэрмін $5 $6", "logentry-suppress-reblock": "$1 {{GENDER:$2|зьмяніў|зьмяніла}} тэрмін блякаваньня {{GENDER:$4|$3}} на пэрыяд $5 $6", + "logentry-import-upload": "$1 {{GENDER:$2|імпартаваў|імпартавала}} $3 праз загрузку файлу", "logentry-merge-merge": "$1 {{GENDER:$2|аб’яднаў|аб’яднала}} $3 у $4 (вэрсіі да $5)", "logentry-move-move": "$1 {{GENDER:$2|перанёс|перанесла}} старонку $3 у $4", "logentry-move-move-noredirect": "$1 {{GENDER:$2|перанёс|перанесла}} старонку $3 у $4 без пакінутага перанакіраваньня", diff --git a/languages/i18n/cs.json b/languages/i18n/cs.json index 5f82e897e0..c2e8831fd6 100644 --- a/languages/i18n/cs.json +++ b/languages/i18n/cs.json @@ -334,6 +334,7 @@ "missingarticle-rev": "(číslo revize: $1)", "missingarticle-diff": "(Rozdíl: $1, $2)", "readonly_lag": "Databáze byla automaticky dočasně uzamčena kvůli zpoždění ostatních databázových serverů oproti hlavnímu", + "nonwrite-api-promise-error": "Byla odeslána HTTP hlavička „Promise-Non-Write-API-Action“, ale požadavek směřoval na API modul pro zápis.", "internalerror": "Vnitřní chyba", "internalerror_info": "Vnitřní chyba: $1", "internalerror-fatal-exception": "Kritická výjimka typu „$1“", diff --git a/languages/i18n/eu.json b/languages/i18n/eu.json index cd9b4cf5d3..f160f09839 100644 --- a/languages/i18n/eu.json +++ b/languages/i18n/eu.json @@ -29,6 +29,7 @@ "tog-hideminor": "Ezkutatu azken aldaketetan aldaketa txikiak", "tog-hidepatrolled": "Ezkutatu patruilatutako aldaketa azken aldaketetan", "tog-newpageshidepatrolled": "Ezkutatu patruilatutako orriak, orri-zerrenda berritik", + "tog-hidecategorization": "Orrialdeen kategorizazioa ezkutatu", "tog-extendwatchlist": "Jarraipen-zerrenda zabaldu aldaketa guztiak ikusteko, ez bakarrik azken aldaketak", "tog-usenewrc": "Azken aldaketetan eta jarraipen-zerrendan aldaketak orrialdearen arabera taldekatu", "tog-numberheadings": "Goiburukoak automatikoki zenbakitu", @@ -39,6 +40,7 @@ "tog-watchdefault": "Aldatzen ditudan orrialdeak eta fitxategiak nire jarraipen-zerrendara gehitu", "tog-watchmoves": "Izena aldatutako orrialdeak eta fitxategiak jarraipen-zerrendara gehitu", "tog-watchdeletion": "Ezabatzen ditudan orrialdeak eta fitxategiak nire jarraipen-zerrendara gehitu", + "tog-watchrollback": "Nire jarraipen zerrendan rollbacka egin dudan orrialdeak erakutsi", "tog-minordefault": "Lehenetsi bezala aldaketa txiki bezala markatu guztiak", "tog-previewontop": "Aurrebista aldaketa koadroaren aurretik erakutsi", "tog-previewonfirst": "Lehen aldaketan aurrebista erakutsi", @@ -57,6 +59,7 @@ "tog-watchlisthideliu": "Ezkutatu izena emana duten lankideen aldaketak, jarraitze-zerrendan", "tog-watchlisthideanons": "Ezkutatu lankide anonimoen aldaketak, jarraitze-zerrendan", "tog-watchlisthidepatrolled": "Ezkutatu patruilatutako aldaketak jarraitze-zerrendan", + "tog-watchlisthidecategorization": "Orrialdeen kategorizazioa ezkutatu", "tog-ccmeonemails": "Beste erabiltzaileei bidaltzen dizkiedan mezuen kopiak niri ere bidali", "tog-diffonly": "''Diff''-ak agertzen direnean, orrialdearen edukiera ezkutatu", "tog-showhiddencats": "Ikusi kategoria ezkutuak", @@ -189,6 +192,7 @@ "view": "Ikusi", "view-foreign": "$1(e)n ikusi", "edit": "Aldatu", + "edit-local": "Aldatu deskribapen lokala", "create": "Sortu", "create-local": "Gehitu deskribapen lokala", "editthispage": "Orri hau aldatu", @@ -235,6 +239,7 @@ "pool-timeout": "Lock-a itxoiten denbora amaitu da", "pool-queuefull": "Prozesuen zerrenda beteta dago", "pool-errorunknown": "Errore ezezaguna", + "pool-servererror": "Pool kontadore zerbitzua ez dago eskuragarri ($1)", "poolcounter-usage-error": "Erabilera-errorea: $1", "aboutsite": "{{SITENAME}} guneari buruz", "aboutpage": "Project:Honi_buruz", @@ -654,6 +659,8 @@ "content-model-text": "testu laua", "content-model-javascript": "JavaScript", "content-model-css": "CSS", + "content-json-empty-object": "Objetu hustua", + "content-json-empty-array": "Matrize hutsa", "expensive-parserfunction-warning": "Adi: Orrialde honek parser funtzio deialdi oso garesti gehiegi ditu.\n\n$2 {{PLURAL:$2|deialdi|deialdi}} baino gutxiago eduki beharko lituzke, eta orain $1 {{PLURAL:$1|dago|daude}}.", "expensive-parserfunction-category": "Parser funtzio deialdi oso garesti gehiegi dituzten orrialdeak", "post-expand-template-inclusion-warning": "Kontuz: Txantiloiak sartzen duena oso handia da.\nTxantiloi batzuk ez dira erabiliko.", @@ -701,9 +708,10 @@ "history-feed-description": "Wikiko orrialde honen berrikuspenen historia", "history-feed-item-nocomment": "nork: $1 noiz: $2", "history-feed-empty": "Eskatutako orrialdea ez da existitzen. Baliteke wikitik ezabatu edo izenez aldatu izana. Saiatu [[Special:Search|wikian zerikusia duten orrialdeak bilatzen]].", + "history-edit-tags": "Hautatutako berrikuspenen etiketak aldatu", "rev-deleted-comment": "(aldaketa laburpena ezabatu da)", "rev-deleted-user": "(erabiltzailea ezabatu da)", - "rev-deleted-event": "(log ekintza ezabatu da)", + "rev-deleted-event": "(log xehetasunak ezabatu dira)", "rev-deleted-user-contribs": "[lankide izena edo Ip helbidea ezabatua - aldatu ezkutapena ekarpenetatik]", "rev-deleted-text-permission": "Orrialdearen berrikuspen hau '''ezabatua''' izan da.\nXehetasunak [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ezabaketa erregistroan] ikus daitezke.", "rev-deleted-text-unhide": "Orriaren bertsio hau '''ezabatu''' da.\nXehetasunak ikusgai daude [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ezabatze erregistroan].\nAdministratzailea zarenez, oraindik [$1 bertsio hau ikus dezakezu], nahi izanez gero.", @@ -831,6 +839,7 @@ "searchrelated": "erlazionatua", "searchall": "guztia", "showingresults": "Jarraian {{PLURAL:$1|emaitza '''1''' ikus daiteke|'''$1''' emaitza ikus daitezke}}, #'''$2'''.etik hasita.", + "showingresultsinrange": "Jarraian {{PLURAL:$1|emaitza '''1''' ikus daiteke|'''$1''' emaitza ikus daitezke}}, #'''$2'''.etik hasi eta #$3.eraino.", "search-showingresults": "{{PLURAL:$4|Emaitza $1$3(e)tik|Results $1 - $2$3(e)tik}}", "search-nonefound": "Ez dago eskaerarekin bat egiten duten emaitzarik.", "powersearch-legend": "Bilaketa aurreratua", @@ -875,6 +884,7 @@ "columns": "Zutabeak:", "searchresultshead": "Bilaketa", "stub-threshold": "stub link formaturako atalasea (byteak):", + "stub-threshold-sample-link": "adibidea", "stub-threshold-disabled": "Ezgaitua", "recentchangesdays": "Aldaketa berrietan erakutsi beharreko egun kopurua:", "recentchangesdays-max": "(gehienez {{PLURAL:$1|egun bat|$1 egun}})", @@ -882,6 +892,7 @@ "prefs-help-recentchangescount": "Honek azken aldaketak, orrialdeen historiak eta logak barne-biltzen ditu.", "prefs-help-watchlist-token2": "Hau da zure jarraipen zerrendako web jarioaren giltza sekretua.\nEzagutzen duen orok zure jarraipen zerrenda irakurtzeko aukera izango du, ez partekatu.\n[[Special:ResetTokens|Klik egin hemen berrezarri behar baduzu]]", "savedprefs": "Zure hobespenak gorde egin dira.", + "savedrights": "{{GENDER:$1|$1}} erabiltzailearen eskubideak gorde dira.", "timezonelegend": "Ordu-eremua:", "localtime": "Ordu lokala:", "timezoneuseserverdefault": "Erabili lehenetsitako wikia ($1)", @@ -981,13 +992,13 @@ "group-bot-member": "{{GENDER:$1|bot-a}}", "group-sysop-member": "{{GENDER:$1|administratzailea}}", "group-bureaucrat-member": "{{GENDER:$1|burokrata}}", - "group-suppress-member": "{{GENDER:$1|gainikuslea}}", + "group-suppress-member": "{{GENDER:$1|ezabatzailea}}", "grouppage-user": "{{ns:project}}:Lankideak", "grouppage-autoconfirmed": "{{ns:project}}:Erabiltzaile autokonfirmatuak", "grouppage-bot": "{{ns:project}}:Bot-ak", "grouppage-sysop": "{{ns:project}}:Administratzaileak", "grouppage-bureaucrat": "{{ns:project}}:Burokratak", - "grouppage-suppress": "{{ns:project}}:Gainikuspena", + "grouppage-suppress": "{{ns:project}}:Ezabatzea", "right-read": "Irakurri orriak", "right-edit": "Orriak aldatu", "right-createpage": "Orrialdeak sortu (eztabaida orrialdeak ez direnak)", @@ -997,6 +1008,7 @@ "right-move": "Mugitu orriak", "right-move-subpages": "Mugitu orrialdeak bere azpiorrialdeekin", "right-move-rootuserpages": "Erro-lankidearen orriak mugitu", + "right-move-categorypages": "Kategoria orrialdeak mugitu", "right-movefile": "Mugitu fitxategiak", "right-suppressredirect": "Orri bat mugitzean, ez sortu birbideratzea jatorrizko izenetik", "right-upload": "Fitxategia igo", @@ -1136,6 +1148,7 @@ "rcshowhidemine": "$1 nire ekarpenak", "rcshowhidemine-show": "Erakutsi", "rcshowhidemine-hide": "Ezkutatu", + "rcshowhidecategorization": "orrialde baten kategorizazioa $1", "rcshowhidecategorization-show": "Erakutsi", "rcshowhidecategorization-hide": "Ezkutatu", "rclinks": "Erakutsi azken $2 egunetako $1 aldaketak
$3", @@ -1162,6 +1175,7 @@ "recentchangeslinked-page": "Orriaren izena:", "recentchangeslinked-to": "Lotutako orrietarako aldaketak erakutsi emandako orriaren ordez", "recentchanges-page-added-to-category": "[[:$1]] Kategoriara gehitua", + "autochange-username": "MediaWiki aldaketa automatikoa", "upload": "Fitxategia igo", "uploadbtn": "Fitxategia igo", "reuploaddesc": "Igotzeko formulariora itzuli.", @@ -1473,6 +1487,7 @@ "unusedimages": "Erabili gabeko fitxategiak", "wantedcategories": "Eskatutako kategoriak", "wantedpages": "Eskatutako orrialdeak", + "wantedpages-summary": "Lotura gehien dituzten eta existitzen ez diren orrialdeen zerrenda da hau, eurengana birzuzenketak baino ez dituzten orrialdeak kenduta. Eurenganako birzuzenketak dituzten baina existitzen ez diren orrialdeen zerrenda bat ikusteko, [[{{#special:BrokenRedirects}}|apurtutako birzuzenketen zerrendara]] jo dezakezu.", "wantedpages-badtitle": "Izenburu okerra hautatutako emaitzetan: $1", "wantedfiles": "Eskatutako fitxategiak", "wantedtemplates": "Eskatutako txantiloiak", @@ -1498,6 +1513,8 @@ "protectedpages-timestamp": "Denbora-marka", "protectedpages-page": "Orria", "protectedpages-expiry": "Epemuga:", + "protectedpages-performer": "Erabiltzailea babesten", + "protectedpages-params": "Babesaren parametroak", "protectedpages-reason": "Arrazoia", "protectedpages-unknown-timestamp": "Ezezaguna", "protectedpages-unknown-performer": "Erabiltzaile ezezaguna", @@ -1522,7 +1539,7 @@ "nopagetext": "Zuk ezarri duzun helburuko orrialdea ez da existitzen.", "pager-newer-n": "{{PLURAL:$1|berriago den 1|berriagoak diren $1}}", "pager-older-n": "{{PLURAL:$1|zaharragoa den 1|zaharragoak diren $1}}", - "suppress": "Gain-ikuspena", + "suppress": "Ezabatu", "querypage-disabled": "Orrialde berezi hau desgaituta dago funtzionamendu arrazoiengatik.", "apihelp": "API laguntza", "apihelp-no-such-module": "Ez da \"$1\" modulua aurkitu.", @@ -1592,6 +1609,7 @@ "listgrouprights-addgroup-self-all": "Talde guztiak norbere kontura gehitu", "listgrouprights-removegroup-self-all": "Talde guztiak norbere kontutik ezabatu", "listgrouprights-namespaceprotection-namespace": "Izen-tartea", + "trackingcategories-nodesc": "Ez dago deskribapenik eskuragarri.", "trackingcategories-disabled": "Kategoria desgaitua dago", "mailnologin": "Bidalketa helbiderik ez", "mailnologintext": "Beste erabiltzaileei e-posta mezuak bidaltzeko [[Special:UserLogin|saioa hasi]] eta baliozko e-posta helbidea behar duzu izan zure [[Special:Preferences|hobespenetan]].", @@ -1742,6 +1760,7 @@ "protect-othertime": "Beste denbora:", "protect-othertime-op": "beste denbora", "protect-existing-expiry": "Iraungitze ordua: $2, $3", + "protect-existing-expiry-infinity": "Oraingo iraungitze denbora: infinitoa", "protect-otherreason": "Bestelako arrazoiak (edo gehigarriak):", "protect-otherreason-op": "Bestelako arrazoiak", "protect-dropdown": "*Babesteko arrazoi ohikoenak\n** Gehiegizko bandalismoa\n** Gehiegizko spama\n** Produkzioaren aurkakoa den edizio gerra\n** Trafiko handiko orrialdea", @@ -1846,7 +1865,7 @@ "autoblockid": "Blokeo automatikoa #$1", "block": "Blokeatu erabiltzailea", "unblock": "Erabiltzailea desblokeatu", - "blockip": "Blokeatu erabiltzailea", + "blockip": "Blokeatu {{GENDER:$1|erabiltzailea}}", "blockip-legend": "Blokeatu erabiltzailea", "blockiptext": "IP helbide edo erabiltzaile izen bati idazketa baimenak kentzeko beheko formularioa erabil dezakezu. Ekintza hau bandalismoa saihesteko baino ez da burutu behar, eta beti ere [[{{MediaWiki:Policy-url}}|politikak]] errespetatuz. Blokeoaren arrazoi bat ere zehaztu ezazu (adibidez, orrialde batzuk zehaztuz).", "ipaddressorusername": "IP Helbidea edo erabiltzaile izena", @@ -2861,13 +2880,21 @@ "tags-delete-title": "Etiketa ezabatu", "tags-delete-reason": "Arrazoia:", "tags-delete-not-found": "\"$1\" etiketa ez da existitzen.", + "tags-activate-title": "Etiketa aktibatu", + "tags-activate-question": "\"$1\" etiketa aktibatzear zaude.", "tags-activate-reason": "Arrazoia:", + "tags-activate-not-allowed": "Ezin izan da \"$1\" etiketa aktibatu.", + "tags-activate-not-found": "\"$1\" etiketa ez da existitzen.", "tags-activate-submit": "Aktibatu", + "tags-deactivate-title": "Etiketa desaktibatu", + "tags-deactivate-question": "\"$1\" etiketa desaktibatzear zaude.", "tags-deactivate-reason": "Arrazoia:", + "tags-deactivate-not-allowed": "Ezin izan da \"$1\" etiketa desaktibatu.", "tags-deactivate-submit": "Desaktibatu", "tags-edit-title": "Etiketak aldatu", "tags-edit-manage-link": "Etiketak kudeatu", "tags-edit-existing-tags": "Existitzen diren etiketak:", + "tags-edit-existing-tags-none": "\"Bat ere ez\"", "tags-edit-new-tags": "Etiketa berriak:", "tags-edit-add": "Gehitu etiketa hauek:", "tags-edit-remove": "Kendu etiketa hauek:", @@ -2905,7 +2932,10 @@ "htmlform-chosen-placeholder": "Aukeratu", "htmlform-cloner-create": "Gehitu gehiago", "htmlform-cloner-delete": "Kendu", + "htmlform-title-not-creatable": "\"$1\" ez da sor daitekeen orrialde baten izenburua", "htmlform-title-not-exists": "$1 ez da existitzen.", + "htmlform-user-not-exists": "$1 ez da existitzen.", + "htmlform-user-not-valid": "$1 erabiltzaile izena ezin da erabili.", "sqlite-has-fts": "$1 testu osoan bilatzeko laguntzarekin", "sqlite-no-fts": "$1 testu osoan bilatzeko laguntzarik gabe", "logentry-delete-delete": "$1 {{GENDER:$2|wikilariak}} «$3» orria ezabatu du", @@ -2993,6 +3023,7 @@ "duration-centuries": "{{PLURAL:$1|Mende $1|$1 mende}}", "duration-millennia": "{{PLURAL:$1|Milurteko $1|$1 milurteko}}", "rotate-comment": "Irudia erlojuaren norantzan {{PLURAL:$1|gradu 1|$1 gradu}} biratua izan da", + "limitreport-title": "Parser profilaren datuak:", "limitreport-cputime": "CPU denbora erabilpena", "limitreport-cputime-value": "{{PLURAL:$1|Segundu $1|$1 segundu}}", "limitreport-walltime": "Denbora errealeko erabilpena", @@ -3011,6 +3042,7 @@ "expand_templates_input": "Sarrerako testua:", "expand_templates_output": "Emaitza", "expand_templates_xml_output": "XML irteera", + "expand_templates_html_output": "HTML irteera gordina", "expand_templates_ok": "Ados", "expand_templates_remove_comments": "Iruzkinak kendu", "expand_templates_remove_nowiki": "Ezabatu etiketen emaitzak", @@ -3026,16 +3058,25 @@ "log-name-pagelang": "Hizkuntza aldatu:", "default-skin-not-found-row-enabled": "* $1 / $2 (gaituta)", "default-skin-not-found-row-disabled": "* $1 / $2 ('''desgaituta''')", + "mediastatistics": "Media estatistikak", + "mediastatistics-summary": "Igotako fitxategien estatistikak. Hemen ikus daitekeena fitxategiaren azken bertsioa baino ez da. Fitxategiaren bertsio zahar edo ezabatuak kanpo daude.", "mediastatistics-nbytes": "{{PLURAL:$1|$1 byte|$1 byte}} ($2; %$3)", "mediastatistics-table-mimetype": "MIME mota", + "mediastatistics-table-extensions": "Luzapen posibleak", "mediastatistics-table-count": "Fitxategi kopurua", + "mediastatistics-table-totalbytes": "Konbinatuta tamaina", "mediastatistics-header-unknown": "Ezezaguna", "mediastatistics-header-bitmap": "Bit-mapako irudiak", "mediastatistics-header-drawing": "Marrazkiak (irudi bektorialak)", "mediastatistics-header-audio": "Audioa", "mediastatistics-header-video": "Bideoak", + "mediastatistics-header-multimedia": "Media aberatsa", "mediastatistics-header-office": "Bulego", + "mediastatistics-header-text": "Testuala", + "mediastatistics-header-executable": "Exekutagarriak", + "mediastatistics-header-archive": "Formatu konprimatuak", "json-error-syntax": "Sintaxi-errorea", + "headline-anchor-title": "Lotura sekzio honetara", "special-characters-group-latin": "Latina", "special-characters-group-latinextended": "Latin hedatua", "special-characters-group-ipa": "NAF", @@ -3043,6 +3084,7 @@ "special-characters-group-greek": "Greziera", "special-characters-group-cyrillic": "Zirilikoa", "special-characters-group-arabic": "Arabiera", + "special-characters-group-arabicextended": "Arabiera hedatua", "special-characters-group-persian": "Persiera", "special-characters-group-hebrew": "Hebreera", "special-characters-group-bangla": "Bangla", @@ -3050,10 +3092,15 @@ "special-characters-group-telugu": "Telugu", "special-characters-group-sinhala": "Sinhala", "special-characters-group-gujarati": "Guajarati", + "special-characters-group-devanagari": "Devanagari", "special-characters-group-thai": "Thaiera", "special-characters-group-lao": "Laosera", "special-characters-group-khmer": "Khmerrera", + "special-characters-title-endash": "en lerroa", + "special-characters-title-emdash": "em lerroa", "special-characters-title-minus": "minus zeinua", "mw-widgets-dateinput-no-date": "Ez duzu datarik aukeratu", - "mw-widgets-titleinput-description-redirect": "$1ra birzuzendu" + "mw-widgets-titleinput-description-new-page": "orrialde hori oraindik ez da existitzen", + "mw-widgets-titleinput-description-redirect": "$1ra birzuzendu", + "api-error-blacklisted": "Aukera ezazu, mesedez, izenburu ezberdin eta deskriptiboago bat." } diff --git a/languages/i18n/fr.json b/languages/i18n/fr.json index 3bc0344546..78e8d399a5 100644 --- a/languages/i18n/fr.json +++ b/languages/i18n/fr.json @@ -438,6 +438,7 @@ "missingarticle-rev": "(numéro de version : $1)", "missingarticle-diff": "(diff : $1, $2)", "readonly_lag": "La base de données a été automatiquement verrouillée pendant que les serveurs secondaires rattrapent leur retard sur le serveur principal.", + "nonwrite-api-promise-error": "L’entête HTTP 'Promise-Non-Write-API-Action' a été envoyé mais la requête a été faite à un module d’écriture de l’API.", "internalerror": "Erreur interne", "internalerror_info": "Erreur interne : $1", "internalerror-fatal-exception": "Erreur fatale de type « $1 »", @@ -778,6 +779,7 @@ "permissionserrors": "Erreur de permissions", "permissionserrorstext": "Vous n'avez pas la permission d'effectuer l'opération demandée pour {{PLURAL:$1|la raison suivante|les raisons suivantes}} :", "permissionserrorstext-withaction": "Vous ne pouvez pas $2, pour {{PLURAL:$1|la raison suivante|les raisons suivantes}} :", + "contentmodelediterror": "Vous ne pouvez pas modifier cette révision car son modèle de contenu est $1, et le modèle de contenu actuel de la page est $2.", "recreate-moveddeleted-warn": "'''Attention : vous êtes en train de recréer une page qui a été précédemment supprimée.'''\n\nAssurez-vous qu'il est pertinent de poursuivre les modifications sur cette page. Le journal des suppressions et des déplacements est affiché ci-dessous :", "moveddeleted-notice": "Cette page a été supprimée. Le journal des suppressions et des déplacements est affiché ci-dessous pour référence.", "moveddeleted-notice-recent": "Désolé, cette page a été récemment supprimée (dans les dernières 24 heures).\nLes journaux des suppressions et des renommages pour la page sont fournis ci-dessous à titre d’information.", @@ -1006,6 +1008,7 @@ "showingresultsinrange": "Afficher ci-dessous jusqu’à {{PLURAL:$1|1 résultat|$1 résultats}} dans la série #$2 à #$3.", "search-showingresults": "{{PLURAL:$4|Résultat $1 parmi $3|Résultats $1 à $2 parmi $3}}", "search-nonefound": "Il n'y a aucun résultat correspondant à la requête.", + "search-nonefound-thiswiki": "Il n’y a pas de résultats correspondant à la requête sur ce site.", "powersearch-legend": "Recherche avancée", "powersearch-ns": "Rechercher dans les espaces de noms :", "powersearch-togglelabel": "Cocher :", diff --git a/languages/i18n/gl.json b/languages/i18n/gl.json index 69ad63e02d..010f0da2c8 100644 --- a/languages/i18n/gl.json +++ b/languages/i18n/gl.json @@ -1376,7 +1376,7 @@ "foreign-structured-upload-form-label-not-own-work-local-local": "Quizais tamén queira probar [[Special:Upload|a páxina predeterminada de subidas]].", "foreign-structured-upload-form-label-own-work-message-default": "Comprendo que estou a cargar este ficheiro nun repositorio compartido. Confirmo que fago isto seguindo os termos de uso e políticas de licenza existentes alí.", "foreign-structured-upload-form-label-not-own-work-message-default": "Se non é capaz de cargar este ficheiro baixo as políticas do repositorio compartido, por favor peche este diálogo e intente outro método.", - "foreign-structured-upload-form-label-not-own-work-local-default": "Tamén pode interesarlle usar [[Especial:Upload|a páxina de carga en {{SITENAME}}]], se este ficheiro pode ser cargado alí baixo as súas políticas.", + "foreign-structured-upload-form-label-not-own-work-local-default": "Tamén pode interesarlle usar [[Special:Upload|a páxina de carga en {{SITENAME}}]], se este ficheiro pode ser cargado alí baixo as súas políticas.", "backend-fail-stream": "Non se puido transmitir o ficheiro \"$1\".", "backend-fail-backup": "Non se puido facer unha copia de seguridade do ficheiro \"$1\".", "backend-fail-notexists": "O ficheiro \"$1\" non existe.", diff --git a/languages/i18n/ja.json b/languages/i18n/ja.json index dc72199cf8..473112aff4 100644 --- a/languages/i18n/ja.json +++ b/languages/i18n/ja.json @@ -1210,7 +1210,7 @@ "action-browsearchive": "削除されたページの検索", "action-undelete": "このページの復元", "action-suppressrevision": "隠された版の確認と復元", - "action-suppressionlog": "この非公開記録の閲覧", + "action-suppressionlog": "非公開記録の閲覧", "action-block": "この利用者の編集ブロック", "action-protect": "このページの保護レベルの変更", "action-rollback": "特定ページを最後に編集した利用者の編集の即時巻き戻し", diff --git a/languages/i18n/lad.json b/languages/i18n/lad.json index f5d4d17a14..fcc7501140 100644 --- a/languages/i18n/lad.json +++ b/languages/i18n/lad.json @@ -103,7 +103,7 @@ "mar": "Mar", "apr": "Abr", "may": "May", - "jun": "Juñ", + "jun": "Jun", "jul": "Jul", "aug": "Ago", "sep": "Set", diff --git a/languages/i18n/mr.json b/languages/i18n/mr.json index eaba2928c2..cb6c27b267 100644 --- a/languages/i18n/mr.json +++ b/languages/i18n/mr.json @@ -1653,8 +1653,8 @@ "allpagesbadtitle": "दिलेले शीर्षक चुकीचे किंवा आंतरभाषीय किंवा आंतरविकि शब्दाने सुरू होणारे होते. त्यात एक किंवा अधिक शीर्षकात न वापरता येणारी अक्षरे असावीत.", "allpages-bad-ns": "{{SITENAME}}मध्ये \"$1\" हे नामविश्व नाही.", "allpages-hide-redirects": "पुनर्निर्देशने लपवा", - "cachedspecial-viewing-cached-ttl": "तुम्ही या पानाची कॅचड् आवृत्ती पहात आहात. पाहत आहात या पाठया ची छोटी आवृत्ती,जी $1 ईतकी जुनी असू शकते.", - "cachedspecial-viewing-cached-ts": "तुम्ही या पानाची कॅचड् आवृत्ती पहात आहात. पाहत आहात या पाठया ची छोटी आवृत्ती,जी पुर्णतः मुळ आवृत्ती नसू शकते.", + "cachedspecial-viewing-cached-ttl": "तुम्ही या पानाची कॅशेमधील आवृत्ती पहात आहात जी, $1 ईतकी जूनी असू शकते.", + "cachedspecial-viewing-cached-ts": "तुम्ही या पानाची कॅशेतील आवृत्ती पहात आहात जी, पुर्णतः मूळ आवृत्ती नसू शकते.", "cachedspecial-refresh-now": "नुकतेच केलेले दाखवा.", "categories": "वर्ग", "categoriespagetext": "विकिवर खालील वर्ग {{PLURAL:$1|आहे|आहेत}}.\n[[Special:UnusedCategories|न वापरलेले वर्ग]] येथे दाखवलेले नाहीत.\nहेही पहा: [[Special:WantedCategories|पाहिजे असलेले वर्ग]].", diff --git a/languages/i18n/ps.json b/languages/i18n/ps.json index 2b1ba0e1d0..88ab689183 100644 --- a/languages/i18n/ps.json +++ b/languages/i18n/ps.json @@ -359,7 +359,7 @@ "yourname": "کارن-نوم:", "userlogin-yourname": "کارن-نوم", "userlogin-yourname-ph": "کارن-نوم مو وليکئ", - "createacct-another-username-ph": "كارن نوم مو وركړۍ", + "createacct-another-username-ph": "كارن نوم مو وركړئ", "yourpassword": "پټنوم:", "userlogin-yourpassword": "پټنوم", "userlogin-yourpassword-ph": "پټنوم مو وليکئ", @@ -394,7 +394,7 @@ "createacct-emailrequired": "برېښليک پته", "createacct-emailoptional": "برېښليک پته (اختياري)", "createacct-email-ph": "برېښليک پته مو وټاپئ", - "createacct-another-email-ph": "برېښليک پته مو ورکړۍ", + "createacct-another-email-ph": "برېښليک پته مو ورکړئ", "createaccountmail": "يو لنډمهاله ناټاکلی پټنوم کارول او ځانگړې شوې برېښليک پتې ته ورلېږل", "createacct-realname": "آر نوم (اختياري)", "createaccountreason": "سبب:", diff --git a/languages/i18n/pt-br.json b/languages/i18n/pt-br.json index 6b83c4b383..5ebe6f2a4b 100644 --- a/languages/i18n/pt-br.json +++ b/languages/i18n/pt-br.json @@ -1053,8 +1053,8 @@ "badsiglength": "A sua assinatura é muito longa.\nEla deve ter menos de $1 {{PLURAL:$1|caractere|caracteres}}.", "yourgender": "Como você prefere ser descrito(a)?", "gender-unknown": "Ao mencionar você, o software usará palavras do gênero neutro sempre que possível", - "gender-male": "Ele edita páginas wiki", - "gender-female": "Ela edita páginas wiki", + "gender-male": "Ele é um usuário", + "gender-female": "Ela é uma usuária", "prefs-help-gender": "A configuração desta preferência é opcional.\nO software utiliza seu valor para tratá-lo(a) e mencioná-lo(a) a outros usando o gênero gramatical adequado.\nEsta informação será pública.", "email": "E-mail", "prefs-help-realname": "O fornecimento de seu nome verdadeiro é opcional.\nCaso decida fornecê-lo, este será utilizado para dar-lhe crédito pelo seu trabalho.", diff --git a/languages/i18n/pt.json b/languages/i18n/pt.json index 86eae05a04..eaa75682d0 100644 --- a/languages/i18n/pt.json +++ b/languages/i18n/pt.json @@ -1027,8 +1027,8 @@ "badsiglength": "A sua assinatura é demasiado longa.\nNão deverá conter mais de $1 {{PLURAL:$1|carácter|caracteres}}.", "yourgender": "Como prefere ser descrito?", "gender-unknown": "Ao mencioná-lo, o software irá utilizar palavras de género neutro sempre que possível", - "gender-male": "Ele edita páginas wiki", - "gender-female": "Ela edita páginas wiki", + "gender-male": "Ele é um utilizador", + "gender-female": "Ela é uma utilizadora", "prefs-help-gender": "Esta preferência é opcional.\nO software usa o seu valor para o endereçar e para o mencionar a outros usando o género gramatical apropriado.\nEsta informação será pública.", "email": "Correio eletrónico", "prefs-help-realname": "O fornecimento do nome verdadeiro é opcional.\nSe optar por revelá-lo, será utilizado para atribuir-lhe crédito pelo seu trabalho.", diff --git a/languages/i18n/ru.json b/languages/i18n/ru.json index f79efe169f..685422f9d0 100644 --- a/languages/i18n/ru.json +++ b/languages/i18n/ru.json @@ -927,7 +927,7 @@ "next-page": "Следующая страница", "prevn-title": "{{PLURAL:$1|Предыдущая $1 запись|Предыдущие $1 записи|Предыдущие $1 записей}}", "nextn-title": "{{PLURAL:$1|Следующая $1 запись|Следующие $1 записи|Следующие $1 записей}}", - "shown-title": "Показывать $1 {{PLURAL:$1|запись|записей|записи}} на странице", + "shown-title": "Показывать $1 {{PLURAL:$1|запись|записи|записей}} на странице", "viewprevnext": "Просмотреть ($1 {{int:pipe-separator}} $2) ($3)", "searchmenu-exists": "'''В этой вики есть страница «[[:$1]]»'''", "searchmenu-new": "Создать страницу «[[:$1]]» в этом вики-проекте!\n{{PLURAL:$2|0=|См. также страницу, найденную по результатами вашего поиска.|См. также найденные результаты поиска.}}", @@ -3254,7 +3254,7 @@ "tags-apply-not-allowed-multi": "{{PLURAL:$2|Следующая метка не может быть применена|Следующие метки не могут быть применены}} вручную: $1", "tags-update-no-permission": "У вас нет права на добавление или изменение меток изменения из отдельных версий или записей журналов.", "tags-update-add-not-allowed-one": "Тег \"$1\" не может быть добавлен вручную.", - "tags-update-add-not-allowed-multi": "Следующее {{PLURAL:$2|tag is|tags are}} не может быть добавлено вручную: $1", + "tags-update-add-not-allowed-multi": "{{PLURAL:$2|Следующий тег|Следующие теги}} нельзя добавлять вручную: $1", "tags-update-remove-not-allowed-one": "Метка «$1» не может быть удалена.", "tags-update-remove-not-allowed-multi": "{{PLURAL:$2|Следующая метка не может быть удалена|Следующие метки не могут быть удалены}} вручную: $1", "tags-edit-title": "Редактировать теги", diff --git a/languages/i18n/sl.json b/languages/i18n/sl.json index 5b4393fada..6dca4f7f5a 100644 --- a/languages/i18n/sl.json +++ b/languages/i18n/sl.json @@ -318,6 +318,7 @@ "missingarticle-rev": "(redakcija št.: $1)", "missingarticle-diff": "(Primerjanje: $1, $2)", "readonly_lag": "Podatkovna zbirka se je samodejno zaklenila, dokler se podrejeni strežniki ne uskladijo z glavnim.", + "nonwrite-api-promise-error": "Prejeli smo glavo HTTP 'Promise-Non-Write-API-Action', vendar zahteva je bila poslana na modul API za zapisovanje.", "internalerror": "Notranja napaka", "internalerror_info": "Notranja napaka: $1", "internalerror-fatal-exception": "Usodna izjema vrste »$1«", diff --git a/languages/i18n/ta.json b/languages/i18n/ta.json index 8b8ab4ead8..906f616a3e 100644 --- a/languages/i18n/ta.json +++ b/languages/i18n/ta.json @@ -326,6 +326,7 @@ "nstab-template": "வார்ப்புரு", "nstab-help": "உதவிப் பக்கம்", "nstab-category": "பகுப்பு", + "mainpage-nstab": "முதற் பக்கம்", "nosuchaction": "அவ்வித செயற்பாடுகள் எதுவுமில்லை", "nosuchactiontext": "யூ.ஆர்.எல். குறித்த செயற்பாடு விக்கி மென்பொருளினால் அடையாளம் காணப்படவில்லை", "nosuchspecialpage": "அவ்வாறான சிறப்புப் பக்கங்கள் எதுவுமில்லை", @@ -453,8 +454,6 @@ "createaccountreason": "காரணம்:", "createacct-reason": "காரணம்", "createacct-reason-ph": "தாங்கள் ஏன் மற்றொரு கணக்கைத் துவங்குகிறீர்கள்?", - "createacct-captcha": "பாதுகாப்பு சோதனை", - "createacct-imgcaptcha-ph": "மேலே காணும் சொற்களை உள்ளிடுக", "createacct-submit": "உங்கள் கணக்கை உருவாக்குக", "createacct-another-submit": "கணக்கை உருவாக்கவும்", "createacct-benefit-heading": "{{SITENAME}} தங்களைப் போன்றோர்களால் உருவாக்கப்பட்டது", diff --git a/maintenance/cleanupRemovedModules.php b/maintenance/cleanupRemovedModules.php index a4e66ca63b..ae059306bc 100644 --- a/maintenance/cleanupRemovedModules.php +++ b/maintenance/cleanupRemovedModules.php @@ -72,19 +72,6 @@ class CleanupRemovedModules extends Maintenance { wfWaitForSlaves(); } while ( $numRows > 0 ); $this->output( "done\n" ); - - $this->output( "Cleaning up msg_resource_links table...\n" ); - $i = 1; - $msgResLinks = $dbw->tableName( 'msg_resource_links' ); - do { - $where = $moduleList ? "mrl_resource NOT IN ($moduleList)" : '1=1'; - $dbw->query( "DELETE FROM $msgResLinks WHERE $where LIMIT $limit", __METHOD__ ); - $numRows = $dbw->affectedRows(); - $this->output( "Batch $i: $numRows rows\n" ); - $i++; - wfWaitForSlaves(); - } while ( $numRows > 0 ); - $this->output( "done\n" ); } } diff --git a/resources/src/mediawiki.special/mediawiki.special.preferences.js b/resources/src/mediawiki.special/mediawiki.special.preferences.js index dd6c2ed80e..bebda108e8 100644 --- a/resources/src/mediawiki.special/mediawiki.special.preferences.js +++ b/resources/src/mediawiki.special/mediawiki.special.preferences.js @@ -102,12 +102,6 @@ } } - // Disable the button to save preferences unless preferences have changed - $( '#prefcontrol' ).prop( 'disabled', true ); - $( '#preferences > fieldset' ).one( 'change keydown mousedown', function () { - $( '#prefcontrol' ).prop( 'disabled', false ); - } ); - // Enable keyboard users to use left and right keys to switch tabs $preftoc.on( 'keydown', function ( event ) { var keyLeft = 37,