* (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.
}
/**
- * @return bool|int|null
+ * @return int log_id of the inserted log entry
*/
protected function saveContent() {
global $wgLogRestrictions;
} 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.
* @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;
# 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',
# Diffs
'history-title' => 'Гісторыя зьменаў старонкі «$1»',
+'difference-title' => 'Розьніца паміж вэрсіямі «$1»',
+'difference-title-multipage' => 'Розьніца паміж старонкамі «$1» і «$2»',
'difference-multipage' => '(Розьніца паміж старонкамі)',
'lineno' => 'Радок $1:',
'compareselectedversions' => 'Параўнаць выбраныя вэрсіі',
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''",
# 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',
'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",
'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.
'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.',
# 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ś',
'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.',
'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''",
# Diffs
'history-title' => 'היסטוריית הגרסאות של $1',
+'difference-title' => 'הבדלים בין גרסאות של "$1"',
+'difference-title-multipage' => 'הבדלים בין הדפים $1 ו{{GRAMMAR:תחילית|$2}}',
'difference-multipage' => '(הבדלים בין דפים)',
'lineno' => 'שורה $1:',
'compareselectedversions' => 'השוואת הגרסאות שנבחרו',
# 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ć',
# 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',
'filereadonlyerror' => 'ფაილი "$1" შეცვლა ვერ ხერხდება, რადგანაც ფაილის საცავი "$2" მხოლოდ კითხვის რეჟიმშია.
ადმინისტრატორი რომელმაც ის დაბლოკა მიუთითა შემდეგი მიზეზი: "$3".',
+'invalidtitle-knownnamespace' => 'დაუშვებელი სათაური სახელთა სივრცე "$2" და ტექსტი "$3"-თან',
+'invalidtitle-unknownnamespace' => 'დაუშვებელი სათაური უცნობი სახელთა სივრცის ნომერი $1 და ტექსტი "$2"-ით',
# Virus scanner
'virus-badscanner' => "შეცდომა. ვირუსთა უცნობი სკანერი: ''$1''",
'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' => 'რედაქტირების გაუქმება შესაძლებელია. გთხოვთ შეამოწმოთ განსხვავება ქვევით, რათა დარწმუნდეთ, რომ ეს ის არის რაც თქვენ გსურთ, შემდეგ კი შეინახეთ ცვლილებები რათა დაასრულოთ რედაქტირების გაუქმება.',
# Diffs
'history-title' => 'ცვლილებათა ისტორია სტატიაში „$1“',
+'difference-title' => 'განსხვავება გადახედვებს შორის " $1 "',
+'difference-title-multipage' => 'განსხვავება „$1“ და „$2“ გვერდებს შორის',
'difference-multipage' => '(განსხვავება გვერდებს შორის)',
'lineno' => 'ხაზი $1:',
'compareselectedversions' => 'არჩეული ვერსიების შედარება',
'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''",
'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.
'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',
'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''",
'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',
'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
'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 o arquivo',
'sig_tip' => 'Sua assinatura, com hora e data',
'hr_tip' => 'Linha horizontal (use de forma moderada)',
'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.',
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.',
'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.
'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.',
'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',
'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}})',
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',
# 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',
'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]]',
'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)',
'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:',
'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',
'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',
'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)',
# 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',
'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]]):',
'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.
'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.',
# 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)',
'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
'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',
'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 há 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}}',
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.
'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',
'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' => 'Salvar as 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',
'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',
# 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
'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',
'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
'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.',
* @file
*
* @author Albinus
+ * @author David Baskey
* @author Ghonokuashabaskey
* @author Nipon087
* @author Salvator
'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ḱ',
'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',
'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',
'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',
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',
'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',
'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?',
'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',
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ń)',
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',
'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́',
'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',
'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',
# 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',
# Statistics
'statistics' => 'Halot',
+'statistics-pages' => 'Sakamko',
'disambiguationspage' => 'sujhi',
'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',
'allpages' => 'joto sakam',
'alphaindexline' => '$1 hạbić $2',
'allarticles' => 'Sanam sakam',
+'allpagesprev' => 'Tayom sećaḱ',
+'allpagesnext' => 'Laha seć',
'allpagessubmit' => 'Calaḱme',
# Special:Categories
# 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",
'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',
'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',
'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',
'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',
'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',
'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',
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)',
'language-converter-depth-warning' => '字词转换器深度越限($1)',
'node-count-exceeded-category' => '页面的节点数超出限制',
'node-count-exceeded-warning' => '页面超出了节点数',
+'expansion-depth-exceeded-category' => '扩展深度超出限制的页面',
# "Undo" feature
'undo-success' => '此编辑可以被撤销。请检查以下比较以核实这正是您想做的,然后保存以下更改完成撤销编辑。',
'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
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] );
+ }
+ }
}
--- /dev/null
+<?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 );
+ }
+}
+
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.
// 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;
}
};
};
$.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( '<' ), '<', '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 );
wgContentLanguage: 'en'
};
-module( 'jquery.tablesorter', QUnit.newMwEnvironment( config ) );
+module( 'jquery.tablesorter', QUnit.newMwEnvironment({ config: config }) );
test( '-- Initial check', function() {
expect(1);
"wgCaseSensitiveNamespaces": []
};
-module( 'mediawiki.Title', QUnit.newMwEnvironment( config ) );
+module( 'mediawiki.Title', QUnit.newMwEnvironment({ config: config }) );
test( '-- Initial check', function () {
expect(1);
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' );