Merge "Use local context to get messages and time formatting methods of Language...
authorNikerabbit <niklas.laxstrom@gmail.com>
Mon, 14 May 2012 06:28:20 +0000 (06:28 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Mon, 14 May 2012 06:28:20 +0000 (06:28 +0000)
25 files changed:
RELEASE-NOTES-1.20
includes/logging/LogPage.php
languages/messages/MessagesAst.php
languages/messages/MessagesBe_tarask.php
languages/messages/MessagesCa.php
languages/messages/MessagesDe.php
languages/messages/MessagesDsb.php
languages/messages/MessagesEs.php
languages/messages/MessagesFrr.php
languages/messages/MessagesHe.php
languages/messages/MessagesHsb.php
languages/messages/MessagesIa.php
languages/messages/MessagesKa.php
languages/messages/MessagesLb.php
languages/messages/MessagesNl.php
languages/messages/MessagesPt_br.php
languages/messages/MessagesSat.php
languages/messages/MessagesZh_hans.php
languages/messages/MessagesZh_hant.php
tests/phpunit/MediaWikiTestCase.php
tests/phpunit/includes/LinksUpdateTest.php [new file with mode: 0644]
tests/qunit/data/testrunner.js
tests/qunit/suites/resources/jquery/jquery.tablesorter.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.Title.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.Uri.test.js

index d36f840..35a3790 100644 (file)
@@ -56,7 +56,10 @@ upgrade PHP if you have not done so prior to upgrading MediaWiki.
 * (bug 5445) Now remove autoblocks when a user is unblocked.
 * Added $wgLogExceptionBacktrace, on by default, to allow logging of exception
   backtraces.
-* Added device detection for determining device capabilities
+* Added device detection for determining device capabilities.
+* QUnit.newMwEnvironment now supports passing a custom setup and/or teardown function.
+  Arguments signature has changed. First arguments is now an options object of which
+  'config' can be a property. Previously 'config' itself was the first and only argument.
 
 === Bug fixes in 1.20 ===
 * (bug 30245) Use the correct way to construct a log page title.
index 88f3484..3891f34 100644 (file)
@@ -68,7 +68,7 @@ class LogPage {
        }
 
        /**
-        * @return bool|int|null
+        * @return int log_id of the inserted log entry
         */
        protected function saveContent() {
                global $wgLogRestrictions;
@@ -105,7 +105,7 @@ class LogPage {
                } elseif( $this->sendToUDP ) {
                        # Don't send private logs to UDP
                        if( isset( $wgLogRestrictions[$this->type] ) && $wgLogRestrictions[$this->type] != '*' ) {
-                               return true;
+                               return $newId;
                        }
 
                        # Notify external application via UDP.
@@ -438,8 +438,7 @@ class LogPage {
         * @param $params Array: parameters passed later to wfMsg.* functions
         * @param $doer User object: the user doing the action
         *
-        * @return bool|int|null
-        * @TODO: make this use LogEntry::saveContent()
+        * @return int log_id of the inserted log entry
         */
        public function addEntry( $action, $target, $comment, $params = array(), $doer = null ) {
                global $wgContLang;
index 840ac65..998632a 100644 (file)
@@ -1045,6 +1045,8 @@ Asegúrate de qu'esti cambéu caltenga la continuidá del históricu de la páxi
 
 # Diffs
 'history-title' => 'Historial de revisiones de "$1"',
+'difference-title' => 'Diferencia ente revisiones de «$1»',
+'difference-title-multipage' => 'Diferencia ente les páxines «$1» y «$2»',
 'difference-multipage' => '(Diferencia ente páxines)',
 'lineno' => 'Llinia $1:',
 'compareselectedversions' => 'Comparar les revisiones seleicionaes',
index bbb96a0..7b4661d 100644 (file)
@@ -1206,6 +1206,8 @@ $1",
 
 # Diffs
 'history-title' => 'Гісторыя зьменаў старонкі «$1»',
+'difference-title' => 'Розьніца паміж вэрсіямі «$1»',
+'difference-title-multipage' => 'Розьніца паміж старонкамі «$1» і «$2»',
 'difference-multipage' => '(Розьніца паміж старонкамі)',
 'lineno' => 'Радок $1:',
 'compareselectedversions' => 'Параўнаць выбраныя вэрсіі',
index bfbb137..ede25f7 100644 (file)
@@ -572,6 +572,8 @@ $2",
 Els seus motius han estat: «''$2''».",
 'filereadonlyerror' => 'No s\'ha pogut modificar el fitxer «$1» perquè el repositori de fitxers "$2" està en mode només de lectura.
 L\'administrador que l\'ha bloquejat ha donat aquesta explicació: "$3".',
+'invalidtitle-knownnamespace' => "El títol amb l'espai de noms «$2» i text «$3» no és vàlid",
+'invalidtitle-unknownnamespace' => "El títol amb l'espai de noms desconegut de número «$1» i text «$3» no és vàlid",
 
 # Virus scanner
 'virus-badscanner' => "Mala configuració: antivirus desconegut: ''$1''",
@@ -1123,6 +1125,8 @@ Assegureu-vos que aquest canvi mantindrà la continuïtat històrica de la pàgi
 
 # Diffs
 'history-title' => 'Historial de versions de «$1»',
+'difference-title' => 'Diferència entre les revisions de «$1»',
+'difference-title-multipage' => 'Diferència entre les pàgines «$1» i «$2»',
 'difference-multipage' => '(Diferència entre pàgines)',
 'lineno' => 'Línia $1:',
 'compareselectedversions' => 'Compara les versions seleccionades',
@@ -1733,6 +1737,7 @@ Per seguretat, img_auth.php està desactivat.",
 'http-curl-error' => "Error en recuperar l'URL: $1",
 'http-host-unreachable' => "No s'ha pogut accedir a l'URL.",
 'http-bad-status' => 'Hi ha hagut un problema durant la petició HTTP: $1 $2',
+'http-truncated-body' => "El cos de la sol·licitud només s'ha rebut parcialment.",
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
 'upload-curl-error6' => "No s'ha pogut accedir a l'URL",
index 0a0259c..9375a8d 100644 (file)
@@ -3636,7 +3636,7 @@ Weitere werden standardmäßig nicht angezeigt.
 'confirmemail_pending' => 'Es wurde dir bereits ein Bestätigungscode per E-Mail zugeschickt.
 Wenn du dein Benutzerkonto erst vor kurzem erstellt hast, warte bitte noch ein paar Minuten auf die E-Mail, bevor du einen neuen Code anforderst.',
 'confirmemail_send' => 'Bestätigungscode zuschicken',
-'confirmemail_sent' => 'Bestätigungs-E-Mail wurde verschickt.',
+'confirmemail_sent' => 'Die Bestätigungs-E-Mail wurde verschickt.',
 'confirmemail_oncreate' => 'Ein Bestätigungs-Code wurde an deine E-Mail-Adresse gesandt. Dieser Code wird für die Anmeldung nicht benötigt, jedoch wird er zur Aktivierung der E-Mail-Funktionen innerhalb des Wikis gebraucht.',
 'confirmemail_sendfailed' => '{{SITENAME}} konnte die Bestätigungs-E-Mail nicht an dich versenden.
 Bitte prüfe die E-Mail-Adresse auf ungültige Zeichen.
index a06f338..789e13e 100644 (file)
@@ -902,6 +902,8 @@ Njesmějo daś wěcej nježli $2 {{PLURAL:$2|wołanja|wołanjowu|wołanjow|woła
 'node-count-exceeded-warning' => 'Bok jo licbu sukow pśekšocył',
 'expansion-depth-exceeded-category' => 'Boki, źož ekspansiska dłymokosć jo pśekšocona',
 'expansion-depth-exceeded-warning' => 'Bok jo ekspansisku dłymokosć pśekšocył',
+'parser-unstrip-loop-warning' => 'Njeskóńcna kokula namakana',
+'parser-unstrip-recursion-limit' => 'Rekursiska granica pśekšocona ($1)',
 
 # "Undo" feature
 'undo-success' => 'Wobźěłanje móžo se wótpóraś. Pšosym pśeglěduj dołojcne pśirownowanje aby se wěsty był, až to wót wěrnosći coš, a pón składuj změny, aby se wobźěłanje doskóńcnje wótpórało.',
@@ -1078,6 +1080,8 @@ Zaruc, až historija wersijow nastawka jo njepśetergnjona.',
 
 # Diffs
 'history-title' => 'Stawizny wersijow boka „$1“',
+'difference-title' => 'Rozdźěl mjazy wersijami "$1"',
+'difference-title-multipage' => 'Rozdźěl mjazy bokami "$1" a "$2"',
 'difference-multipage' => '(Rozdźěl mjazy bokami)',
 'lineno' => 'Rědka $1:',
 'compareselectedversions' => 'Wuzwólonej wersiji pśirownaś',
index 580d263..682e6df 100644 (file)
@@ -1521,9 +1521,9 @@ Tu dirección de correo no se revela cuando otros usuarios te contactan.',
 'saveusergroups' => 'Guardar grupos de usuarios',
 'userrights-groupsmember' => 'Miembro de:',
 'userrights-groupsmember-auto' => 'Miembro implícito de:',
-'userrights-groups-help' => 'Puedes modificar los grupos a los que pertenece este usuario:
-* Un recuadro marcado significa que el usuario está en ese grupo.
-* Un recuadro no marcado significa que el usuario no está en ese grupo.
+'userrights-groups-help' => 'Puedes modificar los grupos a los que pertenece {{GENDER:$1|este usuario|esta usuaria}}:
+* Un recuadro marcado significa que {{GENDER:$1|el usuario|la usuaria}} está en ese grupo.
+* Un recuadro no marcado significa que {{GENDER:$1|el usuario|la usuaria}} no está en ese grupo.
 * Un * indica que no podrás retirar el grupo una vez que lo concedas, o viceversa.',
 'userrights-reason' => 'Motivo:',
 'userrights-no-interwiki' => 'No tienes permiso para editar los grupos a los que pertenece un usuario en otros wikis.',
index 36fbd6c..d6bbb17 100644 (file)
@@ -407,9 +407,8 @@ $2',
 'ns-specialprotected' => 'Spetsjåålside koone ai beårbed wårde.',
 'titleprotected' => 'En sid ma dideer noome koon ai önjläid wårde.
 Jü späre wörd döör [[User:$1|$1]] ma grün "$2" inruchted.',
-'filereadonlyerror' => "Det datei „$1“ koon ei feranert wurd, auer uun det fertiaknis „$2“ bluat leesen wurd koon.
-
-Di grünj as „''$3''“.",
+'filereadonlyerror' => 'Det datei „$1“ koon ei feranert wurd, auer uun det fertiaknis „$2“ bluas leesen wurd koon.
+Di grünj faan di administraator as: „$3“.',
 
 # Virus scanner
 'virus-badscanner' => "Hiinje konfigurasjoon: ünbekånde fiirusscanner: ''$1''",
index d7597c4..9d0b04e 100644 (file)
@@ -1320,6 +1320,8 @@ $1",
 
 # Diffs
 'history-title' => 'היסטוריית הגרסאות של $1',
+'difference-title' => 'הבדלים בין גרסאות של "$1"',
+'difference-title-multipage' => 'הבדלים בין הדפים $1 ו{{GRAMMAR:תחילית|$2}}',
 'difference-multipage' => '(הבדלים בין דפים)',
 'lineno' => 'שורה $1:',
 'compareselectedversions' => 'השוואת הגרסאות שנבחרו',
index e07cbf6..25a3700 100644 (file)
@@ -1078,6 +1078,8 @@ Zawěsć, zo tuta změna stawiznisku kontinuitu strony wobchowuje.',
 
 # Diffs
 'history-title' => 'Stawizny wersijow strony „$1“',
+'difference-title' => 'Rozdźěl mjez wersijemi "$1"',
+'difference-title-multipage' => 'Rozdźěl mjez stronami "$1" a "$2"',
 'difference-multipage' => '(Rozdźěl mjez stronami)',
 'lineno' => 'Rjadka $1:',
 'compareselectedversions' => 'Wubranej wersiji přirunać',
index 25312b7..79c8f43 100644 (file)
@@ -1132,6 +1132,8 @@ Nota que le uso del ligamines de navigation causara le perdita de tote cambios i
 
 # Diffs
 'history-title' => 'Historia de versiones de "$1"',
+'difference-title' => 'Differentia inter versiones de "$1"',
+'difference-title-multipage' => 'Differentia inter paginas "$1" e "$2"',
 'difference-multipage' => '(Differentia inter paginas)',
 'lineno' => 'Linea $1:',
 'compareselectedversions' => 'Comparar versiones seligite',
index 0a4ebde..9f45136 100644 (file)
@@ -535,6 +535,8 @@ $2',
 'filereadonlyerror' => 'ფაილი "$1" შეცვლა ვერ ხერხდება, რადგანაც ფაილის საცავი "$2" მხოლოდ კითხვის რეჟიმშია.
 
 ადმინისტრატორი რომელმაც ის დაბლოკა მიუთითა შემდეგი მიზეზი: "$3".',
+'invalidtitle-knownnamespace' => 'დაუშვებელი სათაური სახელთა სივრცე "$2" და ტექსტი "$3"-თან',
+'invalidtitle-unknownnamespace' => 'დაუშვებელი სათაური უცნობი სახელთა სივრცის ნომერი $1 და ტექსტი "$2"-ით',
 
 # Virus scanner
 'virus-badscanner' => "შეცდომა. ვირუსთა უცნობი სკანერი: ''$1''",
@@ -931,6 +933,11 @@ $2
 'parser-template-loop-warning' => 'აღმოჩენილია ლუპი თარგ: [[$1]]-ში',
 'parser-template-recursion-depth-warning' => 'თარგის რეკურსიის სიღრმე აემატება დაშვებულს ($1)',
 'language-converter-depth-warning' => 'ენათა გადამუშავების კონვერციის ლიმიტი ამოწურულია ($1)',
+'node-count-exceeded-category' => 'გვერდები, რომელშიც გადამეტებულია კვანძების რაოდენობა',
+'node-count-exceeded-warning' => 'გვერდზე გადამეტებულია კვანძების რაოდენობა',
+'expansion-depth-exceeded-category' => 'გვერდები გახსნის სიღრმის გადამეტებით',
+'expansion-depth-exceeded-warning' => 'გვერდზე გადამეტებულია ჩადგმების ზღვარი',
+'parser-unstrip-recursion-limit' => 'გადამეტებულია რეკურსიის ზღვარი ($1)',
 
 # "Undo" feature
 'undo-success' => 'რედაქტირების გაუქმება შესაძლებელია. გთხოვთ შეამოწმოთ განსხვავება ქვევით, რათა დარწმუნდეთ, რომ ეს ის არის რაც თქვენ გსურთ, შემდეგ კი შეინახეთ ცვლილებები რათა დაასრულოთ რედაქტირების გაუქმება.',
@@ -1109,6 +1116,8 @@ $1",
 
 # Diffs
 'history-title' => 'ცვლილებათა ისტორია სტატიაში „$1“',
+'difference-title' => 'განსხვავება გადახედვებს შორის " $1 "',
+'difference-title-multipage' => 'განსხვავება „$1“ და „$2“ გვერდებს შორის',
 'difference-multipage' => '(განსხვავება გვერდებს შორის)',
 'lineno' => 'ხაზი $1:',
 'compareselectedversions' => 'არჩეული ვერსიების შედარება',
index 18e5c43..017884c 100644 (file)
@@ -552,6 +552,8 @@ $2',
 'customjsprotected' => "Dir hutt net d'Recht dës JavaScript-Säit z'änneren, well dorop déi perséinlech Astellunge vun engem anere Benotzer gespäichert sinn.",
 'ns-specialprotected' => 'Spezialsäite kënnen net verännert ginn.',
 'titleprotected' => "Eng Säit mat dësem Numm kann net ugeluecht ginn. Dës Spär gouf vum [[User:$1|$1]] gemaach deen als Grond ''$2'' uginn huet.",
+'invalidtitle-knownnamespace' => 'Net valabelen Titel mam Nummraum "$2" a mam Text "$3"',
+'invalidtitle-unknownnamespace' => 'Net valabelen Titel mat der onbekannter Nummraum-Zuel $1 a mam Text "$2"',
 
 # Virus scanner
 'virus-badscanner' => "Schlecht Configuratioun: onbekannte  Virescanner: ''$1''",
index 08909fd..a53e07c 100644 (file)
@@ -1156,6 +1156,8 @@ Deze parameters zijn weggelaten.',
 'node-count-exceeded-warning' => 'Op de pagina is het maximale aantal nodes overschreden',
 'expansion-depth-exceeded-category' => "Pagina's waar de expansiediepte is overschreden",
 'expansion-depth-exceeded-warning' => 'De pagina bevat te veel sjablonen',
+'parser-unstrip-loop-warning' => 'Er is een "unstrip"-lus gedetecteerd',
+'parser-unstrip-recursion-limit' => 'De recursielimiet ($1) voor "unstrip" is overschreden',
 
 # "Undo" feature
 'undo-success' => 'Deze bewerking kan ongedaan gemaakt worden.
index bf2316c..8512c84 100644 (file)
@@ -504,7 +504,7 @@ $messages = array(
 'protectthispage' => 'Proteger esta página',
 'unprotect' => 'Alterar a proteção',
 'unprotectthispage' => 'Alterar a proteção desta página',
-'newpage' => 'Nova página',
+'newpage' => 'Página nova',
 'talkpage' => 'Dialogar sobre esta página',
 'talkpagelinktext' => 'disc',
 'specialpage' => 'Página especial',
@@ -697,6 +697,8 @@ Quem o protegeu foi [[User:$1|$1]], com a justificativa: ''$2''.",
 'filereadonlyerror' => 'Não é possível modificar o arquivo "$1" porque o repositório do arquivo "$2" está em modo somente leitura.
 
 O administrador que bloqueou ofereceu a seguinte explicação: "$3".',
+'invalidtitle-knownnamespace' => 'Título inválido para o espaço nominal "$2" e texto "$3"',
+'invalidtitle-unknownnamespace' => 'Título inválido para o espaço nominal de número desconhecido ($1) e texto "$2"',
 
 # Virus scanner
 'virus-badscanner' => "Má configuração: antivírus desconhecido: ''$1''",
@@ -714,17 +716,17 @@ Não se esqueça de personalizar as suas [[Special:Preferences|preferências no
 'yourname' => 'Nome de usuário:',
 'yourpassword' => 'Senha:',
 'yourpasswordagain' => 'Redigite sua senha',
-'remembermypassword' => 'Recordar os meus dados neste computador (por no máximo $1 {{PLURAL:$1|dia|dias}})',
+'remembermypassword' => 'Lembrar meu login neste navegador (por no máximo $1 {{PLURAL:$1|dia|dias}})',
 'securelogin-stick-https' => 'Permanecer conectado ao HTTPS após a autenticação',
 'yourdomainname' => 'Seu domínio:',
 'externaldberror' => 'Ocorreu ou um erro no banco de dados durante a autenticação ou não lhe é permitido atualizar a sua conta externa.',
 'login' => 'Autenticar-se',
 'nav-login-createaccount' => 'Entrar / criar conta',
 'loginprompt' => 'É necessário estar com cookies ativados para poder autenticar-se no wiki {{SITENAME}}.',
-'userlogin' => 'Criar uma conta ou entrar',
+'userlogin' => 'Entrar / criar conta',
 'userloginnocreate' => 'Entrar',
 'logout' => 'Sair',
-'userlogout' => 'Sair',
+'userlogout' => 'Desconectar',
 'notloggedin' => 'Não autenticado',
 'nologin' => 'Não possui uma conta? $1.',
 'nologinlink' => 'Criar uma conta',
@@ -796,7 +798,7 @@ Você pode ignorar esta mensagem caso a conta tenha sido criada por engano.',
 'login-throttled' => 'Você fez tentativas demais de se autenticar com esta conta recentemente.
 Por favor aguarde antes de tentar novamente.',
 'login-abort-generic' => 'A sua autenticação não teve êxito - Abortada',
-'loginlanguagelabel' => 'Língua: $1',
+'loginlanguagelabel' => 'Idioma: $1',
 'suspicious-userlogout' => 'Sua solicitação para sair foi negada porque aparentemente foi enviada por um navegador danificado ou por um servidor proxy com cache.',
 
 # E-mail sending
@@ -870,14 +872,14 @@ Senha temporária: $2',
 'link_tip' => 'Link interno',
 'extlink_sample' => 'http://www.example.com título do link',
 'extlink_tip' => 'Link externo (lembre-se do prefixo http://)',
-'headline_sample' => 'Texto do cabeçalho',
+'headline_sample' => 'Conteúdo do cabeçalho',
 'headline_tip' => 'Seção de nível 2',
 'nowiki_sample' => 'Inserir texto não-formatado aqui',
-'nowiki_tip' => 'Ignorar formato wiki',
+'nowiki_tip' => 'Ignorar a formatação wiki',
 'image_sample' => 'Exemplo.jpg',
 'image_tip' => 'Arquivo embutido',
 'media_sample' => 'Exemplo.ogg',
-'media_tip' => 'Link para arquivo',
+'media_tip' => 'Link para arquivo',
 'sig_tip' => 'Sua assinatura, com hora e data',
 'hr_tip' => 'Linha horizontal (use de forma moderada)',
 
@@ -891,7 +893,8 @@ Senha temporária: $2',
 'showpreview' => 'Mostrar previsão',
 'showlivepreview' => 'Pré-visualização em tempo real',
 'showdiff' => 'Mostrar alterações',
-'anoneditwarning' => "'''Atenção''': Você não se encontra autenticado. O seu endereço de IP será registrado no histórico de edições desta página.",
+'anoneditwarning' => "'''Atenção''': Você não se encontra autenticado.
+O seu endereço de IP será registrado no histórico de edições desta página.",
 'anonpreviewwarning' => "''Você não está logado. Gravar registará o seu endereço IP no histórico de edições desta página.''",
 'missingsummary' => "'''Lembrete:''' Você não introduziu um sumário de edição. Se clicar novamente em Salvar, a sua edição será salva sem um sumário.",
 'missingcommenttext' => 'Por favor, introduzida um comentário abaixo.',
@@ -944,17 +947,16 @@ Ela pode ter sido movida ou removido enquanto você estava vendo a página.',
 
 A senha para esta nova conta pode ser alterada na página ''[[Special:ChangePassword|de troca de senha]]'', após a autenticação.",
 'newarticle' => '(Nova)',
-'newarticletext' => "Você seguiu um link para uma página que não existe.
-Para criá-la, comece escrevendo na caixa abaixo
-(veja [[{{MediaWiki:Helppage}}|a página de ajuda]] para mais informações).
-Se você chegou aqui por engano, apenas clique no botão '''voltar''' do seu navegador.",
+'newarticletext' => "Você seguiu um link para uma página que ainda não existe.
+Para criá-la, comece escrevendo na caixa abaixo (veja [[{{MediaWiki:Helppage}}|a página de ajuda]] para mais informações).
+Se você chegou aqui por engano, clique no botão '''voltar''' do seu navegador.",
 'anontalkpagetext' => "---- ''Esta é a página de discussão para um usuário anônimo que ainda não criou uma conta ou que não a usa, de forma que temos de utilizar o endereço de IP para identificá-lo(a). Tal endereço de IP pode ser compartilhado por vários usuários. Se você é um usuário anônimo e acha que comentários irrelevantes foram direcionados a você, por gentileza, [[Special:UserLogin/signup|crie uma conta]] ou [[Special:UserLogin|autentique-se]], a fim de evitar futuras confusões com outros usuários anônimos.''",
 'noarticletext' => 'No momento, não há conteúdo nesta página.
-Você pode [[Special:Search/{{PAGENAME}}|pesquisar pelo título desta página]] em outras páginas <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} buscar por registros relacionados],
+Você pode [[Special:Search/{{PAGENAME}}|pesquisar pelo título desta página]] em outras páginas, <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} buscar por registros relacionados],
 ou [{{fullurl:{{FULLPAGENAME}}|action=edit}} criar esta página]</span>.',
-'noarticletext-nopermission' => 'Não há actualmente texto nesta página.
-Você pode [[Special:Search/{{PAGENAME}}|procurar este título de página]] em outras páginas,
-ou <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} procurar os registos relacionados] </span>.',
+'noarticletext-nopermission' => 'No momento, não há conteúdo nesta página
+Você pode [[Special:Search/{{PAGENAME}}|pesquisar pelo título desta página]] em outras páginas,
+ou <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} buscar por registros relacionados] </span>.',
 'userpage-userdoesnotexist' => 'A conta "<nowiki>$1</nowiki>" não se encontra registrada.
 Verifique se deseja mesmo criar/editar esta página.',
 'userpage-userdoesnotexist-view' => 'A conta de usuário "$1" não está registrada.',
@@ -1035,7 +1037,7 @@ A última entrada no histórico é fornecida abaixo como referência:",
 'templatesusedsection' => '{{PLURAL:$1|Predefinição utilizada|Predefinições utilizadas}} nesta seção:',
 'template-protected' => '(protegida)',
 'template-semiprotected' => '(semi-protegida)',
-'hiddencategories' => 'Esta página integra {{PLURAL:$1|uma categoria oculta|$1 categorias ocultas}}:',
+'hiddencategories' => 'Esta página pertence a {{PLURAL:$1|uma categoria oculta|$1 categorias ocultas}}:',
 'edittools' => '<!-- O texto aqui disponibilizado será exibido abaixo dos formulários de edição e de envio de arquivos. -->',
 'nocreatetitle' => 'A criação de páginas se encontra limitada',
 'nocreatetext' => '{{SITENAME}} tem restringida a habilidade de criar novas páginas.
@@ -1046,9 +1048,9 @@ Volte à tela anterior e edite uma página já existente, ou [[Special:UserLogin
 'permissionserrors' => 'Erros de permissões',
 'permissionserrorstext' => 'Você não possui permissão de fazer isso, {{PLURAL:$1|pelo seguinte motivo|pelos seguintes motivos}}:',
 'permissionserrorstext-withaction' => 'Você não possui permissão para $2, {{PLURAL:$1|pelo seguinte motivo|pelos motivos a seguir}}:',
-'recreate-moveddeleted-warn' => "Atenção: Você está recriando uma página já eliminada em outra ocasião.'''
+'recreate-moveddeleted-warn' => "'''Atenção: Você está recriando uma página já eliminada em outra ocasião.'''
 
-Você deve considerar se é realmente adequado continuar editando esta página.
+Considere se é realmente adequado continuar editando esta página.
 Os registros de eliminação e de movimentação desta página são exibidos a seguir, para sua comodidade:",
 'moveddeleted-notice' => 'Esta página foi eliminada.
 Os registros de eliminação e de movimentação para esta página estão disponibilizados abaixo, para referência.',
@@ -1094,7 +1096,7 @@ A justificativa apresentada por $3 foi ''$2''",
 'viewpagelogs' => 'Ver registros para esta página',
 'nohistory' => 'Não há histórico de revisões para esta página.',
 'currentrev' => 'Revisão atual',
-'currentrev-asof' => 'Edição atual tal como $1',
+'currentrev-asof' => 'Edição atual tal como às $1',
 'revisionasof' => 'Edição das $1',
 'revision-info' => 'Edição feita às $1 por $2',
 'previousrevision' => '← Edição anterior',
@@ -1105,11 +1107,10 @@ A justificativa apresentada por $3 foi ''$2''",
 'last' => 'ult',
 'page_first' => 'primeira',
 'page_last' => 'última',
-'histlegend' => "Seleção para diferenças: marque as caixas de seleção das versões que deseja comparar e clique no botão na parte inferior.<br />
-Legenda: ''({{int:cur}})''' = diferença com relação a versão atual,
-'''({{int:last}})''' = diferença com relação a versão anterior, '''{{int:minoreditletter}}''' = edição menor.",
+'histlegend' => "Como selecionar: marque as caixas de seleção das versões que deseja comparar e pressione enter ou clique no botão na parte inferior do formulário.<br />
+Legenda: '''({{int:cur}})''' = diferenças em relação a última versão, '''({{int:last}})''' = diferenças em relação a versão anterior, '''{{int:minoreditletter}}''' = edição menor.",
 'history-fieldset-title' => 'Navegar pelo histórico',
-'history-show-deleted' => 'Somente eliminados',
+'history-show-deleted' => 'Apenas as eliminadas',
 'histfirst' => 'Mais antigas',
 'histlast' => 'Mais recentes',
 'historysize' => '({{PLURAL:$1|1 byte|$1 bytes}})',
@@ -1153,7 +1154,7 @@ Pode mesmo assim [$1 ver estas diferenças] se deseja prosseguir.",
 Você pode ver a diferença entre revisões; podem existir mais detalhes no [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registo de eliminações].",
 'rev-suppressed-diff-view' => "Uma das revisões desta comparação foi '''suprimida''''.
 Você pode ver esta comparação; detalhes podem ser encontradas no [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} registro de supressão].",
-'rev-delundel' => 'mostrar/esconder',
+'rev-delundel' => 'exibir/ocultar',
 'rev-showdeleted' => 'exibir',
 'revisiondelete' => 'Eliminar/restaurar edições',
 'revdelete-nooldid-title' => 'Nenhuma revisão selecionada',
@@ -1254,6 +1255,8 @@ Certifique-se de que tal alteração manterá a continuidade das ações.',
 
 # Diffs
 'history-title' => 'Histórico de edições de "$1"',
+'difference-title' => 'Mudanças entre as edições de "$1"',
+'difference-title-multipage' => 'Mudanças entre as páginas "$1" e "$2"',
 'difference-multipage' => '(Diferenças entre páginas)',
 'lineno' => 'Linha $1:',
 'compareselectedversions' => 'Compare as versões selecionadas',
@@ -1280,7 +1283,7 @@ Certifique-se de que tal alteração manterá a continuidade das ações.',
 'shown-title' => 'Mostrar $1 {{PLURAL:$1|resultado|resultados}} por página',
 'viewprevnext' => 'Ver ($1 {{int:pipe-separator}} $2) ($3).',
 'searchmenu-legend' => 'Opções de pesquisa',
-'searchmenu-exists' => "*'''Há a página \"[[:\$1]]\" neste wiki.'''",
+'searchmenu-exists' => "'''Há uma página com o nome \"[[:\$1]]\" neste wiki'''",
 'searchmenu-new' => "'''Criar a página \"[[:\$1|\$1]]\" neste wiki!'''",
 'searchhelp-url' => 'Help:Conteúdos',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Navegue pelas páginas com este prefixo]]',
@@ -1299,7 +1302,7 @@ Certifique-se de que tal alteração manterá a continuidade das ações.',
 'search-result-score' => 'Relevância: $1%',
 'search-redirect' => '(redirecionamento de $1)',
 'search-section' => '(seção $1)',
-'search-suggest' => 'Será que quis dizer: $1',
+'search-suggest' => 'Você quis dizer: $1',
 'search-interwiki-caption' => 'Projetos irmãos',
 'search-interwiki-default' => 'Resultados de $1:',
 'search-interwiki-more' => '(mais)',
@@ -1315,7 +1318,7 @@ Certifique-se de que tal alteração manterá a continuidade das ações.',
 'showingresultsheader' => "{{PLURAL:$5|Resulado '''$1''' de '''$3'''|Resultados '''$1 - $2''' de '''$3'''}} para '''$4'''",
 'nonefound' => "'''Nota''': apenas alguns espaços nominais são pesquisados por padrão.
 Tente utilizar o prefixo ''all:'' em sua busca, para pesquisar por todos os conteúdos deste wiki (inclusive páginas de discussão, predefinições etc), ou mesmo, utilizando o espaço nominal desejado como prefixo.",
-'search-nonefound' => 'Não houve resultados para a pesquisa.',
+'search-nonefound' => 'Não há resultados que correspondam à consulta.',
 'powersearch' => 'Pesquisa avançada',
 'powersearch-legend' => 'Pesquisa avançada',
 'powersearch-ns' => 'Pesquisar nos espaços nominais:',
@@ -1614,21 +1617,21 @@ Caso decida fornecê-lo, este será utilizado para dar-lhe crédito pelo seu tra
 'recentchanges' => 'Mudanças recentes',
 'recentchanges-legend' => 'Opções das mudanças recentes',
 'recentchangestext' => 'Acompanhe, a partir desta página, as alterações recentes no wiki {{SITENAME}}.',
-'recentchanges-feed-description' => 'Acompanhe, a partir desta feed, as alterações mais recentes no wiki.',
+'recentchanges-feed-description' => 'Acompanhe neste feed as mudanças mais recentes do wiki.',
 'recentchanges-label-newpage' => 'Esta edição criou uma nova página',
 'recentchanges-label-minor' => 'Esta é uma edição menor',
-'recentchanges-label-bot' => 'Esta edição foi feita por um robô',
+'recentchanges-label-bot' => 'Esta edição foi feita por um bot',
 'recentchanges-label-unpatrolled' => 'Esta edição ainda não foi patrulhada',
 'rcnote' => "A seguir {{PLURAL:$1|está listada '''uma''' alteração ocorrida|estão listadas '''$1''' alterações ocorridas}} {{PLURAL:$2|no último dia|nos últimos '''$2''' dias}}, a partir das $5 de $4.",
-'rcnotefrom' => "Abaixo estão as alterações desde as '''$4''' de '''$3''' (limitadas a '''$1''').",
+'rcnotefrom' => "Seguem as alterações desde as '''$4''' de '''$3''' (limitadas a '''$1''').",
 'rclistfrom' => 'Mostrar as novas alterações a partir das $1',
 'rcshowhideminor' => '$1 edições menores',
-'rcshowhidebots' => '$1 robôs',
+'rcshowhidebots' => '$1 bots',
 'rcshowhideliu' => '$1 usuários registrados',
 'rcshowhideanons' => '$1 usuários anônimos',
 'rcshowhidepatr' => '$1 edições patrulhadas',
 'rcshowhidemine' => '$1 minhas edições',
-'rclinks' => 'Exibir as $1 alterações recentes dos últimos $2 dias<br />$3',
+'rclinks' => 'Exibir as $1 alterações recentes feitas nos últimos $2 dias<br />$3',
 'diff' => 'dif',
 'hist' => 'hist',
 'hide' => 'Ocultar',
@@ -1650,11 +1653,11 @@ Caso decida fornecê-lo, este será utilizado para dar-lhe crédito pelo seu tra
 'recentchangeslinked-feed' => 'Alterações relacionadas',
 'recentchangeslinked-toolbox' => 'Alterações relacionadas',
 'recentchangeslinked-title' => 'Alterações relacionadas com "$1"',
-'recentchangeslinked-noresult' => 'Não ocorreram alterações em páginas relacionadas no intervalo de tempo fornecido.',
+'recentchangeslinked-noresult' => 'Não ocorreram alterações em páginas relacionadas no intervalo de tempo especificado.',
 'recentchangeslinked-summary' => "Esta página lista alterações feitas recentemente em páginas com links a uma em específico (ou de membros de uma categoria especificada).
 Páginas de sua [[Special:Watchlist|lista de páginas vigiadas]] são exibidas em '''negrito'''.",
 'recentchangeslinked-page' => 'Nome da página:',
-'recentchangeslinked-to' => 'Mostrar alterações a páginas relacionadas com a página fornecida',
+'recentchangeslinked-to' => 'Visualizar as alterações nas páginas vinculadas à página especificada ao invés disso',
 
 # Upload
 'upload' => 'Enviar arquivo',
@@ -1907,7 +1910,7 @@ Para melhor segurança, o img_auth.php está desativado.',
 'upload-curl-error28' => 'Tempo limite para o envio do arquivo excedido',
 'upload-curl-error28-text' => 'O site demorou muito tempo para responder. Por gentileza, verifique se o site está acessível, aguarde alguns momentos e tente novamente. Talvez você deseje fazer nova tentativa em um horário menos congestionado.',
 
-'license' => 'Licença:',
+'license' => 'Licenciamento:',
 'license-header' => 'Licenciamento',
 'nolicense' => 'Nenhuma selecionada',
 'license-nopreview' => '(Previsão não disponível)',
@@ -1932,7 +1935,7 @@ Um clique sobre um cabeçalho de coluna altera a ordenação.',
 # File description page
 'file-anchor-link' => 'Arquivo',
 'filehist' => 'Histórico do arquivo',
-'filehist-help' => 'Clique em uma data/horário para ver o arquivo tal como ele se encontrava em tal momento.',
+'filehist-help' => 'Clique em uma data/horário para ver como o arquivo estava em um dado momento.',
 'filehist-deleteall' => 'eliminar todas',
 'filehist-deleteone' => 'eliminar',
 'filehist-revert' => 'restaurar',
@@ -1951,7 +1954,7 @@ Um clique sobre um cabeçalho de coluna altera a ordenação.',
 'linkstoimage-more' => 'Mais de $1 {{PLURAL:$1|página|páginas}} tem algum link para este arquivo.
 A lista a seguir mostra apenas {{PLURAL:$1|o primeiro link|os $1 primeiros links}} para este arquivo.
 Uma [[Special:WhatLinksHere/$2|listagem completa]] está disponível.',
-'nolinkstoimage' => 'Nenhuma página aponta para este arquivo.',
+'nolinkstoimage' => 'Nenhuma página contém links para este arquivo.',
 'morelinkstoimage' => 'Ver [[Special:WhatLinksHere/$1|mais links]] para este arquivo.',
 'linkstoimage-redirect' => '$1 (redirecionamento de arquivo) $2',
 'duplicatesoffile' => '{{PLURAL:$1|O seguinte arquivo é duplicado|Os seguintes arquivos são duplicados}} deste arquivo ([[Special:FileDuplicateSearch/$2|mais detalhes]]):',
@@ -1959,7 +1962,7 @@ Uma [[Special:WhatLinksHere/$2|listagem completa]] está disponível.',
 'sharedupload-desc-there' => 'Este arquivo é do $1 e pode ser utilizado por outros projetos.
 Por favor veja a [$2 página de descrição do arquivo] para mais informações.',
 'sharedupload-desc-here' => 'Este arquivo é do $1 e pode ser utilizado por outros projetos.
-A descrição na sua [$2 página de descrição de arquivo] é exibida abaixo.',
+Sua [$2 página de descrição de arquivo] é reproduzida abaixo.',
 'sharedupload-desc-edit' => 'Este arquivo é do $1 e pode ser utilizado por outros projetos.
 Talvez você deseje editar a descrição na sua [$2 página de descrição de arquivo] por lá.',
 'sharedupload-desc-create' => 'Este arquivo é do $1 e pode ser utilizado por outros projetos.
@@ -2134,14 +2137,14 @@ Por favor note que outros websites podem apontar para um arquivo através de um
 'notargettext' => 'Você não especificou uma página alvo ou um usuário para executar esta função.',
 'nopagetitle' => 'Página alvo não existe',
 'nopagetext' => 'A página alvo especificada não existe.',
-'pager-newer-n' => '{{PLURAL:$1|1 recente|$1 recentes}}',
-'pager-older-n' => '{{PLURAL:$1|1 antiga|$1 antigas}}',
+'pager-newer-n' => '{{PLURAL:$1|posterior|$1 posteriores}}',
+'pager-older-n' => '{{PLURAL:$1|1 anterior|$1 anteriores}}',
 'suppress' => 'Supervisor',
 'querypage-disabled' => 'Esta página especial está desativada para não prejudicar o desempenho.',
 
 # Book sources
-'booksources' => 'Fontes de livros',
-'booksources-search-legend' => 'Procurar por fontes de livrarias',
+'booksources' => 'Fontes bibliográficas',
+'booksources-search-legend' => 'Procurar fontes bibliográficas',
 'booksources-go' => 'Ir',
 'booksources-text' => 'É exibida a seguir uma listagem de links para outros sites que vendem livros novos e usados e que possam possuir informações adicionais sobre os livros que você está pesquisando:',
 'booksources-invalid-isbn' => 'O número ISBN fornecido não parece ser válido; verifique se houve erros ao copiar da fonte original.',
@@ -2158,11 +2161,11 @@ Você pode diminuir a lista escolhendo um tipo de registro, um nome de usuário
 
 # Special:AllPages
 'allpages' => 'Todas as páginas',
-'alphaindexline' => '$1 até $2',
+'alphaindexline' => 'De $1 até $2',
 'nextpage' => 'Próxima página ($1)',
 'prevpage' => 'Página anterior ($1)',
-'allpagesfrom' => 'Mostrar páginas começando em:',
-'allpagesto' => 'Terminar de exibir páginas em:',
+'allpagesfrom' => 'Primeira página na listagem:',
+'allpagesto' => 'Última página na listagem:',
 'allarticles' => 'Todas as páginas',
 'allinnamespace' => 'Todas as páginas (espaço nominal $1)',
 'allnotinnamespace' => 'Todas as páginas (excepto as do espaço nominal $1)',
@@ -2201,7 +2204,7 @@ Veja também [[Special:WantedCategories|categorias pedidas]].',
 'linksearch-text' => 'É possível usar caracteres curinga, como "*.wikipedia.org".
 É necessário, pelo menos, um domínio de nível superior, por exemplo "*.org".<br />
 Protocolos suportados: <tt>$1</tt> (não adicionado nenhum desses em sua pesquisa).',
-'linksearch-line' => '$1 está lincado a partir de $2',
+'linksearch-line' => '$2 possui links para $1',
 'linksearch-error' => "\"Caracteres mágicos\" (''wildcards'') só podem ser suados no início do endereço.",
 
 # Special:ListUsers
@@ -2366,8 +2369,8 @@ Para comentários e pedidos de ajuda:
 'historywarning' => "'''Atenção:''' A página que você está prestes a eliminar possui um histórico com aproximadamente $1 {{PLURAL:$1|revisão|revisões}}:",
 'confirmdeletetext' => 'Encontra-se prestes a eliminar permanentemente uma página ou uma imagem e todo o seu histórico.
 Por favor, confirme que possui a intenção de fazer isto, que compreende as consequências e que encontra-se a fazer isto de acordo com as [[{{MediaWiki:Policy-url}}|políticas]] do projeto.',
-'actioncomplete' => 'Ação completada',
-'actionfailed' => 'A ação falhou',
+'actioncomplete' => 'Ação concluída',
+'actionfailed' => 'Falha na ação',
 'deletedtext' => '"$1" foi eliminada.
 Consulte $2 para um registro de eliminações recentes.',
 'dellogpage' => 'Registro de eliminação',
@@ -2533,41 +2536,41 @@ $1',
 'blanknamespace' => '(Principal)',
 
 # Contributions
-'contributions' => 'Contribuições do usuário',
-'contributions-title' => 'Contribuições do usuário $1',
+'contributions' => 'Contribuições {{GENDER:{{BASEPAGENAME}}|do usuário|da usuária}}',
+'contributions-title' => 'Contribuições {{GENDER:$1|do usuário|da usuária}} $1',
 'mycontris' => 'Minhas contribuições',
 'contribsub2' => 'Para $1 ($2)',
 'nocontribs' => 'Não foram encontradas mudanças com este critério.',
-'uctop' => ' (revisão atual)',
+'uctop' => '(atual)',
 'month' => 'Mês (inclusive anteriores):',
 'year' => 'Ano (inclusive anteriores):',
 
-'sp-contributions-newbies' => 'Mostrar só as contribuições das contas recentes',
+'sp-contributions-newbies' => 'Mostrar apenas as contribuições das novas contas',
 'sp-contributions-newbies-sub' => 'Para contas novas',
 'sp-contributions-newbies-title' => 'Contribuições de contas novas',
 'sp-contributions-blocklog' => 'Registro de bloqueios',
 'sp-contributions-deleted' => 'contribuições eliminadas',
-'sp-contributions-uploads' => 'carregamentos',
+'sp-contributions-uploads' => 'envios',
 'sp-contributions-logs' => 'registros',
 'sp-contributions-talk' => 'disc',
 'sp-contributions-userrights' => 'gerenciamento de privilégios de usuários',
 'sp-contributions-blocked-notice' => 'Este usuário atualmente está bloqueado. O registro de bloqueio mais recente é fornecido abaixo para referência:',
 'sp-contributions-blocked-notice-anon' => 'Este endereço IP encontra-se bloqueado.
 Segue, para referência, a entrada mais recente no registro de bloqueios:',
-'sp-contributions-search' => 'Pesquisar contribuições',
+'sp-contributions-search' => 'Navegar pelas contribuições',
 'sp-contributions-username' => 'Endereço de IP ou usuário:',
-'sp-contributions-toponly' => 'Mostrar somente as revisões mais recentes',
+'sp-contributions-toponly' => 'Mostrar somente as edições que sejam a última alteração',
 'sp-contributions-submit' => 'Pesquisar',
 
 # What links here
 'whatlinkshere' => 'Páginas afluentes',
-'whatlinkshere-title' => 'Páginas que apontam para "$1"',
+'whatlinkshere-title' => 'Páginas que têm links para "$1"',
 'whatlinkshere-page' => 'Página:',
 'linkshere' => "As seguintes páginas possuem links para '''[[:$1]]''':",
-'nolinkshere' => "Não existem links para '''[[:$1]]'''.",
+'nolinkshere' => "Não  links para '''[[:$1]]'''.",
 'nolinkshere-ns' => "Não há links para '''[[:$1]]''' no espaço nominal selecionado.",
 'isredirect' => 'página de redirecionamento',
-'istemplate' => 'inclusão',
+'istemplate' => 'transclusão',
 'isimage' => 'link para o arquivo',
 'whatlinkshere-prev' => '{{PLURAL:$1|anterior|$1 anteriores}}',
 'whatlinkshere-next' => '{{PLURAL:$1|próximo|próximos $1}}',
@@ -2666,7 +2669,7 @@ Consulte a [[Special:BlockList|lista de bloqueios]].',
 O registro de bloqueio é fornecido abaixo, para referência:',
 'blocklog-showsuppresslog' => 'O usuário foi bloqueado e ocultado anteriormente.
 O registro de supressão é fornecido abaixo para referência:',
-'blocklogentry' => 'bloqueou "[[$1]]" $3. O bloqueio expira em $2.',
+'blocklogentry' => 'bloqueou "[[$1]]" por $2. $3',
 'reblock-logentry' => 'modificou parâmetros de bloqueio de [[$1]] $3. O bloqueio expira em $2.',
 'blocklogtext' => 'Este é um registro de ações de bloqueio e desbloqueio.
 Endereços IP sujeitos a bloqueio automático não são listados.
@@ -2925,6 +2928,7 @@ Salve o arquivo no seu computador e importe-o aqui.',
 'javascripttest-pagetext-frameworks' => 'Escolha uma das seguintes estruturas de teste: $1',
 'javascripttest-pagetext-skins' => 'Escolha o tema para executar os testes:',
 'javascripttest-qunit-intro' => 'Veja a [$1 documentação de testes] no mediawiki.org.',
+'javascripttest-qunit-heading' => 'Suíte de ferramentas de teste JavaScript QUnit para MediaWiki',
 
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'Sua página de usuário',
@@ -2974,18 +2978,18 @@ Você pode, no entanto, visualiar seu código-fonte.',
 'tooltip-ca-nstab-main' => 'Ver a página de conteúdo',
 'tooltip-ca-nstab-user' => 'Ver a página de usuário',
 'tooltip-ca-nstab-media' => 'Ver a página de mídia',
-'tooltip-ca-nstab-special' => 'Esta é uma página especial, não pode ser editada.',
+'tooltip-ca-nstab-special' => 'Esta é uma página especial. Não é possível editar seu conteúdo de forma direta.',
 'tooltip-ca-nstab-project' => 'Ver a página de projeto',
 'tooltip-ca-nstab-image' => 'Ver a página de arquivo',
 'tooltip-ca-nstab-mediawiki' => 'Ver a mensagem de sistema',
 'tooltip-ca-nstab-template' => 'Ver a predefinição',
 'tooltip-ca-nstab-help' => 'Ver a página de ajuda',
-'tooltip-ca-nstab-category' => 'Ver a página da categoria',
-'tooltip-minoredit' => 'Marcar como edição menor',
-'tooltip-save' => 'Salvaas alterações',
-'tooltip-preview' => 'Prever as alterações, por favor utilizar antes de salvar!',
-'tooltip-diff' => 'Mostrar alterações que fez a este texto.',
-'tooltip-compareselectedversions' => 'Ver as diferenças entre as duas versões selecionadas desta página.',
+'tooltip-ca-nstab-category' => 'Ver a página descritiva da categoria',
+'tooltip-minoredit' => 'Marcar esta alteração como uma edição menor',
+'tooltip-save' => 'Salva as suas alterações',
+'tooltip-preview' => 'Prevê as alterações feitas por você. Antes de salvar, use para ver se está tudo como esperado!',
+'tooltip-diff' => 'Visualizar as alterações que você fez no texto',
+'tooltip-compareselectedversions' => 'Ver o que há de diferente entre as duas versões selecionadas desta página.',
 'tooltip-watch' => 'Adicionar esta página à sua lista de páginas vigiadas',
 'tooltip-watchlistedit-normal-submit' => 'Remover títulos',
 'tooltip-watchlistedit-raw-submit' => 'Atualizar a lista de páginas vigiadas',
@@ -3102,7 +3106,7 @@ Executá-lo poderá comprometer a segurança do seu sistema.",
 'file-info-size-pages' => '$1 × $2 pixels, tamanho do arquivo: $3, tipo MIME: $4, $5 {{PLURAL:$5|página|páginas}}',
 'file-nohires' => 'Sem resolução maior disponível.',
 'svg-long-desc' => 'arquivo SVG, de $1 × $2 pixels, tamanho: $3',
-'show-big-image' => 'Resolução completa',
+'show-big-image' => 'Resolução original',
 'show-big-image-preview' => 'Tamanho desta previsualização: $1.',
 'show-big-image-other' => '{{PLURAL:$2|Outra resolução|Outras resoluções}}: $1.',
 'show-big-image-size' => '$1 × $2 pixels',
@@ -3140,11 +3144,12 @@ Quaisquer outros links nessa mesma linha são considerados exceções (ou seja,
 
 # Metadata
 'metadata' => 'Metadados',
-'metadata-help' => "Este arquivo contém informação adicional, provavelmente adicionada a partir da câmara digital ou ''scanner'' utilizada para criar ou digitalizá-lo.
-Caso o arquivo tenha sido modificado a partir do seu estado original, alguns detalhes poderão não refletir completamente as mudanças efetuadas.",
+'metadata-help' => 'Este arquivo contém dados adicionais, provavelmente adicionados pela câmera digital ou scanner utilizado para criar ou digitalizá-lo.
+Caso o arquivo tenha sofrido alterações, alguns detalhes poderão ser diferentes do que o arquivo atual é.',
 'metadata-expand' => 'Mostrar detalhes adicionais',
 'metadata-collapse' => 'Esconder detalhes restantes',
-'metadata-fields' => 'Os campos de metadados de imagens listados nesta mensagem serão incluídos na página de descrição da imagem quando a tabela de metadados estiver recolhida. Por omissão, outros campos estarão ocultos.
+'metadata-fields' => 'Os campos de metadados de imagens listados nesta mensagem serão incluídos na página de descrição da imagem quando a tabela de metadados estiver recolhida.
+Por padrão, outros campos estarão ocultos.
 * make
 * model
 * datetimeoriginal
@@ -3549,12 +3554,12 @@ Caso o arquivo tenha sido modificado a partir do seu estado original, alguns det
 'exif-urgency-other' => 'Prioridade definida pelo usuário ($1)',
 
 # External editor support
-'edit-externally' => 'Editar este arquivo utilizando uma aplicação externa',
+'edit-externally' => 'Editar este arquivo a partir de um programa externo',
 'edit-externally-help' => '(Consulte as [//www.mediawiki.org/wiki/Manual:External_editors instruções de instalação] para maiores informações)',
 
 # 'all' in various places, this might be different for inflected languages
 'watchlistall2' => 'todas',
-'namespacesall' => 'todas',
+'namespacesall' => 'todos',
 'monthsall' => 'todos',
 'limitall' => 'todas',
 
@@ -3749,6 +3754,8 @@ Em conjunto com este programa deve ter recebido [{{SERVER}}{{SCRIPTPATH}}/COPYIN
 'version-software' => 'Software instalado',
 'version-software-product' => 'Produto',
 'version-software-version' => 'Versão',
+'version-entrypoints' => 'URLs dos pontos de entrada',
+'version-entrypoints-header-entrypoint' => 'Ponto de entrada',
 'version-entrypoints-header-url' => 'URL',
 
 # Special:FilePath
@@ -3792,18 +3799,18 @@ As imagens serão exibidas em sua resolução máxima, outros tipos de arquivos
 'intentionallyblankpage' => 'Esta página foi intencionalmente deixada em branco e é usada para medições de performance, etc.',
 
 # External image whitelist
-'external_image_whitelist' => " # Deixe esta linha exatamente como ela é <pre>
-# Coloque uma expressão regular (apenas a parte que vai entre o //) a seguir
+'external_image_whitelist' => " # Deixe esta linha exatamente como ela está <pre>
+# Insira uma expressão regular (apenas a parte que vai entre o //) a seguir
 # Estas serão casadas com as URLs de imagens externas (''hotlinked'')
-# Aqueles que corresponderem serão exibidos como imagens, caso contrário, apenas uma ligação para a imagem será mostrada
+# Aquelas que corresponderem serão exibidas como imagens; caso contrário, apenas um link para a imagem será mostrado
 # As linhas que começam com # são tratadas como comentários
 # Isto não é sensível à capitalização
 
-# Coloque todos os fragmentos de ''regex'' acima dessa linha. Deixe esta linha exatamente como ela é</pre>",
+# Coloque todos os fragmentos de ''regex'' acima dessa linha. Deixe esta linha exatamente como ela está</pre>",
 
 # Special:Tags
 'tags' => 'Etiquetas de modificação válidas',
-'tag-filter' => 'Filtro de [[Special:Tags|etiquetas]]:',
+'tag-filter' => 'Filtrar [[Special:Tags|etiquetas]]:',
 'tag-filter-submit' => 'Filtrar',
 'tags-title' => 'Etiquetas',
 'tags-intro' => 'Esta página lista as etiquetas com que o software poderá marcar uma edição, e o seu significado.',
index 5247557..6b4d1a0 100644 (file)
@@ -8,6 +8,7 @@
  * @file
  *
  * @author Albinus
+ * @author David Baskey
  * @author Ghonokuashabaskey
  * @author Nipon087
  * @author Salvator
@@ -20,6 +21,9 @@ $messages = array(
 'tog-hideminor' => 'Nitaḱ bodolaḱre huḍiṅ kạmi danaṅme',
 'tog-showtoc' => 'Ṭibilre menaḱako ńel ( sakamkore 3 khon jạti hedlayenko)',
 'tog-watchcreations' => 'Sakamko songe  Ińaḱ ńelok tạlikare benao',
+'tog-watchdefault' => 'Sakam tońgey me Iń do ińaḱ ńeloḱ tạlikare joṛaokeda',
+'tog-watchmoves' => 'Sakamko tońgeyme Ińaḱ ńelok tạlikare kulme',
+'tog-watchdeletion' => 'Sakamko tońgeyme Ińaḱ ńeloḱ tạlika khon get́ giḍikam',
 'tog-enotifwatchlistpages' => 'E-mailạńme one tinre in̕aḱ n̕eloḱ tạlika do bodolok',
 'tog-enotifusertalkpages' => 'E-mailạn̕me one tinre in̕aḱ roṛaḱ laṛcaṛ sakam do bodoloḱa',
 'tog-enotifminoredits' => 'E-mailạn̕me arhõ one tinre in̕aḱ sakamre huḍiń kạmi hoyoḱ',
@@ -148,7 +152,7 @@ $messages = array(
 'create-this-page' => 'Noa sakam benao me',
 'delete' => 'muchau me',
 'deletethispage' => 'Noa sakam do get giḍikam',
-'undelete_short' => 'Bań get giḍika',
+'undelete_short' => 'Baṅ get giḍik',
 'protect' => "banchao'",
 'protect_change' => 'Judạ',
 'protectthispage' => 'Noa sakam ban̕caome',
@@ -204,7 +208,7 @@ $messages = array(
 'youhavenewmessages' => 'Amaḱ do $1 ($2) menaḱa',
 'newmessageslink' => 'Nãwã sombat',
 'newmessagesdifflink' => 'Mucạt bodol',
-'youhavenewmessagesmulti' => 'Amaḱ nãwã mesag kodo',
+'youhavenewmessagesmulti' => 'Amaḱ nãwã mesagko do $1 menaḱa',
 'editsection' => 'So̠mpado̠n',
 'editold' => 'So̠mpado̠n',
 'viewsourceold' => 'Ńamoḱ jayga',
@@ -217,7 +221,7 @@ $messages = array(
 'collapsible-collapse' => 'Murchạo caba',
 'collapsible-expand' => 'Phaylao',
 'thisisdeleted' => 'N̕el se doho ruạṛ',
-'viewdeleted' => 'Ńelme',
+'viewdeleted' => '$1 Ńelme',
 'feedlinks' => 'Jom oco',
 'site-atom-feed' => ' $1 Jom oco',
 'page-atom-feed' => '"$1" khon khudri jom',
@@ -247,7 +251,7 @@ Noa hoy renaḱ karon do hoyoḱkana cabak tạrik pharak se noare joṛao sakam
 Judi noa do karon bań hoylen khan, noa do am sopṭoyer re kạtictem ńam daṛeyaḱa.
 Daya katet́ noa do nonde [[Special:ListUsers/sysop|administrator]],  ṭhen lạime, URL hotete.',
 'missingarticle-rev' => '(Nãwã aro#: $1)',
-'missingarticle-diff' => 'pharak',
+'missingarticle-diff' => '(Pharak: $1, $2)',
 'internalerror' => 'Bhitri reaḱ bhul',
 'internalerror_info' => 'Bhitri reaḱ bhul:',
 'filedeleteerror' => '1 sakam do baṅ get́ giḍiḱ lena',
@@ -264,10 +268,13 @@ Noa re do mit se aema bisó menaḱa oka do ńutumre bań beoharok.',
 'ns-specialprotected' => 'Asokay teaḱ sakamkodo baṅ oltoṅgea.',
 
 # Virus scanner
-'virus-scanfailed' => 'Skan do baṇ hoylena',
+'virus-scanfailed' => 'Esken baṅ hoelena (Code $1)',
 'virus-unknownscanner' => 'Baṅ urum anṭvayras:',
 
 # Login and logout pages
+'welcomecreation' => '==Johar,==
+Amaḱ ekaunṭ do tearena.
+Amaḱ [Asokaete:Pasindko {{SITENAME}} pasindko]] bodol alom hiṛińa.',
 'yourname' => 'Beoboharicaḱ ńutum',
 'yourpassword' => 'Uku namber',
 'yourpasswordagain' => 'Arhõ oku namber olme',
@@ -280,7 +287,7 @@ Noa re do mit se aema bisó menaḱa oka do ńutumre bań beoharok.',
 'logout' => 'Bahre oḍoń',
 'userlogout' => 'Bahre oḍoń',
 'notloggedin' => 'Bhitri baṅ bolokana',
-'nologin' => 'Ekaunṭ do menaḱgea?',
+'nologin' => 'Ekaunṭ bạnuḱtama?',
 'nologinlink' => 'account tear me',
 'createaccount' => 'Ṭhai benaome',
 'gotaccount' => 'Ekaunṭ menaḱgeya?',
@@ -310,7 +317,7 @@ Daya katet́ arhõ kurumuṭuyme.',
 'noemailcreate' => 'Am do mitṭen jewet e-mail ṭhikạna em jaruṛ menaḱtama.',
 'passwordsent' => '"$1" ṭhikạnate resṭariyen e-mail lạgit́te mitṭen oku nambar em hoyena.
 Daya kate ńam porte arhõ bhitri boloḱme.',
-'mailerror' => 'Vul mail em:',
+'mailerror' => 'Vulte kulakan mail:',
 'emailconfirmlink' => 'Amaḱ e-mail ṭhikana do sạriyme.',
 'cannotchangeemail' => 'Ekaunṭ e-mail ṭhikạnakodo noa wiki re baṅ bodoloḱ kana.',
 'accountcreated' => 'Ekaunṭ do teyarena',
@@ -403,6 +410,7 @@ You can [[Special:Search/{{PAGENAME}}|search for this page title]] in other page
 or <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} search the related logs]</span>.',
 'previewnote' => "'''Disạyme noa do eken ńeln̕am lạgit.'''
 Amaḱ bodolaḱ kodo nit habićte bań ban̕cao akana!",
+'continue-editing' => 'Toṅge calaḱkana',
 'editing' => 'Sampadon; joṛao',
 'creating' => 'Benao',
 'editingsection' => 'Joṛao $1 (hạṭiń)',
@@ -424,6 +432,9 @@ Get ar ocoḱ giḍi sakam do latarre emakan reference lạgit em hoena.',
 Thoṛa format do noare banuḱana.',
 'post-expand-template-inclusion-category' => 'Sakamko oka borḍre noa tahẽna ona doe paromkeda',
 
+# Account creation failure
+'cantcreateaccounttitle' => 'Ekaunṭ do baṅ tearlena',
+
 # History pages
 'viewpagelogs' => 'Noa sakam reaḱ cạbi udukme',
 'currentrev-asof' => 'Mucạt nãwã aroy',
@@ -441,16 +452,26 @@ Thoṛa format do noare banuḱana.',
 'history-show-deleted' => 'khạli get giḍiyaḱ koge',
 'histfirst' => "adi laha-ak'",
 'histlast' => 'Nahak',
+'historyempty' => '(banuḱa)',
 
 # Revision feed
 'history-feed-title' => 'Jạṛ nãwã aroy',
 'history-feed-item-nocomment' => 're',
 
 # Revision deletion
+'rev-deleted-user' => '(laṛcaṛić ńutum ocoḱena)',
 'rev-delundel' => 'ńeloḱ/danaṅ',
+'rev-showdeleted' => 'Uduḱme',
+'revisiondelete' => 'Get giḍi/nãwã aro baṅ getgiḍi',
+'revdelete-show-file-submit' => 'Hẽ',
+'revdelete-radio-same' => '(alom bodola)',
+'revdelete-radio-set' => 'Hẽ',
 'revdel-restore' => 'Judạ lekate ńel',
 'revdel-restore-deleted' => 'giḍikaḱ ńel ruạṛ',
 'revdel-restore-visible' => 'Ńeloḱ leka paṛhao ruạṛ',
+'pagehist' => 'Sakam reaḱ jạṛ',
+'deletedhist' => 'Get giḍi jạṛ',
+'revdelete-reasonotherlist' => 'Eṭaḱak karon',
 
 # Merge log
 'revertmerge' => 'bań mit́',
@@ -482,7 +503,7 @@ Thoṛa format do noare banuḱana.',
 'searchprofile-images-tooltip' => 'File sendra',
 'searchprofile-everything-tooltip' => 'Sanam ko modre sẽndra ( roṛ sakam modre hõ)',
 'searchprofile-advanced-tooltip' => 'Judạ ńutum re sẽndra',
-'search-result-size' => 'bạyiṭ aema bạyiṭ',
+'search-result-size' => 'Katha Kathako',
 'search-redirect' => '($1 te sujhi doṛha )',
 'search-section' => '(Pahaṭa $1)',
 'search-suggest' => 'Am do cet́ $1 em menocoyet tãhẽkana',
@@ -490,15 +511,65 @@ Thoṛa format do noare banuḱana.',
 'searchall' => 'Sanam',
 'showingresultsheader' => "'''$4'''  lạgit́ {{PLURAL:$5|Pho̠l ńamoḱ́akan - '''$1''' of '''$3'''|Pho̠l ńamoḱ́akan '''$1 - $2''' of '''$3'''}}",
 'search-nonefound' => 'Kupuli leka roṛruạṛ bạnuḱa',
+'powersearch-togglelabel' => 'Sendra',
+'powersearch-toggleall' => 'Sanamaḱ',
+'powersearch-togglenone' => 'Okaṭaḱ hõ baṅ',
+
+# Quickbar
+'qbsettings-none' => 'Okaṭaḱ hõ baṅ',
 
 # Preferences page
+'preferences' => 'Pạsindko',
 'mypreferences' => 'Iñaḱ pạsindko',
+'changepassword' => 'Uku nombor bodolme',
+'prefs-skin' => 'Harta',
+'skin-preview' => 'Ńel, Unuduḱ',
+'datedefault' => 'Pạsind banuḱa',
+'prefs-resetpass' => 'Uku nombor bodolme',
+'prefs-changeemail' => 'E-mail ṭhikạna bodolme',
+'prefs-setemail' => 'E-mail ṭhikana benaome',
+'saveprefs' => 'Rukhiyạymẽ',
+'resetprefs' => 'Baṅ rukhiyạaḱ ocogmẽ',
+'rows' => 'Sạrko:',
+'searchresultshead' => 'Sendra',
+'timezoneregion-africa' => 'Aphrika',
+'timezoneregion-america' => 'Amirika',
+'timezoneregion-asia' => 'Esiya',
+'prefs-files' => 'Rẽtko',
 'youremail' => 'E-mail:',
+'username' => 'Beoharićaḱ ńutum:',
+'uid' => 'Beoharićaḱ cinhạo nombor',
 'yourrealname' => 'Sạ̣ri ńutum',
+'gender-male' => 'Baba hoṛ',
+'gender-female' => 'Gogo hoṛ, Kuṛi, Kuṛi gidrạ',
+'email' => 'E-mail',
 'prefs-help-email' => 'E-mail ṭhikana do bạṛtitege, menkhan uku namber nãwãte benao jạruṛa, am do amaḱ uku nomborem hiṛiń keda.',
 'prefs-help-email-others' => 'Am são e-mail hotete jogajog dohoy lạgitte mitṭen joṛao se amaḱ katha roṛaḱ sakam bachao jońme.
 Amaḱ e-mail ṭhikạna do bań cabaḱa tinre onko do ko beohara',
 
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => 'E-mail ṭhikạna do jewetge ńamena',
+'email-address-validity-invalid' => 'Amaḱ jewet e-mail ṭhkạna emmẽ',
+
+# User rights
+'userrights' => 'Beoharićaḱ laṛcaṛ ektiạrko',
+'userrights-lookup-user' => 'Beoharkoaḱ gãotako laṛcaṛ',
+'userrights-user-editname' => 'Beoharićaḱ ńutum emmẽ',
+'editusergroup' => 'Beoharićaḱ gãotako toṅgeymẽ',
+'userrights-editusergroup' => 'Beoharićaḱ gãotako toṅgeymẽ',
+'saveusergroups' => 'Beoharićaḱ gãotako rukhiyaymẽ',
+
+# Rights
+'right-edit' => 'Sakamko toṅge',
+'right-createpage' => 'Sakamko benoamẽ (Okako do galmarao sakamko baṅkan)',
+'right-createtalk' => 'Galmarao sakamko benaomẽ',
+'right-createaccount' => 'Nãwã beoharićaḱ ekaunṭ tearmẽ',
+'right-move' => 'Sakamko ocogmẽ',
+'right-move-subpages' => 'Sakam saõte kạtic sakamko ocogmẽ',
+'right-movefile' => 'Rẽtko ocogmẽ',
+'right-upload' => 'Rẽtko rakabmẽ',
+'right-delete' => 'Sakamko get giḍiymẽ',
+
 # Associated actions - in the sentence "You do not have permission to X"
 'action-edit' => 'noa sakam joṛao',
 
@@ -540,17 +611,34 @@ Amaḱ e-mail ṭhikạna do bań cabaḱa tinre onko do ko beohara',
 
 # Upload
 'upload' => 'Fael aploḍme',
+'uploadbtn' => 'Rẽt rakabmẽ',
 'uploadlogpage' => 'Chạbi do uthạome',
+'filename' => 'Rẽt ńutum',
 'filedesc' => 'Guṭ katha',
+'fileuploadsummary' => 'Guṭ katha',
+'savefile' => 'Rẽt rukhiyaymẽ',
 'uploadedimage' => 'Rakaṕ hoyena',
+'upload-description' => 'Rẽt reaḱ jạṛ',
+'watchthisupload' => 'Noa rẽt ńelmẽ',
+
+'upload-file-error' => 'Bhitri reaḱ bhul',
 
 'license' => 'Laisence benao',
 'license-header' => 'Laisense benao',
 
+# Special:ListFiles
+'imgfile' => 'Rẽt',
+'listfiles' => 'Rẽt reaḱ tạlika',
+'listfiles_date' => 'Tạrikh',
+'listfiles_name' => 'Ńutum',
+'listfiles_user' => 'Beoharić, Laṛcaṛic',
+
 # File description page
 'file-anchor-link' => 'Re̕t',
 'filehist' => 'Fael renaḱ Jạṛ',
 'filehist-help' => 'date re click me/somóy re click me fail reak obostha nel lagit',
+'filehist-deleteall' => 'Joto get giḍi',
+'filehist-deleteone' => 'Get giḍi',
 'filehist-revert' => 'Lahaleka',
 'filehist-current' => 'Nitaḱ',
 'filehist-datetime' => '̣Tạrikh/So̠mo̠y',
@@ -570,6 +658,7 @@ Noa reaḱ pasnao katha [$2 rẽt pasnao sakam] latare emena',
 
 # Statistics
 'statistics' => 'Halot',
+'statistics-pages' => 'Sakamko',
 
 'disambiguationspage' => 'sujhi',
 
@@ -577,9 +666,15 @@ Noa reaḱ pasnao katha [$2 rẽt pasnao sakam] latare emena',
 'nbytes' => '$1 {{PLURAL:$1|baiṭ|baiṭ}}',
 'nmembers' => 'Sãoten/ Sãotenko',
 'prefixindex' => 'Sanam sakam re joṛao menaḱ',
+'shortpages' => 'Huḍiń sakamko',
+'longpages' => 'Jiliń sakamko',
+'listusers' => 'beoharićaḱ tạlika',
 'usercreated' => 'Ayo baba: tạrikh okte',
 'newpages' => 'Nãwa Patako',
+'newpages-username' => 'Beoharićaḱ ńutum:',
+'ancientpages' => 'Mare sakamko',
 'move' => 'Ocoḱme, Kulme',
+'movethispage' => 'Noa sakam ocogmẽ',
 
 # Book sources
 'booksources' => 'Puthi ńamoḱ ṭhại/jayga',
@@ -593,6 +688,8 @@ Noa reaḱ pasnao katha [$2 rẽt pasnao sakam] latare emena',
 'allpages' => 'joto sakam',
 'alphaindexline' => '$1 hạbić $2',
 'allarticles' => 'Sanam sakam',
+'allpagesprev' => 'Tayom sećaḱ',
+'allpagesnext' => 'Laha seć',
 'allpagessubmit' => 'Calaḱme',
 
 # Special:Categories
@@ -601,14 +698,31 @@ Noa reaḱ pasnao katha [$2 rẽt pasnao sakam] latare emena',
 # Special:LinkSearch
 'linksearch-line' => '$2 joṛao menaḱa $2re',
 
+# Special:ListUsers
+'listusers-submit' => 'Udugmẽ',
+'listusers-blocked' => '(Esetgea)',
+
 # Special:Log/newusers
 'newuserlogpage' => 'Laṛcaṛićaḱ tear cạbi',
 
 # Special:ListGroupRights
+'listgrouprights-group' => 'Gaõta',
+'listgrouprights-rights' => 'Ạidạriko',
+'listgrouprights-helppage' => 'Goṛo:Gaõta ạidạri',
 'listgrouprights-members' => 'Saõtenkoaḱ tạlika',
+'listgrouprights-addgroup-all' => 'Joto gaõtare ko soṅgekom',
+'listgrouprights-removegroup-all' => 'Joto gaõtaren ko ocoḱgiḍikom',
 
 # E-mail user
 'emailuser' => 'Nui beoharić e-mail emayme',
+'emailpage' => 'E-mail beoharić',
+'noemailtitle' => 'E-mail ṭhikạna do banuḱa',
+'emailusername' => 'Beoharićaḱ ńutum:',
+'emailusernamesubmit' => 'Em',
+'emailfrom' => 'Kulić:',
+'emailto' => 'Ńamić:',
+'emailmessage' => 'Mesag',
+'emailsend' => 'Kulmẽ',
 
 # Watchlist
 'watchlist' => "Inak' n'el ko",
@@ -619,7 +733,14 @@ Noa reaḱ pasnao katha [$2 rẽt pasnao sakam] latare emena',
 'wlshowlast' => 'Mucạt 1 ghonta mucạt 2 maha uduḱme',
 'watchlist-options' => 'Ńelok tạlika reak sonketko',
 
+# Displayed when you click the "watch" button and it is in the process of watching
+'watching' => 'Ńeloḱ kana...',
+
+'changed' => 'Bodolena',
+
 # Delete
+'deletepage' => 'Sakam get giḍikam',
+'delete-legend' => 'Get giḍi',
 'actioncomplete' => 'kami Chabae-ena',
 'actionfailed' => 'Kami bang hoe-lena',
 'dellogpage' => 'Mãrao log',
@@ -633,6 +754,11 @@ Noa reaḱ pasnao katha [$2 rẽt pasnao sakam] latare emena',
 'protectcomment' => 'karon',
 'protectexpiry' => 'Cabaḱ',
 
+# Restrictions (nouns)
+'restriction-edit' => 'Toṅge',
+'restriction-move' => 'Ocoḱmẽ, Kulmẽ',
+'restriction-create' => 'Tearmẽ, Benaomẽ',
+
 # Undelete
 'undeletelink' => 'Ńel/doho ruạṛ',
 'undeleteviewlink' => 'Ńel',
@@ -680,30 +806,50 @@ Noa reaḱ pasnao katha [$2 rẽt pasnao sakam] latare emena',
 'whatlinkshere-filters' => 'Sapha',
 
 # Block/unblock
+'block' => 'Beoharić esedem',
+'blockip' => 'Beoharić esedem',
+'blockip-title' => 'Beoharić esedem',
+'blockip-legend' => 'Beoharić esedem',
 'ipboptions' => '2 Ghonṭa : 2 hours, 1 maha:1 day, 3 maha : 3 days,1 hapta :1 week, 2 hapta : 2 weeks, 1 cando :1 month, 3 cando : 3 months,6 cando :6 months,  1 serma :1 year,  Aemamaha : infinite',
 'ipblocklist' => 'Beoharic esetgeyay',
+'ipblocklist-submit' => 'Sendra',
+'emailblock' => 'E-mail do esetgea',
 'blocklink' => 'Eset',
 'unblocklink' => 'bań block',
 'change-blocklink' => 'block judạ',
 'contribslink' => 'em daṛeaḱ',
+'emaillink' => 'E-mail kulmẽ',
 'blocklogpage' => 'Tala eset',
 'blocklogentry' => 'Eset [[$1]] sãote cabaḱ okte oka do $2 $3',
 'block-log-flags-nocreate' => 'Ekaunṭ benao do bondogeya',
+'block-log-flags-noemail' => 'E-mail do esetgea',
+'block-log-flags-hiddenname' => 'Beoharićaḱ ńutum do ukugea',
+'blockme' => 'Esedińmẽ',
+'proxyblocksuccess' => 'Hoena',
 
 # Move page
+'movepagebtn' => 'Sakam ocogmẽ, Sakam kulmẽ',
+'pagemovedsub' => 'Ocogoḱ do hoena',
 'movelogpage' => 'Tala cạbi ocoḱme',
 'revertmove' => 'ruạr agu',
 
 # Export
 'export' => 'Aguyen sakamko',
+'export-addcat' => 'Joṛaomẽ',
+'export-addns' => 'Joṛaomẽ',
 
 # Namespace 8 related
 'allmessagesname' => 'Ńutum',
 'allmessagesdefault' => 'Bań bhul mesag ol',
+'allmessages-filter-all' => 'Sanamaḱ',
+'allmessages-filter-submit' => 'Calaḱmẽ',
 
 # Thumbnails
 'thumbnail-more' => 'Lạṭui mẽ',
 
+# Special:Import
+'import-upload-filename' => 'Rẽt ńutum',
+
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'Amak bebohar sakam',
 'tooltip-pt-mytalk' => 'Amaḱ katha ro̠ṛrenaḱ́ pata',
@@ -749,6 +895,7 @@ Ona te source em ńel daṛeaḱ',
 'tooltip-ca-nstab-project' => "project page nel' me",
 'tooltip-ca-nstab-image' => 'Fael sakam ńel',
 'tooltip-ca-nstab-template' => 'Forom uduḱme',
+'tooltip-ca-nstab-help' => 'Goṛo sakam ńelmẽ',
 'tooltip-ca-nstab-category' => 'Rokom sokom sakamko udukme',
 'tooltip-minoredit' => 'Noa do huḍiń joṛao lekate lekhay me',
 'tooltip-save' => 'Bodolaḱko rukhiyayme',
@@ -758,9 +905,14 @@ Ona te source em ńel daṛeaḱ',
 'tooltip-watch' => 'Amaḱ ńeloḱ sakamre noa do dohoyme',
 'tooltip-rollback' => '"Ghurlạ ạcur" noa sakam taṛam ruạṛ ńel sapha ona do amaḱ mũcạt́ mit́ dhom click re',
 'tooltip-undo' => 'Noa joṛao kạmire ulṭao "bạgiyaḱme" ar ńeloḱ lekate noa joṛao jhicme. Noa do am guḍ karon joṛaoe ektiyariye emama.',
+'tooltip-preferences-save' => 'Pạsindko rukhiyaymẽ',
 'tooltip-summary' => 'Khaṭote guṭ katha bhoraome',
 
+# Attribution
+'others' => 'Eṭagaḱko',
+
 # Info page
+'pageinfo-header-edits' => 'Toṅgeko',
 'pageinfo-header-watchlist' => 'Ńeloḱ tạlika',
 'pageinfo-header-views' => 'Ńelme',
 'pageinfo-subjectpage' => 'Sakam',
@@ -776,6 +928,9 @@ Ona te source em ńel daṛeaḱ',
 'file-nohires' => 'Aema resulation nondḍe banuḱa',
 'show-big-image' => 'Purạo resulation',
 
+# Special:NewFiles
+'ilsubmit' => 'Sendra',
+
 # Bad image list
 'bad_image_list' => 'Format do latar re leka',
 
@@ -792,6 +947,12 @@ f nombor
 isospeeddratings
 jeleń',
 
+# EXIF tags
+'exif-imagewidth' => 'Ganḍe',
+'exif-imagelength' => 'Usul',
+'exif-datetime' => 'Rẽt bodol reaḱ tạrikh ar okte',
+'exif-artist' => 'Onoliạ',
+
 # External editor support
 'edit-externally' => 'Noa rẽt tońge joṛao lạ̣gitte bahre reaḱ koejoń  beoharme',
 'edit-externally-help' => '(Nonḍe ńelme [//www.mediawiki.org/wiki/Manual:External_editors setup instructions] bạṛtite baḍay lạgit)',
index 479498c..9f918b2 100644 (file)
@@ -983,6 +983,7 @@ $2
 'language-converter-depth-warning' => '字词转换器深度越限($1)',
 'node-count-exceeded-category' => '页面的节点数超出限制',
 'node-count-exceeded-warning' => '页面超出了节点数',
+'expansion-depth-exceeded-category' => '扩展深度超出限制的页面',
 
 # "Undo" feature
 'undo-success' => '此编辑可以被撤销。请检查以下比较以核实这正是您想做的,然后保存以下更改完成撤销编辑。',
index 10ccb87..2ccf3fc 100644 (file)
@@ -967,7 +967,7 @@ $2
 'language-converter-depth-warning' => '已超過字詞轉換器深度限制($1)',
 'node-count-exceeded-category' => '頁面的節點數超出限制',
 'node-count-exceeded-warning' => '頁面超出節點數',
-'expansion-depth-exceeded-category' => '頁面的擴展深度超出限制',
+'expansion-depth-exceeded-category' => '擴展深度超出限制的頁面',
 'expansion-depth-exceeded-warning' => '頁面超出擴展深度',
 
 # "Undo" feature
index 0791711..8c6a411 100644 (file)
@@ -341,4 +341,65 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                wfDeprecated( $function );
                wfRestoreWarnings();
        }
+
+       /**
+        * Asserts that the given database query yields the rows given by $expectedRows.
+        * The expected rows should be given as indexed (not associative) arrays, with
+        * the values given in the order of the columns in the $fields parameter.
+        * Note that the rows are sorted by the columns given in $fields.
+        *
+        * @param $table String|Array the table(s) to query
+        * @param $fields String|Array the columns to include in the result (and to sort by)
+        * @param $condition String|Array "where" condition(s)
+        * @param $expectedRows Array - an array of arrays giving the expected rows.
+        *
+        * @throws MWException if this test cases's needsDB() method doesn't return true.
+        *         Test cases can use "@group Database" to enable database test support,
+        *         or list the tables under testing in $this->tablesUsed, or override the
+        *         needsDB() method.
+        */
+       protected function assertSelect( $table, $fields, $condition, Array $expectedRows ) {
+               if ( !$this->needsDB() ) {
+                       throw new MWException( 'When testing database state, the test cases\'s needDB()' .
+                               ' method should return true. Use @group Database or $this->tablesUsed.');
+               }
+
+               $db = wfGetDB( DB_SLAVE );
+
+               $res = $db->select( $table, $fields, $condition, array( 'ORDER BY' => $fields ) );
+               $this->assertNotEmpty( $res, "query failed: " . $db->lastError() );
+
+               $i = 0;
+
+               foreach ( $expectedRows as $expected ) {
+                       $r = $res->fetchRow();
+                       self::stripStringKeys( $r );
+
+                       $i += 1;
+                       $this->assertNotEmpty( $r, "row #$i missing" );
+
+                       $this->assertEquals( $expected, $r, "row #$i mismatches" );
+               }
+
+               $r = $res->fetchRow();
+               self::stripStringKeys( $r );
+
+               $this->assertFalse( $r, "found extra row (after #$i)" );
+       }
+
+       /**
+        * Utility function for eliminating all string keys from an array.
+        * Useful to turn a database result row as returned by fetchRow() into
+        * a pure indexed array.
+        *
+        * @static
+        * @param $r mixed the array to remove string keys from.
+        */
+       protected static function stripStringKeys( &$r ) {
+               if ( !is_array( $r ) ) return;
+
+               foreach ( $r as $k => $v ) {
+                       if ( is_string( $k ) ) unset( $r[$k] );
+               }
+       }
 }
diff --git a/tests/phpunit/includes/LinksUpdateTest.php b/tests/phpunit/includes/LinksUpdateTest.php
new file mode 100644 (file)
index 0000000..4946200
--- /dev/null
@@ -0,0 +1,154 @@
+<?php
+
+/**
+ *
+ * @group Database
+ * ^--- make sure temporary tables are used.
+ */
+class LinksUpdateTest extends MediaWikiTestCase {
+
+       function  __construct( $name = null, array $data = array(), $dataName = '' ) {
+               parent::__construct( $name, $data, $dataName );
+
+               $this->tablesUsed = array_merge ( $this->tablesUsed,
+                                                                                       array( 'interwiki',
+
+                                                                                               'page_props',
+                                                                                               'pagelinks',
+                                                                                               'categorylinks',
+                                                                                               'langlinks',
+                                                                                               'externallinks',
+                                                                                               'imagelinks',
+                                                                                               'templatelinks',
+                                                                                               'iwlinks' ) );
+       }
+
+       function setUp() {
+               $dbw = wfGetDB( DB_MASTER );
+               $dbw->replace( 'interwiki',
+                                               array('iw_prefix'),
+                                               array( 'iw_prefix' => 'linksupdatetest',
+                                                      'iw_url' => 'http://testing.com/wiki/$1',
+                                                      'iw_api' => 'http://testing.com/w/api.php',
+                                                      'iw_local' => 0,
+                                                      'iw_trans' => 0,
+                                                      'iw_wikiid' => 'linksupdatetest',
+                                               ) );
+       }
+
+       protected function makeTitleAndParserOutput( $name, $id ) {
+               $t = Title::newFromText( $name );
+               $t->mArticleID = $id; # XXX: this is fugly
+
+               $po = new ParserOutput();
+               $po->setTitleText( $t->getPrefixedText() );
+
+               return array( $t, $po );
+       }
+
+       public function testUpdate_pagelinks() {
+               list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", 111 );
+
+               $po->addLink( Title::newFromText( "Foo" ) );
+               $po->addLink( Title::newFromText( "Special:Foo" ) ); // special namespace should be ignored
+               $po->addLink( Title::newFromText( "linksupdatetest:Foo" ) ); // interwiki link should be ignored
+               $po->addLink( Title::newFromText( "#Foo" ) ); // hash link should be ignored
+
+               $this->assertLinksUpdate( $t, $po, 'pagelinks', 'pl_namespace, pl_title', 'pl_from = 111', array(
+                       array( NS_MAIN, 'Foo' ),
+               ) );
+
+               $po = new ParserOutput();
+               $po->setTitleText( $t->getPrefixedText() );
+
+               $po->addLink( Title::newFromText( "Bar" ) );
+
+               $this->assertLinksUpdate( $t, $po, 'pagelinks', 'pl_namespace, pl_title', 'pl_from = 111', array(
+                       array( NS_MAIN, 'Bar' ),
+               ) );
+       }
+
+       public function testUpdate_externallinks() {
+               list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", 111 );
+
+               $po->addExternalLink( "http://testing.com/wiki/Foo" );
+
+               $this->assertLinksUpdate( $t, $po, 'externallinks', 'el_to, el_index', 'el_from = 111', array(
+                       array( 'http://testing.com/wiki/Foo', 'http://com.testing./wiki/Foo' ),
+               ) );
+       }
+
+       public function testUpdate_categorylinks() {
+               list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", 111 );
+
+               $po->addCategory( "Foo", "FOO" );
+
+               $this->assertLinksUpdate( $t, $po, 'categorylinks', 'cl_to, cl_sortkey', 'cl_from = 111', array(
+                       array( 'Foo', "FOO\nTESTING" ),
+               ) );
+       }
+
+       public function testUpdate_iwlinks() {
+               list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", 111 );
+
+               $target = Title::makeTitleSafe( NS_MAIN, "Foo", '', 'linksupdatetest' );
+               $po->addInterwikiLink( $target );
+
+               $this->assertLinksUpdate( $t, $po, 'iwlinks', 'iwl_prefix, iwl_title', 'iwl_from = 111', array(
+                       array( 'linksupdatetest', 'Foo' ),
+               ) );
+       }
+
+       public function testUpdate_templatelinks() {
+               list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", 111 );
+
+               $po->addTemplate( Title::newFromText( "Template:Foo" ), 23, 42 );
+
+               $this->assertLinksUpdate( $t, $po, 'templatelinks', 'tl_namespace, tl_title', 'tl_from = 111', array(
+                       array( NS_TEMPLATE, 'Foo' ),
+               ) );
+       }
+
+       public function testUpdate_imagelinks() {
+               list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", 111 );
+
+               $po->addImage( "Foo.png" );
+
+
+               $this->assertLinksUpdate( $t, $po, 'imagelinks', 'il_to', 'il_from = 111', array(
+                       array( 'Foo.png' ),
+               ) );
+       }
+
+       public function testUpdate_langlinks() {
+               list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", 111 );
+
+               $po->addLanguageLink( Title::newFromText( "en:Foo" ) );
+
+
+               $this->assertLinksUpdate( $t, $po, 'langlinks', 'll_lang, ll_title', 'll_from = 111', array(
+                       array( 'En', 'Foo' ),
+               ) );
+       }
+
+       public function testUpdate_page_props() {
+               list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", 111 );
+
+               $po->setProperty( "foo", "bar" );
+
+               $this->assertLinksUpdate( $t, $po, 'page_props', 'pp_propname, pp_value', 'pp_page = 111', array(
+                       array( 'foo', 'bar' ),
+               ) );
+       }
+
+       #@todo: test recursive, too!
+
+       protected function assertLinksUpdate( Title $title, ParserOutput $parserOutput, $table, $fields, $condition, Array $expectedRows ) {
+               $update = new LinksUpdate( $title, $parserOutput );
+
+               $update->doUpdate();
+
+               $this->assertSelect( $table, $fields, $condition, $expectedRows );
+       }
+}
+
index f4baf95..f3176ab 100644 (file)
@@ -84,38 +84,17 @@ if ( QUnit.urlParams.completenesstest ) {
 QUnit.config.urlConfig.push( 'mwlogenv' );
 
 /**
- * Reset mw.config to a fresh copy of the live config for each test();
- * @param override {Object} [optional]
- * @example:
- * <code>
- * module( .., newMwEnvironment() );
- *
- * test( .., function () {
- *     mw.config.set( 'foo', 'bar' ); // just for this test
- * } );
- *
- * test( .., function () {
- *     mw.config.get( 'foo' ); // doesn't exist
- * } );
- *
- *
- * module( .., newMwEnvironment({ quux: 'corge' }) );
- *
- * test( .., function () {
- *     mw.config.get( 'quux' ); // "corge"
- *     mw.config.set( 'quux', "grault" );
- * } );
- *
- * test( .., function () {
- *     mw.config.get( 'quux' ); // "corge"
- * } );
+ * Reset mw.config and others to a fresh copy of the live config for each test(),
+ * and restore it back to the live one afterwards.
+ * @param localEnv {Object} [optional]
+ * @example (see test suite at the bottom of this file)
  * </code>
  */
 QUnit.newMwEnvironment = ( function () {
-       var log, liveConfig, liveMsgs;
+       var log, liveConfig, liveMessages;
 
        liveConfig = mw.config.values;
-       liveMsgs = mw.messages.values;
+       liveMessages = mw.messages.values;
 
        function freshConfigCopy( custom ) {
                // "deep=true" is important here.
@@ -123,34 +102,46 @@ QUnit.newMwEnvironment = ( function () {
                // e.g. mw.config.set( 'wgFileExtensions', [] ) would not effect liveConfig,
                // but mw.config.get( 'wgFileExtensions' ).push( 'png' ) would as the array
                // was passed by reference in $.extend's loop.
-               return $.extend({}, liveConfig, custom, /*deep=*/true );
+               return $.extend( {}, liveConfig, custom, /*deep=*/true );
        }
 
-       function freshMsgsCopy( custom ) {
-               return $.extend({}, liveMsgs, custom, /*deep=*/true );
+       function freshMessagesCopy( custom ) {
+               return $.extend( {}, liveMessages, custom, /*deep=*/true );
        }
 
        log = QUnit.urlParams.mwlogenv ? mw.log : function () {};
 
-       return function ( overrideConfig, overrideMsgs ) {
-               overrideConfig = overrideConfig || {};
-               overrideMsgs = overrideMsgs || {};
+       return function ( localEnv ) {
+               localEnv = $.extend( {
+                       // QUnit
+                       setup: $.noop,
+                       teardown: $.noop,
+                       // MediaWiki
+                       config: {},
+                       messages: {}
+               }, localEnv );
 
                return {
                        setup: function () {
                                log( 'MwEnvironment> SETUP    for "' + QUnit.config.current.module
                                        + ': ' + QUnit.config.current.testName + '"' );
+
                                // Greetings, mock environment!
-                               mw.config.values = freshConfigCopy( overrideConfig );
-                               mw.messages.values = freshMsgsCopy( overrideMsgs );
+                               mw.config.values = freshConfigCopy( localEnv.config );
+                               mw.messages.values = freshMessagesCopy( localEnv.messages );
+
+                               localEnv.setup()
                        },
 
                        teardown: function () {
                                log( 'MwEnvironment> TEARDOWN for "' + QUnit.config.current.module
                                        + ': ' + QUnit.config.current.testName + '"' );
+
+                               localEnv.teardown();
+
                                // Farewell, mock environment!
                                mw.config.values = liveConfig;
-                               mw.messages.values = liveMsgs;
+                               mw.messages.values = liveMessages;
                        }
                };
        };
@@ -200,4 +191,59 @@ addons = {
 $.extend( QUnit, addons );
 $.extend( window, addons );
 
+/**
+ * Small test suite to confirm proper functionality of the utilities and
+ * initializations in this file.
+ */
+var envExecCount = 0;
+module( 'mediawiki.tests.qunit.testrunner', QUnit.newMwEnvironment({
+       setup: function () {
+               envExecCount += 1;
+               this.mwHtmlLive = mw.html;
+               mw.html = {
+                       escape: function () {
+                               return 'mocked-' + envExecCount;
+                       }
+               };
+       },
+       teardown: function () {
+               mw.html = this.mwHtmlLive;
+       },
+       config: {
+               testVar: 'foo'
+       },
+       messages: {
+               testMsg: 'Foo.'
+       }
+}) );
+
+test( 'Setup', function () {
+       expect( 3 );
+
+       equal( mw.html.escape( 'foo' ), 'mocked-1', 'extra setup() callback was ran.' );
+       equal( mw.config.get( 'testVar' ), 'foo', 'config object applied' );
+       equal( mw.messages.get( 'testMsg' ), 'Foo.', 'messages object applied' );
+
+       mw.config.set( 'testVar', 'bar' );
+       mw.messages.set( 'testMsg', 'Bar.' );
+});
+
+test( 'Teardown', function () {
+       expect( 3 );
+
+       equal( mw.html.escape( 'foo' ), 'mocked-2', 'extra setup() callback was re-ran.' );
+       equal( mw.config.get( 'testVar' ), 'foo', 'config object restored and re-applied after test()' );
+       equal( mw.messages.get( 'testMsg' ), 'Foo.', 'messages object restored and re-applied after test()' );
+});
+
+module( 'mediawiki.tests.qunit.testrunner-after', QUnit.newMwEnvironment() );
+
+test( 'Teardown', function () {
+       expect( 3 );
+
+       equal( mw.html.escape( '<' ), '&lt;', 'extra teardown() callback was ran.' );
+       equal( mw.config.get( 'testVar' ), null, 'config object restored to live in next module()' );
+       equal( mw.messages.get( 'testMsg' ), null, 'messages object restored to live in next module()' );
+});
+
 })( jQuery, mediaWiki, QUnit );
index 95284c7..f028dbc 100644 (file)
@@ -7,7 +7,7 @@ var config = {
        wgContentLanguage: 'en'
 };
 
-module( 'jquery.tablesorter', QUnit.newMwEnvironment( config ) );
+module( 'jquery.tablesorter', QUnit.newMwEnvironment({ config: config }) );
 
 test( '-- Initial check', function() {
        expect(1);
index e04111f..7ff0fb8 100644 (file)
@@ -55,7 +55,7 @@ var config = {
        "wgCaseSensitiveNamespaces": []
 };
 
-module( 'mediawiki.Title', QUnit.newMwEnvironment( config ) );
+module( 'mediawiki.Title', QUnit.newMwEnvironment({ config: config }) );
 
 test( '-- Initial check', function () {
        expect(1);
index 552e69e..b834aeb 100644 (file)
@@ -3,10 +3,11 @@ module( 'mediawiki.Uri', QUnit.newMwEnvironment() );
 test( '-- Initial check', function () {
        expect( 2 );
 
-       // Ensure we have a generic URI parser if not running in a browser
-       if ( !mw.Uri ) {
-               mw.Uri = mw.UriRelative( 'http://example.com/' );
-       }
+       // Ensure we have a generic mw.Uri constructor. By default mediawiki.uri,
+       // will use the currrent window ocation as base. But for testing we need
+       // to have a generic one, so that it doens't return false negatives if
+       // we run the test suite from an https server.
+       mw.Uri = mw.UriRelative( 'http://example.org/w/index.php' );
 
        ok( mw.UriRelative, 'mw.UriRelative defined' );
        ok( mw.Uri, 'mw.Uri defined' );