Merge "Move unit tests, round III"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Tue, 9 Jul 2019 20:36:37 +0000 (20:36 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Tue, 9 Jul 2019 20:36:37 +0000 (20:36 +0000)
25 files changed:
includes/api/i18n/es.json
includes/api/i18n/pt-br.json
includes/export/WikiExporter.php
includes/installer/i18n/ar.json
includes/installer/i18n/be-tarask.json
includes/installer/i18n/cs.json
includes/installer/i18n/es.json
includes/installer/i18n/fr.json
includes/installer/i18n/lb.json
includes/installer/i18n/pt.json
includes/installer/i18n/roa-tara.json
includes/installer/i18n/ru.json
includes/installer/i18n/zh-hant.json
includes/libs/rdbms/loadbalancer/ILoadBalancer.php
includes/libs/rdbms/loadbalancer/LoadBalancer.php
includes/libs/rdbms/loadmonitor/LoadMonitor.php
languages/i18n/ban.json
languages/i18n/ce.json
languages/i18n/de.json
languages/i18n/my.json
languages/i18n/nqo.json
languages/i18n/pt-br.json
languages/i18n/ru.json
languages/i18n/ta.json
tests/phpunit/includes/db/LoadBalancerTest.php

index 6473c35..e9fd0a7 100644 (file)
        "apihelp-query+filearchive-example-simple": "Mostrar una lista de todos los archivos eliminados.",
        "apihelp-query+filerepoinfo-summary": "Devuelve metainformación sobre los repositorios de imágenes configurados en el wiki.",
        "apihelp-query+filerepoinfo-param-prop": "Qué propiedades del repositorio obtener (las propiedades disponibles pueden variar en otras wikis).",
+       "apihelp-query+filerepoinfo-paramvalue-prop-favicon": "URL del favicono del wiki del repositorio, proveniente de <var>[[mw:Special:MyLanguage/Manual:$wgFavicon|$wgFavicon]]</var>.",
        "apihelp-query+filerepoinfo-paramvalue-prop-rootUrl": "Ruta de la URL raíz para las rutas de las imágenes.",
        "apihelp-query+filerepoinfo-paramvalue-prop-scriptDirUrl": "Ruta de la URL raíz para la instalación MediaWiki del wiki del repositorio.",
        "apihelp-query+filerepoinfo-paramvalue-prop-server": "<var>[[mw:Special:MyLanguage/Manual:$wgServer|$wgServer]]</var> o equivalente del wiki del repositorio.",
index ef03a3d..af1596d 100644 (file)
        "api-help-param-templated-var-first": "<var>&#x7B;$1&#x7D;</var> no nome do parâmetro deve ser substituído com os valores de <var>$2</var>",
        "api-help-param-templated-var": "<var>&#x7B;$1&#x7D;</var> com valores de <var>$2</var>",
        "api-help-datatypes-header": "Tipos de dados",
-       "api-help-datatypes": "A entrada para MediaWiki deve ser UTF-8 normalizada pelo NFC. O MediaWiki pode tentar converter outra entrada, mas isso pode causar a falha de algumas operações (como [[Special:ApiHelp/edit|editar]] com verificações MD5).\n\nAlguns tipos de parâmetros em solicitações de API precisam de uma explicação adicional:\n;boolean\n:Os parâmetros booleanos funcionam como caixas de seleção HTML: se o parâmetro for especificado, independentemente do valor, é considerado verdadeiro. Para um valor falso, omita o parâmetro inteiramente.\n;timestamp\n: As marcas de tempo podem ser especificadas em vários formatos. É recomendada a data e a hora ISO 8601. Todos os horários estão em UTC, qualquer fuso horário incluído é ignorado.\n:* Data e hora ISO 8601, <kbd><var>2001</var>-<var>01</var>-<var>15</var>T<var>14</var>:<var>56</var>:<var>00</var>Z</kbd> (pontuação e <kbd>Z</kbd> são opcionais)\n:* ISO 8601 data e hora com segundos fracionados (ignorados), <kbd><var>2001</var>-<var>01</var>-<var>15</var>T<var>14</var>:<var>56</var>:<var>00</var>.<var>00001</var>Z</kbd> (traços, dois pontos e <kbd>Z</kbd> são opcionais)\n:* Formato MediaWiki, <kbd><var>2001</var><var>01</var><var>15</var><var>14</var><var>56</var><var>00</var></kbd>\n:* Formato numérico genérico, <kbd><var>2001</var>-<var>01</var>-<var>15</var> <var>14</var>:<var>56</var>:<var>00</var></kbd> (fuso horário opcional de <kbd>GMT</kbd>, <kbd>+<var>##</var></kbd> ou <kbd>-<var>##</var></kbd> é ignorado)\n:* Formato EXIF, <kbd><var>2001</var>:<var>01</var>:<var>15</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* Formato RFC 2822 (o fuso horário pode ser omitido), <kbd><var>Mon</var>, <var>15</var> <var>Jan</var> <var>2001</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* Formato RFC 850 (fuso horário Pode ser omitido), <kbd><var>Monday</var>, <var>15</var>-<var>Jan</var>-<var>2001</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* C ctime format, <kbd><var>Mon</var> <var>Jan</var> <var>15</var> <var>14</var>:<var>56</var>:<var>00</var> <var>2001</var></kbd>\n:* Segundos desde 1970-01-01T00:00:00Z como um inteiro de 1 a 13 dígitos (excluindo <kbd>0</kbd>)\n:* A string <kbd>now</kbd>\n; valor múltiplo alternativo separador\n: Os parâmetros que levam vários valores são normalmente enviados com os valores separados usando o caractere do pipe, por exemplo <kbd>param=value1|value2</kbd> ou <kbd>param=value1%7Cvalue2</kbd>. Se um valor deve conter o caractere de pipe, use U+001F (separador de unidade) como o separador ''and'' prefixa o valor com U+001F, por exemplo, <kbd>param=%1Fvalue1%1Fvalue2</kbd>.",
+       "api-help-datatypes": "O formato de entrada para o MediaWiki deve ser UTF-8, normalizado de acordo com a norma NFC. O MediaWiki pode converter outros tipos de entrada, mas esta conversão pode originar a falha de algumas operações (tais como as [[Special:ApiHelp/edit|edições]] com verificações MD5).\n\nAlguns tipos de parâmetros nos pedidos à API necessitam de mais explicações:\n;boolean\n:Os parâmetros boolianos funcionam como as caixas de seleção HTML: se o parâmetro for especificado, independentemente do seu valor, é considerado verdadeiro. Para um valor falso, omitir o parâmetro completo.\n;timestamp\n:As datas e horas podem ser especificadas em vários formatos;  para obter detalhes, consulte [[mw:Special:MyLanguage/Timestamp|os formatos de entrada da biblioteca Timestamp documentados em mediawiki.org]].  É recomendado o formato de data e hora ISO 8601: <kbd><var>2001</var>-<var>01</var>-<var>15</var>T<var>14</var>:<var>56</var>:<var>00</var>Z</kbd>. Adicionalmente, pode ser usado o texto <kbd>now</kbd> para especificar a data e hora atuais.\n;separador alternativo de valores múltiplos\n:Os parâmetros que aceitam vários valores são normalmente fornecidos com os valores separados por uma barra vertical (''pipe''), por exemplo <kbd>parâmetro=valor1|valor2</kbd> ou <kbd>parâmetro=valor1%7Cvalor2</kbd>. Se um valor contém a barra vertical, use como separador o U+001F (Separador de Unidades) ''e'' prefixe o valor com U+001F, isto é, <kbd>parâmetro=%1Fvalor1%1Fvalor2</kbd>.",
        "api-help-templatedparams-header": "Parâmetros da predefinição",
        "api-help-templatedparams": "Os parâmetros modelados usam-se nos casos em que um módulo da API necessita de um valor para cada valor de um outro parâmetro. Por exemplo, se existisse um módulo da API para encomendar fruta, poderia ter um parâmetro <var>frutas</var> para especificar as frutas que estão a ser encomendadas e um parâmetro modelado <var>quantidade-de-{fruta}</var> para especificar quanto de cada fruta. Um cliente da API que pretenda 1 maçã, 5 bananas e 20 morangos pode então fazer um pedido como <kbd>frutas=maçãs|bananas|morangos&quantidade-de-maçãs=1&quantidade-de-bananas=5&quantidade-de-morangos=20</kbd>.",
        "api-help-param-type-limit": "Tipo: inteiro ou <kbd>max</kbd>",
index f834fb1..8b0ed00 100644 (file)
@@ -67,6 +67,15 @@ class WikiExporter {
        /** @var XmlDumpWriter */
        private $writer;
 
+       /** @var IDatabase */
+       protected $db;
+
+       /** @var array|int */
+       protected $history;
+
+       /** @var array|null */
+       protected $limitNamespaces;
+
        /**
         * Returns the default export schema version, as defined by $wgXmlDumpSchemaVersion.
         * @return string
@@ -87,8 +96,11 @@ class WikiExporter {
         * @param null|array $limitNamespaces Comma-separated list of namespace numbers
         *   to limit results
         */
-       function __construct( $db, $history = self::CURRENT, $text = self::TEXT,
-                       $limitNamespaces = null
+       function __construct(
+               $db,
+               $history = self::CURRENT,
+               $text = self::TEXT,
+               $limitNamespaces = null
        ) {
                $this->db = $db;
                $this->history = $history;
index 0f78c62..60e78b4 100644 (file)
        "config-restart": "نعم، إعادة التشغيل",
        "config-welcome": "=== التحقق من البيئة ===\nسوف يتم الآن التحقق من أن البيئة مناسبة لتنصيب ميديا ويكي.\nتذكر تضمين هذه المعلومات اذا اردت طلب المساعدة عن كيفية إكمال التنصيب.",
        "config-copyright": "=== حقوق النسخ والشروط ===\n\n$1\n\nهذا البرنامج هو برنامج حر؛ يمكنك إعادة توزيعه و/أو تعديله تحت شروط رخصة جنو العامة على أن هذا البرنامج قد نُشر من قِبل مؤسسة البرمجيات الحرة؛ إما النسخة 2 من الرخصة، أو أي نسخة أخرى بعدها (من اختيارك).\n\nتم توزيع هذا البرنامج على أمل ان يكون مفيدًا ولكن <strong>دون أية ضمانات</strong>؛ دون حتى أية ضمانات مفهومة ضمنيًا أو رواجات أو أية أسباب محددة.\nانظر رخصة جنو العامة لمزيد من المعلومات.\n\nمن المفترض أنك استملت <doclink href=Copying> نسخة عن رخصة جنو العامة </doclink> مع هذا البرنامج؛ إذا لم تقعل اكتب رسالة إلى مؤسسة البرمجيات الحرة المحدودة، شارع 51 فرانكلين الطابق الخامس، بوسطن  MA 02110-1301 الولايات المتخدة أو [https://www.gnu.org/copyleft/gpl.html read it online].",
-       "config-sidebar": "* [https://www.mediawiki.org موقع ميدياويكي]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents دليل المستخدم]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents دليل الإداري]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ الأسئلة المتكررة]\n----\n* <doclink href=Readme>إقراءني</doclink>\n* <doclink href=ReleaseNotes>ملاحظات الإصدار</doclink>\n* <doclink href=Copying>النسخ</doclink>\n* <doclink href=UpgradeDoc>الترقية</doclink>",
+       "config-sidebar": "* [https://www.mediawiki.org موقع ميدياويكي]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents دليل المستخدم]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents دليل الإداري]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ الأسئلة المتكررة]",
+       "config-sidebar-readme": "اقرأني",
+       "config-sidebar-relnotes": "ملاحظات الإصدار",
+       "config-sidebar-license": "نسخ",
+       "config-sidebar-upgrade": "ترقية",
        "config-env-good": "جرى التحقق من البيئة.\nيمكنك تنصيب ميدياويكي.",
        "config-env-bad": "جرى التحقق من البيئة. لا يمكنك تنصيب ميدياويكي.",
        "config-env-php": "بي إتش بي $1 مثبت.",
index 4146ce4..42e7db0 100644 (file)
@@ -48,7 +48,7 @@
        "config-restart": "Так, пачаць зноў",
        "config-welcome": "== Праверка асяродзьдзя ==\nЗараз будуць праведзеныя праверкі для запэўніваньня, што гэтае асяродзьдзе адпаведнае для ўсталяваньня MediaWiki.\nНе забудзьце далучыць гэтую інфармацыю, калі вам спатрэбіцца дапамога для завяршэньня ўсталяваньня.",
        "config-copyright": "== Аўтарскае права і ўмовы ==\n\n$1\n\nThis 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.\n\nThis 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'''.\nSee the GNU General Public License for more details.\n\nYou should have received <doclink href=Copying>a copy of the GNU General Public License</doclink> along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. or [https://www.gnu.org/copyleft/gpl.html read it online].",
-       "config-sidebar": "* [https://www.mediawiki.org Хатняя старонка MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Даведка для ўдзельнікаў]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Даведка для адміністратараў]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Адказы на частыя пытаньні]\n----\n* <doclink href=Readme>Прачытайце</doclink>\n* <doclink href=ReleaseNotes>Паляпшэньні ў вэрсіі</doclink>\n* <doclink href=Copying>Капіяваньне</doclink>\n* <doclink href=UpgradeDoc>Абнаўленьне</doclink>",
+       "config-sidebar": "* [https://www.mediawiki.org Хатняя старонка MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Даведка для ўдзельнікаў]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Даведка для адміністратараў]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Адказы на частыя пытаньні]",
        "config-env-good": "Асяродзьдзе было праверанае.\nВы можаце ўсталёўваць MediaWiki.",
        "config-env-bad": "Асяродзьдзе было праверанае.\nУсталяваньне MediaWiki немагчымае.",
        "config-env-php": "Усталяваны PHP $1.",
index cf341e4..ad412d7 100644 (file)
        "config-restart": "Ano, restartovat",
        "config-welcome": "=== Kontrola prostředí ===\nNyní se provedou základní kontroly, aby se zjistilo, zda je toto prostředí použitelné k instalaci MediaWiki.\nPokud budete potřebovat k dokončení instalace pomoc, nezapomeňte sdělit výsledky těchto testů.",
        "config-copyright": "=== Licence a podmínky ===\n$1\n\nTento program je svobodný software; můžete jej šířit nebo modifikovat podle podmínek GNU General Public License, vydávané Free Software Foundation; buď verze 2 této licence anebo (podle vašeho uvážení) kterékoli pozdější verze.\n\nTento program je distribuován v naději, že bude užitečný, avšak '''bez jakékoli záruky'''; neposkytují se ani odvozené záruky '''prodejnosti''' anebo '''vhodnosti pro určitý účel'''.\nPodrobnosti se dočtete v textu GNU General Public License.\n\n<doclink href=Copying>Kopii GNU General Public License</doclink> jste měli obdržet spolu s tímto programem; pokud ne, napište na Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA nebo [https://www.gnu.org/copyleft/gpl.html si ji přečtěte online].",
-       "config-sidebar": "* [https://www.mediawiki.org Oficiální web MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Uživatelská příručka]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Administrátorská příručka]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ FAQ]\n----\n* <doclink href=Readme>Čti mě</doclink>\n* <doclink href=ReleaseNotes>Poznámky k vydání</doclink>\n* <doclink href=Copying>Licence</doclink>\n* <doclink href=UpgradeDoc>Upgrade</doclink>",
+       "config-sidebar": "* [https://www.mediawiki.org Oficiální web MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Uživatelská příručka]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Administrátorská příručka]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ FAQ]",
+       "config-sidebar-readme": "Čti mě",
+       "config-sidebar-relnotes": "Poznámky k vydání",
+       "config-sidebar-license": "Licence",
+       "config-sidebar-upgrade": "Upgrade",
        "config-env-good": "Prostředí bylo zkontrolováno.\nMůžete nainstalovat MediaWiki.",
        "config-env-bad": "Prostředí bylo zkontrolováno.\nMediaWiki nelze nainstalovat.",
        "config-env-php": "Je nainstalováno PHP $1.",
index 6e1d5a2..196e2d4 100644 (file)
@@ -40,7 +40,8 @@
                        "Dschultz",
                        "Carlosmg.dg",
                        "Harvest",
-                       "Anarhistička Maca"
+                       "Anarhistička Maca",
+                       "Johny Weissmuller Jr"
                ]
        },
        "config-desc": "El instalador de MediaWiki",
        "config-restart": "Sí, reiniciarlo",
        "config-welcome": "=== Comprobación del entorno ===\nAhora se van a realizar comprobaciones básicas para ver si el entorno es adecuado para la instalación de MediaWiki.\nRecuerda suministrar los resultados de tales comprobaciones si necesitas ayuda para completar la instalación.",
        "config-copyright": "=== Derechos de autor y Términos de uso ===\n\n$1\n\nEste programa es software libre; puedes redistribuirlo y/o modificarlo en los términos de la Licencia Pública General de GNU, tal como aparece publicada por la Fundación para el Software Libre, tanto la versión 2 de la Licencia, como cualquier versión posterior (según prefieras).\n\nEste programa es distribuido con la esperanza de que sea útil, pero <strong>sin ninguna garantía</strong>; inclusive, sin la garantía implícita de la <strong>posibilidad de ser comercializado</strong> o de <strong>idoneidad para cualquier finalidad específica</strong>.\nConsulta la Licencia Pública General de GNU para más detalles.\n\nEn conjunto con este programa debes haber recibido <doclink href=Copying>una copia de la Licencia Pública General de GNU</doclink>; caso contrario, pídela por escrito a la Fundación para el Software Libre, Inc., 51 Franklin Street, Fifth Floor, Boston, ME La 02110-1301, USA o [https://www.gnu.org/copyleft/gpl.html léela en Internet].",
-       "config-sidebar": "* [https://www.mediawiki.org Página principal de MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Guía del usuario]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Guía del administrador]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Preguntas frecuentes]\n----\n* <doclink href=Readme>Léeme</doclink>\n* <doclink href=ReleaseNotes>Notas de la versión</doclink>\n* <doclink href=Copying>Copia</doclink>\n* <doclink href=UpgradeDoc>Actualización</doclink>",
+       "config-sidebar": "* [https://www.mediawiki.org Página principal de MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Guía de usuario]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Guía para administradores]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Preguntas frecuentes]",
+       "config-sidebar-readme": "Léeme",
+       "config-sidebar-relnotes": "Informe de novedades",
+       "config-sidebar-license": "Cómo copiar",
+       "config-sidebar-upgrade": "Cómo actualizar",
        "config-env-good": "El entorno ha sido comprobado.\nPuedes instalar MediaWiki.",
        "config-env-bad": "El entorno ha sido comprobado.\nNo puedes instalar MediaWiki.",
        "config-env-php": "PHP $1 está instalado.",
index 1c69e65..697e165 100644 (file)
        "config-restart": "Oui, le relancer",
        "config-welcome": "=== Vérifications liées à l’environnement ===\nDes vérifications de base vont maintenant être effectuées pour voir si cet environnement est adapté à l’installation de MediaWiki.\nRappelez-vous d’inclure ces informations si vous recherchez de l’aide sur la manière de terminer l’installation.",
        "config-copyright": "=== Droit d’auteur et conditions ===\n\n$1\n\nCe programme est un logiciel libre : vous pouvez le redistribuer ou le modifier selon les termes de la Licence Publique Générale GNU telle que publiée par la Free Software Foundation (version 2 de la Licence, ou, à votre choix, toute version ultérieure).\n\nCe programme est distribué dans l’espoir qu’il sera utile, mais '''sans aucune garantie''' : sans même les garanties implicites de '''commercialisabilité''' ou d’'''adéquation à un usage particulier'''.\nVoir la Licence Publique Générale GNU pour plus de détails.\n\nVous devriez avoir reçu <doclink href=Copying>une copie de la Licence Publique Générale GNU</doclink> avec ce programme ; dans le cas contraire, écrivez à la Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ou [https://www.gnu.org/copyleft/gpl.html lisez-la en ligne].",
-       "config-sidebar": "* [https://www.mediawiki.org Accueil MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Guide de l’utilisateur]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Guide de l’administrateur]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ FAQ]\n----\n* <doclink href=Readme>Lisez-moi</doclink>\n* <doclink href=ReleaseNotes>Notes de publication</doclink>\n* <doclink href=Copying>Copie</doclink>\n* <doclink href=UpgradeDoc>Mise à jour</doclink>",
+       "config-sidebar": "* [https://www.mediawiki.org Accueil MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Guide de l’utilisateur]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Guide de l’administrateur]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ FAQ]",
+       "config-sidebar-readme": "Me lire",
+       "config-sidebar-relnotes": "Notes de version",
+       "config-sidebar-license": "Copie",
+       "config-sidebar-upgrade": "Mise à jour",
        "config-env-good": "L’environnement a été vérifié.\nVous pouvez installer MediaWiki.",
        "config-env-bad": "L’environnement a été vérifié.\nVous ne pouvez pas installer MediaWiki.",
        "config-env-php": "PHP $1 est installé.",
index 88d13fe..5cd5344 100644 (file)
@@ -42,6 +42,7 @@
        "config-restart": "Jo, neistarten",
        "config-welcome": "=== Iwwerpréifung vum Installatiounsenvironnement ===\nEt gi grondsätzlech Iwwerpréifunge gemaach fir ze kucken ob den Environnment gëeegent ass fir MediaWiki z'installéieren.\nDir sollt d'Resultater vun dëser Iwwerpréifung ugi wann Dir während der Installatioun Hëllef frot wéi Dir D'Installatioun ofschléisse kënnt.",
        "config-sidebar": "* [https://www.mediawiki.org MediaWiki Haaptsäit]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Benotzerguide]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Guide fir Administrateuren]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ FAQ]\n----\n* <doclink href=Readme>Liest dëst</doclink>\n* <doclink href=ReleaseNotes>Informatioune vun der aktueller Versioun</doclink>\n* <doclink href=Copying>Lizenzbedingungen</doclink>\n* <doclink href=UpgradeDoc>Aktualiséierung</doclink>",
+       "config-sidebar-readme": "Liest dëst",
        "config-env-good": "Den Environement gouf nogekuckt.\nDir kënnt MediaWiki installéieren.",
        "config-env-bad": "Den Environnement gouf iwwerpréift.\nDir kënnt MediWiki net installéieren.",
        "config-env-php": "PHP $1 ass installéiert.",
index 6acd866..93e6f08 100644 (file)
        "config-restart": "Sim, reiniciar",
        "config-welcome": "=== Verificações do ambiente ===\nSerão agora realizadas verificações básicas para determinar se este ambiente é apropriado para instalação do MediaWiki.\nLembre-se de fornecer esta informação se necessitar de pedir ajuda para concluir a instalação.",
        "config-copyright": "=== Direitos de autor e Condições de utilização ===\n\n$1\n\nEste programa é software livre; pode redistribuí-lo e/ou modificá-lo nos termos da licença GNU General Public License, tal como publicada pela Free Software Foundation; tanto a versão 2 da Licença, como (por opção sua) qualquer versão posterior.\n\nEste programa é distribuído na esperança de que seja útil, mas '''sem qualquer garantia'''; inclusive, sem a garantia implícita da '''possibilidade de ser comercializado''' ou de '''adequação para qualquer finalidade específica'''.\nConsulte a licença GNU General Public License para mais detalhes.\n\nEm conjunto com este programa deve ter recebido <doclink href=Copying>uma cópia da licença GNU General Public License</doclink>; se não a recebeu, peça-a por escrito a Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA ou [https://www.gnu.org/copyleft/gpl.html leia-a na Internet].",
-       "config-sidebar": "* [https://www.mediawiki.org/wiki/MediaWiki/pt Página principal do MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents/pt Ajuda]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents/pt Manual técnico]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ FAQ]\n----\n* <doclink href=Readme>Leia-me</doclink>\n* <doclink href=ReleaseNotes>Notas de lançamento</doclink>\n* <doclink href=Copying>Cópia</doclink>\n* <doclink href=UpgradeDoc>Atualização</doclink>",
+       "config-sidebar": "* [https://www.mediawiki.org/wiki/MediaWiki/pt Página principal do MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents/pt Ajuda]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents/pt Manual técnico]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/pt FAQ]",
+       "config-sidebar-readme": "Leia-me",
+       "config-sidebar-relnotes": "Notas de lançamento",
+       "config-sidebar-license": "Copiar",
+       "config-sidebar-upgrade": "Atualizar",
        "config-env-good": "O ambiente foi verificado.\nPode instalar o MediaWiki.",
        "config-env-bad": "O ambiente foi verificado.\nNão pode instalar o MediaWiki.",
        "config-env-php": "O PHP $1 está instalado.",
        "config-env-hhvm": "HHVM $1 está instalado.",
-       "config-unicode-using-intl": "A usar a [https://pecl.php.net/intl extensão intl PECL] para a normalização Unicode.",
-       "config-unicode-pure-php-warning": "<strong>Aviso:</strong> A [https://pecl.php.net/intl extensão intl PECL] não está disponível para efetuar a normalização Unicode. Irá recorrer-se à implementação em PHP puro, que é mais lenta.\nSe o seu sítio tem alto volume de tráfego, devia informar-se um pouco sobre a [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations/pt normalização Unicode].",
+       "config-unicode-using-intl": "A usar a [https://php.net/manual/en/book.intl.php extensão intl do PHP] para a normalização Unicode.",
+       "config-unicode-pure-php-warning": "<strong>Aviso:</strong> A [https://php.net/manual/en/book.intl.php extensão intl do PHP] não está disponível para efetuar a normalização Unicode. Irá recorrer-se à implementação em PHP puro, que é mais lenta.\nSe o seu sítio tem alto volume de tráfego, devia informar-se sobre a [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations/pt normalização Unicode].",
        "config-unicode-update-warning": "<strong>Aviso:</strong> A versão instalada do wrapper de normalização Unicode usa uma versão mais antiga da biblioteca do [http://site.icu-project.org/ projeto ICU].\nDevia [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations atualizá-la] se tem quaisquer preocupações sobre o uso do Unicode.",
        "config-no-db": "Não foi possível encontrar um controlador apropriado da base de dados! Precisa de instalar um controlador da base de dados para o PHP. {{PLURAL:$2|É aceite o seguinte tipo|São aceites os seguintes tipos}} de base de dados: $1.\n\nSe fez a compilação do PHP, reconfigure-o com um cliente de base de dados ativado; por exemplo, usando <code>./configure --with-mysqli</code>.\nSe instalou o PHP a partir de um pacote Debian ou Ubuntu, então precisa de instalar também, por exemplo, o pacote <code>php-mysql</code>.",
-       "config-outdated-sqlite": "<strong>Aviso:</strong> Tem a versão $1 do SQLite, que é anterior à versão mínima necessária, a $2. O SQLite não estará disponível.",
+       "config-outdated-sqlite": "<strong>Aviso:</strong> Tem a versão $2 do SQLite, que é anterior à versão mínima necessária, a $1. O SQLite não estará disponível.",
        "config-no-fts3": "<strong>Aviso:</strong> O SQLite foi compilado sem o módulo [//sqlite.org/fts3.html FTS3]; as funcionalidades de pesquisa não estarão disponíveis nesta instalação.",
        "config-pcre-old": "<strong>Erro fatal:</strong> É necessário o PCRE $1 ou versão posterior.\nO seu binário PHP foi linkado com o PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Mais informações].",
        "config-pcre-no-utf8": "'''Erro fatal''': O módulo PCRE do PHP parece ter sido compilado sem suporte PCRE_UTF8.\nO MediaWiki necessita do suporte UTF-8 para funcionar corretamente.",
index 6f6e003..1c0ec86 100644 (file)
        "config-page-upgradedoc": "Aggiornamende",
        "config-page-existingwiki": "Uicchi esistende",
        "config-restart": "Sìne, falle repartì",
+       "config-sidebar": "* [https://www.mediawiki.org Pàgena Prengepàle MediaUicchi]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Guide de l'utende]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Guide de l'amministratore]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ FAQ]",
+       "config-sidebar-readme": "Liggeme",
+       "config-sidebar-relnotes": "Note de rilasce",
+       "config-sidebar-license": "Stoche a copie",
+       "config-sidebar-upgrade": "Aggiornamende",
        "config-env-php": "PHP $1 ha state installate.",
        "config-env-hhvm": "HHVM $1 ha state installate.",
        "config-outdated-sqlite": "<strong>Iapre l'uecchjie:</strong> tu è SQLite $2, ca jè 'na versione troppe vecchie respette a quedda minime $1. SQLite non g'è disponibbele.",
index 4943e72..a34db5f 100644 (file)
        "config-restart": "Да, начать заново",
        "config-welcome": "=== Проверка окружения ===\nБудут проведены базовые проверки с целью определить, подходит ли данная система для установки MediaWiki.\nНе забудьте включить эту информацию, если вам потребуется помощь для завершения установки.",
        "config-copyright": "=== Авторские права и условия ===\n\n$1\n\nMediaWiki — свободное программное обеспечение, которое вы можете распространять и/или изменять в соответствии с условиями лицензии GNU General Public License, опубликованной фондом свободного программного обеспечения; второй версии, либо любой более поздней версии.\n\nMediaWiki распространяется в надежде, что она будет полезной, но <strong>без каких-либо гарантий</strong>, даже без подразумеваемых гарантий <strong>коммерческой ценности</strong> или <strong>пригодности для определённой цели</strong>. См. лицензию GNU General Public License для более подробной информации.\n\nВы должны были получить <doclink href=Copying>копию GNU General Public License</doclink> вместе с этой программой, если нет, то напишите Free Software Foundation, Inc., по адресу: 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA или [https://www.gnu.org/copyleft/gpl.html прочтите её онлайн].",
-       "config-sidebar": "* [https://www.mediawiki.org Сайт MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents/ru Справка для пользователей]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents/ru Справка для администраторов]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/ru FAQ]\n----\n* <doclink href=Readme>Readme-файл</doclink>\n* <doclink href=ReleaseNotes>Информация о выпуске</doclink>\n* <doclink href=Copying>Лицензия</doclink>\n* <doclink href=UpgradeDoc>Обновление</doclink>",
+       "config-sidebar": "* [https://www.mediawiki.org Сайт MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Справка для пользователей]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Справка для администраторов]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ FAQ]",
+       "config-sidebar-readme": "Прочти меня",
+       "config-sidebar-relnotes": "Информация о версии",
+       "config-sidebar-license": "Копирование",
+       "config-sidebar-upgrade": "Обновление",
        "config-env-good": "Проверка внешней среды была успешно проведена.\nВы можете установить MediaWiki.",
        "config-env-bad": "Была проведена проверка внешней среды.\nВы не можете установить MediaWiki.",
        "config-env-php": "Установленная версия PHP: $1.",
index 7a30492..13a9241 100644 (file)
@@ -71,7 +71,7 @@
        "config-unicode-pure-php-warning": "<strong>警告:</strong> 無法使用 [https://pecl.php.net/intl intl PECL 擴充套件] 處理 Unicode 正規化,故回退使用純 PHP 實作的正規化程式,此方式處理速度較緩慢。\n\n如果您的網站瀏覽人次很高,您應先閱讀 [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations/zh Unicode 正規化]。",
        "config-unicode-update-warning": "<strong>警告</strong>:目前安裝的 Unicode 正規化包裝程式使用了舊版 [http://site.icu-project.org/ ICU 計劃] 的程式庫。\n若您需要使用 Unicode,您應先進行 [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations 升級]。",
        "config-no-db": "找不到合適的資料庫驅動程式!您需要安裝 PHP 資料庫驅動程式。\n目前支援以下{{PLURAL:$2|類型|類型}}的資料庫: $1 。\n\n如果您是自行編譯 PHP,您必須重新設定並開啟資料庫客戶端,例:使用 <code>./configure --with-mysqli</code> 指令參數。\n如果您是使用 Debian 或 Ubuntu 的套件安裝 PHP ,您則需要額外安裝,例:<code>php-mysql</code> 套件。",
-       "config-outdated-sqlite": "<strong>警告:</strong>您已安裝 SQLite $1,但是它的版本低於最低需求版本 $2。 因此您無法使用 SQLite。",
+       "config-outdated-sqlite": "<strong>警告:</strong>您已安裝 SQLite $2,但是它的版本低於最低需求版本 $1。 因此您無法使用 SQLite。",
        "config-no-fts3": "<strong>警告:</strong> SQLite 編譯時未包含 [//sqlite.org/fts3.html FTS3 模組],後台搜尋功能將無法使用。",
        "config-pcre-old": "<strong>嚴重:</strong> 需要使用 PCRE $1 或更新的版本。\n您的 PHP 執行檔使用的是 PCRE $2。\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE 詳細資訊]。",
        "config-pcre-no-utf8": "<strong>嚴重:</strong> PHP 的 PCRE 模組在編譯時未包含 PCRE_UTF8 支援。\nMediaWiki 需要支援 UTF-8 才可正常運作。",
index 8b4ace6..ba0b4a0 100644 (file)
@@ -93,6 +93,8 @@ interface ILoadBalancer {
        const CONN_TRX_AUTOCOMMIT = 1;
        /** @var int Return null on connection failure instead of throwing an exception */
        const CONN_SILENCE_ERRORS = 2;
+       /** @var int Caller is requesting the master DB server for possibly writes */
+       const CONN_INTENT_WRITABLE = 4;
 
        /** @var string Manager of ILoadBalancer instances is running post-commit callbacks */
        const STAGE_POSTCOMMIT_CALLBACKS = 'stage-postcommit-callbacks';
@@ -271,12 +273,33 @@ interface ILoadBalancer {
         * @param string[]|string $groups Query group(s) or [] to use the default group
         * @param string|bool $domain DB domain ID or false for the local domain
         * @param int $flags Bitfield of CONN_* class constants
-        * @return IDatabase|bool Live connection handle or false on failure
+        *
+        * @note This method throws DBAccessError if ILoadBalancer::disable() was called
+        *
+        * @return IDatabase|bool This returns false on failure if CONN_SILENCE_ERRORS is set
         * @throws DBError If no live handle can be obtained and CONN_SILENCE_ERRORS is not set
         * @throws DBAccessError If disable() was previously called
+        * @throws InvalidArgumentException
         */
        public function getConnection( $i, $groups = [], $domain = false, $flags = 0 );
 
+       /**
+        * Get a live handle for a server index
+        *
+        * This is a simpler version of getConnection() that does not accept virtual server
+        * indexes (e.g. DB_MASTER/DB_REPLICA), does not assure that master DB handles have
+        * read-only mode when there is high replication lag, and can only trigger attempts
+        * to connect to a single server (the one with the specified server index).
+        *
+        * @see ILoadBalancer::getConnection()
+        *
+        * @param int $i Specific server index
+        * @param string $domain Resolved DB domain
+        * @param int $flags Bitfield of class CONN_* constants
+        * @return IDatabase|bool
+        */
+       public function getServerConnection( $i, $domain, $flags = 0 );
+
        /**
         * Mark a live handle as being available for reuse under a different database domain
         *
index c1d7a0f..184cb0e 100644 (file)
@@ -114,9 +114,7 @@ class LoadBalancer implements ILoadBalancer {
        private $waitForPos;
        /** @var bool Whether the generic reader fell back to a lagged replica DB */
        private $laggedReplicaMode = false;
-       /** @var bool Whether the generic reader fell back to a lagged replica DB */
-       private $allReplicasDownMode = false;
-       /** @var string The last DB domain selection or connection error */
+       /** @var string The last DB selection or connection error */
        private $lastError = 'Unknown error';
        /** @var string|bool Reason this instance is read-only or false if not */
        private $readOnlyReason = false;
@@ -141,7 +139,7 @@ class LoadBalancer implements ILoadBalancer {
        const MAX_LAG_DEFAULT = 6;
        /** @var int Default 'waitTimeout' when unspecified */
        const MAX_WAIT_DEFAULT = 10;
-       /** @var int Seconds to cache master server read-only status */
+       /** @var int Seconds to cache master DB server read-only status */
        const TTL_CACHE_READONLY = 5;
 
        const KEY_LOCAL = 'local';
@@ -290,7 +288,7 @@ class LoadBalancer implements ILoadBalancer {
                        throw new InvalidArgumentException( "Invalid query groups provided" );
                }
 
-               if ( $groups && $i > 0 ) {
+               if ( $groups !== [] && $groups !== false && $i > 0 ) {
                        $groupList = implode( ', ', $groups );
                        throw new LogicException( "Got query groups ($groupList) with a server index (#$i)" );
                }
@@ -299,24 +297,31 @@ class LoadBalancer implements ILoadBalancer {
        }
 
        /**
-        * @param int $flags
-        * @return bool
+        * @param int $flags Bitfield of class CONN_* constants
+        * @param int $i Specific server index or DB_MASTER/DB_REPLICA
+        * @return int Sanitized bitfield
         */
-       private function sanitizeConnectionFlags( $flags ) {
-               if ( ( $flags & self::CONN_TRX_AUTOCOMMIT ) === self::CONN_TRX_AUTOCOMMIT ) {
-                       // Assuming all servers are of the same type (or similar), which is overwhelmingly
-                       // the case, use the master server information to get the attributes. The information
-                       // for $i cannot be used since it might be DB_REPLICA, which might require connection
-                       // attempts in order to be resolved into a real server index.
+       private function sanitizeConnectionFlags( $flags, $i ) {
+               // Whether an outside caller is explicitly requesting the master database server
+               if ( $i === self::DB_MASTER || $i === $this->getWriterIndex() ) {
+                       $flags |= self::CONN_INTENT_WRITABLE;
+               }
+
+               if ( ( $flags & self::CONN_TRX_AUTOCOMMIT ) == self::CONN_TRX_AUTOCOMMIT ) {
+                       // Callers use CONN_TRX_AUTOCOMMIT to bypass REPEATABLE-READ staleness without
+                       // resorting to row locks (e.g. FOR UPDATE) or to make small out-of-band commits
+                       // during larger transactions. This is useful for avoiding lock contention.
+
+                       // Master DB server attributes (should match those of the replica DB servers)
                        $attributes = $this->getServerAttributes( $this->getWriterIndex() );
                        if ( $attributes[Database::ATTR_DB_LEVEL_LOCKING] ) {
-                               // Callers sometimes want to (a) escape REPEATABLE-READ stateness without locking
-                               // rows (e.g. FOR UPDATE) or (b) make small commits during a larger transactions
-                               // to reduce lock contention. None of these apply for sqlite and using separate
-                               // connections just causes self-deadlocks.
+                               // The RDBMS does not support concurrent writes (e.g. SQLite), so attempts
+                               // to use separate connections would just cause self-deadlocks. Note that
+                               // REPEATABLE-READ staleness is not an issue since DB-level locking means
+                               // that transactions are Strict Serializable anyway.
                                $flags &= ~self::CONN_TRX_AUTOCOMMIT;
-                               $this->connLogger->info( __METHOD__ .
-                                       ': ignoring CONN_TRX_AUTOCOMMIT to avoid deadlocks.' );
+                               $type = $this->getServerType( $this->getWriterIndex() );
+                               $this->connLogger->info( __METHOD__ . ": CONN_TRX_AUTOCOMMIT disallowed ($type)" );
                        }
                }
 
@@ -341,7 +346,7 @@ class LoadBalancer implements ILoadBalancer {
                }
        }
 
-               /**
+       /**
         * Get a LoadMonitor instance
         *
         * @return ILoadMonitor
@@ -562,7 +567,7 @@ class LoadBalancer implements ILoadBalancer {
        /**
         * @param array $loads List of server weights
         * @param string|bool $domain
-        * @return array (reader index, lagged replica mode) or false on failure
+        * @return array (reader index, lagged replica mode) or (false, false) on failure
         */
        private function pickReaderIndex( array $loads, $domain = false ) {
                if ( $loads === [] ) {
@@ -615,7 +620,9 @@ class LoadBalancer implements ILoadBalancer {
                        $serverName = $this->getServerName( $i );
                        $this->connLogger->debug( __METHOD__ . ": Using reader #$i: $serverName..." );
 
-                       $conn = $this->getConnection( $i, [], $domain, self::CONN_SILENCE_ERRORS );
+                       // Get a connection to this server without triggering other server connections
+                       $flags = self::CONN_SILENCE_ERRORS;
+                       $conn = $this->getServerConnection( $i, $domain, $flags );
                        if ( !$conn ) {
                                $this->connLogger->warning( __METHOD__ . ": Failed connecting to $i/$domain" );
                                unset( $currentLoads[$i] ); // avoid this server next iteration
@@ -725,6 +732,8 @@ class LoadBalancer implements ILoadBalancer {
 
        public function getAnyOpenConnection( $i, $flags = 0 ) {
                $i = ( $i === self::DB_MASTER ) ? $this->getWriterIndex() : $i;
+               // Connection handles required to be in auto-commit mode use a separate connection
+               // pool since the main pool is effected by implicit and explicit transaction rounds
                $autocommit = ( ( $flags & self::CONN_TRX_AUTOCOMMIT ) == self::CONN_TRX_AUTOCOMMIT );
 
                $conn = false;
@@ -782,7 +791,7 @@ class LoadBalancer implements ILoadBalancer {
 
        /**
         * Wait for a given replica DB to catch up to the master pos stored in "waitForPos"
-        * @param int $index Server index
+        * @param int $index Specific server index
         * @param bool $open Check the server even if a new connection has to be made
         * @param int|null $timeout Max seconds to wait; default is "waitTimeout"
         * @return bool
@@ -809,7 +818,8 @@ class LoadBalancer implements ILoadBalancer {
 
                // Find a connection to wait on, creating one if needed and allowed
                $close = false; // close the connection afterwards
-               $conn = $this->getAnyOpenConnection( $index );
+               $flags = self::CONN_SILENCE_ERRORS;
+               $conn = $this->getAnyOpenConnection( $index, $flags );
                if ( !$conn ) {
                        if ( !$open ) {
                                $this->replLogger->debug(
@@ -819,8 +829,8 @@ class LoadBalancer implements ILoadBalancer {
 
                                return false;
                        }
-                       // Open a temporary new connection in order to wait for replication
-                       $conn = $this->getConnection( $index, [], self::DOMAIN_ANY, self::CONN_SILENCE_ERRORS );
+                       // Get a connection to this server without triggering other server connections
+                       $conn = $this->getServerConnection( $index, self::DOMAIN_ANY, $flags );
                        if ( !$conn ) {
                                $this->replLogger->warning(
                                        __METHOD__ . ': failed to connect to {dbserver}',
@@ -877,20 +887,42 @@ class LoadBalancer implements ILoadBalancer {
        }
 
        public function getConnection( $i, $groups = [], $domain = false, $flags = 0 ) {
-               $groups = $this->resolveGroups( $groups, $i );
                $domain = $this->resolveDomainID( $domain );
-               $flags = $this->sanitizeConnectionFlags( $flags );
-               $masterOnly = ( $i === self::DB_MASTER || $i === $this->getWriterIndex() );
+               $groups = $this->resolveGroups( $groups, $i );
+               $flags = $this->sanitizeConnectionFlags( $flags, $i );
+               // If given DB_MASTER/DB_REPLICA, resolve it to a specific server index. Resolving
+               // DB_REPLICA might trigger getServerConnection() calls due to the getReaderIndex()
+               // connectivity checks or LoadMonitor::scaleLoads() server state cache regeneration.
+               // The use of getServerConnection() instead of getConnection() avoids infinite loops.
+               $serverIndex = $this->getConnectionIndex( $i, $groups, $domain );
+               // Get an open connection to that server (might trigger a new connection)
+               $conn = $this->getServerConnection( $serverIndex, $domain, $flags );
+               // Set master DB handles as read-only if there is high replication lag
+               if ( $serverIndex === $this->getWriterIndex() && $this->getLaggedReplicaMode( $domain ) ) {
+                       $reason = ( $this->getExistingReaderIndex( self::GROUP_GENERIC ) >= 0 )
+                               ? 'The database is read-only until replication lag decreases.'
+                               : 'The database is read-only until replica database servers becomes reachable.';
+                       $conn->setLBInfo( 'readOnlyReason', $reason );
+               }
+
+               return $conn;
+       }
 
+       /**
+        * @param int $i Specific server index
+        * @param string $domain Resolved DB domain
+        * @param int $flags Bitfield of class CONN_* constants
+        * @return IDatabase|bool
+        * @throws InvalidArgumentException When the server index is invalid
+        */
+       public function getServerConnection( $i, $domain, $flags = 0 ) {
                // Number of connections made before getting the server index and handle
                $priorConnectionsMade = $this->connectionCounter;
-               // Choose a server if $i is DB_MASTER/DB_REPLICA (might trigger new connections)
-               $serverIndex = $this->getConnectionIndex( $i, $groups, $domain );
-               // Get an open connection to that server (might trigger a new connection)
+               // Get an open connection to this server (might trigger a new connection)
                $conn = $this->localDomain->equals( $domain )
-                       ? $this->getLocalConnection( $serverIndex, $flags )
-                       : $this->getForeignConnection( $serverIndex, $domain, $flags );
-               // Throw an error or bail out if the connection attempt failed
+                       ? $this->getLocalConnection( $i, $flags )
+                       : $this->getForeignConnection( $i, $domain, $flags );
+               // Throw an error or otherwise bail out if the connection attempt failed
                if ( !( $conn instanceof IDatabase ) ) {
                        if ( ( $flags & self::CONN_SILENCE_ERRORS ) != self::CONN_SILENCE_ERRORS ) {
                                $this->reportConnectionError();
@@ -901,25 +933,36 @@ class LoadBalancer implements ILoadBalancer {
 
                // Profile any new connections caused by this method
                if ( $this->connectionCounter > $priorConnectionsMade ) {
-                       $host = $conn->getServer();
-                       $dbname = $conn->getDBname();
-                       $this->trxProfiler->recordConnection( $host, $dbname, $masterOnly );
+                       $this->trxProfiler->recordConnection(
+                               $conn->getServer(),
+                               $conn->getDBname(),
+                               ( ( $flags & self::CONN_INTENT_WRITABLE ) == self::CONN_INTENT_WRITABLE )
+                       );
                }
 
                if ( !$conn->isOpen() ) {
-                       // Connection was made but later unrecoverably lost for some reason.
-                       // Do not return a handle that will just throw exceptions on use,
-                       // but let the calling code (e.g. getReaderIndex) try another server.
                        $this->errorConnection = $conn;
+                       // Connection was made but later unrecoverably lost for some reason.
+                       // Do not return a handle that will just throw exceptions on use, but
+                       // let the calling code, e.g. getReaderIndex(), try another server.
                        return false;
                }
 
+               // Make sure that flags like CONN_TRX_AUTOCOMMIT are respected by this handle
                $this->enforceConnectionFlags( $conn, $flags );
-               if ( $serverIndex === $this->getWriterIndex() ) {
-                       // If the load balancer is read-only, perhaps due to replication lag, then master
-                       // DB handles will reflect that. Note that Database::assertIsWritableMaster() takes
-                       // care of replica DB handles whereas getReadOnlyReason() would cause infinite loops.
-                       $conn->setLBInfo( 'readOnlyReason', $this->getReadOnlyReason( $domain, $conn ) );
+               // Set master DB handles as read-only if the load balancer is configured as read-only
+               // or the master database server is running in server-side read-only mode. Note that
+               // replica DB handles are always read-only via Database::assertIsWritableMaster().
+               // Read-only mode due to replication lag is *avoided* here to avoid recursion.
+               if ( $conn->getLBInfo( 'serverIndex' ) === $this->getWriterIndex() ) {
+                       if ( $this->readOnlyReason !== false ) {
+                               $conn->setLBInfo( 'readOnlyReason', $this->readOnlyReason );
+                       } elseif ( $this->masterRunningReadOnly( $domain, $conn ) ) {
+                               $conn->setLBInfo(
+                                       'readOnlyReason',
+                                       'The master database server is running in read-only mode.'
+                               );
+                       }
                }
 
                return $conn;
@@ -1019,7 +1062,7 @@ class LoadBalancer implements ILoadBalancer {
 
        /**
         * @param int $i
-        * @param bool $domain
+        * @param string|bool $domain
         * @param int $flags
         * @return Database|bool Live database handle or false on failure
         * @deprecated Since 1.34 Use getConnection() instead
@@ -1039,6 +1082,8 @@ class LoadBalancer implements ILoadBalancer {
         * @param int $i Server index
         * @param int $flags Class CONN_* constant bitfield
         * @return Database
+        * @throws InvalidArgumentException When the server index is invalid
+        * @throws UnexpectedValueException When the DB domain of the connection is corrupted
         */
        private function getLocalConnection( $i, $flags = 0 ) {
                // Connection handles required to be in auto-commit mode use a separate connection
@@ -1101,6 +1146,8 @@ class LoadBalancer implements ILoadBalancer {
         * @param int $flags Class CONN_* constant bitfield
         * @return Database|bool Returns false on connection error
         * @throws DBError When database selection fails
+        * @throws InvalidArgumentException When the server index is invalid
+        * @throws UnexpectedValueException When the DB domain of the connection is corrupted
         */
        private function getForeignConnection( $i, $domain, $flags = 0 ) {
                $domainInstance = DatabaseDomain::newFromId( $domain );
@@ -1847,20 +1894,16 @@ class LoadBalancer implements ILoadBalancer {
        }
 
        public function getLaggedReplicaMode( $domain = false ) {
-               if (
-                       // Avoid recursion if there is only one DB
-                       $this->hasStreamingReplicaServers() &&
-                       // Avoid recursion if the (non-zero load) master DB was picked for generic reads
-                       $this->genericReadIndex !== $this->getWriterIndex() &&
-                       // Stay in lagged replica mode during the load balancer instance lifetime
-                       !$this->laggedReplicaMode
-               ) {
+               if ( $this->laggedReplicaMode ) {
+                       return true; // stay in lagged replica mode
+               }
+
+               if ( $this->hasStreamingReplicaServers() ) {
                        try {
-                               // Calling this method will set "laggedReplicaMode" as needed
-                               $this->getReaderIndex( false, $domain );
+                               // Set "laggedReplicaMode"
+                               $this->getReaderIndex( self::GROUP_GENERIC, $domain );
                        } catch ( DBConnectionError $e ) {
-                               // Avoid expensive re-connect attempts and failures
-                               $this->allReplicasDownMode = true;
+                               // Sanity: avoid expensive re-connect attempts and failures
                                $this->laggedReplicaMode = true;
                        }
                }
@@ -1884,16 +1927,12 @@ class LoadBalancer implements ILoadBalancer {
        public function getReadOnlyReason( $domain = false, IDatabase $conn = null ) {
                if ( $this->readOnlyReason !== false ) {
                        return $this->readOnlyReason;
-               } elseif ( $this->getLaggedReplicaMode( $domain ) ) {
-                       if ( $this->allReplicasDownMode ) {
-                               return 'The database has been automatically locked ' .
-                                       'until the replica database servers become available';
-                       } else {
-                               return 'The database has been automatically locked ' .
-                                       'while the replica database servers catch up to the master.';
-                       }
                } elseif ( $this->masterRunningReadOnly( $domain, $conn ) ) {
-                       return 'The database master is running in read-only mode.';
+                       return 'The master database server is running in read-only mode.';
+               } elseif ( $this->getLaggedReplicaMode( $domain ) ) {
+                       return ( $this->getExistingReaderIndex( self::GROUP_GENERIC ) >= 0 )
+                               ? 'The database is read-only until replication lag decreases.'
+                               : 'The database is read-only until a replica database server becomes reachable.';
                }
 
                return false;
@@ -1914,7 +1953,8 @@ class LoadBalancer implements ILoadBalancer {
                        function () use ( $domain, $conn ) {
                                $old = $this->trxProfiler->setSilenced( true );
                                try {
-                                       $dbw = $conn ?: $this->getConnection( self::DB_MASTER, [], $domain );
+                                       $index = $this->getWriterIndex();
+                                       $dbw = $conn ?: $this->getServerConnection( $index, $domain );
                                        $readOnly = (int)$dbw->serverIsReadOnly();
                                        if ( !$conn ) {
                                                $this->reuseConnection( $dbw );
@@ -1923,6 +1963,7 @@ class LoadBalancer implements ILoadBalancer {
                                        $readOnly = 0;
                                }
                                $this->trxProfiler->setSilenced( $old );
+
                                return $readOnly;
                        },
                        [ 'pcTTL' => $cache::TTL_PROC_LONG, 'busyValue' => 0 ]
@@ -2070,12 +2111,12 @@ class LoadBalancer implements ILoadBalancer {
                if ( !$pos ) {
                        // Get the current master position, opening a connection if needed
                        $index = $this->getWriterIndex();
-                       $masterConn = $this->getAnyOpenConnection( $index );
+                       $flags = self::CONN_SILENCE_ERRORS;
+                       $masterConn = $this->getAnyOpenConnection( $index, $flags );
                        if ( $masterConn ) {
                                $pos = $masterConn->getMasterPos();
                        } else {
-                               $flags = self::CONN_SILENCE_ERRORS;
-                               $masterConn = $this->getConnection( $index, [], self::DOMAIN_ANY, $flags );
+                               $masterConn = $this->getServerConnection( $index, self::DOMAIN_ANY, $flags );
                                if ( !$masterConn ) {
                                        throw new DBReplicationWaitError(
                                                null,
index 1666c27..c53f342 100644 (file)
@@ -159,7 +159,8 @@ class LoadMonitor implements ILoadMonitor {
                        if ( $conn ) {
                                $close = false; // already open
                        } else {
-                               $conn = $this->parent->getConnection( $i, [], ILoadBalancer::DOMAIN_ANY, $flags );
+                               // Get a connection to this server without triggering other server connections
+                               $conn = $this->parent->getServerConnection( $i, ILoadBalancer::DOMAIN_ANY, $flags );
                                $close = true; // new connection
                        }
 
index 0ce63b5..776008e 100644 (file)
        "recentchanges-feed-description": "molihang pagentosan anyar ring wiki ring \"umpan\" puniki",
        "recentchanges-label-newpage": "Uahan puniki makarya kaca anyar",
        "recentchanges-label-minor": "Punika uahan alit",
-       "recentchanges-label-bot": "penguwahan puniki kalaksanayang antuk bot",
+       "recentchanges-label-bot": "Uahan puniki kalaksanayang antuk bot",
        "recentchanges-label-unpatrolled": "Uahan puniki durung kapatroli",
        "recentchanges-legend-heading": "<strong>Legenda:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (taler cingak [[Special:NewPages|bacakan kaca anyar]])",
index 448ddb8..b87811a 100644 (file)
        "histlegend": "Кхетор: (хӀинцалера.) — йолучу башхон къастам; (хьалх.) — хьалхалерчу башхон къастам; '''ж''' — жимо бозалца болу хийцам.",
        "history-fieldset-title": "АгӀона хийцамаш",
        "history-show-deleted": "ДӀаяьхнарш",
-       "histfirst": "ширниш",
-       "histlast": "хьалхарниш",
+       "histfirst": "Ñ\88иÑ\80аниÑ\88",
+       "histlast": "керланиш",
        "historysize": "($1 {{PLURAL:$1|байт}})",
        "historyempty": "(еса)",
        "history-feed-title": "Хийцаман истори",
index fb7dd16..ee787a3 100644 (file)
        "passwordpolicies-policyflag-suggestchangeonlogin": "Änderung bei der Anmeldung vorschlagen",
        "easydeflate-invaliddeflate": "Der angegebene Inhalt ist nicht ordnungsgemäß komprimiert",
        "unprotected-js": "Aus Sicherheitsgründen kann JavaScript-Code nicht mehr von ungeschützten Seiten geladen werden. Erstelle die JavaScript-Seite bitte ausschließlich im Namensraum „MediaWiki“ oder als Benutzerunterseite.",
-       "userlogout-continue": "Falls du dich abmelden möchtest, [$1 fahre bitte auf der Abmeldeseite fort]."
+       "userlogout-continue": "Möchtest du dich abmelden?"
 }
index 2410063..3f36ff2 100644 (file)
        "blockedtitle": "အသုံးပြုသူကို ပိတ်ပင်ထားသည်",
        "blockedtext": "<strong>သင်၏ အသုံးပြုသူအမည် သို့မဟုတ် အိုင်ပီလိပ်စာသည် ပိတ်ပင်ခြင်း ခံထားရသည်။</strong>\n\nဤပိတ်ပင်မှုအား $1 က ဆောင်ရွက်ခဲ့သည်။\nအကြောင်းရင်းမှာ <em>$2</em> ဖြစ်သည်။\n\n* ပိတ်ပင်ခြင်း စတင်ချိန်: $8\n* ပိတ်ပင်ခြင်း သက်တမ်းကုန်ချိန်: $6\n* ရည်ရွယ်ရာ blockee: $7\n\nသင်သည် ပိတ်ပင်မှုအတွက် ဆွေးနွေးရန် $1 သို့မဟုတ် အခြား [[{{MediaWiki:Grouppage-sysop}}|စီမံခန့်ခွဲသူ]] အား ဆက်သွယ်နိုင်သည်။\nသင့်အနေဖြင့် [[Special:Preferences|အကောင့်၏ ရွေးချယ်စရာများ]]ထဲတွင် ရေရာသော အီးမေးလိပ်စာအား မထည့်သွင်းထားပါက \"{{int:emailuser}}\" လုပ်ဆောင်ချက်ကို အသုံးပြုနိုင်မည် မဟုတ်ပါ။ အလားတူ ယင်းလုပ်ဆောင်ချက်ကို ပိတ်ပင်မခံရမှ လုပ်ဆောင်နိုင်မည်ဖြစ်သည်။\nသင်၏ လက်ရှိ အိုင်ပီလိပ်စာမှာ $3 ဖြစ်ပြီး၊ ပိတ်ပင်မှုအိုင်ဒီမှာ #$5 ဖြစ်သည်။\nသင်ပြုလုပ်မည့် စုံစမ်းမေးမြန်းမှုများတွင် အထက်ပါ အချက်များ အားလုံး ပါဝင်နေပါစေ။",
        "blockednoreason": "အကြောင်းပြချက် မပေးထားပါ",
+       "blockedtext-composite": "<strong>သင်၏အသုံးပြုသူအမည် သို့ အိုင်ပီလိပ်စာကို ပိတ်ပင်ထားပါသည်။</strong>\n\nပေးထားသော အကြောင်းပြချက်မှာ:\n\n:<em>$2</em>။\n\n* စတင်ပိတ်ပင်ခြင်း: $8\n* ပိတ်ပင်မှု ကုန်ဆုံးရက်: $6\n\nသင်၏လက်ရှိအိုင်ပီလိပ်စာမှာ $3 ဖြစ်သည်။\nသင် တောင်းဆိုချက်များလုပ်ဆောင်ပါက အထက်ပါအချက်အလက်များကို ထည့်သွင်းပါ။",
        "whitelistedittext": "စာမျက်နှာများကို တည်းဖြတ်ရန် $1ရမည်။",
        "nosuchsectiontitle": "အပိုင်းကို ရှာမရနိုင်ပါ",
        "loginreqtitle": "လော့ဂ်အင်ဝင်ထားရန် လိုသည်",
index 50b9aaf..dfd9e1e 100644 (file)
        "unusedimages": "ߞߐߕߐ߯ ߟߊߓߊ߯ߙߊߓߊߟߌ",
        "wantedcategories": "ߦߌߟߡߊ߫ ߞߊ߬ߣߌ߲߬ߣߍ߲ ߠߎ߬",
        "wantedpages": "ߞߐߜߍ߫ ߜߋ߬ߟߎ߲߬ߣߍ߲ ߠߎ߬",
+       "wantedtemplates": "ߞߙߊߞߏ ߞߊ߬ߣߌ߲߬ߣߍ߲ ߠߎ߬",
+       "mostlinked": "ߛߘߌ߬ߜߋ߲߬ ߦߙߌߞߊ߫ ߦߋ߫ ߞߐߜߍ ߡߍ߲ ߠߎ߬ ߘߐ߫",
+       "mostlinkedcategories": "ߛߘߌ߬ߜߋ߲߬ ߦߙߌߞߊ߫ ߦߋ߫ ߦߌߟߡߊ ߡߍ߲ ߠߎ߬ ߘߐ߫",
+       "mostcategories": "ߦߌߟߡߊ߫ ߦߙߌߞߊ߫ ߦߋ߫ ߞߐߜߍ ߡߍ߲ ߠߎ߬ ߘߐ߫",
+       "mostimages": "ߛߘߌ߬ߜߋ߲߬ ߦߙߌߞߊ߫ ߦߋ߫ ߞߐߕߐ߮ ߡߍ߲ ߠߎ߬ ߘߐ߫",
        "mostinterwikis": "ߞߐߜߍ ߡߍ߲ ߠߎ߬ ߦߋ߫ ߥߞߌ ߣߌ߫ ߢߐ߲ߕߍ ߝߊ߲߬ߓߊ ߘߐ߫",
+       "mostrevisions": "ߟߢߊ߬ߟߌ߬ ߦߙߌߞߊ߫ ߦߋ߫ ߞߐߜߍ ߡߍ߲ ߠߎ߬ ߘߐ߫",
        "prefixindex": "ߞߐߜߍ ߡߍ߲ ߠߎ߬ ߓߍ߯ ߟߊߝߟߐߣߍ߲߫",
        "prefixindex-submit": "ߊ߬ ߦߌ߬ߘߊ߬",
        "shortpages": "ߞߐߜߍ߫ ߛߎߘߎ߲ ߠߎ߬",
        "protectedpages": "ߞߐߜߍ߫ ߟߊߞߊ߲ߘߊߣߍ߲ ߠߎ߬",
        "protectedpages-filters": "ߛߍ߲ߛߍ߲ߟߊ߲ ߠߎ߬:",
        "protectedpages-page": "ߞߐߜߍ",
+       "protectedpages-expiry": "ߊ߬ ߛߕߊ ߓߘߊ߫ ߝߊ߫",
        "protectedpages-performer": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ߫ ߟߊߞߊ߲ߘߊߣߍ߲",
        "protectedpages-params": "ߟߊ߬ߓߍ߲߬ߢߐ߲߰ߡߊ ߟߊ߬ߞߊ߲߬ߘߊ߬ߟߌ",
        "protectedpages-reason": "ߊ߬ ߛߊߓߎ",
        "protectedtitles": "ߞߎ߲߬ߕߐ߰ ߟߊߞߊ߲ߘߊߣߍ߲ ߠߎ߬",
        "protectedtitles-submit": "ߞߎ߲߬ߕߐ߮ ߦߌ߬ߘߊ߬ߟߌ",
        "listusers": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߛߙߍߘߍ",
+       "listusers-editsonly": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߟߎ߬ ߦߌ߬ߘߊ߬ ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߠߎ߬ ߘߐߙߐ߲߫ ߡߊ߬",
        "listusers-creationsort": "ߊ߬ ߦߋ߫ ߛߌ߲ߘߟߌ ߕߎ߬ߡߊ߬ߘߊ ߡߊ߬",
        "usereditcount": "$1 {{PLURAL:$1|ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲|ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߠߎ߬}}",
        "usercreated": "{{GENDER:$3|ߛߌ߲ߘߟߌߣߐ ߟߋ߬}} $2 $1 ߡߊ߬",
        "nopagetext": "ߌ ߣߊ߬ ߞߏ߲߰ ߞߐߜߍ ߡߍ߲ ߡߊߕߍ߰ ߟߊ߫ ߣߌ߲߬߸ ߊ߬ ߕߴߦߋ߲߬.",
        "pager-newer-n": "{{PLURAL:$1|ߞߎߘߡߊ1|ߞߎߘߡߊ$1}}",
        "pager-older-n": "{{PLURAL:$1|ߞߘߐ߬ߡߊ߲ ߁|ߞߘߐ߬ߡߊ߲ ߠߎ߬ $1}}",
+       "apihelp": "API ߘߍ߬ߡߍ߲߬ߠߌ߲",
        "apisandbox-submit": "ߡߊ߬ߢߌ߬ߣߌ߲߬ߞߊ߬ߟߌ ߘߏ߫ ߞߍ߫",
        "apisandbox-reset": "ߊ߬ ߖߏ߰ߛߌ߬",
        "apisandbox-retry": "ߊ߬ ߡߊߝߍߣߍ߲߫ ߕߎ߲߯",
        "apisandbox-request-url-label": "URL ߡߊ߬ߢߌ߬ߣߌ߲߬ߞߊ߬ߟߌ:",
        "apisandbox-request-json-label": "JSON ߡߊ߬ߢߌ߬ߣߌ߲߬ߞߊ߬ߟߌ:",
        "apisandbox-request-time": "ߡߊ߬ߢߌ߬ߣߌ߲߬ߞߊ߬ߟߌ ߕߎ߬ߡߊ: {{PLURAL:$1|$1 ms}}",
+       "apisandbox-continue": "ߘߊߓߊ߲ߠߌ߲",
+       "apisandbox-continue-clear": "ߊ߬ ߖߏ߰ߛߌ߬",
+       "apisandbox-multivalue-all-namespaces": "$1 (ߕߐ߯ ߛߓߍ ߞߣߍ ߟߎ߬ ߓߍ߯)",
+       "apisandbox-multivalue-all-values": "$1 (ߡߐ߬ߟߐ߲ ߠߎ߬ ߓߍ߯)",
        "booksources": "ߞߊ߬ߝߊ ߛߎ߲",
        "booksources-search-legend": "ߞߊ߬ߝߊ ߛߎ߲ ߕߌߙߌ߲߫",
        "booksources-search": "ߢߌߣߌ߲ߠߌ߲",
        "specialloguserlabel": "ߞߍߓߊ߮ :",
        "speciallogtitlelabel": "ߞߏ߲߭ (ߞߎ߲߬ߕߐ߮ ߥߟߊ߫  {{ns:user}}: ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߟߊ߫ ߟߊ߬ߓߊ߰ߙߊ߬ ߕߐ߮):",
        "log": "ߘߏ߲߬",
+       "logeventslist-submit": "ߊ߬ ߦߌ߬ߘߊ߬",
        "all-logs-page": "ߝߘߏ߬ߓߊ߬ ߜߊ߲ߞߎ߲ߠߌ߲ ߠߎ߬ ߓߍ߯",
        "alllogstext": "ߓߟߏߞߘߐ߫ ߘߐߛߙߋ ߡߎ߰ߡߍ ߦߌ߬ߘߊ߬ߟߌ ߣߌ߲߬ ߞߣߐ߫ {{SITENAME}}.\nߌ ߘߌ߫ ߛߋ߫ ߛߙߍߘߍ ߘߊ߲߬ߠߊߕߍ߰ ߟߊ߫ ߓߘߍߞߍ߭ ߞߊ߬ ߢߊ߬߸ ߏ߬ ߛߋ߲߬ߝߍ߬ ߞߊ߬ ߘߐ߬ߛߙߋ ߛߎ߯ߦߊ ߡߊߡߌ߬ߘߊ߬߸ ߊ߬ ߣߌ߫ ߟߊߓߊ߯ߙߟߊ ߕߐ߮ (ߛߏ߬ߓߌ߬ߟߊ߲߬ߘߌ ߟߋ߬ ߛߓߍߘߋ߲ ߗߏ߯ߦߊ ߝߍ߬)߸ ߥߟߴߊ߬ ߥߟߏߣߍ߲߫ ߞߐߜߍ ߡߍ߲ ߞߊ߲߬ (ߛߏ߬ߓߌ߬ߟߊ߲߬ߘߌ ߟߋ߬ ߝߣߊ߫ ߛߓߍߘߋ߲ ߠߎ߬ ߗߏ߯ߦߊ ߝߍ߬).",
        "logempty": "ߞߍߞߏ ߛߌ߫ ߣߌ߫ ߘߐ߬ߛߙߋ ߡߊ ߓߍ߲߬ ߢߐ߲߮ ߡߊ߬.",
        "allpages-hide-redirects": "ߟߊ߬ߞߎ߲߬ߛߌ߲߬ߠߌ߲ ߢߡߊߘߏ߲߰",
        "categories": "ߦߌߟߡߊ ߟߎ߬",
        "linksearch": "ߞߐߞߊ߲ߠߊ ߛߘߌ߬ߜߋ߲ ߢߌߣߌ߲ߠߌ߲",
+       "activeusers-noresult": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߕߴߦߋ߲߬",
        "listgrouprights-members": "(ߛߌ߲߬ߝߏ߲ ߠߎ߫ ߛߙߍߘߍ)",
        "emailuser": "ߗߋߛߓߍ ߗߋ߫ ߣߌ߲߬ ߕߌ߭ ߡߊ߬",
+       "emailusername": "ߟߊߓߊ߯ߙߊߟߊߕߐ߮:",
+       "email-legend": "ߢߎߡߍߙߋ߲ ߗߋ߫  {{SITENAME}} ߜߘߍ ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߘߏ ߟߎ߬ ߡߊ߬",
+       "emailfrom": "ߞߊ߬ ߝߘߊ߫",
+       "emailto": "ߞߊ߬ ߕߊ߯:",
+       "emailsubject": "ߝߐߡߊ:",
+       "emailmessage": "ߗߋߛߓߍ:",
+       "emailsend": "ߗߋߟߌ",
+       "emailccme": "ߒ ߠߊ߫ ߗߋߛߓߍ ߓߊ߫ ߞߎߘߊ ߘߏ߫ ߗߋ߫ ߒ ߡߊ߬.",
+       "emailccsubject": "ߌ ߟߊ߫ ߗߋߛߓߍ ߓߊߞߎߘߊ ߗߋ߫ $1: $2 ߡߊ߬",
+       "emailsent": "ߢߎߡߍߙߋ߲ ߓߘߊ߫ ߗߋ߫",
+       "emailsenttext": "ߌ ߟߊ߫ ߢߎߡߍߙߋ߲߫ ߗߋߛߓߍ ߓߘߊ߫ ߓߊ߲߫ ߗߋ߫ ߟߊ߫.",
+       "emailuserfooter": "ߢߎߡߍߙߋ߲ ߣߌ߲߬ ߦߋ߫ {{GENDER:$1|ߗߋߟߌߣߐ ߟߋ߬ ߘߌ߫}} ߞߊ߬ ߝߘߊ߫ $1 ߟߊ߫ ߞߊ߬ ߥߊ߫{{GENDER:$2|$2}} \"{{int:emailuser}}\" ߓߟߏ߫߸ ߦߋ߫ ߓߊ߯ߙߊ߫ ߟߊ߫ {{SITENAME}}. ߣߌ߫ {{GENDER:$2|ߌ߫}} ߞߵߊ߬ ߖߋ߬ߓߌ߬ ߢߎߡߍߙߋ߲ߞߏ߲ߘߏ ߣߌ߲߬ ߠߊ߫߸ {{GENDER:$2|ߌ ߟߊ߫}} ߢߎߡߍߙߋ߲ ߘߌ߫ ߗߋ߫ {{GENDER:$1|ߗߋߟߌߟߊ ߛߎ߲}} ߠߊ߫߸ ߊ߬ ߘߌ߫ ߖߊ߬ߕߋ߫ {{GENDER:$2|ߌ ߟߊ߫}} ߢߎߡߍߙߋ߲ߞߏ߲ߘߏ ߛߊ߲߬ߓߊ߬ߕߐ߮ ߘߌ߫ ߞߊ߬ ߕߊ߯ {{GENDER:$2|ߞߎߡߘߊ}} ߟߊ߫.",
        "usermessage-editor": "ߞߊ߲ߞߋ߫ ߗߋߛߓߍ ߡߊߦߟߍ߬ߡߊ߲߬ߓߊ߮",
        "watchlist": "ߣߐ߬ߝߍ߬ߜߍ߲߬ߛߙߍߘߍ",
        "mywatchlist": "ߘߐߜߍ߫ ߘ߲ߜߍߕߊ",
index 9401e14..18d850a 100644 (file)
        "watchlisttools-view": "Ver alterações relevantes",
        "watchlisttools-edit": "Ver e editar a lista de páginas vigiadas",
        "watchlisttools-raw": "Edição crua da lista de páginas vigiadas",
+       "hebrew-calendar-m7-gen": "Nissan",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|discussão]])",
        "timezone-local": "Local",
        "duplicate-defaultsort": "Aviso: A chave de ordenação padrão \"$2\" sobrepõe-se à anterior chave de ordenação padrão \"$1\".",
index b31ca37..7a5671a 100644 (file)
        "edit-error-short": "Ошибка: $1",
        "edit-error-long": "Ошибки:\n\n$1",
        "specialmute": "Откл. уведомления",
-       "specialmute-success": "Изменения были успешно сделаны. Просмотрите всех отключённых участников на [[Special:Preferences]].",
+       "specialmute-success": "Изменения были успешно сделаны. Просмотрите всех отключённых участников на [[Special:Preferences|ваших настройках]].",
        "specialmute-submit": "Подтвердить",
        "specialmute-label-mute-email": "Отключить эл. почту от этого участника",
        "specialmute-header": "Пожалуйста, выберите настройки уведомлений от {{BIDI:[[User:$1]]}}.",
index ae882f2..92d8094 100644 (file)
        "group-autoconfirmed": "தானாக உறுதியளிக்கப்பட்ட பயனர்கள்",
        "group-bot": "தானியங்கிகள்",
        "group-sysop": "நிர்வாகிகள்",
+       "group-interface-admin": "இடைமுக நிர்வாகிகள்",
        "group-bureaucrat": "அதிகாரிகள்",
        "group-suppress": "கவனக்குறைவுகள்",
        "group-all": "(அனைத்து)",
index defa0aa..0c0b82b 100644 (file)
@@ -167,7 +167,9 @@ class LoadBalancerTest extends MediaWikiTestCase {
                ] );
        }
 
-       private function newMultiServerLocalLoadBalancer( $lbExtra = [], $srvExtra = [] ) {
+       private function newMultiServerLocalLoadBalancer(
+               $lbExtra = [], $srvExtra = [], $masterOnly = false
+       ) {
                global $wgDBserver, $wgDBname, $wgDBuser, $wgDBpassword, $wgDBtype, $wgSQLiteDataDir;
 
                $servers = [
@@ -180,7 +182,7 @@ class LoadBalancerTest extends MediaWikiTestCase {
                                'password' => $wgDBpassword,
                                'type' => $wgDBtype,
                                'dbDirectory' => $wgSQLiteDataDir,
-                               'load' => 0,
+                               'load' => $masterOnly ? 100 : 0,
                        ],
                        // Main replica DBs
                        1 => $srvExtra + [
@@ -191,7 +193,7 @@ class LoadBalancerTest extends MediaWikiTestCase {
                                'password' => $wgDBpassword,
                                'type' => $wgDBtype,
                                'dbDirectory' => $wgSQLiteDataDir,
-                               'load' => 100,
+                               'load' => $masterOnly ? 0 : 100,
                        ],
                        2 => $srvExtra + [
                                'host' => $wgDBserver,
@@ -201,7 +203,7 @@ class LoadBalancerTest extends MediaWikiTestCase {
                                'password' => $wgDBpassword,
                                'type' => $wgDBtype,
                                'dbDirectory' => $wgSQLiteDataDir,
-                               'load' => 100,
+                               'load' => $masterOnly ? 0 : 100,
                        ],
                        // RC replica DBs
                        3 => $srvExtra + [
@@ -618,4 +620,11 @@ class LoadBalancerTest extends MediaWikiTestCase {
                $this->assertEquals( $vslowIndexPicked, $lbWrapper->getExistingReaderIndex( 'vslow' ) );
                $this->assertEquals( 6, $vslowIndexPicked );
        }
+
+       public function testNonZeroMasterLoad() {
+               $lb = $this->newMultiServerLocalLoadBalancer( [], [ 'flags' => DBO_DEFAULT ], true );
+               // Make sure that no infinite loop occurs (T226678)
+               $rGeneric = $lb->getConnectionRef( DB_REPLICA );
+               $this->assertEquals( $lb->getWriterIndex(), $rGeneric->getLBInfo( 'serverIndex' ) );
+       }
 }