Merge "Removed deprecated $wgMasterWaitTimeout; not used by LoadBalancer"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Thu, 27 Aug 2015 00:09:50 +0000 (00:09 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Thu, 27 Aug 2015 00:09:50 +0000 (00:09 +0000)
38 files changed:
autoload.php
composer.json
includes/api/i18n/es.json
includes/api/i18n/fr.json
includes/api/i18n/gl.json
includes/api/i18n/he.json
includes/api/i18n/pl.json
includes/api/i18n/pt-br.json
includes/api/i18n/uk.json
includes/api/i18n/vi.json
includes/api/i18n/zh-hans.json
includes/compat/IPSetCompat.php [new file with mode: 0644]
includes/libs/IPSet.php [deleted file]
includes/page/WikiPage.php
includes/parser/Parser.php
includes/poolcounter/PoolWorkArticleView.php
includes/utils/IP.php
languages/i18n/ady-cyrl.json
languages/i18n/af.json
languages/i18n/az.json
languages/i18n/es.json
languages/i18n/gl.json
languages/i18n/he.json
languages/i18n/lv.json
languages/i18n/pt-br.json
languages/i18n/pt.json
languages/i18n/zh-hans.json
maintenance/deleteEqualMessages.php
resources/Resources.php
resources/ResourcesOOUI.php
resources/src/jquery/jquery.byteLimit.js
resources/src/mediawiki.legacy/commonPrint.css
resources/src/mediawiki.legacy/shared.css
resources/src/mediawiki.page/mediawiki.page.gallery.css [new file with mode: 0644]
resources/src/mediawiki.page/mediawiki.page.gallery.print.css [new file with mode: 0644]
resources/src/mediawiki.widgets/mw.widgets.TitleInputWidget.js
tests/phpunit/includes/libs/IPSetTest.php [deleted file]
thumb.php

index 6bc7238..82a45b4 100644 (file)
@@ -543,7 +543,7 @@ $wgAutoloadLocalClasses = array(
        'IORMRow' => __DIR__ . '/includes/db/IORMRow.php',
        'IORMTable' => __DIR__ . '/includes/db/IORMTable.php',
        'IP' => __DIR__ . '/includes/utils/IP.php',
-       'IPSet' => __DIR__ . '/includes/libs/IPSet.php',
+       'IPSet' => __DIR__ . '/includes/compat/IPSetCompat.php',
        'IPTC' => __DIR__ . '/includes/media/IPTC.php',
        'IRCColourfulRCFeedFormatter' => __DIR__ . '/includes/rcfeed/IRCColourfulRCFeedFormatter.php',
        'IcuCollation' => __DIR__ . '/includes/Collation.php',
index 1eb85fd..852f2d2 100644 (file)
                "oojs/oojs-ui": "0.12.6",
                "php": ">=5.3.3",
                "psr/log": "1.0.0",
-               "wikimedia/cdb": "1.0.1",
                "wikimedia/assert": "0.2.2",
+               "wikimedia/cdb": "1.0.1",
                "wikimedia/composer-merge-plugin": "1.2.1",
+               "wikimedia/ip-set": "1.0.1",
                "wikimedia/utfnormal": "1.0.2",
                "wikimedia/wrappedstring": "2.0.0",
                "zordius/lightncandy": "0.21"
index 8ad55b3..85e2482 100644 (file)
        "apihelp-parse-paramvalue-prop-iwlinks": "Da los enlaces interwiki del texto analizado.",
        "apihelp-parse-paramvalue-prop-wikitext": "Da el wikitexto original que se había analizado.",
        "apihelp-parse-paramvalue-prop-properties": "Da varias propiedades definidas en el wikitexto analizado.",
-       "apihelp-parse-paramvalue-prop-limitreportdata": "Da el informe del límite de forma estructurada. No da datos si <var>$1disablepp</var> está establecido.",
-       "apihelp-parse-paramvalue-prop-limitreporthtml": "Da la versión HTML del informe del límite. No da datos si <var>$1disablepp</var> está establecido.",
+       "apihelp-parse-paramvalue-prop-limitreportdata": "Da el informe del límite de forma estructurada. No da datos si <var>$1disablelimitreport</var> está establecido.",
+       "apihelp-parse-paramvalue-prop-limitreporthtml": "Da la versión HTML del informe del límite. No da datos si <var>$1disablelimitreport</var> está establecido.",
        "apihelp-parse-param-effectivelanglinks": "Incluye enlaces de idiomas proporcionados por las extensiones (para utilizar con <kbd>$1prop=langlinks</kbd>).",
        "apihelp-parse-param-preview": "Analizar en modo de vista previa.",
        "apihelp-parse-param-sectionpreview": "Analizar sección en modo de vista previa (activa el modo de vista previa).",
index 70cc0e4..9d1efe6 100644 (file)
        "apihelp-parse-paramvalue-prop-iwlinks": "Fournit les liens interwikis dans le wikitexte analysé.",
        "apihelp-parse-paramvalue-prop-wikitext": "Fournit le wikitexte d’origine qui a été analysé.",
        "apihelp-parse-paramvalue-prop-properties": "Fournit les diverses propriétés définies dans le wikitexte analysé.",
-       "apihelp-parse-paramvalue-prop-limitreportdata": "Fournit le rapport de limite d’une manière structurée. Ne fournit aucune donnée, si <var>$1disablepp</var> est positionné.",
-       "apihelp-parse-paramvalue-prop-limitreporthtml": "Fournit la version HTML du rapport de limite. Ne fournit aucune donnée, si <var>$1disablepp</var> est positionné.",
+       "apihelp-parse-paramvalue-prop-limitreportdata": "Fournit le rapport de limite d’une manière structurée. Ne fournit aucune donnée, si <var>$1disablelimitreport</var> est positionné.",
+       "apihelp-parse-paramvalue-prop-limitreporthtml": "Fournit la version HTML du rapport de limite. Ne fournit aucune donnée, si <var>$1disablelimitreport</var> est positionné.",
        "apihelp-parse-paramvalue-prop-parsetree": "L’arbre d’analyse XML du contenu de la révision (nécessite le modèle de contenu <code>$1</code>)",
        "apihelp-parse-param-pst": "Faire une transformation avant enregistrement de l’entrée avant de l’analyser. Valide uniquement quand utilisé avec du texte.",
        "apihelp-parse-param-onlypst": "Faire une transformation avant enregistrement (PST) de l’entrée, mais ne pas l’analyser. Renvoie le même wikitexte, après que la PST a été appliquée. Valide uniquement quand utilisé avec <var>$1text</var>.",
        "apihelp-parse-param-effectivelanglinks": "Inclut les liens de langue fournis par les extensions (à utiliser avec <kbd>$1prop=langlinks</kbd>).",
        "apihelp-parse-param-section": "Récupérer uniquement le contenu de ce numéro de section ou quand <kbd>nouveau</kbd> génère une nouvelle section.\n\nLa <kbd>nouvelle</kbd> section est mise à l’honneur uniquement quand <var>text</var> est spécifié.",
        "apihelp-parse-param-sectiontitle": "Nouveau titre de section quand <var>section</var> vaut <kbd>nouveau</kbd>.\n\nÀ la différence de la modification de page, cela ne revient pas à <var>summary</var> quand il est omis ou vide.",
-       "apihelp-parse-param-disablepp": "Omettre le rapport du préprocesseur (« rapport de limite du nouveau PP ») de la sortie de l’analyseur.",
+       "apihelp-parse-param-disablelimitreport": "Omettre le rapport de limite (« rapport de limite du nouveau PP ») de la sortie de l’analyseur.",
+       "apihelp-parse-param-disablepp": "Utiliser <var>$1disablelimitreport</var> à la place.",
        "apihelp-parse-param-disableeditsection": "Omettre les liens de modification de section de la sortie de l’analyseur.",
+       "apihelp-parse-param-disabletidy": "Ne pas exécuter de nettoyage du code HTML (par exemple,  réagencer) sur la sortie de l'analyseur.",
        "apihelp-parse-param-generatexml": "Générer un arbre d’analyse XML (nécessite le modèle de contenu <code>$1</code> ; remplacé par <kbd>$2prop=parsetree</kbd>).",
        "apihelp-parse-param-preview": "Analyser en mode aperçu.",
        "apihelp-parse-param-sectionpreview": "Analyser en mode aperçu de section (active aussi le mode aperçu).",
index 6051872..fc0b267 100644 (file)
        "apihelp-parse-paramvalue-prop-iwlinks": "Devolve as ligazóns interwiki do texto wiki analizado.",
        "apihelp-parse-paramvalue-prop-wikitext": "Devolve o texto wiki orixinal que foi analizado.",
        "apihelp-parse-paramvalue-prop-properties": "Obter varias propiedades definidas no texto wiki analizado.",
-       "apihelp-parse-paramvalue-prop-limitreportdata": "Devolve o informe de límite de forma estruturada. Non devolve datos cando <var>$1disablepp</var> está fixado.",
-       "apihelp-parse-paramvalue-prop-limitreporthtml": "Devolve a versión HTML do informe de límite. Non devolve datos cando <var>$1disablepp</var> está fixado.",
+       "apihelp-parse-paramvalue-prop-limitreportdata": "Devolve o informe de límite de forma estruturada. Non devolve datos cando <var>$1disablelimitreport</var> está fixado.",
+       "apihelp-parse-paramvalue-prop-limitreporthtml": "Devolve a versión HTML do informe de límite. Non devolve datos cando <var>$1disablelimitreport</var> está fixado.",
        "apihelp-parse-paramvalue-prop-parsetree": "Árbores de análise XML do contido da revisión (precisa o modelo de contido <code>$1</code>)",
        "apihelp-parse-param-pst": "Fai unha transformación antes de gardar a entrada antes de analizala. Válida unicamente para usar con texto.",
        "apihelp-parse-param-onlypst": "Facer unha transformación antes de gardar (PST) a entrada, pero sen analizala. Devolve o mesmo wikitexto, despois de que a PST foi aplicada. Só válida cando se usa con <var>$1text</var>.",
        "apihelp-parse-param-effectivelanglinks": "Inclúe ligazóns de idioma proporcionadas polas extensións (para usar con <kbd>$1prop=langlinks</kbd>).",
        "apihelp-parse-param-section": "Recuperar unicamente o contido deste número de sección ou cando <kbd>new</kbd> xera unha nova sección.\n\nA sección <kbd>new</kbd> só é atendida cando se especifica <var>text</var>.",
        "apihelp-parse-param-sectiontitle": "Novo título de sección cando <var>section</var> é <kbd>new</kbd>.\n\nA diferenza da edición de páxinas, non se oculta no <var>summary</var> cando se omite ou está baleiro.",
-       "apihelp-parse-param-disablepp": "Omitir o informe de preprocesador (\"Informe de límite NewPP\") da saída do analizador.",
+       "apihelp-parse-param-disablelimitreport": "Omitir o informe de preprocesador (\"Informe de límite NewPP\") da saída do analizador.",
        "apihelp-parse-param-disableeditsection": "Omitir as ligazóns de edición de sección da saída do analizador.",
        "apihelp-parse-param-generatexml": "Xenerar unha árbore de análise XML (necesita o modelo de contido <code>$1</code>; substituído por <kbd>$2prop=parsetree</kbd>).",
        "apihelp-parse-param-preview": "Analizar en modo vista previa.",
index 677fa98..de8e83d 100644 (file)
        "apihelp-parse-paramvalue-prop-iwlinks": "מתן קישורי בינוויקי בקוד הוויקי המפוענח.",
        "apihelp-parse-paramvalue-prop-wikitext": "מתן קוד הוויקי המקורי שפוענח.",
        "apihelp-parse-paramvalue-prop-properties": "נותן מאפיינים שונים שמוגדרים בקוד הוויקי המפוענח.",
-       "apihelp-parse-paramvalue-prop-limitreportdata": "נותן דו\"ח הגבלות בדרך מובנית. לא נותן שום נתונים כאשר מוגדר <var>$1disablepp</var>.",
-       "apihelp-parse-paramvalue-prop-limitreporthtml": "נותן את גרסת ה־HTML של דו\"ח ההגבלות. לא נותן שום נתונים כאשר מוגדר <var>$1disablepp</var>.",
+       "apihelp-parse-paramvalue-prop-limitreportdata": "נותן דו\"ח הגבלות בדרך מובנית. לא נותן שום נתונים כאשר מוגדר <var>$1disablelimitreport</var>.",
+       "apihelp-parse-paramvalue-prop-limitreporthtml": "נותן את גרסת ה־HTML של דו\"ח ההגבלות. לא נותן שום נתונים כאשר מוגדר <var>$1disablelimitreport</var>.",
        "apihelp-parse-paramvalue-prop-parsetree": "עץ פענוח XML של תוכן הגרסה (דורש מודל תוכן <code>$1</code>)",
        "apihelp-parse-param-pst": "לעשות התמרה לפני שמירה על הקלט לפני פענוחו. תקין רק בשימוש עם טקסט.",
        "apihelp-parse-param-onlypst": "לעשות התמרה לפני שמירה (pre-save transform‏, PST) על הקלט, אבל לא לפענח אותו. מחזיר את אותו קוד הוויקי אחרי החלת PST. תקף רק בשימוש עם <var>$1text</var>.",
        "apihelp-parse-param-effectivelanglinks": "כולל קישור שפה שמספקות הרחבות (לשימוש עם <kbd>$1prop=langlinks</kbd>).",
        "apihelp-parse-param-section": "לאחזר את התוכן של הפסקה עם המספר הזה, או, אם זה <kbd>new</kbd>, ליצור פסקה חדשה.\n\n<kbd>new</kbd> יכובד רק בעת ציון <var>text</var>.",
        "apihelp-parse-param-sectiontitle": "כותרת פסקה חדשה כאשר <var>section</var> הוא <kbd>new</kbd>.\n\nבניגוד לעריכת דף, זה לא מתגבה ל־<var>summary</var> כשזה מושמט אם ריק.",
-       "apihelp-parse-param-disablepp": "להשמיט את דו\"ח הקדם־מעבד (\"NewPP limit report\") מפלט המפענח.",
+       "apihelp-parse-param-disablelimitreport": "להשמיט את דו\"ח הקדם־מעבד (\"NewPP limit report\") מפלט המפענח.",
+       "apihelp-parse-param-disablepp": "יש להשתמש ב־<var>$1disablelimitreport</var> במקום.",
        "apihelp-parse-param-disableeditsection": "להשמיט את קישורי עריכת הפסקאות מפלט המפענח.",
+       "apihelp-parse-param-disabletidy": "לא להריץ ניקוי HTML (למשל tidy) על פלט המפענח.",
        "apihelp-parse-param-generatexml": "יצירת עץ פענוח של XML (נדרש מודל תוכן <code>$1</code>; מוחלף ב־<kbd>$2prop=parsetree</kbd>).",
        "apihelp-parse-param-preview": "לפענח במצב תצוגה מקדימה.",
        "apihelp-parse-param-sectionpreview": "לפענח במצב תצוגה מקדימה של פסקה (מדליק גם את מצב תצוגה מקדימה).",
index a91fb9d..e6aab1e 100644 (file)
        "apihelp-query+info-paramvalue-prop-readable": "Czy użytkownik może przeczytać tę stronę.",
        "apihelp-query+iwbacklinks-param-prefix": "Prefix interwiki.",
        "apihelp-query+iwbacklinks-param-limit": "Łączna ilość stron do zwrócenia.",
+       "apihelp-query+iwlinks-paramvalue-prop-url": "Dodaje pełny adres URL.",
        "apihelp-query+links-param-limit": "Ilość linków do zwrócenia.",
        "apihelp-query+linkshere-paramvalue-prop-title": "Nazwa każdej strony.",
        "apihelp-query+linkshere-param-limit": "Ilość do zwrócenia.",
index 82e05ff..a476b7a 100644 (file)
        "apihelp-parse-paramvalue-prop-iwlinks": "Fornece links interwiki no wikitexto analisado.",
        "apihelp-parse-paramvalue-prop-wikitext": "Fornece o wikitexto original que foi analisado.",
        "apihelp-parse-paramvalue-prop-properties": "Fornece várias propriedades definidas no wikitexto analisado.",
-       "apihelp-parse-paramvalue-prop-limitreportdata": "Fornece o relatório limite de uma forma estruturada. Não informa dado, quando<var>$1disablepp</var> se definido.",
+       "apihelp-parse-paramvalue-prop-limitreportdata": "Fornece o relatório limite de uma forma estruturada. Não informa dado, quando<var>$1disablelimitreport</var> se definido.",
        "apihelp-parse-example-page": "Analisa uma página.",
        "apihelp-parse-example-text": "Analisa wikitexto.",
        "apihelp-parse-example-texttitle": "Analisa wikitexto, especificando o título da página.",
index 2189d75..194e10f 100644 (file)
        "apihelp-parse-paramvalue-prop-iwlinks": "Дає інтервікі-посилання в аналізованому вікітексті.",
        "apihelp-parse-paramvalue-prop-wikitext": "Дає вихідний вікітекст, який було аналізовано.",
        "apihelp-parse-paramvalue-prop-properties": "Дає різні властивості, визначені в аналізованому вікітексті.",
-       "apihelp-parse-paramvalue-prop-limitreportdata": "Дає звіт по обмеженнях у структурованому вигляді. Не видає даних, якщо встановлено <var>$1disablepp</var>.",
-       "apihelp-parse-paramvalue-prop-limitreporthtml": "Дає HTML-версію звіту по обмеженнях. Не видає даних, якщо встановлено <var>$1disablepp</var>.",
+       "apihelp-parse-paramvalue-prop-limitreportdata": "Дає звіт по обмеженнях у структурованому вигляді. Не видає даних, якщо встановлено <var>$1disablelimitreport</var>.",
+       "apihelp-parse-paramvalue-prop-limitreporthtml": "Дає HTML-версію звіту по обмеженнях. Не видає даних, якщо встановлено <var>$1disablelimitreport</var>.",
        "apihelp-parse-paramvalue-prop-parsetree": "Синтаксичне дерево XML вмісту версії (передбачає модель вмісту <code>$1</code>)",
        "apihelp-parse-param-pst": "Зробіть трансформацію вхідних даних перед збереженням і аналізом. Дійсне лише при використанні з текстом.",
        "apihelp-parse-param-onlypst": "Зробіть трансформацію вхідних даних перед збереженням (PST), але не аналізуйте. Видає той самий вікітекст, після застосування PST. Дійсне лише у разі використання з <var>$1text</var>.",
        "apihelp-parse-param-effectivelanglinks": "Включає мовні посилання, додані розширеннями (для використання з <kbd>$1prop=langlinks</kbd>).",
        "apihelp-parse-param-section": "Видає вміст лише розділу з цим номером або при <kbd>new</kbd> створенні нового розділу.\n\n<kbd>new</kbd> розділ відзначається лише при вказанні тексту <var>text</var>.",
        "apihelp-parse-param-sectiontitle": "Заголовок нового розділу, коли <var>section</var> має значення <kbd>new</kbd>.\n\nНа відміну від редагування сторінки, це не повертається до <var>summary</var>, якщо пропустити чи лишити порожнім.",
-       "apihelp-parse-param-disablepp": "Пропустити звіт препроцесора («NewPP limit report») на виході аналізу.",
+       "apihelp-parse-param-disablelimitreport": "Пропустити звіт препроцесора («NewPP limit report») на виході аналізу.",
        "apihelp-parse-param-disableeditsection": "Пропустити посилання на редагування розділів на виході аналізу.",
        "apihelp-parse-param-generatexml": "Генерувати синтаксичне дерево XML (передбачає модель вмісту <code>$1</code>; замінено на <kbd>$2prop=parsetree</kbd>).",
        "apihelp-parse-param-preview": "Аналізувати у режимі попереднього перегляду.",
index 3ffc792..53bc4e8 100644 (file)
        "apihelp-paraminfo-param-helpformat": "Định dạng chuỗi trợ giúp.",
        "apihelp-parse-param-summary": "Lời tóm lược để phân tích.",
        "apihelp-parse-param-section": "Chỉ truy xuất nội dung của số phần này; nếu có <kbd>new</kbd> thì tạo phần mới.\n\nPhần <kbd>new</kbd> chỉ được chấp nhận khi định rõ <var>text</var>.",
-       "apihelp-parse-param-disablepp": "Bỏ qua thông báo bộ tiền xử lý (“NewPP limit report”) khi cho ra kết quả bộ xử lý.",
+       "apihelp-parse-param-disablelimitreport": "Bỏ qua thông báo bộ tiền xử lý (“NewPP limit report”) khi cho ra kết quả bộ xử lý.",
        "apihelp-parse-example-page": "Phân tích trang.",
        "apihelp-parse-example-text": "Phân tích văn bản wiki.",
        "apihelp-parse-example-texttitle": "Phân tích văn bản wiki theo tên trang.",
index e905c7b..75f4d75 100644 (file)
        "apihelp-parse-paramvalue-prop-indicators": "提供页面上使用的页面状态指示器的HTML。",
        "apihelp-parse-paramvalue-prop-iwlinks": "在被解析的wiki文本中提供跨wiki链接。",
        "apihelp-parse-paramvalue-prop-wikitext": "提供被解析的原始wiki文本。",
-       "apihelp-parse-paramvalue-prop-limitreportdata": "以结构化的方式提供限制报告。如果<var>$1disablepp</var>被设定则不提供数据。",
-       "apihelp-parse-paramvalue-prop-limitreporthtml": "提供限制报告的HTML版本。当<var>$1disablepp</var>被设置时不会提供数据。",
+       "apihelp-parse-paramvalue-prop-limitreportdata": "以结构化的方式提供限制报告。如果<var>$1disablelimitreport</var>被设定则不提供数据。",
+       "apihelp-parse-paramvalue-prop-limitreporthtml": "提供限制报告的HTML版本。当<var>$1disablelimitreport</var>被设置时不会提供数据。",
        "apihelp-parse-paramvalue-prop-parsetree": "修订内容的XML解析树(需要内容模型<code>$1</code>)",
        "apihelp-parse-param-pst": "在解析输入前,对输入做一次保存前变换处理。仅当使用文本时有效。",
        "apihelp-parse-param-effectivelanglinks": "包含由扩展提供的语言链接(用于与<kbd>$1prop=langlinks</kbd>一起使用)。",
        "apihelp-parse-param-section": "只检索此段数的内容,或只当<kbd>new</kbd>生成新的段落时检索。\n\n<kbd>new</kbd>段落只当指定<var>text</var>时受尊重。",
        "apihelp-parse-param-sectiontitle": "当<var>section</var>为<kbd>new</kbd>时新段落标题。\n\n不像页面编辑,当省略或为空时将不会备选为<var>summary</var>。",
-       "apihelp-parse-param-disablepp": "从解析器输出中省略预处理器报告(“NewPP limit report”)。",
+       "apihelp-parse-param-disablelimitreport": "从解析器输出中省略预处理器报告(“NewPP limit report”)。",
        "apihelp-parse-param-disableeditsection": "从解析器输出中省略编辑段落链接。",
        "apihelp-parse-param-generatexml": "生成XML解析树(需要内容模型<code>$1</code>;被<kbd>$2prop=parsetree</kbd>所取代)。",
        "apihelp-parse-param-preview": "在预览模式下解析。",
diff --git a/includes/compat/IPSetCompat.php b/includes/compat/IPSetCompat.php
new file mode 100644 (file)
index 0000000..79c6000
--- /dev/null
@@ -0,0 +1,28 @@
+<?php
+/**
+ * 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
+ */
+
+/**
+ * Backward-compatibility alias for IPSet, which was moved out
+ * into an external library and namespaced.
+ *
+ * @deprecated since 1.26 use IPSet\IPSet directly
+ */
+class IPSet extends IPSet\IPSet {
+}
diff --git a/includes/libs/IPSet.php b/includes/libs/IPSet.php
deleted file mode 100644 (file)
index c1c841e..0000000
+++ /dev/null
@@ -1,276 +0,0 @@
-<?php
-/**
- * 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 Brandon Black <blblack@gmail.com>
- */
-
-/**
- * Matches IP addresses against a set of CIDR specifications
- *
- * Usage:
- *   // At startup, calculate the optimized data structure for the set:
- *   $ipset = new IPSet( $wgSquidServersNoPurge );
- *   // runtime check against cached set (returns bool):
- *   $allowme = $ipset->match( $ip );
- *
- * In rough benchmarking, this takes about 80% more time than
- * in_array() checks on a short (a couple hundred at most) array
- * of addresses.  It's fast either way at those levels, though,
- * and IPSet would scale better than in_array if the array were
- * much larger.
- *
- * For mixed-family CIDR sets, however, this code gives well over
- * 100x speedup vs iterating IP::isInRange() over an array
- * of CIDR specs.
- *
- * The basic implementation is two separate binary trees
- * (IPv4 and IPv6) as nested php arrays with keys named 0 and 1.
- * The values false and true are terminal match-fail and match-success,
- * otherwise the value is a deeper node in the tree.
- *
- * A simple depth-compression scheme is also implemented: whole-byte
- * tree compression at whole-byte boundaries only, where no branching
- * occurs during that whole byte of depth.  A compressed node has
- * keys 'comp' (the byte to compare) and 'next' (the next node to
- * recurse into if 'comp' matched successfully).
- *
- * For example, given these inputs:
- * 25.0.0.0/9
- * 25.192.0.0/10
- *
- * The v4 tree would look like:
- * root4 => array(
- *     'comp' => 25,
- *     'next' => array(
- *         0 => true,
- *         1 => array(
- *             0 => false,
- *             1 => true,
- *         ),
- *     ),
- * );
- *
- * (multi-byte compression nodes were attempted as well, but were
- * a net loss in my test scenarios due to additional match complexity)
- *
- * @since 1.24
- */
-class IPSet {
-       /** @var array $root4: the root of the IPv4 matching tree */
-       private $root4 = array( false, false );
-
-       /** @var array $root6: the root of the IPv6 matching tree */
-       private $root6 = array( false, false );
-
-       /**
-        * __construct() instantiate the object from an array of CIDR specs
-        *
-        * @param array $cfg array of IPv[46] CIDR specs as strings
-        * @return IPSet new IPSet object
-        *
-        * Invalid input network/mask values in $cfg will result in issuing
-        * E_WARNING and/or E_USER_WARNING and the bad values being ignored.
-        */
-       public function __construct( array $cfg ) {
-               foreach ( $cfg as $cidr ) {
-                       $this->addCidr( $cidr );
-               }
-
-               self::recOptimize( $this->root4 );
-               self::recCompress( $this->root4, 0, 24 );
-               self::recOptimize( $this->root6 );
-               self::recCompress( $this->root6, 0, 120 );
-       }
-
-       /**
-        * Add a single CIDR spec to the internal matching trees
-        *
-        * @param string $cidr string CIDR spec, IPv[46], optional /mask (def all-1's)
-        */
-       private function addCidr( $cidr ) {
-               // v4 or v6 check
-               if ( strpos( $cidr, ':' ) === false ) {
-                       $node =& $this->root4;
-                       $defMask = '32';
-               } else {
-                       $node =& $this->root6;
-                       $defMask = '128';
-               }
-
-               // Default to all-1's mask if no netmask in the input
-               if ( strpos( $cidr, '/' ) === false ) {
-                       $net = $cidr;
-                       $mask = $defMask;
-               } else {
-                       list( $net, $mask ) = explode( '/', $cidr, 2 );
-                       if ( !ctype_digit( $mask ) || intval( $mask ) > $defMask ) {
-                               trigger_error( "IPSet: Bad mask '$mask' from '$cidr', ignored", E_USER_WARNING );
-                               return;
-                       }
-               }
-               $mask = intval( $mask ); // explicit integer convert, checked above
-
-               // convert $net to an array of integer bytes, length 4 or 16:
-               $raw = inet_pton( $net );
-               if ( $raw === false ) {
-                       return; // inet_pton() sends an E_WARNING for us
-               }
-               $rawOrd = array_map( 'ord', str_split( $raw ) );
-
-               // special-case: zero mask overwrites the whole tree with a pair of terminal successes
-               if ( $mask == 0 ) {
-                       $node = array( true, true );
-                       return;
-               }
-
-               // iterate the bits of the address while walking the tree structure for inserts
-               $curBit = 0;
-               while ( 1 ) {
-                       $maskShift = 7 - ( $curBit & 7 );
-                       $node =& $node[( $rawOrd[$curBit >> 3] & ( 1 << $maskShift ) ) >> $maskShift];
-                       ++$curBit;
-                       if ( $node === true ) {
-                               // already added a larger supernet, no need to go deeper
-                               return;
-                       } elseif ( $curBit == $mask ) {
-                               // this may wipe out deeper subnets from earlier
-                               $node = true;
-                               return;
-                       } elseif ( $node === false ) {
-                               // create new subarray to go deeper
-                               $node = array( false, false );
-                       }
-               }
-       }
-
-       /**
-        * Match an IP address against the set
-        *
-        * @param string $ip string IPv[46] address
-        * @return bool true is match success, false is match failure
-        *
-        * If $ip is unparseable, inet_pton may issue an E_WARNING to that effect
-        */
-       public function match( $ip ) {
-               $raw = inet_pton( $ip );
-               if ( $raw === false ) {
-                       return false; // inet_pton() sends an E_WARNING for us
-               }
-
-               $rawOrd = array_map( 'ord', str_split( $raw ) );
-               if ( count( $rawOrd ) == 4 ) {
-                       $node =& $this->root4;
-               } else {
-                       $node =& $this->root6;
-               }
-
-               $curBit = 0;
-               while ( 1 ) {
-                       if ( isset( $node['comp'] ) ) {
-                               // compressed node, matches 1 whole byte on a byte boundary
-                               if ( $rawOrd[$curBit >> 3] != $node['comp'] ) {
-                                       return false;
-                               }
-                               $curBit += 8;
-                               $node =& $node['next'];
-                       } else {
-                               // uncompressed node, walk in the correct direction for the current bit-value
-                               $maskShift = 7 - ( $curBit & 7 );
-                               $node =& $node[( $rawOrd[$curBit >> 3] & ( 1 << $maskShift ) ) >> $maskShift];
-                               ++$curBit;
-                       }
-
-                       if ( $node === true || $node === false ) {
-                               return $node;
-                       }
-               }
-       }
-
-       /**
-        * Recursively merges adjacent nets into larger supernets
-        *
-        * @param array &$node Tree node to optimize, by-reference
-        *
-        *  e.g.: 8.0.0.0/8 + 9.0.0.0/8 -> 8.0.0.0/7
-        */
-       private static function recOptimize( &$node ) {
-               if ( $node[0] !== false && $node[0] !== true && self::recOptimize( $node[0] ) ) {
-                       $node[0] = true;
-               }
-               if ( $node[1] !== false && $node[1] !== true && self::recOptimize( $node[1] ) ) {
-                       $node[1] = true;
-               }
-               if ( $node[0] === true && $node[1] === true ) {
-                       return true;
-               }
-               return false;
-       }
-
-       /**
-        * Recursively compresses a tree
-        *
-        * @param array &$node Tree node to compress, by-reference
-        * @param integer $curBit current depth in the tree
-        * @param integer $maxCompStart maximum depth at which compression can start, family-specific
-        *
-        * This is a very simplistic compression scheme: if we go through a whole
-        * byte of address starting at a byte boundary with no real branching
-        * other than immediate false-vs-(node|true), compress that subtree down to a single
-        * byte-matching node.
-        * The $maxCompStart check elides recursing the final 7 levels of depth (family-dependent)
-        */
-       private static function recCompress( &$node, $curBit, $maxCompStart ) {
-               if ( !( $curBit & 7 ) ) { // byte boundary, check for depth-8 single path(s)
-                       $byte = 0;
-                       $cnode =& $node;
-                       $i = 8;
-                       while ( $i-- ) {
-                               if ( $cnode[0] === false ) {
-                                       $byte |= 1 << $i;
-                                       $cnode =& $cnode[1];
-                               } elseif ( $cnode[1] === false ) {
-                                       $cnode =& $cnode[0];
-                               } else {
-                                       // partial-byte branching, give up
-                                       break;
-                               }
-                       }
-                       if ( $i == -1 ) { // means we did not exit the while() via break
-                               $node = array(
-                                       'comp' => $byte,
-                                       'next' => &$cnode,
-                               );
-                               $curBit += 8;
-                               if ( $cnode !== true ) {
-                                       self::recCompress( $cnode, $curBit, $maxCompStart );
-                               }
-                               return;
-                       }
-               }
-
-               ++$curBit;
-               if ( $curBit <= $maxCompStart ) {
-                       if ( $node[0] !== false && $node[0] !== true ) {
-                               self::recCompress( $node[0], $curBit, $maxCompStart );
-                       }
-                       if ( $node[1] !== false && $node[1] !== true ) {
-                               self::recCompress( $node[1], $curBit, $maxCompStart );
-                       }
-               }
-       }
-}
index b129bd2..069896c 100644 (file)
@@ -1199,10 +1199,9 @@ class WikiPage implements Page, IDBAccessObject {
         * Best if all done inside a transaction.
         *
         * @param DatabaseBase $dbw
-        * @return int The newly created page_id key, or false if the title already existed
+        * @return int|bool The newly created page_id key; false if the title already existed
         */
        public function insertOn( $dbw ) {
-
                $page_id = $dbw->nextSequenceValue( 'page_page_id_seq' );
                $dbw->insert( 'page', array(
                        'page_id'           => $page_id,
@@ -1223,9 +1222,11 @@ class WikiPage implements Page, IDBAccessObject {
                        $newid = $dbw->insertId();
                        $this->mId = $newid;
                        $this->mTitle->resetArticleID( $newid );
-               }
 
-               return $affected ? $newid : false;
+                       return $newid;
+               } else {
+                       return false;
+               }
        }
 
        /**
index 3d5d23e..9731a20 100644 (file)
@@ -5324,6 +5324,7 @@ class Parser {
                $ig->setParser( $this );
                $ig->setHideBadImages();
                $ig->setAttributes( Sanitizer::validateTagAttributes( $params, 'table' ) );
+               $this->getOutput()->addModuleStyles( 'mediawiki.page.gallery.styles' );
 
                if ( isset( $params['showfilename'] ) ) {
                        $ig->setShowFilename( true );
index a702d2e..d601467 100644 (file)
@@ -142,8 +142,12 @@ class PoolWorkArticleView extends PoolCounterWork {
 
                // Timing hack
                if ( $time > 3 ) {
-                       wfDebugLog( 'slow-parse', sprintf( "%-5.2f %s", $time,
-                               $this->page->getTitle()->getPrefixedDBkey() ) );
+                       // TODO: Use Parser's logger (once it has one)
+                       $logger = MediaWiki\Logger\LoggerFactory::getInstance( 'slow-parse' );
+                       $logger->info( '{time} {title}', array(
+                               'time' => number_format( $time, 2 ),
+                               'title' => $this->page->getTitle()->getPrefixedDBkey(),
+                       ) );
                }
 
                if ( $this->cacheable && $this->parserOutput->isCacheable() && $isCurrent ) {
index ae3736a..666660a 100644 (file)
@@ -21,6 +21,8 @@
  * @author Antoine Musso "<hashar at free dot fr>", Aaron Schulz
  */
 
+use IPSet\IPSet;
+
 // Some regex definition to "play" with IP address and IP address blocks
 
 // An IPv4 address is made of 4 bytes from x00 to xFF which is d0 to d255
index d230f35..c1eea1b 100644 (file)
        "databaseerror-error": "Хэукъоныгъэ: $1",
        "laggedslavemode": "<strong>Сакъ:</strong> НэкIубгъом имылъын лъэкIыщт хэIэзэныкIэмэ ащыщ.",
        "readonly": "Датэбазэр гъэпытагъэ",
-       "missingarticle-diff": "(Зэгъпш: $1, $2)",
+       "missingarticle-rev": "(версиеу № $1)",
+       "missingarticle-diff": "(Зэгъапш: $1, $2)",
        "internalerror": "ЫкIоцI хэукъоныгъэ",
-       "internalerror_info": "ЫкIоÑ\86I Ñ\85Ñ\8dÑ\83кÑ\8aонÑ\8bгъэ: $1",
+       "internalerror_info": "ЫкIоÑ\86I Ñ\84Ñ\8bкÑ\8aÑ\83агъэ: $1",
        "filecopyerror": "\"$1\"-файлыр \"$2\"-м копи шIын лъэкIыгъэп.",
        "filerenameerror": "Файлэу \"$1\" ыц1э \"$2\" фэдэу хъожьын лъэкIырэп.",
        "filedeleteerror": "Файлэу \"$1\" тегъэкIын лъэкIырэп.",
        "userlogin-yourname": "НэбгырацӀэр",
        "userlogin-yourname-ph": "Итх уи нэбгырацIэ",
        "createacct-another-username-ph": "Итх уи нэбгырацӀэр",
-       "yourpassword": "Шъэфыгъэ:",
+       "yourpassword": "ШъэфгущыI:",
        "userlogin-yourpassword": "ШъэфгущыI",
        "userlogin-yourpassword-ph": "Уи шъэфгущыIэ итх",
        "createacct-yourpassword-ph": "Къэтх шъэфгущыIэ горэ",
        "gotaccount": "Аккаунт уиӏаха? $1.",
        "gotaccountlink": "Системэм хахь",
        "userlogin-resetlink": "Уи хэхьан датэхэр пщыгъупшагъа?",
-       "userlogin-resetpassword-link": "Уипаролыр пщыгъупшагъа?",
+       "userlogin-resetpassword-link": "УишъэфгущыIэр пщыгъупшагъа?",
        "userlogin-helplink2": "Системэм сыхэхьанэу къыздеӏ",
        "userlogin-createanother": "НэмыкI аккаунт къэубл",
        "createacct-emailrequired": "Емэйл адрес",
        "createacct-benefit-body1": "{{PLURAL:$1|еӀэзэныгъэ|еӀэзэныгъ}}",
        "createacct-benefit-body2": "{{PLURAL:$1|нэкӀубгъо|нэкӀубгъу}}",
        "createacct-benefit-body3": "бэмышӀэу {{PLURAL:$1|хэлэжьакӀу|хэлэжьакӀо}}",
+       "badretype": "ШъэфгущыIэу ибгъэхьагъэхэр зэтефэрэп.",
        "userexists": "Ибгъэхьэгъэ нэбгырацIэр агъэфедэ.\nНэмыкI цIэ горэ къыхэхба.",
        "loginerror": "Системэ хэхьаныгъэр къуанчэ",
        "createacct-error": "Аккаунт къэублэныгъэ къончагъ",
        "nouserspecified": "НэбгырацIэр птхын фае.",
        "wrongpassword": "ШъэфгущыIэр тэрэзэп.\nДжыри зэ еплъ.",
        "wrongpasswordempty": "ШъэфгущыIэр нэкIы.\nДжыри зэ еплъ.",
+       "passwordtooshort": "ШъэфгущыIэр мыхъуми {{PLURAL:$1|1 символ |символ $1}} хъун фае.",
        "password-name-match": "Уи шъэфгущыIэр уи нэбгырацIэм фэдапэ хъущтэп.",
        "mailmypassword": "Зэтедз шъэфгущыIэр",
        "noemailcreate": "Емэйл тэрэз птхын фае.",
        "user-mail-no-addy": "Емэйл адрес имыIэу емэйл аригъэхьынэу фэягъ.",
        "user-mail-no-body": "Емэйл ебгъэхьынэу уфаягъ, нэкIэу е мэхьанэнчъэ кIакоу.",
        "changepassword": "ШъэфгущыIэр зэблэхъу",
+       "resetpass_announce": "Системэ хэхьаныр зэшIобгъэкIынэу, шъэфгущыIакIэ бгъэпсын фае.",
        "resetpass_header": "Аккаунтым и шъэфгущыIэр зэблэхъу",
        "oldpassword": "ШъэфгущыIэжъыр:",
        "newpassword": "ШъэфгущыIакIэр:",
        "resetpass-no-info": "Мы нэкIубгъом занкIэу укIонэу уфаемэ, системэм ухэхьэгъэн фае.",
        "resetpass-submit-loggedin": "ШъэфгущыIэр зэблэхъу",
        "resetpass-submit-cancel": "Ыуж икӀ",
+       "resetpass-recycled": "УишъэфгущыIэр зэтедзба джырэм фэмыдэу.",
        "resetpass-expired": "ШъэфгущыIэм и зэман икIыгъ. ШъэфгущыIакIэ горэ гъэпсба.",
-       "passwordreset": "Зэтедз паролыр",
+       "passwordreset": "Зэтедз шъэфгущыIэр",
        "passwordreset-disabled": "Мы виким шъэфгущыIэр щызэтебдзэшъущтэп.",
        "passwordreset-emaildisabled": "Мы виким емэйл-Iофыгъохэр щылажьэхэрэп.",
        "passwordreset-username": "НэбгырацIэ:",
        "passwordreset-emailtitle": "Аккаунт и гъэпсыкIэхэр, мий щыI {{SITENAME}}",
        "passwordreset-emailelement": "НэбгырацIэ: $1\nTemporary password: $2",
        "passwordreset-emailsent": "ШъэфгущыIэм и зэтедзым пае емэйл агъэхьыгъ.",
+       "passwordreset-emailsent-capture": "ШъэфгущыIэм изэтедз фэгъэхьыгъэ емэйлыр гъахьыгъэ, ычIэгъкIэ ар олъэгъу.",
        "changeemail": "Зэблэхъу емэйл адресыр",
        "changeemail-oldemail": "Джырэ емэйл адрес:",
        "changeemail-newemail": "Емэйл адресыкIэр:",
        "right-createtalk": "ТегущыIэнэ нэкIубгъохэр шIы",
        "right-createaccount": "Нэбгырэмэ я аккаунт кIэхэр шIы",
        "right-minoredit": "ЕIэзэнхэр цIыкIухэу гъэнафэх",
-       "right-move": "Ð¥Ñ\8cÑ\8bÑ\85 Ð½Ñ\8dкIÑ\83бгÑ\8aоÑ\85Ñ\8dÑ\80",
+       "right-move": "Ð\9dÑ\8dкIÑ\83бгÑ\8aомÑ\8d Ð°Ñ\86\8dÑ\85Ñ\8dÑ\80 Ñ\85Ñ\8aожÑ\8c",
        "right-move-subpages": "Хьых нэкIубгъохэмрэ кIэтнэкIубгъохэмрэ",
        "right-move-categorypages": "Хьы категорием и нэкIубгъохэр",
-       "right-movefile": "Ð¥Ñ\8cÑ\8b Ñ\84айлÑ\85Ñ\8dÑ\80",
+       "right-movefile": "ФайлÑ\8dмÑ\8d Ð°Ñ\86\8dÑ\85Ñ\8dÑ\80 Ñ\85Ñ\8aожÑ\8c",
        "right-upload": "Файлыр илъхь",
        "right-reupload": "ЩыIэ файлхэм ашъхьэтетхэн",
        "right-writeapi": "Итхэным пае API игъэфедэн",
        "right-editmyusercss": "Уи CSS файлэмэ яIэзэн",
        "right-editmyuserjs": "Уи JavaScript файлэмэ яIэзэн",
        "right-viewmywatchlist": "Уи лъыплъэ купым еплъ",
+       "right-passwordreset": "ШъэфгущыIэм фэгъэхьыгъэ емэйлхэм яплъ",
        "newuserlogpage": "ХэлэжьакӀомэ яублэн лог",
        "action-read": "едж мы нэкIубгъом",
        "action-edit": "мы нэкIубгъом еIаз",
        "action-createaccount": "мы нэбгырэм и аккаунт ублэн",
        "action-history": "мы нэкIубгъом и тарихъым еплъын",
        "action-minoredit": "мы еIэзэныгъэр цIыкIоу гъэнаф",
-       "action-move": "хьы мы нэкӀубгъор",
+       "action-move": "мы нэкIубгъом ыцIэ хъожь",
        "action-move-subpages": "хьы мы нэкIубгъори, кIэтнэкIубгъохэри",
        "action-move-categorypages": "хьы категорием и нэкIубгъохэр",
        "action-movefile": "хьы мы файлыр",
        "sharedupload-desc-here": "Мы файлыр мыщ къикIыгъ $1 ыкIи нэмыкI проектхэм ащыгъэфедэн лъэкIыщт.\nИнформациеу [$2 файлым и гурыIон-тхыгъэм] щыщыр ычIэгъкIэ щыт.",
        "upload-disallowed-here": "Мы файлым ухэӀэзахьыжьын уфитэп.",
        "randompage": "ОшӀэдэмышӀэ нэкӀубгъу",
+       "randomincategory-category": "Категорие:",
+       "randomincategory-legend": "Категорием щыщэу ошIэдэмышIэ нэкIубгъу",
+       "randomincategory-submit": "КӀо",
+       "statistics": "Статистикэ",
+       "statistics-header-pages": "Нэк1убгъо статистикэ",
+       "statistics-header-edits": "ЕIэзэнхэм ястатистикэ",
+       "statistics-header-users": "Нэбгырэмэ ястатистикэ",
+       "statistics-header-hooks": "НэмыкI статистикэ",
+       "statistics-pages": "НэкӀубгъохэр",
        "statistics-files": "Илъхьэгъэ файлэхэр",
+       "pageswithprop-submit": "КӀо",
+       "brokenredirects-edit": "еӀаз",
+       "brokenredirects-delete": "тегъэкI",
        "nbytes": "$1{{PLURAL:$1|байт|байтхэр}}",
        "nmembers": "$1 {{PLURAL:$1|объект|объектхэр}}",
+       "shortpages": "НэкIубгъо кIакIохэр",
+       "longpages": "НэкIубгъо кIахьхэр",
+       "protectedpages-page": "НэкӀубгъо",
+       "protectedpages-reason": "ЗыпкъырыкIырэр",
+       "protectedpages-unknown-timestamp": "ЗэхэмышIыкIыгъэ",
        "newpages": "НэкӀубгъуакӀэхэр",
+       "newpages-username": "НэбгырацIэ:",
+       "ancientpages": "Жъыдэдэ нэкIубгъохэр",
        "move": "Хьы",
+       "movethispage": "ЫцIэ зэблэхъу мы нэкIубгъом",
        "pager-older-n": "{{PLURAL:$1|нахьыжъэу 1|нахьыжъхэу $1}}",
        "booksources": "Тхылъхэр къыздикӀыгъэхэр",
        "booksources-search-legend": "Тхылъ лъапсэхэм алъыхъу",
index 2565a07..030d65f 100644 (file)
        "navigation-heading": "Navigasie-keuseskerm",
        "errorpagetitle": "Fout",
        "returnto": "Keer terug na $1.",
-       "tagline": "in {{SITENAME}}",
+       "tagline": "Vanaf {{SITENAME}}",
        "help": "Hulp",
        "search": "Soek",
        "searchbutton": "Soek",
        "go": "Wys",
        "searcharticle": "Wys",
-       "history": "Ouer weergawes",
+       "history": "Bladsy geskiedenis",
        "history_short": "Geskiedenis",
        "updatedmarker": "opgedateer sedert my laaste besoek",
        "printableversion": "Drukbare weergawe",
        "aboutsite": "Inligting oor {{SITENAME}}",
        "aboutpage": "Project:Omtrent",
        "copyright": "Inhoud is onderhewig aan $1, tensy anders vermeld",
-       "copyrightpage": "{{ns:project}}:kopiereg",
+       "copyrightpage": "{{ns:project}}:Kopieregte",
        "currentevents": "Huidige gebeure",
        "currentevents-url": "Project:Huidige gebeure",
        "disclaimers": "Voorbehoud",
        "feed-invalid": "Voertipe word nie ondersteun nie.",
        "feed-unavailable": "Sindikasievoer is nie beskikbaar",
        "site-rss-feed": "$1 RSS-voer",
-       "site-atom-feed": "$1 Atom-voer",
+       "site-atom-feed": "$1 Atoomvoer",
        "page-rss-feed": "\"$1\" RSS-voer",
-       "page-atom-feed": "\"$1\" Atom-voer",
+       "page-atom-feed": "\"$1\" Atoomvoer",
        "red-link-title": "$1 (bladsy bestaan nie)",
        "sort-descending": "Sorteer aflopend",
        "sort-ascending": "Sorteer oplopend",
        "changeemail-password": "U wagwoord vir {{SITENAME}}:",
        "changeemail-submit": "Wysig E-posadres",
        "resettokens-token-label": "$1 (huidige waarde: $2)",
-       "bold_sample": "Vetgedrukte teks",
+       "bold_sample": "Vetdruk",
        "bold_tip": "Vetdruk",
        "italic_sample": "Skuinsgedrukte teks",
        "italic_tip": "Skuinsdruk",
        "nowiki_sample": "Plaas ongeformatteerde teks hier",
        "nowiki_tip": "Ignoreer wiki-formattering",
        "image_sample": "Voorbeeld.jpg",
-       "image_tip": "Beeld/prentjie/diagram",
+       "image_tip": "Media lêer",
        "media_sample": "Voorbeeld.ogg",
-       "media_tip": "Skakel na ander tipe medialêer",
+       "media_tip": "Lêerskakel",
        "sig_tip": "Handtekening met datum",
        "hr_tip": "Horisontale streep (selde nodig)",
        "summary": "Opsomming:",
        "viewpagelogs": "Bekyk logboeke vir hierdie bladsy",
        "nohistory": "Daar is geen wysigingsgeskiedenis vir hierdie bladsy nie.",
        "currentrev": "Huidige wysiging",
-       "currentrev-asof": "Huidige wysiging per $1",
+       "currentrev-asof": "Huidige wysiging sedert $1",
        "revisionasof": "Wysiging soos op $1",
-       "revision-info": "Weergawe deur {{GENDER:$6|$2}} op $4 om $5$7",
+       "revision-info": "Weergawe deur {{GENDER:$6|$2}} op $1$7",
        "previousrevision": "← Ouer weergawe",
        "nextrevision": "Nuwer weergawe →",
        "currentrevisionlink": "Huidige weergawe",
        "mergelog": "Versmeltingslogboek",
        "revertmerge": "Samesmelting ongedaan maak",
        "mergelogpagetext": "Hieronder is 'n lys van die mees onlangse versmeltings van een bladsy se geskiedenis na 'n ander.",
-       "history-title": "$1: weergawegeskiedenis",
-       "difference-title": "$1: verskil tussen weergawes",
+       "history-title": "Weergawegeskiedenis van \"$1\"",
+       "difference-title": "Verskil tussen weergawes van \"$1\"",
        "difference-title-multipage": "$1 en $2: verskil tussen bladsye",
        "difference-multipage": "(Verskil tussen bladsye)",
        "lineno": "Lyn $1:",
        "showhideselectedversions": "Wys/versteek gekose weergawes",
        "editundo": "maak ongedaan",
        "diff-empty": "(Geen verskil)",
+       "diff-multi-sameuser": "({{PLURAL:$1|Een tussenin wysiging|$1 tussenin wysigings}} deur dieselfde gebruiker nie gewys nie)",
        "diff-multi-manyusers": "({{PLURAL:$1|Een tussenin wysiging|$1 tussenin wysigings}} deur meer as $2 {{PLURAL:$2|gebruiker|gebruikers}} nie gewys nie)",
        "difference-missing-revision": "{{PLURAL:$2|'n Weergawe|$2 weergawes}} van die verskil ($1) {{PLURAL:$2|is|is}} nie gevind nie.\n\nDit word meestal veroorsaak deur die volg van 'n verouderde verwysing na 'n bladsy wat verwyder is.\nDetails kan in die [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} skraplogboek] gevind word.",
        "searchresults": "Soekresultate",
        "right-override-export-depth": "Eksporteer bladsye insluitend geskakelde bladsye tot 'n diepte van 5",
        "right-sendemail": "Stuur e-pos aan ander gebruikers",
        "right-passwordreset": "Wys e-posse vir herstel van wagwoord",
-       "newuserlogpage": "Logboek van nuwe gebruikers",
+       "newuserlogpage": "Boekstaaf van nuwe gebruikers",
        "newuserlogpagetext": "Dit is 'n logboek van gebruikers wat onlangs ingeteken het.",
        "rightslog": "Gebruikersregtelogboek",
        "rightslogtext": "Hier onder is die logboek van gebruikersregte wat verander is.",
        "imagelinks": "Lêergebruik",
        "linkstoimage": "Die volgende {{PLURAL:$1|bladsy|$1 bladsye}} gebruik hierdie prent:",
        "linkstoimage-more": "Daar is meer as $1 {{PLURAL:$1|skakel|skakels}} na hierdie lêer.\nDie volgende lys vertoon slegs die eerste {{PLURAL:$1|skakel|$1 skakels}} wat na die lêer verwys.\n'n [[Special:WhatLinksHere/$2|Volledige lys]] is ook beskikbaar.",
-       "nolinkstoimage": "Daar is geen bladsye wat hierdie prent gebruik nie.",
+       "nolinkstoimage": "Daar is geen bladsye wat skakel na hierdie lêer nie.",
        "morelinkstoimage": "Wys [[Special:WhatLinksHere/$1|meer skakels]] na die lêer.",
        "linkstoimage-redirect": "$1 (lêeraanstuur) $2",
        "duplicatesoffile": "Die volgende {{PLURAL:$1|lêer is 'n duplikaat|$1 lêers is duplikate}} van die lêer ([[Special:FileDuplicateSearch/$2|meer details]]):",
        "booksources-invalid-isbn": "Die ingevoerde ISBN-kode blyk asof dit ongeldig is; maak asseblief seker dat u dit sonder fout oorgekopiëer het vanaf die oorspronklike bron.",
        "specialloguserlabel": "Uitvoerende gebruiker:",
        "speciallogtitlelabel": "Teiken (bladsy of gebruiker):",
-       "log": "Logboeke",
+       "log": "Boekstawe",
        "all-logs-page": "Alle openbare logboeke",
        "alllogstext": "Vertoon 'n samestelling van alle boekstawings van {{SITENAME}}.\nU kan die resultate vernou deur 'n boekstaaftipe, gebruikersnaam (kas-sensitief) of spesifieke blad (ook kas-sensitief) te kies.",
        "logempty": "Geen inskrywings in die logboek voldoen aan die kriteria nie.",
        "actioncomplete": "Aksie uitgevoer",
        "actionfailed": "Aksie het gefaal",
        "deletedtext": "\"$1\" is geskrap.\nSien die $2 vir 'n rekord van onlangse skrappings.",
-       "dellogpage": "Skraplogboek",
+       "dellogpage": "Skrapboeksaaf",
        "dellogpagetext": "Hier onder is 'n lys van die mees onlangse skrappings. Alle tye is bedienertyd (UGT).",
        "deletionlog": "skraplogboek",
        "reverted": "Het terug gegaan na vroeëre weergawe",
        "delete-toobig": "Die bladsy het 'n lang wysigingsgeskiedenis, meer as $1 {{PLURAL:$1|weergawe|weergawes}}.\nVerwydering van die soort blaaie is beperk om ontwrigting van {{SITENAME}} te voorkom.",
        "delete-warning-toobig": "Hierdie bladsy het 'n lang wysigingsgeskiedenis; meer as $1 {{PLURAL:$1|wysiging|wysigings}}.\nDeur weg te doen met hierdie bladsy mag dalk die werking van {{SITENAME}} versteur;\nTree asseblief versigtig op.",
        "rollback": "Rol veranderinge terug",
-       "rollbacklink": "Rol terug",
+       "rollbacklink": "rol terug",
        "rollbacklinkcount": "rol {{PLURAL:$1|een wysiging|$1 wysigings}} terug",
        "rollbacklinkcount-morethan": "rol meer as {{PLURAL:$1|een wysiging|$1 wysigings}} terug",
        "rollbackfailed": "Terugrol onsuksesvol",
        "rollback-success": "Wysigings deur $1 is teruggerol.\nDie laaste weergawe van $2 is teruggeplaas.",
        "sessionfailure-title": "Sessie het gefaal",
        "sessionfailure": "Dit lyk of daar 'n probleem met u sessie is.\nHierdie aksie is gekanselleer omdat dit 'n veiligheidsrisiko is (moontlike kaping van u sessie).\nGaan een bladsy terug, herlaai die bladsy en probeer dan weer.",
-       "protectlogpage": "Beskermlogboek",
+       "protectlogpage": "Beskermingboekstaaf",
        "protectlogtext": "Hieronder is 'n lys van veranderinge wat aan die beveilig van bladsye aangebring is.\nSien die [[Special:ProtectedPages|lys van beveiligde bladsye]] vir alle bladsye wat tans operasioneel beveilig is.",
        "protectedarticle": "het [[$1]] beskerm",
        "modifiedarticleprotection": "Die beskermingsvlak vir \"[[$1]]\" is gewysig",
        "movepage-page-moved": "Die bladsy $1 is na $2 geskuif.",
        "movepage-page-unmoved": "Die bladsy $1 kon nie na $2 geskuif word nie.",
        "movepage-max-pages": "Die maksimum van $1 {{PLURAL:$1|bladsy|bladsye}} is geskuif. Die oorblywende bladsye na nie outomaties geskuif word nie.",
-       "movelogpage": "Skuiflogboek",
+       "movelogpage": "Skuif boekstaaf",
        "movelogpagetext": "Hier onder is 'n lys van geskuifde bladsye.",
        "movesubpage": "{{PLURAL:$1|Subbladsy|Subbladsye}}",
        "movesubpagetext": "Die {{PLURAL:$1|subbladsy|$1 subbladsye}} van hierdie blad word hieronder gewys.",
        "tooltip-pt-logout": "Teken uit",
        "tooltip-pt-createaccount": "U word aangemoedig om 'n gebruiker te skep en aan te meld, hoewel dit nie verpligtend is nie.",
        "tooltip-ca-talk": "Bespreking oor die inhoudbladsy",
-       "tooltip-ca-edit": "U kan hierdie bladsy wysig. Gebruik asseblief die voorskoufunksie vóór u dit stoor.",
+       "tooltip-ca-edit": "Wysig hierdie bladsy",
        "tooltip-ca-addsection": "Begin 'n nuwe bespreking",
        "tooltip-ca-viewsource": "Hierdie bladsy is beskerm. U kan die bronteks besigtig.",
        "tooltip-ca-history": "Ouer weergawes van hierdie bladsy",
        "tooltip-n-mainpage": "Besoek die Tuisblad",
        "tooltip-n-mainpage-description": "Gaan na die tuisblad",
        "tooltip-n-portal": "Meer oor die projek, wat jy kan doen, nuttige skakels",
-       "tooltip-n-currentevents": "'n Plek waar almal gesellig kan verkeer",
+       "tooltip-n-currentevents": "Agtergrondinligting oor aktuele sake",
        "tooltip-n-recentchanges": "'n Lys van onlangse wysigings",
        "tooltip-n-randompage": "Laai 'n lukrake bladsye",
        "tooltip-n-help": "Vind meer uit oor iets",
        "tooltip-t-whatlinkshere": "'n Lys bladsye wat hierheen skakel",
        "tooltip-t-recentchangeslinked": "Onlangse wysigings aan bladsye wat vanaf hierdie bladsy geskakel is",
        "tooltip-feed-rss": "RSS-voed vir hierdie bladsy",
-       "tooltip-feed-atom": "Atom-voed vir hierdie bladsy",
+       "tooltip-feed-atom": "Atoomvoer vir hierdie bladsy",
        "tooltip-t-contributions": "Bekyk 'n lys van bydraes deur hierdie gebruiker",
        "tooltip-t-emailuser": "Stuur 'n e-pos aan hierdie gebruiker",
-       "tooltip-t-upload": "Laai beelde of ander medialêers op",
+       "tooltip-t-upload": "Laai lêers op",
        "tooltip-t-specialpages": "'n Lys van al die spesiale bladsye",
        "tooltip-t-print": "Drukbare weergawe van hierdie bladsy",
        "tooltip-t-permalink": "'n Permanente skakel na hierdie weergawe van die bladsy",
        "tooltip-watchlistedit-raw-submit": "Opdateer dophoulys",
        "tooltip-recreate": "Herskep hierdie bladsy al is dit voorheen geskrap",
        "tooltip-upload": "Begin oplaai",
-       "tooltip-rollback": "Rol met een kliek die laaste gebruiker se wysiging(s) van aan hierdie bladsy terug.",
+       "tooltip-rollback": "Rol met een kliek die laaste gebruiker se wysiging(s) aan hierdie bladsy terug.",
        "tooltip-undo": "Met \"ongedaan maak\" maak u hierdie wysiging ongedaan en land u in die wysigingsvenster.\nU kan daar 'n wysigingsopsomming byvoeg.",
        "tooltip-preferences-save": "Stoor voorkeure",
        "tooltip-summary": "Verskaf 'n kort opsomming",
        "spam_reverting": "Besig met terugrol na die laaste weergawe wat nie skakels na $1 bevat nie",
        "spam_blanking": "Alle weergawes met 'n skakel na $1 word verwyder",
        "spam_deleting": "Alle weergawes bevat verwysings na $1. Bladsy verwyder",
-       "simpleantispam-label": "Antispam-kontrole.\n<strong>Moenie</strong> die veld invul nie!",
+       "simpleantispam-label": "<strong>Moenie</strong> die veld invul nie!",
        "pageinfo-title": "Inligting oor \"$1\"",
        "pageinfo-not-current": "Hierdie gegewens is slegs vir die huidige weergawe beskikbaar.",
        "pageinfo-header-basic": "Basiese inligting",
index c00cf1d..9bc5f95 100644 (file)
        "emailmessage": "Mesaj:",
        "emailsend": "Göndər",
        "emailccme": "Məktubun surətini elektron ünvanıma göndər.",
-       "emailccsubject": " $1: $2-yə olan ismarıclarınızın surəti",
+       "emailccsubject": "$1 adlı istifadəçiyə olan ismarıcınızın surəti: $2",
        "emailsent": "E-məktub göndərildi",
        "emailsenttext": "E-məktub mesajınız göndərildi.",
        "usermessage-summary": "Sistem mesajı qoyun.",
index 49b8b7b..d7f6b1a 100644 (file)
        "content-model-css": "CSS",
        "content-json-empty-object": "Objeto vacío",
        "content-json-empty-array": "Matriz vacía",
-       "duplicate-args-warning": "<strong>Aviso:</strong> [[:$1]] convoca a [[:$2]] con más de un valor para el parámetro «$3». Se usará solo el último valor proporcionado.",
+       "duplicate-args-warning": "<strong>Aviso:</strong> [[:$1]] llama a [[:$2]] con más de un valor para el parámetro «$3». Se usará solo el último valor proporcionado.",
        "duplicate-args-category": "Páginas que usan argumentos duplicados en invocaciones de plantillas",
        "duplicate-args-category-desc": "La página contiene invocaciones de plantillas que utilizan argumentos duplicados, como <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> o <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "<strong>Advertencia:</strong> esta página contiene demasiadas llamadas a funciones sintácticas costosas.\n\nTiene {{PLURAL:$1|una llamada|$1 llamadas}}, pero debería tener menos de {{PLURAL:$2|una|$2}}.",
        "filetype-missing": "El archivo no tiene extensión (como «.jpg»).",
        "empty-file": "El archivo que enviaste estaba vacío.",
        "file-too-large": "El archivo que enviste era demasiado grande.",
-       "filename-tooshort": "El nombre de archivo es demasiado corto.",
+       "filename-tooshort": "El nombre del archivo es demasiado corto.",
        "filetype-banned": "El tipo de archivo está prohibido.",
        "verification-error": "Este archivo no superó la verificación de archivos.",
        "hookaborted": "Una extensión ha impedido la modificación que intentaste realizar.",
-       "illegal-filename": "El nombre de archivo no está permitido.",
-       "overwrite": "Sobrescribir un archivo existente no está permitido.",
+       "illegal-filename": "El nombre del archivo no está permitido.",
+       "overwrite": "No está permitido sobrescribir un archivo existente.",
        "unknown-error": "Ocurrió un error desconocido.",
        "tmp-create-error": "No se pudo crear archivo temporal.",
-       "tmp-write-error": "Error al escribir archivo temporal.",
+       "tmp-write-error": "Error al escribir el archivo temporal.",
        "large-file": "Se recomienda que los archivos no sean mayores de $1; este archivo ocupa $2.",
        "largefileserver": "El tamaño de este archivo es mayor del que este servidor admite por configuración.",
        "emptyfile": "El archivo que has intentado subir parece estar vacío; por favor, verifica que realmente se trate del archivo que intentabas subir.",
        "upload-misc-error-text": "Ha ocurrido un error durante la subida.\nVerifica que la URL es válida y accesible e inténtalo de nuevo.\nSi el problema persiste, contacta con un [[Special:ListUsers/sysop|administrador]].",
        "upload-too-many-redirects": "La URL contenía demasiadas redirecciones",
        "upload-http-error": "Ha ocurrido un error HTTP: $1",
-       "upload-copy-upload-invalid-domain": "No se pueden realizar cargas remotas desde este dominio.",
+       "upload-copy-upload-invalid-domain": "No se pueden realizar subidas remotas desde este dominio.",
        "upload-dialog-title": "Subir archivo",
        "upload-dialog-error": "Ha ocurrido un error",
        "upload-dialog-warning": "Ha ocurrido una advertencia",
        "filedelete-nofile": "<strong>$1</strong> no existe.",
        "filedelete-nofile-old": "No existe una versión guardada de <strong>$1</strong> con los atributos especificados.",
        "filedelete-otherreason": "Otra razón:",
-       "filedelete-reason-otherlist": "Otra razón",
+       "filedelete-reason-otherlist": "Otro motivo",
        "filedelete-reason-dropdown": "*Razones habituales de borrado\n** Violación de derechos de autor\n** Archivo duplicado",
        "filedelete-edit-reasonlist": "Edita los motivos del borrado",
        "filedelete-maintenance": "Borrado y restauración de archivos temporalmente deshabilitados durante el mantenimiento.",
        "ancientpages": "Artículos más antiguos",
        "move": "Trasladar",
        "movethispage": "Trasladar esta página",
-       "unusedimagestext": "Los siguientes archivos existen pero no están insertados en ninguna página.\nPor favor note que otros sitios web pueden vincular a un archivo con un URL directo, y por tanto pueden ser listados aquí a pesar de estar en uso activo.",
+       "unusedimagestext": "Los siguientes archivos existen pero no están insertados en ninguna página.\nTen en cuenta que otros sitios web pueden enlazar un archivo directamente por la URL, y por tanto pueden estar listados aquí a pesar de estar siendo usados de forma activa.",
        "unusedcategoriestext": "Las siguientes categorías han sido creadas, pero ningún artículo o categoría las utiliza.",
        "notargettitle": "No hay página objetivo",
        "notargettext": "No has especificado sobre qué página deseas llevar a cabo esta acción.",
        "protect-existing-expiry": "Fecha de caducidad actual: $2 a las $3",
        "protect-existing-expiry-infinity": "Tiempo de caducidad existente: infinito",
        "protect-otherreason": "Otra razón:",
-       "protect-otherreason-op": "Otra razón",
+       "protect-otherreason-op": "Otro motivo",
        "protect-dropdown": "*Razones de protección habituales\n**Vandalismo excesivo\n**Spam excesivo\n**Guerra de ediciones\n**Página muy visitada",
        "protect-edit-reasonlist": "Editar las razones de protección",
        "protect-expiry-options": "1 hora:1 hour,1 día:1 day,1 semana:1 week,2 semanas:2 weeks,1 mes:1 month,3 meses:3 months,6 meses:6 months,1 año:1 year,para siempre:infinite",
        "export-submit": "Exportar",
        "export-addcattext": "Añadir páginas desde la categoría:",
        "export-addcat": "Añadir",
-       "export-addnstext": "Agregar páginas del nombre del sitio:",
+       "export-addnstext": "Agregar páginas desde el espacio de nombres:",
        "export-addns": "Agregar",
        "export-download": "Guardar como archivo",
        "export-templates": "Incluir plantillas",
        "importstart": "Importando páginas...",
        "import-revision-count": "$1 {{PLURAL:$1|revisión|revisiones}}",
        "importnopages": "No hay páginas que importar.",
-       "imported-log-entries": "Importados $1 {{PLURAL:$1|entradas de registro|entradas de registro}}.",
+       "imported-log-entries": "{{PLURAL:$1|Se importó|Se importaron}} $1 {{PLURAL:$1|entrada|entradas}} de registro.",
        "importfailed": "La importación ha fallado: $1",
        "importunknownsource": "Tipo de fuente de importación desconocida",
        "importcantopen": "No se pudo importar el archivo",
        "group-sysop.js": "/* Cualquier código JavaScript escrito aquí se cargará para todos los usuarios del grupo Administradores */",
        "group-bureaucrat.js": "/* Cualquier código JavaScript escrito aquí se cargará para todos los usuarios del grupo Burócratas */",
        "anonymous": "{{PLURAL:$1|Usuario anónimo|Usuarios anónimos}} de {{SITENAME}}",
-       "siteuser": "{{GENDER:$1|Usuario|Usuaria}} $1 de {{SITENAME}}",
-       "anonuser": "{{SITENAME}} usuario anónimo $1",
+       "siteuser": "{{GENDER:$1|el usuario|la usuaria}} $1 de {{SITENAME}}",
+       "anonuser": "el usuario anónimo $1 de {{SITENAME}}",
        "lastmodifiedatby": "Esta página fue modificada por última vez en $2, $1 por $3.",
        "othercontribs": "Basado en el trabajo de $1.",
        "others": "otros",
-       "siteusers": "{{PLURAL:$2|Usuario|Usuarios}} $1 de {{SITENAME}}",
-       "anonusers": "{{SITENAME}} {{PLURAL:$2|usuario|usuarios}} anónimos $1",
+       "siteusers": "{{PLURAL:$2|el usuario|los usuarios}} $1 de {{SITENAME}}",
+       "anonusers": "{{PLURAL:$2|el usuario anónimo|los usuarios anónimos}} $1 de {{SITENAME}}",
        "creditspage": "Créditos de la página",
        "nocredits": "No hay información de créditos para esta página.",
        "spamprotectiontitle": "Filtro de protección contra spam",
        "htmlform-user-not-valid": "<strong>$1</strong> no es un nombre de usuario válido.",
        "sqlite-has-fts": "$1 con soporte para búsqueda de texto completo",
        "sqlite-no-fts": "$1 sin soporte para búsqueda de texto completo",
-       "logentry-delete-delete": "$1 {{GENDER:$2|borró}} la página «$3»",
+       "logentry-delete-delete": "$1 {{GENDER:$2|borró}} la página $3",
        "logentry-delete-restore": "$1 restauró la página «$3»",
        "logentry-delete-event": "$1 {{GENDER:$2|modificó}} la visibilidad de {{PLURAL:$5|un evento|$5 eventos}} del registro en $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|modificó}} la visibilidad de {{PLURAL:$5|una revisión |$5 revisiones}} en la página  $3: $4",
        "logentry-delete-event-legacy": "$1 ha {{GENDER:$2|cambiado}} la visibilidad de registro de eventos en $3",
        "logentry-delete-revision-legacy": "$1 ha {{GENDER:$2|cambiado}} la visibilidad de las revisiones en la página $3",
-       "logentry-suppress-delete": "$1 {{GENDER:$2|borró}}, con restricciones para administradores aplicadas, la página $3",
+       "logentry-suppress-delete": "$1 {{GENDER:$2|borró}} la página $3",
        "logentry-suppress-event": "$1 {{GENDER:$2|modificó}} secretamente la visibilidad de {{PLURAL:$5|una edición|$5 ediciones}} en la página $3: $4",
        "logentry-suppress-revision": "$1 {{GENDER:$2|modificó}} secretamente la visibilidad de {{PLURAL:$5|una edición|$5 ediciones}} en la página $3: $4",
        "logentry-suppress-event-legacy": "$1 {{GENDER:$2|modificó}} secretamente la visibilidad de los eventos del registro en $3",
index c37746b..87b9415 100644 (file)
        "blocked-notice-logextract": "Este usuario está bloqueado.\nVelaquí está a última entrada do rexistro de bloqueos, por se quere consultala:",
        "clearyourcache": "'''Nota:''' Despois de gardar, cómpre limpar a memoria caché do seu navegador para ver os cambios.\n* '''Firefox/Safari:''' Prema ''Maiúsculas'' á vez que en ''Recargar'', ou prema en ''Ctrl-F5'' ou ''Ctrl-R'' (''⌘-R'' nos Mac)\n* '''Google Chrome:''' Prema en ''Ctrl-Maiús-R'' (''⌘-Maiús-R'' nos Mac)\n* '''Internet Explorer:''' Prema ''Ctrl'' ao tempo que fai clic en ''Refrescar'', ou prema en ''Ctrl-F5''\n* '''Opera:''' Limpe a súa memoria caché en ''Ferramentas → Preferencias''",
        "usercssyoucanpreview": "'''Nota:''' Use o botón \"{{int:showpreview}}\" para verificar o novo CSS antes de gardalo.",
-       "userjsyoucanpreview": "'''Nota:''' Use o botón \"{{int:showpreview}}\" para verificar o novo JS antes de gardalo.",
+       "userjsyoucanpreview": "<strong>Nota:</strong> Use o botón \"{{int:showpreview}}\" para verificar o novo JavaScript antes de gardalo.",
        "usercsspreview": "'''Lembre que só está vendo a vista previa do seu CSS de usuario.'''\n'''Este aínda non foi gardado!'''",
        "userjspreview": "'''Lembre que só está probando/previsualizando o seu JavaScript de usuario.'''\n'''Este aínda non foi gardado!'''",
        "sitecsspreview": "'''Lembre que só está vendo a vista previa deste CSS.'''\n'''Este aínda non foi gardado!'''",
        "sitejspreview": "'''Lembre que só está vendo a vista previa deste código JavaScript.'''\n'''Este aínda non foi gardado!'''",
-       "userinvalidcssjstitle": "'''Aviso:''' Non hai ningunha aparencia chamada \"$1\".\nLembre que as páxinas .css e .js personalizadas utilizan un título en minúsculas, como por exemplo \"{{ns:user}}:Foo/vector.css\" no canto de \"{{ns:user}}:Foo/Vector.css\".",
+       "userinvalidcssjstitle": "<strong>Aviso:</strong> Non hai ningunha aparencia chamada \"$1\".\nLembre que as páxinas .css e .js personalizadas utilizan un título en minúsculas, como por exemplo \"{{ns:user}}:Exemplo/vector.css\" no canto de \"{{ns:user}}:Exemplo/Vector.css\".",
        "updated": "(Actualizado)",
        "note": "'''Nota:'''",
        "previewnote": "'''Lembre que esta é só unha vista previa e que aínda non gardou os seus cambios!'''",
        "default": "predeterminado",
        "prefs-files": "Ficheiros",
        "prefs-custom-css": "CSS personalizado",
-       "prefs-custom-js": "JS personalizado",
-       "prefs-common-css-js": "CSS/JS compartido por todas as aparencias:",
+       "prefs-custom-js": "JavaScript personalizado",
+       "prefs-common-css-js": "CSS/JavaScript compartido por todas as aparencias:",
        "prefs-reset-intro": "Pode usar esta páxina para restablecer as súas preferencias ás que veñen dadas por defecto.\nEste cambio non se poderá desfacer.",
        "prefs-emailconfirm-label": "Confirmación do correo:",
        "youremail": "Correo electrónico:",
        "noindex-category-desc": "A páxina non está indexada polos bots porque contén a palabra máxica <code><nowiki>__NOINDEX__</nowiki></code> e está nun espazo de nomes no que esa marca está permitida.",
        "index-category-desc": "A páxina contén a palabra máxica <code><nowiki>__INDEX__</nowiki></code> (e está nun espazo de nomes no que esa marca está permitida) e, polo tanto, será indexada polos bots cando non debera selo normalmente.",
        "post-expand-template-inclusion-category-desc": "O tamaño da páxina é maior que <code>$wgMaxArticleSize</code> despois de expandir todos os modelos; algúns modelos non se expandiron.",
-       "post-expand-template-argument-category-desc": "A páxina é maior que <code>$wgMaxArticleSize</code> despois de expandir o argumento dun modelo (algo entre chaves triples, como <code>{{{Proba}}}</code>).",
+       "post-expand-template-argument-category-desc": "A páxina é maior que <code>$wgMaxArticleSize</code> despois de expandir o argumento dun modelo (algo entre chaves triples, como <code>{{{Exemplo}}}</code>).",
        "expensive-parserfunction-category-desc": "A páxina utiliza demasiadas funcións analíticas custosas (como <code>#ifexist</code>). Consulte [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
        "broken-file-category-desc": "A páxina contén unha ligazón de ficheiro rota (unha ligazón para incorporar un ficheiro que non existe).",
        "hidden-category-category-desc": "A categoría contén a palabra máxica <code><nowiki>__HIDDENCAT__</nowiki></code>, que impide que se mostre por defecto na caixa de categorías das páxinas.",
        "json-warn-trailing-comma": "{{PLURAL:$1|Eliminouse $1 coma final|Elimináronse $1 comas finais}} do JSON.",
        "json-error-unknown": "Houbo un problema co JSON. Erro: $1",
        "json-error-depth": "Superouse o número máximo de ficheiros apartados.",
-       "json-error-state-mismatch": "O JSON non é válido.",
+       "json-error-state-mismatch": "O JSON non é válido ou ten un formato incorrecto",
        "json-error-ctrl-char": "Produciuse un erro de carácter de control, trátase probablemente dun problema de codificación.",
        "json-error-syntax": "Erro de sintaxe",
        "json-error-utf8": "Hai caracteres UTF-8 incorrectos, trátase probablemente dun problema de codificación.",
index 6873f85..35095e6 100644 (file)
        "prefs-watchlist-days": "מספר הימים המרבי שיוצגו ברשימת המעקב:",
        "prefs-watchlist-days-max": "לכל היותר {{PLURAL:$1|יום אחד|יומיים|$1 ימים}}",
        "prefs-watchlist-edits": "מספר העריכות המרבי שיוצגו ברשימת המעקב המורחבת:",
-       "prefs-watchlist-edits-max": "×\9eספר ×\9e×\99ר×\91×\99: 1000",
+       "prefs-watchlist-edits-max": "מספר מרבי: 1000",
        "prefs-watchlist-token": "אסימון לרשימת המעקב:",
        "prefs-misc": "שונות",
        "prefs-resetpass": "שינוי סיסמה",
index b29271e..dd4cc41 100644 (file)
        "accmailtitle": "Parole nosūtīta.",
        "accmailtext": "Nejauši ģenerēta parole lietotājam [[User talk:$1|$1]] tika nosūtīta uz $2.\n\nŠī konta paroli pēc ielogošanās varēs nomainīt ''[[Special:ChangePassword|šeit]]''.",
        "newarticle": "(Jauns raksts)",
-       "newarticletext": "Tu šeit nonāci sekojot saitei uz, pagaidām vēl neuzrakstītu, lapu.\nLai izveidotu lapu, sāc rakstīt teksta logā apakšā (par teksta formatēšanu un sīkākai informācija skatīt [$1 palīdzības lapu]).\nJa tu šeit nonāci kļūdas pēc, vienkārši uzspied '''back''' pogu pārlūkprogrammā.",
+       "newarticletext": "Šajā projektā vēl nav lapas ar šādu nosaukumu.\nLai izveidotu lapu, sāc rakstīt teksta logā apakšā (par teksta formatēšanu un sīkākai informācija skatīt [$1 palīdzības lapu]).\nJa tu šeit nonāci kļūdas pēc, vienkārši uzspied <strong>back</strong> pogu pārlūkprogrammā.",
        "anontalkpagetext": "----''Šī ir diskusiju lapa anonīmam lietotājam, kurš vēl nav kļuvis par reģistrētu lietotāju vai arī neizmanto savu lietotājvārdu. Tādēļ mums ir jāizmanto skaitliskā IP adrese, lai viņu identificētu.\nŠāda IP adrese var būt vairākiem lietotājiem.\nJa tu esi anonīms lietotājs un uzskati, ka tev ir adresēti neatbilstoši komentāri, lūdzu, [[Special:UserLogin/signup|kļūsti par lietotāju]] vai arī [[Special:UserLogin|izmanto jau izveidotu lietotājvārdu]], lai izvairītos no turpmākām neskaidrībām un tu netiktu sajaukts ar citiem anonīmiem lietotājiem.''",
        "noarticletext": "Šajā lapā šobrīd nav nekāda teksta, tu vari [[Special:Search/{{PAGENAME}}|meklēt citās lapās pēc šīs lapas nosaukuma]], <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} meklēt saistītos reģistru ierakstos] vai arī [{{fullurl:{{FULLPAGENAME}}|action=edit}} sākt rediģēt šo lapu]</span>.",
        "noarticletext-nopermission": "Šajā lapā pašlaik nav nekāda teksta.\nTu vari [[Special:Search/{{PAGENAME}}|meklēt šīs lapas nosaukumu]] citās lapās,\nvai <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} meklēt saistītus reģistru ierakstus]</span>, bet jums nav atļauja izveidot si lapu.",
index 17ede96..d03c991 100644 (file)
        "log": "Registros",
        "all-logs-page": "Todos os registros públicos",
        "alllogstext": "Exibição combinada de todos registros disponíveis para o {{SITENAME}}.\nVocê pode diminuir a lista escolhendo um tipo de registro, um nome de usuário (sensível a maiúsculas e minúsculas), ou uma página afetada (também sensível a maiúsculas e minúsculas).",
-       "logempty": "Nenhum item idêntico no registro.",
+       "logempty": "Nenhum item correspondente no registro.",
        "log-title-wildcard": "Procurar por títulos que sejam iniciados com o seguinte texto",
        "showhideselectedlogentries": "Exibir/ocultar os itens de registros selecionados",
        "log-edit-tags": "Editar etiquetas das entradas selecionadas",
index e2a6219..90e0f86 100644 (file)
        "log": "Registos",
        "all-logs-page": "Todos os registos públicos",
        "alllogstext": "Apresentação combinada de todos os registos disponíveis na wiki {{SITENAME}}.\nPode reduzir a lista escolhendo um tipo de registo, um nome de utilizador ou um título de página. Respeite maiúsculas e minúsculas.",
-       "logempty": "Não há dados a apresentar.",
+       "logempty": "Nenhum item correspondente no registo.",
        "log-title-wildcard": "Procurar títulos iniciados por este texto",
        "showhideselectedlogentries": "Mostrar ou ocultar as entradas selecionadas",
        "log-edit-tags": "Editar etiquetas das entradas de registo selecionadas",
index cb33de4..ac3cb4e 100644 (file)
        "javascripttest-pagetext-frameworks": "请选择以下的框架之一:$1",
        "javascripttest-pagetext-skins": "选择外观来运行测试:",
        "javascripttest-qunit-intro": "请见mediawiki.org的[$1 测试说明文件]。",
-       "tooltip-pt-userpage": "你的用户页面",
+       "tooltip-pt-userpage": "您的用户页",
        "tooltip-pt-anonuserpage": "你用于编辑的IP地址的用户页面",
        "tooltip-pt-mytalk": "你的讨论页面",
        "tooltip-pt-anontalk": "有关本IP地址的编辑的讨论",
index 73e65dc..478e0d7 100644 (file)
@@ -182,15 +182,20 @@ class DeleteEqualMessages extends Maintenance {
                        $this->output( "\n* [[$title]]" );
                        $page = WikiPage::factory( $title );
                        $error = ''; // Passed by ref
-                       // FIXME: Deletion failures should be reported, not silently ignored.
-                       $page->doDeleteArticle( 'No longer required', false, 0, true, $error, $user );
+                       $success = $page->doDeleteArticle( 'No longer required', false, 0, true, $error, $user );
+                       if ( !$success ) {
+                               $this->output( " (Failed!)" );
+                       }
                        if ( $result['hasTalk'] && $doDeleteTalk ) {
                                $title = Title::makeTitle( NS_MEDIAWIKI_TALK, $result['title'] );
                                $this->output( "\n* [[$title]]" );
                                $page = WikiPage::factory( $title );
                                $error = ''; // Passed by ref
-                               $page->doDeleteArticle( 'Orphaned talk page of no longer required message',
+                               $success = $page->doDeleteArticle( 'Orphaned talk page of no longer required message',
                                        false, 0, true, $error, $user );
+                               if ( !$success ) {
+                                       $this->output( " (Failed!)" );
+                               }
                        }
                }
                $this->output( "\n\ndone!\n" );
index 28a27d7..7794911 100644 (file)
@@ -1434,9 +1434,18 @@ return array(
        'mediawiki.page.gallery' => array(
                'scripts' => 'resources/src/mediawiki.page/mediawiki.page.gallery.js',
                'dependencies' => array(
+                       'mediawiki.page.gallery.styles',
                        'jquery.throttle-debounce',
                )
        ),
+       'mediawiki.page.gallery.styles' => array(
+               'styles' => array(
+                       'resources/src/mediawiki.page/mediawiki.page.gallery.print.css' => array( 'media' => 'print' ),
+                       'resources/src/mediawiki.page/mediawiki.page.gallery.css',
+               ),
+               'position' => 'top',
+               'targets' => array( 'desktop', 'mobile' ),
+       ),
        'mediawiki.page.ready' => array(
                'scripts' => 'resources/src/mediawiki.page/mediawiki.page.ready.js',
                'dependencies' => array(
@@ -1718,6 +1727,8 @@ return array(
        'mediawiki.legacy.commonPrint' => array(
                'position' => 'top',
                'styles' => array(
+                       // @todo: Remove mediawiki.page.gallery when cache has cleared
+                       'resources/src/mediawiki.page/mediawiki.page.gallery.print.css' => array( 'media' => 'print' ),
                        'resources/src/mediawiki.legacy/commonPrint.css' => array( 'media' => 'print' )
                ),
                'group' => 'print',
@@ -1731,6 +1742,8 @@ return array(
        'mediawiki.legacy.shared' => array(
                'position' => 'top',
                'styles' => array(
+                       // @todo: Remove when mediawiki.page.gallery in cached html.
+                       'resources/src/mediawiki.page/mediawiki.page.gallery.css',
                        'resources/src/mediawiki.legacy/shared.css' => array( 'media' => 'screen' )
                ),
        ),
index 8c3d091..ad905c6 100644 (file)
@@ -114,8 +114,9 @@ return call_user_func( function () {
 
                if ( substr( $name, 0, 5 ) === 'icons' ) {
                        $module['selectorWithoutVariant'] = '.oo-ui-icon-{name}, .mw-ui-icon-{name}:before';
-                       $module['selectorWithVariant'] = '.oo-ui-image-{variant} .oo-ui-icon-{name},
+                       $module['selectorWithVariant'] = '
                                .oo-ui-image-{variant}.oo-ui-icon-{name}, .mw-ui-icon-{name}-{variant}:before,
+                               /* Hack for Flow, see T110051 */
                                .mw-ui-hovericon:hover .mw-ui-icon-{name}-{variant}-hover:before,
                                .mw-ui-hovericon.mw-ui-icon-{name}-{variant}-hover:hover:before';
                }
index e2315d2..afff463 100644 (file)
         * "fobo", not "foba". Basically emulating the native maxlength by
         * reconstructing where the insertion occurred.
         *
-        * @private
+        * @static
         * @param {string} safeVal Known value that was previously returned by this
         * function, if none, pass empty string.
         * @param {string} newVal New value that may have to be trimmed down.
         * @param {number} byteLimit Number of bytes the value may be in size.
-        * @param {Function} [fn] See jQuery.byteLimit.
+        * @param {Function} [fn] See jQuery#byteLimit.
         * @return {Object}
         * @return {string} return.newVal
         * @return {boolean} return.trimmed
         */
-       function trimValueForByteLength( safeVal, newVal, byteLimit, fn ) {
+       $.trimByteLength = function ( safeVal, newVal, byteLimit, fn ) {
                var startMatches, endMatches, matchesLen, inpParts,
                        oldVal = safeVal;
 
@@ -92,7 +92,7 @@
                        newVal: newVal,
                        trimmed: true
                };
-       }
+       };
 
        var eventKeys = [
                'keyup.byteLimit',
                        // See http://www.w3.org/TR/DOM-Level-3-Events/#events-keyboard-event-order for
                        // the order and characteristics of the key events.
                        $el.on( eventKeys, function () {
-                               var res = trimValueForByteLength(
+                               var res = $.trimByteLength(
                                        prevSafeVal,
                                        this.value,
                                        elLimit,
                                        this.value = res.newVal;
                                }
                                // Always adjust prevSafeVal to reflect the input value. Not doing this could cause
-                               // trimValueForByteLength to compare the new value to an empty string instead of the
+                               // trimByteLength to compare the new value to an empty string instead of the
                                // old value, resulting in trimming always from the end (bug 40850).
                                prevSafeVal = res.newVal;
                        } );
                } );
        };
 
-       $.fn.byteLimit.trimValueForByteLength = trimValueForByteLength;
-
        /**
         * @class jQuery
         * @mixins jQuery.plugin.byteLimit
index e35b1cf..2291572 100644 (file)
@@ -284,45 +284,6 @@ img.thumbborder {
        border: 1px solid #dddddd;
 }
 
-/**
- * Galleries (see shared.css for more info)
- */
-li.gallerybox {
-       vertical-align: top;
-       display: inline-block;
-}
-
-ul.gallery, li.gallerybox {
-       zoom: 1;
-       *display: inline;
-}
-
-ul.gallery {
-       margin: 2px;
-       padding: 2px;
-       display: block;
-}
-
-li.gallerycaption {
-       font-weight: bold;
-       text-align: center;
-       display: block;
-       word-wrap: break-word;
-}
-
-li.gallerybox div.thumb {
-       text-align: center;
-       border: 1px solid #ccc;
-       margin: 2px;
-}
-
-div.gallerytext {
-       overflow: hidden;
-       font-size: 94%;
-       padding: 2px 4px;
-       word-wrap: break-word;
-}
-
 /**
  * Table rendering
  * As on shared.css but with white background.
index 7e171cf..63da066 100644 (file)
@@ -787,108 +787,6 @@ table.mw_metadata ul.metadata-langlist {
        margin-left: 0;
 }
 
-/* Galleries */
-/* These display attributes look nonsensical, but are needed to support IE and FF2 */
-/* Don't forget to update commonPrint.css */
-li.gallerybox {
-       vertical-align: top;
-       display: -moz-inline-box;
-       display: inline-block;
-}
-
-ul.gallery,
-li.gallerybox {
-       zoom: 1;
-       *display: inline;
-}
-
-ul.gallery {
-       margin: 2px;
-       padding: 2px;
-       display: block;
-}
-
-li.gallerycaption {
-       font-weight: bold;
-       text-align: center;
-       display: block;
-       word-wrap: break-word;
-}
-
-li.gallerybox div.thumb {
-       text-align: center;
-       border: 1px solid #ccc;
-       background-color: #f9f9f9;
-       margin: 2px;
-}
-
-li.gallerybox div.thumb img {
-       display: block;
-       margin: 0 auto;
-}
-
-div.gallerytext {
-       overflow: hidden;
-       font-size: 94%;
-       padding: 2px 4px;
-       word-wrap: break-word;
-}
-
-/* new gallery stuff */
-ul.mw-gallery-nolines li.gallerybox div.thumb {
-       background-color: transparent;
-       border: none;
-}
-
-ul.mw-gallery-nolines li.gallerybox div.gallerytext {
-       text-align: center;
-}
-
-/* height constrained gallery */
-
-ul.mw-gallery-packed li.gallerybox div.thumb,
-ul.mw-gallery-packed-overlay li.gallerybox div.thumb,
-ul.mw-gallery-packed-hover li.gallerybox div.thumb {
-       background-color: transparent;
-       border: none;
-}
-
-ul.mw-gallery-packed li.gallerybox div.thumb img,
-ul.mw-gallery-packed-overlay li.gallerybox div.thumb img,
-ul.mw-gallery-packed-hover li.gallerybox div.thumb img {
-       margin: 0 auto;
-}
-
-ul.mw-gallery-packed-hover li.gallerybox,
-ul.mw-gallery-packed-overlay li.gallerybox {
-       position: relative;
-}
-
-ul.mw-gallery-packed-hover div.gallerytextwrapper {
-       overflow: hidden;
-       height: 0;
-}
-
-ul.mw-gallery-packed-hover li.gallerybox:hover div.gallerytextwrapper,
-ul.mw-gallery-packed-overlay li.gallerybox div.gallerytextwrapper,
-ul.mw-gallery-packed-hover li.gallerybox.mw-gallery-focused div.gallerytextwrapper {
-       position: absolute;
-       background: white;
-       background: rgba(255, 255, 255, 0.8);
-       padding: 5px 10px;
-       bottom: 0;
-       left: 0; /* Needed for IE */
-       height: auto;
-       font-weight: bold;
-       margin: 2px; /* correspond to style on div.thumb */
-}
-
-ul.mw-gallery-packed-hover,
-ul.mw-gallery-packed-overlay,
-ul.mw-gallery-packed {
-       text-align: center;
-}
-
 .mw-ajax-loader {
        background-image: url(images/ajax-loader.gif);
        background-position: center center;
diff --git a/resources/src/mediawiki.page/mediawiki.page.gallery.css b/resources/src/mediawiki.page/mediawiki.page.gallery.css
new file mode 100644 (file)
index 0000000..2e4daea
--- /dev/null
@@ -0,0 +1,101 @@
+/* Galleries */
+/* These display attributes look nonsensical, but are needed to support IE and FF2 */
+/* Don't forget to update commonPrint.css */
+li.gallerybox {
+       vertical-align: top;
+       display: -moz-inline-box;
+       display: inline-block;
+}
+
+ul.gallery,
+li.gallerybox {
+       zoom: 1;
+       *display: inline;
+}
+
+ul.gallery {
+       margin: 2px;
+       padding: 2px;
+       display: block;
+}
+
+li.gallerycaption {
+       font-weight: bold;
+       text-align: center;
+       display: block;
+       word-wrap: break-word;
+}
+
+li.gallerybox div.thumb {
+       text-align: center;
+       border: 1px solid #ccc;
+       background-color: #f9f9f9;
+       margin: 2px;
+}
+
+li.gallerybox div.thumb img {
+       display: block;
+       margin: 0 auto;
+}
+
+div.gallerytext {
+       overflow: hidden;
+       font-size: 94%;
+       padding: 2px 4px;
+       word-wrap: break-word;
+}
+
+/* new gallery stuff */
+ul.mw-gallery-nolines li.gallerybox div.thumb {
+       background-color: transparent;
+       border: none;
+}
+
+ul.mw-gallery-nolines li.gallerybox div.gallerytext {
+       text-align: center;
+}
+
+/* height constrained gallery */
+
+ul.mw-gallery-packed li.gallerybox div.thumb,
+ul.mw-gallery-packed-overlay li.gallerybox div.thumb,
+ul.mw-gallery-packed-hover li.gallerybox div.thumb {
+       background-color: transparent;
+       border: none;
+}
+
+ul.mw-gallery-packed li.gallerybox div.thumb img,
+ul.mw-gallery-packed-overlay li.gallerybox div.thumb img,
+ul.mw-gallery-packed-hover li.gallerybox div.thumb img {
+       margin: 0 auto;
+}
+
+ul.mw-gallery-packed-hover li.gallerybox,
+ul.mw-gallery-packed-overlay li.gallerybox {
+       position: relative;
+}
+
+ul.mw-gallery-packed-hover div.gallerytextwrapper {
+       overflow: hidden;
+       height: 0;
+}
+
+ul.mw-gallery-packed-hover li.gallerybox:hover div.gallerytextwrapper,
+ul.mw-gallery-packed-overlay li.gallerybox div.gallerytextwrapper,
+ul.mw-gallery-packed-hover li.gallerybox.mw-gallery-focused div.gallerytextwrapper {
+       position: absolute;
+       background: white;
+       background: rgba(255, 255, 255, 0.8);
+       padding: 5px 10px;
+       bottom: 0;
+       left: 0; /* Needed for IE */
+       height: auto;
+       font-weight: bold;
+       margin: 2px; /* correspond to style on div.thumb */
+}
+
+ul.mw-gallery-packed-hover,
+ul.mw-gallery-packed-overlay,
+ul.mw-gallery-packed {
+       text-align: center;
+}
diff --git a/resources/src/mediawiki.page/mediawiki.page.gallery.print.css b/resources/src/mediawiki.page/mediawiki.page.gallery.print.css
new file mode 100644 (file)
index 0000000..0c14865
--- /dev/null
@@ -0,0 +1,35 @@
+li.gallerybox {
+       vertical-align: top;
+       display: inline-block;
+}
+
+ul.gallery, li.gallerybox {
+       zoom: 1;
+       *display: inline;
+}
+
+ul.gallery {
+       margin: 2px;
+       padding: 2px;
+       display: block;
+}
+
+li.gallerycaption {
+       font-weight: bold;
+       text-align: center;
+       display: block;
+       word-wrap: break-word;
+}
+
+li.gallerybox div.thumb {
+       text-align: center;
+       border: 1px solid #ccc;
+       margin: 2px;
+}
+
+div.gallerytext {
+       overflow: hidden;
+       font-size: 94%;
+       padding: 2px 4px;
+       word-wrap: break-word;
+}
index 3697a1c..cf4d788 100644 (file)
        mw.widgets.TitleInputWidget.prototype.cleanUpValue = function ( value ) {
                var widget = this;
                value = mw.widgets.TitleInputWidget.parent.prototype.cleanUpValue.call( this, value );
-               return $.fn.byteLimit.trimValueForByteLength( this.value, value, this.maxLength, function ( value ) {
+               return $.trimByteLength( this.value, value, this.maxLength, function ( value ) {
                        var title = widget.getTitle( value );
                        return title ? title.getMain() : value;
                } ).newVal;
diff --git a/tests/phpunit/includes/libs/IPSetTest.php b/tests/phpunit/includes/libs/IPSetTest.php
deleted file mode 100644 (file)
index 5bbacef..0000000
+++ /dev/null
@@ -1,252 +0,0 @@
-<?php
-
-/**
- * @group IPSet
- */
-class IPSetTest extends PHPUnit_Framework_TestCase {
-       /**
-        * Provides test cases for IPSetTest::testIPSet
-        *
-        * Returns an array of test cases. Each case is an array of (description,
-        * config, tests).  Description is just text output for failure messages,
-        * config is an array constructor argument for IPSet, and the tests are
-        * an array of IP => expected (boolean) result against the config dataset.
-        */
-       public static function provideIPSets() {
-               return array(
-                       array(
-                               'old_list_subset',
-                               array(
-                                       '208.80.152.162',
-                                       '10.64.0.123',
-                                       '10.64.0.124',
-                                       '10.64.0.125',
-                                       '10.64.0.126',
-                                       '10.64.0.127',
-                                       '10.64.0.128',
-                                       '10.64.0.129',
-                                       '10.64.32.104',
-                                       '10.64.32.105',
-                                       '10.64.32.106',
-                                       '10.64.32.107',
-                                       '91.198.174.45',
-                                       '91.198.174.46',
-                                       '91.198.174.47',
-                                       '91.198.174.57',
-                                       '2620:0:862:1:A6BA:DBFF:FE30:CFB3',
-                                       '91.198.174.58',
-                                       '2620:0:862:1:A6BA:DBFF:FE38:FFDA',
-                                       '208.80.152.16',
-                                       '208.80.152.17',
-                                       '208.80.152.18',
-                                       '208.80.152.19',
-                                       '91.198.174.102',
-                                       '91.198.174.103',
-                                       '91.198.174.104',
-                                       '91.198.174.105',
-                                       '91.198.174.106',
-                                       '91.198.174.107',
-                                       '91.198.174.81',
-                                       '2620:0:862:1:26B6:FDFF:FEF5:B2D4',
-                                       '91.198.174.82',
-                                       '2620:0:862:1:26B6:FDFF:FEF5:ABB4',
-                                       '10.20.0.113',
-                                       '2620:0:862:102:26B6:FDFF:FEF5:AD9C',
-                                       '10.20.0.114',
-                                       '2620:0:862:102:26B6:FDFF:FEF5:7C38',
-                               ),
-                               array(
-                                       '0.0.0.0' => false,
-                                       '255.255.255.255' => false,
-                                       '10.64.0.122' => false,
-                                       '10.64.0.123' => true,
-                                       '10.64.0.124' => true,
-                                       '10.64.0.129' => true,
-                                       '10.64.0.130' => false,
-                                       '91.198.174.81' => true,
-                                       '91.198.174.80' => false,
-                                       '0::0' => false,
-                                       'ffff:ffff:ffff:ffff:FFFF:FFFF:FFFF:FFFF' => false,
-                                       '2001:db8::1234' => false,
-                                       '2620:0:862:1:26b6:fdff:fef5:abb3' => false,
-                                       '2620:0:862:1:26b6:fdff:fef5:abb4' => true,
-                                       '2620:0:862:1:26b6:fdff:fef5:abb5' => false,
-                               ),
-                       ),
-                       array(
-                               'new_cidr_set',
-                               array(
-                                       '208.80.154.0/26',
-                                       '2620:0:861:1::/64',
-                                       '208.80.154.128/26',
-                                       '2620:0:861:2::/64',
-                                       '208.80.154.64/26',
-                                       '2620:0:861:3::/64',
-                                       '208.80.155.96/27',
-                                       '2620:0:861:4::/64',
-                                       '10.64.0.0/22',
-                                       '2620:0:861:101::/64',
-                                       '10.64.16.0/22',
-                                       '2620:0:861:102::/64',
-                                       '10.64.32.0/22',
-                                       '2620:0:861:103::/64',
-                                       '10.64.48.0/22',
-                                       '2620:0:861:107::/64',
-                                       '91.198.174.0/25',
-                                       '2620:0:862:1::/64',
-                                       '10.20.0.0/24',
-                                       '2620:0:862:102::/64',
-                                       '10.128.0.0/24',
-                                       '2620:0:863:101::/64',
-                                       '10.2.4.26',
-                               ),
-                               array(
-                                       '0.0.0.0' => false,
-                                       '255.255.255.255' => false,
-                                       '10.2.4.25' => false,
-                                       '10.2.4.26' => true,
-                                       '10.2.4.27' => false,
-                                       '10.20.0.255' => true,
-                                       '10.128.0.0' => true,
-                                       '10.64.17.55' => true,
-                                       '10.64.20.0' => false,
-                                       '10.64.27.207' => false,
-                                       '10.64.31.255' => false,
-                                       '0::0' => false,
-                                       'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff' => false,
-                                       '2001:DB8::1' => false,
-                                       '2620:0:861:106::45' => false,
-                                       '2620:0:862:103::' => false,
-                                       '2620:0:862:102:10:20:0:113' => true,
-                               ),
-                       ),
-                       array(
-                               'empty_set',
-                               array(),
-                               array(
-                                       '0.0.0.0' => false,
-                                       '255.255.255.255' => false,
-                                       '10.2.4.25' => false,
-                                       '10.2.4.26' => false,
-                                       '10.2.4.27' => false,
-                                       '10.20.0.255' => false,
-                                       '10.128.0.0' => false,
-                                       '10.64.17.55' => false,
-                                       '10.64.20.0' => false,
-                                       '10.64.27.207' => false,
-                                       '10.64.31.255' => false,
-                                       '0::0' => false,
-                                       'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff' => false,
-                                       '2001:DB8::1' => false,
-                                       '2620:0:861:106::45' => false,
-                                       '2620:0:862:103::' => false,
-                                       '2620:0:862:102:10:20:0:113' => false,
-                               ),
-                       ),
-                       array(
-                               'edge_cases',
-                               array(
-                                       '0.0.0.0',
-                                       '255.255.255.255',
-                                       '::',
-                                       'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff',
-                                       '10.10.10.10/25', // host bits intentional
-                               ),
-                               array(
-                                       '0.0.0.0' => true,
-                                       '255.255.255.255' => true,
-                                       '10.2.4.25' => false,
-                                       '10.2.4.26' => false,
-                                       '10.2.4.27' => false,
-                                       '10.20.0.255' => false,
-                                       '10.128.0.0' => false,
-                                       '10.64.17.55' => false,
-                                       '10.64.20.0' => false,
-                                       '10.64.27.207' => false,
-                                       '10.64.31.255' => false,
-                                       '0::0' => true,
-                                       'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff' => true,
-                                       '2001:DB8::1' => false,
-                                       '2620:0:861:106::45' => false,
-                                       '2620:0:862:103::' => false,
-                                       '2620:0:862:102:10:20:0:113' => false,
-                                       '10.10.9.255' => false,
-                                       '10.10.10.0' => true,
-                                       '10.10.10.1' => true,
-                                       '10.10.10.10' => true,
-                                       '10.10.10.126' => true,
-                                       '10.10.10.127' => true,
-                                       '10.10.10.128' => false,
-                                       '10.10.10.177' => false,
-                                       '10.10.10.255' => false,
-                                       '10.10.11.0' => false,
-                               ),
-                       ),
-                       array(
-                               'exercise_optimizer',
-                               array(
-                                       'ffff:ffff:ffff:ffff:ffff:ffff:ffff:0/112',
-                                       'ffff:ffff:ffff:ffff:ffff:ffff:fffe:0/112',
-                                       'ffff:ffff:ffff:ffff:ffff:ffff:fffd:0/112',
-                                       'ffff:ffff:ffff:ffff:ffff:ffff:fffc:0/112',
-                                       'ffff:ffff:ffff:ffff:ffff:ffff:fffb:0/112',
-                                       'ffff:ffff:ffff:ffff:ffff:ffff:fffa:0/112',
-                                       'ffff:ffff:ffff:ffff:ffff:ffff:fff9:8000/113',
-                                       'ffff:ffff:ffff:ffff:ffff:ffff:fff9:0/113',
-                                       'ffff:ffff:ffff:ffff:ffff:ffff:fff8:0/112',
-                                       'ffff:ffff:ffff:ffff:ffff:ffff:fff7:0/112',
-                                       'ffff:ffff:ffff:ffff:ffff:ffff:fff6:0/112',
-                                       'ffff:ffff:ffff:ffff:ffff:ffff:fff5:0/112',
-                                       'ffff:ffff:ffff:ffff:ffff:ffff:fff4:0/112',
-                                       'ffff:ffff:ffff:ffff:ffff:ffff:fff3:0/112',
-                                       'ffff:ffff:ffff:ffff:ffff:ffff:fff2:0/112',
-                                       'ffff:ffff:ffff:ffff:ffff:ffff:fff1:0/112',
-                                       'ffff:ffff:ffff:ffff:ffff:ffff:fff0:0/112',
-                                       'ffff:ffff:ffff:ffff:ffff:ffff:ffef:0/112',
-                                       'ffff:ffff:ffff:ffff:ffff:ffff:ffee:0/112',
-                                       'ffff:ffff:ffff:ffff:ffff:ffff:ffec:0/111',
-                                       'ffff:ffff:ffff:ffff:ffff:ffff:ffeb:0/112',
-                                       'ffff:ffff:ffff:ffff:ffff:ffff:ffea:0/112',
-                                       'ffff:ffff:ffff:ffff:ffff:ffff:ffe9:0/112',
-                                       'ffff:ffff:ffff:ffff:ffff:ffff:ffe8:0/112',
-                                       'ffff:ffff:ffff:ffff:ffff:ffff:ffe7:0/112',
-                                       'ffff:ffff:ffff:ffff:ffff:ffff:ffe6:0/112',
-                                       'ffff:ffff:ffff:ffff:ffff:ffff:ffe5:0/112',
-                                       'ffff:ffff:ffff:ffff:ffff:ffff:ffe4:0/112',
-                                       'ffff:ffff:ffff:ffff:ffff:ffff:ffe3:0/112',
-                                       'ffff:ffff:ffff:ffff:ffff:ffff:ffe2:0/112',
-                                       'ffff:ffff:ffff:ffff:ffff:ffff:ffe1:0/112',
-                                       'ffff:ffff:ffff:ffff:ffff:ffff:ffe0:0/110',
-                                       'ffff:ffff:ffff:ffff:ffff:ffff:ffc0:0/107',
-                                       'ffff:ffff:ffff:ffff:ffff:ffff:ffa0:0/107',
-                               ),
-                               array(
-                                       '0.0.0.0' => false,
-                                       '255.255.255.255' => false,
-                                       '::' => false,
-                                       'ffff:ffff:ffff:ffff:ffff:ffff:ff9f:ffff' => false,
-                                       'ffff:ffff:ffff:ffff:ffff:ffff:ffa0:0' => true,
-                                       'ffff:ffff:ffff:ffff:ffff:ffff:ffc0:1234' => true,
-                                       'ffff:ffff:ffff:ffff:ffff:ffff:ffed:ffff' => true,
-                                       'ffff:ffff:ffff:ffff:ffff:ffff:fff4:4444' => true,
-                                       'ffff:ffff:ffff:ffff:ffff:ffff:fff9:8080' => true,
-                                       'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff' => true,
-                               ),
-                       ),
-               );
-       }
-
-       /**
-        * Validates IPSet loading and matching code
-        *
-        * @covers IPSet
-        * @dataProvider provideIPSets
-        */
-       public function testIPSet( $desc, array $cfg, array $tests ) {
-               $ipset = new IPSet( $cfg );
-               foreach ( $tests as $ip => $expected ) {
-                       $result = $ipset->match( $ip );
-                       $this->assertEquals( $expected, $result, "Incorrect match() result for $ip in dataset $desc" );
-               }
-       }
-}
index 25bca87..f5eb8c9 100644 (file)
--- a/thumb.php
+++ b/thumb.php
@@ -221,7 +221,7 @@ function wfStreamThumb( array $params ) {
                wfThumbErrorText( 404, "The source file '$fileName' does not exist." );
                return;
        } elseif ( $img->getPath() === false ) {
-               wfThumbErrorText( 500, "The source file '$fileName' is not locally accessible." );
+               wfThumbErrorText( 400, "The source file '$fileName' is not locally accessible." );
                return;
        }
 
@@ -316,10 +316,10 @@ function wfStreamThumb( array $params ) {
 
        $user = RequestContext::getMain()->getUser();
        if ( !wfThumbIsStandard( $img, $params ) && $user->pingLimiter( 'renderfile-nonstandard' ) ) {
-               wfThumbError( 500, wfMessage( 'actionthrottledtext' )->parse() );
+               wfThumbError( 429, wfMessage( 'actionthrottledtext' )->parse() );
                return;
        } elseif ( $user->pingLimiter( 'renderfile' ) ) {
-               wfThumbError( 500, wfMessage( 'actionthrottledtext' )->parse() );
+               wfThumbError( 429, wfMessage( 'actionthrottledtext' )->parse() );
                return;
        }
 
@@ -332,6 +332,9 @@ function wfStreamThumb( array $params ) {
        $errorCode = 500;
        if ( !$thumb ) {
                $errorMsg = $errorMsg ?: $msg->rawParams( 'File::transform() returned false' )->escaped();
+               if ( $errorMsg instanceof MessageSpecifier && $errorMsg->getKey() === 'thumbnail_image-failure-limit' ) {
+                       $errorCode = 429;
+               }
        } elseif ( $thumb->isError() ) {
                $errorMsg = $thumb->getHtmlMsg();
        } elseif ( !$thumb->hasFile() ) {
@@ -555,7 +558,7 @@ function wfExtractThumbParams( $file, $params ) {
  * @return void
  */
 function wfThumbErrorText( $status, $msgText ) {
-       return wfThumbError( $status, htmlspecialchars( $msgText ) );
+       wfThumbError( $status, htmlspecialchars( $msgText ) );
 }
 
 /**
@@ -570,10 +573,8 @@ function wfThumbError( $status, $msgHtml ) {
 
        header( 'Cache-Control: no-cache' );
        header( 'Content-Type: text/html; charset=utf-8' );
-       if ( $status == 400 ) {
-               HttpStatus::header( 400 );
-       } elseif ( $status == 404 ) {
-               HttpStatus::header( 404 );
+       if ( $status == 400 || $status == 404 || $status == 429 ) {
+               HttpStatus::header( $status );
        } elseif ( $status == 403 ) {
                HttpStatus::header( 403 );
                header( 'Vary: Cookie' );