Merge "Added getMessage() method"
authorawjrichards <arichards@wikimedia.org>
Fri, 12 Oct 2012 23:37:29 +0000 (23:37 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Fri, 12 Oct 2012 23:37:29 +0000 (23:37 +0000)
Asirra.i18n.php
Captcha.php
ConfirmEdit.alias.php
ConfirmEdit.i18n.php
FancyCaptcha.class.php
FancyCaptcha.i18n.php
FancyCaptcha.php
QuestyCaptcha.i18n.php
ReCaptcha.i18n.php
maintenance/GenerateFancyCaptchas.php [new file with mode: 0644]

index 684ba90014d8cd7c3e16d8037e5b2ed45fde16f3..7329a83de464b464d2a851b8c149f9d7bed368f9 100644 (file)
@@ -23,13 +23,34 @@ $messages['en'] = array(
 );
 
 /** Message documentation (Message documentation)
+ * @author 2nd-player
  * @author Beta16
  */
 $messages['qqq'] = array(
        'asirra-desc' => '{{desc}}',
+       'asirra-edit' => 'See also
+*{{msg-mw|Captcha-edit}}
+*{{msg-mw|Questycaptcha-edit}}
+*{{msg-mw|Fancycaptcha-edit}}
+*{{msg-mw|Recaptcha-edit}}',
+       'asirra-addurl' => 'See also
+*{{msg-mw|Captcha-addurl}}
+*{{msg-mw|Questycaptcha-addurl}}
+*{{msg-mw|Fancycaptcha-addurl}}
+*{{msg-mw|Recaptcha-addurl}}',
+       'asirra-badpass' => 'See also
+*{{msg-mw|Captcha-badlogin}}
+*{{msg-mw|Questycaptcha-badlogin}}
+*{{msg-mw|Fancycaptcha-badlogin}}
+*{{msg-mw|Recaptcha-badpass}}',
+       'asirra-createaccount' => 'See also
+*{{msg-mw|Captcha-createaccount}}
+*{{msg-mw|Questycaptcha-createaccount}}
+*{{msg-mw|Fancycaptcha-createaccount}}
+*{{msg-mw|Recaptcha-createaccount}}',
 );
 
-/** Belarusian (Taraškievica orthography) (‪беларуская (тарашкевіца)‬)
+/** Belarusian (Taraškievica orthography) (беларуская (тарашкевіца)‎)
  * @author EugeneZelenko
  * @author Jim-by
  * @author Wizardist
@@ -61,7 +82,7 @@ $messages['de'] = array(
        'asirra-failed' => 'Bitte wähle nur die Fotos mit Katzen aus.',
 );
 
-/** German (formal address) (‪Deutsch (Sie-Form)‬)
+/** German (formal address) (Deutsch (Sie-Form)‎)
  * @author Kghbln
  */
 $messages['de-formal'] = array(
@@ -73,6 +94,13 @@ $messages['de-formal'] = array(
        'asirra-failed' => 'Bitte wählen Sie nur die Fotos mit Katzen aus.',
 );
 
+/** Zazaki (Zazaki)
+ * @author Erdemaslancan
+ */
+$messages['diq'] = array(
+       'asirra-desc' => 'Qandê Asirra modulê RaştkerdenVurnen',
+);
+
 /** Spanish (español)
  * @author Armando-Martin
  */
@@ -165,11 +193,19 @@ $messages['it'] = array(
 );
 
 /** Japanese (日本語)
+ * @author 2nd-player
  * @author Shirayuki
  */
 $messages['ja'] = array(
        'asirra-desc' => 'ConfirmEdit 用 Asirra モジュール',
+       'asirra-edit' => '自動編集のスパム攻撃を防ぐため、猫が写っている画像を以下から選択してください:',
+       'asirra-addurl' => 'あなたは新しい外部リンクを追加しようとしています。自動でのスパム攻撃を防ぐため、猫が写っている画像を以下から選択してください:',
+       'asirra-badpass' => '自動でのパスワードクラック攻撃を防ぐため、猫が写っている画像を以下から選択してください:',
+       'asirra-createaccount' => 'アカウントの自動登録を防ぐため、猫が写っている画像を以下から選択してください:',
+       'asirra-createaccount-fail' => '猫を正しく選択してください。',
+       'asirra-create' => 'ページの自動作成を防ぐため、猫が写っている画像を以下から選択してください:',
        'asirra-nojs' => "'''JavaScript を有効にしてページを再読込してください。'''",
+       'asirra-failed' => '猫が写っている画像をすべて選択してください',
 );
 
 /** Colognian (Ripoarisch)
@@ -228,7 +264,7 @@ $messages['mt'] = array(
        'asirra-failed' => 'Sib l-istampi kollha tal-qtates',
 );
 
-/** Norwegian Bokmål (‪norsk (bokmål)‬)
+/** Norwegian Bokmål (norsk (bokmål)‎)
  * @author Event
  */
 $messages['nb'] = array(
@@ -349,7 +385,7 @@ Po s' mete a houte des des robots di spam, nos  vs dimandans d' acertiner ki vos
        'asirra-failed' => 'Idintifyî totes les imådjes avou des tchets',
 );
 
-/** Simplified Chinese (‪中文(简体)‬)
+/** Simplified Chinese (中文(简体)‎)
  * @author Hzy980512
  */
 $messages['zh-hans'] = array(
@@ -364,3 +400,16 @@ $messages['zh-hans'] = array(
        'asirra-failed' => '请选出所有猫的图片',
 );
 
+/** Traditional Chinese (中文(繁體)‎) */
+$messages['zh-hant'] = array(
+       'asirra-desc' => 'ConfirmEdit的Asirra模塊',
+       'asirra-edit' => '為了防止垃圾編輯攻擊,請在下面的方框中選出貓的圖片:',
+       'asirra-addurl' => '您的編輯包含新的外部鏈接。為了幫助防止自動垃圾郵件,請在下面的方框中選出貓的圖片:',
+       'asirra-badpass' => '為防止自動程序破解密碼,請在下面的方框中選出貓的圖片:',
+       'asirra-createaccount' => '為了防止自動程序創建帳戶,請在下面的方框中選出貓的圖片:',
+       'asirra-createaccount-fail' => '請正確辨認出貓的圖片。',
+       'asirra-create' => '為了防止自動程序創建頁面,請在下面的方框中選出貓的圖片:',
+       'asirra-nojs' => "'''請啟動JavaScript後再提交頁面。'''",
+       'asirra-failed' => '請選出所有貓的圖片',
+);
+
index ab52fae8ff32673a8e402cac8683e991c2cf45e1..0f78d36f546ffc6effb2a46b0754387fc49d0398 100644 (file)
@@ -315,8 +315,8 @@ class SimpleCaptcha {
 
                global $wgCaptchaRegexes;
                if ( $wgCaptchaRegexes ) {
-                       // Custom regex checks
-                       $oldtext = $this->loadText( $editPage, $section );
+                       // Custom regex checks. Reuse $oldtext if set above.
+                       $oldtext = isset( $oldtext ) ? $oldtext : $this->loadText( $editPage, $section );
 
                        foreach ( $wgCaptchaRegexes as $regex ) {
                                $newMatches = array();
@@ -683,7 +683,7 @@ class SimpleCaptcha {
         * @access private
         */
        function loadText( $editPage, $section ) {
-               $rev = Revision::newFromTitle( $editPage->mTitle );
+               $rev = Revision::newFromTitle( $editPage->mTitle, false, Revision::READ_LATEST );
                if ( is_null( $rev ) ) {
                        return "";
                } else {
index e96b8a0e213ef9fc8aca248a5a5dcad7b7060da7..7823cf69fd46ca03fc3e499ff6d0e1520adb7cdf 100644 (file)
@@ -83,7 +83,7 @@ $specialPageAliases['ml'] = array(
        'Captcha' => array( 'ക്യാപ്ച' ),
 );
 
-/** Serbian (Cyrillic script) (‪српски (ћирилица)‬) */
+/** Serbian (Cyrillic script) (српски (ћирилица)‎) */
 $specialPageAliases['sr-ec'] = array(
        'Captcha' => array( 'Потврдни_код' ),
 );
@@ -98,12 +98,12 @@ $specialPageAliases['yue'] = array(
        'Captcha' => array( '驗證碼' ),
 );
 
-/** Simplified Chinese (‪中文(简体)‬) */
+/** Simplified Chinese (中文(简体)‎) */
 $specialPageAliases['zh-hans'] = array(
        'Captcha' => array( '验证码' ),
 );
 
-/** Traditional Chinese (‪中文(繁體)‬) */
+/** Traditional Chinese (中文(繁體)‎) */
 $specialPageAliases['zh-hant'] = array(
        'Captcha' => array( '驗證碼' ),
 );
\ No newline at end of file
index c18262e9504338adeffba47f3cc71391bb0b9a59..4f68eabcce39625f7ffa0e481b720b4687834421 100644 (file)
@@ -13,16 +13,16 @@ $messages['en'] = array(
        'captcha-desc'               => 'Provides CAPTCHA techniques to protect against spam and password-guessing',
        'captcha-label'              => 'CAPTCHA',
        'captcha-addurl'             => 'Your edit includes new external links.
-To help protect against automated spam, please solve the simple sum below and enter the answer in the box ([[Special:Captcha/help|more info]]):',
-       'captcha-badlogin'           => 'To help protect against automated password cracking, please solve the simple sum below and enter the answer in the box ([[Special:Captcha/help|more info]]):',
-       'captcha-createaccount'      => 'To help protect against automated account creation, please solve the simple sum below and enter the answer in the box ([[Special:Captcha/help|more info]]):',
-       'captcha-createaccount-fail' => "Incorrect or missing confirmation code.",
+To protect the wiki against automated spam, we kindly ask you to solve the simple sum below and enter the answer in the box in order to save your edit ([[Special:Captcha/help|more info]]):',
+       'captcha-badlogin'           => 'To protect the wiki against automated password cracking, we kindly ask you to solve the simple sum below and enter the answer in the box ([[Special:Captcha/help|more info]]):',
+       'captcha-createaccount'      => 'To protect the wiki against automated account creation, we kindly ask you to solve the simple sum below and enter the answer in the box ([[Special:Captcha/help|more info]]):',
+       'captcha-createaccount-fail' => 'Incorrect or missing confirmation code.',
        'captcha-create'             => 'To create the page, please solve the simple sum below and enter the answer in the box ([[Special:Captcha/help|more info]]):',
-       'captcha-sendemail'          => 'To help protect against automated spamming, please solve the simple sum below and enter the answer in the box ([[Special:Captcha/help|more info]]):',
+       'captcha-sendemail'          => 'To protect the wiki against automated spamming, we kindly ask you to solve the simple sum below and enter the answer in the box ([[Special:Captcha/help|more info]]):',
        'captcha-sendemail-fail'     => 'Incorrect or missing confirmation code.',
        'captcha-disabledinapi'      => 'This action requires a captcha, so it cannot be performed through the API.',
        'captchahelp-title'          => 'CAPTCHA help',
-       'captchahelp-cookies-needed' => "You will need to have cookies enabled in your browser for this to work.",
+       'captchahelp-cookies-needed' => 'You will need to have cookies enabled in your browser for this to work.',
        'captchahelp-text'           => "Web sites that accept postings from the public, like this wiki, are often abused by spammers who use automated tools to post their links to many sites.
 While these spam links can be removed, they are a significant nuisance.
 
@@ -31,7 +31,7 @@ Since this is a task that's hard to automate, it will allow most real humans to
 
 Unfortunately this may inconvenience users with limited vision or using text-based or speech-based browsers.
 At the moment we do not have an audio alternative available.
-Please contact the  [[{{MediaWiki:Grouppage-sysop}}|site administrators]] for assistance if this is unexpectedly preventing you from making legitimate posts.
+Please contact the  [[{{MediaWiki:Grouppage-sysop}}|site administrators]] for assistance if this is unexpectedly preventing you from making legitimate actions.
 
 Hit the 'back' button in your browser to return to the page editor.",
        'captcha-addurl-whitelist'   => ' #<!-- leave this line exactly as it is --> <pre>
@@ -323,12 +323,12 @@ $messages['ast'] = array(
        'captcha-edit' => "Pa editar esta páxina, por favor resuelvi la suma simple d'embaxo y pon la rempuesta nel caxellu ([[Special:Captcha/help|más información]]):",
        'captcha-desc' => "Ufre téuniques de CAPTCHA pa protexese escontra'l spam y descubrimientu de contraseñes",
        'captcha-label' => 'CAPTCHA',
-       'captcha-addurl' => "La to edición inclúi nuevos enllaces esternos. P'aidar a protexer escontra'l spam automatizáu, por favor resuelvi la suma simple d'embaxo y pon la rempuesta nel caxellu ([[Special:Captcha/help|más información]]):",
-       'captcha-badlogin' => "P'aidar a protexer escontra'l descifráu automáticu de claves, por favor resuelvi la suma simple d'embaxo y pon la rempuesta nel caxellu ([[Special:Captcha/help|más información]]):",
-       'captcha-createaccount' => "P'aidar a protexer escontra la creación automática de cuentes, por favor resuelvi la suma simple d'embaxo y pon la rempuesta nel caxellu ([[Special:Captcha/help|más información]]):",
+       'captcha-addurl' => "La to edición inclúi nuevos enllaces esternos. Pa protexer la wiki escontra'l spam automatizáu, pidimoste por favor que resuelvas la suma simple d'embaxo y pongas la rempuesta na caxella pa guardar la edición ([[Special:Captcha/help|más información]]):",
+       'captcha-badlogin' => "Pa protexer la wiki escontra'l descifráu automáticu de claves, pidimoste por favor que resuelvas la suma simple d'embaxo y pongas la rempuesta na caxella ([[Special:Captcha/help|más información]]):",
+       'captcha-createaccount' => "Pa protexer la wiki escontra la creación automática de cuentes, pidimoste por favor que resuelvas la suma simple d'embaxo y pongas la rempuesta na caxella ([[Special:Captcha/help|más información]]):",
        'captcha-createaccount-fail' => 'Códigu de confirmación incorreutu o ausente.',
        'captcha-create' => "Pa crear la páxina, por favor resuelvi la suma simple d'embaxo y pon la rempuesta nel caxellu ([[Special:Captcha/help|más información]]):",
-       'captcha-sendemail' => "P'aidar a protexese escontra la puxarra automatizada, por favor resuelvi la suma cenciella d'embaxo y pon la rempuesta na caxella ([[Special:Captcha/help|más información]]):",
+       'captcha-sendemail' => "Pa protexer la wiki escontra la puxarra automatizada, pidimoste por favor que resuelvas la suma cenciella d'embaxo y pongas la rempuesta na caxella ([[Special:Captcha/help|más información]]):",
        'captcha-sendemail-fail' => 'Códigu de confirmación incorreutu o ausente.',
        'captcha-disabledinapi' => 'Esta aición requier un captcha y, poro, nun pue facese pel API',
        'captchahelp-title' => 'Ayuda tocante al CAPTCHA',
@@ -451,7 +451,7 @@ $messages['be'] = array(
   #</pre> <!-- радок абавязкова пакінуць як ёсць (у т.л., з прагалам у пачатку) -->',
 );
 
-/** Belarusian (Taraškievica orthography) (‪беларуская (тарашкевіца)‬)
+/** Belarusian (Taraškievica orthography) (беларуская (тарашкевіца)‎)
  * @author EugeneZelenko
  * @author Jim-by
  * @author Red Winged Duck
@@ -462,12 +462,12 @@ $messages['be-tarask'] = array(
        'captcha-desc' => 'Дадае мэтад CAPTCHA для абароны супраць спаму і падбору пароляў',
        'captcha-label' => 'CAPTCHA',
        'captcha-addurl' => 'Вашае рэдагаваньне ўтрымлівае новыя вонкавыя спасылкі.
-У мэтах абароны ад аўтаматычнага спаму, калі ласка, знайдзіце простую суму і ўвядзіце адказ у поле ([[Special:Captcha/help|падрабязнасьці]]):',
-       'captcha-badlogin' => 'У мэтах абароны ад аўтаматычнага ўзлому пароляў, калі ласка, знайдзіце простую суму і ўвядзіце адказ у поле ([[Special:Captcha/help|дадатковая інфармацыя]]):',
-       'captcha-createaccount' => 'У мэтах абароны ад аўтаматычнага стварэньня рахункаў, калі ласка, знайдзіце простую суму і ўвядзіце адказ у поле ([[Special:Captcha/help|дадатковая інфармацыя]]):',
+У мэтах абароны ад аўтаматычнага спаму, калі ласка, рашыце простае раўнаньне і ўвядзіце вынік у поле, каб захаваць зьмены ([[Special:Captcha/help|падрабязнасьці]]):',
+       'captcha-badlogin' => 'У мэтах абароны ад аўтаматычнага ўзлому пароляў, калі ласка, рашыце простае раўнаньне і ўвядзіце вынік у поле ([[Special:Captcha/help|дадатковая інфармацыя]]):',
+       'captcha-createaccount' => 'У мэтах абароны ад аўтаматычнага стварэньня рахункаў, калі ласка, рашыце простае раўнаньне і ўвядзіце вынік у поле ([[Special:Captcha/help|дадатковая інфармацыя]]):',
        'captcha-createaccount-fail' => 'Код пацьверджаньня — няслушны альбо адсутнічае.',
        'captcha-create' => 'Каб стварыць старонку, калі ласка, знайдзіце простую суму і ўвядзіце адказ у поле ([[Special:Captcha/help|падрабязнасьці]]):',
-       'captcha-sendemail' => 'У мэтах абароны супраць аўтаматычнага спаму, калі ласка, знайдзіце простую суму і ўвядзіце вынік у полі ніжэй ([[Special:Captcha/help|дадатковая інфармацыя]]):',
+       'captcha-sendemail' => 'У мэтах абароны супраць аўтаматычнага спаму, калі ласка, рашыце простае раўнаньне і ўвядзіце вынік у полі ніжэй ([[Special:Captcha/help|дадатковая інфармацыя]]):',
        'captcha-sendemail-fail' => 'Код пацьверджаньня — няслушны альбо адсутнічае.',
        'captcha-disabledinapi' => 'Гэтае дзеяньне патрабуе праверкі captcha, і з-за гэтага ня можа быць выкананае праз API.',
        'captchahelp-title' => 'Дапамога ў captcha',
@@ -695,12 +695,12 @@ $messages['cs'] = array(
        'captcha-desc' => 'Poskytuje techniky CAPTCHA pro ochranu před spamem a hádáním hesel',
        'captcha-label' => 'CAPTCHA',
        'captcha-addurl' => 'Vaše editace obsahuje nové externí odkazy.
-V zájmu ochrany před automatickým spamováním vyřešte následující jednoduchý součet a napište výsledek. ([[Special:Captcha/help|Co tohle znamená?]])',
-       'captcha-badlogin' => 'V zájmu ochrany proti automatickým pokusům uhodnout heslo musíte vyřešit následující jednoduchý součet a napsat výsledek. ([[Special:Captcha/help|Co tohle znamená?]]):',
-       'captcha-createaccount' => 'V rámci ochrany před automatickým vytvářením účtů musíte pro provedení registrace vyřešit následující jednoduchý součet a napsat výsledek. ([[Special:Captcha/help|Co tohle znamená?]])',
+V zájmu ochrany této wiki před automatickým spamováním vás prosíme o vyřešení následujícího jednoduchého součtu a napsání výsledku, abychom mohli vaši editaci uložit. ([[Special:Captcha/help|Co tohle znamená?]])',
+       'captcha-badlogin' => 'V zájmu ochrany této wiki proti automatickým pokusům uhodnout heslo vás prosíme o vyřešení následujícího jednoduchého součtu a napsání výsledku. ([[Special:Captcha/help|Co tohle znamená?]])',
+       'captcha-createaccount' => 'V zájmu ochrany této wiki před automatickým vytvářením účtů vás prosíme o vyřešení následujícího jednoduchého součtu a napsání výsledku. ([[Special:Captcha/help|Co tohle znamená?]])',
        'captcha-createaccount-fail' => 'Chybějící či neplatný potvrzovací kód.',
        'captcha-create' => 'Abyste mohli založit stránku, musíte vyřešit následující jednoduchý součet a napsat výsledek. ([[Special:Captcha/help|Co tohle znamená?]])',
-       'captcha-sendemail' => 'V rámci ochrany proti automatickému spamování musíte vyřešit jednoduchý součet a napsat výsledek ([[Special:Captcha/help|více informací]]):',
+       'captcha-sendemail' => 'V zájmu ochrany této wiki před automatickým spamováním vás prosíme o vyřešení následujícího jednoduchého součtu a napsání výsledku. ([[Special:Captcha/help|Co tohle znamená?]])',
        'captcha-sendemail-fail' => 'Chybějící či neplatný potvrzovací kód.',
        'captcha-disabledinapi' => 'Tato operace vyžaduje splnění CAPTCHA, takže ji nelze provést prostřednictvím API.',
        'captchahelp-title' => 'Nápověda ke captcha',
@@ -806,12 +806,12 @@ $messages['de'] = array(
        'captcha-desc' => 'Ermöglicht verschiedene CAPTCHA-Techniken zum Schutz vor Spam und dem Erraten von Passwörtern',
        'captcha-label' => 'CAPTCHA',
        'captcha-addurl' => 'Deine Bearbeitung enthält neue externe Links.
-Zum Schutz vor automatisiertem Spamming löse die nachfolgende Rechenaufgabe und trage das Ergebnis in das Feld unten ein. Klicke dann erneut auf „Seite speichern“ [[Special:Captcha/help|(Fragen oder Probleme?)]].',
-       'captcha-badlogin' => 'Zum Schutz vor einer Kompromittierung deines Benutzerkontos löse die nachfolgende Rechenaufgabe und trage das Ergebnis in das Feld unten ein [[Special:Captcha/help|(Fragen oder Probleme?)]]:',
-       'captcha-createaccount' => 'Zum Schutz vor automatisierter Anlage von Benutzerkonten löse die nachfolgende Rechenaufgabe und trage das Ergebnis in das Feld unten ein [[Special:Captcha/help|(Fragen oder Probleme?)]].',
+Um das Wiki vor automatisiertem Spam zu schützen, bitten wir dich die untenstehende einfache Rechenaufgabe zu lösen und deine Antwort in das Feld einzugeben, damit deine Bearbeitung gespeichert werden kann ([[Special:Captcha/help|mehr Informationen …]]):',
+       'captcha-badlogin' => 'Um das Wiki vor der automatisierten Kompromittierung der Benutzerkonten zu schützen, bitten wir dich die untenstehende einfache Rechenaufgabe zu lösen und deine Antwort in das Feld einzugeben ([[Special:Captcha/help|mehr Informationen …]]):',
+       'captcha-createaccount' => 'Um das Wiki vor der automatisierten Erstellung von Benutzerkonten zu schützen, bitten wir dich die untenstehende einfache Rechenaufgabe zu lösen und deine Antwort in das Feld einzugeben ([[Special:Captcha/help|mehr Informationen …]]):',
        'captcha-createaccount-fail' => 'Falscher oder fehlender Bestätigungscode.',
        'captcha-create' => 'Zur Erstellung der Seite löse die nachfolgende Rechenaufgabe und trage das Ergebnis in das Feld unten ein [[Special:Captcha/help|(Fragen oder Probleme?)]].',
-       'captcha-sendemail' => 'Um gegen automatischen Spam vorzugehen, löse bitte die einfache Rechenaufgabe und gib die Antwort unten in das Feld ein ([[Special:Captcha/help|mehr Informationen]]):',
+       'captcha-sendemail' => 'Um das Wiki vor automatisiertem Spam zu schützen, bitten wir dich die untenstehende einfache Rechenaufgabe zu lösen und deine Antwort in das Feld einzugeben ([[Special:Captcha/help|mehr Informationen …]]):',
        'captcha-sendemail-fail' => 'Falscher oder fehlender Bestätigungscode.',
        'captcha-disabledinapi' => 'Diese Aktion benötigt ein CAPTCHA. Sie kann nicht über die API ausgeführt werden.',
        'captchahelp-title' => 'CAPTCHA-Hilfe',
@@ -834,20 +834,20 @@ Der „Zurück“-Knopf des Browsers führt zurück zum Bearbeitungsfenster.',
        'right-skipcaptcha' => 'Überspringen der CAPTCHA-Eingabe',
 );
 
-/** German (formal address) (‪Deutsch (Sie-Form)‬)
+/** German (formal address) (Deutsch (Sie-Form)‎)
  * @author Imre
+ * @author Kghbln
  * @author Raimond Spekking
  * @author The Evil IP address
  */
 $messages['de-formal'] = array(
        'captcha-edit' => 'Zur Bearbeitung der Seite lösen Sie die nachfolgende Rechenaufgabe und tragen Sie das Ergebnis in das Feld unten ein [[Special:Captcha/help|(Fragen oder Probleme?)]].',
        'captcha-addurl' => 'Ihre Bearbeitung enthält neue externe Links.
-Zum Schutz vor automatisiertem Spamming lösen Sie die nachfolgende Rechenaufgabe und tragen Sie das Ergebnis in das Feld unten ein.
-Klicken Sie dann erneut auf „Seite speichern“ [[Special:Captcha/help|(Fragen oder Probleme?)]].',
-       'captcha-badlogin' => 'Zum Schutz vor einer Kompromittierung Ihres Benutzerkontos lösen Sie die nachfolgende Rechenaufgabe und tragen Sie das Ergebnis in das Feld unten ein [[Special:Captcha/help|(Fragen oder Probleme?)]]:',
-       'captcha-createaccount' => 'Zum Schutz vor automatisierter Anlage von Benutzerkonten lösen Sie die nachfolgende Rechenaufgabe und tragen Sie das Ergebnis in das Feld unten ein [[Special:Captcha/help|(Fragen oder Probleme?)]].',
+Um das Wiki vor automatisiertem Spam zu schützen, bitten wir Sie die untenstehende einfache Rechenaufgabe zu lösen und Ihre Antwort in das Feld einzugeben, damit Ihre Bearbeitung gespeichert werden kann ([[Special:Captcha/help|mehr Informationen …]]):',
+       'captcha-badlogin' => 'Um das Wiki vor der automatisierten Kompromittierung der Benutzerkonten zu schützen, bitten wir Sie die untenstehende einfache Rechenaufgabe zu lösen und Ihre Antwort in das Feld einzugeben ([[Special:Captcha/help|mehr Informationen …]]):',
+       'captcha-createaccount' => 'Um das Wiki vor der automatisierten Erstellung von Benutzerkonten zu schützen, bitten wir Sie die untenstehende einfache Rechenaufgabe zu lösen und Ihre Antwort in das Feld einzugeben ([[Special:Captcha/help|mehr Informationen …]]):',
        'captcha-create' => 'Zur Erstellung der Seite lösen Sie die nachfolgende Rechenaufgabe und tragen Sie das Ergebnis in das Feld unten ein [[Special:Captcha/help|(Fragen oder Probleme?)]].',
-       'captcha-sendemail' => 'Um gegen automatischen Spam vorzugehen, lösen Sie bitte die einfache Rechenaufgabe und geben Sie die Antwort unten in das Feld ein ([[Special:Captcha/help|mehr Informationen]]):',
+       'captcha-sendemail' => 'Um das Wiki vor automatisiertem Spam zu schützen, bitten wir Sie die untenstehende einfache Rechenaufgabe zu lösen und Ihre Antwort in das Feld einzugeben ([[Special:Captcha/help|mehr Informationen …]]):',
        'captchahelp-text' => 'Internetangebote, die für Beiträge von praktisch jedem offen sind — so wie dieses Wiki — werden oft von Spammern missbraucht, die ihre Links automatisch auf vielen Webseiten platzieren. Diese Spam-Links können wieder entfernt werden, sie sind aber ein erhebliches Ärgernis.
 
 In manchen Fällen, insbesondere beim Hinzufügen von neuen Weblinks zu einer Seite, kann es vorkommen, dass dieses Wiki ein Bild mit einem farbigen und verzerrten Text anzeigt und dazu auffordert, die angezeigten Wörter einzutippen.
@@ -869,14 +869,16 @@ $messages['diq'] = array(
        'captcha-edit' => 'Qe ena pel vurnayîşî, ma rica keno cewabê problemî qutiyê ke cor de zerre ey ra binuse ([[Special:Captcha/help|enformasyonê bînî]]):',
        'captcha-desc' => 'Rehat CAPTCHA teknoloci u  dezgina parola-ezayan',
        'captcha-label' => 'CAPTCHA',
-       'captcha-addurl' => 'Vurnayîşanê tu de linkanê harîcîyê newe esto.
-Qe otomatik spamî ra pawitîş, ma rica keno cewabê problemî qutiyê ke cor de zerre ey ra binuse ([[Special:Captcha/help|enformasyonê bînî]]):',
-       'captcha-badlogin' => 'Qe otomatik parola crack kerdişî ra pawitîş, ma rica keno cewabê problemî qutiyê ke cor de zerre ey ra binuse ([[Special:Captcha/help|enformasyonê bînî]]):',
-       'captcha-createaccount' => 'Qe otomatik hesab viraştişî ra pawitîş, ma rica keno cewabê problemî qutiyê ke cor de zerre ey ra binuse ([[Special:Captcha/help|enformasyonê bînî]]):',
+       'captcha-addurl' => 'Vurnayışa şıma gray teberiya newi muhtewa kena.
+Otomatik spamî ra pawitîş, ma rica keno cewabê problemî qutiyê ke cor de zerre ey ra binuse ([[Special:Captcha/help|malumato detayın]]):',
+       'captcha-badlogin' => 'Otomatik spam ra pawıtışi, ma rica keno cewabê problemî qutiyê ke cor de zerre ey ra binuse 
+([[Special:Captcha/help|malumato detayın]]):',
+       'captcha-createaccount' => 'Otomatik spam ra pawıtışi, ma rica keno cewabê problemî qutiyê ke cor de zerre ey ra binuse 
+([[Special:Captcha/help|malumato detayın]]):',
        'captcha-createaccount-fail' => 'Kodê testiqî vin biyo ya zi raşt niyo.',
        'captcha-create' => 'Qe pel viraştîşî, ma rica keno cewabê problemî qutiyê ke cor de zerre ey ra binuse ([[Special:Captcha/help|enformasyonê bînî]]):',
-       'captcha-sendemail' => 'Qe otomatik spam ra pawitîşi, ma rica keno cewabê problemî qutiyê ke cor de zerre ey ra binuse 
-([[Special:Captcha/help|enformasyonê bînî]]):',
+       'captcha-sendemail' => 'Otomatik spam ra pawıtışi, ma rica keno cewabê problemî qutiyê ke cor de zerre ey ra binuse 
+([[Special:Captcha/help|malumato detayın]]):',
        'captcha-sendemail-fail' => 'Kodê testiqî vin biyo ya zi raşt niyo.',
        'captcha-disabledinapi' => 'Ena hereket de captcha lazim o, aye ra ser API ra ena hereket nibena.',
        'captchahelp-title' => 'Yardimê captchayî',
@@ -908,12 +910,12 @@ $messages['dsb'] = array(
        'captcha-desc' => 'Staja techniki CAPTCHA za šćit pśeśiwo spamoju a wugódanjoju gronidłow k dispoziciji',
        'captcha-label' => 'CAPTCHA',
        'captcha-addurl' => 'Twója změna wopśimujo nowe eksterne wótkaze.
-Za šćit pśeśiwo zawtomatizěrowanemu spamoju, rozwěž pšosym slědujucy jadnory liceński nadawk a zapódaj wuslědk do kašćika ([[Special:Captcha/help|dalšne info]]):',
-       'captcha-badlogin' => 'Za šćit pśeśiwo zawtomatizěrowanemu wuzgónjowanjeju gronidła, rozwěž pšosym slědujucy jadnory liceński nadawk a zapódaj wuslědk do kašćika ([[Special:Captcha/help|dalšne info]]):',
-       'captcha-createaccount' => 'Za šćit pśeśiwo zawtomatizěrowanemu załoženjeju kontow, rozwěž pšosym slědujucy jadnory liceński nadawk a zapódaj wuslědk do kašćika ([[Special:Captcha/help|dalšne info]]):',
+Za šćit pśeśiwo zawtomatizěrowanemu spamoju, pšosymy śi slědujucy jadnory liceński nadawk rozwězaś a zapódaj wuslědk do kašćika, aby swóju změnu składował ([[Special:Captcha/help|dalšne info]]):',
+       'captcha-badlogin' => 'Aby wiki pśeśiwo zawtomatizěrowanemu wuzgónjowanjeju gronidła šćitał, pšosymy śi slědujucy jadnory liceński nadawk rozwězaś a zapódaj wuslědk do kašćika ([[Special:Captcha/help|dalšne info]]):',
+       'captcha-createaccount' => 'Aby wiki pśeśiwo zawtomatizěrowanemu załoženjeju kontow šćitał, pšosymy śi slědujucy jadnory liceński nadawk rozwězaś a zapódaj wuslědk do kašćika ([[Special:Captcha/help|dalšne info]]):',
        'captcha-createaccount-fail' => 'Wopacny abo felujucy wobkšuśeński kod.',
        'captcha-create' => 'Aby napórał bok, rozwěž pšosym slědujucy jadnory liceński nadawk a zapódaj wuslědk do kašćika ([[Special:Captcha/help|dalšne info]]):',
-       'captcha-sendemail' => 'Za šćit pśeśiwo awtomatiskemu spamowanjeju, rozwěž pšosym jadnory liceński nadawk a zapódaj wótegrono do kašćika ([[Special:Captcha/help|dalšne informacije]]):',
+       'captcha-sendemail' => 'Aby wiki pśeśiwo awtomatiskemu spamowanjeju šćitał, pšosymy śi jadnory liceński nadawk rozwězaś a zapódaj wótegrono do kašćika ([[Special:Captcha/help|dalšne informacije]]):',
        'captcha-sendemail-fail' => 'Wopacny abo felujucy wobkšuśeński kod.',
        'captcha-disabledinapi' => 'Toś ta akcija pomina se captcha, togodla njedajo se pśez API wuwjasć.',
        'captchahelp-title' => 'Pomoc wó captcha',
@@ -1077,12 +1079,12 @@ $messages['es'] = array(
        'captcha-desc' => 'Provee técnicas CAPTCHA para proteger contra spam y adivinación de contraseña.',
        'captcha-label' => 'CAPTCHA',
        'captcha-addurl' => 'Tu edición incluye nuevos enlaces externos.
-Para ayudar a proteger contra el spam automatizado, por favor resuelve la sencilla suma de abajo e introduce la respuesta en la caja ([[Special:Captcha/help|más información]]):',
-       'captcha-badlogin' => 'Para ayudar a protegernos de la creación automática de cuentas, por favor resuelve la simple suma de abajo e introduce la respuesta en la caja ([[Special:Captcha/help|más información]]):',
-       'captcha-createaccount' => 'Para ayudar a protegernos de la creación automática de cuentas, por favor resuelve la simple suma de abajo e introduce la respuesta en la caja ([[Special:Captcha/help|más información]]):',
+Para proteger el wiki contra el spam automatizado, por favor resuelve la sencilla suma de abajo e introduce la respuesta en la caja  para guardar tu edición ([[Special:Captcha/help|más información]]):',
+       'captcha-badlogin' => 'Para proteger el wiki del descifrado de contraseñas automatizado, por favor resuelve la simple suma de abajo e introduce la respuesta en la caja ([[Special:Captcha/help|más información]]):',
+       'captcha-createaccount' => 'Para proteger el wiki de la creación automática de cuentas, resuelve por favor la simple suma de abajo e introduce la respuesta en la caja ([[Special:Captcha/help|más información]]):',
        'captcha-createaccount-fail' => 'Falta el código de confirmación, o éste es incorrecto.',
        'captcha-create' => 'Para crear la página, por favor resuelve la simple suma de abajo e introduce la respuesta en la caja ([[Special:Captcha/help|más información]]):',
-       'captcha-sendemail' => 'Para protegernos contra el spam automatizado, por favor resuelva la suma simple que se presenta a continuación e ingrese la respuesta en el cuadro de texto ([[Special:Captcha/help|más información]]):',
+       'captcha-sendemail' => 'Para proteger el wiki contra el spam automatizado, por favor resuelve la simple suma que se presenta a continuación e introduce la respuesta en el cuadro de texto ([[Special:Captcha/help|más información]]):',
        'captcha-sendemail-fail' => 'El código de confirmación falta o es incorrecto.',
        'captcha-disabledinapi' => 'Esta acción requiere un captcha, así que no puede ser ejecutada a través de un API.',
        'captchahelp-title' => 'Ayuda sobre el captcha',
@@ -1113,13 +1115,13 @@ $messages['et'] = array(
        'captcha-edit' => 'Selle lehekülje muutmiseks lahenda palun lihtne tehe ja sisesta vastus kasti ([[Special:Captcha/help|lisateave]]).',
        'captcha-desc' => 'Pakub robotilõksu abil kaitset rämpspostituste ja paroolide äraarvamise vastu.',
        'captcha-addurl' => 'Sinu muudatus sisaldab uusi välislinke.
-Palun lahenda allpool lihtne tehe ja sisesta vastus kasti. Abinõu on kaitseks automaadistatud rämpsmuudatuste eest ([[Special:Captcha/help|lisateave]]):',
-       'captcha-badlogin' => 'Palun lahenda allpool lihtne tehe ja sisesta vastus kasti. Abinõu on kaitseks automaatsete parooliäraarvajate eest ([[Special:Captcha/help|lisateave]]):',
-       'captcha-createaccount' => 'Palun lahenda lihtne tehe ja sisesta vastus kasti. Abinõu on kaitseks kontode automaatse loomise eest ([[Special:Captcha/help|lisateave]]):',
+Palun lahenda allpool lihtne tehe ja sisesta vastus kasti, et saaksid muudatuse salvestada. Abinõu on viki kaitseks automaadistatud rämpsmuudatuste eest ([[Special:Captcha/help|lisateave]]):',
+       'captcha-badlogin' => 'Palun lahenda allpool lihtne tehe ja sisesta vastus kasti. Abinõu on viki kaitseks automaatsete parooliäraarvajate eest ([[Special:Captcha/help|lisateave]]):',
+       'captcha-createaccount' => 'Palun lahenda lihtne tehe ja sisesta vastus kasti. Abinõu on viki kaitseks kontode automaatse loomise eest ([[Special:Captcha/help|lisateave]]):',
        'captcha-createaccount-fail' => 'Puuduv või valesti sisestatud kinnituskood.',
        'captcha-create' => 'Lehekülje loomiseks lahenda palun lihtne tehe ja sisesta vastus kasti
 ([[Special:Captcha/help|lisateave]]):',
-       'captcha-sendemail' => 'Palun lahenda allpool lihtne tehe ja sisesta vastus kasti. Abinõu on kaitseks automaadistatud rämpsmuudatuste vastu ([[Special:Captcha/help|lisateave]]):',
+       'captcha-sendemail' => 'Palun lahenda allpool lihtne tehe ja sisesta vastus kasti. Abinõu on viki kaitseks automaadistatud rämpsmuudatuste eest ([[Special:Captcha/help|lisateave]]):',
        'captcha-sendemail-fail' => 'Vigane või puuduv kinnituskood.',
        'captcha-disabledinapi' => 'Ühes selle toiminguga tuleb läbida robotilõks ja seetõttu ei saa seda API kaudu sooritada.',
        'captchahelp-title' => 'Mis on robotilõks?',
@@ -1269,6 +1271,7 @@ $messages['fo'] = array(
  * @author PieRRoMaN
  * @author Seb35
  * @author Sherbrooke
+ * @author Tititou36
  * @author Urhixidur
  * @author Verdy p
  * @author Wyz
@@ -1280,7 +1283,7 @@ $messages['fr'] = array(
        'captcha-label' => 'CAPTCHA',
        'captcha-addurl' => 'Votre modification inclut de nouveaux liens externes.
 Pour nous aider dans la protection contre le pourriel automatisé, veuillez calculer l’opération simple ci-dessous et en inscrire le résultat dans le champ ([[Special:Captcha/help|plus d’informations]]) :',
-       'captcha-badlogin' => 'Afin de nous aider à prévenir le cassage des mots de passe par des automates, veuillez calculer l’opération simple ci-dessous et en inscrire le résultat dans le champ ([[Special:Captcha/help|plus d’informations]]) :',
+       'captcha-badlogin' => 'Afin de nous aider à prévenir le cassage automatisé des mots de passe, veuillez calculer l’opération simple ci-dessous et en inscrire le résultat dans le champ ([[Special:Captcha/help|plus d’informations]]) :',
        'captcha-createaccount' => 'Afin de nous aider à lutter contre les créations automatiques de comptes, veuillez calculer l’opération simple ci-dessous et en inscrire le résultat dans le champ ([[Special:Captcha/help|plus d’informations]]) :',
        'captcha-createaccount-fail' => 'Code de confirmation erroné ou manquant.',
        'captcha-create' => 'Pour créer la page, veuillez calculer l’opération simple ci-dessous et en inscrire le résultat dans le champ ([[Special:Captcha/help|plus d’informations]]) :',
@@ -1401,7 +1404,7 @@ Para contribuír na protección contra as ferramentas de publicación automátic
        'captcha-createaccount' => 'Para contribuír contra a creación automatizada de contas, resolva a suma que aparece a continuación e introduza a resposta na caixa ([[Special:Captcha/help|máis información]]):',
        'captcha-createaccount-fail' => 'Falta o código de confirmación ou é incorrecto.',
        'captcha-create' => 'Para crear a páxina, resolva a suma que aparece a continuación e introduza a resposta na caixa ([[Special:Captcha/help|máis información]]):',
-       'captcha-sendemail' => 'Para contribuír na protección contra o spam automatizado, resolva a suma que aparece a continuación e introduza a resposta na caixa ([[Special:Captcha/help|máis información]]):',
+       'captcha-sendemail' => 'Para contribuír na protección contra as ferramentas de publicación automática de ligazóns publicitarias, resolva a suma que aparece a continuación e introduza a resposta na caixa ([[Special:Captcha/help|máis información]]):',
        'captcha-sendemail-fail' => 'Falta o código de confirmación ou é incorrecto.',
        'captcha-disabledinapi' => 'Esta acción necesita o captcha, polo que non se pode realizar a través da API.',
        'captchahelp-title' => 'Axuda acerca do captcha',
@@ -1442,13 +1445,12 @@ $messages['gsw'] = array(
        'captcha-desc' => 'Stellt CAPTCHA-Tächnike zum Schutz vor Spam un em Rote vu Passwerter z Verfiegig',
        'captcha-label' => 'CAPTCHA',
        'captcha-addurl' => 'In Dyynere Bearbeitig het s neiji externi Link.
-Zum Schutz vor automatisiertem Spamming lees die Rächenufgab un trag s Ergebnis in s Fäld unten yy. Druck drno nomol uf „Syte spychere“. [[Special:Captcha/help|(Frogen oder Probläm?)]]',
-       'captcha-badlogin' => 'Zum Schutz vor ere Kompromittierig vu Dyynem Benutzerkonto lees die Rächenufgab un trag s Ergebnis in s Fäld unten yy [[Special:Captcha/help|(Frogen oder Probläm?)]]:',
-       'captcha-createaccount' => 'Zum Schutz vor automatisiertem Aalege vu Benutzerkonte lees die Rächenufgab un trag s Ergebnis in s Fäld unten yy. [[Special:Captcha/help|(Frogen oder Probläm?)]]',
+Zum Schutz vor automatisiertem Spamming lees die Rächenufgab un trag s Ergebnis in s Fäld unten yy. Druck drno nomol uf „Syte spychere“. ([[Special:Captcha/help|meh Informatione …]]):',
+       'captcha-badlogin' => 'Zum Schutz vor ere Kompromittierig vu Dyynem Benutzerkonto lees die Rächenufgab un trag s Ergebnis in s Fäld unten yy ([[Special:Captcha/help|meh Informatione]]):',
+       'captcha-createaccount' => 'Zum Schutz vor automatisiertem Aalege vu Benutzerkonte lees die Rächenufgab un trag s Ergebnis in s Fäld unten yy. ([[Special:Captcha/help|meh Informatione]]):',
        'captcha-createaccount-fail' => 'Bestätigungscode isch falsch oder fählt.',
        'captcha-create' => 'Zum d Syten aalege lees die Rächenufgab un trag s Ergebnis in s Fäld unten yy. [[Special:Captcha/help|(Frogen oder Probläm?)]]',
-       'captcha-sendemail' => '
-As Schutz gege e automatischs Spamming,  lees die Rächenufgab un trag s Ergebnis in s Fäld unten yy ([[Special:Captcha/help|meh Informatione]]):',
+       'captcha-sendemail' => 'As Schutz gege e automatischs Spamming, lees die Rächenufgab un trag s Ergebnis in s Fäld unten yy ([[Special:Captcha/help|meh Informatione]]):',
        'captcha-sendemail-fail' => 'Bestätigungscode isch falsch oder fählt.',
        'captcha-disabledinapi' => 'Die Aktion brucht e Captcha. Si cha nit iber d API uusgfiert wäre.',
        'captchahelp-title' => 'Captcha-Hilf',
@@ -1516,9 +1518,10 @@ $messages['he'] = array(
        'captcha-edit' => 'כדי לערוך את הדף, אנא פתרו את תרגיל החיבור הפשוט שלהלן והקלידו את התשובה בתיבה ([[Special:Captcha/help|מידע נוסף]]):',
        'captcha-desc' => 'מתן טכניקות CAPTCHA להגנה נגד זיבול וניחוש ססמאות',
        'captcha-label' => 'CAPTCHA',
-       'captcha-addurl' => 'עריכתכם כוללת קישורים חיצוניים חדשים. כהגנה מפני ספאם אוטומטי, אנא פתרו את תרגיל החיבור הפשוט שלהלן והקלידו את התשובה בתיבה ([[Special:Captcha/help|מידע נוסף]]):',
-       'captcha-badlogin' => 'כהגנה מפני פריצת סיסמאות אוטומטית, אנא פתרו את תרגיל החיבור הפשוט שלהלן והקלידו את התשובה בתיבה ([[Special:Captcha/help|מידע נוסף]]):',
-       'captcha-createaccount' => 'כהגנה מפני יצירת חשבונות אוטומטית, אנא פתרו את תרגיל החיבור הפשוט שלהלן והקלידו את התשובה בתיבה ([[Special:Captcha/help|מידע נוסף]]):',
+       'captcha-addurl' => 'עריכתכם כוללת קישורים חיצוניים חדשים.
+לשם הגנה מפני ספאם אוטומטי, אנא פתרו את תרגיל החיבור הפשוט שלהלן והקלידו את התשובה בתיבה כדי לשמור את עריכתכם ([[Special:Captcha/help|מידע נוסף]]):',
+       'captcha-badlogin' => 'לשם הגנה מפני פריצת סיסמאות אוטומטית, אנא פתרו את תרגיל החיבור הפשוט שלהלן והקלידו את התשובה בתיבה ([[Special:Captcha/help|מידע נוסף]]):',
+       'captcha-createaccount' => 'לשם הגנה מפני יצירת חשבונות אוטומטית, אנא פתרו את תרגיל החיבור הפשוט שלהלן והקלידו את התשובה בתיבה ([[Special:Captcha/help|מידע נוסף]]):',
        'captcha-createaccount-fail' => 'לא הקלדתם קוד אישור, או שהוא שגוי.',
        'captcha-create' => 'כדי ליצור את הדף, אנא פתרו את תרגיל החיבור הפשוט שלהלן והקלידו את התשובה בתיבה ([[Special:Captcha/help|מידע נוסף]]):',
        'captcha-sendemail' => 'כדי לעזור להילחם במציפי זבל אוטומטיים, עליך לחשב את הסכום הפשוט שלהלן ולהזין את התוצאה בתיבה ([[Special:Captcha/help|מידע נוסף]]):',
@@ -1590,6 +1593,7 @@ $messages['hi'] = array(
  * @author Dnik
  * @author Ex13
  * @author Herr Mlinka
+ * @author Roberta F.
  * @author SpeedyGonsales
  */
 $messages['hr'] = array(
@@ -1617,9 +1621,9 @@ Molimo obratite se [[{{MediaWiki:Grouppage-sysop}}|administratorima]] za pomoć,
 
 Pritisnite u svom pregledniku 'nazad' kako bi se vratili na uređivač stranice.",
        'captcha-addurl-whitelist' => ' #<!-- leave this line exactly as it is --> <pre>
-# Rabi se slijedeća sintaksa:
+# Rabi se sljedeća sintaksa:
 #   * Sve od "#" znaka do kraja linije je komentar
-#   * Svaki neprazni redak je regularni izraz (regex) koji odgovara poslužitelju unutar URL-a
+#   * Svaki je neprazni redak regularni izraz (regex) koji odgovara poslužitelju unutar URL-a
   #</pre> <!-- leave this line exactly as it is -->',
        'right-skipcaptcha' => 'Izvođenje akcija koje pokreću captcha bez prolaženja kroz captcha sustav',
 );
@@ -1631,12 +1635,12 @@ $messages['hsb'] = array(
        'captcha-edit' => 'Zo by stronu wobdźěłał, rozrisaj prošu slědowacy ličenski nadawk a zapodaj wuslědk do kašćika ([[Special:Captcha/help|Dalše informacije]]):',
        'captcha-desc' => 'Staja CAPTCHA-techniki za škit přećiwo spamej a zhódowanju hesłow k dispoziciji',
        'captcha-label' => 'CAPTCHA',
-       'captcha-addurl' => 'W twojej změnje su nowe eksterne wotkazy. Jako škitna naprawa přećiwo awtomatizowanemu spamej dyrbiš slědowacy nadawk wuličić a wuslědk do kašćika [[Special:Captcha/help|(dalše informacije)]] zapisować.',
-       'captcha-badlogin' => 'Zo by so awtomatiskemu zadobywanju do hesłow zadźěwało, dyrbiš slědowacy nadawk wuličeć a wuslědk do kašćika zapisować. ([[Special:Captcha/help|dalše informacije]])',
-       'captcha-createaccount' => 'Jako škitna naprawa přećiwo awtomatiskemu wutworjenju wužiwarskich kontow dyrbiš slědowacy nadawk wuličeć a wuslědk do kašćika zapisować  ([[Special:Captcha/help|dalše informacije]]):',
+       'captcha-addurl' => 'W twojej změnje su nowe eksterne wotkazy. Zo by wiki přećiwo awtomatizowanemu spamej škitał, prosymy će slědowacy nadawk wuličić a wuslědk do kašćika zapisować, zo by so twoja změna składowała ([[Special:Captcha/help|dalše informacije]]).',
+       'captcha-badlogin' => 'Zo by wiki přećiwo  awtomatiskemu zadobywanju do hesłow škitał, prosymy će slědowacy nadawk wuličeć a wuslědk do kašćika zapisować ([[Special:Captcha/help|dalše informacije]]):',
+       'captcha-createaccount' => 'Zo by wiki přećiwo awtomatiskemu wutworjenju wužiwarskich kontow škitał, prosymy će slědowacy nadawk nadawk rozrisać a wuslědk do kašćika zapisować  ([[Special:Captcha/help|dalše informacije]]):',
        'captcha-createaccount-fail' => 'Wopačny abo pobrachowacy wobkrućenski kod.',
        'captcha-create' => 'Zo by stronu wutworił, rozrisaj prošu slědowacy ličenski nadawk a zapodaj wuslědk do kašćika ([[Special:Captcha/help|Dalše informacije]]):',
-       'captcha-sendemail' => 'Za škit přećiwo awtomatiskemu spamowanju, rozrisaj prošu jednory ličenski nadawk a zapodaj wotmołwu do kašćika ([[Special:Captcha/help|dalše informacije]]):',
+       'captcha-sendemail' => 'Za škit přećiwo awtomatiskemu spamowanju, rozrisaj prošu slědowacy jednory ličenski nadawk a zapodaj wotmołwu do kašćika ([[Special:Captcha/help|dalše informacije]]):',
        'captcha-sendemail-fail' => 'Wopačny abo falowacy wobkrućenski kod.',
        'captcha-disabledinapi' => 'Tuta akcija wužaduje sej captcha, tohodla njeda so přez API wuwjesć.',
        'captchahelp-title' => 'Pomoc za CAPTCHA',
@@ -1861,13 +1865,13 @@ $messages['it'] = array(
 ([[Special:Captcha/help|maggiori informazioni]]):',
        'captcha-desc' => "Fornisce tecniche CAPTCHA per la protezione contro lo spam e l'individuazione delle password",
        'captcha-label' => 'CAPTCHA',
-       'captcha-addurl' => "La modifica richiesta aggiunge dei nuovi collegamenti esterni alla pagina; come misura precauzionale contro l'inserimento automatico di spam, è necessario risolvere il semplice calcolo presentato di seguito e inserire il risultato nella casella ([[Special:Captcha/help|maggiori informazioni]]):",
-       'captcha-badlogin' => 'Come misura precauzionale contro i tentativi di forzatura automatica della password, è necessario risolvere il semplice calcolo presentato di seguito e inserire il risultato nella casella ([[Special:Captcha/help|maggiori informazioni]]):',
-       'captcha-createaccount' => 'Come misura precauzionale contro i tentativi di creazione automatica degli account, per registrarsi è necessario risolvere il semplice calcolo presentato di seguito e inserire il risultato nella casella ([[Special:Captcha/help|maggiori informazioni]]):',
+       'captcha-addurl' => "La modifica richiesta aggiunge dei nuovi collegamenti esterni alla pagina; come misura precauzionale contro l'inserimento automatico di spam, si prega di risolvere il semplice calcolo presentato di seguito e inserire il risultato nella casella ([[Special:Captcha/help|come funziona?]]):",
+       'captcha-badlogin' => 'Come misura precauzionale contro i tentativi di forzatura automatica della password, si prega di risolvere il semplice calcolo presentato di seguito e inserire il risultato nella casella ([[Special:Captcha/help|come funziona?]]):',
+       'captcha-createaccount' => 'Come misura precauzionale contro i tentativi di creazione automatica degli account, si prega di risolvere il semplice calcolo presentato di seguito e inserire il risultato nella casella ([[Special:Captcha/help|come funziona?]]):',
        'captcha-createaccount-fail' => 'Codice di verifica errato o mancante.',
        'captcha-create' => 'Per creare la pagina è necessario risolvere il semplice calcolo presentato di seguito e inserire il risultato nella casella:<br />
 ([[Special:Captcha/help|maggiori informazioni]]):',
-       'captcha-sendemail' => 'Come misura precauzionale nei confronti dei messaggi di spam automatici, è necessario risolvere il semplice calcolo presentato di seguito e inserire il risultato nella casella ([[Special:Captcha/help|maggiori informazioni]]):',
+       'captcha-sendemail' => 'Come misura precauzionale nei confronti dei messaggi di spam automatici, si prega di risolvere il semplice calcolo presentato di seguito e inserire il risultato nella casella ([[Special:Captcha/help|come funziona?]]):',
        'captcha-sendemail-fail' => 'Codice di verifica errato o mancante.',
        'captcha-disabledinapi' => 'Questa azione richiede un captcha, quindi non può essere eseguita tramite API.',
        'captchahelp-title' => "Cos'è il captcha?",
@@ -1896,18 +1900,19 @@ Fare clic sul pulsante 'back' del browser per tornare alla pagina di modifica.",
  * @author Whym
  */
 $messages['ja'] = array(
-       'captcha-edit' => 'ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\82\92ç·¨é\9b\86ã\81\99ã\82\8bã\81«ã\81¯ã\80\81ä¸\8bè¨\98ã\81®ç°¡å\8d\98ã\81ªæ\95°å¼\8fã\82\92è¨\88ç®\97ã\81\97ã\80\81æ¬\84ã\81«ç­\94ã\81\88ã\82\92å\85¥å\8a\9bã\81\97ã\81¦ã\81\8fã\81 ã\81\95ã\81\84([[Special:Captcha/help|ã\83\98ã\83«ã\83\97]])ï¼\9a',
-       'captcha-desc' => 'スパムやパスワード推定の攻撃を防ぐためのCAPTCHA技術を提供する',
+       'captcha-edit' => 'ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\82\92ç·¨é\9b\86ã\81\99ã\82\8bã\81«ã\81¯ã\80\81ä¸\8bè¨\98ã\81®ç°¡å\8d\98ã\81ªæ\95°å¼\8fã\82\92è¨\88ç®\97ã\81\97ã\81¦ã\81\9dã\81®ç­\94ã\81\88ã\82\92æ¬\84ã\81«å\85¥å\8a\9bã\81\97ã\81¦ã\81\8fã\81 ã\81\95ã\81\84([[Special:Captcha/help|ã\83\98ã\83«ã\83\97]]):',
+       'captcha-desc' => 'スパム攻撃やパスワード推定攻撃を防ぐための CAPTCHA 技術を提供する',
        'captcha-label' => 'CAPTCHA',
-       'captcha-addurl' => 'あなたの編集により新たに外部リンクが追加されようとしています。スパム防止のため、下記の簡単な数式を計算し、欄に答えを入力してください。([[Special:Captcha/help|ヘルプ]])',
-       'captcha-badlogin' => '自動化スクリプトによるパスワードクラック攻撃を防ぐため、下記の簡単な数式を計算し、欄に答えを入力してください。([[Special:Captcha/help|ヘルプ]])',
-       'captcha-createaccount' => 'アカウントの自動作成を防ぐため、下記の簡単な数式を計算し、欄に答えを入力してください。([[Special:Captcha/help|ヘルプ]])',
-       'captcha-createaccount-fail' => '確認コードの入力がないか、間違っています。',
-       'captcha-create' => 'ページを新規作成するには、下記の簡単な数式を計算し、欄に答えを入力してください。([[Special:Captcha/help|ヘルプ]])',
-       'captcha-sendemail' => 'ロボットによるスパムを防ぐため、下記の簡単な数式を計算し、欄に答えを入力してください ([[Special:Captcha/help|詳細]]):',
-       'captcha-sendemail-fail' => '確認コードが間違っているか入力されていません。',
-       'captcha-disabledinapi' => 'この操作はキャプチャを必要としているため、APIによって実行することができません。',
-       'captchahelp-title' => 'CAPTCHA(画像認証)ヘルプ',
+       'captcha-addurl' => 'あなたは新しい外部リンクを追加しようとしています。
+自動でのスパム攻撃を防ぐため、お手数ですが下記の簡単な数式を計算してその答えを欄に入力してください ([[Special:Captcha/help|ヘルプ]]):',
+       'captcha-badlogin' => '自動でのパスワードクラック攻撃からウィキを保護するため、お手数ですが下記の簡単な数式を計算してその答えを欄に入力してください ([[Special:Captcha/help|詳細]]):',
+       'captcha-createaccount' => 'アカウントの自動登録からウィキを保護するため、お手数ですが下記の簡単な数式を計算してその答えを欄に入力してください ([[Special:Captcha/help|ヘルプ]]):',
+       'captcha-createaccount-fail' => '確認コードが正しくない、または入力されていません。',
+       'captcha-create' => 'ページを新規作成するには、下記の簡単な数式を計算してその答えを欄に入力してください ([[Special:Captcha/help|ヘルプ]]):',
+       'captcha-sendemail' => '自動でのスパム攻撃からウィキを保護するため、お手数ですが下記の簡単な数式を計算してその答えを欄に入力してください ([[Special:Captcha/help|詳細]]):',
+       'captcha-sendemail-fail' => '確認コードが正しくない、または入力されていません。',
+       'captcha-disabledinapi' => 'この操作には CAPTCHA 認証が必要なため、API では実行できません。',
+       'captchahelp-title' => 'CAPTCHA (画像認証) ヘルプ',
        'captchahelp-cookies-needed' => 'ブラウザーの Cookie を有効にする必要があります。',
        'captchahelp-text' => '一般からの投稿を受け付けるこのウィキのようなウェブサイトは、自動投稿ツールを使って多くのサイトにリンクを張ってまわるスパマーにより荒らされがちです。
 このようなスパムは除去できるものの、その作業は大変に面倒なものです。
@@ -1917,7 +1922,7 @@ $messages['ja'] = array(
 
 しかし、残念なことに、この方法により、視力が低い利用者や、テキストベースあるいは音声ベースのブラウザーを使用している利用者にご不便をおかけする場合があります。
 現時点では、音声による代替方法はありません。
-æ­£å½\93ã\81ªæ\8a\95稿をするにあたって本機能が障害となっている場合、[[{{MediaWiki:Grouppage-sysop}}|サイト管理者]]に連絡して協力を求めてください。
+æ­£å½\93ã\81ªæ\93\8dä½\9cをするにあたって本機能が障害となっている場合、[[{{MediaWiki:Grouppage-sysop}}|サイト管理者]]に連絡して協力を求めてください。
 
 ページの編集に戻るには、ブラウザーの「戻る」ボタンを押してください。',
        'captcha-addurl-whitelist' => ' #<!-- この行は変更しないでください --> <pre>
@@ -2035,7 +2040,7 @@ $messages['kaa'] = array(
        'captcha-createaccount-fail' => "Tastıyıqlawshı kodın'ız nadurıs yamasa jazılmag'an",
 );
 
-/** Kazakh (Arabic script) (‫قازاقشا (تٴوتە)‬) */
+/** Kazakh (Arabic script) (قازاقشا (تٴوتە)‏) */
 $messages['kk-arab'] = array(
        'captcha-edit' => 'بۇل بەتتٸ ٶڭدەۋ ٷشٸن, تٶمەندەگٸ قوسىندىلاۋدى شەشٸڭٸز دە, نٵتيجەسٸن
 اۋماققا ەنگٸزٸڭٸز ([[{{ns:special}}:Captcha/help|كٶبٸرەك اقپارات]]):',
@@ -2061,7 +2066,7 @@ $messages['kk-arab'] = array(
 بەت ٶڭدەۋٸنە قايتۋ بارۋ ٷشٸن «ارتقا» دەگەن تٷيمەسٸن باسىڭىز.',
 );
 
-/** Kazakh (Cyrillic script) (‪қазақша (кирил)‬) */
+/** Kazakh (Cyrillic script) (қазақша (кирил)‎) */
 $messages['kk-cyrl'] = array(
        'captcha-edit' => 'Бұл бетті өңдеу үшін, төмендегі қосындылауды шешіңіз де, нәтижесін
 аумаққа енгізіңіз ([[{{ns:special}}:Captcha/help|көбірек ақпарат]]):',
@@ -2087,7 +2092,7 @@ $messages['kk-cyrl'] = array(
 Бет өңдеуіне қайту бару үшін «Артқа» деген түймесін басыңыз.',
 );
 
-/** Kazakh (Latin script) (‪qazaqşa (latın)‬) */
+/** Kazakh (Latin script) (qazaqşa (latın)‎) */
 $messages['kk-latn'] = array(
        'captcha-edit' => 'Bul betti öñdew üşin, tömendegi qosındılawdı şeşiñiz de, nätïjesin
 awmaqqa engiziñiz ([[{{ns:special}}:Captcha/help|köbirek aqparat]]):',
@@ -2137,20 +2142,20 @@ $messages['km'] = array(
  * @author 아라
  */
 $messages['ko'] = array(
-       'captcha-edit' => '글을 편집하기 위해서는, 아래의 간단한 덧셈 값을 입력상자에 적어 주세요([[Special:Captcha/help|자세한 정보]]):',
+       'captcha-edit' => '글을 편집하기 위해서는, 아래의 간단한 덧셈 값을 입력상자에 적어 주세요 ([[Special:Captcha/help|자세한 정보]]):',
        'captcha-desc' => '스팸과 비밀번호 탈취를 방지하기 위한 CAPTCHA(캡차) 기능을 제공',
        'captcha-label' => 'CAPTCHA(캡차)',
-       'captcha-addurl' => '편집 내용에 다른 웹 사이트 링크가 포함되어 있습니다.
-자동 스팸을 막기 위해, 아래의 간단한 계산 값을 입력상자에 적어 주세요([[Special:Captcha/help|자세한 정보]]):',
-       'captcha-badlogin' => '계정 비밀번호 해킹을 막기 위해, 아래의 간단한 계산 값을 입력 상자에 입력해주세요 ([[Special:Captcha/help|자세한 정보]]):',
-       'captcha-createaccount' => '자동 가입을 막기 위해, 아래 문제의 답을 적어 주세요. ([[Special:Captcha/help|관련 도움말]]):',
+       'captcha-addurl' => '편집에 새로운 바깥 링크가 포함되어 있습니다.
+자동화된 스팸으로부터 위키를 보호하기 위해, 편집을 저장하려면 아래의 간단한 계산 값을 입력상자에 적어 주세요 ([[Special:Captcha/help|자세한 정보]]):',
+       'captcha-badlogin' => '자동화된 계정 비밀번호 해킹으로부터 위키를 보호하기 위해, 아래의 간단한 계산 값을 입력 상자에 입력해주세요 ([[Special:Captcha/help|자세한 정보]]):',
+       'captcha-createaccount' => '자동화된 계정 가입으로부터 위키를 보호하기 위해, 아래의 간단한 계산 값을 입력상자에 적어 주세요 ([[Special:Captcha/help|자세한 정보]]):',
        'captcha-createaccount-fail' => '입력값이 잘못되었거나 없습니다.',
-       'captcha-create' => '문서를 만들기 위해서는, 아래의 간단한 계산 값을 입력상자에 적어 주세요([[Special:Captcha/help|자세한 정보]]):',
-       'captcha-sendemail' => 'ì\9e\90ë\8f\99í\99\94ë\90\9c ì\8a¤í\8c¸ì\9d\84 ë°©ì§\80하기 위해, 아래의 간단한 계산 값을 입력상자에 적어 주세요 ([[Special:Captcha/help|자세한 정보]]):',
+       'captcha-create' => '문서를 만들기 위해서는, 아래의 간단한 계산 값을 입력상자에 적어 주세요 ([[Special:Captcha/help|자세한 정보]]):',
+       'captcha-sendemail' => 'ì\9e\90ë\8f\99í\99\94ë\90\9c ì\8a¤í\8c¸ì\9c¼ë¡\9cë¶\80í\84° ì\9c\84í\82¤ë¥¼ ë³´í\98¸하기 위해, 아래의 간단한 계산 값을 입력상자에 적어 주세요 ([[Special:Captcha/help|자세한 정보]]):',
        'captcha-sendemail-fail' => '입력값이 잘못되었거나 없습니다.',
        'captcha-disabledinapi' => '이 동작은 캡차를 거쳐야 하기 때문에 API로 이 작업을 수행할 수 없습니다.',
        'captchahelp-title' => 'CAPTCHA(캡차) 도움말',
-       'captchahelp-cookies-needed' => '정상적으로 작동하려면 웹 브라우저의 쿠키 사용이 활성화되어있어야 합니다.',
+       'captchahelp-cookies-needed' => '정상적으로 작동하려면 웹 브라우저의 쿠키 사용이 활성화되어 있어야 합니다.',
        'captchahelp-text' => "이 위키와 같이 사람의 공개적인 참여가 가능한 웹 사이트에서는 자동 프로그램이 스팸을 뿌리는 경우가 있습니다.
 물론 이러한 스팸은 제거할 수는 있지만 번거로운 작업이 늘어납니다.
 
@@ -2250,12 +2255,13 @@ $messages['lb'] = array(
        'captcha-edit' => "Fir dës Säit z'änneren, léist w.e.g. dës Rechenaufgab a gitt d'Resultat an d'Këscht ënnendrënner an ([[Special:Captcha/help|méi Informatiounen]]):",
        'captcha-desc' => 'Stellt Captcha-Techniken zur Verfügung fir géint Spam an Errode vu Passwierder ze schützen',
        'captcha-label' => 'CAPTCHA',
-       'captcha-addurl' => 'An ärer Ännerung sinn nei extern Linken. Fir eis virun automatiséiertem Spamming ze schütze froe mir iech fir déi folgend einfach  Rechenaufgab ze léisen an d\'Resultat an d\'Feld ënnen anzedroen. Klickt duerno w.e.g. nach eng Kéier op "Säit ofspäicheren" [[Special:Captcha/help|méi Informatiounen]].',
-       'captcha-badlogin' => "Fir eis géint automatescht Hacke vu Passwierder ze schützen, léist w.e.g. déi einfach Additioun hei ënnendrënner an tippt d'Äntwert an d'Këscht ([[Special:Captcha/help|méi Informatiounen]]):",
-       'captcha-createaccount' => "Fir eis géint d'automatescht Uleeë vu Benotzerkonten ze schützen, léist w.e.g. déi einfach Additioun hei ënnendrënner, an tippt d'Äntwert an d'Këscht ([[Special:Captcha/help|méi Informatiounen]]):",
+       'captcha-addurl' => "An Ärer Ännerung sinn nei extern Linken.
+Fir dës Wiki virun automatiséiertem Spam ze schütze froe mir Iech fir déi folgend einfach Additioun ze léisen an d'Resultat an d'Feld ënnen anzedroen fir Är Ännerung ze späicheren ([[Special:Captcha/help|méi Informatiounen]]):",
+       'captcha-badlogin' => "Fir dës Wiki géint automatescht Hacke vu Passwierder ze schützen, léist w.e.g. déi einfach Additioun hei ënnendrënner an tippt d'Äntwert an d'Këscht ([[Special:Captcha/help|méi Informatiounen]]):",
+       'captcha-createaccount' => "Fir dës Wiki géint d'automatescht Uleeë vu Benotzerkonten ze schützen, léist w.e.g. déi einfach Additioun hei ënnendrënner, an tippt d'Äntwert an d'Këscht ([[Special:Captcha/help|méi Informatiounen]]):",
        'captcha-createaccount-fail' => 'Falschen oder kee Confirmatiouns-Code.',
        'captcha-create' => "Fir eng Nei Säit unzeleeën, léist w.e.g. déi einfach Additioun hei ënnendrënner an tippt d'Äntwert an d'Këscht ([[Special:Captcha/help|méi Informatiounen]]):",
-       'captcha-sendemail' => "Fir eis géint automatescht Spammen ze schützen, léist w.e.g. déi einfach Additioun hei ënnendrënner an tippt d'Äntwert an d'Këscht ([[Special:Captcha/help|méi Informatiounen]]):",
+       'captcha-sendemail' => "Fir dës Wiki géint automatescht Spammen ze schützen, léist w.e.g. déi einfach Additioun hei ënnendrënner an tippt d'Äntwert an d'Këscht ([[Special:Captcha/help|méi Informatiounen]]):",
        'captcha-sendemail-fail' => 'Falschen oder kee Confirmatiouns-Code.',
        'captcha-disabledinapi' => 'Dës Aktioun brauch e Captcha, dofir ka se net mat enger API gemaach ginn.',
        'captchahelp-title' => 'Captcha-Hëllef',
@@ -2372,13 +2378,12 @@ $messages['mk'] = array(
        'captcha-desc' => 'Овозможува техники од CAPTCHA за заштита од спам и погодување на лозинки',
        'captcha-label' => 'CAPTCHA',
        'captcha-addurl' => 'Вашето уредување содржи нови надворешни врски.
-За да ни помогнете да се заштитиме од автоматизиран спам, решете ја простата задача подолу и впишете го бројот во полето ([[Special:Captcha/help|повеќе инфо]]):',
-       'captcha-badlogin' => 'За да ни помогнете да се заштитиме од автоматизирано пробивање на лозинки, решете ја простата задача подолу и впишете го решението во полето
-([[Special:Captcha/help|повеќе инфо]]):',
-       'captcha-createaccount' => 'За да ни помогнете да се заштитиме од автоматизирано создавање на сметки, решете ја простата задача подолу и впишете го бројот во полето ([[Special:Captcha/help|повеќе инфо]]):',
+За да ни помогнете да се заштитиме од автоматизиран спам, би ве замолиле да ја решите простата задача подолу и да го внесете резултатот во полето за да можете да го зачувате уредувањето ([[Special:Captcha/help|повеќе инфо]]):',
+       'captcha-badlogin' => 'За да ни помогнете да се заштитиме од автоматизирано пробивање на лозинки, би ве замолиле да ја решите простата задача подолу и внесете резултатот во полето ([[Special:Captcha/help|повеќе информации]]):',
+       'captcha-createaccount' => 'За да ни помогнете да се заштитиме од автоматизирано создавање на сметки, би ве замолиле да ја решите простата задача подолу и да го внесете резултатот во полето ([[Special:Captcha/help|повеќе инфо]]):',
        'captcha-createaccount-fail' => 'Потврдниот код е неточен или недостасува.',
        'captcha-create' => 'За да ја создадете страницата, прво решете ја простата задача подолу и впишете го решението во полето ([[Special:Captcha/help|повеќе инфо]]):',
-       'captcha-sendemail' => 'За да се заштитиме од автоматизирано спамирање, решете ја простата задача подолу и впишете го резултатот во полето ([[Special:Captcha/help|повеќе информации]]):',
+       'captcha-sendemail' => 'За да се заштитиме од автоматизирано спамирање, би сакале да ве замолиме да ја решите простата задача подолу и да го внесете резултатот во полето ([[Special:Captcha/help|повеќе информации]]):',
        'captcha-sendemail-fail' => 'Потврдниот код е неточен или недостасува.',
        'captcha-disabledinapi' => 'Ова дејство бара captcha, така што не може да се изврши преку API.',
        'captchahelp-title' => 'Помош со Captcha',
@@ -2409,13 +2414,13 @@ $messages['ml'] = array(
        'captcha-edit' => 'ഈ താൾ തിരുത്തുവാൻ, ദയവായി താഴെ കൊടുത്തിരിക്കുന്ന ലഘു ഗണിത ക്രിയ ചെയ്ത് അതിന്റെ ഉത്തരം താഴെയുള്ള പെട്ടിയിൽ ടൈപ്പു ചെയ്യുക ([[Special:Captcha/help|കൂടുതൽ വിവരങ്ങൾ]]):',
        'captcha-desc' => 'പാഴെഴുത്ത് ഉൾപ്പെടുത്തലിനും രഹസ്യവാക്ക് ഊഹിക്കലിനുമെതിരെ സംരക്ഷണം തരുന്ന കാപ്ച സംവിധാനം നൽകുന്നു',
        'captcha-label' => 'കാപ്ച',
-       'captcha-addurl' => 'താà´\99àµ\8dà´\95à´³àµ\81à´\9fàµ\86 à´¤à´¿à´°àµ\81à´¤àµ\8dതലലിൽ à´ªàµ\81à´±à´\82 à´\95à´£àµ\8dണിà´\95ൾ à´\89ൾപàµ\8dà´ªàµ\86à´\9fàµ\8dà´\9fà´¿à´°à´¿à´\95àµ\8dà´\95àµ\81à´¨àµ\8dà´¨àµ\81.
-യാന്ത്രിക സ്പാമിനെതിരെയുള്ള സം‌രക്ഷണത്തിന്റെ ഭാഗമായി, ദയവായി താഴെ കൊടുത്തിരിക്കുന്ന ലഘു ഗണിത ക്രിയ ചെയ്ത് അതിന്റെ ഉത്തരം താഴെയുള്ള പെട്ടിയിൽ ടൈപ്പു ചെയ്യുക ([[Special:Captcha/help|കൂടുതൽ വിവരങ്ങൾ]]):',
-       'captcha-badlogin' => 'യാന്ത്രിക രഹസ്യവാക്ക് പൊളിക്കലിനെതിരായുള്ള സം‌രക്ഷണത്തിന്റെ ഭാഗമായി, ദയവായി താഴെ കൊടുത്തിരിക്കുന്ന ലഘു ഗണിത ക്രിയ ചെയ്ത് അതിന്റെ ഉത്തരം താഴെയുള്ള പെട്ടിയിൽ ടൈപ്പു ചെയ്യുക ([[Special:Captcha/help|കൂടുതൽ വിവരങ്ങൾ]]):',
-       'captcha-createaccount' => 'യാന്ത്രിക അംഗത്വം സൃഷ്ടിക്കലിനെതിരെയുള്ള സം‌രക്ഷണത്തിന്റെ ഭാഗമായി, ദയവായി താഴെ കൊടുത്തിരിക്കുന്ന ലഘു ഗണിത ക്രിയ ചെയ്ത് അതിന്റെ ഉത്തരം താഴെയുള്ള പെട്ടിയിൽ ടൈപ്പു ചെയ്യുക ([[Special:Captcha/help|കൂടുതൽ വിവരങ്ങൾ]]):',
+       'captcha-addurl' => 'താങ്കളുടെ തിരുത്തലിൽ പുറം കണ്ണികൾ ഉൾപ്പെട്ടിരിക്കുന്നു.
+യാന്ത്രികമായി പാഴെഴുത്തുൾപ്പെടുത്തുന്നതിൽ നിന്നും വിക്കി സം‌രക്ഷിക്കുന്നതിന്റെ ഭാഗമായി, ദയവായി താഴെ കൊടുത്തിരിക്കുന്ന ലഘു ഗണിത ക്രിയ ചെയ്ത് അതിന്റെ ഉത്തരം താഴെയുള്ള പെട്ടിയിൽ ടൈപ്പു ചെയ്യുക ([[Special:Captcha/help|കൂടുതൽ വിവരങ്ങൾ]]):',
+       'captcha-badlogin' => 'യാന്ത്രികമായി രഹസ്യവാക്ക് പൊളിക്കുന്നതിൽ നിന്നും വിക്കി സംരക്ഷിക്കുന്നതിന്റെ ഭാഗമായി, ദയവായി താഴെ കൊടുത്തിരിക്കുന്ന ലഘു ഗണിത ക്രിയ ചെയ്ത്, ഉത്തരം താഴെയുള്ള പെട്ടിയിൽ ടൈപ്പു ചെയ്യുക ([[Special:Captcha/help|കൂടുതൽ വിവരങ്ങൾ]]):',
+       'captcha-createaccount' => 'യാന്ത്രികമായി അംഗത്വം സൃഷ്ടിക്കുന്നതിൽ നിന്നും വിക്കി സം‌രക്ഷിക്കുന്നതിന്റെ ഭാഗമായി, ദയവായി താഴെ കൊടുത്തിരിക്കുന്ന ലഘു ഗണിത ക്രിയ ചെയ്ത് അതിന്റെ ഉത്തരം താഴെയുള്ള പെട്ടിയിൽ ടൈപ്പു ചെയ്യുക ([[Special:Captcha/help|കൂടുതൽ വിവരങ്ങൾ]]):',
        'captcha-createaccount-fail' => 'തെറ്റായതോ ലഭ്യമല്ലാത്തതോ ആയ സ്ഥിരീകരണ കോഡ്.',
        'captcha-create' => 'ഈ താൾ സൃഷ്ടിക്കുവാൻ, ദയവായി താഴെ കൊടുത്തിരിക്കുന്ന കൂട്ടൽ ക്രിയയുടെ ഉത്തരം താഴെയുള്ള പെട്ടിയിൽ എഴുതുക  ([[Special:Captcha/help|കൂടുതൽ വിവരങ്ങൾ]]):',
-       'captcha-sendemail' => 'യാനàµ\8dà´¤àµ\8dà´°à´¿à´\95മായ à´ªà´¾à´´àµ\86à´´àµ\81à´¤àµ\8dà´¤àµ\8d à´\89ൾപàµ\8dà´ªàµ\86à´\9fàµ\81à´¤àµ\8dതലിനàµ\81à´³àµ\8dà´³ à´ªàµ\8dരതിരàµ\8bധമàµ\86à´¨àµ\8dà´¨ à´¨à´¿à´²à´¯à´¿àµ½, à´¦à´¯à´µà´¾à´¯à´¿ à´¤à´¾à´´àµ\86 à´\95àµ\8aà´\9fàµ\81à´¤àµ\8dതിരിà´\95àµ\8dà´\95àµ\81à´¨àµ\8dà´¨ à´²à´\98àµ\81 à´\97ണിതപàµ\8dà´°à´¶àµ\8dനതàµ\8dതിനàµ\8dà´±àµ\86 ഉത്തരം പെട്ടിയിൽ എഴുതുക ([[Special:Captcha/help|കൂടുതൽ വിവരങ്ങൾ]]):',
+       'captcha-sendemail' => 'യാനàµ\8dà´¤àµ\8dà´°à´¿à´\95മായ à´ªà´¾à´´àµ\86à´´àµ\81à´¤àµ\8dà´¤àµ\8d à´\89ൾപàµ\8dà´ªàµ\86à´\9fàµ\81à´¤àµ\8dà´¤àµ\81à´¨àµ\8dനതിൽ à´¨à´¿à´¨àµ\8dà´¨àµ\81à´\82 à´µà´¿à´\95àµ\8dà´\95à´¿ à´¸à´\82à´°à´\95àµ\8dà´·à´¿à´\95àµ\8dà´\95àµ\81à´¨àµ\8dനതിനàµ\8dà´±àµ\86  à´­à´¾à´\97മായി, à´¦à´¯à´µà´¾à´¯à´¿ à´¤à´¾à´´àµ\86 à´\95àµ\8aà´\9fàµ\81à´¤àµ\8dതിരിà´\95àµ\8dà´\95àµ\81à´¨àµ\8dà´¨ à´²à´\98àµ\81 à´\97ണിത à´\95àµ\8dà´°à´¿à´¯ à´\9aàµ\86à´¯àµ\8dà´¤àµ\8d, ഉത്തരം പെട്ടിയിൽ എഴുതുക ([[Special:Captcha/help|കൂടുതൽ വിവരങ്ങൾ]]):',
        'captcha-sendemail-fail' => 'തെറ്റായതോ ലഭ്യമല്ലാത്തതോ ആയ സ്ഥിരീകരണ കോഡ്.',
        'captcha-disabledinapi' => 'ഈ പ്രവൃത്തി പൂർണ്ണമാകാൻ കാപ്ച ആവശ്യമാണ്, അതുകൊണ്ടിത് എ.പി.ഐ. ഉപയോഗിച്ച് ചെയ്യാൻ കഴിയില്ല.',
        'captchahelp-title' => 'കാപ്ച്ച സഹായം',
@@ -2509,12 +2514,12 @@ $messages['ms'] = array(
        'captcha-desc' => 'Menyediakan teknik CAPTCHA untuk melindungi daripada spam dan teka kata laluan',
        'captcha-label' => 'CAPTCHA',
        'captcha-addurl' => 'Suntingan anda mengandungi pautan luar baru.
-Untuk membanteras kegiatan spam automatik, anda diminta menyelesaikan kira-kira di bawah dan masukkan jawapannya dalam kotak yang disediakan ([[Special:Captcha/help|maklumat lanjut]]):',
-       'captcha-badlogin' => 'Untuk membanteras kegiatan meneka kata laluan secara automatik, anda diminta menyelesaikan kira-kira di bawah dan masukkan jawapannya dalam kotak yang disediakan ([[Special:Captcha/help|maklumat lanjut]]):',
-       'captcha-createaccount' => 'Untuk membanteras kegiatan pembukaan akaun secara automatik, anda diminta menyelesaikan kira-kira di bawah dan masukkan jawapannya dalam kotak yang disediakan ([[Special:Captcha/help|maklumat lanjut]]):',
+Untuk melindungi wiki daripada spam automatik, anda diminta supaya menyelesaikan kira-kira di bawah dan memasukkan jawapannya dalam kotak yang disediakan untuk menyimpan suntingan anda ([[Special:Captcha/help|maklumat lanjut]]):',
+       'captcha-badlogin' => 'Untuk melindungi wiki daripada kegiatan meneka kata laluan secara automatik, anda diminta supaya menyelesaikan kira-kira di bawah dan masukkan jawapannya dalam kotak yang disediakan ([[Special:Captcha/help|maklumat lanjut]]):',
+       'captcha-createaccount' => 'Untuk melindungi wiki daripada pembukaan akaun secara automatik, anda diminta supaya menyelesaikan kira-kira di bawah dan masukkan jawapannya dalam kotak yang disediakan ([[Special:Captcha/help|maklumat lanjut]]):',
        'captcha-createaccount-fail' => 'Kod pengesahan tidak betul atau tidak ada.',
        'captcha-create' => 'Untuk mencipta laman tersebut, sila selesaikan kira-kira di bawah dan masukkan jawapannya dalam kotak yang disediakan ([[Special:Captcha/help|maklumat lanjut]]):',
-       'captcha-sendemail' => 'Untuk membanteras kegiatan spam secara automatik, anda diminta menyelesaikan kira-kira di bawah dan masukkan jawapannya dalam kotak yang disediakan ([[Special:Captcha/help|maklumat lanjut]]):',
+       'captcha-sendemail' => 'Untuk melindungi wiki daripada spam automatik, anda diminta supaya menyelesaikan kira-kira di bawah dan masukkan jawapannya dalam kotak yang disediakan ([[Special:Captcha/help|maklumat lanjut]]):',
        'captcha-sendemail-fail' => 'Kod pengesahan tidak betul atau tidak ada.',
        'captcha-disabledinapi' => 'Tindakan ini memerlukan captcha, maka ia tidak boleh dilakukan melalui API.',
        'captchahelp-title' => 'Bantuan CAPTCHA',
@@ -2577,7 +2582,7 @@ $messages['nan'] = array(
        'captcha-createaccount-fail' => 'Khak-jīn-bé chhò-gō· iah-sī làu-kau.',
 );
 
-/** Norwegian Bokmål (‪norsk (bokmål)‬)
+/** Norwegian Bokmål (norsk (bokmål)‎)
  * @author Audun
  * @author Danmichaelo
  * @author Laaknor
@@ -2693,9 +2698,9 @@ Voer het antwoord op de onderstaande eenvoudige som in het invoervenster in ([[S
        'captcha-desc' => 'Biedt CAPTCHA-technieken om bescherming te bieden tegen spam en het raden van wachtwoorden',
        'captcha-label' => 'CAPTCHA',
        'captcha-addurl' => "Uw bewerking bevat nieuwe externe verwijzingen (URL's).
-Voer ter bescherming tegen geautomatiseerde spam het antwoord op de onderstaande eenvoudige som in in het invoerveld ([[Special:Captcha/help|meer informatie]]):",
+Voer ter bescherming tegen geautomatiseerde spam het antwoord op de onderstaande eenvoudige som in in het invoerveld om uw bewerking op te slaan ([[Special:Captcha/help|meer informatie]]):",
        'captcha-badlogin' => 'Los de onderstaande eenvoudige som op en voer het antwoord in het invoervenster in ter bescherming tegen het automatisch kraken van wachtwoorden ([[Special:Captcha/help|meer informatie]]):',
-       'captcha-createaccount' => 'Voer ter bescherming tegen het geautomatiseerd gebruikers aanmaken het antwoord op de onderstaande eenvoudige som in het invoervenster in ([[Special:Captcha/help|meer informatie]]):',
+       'captcha-createaccount' => 'Voer ter bescherming tegen het geautomatiseerd gebruikers aanmaken, het antwoord op de onderstaande eenvoudige som in in het invoervenster ([[Special:Captcha/help|meer informatie]]):',
        'captcha-createaccount-fail' => 'De bevestigingscode ontbreekt of is onjuist.',
        'captcha-create' => 'U wilt een nieuwe pagina aanmaken.
 Voer het antwoord op de onderstaande eenvoudige som in het invoervenster in ([[Special:Captcha/help|meer informatie]]):',
@@ -2723,7 +2728,7 @@ Klik op de knop 'terug' in uw browser om terug te gaan naar het tekstbewerkingss
        'right-skipcaptcha' => 'Captchahandelingen uitvoeren zonder captcha te hoeven oplossen',
 );
 
-/** ‪Nederlands (informeel)‬ (‪Nederlands (informeel)‬)
+/** Nederlands (informeel)‎ (Nederlands (informeel)‎)
  * @author Siebrand
  */
 $messages['nl-informal'] = array(
@@ -2743,7 +2748,7 @@ Vraag assistentie van de [[{{MediaWiki:Grouppage-sysop}}|sitebeheerders]] als di
 Klik op de knop 'terug' in je browser om terug te gaan naar het tekstbewerkingsscherm.",
 );
 
-/** Norwegian Nynorsk (‪norsk (nynorsk)‬)
+/** Norwegian Nynorsk (norsk (nynorsk)‎)
  * @author Eirik
  * @author Frokor
  * @author Harald Khan
@@ -2877,11 +2882,11 @@ $messages['pl'] = array(
        'captcha-desc' => 'Dodaje CAPTCHA – zabezpieczenie przed spamującymi automatami oraz odgadywaniem haseł',
        'captcha-label' => 'CAPTCHA',
        'captcha-addurl' => 'Dodałeś nowe linki zewnętrzne. Ze względu na ochronę przed zautomatyzowanym spamem musisz wykonać proste działanie matematyczne i wpisać wynik w pole obok ([[Special:Captcha/help|więcej informacji]]):',
-       'captcha-badlogin' => 'Zabezpieczenie przed automatycznym łamaniem haseł. Wpisz w pole poniżej wynik prostego działania matematycznego ([[Special:Captcha/help|pomoc]]).',
-       'captcha-createaccount' => 'Zabezpieczenie przed automatycznie dodawanym spamem. Wpisz w pole poniżej wynik prostego działania matematycznego ([[Special:Captcha/help|pomoc]]).',
+       'captcha-badlogin' => 'Zabezpieczenie przed automatycznym łamaniem hasełm, wpisz w pole poniżej wynik prostego działania matematycznego ([[Special:Captcha/help|pomoc]]):',
+       'captcha-createaccount' => 'Zabezpieczenie przed automatycznym tworzeniem konta - wpisz w pole poniżej wynik prostego działania matematycznego ([[Special:Captcha/help|pomoc]]):',
        'captcha-createaccount-fail' => 'Nieprawidłowy kod lub brak kodu potwierdzającego.',
        'captcha-create' => 'Aby utworzyć stronę wykonaj proste działanie i wpisz wynik w pole tekstowe ([[Special:Captcha/help|pomoc]]):',
-       'captcha-sendemail' => 'Zabezpieczenie przed automatycznym spamem. Wpisz w pole poniżej wynik prostego dodawania ([[Special:Captcha/help|więcej informacji]]).',
+       'captcha-sendemail' => 'Zabezpieczenie przed automatycznym spamem, wpisz w pole poniżej wynik prostego dodawania ([[Special:Captcha/help|więcej informacji]]):',
        'captcha-sendemail-fail' => 'Nieprawidłowy lub brak kodu potwierdzającego.',
        'captcha-disabledinapi' => 'Ta czynność wymaga potwierdzenia capcha i z tego względu nie może być przeprowadzona z użyciem API.',
        'captchahelp-title' => 'Pomoc dla ochrony antyspamowej',
@@ -2982,6 +2987,19 @@ $messages['ps'] = array(
        'captcha-create' => 'ددې لپاره چې نوی ليکنه ترسره کړی، لطفاً د همدغه ساده شمېرو ځواب په ورکړ شوي چوکاټ کې وليکی ([[Special:Captcha/help|نور مالومات]]):',
        'captchahelp-title' => 'CAPTCHA لارښود',
        'captchahelp-cookies-needed' => 'ددې کړنې د ترسره کېدلو لپاره تاسو ته پکار ده چې د خپل کتنمل (browser) کوکيز (cookies) چارن کړی.',
+       'captchahelp-text' => "هغه وېبځايونه چې د ټولو وګړو پر لور د ليکنو د ليکلو لپاره پرانيستي دي، لکه همدا ويکي، ډېر ځل د سپمرګرو لخوا چې اتوماتيک اوزارونه د خپلو د تړنو او وېبپاڼو د خبرتياو په خپرولو کې کاروي، په ناوړه توګه کارېږي. تر هغه وخت پورې چې همدا سپمونه او هماغه تړنې راموندل کېږي او ليرې کېږي، نو تر هغه وخته پورې همدا سپمونه ډېر سرخوږی جوړوي.
+
+په ځانګړي توګه په يوه مخ کې د يوه وېبځي د تړنې د ورګډولو په وخت کې به ويکي يو ډول ګډوډ رنګين متن ښکاره کړي او له کارن نه به د هماغه متن د ټاپلو غوښتنه شوې وي. 
+
+څرنګه چې جوته ده چې اصلي وګړي کولی شي چې په دې کار کې بريالي شي، خو دې ته ناورته سپامګر ماشينونه او روبوټونه دا ډول کار په خپلکاره توګه نه شي ترسره کولی او پدې توګه د سپامګرو او روبوټونو د غورځنګ مخ نيول کېږي.
+
+بدبختانه چې دا کار د کارنانو لپاره ستونزه جوړولای شي او هغه څوک چې د سترګو نظر يې کمزوری دی او يا هم د متن پر بنسټ او يا هم د غږ پر بنسټ جوړ شوي کتنملونه کاروي نه شي کولی په آسانۍ سره خپلې سمونې او خپرونې ترسره کړي.
+
+دم مهال موږ د داسې متنونو غږيز انډول نه لرو.
+
+که چېرته دا کار تاسې له سمونو او ليکنو خپرولو پاتې راولي نو لطفاً د مرستې لپاره د [[{{MediaWiki:Grouppage-sysop}}|پازوالانو]] سره اړيکه ټينګه کړۍ.
+
+په خپل کتنمل کې د 'شاکېدلو' تڼۍ کېښکاږۍ چې بېرته پخواني مخ ته وګرځۍ.",
 );
 
 /** Portuguese (português)
@@ -3079,12 +3097,13 @@ $messages['ro'] = array(
        'captcha-edit' => 'Editarea include legături externe noi. Pentru a evita spam-ul automat, vă rugăm să rezolvați adunarea de mai jos și introduceți rezultatul în căsuță ([[Special:Captcha/help|detalii]]):',
        'captcha-desc' => 'Oferă implementare de tip CAPTCHA împotriva spamului și încercărilor de aflare a parolelor',
        'captcha-label' => 'CAPTCHA',
-       'captcha-addurl' => 'Editarea include legături externe noi. Pentru a evita spam-ul automat, vă rugăm să rezolvați adunarea de mai jos și introduceți rezultatul în căsuță ([[Special:Captcha/help|detalii]]):',
+       'captcha-addurl' => 'Modificarea dumneavoastră include legături externe noi.
+Pentru a proteja wikiul împotriva spamului automat, vă rugăm să rezolvați adunarea de mai jos și introduceți rezultatul în căsuță pentru a salva modificarea ([[Special:Captcha/help|detalii]]):',
        'captcha-badlogin' => 'Ca măsură de protecție împotriva spargerii de parole, vă rugăm să rezolvați adunarea de mai jos și introduceți rezultatul în căsuță ([[Special:Captcha/help|detalii]]):',
        'captcha-createaccount' => 'Pentru a evita crearea automată de conturi, vă rugăm să rezolvați adunarea de mai jos și introduceți rezultatul în căsuță ([[Special:Captcha/help|detalii]]):',
        'captcha-createaccount-fail' => 'Cod de confirmare incorect sau lipsă.',
        'captcha-create' => 'Editarea include legături externe noi. Pentru a evita spam-ul automat, vă rugăm să rezolvați adunarea de mai jos și introduceți rezultatul în căsuță ([[Special:Captcha/help|detalii]]):',
-       'captcha-sendemail' => 'Pentru a împiedica roboții de spam, vă rugăm să rezolvați operația simplă de mai jos și să introduceți răspunsul în căsuță ([[Special:Captcha/help|mai multe detalii]]):',
+       'captcha-sendemail' => 'Pentru a proteja wikiul împotriva roboților de spam, vă rugăm să rezolvați operația simplă de mai jos și să introduceți răspunsul în căsuță ([[Special:Captcha/help|mai multe detalii]]):',
        'captcha-sendemail-fail' => 'Codul de confirmare lipsește sau este incorect.',
        'captcha-disabledinapi' => 'Această acțiune necesită rezolvarea unui captcha, deci nu poate fi efectuată prin API.',
        'captchahelp-title' => 'Despre „Captcha”',
@@ -3135,6 +3154,7 @@ Pe aiutà a proteggere condre a 'u spam automateche, pe piacere respunne a 'a do
  * @author Ahonc
  * @author Aleksandrit
  * @author Amire80
+ * @author Ignatus
  * @author Kalan
  * @author Александр Сигачёв
  */
@@ -3142,12 +3162,10 @@ $messages['ru'] = array(
        'captcha-edit' => 'Чтобы отредактировать эту страницу, пожалуйста, решите простой пример и введите ответ в текстовое поле ([[Special:Captcha/help|подробнее]]):',
        'captcha-desc' => 'Предоставляет методы CAPTCHA для защиты от спама и подбора пароля',
        'captcha-label' => 'CAPTCHA',
-       'captcha-addurl' => 'Вы добавили ссылку на внешний сайт;
-в целях защиты от автоматического спама, введите буквы изображённые на картинке:<br />
-([[Special:Captcha/help|Что это такое?]])',
+       'captcha-addurl' => 'Вы добавляете новые ссылки на внешние сайты.
+В целях защиты от автоматического спама необходимо произвести следующее простое вычисление и записать ответ в поле рядом, чтобы правка была сохранена ([[Special:Captcha/help|подробнее]]):',
        'captcha-badlogin' => 'В целях защиты от автоматического взлома пароля, пожалуйста, выполните следующее простое арифметическое действие и введите ответ в текстовое поле ниже ([[Special:Captcha/help|подробнее]]):',
-       'captcha-createaccount' => 'В качестве меры против автоматического спама, вы должны ввести буквы, изображённые на картинке, чтобы зарегистрироваться в системе:<br />
-([[Special:Captcha/help|Что это такое?]])',
+       'captcha-createaccount' => 'Для защиты от автоматической спам-регистрации необходимо выполнить следующее простое вычисление и записать ответ в поле рядом ([[Special:Captcha/help|подробнее]]):',
        'captcha-createaccount-fail' => 'Контрольная комбинация неверна или не введена.',
        'captcha-create' => 'Чтобы создать страницу, решите простой пример и введите ответ в текстовое поле ([[Special:Captcha/help|что это?]]):',
        'captcha-sendemail' => 'В целях защиты от автоматического спама, пожалуйста, вычислите приведённое простое выражение и введите ответ ([[Special:Captcha/help| подробнее]]):',
@@ -3466,7 +3484,7 @@ Shtypni butonin "prapa" ("back") të shfletuesit tuaj për tu kthyer tek faqja e
        'right-skipcaptcha' => 'Kryen veprime CAPTCHA-triggering pa pasur nevojë të shkojë nëpërmjet CAPTCHA',
 );
 
-/** Serbian (Cyrillic script) (‪српски (ћирилица)‬)
+/** Serbian (Cyrillic script) (српски (ћирилица)‎)
  * @author Millosh
  * @author Rancher
  */
@@ -3486,7 +3504,7 @@ $messages['sr-ec'] = array(
        'right-skipcaptcha' => 'прескакање радњи које захтевају унос потврдног кода',
 );
 
-/** Serbian (Latin script) (‪srpski (latinica)‬)
+/** Serbian (Latin script) (srpski (latinica)‎)
  * @author Michaello
  */
 $messages['sr-el'] = array(
@@ -3566,6 +3584,7 @@ Hit the 'back' button in your browser to return to the page editor.",
  * @author Lejonel
  * @author M.M.S.
  * @author MagnusA
+ * @author Martinwiss
  * @author Per
  */
 $messages['sv'] = array(
@@ -3573,16 +3592,13 @@ $messages['sv'] = array(
 räkneuppgift i rutan ([[Special:Captcha/help|mer information]]):',
        'captcha-desc' => 'Ger CAPTCHA tekniker för att skydda mot skräppost och lösenordsgissning',
        'captcha-label' => 'CAPTCHA',
-       'captcha-addurl' => 'Din ändring lägger till nya externa länkar i texten. För att skydda wikin mot
-automatisk spam måste du skriva svaret på följande räkneuppgift i rutan ([[Special:Captcha/help|mer information]]):',
-       'captcha-badlogin' => 'För att skydda mot wikin mot automatiserad lösenordsknäckning måste du skriva
-svaret på följande räkneuppgift i rutan ([[Special:Captcha/help|mer information]]):',
-       'captcha-createaccount' => 'För att skydda wikin mot automatiskt skapade användarkonton måste du
-skriva svaret på följande räkneuppgift i rutan ([[Special:Captcha/help|mer information]]):',
+       'captcha-addurl' => 'Din ändring innebär nya externa länkar i texten. För att skydda wikin mot automatisk spam måste du skriva svaret på följande räkneuppgift i rutan ([[Special:Captcha/help|mer information]]):',
+       'captcha-badlogin' => 'För att skydda mot wikin mot försök att knäcka lösenord på automatisk väg, måste du skriva svaret på följande räkneuppgift i rutan ([[Special:Captcha/help|mer information]]):',
+       'captcha-createaccount' => 'För att skydda wikin mot automatiskt skapade användarkonton, måste du skriva svaret på följande räkneuppgift i rutan ([[Special:Captcha/help|mer information]]):',
        'captcha-createaccount-fail' => 'Bekräftelsekoden är felaktig eller saknas.',
        'captcha-create' => 'För att skapa den här sidan måste du skriva svaret på följande räkneuppgift
 i rutan ([[Special:Captcha/help|mer information]]):',
-       'captcha-sendemail' => 'Lös den enkla matematiska uppgiften i rutan nedan, för att hjälpa oss att skydda mot automatisk spamning ([[Special:Captcha/help|mer information]]):',
+       'captcha-sendemail' => 'För att skydda wikin mot automatiska skräpinlägg, ber vi dig att lösa den enkla matematiska ekvationen här nedanför och skriva in svaret i rutan ([[Special:Captcha/help|mer information]]):',
        'captcha-sendemail-fail' => 'Felaktig eller saknad bekräftelsekod.',
        'captcha-disabledinapi' => 'Denna åtgärd kräver en captcha, så den kan inte utföras genom APIet.',
        'captchahelp-title' => 'Captchahjälp',
@@ -3918,15 +3934,13 @@ $messages['vi'] = array(
        'captcha-edit' => 'Để sửa đổi trang này, xin hãy giải phép cộng đơn giản dưới đây và gõ câu trả lời vào ô ([[Special:Captcha/help|thông tin thêm]]):',
        'captcha-desc' => 'Chống spam và sự đoán mật khẩu dùng CAPTCHA',
        'captcha-label' => 'CAPTCHA',
-       'captcha-addurl' => 'Sửa đổi của bạn có chứa các liên kết ra bên ngoài. Để giúp tránh spam tự động, xin hãy giải phép toán đơn giản ở dưới và gõ kết quả vào ô ([[Special:Captcha/help|thông tin thêm]]):',
-       'captcha-badlogin' => 'Để giúp tránh hành động bẻ mật khẩu tự động, xin hãy giải phép cộng
-đơn giản ở dưới và gõ kết quả vào ô ([[Special:Captcha/help|thông tin thêm]]):',
-       'captcha-createaccount' => 'Để giúp tránh việc tạo tài khoản tự động, xin hãy giải phép cộng
-đơn giản ở dưới và gõ kết quả vào ô ([[Special:Captcha/help|thông tin thêm]]):',
+       'captcha-addurl' => 'Sửa đổi của bạn có chứa các liên kết ra bên ngoài. Để tránh spam tự động trong wiki, xin bạn vui lòng giải phép toán đơn giản ở dưới và nhập kết quả vào ô để lưu giữ các sửa đổi của bạn ([[Special:Captcha/help|thông tin thêm]]):',
+       'captcha-badlogin' => 'Để tránh vụ tự động bẻ mật khẩu của người dùng wiki, xin bạn vui lòng giải phép cộng đơn giản ở dưới và nhập kết quả vào ô ([[Special:Captcha/help|thông tin thêm]]):',
+       'captcha-createaccount' => 'Để tránh vụ tự động mở tài khoản trong wiki, xin bạn vui lòng giải phép cộng đơn giản ở dưới và nhập kết quả vào ô ([[Special:Captcha/help|thông tin thêm]]):',
        'captcha-createaccount-fail' => 'Thiếu mã xác nhận hoặc mã xác nhận sai.',
        'captcha-create' => 'Để tạo mới trang, xin hãy giải phép cộng đơn giản ở dưới và gõ
 câu trả lời vào ô ([[Special:Captcha/help|thông tin thêm]]):',
-       'captcha-sendemail' => 'Để xác nhận rằng bạn không phải là tay spam, xin hãy giải phép cộng đơn giản ở dưới và gõ câu trả lời vào ô ([[Special:Captcha/help|thông tin thêm]]):',
+       'captcha-sendemail' => 'Để xác nhận rằng bạn không phải là tay spam, xin bạn vui lòng giải phép cộng đơn giản ở dưới và nhập kết quả vào ô ([[Special:Captcha/help|thông tin thêm]]):',
        'captcha-sendemail-fail' => 'Mã xác nhận không chính xác hoặc chưa được cung cấp.',
        'captcha-disabledinapi' => 'Tác vụ này đòi người dùng giải CAPTCHA trước tiên, nên không thể thực hiện nó qua API.',
        'captchahelp-title' => 'Trợ giúp Captcha',
@@ -4009,10 +4023,10 @@ Clitchîz sol boton «En erî» di vosse betchteu waibe po rivni al pådje di dv
  * @author פוילישער
  */
 $messages['yi'] = array(
-       'captcha-addurl' => 'אײַער רעדאַקטירונג אַנטהאַלט נײַע דרויסנדיקע לינקען.
\9b×\93×\99 ×¦×\95 ×\94×¢×\9cפֿ×\9f ×©×\99צ×\9f ×§×¢×\92×\9f ×\90×\95×\99×\98×\90×\9e×\96×\99ר×\98×\9f ×¡×¤×\90Ö·×\9d, ×\96ײַ×\98 ×\90Ö·×\96×\95×\99 ×\92×\95×\98 ×\90×\95×\9f ×\9c×\99×\99×\96×\98 ×\93×\90ָס ×¤×©×\95×\98×¢ ×¨×¢×\98×¢× ×\99ש ×\90×\95× ×\98×\9f ×\90×\95×\9f ×§×\9c×\90ַפ×\98 ×\90ײַ×\9f ×\93×¢×\9d ×¢× ×\98פֿער ×\90×\99× ×¢×\9d ×§×¢×¡×\98×\9c ([[Special:Captcha/help|נאך אינפֿארמאַציע]]):',
-       'captcha-badlogin' => '×\9b×\93×\99 ×¦×\95 ×\94×¢×\9cפֿ×\9f ×§×¢×\92×\9f ×\90×\95×\99×\98×\90×\9e×\90Ö·×\98×\99שער ×\91רע×\9b×\9f ×¤×\90ַס×\95×\95ער×\98ער, ×\90× ×\90 ×¤×ª×¨×\95 ×\90ת ×ª×¨×\92×\99×\9c ×\94×\97×\99×\91×\95ר ×\94פש×\95×\98 ×©×\9c×\94×\9c×\9f ×\95×\94ק×\9c×\99×\93×\95 ×\90ת ×\94תש×\95×\91×\94 ×\91ת×\99×\91×\94 ([[Special:Captcha/help|×\9e×\99×\93×¢ × ×\95סף]]):',
-       'captcha-createaccount' => '×\9b×\93×\99 ×¦×\95 ×\94×¢×\9cפֿ×\9f ×§×¢×\92×\9f ×\90×\95×\99×\98×\90×\9e×\90Ö·×\98×\99שע ×©×\90ַפֿ×\9f ×§×\90× ×\98עס, ×\90× ×\90 ×¤×ª×¨×\95 ×\90ת ×ª×¨×\92×\99×\9c ×\94×\97×\99×\91×\95ר ×\94פש×\95×\98 ×©×\9c×\94×\9c×\9f ×\95×\94ק×\9c×\99×\93×\95 ×\90ת ×\94תש×\95×\91×\94 ×\91ת×\99×\91×\94 ([[Special:Captcha/help|×\9e×\99×\93×¢ × ×\95סף]]):',
+       'captcha-addurl' => 'אײַער רעדאַקטירונג אַנטהאַלט נײַע דרויסנדיקע לינקען. 
¦×\95 ×©×\99צ×\9f ×\93×\99 ×\95×\95×\99ק×\99 ×§×¢×\92×\9f ×\90×\95×\99×\98×\90×\9e×\96×\99ר×\98×\9f ×¡×¤×\90Ö·×\9d, ×\91×¢×\98×\9f ×\9e×\99ר ×\90ײַ×\9a ×¦×\95 ×\9c×\99×\99×\96×\9f ×\93×\99 ×¤×©×\95×\98×¢ ×¡×\95×\9e×¢ ×\90×\95× ×\98×\9f ×\90×\95×\9f ×§×\9c×\90ַפ×\98 ×\90ײַ×\9f ×\93×¢×\9d ×¢× ×\98פֿער ×\90×\99× ×¢×\9d ×§×¢×¡×\98×\9c ×\9b×\93×\99 ×\90×\95×\99פצ×\95×\94×\99×\98×\9f ×\90ײַער ×¨×¢×\93×\90ק×\98×\99ר×\95× ×\92. ([[Special:Captcha/help|נאך אינפֿארמאַציע]]):',
+       'captcha-badlogin' => 'צ×\95 ×©×\99צ×\9f ×\93×\99 ×\95×\95×\99ק×\99 ×§×¢×\92×\9f ×\90×\95×\99×\98×\90×\9e×\90Ö·×\98×\99ש×\9f ×\91רע×\9b×\9f ×¤×\90ַס×\95×\95ער×\98ער, ×\91×¢×\98×\9f ×\9e×\99ר ×\90ײַ×\9a ×¦×\95 ×\9c×\99×\99×\96×\9f ×\93×\99 ×¤×©×\95×\98×¢ ×¡×\95×\9e×¢ ×\90×\95× ×\98×\9f ×\90×\95×\9f ×§×\9c×\90ַפ×\98 ×\90ײַ×\9f ×\93×¢×\9d ×¢× ×\98פֿער ×\90×\99× ×¢×\9d ×§×¢×¡×\98×\9c ×\9b×\93×\99 ×\90×\95×\99פצ×\95×\94×\99×\98×\9f ×\90ײַער ×¨×¢×\93×\90ק×\98×\99ר×\95× ×\92. ([[Special:Captcha/help|× ×\90×\9a ×\90×\99נפֿ×\90ר×\9e×\90ַצ×\99×¢]]):',
+       'captcha-createaccount' => 'צ×\95 ×©×\99צ×\9f ×\93×\99 ×\95×\95×\99ק×\99 ×§×¢×\92×\9f ×\90×\95×\99×\98×\90×\9e×\90Ö·×\98×\99שע ×©×\90ַפֿ×\9f ×§×\90× ×\98עס, ×\91×¢×\98×\9f ×\9e×\99ר ×\90ײַ×\9a ×¦×\95 ×\9c×\99×\99×\96×\9f ×\93×\99 ×¤×©×\95×\98×¢ ×¡×\95×\9e×¢ ×\90×\95× ×\98×\9f ×\90×\95×\9f ×\90ר×\99×\99נק×\9c×\90ַפ×\9f ×\93×¢×\9d ×¢× ×\98פֿער ×\90×\99× ×¢×\9d ×§×¢×¡×\98×\9c ×\9b×\93×\99 ×\90×\95×\99פצ×\95×\94×\99×\98×\9f ×\90ײַער ×¨×¢×\93×\90ק×\98×\99ר×\95× ×\92. ([[Special:Captcha/help|× ×\90×\9a ×\90×\99נפֿ×\90ר×\9e×\90ַצ×\99×¢]]):',
        'captcha-createaccount-fail' => 'גרײַזיקער אָדער פֿעלנדיקער באַשטעטיק־קאָד',
        'captchahelp-title' => 'CAPTCHA הילף',
 );
@@ -4051,7 +4065,7 @@ $messages['yue'] = array(
        'right-skipcaptcha' => '執行captcha引發嘅動作時唔需要經過captcha',
 );
 
-/** Simplified Chinese (‪中文(简体)‬)
+/** Simplified Chinese (中文(简体)‎)
  * @author Bencmq
  * @author Hzy980512
  * @author Liangent
@@ -4087,7 +4101,7 @@ $messages['zh-hans'] = array(
        'right-skipcaptcha' => '进行触发验证操作时无需验证',
 );
 
-/** Traditional Chinese (‪中文(繁體)‬)
+/** Traditional Chinese (中文(繁體)‎)
  * @author Horacewai2
  * @author Hydra
  * @author Liangent
index 27b6f2850c5546e2a286f1539b998c2be6884dac..f559f0f3c9f15f70ab0c78ecbb6e671da20fe2b7 100644 (file)
@@ -1,6 +1,53 @@
 <?php
 
 class FancyCaptcha extends SimpleCaptcha {
+       /**
+        * @return FileBackend
+        */
+       public function getBackend() {
+               global $wgCaptchaFileBackend, $wgCaptchaDirectory;
+
+               if ( $wgCaptchaFileBackend ) {
+                       return FileBackendGroup::singleton()->get( $wgCaptchaFileBackend );
+               } else {
+                       static $backend = null;
+                       if ( !$backend ) {
+                               $backend = new FSFileBackend( array(
+                                       'name'           => 'captcha-backend',
+                                       'lockManager'    => 'nullLockManager',
+                                       'containerPaths' => array( 'captcha-render' => $wgCaptchaDirectory ),
+                                       'fileMode'       => 777
+                               ) );
+                       }
+                       return $backend;
+               }
+       }
+
+       /**
+        * @return integer Estimate of the number of captchas files
+        */
+       public function estimateCaptchaCount() {
+               global $wgCaptchaDirectoryLevels;
+
+               $factor = 1;
+               $sampleDir = $this->getBackend()->getRootStoragePath() . '/captcha-render';
+               if ( $wgCaptchaDirectoryLevels >= 1 ) { // 1/16 sample if 16 shards
+                       $sampleDir .= '/' . dechex( mt_rand( 0, 15 ) );
+                       $factor = 16;
+               }
+               if ( $wgCaptchaDirectoryLevels >= 3 ) { // 1/256 sample if 4096 shards
+                       $sampleDir .= '/' . dechex( mt_rand( 0, 15 ) );
+                       $factor = 256;
+               }
+
+               $count = 0;
+               foreach ( $this->getBackend()->getFileList( array( 'dir' => $sampleDir ) ) as $file ) {
+                       ++$count;
+               }
+
+               return ( $count * $factor );
+       }
+
        /**
         * Check if the submitted form matches the captcha session data provided
         * by the plugin when the form was generated.
@@ -85,99 +132,151 @@ class FancyCaptcha extends SimpleCaptcha {
 
        /**
         * Select a previously generated captcha image from the queue.
-        * @fixme subject to race conditions if lots of files vanish
         * @return mixed tuple of (salt key, text hash) or false if no image to find
         */
-       function pickImage() {
-               global $wgCaptchaDirectory, $wgCaptchaDirectoryLevels;
-               return $this->pickImageDir(
-                       $wgCaptchaDirectory,
-                       $wgCaptchaDirectoryLevels );
+       protected function pickImage() {
+               global $wgCaptchaDirectoryLevels;
+
+               $lockouts = 0; // number of times another process claimed a file before this one
+               $baseDir = $this->getBackend()->getRootStoragePath() . '/captcha-render';
+               return $this->pickImageDir( $baseDir, $wgCaptchaDirectoryLevels, $lockouts );
        }
 
-       function pickImageDir( $directory, $levels ) {
-               if ( $levels ) {
-                       $dirs = array();
+       /**
+        * @param $directory string
+        * @param $levels integer
+        * @param $lockouts integer
+        * @return Array|bool
+        */
+       protected function pickImageDir( $directory, $levels, &$lockouts ) {
+               global $wgMemc;
 
-                       // Check which subdirs are actually present...
-                       $dir = opendir( $directory );
-                       if ( !$dir ) {
-                               return false;
-                       }
-                       while ( false !== ( $entry = readdir( $dir ) ) ) {
+               if ( $levels <= 0 ) { // $directory has regular files
+                       return $this->pickImageFromDir( $directory, $lockouts );
+               }
+
+               $backend = $this->getBackend();
+
+               $key  = "fancycaptcha:dirlist:{$backend->getWikiId()}:" . sha1( $directory );
+               $dirs = $wgMemc->get( $key ); // check cache
+               if ( !is_array( $dirs ) ) { // cache miss
+                       $dirs = array(); // subdirs actually present...
+                       foreach ( $backend->getTopDirectoryList( array( 'dir' => $directory ) ) as $entry ) {
                                if ( ctype_xdigit( $entry ) && strlen( $entry ) == 1 ) {
                                        $dirs[] = $entry;
                                }
                        }
-                       closedir( $dir );
-
-                       $place = mt_rand( 0, count( $dirs ) - 1 );
-                       // In case all dirs are not filled,
-                       // cycle through next digits...
-                       for ( $j = 0; $j < count( $dirs ); $j++ ) {
-                               $char = $dirs[( $place + $j ) % count( $dirs )];
-                               $return = $this->pickImageDir( "$directory/$char", $levels - 1 );
-                               if ( $return ) {
-                                       return $return;
-                               }
-                       }
-                       // Didn't find any images in this directory... empty?
-                       return false;
-               } else {
-                       return $this->pickImageFromDir( $directory );
+                       wfDebug( "Cache miss for $directory subdirectory listing.\n" );
+                       $wgMemc->set( $key, $dirs, 86400 );
                }
-       }
 
-       function pickImageFromDir( $directory ) {
-               if ( !is_dir( $directory ) ) {
-                       return false;
+               if ( !count( $dirs ) ) {
+                       // Remove this directory if empty so callers don't keep looking here
+                       $backend->clean( array( 'dir' => $directory ) );
+                       return false; // none found
                }
-               $dirCount = $this->countFiles( $directory );
-               if ( $dirCount === 0 ) {
-                       return false;
+
+               $place = mt_rand( 0, count( $dirs ) - 1 ); // pick a random subdir
+               // In case all dirs are not filled, cycle through next digits...
+               for ( $j = 0; $j < count( $dirs ); $j++ ) {
+                       $char = $dirs[( $place + $j ) % count( $dirs )];
+                       $info = $this->pickImageDir( "$directory/$char", $levels - 1, $lockouts );
+                       if ( $info ) {
+                               return $info; // found a captcha
+                       } else {
+                               wfDebug( "Could not find captcha in $directory.\n" );
+                               $wgMemc->delete( $key ); // files changed on disk?
+                       }
                }
-               $n = mt_rand( 0, $dirCount - 1 );
-               $dir = opendir( $directory );
 
-               $count = 0;
+               return false; // didn't find any images in this directory... empty?
+       }
 
-               $entry = readdir( $dir );
-               $pick = false;
-               while ( false !== $entry ) {
-                       $entry = readdir( $dir );
-                       if ( preg_match( '/^image_([0-9a-f]+)_([0-9a-f]+)\\.png$/', $entry, $matches ) ) {
-                               $size = getimagesize( "$directory/$entry" );
-                               $pick = array(
-                                       'salt' => $matches[1],
-                                       'hash' => $matches[2],
-                                       'width' => $size[0],
-                                       'height' => $size[1],
-                                       'viewed' => false,
-                               );
-                               if ( $count++ == $n ) {
+       /**
+        * @param $directory string
+        * @param $lockouts integer
+        * @return Array|bool
+        */
+       protected function pickImageFromDir( $directory, &$lockouts ) {
+               global $wgMemc;
+
+               $backend = $this->getBackend();
+
+               $key   = "fancycaptcha:filelist:{$backend->getWikiId()}:" . sha1( $directory );
+               $files = $wgMemc->get( $key ); // check cache
+               if ( !is_array( $files ) ) { // cache miss
+                       $files = array(); // captcha files
+                       foreach ( $backend->getTopFileList( array( 'dir' => $directory ) ) as $entry ) {
+                               $files[] = $entry;
+                               if ( count( $files ) >= 500 ) { // sanity
+                                       wfDebug( 'Skipping some captchas; $wgCaptchaDirectoryLevels set too low?.' );
                                        break;
                                }
                        }
+                       $wgMemc->set( $key, $files, 86400 );
+                       wfDebug( "Cache miss for $directory captcha listing.\n" );
+               }
+
+               if ( !count( $files ) ) {
+                       // Remove this directory if empty so callers don't keep looking here
+                       $backend->clean( array( 'dir' => $directory ) );
+                       return false;
+               }
+
+               $info = $this->pickImageFromList( $directory, $files, $lockouts );
+               if ( !$info ) {
+                       wfDebug( "Could not find captcha in $directory.\n" );
+                       $wgMemc->delete( $key ); // files changed on disk?
                }
-               closedir( $dir );
-               return $pick;
+
+               return $info;
        }
 
        /**
-        * Count the number of files in a directory.
-        * @param $dirname
-        * @return int
+        * @param $directory string
+        * @param $files array
+        * @param $lockouts integer
+        * @return boolean
         */
-       function countFiles( $dirname ) {
-               $dir = opendir( $dirname );
-               $count = 0;
-               while ( false !== ( $entry = readdir( $dir ) ) ) {
-                       if ( $entry != '.' && $entry != '..' ) {
-                               $count++;
+       protected function pickImageFromList( $directory, array $files, &$lockouts ) {
+               global $wgMemc, $wgCaptchaDeleteOnSolve;
+
+               if ( !count( $files ) ) {
+                       return false; // none found
+               }
+
+               $backend  = $this->getBackend();
+               $place    = mt_rand( 0, count( $files ) - 1 ); // pick a random file
+               $misses   = 0; // number of files in listing that don't actually exist
+               for ( $j = 0; $j < count( $files ); $j++ ) {
+                       $entry = $files[( $place + $j ) % count( $files )];
+                       if ( preg_match( '/^image_([0-9a-f]+)_([0-9a-f]+)\\.png$/', $entry, $matches ) ) {
+                               if ( $wgCaptchaDeleteOnSolve ) { // captcha will be deleted when solved
+                                       $key = "fancycaptcha:filelock:{$backend->getWikiId()}:" . sha1( $entry );
+                                       // Try to claim this captcha for 10 minutes (for the user to solve)...
+                                       if ( ++$lockouts <= 10 && !$wgMemc->add( $key, '1', 600 ) ) {
+                                               continue; // could not acquire (skip it to avoid race conditions)
+                                       }
+                               }
+                               $fsFile = $backend->getLocalReference( array( 'src' => "$directory/$entry" ) );
+                               if ( !$fsFile || !$fsFile->exists() ) {
+                                       if ( ++$misses >= 5 ) { // too many files in the listing don't exist
+                                               break; // listing cache too stale? break out so it will be cleared
+                                       }
+                                       continue; // try next file
+                               }
+                               $size = getimagesize( $fsFile->getPath() );
+                               return array(
+                                       'salt'   => $matches[1],
+                                       'hash'   => $matches[2],
+                                       'width'  => $size[0],
+                                       'height' => $size[1],
+                                       'viewed' => false,
+                               );
                        }
                }
-               closedir( $dir );
-               return $count;
+
+               return false; // none found
        }
 
        function showImage() {
@@ -193,32 +292,47 @@ class FancyCaptcha extends SimpleCaptcha {
 
                        $salt = $info['salt'];
                        $hash = $info['hash'];
-                       $file = $this->imagePath( $salt, $hash );
-
-                       if ( file_exists( $file ) ) {
-                               global $IP;
-                               require_once "$IP/includes/StreamFile.php";
-                               header( "Cache-Control: private, s-maxage=0, max-age=3600" );
-                               StreamFile::stream( $file );
-                               return true;
-                       }
+
+                       return $this->getBackend()->streamFile( array(
+                               'src'     => $this->imagePath( $salt, $hash ),
+                               'headers' => array( "Cache-Control: private, s-maxage=0, max-age=3600" )
+                       ) )->isOK();
                }
+
                wfHttpError( 500, 'Internal Error', 'Requested bogus captcha image' );
                return false;
        }
 
-       function imagePath( $salt, $hash ) {
-               global $wgCaptchaDirectory, $wgCaptchaDirectoryLevels;
-               $file = $wgCaptchaDirectory;
-               $file .= DIRECTORY_SEPARATOR;
+       /**
+        * @param $salt string
+        * @param $hash string
+        * @return string
+        */
+       public function imagePath( $salt, $hash ) {
+               global $wgCaptchaDirectoryLevels;
+
+               $file = $this->getBackend()->getRootStoragePath() . '/captcha-render/';
                for ( $i = 0; $i < $wgCaptchaDirectoryLevels; $i++ ) {
-                       $file .= $hash { $i } ;
-                       $file .= DIRECTORY_SEPARATOR;
+                       $file .= $hash{ $i } . '/';
                }
                $file .= "image_{$salt}_{$hash}.png";
+
                return $file;
        }
 
+       /**
+        * @param $basename string
+        * @return Array (salt, hash)
+        * @throws MWException
+        */
+       public function hashFromImageName( $basename ) {
+               if ( preg_match( '/^image_([0-9a-f]+)_([0-9a-f]+)\\.png$/', $basename, $matches ) ) {
+                       return array( $matches[1], $matches[2] );
+               } else {
+                       throw new MWException( "Invalid filename '$basename'.\n" );
+               }
+       }
+
        /**
         * Show a message asking the user to enter a captcha on edit
         * The result will be treated as wiki text
@@ -231,7 +345,8 @@ class FancyCaptcha extends SimpleCaptcha {
                $text = wfMessage( $name )->text();
                # Obtain a more tailored message, if possible, otherwise, fall back to
                # the default for edits
-               return wfMessage( $name, $text )->isDisabled() ? wfMessage( 'fancycaptcha-edit' )->text() : $text;
+               return wfMessage( $name, $text )->isDisabled() ?
+                       wfMessage( 'fancycaptcha-edit' )->text() : $text;
        }
 
        /**
@@ -244,10 +359,9 @@ class FancyCaptcha extends SimpleCaptcha {
                $pass = parent::passCaptcha();
 
                if ( $pass && $wgCaptchaDeleteOnSolve ) {
-                       $filename = $this->imagePath( $info['salt'], $info['hash'] );
-                       if ( file_exists( $filename ) ) {
-                               unlink( $filename );
-                       }
+                       $this->getBackend()->quickDelete( array(
+                               'src' => $this->imagePath( $info['salt'], $info['hash'] )
+                       ) );
                }
 
                return $pass;
index 2b109c2a701123a28e930ea88477b90b4eb48afc..b6f45f205f05119ff640f9ef5b60d812f7b46528 100644 (file)
@@ -163,7 +163,7 @@ $messages['bcc'] = array(
        'fancycaptcha-edit' => 'په اصلاح کتن ای صفحه، لطفا کلماتی که ته جهلگی جعبه ظاهراند واردش کنیت ([[Special:Captcha/help|گیشتر اطلاعات]]):',
 );
 
-/** Belarusian (Taraškievica orthography) (‪беларуская (тарашкевіца)‬)
+/** Belarusian (Taraškievica orthography) (беларуская (тарашкевіца)‎)
  * @author EugeneZelenko
  * @author Jim-by
  * @author Red Winged Duck
@@ -317,7 +317,7 @@ Zum Schutz vor automatisiertem Spamming gib das folgende Wort in das Feld unten
        'fancycaptcha-sendemail' => 'Um gegen automatischen Spam vorzugehen, gib bitte die Wörter unten in das Feld ein ([[Special:Captcha/help|mehr Informationen]]):',
 );
 
-/** German (formal address) (‪Deutsch (Sie-Form)‬)
+/** German (formal address) (Deutsch (Sie-Form)‎)
  * @author Imre
  * @author MichaelFrey
  * @author Umherirrender
@@ -674,7 +674,7 @@ $messages['is'] = array(
        'fancycaptcha-addurl' => 'Breytingin þín inniheldur viðbætta ytri tengla.
 Til þess að hjálpa okkur verjast sjálfvirku auglýsingarusli, vinsamlegast sláðu inn orðin sem birtast hér fyrir neðan í reitinn ([[Special:Captcha/help|frekari upplýsingar]]):',
        'fancycaptcha-badlogin' => 'Til þess að hjálpa okkur að verjast gegn sjálfvirkum leyniorðaárásum, vinsamlegast sláðu inn orðin sem birtast hér fyrir neðan í reitinn ([[Special:Captcha/help|frekari upplýsingar]]):',
-       'fancycaptcha-createaccount' => 'Til þess að hjálpa okkur að verjast sjálfverkri stofnun aðganga, vinsamlegast sláðu inn orðin sem birtast hér fyrir neðan í reitinn ([[Special:Captcha/help|frekari upplýsingar]]):',
+       'fancycaptcha-createaccount' => 'Til þess að hjálpa okkur að verjast sjálfvirkri stofnun aðganga, vinsamlegast sláðu inn orðin sem birtast hér fyrir neðan í reitinn ([[Special:Captcha/help|frekari upplýsingar]]):',
        'fancycaptcha-create' => 'Til þess að búa til þessa síðu, vinsamlegast sláðu inn orðin sem birtast hér fyrir neðan í reitinn ([[Special:Captcha/help|frekari upplýsingar]]):',
        'fancycaptcha-edit' => 'Til þess að breyta þessari síðu, vinsamlegast sláðu inn orðin að neðan í reitinn ([[Special:Captcha/help|frekari upplýsingar]]):',
        'fancycaptcha-sendemail' => 'Til þess að hjálpa okkur að verjast sjálfvirkum auglýsingapósti, vinsamlegast sláðu inn orðin hér fyrir neðan í reitinn ([[Special:Captcha/help|frekari upplýsinngar]]):',
@@ -702,13 +702,13 @@ $messages['it'] = array(
  */
 $messages['ja'] = array(
        'fancycaptcha-desc' => 'Confirm Edit 用の装飾的な CAPTCHA ジェネレーター',
-       'fancycaptcha-addurl' => 'ã\81\82ã\81ªã\81\9fã\81®ç·¨é\9b\86ã\81§æ\96°ã\81\9fã\81ªå¤\96é\83¨ã\83ªã\83³ã\82¯ã\81\8c追å\8a ã\81\95ã\82\8cています。
-自動化スクリプトによるスパム行為防止のため、以下のボックスに表示される確認用の文字列を入力してください ([[Special:Captcha/help|詳細]]):',
-       'fancycaptcha-badlogin' => '自動化スクリプトによるパスワードクラック攻撃を防止するため、以下のボックスに表示される確認用の文字列を入力してください ([[Special:Captcha/help|詳細]]):',
-       'fancycaptcha-createaccount' => '自動化されたアカウント作成を防止するため、以下のボックスに表示される確認用の文字列を入力してください ([[Special:Captcha/help|詳細]]):',
-       'fancycaptcha-create' => 'ページを作成するには以下のボックスに表示される確認用の文字列を入力してください ([[Special:Captcha/help|詳細]]):',
-       'fancycaptcha-edit' => 'このページを編集するには以下のボックスに表示される確認用の文字列を入力してください ([[Special:Captcha/help|詳細]]):',
-       'fancycaptcha-sendemail' => 'ロボットによるスパムを防ぐため、以下のボックスに表示される確認用の文字列を入力してください ([[Special:Captcha/help|詳細]]):',
+       'fancycaptcha-addurl' => 'ã\81\82ã\81ªã\81\9fã\81¯æ\96°ã\81\97ã\81\84å¤\96é\83¨ã\83ªã\83³ã\82¯ã\82\92追å\8a ã\81\97ã\82\88ã\81\86ã\81¨ã\81\97ています。
+自動でのスパム攻撃を防ぐため、下記の確認用の文字列を欄に入力してください ([[Special:Captcha/help|詳細]]):',
+       'fancycaptcha-badlogin' => '自動でのパスワードクラック攻撃を防ぐため、下記の確認用の文字列を欄に入力してください ([[Special:Captcha/help|詳細]]):',
+       'fancycaptcha-createaccount' => 'アカウントの自動登録を防ぐため、下記の確認用の文字列を欄に入力してください ([[Special:Captcha/help|詳細]]):',
+       'fancycaptcha-create' => 'ページを新規作成するには、下記の確認用の文字列を欄に入力してください ([[Special:Captcha/help|詳細]]):',
+       'fancycaptcha-edit' => 'このページを編集するには、下記の確認用の文字列を欄に入力してください ([[Special:Captcha/help|詳細]]):',
+       'fancycaptcha-sendemail' => '自動でのスパム攻撃を防ぐため、下記の確認用の文字列を欄に入力してください ([[Special:Captcha/help|詳細]]):',
 );
 
 /** Jutish (jysk)
@@ -756,7 +756,7 @@ $messages['kaa'] = array(
 ko'rsetilgen so'zlerdi kiritin'([[{{ns:special}}:Captcha/help|ko'birek mag'lıwmat]]):",
 );
 
-/** Kazakh (Arabic script) (‫قازاقشا (تٴوتە)‬) */
+/** Kazakh (Arabic script) (قازاقشا (تٴوتە)‏) */
 $messages['kk-arab'] = array(
        'fancycaptcha-addurl' => 'تٷزەتۋٸڭٸزدە جاڭا سىرتقى سٸلتەمەلەر بار ەكەن. ٶزدٸك تٷردە «سپام» جاسالۋىنان قورعانۋ ٷشٸن,
 تٶمەندەگٸ كٶرسەتٸلگەن سٶزدەردٸ اۋماققا ەنگٸزٸڭٸز ([[{{ns:special}}:Captcha/help|كٶبٸرەك اقپارات]]):',
@@ -770,7 +770,7 @@ $messages['kk-arab'] = array(
 تٶمەندەگٸ كٶرسەتٸلگەن سٶزدەردٸ اۋماققا ەنگٸزٸڭٸز ([[{{ns:special}}:Captcha/help|كٶبٸرەك اقپارات]]):',
 );
 
-/** Kazakh (Cyrillic script) (‪қазақша (кирил)‬) */
+/** Kazakh (Cyrillic script) (қазақша (кирил)‎) */
 $messages['kk-cyrl'] = array(
        'fancycaptcha-addurl' => 'Түзетуіңізде жаңа сыртқы сілтемелер бар екен. Өздік түрде «спам» жасалуынан қорғану үшін,
 төмендегі көрсетілген сөздерді аумаққа енгізіңіз ([[{{ns:special}}:Captcha/help|көбірек ақпарат]]):',
@@ -784,7 +784,7 @@ $messages['kk-cyrl'] = array(
 төмендегі көрсетілген сөздерді аумаққа енгізіңіз ([[{{ns:special}}:Captcha/help|көбірек ақпарат]]):',
 );
 
-/** Kazakh (Latin script) (‪qazaqşa (latın)‬) */
+/** Kazakh (Latin script) (qazaqşa (latın)‎) */
 $messages['kk-latn'] = array(
        'fancycaptcha-addurl' => 'Tüzetwiñizde jaña sırtqı siltemeler bar eken. Özdik türde «spam» jasalwınan qorğanw üşin,
 tömendegi körsetilgen sözderdi awmaqqa engiziñiz ([[{{ns:special}}:Captcha/help|köbirek aqparat]]):',
@@ -819,8 +819,8 @@ $messages['km'] = array(
  */
 $messages['ko'] = array(
        'fancycaptcha-desc' => '편집 확인에 대한 공상 CAPTCHA(캡차) 생성기',
-       'fancycaptcha-addurl' => 'í\8e¸ì§\91ì\9d´ ì\83\88ë¡\9cì\9a´ ì\99¸ë¶\80 ë§\81í\81¬ë¥¼ í\8f¬í\95¨í\95\98ê³  있습니다.
-자동화된 스팸을 막기 위해 아래 상자의 단어를 적어주세요. ([[Special:Captcha/help|더 많은 정보]])',
+       'fancycaptcha-addurl' => 'í\8e¸ì§\91ì\97\90 ì\83\88ë¡\9cì\9a´ ë°\94ê¹¥ ë§\81í\81¬ê°\80 í\8f¬í\95¨ë\90\98ì\96´ 있습니다.
+자동화된 스팸을 막기 위해 아래 상자의 단어를 적어주세요 ([[Special:Captcha/help|더 많은 정보]]):',
        'fancycaptcha-badlogin' => '자동화된 비밀번호 깨기를 막기 위해서, 아래의 상자 안에 있는 낱말을 입력해주세요 ([[Special:Captcha/help|자세한 정보]]):',
        'fancycaptcha-createaccount' => '자동화된 계정 만들기를 막기 위해서, 아래의 상자 안에 있는 낱말을 입력해주세요 ([[Special:Captcha/help|자세한 정보]]):',
        'fancycaptcha-create' => '이 문서를 만드려면, 아래의 상자 안에 있는 낱말을 입력해주세요 ([[Special:Captcha/help|자세한 정보]]):',
@@ -983,7 +983,7 @@ Sabiex tipproteġi kontra spam awtomatiku, jekk jogħġbok solvi din is-somma se
        'fancycaptcha-sendemail' => 'Bħala prekawzjoni kontra l-ispam awtomatiku, jekk jogħġbok daħħal fil-kaxxa l-ittri li jidhru hawn taħt ([[Special:Captcha/help|aktar informazzjoni]]):',
 );
 
-/** Norwegian Bokmål (‪norsk (bokmål)‬)
+/** Norwegian Bokmål (norsk (bokmål)‎)
  * @author Harald Khan
  * @author Laaknor
  * @author Njardarlogar
@@ -1038,7 +1038,7 @@ Voer de woorden die hieronder verschijnen in het invoerveld in als bescherming t
        'fancycaptcha-sendemail' => 'Voer de woorden die hieronder verschijnen in het invoerveld in als bescherming tegen geautomatiseerde spam ([[Special:Captcha/help|meer informatie]]):',
 );
 
-/** ‪Nederlands (informeel)‬ (‪Nederlands (informeel)‬)
+/** Nederlands (informeel)‎ (Nederlands (informeel)‎)
  * @author Siebrand
  */
 $messages['nl-informal'] = array(
@@ -1046,7 +1046,7 @@ $messages['nl-informal'] = array(
 Voer de woorden die hieronder verschijnen in het invoerveld in als bescherming tegen automatische spam ([[Special:Captcha/help|meer informatie]]):',
 );
 
-/** Norwegian Nynorsk (‪norsk (nynorsk)‬)
+/** Norwegian Nynorsk (norsk (nynorsk)‎)
  * @author Harald Khan
  * @author Njardarlogar
  */
@@ -1129,8 +1129,8 @@ $messages['pnb'] = array(
  * @author Ahmed-Najib-Biabani-Ibrahimkhel
  */
 $messages['ps'] = array(
-       'fancycaptcha-create' => 'ددÛ\90 Ù\84پارÙ\87 Ú\86Û\90 Ù\8aÙ\88 Ù\85Ø® Ø¬Ù\88Ú\93 Ø´Ù\8aØ\8c Ù\85Ù\87رباÙ\86Ù\8a Ù\88Ú©Ú\93Û\8c Ù\84اÙ\86دÛ\90 Ù\88رکÚ\93 Ø´Ù\88Ù\8a ØªÙ\88رÙ\8a Ú\85Ù\86Ú«Ù\87 Ú\86Û\90 ØªØ§Ø³Ù\88 ØªÙ\87 Ú\9aکارÙ\8a Ù\87Ù\85اغسÛ\90 Ú©Ù¼ Ù\85Ù¼ Ù¾Ù\87 Ù\84اÙ\86دÙ\8aÙ\86Ù\8a Ú\86Ù\88کاټ Ú©Û\90 Ù\88Ù\84Ù\8aÚ©Û\8c
-([[Special:Captcha/help|نور مالومات]]):',
+       'fancycaptcha-create' => 'ددÛ\90 Ù\85Ø® Ø¯ Ø¬Ù\88Ú\93Ù\84Ù\88 Ù\84پارÙ\87Ø\8c Ù\84Ø·Ù\81اÙ\8b Ù\88رکÚ\93Ù\84 Ø´Ù\88Ù\8a ØªÙ\88رÙ\8a Ú\85Ù\86Ú«Ù\87 Ú\86Û\90 ØªØ§Ø³Ù\88 ØªÙ\87 Ú\9aکارÙ\8a Ù\87Ù\85اغسÛ\90 Ú©Ù¼ Ù\85Ù¼ Ù¾Ù\87 Ù\84اÙ\86دÙ\8aÙ\86Ù\8a Ú\86Ù\88کاټ Ú©Û\90 Ù\88Ù\84Ù\8aÚ©Û\8c ([[Special:Captcha/help|Ù\86Ù\88ر Ù\85اÙ\84Ù\88Ù\85ات]]):',
+       'fancycaptcha-edit' => 'ددې مخ د سمولو لپاره، لطفاً ورکړل شوي توري څنګه چې تاسې ته ښکاري هماغسې کټ مټ په لانديني چوکاټ کې وليکی ([[Special:Captcha/help|نور مالومات]]):',
 );
 
 /** Portuguese (português)
@@ -1305,7 +1305,7 @@ $messages['sq'] = array(
        'fancycaptcha-sendemail' => "Për t'u mbrojtur nga metoda automatike e gjetjes së fjalëkalimeve ju kërkojmë të vendosni fjalët e figurës në kuti ([[Special:Captcha/help|më shumë informacion]]):",
 );
 
-/** Serbian (Cyrillic script) (‪српски (ћирилица)‬)
+/** Serbian (Cyrillic script) (српски (ћирилица)‎)
  * @author Millosh
  * @author Rancher
  * @author Жељко Тодоровић
@@ -1322,7 +1322,7 @@ $messages['sr-ec'] = array(
        'fancycaptcha-sendemail' => 'У циљу заштите од непожељних порука, унесите речи са слике у поље испод ([[Special:Captcha/help|више информација]]):',
 );
 
-/** Serbian (Latin script) (‪srpski (latinica)‬)
+/** Serbian (Latin script) (srpski (latinica)‎)
  * @author Michaello
  * @author Жељко Тодоровић
  */
@@ -1574,7 +1574,7 @@ $messages['yue'] = array(
        'fancycaptcha-edit' => '要編輯呢一版,請響下面個盒度輸入下面嘅文字 ([[Special:Captcha/help|更多資訊]]):',
 );
 
-/** Simplified Chinese (‪中文(简体)‬)
+/** Simplified Chinese (中文(简体)‎)
  * @author Bencmq
  */
 $messages['zh-hans'] = array(
@@ -1586,7 +1586,7 @@ $messages['zh-hans'] = array(
        'fancycaptcha-sendemail' => '为防止不当程式进行破坏,请输入以下的文字([[Special:Captcha/help|相关资讯]]):',
 );
 
-/** Traditional Chinese (‪中文(繁體)‬)
+/** Traditional Chinese (中文(繁體)‎)
  * @author Horacewai2
  * @author Waihorace
  */
index 6de858a3f32c7e493eeaa8fe6e888dd74271c1a6..69e3be01235a990d69d309b65dfbdb8ad8383f45 100644 (file)
@@ -33,6 +33,12 @@ $dir = __DIR__;
 require_once $dir . '/ConfirmEdit.php';
 $wgCaptchaClass = 'FancyCaptcha';
 
+/**
+ * The name of a file backend ($wgFileBackends) to be used for storing files.
+ * Defaults to FSFileBackend using $wgCaptchaDirectory as a base path.
+ */
+$wgCaptchaFileBackend = '';
+
 global $wgCaptchaDirectory;
 $wgCaptchaDirectory = "$wgUploadDirectory/captcha"; // bad default :D
 
index 3133c643905d42ebbbe713f32dac6554ad5187a1..ca345e472e7d2d8b7d4c3cc96b3a56400c2223db 100644 (file)
@@ -115,7 +115,7 @@ $messages['ba'] = array(
 Мөхәррирләүгә кире ҡайтыу өсөн, браузерығыҙҙа кире ҡайтыу төймәһенә баҫығыҙ.',
 );
 
-/** Belarusian (Taraškievica orthography) (‪беларуская (тарашкевіца)‬)
+/** Belarusian (Taraškievica orthography) (беларуская (тарашкевіца)‎)
  * @author EugeneZelenko
  * @author Jim-by
  */
@@ -238,7 +238,7 @@ Sollte dich dieses Verfahren beim Vornehmen erwünschter Bearbeitungen behindern
 Die Schaltfläche „Zurück“ des Browsers führt zurück zum vorherigen Bearbeitungsfenster.',
 );
 
-/** German (formal address) (‪Deutsch (Sie-Form)‬)
+/** German (formal address) (Deutsch (Sie-Form)‎)
  * @author Imre
  * @author Umherirrender
  */
@@ -618,12 +618,13 @@ Fare clic sul pulsante 'indietro' del browser per tornare alla pagina di modific
  */
 $messages['ja'] = array(
        'questycaptcha-desc' => 'Confirm Edit 用の質問形式 CAPTCHA ジェネレーター',
-       'questycaptcha-addurl' => 'あなたの編集では新たな外部リンクが追加されています。自動で実行されるスパム行為防止のため、以下に表示される確認用の質問に回答してください ([[Special:Captcha/help|詳細]]):',
-       'questycaptcha-badlogin' => '自動化スクリプトによるパスワードクラック攻撃を防止するため、以下に表示される確認用の質問に回答してください ([[Special:Captcha/help|詳細]]):',
-       'questycaptcha-createaccount' => '自動化されたアカウント作成を防止するため、以下に表示される確認用の質問に回答してください ([[Special:Captcha/help|詳細]]):',
-       'questycaptcha-create' => 'ページを作成するには以下に表示される確認用の質問に回答してください ([[Special:Captcha/help|詳細]]):',
-       'questycaptcha-edit' => 'このページを編集するには以下に表示される確認用の質問に回答してください ([[Special:Captcha/help|詳細]]):',
-       'questycaptcha-sendemail' => 'ロボットによるスパムを防ぐため、以下に表示される確認用の質問に回答してください ([[Special:Captcha/help|詳細]]):',
+       'questycaptcha-addurl' => 'あなたは新しい外部リンクを追加しようとしています。
+自動でのスパム攻撃を防ぐため、下記の確認用の質問に回答してください ([[Special:Captcha/help|詳細]]):',
+       'questycaptcha-badlogin' => '自動でのパスワードクラック攻撃を防ぐため、下記の確認用の質問に回答してください ([[Special:Captcha/help|詳細]]):',
+       'questycaptcha-createaccount' => 'アカウントの自動登録を防ぐため、下記の確認用の質問に回答してください ([[Special:Captcha/help|詳細]]):',
+       'questycaptcha-create' => 'ページを新規作成するには、下記の確認用の質問に回答してください ([[Special:Captcha/help|詳細]]):',
+       'questycaptcha-edit' => 'このページを編集するには、下記の確認用の質問に回答してください ([[Special:Captcha/help|詳細]]):',
+       'questycaptcha-sendemail' => '自動でのスパム攻撃を防ぐため、下記の確認用の質問に回答してください ([[Special:Captcha/help|詳細]]):',
        'questycaptchahelp-text' => '一般からの投稿を受け付けるこのウィキのようなウェブサイトは、自動投稿ツールを使って多くのサイトにリンクを張ってまわるスパマーにより荒らされがちです。このようなスパムは除去できるものの、その作業は大変に面倒なものです。
 
 このため、このウィキではときどき、特に新しい外部リンクがページに追加されたときなどに、質問に答えていただくようお願いすることがあります。この作業は自動化が難しいため、スパマーなどのプログラムを用いた攻撃をほぼ阻止しつつ、大半の生身の人間による投稿を可能にします。
@@ -639,6 +640,8 @@ $messages['ja'] = array(
  */
 $messages['ko'] = array(
        'questycaptcha-desc' => '편집 확인에 대한 탐구적인 CAPCHA(캡차) 생성기',
+       'questycaptcha-addurl' => '편집에 새로운 바깥 링크가 포함되어 있습니다.
+자동화된 스팸을 막기 위해 아래 질문에 답해주세요 ([[Special:Captcha/help|더 많은 정보]]):',
        'questycaptcha-badlogin' => '자동화된 비밀번호 깨기를 방지하기 위해, 아래애 보이는 질문에 대답해주세요 ([[Special:Captcha/help|자세한 정보]]):',
 );
 
@@ -782,7 +785,7 @@ Jekk jogħġbok ikkuntatja lill-[[{{MediaWiki:Grouppage-sysop}}|amministraturi t
 Iklikkja fuq il-buttuna 'lura' tal-browżer tiegħek sabiex tirritorna għall-editur ta-paġna.",
 );
 
-/** Norwegian Bokmål (‪norsk (bokmål)‬)
+/** Norwegian Bokmål (norsk (bokmål)‎)
  * @author Nghtwlkr
  * @author Simny
  */
@@ -827,7 +830,7 @@ Vraag assistentie van de [[{{MediaWiki:Grouppage-sysop}}|sitebeheerders]] als di
 Klik op de knop 'terug' in uw browser om terug te gaan naar het tekstbewerkingsscherm.",
 );
 
-/** Norwegian Nynorsk (‪norsk (nynorsk)‬)
+/** Norwegian Nynorsk (norsk (nynorsk)‎)
  * @author Gunnernett
  */
 $messages['nn'] = array(
@@ -1066,14 +1069,14 @@ Ker je to opravilo težko avtomatizirati, bo s tem večini ljudi prispevanje dov
 Za vrnitev v urejevalnik izberite gumb »nazaj« v vašem brskalniku.',
 );
 
-/** Serbian (Cyrillic script) (‪српски (ћирилица)‬)
+/** Serbian (Cyrillic script) (српски (ћирилица)‎)
  * @author Rancher
  */
 $messages['sr-ec'] = array(
        'questycaptcha-desc' => 'Стварач сликовног кода за потврду уређивања',
 );
 
-/** Serbian (Latin script) (‪srpski (latinica)‬) */
+/** Serbian (Latin script) (srpski (latinica)‎) */
 $messages['sr-el'] = array(
        'questycaptcha-desc' => 'Stvarač slikovnog koda za potvrdu uređivanja',
 );
@@ -1218,7 +1221,7 @@ $messages['yi'] = array(
        'questycaptcha-create' => 'צו שאַפֿן דעם בלאַט, ביטע ענטפֿערט די פֿראַגע אונטן  ([[Special:Captcha/help|מער אינפֿארמאַציע]]):',
 );
 
-/** Simplified Chinese (‪中文(简体)‬) */
+/** Simplified Chinese (中文(简体)‎) */
 $messages['zh-hans'] = array(
        'questycaptcha-addurl' => '您的编辑内容中含有本网站以外的连结。为防止不当程式大量破坏,请回答以下的问题([[Special:Captcha/help|相关资讯]]):',
        'questycaptcha-badlogin' => '为防止不当程式破解密码,请回答以下的问题([[Special:Captcha/help|相关资讯]]):',
@@ -1228,7 +1231,7 @@ $messages['zh-hans'] = array(
        'questycaptcha-sendemail' => '为防止不当程式破解密码,请回答下列问题([[Special:Captcha/help|相关资讯]]):',
 );
 
-/** Traditional Chinese (‪中文(繁體)‬)
+/** Traditional Chinese (中文(繁體)‎)
  * @author Horacewai2
  * @author Waihorace
  */
index 4182f53dc128922f6a52052a1315e1cb7c25f054..2143ffe0ce7cb21c5b4d4a123d62d0aee4572ab2 100644 (file)
@@ -53,7 +53,7 @@ $messages['ast'] = array(
        'recaptcha-create' => "P'ayudar a protexenos escontra la creación de páxines automática, escribi les dos pallabres que se ven na caxella d'abaxo:",
 );
 
-/** Belarusian (Taraškievica orthography) (‪беларуская (тарашкевіца)‬)
+/** Belarusian (Taraškievica orthography) (беларуская (тарашкевіца)‎)
  * @author EugeneZelenko
  * @author Jim-by
  */
@@ -130,7 +130,7 @@ $messages['de'] = array(
        'recaptcha-create' => 'Zum Schutz gegen automatisierte Erstellung von Seiten gib bitte die beiden folgenden Wörter in das folgende Feld ein:',
 );
 
-/** German (formal address) (‪Deutsch (Sie-Form)‬)
+/** German (formal address) (Deutsch (Sie-Form)‎)
  * @author Kghbln
  */
 $messages['de-formal'] = array(
@@ -256,12 +256,12 @@ $messages['it'] = array(
  */
 $messages['ja'] = array(
        'recaptcha-desc' => 'Confirm Edit 用 reCAPTCHA モジュール',
-       'recaptcha-edit' => 'è\87ªå\8b\95ç·¨é\9b\86ã\82¹ã\83\91ã\83 ã\81\8bã\82\89ã\81®ä¿\9dè­·ã\81®ã\81\9fã\82\81ã\80\81ä¸\8bã\81®ç\94»å\83\8fã\81«è¡¨ç¤ºã\81\95ã\82\8cã\81¦ã\81\84ã\82\8b\81¤ã\81®å\8d\98èª\9eã\82\92å\85¥å\8a\9bã\81\97ã\81¦ã\81\8fã\81 ã\81\95ã\81\84ï¼\9a',
-       'recaptcha-addurl' => 'ã\81\82ã\81ªã\81\9fã\81®ç·¨é\9b\86ã\81¯æ\96°ã\81\97ã\81\84å¤\96é\83¨ã\83ªã\83³ã\82¯ã\82\92å\90«ã\82\93ã\81§ã\81\84ã\81¾ã\81\99ã\80\82è\87ªå\8b\95ã\82¹ã\83\91ã\83 ã\81\8bã\82\89ã\81®ä¿\9dè­·ã\81®ã\81\9fã\82\81ã\80\81ä¸\8bã\81®ç\94»å\83\8fã\81«è¡¨ç¤ºã\81\95ã\82\8cã\81¦ã\81\84ã\82\8b\81¤ã\81®å\8d\98èª\9eã\82\92å\85¥å\8a\9bã\81\97ã\81¦ã\81\8fã\81 ã\81\95ã\81\84ï¼\9a',
-       'recaptcha-badpass' => 'è\87ªå\8b\95ã\83\91ã\82¹ã\83¯ã\83¼ã\83\89ã\82¯ã\83©ã\83\83ã\82­ã\83³ã\82°ã\81\8bã\82\89ã\81®ä¿\9dè­·ã\81®ã\81\9fã\82\81ã\81«ã\80\81ä¸\8bã\81®ç\94»å\83\8fã\81«è¡¨ç¤ºã\81\95ã\82\8cã\81¦ã\81\84ã\82\8b\81¤ã\81®å\8d\98èª\9eã\82\92å\85¥å\8a\9bã\81\97ã\81¦ã\81\8fã\81 ã\81\95ã\81\84ï¼\9a',
-       'recaptcha-createaccount' => '自動アカウント登録からの保護のために、下の画像に表示されている2つの単語を入力してください:',
+       'recaptcha-edit' => 'è\87ªå\8b\95ç·¨é\9b\86ã\81®ã\82¹ã\83\91ã\83 æ\94»æ\92\83ã\82\92é\98²ã\81\90ã\81\9fã\82\81ã\80\81ä¸\8bã\81®ç\94»å\83\8fã\81«è¡¨ç¤ºã\81\95ã\82\8cã\81¦ã\81\84ã\82\8b 2 ã\81¤ã\81®å\8d\98èª\9eã\82\92å\85¥å\8a\9bã\81\97ã\81¦ã\81\8fã\81 ã\81\95ã\81\84:',
+       'recaptcha-addurl' => 'ã\81\82ã\81ªã\81\9fã\81¯æ\96°ã\81\97ã\81\84å¤\96é\83¨ã\83ªã\83³ã\82¯ã\82\92追å\8a ã\81\97ã\82\88ã\81\86ã\81¨ã\81\97ã\81¦ã\81\84ã\81¾ã\81\99ã\80\82è\87ªå\8b\95ã\81§ã\81®ã\82¹ã\83\91ã\83 æ\94»æ\92\83ã\82\92é\98²ã\81\90ã\81\9fã\82\81ã\80\81ä¸\8bã\81®ç\94»å\83\8fã\81«è¡¨ç¤ºã\81\95ã\82\8cã\81¦ã\81\84ã\82\8b 2 ã\81¤ã\81®å\8d\98èª\9eã\82\92å\85¥å\8a\9bã\81\97ã\81¦ã\81\8fã\81 ã\81\95ã\81\84:',
+       'recaptcha-badpass' => 'è\87ªå\8b\95ã\81§ã\81®ã\83\91ã\82¹ã\83¯ã\83¼ã\83\89ã\82¯ã\83©ã\83\83ã\82¯æ\94»æ\92\83ã\82\92é\98²ã\81\90ã\81\9fã\82\81ã\80\81ä¸\8bã\81®ç\94»å\83\8fã\81«è¡¨ç¤ºã\81\95ã\82\8cã\81¦ã\81\84ã\82\8b 2 ã\81¤ã\81®å\8d\98èª\9eã\82\92å\85¥å\8a\9bã\81\97ã\81¦ã\81\8fã\81 ã\81\95ã\81\84:',
+       'recaptcha-createaccount' => 'アカウントの自動登録を防ぐため、下の画像に表示されている 2 つの単語を入力してください:',
        'recaptcha-createaccount-fail' => '文字列が正しくない、または入力されていません。',
-       'recaptcha-create' => '自動ページ作成からの保護のために、下の画像に表示されている2つの単語を入力してください:',
+       'recaptcha-create' => 'ページの自動作成を防ぐため、下の画像に表示されている 2 つの単語を入力してください:',
 );
 
 /** Korean (한국어)
@@ -337,7 +337,7 @@ $messages['mt'] = array(
        'recaptcha-create' => "Sabiex tgħinna nipproteġu kontra l-ħolqien awtomatiku ta' paġni, jekk jogħġbok ikteb iż-żewġ kelmiet li tara fil-kaxxa t'hawn taħt:",
 );
 
-/** Norwegian Bokmål (‪norsk (bokmål)‬)
+/** Norwegian Bokmål (norsk (bokmål)‎)
  * @author Event
  */
 $messages['nb'] = array(
@@ -418,14 +418,14 @@ $messages['ru'] = array(
        'recaptcha-create' => 'В целях защиты от автоматического создания страниц, пожалуйста, введите два слова, которые вы видите ниже:',
 );
 
-/** Serbian (Cyrillic script) (‪српски (ћирилица)‬)
+/** Serbian (Cyrillic script) (српски (ћирилица)‎)
  * @author Rancher
  */
 $messages['sr-ec'] = array(
        'recaptcha-desc' => 'Модул reCAPTCHA за потврду уређивања',
 );
 
-/** Serbian (Latin script) (‪srpski (latinica)‬) */
+/** Serbian (Latin script) (srpski (latinica)‎) */
 $messages['sr-el'] = array(
        'recaptcha-desc' => 'Modul reCAPTCHA za potvrdu uređivanja',
 );
@@ -482,7 +482,7 @@ $messages['vi'] = array(
        'recaptcha-create' => 'Để giúp tránh việc tạo trang tự động, xin hãy gõ hai từ mà bạn nhìn vào ô dưới đây:',
 );
 
-/** Simplified Chinese (‪中文(简体)‬)
+/** Simplified Chinese (中文(简体)‎)
  * @author Hydra
  * @author Hzy980512
  * @author Onecountry
@@ -496,7 +496,7 @@ $messages['zh-hans'] = array(
        'recaptcha-create' => '为了避免垃圾用户自动创建页面,请键入下面框中的两个单词:',
 );
 
-/** Traditional Chinese (‪中文(繁體)‬) */
+/** Traditional Chinese (中文(繁體)‎) */
 $messages['zh-hant'] = array(
        'recaptcha-edit' => '要幫助保護免受垃圾郵件自動的編輯,請鍵入您在下面的框中看到這兩個詞:',
        'recaptcha-addurl' => '您的編輯包含新的外部鏈接。為了幫助防止自動垃圾郵件,請鍵入您在下面的框中看到這兩個詞:',
diff --git a/maintenance/GenerateFancyCaptchas.php b/maintenance/GenerateFancyCaptchas.php
new file mode 100644 (file)
index 0000000..e562075
--- /dev/null
@@ -0,0 +1,128 @@
+<?php
+/**
+ * Generate captchas using a python script and copy them into storage.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @author Aaron Schulz
+ * @ingroup Maintenance
+ */
+if ( getenv( 'MW_INSTALL_PATH' ) ) {
+       $IP = getenv( 'MW_INSTALL_PATH' );
+} else {
+       $IP = dirname(__FILE__).'/../../..';
+}
+
+require_once( "$IP/maintenance/Maintenance.php" );
+
+/**
+ * Maintenance script to change the password of a given user.
+ *
+ * @ingroup Maintenance
+ */
+class GenerateFancyCaptchas extends Maintenance {
+       public function __construct() {
+               parent::__construct();
+               // See captcha.py for argument usage
+               $this->addOption( "wordlist", 'A list of words', true, true );
+               $this->addOption( "font", "The font to use", true, true );
+               $this->addOption( "font-size", "The font size ", false, true );
+               $this->addOption( "blacklist", "A blacklist of words that should not be used", false, true );
+               $this->addOption( "fill", "Fill the captcha container to N files", true, true );
+               $this->addOption( "verbose", "Show debugging information" );
+               $this->mDescription = "Generate new captchas and move them into storage";
+       }
+
+       public function execute() {
+               global $wgCaptchaSecret, $wgCaptchaDirectoryLevels;
+
+               $instance = ConfirmEditHooks::getInstance();
+               if ( !( $instance instanceof FancyCaptcha ) ) {
+                       $this->error( "\$wgCaptchaClass is not FancyCaptcha.\n", 1 );
+               }
+               $backend = $instance->getBackend();
+
+               $countAct = $instance->estimateCaptchaCount();
+               $this->output( "Estimated number of captchas is $countAct.\n" );
+
+               $countGen = (int)$this->getOption( 'fill' ) - $countAct;
+               if ( $countGen <= 0 ) {
+                       $this->output( "No need to generate anymore captchas.\n" );
+                       return;
+               }
+
+               $tmpDir = wfTempDir() . '/mw-fancycaptcha-' . time() . '-' . wfRandomString( 6 );
+               if ( !wfMkdirParents( $tmpDir ) ) {
+                       $this->error( "Could not create temp directory.\n", 1 );
+               }
+
+               $e = null; // exception
+               try {
+                       $cmd = sprintf( "python %s --key %s --output %s --count %s --dirs %s",
+                               wfEscapeShellArg( __DIR__ . '/../captcha.py' ),
+                               wfEscapeShellArg( $wgCaptchaSecret ),
+                               wfEscapeShellArg( $tmpDir ),
+                               wfEscapeShellArg( $countGen ),
+                               wfEscapeShellArg( $wgCaptchaDirectoryLevels )
+                       );
+                       foreach ( array( 'wordlist', 'font', 'font-size', 'blacklist', 'verbose' ) as $par ) {
+                               if ( $this->hasOption( $par ) ) {
+                                       $cmd .= " --$par " . wfEscapeShellArg( $this->getOption( $par ) );
+                               }
+                       }
+
+                       $this->output( "Generating $countGen new captchas...\n" );
+                       $retVal = 1;
+                       wfShellExec( $cmd, $retVal );
+                       if ( $retVal != 0 ) {
+                               wfRecursiveRemoveDir( $tmpDir );
+                               $this->error( "Could not run generation script.\n", 1 );
+                       }
+
+                       $flags = FilesystemIterator::SKIP_DOTS;
+                       $iter = new RecursiveIteratorIterator(
+                               new RecursiveDirectoryIterator( $tmpDir, $flags ),
+                               RecursiveIteratorIterator::CHILD_FIRST // include dirs
+                       );
+
+                       $this->output( "Copying the new captchas to storage...\n" );
+                       foreach ( $iter as $fileInfo ) {
+                               if ( !$fileInfo->isFile() ) {
+                                       continue;
+                               }
+                               list( $salt, $hash ) = $instance->hashFromImageName( $fileInfo->getBasename() );
+                               $status = $backend->quickStore( array(
+                                       'src' => $fileInfo->getPathname(),
+                                       'dst' => $instance->imagePath( $salt, $hash )
+                               ) );
+                               if ( !$status->isOK() ) {
+                                       $this->error( "Could not save file '{$fileInfo->getPathname()}'.\n" );
+                               }
+                       }
+               } catch ( Exception $e ) {
+                       wfRecursiveRemoveDir( $tmpDir );
+                       throw $e;
+               }
+
+               $this->output( "Removing temporary files...\n" );
+               wfRecursiveRemoveDir( $tmpDir );
+               $this->output( "Done.\n" );
+       }
+}
+
+$maintClass = "GenerateFancyCaptchas";
+require_once( RUN_MAINTENANCE_IF_MAIN );