Merge "Rename JobQueueDB::getSlaveDB() to getReplicaDB()"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Mon, 31 Oct 2016 20:33:31 +0000 (20:33 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Mon, 31 Oct 2016 20:33:31 +0000 (20:33 +0000)
65 files changed:
RELEASE-NOTES-1.29
includes/MergeHistory.php
includes/WatchedItemQueryService.php
includes/api/ApiAuthManagerHelper.php
includes/api/ApiMain.php
includes/api/ApiQueryMyStashedFiles.php
includes/api/i18n/nl.json
includes/api/i18n/pl.json
includes/api/i18n/pt.json
includes/api/i18n/qqq.json
includes/api/i18n/zh-hans.json
includes/collation/IcuCollation.php
includes/debug/logger/monolog/AvroFormatter.php
includes/installer/i18n/zh-hans.json
includes/json/FormatJson.php
includes/libs/rdbms/database/DatabasePostgres.php
includes/libs/rdbms/database/DatabaseSqlite.php
includes/libs/rdbms/database/IDatabase.php
includes/libs/rdbms/database/utils/SavepointPostgres.php
includes/media/FormatMetadata.php
includes/specialpage/LoginSignupSpecialPage.php
includes/specialpage/PageQueryPage.php
includes/specialpage/QueryPage.php
includes/specialpage/WantedQueryPage.php
includes/specials/SpecialAncientpages.php
includes/specials/SpecialBrokenRedirects.php
includes/specials/SpecialLinkSearch.php
includes/specials/SpecialListDuplicatedFiles.php
includes/specials/SpecialMIMEsearch.php
includes/specials/SpecialMediaStatistics.php
includes/specials/SpecialMostcategories.php
includes/specials/SpecialMostinterwikis.php
includes/specials/SpecialMostlinked.php
includes/specials/SpecialMostlinkedcategories.php
includes/specials/SpecialMostlinkedtemplates.php
includes/specials/SpecialShortpages.php
includes/specials/SpecialUnusedcategories.php
includes/specials/SpecialUnwatchedpages.php
includes/upload/UploadBase.php
includes/utils/UIDGenerator.php
languages/i18n/bs.json
languages/i18n/da.json
languages/i18n/diq.json
languages/i18n/gl.json
languages/i18n/hy.json
languages/i18n/id.json
languages/i18n/ko.json
languages/i18n/lb.json
languages/i18n/lij.json
languages/i18n/mhr.json
languages/i18n/nan.json
languages/i18n/ne.json
languages/i18n/nl.json
languages/i18n/pt.json
languages/i18n/ru.json
languages/i18n/udm.json
languages/i18n/uk.json
languages/i18n/zh-hans.json
languages/i18n/zh-hant.json
maintenance/validateRegistrationFile.php
tests/phpunit/MediaWikiTestCase.php
tests/phpunit/includes/db/LBFactoryTest.php
tests/phpunit/includes/json/FormatJsonTest.php
tests/phpunit/includes/utils/BatchRowUpdateTest.php
tests/phpunit/structure/ExtensionJsonValidationTest.php

index 6c53809..5a38cf9 100644 (file)
@@ -20,6 +20,10 @@ production.
 === Bug fixes in 1.29 ===
 
 === Action API changes in 1.29 ===
+* Submitting sensitive authentication request parameters to action=clientlogin,
+  action=createaccount, action=linkaccount, and action=changeauthenticationdata
+  in the query string is now an error. They should be submitted in the POST
+  body instead.
 
 === Action API internal changes in 1.29 ===
 
index f797fe3..e57f880 100644 (file)
@@ -90,7 +90,8 @@ class MergeHistory {
                                        'revision',
                                        'MAX(rev_timestamp)',
                                        [
-                                               'rev_timestamp <= ' . $this->dbw->timestamp( $mwTimestamp ),
+                                               'rev_timestamp <= ' .
+                                                       $this->dbw->addQuotes( $this->dbw->timestamp( $mwTimestamp ) ),
                                                'rev_page' => $this->source->getArticleID()
                                        ],
                                        __METHOD__
@@ -118,7 +119,8 @@ class MergeHistory {
                                $this->timestampLimit = $lasttimestamp;
                        }
 
-                       $this->timeWhere = "rev_timestamp <= {$this->dbw->timestamp( $timeInsert )}";
+                       $this->timeWhere = "rev_timestamp <= " .
+                               $this->dbw->addQuotes( $this->dbw->timestamp( $timeInsert ) );
                } catch ( TimestampException $ex ) {
                        // The timestamp we got is screwed up and merge cannot continue
                        // This should be detected by $this->isValidMerge()
index 8497224..b7cdc53 100644 (file)
@@ -442,11 +442,13 @@ class WatchedItemQueryService {
 
                if ( isset( $options['start'] ) ) {
                        $after = $options['dir'] === self::DIR_OLDER ? '<=' : '>=';
-                       $conds[] = 'rc_timestamp ' . $after . ' ' . $db->addQuotes( $options['start'] );
+                       $conds[] = 'rc_timestamp ' . $after . ' ' .
+                               $db->addQuotes( $db->timestamp( $options['start'] ) );
                }
                if ( isset( $options['end'] ) ) {
                        $before = $options['dir'] === self::DIR_OLDER ? '>=' : '<=';
-                       $conds[] = 'rc_timestamp ' . $before . ' ' . $db->addQuotes( $options['end'] );
+                       $conds[] = 'rc_timestamp ' . $before . ' ' .
+                               $db->addQuotes( $db->timestamp( $options['end'] ) );
                }
 
                return $conds;
index 1a42ccc..6fafebf 100644 (file)
@@ -173,13 +173,7 @@ class ApiAuthManagerHelper {
                $this->module->getMain()->markParamsUsed( array_keys( $data ) );
 
                if ( $sensitive ) {
-                       try {
-                               $this->module->requirePostedParameters( array_keys( $sensitive ), 'noprefix' );
-                       } catch ( UsageException $ex ) {
-                               // Make this a warning for now, upgrade to an error in 1.29.
-                               $this->module->setWarning( $ex->getMessage() );
-                               $this->module->logFeatureUsage( $this->module->getModuleName() . '-params-in-query-string' );
-                       }
+                       $this->module->requirePostedParameters( array_keys( $sensitive ), 'noprefix' );
                }
 
                return AuthenticationRequest::loadRequestsFromSubmission( $reqs, $data );
index c8f4460..8deee5c 100644 (file)
@@ -1475,7 +1475,7 @@ class ApiMain extends ApiBase {
                        'ip' => $request->getIP(),
                        'userAgent' => $this->getUserAgent(),
                        'wiki' => wfWikiID(),
-                       'timeSpentBackend' => (int) round( $time * 1000 ),
+                       'timeSpentBackend' => (int)round( $time * 1000 ),
                        'hadError' => $e !== null,
                        'errorCodes' => [],
                        'params' => [],
index 9be5849..0c70a8a 100644 (file)
@@ -92,10 +92,10 @@ class ApiQueryMyStashedFiles extends ApiQueryBase {
                        ];
 
                        if ( isset( $prop['size'] ) ) {
-                               $item['size'] = (int) $row->us_size;
-                               $item['width'] = (int) $row->us_image_width;
-                               $item['height'] = (int) $row->us_image_height;
-                               $item['bits'] = (int) $row->us_image_bits;
+                               $item['size'] = (int)$row->us_size;
+                               $item['width'] = (int)$row->us_image_width;
+                               $item['height'] = (int)$row->us_image_height;
+                               $item['bits'] = (int)$row->us_image_bits;
                        }
 
                        if ( isset( $prop['type'] ) ) {
index 4b99320..89e2b21 100644 (file)
@@ -13,7 +13,8 @@
                        "Rangekill",
                        "Robin van der Vliet",
                        "Edoderoo",
-                       "Lemondoge"
+                       "Lemondoge",
+                       "Hex"
                ]
        },
        "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|Documentatie]]\n* [[mw:API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api E-maillijst]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API-aankondigingen]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Bugs & verzoeken]\n</div>\n<strong>Status:</strong> Alle functies die op deze pagina worden weergegeven horen te werken. Aan de API wordt actief gewerkt, en deze kan gewijzigd worden. Abonneer u op  de [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ e-maillijst mediawiki-api-announce] voor meldingen over aanpassingen.\n\n<strong>Foutieve verzoeken:</strong> als de API foutieve verzoeken ontvangt, wordt er geantwoord met een HTTP-header met de sleutel \"MediaWiki-API-Error\" en daarna worden de waarde van de header en de foutcode op dezelfde waarde ingesteld. Zie [[mw:API:Errors_and_warnings|API: Errors and warnings]] voor meer informatie.\n\n<strong>Testen:</strong> u kunt [[Special:ApiSandbox|eenvoudig API-verzoeken testen]].",
        "apihelp-options-description": "Voorkeuren van de huidige gebruiker wijzigen.\n\nAlleen opties die zijn geregistreerd in core of in een van de geïnstalleerde uitbreidingen, of opties met de toetsen aangeduid met <code>userjs-</code> (bedoeld om te worden gebruikt door gebruikersscripts), kunnen worden ingesteld.",
        "apihelp-options-param-reset": "Zet de voorkeuren terug naar de standaard van de website.",
        "apihelp-options-param-resetkinds": "Lijst van de optiestypes die opnieuw ingesteld worden wanneer de optie <var>$1reset</var> is ingesteld.",
-       "apihelp-options-param-change": "Lijst van wijzigingen, opgemaakt als <kbd>naam=waarde</kbd> (bijvoorbeeld <kbd>skin=vector</kbd>). De waarde kan geen sluistekens bevatten. Als er geen waarde wordt opgegeven (zelfs niet een is-gelijk teken), bijvoorbeeld, <kbd>optienaam|otheroption|...</kbd>, wordt de optie ingesteld op de standaardwaarde.",
+       "apihelp-options-param-change": "Lijst van wijzigingen, opgemaakt als <kbd>naam=waarde</kbd> (bijvoorbeeld <kbd>skin=vector</kbd>). Als er geen waarde wordt opgegeven (zelfs niet een is-gelijk teken), bijvoorbeeld <kbd>optienaam|andereoptie|...</kbd>, dan wordt de optie ingesteld op de standaardwaarde. Als een opgegeven waarde een sluisteken bevat (<kbd>|</kbd>), gebruik dan het [[Special:ApiHelp/main#main/datatypes|alternatieve scheidingsteken tussen meerdere waardes]] voor een juiste werking.",
        "apihelp-options-param-optionname": "De naam van de optie die moet worden ingesteld op de waarde gegeven door <var>$1optiewaarde</var>.",
-       "apihelp-options-param-optionvalue": "De waarde voor de optie opgegeven door <var>$1optienaam</var>, kan sluistekens (verticale streepjes) bevatten.",
+       "apihelp-options-param-optionvalue": "De waarde voor de optie opgegeven door <var>$1optionname</var>.",
        "apihelp-options-example-reset": "Alle voorkeuren opnieuw instellen.",
        "apihelp-options-example-change": "Voorkeuren wijzigen voor <kbd>skin</kbd> en <kbd>hideminor</kbd>.",
        "apihelp-parse-paramvalue-prop-categorieshtml": "Vraagt een HTML-versie van de categorieën op.",
index 7fae7ae..7de4548 100644 (file)
        "apihelp-options-description": "Zmienia preferencje bieżącego użytkownika.\n\nMożna ustawiać tylko opcje zarejestrowane w rdzeniu, w zainstalowanych rozszerzeniach lub z kluczami o prefiksie <code>userjs-</code> (do wykorzystywania przez skrypty użytkowników).",
        "apihelp-options-param-reset": "Resetuj preferencje do domyślnych.",
        "apihelp-options-param-resetkinds": "Lista typów opcji do zresetowania, jeżeli ustawiono opcję <var>$1reset</var>.",
-       "apihelp-options-param-change": "Lista zmian, w formacie nazwa=wartość (np. skin=vector). Wartość nie może zawierać znaku pionowej kreski. Jeżeli nie zostanie podana wartość (a nawet znak równości), np., optionname|otheroption|..., to opcja zostanie zresetowana do jej wartości domyślnej.",
+       "apihelp-options-param-change": "Lista zmian, w formacie nazwa=wartość (np. skin=vector).  Jeżeli nie zostanie podana wartość (nawet znak równości), np., optionname|otheroption|..., to opcja zostanie zresetowana do jej wartości domyślnej. Jeżeli jakakolwiek podawana wartość zawiera znak pionowej kreski (<kbd>|</kbd>), użyj [[Special:ApiHelp/main#main/datatypes|alternatywnego separatora wielu wartości]] aby operacja się powiodła.",
        "apihelp-options-param-optionname": "Nazwa opcji, która powinna być ustawiona na wartość <var>$1optionvalue</var>.",
        "apihelp-options-param-optionvalue": "Wartość opcji, określona w <var>$1optionname</var>.",
        "apihelp-options-example-reset": "Resetuj wszystkie preferencje.",
index b01a042..bc405fb 100644 (file)
        "apihelp-block-example-ip-simple": "Bloquear o endereço IP <kbd>192.0.2.5</kbd> por três dias com o motivo <kbd>First strike</kbd>.",
        "apihelp-block-example-user-complex": "Bloquear o utilizador <kbd>Vandal</kbd> indefinidamente com o motivo <kbd>Vandalism</kbd>, e impedir a criação de nova conta e o envio de correio eletrónico.",
        "apihelp-changeauthenticationdata-description": "Alterar os dados de autenticação do utilizador atual.",
+       "apihelp-changeauthenticationdata-example-password": "Tentar alterar a palavra-passe do utilizador atual para <kbd>ExamplePassword</kbd>.",
        "apihelp-checktoken-description": "Verificar a validade de uma chave a partir de <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>.",
        "apihelp-checktoken-param-type": "Tipo de chave que está a ser testado.",
        "apihelp-checktoken-param-token": "Chave a testar.",
        "apihelp-checktoken-param-maxtokenage": "Validade máxima da chave, em segundos.",
        "apihelp-checktoken-example-simple": "Testar a validade de uma chave <kbd>csrf</kbd>.",
+       "apihelp-clearhasmsg-description": "Limpa a indicação <code>hasmsg</code> do utilizador atual.",
+       "apihelp-clearhasmsg-example-1": "Limpar a indicação <code>hasmsg</code> do utilizador atual.",
+       "apihelp-clientlogin-description": "Entrar na wiki usando o processo interativo.",
+       "apihelp-clientlogin-example-login": "Inicia o processo de entrada na wiki com o utilizador <kbd>Example</kbd> e a palavra-passe <kbd>ExamplePassword</kbd>.",
+       "apihelp-clientlogin-example-login2": "Continuar o processo de autenticação após uma resposta  <samp>UI</samp> para autenticação de dois fatores, fornecendo uma <var>OATHToken</var> de <kbd>987654</kbd>.",
+       "apihelp-compare-description": "Obter a diferença entre 2 páginas.\n\nTêm de ser passados um número de revisão, um título de página ou um identificador de página para o \"from\" e o \"to\".",
        "apihelp-compare-param-fromtitle": "Primeiro título a comparar.",
        "apihelp-compare-param-fromid": "Primeiro identificador de página a comparar.",
        "apihelp-compare-param-fromrev": "Primeira revisão a comparar.",
        "apihelp-query+filearchive-example-simple": "Mostrar lista de todos os ficheiros eliminados",
        "apihelp-query+filerepoinfo-param-prop": "Propriedades do repositório a obter (em algumas wikis poderão haver mais disponíveis):\n;apiurl:URL para a API do repositório - útil para obter informação de imagens do servidor.\n;name:A chave para o repositório - usada, por exemplo, em <var>[[mw:Manual:$wgForeignFileRepos|$wgForeignFileRepos]]</var> e nos valores de retorno de [[Special:ApiHelp/query+imageinfo|imageinfo]].\n;displayname:O nome legível da wiki repositório.\n;rooturl:URL de raiz para endereços de imagens.\n;local:Se o repositório é o local ou não.",
        "apihelp-query+fileusage-param-prop": "Que propriedades obter:",
+       "apihelp-query+fileusage-paramvalue-prop-redirect": "Indicar se a página é um redirecionamento.",
        "apihelp-query+imageinfo-paramvalue-prop-url": "Devolve URL para o ficheiro e página de descrição.",
        "apihelp-query+imageinfo-paramvalue-prop-thumbmime": "Adiciona o tipo MIME da miniatura (requer URL e o parâmetro $1urlwidth).",
        "apihelp-query+imageinfo-param-urlwidth": "Se $2prop=url está definido, será devolvido um URL para uma imagem redimensionada com este comprimento.\nPor razões de desempenho, se esta opção for usada não serão devolvidas mais de $1 imagens redimensionadas.",
        "apihelp-query+langlinks-param-url": "Obter, ou não, o URL completo (não pode ser usado com $1prop).",
        "apihelp-query+langlinks-paramvalue-prop-url": "Adiciona o URL completo.",
        "apihelp-query+linkshere-param-prop": "Que propriedades obter:",
+       "apihelp-query+linkshere-paramvalue-prop-redirect": "Indicar se a página é um redirecionamento.",
        "apihelp-query+logevents-param-prop": "Que propriedades obter:",
        "apihelp-query+protectedtitles-param-prop": "Que propriedades obter:",
        "apihelp-query+recentchanges-paramvalue-prop-user": "Adiciona o utilizador responsável pela edição e marca se o utilizador é um endereço IP.",
+       "apihelp-query+recentchanges-paramvalue-prop-flags": "Adiciona indicações para a edição.",
        "apihelp-query+recentchanges-param-token": "Em substituição, usar <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>.",
        "apihelp-query+recentchanges-example-simple": "Lista de mudanças recentes",
        "apihelp-query+redirects-param-prop": "Que propriedades obter:",
        "apihelp-query+revisions-param-token": "Que chaves obter para cada revisão.",
        "apihelp-query+revisions+base-param-prop": "Que propriedades obter para cada revisão:",
+       "apihelp-query+revisions+base-paramvalue-prop-flags": "Indicações de revisão (menor).",
        "apihelp-query+search-param-prop": "Que propriedades devolver:",
        "apihelp-query+search-param-enablerewrites": "Ativar reescrita da consulta interna. Alguns motores de busca podem reescrever a consulta, substituindo-a por outra que consideram que dará melhores resultados, como acontece na correção de erros de ortografia.",
        "apihelp-query+siteinfo-paramvalue-prop-dbrepllag": "Devolve o servidor da base de dados com o maior atraso de replicação.",
        "apihelp-query+tokens-example-simple": "Obter uma chave csfr (padrão).",
        "apihelp-query+tokens-example-types": "Obter uma chave de vigilância e uma chave de patrulha.",
        "apihelp-query+transcludedin-param-prop": "Que propriedades obter:",
+       "apihelp-query+transcludedin-paramvalue-prop-redirect": "Indicar se a página é um redirecionamento.",
+       "apihelp-query+usercontribs-paramvalue-prop-flags": "Adiciona indicações da edição.",
        "apihelp-query+usercontribs-example-ipprefix": "Mostrar as contribuições de todos os endereços IP com o prefixo <kbd>192.0.2.</kbd>.",
        "apihelp-query+userinfo-paramvalue-prop-preferencestoken": "<span class=\"apihelp-deprecated\">Obsoleto.</span> Obter uma chave para alterar as preferências do utilizador atual.",
        "apihelp-query+userinfo-paramvalue-prop-email": "Adicionar o correio eletrónico do utilizador e a data de autenticação do correio eletrónico.",
        "apihelp-query+users-param-token": "Em substituição, usar <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>.",
+       "apihelp-query+watchlist-paramvalue-prop-flags": "Adiciona indicações para a edição.",
        "apihelp-query+watchlist-param-owner": "Usado com $1token para aceder à lista de páginas vigiadas de outro utilizador.",
        "apihelp-query+watchlist-param-token": "Uma chave de segurança (disponível nas [[Special:Preferences#mw-prefsection-watchlist|preferências]] do utilizador) para permitir acesso à lista de páginas vigiadas de outro utilizador.",
        "apihelp-query+watchlistraw-param-owner": "Usado com $1token para aceder à lista de páginas vigiadas de outro utilizador.",
        "api-help-lead": "Esta é uma página de documentação da API do MediaWiki gerada automaticamente.\n\nDocumentação e exemplos: https://www.mediawiki.org/wiki/API",
        "api-help-main-header": "Módulo principal",
        "api-help-flag-deprecated": "Este módulo está obsoleto.",
+       "api-help-flag-internal": "<strong>Este módulo é interno ou instável.</strong> O seu funcionamento pode ser alterado sem aviso prévio.",
        "api-help-flag-readrights": "Este módulo requer direitos de leitura.",
-       "api-help-flag-writerights": "Este módulo requer direitos de leitura.",
-       "api-help-flag-mustbeposted": "Este módulo aceita somente solicitações POST.",
+       "api-help-flag-writerights": "Este módulo requer direitos de escrita.",
+       "api-help-flag-mustbeposted": "Este módulo só aceita pedidos POST.",
+       "api-help-flag-generator": "Este módulo pode ser usado como gerador.",
        "api-help-source": "Fonte: $1",
+       "api-help-source-unknown": "Fonte: <span class=\"apihelp-unknown\">desconhecida</span>",
        "api-help-license": "Licença: [[$1|$2]]",
        "api-help-license-noname": "Licença: [[$1|Ver ligação]]",
        "api-help-license-unknown": "Licença: <span class=\"apihelp-unknown\">desconhecida</span>",
        "api-help-datatypes-header": "Tipo de dados",
        "api-help-datatypes": "O <i>input</i> para o MediaWiki de ser UTF-8 normalizado de acordo com a norma NFC. O MediaWiki pode converter outros tipos de entrada, mas isto pode causar que algumas operações (tais como [[Special:ApiHelp/edit|edições]] com verificações MD5) falhem.\n\nAlguns tipos de parâmetros nos pedidos à API necessitam de mais explicações:\n;boolean\n:Os parâmetros booleanos funcionam como as caixas de seleção HTML: se o parâmetro for especificado, independentemente do valor, é considerado verdadeiro. Para um valor falso, omitir o parâmetro completo.\n;timestamp\n:As datas e horas podem ser especificados em vários formatos. O formato de data e hora ISO 8601 é recomendado. Todas as horas estão em UTC, qualquer inclusão de fuso horário é ignorada.\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:* Data e hora ISO 8601 com segundos fracionários (ignorado), <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 do 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> são ignorados)\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 (o 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:* Formato C ctime, <kbd><var>Mon</var> <var>Jan</var> <var>15</var> <var>14</var>:<var>56</var>:<var>00</var> <var>2001</var></kbd>\n:* Segundos desde 1970-01-01T00:00:00Z como um inteiro de 1 a 13 dígitos (excluindo <kbd>0</kbd>)\n:* O texto <kbd>now</kbd>\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 (<i>pipe</i>), por exemplo <kbd>parâmetro=valor1|valor2</kbd> ou <kbd>parâmetro=valor1%7Cvalor2</kbd>. Se um valor contém a barra vertical, use U+001F (Separador de Unidades) como separador ''e'' prefixe o valor com U+001F, isto é, <kbd>parâmetro=%1Fvalor1%1Fvalor2</kbd>.",
        "api-help-param-type-limit": "Tipo: inteiro ou <kbd>max</kbd>",
-       "api-help-param-type-boolean": "Tipo: boolean ([[Special:ApiHelp/main#main/datatypes|detalhes]])",
+       "api-help-param-type-integer": "Tipo: {{PLURAL:$1|1=inteiro|2=lista de números inteiros}}",
+       "api-help-param-type-boolean": "Tipo: booleano ([[Special:ApiHelp/main#main/datatypes|detalhes]])",
+       "api-help-param-type-timestamp": "Tipo: {{PLURAL:$1|1=data e hora|2=lista de datas e horas}} ([[Special:ApiHelp/main#main/datatypes|formatos permitidos]])",
        "api-help-param-type-user": "Tipo: {{PLURAL:$1|1=nome de utilizador|2=lista de nomes de utilizadores}}",
        "api-help-param-list": "{{PLURAL:$1|1=Um dos seguintes valores|2=Valores (separados com <kbd>{{!}}</kbd> ou [[Special:ApiHelp/main#main/datatypes|alternativas]])}}: $2",
+       "api-help-param-list-can-be-empty": "{{PLURAL:$1|0=Tem de estar vazio|Pode estar vazio, ou ser $2}}",
+       "api-help-param-limit": "Não são permitidos mais do que: $1",
+       "api-help-param-limit2": "Não são permitidos mais do que $1 ($2 para robôs).",
+       "api-help-param-integer-min": "{{PLURAL:$1|1=O valor não pode ser inferior a|2=Os valores não podem ser inferiores a}} $2.",
+       "api-help-param-integer-max": "{{PLURAL:$1|1=O valor não pode ser superior a|2=Os valores não podem ser superiores a}} $3.",
+       "api-help-param-integer-minmax": "{{PLURAL:$1|1=O valor tem de estar compreendido|2=Os valores têm de estar compreendidos}} entre $2 e $3.",
+       "api-help-param-upload": "Tem ser enviado (<i>posted</i>) como um carregamento de ficheiro usando multipart/form-data.",
        "api-help-param-multi-separate": "Separar os valores com <kbd>|</kbd> ou [[Special:ApiHelp/main#main/datatypes|alternativas]].",
        "api-help-param-multi-max": "O número máximo de valores é {{PLURAL:$1|$1}} ({{PLURAL:$2|$2}} para robôs).",
        "api-help-param-default": "Padrão: $1",
        "api-help-param-default-empty": "Padrão: <span class=\"apihelp-empty\">(vazio)</span>",
        "api-help-param-token": "Uma chave \"$1\" obtida de [[Special:ApiHelp/query+tokens|action=query&meta=tokens]]",
        "api-help-param-token-webui": "Para efeitos de compatibilidade, a chave usada na interface <i>web</i> também é aceite.",
+       "api-help-param-disabled-in-miser-mode": "Desativado devido ao [[mw:Manual:$wgMiserMode|modo avarento]] (<i>miser mode</i>).",
+       "api-help-param-limited-in-miser-mode": "<strong>Nota:</strong> devido ao [[mw:Manual:$wgMiserMode|modo avarento]]  (<i>miser mode</i>), usar isto pode causar que menos de <var>$1limit</var> resultados sejam devolvidos antes de continuar; em casos extremos, pode não ser devolvido qualquer resultado.",
+       "api-help-param-direction": "Em que direção enumerar:\n;newer:Listar o mais antigo primeiro. Nota: $1start tem de estar antes de $1end.\n;older:Listar o mais recente primeiro (padrão). Nota: $1start tem de estar depois de $1end.",
+       "api-help-param-continue": "Quando houver mais resultados disponíveis, usar isto para continuar",
        "api-help-param-no-description": "<span class=\"apihelp-empty\">(sem descrição)</span>",
        "api-help-examples": "{{PLURAL:$1|Exemplo|Exemplos}}:",
        "api-help-permissions": "{{PLURAL:$1|Permissão|Permissões}}:",
        "api-help-permissions-granted-to": "{{PLURAL:$1|Concedida a|Concedidas a}}: $2",
+       "api-help-right-apihighlimits": "Usar limites mais altos em consultas da API (consultas lentas: $1; consultas rápidas: $2). Os limites para consultas lentas também se aplicam a parâmetros com vários valores.",
        "api-help-open-in-apisandbox": "<small>[abrir na página de testes]</small>",
        "api-help-authmanager-general-usage": "O procedimento geral para usar este módulo é:\n# Obtenha os campos disponíveis em <kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd> com <kbd>amirequestsfor=$4</kbd> e uma chave <kbd>$5</kbd> de <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>.\n# Apresente os campos ao utilizador e obtenha os dados fornecidos por este.\n# Publique-os para este módulo, fornecendo <var>$1returnurl</var> e quaisquer campos relevantes.\n# Verifique o <samp>status</samp> na resposta.\n#* Se recebeu <samp>PASS</samp> ou <samp>FAIL</samp>, terminou. A operação terá tido sucesso ou falhado.\n#* Se recebeu <samp>UI</samp>, apresente os novos campos ao utilizador e obtenha os dados fornecidos por este. Depois publique-os para este módulo com <var>$1continue</var> e os campos relevantes preenchidos, e repita o passo 4.\n#* Se recebeu <samp>REDIRECT</samp>, encaminhe o utilizador para <samp>redirecttarget</samp> e aguarde o retorno para o URL <var>$1returnurl</var>. Depois publique para este módulo com <var>$1continue</var> e quaisquer campos que tenham sido passados ao URL de retorno, e repita o passo 4.\n#* Se recebeu <samp>RESTART</samp>, isso significa que a autenticação funcionou mas não temos uma conta de utilizador associada. Pode tratá-lo como <samp>UI</samp> ou como <samp>FAIL</samp>.",
+       "api-help-authmanagerhelper-requests": "Usar só estes pedidos de autenticação, com o <samp>id</samp> devolvido por <kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd> com <kbd>amirequestsfor=$1</kbd> ou por uma resposta anterior de este módulo.",
        "api-help-authmanagerhelper-request": "Usar este pedido de autenticação, com o <samp>id</samp> devolvido por <kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd> com <kbd>amirequestsfor=$1</kbd>.",
        "api-help-authmanagerhelper-mergerequestfields": "Combinar a informação de todos os pedidos de autenticação numa única matriz.",
        "api-help-authmanagerhelper-returnurl": "O URL de retorno para fluxos de autenticação por terceiros tem de ser absoluto. É obrigatório fornecer este URL ou <var>$1continue</var>.\n\nTipicamente, após receber uma resposta <samp>REDIRECT</samp>, abrirá um <i>browser</i> ou uma <i>web view</i> para o URL <samp>redirecttarget</samp> especificado, para dar lugar ao fluxo de autenticação por terceiros. Quando o fluxo terminar, a terceira entidade enviará o <i>browser</i> ou a <i>web view</i> para este URL. Deve extrair do URL quaisquer parâmetros de consulta ou de POST, e passá-los como um pedido <var>$1continue</var> a este módulo da API.",
index 8deda75..95d6485 100644 (file)
@@ -12,7 +12,8 @@
                        "Amire80",
                        "Siebrand",
                        "Purodha",
-                       "Tacsipacsi"
+                       "Tacsipacsi",
+                       "D41D8CD98F"
                ]
        },
        "apihelp-main-description": "{{doc-apihelp-description|main}}",
        "api-help-param-deprecated": "Displayed in the API help for any deprecated parameter\n{{Identical|Deprecated}}",
        "api-help-param-required": "Displayed in the API help for any required parameter",
        "api-help-datatypes-header": "Header for the data type section in the API help output",
-       "api-help-datatypes": "{{technical}} {{doc-important|Do not translate or reformat dates inside &lt;kbd%gt; tags}} Documentation of certain API data types\nSee also:\n* [[Special:PrefixIndex/MediaWiki:api-help-param-type]]",
+       "api-help-datatypes": "{{technical}} {{doc-important|Do not translate or reformat dates inside &lt;kbd&gt; tags}} Documentation of certain API data types\nSee also:\n* [[Special:PrefixIndex/MediaWiki:api-help-param-type]]",
        "api-help-param-type-limit": "{{technical}} {{doc-important|Do not translate text inside &lt;kbd&gt; tags}} Used to indicate that a parameter is a \"limit\" type. Parameters:\n* $1 - Always 1.\nSee also:\n* {{msg-mw|api-help-datatypes}}\n* [[Special:PrefixIndex/MediaWiki:api-help-param-type]]",
        "api-help-param-type-integer": "{{technical}} Used to indicate that a parameter is an integer or list of integers. Parameters:\n* $1 - 1 if the parameter takes one value, 2 if the parameter takes a list of values.\nSee also:\n* {{msg-mw|api-help-datatypes}}\n* [[Special:PrefixIndex/MediaWiki:api-help-param-type]]",
        "api-help-param-type-boolean": "{{technical}} {{doc-important|Do not translate <code>Special:ApiHelp</code> in this message.}} Used to indicate that a parameter is a boolean. Parameters:\n* $1 - Always 1.\nSee also:\n* {{msg-mw|api-help-datatypes}}\n* [[Special:PrefixIndex/MediaWiki:api-help-param-type]]",
index f498189..a2310cb 100644 (file)
@@ -64,7 +64,7 @@
        "apihelp-clientlogin-description": "使用交互式流登录wiki。",
        "apihelp-clientlogin-example-login": "开始作为用户<kbd>Example</kbd>和密码<kbd>ExamplePassword</kbd>登录至wiki的过程。",
        "apihelp-clientlogin-example-login2": "在<samp>UI</samp>响应双因素验证后继续登录,补充<var>OATHToken</var> <kbd>987654</kbd>。",
-       "apihelp-compare-description": "获取2个页面之间的差别。\n\n用于“from”和“to”的修订版本号、页面标题或页面 ID 必须获得通过。",
+       "apihelp-compare-description": "获取2个页面之间的差别。\n\n必须传递用于“from”和“to”的修订版本号、页面标题或页面 ID 。",
        "apihelp-compare-param-fromtitle": "要比较的第一个标题。",
        "apihelp-compare-param-fromid": "要比较的第一个页面 ID。",
        "apihelp-compare-param-fromrev": "要比较的第一个修订版本。",
        "apihelp-edit-param-minor": "小编辑。",
        "apihelp-edit-param-notminor": "不是小编辑。",
        "apihelp-edit-param-bot": "标记此编辑为机器人编辑。",
-       "apihelp-edit-param-basetimestamp": "基础修订的时间戳,用于检测编辑冲突。也许可以通过[[Special:ApiHelp/query+revisions|action=query&prop=revisions&rvprop=timestamp]]得到。",
+       "apihelp-edit-param-basetimestamp": "基础修订的时间戳,用于检测编辑冲突。可以通过[[Special:ApiHelp/query+revisions|action=query&prop=revisions&rvprop=timestamp]]得到。",
        "apihelp-edit-param-starttimestamp": "编辑过程开始的时间戳,用于检测编辑冲突。当开始编辑过程时(例如当加载要编辑的页面时)使用<var>[[Special:ApiHelp/main|curtimestamp]]</var>可能取得一个适当的值。",
        "apihelp-edit-param-recreate": "覆盖有关该页面在此期间已被删除的任何错误。",
        "apihelp-edit-param-createonly": "不要编辑页面,如果已经存在。",
        "apihelp-options-description": "更改当前用户的偏好设置。\n\n只有注册在核心或者已安装扩展中的选项,或者具有<code>userjs-</code>键值前缀(旨在被用户脚本使用)的选项可被设置。",
        "apihelp-options-param-reset": "将参数设置重置为网站默认值。",
        "apihelp-options-param-resetkinds": "当<var>$1reset</var>选项被设置时,要重置的选项类型列表。",
-       "apihelp-options-param-change": "更改列表,以name=value格式化(例如skin=vector)。如果没提供值(甚至没有等号),例如optionname|otheroption|...,选项将重置为默认值。如果任何通过的值包含管道字符(<kbd>|</kbd>),请改用[[Special:ApiHelp/main#main/datatypes|替代多值分隔符]]以正确操作。",
+       "apihelp-options-param-change": "更改列表,以name=value格式化(例如skin=vector)。如果没提供值(甚至没有等号),例如optionname|otheroption|...,选项将重置为默认值。如果任何传递的值包含管道字符(<kbd>|</kbd>),请改用[[Special:ApiHelp/main#main/datatypes|替代多值分隔符]]以正确操作。",
        "apihelp-options-param-optionname": "应设置为由<var>$1optionvalue</var>提供值的选项名称。",
        "apihelp-options-param-optionvalue": "用于由<var>$1optionname</var>指定的选项的值。",
        "apihelp-options-example-reset": "重置所有用户设置。",
        "apihelp-query+search-paramvalue-prop-wordcount": "添加页面的字数。",
        "apihelp-query+search-paramvalue-prop-timestamp": "添加页面上次编辑时的时间戳。",
        "apihelp-query+search-paramvalue-prop-snippet": "添加已解析的页面片段。",
-       "apihelp-query+search-paramvalue-prop-titlesnippet": "Adds a parsed snippet of the page title.",
+       "apihelp-query+search-paramvalue-prop-titlesnippet": "添加已解析的页面标题片段。",
        "apihelp-query+search-paramvalue-prop-redirectsnippet": "添加被解析的重定向标题的片段。",
        "apihelp-query+search-paramvalue-prop-redirecttitle": "添加匹配的重定向的标题。",
-       "apihelp-query+search-paramvalue-prop-sectionsnippet": "Adds a parsed snippet of the matching section title.",
+       "apihelp-query+search-paramvalue-prop-sectionsnippet": "添加已解析的匹配章节标题片段。",
        "apihelp-query+search-paramvalue-prop-sectiontitle": "添加匹配章节的标题。",
        "apihelp-query+search-paramvalue-prop-categorysnippet": "Adds a parsed snippet of the matching category.",
        "apihelp-query+search-paramvalue-prop-isfilematch": "添加布尔值,表明搜索是否匹配文件内容。",
        "apihelp-query+userinfo-paramvalue-prop-implicitgroups": "列举当前用户的所有自动成为成员的用户组。",
        "apihelp-query+userinfo-paramvalue-prop-rights": "列举当前用户拥有的所有权限。",
        "apihelp-query+userinfo-paramvalue-prop-changeablegroups": "Lists the groups the current user can add to and remove from.",
-       "apihelp-query+userinfo-paramvalue-prop-options": "Lists all preferences the current user has set.",
+       "apihelp-query+userinfo-paramvalue-prop-options": "列举当前用户设置的所有参数设置。",
        "apihelp-query+userinfo-paramvalue-prop-preferencestoken": "<span class=\"apihelp-deprecated\">已弃用。</span>获取令牌以更改当前用户的参数设置。",
        "apihelp-query+userinfo-paramvalue-prop-editcount": "添加当前用户的编辑计数。",
        "apihelp-query+userinfo-paramvalue-prop-ratelimits": "Lists all rate limits applying to the current user.",
        "apihelp-query+userinfo-paramvalue-prop-realname": "添加用户的真实姓名。",
-       "apihelp-query+userinfo-paramvalue-prop-email": "Adds the user's email address and email authentication date.",
+       "apihelp-query+userinfo-paramvalue-prop-email": "添加用户的电子邮件地址及电子邮件验证日期。",
        "apihelp-query+userinfo-paramvalue-prop-acceptlang": "重复由客户端以结构化格式发送的<code>Accept-Language</code>标头。",
        "apihelp-query+userinfo-paramvalue-prop-registrationdate": "添加用户的注册时间。",
        "apihelp-query+userinfo-paramvalue-prop-unreadcount": "添加用户监视列表上的未独页面计数(最高$1;如果更多则返回<samp>$2</samp>)。",
        "apihelp-query+users-param-prop": "要包含的信息束:",
        "apihelp-query+users-paramvalue-prop-blockinfo": "如果用户被封禁就标记,并注明是谁封禁,以何种原因封禁的。",
        "apihelp-query+users-paramvalue-prop-groups": "列举每位用户属于的所有组。",
-       "apihelp-query+users-paramvalue-prop-implicitgroups": "Lists all the groups a user is automatically a member of.",
+       "apihelp-query+users-paramvalue-prop-implicitgroups": "列举用户自动作为成员之一的所有组。",
        "apihelp-query+users-paramvalue-prop-rights": "列举每位用户拥有的所有权限。",
        "apihelp-query+users-paramvalue-prop-editcount": "添加用户的编辑计数。",
        "apihelp-query+users-paramvalue-prop-registration": "添加用户的注册时间戳。",
        "api-help-param-deprecated": "已弃用。",
        "api-help-param-required": "这个参数是必须的。",
        "api-help-datatypes-header": "数据类型",
-       "api-help-datatypes": "至MediaWiki的输入应为NFC标准化的UTF-8。MediaWiki可以尝试转换其他输入,但这可能导致一些操作失败(例如[[Special:ApiHelp/edit|edits]]与MD5校验)。\n\n一些在API请求中的参数类型需要更进一步解释:\n;boolean\n:布尔参数就像HTML复选框一样工作:如果指定参数,无论何值都被认为是真。如果要假值,则可完全忽略参数。\n;timestamp\n:时间戳可被指定为很多格式。推荐使用ISO 8601日期和时间标准。所有时间为UTC时间,包含的任何时区会被忽略。\n:* ISO 8601日期和时间,<kbd><var>2001</var>-<var>01</var>-<var>15</var>T<var>14</var>:<var>56</var>:<var>00</var>Z</kbd>(标点和<kbd>Z</kbd>是可选项)\n:* 带小数秒(会被忽略)的ISO 8601日期和时间,<kbd><var>2001</var>-<var>01</var>-<var>15</var>T<var>14</var>:<var>56</var>:<var>00</var>.<var>00001</var>Z</kbd>(破折号、括号和<kbd>Z</kbd>是可选的)\n:* MediaWiki格式,<kbd><var>2001</var><var>01</var><var>15</var><var>14</var><var>56</var><var>00</var></kbd>\n:* 一般数字格式,<kbd><var>2001</var>-<var>01</var>-<var>15</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>(<kbd>GMT</kbd>、<kbd>+<var>##</var></kbd>或<kbd>-<var>##</var></kbd>的可选时区会被忽略)\n:* EXIF格式,<kbd><var>2001</var>:<var>01</var>:<var>15</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* RFC 2822格式(时区可能会被省略),<kbd><var>Mon</var>, <var>15</var> <var>Jan</var> <var>2001</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* RFC 850格式(时区可能会被省略),<kbd><var>Monday</var>, <var>15</var>-<var>Jan</var>-<var>2001</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* C ctime格式,<kbd><var>Mon</var> <var>Jan</var> <var>15</var> <var>14</var>:<var>56</var>:<var>00</var> <var>2001</var></kbd>\n:* 秒数是从1970-01-01T00:00:00Z开始,作为1到13位数的整数(除了<kbd>0</kbd>)\n:* 字符串<kbd>now</kbd>\n;替代多值分隔符\n:使用多个值的参数通常会与管道符号分隔的值一起提交,例如<kbd>param=value1|value2</kbd>或<kbd>param=value1%7Cvalue2</kbd>。如果值必须包含管道符号,使用U+001F(单位分隔符)作为分隔符,''并''在值前加前缀U+001F,例如<kbd>param=%1Fvalue1%1Fvalue2</kbd>。",
+       "api-help-datatypes": "至MediaWiki的输入应为NFC标准化的UTF-8。MediaWiki可以尝试转换其他输入,但这可能导致一些操作失败(例如带MD5校验[[Special:ApiHelp/edit|编辑]])。\n\n一些在API请求中的参数类型需要更进一步解释:\n;boolean\n:布尔参数就像HTML复选框一样工作:如果指定参数,无论何值都被认为是真。如果要假值,则可完全忽略参数。\n;timestamp\n:时间戳可被指定为很多格式。推荐使用ISO 8601日期和时间标准。所有时间为UTC时间,包含的任何时区会被忽略。\n:* ISO 8601日期和时间,<kbd><var>2001</var>-<var>01</var>-<var>15</var>T<var>14</var>:<var>56</var>:<var>00</var>Z</kbd>(标点和<kbd>Z</kbd>是可选项)\n:* 带小数秒(会被忽略)的ISO 8601日期和时间,<kbd><var>2001</var>-<var>01</var>-<var>15</var>T<var>14</var>:<var>56</var>:<var>00</var>.<var>00001</var>Z</kbd>(破折号、冒号和<kbd>Z</kbd>是可选的)\n:* MediaWiki格式,<kbd><var>2001</var><var>01</var><var>15</var><var>14</var><var>56</var><var>00</var></kbd>\n:* 一般数字格式,<kbd><var>2001</var>-<var>01</var>-<var>15</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>(<kbd>GMT</kbd>、<kbd>+<var>##</var></kbd>或<kbd>-<var>##</var></kbd>的可选时区会被忽略)\n:* EXIF格式,<kbd><var>2001</var>:<var>01</var>:<var>15</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* RFC 2822格式(时区可省略),<kbd><var>Mon</var>, <var>15</var> <var>Jan</var> <var>2001</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* RFC 850格式(时区可省略),<kbd><var>Monday</var>, <var>15</var>-<var>Jan</var>-<var>2001</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* C ctime格式,<kbd><var>Mon</var> <var>Jan</var> <var>15</var> <var>14</var>:<var>56</var>:<var>00</var> <var>2001</var></kbd>\n:* 从1970-01-01T00:00:00Z开始的秒数,作为1到13位数的整数(除了<kbd>0</kbd>)\n:* 字符串<kbd>now</kbd>\n;替代多值分隔符\n:使用多个值的参数通常会与管道符号分隔的值一起提交,例如<kbd>param=value1|value2</kbd>或<kbd>param=value1%7Cvalue2</kbd>。如果值必须包含管道符号,使用U+001F(单位分隔符)作为分隔符,''并''在值前加前缀U+001F,例如<kbd>param=%1Fvalue1%1Fvalue2</kbd>。",
        "api-help-param-type-limit": "类型:整数或<kbd>max</kbd>",
        "api-help-param-type-integer": "类型:{{PLURAL:$1|1=整数|2=整数列表}}",
        "api-help-param-type-boolean": "类型:布尔值([[Special:ApiHelp/main#main/datatypes|详细信息]])",
        "api-help-param-integer-minmax": "{{PLURAL:$1|值}}必须介于$2和$3之间。",
        "api-help-param-upload": "必须被公布为使用multipart/form-data的一次文件上传。",
        "api-help-param-multi-separate": "通过<kbd>|</kbd>或[[Special:ApiHelp/main#main/datatypes|替代物]]隔开各值。",
-       "api-help-param-multi-max": "值的最高数字是{{PLURAL:$1|$1}}(对于机器人则是{{PLURAL:$2|$2}})。",
+       "api-help-param-multi-max": "值的最大数量是{{PLURAL:$1|$1}}(对于机器人则是{{PLURAL:$2|$2}})。",
        "api-help-param-default": "默认:$1",
        "api-help-param-default-empty": "默认:<span class=\"apihelp-empty\">(空)</span>",
        "api-help-param-token": "从[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]取回的“$1”令牌",
index 9c0b96e..4110472 100644 (file)
@@ -133,48 +133,106 @@ class IcuCollation extends Collation {
                'vi' => [ "Ă", "Â", "Đ", "Ê", "Ô", "Ơ", "Ư" ],
                // Not verified, but likely correct
                'af' => [],
-               'ast' => [ "Ch", "Ll", "Ñ" ],
+               'am' => [],
+               'ar' => [],
+               'as' => [ "\xe0\xa6\x82", "\xe0\xa6\x81", "\xe0\xa6\x83", "\xe0\xa7\x8e", "ক্ষ " ],
+               'ast' => [ "Ch", "Ll", "Ñ" ], // Not in libicu?
                'az' => [ "Ç", "Ə", "Ğ", "İ", "Ö", "Ş", "Ü" ],
                'bg' => [],
+               'bo' => [],
                'br' => [ "Ch", "C'h" ],
+               'bs-Cyrl' => [],
                'ca' => [],
-               'co' => [],
+               'chr' => [],
+               'co' => [], // Not in libicu?
                'da' => [ "Æ", "Ø", "Å" ],
                'de' => [],
+               'de-AT@collation=phonebook' => [ 'ä', 'ö', 'ü', 'ß' ],
                'dsb' => [ "Č", "Ć", "Dź", "Ě", "Ch", "Ł", "Ń", "Ŕ", "Š", "Ś", "Ž", "Ź" ],
+               'ee' => [ "Dz", "Ɖ", "Ɛ", "Ƒ", "Gb", "Ɣ", "Kp", "Ny", "Ŋ", "Ɔ", "Ts", "Ʋ" ],
                'el' => [],
                'eo' => [ "Ĉ", "Ĝ", "Ĥ", "Ĵ", "Ŝ", "Ŭ" ],
                'es' => [ "Ñ" ],
                'et' => [ "Š", "Ž", "Õ", "Ä", "Ö", "Ü", "W" ], // added W for CollationEt (xx-uca-et)
-               'eu' => [ "Ñ" ],
+               'eu' => [ "Ñ" ], // Not in libicu?
+               'fil' => [ "Ñ", "Ng" ],
                'fo' => [ "Á", "Ð", "Í", "Ó", "Ú", "Ý", "Æ", "Ø", "Å" ],
-               'fur' => [ "À", "Á", "Â", "È", "Ì", "Ò", "Ù" ],
-               'fy' => [],
+               'fr-CA' => [], // fr-CA sorts accents slightly different from fr.
+               'fur' => [ "À", "Á", "Â", "È", "Ì", "Ò", "Ù" ], // not in libicu
+               'fy' => [], // not in libicu
                'ga' => [],
-               'gd' => [],
+               'gd' => [], // not in libicu
                'gl' => [ "Ch", "Ll", "Ñ" ],
+               'gu' => [ "\xe0\xaa\x82", "\xe0\xaa\x83", "\xe0\xaa\x81", "\xe0\xaa\xb3" ],
+               'ha' => [ 'Ɓ', 'Ɗ', 'Ƙ', 'Sh', 'Ts', 'Ƴ' ],
+               'haw' => [ 'ʻ' ],
+               'he' => [],
+               'hi' => [ "\xe0\xa4\x82", "\xe0\xa4\x83" ],
+               'hy' => [ "և" ],
+               'id' => [],
+               'ig' => [ "Ch", "Gb", "Gh", "Gw", "Ị", "Kp", "Kw", "Ṅ", "Nw", "Ny", "Ọ", "Sh", "Ụ" ],
+               'ka' => [],
+               'km' => [
+                       "រ", "ឫ", "ឬ", "ល", "ឭ", "ឮ", "\xe1\x9e\xbb\xe1\x9f\x86",
+                       "\xe1\x9f\x86", "\xe1\x9e\xb6\xe1\x9f\x86", "\xe1\x9f\x87",
+                       "\xe1\x9e\xb7\xe1\x9f\x87", "\xe1\x9e\xbb\xe1\x9f\x87",
+                       "\xe1\x9f\x81\xe1\x9f\x87", "\xe1\x9f\x84\xe1\x9f\x87",
+               ],
+               'kn' => [ "\xe0\xb2\x81", "\xe0\xb2\x83", "\xe0\xb3\xb1", "\xe0\xb3\xb2" ],
+               'kok' => [ "\xe0\xa4\x82", "\xe0\xa4\x83", "ळ", "क्ष" ],
                'kk' => [ "Ү", "І" ],
                'kl' => [ "Æ", "Ø", "Å" ],
-               'ku' => [ "Ç", "Ê", "Î", "Ş", "Û" ],
+               'ku' => [ "Ç", "Ê", "Î", "Ş", "Û" ], // ku is not in libicu
                'ky' => [ "Ё" ],
-               'la' => [],
+               'la' => [], // la is not in libicu
                'lb' => [],
-               'mo' => [ "Ă", "Â", "Î", "Ş", "Ţ" ],
+               'lkt' => [ 'Č', 'Ǧ', 'Ȟ', 'Š', 'Ž' ],
+               'ln' => [ 'Ɛ' ],
+               'lo' => [],
+               'ml' => [],
+               'mn' => [],
+               'mr' => [ "\xe0\xa4\x82", "\xe0\xa4\x83", "ळ", "क्ष", "ज्ञ" ],
+               'mo' => [ "Ă", "Â", "Î", "Ş", "Ţ" ], // no mo in libicu
+               'ms' => [],
                'mt' => [ "Ċ", "Ġ", "Għ", "Ħ", "Ż" ],
+               'nb' => [ "Æ", "Ø", "Å" ],
+               'ne' => [],
+               'nn' => [ "Æ", "Ø", "Å" ],
+               // no is not in the libicu list. You should probably use nb or nn instead.
                'no' => [ "Æ", "Ø", "Å" ],
-               'oc' => [],
-               'rm' => [],
+               'oc' => [], // not in libicu
+               'om' => [ 'Ch', 'Dh', 'Kh', 'Ny', 'Ph', 'Sh' ],
+               'or' => [ "\xe0\xac\x81", "\xe0\xac\x82", "\xe0\xac\x83", "କ୍ଷ" ],
+               'pa' => [ "\xe0\xa9\x8d" ],
+               'rm' => [], // not in libicu
                'ro' => [ "Ă", "Â", "Î", "Ş", "Ţ" ],
-               'rup' => [ "Ă", "Â", "Î", "Ľ", "Ń", "Ş", "Ţ" ],
+               'rup' => [ "Ă", "Â", "Î", "Ľ", "Ń", "Ş", "Ţ" ], // not in libicu
                'sco' => [],
+               'se' => [
+                       'Á', 'Č', 'Ʒ', 'Ǯ', 'Đ', 'Ǧ', 'Ǥ', 'Ǩ', 'Ŋ',
+                       'Š', 'Ŧ', 'Ž', 'Ø', 'Æ', 'Ȧ', 'Ä', 'Ö'
+               ],
+               'si' => [ "\xe0\xb6\x82", "\xe0\xb6\x83", "\xe0\xb6\xa4" ],
                'sl' => [ "Č", "Š", "Ž" ],
                'smn' => [ "Á", "Č", "Đ", "Ŋ", "Š", "Ŧ", "Ž", "Æ", "Ø", "Å", "Ä", "Ö" ],
                'sq' => [ "Ç", "Dh", "Ë", "Gj", "Ll", "Nj", "Rr", "Sh", "Th", "Xh", "Zh" ],
+               'sr-Latn' => [ "Č", "Ć", "Dž", "Đ", "Lj", "Nj", "Š", "Ž" ],
+               'sw' => [],
+               'te' => [ "\xe0\xb0\x81", "\xe0\xb0\x82", "\xe0\xb0\x83" ],
+               'th' => [ "ฯ", "\xe0\xb9\x86", "\xe0\xb9\x8d", "\xe0\xb8\xba" ],
                'tk' => [ "Ç", "Ä", "Ž", "Ň", "Ö", "Ş", "Ü", "Ý" ],
-               'tl' => [ "Ñ", "Ng" ],
+               'tl' => [ "Ñ", "Ng" ], // not in libicu
+               'to' => [ "Ng", "ʻ" ],
                'tr' => [ "Ç", "Ğ", "İ", "Ö", "Ş", "Ü" ],
-               'tt' => [ "Ә", "Ө", "Ү", "Җ", "Ң", "Һ" ],
-               'uz' => [ "Ch", "G'", "Ng", "O'", "Sh" ],
+               'tt' => [ "Ә", "Ө", "Ү", "Җ", "Ң", "Һ" ], // not in libicu
+               'uz' => [ "Ch", "G'", "Ng", "O'", "Sh" ], // not in libicu
+               'vo' => [ "Ä", "Ö", "Ü" ],
+               'yi' => [
+                       "\xd7\x91\xd6\xbf", "\xd7\x9b\xd6\xbc", "\xd7\xa4\xd6\xbc",
+                       "\xd7\xa9\xd7\x82", "\xd7\xaa\xd6\xbc"
+               ],
+               'yo' => [ "Ẹ", "Gb", "Ọ", "Ṣ" ],
+               'zu' => [],
        ];
 
        /**
index f1a01fe..ce0cda1 100644 (file)
@@ -155,7 +155,7 @@ class AvroFormatter implements FormatterInterface {
         */
        public function getSchemaRevisionId( $channel ) {
                if ( isset( $this->schemas[$channel]['revision'] ) ) {
-                       return (int) $this->schemas[$channel]['revision'];
+                       return (int)$this->schemas[$channel]['revision'];
                }
                return null;
        }
index 5d99079..2b7e705 100644 (file)
        "config-header-oracle": "Oracle设置",
        "config-header-mssql": "Microsoft SQL Server设置",
        "config-invalid-db-type": "无效的数据库类型",
-       "config-missing-db-name": "您必须为“{{int:config-db-name}}”输入内容。",
-       "config-missing-db-host": "您必须为“{{int:config-db-host}}”输入内容。",
-       "config-missing-db-server-oracle": "您必须为“{{int:config-db-host-oracle}}”输入内容。",
+       "config-missing-db-name": "您必须为“{{int:config-db-name}}”输入一个值。",
+       "config-missing-db-host": "您必须为“{{int:config-db-host}}”输入一个值。",
+       "config-missing-db-server-oracle": "您必须为“{{int:config-db-host-oracle}}”输入一个值。",
        "config-invalid-db-server-oracle": "无效的数据库TNS“$1”。请使用“TNS 名称”或者一个“轻松连接”字符串([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Oracle 命名方法])",
        "config-invalid-db-name": "无效的数据库名称“$1”。请只使用ASCII字母(a-z、A-Z)、数字(0-9)、下划线(_)和连字号(-)。",
        "config-invalid-db-prefix": "无效的数据库前缀“$1”。请只使用ASCII字母(a-z、A-Z)、数字(0-9)、下划线(_)和连字号(-)。",
        "config-mysql-utf8": "UTF-8",
        "config-mysql-charset-help": "在<strong>二进制模式</strong>下,MediaWiki会将UTF-8编码的文本存于数据库的二进制字段中。相对于MySQL的UTF-8模式,这种方法效率更高,并允许您使用全范围的Unicode字符。\n\n在<strong>UTF-8模式</strong>下,MySQL将知道您数据使用的字符集,并能适当地提供和转换内容。但这样做您将无法在数据库中存储[https://zh.wikipedia.org/wiki/基本多文种平面 基本多文种平面]以外的字符。",
        "config-mssql-auth": "身份验证类型:",
-       "config-mssql-install-auth": "选择安装过程中链接数据库时将采用的身份验证方式。\n如果您选择“{{int:config-mssql-windowsauth}}”,将使用运行服务器的用户的身份凭据。",
-       "config-mssql-web-auth": "选择Web服务器在通常wiki操作期间用来连接数据库服务器的身份验证方式。\n如果您选择“{{int:config-mssql-windowsauth}}”,将使用运行Web服务器的用户的凭据。",
+       "config-mssql-install-auth": "选择安装过程中链接数据库时将采用的身份验证方式。如果您选择“{{int:config-mssql-windowsauth}}”,将使用运行服务器的用户的身份凭据。",
+       "config-mssql-web-auth": "选择Web服务器在通常wiki操作期间用来连接数据库服务器的身份验证方式。如果您选择“{{int:config-mssql-windowsauth}}”,将使用运行Web服务器的用户的凭据。",
        "config-mssql-sqlauth": "SQL Server 身份验证",
        "config-mssql-windowsauth": "Windows 身份验证",
        "config-site-name": "wiki的名称:",
        "config-license-gfdl": "GNU自由文档许可证1.3或更高版本",
        "config-license-pd": "公有领域",
        "config-license-cc-choose": "选择自定义的知识共享许可证",
-       "config-license-help": "许多公共wiki将所有用户贡献置于[http://freedomdefined.org/Definition 自由许可证]之下。这有助于构建社区的主人翁意识,并鼓励长期贡献。对于非公共wiki或公司wiki,这并非必要条件。\n\n如果您希望使用来自维基百科的内容,并希望维基百科能接受复制自您的wiki的内容,您应当选择<strong>{{int:config-license-cc-by-sa}}</strong>\n\nGNU自由文档许可证是维基百科曾经使用过的许可证,并迄今有效。然而,该许可证难以理解,并会增加重用内容的难度。",
+       "config-license-help": "许多公共wiki将所有用户贡献置于[http://freedomdefined.org/Definition 自由许可证]之下。这有助于构建社区的主人翁意识,并鼓励长期贡献。对于非公共wiki或公司wiki,这并非必要条件。\n\n如果您希望使用来自维基百科的内容,并希望维基百科能接受复制自您的wiki的内容,您应当选择<strong>{{int:config-license-cc-by-sa}}</strong>\n\nGNU自由文档许可证是维基百科曾经使用过的许可证,并迄今有效。然而,该许可证难以理解,并会增加重用内容的难度。",
        "config-email-settings": "电子邮件设置",
        "config-enable-email": "启用出站电子邮件",
        "config-enable-email-help": "如果您希望使用电子邮件功能,请正确配置[http://www.php.net/manual/en/mail.configuration.php PHP的邮件设定]。如果您不需要任何电子邮件功能,请在此处禁用它。",
index 775ab43..41541ef 100644 (file)
@@ -271,7 +271,7 @@ class FormatJson {
         */
        public static function stripComments( $json ) {
                // Ensure we have a string
-               $str = (string) $json;
+               $str = (string)$json;
                $buffer = '';
                $maxLen = strlen( $str );
                $mark = 0;
index 7e40495..d4d3aa8 100644 (file)
@@ -48,19 +48,19 @@ class DatabasePostgres extends Database {
                parent::__construct( $params );
        }
 
-       function getType() {
+       public function getType() {
                return 'postgres';
        }
 
-       function implicitGroupby() {
+       public function implicitGroupby() {
                return false;
        }
 
-       function implicitOrderby() {
+       public function implicitOrderby() {
                return false;
        }
 
-       function hasConstraint( $name ) {
+       public function hasConstraint( $name ) {
                $conn = $this->getBindingHandle();
 
                $sql = "SELECT 1 FROM pg_catalog.pg_constraint c, pg_catalog.pg_namespace n " .
@@ -72,16 +72,7 @@ class DatabasePostgres extends Database {
                return $this->numRows( $res );
        }
 
-       /**
-        * Usually aborts on failure
-        * @param string $server
-        * @param string $user
-        * @param string $password
-        * @param string $dbName
-        * @throws DBConnectionError|Exception
-        * @return resource|bool|null
-        */
-       function open( $server, $user, $password, $dbName ) {
+       public function open( $server, $user, $password, $dbName ) {
                # Test for Postgres support, to avoid suppressed fatal error
                if ( !function_exists( 'pg_connect' ) ) {
                        throw new DBConnectionError(
@@ -153,7 +144,7 @@ class DatabasePostgres extends Database {
 
                $this->determineCoreSchema( $this->mSchema );
                // The schema to be used is now in the search path; no need for explicit qualification
-               $this->mSchema = null;
+               $this->mSchema = '';
 
                return $this->mConn;
        }
@@ -164,7 +155,7 @@ class DatabasePostgres extends Database {
         * @param string $db
         * @return bool
         */
-       function selectDB( $db ) {
+       public function selectDB( $db ) {
                if ( $this->mDBname !== $db ) {
                        return (bool)$this->open( $this->mServer, $this->mUser, $this->mPassword, $db );
                } else {
@@ -172,7 +163,11 @@ class DatabasePostgres extends Database {
                }
        }
 
-       function makeConnectionString( $vars ) {
+       /**
+        * @param string[] $vars
+        * @return string
+        */
+       private function makeConnectionString( $vars ) {
                $s = '';
                foreach ( $vars as $name => $value ) {
                        $s .= "$name='" . str_replace( "'", "\\'", $value ) . "' ";
@@ -181,11 +176,6 @@ class DatabasePostgres extends Database {
                return $s;
        }
 
-       /**
-        * Closes a database connection, if it is open
-        * Returns success, true if already closed
-        * @return bool
-        */
        protected function closeConnection() {
                return $this->mConn ? pg_close( $this->mConn ) : true;
        }
@@ -231,7 +221,7 @@ class DatabasePostgres extends Database {
                }
        }
 
-       function reportQueryError( $error, $errno, $sql, $fname, $tempIgnore = false ) {
+       public function reportQueryError( $error, $errno, $sql, $fname, $tempIgnore = false ) {
                if ( $tempIgnore ) {
                        /* Check for constraint violation */
                        if ( $errno === '23505' ) {
@@ -249,15 +239,7 @@ class DatabasePostgres extends Database {
                parent::reportQueryError( $error, $errno, $sql, $fname, false );
        }
 
-       function queryIgnore( $sql, $fname = __METHOD__ ) {
-               return $this->query( $sql, $fname, true );
-       }
-
-       /**
-        * @param stdClass|ResultWrapper $res
-        * @throws DBUnexpectedError
-        */
-       function freeResult( $res ) {
+       public function freeResult( $res ) {
                if ( $res instanceof ResultWrapper ) {
                        $res = $res->result;
                }
@@ -269,12 +251,7 @@ class DatabasePostgres extends Database {
                }
        }
 
-       /**
-        * @param ResultWrapper|stdClass $res
-        * @return stdClass
-        * @throws DBUnexpectedError
-        */
-       function fetchObject( $res ) {
+       public function fetchObject( $res ) {
                if ( $res instanceof ResultWrapper ) {
                        $res = $res->result;
                }
@@ -296,7 +273,7 @@ class DatabasePostgres extends Database {
                return $row;
        }
 
-       function fetchRow( $res ) {
+       public function fetchRow( $res ) {
                if ( $res instanceof ResultWrapper ) {
                        $res = $res->result;
                }
@@ -315,7 +292,7 @@ class DatabasePostgres extends Database {
                return $row;
        }
 
-       function numRows( $res ) {
+       public function numRows( $res ) {
                if ( $res instanceof ResultWrapper ) {
                        $res = $res->result;
                }
@@ -334,7 +311,7 @@ class DatabasePostgres extends Database {
                return $n;
        }
 
-       function numFields( $res ) {
+       public function numFields( $res ) {
                if ( $res instanceof ResultWrapper ) {
                        $res = $res->result;
                }
@@ -342,7 +319,7 @@ class DatabasePostgres extends Database {
                return pg_num_fields( $res );
        }
 
-       function fieldName( $res, $n ) {
+       public function fieldName( $res, $n ) {
                if ( $res instanceof ResultWrapper ) {
                        $res = $res->result;
                }
@@ -356,16 +333,11 @@ class DatabasePostgres extends Database {
         *
         * @return int|null
         */
-       function insertId() {
+       public function insertId() {
                return $this->mInsertId;
        }
 
-       /**
-        * @param mixed $res
-        * @param int $row
-        * @return bool
-        */
-       function dataSeek( $res, $row ) {
+       public function dataSeek( $res, $row ) {
                if ( $res instanceof ResultWrapper ) {
                        $res = $res->result;
                }
@@ -373,7 +345,7 @@ class DatabasePostgres extends Database {
                return pg_result_seek( $res, $row );
        }
 
-       function lastError() {
+       public function lastError() {
                if ( $this->mConn ) {
                        if ( $this->mLastResult ) {
                                return pg_result_error( $this->mLastResult );
@@ -385,7 +357,7 @@ class DatabasePostgres extends Database {
                return $this->getLastPHPError() ?: 'No database connection';
        }
 
-       function lastErrno() {
+       public function lastErrno() {
                if ( $this->mLastResult ) {
                        return pg_result_error_field( $this->mLastResult, PGSQL_DIAG_SQLSTATE );
                } else {
@@ -393,7 +365,7 @@ class DatabasePostgres extends Database {
                }
        }
 
-       function affectedRows() {
+       public function affectedRows() {
                if ( !is_null( $this->mAffectedRows ) ) {
                        // Forced result for simulated queries
                        return $this->mAffectedRows;
@@ -419,7 +391,7 @@ class DatabasePostgres extends Database {
         * @param array $options
         * @return int
         */
-       function estimateRowCount( $table, $vars = '*', $conds = '',
+       public function estimateRowCount( $table, $vars = '*', $conds = '',
                $fname = __METHOD__, $options = []
        ) {
                $options['EXPLAIN'] = true;
@@ -436,16 +408,7 @@ class DatabasePostgres extends Database {
                return $rows;
        }
 
-       /**
-        * Returns information about an index
-        * If errors are explicitly ignored, returns NULL on failure
-        *
-        * @param string $table
-        * @param string $index
-        * @param string $fname
-        * @return bool|null
-        */
-       function indexInfo( $table, $index, $fname = __METHOD__ ) {
+       public function indexInfo( $table, $index, $fname = __METHOD__ ) {
                $sql = "SELECT indexname FROM pg_indexes WHERE tablename='$table'";
                $res = $this->query( $sql, $fname );
                if ( !$res ) {
@@ -460,15 +423,7 @@ class DatabasePostgres extends Database {
                return false;
        }
 
-       /**
-        * Returns is of attributes used in index
-        *
-        * @since 1.19
-        * @param string $index
-        * @param bool|string $schema
-        * @return array
-        */
-       function indexAttributes( $index, $schema = false ) {
+       public function indexAttributes( $index, $schema = false ) {
                if ( $schema === false ) {
                        $schema = $this->getCoreSchema();
                }
@@ -525,7 +480,7 @@ __INDEXATTR__;
                return $a;
        }
 
-       function indexUnique( $table, $index, $fname = __METHOD__ ) {
+       public function indexUnique( $table, $index, $fname = __METHOD__ ) {
                $sql = "SELECT indexname FROM pg_indexes WHERE tablename='{$table}'" .
                        " AND indexdef LIKE 'CREATE UNIQUE%(" .
                        $this->strencode( $this->indexName( $index ) ) .
@@ -538,7 +493,7 @@ __INDEXATTR__;
                return $res->numRows() > 0;
        }
 
-       function selectSQLText(
+       public function selectSQLText(
                $table, $vars, $conds = '', $fname = __METHOD__, $options = [], $join_conds = []
        ) {
                // Change the FOR UPDATE option as necessary based on the join conditions. Then pass
@@ -580,7 +535,7 @@ __INDEXATTR__;
         * @param array|string $options String or array. Valid options: IGNORE
         * @return bool Success of insert operation. IGNORE always returns true.
         */
-       function insert( $table, $args, $fname = __METHOD__, $options = [] ) {
+       public function insert( $table, $args, $fname = __METHOD__, $options = [] ) {
                if ( !count( $args ) ) {
                        return true;
                }
@@ -706,8 +661,10 @@ __INDEXATTR__;
         * @param array $selectOptions
         * @return bool
         */
-       function nativeInsertSelect( $destTable, $srcTable, $varMap, $conds, $fname = __METHOD__,
-               $insertOptions = [], $selectOptions = [] ) {
+       public function nativeInsertSelect(
+               $destTable, $srcTable, $varMap, $conds, $fname = __METHOD__,
+               $insertOptions = [], $selectOptions = []
+       ) {
                $destTable = $this->tableName( $destTable );
 
                if ( !is_array( $insertOptions ) ) {
@@ -769,7 +726,7 @@ __INDEXATTR__;
                return $res;
        }
 
-       function tableName( $name, $format = 'quoted' ) {
+       public function tableName( $name, $format = 'quoted' ) {
                // Replace reserved words with better ones
                $name = $this->remappedTableName( $name );
 
@@ -800,13 +757,7 @@ __INDEXATTR__;
                return parent::tableName( $name, $format );
        }
 
-       /**
-        * Return the next in a sequence, save the value for retrieval via insertId()
-        *
-        * @param string $seqName
-        * @return int|null
-        */
-       function nextSequenceValue( $seqName ) {
+       public function nextSequenceValue( $seqName ) {
                $safeseq = str_replace( "'", "''", $seqName );
                $res = $this->query( "SELECT nextval('$safeseq')" );
                $row = $this->fetchRow( $res );
@@ -821,7 +772,7 @@ __INDEXATTR__;
         * @param string $seqName
         * @return int
         */
-       function currentSequenceValue( $seqName ) {
+       public function currentSequenceValue( $seqName ) {
                $safeseq = str_replace( "'", "''", $seqName );
                $res = $this->query( "SELECT currval('$safeseq')" );
                $row = $this->fetchRow( $res );
@@ -830,8 +781,7 @@ __INDEXATTR__;
                return $currval;
        }
 
-       # Returns the size of a text field, or -1 for "unlimited"
-       function textFieldSize( $table, $field ) {
+       public function textFieldSize( $table, $field ) {
                $table = $this->tableName( $table );
                $sql = "SELECT t.typname as ftype,a.atttypmod as size
                        FROM pg_class c, pg_attribute a, pg_type t
@@ -848,15 +798,15 @@ __INDEXATTR__;
                return $size;
        }
 
-       function limitResult( $sql, $limit, $offset = false ) {
+       public function limitResult( $sql, $limit, $offset = false ) {
                return "$sql LIMIT $limit " . ( is_numeric( $offset ) ? " OFFSET {$offset} " : '' );
        }
 
-       function wasDeadlock() {
+       public function wasDeadlock() {
                return $this->lastErrno() == '40P01';
        }
 
-       function duplicateTableStructure(
+       public function duplicateTableStructure(
                $oldName, $newName, $temporary = false, $fname = __METHOD__
        ) {
                $newName = $this->addIdentifierQuotes( $newName );
@@ -866,7 +816,7 @@ __INDEXATTR__;
                        "(LIKE $oldName INCLUDING DEFAULTS)", $fname );
        }
 
-       function listTables( $prefix = null, $fname = __METHOD__ ) {
+       public function listTables( $prefix = null, $fname = __METHOD__ ) {
                $eschema = $this->addQuotes( $this->getCoreSchema() );
                $result = $this->query(
                        "SELECT tablename FROM pg_tables WHERE schemaname = $eschema", $fname );
@@ -883,7 +833,7 @@ __INDEXATTR__;
                return $endArray;
        }
 
-       function timestamp( $ts = 0 ) {
+       public function timestamp( $ts = 0 ) {
                $ct = new ConvertibleTimestamp( $ts );
 
                return $ct->getTimestamp( TS_POSTGRES );
@@ -907,7 +857,7 @@ __INDEXATTR__;
         * @param int $offset
         * @return string
         */
-       function pg_array_parse( $text, &$output, $limit = false, $offset = 1 ) {
+       private function pg_array_parse( $text, &$output, $limit = false, $offset = 1 ) {
                if ( false === $limit ) {
                        $limit = strlen( $text ) - 1;
                        $output = [];
@@ -934,19 +884,10 @@ __INDEXATTR__;
                return $output;
        }
 
-       /**
-        * Return aggregated value function call
-        * @param array $valuedata
-        * @param string $valuename
-        * @return array
-        */
        public function aggregateValue( $valuedata, $valuename = 'value' ) {
                return $valuedata;
        }
 
-       /**
-        * @return string Wikitext of a link to the server software's web site
-        */
        public function getSoftwareLink() {
                return '[{{int:version-db-postgres-url}} PostgreSQL]';
        }
@@ -958,7 +899,7 @@ __INDEXATTR__;
         * @since 1.19
         * @return string Default schema for the current session
         */
-       function getCurrentSchema() {
+       public function getCurrentSchema() {
                $res = $this->query( "SELECT current_schema()", __METHOD__ );
                $row = $this->fetchRow( $res );
 
@@ -975,7 +916,7 @@ __INDEXATTR__;
         * @since 1.19
         * @return array List of actual schemas for the current sesson
         */
-       function getSchemas() {
+       public function getSchemas() {
                $res = $this->query( "SELECT current_schemas(false)", __METHOD__ );
                $row = $this->fetchRow( $res );
                $schemas = [];
@@ -994,7 +935,7 @@ __INDEXATTR__;
         * @since 1.19
         * @return array How to search for table names schemas for the current user
         */
-       function getSearchPath() {
+       public function getSearchPath() {
                $res = $this->query( "SHOW search_path", __METHOD__ );
                $row = $this->fetchRow( $res );
 
@@ -1010,7 +951,7 @@ __INDEXATTR__;
         *
         * @param array $search_path List of schemas to be searched by default
         */
-       function setSearchPath( $search_path ) {
+       private function setSearchPath( $search_path ) {
                $this->query( "SET search_path = " . implode( ", ", $search_path ) );
        }
 
@@ -1028,7 +969,7 @@ __INDEXATTR__;
         *
         * @param string $desiredSchema
         */
-       function determineCoreSchema( $desiredSchema ) {
+       public function determineCoreSchema( $desiredSchema ) {
                $this->begin( __METHOD__, self::TRANSACTION_INTERNAL );
                if ( $this->schemaExists( $desiredSchema ) ) {
                        if ( in_array( $desiredSchema, $this->getSchemas() ) ) {
@@ -1065,14 +1006,11 @@ __INDEXATTR__;
         * @since 1.19
         * @return string Core schema name
         */
-       function getCoreSchema() {
+       public function getCoreSchema() {
                return $this->mCoreSchema;
        }
 
-       /**
-        * @return string Version information from the database
-        */
-       function getServerVersion() {
+       public function getServerVersion() {
                if ( !isset( $this->numericVersion ) ) {
                        $conn = $this->getBindingHandle();
                        $versionInfo = pg_version( $conn );
@@ -1099,7 +1037,7 @@ __INDEXATTR__;
         * @param bool|string $schema
         * @return bool
         */
-       function relationExists( $table, $types, $schema = false ) {
+       private function relationExists( $table, $types, $schema = false ) {
                if ( !is_array( $types ) ) {
                        $types = [ $types ];
                }
@@ -1118,22 +1056,21 @@ __INDEXATTR__;
        }
 
        /**
-        * For backward compatibility, this function checks both tables and
-        * views.
+        * For backward compatibility, this function checks both tables and views.
         * @param string $table
         * @param string $fname
         * @param bool|string $schema
         * @return bool
         */
-       function tableExists( $table, $fname = __METHOD__, $schema = false ) {
+       public function tableExists( $table, $fname = __METHOD__, $schema = false ) {
                return $this->relationExists( $table, [ 'r', 'v' ], $schema );
        }
 
-       function sequenceExists( $sequence, $schema = false ) {
+       public function sequenceExists( $sequence, $schema = false ) {
                return $this->relationExists( $sequence, 'S', $schema );
        }
 
-       function triggerExists( $table, $trigger ) {
+       public function triggerExists( $table, $trigger ) {
                $q = <<<SQL
        SELECT 1 FROM pg_class, pg_namespace, pg_trigger
                WHERE relnamespace=pg_namespace.oid AND relkind='r'
@@ -1156,7 +1093,7 @@ SQL;
                return $rows;
        }
 
-       function ruleExists( $table, $rule ) {
+       public function ruleExists( $table, $rule ) {
                $exists = $this->selectField( 'pg_rules', 'rulename',
                        [
                                'rulename' => $rule,
@@ -1168,7 +1105,7 @@ SQL;
                return $exists === $rule;
        }
 
-       function constraintExists( $table, $constraint ) {
+       public function constraintExists( $table, $constraint ) {
                $sql = sprintf( "SELECT 1 FROM information_schema.table_constraints " .
                        "WHERE constraint_schema = %s AND table_name = %s AND constraint_name = %s",
                        $this->addQuotes( $this->getCoreSchema() ),
@@ -1189,7 +1126,7 @@ SQL;
         * @param string $schema
         * @return bool
         */
-       function schemaExists( $schema ) {
+       public function schemaExists( $schema ) {
                if ( !strlen( $schema ) ) {
                        return false; // short-circuit
                }
@@ -1205,7 +1142,7 @@ SQL;
         * @param string $roleName
         * @return bool
         */
-       function roleExists( $roleName ) {
+       public function roleExists( $roleName ) {
                $exists = $this->selectField( '"pg_catalog"."pg_roles"', 1,
                        [ 'rolname' => $roleName ], __METHOD__ );
 
@@ -1217,7 +1154,7 @@ SQL;
         * @var string $field
         * @return PostgresField|null
         */
-       function fieldInfo( $table, $field ) {
+       public function fieldInfo( $table, $field ) {
                return PostgresField::fromText( $this, $table, $field );
        }
 
@@ -1227,7 +1164,7 @@ SQL;
         * @param int $index Field number, starting from 0
         * @return string
         */
-       function fieldType( $res, $index ) {
+       public function fieldType( $res, $index ) {
                if ( $res instanceof ResultWrapper ) {
                        $res = $res->result;
                }
@@ -1235,15 +1172,11 @@ SQL;
                return pg_field_type( $res, $index );
        }
 
-       /**
-        * @param string $b
-        * @return Blob
-        */
-       function encodeBlob( $b ) {
+       public function encodeBlob( $b ) {
                return new PostgresBlob( pg_escape_bytea( $b ) );
        }
 
-       function decodeBlob( $b ) {
+       public function decodeBlob( $b ) {
                if ( $b instanceof PostgresBlob ) {
                        $b = $b->fetch();
                } elseif ( $b instanceof Blob ) {
@@ -1253,16 +1186,12 @@ SQL;
                return pg_unescape_bytea( $b );
        }
 
-       function strencode( $s ) {
+       public function strencode( $s ) {
                // Should not be called by us
                return pg_escape_string( $this->getBindingHandle(), $s );
        }
 
-       /**
-        * @param string|int|null|bool|Blob $s
-        * @return string|int
-        */
-       function addQuotes( $s ) {
+       public function addQuotes( $s ) {
                $conn = $this->getBindingHandle();
 
                if ( is_null( $s ) ) {
@@ -1303,14 +1232,7 @@ SQL;
                return $ins;
        }
 
-       /**
-        * Various select options
-        *
-        * @param array $options An associative array of options to be turned into
-        *   an SQL query, valid keys are listed in the function.
-        * @return array
-        */
-       function makeSelectOptions( $options ) {
+       public function makeSelectOptions( $options ) {
                $preLimitTail = $postLimitTail = '';
                $startOpts = $useIndex = $ignoreIndex = '';
 
@@ -1345,15 +1267,15 @@ SQL;
                return [ $startOpts, $useIndex, $preLimitTail, $postLimitTail, $ignoreIndex ];
        }
 
-       function getDBname() {
+       public function getDBname() {
                return $this->mDBname;
        }
 
-       function getServer() {
+       public function getServer() {
                return $this->mServer;
        }
 
-       function buildConcat( $stringList ) {
+       public function buildConcat( $stringList ) {
                return implode( ' || ', $stringList );
        }
 
@@ -1365,11 +1287,6 @@ SQL;
                return '(' . $this->selectSQLText( $table, $fld, $conds, null, [], $join_conds ) . ')';
        }
 
-       /**
-        * @param string $field Field or column to cast
-        * @return string
-        * @since 1.28
-        */
        public function buildStringCast( $field ) {
                return $field . '::text';
        }
@@ -1387,16 +1304,8 @@ SQL;
                return parent::streamStatementEnd( $sql, $newLine );
        }
 
-       /**
-        * Check to see if a named lock is available. This is non-blocking.
-        * See http://www.postgresql.org/docs/8.2/static/functions-admin.html#FUNCTIONS-ADVISORY-LOCKS
-        *
-        * @param string $lockName Name of lock to poll
-        * @param string $method Name of method calling us
-        * @return bool
-        * @since 1.20
-        */
        public function lockIsFree( $lockName, $method ) {
+               // http://www.postgresql.org/docs/8.2/static/functions-admin.html#FUNCTIONS-ADVISORY-LOCKS
                $key = $this->addQuotes( $this->bigintFromLockName( $lockName ) );
                $result = $this->query( "SELECT (CASE(pg_try_advisory_lock($key))
                        WHEN 'f' THEN 'f' ELSE pg_advisory_unlock($key) END) AS lockstatus", $method );
@@ -1405,14 +1314,8 @@ SQL;
                return ( $row->lockstatus === 't' );
        }
 
-       /**
-        * See http://www.postgresql.org/docs/8.2/static/functions-admin.html#FUNCTIONS-ADVISORY-LOCKS
-        * @param string $lockName
-        * @param string $method
-        * @param int $timeout
-        * @return bool
-        */
        public function lock( $lockName, $method, $timeout = 5 ) {
+               // http://www.postgresql.org/docs/8.2/static/functions-admin.html#FUNCTIONS-ADVISORY-LOCKS
                $key = $this->addQuotes( $this->bigintFromLockName( $lockName ) );
                $loop = new WaitConditionLoop(
                        function () use ( $lockName, $key, $timeout, $method ) {
@@ -1431,14 +1334,8 @@ SQL;
                return ( $loop->invoke() === $loop::CONDITION_REACHED );
        }
 
-       /**
-        * See http://www.postgresql.org/docs/8.2/static/functions-admin.html#FUNCTIONS-ADVISORY-LOCKSFROM
-        * PG DOCS: http://www.postgresql.org/docs/8.2/static/functions-admin.html#FUNCTIONS-ADVISORY-LOCKS
-        * @param string $lockName
-        * @param string $method
-        * @return bool
-        */
        public function unlock( $lockName, $method ) {
+               // http://www.postgresql.org/docs/8.2/static/functions-admin.html#FUNCTIONS-ADVISORY-LOCKS
                $key = $this->addQuotes( $this->bigintFromLockName( $lockName ) );
                $result = $this->query( "SELECT pg_advisory_unlock($key) as lockstatus", $method );
                $row = $this->fetchObject( $result );
index 46f7a5b..8236abf 100644 (file)
@@ -196,6 +196,10 @@ class DatabaseSqlite extends Database {
                return false;
        }
 
+       public function selectDB( $db ) {
+               return false; // doesn't make sense
+       }
+
        /**
         * @return string SQLite DB file path
         * @since 1.25
index c80fdec..f33dfc0 100644 (file)
@@ -1633,7 +1633,7 @@ interface IDatabase {
         * IDatabase::insert().
         *
         * @param string $b
-        * @return string
+        * @return string|Blob
         */
        public function encodeBlob( $b );
 
index ec4d09f..8ae78e9 100644 (file)
@@ -47,7 +47,7 @@ class SavepointPostgres {
                $this->didbegin = false;
                /* If we are not in a transaction, we need to be for savepoint trickery */
                if ( !$dbw->trxLevel() ) {
-                       $dbw->begin( "FOR SAVEPOINT", DatabasePostgres::TRANSACTION_INTERNAL );
+                       $dbw->begin( __CLASS__, DatabasePostgres::TRANSACTION_INTERNAL );
                        $this->didbegin = true;
                }
        }
@@ -61,7 +61,7 @@ class SavepointPostgres {
 
        public function commit() {
                if ( $this->didbegin ) {
-                       $this->dbw->commit();
+                       $this->dbw->commit( __CLASS__, DatabasePostgres::FLUSHING_INTERNAL );
                        $this->didbegin = false;
                }
        }
index 78b0296..fffc262 100644 (file)
@@ -866,6 +866,7 @@ class FormatMetadata extends ContextSource {
                                        // are included here as we really don't want
                                        // commas inserted.
                                        case 'ImageDescription':
+                                       case 'UserComment':
                                        case 'Artist':
                                        case 'Copyright':
                                        case 'RelatedSoundFile':
index 275e121..984e32b 100644 (file)
@@ -508,7 +508,11 @@ abstract class LoginSignupSpecialPage extends AuthManagerSpecialPage {
                }
 
                // warning header for non-standard workflows (e.g. security reauthentication)
-               if ( !$this->isSignup() && $this->getUser()->isLoggedIn() ) {
+               if (
+                       !$this->isSignup() &&
+                       $this->getUser()->isLoggedIn() &&
+                       $this->authAction !== AuthManager::ACTION_LOGIN_CONTINUE
+               ) {
                        $reauthMessage = $this->securityLevel ? 'userlogin-reauth' : 'userlogin-loggedin';
                        $submitStatus->warning( $reauthMessage, $this->getUser()->getName() );
                }
@@ -655,7 +659,7 @@ abstract class LoginSignupSpecialPage extends AuthManagerSpecialPage {
                // make a best effort to get the value of fields which used to be fixed in the old login
                // template but now might or might not exist depending on what providers are used
                $request = $this->getRequest();
-               $data = (object) [
+               $data = (object)[
                        'mUsername' => $request->getText( 'wpName' ),
                        'mPassword' => $request->getText( 'wpPassword' ),
                        'mRetype' => $request->getText( 'wpRetype' ),
index 97f004f..3bb3f85 100644 (file)
@@ -36,17 +36,7 @@ abstract class PageQueryPage extends QueryPage {
         * @param ResultWrapper $res
         */
        public function preprocessResults( $db, $res ) {
-               if ( !$res->numRows() ) {
-                       return;
-               }
-
-               $batch = new LinkBatch();
-               foreach ( $res as $row ) {
-                       $batch->add( $row->namespace, $row->title );
-               }
-               $batch->execute();
-
-               $res->seek( 0 );
+               $this->executeLBFromResultWrapper( $res );
        }
 
        /**
index afbc581..3592500 100644 (file)
@@ -825,4 +825,28 @@ abstract class QueryPage extends SpecialPage {
        function feedUrl() {
                return $this->getPageTitle()->getFullURL();
        }
+
+       /**
+        * Creates a new LinkBatch object, adds all pages from the passed ResultWrapper (MUST include
+        * title and optional the namespace field) and executes the batch. This operation will pre-cache
+        * LinkCache information like page existence and information for stub color and redirect hints.
+        *
+        * @param ResultWrapper $res The ResultWrapper object to process. Needs to include the title
+        *  field and namespace field, if the $ns parameter isn't set.
+        * @param null $ns Use this namespace for the given titles in the ResultWrapper object,
+        *  instead of the namespace value of $res.
+        */
+       protected function executeLBFromResultWrapper( ResultWrapper $res, $ns = null ) {
+               if ( !$res->numRows() ) {
+                       return;
+               }
+
+               $batch = new LinkBatch;
+               foreach ( $res as $row ) {
+                       $batch->add( $ns !== null ? $ns : $row->namespace, $row->title );
+               }
+               $batch->execute();
+
+               $res->seek( 0 );
+       }
 }
index 1c19f3c..39e3649 100644 (file)
@@ -41,18 +41,7 @@ abstract class WantedQueryPage extends QueryPage {
         * @param ResultWrapper $res
         */
        function preprocessResults( $db, $res ) {
-               if ( !$res->numRows() ) {
-                       return;
-               }
-
-               $batch = new LinkBatch;
-               foreach ( $res as $row ) {
-                       $batch->add( $row->namespace, $row->title );
-               }
-               $batch->execute();
-
-               // Back to start for display
-               $res->seek( 0 );
+               $this->executeLBFromResultWrapper( $res );
        }
 
        /**
index 724435b..9ee1b75 100644 (file)
@@ -64,6 +64,10 @@ class AncientPagesPage extends QueryPage {
                return false;
        }
 
+       public function preprocessResults( $db, $res ) {
+               $this->executeLBFromResultWrapper( $res );
+       }
+
        /**
         * @param Skin $skin
         * @param object $result Result row
index b9b2051..1753396 100644 (file)
@@ -171,18 +171,7 @@ class BrokenRedirectsPage extends QueryPage {
         * @param ResultWrapper $res
         */
        function preprocessResults( $db, $res ) {
-               if ( !$res->numRows() ) {
-                       return;
-               }
-
-               $batch = new LinkBatch;
-               foreach ( $res as $row ) {
-                       $batch->add( $row->namespace, $row->title );
-               }
-               $batch->execute();
-
-               // Back to start for display
-               $res->seek( 0 );
+               $this->executeLBFromResultWrapper( $res );
        }
 
        protected function getGroupName() {
index 307d6c3..a2fa844 100644 (file)
@@ -225,16 +225,7 @@ class LinkSearchPage extends QueryPage {
         * @param ResultWrapper $res
         */
        function preprocessResults( $db, $res ) {
-               if ( $res->numRows() > 0 ) {
-                       $linkBatch = new LinkBatch();
-
-                       foreach ( $res as $row ) {
-                               $linkBatch->add( $row->namespace, $row->title );
-                       }
-
-                       $res->seek( 0 );
-                       $linkBatch->execute();
-               }
+               $this->executeLBFromResultWrapper( $res );
        }
 
        /**
index 49fa417..dbe5c2f 100644 (file)
@@ -75,16 +75,7 @@ class ListDuplicatedFilesPage extends QueryPage {
         * @param ResultWrapper $res
         */
        function preprocessResults( $db, $res ) {
-               if ( $res->numRows() > 0 ) {
-                       $linkBatch = new LinkBatch();
-
-                       foreach ( $res as $row ) {
-                               $linkBatch->add( $row->namespace, $row->title );
-                       }
-
-                       $res->seek( 0 );
-                       $linkBatch->execute();
-               }
+               $this->executeLBFromResultWrapper( $res );
        }
 
        /**
index 6093f83..1d02a4f 100644 (file)
@@ -199,6 +199,10 @@ class MIMEsearchPage extends QueryPage {
                return in_array( $type, $types );
        }
 
+       public function preprocessResults( $db, $res ) {
+               $this->executeLBFromResultWrapper( $res );
+       }
+
        protected function getGroupName() {
                return 'media';
        }
index ec87716..7683ad8 100644 (file)
@@ -353,6 +353,7 @@ class MediaStatisticsPage extends QueryPage {
         * @param ResultWrapper $res
         */
        public function preprocessResults( $dbr, $res ) {
+               $this->executeLBFromResultWrapper( $res );
                $this->totalCount = $this->totalBytes = 0;
                foreach ( $res as $row ) {
                        $mediaStats = $this->splitFakeTitle( $row->title );
index 06d21d5..015701d 100644 (file)
@@ -69,19 +69,7 @@ class MostcategoriesPage extends QueryPage {
         * @param ResultWrapper $res
         */
        function preprocessResults( $db, $res ) {
-               # There's no point doing a batch check if we aren't caching results;
-               # the page must exist for it to have been pulled out of the table
-               if ( !$this->isCached() || !$res->numRows() ) {
-                       return;
-               }
-
-               $batch = new LinkBatch();
-               foreach ( $res as $row ) {
-                       $batch->add( $row->namespace, $row->title );
-               }
-               $batch->execute();
-
-               $res->seek( 0 );
+               $this->executeLBFromResultWrapper( $res );
        }
 
        /**
index 8271d16..3e78352 100644 (file)
@@ -75,20 +75,7 @@ class MostinterwikisPage extends QueryPage {
         * @param ResultWrapper $res
         */
        function preprocessResults( $db, $res ) {
-               # There's no point doing a batch check if we aren't caching results;
-               # the page must exist for it to have been pulled out of the table
-               if ( !$this->isCached() || !$res->numRows() ) {
-                       return;
-               }
-
-               $batch = new LinkBatch;
-               foreach ( $res as $row ) {
-                       $batch->add( $row->namespace, $row->title );
-               }
-               $batch->execute();
-
-               // Back to start for display
-               $res->seek( 0 );
+               $this->executeLBFromResultWrapper( $res );
        }
 
        /**
index 3663647..01eb39e 100644 (file)
@@ -78,16 +78,7 @@ class MostlinkedPage extends QueryPage {
         * @param ResultWrapper $res
         */
        function preprocessResults( $db, $res ) {
-               if ( $res->numRows() > 0 ) {
-                       $linkBatch = new LinkBatch();
-
-                       foreach ( $res as $row ) {
-                               $linkBatch->add( $row->namespace, $row->title );
-                       }
-
-                       $res->seek( 0 );
-                       $linkBatch->execute();
-               }
+               $this->executeLBFromResultWrapper( $res );
        }
 
        /**
index 3ead08a..41678cb 100644 (file)
@@ -59,18 +59,7 @@ class MostlinkedCategoriesPage extends QueryPage {
         * @param ResultWrapper $res
         */
        function preprocessResults( $db, $res ) {
-               if ( !$res->numRows() ) {
-                       return;
-               }
-
-               $batch = new LinkBatch;
-               foreach ( $res as $row ) {
-                       $batch->add( NS_CATEGORY, $row->title );
-               }
-               $batch->execute();
-
-               // Back to start for display
-               $res->seek( 0 );
+               $this->executeLBFromResultWrapper( $res );
        }
 
        /**
index 950241f..7fcb9d8 100644 (file)
@@ -79,17 +79,7 @@ class MostlinkedTemplatesPage extends QueryPage {
         * @param ResultWrapper $res
         */
        public function preprocessResults( $db, $res ) {
-               if ( !$res->numRows() ) {
-                       return;
-               }
-
-               $batch = new LinkBatch();
-               foreach ( $res as $row ) {
-                       $batch->add( $row->namespace, $row->title );
-               }
-               $batch->execute();
-
-               $res->seek( 0 );
+               $this->executeLBFromResultWrapper( $res );
        }
 
        /**
index a76b511..a78b082 100644 (file)
@@ -71,19 +71,7 @@ class ShortPagesPage extends QueryPage {
         * @param ResultWrapper $res
         */
        function preprocessResults( $db, $res ) {
-               # There's no point doing a batch check if we aren't caching results;
-               # the page must exist for it to have been pulled out of the table
-               if ( !$this->isCached() || !$res->numRows() ) {
-                       return;
-               }
-
-               $batch = new LinkBatch();
-               foreach ( $res as $row ) {
-                       $batch->add( $row->namespace, $row->title );
-               }
-               $batch->execute();
-
-               $res->seek( 0 );
+               $this->executeLBFromResultWrapper( $res );
        }
 
        function sortDescending() {
index 45efaf3..88c0e21 100644 (file)
@@ -76,4 +76,8 @@ class UnusedCategoriesPage extends QueryPage {
        protected function getGroupName() {
                return 'maintenance';
        }
+
+       public function preprocessResults( $db, $res ) {
+               $this->executeLBFromResultWrapper( $res );
+       }
 }
index df57744..0cbf00d 100644 (file)
@@ -43,6 +43,26 @@ class UnwatchedpagesPage extends QueryPage {
                return false;
        }
 
+       /**
+        * Pre-cache page existence to speed up link generation
+        *
+        * @param IDatabase $db
+        * @param ResultWrapper $res
+        */
+       public function preprocessResults( $db, $res ) {
+               if ( !$res->numRows() ) {
+                       return;
+               }
+
+               $batch = new LinkBatch();
+               foreach ( $res as $row ) {
+                       $batch->add( $row->namespace, $row->title );
+               }
+               $batch->execute();
+
+               $res->seek( 0 );
+       }
+
        public function getQueryInfo() {
                return [
                        'tables' => [ 'page', 'watchlist' ],
index 3422632..ea6ef30 100644 (file)
@@ -1507,6 +1507,7 @@ abstract class UploadBase {
                        # fragment links are allowed. For all other tags, only data:
                        # and fragment are allowed.
                        if ( $stripped == 'href'
+                               && $value !== ''
                                && strpos( $value, 'data:' ) !== 0
                                && strpos( $value, '#' ) !== 0
                        ) {
index 95b4463..1fd830e 100644 (file)
@@ -554,9 +554,9 @@ class UIDGenerator {
                        $ts = ( 1000 * $sec + $msec ) * 10000 + (int)$offset + $delta;
                        $id_bin = str_pad( decbin( $ts % pow( 2, 60 ) ), 60, '0', STR_PAD_LEFT );
                } elseif ( extension_loaded( 'gmp' ) ) {
-                       $ts = gmp_add( gmp_mul( (string) $sec, '1000' ), (string) $msec ); // ms
+                       $ts = gmp_add( gmp_mul( (string)$sec, '1000' ), (string)$msec ); // ms
                        $ts = gmp_add( gmp_mul( $ts, '10000' ), $offset ); // 100ns intervals
-                       $ts = gmp_add( $ts, (string) $delta );
+                       $ts = gmp_add( $ts, (string)$delta );
                        $ts = gmp_mod( $ts, gmp_pow( '2', '60' ) ); // wrap around
                        $id_bin = str_pad( gmp_strval( $ts, 2 ), 60, '0', STR_PAD_LEFT );
                } elseif ( extension_loaded( 'bcmath' ) ) {
index 7a58964..93bd95a 100644 (file)
        "filehist-filesize": "Veličina datoteke",
        "filehist-comment": "Komentar",
        "imagelinks": "Upotreba datoteke",
-       "linkstoimage": "{{PLURAL:$1|Slijedeća stranica koristi|Slijedećih $1 stranica koriste}} ovu sliku:",
+       "linkstoimage": "{{PLURAL:$1|Sljedeća stranica koristi|Sljedeće $1 stranice koriste|Sljedećih $1 stranica koristi}} ovu datoteku:",
        "linkstoimage-more": "Više od $1 {{PLURAL:$1|datoteke|datoteka}} povezano je s ovom datotekom.\nSljedeći spisak pokazuje samo {{PLURAL:$1|prvu stranicu povezanu|prve $1 stranice povezane|prvih $1 stranica povezanih}} s ovom datotekom.\nOvdje je dostupan [[Special:WhatLinksHere/$2|potpuni spisak]].",
        "nolinkstoimage": "Nema stranica koje koriste ovu datoteku.",
        "morelinkstoimage": "Vidi [[Special:WhatLinksHere/$1|ostale linkove]] prema ovoj datoteci.",
        "logentry-contentmodel-change": "$1 {{GENDER:$2|promijenio|promijenila}} je model sadržaja stranice $3 iz \"$4\" u \"$5\"",
        "logentry-contentmodel-change-revertlink": "vrati",
        "logentry-contentmodel-change-revert": "vrati",
-       "protectlogpage": "Zapisnik zaključavanja",
+       "protectlogpage": "Zapisnik zaštite",
        "protectlogtext": "Ispod je spisak promjena zaštićenja stranice.\nPogledajte [[Special:ProtectedPages|spisak zaštićenih stranica]] za pregled trenutno zaštićenih stranica.",
        "protectedarticle": "{{GENDER:|zaštitio|zaštitila}} je stranicu \"[[$1]]\"",
        "modifiedarticleprotection": "{{GENDER:|promijenio|promijenila}} je stepen zaštite stranice \"[[$1]]\"",
        "tooltip-ca-move": "Premjesti ovu stranicu",
        "tooltip-ca-watch": "Dodajte stranicu u listu praćnih članaka",
        "tooltip-ca-unwatch": "Ukloni ovu stranicu sa spiska praćenih članaka",
-       "tooltip-search": "Pretraži projekat {{SITENAME}}",
+       "tooltip-search": "Pretraži {{GRAMMAR:akuzativ|{{SITENAME}}}}",
        "tooltip-search-go": "Idi na stranicu s tačno ovim imenom ako postoji",
        "tooltip-search-fulltext": "Pretražite stranice s ovim tekstom",
        "tooltip-p-logo": "Glavna stranica",
        "mw-widgets-titleinput-description-redirect": "preusmjerava na $1",
        "randomrootpage": "Slučajna root stranica",
        "log-action-filter-block": "Vrsta blokiranja:",
+       "log-action-filter-contentmodel": "Vrsta izmjene modela sadržaja:",
        "log-action-filter-delete": "Vrsta brisanja:",
+       "log-action-filter-import": "Vrsta uvoza:",
+       "log-action-filter-managetags": "Vrsta uređivanja oznaka:",
+       "log-action-filter-move": "Vrsta premještanja:",
+       "log-action-filter-newusers": "Način stvaranja računa:",
+       "log-action-filter-patrol": "Vrsta patroliranja:",
+       "log-action-filter-protect": "Vrsta zaštite:",
+       "log-action-filter-rights": "Vrsta izmjene korisničkih prava:",
+       "log-action-filter-upload": "Vrsta postavljanja:",
        "log-action-filter-all": "Sve",
        "log-action-filter-block-block": "Blokiranje",
        "log-action-filter-block-reblock": "Izmjena blokiranja",
        "log-action-filter-block-unblock": "Deblokiranje",
+       "log-action-filter-contentmodel-change": "Izmjena modela sadržaja",
+       "log-action-filter-contentmodel-new": "Nova stranica s nestandardnim modelom sadržaja",
        "log-action-filter-delete-delete": "Brisanje stranice",
        "log-action-filter-delete-restore": "Vraćanje obrisane stranice",
        "log-action-filter-delete-event": "Brisanje unosa u zapisniku",
-       "log-action-filter-delete-revision": "Brisanje izmjene"
+       "log-action-filter-delete-revision": "Brisanje izmjene",
+       "log-action-filter-import-interwiki": "Uvoz između wikija",
+       "log-action-filter-import-upload": "Uvoz postavljanjem XML-a",
+       "log-action-filter-managetags-create": "Nova oznaka",
+       "log-action-filter-managetags-delete": "Brisanje oznake",
+       "log-action-filter-managetags-activate": "Aktiviranje oznake",
+       "log-action-filter-managetags-deactivate": "Deaktiviranje oznake",
+       "log-action-filter-move-move": "Premještanje bez presnimavanja preusmjerenja",
+       "log-action-filter-move-move_redir": "Premještanje s presnimavanjem preusmjerenja",
+       "log-action-filter-newusers-create": "Stvorio anonimni korisnik",
+       "log-action-filter-newusers-create2": "Stvorio registrirani korisnik",
+       "log-action-filter-newusers-autocreate": "Automatski stvoren",
+       "log-action-filter-newusers-byemail": "Stvoren lozinkom poslanom na adresu e-pošte",
+       "log-action-filter-patrol-patrol": "Ručno patrolirano",
+       "log-action-filter-patrol-autopatrol": "Automatski patrolirano",
+       "log-action-filter-protect-protect": "Dodavanje zaštite",
+       "log-action-filter-protect-modify": "Izmjena zaštite",
+       "log-action-filter-protect-unprotect": "Uklanjanje zaštite",
+       "log-action-filter-protect-move_prot": "Premještanje zaštite",
+       "log-action-filter-rights-rights": "Ručna izmjena",
+       "log-action-filter-rights-autopromote": "Automatska izmjena",
+       "log-action-filter-upload-upload": "Nova datoteka",
+       "log-action-filter-upload-overwrite": "Izmjena postojeće datoteke"
 }
index c2eeeba..4bf0dd6 100644 (file)
@@ -86,7 +86,7 @@
        "tog-enotifminoredits": "Send mig også en e-mail ved mindre ændringer af sider og filer på min overvågningsliste",
        "tog-enotifrevealaddr": "Vis min e-mailadresse i e-mails med besked om ændringer",
        "tog-shownumberswatching": "Vis antal brugere, der overvåger",
-       "tog-oldsig": "Nuværende signatur:",
+       "tog-oldsig": "Din nuværende signatur:",
        "tog-fancysig": "Behandl signatur som wikitekst uden automatisk henvisning",
        "tog-uselivepreview": "Benyt løbende forhåndsvisning",
        "tog-forceeditsummary": "Advar mig hvis jeg ikke udfylder beskrivelsesfeltet",
        "newwindow": "(åbner i et nyt vindue)",
        "cancel": "Afbryd",
        "moredotdotdot": "Mere...",
-       "morenotlisted": "Denne liste er ikke komplet.",
+       "morenotlisted": "Denne liste er måske ikke fuldstændig.",
        "mypage": "Side",
        "mytalk": "Diskussion",
        "anontalk": "Diskussion",
        "searchprofile-advanced-tooltip": "Søg i bestemte navnerum",
        "search-result-size": "$1 ({{PLURAL:$2|et ord|$2 ord}})",
        "search-result-category-size": "{{PLURAL:$1|1 medlem|$1 medlemmer}} ({{PLURAL:$2|1 underkategori|$2 underkategorier}}, {{PLURAL:$3|1 fil|$3 filer}})",
-       "search-redirect": "(omdirigering $1)",
+       "search-redirect": "(omdirigering fra $1)",
        "search-section": "(afsnit $1)",
        "search-category": "(kategorien $1)",
        "search-file-match": "(svarer til filens indhold)",
        "upload-copy-upload-invalid-domain": "Uploads af kopier er ikke tilgængelig fra dette domæne.",
        "upload-dialog-title": "Læg en fil op",
        "upload-dialog-button-cancel": "Annuller",
+       "upload-dialog-button-back": "Tilbage",
        "upload-dialog-button-done": "Færdig",
        "upload-dialog-button-save": "Gem",
        "upload-dialog-button-upload": "Læg op",
        "upload-form-label-infoform-description": "Beskrivelse",
        "upload-form-label-usage-title": "Anvendelse",
        "upload-form-label-usage-filename": "Filnavn",
+       "upload-form-label-own-work": "Dette er mit eget værk",
        "upload-form-label-infoform-categories": "Kategorier",
        "upload-form-label-infoform-date": "Dato",
        "upload-form-label-own-work-message-generic-local": "Jeg bekræfter at jeg uploader filen i overenstemmelse med betingelser for brug og licenseringspoltikken på {{SITENAME}}.",
        "export-download": "Tilbyd at gemme som en fil",
        "export-templates": "Medtag skabeloner",
        "export-pagelinks": "Inkluder henviste sider til en dybde på:",
+       "export-manual": "Tilføj sider manuelt:",
        "allmessages": "Alle beskeder",
        "allmessagesname": "Navn",
        "allmessagesdefault": "Standardtekst",
        "confirm-watch-top": "Tilføj denne side til din overvågningsliste?",
        "confirm-unwatch-button": "OK",
        "confirm-unwatch-top": "Fjern denne side fra din overvågningsliste?",
+       "confirm-rollback-button": "OK",
        "quotation-marks": "\"$1\"",
        "imgmultipageprev": "← forrige side",
        "imgmultipagenext": "næste side →",
        "htmlform-cloner-create": "Tilføj flere",
        "htmlform-cloner-delete": "Fjern",
        "htmlform-cloner-required": "Der kræves mindst en værdi.",
+       "htmlform-date-placeholder": "ÅÅÅÅ-MM-DD",
        "logentry-delete-delete": "$1 {{GENDER:$2|slettede}} siden $3",
        "logentry-delete-restore": "$1 {{GENDER:$2|gendannede}} siden $3",
        "logentry-delete-event": "$1 {{GENDER:$2|ændrede}} synligheden af {{PLURAL:$5|en loghændelse|$5 loghændelser}} for siden $3: $4",
        "feedback-cancel": "Afbryd",
        "feedback-close": "Færdig",
        "feedback-dialog-title": "Indsend feedback",
-       "feedback-error-title": "Fejl",
        "feedback-error1": "Fejl: Ukendt resultat fra API",
        "feedback-error2": "Fejl: Redigering mislykkedes",
        "feedback-error3": "Fejl: Intet svar fra API",
        "feedback-submit": "Send",
        "feedback-thanks": "Tak! Dine tilbagemeldinger er blevet noteret på siden \"[$2 $1]\".",
        "feedback-thanks-title": "Tak!",
-       "searchsuggest-search": "Søg",
+       "searchsuggest-search": "Søg på {{SITENAME}}",
        "searchsuggest-containing": "indeholder...",
        "api-error-badaccess-groups": "Du har ikke tilladelse til at overføre filer til denne wiki.",
        "api-error-badtoken": "Intern fejl: ugyldigt mærke.",
        "special-characters-group-ipa": "IPA",
        "special-characters-group-symbols": "Symboler",
        "special-characters-group-greek": "Græsk",
+       "special-characters-group-greekextended": "Udvidet græsk",
        "special-characters-group-cyrillic": "Kyrillisk",
        "special-characters-group-arabic": "Arabisk",
        "special-characters-group-arabicextended": "Udvidet arabisk",
        "log-action-filter-protect-protect": "Beskyttelse",
        "log-action-filter-protect-modify": "Ændring af beskyttelse",
        "log-action-filter-protect-unprotect": "Fjernede beskyttelse",
-       "log-action-filter-protect-move_prot": "Flyttede beskyttelse"
+       "log-action-filter-protect-move_prot": "Flyttede beskyttelse",
+       "authmanager-provider-temporarypassword": "Midlertidig adgangskode",
+       "edit-error-short": "Fejl: $1"
 }
index cd9fd62..bd3cfb0 100644 (file)
        "semiprotectedpagewarning": "'''Diqet: No pel pawyeno, teyna serkari eşkeni bıvurni.'''\nWexta ke şıma no pel vurneni diqet bıkeri, log bivini:",
        "cascadeprotectedwarning": "'''Diqet:''' Na pele kılit biya, tenya karberê idarekeri şenê ke naye bıvurnê, çıke na zerrey {{PLURAL:$1|na pela şipa-kılitkerdiye|nê pelanê şipanê-kılitkerdiyan}} dera:",
        "titleprotectedwarning": "'''Diqet: Na pele kılit biya, [[Special:ListGroupRights|heqê xususiy]] lazımê ke naye vırazê.'''\nLoge peniye cor de este:",
-       "templatesused": "{{PLURAL:$1|Şablon|Şabloni}} ke na pela de xebtênê:",
+       "templatesused": "{{PLURAL:$1|Şablon|Şabloni}} ke ena perrer de karneyayê:",
        "templatesusedpreview": "{{PLURAL:$1|Sablon|Sabloni}}  ke na verqayt de xebetnayê:",
        "templatesusedsection": "{{PLURAL:$1|Template|Templateyan}}  ke na qısım de xebetniyenê:",
        "template-protected": "(kılit biyo)",
index 5d7db72..0d5773d 100644 (file)
        "previewnote": "'''Lembre que esta é só unha vista previa e que aínda non gardou os seus cambios!'''",
        "continue-editing": "Ir ata a caixa de edición",
        "previewconflict": "Esta vista previa mostra o texto na área superior tal e como aparecerá se escolle gardar.",
-       "session_fail_preview": "Sentímolo! Non podemos procesar a súa edición porque se perderon os datos de inicio da sesión.\n\nA súa sesión pode que fose pechada. <strong> Por favor, verifique se aínda está conectado e probe de novo</strong>. En caso de que siga sen funcionar, intente [[Special:UserLogout|saír]] e volver a entrar na súa conta, e verifique que o seu navegador permite o uso de \"cookies\" neste sitio.",
+       "session_fail_preview": "Sentímolo! Non puidemos procesar a súa edición porque se perderon os datos de inicio da sesión.\n\nPoida que se pechase a súa sesión. <strong>Por favor, verifique que ten a sesión aberta e probe de novo.</strong>\nEn caso de que siga sen funcionar, intente [[Special:UserLogout|saír]] e volver entrar na súa conta e verifique que o seu navegador permite o uso de cookies neste sitio.",
        "session_fail_preview_html": "Sentímolo! Non foi posible procesar a edición debido á pérdida de datos da súa sesión.\n\n<em>Como a wiki {{SITENAME}} posibilita o uso de HTML puro, a vista previa está oculta por precaución contra ataques con JavaScript.</em>\n\n<strong>Se este é un intento lexítimo de edición probe de novo, por favor</strong>. \nEn caso de que continúe sen funcionar, intente [[Special:UserLogout|saír]] e volver a entrar na súa conta, e verifique se o seu navegador permite o uso de ''cookies'' deste sitio.",
        "token_suffix_mismatch": "'''Rexeitouse a súa edición porque o seu cliente confundiu os signos de puntuación na edición.'''\nRexeitouse a edición para evitar que se corrompa o texto do artigo.\nIsto pode acontecer porque estea a empregar un servizo de proxy anónimo defectuoso baseado na web.",
        "edit_form_incomplete": "'''Algunhas partes do formulario de edición non chegaron ao servidor; comprobe que a súa modificación está intacta e inténteo de novo.'''",
index 5920b06..f4dc181 100644 (file)
        "ipbexpiry": "Մարման ժամկետ.",
        "ipbreason": "Պատճառ.",
        "ipbreason-dropdown": "*Արգելափակման սովորական պատճառներ\n** Կեղծ տեղեկությունների ներմուծում\n** Էջերից նյութերի հեռացում\n** Արտաքին կայքերին հղումների սպամ\n** Անիմաստ/անկապ տեքստի ներմուծում էջերում\n** Վարկաբեկող/ահաբեկող պահվածք\n** Բազմաթիվ մասնակցային հաշիվների չարաշահում\n** Անպատշաճ մասնակցի անուն",
+       "ipb-hardblock": "Արգելել գրանցված մասնակիցներին խմբագրել այս IP-հասցեից",
        "ipbcreateaccount": "Կանխարգելել մասնակցային հաշվի ստեղծումը",
        "ipbemailban": "Կանխարգելել մասնակցի կողմից էլ-նամակների ուղարկումը",
-       "ipbenableautoblock": "Ավտոմատիկ արգելափակել այս մասնակցի վերջին IP-հասցեն և բոլոր հետագա IP-հասցեները, որոնցից նա կփորձի խմբագրումներ կատարել",
+       "ipbenableautoblock": "Ավտոմատ արգելափակել այս մասնակցի վերջին IP-հասցեն և բոլոր հետագա IP-հասցեները, որոնցից նա կփորձի խմբագրումներ կատարել",
        "ipbsubmit": "Արգելափակել այս մասնակցին",
        "ipbother": "Այլ ժամկետ.",
        "ipboptions": "2 ժամ:2 hours,1 օր:1 day,3 օր:3 days,1 շաբաթ:1 week,2 շաբաթ:2 weeks,1 ամիս:1 month,3 ամիս:3 months,6 ամիս:6 months,1 տարի:1 year,անժամկետ:infinite",
        "ipbhidename": "Թաքցնել մասնակցի անունը արգելափակման տեղեկամատյանից, գործող արգելափակումների ցանկից և մասնակիցների ցանկից։",
+       "ipbwatchuser": "Մասնակցի էջն ու քննարկման էջն ավելացնել հսկացանկում",
+       "ipb-disableusertalk": "Արգելել մասնակցին խմբագրել իր քննարկման էջն արգելափակման ընթացքում",
        "badipaddress": "Սխալ IP-հասցե",
        "blockipsuccesssub": "Արգելափակումը կատարված է",
        "blockipsuccesstext": "[[Special:Contributions/$1|«$1»]] արգելափակված է։\n<br />Տես [[Special:BlockList|արգելափակված IP-հասցեների ցանկը]]։",
        "blocklist": "Արգելափակված մասնակիցներ։",
        "ipblocklist": "Արգելափակված IP-հասցեները և մասնակիցները",
        "ipblocklist-legend": "Արգելափակված մասնակցի որոնում",
+       "blocklist-expiry": "Լրանում է",
        "ipblocklist-submit": "Որոնել",
        "infiniteblock": "ընդմիշտ",
        "expiringblock": "կմարվի $1 $2",
index 9814fea..ab3a2f9 100644 (file)
@@ -48,7 +48,8 @@
                        "Nemo bis",
                        "Mbrt",
                        "Beeyan",
-                       "Bonaditya"
+                       "Bonaditya",
+                       "Irus"
                ]
        },
        "tog-underline": "Garis bawahi pranala:",
        "category-file-count-limited": "Kategori ini memiliki {{PLURAL:$1|$1 berkas}} berikut.",
        "listingcontinuesabbrev": "samb.",
        "index-category": "Halaman yang diindeks",
-       "noindex-category": "Halaman yang tidak diindeks",
+       "noindex-category": "Halaman yang diindeks",
        "broken-file-category": "Halaman dengan gambar rusak",
        "categoryviewer-pagedlinks": "($1) ($2)",
        "about": "Tentang",
        "talk": "Pembicaraan",
        "views": "Tampilan",
        "toolbox": "Perkakas",
+       "tool-link-userrights": "Simpan kelompok {{GENDER:$1|pengguna}}",
+       "tool-link-emailuser": "Kirim surel ke {{GENDER:$1|pengguna}} ini",
        "userpage": "Lihat halaman pengguna",
        "projectpage": "Lihat halaman proyek",
        "imagepage": "Lihat halaman berkas",
        "createacct-yourpasswordagain-ph": "Masukkan lagi kata sandi",
        "userlogin-remembermypassword": "Biarkan saya tetap masuk",
        "userlogin-signwithsecure": "Gunakan server aman",
+       "cannotlogin-title": "Tidak dapat masuk",
+       "cannotlogin-text": "Login ini tidak mungkin.",
        "cannotloginnow-title": "Tidak dapat masuk log saat ini",
        "cannotloginnow-text": "Masuk log tidak memungkinkan ketika menggunakan $1.",
+       "cannotcreateaccount-title": "Akun tak dapat dibuat",
+       "cannotcreateaccount-text": "Menetapkan account langsung tidak diaktifkan pada wiki ini.",
        "yourdomainname": "Domain Anda:",
        "password-change-forbidden": "Anda tidak dapat mengubah kata sandi pada wiki ini.",
        "externaldberror": "Telah terjadi kesalahan otentikasi basis data eksternal atau Anda tidak diizinkan melakukan kemaskini terhadap akun eksternal Anda.",
        "searchprofile-advanced-tooltip": "Pencarian di ruang nama tertentu",
        "search-result-size": "$1 ({{PLURAL:$2|$2 kata}})",
        "search-result-category-size": "{{PLURAL:$1|1 anggota|$1 anggota}} ({{PLURAL:$2|1 subkategori|$2 subkategori}}, {{PLURAL:$3|1 berkas|$3 berkas}})",
-       "search-redirect": "(pengalihan $1)",
+       "search-redirect": "(Dialihkan dari $1)",
        "search-section": "(bagian $1)",
        "search-category": "(kategori $1)",
        "search-file-match": "(cocok dengan isi berkas)",
        "rightslogtext": "Di bawah ini adalah log perubahan terhadap hak-hak pengguna.",
        "action-read": "membaca halaman ini",
        "action-edit": "menyunting halaman ini",
-       "action-createpage": "membuat halaman baru",
-       "action-createtalk": "membuat halaman pembicaraan baru",
+       "action-createpage": "Membuat halaman ini",
+       "action-createtalk": "Membuat halaman diskusi ini",
        "action-createaccount": "membuat akun pengguna ini",
        "action-autocreateaccount": "buat otomatis akun pengguna luar",
        "action-history": "lihat riwayat halaman ini",
        "upload-http-error": "Kesalahan HTTP terjadi: $1",
        "upload-copy-upload-invalid-domain": "Unggahan salinan tidak tersedia dari domain ini.",
        "upload-foreign-cant-upload": "Wiki ini tidak diatur untuk mengunggah berkas ke gudang penyimpangan asing.",
+       "upload-dialog-disabled": "Upload file menggunakan dialog ini dinonaktifkan pada wiki ini.",
        "upload-dialog-title": "Unggah berkas",
        "upload-dialog-button-cancel": "Batalkan",
        "upload-dialog-button-done": "Selesai",
index bc06966..ba7114e 100644 (file)
        "newimages-showbots": "봇이 올린 것 보기",
        "newimages-hidepatrolled": "점검한 업로드 숨기기",
        "noimages": "그림이 없습니다.",
+       "gallery-slideshow-toggle": "섬네일 토글",
        "ilsubmit": "검색",
        "bydate": "날짜",
        "sp-newimages-showfrom": "$1 $2부터 시작하는 새 파일 보기",
        "dberr-again": "잠시 기다리고 나서 다시 불러오세요.",
        "dberr-info": "(데이터베이스 서버에 연결할 수 없습니다: $1)",
        "dberr-info-hidden": "(데이터베이스 서버에 연결할 수 없습니다)",
-       "dberr-usegoogle": "그동안 Google을 통해 검색할 수도 있습니다.",
+       "dberr-usegoogle": "잠시 동안 Google을 통해 검색해볼 수 있습니다.",
        "dberr-outofdate": "수집된 내용은 오래된 것일 수도 있음을 참고하세요.",
        "dberr-cachederror": "다음은 요청한 문서의 캐시된 복사본이며, 최신이 아닐 수도 있습니다.",
        "htmlform-invalid-input": "입력한 값에 문제가 있습니다.",
index 57262ad..4d9a89c 100644 (file)
        "changeemail-no-info": "Dir musst ageloggt sinn, fir direkt op dës Säit ze kommen.",
        "changeemail-oldemail": "Aktuell Mailadress:",
        "changeemail-newemail": "Nei Mailadress:",
+       "changeemail-newemail-help": "Dëst Feld soll eidel gelooss gi wann Dir Är E-Mailadress ewechhuele wëllt. Dir kënnt d'Passwuert net zrécksetze wann Dir et vergiess hutt an Dir kritt och keng E-Maile vun dëser Wiki esoubal d'E-Mailadress ewechgeholl gouf.",
        "changeemail-none": "(keng)",
        "changeemail-password": "Äert {{SITENAME}}-Passwuert:",
        "changeemail-submit": "Mailadress änneren",
        "permissionserrors": "Net genuch Rechter",
        "permissionserrorstext": "Dir hutt net genuch Rechter fir déi Aktioun auszeféieren. {{PLURAL:$1|Grond|Grënn}}:",
        "permissionserrorstext-withaction": "Dir sidd, aus {{PLURAL:$1|dësem Grond|dëse Grënn}}, net berechtegt $2 :",
+       "contentmodelediterror": "Dir kënnt dës Versioun net ännere well hiren Inhaltsmodell <code>$1</code> ass dee verschidde vum aktuellen Inhaltsmodell vun der Säit <code>$2</code> ass.",
        "recreate-moveddeleted-warn": "'''Opgepasst: Dir sidd am Gaang eng Säit unzeleeën déi schonn eng Kéier geläscht gouf.'''\n\nFrot Iech ob et wierklech sënnvoll ass dës Säit nees nei ze schafen.\nFir Iech z'informéieren fannt Dir hei d'Logbuch vum Läsche mam Grond:",
        "moveddeleted-notice": "Dës Säit gouf geläscht.\nHei ass den Extrait aus dem Logbuch vum Réckelen a Läsche fir déi Säit.",
        "moveddeleted-notice-recent": "Leider gouf dëse Säit rezent (bannent de leschte 24 Stonnen) geläscht. D'Logbuch vum Läschen a Réckele vun dëser Säit fannt Dir fir Ar Informatioun hei drënner.",
        "history-feed-description": "Versiounshistorique fir dës Säit op der Wiki",
        "history-feed-item-nocomment": "$1 ëm $2",
        "history-feed-empty": "Déi ugefrote Säit gëtt et net.\nVläicht gouf se geläscht oder geréckelt.\n[[Special:Search|Sicht]] op {{SITENAME}} no relevanten neie Säiten.",
+       "history-edit-tags": "Markéierungen (tags) vun den erausgesichte Versiounen änneren",
        "rev-deleted-comment": "(Resumé vun der Ännerung ewechgeholl)",
        "rev-deleted-user": "(Benotzernumm ewechgeholl)",
        "rev-deleted-event": "(Detailer aus dem Logbuch erausgeholl)",
        "upload-form-label-own-work": "Dëst ass mäin eegent Wierk",
        "upload-form-label-infoform-categories": "Kategorien",
        "upload-form-label-infoform-date": "Datum",
+       "upload-form-label-own-work-message-generic-local": "Ech confirméieren datt ech dëse Fichier ënner dëse Bedingungen a Lizenz-Richtlinnen op {{SITENAME}} eroplueden.",
+       "upload-form-label-not-own-work-message-generic-local": "Wann Dir dëse Fichier net ënner de Richtlinne vu(n) {{SITENAME}} eropluede kënnt da maacht w.e.g. dësen Dialog zou a probéiert eng aner Method.",
        "upload-form-label-not-own-work-local-generic-local": "Dir kënnt och [[Special:Upload|d'Standardsäit vum Eroplueden]] ausprobéieren.",
        "backend-fail-stream": "De Fichier $1 konnt net iwwerdroe ginn.",
        "backend-fail-backup": "De Fichier $1 konnt net geséchert ginn.",
        "apisandbox-submit": "Ufro maachen",
        "apisandbox-reset": "Eidel maachen",
        "apisandbox-retry": "Nach eng Kéier probéieren",
+       "apisandbox-loading": "Informatioune fir den API-Modul \"$1\" gi gelueden ...",
        "apisandbox-no-parameters": "Dësen API-Modul huet keng Parameteren.",
        "apisandbox-helpurls": "Hëllef-Linken",
        "apisandbox-examples": "Beispiller",
        "authform-wrongtoken": "Falschen Token",
        "specialpage-securitylevel-not-allowed-title": "Net erlaabt",
        "specialpage-securitylevel-not-allowed": "Leider däerft Dir dës Säit net benotze well Är Identitéit net konnt iwwerpréift ginn.",
-       "cannotauth-not-allowed-title": "Erlaabnes refuséiert",
+       "cannotauth-not-allowed-title": "Autorisatioun refuséiert",
        "cannotauth-not-allowed": "Dir däerft dës Säit net benotzen",
        "changecredentials-submit": "Idendifikatiounsinformatiounen änneren",
        "changecredentials-success": "Är Idendifikatiounsinformatioune goufe geännert.",
index 720810d..f4b91c6 100644 (file)
        "eauthentsent": "Un messaggio e-mail de conferma o l'è stæto inviòu a l'addresso indicòu.\nPe abilitâ l'invîo de messaggi e-mail pe quest'utensa, se deve seguî e instrussioin indicæ, pe confermâ che ti t'ê o legittimo propietâio de l'utensa.",
        "throttled-mailpassword": "Un'e-mail de reimpostassione da poula segretta a l'è zà stæta inviâ da meno de {{PLURAL:$1|1 oa|$1 oe}}.\nPe prevegnî di abuxi, a fonsion de reimpostassion da poula segretta a peu vese deuviâ solo che 'na votta ogni {{PLURAL:$1|oa|$1 oe}}.",
        "mailerror": "Errô inte l'invio do messaggio: $1",
-       "acct_creation_throttle_hit": "{{PLURAL:$1|1 registraçion a l'è zà stæta effettuâ|$1 registraçioin son zà stæte effettuæ}} da quarcun co-o to mæximo addresso IP inte l'urtimo giorno: o l'è o mascimo consentio inte questo periodo de tempo.\nPerçò, i utenti ch'adeuvian sto addresso IP pe-o momento no peuan registrase.",
+       "acct_creation_throttle_hit": "{{PLURAL:$1|1 registraçion a l'è zà stæta effettoâ|$1 registraçioin son zà stæte effettoæ}} da quarcun co-o to mæximo adresso IP inti urtimi $2, ch'o l'è o mascimo consentio inte questo periodo de tempo.\nPerçò, i utenti ch'adoeuvian st'adresso IP pe-o momento no poeuan ciu registrâse.",
        "emailauthenticated": "O teu adresso e-mail o l'è stæto aotenticòu o $2 a $3.",
        "emailnotauthenticated": "L'adresso de posta elettronica o no l'è stæto ancon confermòu.\nNo saian inviæ messaggi e-mail pe-e funçioin elencæ chì de sotta.",
        "noemailprefs": "Pe attivâ ste fonçioin ti g'hæ da mette n'adresso e-mail inte preferençe.",
        "passwordreset-emailsentemail": "Se questo addresso de posta elettronnica o l'è associou a-a teu utença, alloa saiâ inviou un'e-mail pe rempostâ a poula segretta.",
        "passwordreset-emailsentusername": "Se gh'è un adreçço de posta elettronica associou con questo nomme utente, alloa saiâ inviou una email pe rempostâ a password.",
        "passwordreset-emailsent-capture2": "{{PLURAL:$1|L'|E }}e-mail de rempostaçion da password {{PLURAL:$1|a l'è stæta inviâ|son stæte inviæ}}. {{PLURAL:$1|O nomme|L'elenco di nommi}} utente e password o l'è mostrou chì.",
-       "passwordreset-emailerror-capture2": "Invio de email {{GENDER:$2|a l'utente}} non ariescio: $1. {{PLURAL:$3|O nomme|L'elenco di nommi}} utente e password o l'è mostrou chì de sotta.",
+       "passwordreset-emailerror-capture2": "Invio d'e-mail {{GENDER:$2|a l'utente}} non ariescio: $1. {{PLURAL:$3|O nomme|L'elenco di nommi}} utente e password o l'è mostrou chì de sotta.",
        "passwordreset-nocaller": "Un chi ciamma ti g'hæ da dâlo",
        "passwordreset-nosuchcaller": "O ciamante o no l'existe: $1",
        "passwordreset-ignored": "A reimpostaçion da password a no l'è stæta gestia. Foscia n'è stæto configuou nisciun provider ?",
index d4eeb0c..755433c 100644 (file)
@@ -10,7 +10,8 @@
                        "Сай",
                        "Санюн Вадик",
                        "아라",
-                       "Sergey Ivanov"
+                       "Sergey Ivanov",
+                       "Irus"
                ]
        },
        "tog-underline": "Кузе кылвер-влакым ӱлычын удыралаш?",
        "specialpages-group-pagetools": "Лаштык ӱзгар-влак",
        "specialpages-group-redirects": "Вес вере колтышо спецлаштык-влак",
        "external_image_whitelist": " #Оставьте эту строчку такой, как она есть<pre>\n#Разместите здесь фрагменты регулярных выражений (ту часть, что находится между //)\n#они будут соотнесены с URL внешних изображений.\n#Подходящие будут показаны как изображения, остальные будут показаны как ссылки на изображения.\n#Строки, начинающиеся с # считаются комментариями.\n#Строки не чувствительны к регистру\n\n#Размещайте фрагменты регулярных выражений над этой строчкой. Оставьте эту строчку такой, как она есть.</pre>",
+       "logentry-delete-delete": "$1 {{GENDER:$2|лыктын|лыктын}} странице $3",
        "revdelete-summary": "тӧрлатымаш-влакым возен ончыктымаш",
        "searchsuggest-search": "Кычалаш",
        "expand_templates_ok": "Йӧра",
index b7ed308..5f4b8b5 100644 (file)
        "version": "Pán-pún",
        "specialpages": "Te̍k-sû-ia̍h",
        "tag-filter": "[[Special:Tags|Piau-chhiam]] chhoē mi̍h:",
-       "tag-list-wrapper": "([[Special:Tags|$1 ê piau-chhiam]]: $2)",
+       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|piau-chhiam}}]]: $2)",
        "logentry-move-move": "$1 {{GENDER:$2|sóa}} $3 chit ia̍h khì $4",
        "logentry-newusers-create": "已經{{GENDER:$2|開好}}用者口座 $1",
        "searchsuggest-search": "Chhoē {{SITENAME}}",
index 0456e94..a8e8f2e 100644 (file)
@@ -21,7 +21,8 @@
                        "Nirjal stha",
                        "राम प्रसाद जोशी",
                        "Matma Rex",
-                       "जनक राज भट्ट"
+                       "जनक राज भट्ट",
+                       "Suniltheblue"
                ]
        },
        "tog-underline": "रेखाङ्कित लिङ्क:",
        "feedback-thanks": "धन्यवाद! तपाईंको प्रतिक्रिया पृष्ठमा नियुक्त गरिएको छ \"[ $2  $1 ]\"।",
        "feedback-thanks-title": "धन्यवाद!",
        "feedback-useragent": "प्रयोगकर्ता एजेन्ट:",
-       "searchsuggest-search": "खोज",
+       "searchsuggest-search": "{{SITENAME}} मा खोज्नुहोस्",
        "searchsuggest-containing": "समावेश भएको...",
        "api-error-badaccess-groups": "यस विकिमा तपाईंलाई फाइल अपलोड गर्ने अनुमति छैन।",
        "api-error-badtoken": "आन्तरिक समस्याः खराब टोकन ।",
index 8f06a69..6618239 100644 (file)
@@ -79,7 +79,8 @@
                        "Dinosaur918",
                        "Jdforrester",
                        "Jeleniccz",
-                       "MrLeopold"
+                       "MrLeopold",
+                       "Hex"
                ]
        },
        "tog-underline": "Koppelingen onderstrepen:",
        "category-file-count-limited": "Deze categorie bevat {{PLURAL:$1|het volgende bestand|de volgende $1 bestanden}}.",
        "listingcontinuesabbrev": "meer",
        "index-category": "Te indexeren pagina's",
-       "noindex-category": "Niet te indexeren pagina's",
+       "noindex-category": "Niet-geïndexeerde pagina's",
        "broken-file-category": "Pagina's met onjuiste bestandskoppelingen",
        "about": "Over",
        "article": "Pagina",
        "cannotloginnow-title": "Niet mogelijk om aan te melden",
        "cannotloginnow-text": "Aanmelden is niet mogelijk bij het gebruik van $1.",
        "cannotcreateaccount-title": "Kan geen accounts aanmaken",
+       "cannotcreateaccount-text": "Direct aanmaken van een gebruiker is niet ingeschakeld op deze wiki.",
        "yourdomainname": "Uw domein:",
        "password-change-forbidden": "U kunt uw wachtwoord niet wijzigen in deze wiki.",
        "externaldberror": "Er is een fout opgetreden bij het aanmelden bij de database of u hebt geen toestemming uw externe gebruiker bij te werken.",
        "createacct-email-ph": "Geef uw e-mailadres op",
        "createacct-another-email-ph": "Geef een e-mailadres op",
        "createaccountmail": "Gebruik een tijdelijk willekeurig wachtwoord en stuur het naar het opgegeven e-mailadres",
+       "createaccountmail-help": "Kan worden gebruikt voor het aanmaken van een gebruiker voor een andere persoon zonder het wachtwoord te leren.",
        "createacct-realname": "Echte naam (optioneel)",
        "createaccountreason": "Reden:",
        "createacct-reason": "Reden",
        "createacct-reason-ph": "Waarom u een andere account aanmaakt",
+       "createacct-reason-help": "Weergegeven bericht in het logbestand van aangemaakte gebruikers",
        "createacct-submit": "Account aanmaken",
        "createacct-another-submit": "Account aanmaken",
        "createacct-continue-submit": "Doorgaan met het maken van een account",
        "nocookiesnew": "De gebruiker is geregistreerd, maar niet aangemeld.\n{{SITENAME}} gebruikt cookies voor het aanmelden van gebruikers.\nSchakel die in en meld daarna aan met uw nieuwe gebruikersnaam en wachtwoord.",
        "nocookieslogin": "{{SITENAME}} gebruikt cookies voor het aanmelden van gebruikers.\nCookies zijn uitgeschakeld in uw browser.\nSchakel deze optie in en probeer het opnieuw.",
        "nocookiesfornew": "De gebruiker is niet gemaakt omdat de bron niet bevestigd kon worden.\nZorg ervoor dat u cookies hebt ingeschakeld, herlaad deze pagina en probeer het opnieuw.",
+       "createacct-loginerror": "De gebruiker is succesvol aangemaakt, maar u kon niet automatisch worden aangemeld. Ga naar [[Special:UserLogin|handmatig aanmelden]].",
        "noname": "U hebt geen geldige gebruikersnaam opgegeven.",
        "loginsuccesstitle": "Aangemeld",
        "loginsuccess": "<strong>U bent nu aangemeld bij {{SITENAME}} als \"$1\".</strong>",
        "eauthentsent": "Er is ter bevestiging een e-mail naar het opgegeven e-mailadres gezonden.\nVolg de aanwijzingen in de e-mail om aan te geven dat het uw e-mailadres is.\nTot die tijd worden er geen e-mails naar het e-mailadres gezonden.",
        "throttled-mailpassword": "In {{PLURAL:$1|het laatste uur|de laatste $1 uur}} is al een wachtwoordherinnering verzonden.\nOm misbruik te voorkomen wordt er slechts één wachtwoordherinnering per {{PLURAL:$1|uur|$1 uur}} verzonden.",
        "mailerror": "Fout bij het verzenden van e-mail: $1",
-       "acct_creation_throttle_hit": "Bezoekers van deze wiki met hetzelfde IP-adres als u hebben de afgelopen dag al $1 gebruiker{{PLURAL:$1||s}} geregistreerd, wat het maximale aantal in deze periode is.\nDaarom kunt u vanaf uw IP-adres op dit moment geen nieuwe gebruikers registreren.",
+       "acct_creation_throttle_hit": "Bezoekers van deze wiki met hetzelfde IP-adres als u hebben de afgelopen $2 al {{PLURAL:$1|1 gebruiker|$1 gebruikers}} geregistreerd, wat het maximale toegestane aantal is voor deze periode.\nDaarom kunt u vanaf uw IP-adres op dit moment geen nieuwe gebruikers registreren.",
        "emailauthenticated": "Uw e-mailadres is bevestigd op $2 om $3.",
        "emailnotauthenticated": "Uw e-mailadres is niet bevestigd.\nDe volgende functies verzenden nog geen e-mail.",
        "noemailprefs": "Geef een e-mailadres op in uw voorkeuren om deze functies te gebruiken.",
        "botpasswords-updated-body": "Het botwachtwoord voor de bot \"$1\" van gebruiker \"$2\" is succesvol bijgewerkt.",
        "botpasswords-deleted-title": "Botwachtwoord verwijderd",
        "botpasswords-deleted-body": "Het botwachtwoord voor de bot \"$1\" van gebruiker \"$2\" is verwijderd.",
-       "botpasswords-newpassword": "Het nieuwe wachtwoord om aan te melden met <strong>$1</strong> is nu <strong>$2</strong>. <em>Bewaar dit goed voor toekomstig gebruik.</em>",
+       "botpasswords-newpassword": "Het nieuwe wachtwoord om aan te melden met <strong>$1</strong> is <strong>$2</strong>. <em>Bewaar dit goed voor toekomstig gebruik.</em> <br> (Voor oude robots die vereisen dat de loginnaam hetzelfde is als de eventuele gebruikersnaam, kan ook <strong>$3</strong> als gebruikersnaam en <strong>$4</strong> als wachtwoord worden gebruikt.)",
        "botpasswords-no-provider": "BotPasswordsSessionProvider is niet beschikbaar.",
        "botpasswords-restriction-failed": "Botwachtwoordbeperkingen maken het aanmelden onmogelijk.",
        "botpasswords-invalid-name": "De gebruikersnaam bevat niet het scheidingsteken van het botwachtwoord (\"$1\").",
        "passwordreset-emailelement": "Gebruikersnaam: \n$1\n\nTijdelijk wachtwoord: \n$2",
        "passwordreset-emailsentemail": "Als dit e-mailadres aan uw account gekoppeld is, dan wordt er een e-mail verzonden om uw wachtwoord opnieuw in te stellen.",
        "passwordreset-emailsentusername": "Als er een e-mailadres geregistreerd is voor die gebruikersnaam, dan wordt er een e-mail verzonden om uw wachtwoord opnieuw in te stellen.",
+       "passwordreset-emailsent-capture2": "De wachtwoordherstel-{{PLURAL:$1|e-mail is|e-mails zijn}} verzonden. {{PLURAL:$1|De gebruikersnaam en het wachtwoord worden|De lijst van gebruikersnamen en wachtwoorden wordt}} hier weergegeven.",
        "passwordreset-emailerror-capture2": "Het e-mailen naar de {{GENDER:$2|gebruiker}} is mislukt: $1 {{PLURAL:$3|De gebruikersnaam en het wachtwoord|De lijst met gebruikersnamen en wachtwoorden}} wordt hieronder weergegeven.",
        "passwordreset-invalideamil": "Ongeldig e-mailadres",
        "passwordreset-nodata": "Er is geen gebruikersnaam of e-mailadres opgegeven",
index 073f40f..fa11081 100644 (file)
        "nocookiesnew": "A conta de utilizador foi criada, mas neste momento não tem sessão iniciada.\nA {{SITENAME}} utiliza ''cookies'' para autenticar os utilizadores.\nOs ''cookies'' estão desativados no seu navegador.\nAtive-os e inicie sessão com o seu nome de utilizador e a sua palavra-passe, por favor.",
        "nocookieslogin": "A {{SITENAME}} utiliza ''cookies'' para autenticar os utilizadores.\nOs ''cookies'' estão desativados no seu navegador.\nAtive-os e tente novamente, por favor.",
        "nocookiesfornew": "A conta de utilizador não foi criada, porque não foi possível confirmar a sua origem.\nCertifique-se de que tem os ''cookies'' ativados, recarregue esta página e tente novamente.",
-       "createacct-loginerror": "A conta foi criada com êxito, mas não pôde ser autenticado automaticamente. Por favor, faça o [[Special:UserLogin|início de sessão manualmente]].",
+       "createacct-loginerror": "A conta foi criada, mas não foi possível iniciar a sessão automaticamente. Por favor, [[Special:UserLogin|inície a sessão manualmente]].",
        "noname": "Não especificou um nome de utilizador válido.",
        "loginsuccesstitle": "Autenticação bem sucedida",
        "loginsuccess": "'''Encontra-se agora ligado à {{SITENAME}} como \"$1\"'''.",
        "version-entrypoints": "URL de ponto de entrada",
        "version-entrypoints-header-entrypoint": "Ponto de entrada",
        "version-entrypoints-header-url": "URL",
+       "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath Caminho dos artigos]",
+       "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgScriptPath Caminho dos <i>scripts</i>]",
        "version-libraries": "Bibliotecas instaladas",
        "version-libraries-library": "Biblioteca",
        "version-libraries-version": "Versão",
        "api-error-stashedfilenotfound": "O ficheiro escondido não foi encontrado ao tentar carregá-lo.",
        "api-error-stashpathinvalid": "O caminho no qual o ficheiro escondido deveria ter sido encontrado era inválido.",
        "api-error-stashfilestorage": "Ocorreu um erro no carregamento do ficheiro escondido.",
-       "api-error-stashzerolength": "O servidor não pôde esconder o ficheiro, porque ele tinha de comprimento zero.",
+       "api-error-stashzerolength": "Não foi possível o servidor esconder o ficheiro, porque este tinha comprimento zero.",
        "api-error-stashnotloggedin": "Tem de ter uma sessão iniciada para gravar ficheiros na área de ficheiros escondidos.",
        "api-error-stashwrongowner": "O ficheiro a que estava a tentar aceder na área de ficheiros escondidos não lhe pertence.",
        "api-error-stashnosuchfilekey": "O chave do ficheiro a que estava a tentar aceder na área de ficheiros escondidos não existe.",
        "authform-notoken": "Chave em falta",
        "authform-wrongtoken": "Chave errada",
        "specialpage-securitylevel-not-allowed-title": "Não permitido",
-       "specialpage-securitylevel-not-allowed": "Desculpe, não tem permissão para utilizar esta página porque a sua identidade não pôde ser verificada.",
+       "specialpage-securitylevel-not-allowed": "Desculpe, não tem permissão para utilizar esta página porque não foi possível verificar a sua identidade.",
        "authpage-cannot-login": "Não é possível iniciar sessão.",
        "authpage-cannot-login-continue": "Não é possível continuar a iniciar sessão. A sua sessão pode ter expirado.",
        "authpage-cannot-create": "Não é possível iniciar a criação da conta.",
index 913f1a6..2338dd1 100644 (file)
@@ -94,7 +94,8 @@
                        "Jdforrester",
                        "Jack who built the house",
                        "Cat1987",
-                       "SergeyButkov"
+                       "SergeyButkov",
+                       "Irus"
                ]
        },
        "tog-underline": "Подчёркивание ссылок:",
        "virus-badscanner": "Ошибка настройки. Неизвестный сканер вирусов: ''$1''",
        "virus-scanfailed": "ошибка сканирования (код $1)",
        "virus-unknownscanner": "неизвестный антивирус:",
-       "logouttext": "'''Вы завершили сеанс работы.'''\n\nНекоторые страницы могут продолжать отображаться в том виде, как будто вы всё ещё представлены системе. Для борьбы с этим явлением обновите кэш браузера.",
+       "logouttext": "<strong>Вы завершили сеанс работы.</strong>\n\nНекоторые страницы могут продолжать отображаться в том виде, как будто вы всё ещё представлены системе. Для борьбы с этим явлением обновите кэш браузера.",
        "cannotlogoutnow-title": "Невозможно выйти прямо сейчас",
        "cannotlogoutnow-text": "Нельзя выйти во время использования $1.",
        "welcomeuser": "Добро пожаловать, $1!",
        "undo-failure": "Правка не может быть отменена из-за несовместимости промежуточных изменений.",
        "undo-norev": "Правка не может быть отменена, так как её не существует или она была удалена.",
        "undo-nochange": "Правка, похоже, уже была отменена.",
-       "undo-summary": "Отмена правки $1, сделанной {{GENDER:$2|участником|участницей}} [[Special:Contribs/$2|$2]] ([[User talk:$2|обс.]])",
+       "undo-summary": "Отмена правки $1, сделанной {{GENDER:$2|участником|участницей}} [[Special:Contributions/$2|$2]] ([[User talk:$2|обс.]])",
        "undo-summary-username-hidden": "Отмена правки $1, сделанной участником, чьё имя скрыто",
        "cantcreateaccount-text": "Создание учётных записей с этого IP-адреса ('''$1''') было заблокировано {{GENDER:$3|участником|участницей|}} [[User:$3|$3]].\n\n$3 {{GENDER:$3|указал|указала}} следующую причину: ''$2''.",
        "cantcreateaccount-range-text": "{{GENDER:$3|Участник|Участница}} [[User:$3|$3]] {{GENDER:$3|установил|установила}} запрет на создание учётных записей из диапазона IP-адресов <strong>$1</strong>, включающего ваш IP-адрес (<strong>$4</strong>). \n\nБыла указана следующая причина: $2.",
        "alreadyrolled": "Невозможно откатить последние изменения страницы «[[:$1]]», совершённые [[User:$2|$2]] ([[User talk:$2|обсуждение]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]),\nпоскольку кто-то другой уже успел откатить эти правки или отредактировать страницу.\n\nПоследние изменения {{GENDER:$3|внёс|внесла}} [[User:$3|$3]] ([[User talk:$3|обсуждение]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "Было дано описание изменения: <em>$1</em>.",
        "revertpage": "Откат правок [[Special:Contributions/$2|$2]] ([[User talk:$2|обсуждение]]) к версии [[User:$1|$1]]",
-       "revertpage-nouser": "Ð\9fÑ\80авки (имÑ\8f Ñ\83Ñ\87аÑ\81Ñ\82ника Ñ\81кÑ\80Ñ\8bÑ\82о) Ð¾Ñ\82каÑ\87енÑ\8b к версии {{GENDER:$1|[[User:$1|$1]]}}",
+       "revertpage-nouser": "Ð\9eÑ\82каÑ\82 Ð¿Ñ\80авок (имÑ\8f Ñ\83Ñ\87аÑ\81Ñ\82ника Ñ\81кÑ\80Ñ\8bÑ\82о) к версии {{GENDER:$1|[[User:$1|$1]]}}",
        "rollback-success": "Откачены правки $1; возврат к версии $2.",
        "rollback-success-notify": "Откачены правки $1; возврат к последней версии $2. [$3 Показать изменения]",
        "sessionfailure-title": "Ошибка сеанса",
index 4b39079..6712a2f 100644 (file)
        "variants": "Вариантъёс",
        "navigation-heading": "Навигация",
        "errorpagetitle": "Янгыш",
+       "returnto": "Берыктон борды бам $1.",
        "tagline": "{{SITENAME}}-ысь материал",
        "help": "Валэктонъёс",
        "search": "Утчан",
        "jumptonavigation": "навигация",
        "jumptosearch": "утчан",
        "pool-errorunknown": "Тодмотэм янгыш",
-       "aboutsite": "«{{SITENAME}}»-лэн описаниез",
+       "aboutsite": "{{SITENAME}} сярысь",
        "aboutpage": "Project:Описание",
        "copyright": "Пуштрос $1 лицензияя луэ ярамон (мукетыз валэктэмын ӧвӧл дыръя).",
        "copyrightpage": "{{ns:project}}:Автор праваос",
        "databaseerror-function": "Функция: $1",
        "databaseerror-error": "Янгыш: $1",
        "viewsource": "Кодзэ учкыны",
-       "viewsource-title": "ТекÑ\81Ñ\82 Ð¿Ð¾Ñ\82он бам $1",
+       "viewsource-title": "Ð\9aодзÑ\8d Ñ\83Ñ\87кÑ\8bнÑ\8b бам $1",
        "actionthrottled": "Кекатыны ужъёс",
        "actionthrottledtext": "Ужрадлэн ӟечлыкез злоупотребление-нюръяськон, та ужрад тӥ понна укыр трос поллы сюбегамын быдэстон вакчи дыр кусыпъёс, лимитъёс, та тӥляд но тубе.\nПожалуйста, кӧня ке минут ортчыса, нош ик утчасько.",
        "protectedpagetext": "Та бамез утьыны луэ шуыса, яке мукет уже предотвращать редактировать карон.",
        "protectedinterface": "Та текст бам вайытиськом, та программаын вики интерфейсъёс, но дурбасьтэ, мед злоупотребление предотвращать.\nВика ватсаса, ваньзэ воштыны яке берыктон понна, пожалуйста, [https://translatewiki.net/ translatewiki.net] MediaWiki локализация проект.",
        "editinginterface": "<strong>Юа:</strong> редактировать карыны бамзэ тон, программное обеспечение понна со интерфейс текстовые кылдытон понна кутыны.\nТа викилэн мукет бамаз луись туссэ воштон понна та интерфейсэз пользователь пользовательский педпал быгатонлыкъёссэс.",
        "namespaceprotected": "Тон дорын редактировать карыны бам ӧвӧл юаське <кужмо>$1</strong> инты нимъёс.",
+       "exception-nologin": "Тон эн тусбуяськыны сӧзнэтэз",
        "logouttext": "<strong>Тон али потэ.</strong>\n\nУчком, мар быгатозы бам куд-ог сямъёсты тӥледыз кадь возьматӥсько ке луысал, азьвыл сямен азьвыл системая пыртэмын, тон ӧд сузя, дыр кеш браузер.",
        "welcomeuser": "Гажаса-а, $1!",
        "welcomecreation-msg": "Тӥляд гожъямъёсты учётной кылдытэмын вал.\nТӥ быгатӥськоды воштэ {{SITENAME}} [[Special:Preferences|параметръёсты]] ке потэ тӥледлы.",
        "yourname": "Пырон ним:",
        "userlogin-yourname": "Пырон ним:",
+       "createacct-another-username-ph": "Учётной книга нимъёс пыртэмын",
        "yourpassword": "Лушкемкыл:",
        "userlogin-yourpassword": "Лушкемкыл",
+       "createacct-yourpasswordagain": "Пароль юнматэ",
+       "userlogin-remembermypassword": "Кылем сӧзнэтэз",
        "cannotcreateaccount-title": "Уг быгатиськы гожъян кылдӥз учётной",
        "yourdomainname": "Тӥ доменэн:",
        "login": "Пырыны",
        "nav-login-createaccount": "Нимдэс вераны / Регистрациез ортчытыны",
-       "userlogin": "РегиÑ\81Ñ\82Ñ\80аÑ\86иез Ð¾Ñ\80Ñ\82Ñ\87Ñ\8bÑ\82Ñ\8bнÑ\8b Ñ\8fке Ð\92икипедие Ð¿Ñ\8bÑ\80ыны",
+       "userlogin": "Ð\9dимдÑ\8dÑ\81 Ð²ÐµÑ\80анÑ\8b / Ð ÐµÐ³Ð¸Ñ\81Ñ\82Ñ\80аÑ\86иез Ð¾Ñ\80Ñ\82Ñ\87Ñ\8bÑ\82ыны",
        "userloginnocreate": "Пырыны",
        "logout": "Кошкыны",
        "userlogout": "Потыны",
+       "notloggedin": "Тон эн тусбуяськыны сӧзнэтэз",
        "nologin": "Учётной книга ӧвӧл-а? $1.",
        "nologinlink": "Выль вики-авторлэн регистрациез",
        "createaccount": "выль вики-авторлэн регистрациез",
        "userlogin-resetpassword-link": "Тӥлесьтыд парольдэс куштыны?",
        "userlogin-helplink2": "Пыронъя юрттэт",
        "createacct-emailrequired": "Электронной почталэн адресэз",
+       "createacct-emailoptional": "Электронной почтаезлэн адресэз (необязательное)",
+       "createaccountmail": "Адрес электронной почта огдырлы кутӥ вылын возьматэм образъёсыныз но соослэн случайной сгенерировать пароль ыстыны",
        "createacct-submit": "Выль вики-авторлэн регистрациез",
        "createacct-another-submit": "Выль вики-авторлэн регистрациез",
        "loginerror": "Янгышъёс пырон",
        "nocookiesnew": "Книга кылдытыны учётной пользователь вал, нош система тон уд пыры.\n{{SITENAME}} пользователь cookies пырон понна кутыны.\nDisconnect cookies тонэ дорам.\nПожалуйста, со гожтӥське, нош собере выльысь пырыны логин но пароль.",
        "nocookieslogin": "{{SITENAME}} пользователь cookies пырон понна кутыны.\nDisconnect cookies тонэ дорам.\nПожалуйста, соосты утчано, выльысь гожтыны.",
        "blocked-mailpassword": "Тон IP-адрес заблокировать-ысь редактировать карон. Злоупотребление предотвращение понна, та понна кутыны ӧз лэзиське пароль-ысь восстановление IP-адрес.",
-       "loginlanguagelabel": " Кыл: $1",
+       "loginlanguagelabel": "Кыл: $1",
        "pt-login": "Пырыны",
        "pt-login-button": "Пырыны",
        "pt-createaccount": "Выль вики-авторлэн регистрациез",
        "blockedtext": "<strong>Книгае яке учётной IP-адрес заблокирован.</strong>\n\nБлокировка администратор потӥз $1.\nВозьмалэ вуоно мугез: \"\"$2\"\".\n\n* Кутскон блокировка: $8\n* Блокировка ортчиз: $6\n* Блокировка меретъёсыз: $7\n\nБыгатӥськод-а тон герӟаськемын $1 яке мукет котькудӥныз [[{{MediaWiki:Grouppage-sysop}}|администраторъёс]], блокировка мед эскерозы.\nУчком, мар кутыны уг быгато функцизэс \"гожтэт\", ас ке [[Special:Preferences|настройка персональной]] зуркатӥсь яке электронной почтаезлэн адресэз эн чуртна уг корректный, яке гожтӥськод ке, гожтэт ыстон укшась блокировка алон.\nТон IP-адрес — $3, блокировка идентификаторлэн — $5.\nПожалуйста, аслэсьтым тодон-та вазиськонэз котьку возьмано.",
        "autoblockedtext": "Тон IP-адрес, герӟет автоматически заблокирован а со, мар солэн кутыны луоно азьвыл кин ке но пырисьёс пӧлысь, заблокирован {{GENDER:$4|участник|куакеч}} $1. \nБлокировка возьмано луоз вуоно мугез:\n\n: \"$2\" - лы.\n\n* Кутскон блокировка: $8\n* Блокировка ортчиз: $6\n* Блокировка меретъёсыз: $7\n\nБыгатӥськод-а тон герӟаськемын $1 яке мукет котькудӥныз [[{{MediaWiki:Grouppage-sysop}}|администраторъёс]], блокировка мед эскерозы.\n\nУчком, мар кутыны уг быгато функцизэс \"гожтэт\", ас ке [[Special:Preferences|настройка персональной]] зуркатӥсь яке электронной почтаезлэн адресэз эн чуртна уг корректный, яке гожтӥськод ке, гожтэт ыстон укшась блокировка алон.\n\nТон IP-адрес — $3, блокировка идентификаторлэн — #$5.\nПожалуйста, аслэсьтым тодон-та вазиськонэз котьку возьмано.",
        "blockednoreason": "мугезлы эн возьмалэ",
+       "whitelistedittext": "Тон кулэ $1 бам воштон понна.",
+       "loginreqtitle": "Авторизация кулэ",
        "loginreqlink": "пырыны",
+       "loginreqpagetext": "Тон кулэ $1-ысь, сое мукет бамез учкыны шуыса.",
+       "newarticletext": "Тон бам ссылкаос вылэ выжыса, со кема уз улы.\nСоос мед кылдозы, текст бичась укноос, улазы интыяськемын (умой-умой см. [$1 бам справочной]).\nЯнгыш-а тон татын луысалыд ке, кнопказэ зӥбиз гинэ <strong>берлань</strong> асьтэлэсь браузеръёстэс.",
        "noarticletext": "Али дыре та бамын текст ӧвӧл. \nТӥ быгатоды [[Special:Search/{{PAGENAME}}|шедьтыны со сярысь кыӵе ке ивор]] мукет бамъёсысь,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} шедьтыны журналъёсысь гожъямъёсыз], \nяке [{{fullurl:{{FULLPAGENAME}}|action=edit}} сыӵе нимын бам кылдытыны]</span>.",
+       "noarticletext-nopermission": "Али дыре та бам вылын кылкуэт ӧвӧл.\nТон быгатӥськод [[Special:Search/{{PAGENAME}}|сётэм йыръянъёс шедьто упоминание]] мукет бам вылын,\nяке <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} соответствующий журнал книгаез шедьтыны].</span> Тӥ дорын сётӥське юаськыны кылдӥз бам ӧвӧл.",
        "blocked-notice-logextract": "Пользователь заблокирован сётӥз та учырлы.\nСправка понна радъяськылӥсь журнал блокировка лапег берпуметӥ гожтэт:",
        "continue-editing": "Тупатъянэз азьланьтоно",
        "editing": "Тупатон: $1",
        "editingsection": "Тупатон: $1 (люкет)",
        "template-protected": "(утемын)",
        "template-semiprotected": "(полузащищенный)",
+       "nocreatetext": "Та сайтлэн бамаз выль сюбегатэм луонлыкъёсын кылдытон.\nТон улыса, берлань вуэ быгатэ бам отредактировать, [[Special:UserLogin|тусбуяськыны книгае яке выль система кылдыто учётной]].",
        "nocreate-loggedin": "Тон доразы юаськыны кылдӥз выль бам ӧвӧл.",
        "permissionserrors": "Янгышъёс юаське",
+       "permissionserrorstext": "Тон дорын разрешенизы ӧвӧлэн, тазэ лэсьтом шуыса, со понна вуоно {{PLURAL:$1|мугез}}:",
+       "permissionserrorstext-withaction": "Правоез ӧвӧл, тон дорын $2 тӥ {{PLURAL:$1/1=мугез вуоно|мугез вуоно}}:",
        "content-model-wikitext": "викитекст",
-       "cantcreateaccount-text": "Та книгаез кылдытонлы учётной IP-адрес (<кужмо>$1</кужмо>) заблокировать луизы [[User:$3|$3]].\n\nМугез, вайиз $3 возьматэ <em>$2</сиоз>",
-       "cantcreateaccount-range-text": "Учётной кылдытон - гожъян IP-адрес диапазонын <кужмо>$1</strong>, Тон пыриське со IP-адрес (<кужмо>$4</кужмо>), заблокировать луизы [[User:$3|$3]].\n\nМугез, вайиз $3 возьматэ <em>$2</сиоз>",
+       "undo-summary": "Шонертон вошъян $1, лэсьтӥзы {{GENDER:$2|участник|куакеч}} [[Special:Contributions/$2|$2]] ([[User talk:$2|обс.]])",
+       "cantcreateaccount-text": "Та книгаез кылдытонлы учётной IP-адрес (<strong>$1</strong>) заблокировать луизы [[User:$3|$3]].\n\nМугез, вайиз $3 возьматэ <em>$2</em>",
+       "cantcreateaccount-range-text": "Учётной кылдытон - гожъян IP-адрес диапазонын <strong>$1</strong>, Тон пыриське со IP-адрес (<strong>$4</strong>), заблокировать луизы [[User:$3|$3]].\n\nМугез, вайиз $3 возьматэ <em>$2</em>",
        "viewpagelogs": "Та бамлы журналъёсыз возьматыны",
        "revisionasof": "Версия $1",
        "previousrevision": "← Вужгем",
        "searchprofile-images": "Мультимедиа",
        "searchprofile-everything": "Котькытын",
        "searchprofile-advanced": "Паськытатэм",
+       "searchprofile-articles-tooltip": "$1 пушкын утчан",
        "searchprofile-images-tooltip": "Файлъёсты утчан",
        "searchprofile-everything-tooltip": "Вань бамъёсэтӥ утчан (вераськон бамъёсты пыртыса)",
        "search-result-size": "$1 ({{PLURAL:$2|$2 кыл}})",
        "prefs-editing": "Тупатон",
        "yourlanguage": "Интерфейслэн кылыз:",
        "prefs-preview": "Бамез эскерон",
+       "editusergroup": "Группае {{GENDER:$1|пырись}} мукет",
+       "group-autoconfirmed": "Автоподтвержденный пыриськисьёс",
+       "group-bot": "Боты",
        "group-sysop": "Администраторъёс",
        "group-all": "(ваньзэ)",
+       "right-read": "лыдӟыны бам",
+       "right-edit": "правка бам",
+       "right-createpage": "бам кылдытон-а, уг-возьматэмзэ эскерон",
+       "right-createtalk": "создание бамлэн обсуждениосаз",
+       "right-createaccount": "выль книга кылдытон пыриськизы учётной",
+       "right-writeapi": "гожтэтъёсты кутон понна API",
+       "right-block": "мукет пыриськисьёслэсь курон-косон вылэ установкаосты редактировать",
        "newuserlogpage": "Викиавторъёсыз регистрациосын журнал",
+       "action-read": "та лыдӟонъёс бам",
+       "action-edit": "та бамез редактировать",
+       "action-block": "пыриськисьёс та понна луонлыкъёссы сюбегам редактировать",
        "enhancedrc-history": "история",
        "recentchanges": "Выль тупатонъёс",
        "recentchanges-label-newpage": "Та тупатонэн выль бам кылдӥз",
        "recentchanges-label-bot": "Та тупатонэз кариз бот",
        "recentchanges-submit": "Возьматыны",
        "rcshowhideminor-show": "Возьматыны",
+       "rcshowhidebots": "$1 ботъёсыз",
        "rcshowhidebots-show": "Возьматыны",
+       "rcshowhideliu": "$1 пырем викиавторъёсыз",
        "rcshowhideliu-show": "Возьматыны",
        "rcshowhideanons-show": "Возьматыны",
        "rcshowhideanons-hide": "Ватыны",
        "hist": "история",
        "hide": "Ватыны",
        "show": "Возьматыны",
-       "minoreditletter": "и",
+       "minoreditletter": "п",
        "newpageletter": "В",
        "boteditletter": "б",
        "rc-change-size-new": "Воштон бере быдӟала: $1 {{PLURAL:$1|байт}}",
        "recentchangeslinked": "Герӟаськем тупатонъёс",
        "recentchangeslinked-feed": "Герӟаськем тупатонъёс",
        "recentchangeslinked-toolbox": "Герӟаськем тупатонъёс",
+       "recentchangeslinked-summary": "Татын алигес воштэм бамъёс адӟытэмын, кудъёссэ пусъем бам чӧлске (яке кудъёсыз пусъем категорие пыро).\n[[Special:Watchlist|Чаклан списокысьтыды]] бамъёс <strong>адӟиськытэмын</strong>.",
        "upload": "Файл поныны",
+       "uploadnologin": "Тон эн тусбуяськыны сӧзнэтэз",
+       "uploadnologintext": "Тон кулэ $1, медаз загрузка файл сервер.",
+       "uploaddisabled": "Загрузка алӥзы",
+       "copyuploaddisabled": "Загрузка URL disconnect.",
+       "uploaddisabledtext": "Загрузка файл disconnect.",
        "upload-dialog-button-cancel": "Берытсконо",
        "nolicense": "Ӧвӧл",
        "file-anchor-link": "Файл",
        "filehist": "Файллэн историез",
+       "filehist-help": "Зӥбе дата/дыр шоры, кызьы файл со дырын адӟиськемез учкыны вылысь.",
+       "filehist-current": "алиез",
        "filehist-datetime": "Дата/дыр",
        "filehist-thumb": "Миниатюра",
        "filehist-user": "Викиавтор",
        "filehist-dimensions": "Быдӟала",
        "filehist-comment": "Валэктон",
        "imagelinks": "Файлэз уже кутон",
+       "linkstoimage": "{{PLURAL:$1|$1 бам}} та файлэз чӧлске:",
        "sharedupload": "Та файл — $1-ысь, сое мукет проектъёсын но уже кутыны луэ.",
        "sharedupload-desc-here": "Та файл — $1-ысь, сое мукет проектъёсын но уже кутыны луэ.\n[$2 Файл гожъясь бамысьтыз] информация адӟытэмын улын.",
        "randompage": "Олокыӵе статья",
        "checkbox-all": "Ваньзэ",
        "checkbox-none": "Номыре",
        "checkbox-invert": "Воштыны интыен",
+       "allpagessubmit": "Быдэстоно",
        "categories-submit": "Возьматыны",
        "sp-deletedcontributions-contribs": "тупатонъёсыз",
        "listusers-submit": "Возьматыны",
        "listusers-blocked": "(заблокировать{{GENDER:$1||а}})",
+       "listgrouprights": "Право группае пыриськисьёс",
+       "listgrouprights-summary": "Та группае пырисьёс возьматыны кулэ вики список улӥзы, право соответствующийгес солы возьматоно кариськиз. Оло, ас кожазы ватсаса ивортодэт улыны эрикрадэз сярысь.",
+       "listgrouprights-members": "(список пыриськисьёс)",
        "emailuser": "Викиавторлы гожтэт",
        "emailmessage": "Ивортон:",
        "watchlist": "Чаклан список",
        "watchlist-options": "Чаклан списокез тупатыны",
        "enotif_reset": "Вань бамъёсыз лыдӟем пусйыны",
        "historyaction-submit": "Возьматыны",
+       "deletionlog": "палэнэ журнал",
        "rollbacklink": "ӝог берыктыны",
+       "revertpage": "Откат шонертон [[Special:Contributions/$2|$2]] ([[User talk:$2|обсуждение]]) доры версия [[User:$1|$1]]",
+       "revertpage-nouser": "Откат шонертон (пыриськисьёс ватэм нимъёссы) доры версия {{GENDER:$1|[[User:$1|$1]]}}",
        "restriction-edit": "Тупатон",
+       "undeletehistory": "Выльысь ке тон бамъёстэ, выльысь историяз луэм воштӥськонъёс вань.\nБӧрысь кылдӥзы выль бамъёс палэнэ кошконо луэ ке, сыӵе ик нимыз, историяз вошъяськонъёс предшествующий выльысь кылдозы.",
+       "undeletehistorynoadmin": "Статьяос палэнтэмын вал. Мугез но палэнэ список пыриды, со статьяе редактировать-озь палэнэгес, зӧк возьматэ. Текст статьяез удаленный администраторъёс гинэ учкыны быгатод.",
+       "invert": "Ватыны быръемез",
        "blanknamespace": "(Валтӥсез)",
        "contributions": "{{GENDER:$1|Викиавтор}} гожтэмъёсы",
        "contributions-title": "$1 викиавтор гожтэмъёсы",
        "mycontris": "Гожтэмъёс",
+       "nocontribs": "Критерии нокыӵе воштӥськонъёс та соответствующий шедьтыны уг луы.",
+       "sp-contributions-blocklog": "блокировка",
+       "sp-contributions-deleted": "шонертон палэнтыны {{GENDER:$1|участник|куакеч}}",
+       "sp-contributions-blocked-notice": "Пользователь заблокирован сётӥз та учырлы. Справка понна радъяськылӥсь журнал блокировка лапег берпуметӥ гожтэт:",
+       "sp-contributions-blocked-notice-anon": "Со ip-адрес вие заблокировать сётӥзы. Блокировка журналъёсты вайытэк улӥзы берпуметӥ книгаысь:",
        "whatlinkshere": "Татчы чӧлсконъёс",
        "block": "Блокировка пыриськисьёс",
        "blockip": "Заблокировать пыриськисьёс",
+       "ipbreason-dropdown": "* Блокировка мугез кабес\n** Полы информациез оскизы\n** Вордскем палэнэ бам\n** Спам-сайтъя педпал чӧлскон\n** Текстлэсь визьем ватсан/жуг-жаг\n** Кышкытлыклэсь, пыриськыны уйиськон\n** Злоупотребление кӧня ке книга учётной\n** Пыриськисьёслэн нимъёссы пыриськисьёс",
+       "ipboptions": "2 час:2 hours,1 нуналлы:1 day,3 нуналлы:3 days,1 арняезлы:1 week,2 арняяз:2 weeks,1 толэзь:1 month,3 толэзь:3 months,6 толэзь:6 months,1 арлэн:1 year,бессрочно:infinite",
        "unblocked": "$1 разблокировать",
        "unblocked-id": "Блокировка $1 басьтоно луиз",
        "blocklist-target": "Ужпумъёс",
        "blocklist-reason": "Мугез",
+       "infiniteblock": "бессрочно",
+       "expiringblock": "йылпумъяськиз $1-ысь $2",
+       "anononlyblock": "аноним гинэ",
+       "noautoblockblock": "disconnect автоблокировка",
+       "createaccountblock": "гожъямъёстэс лэзьыны кылдытон учётной",
+       "emailblock": "лэзьымтэ гожтэт ыстон",
+       "blocklist-nousertalk": "тупатъяны ачиз уггес быгаты бамлэн обсуждениосаз",
        "blocklink": "блокировать карыны",
+       "unblocklink": "разблокировать",
+       "change-blocklink": "блокировка воштыны",
        "contribslink": "тупатонъёсыз",
+       "autoblocker": "Автоблокировка-со понна, мае тӥ IP-адрес кутыны али \"[[User:$1|$1]]\". \nБлокировка мугез $1: \"$2\"",
        "blocklogentry": "заблокировать [[$1]] дыр $2 $3",
        "reblock-logentry": "блокировка воштӥз [[$1]] дыр $2 $3",
-       "blocklogtext": "Блокировка но та журналлэн ужезлы разблокирование пользователь.\nЗаблокировать Автоматически IP-адрес уг возьма.\nПроизведениосыз печатласько эстониын [[нимысьтыз:сьӧд списокын|сьӧд списокын]], бан список блокъёс лэсьтыны.",
+       "blocklogtext": "Блокировка но та журналлэн ужезлы разблокирование пользователь.\nЗаблокировать Автоматически IP-адрес уг возьма.\nПроизведениосыз печатласько эстониын [[Special:BlockList|сьӧд списокын]], бан список блокъёс лэсьтыны.",
        "unblocklogentry": "разблокировать $1",
+       "block-log-flags-anononly": "пользователь гинэ нимтултэм",
+       "block-log-flags-nocreate": "регистрация учётной книгая ужъёсты быдэстон",
+       "block-log-flags-noemail": "лэзьымтэ гожтэт ыстон",
+       "block-log-flags-nousertalk": "тупатъяны ачиз уггес быгаты бамлэн обсуждениосаз",
        "range_block_disabled": "Администратор диапазонэз блокировать али.",
        "move-watch": "Чаклан списоке пыртоно инъет но валтӥсь бамъёсыз",
        "allmessagesname": "Ивортон",
        "tooltip-n-help": "Юрттэт басьтымон инты",
        "tooltip-t-whatlinkshere": "Ваньмыз бамъёс, кудъёсаз та бамлы линксы вань",
        "tooltip-t-recentchangeslinked": "Выль тупатонъёс бамъёсын, кудъёссэ та бам чӧлске",
+       "tooltip-feed-atom": "Та бамлэн Atom-е трансляциез",
        "tooltip-t-upload": "Файл поныны",
        "tooltip-t-specialpages": "Специальной бамъёслэн списоксы",
        "tooltip-t-print": "Та бамысь печатламон версия",
        "pageinfo-header-edits": "Воштонъёслэн историзы",
        "pageinfo-toolboxlink": "Бам сярысь тодэтъёс",
        "file-info-size": "$1 × $2 пиксель, файллэн быдӟалаез: $3, MIME-тип: $4",
+       "show-big-image": "Инъет файл",
+       "show-big-image-preview": "Быдӟалаез та бамын: $1.",
+       "show-big-image-other": "Мукет {{PLURAL:$2|быдӟалаез|быдӟалаосыз}}: $1.",
        "show-big-image-size": "$1 × $2 пиксель",
        "metadata": "Метаданнойёс",
        "metadata-fields": "Суредысь метаданнойёслэн та списоке пыртэм полеоссы адӟытӥськозы суред бам вылын, метаданнойёслэн таблицазы бинемын дыръя.\nМукет полеоссы ватскозы.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
        "exif-disclaimer": "Кыл кутыны пумит луон",
        "namespacesall": "ваньзэ",
        "monthsall": "ваньзэ",
+       "confirmrecreate-noreason": "{{GENDER:$1|Участник|Куакеч|}}&nbsp;[[User:$1|$1]] ([[User talk:$1|обс]]) {{GENDER:$1|палэнтыны|палэнтыны}} таиз бере бам, кызьы тон сое редактировать карыны кутскиз. Пожалуйста, подтвердите, мар тон малпаськод та бамез зэм но выльысь кылдозы.",
        "confirm-watch-top": "Та бамез чаклан списокады пыртоно?",
        "autosumm-new": "Выль бам: «$1»",
+       "version": "Версия",
        "specialpages": "Ваньмыз панельёс",
+       "specialpages-group-login": "Тусбуяськыны / Гожтӥськоно",
+       "specialpages-group-users": "Пыриськисьёслэсь правооссэс но",
        "tag-filter": "[[Special:Tags|Тэгъёсыз]] фильтр:",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|1=Метка|Меткаос}}]]: $2)",
        "tags-title": "Меткаос",
+       "logentry-delete-delete": "$1 {{GENDER:$2|палэнтыны|палэнтыны}} бам $3",
+       "logentry-delete-restore": "$1 {{GENDER:$2|выльысь}} бам $3",
        "logentry-newusers-create": "$1 нимо учётной запись {{GENDER:$2|кылдытэмын}} вал",
        "searchsuggest-search": "Утчано {{SITENAME}}",
        "searchsuggest-containing": "кудъёсаз вань...",
index cccd0bf..a5b5513 100644 (file)
        "feedback-thanks": "Дякуємо! Ваші відгук розміщено на сторінці \"[$2 $1]\".",
        "feedback-thanks-title": "Дякуємо!",
        "feedback-useragent": "User Agent:",
-       "searchsuggest-search": "Пошук у {{grammar:prepositional|{{SITENAME}}}}",
+       "searchsuggest-search": "Пошук {{GRAMMAR:locative|{{SITENAME}}}}",
        "searchsuggest-containing": "що містять...",
        "api-error-autoblocked": "Вашу IP-адресу було заблоковано автоматично, тому що її використовував заблокований користувач.",
        "api-error-badaccess-groups": "Вам не дозволено завантажувати файли до цього вікіпроекту.",
index 8745185..2904f42 100644 (file)
        "viewdeletedpage": "查看被删页面",
        "undeletepagetext": "以下{{PLURAL:$1|页面|$1个页面}}已被删除,但依然在归档中并可以被恢复。归档可能会被定时清理。",
        "undelete-fieldset-title": "还原版本",
-       "undeleteextrahelp": "要恢复该页面的整个历史记录时,不选中任何复选框直接点击'''''{{int:undeletebtn}}'''''。要选择性地恢复部分版本时,请选中相应版本前的复选框再点击'''''{{int:undeletebtn}}'''''。",
+       "undeleteextrahelp": "要恢复该页面的整个历史记录时,不选中任何复选框直接点击<strong><em>{{int:undeletebtn}}</em></strong>。要选择性地恢复部分版本时,请选中相应版本前的复选框再点击<strong><em>{{int:undeletebtn}}</em></strong>。",
        "undeleterevisions": "$1个{{PLURAL:$1|修订版本}}已删除",
        "undeletehistory": "如果您恢复了该页面,所有版本都会被恢复到版本历史中。如果本页删除后有一个同名的新页面建立,被恢复的版本将会出现在先前的历史中。",
        "undeleterevdel": "如果把最新版本部分删除,反删除将会无法进行。如果遇到这种情况,您必须反选或反隐藏最新已删除的版本。",
        "htmlform-select-badoption": "您指定的值不是有效选项。",
        "htmlform-int-invalid": "您指定的值不是整数。",
        "htmlform-float-invalid": "您指定的值不是数字。",
-       "htmlform-int-toolow": "您指定的值小于最小值$1",
+       "htmlform-int-toolow": "您指定的值小于最小值$1",
        "htmlform-int-toohigh": "您指定的值大于最大值$1",
        "htmlform-required": "本值必填",
        "htmlform-submit": "提交",
index 694c23d..434b9f8 100644 (file)
        "grant-basic": "基本權限",
        "grant-viewdeleted": "檢視已刪除的檔案及頁面",
        "grant-viewmywatchlist": "檢視您的監視清單",
+       "grant-viewrestrictedlogs": "檢視已限制的日誌項目",
        "newuserlogpage": "建立使用者日誌",
        "newuserlogpagetext": "此為建立使用者的日誌。",
        "rightslog": "使用者權限日誌",
        "version-poweredby-translators": " translatewiki.net 翻譯人員",
        "version-credits-summary": "我們感謝以下人士為 [[Special:Version|MediaWiki]] 作出的貢獻。",
        "version-license-info": "MediaWiki 為自由軟體;您可依據自由軟體基金會所發表的 GNU 通用公共授權條款規定,將本程式重新發佈與/或修改;無論您依據的是本授權條款的第二版或 (您可自行選擇) 之後的任何版本。\n\n本程式發佈的目的是希望可以提供幫助,但不負任何擔保責任;亦無隱含對適售性或 特定用途的適用性的情形擔保。詳情請參照 GNU 通用公共授權。\n\n您應已隨本程式收到 [{{SERVER}}{{SCRIPTPATH}}/COPYING GNU 通用公共授權條款的副本];如果沒有,請寄信通知自由軟體基金會,51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA,或 [//www.gnu.org/licenses/old-licenses/gpl-2.0.html 線上閱讀]。",
-       "version-software": "已安裝的軟體",
+       "version-software": "已安裝的軟體",
        "version-software-product": "產品",
        "version-software-version": "版本",
        "version-entrypoints": "入口 URL",
index 7dd0907..b9baf8c 100644 (file)
@@ -58,7 +58,7 @@ class ValidateRegistrationFile extends Maintenance {
                }
 
                $validator = new Validator;
-               $validator->check( $data, (object) [ '$ref' => 'file://' . $schemaPath ] );
+               $validator->check( $data, (object)[ '$ref' => 'file://' . $schemaPath ] );
                if ( $validator->isValid() && !$licenseError ) {
                        $this->output( "$path validates against the version $version schema!\n" );
                } else {
index 9599016..e0f4416 100644 (file)
@@ -1190,7 +1190,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
 
                /** @var ExternalStoreDB $externalStoreDB */
                $externalStoreDB = ExternalStore::getStoreObject( 'DB' );
-               $defaultArray = (array) $wgDefaultExternalStore;
+               $defaultArray = (array)$wgDefaultExternalStore;
                $dbws = [];
                foreach ( $defaultArray as $url ) {
                        if ( strpos( $url, 'DB://' ) === 0 ) {
@@ -1217,7 +1217,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                        return false;
                }
 
-               $defaultArray = (array) $wgDefaultExternalStore;
+               $defaultArray = (array)$wgDefaultExternalStore;
                foreach ( $defaultArray as $url ) {
                        if ( strpos( $url, 'DB://' ) === 0 ) {
                                return true;
index aed2d83..d8773f8 100644 (file)
@@ -58,17 +58,18 @@ class LBFactoryTest extends MediaWikiTestCase {
        }
 
        public function testLBFactorySimpleServer() {
-               global $wgDBserver, $wgDBname, $wgDBuser, $wgDBpassword, $wgDBtype;
+               global $wgDBserver, $wgDBname, $wgDBuser, $wgDBpassword, $wgDBtype, $wgSQLiteDataDir;
 
                $servers = [
                        [
-                               'host'      => $wgDBserver,
-                               'dbname'    => $wgDBname,
-                               'user'      => $wgDBuser,
-                               'password'  => $wgDBpassword,
-                               'type'      => $wgDBtype,
-                               'load'      => 0,
-                               'flags'     => DBO_TRX // REPEATABLE-READ for consistency
+                               'host'        => $wgDBserver,
+                               'dbname'      => $wgDBname,
+                               'user'        => $wgDBuser,
+                               'password'    => $wgDBpassword,
+                               'type'        => $wgDBtype,
+                               'dbDirectory' => $wgSQLiteDataDir,
+                               'load'        => 0,
+                               'flags'       => DBO_TRX // REPEATABLE-READ for consistency
                        ],
                ];
 
@@ -86,26 +87,28 @@ class LBFactoryTest extends MediaWikiTestCase {
        }
 
        public function testLBFactorySimpleServers() {
-               global $wgDBserver, $wgDBname, $wgDBuser, $wgDBpassword, $wgDBtype;
+               global $wgDBserver, $wgDBname, $wgDBuser, $wgDBpassword, $wgDBtype, $wgSQLiteDataDir;
 
                $servers = [
                        [ // master
-                               'host'     => $wgDBserver,
-                               'dbname'   => $wgDBname,
-                               'user'     => $wgDBuser,
-                               'password' => $wgDBpassword,
-                               'type'     => $wgDBtype,
-                               'load'     => 0,
-                               'flags'    => DBO_TRX // REPEATABLE-READ for consistency
+                               'host'        => $wgDBserver,
+                               'dbname'      => $wgDBname,
+                               'user'        => $wgDBuser,
+                               'password'    => $wgDBpassword,
+                               'type'        => $wgDBtype,
+                               'dbDirectory' => $wgSQLiteDataDir,
+                               'load'        => 0,
+                               'flags'       => DBO_TRX // REPEATABLE-READ for consistency
                        ],
                        [ // emulated slave
-                               'host'     => $wgDBserver,
-                               'dbname'   => $wgDBname,
-                               'user'     => $wgDBuser,
-                               'password' => $wgDBpassword,
-                               'type'     => $wgDBtype,
-                               'load'     => 100,
-                               'flags'    => DBO_TRX // REPEATABLE-READ for consistency
+                               'host'        => $wgDBserver,
+                               'dbname'      => $wgDBname,
+                               'user'        => $wgDBuser,
+                               'password'    => $wgDBpassword,
+                               'type'        => $wgDBtype,
+                               'dbDirectory' => $wgSQLiteDataDir,
+                               'load'        => 100,
+                               'flags'       => DBO_TRX // REPEATABLE-READ for consistency
                        ]
                ];
 
@@ -118,19 +121,23 @@ class LBFactoryTest extends MediaWikiTestCase {
                $dbw = $lb->getConnection( DB_MASTER );
                $this->assertTrue( $dbw->getLBInfo( 'master' ), 'master shows as master' );
                $this->assertEquals(
-                       $wgDBserver, $dbw->getLBInfo( 'clusterMasterHost' ), 'cluster master set' );
+                       ( $wgDBserver != '' ) ? $wgDBserver : 'localhost',
+                       $dbw->getLBInfo( 'clusterMasterHost' ),
+                       'cluster master set' );
 
                $dbr = $lb->getConnection( DB_SLAVE );
                $this->assertTrue( $dbr->getLBInfo( 'replica' ), 'slave shows as slave' );
                $this->assertEquals(
-                       $wgDBserver, $dbr->getLBInfo( 'clusterMasterHost' ), 'cluster master set' );
+                       ( $wgDBserver != '' ) ? $wgDBserver : 'localhost',
+                       $dbr->getLBInfo( 'clusterMasterHost' ),
+                       'cluster master set' );
 
                $factory->shutdown();
                $lb->closeAll();
        }
 
        public function testLBFactoryMulti() {
-               global $wgDBserver, $wgDBname, $wgDBuser, $wgDBpassword, $wgDBtype;
+               global $wgDBserver, $wgDBname, $wgDBuser, $wgDBpassword, $wgDBtype, $wgSQLiteDataDir;
 
                $factory = new LBFactoryMulti( [
                        'sectionsByDB' => [],
@@ -145,6 +152,7 @@ class LBFactoryTest extends MediaWikiTestCase {
                                'user'            => $wgDBuser,
                                'password'        => $wgDBpassword,
                                'type'            => $wgDBtype,
+                               'dbDirectory' => $wgSQLiteDataDir,
                                'flags'           => DBO_DEFAULT
                        ],
                        'hostsByName' => [
@@ -233,7 +241,7 @@ class LBFactoryTest extends MediaWikiTestCase {
        }
 
        private function newLBFactoryMulti( array $baseOverride = [], array $serverOverride = [] ) {
-               global $wgDBserver, $wgDBuser, $wgDBpassword, $wgDBname, $wgDBtype;
+               global $wgDBserver, $wgDBuser, $wgDBpassword, $wgDBname, $wgDBtype, $wgSQLiteDataDir;
 
                return new LBFactoryMulti( $baseOverride + [
                        'sectionsByDB' => [],
@@ -247,6 +255,7 @@ class LBFactoryTest extends MediaWikiTestCase {
                                'user' => $wgDBuser,
                                'password' => $wgDBpassword,
                                'type' => $wgDBtype,
+                               'dbDirectory' => $wgSQLiteDataDir,
                                'flags' => DBO_DEFAULT
                        ],
                        'hostsByName' => [
@@ -258,17 +267,32 @@ class LBFactoryTest extends MediaWikiTestCase {
        }
 
        public function testNiceDomains() {
-               global $wgDBname;
+               global $wgDBname, $wgDBtype;
+
+               if ( $wgDBtype === 'sqlite' ) {
+                       $tmpDir = $this->getNewTempDirectory();
+                       $dbPath = "$tmpDir/unit_test_db.sqlite";
+                       file_put_contents( $dbPath, '' );
+                       $tempFsFile = new TempFSFile( $dbPath );
+                       $tempFsFile->autocollect();
+               } else {
+                       $dbPath = null;
+               }
 
-               $factory = $this->newLBFactoryMulti();
+               $factory = $this->newLBFactoryMulti(
+                       [],
+                       [ 'dbFilePath' => $dbPath ]
+               );
                $lb = $factory->getMainLB();
 
-               $db = $lb->getConnectionRef( DB_MASTER );
-               $this->assertEquals(
-                       $wgDBname,
-                       $db->getDomainID()
-               );
-               unset( $db );
+               if ( $wgDBtype !== 'sqlite' ) {
+                       $db = $lb->getConnectionRef( DB_MASTER );
+                       $this->assertEquals(
+                               $wgDBname,
+                               $db->getDomainID()
+                       );
+                       unset( $db );
+               }
 
                /** @var Database $db */
                $db = $lb->getConnection( DB_MASTER, [], '' );
@@ -280,19 +304,19 @@ class LBFactoryTest extends MediaWikiTestCase {
                );
 
                $this->assertEquals(
-                       $db->addIdentifierQuotes( 'page' ),
+                       $this->quoteTable( $db, 'page' ),
                        $db->tableName( 'page' ),
                        "Correct full table name"
                );
 
                $this->assertEquals(
-                       $db->addIdentifierQuotes( $wgDBname ) . '.' . $db->addIdentifierQuotes( 'page' ),
+                       $this->quoteTable( $db, $wgDBname ) . '.' . $this->quoteTable( $db, 'page' ),
                        $db->tableName( "$wgDBname.page" ),
                        "Correct full table name"
                );
 
                $this->assertEquals(
-                       $db->addIdentifierQuotes( 'nice_db' ) . '.' . $db->addIdentifierQuotes( 'page' ),
+                       $this->quoteTable( $db, 'nice_db' ) . '.' . $this->quoteTable( $db, 'page' ),
                        $db->tableName( 'nice_db.page' ),
                        "Correct full table name"
                );
@@ -303,12 +327,12 @@ class LBFactoryTest extends MediaWikiTestCase {
                        $db->getDomainID()
                );
                $this->assertEquals(
-                       $db->addIdentifierQuotes( 'my_page' ),
+                       $this->quoteTable( $db, 'my_page' ),
                        $db->tableName( 'page' ),
                        "Correct full table name"
                );
                $this->assertEquals(
-                       $db->addIdentifierQuotes( 'other_nice_db' ) . '.' . $db->addIdentifierQuotes( 'page' ),
+                       $this->quoteTable( $db, 'other_nice_db' ) . '.' . $this->quoteTable( $db, 'page' ),
                        $db->tableName( 'other_nice_db.page' ),
                        "Correct full table name"
                );
@@ -318,9 +342,23 @@ class LBFactoryTest extends MediaWikiTestCase {
        }
 
        public function testTrickyDomain() {
+               global $wgDBtype;
+
+               if ( $wgDBtype === 'sqlite' ) {
+                       $tmpDir = $this->getNewTempDirectory();
+                       $dbPath = "$tmpDir/unit_test_db.sqlite";
+                       file_put_contents( $dbPath, '' );
+                       $tempFsFile = new TempFSFile( $dbPath );
+                       $tempFsFile->autocollect();
+               } else {
+                       $dbPath = null;
+               }
+
                $dbname = 'unittest-domain';
                $factory = $this->newLBFactoryMulti(
-                       [ 'localDomain' => $dbname ], [ 'dbname' => $dbname ] );
+                       [ 'localDomain' => $dbname ],
+                       [ 'dbname' => $dbname, 'dbFilePath' => $dbPath ]
+               );
                $lb = $factory->getMainLB();
                /** @var Database $db */
                $db = $lb->getConnection( DB_MASTER, [], '' );
@@ -332,19 +370,19 @@ class LBFactoryTest extends MediaWikiTestCase {
                );
 
                $this->assertEquals(
-                       $db->addIdentifierQuotes( 'page' ),
+                       $this->quoteTable( $db, 'page' ),
                        $db->tableName( 'page' ),
                        "Correct full table name"
                );
 
                $this->assertEquals(
-                       $db->addIdentifierQuotes( $dbname ) . '.' . $db->addIdentifierQuotes( 'page' ),
+                       $this->quoteTable( $db, $dbname ) . '.' . $this->quoteTable( $db, 'page' ),
                        $db->tableName( "$dbname.page" ),
                        "Correct full table name"
                );
 
                $this->assertEquals(
-                       $db->addIdentifierQuotes( 'nice_db' ) . '.' . $db->addIdentifierQuotes( 'page' ),
+                       $this->quoteTable( $db, 'nice_db' ) . '.' . $this->quoteTable( $db, 'page' ),
                        $db->tableName( 'nice_db.page' ),
                        "Correct full table name"
                );
@@ -352,12 +390,12 @@ class LBFactoryTest extends MediaWikiTestCase {
                $factory->setDomainPrefix( 'my_' );
 
                $this->assertEquals(
-                       $db->addIdentifierQuotes( 'my_page' ),
+                       $this->quoteTable( $db, 'my_page' ),
                        $db->tableName( 'page' ),
                        "Correct full table name"
                );
                $this->assertEquals(
-                       $db->addIdentifierQuotes( 'other_nice_db' ) . '.' . $db->addIdentifierQuotes( 'page' ),
+                       $this->quoteTable( $db, 'other_nice_db' ) . '.' . $this->quoteTable( $db, 'page' ),
                        $db->tableName( 'other_nice_db.page' ),
                        "Correct full table name"
                );
@@ -367,7 +405,7 @@ class LBFactoryTest extends MediaWikiTestCase {
                \MediaWiki\restoreWarnings();
 
                $this->assertEquals(
-                       $db->addIdentifierQuotes( 'garbage-db' ) . '.' . $db->addIdentifierQuotes( 'page' ),
+                       $this->quoteTable( $db, 'garbage-db' ) . '.' . $this->quoteTable( $db, 'page' ),
                        $db->tableName( 'garbage-db.page' ),
                        "Correct full table name"
                );
@@ -375,4 +413,12 @@ class LBFactoryTest extends MediaWikiTestCase {
                $factory->closeAll();
                $factory->destroy();
        }
+
+       private function quoteTable( Database $db, $table ) {
+               if ( $db->getType() === 'sqlite' ) {
+                       return $table;
+               } else {
+                       return $db->addIdentifierQuotes( $table );
+               }
+       }
 }
index 01b575c..d252c80 100644 (file)
@@ -146,7 +146,7 @@ class FormatJsonTest extends MediaWikiTestCase {
         * @return stdClass|string|bool|int|float|null
         */
        public static function toObject( $value ) {
-               return !is_array( $value ) ? $value : (object) array_map( __METHOD__, $value );
+               return !is_array( $value ) ? $value : (object)array_map( __METHOD__, $value );
        }
 
        /**
index ce6894e..cb1b3d2 100644 (file)
@@ -81,7 +81,7 @@ class BatchRowUpdateTest extends MediaWikiTestCase {
         */
        public function testReaderGetPrimaryKey( $message, array $expected, array $row ) {
                $reader = new BatchRowIterator( $this->mockDb(), 'some_table', array_keys( $expected ), 8675309 );
-               $this->assertEquals( $expected, $reader->extractPrimaryKeys( (object) $row ), $message );
+               $this->assertEquals( $expected, $reader->extractPrimaryKeys( (object)$row ), $message );
        }
 
        public static function provider_readerSetFetchColumns() {
@@ -226,7 +226,7 @@ class BatchRowUpdateTest extends MediaWikiTestCase {
                for ( $i = 0; $i < $numRows; $i += $batchSize ) {
                        $rows = [];
                        for ( $j = 0; $j < $batchSize && $i + $j < $numRows; $j++ ) {
-                               $rows [] = (object) call_user_func( $rowGenerator );
+                               $rows [] = (object)call_user_func( $rowGenerator );
                        }
                        $res[] = $rows;
                }
index ad61284..e11fd8a 100644 (file)
@@ -92,7 +92,7 @@ class ExtensionJsonValidationTest extends PHPUnit_Framework_TestCase {
                }
 
                $validator = new Validator;
-               $validator->check( $data, (object) [ '$ref' => 'file://' . $schemaPath ] );
+               $validator->check( $data, (object)[ '$ref' => 'file://' . $schemaPath ] );
                if ( $validator->isValid() && !$licenseError ) {
                        // All good.
                        $this->assertTrue( true );