commit a01e7fe597b652a44fe3091d890db2a62b813481 Author: root Date: Wed Sep 27 17:53:26 2017 +0200 first commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1689d7a --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +*~ +*.kate-swp +.*.swp +node_modules/** diff --git a/.gitreview b/.gitreview new file mode 100644 index 0000000..718a35c --- /dev/null +++ b/.gitreview @@ -0,0 +1,6 @@ +[gerrit] +host=gerrit.wikimedia.org +port=29418 +project=mediawiki/extensions/Comments +track=1 +defaultrebase=0 diff --git a/.jshintignore b/.jshintignore new file mode 100644 index 0000000..3c3629e --- /dev/null +++ b/.jshintignore @@ -0,0 +1 @@ +node_modules diff --git a/.jshintrc b/.jshintrc new file mode 100644 index 0000000..04c3a97 --- /dev/null +++ b/.jshintrc @@ -0,0 +1,23 @@ +{ + // Enforcing + "bitwise": true, + "eqeqeq": true, + "freeze": true, + "latedef": "nofunc", + "noarg": true, + "nonew": true, + "undef": true, + "unused": true, + "strict": false, + + // Relaxing + "es5": false, + + // Environment + "browser": true, + "jquery": true, + + "globals": { + "mediaWiki": false + } +} diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..d8e5d08 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1 @@ +The development of this software is covered by a [Code of Conduct](https://www.mediawiki.org/wiki/Code_of_Conduct). diff --git a/Gruntfile.js b/Gruntfile.js new file mode 100644 index 0000000..36b6671 --- /dev/null +++ b/Gruntfile.js @@ -0,0 +1,30 @@ +/*jshint node:true */ +module.exports = function ( grunt ) { + grunt.loadNpmTasks( 'grunt-contrib-jshint' ); + grunt.loadNpmTasks( 'grunt-jsonlint' ); + grunt.loadNpmTasks( 'grunt-banana-checker' ); + + grunt.initConfig( { + jshint: { + options: { + jshintrc: true + }, + all: [ + '**/*.js', + '!node_modules/**' + ] + }, + banana: { + all: 'i18n/' + }, + jsonlint: { + all: [ + '**/*.json', + '!node_modules/**' + ] + } + } ); + + grunt.registerTask( 'test', [ 'jshint', 'jsonlint', 'banana' ] ); + grunt.registerTask( 'default', 'test' ); +}; diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 diff --git a/extension.json b/extension.json new file mode 100644 index 0000000..2e426ec --- /dev/null +++ b/extension.json @@ -0,0 +1,128 @@ +{ + "name": "Comments", + "version": "4.3.0 znilwiki", + "author": [ + "David Pean", + "Misza", + "Jack Phoenix", + "Adam Carter/UltrasonicNXT", + "Bernhard Linz" + ], + "license-name": "GPL-2.0+", + "url": "https://www.mediawiki.org/wiki/Extension:Comments", + "descriptionmsg": "comments-desc", + "type": "parserhook", + "GroupPermissions": { + "*": { + "comment": true + }, + "commentadmin": { + "commentadmin": true + }, + "autoconfirmed": { + "commentlinks": true + } + }, + "AvailableRights": [ + "comment", + "commentadmin", + "commentlinks" + ], + "SpecialPages": { + "CommentIgnoreList": "CommentIgnoreList" + }, + "LogTypes": [ + "comments" + ], + "FilterLogTypes": { + "comments": true + }, + "LogActionsHandlers": { + "comments/add": "CommentsLogFormatter", + "comments/delete": "LogFormatter" + }, + "APIModules": { + "commentblock": "CommentBlockAPI", + "commentdelete": "CommentDeleteAPI", + "commentlatestid": "CommentLatestIdAPI", + "commentlist": "CommentListAPI", + "commentsubmit": "CommentSubmitAPI", + "commentvote": "CommentVoteAPI" + }, + "MessagesDirs": { + "Comments": [ + "i18n" + ] + }, + "ExtensionMessagesFiles": { + "CommentsAliases": "includes/Comments.alias.php", + "CommentsMagic": "includes/Comments.i18n.magic.php", + "NumberOfCommentsMagic": "includes/Comments.i18n.magic.php" + }, + "AutoloadClasses": { + "Comment": "includes/Comment.class.php", + "CommentsPage": "includes/CommentsPage.class.php", + "CommentsOfTheDay": "includes/CommentsOfTheDay.class.php", + "CommentFunctions": "/includes/CommentFunctions.class.php", + "CommentIgnoreList": "includes/specials/SpecialCommentIgnoreList.php", + "CommentsLogFormatter": "includes/CommentsLogFormatter.class.php", + "CommentsHooks": "includes/Comments.hooks.php", + "NumberOfComments": "includes/NumberOfComments.class.php", + "CommentBlockAPI": "includes/api/CommentBlock.api.php", + "CommentDeleteAPI": "includes/api/CommentDelete.api.php", + "CommentLatestIdAPI": "includes/api/CommentLatestID.api.php", + "CommentListAPI": "includes/api/CommentList.api.php", + "CommentSubmitAPI": "includes/api/CommentSubmit.api.php", + "CommentVoteAPI": "includes/api/CommentVote.api.php" + }, + "ResourceModules": { + "ext.comments.css": { + "styles": "resources/css/Comments.css", + "position": "top" + }, + "ext.comments.js": { + "scripts": "resources/js/Comment.js", + "dependencies": [ "mediawiki.api" ], + "messages": [ + "comments-voted-label", + "comments-loading", + "comments-auto-refresher-pause", + "comments-auto-refresher-enable", + "comments-cancel-reply", + "comments-reply-to", + "comments-block-warning-anon", + "comments-block-warning-user", + "comments-delete-warning" + ] + } + }, + "ResourceFileModulePaths": { + "localBasePath": "", + "remoteExtPath": "Comments" + }, + "Hooks": { + "ParserFirstCallInit": [ + "CommentsHooks::onParserFirstCallInit", + "NumberOfComments::setupNumberOfCommentsPageParser", + "CommentsOfTheDay::registerTag" + ], + "LoadExtensionSchemaUpdates": [ + "CommentsHooks::onLoadExtensionSchemaUpdates" + ], + "RenameUserSQL": [ + "CommentsHooks::onRenameUserSQL" + ], + "MagicWordwgVariableIDs": [ + "NumberOfComments::registerNumberOfCommentsMagicWord" + ], + "ParserGetVariableValueSwitch": [ + "NumberOfComments::getNumberOfCommentsMagic" + ] + }, + "config": { + "CommentsDefaultAvatar": "http://www.shoutwiki.com/w/extensions/SocialProfile/avatars/default_ml.gif", + "CommentsSortDescending": false, + "CommentsInRecentChanges": false + }, + "manifest_version": 1 +} diff --git a/gitinfo.json b/gitinfo.json new file mode 100644 index 0000000..7e543e6 --- /dev/null +++ b/gitinfo.json @@ -0,0 +1 @@ +{"headSHA1": "608f7af40f3af53b83966063496e34d32655e49b\n", "head": "608f7af40f3af53b83966063496e34d32655e49b\n", "remoteURL": "https://gerrit.wikimedia.org/r/mediawiki/extensions/Comments", "branch": "608f7af40f3af53b83966063496e34d32655e49b\n", "headCommitDate": "1501709440"} \ No newline at end of file diff --git a/i18n/af.json b/i18n/af.json new file mode 100644 index 0000000..28a0ce2 --- /dev/null +++ b/i18n/af.json @@ -0,0 +1,15 @@ +{ + "@metadata": { + "authors": [ + "Naudefj" + ] + }, + "comments-comment": "Opmerking", + "comments-voted-label": "Gestem", + "comments-loading": "Laai...", + "comments-cancel-reply": "Kanselleer", + "comments-you": "U", + "comments-reply": "Antwoord", + "comments-ignore-cancel": "Kanselleer", + "comments-time-minutes": "{{PLURAL:$1|$1 minuut|$1 minute}}" +} diff --git a/i18n/as.json b/i18n/as.json new file mode 100644 index 0000000..1f97e56 --- /dev/null +++ b/i18n/as.json @@ -0,0 +1,28 @@ +{ + "@metadata": { + "authors": [ + "Bishnu Saikia" + ] + }, + "comments-comment": "মন্তব্য", + "comments-voted-label": "ভোট দিয়া হ’ল", + "comments-loading": "ল'ড হৈ আছে…", + "comments-cancel-reply": "বাতিল কৰক", + "comments-show-comment-link": "মন্তব্য দেখুৱাওক", + "comments-you": "আপুনি", + "comments-reply": "উত্তৰ", + "comments-post": "মন্তব্য প্ৰেৰণ কৰক", + "comments-submit": "আপোনাৰ মন্তব্য যোগ দিয়ক", + "comments-score-text": "নম্বৰ", + "comments-permalink": "স্থায়ী সংযোগ", + "comments-delete-link": "মন্তব্য বিলোপ কৰক", + "comments-ignore-unblock": "প্ৰতিবন্ধক উঠাই লওক", + "comments-ignore-cancel": "বাতিল কৰক", + "log-name-comments": "মন্তব্য অভিলেখ", + "comments-time-ago": "$1 আগেয়ে", + "comments-time-days": "{{PLURAL:$1|$1 দিন|$1 দিন}}", + "comments-time-hours": "{{PLURAL:$1|$১ ঘন্টা|$১ ঘন্টা}}", + "comments-time-minutes": "{{PLURAL:$1|$১ মিনিট|$১ মিনিট}}", + "comments-time-seconds": "{{PLURAL:$1|$১ ছেকেণ্ড |$১ ছেকেণ্ড}}", + "right-comment": "মন্তব্য জমা দিয়ক" +} diff --git a/i18n/ast.json b/i18n/ast.json new file mode 100644 index 0000000..3e835b3 --- /dev/null +++ b/i18n/ast.json @@ -0,0 +1,26 @@ +{ + "@metadata": { + "authors": [ + "Xuacu" + ] + }, + "comments-comment": "Comentariu", + "comments-desc": "Añade l'enganche del analizador <comments> que permite comentar nes páxines", + "comments-db-locked": "

Amestar comentarios

Nesti momentu la base de datos ta bloquiada por xeres rutinaries de caltenimientu, depués de les que volverá a la normalidá. Torna más sero.", + "comments-voted-label": "Votáu", + "comments-loading": "Cargando...", + "comments-auto-refresher-enable": "Activar actualización automática de comentarios", + "comments-auto-refresher-pause": "Posar l'actualizador automáticu de comentarios", + "comments-reply-to": "Responder a {{GENDER:$2|$1}}", + "comments-cancel-reply": "Encaboxar", + "comments-block-warning-anon": "¿Seguro que quies inorar permanentemente tolos comentarios d'esti usuariu anónimu (al traviés de la so dirección IP)?", + "comments-block-warning-user": "¿Seguro que quies inorar permanentemente tolos comentarios {{GENDER:$1|del usuariu|de la usuaria}} $1?", + "comments-delete-warning": "¿Seguro que quies desaniciar esti comentariu?", + "comments-sort-by-date": "Ordenar por fecha", + "comments-sort-by-score": "Ordenar por valoración", + "comments-show-comment-link": "Amosar comentariu", + "comments-manage-blocklist-link": "Alministrar llista de comentarios inoraos", + "comments-ignore-message": "Tas inorando al autor d'esti comentariu", + "comments-you": "Tu", + "comments-reply": "Responder" +} diff --git a/i18n/atj.json b/i18n/atj.json new file mode 100644 index 0000000..0a07635 --- /dev/null +++ b/i18n/atj.json @@ -0,0 +1,8 @@ +{ + "@metadata": { + "authors": [ + "Benoit Rochon" + ] + }, + "comments-anon-name": "Nama kiskeritakosiw ka ki masinahak" +} diff --git a/i18n/azb.json b/i18n/azb.json new file mode 100644 index 0000000..df977b2 --- /dev/null +++ b/i18n/azb.json @@ -0,0 +1,11 @@ +{ + "@metadata": { + "authors": [ + "පසිඳු කාවින්ද", + "Alp Er Tunqa" + ] + }, + "comments-cancel-reply": "وازگئچ", + "comments-score-text": "امتیاز", + "comments-ignore-cancel": "وازگئچ" +} diff --git a/i18n/ba.json b/i18n/ba.json new file mode 100644 index 0000000..ae1bc11 --- /dev/null +++ b/i18n/ba.json @@ -0,0 +1,30 @@ +{ + "@metadata": { + "authors": [ + "Ләйсән", + "Айбикә" + ] + }, + "comments-comment": "Аңлатма", + "comments-voted-label": "Тауыш бирҙе", + "comments-loading": "Тейәү", + "comments-reply-to": "{{GENDER:$2|ҡатнашыусыға}} $1 яуап бирергә", + "comments-cancel-reply": "Кире алырға", + "comments-block-warning-anon": "Был аноним ҡатнашыусының (IP-адресы аша килгән) комментарийҙарына әһәмиәт бирмәҫкә теләүегеҙҙе раҫлайһығыҙмы?", + "comments-block-warning-user": "$1 ҡатнашыусының комментарийҙарына әһәмиәт бирмәҫкә теләүегеҙҙе раҫлайһығыҙмы?", + "comments-delete-warning": "Был комментарийҙы ысынлап та юйырға теләйһегеҙме?", + "comments-sort-by-date": "Датаһы буйынса тәртипкә килтереү", + "comments-sort-by-score": "Балл һандары буйынса тәртипкә килтереү", + "comments-show-comment-link": "Аңлатманы күрһәтергә", + "comments-you": "Һеҙ", + "comments-reply": "Яуап бирергә", + "comments-not-allowed": "Һеҙ комментарийҙар ҡалдыра алмайһығыҙ", + "comments-post": "Һеҙҙең комментарий", + "comments-submit": "Комментарий өҫтәргә", + "comments-score-text": "Баһа", + "comments-permalink": "Даими һылтанма", + "comments-delete-link": "Комментарийҙы юйырға", + "comments-anon-name": "Аноним ҡатнашыусы", + "comments-links-are-forbidden": "Комментарийҙарҙа эске һылтанмалар күрһәтеү тыйыла!", + "comments-is-spam": "Комментарий тексы спам итеп ҡабул ителде." +} diff --git a/i18n/bcl.json b/i18n/bcl.json new file mode 100644 index 0000000..4b7c977 --- /dev/null +++ b/i18n/bcl.json @@ -0,0 +1,58 @@ +{ + "@metadata": { + "authors": [ + "Geopoet" + ] + }, + "comments-comment": "Komento", + "comments-desc": "Minadugang <comments> pangawil na parabangay na minatugot sa pagkomento nin mga pahina", + "comments-db-locked": "

Pagdudugang nin mga komento

An datos-sarayan sa ngunyan nakakandado para sa minsanang pagpapakarhay kan datos-sarayan, pagkatapos kaini ibabalik sa normal. Tabi man pakirikisa giraray aro-atyan!", + "comments-voted-label": "Nagboto na", + "comments-loading": "Ikinakarga...", + "comments-auto-refresher-enable": "Paganahon an awtomatikong pagpanumpayan nin komento", + "comments-auto-refresher-pause": "Iuntok nguna an awtomatikong pagpanumpayan nin komento", + "comments-reply-to": "Magsimbag sa", + "comments-cancel-reply": "Kanselaron", + "comments-block-warning-anon": "Segurado ka daw na muya mo na permanenteng pabayaan an gabos na mga komento na gikan sa dae pa nabibistong paragamit na ini (sa paagi kan saiyang estada nin IP)?", + "comments-block-warning-user": "Segurado ka daw na muya mo na permanenteng pabayaan an gabos na mga komento na gikan sa dae pa nabibistong paragamit na si $1?", + "comments-delete-warning": "Segurado ka daw na muya mong puraon ining komento?", + "comments-sort-by-date": "Salansanon sa paagi nin petsa", + "comments-sort-by-score": "Salansanon sa paagi nin iskor", + "comments-show-comment-link": "Ipahiling an komento", + "comments-manage-blocklist-link": "Manihooon an pinabayaang listahan", + "comments-ignore-message": "Saimong pinapabayaan an kagsurat kaining komento", + "comments-you": "Ika", + "comments-reply": "Kasimbagan", + "comments-login-required": "Ika dapat nakalaog na tanganing makadugang nin mga komento", + "comments-not-allowed": "Ika dae tinutugutan na magpaskil nin mga komento.", + "comments-post": "Ipaskil an komento", + "comments-submit": "Idugang an saimong komento", + "comments-score-text": "Iskor", + "comments-permalink": "Permanente-na-sugpon", + "comments-delete-link": "Puraon an komento", + "comments-anon-name": "Dai midbid na paragamit", + "comments-anon-message": "{{SITENAME}} maogmang minatugot sa gabos na mga komento. Kun ika habo na dae midbid, magparehistro o baya maglaog. Ini tabi libre.", + "comments-ignore-item": "$2 kan $3 (dae kubkubon)", + "comments-ignore-no-users": "Mayo nin mga paragamit na sa ngunyan pinagkubkob.", + "comments-ignore-remove-message": "Segurado ka na muya mo na dae na pagkubkubon an mga komento kan paragamit na si $1?", + "comments-ignore-unblock": "Dae pagkubkubon", + "comments-ignore-cancel": "Kanselaron", + "comments-ignore-title": "Listahan kan pinabayaang komento", + "commentignorelist": "Listahan kan pinabayaang komento", + "comments-no-comments-of-day": "Mayo nin mga komento kan aldaw.", + "log-name-comments": "Talaan nin mga komento", + "log-description-comments": "Ini sarong talaan nin mga komento.", + "logentry-comments-add": "$1 nagpaskil nin sarong baguhong komento kan $3", + "logentry-comments-delete": "$1 pinagpura an komento na #$4 kan $3", + "comments-time-ago": "$1 nakaagi", + "comments-time-days": "{{PLURAL:$1|sarong aldaw|$1 na mga aldaw}}", + "comments-time-hours": "{{PLURAL:$1|sarong oras|$1 na mga oras}}", + "comments-time-minutes": "{{PLURAL:$1|sarong minuto|$1 minutos}}", + "comments-time-seconds": "{{PLURAL:$1|sarong segundo|$1 segundos}}", + "log-show-hide-comments": "$1 talaan nin komento", + "group-commentadmin": "Mga administrador nin komento", + "group-commentadmin-member": "{{GENDER:$1|administrador in komento}}", + "grouppage-commentadmin": "{{ns:project}}:Mga administrador in Komento", + "right-comment": "Isumite an mga komento", + "right-commentadmin": "Administraron an mga pinagsumiteng mga komento nin paragamit" +} diff --git a/i18n/be-tarask.json b/i18n/be-tarask.json new file mode 100644 index 0000000..2620df0 --- /dev/null +++ b/i18n/be-tarask.json @@ -0,0 +1,58 @@ +{ + "@metadata": { + "authors": [ + "Wizardist", + "Red Winged Duck", + "Renessaince" + ] + }, + "comments-comment": "Камэнтары", + "comments-desc": "Дадае ў парсэр падтрымку <comments> для падтрымкі камэнтараў на старонках", + "comments-db-locked": "

Уключэньне камэнтаваньня

База зьвестак у гэты момант заблякаваная для апрацоўкі, пасьля якой усё будзе вернута як было. Калі ласка, завітайце пазьней!", + "comments-voted-label": "Прагаласавалі", + "comments-loading": "Загрузка...", + "comments-auto-refresher-enable": "Уключыць аўтаабнаўленьне камэнтараў", + "comments-auto-refresher-pause": "Прыпыніць аўтаабнаўленьне камэнтараў", + "comments-reply-to": "Адказаць {{GENDER:$2|удзельніку|удзельніцы}} $1", + "comments-cancel-reply": "Скасаваць", + "comments-block-warning-anon": "Ці вы ўпэўненыя, што жадаеце ігнараваць усе камэнтары ад гэтага ананіма (паводле IP-адрасу)?", + "comments-block-warning-user": "Ці вы ўпэўненыя, што жадаеце ігнараваць усе камэнтары ад удзельніка $1?", + "comments-delete-warning": "Вы ўпэўненыя, што жадаеце выдаліць гэты камэнтар?", + "comments-sort-by-date": "Сартаваць паводле даты", + "comments-sort-by-score": "Сартаваць паводле адзнакі", + "comments-show-comment-link": "Паказаць камэнтар", + "comments-manage-blocklist-link": "Кіраваньне сьпісам ігнараваньня", + "comments-ignore-message": "Вы ігнаруеце аўтара гэтага камэнтара", + "comments-you": "Вы", + "comments-reply": "Адказаць", + "comments-login-required": "Вы мусіце ўвайсьці, каб дасылаць камэнтары", + "comments-not-allowed": "Вам не дазволена дасылаць камэнтары.", + "comments-post": "Даслаць камэнтар", + "comments-submit": "Падзяліцеся камэнтарам", + "comments-score-text": "Адзнака", + "comments-permalink": "Сталая спасылка", + "comments-delete-link": "Выдаліць камэнтар", + "comments-anon-name": "Ананімны ўдзельнік", + "comments-anon-message": "{{SITENAME}} вітае ўсіх камэнтатараў. Калі вы не жадаеце хаваць сваю асобу, зарэгіструйцеся ці ўвайдзіце. Гэта бясплатна.", + "comments-ignore-item": "$2, $3 (разблякаваць)", + "comments-ignore-no-users": "Цяпер ніводны ўдзельнік не заблякаваны.", + "comments-ignore-remove-message": "Вы ўпэўненыя, што жадаеце зноў бачыць камэнтары $1?", + "comments-ignore-unblock": "Разблякаваць", + "comments-ignore-cancel": "Скасаваць", + "comments-ignore-title": "Сьпіс ігнараваных камэнтатараў", + "commentignorelist": "Сьпіс ігнараваных камэнтатараў", + "comments-no-comments-of-day": "Сёньня лепшых камэнтараў дня няма.", + "log-name-comments": "Журнал камэнтараў", + "log-description-comments": "Гэта журнал камэнтараў.", + "comments-time-ago": "$1 таму", + "comments-time-days": "$1 {{PLURAL:$1|дзень|дні|дзён}}", + "comments-time-hours": "$1 {{PLURAL:$1|гадзіну|гадзіны|гадзінаў}}", + "comments-time-minutes": "$1 {{PLURAL:$1|хвіліну|хвіліны|хвілінаў}}", + "comments-time-seconds": "$1 {{PLURAL:$1|сэкунду|сэкунды|сэкундаў}}", + "log-show-hide-comments": "$1 журнал камэнтараў", + "group-commentadmin": "Адміністратары камэнтараў", + "group-commentadmin-member": "{{GENDER:$1|адміністратар камэнтараў|адміністратарка камэнтараў}}", + "grouppage-commentadmin": "{{ns:project}}:Адміністратары камэнтараў", + "right-comment": "дасылаць камэнтары", + "right-commentadmin": "адміністраваць дасланыя камэнтары" +} diff --git a/i18n/bg.json b/i18n/bg.json new file mode 100644 index 0000000..93799a5 --- /dev/null +++ b/i18n/bg.json @@ -0,0 +1,15 @@ +{ + "@metadata": { + "authors": [ + "පසිඳු කාවින්ද", + "DCLXVI" + ] + }, + "comments-comment": "Коментар", + "comments-loading": "Зареждане...", + "comments-cancel-reply": "Отказване", + "comments-you": "Вие", + "comments-reply": "Отговор", + "comments-score-text": "Точки", + "comments-ignore-cancel": "Отказване" +} diff --git a/i18n/bn.json b/i18n/bn.json new file mode 100644 index 0000000..8b32e02 --- /dev/null +++ b/i18n/bn.json @@ -0,0 +1,19 @@ +{ + "@metadata": { + "authors": [ + "Bellayet", + "Aftab1995", + "Aftabuzzaman" + ] + }, + "comments-comment": "মন্তব্য", + "comments-loading": "লোডিং...", + "comments-reply-to": "প্রাপক {{GENDER:$2|$1}}", + "comments-cancel-reply": "বাতিল", + "comments-show-comment-link": "মন্তব্য দেখাও", + "comments-you": "আপনি", + "comments-reply": "উত্তর", + "comments-score-text": "স্কোর", + "comments-ignore-cancel": "বাতিল", + "comments-time-ago": "$1 আগে" +} diff --git a/i18n/br.json b/i18n/br.json new file mode 100644 index 0000000..6b5a584 --- /dev/null +++ b/i18n/br.json @@ -0,0 +1,52 @@ +{ + "@metadata": { + "authors": [ + "Fohanno", + "Fulup", + "Y-M D" + ] + }, + "comments-comment": "Evezhiadenn", + "comments-voted-label": "Votet", + "comments-loading": "O kargañ...", + "comments-reply-to": "Respont da {{GENDER:$2|$1}}", + "comments-cancel-reply": "Nullañ", + "comments-delete-warning": "Ha sur oc'h hoc'h e fell deoc'h dilemel an evezhiadenn-mañ ?", + "comments-sort-by-date": "Urzhiañ dre zeiziad", + "comments-sort-by-score": "Renkañ dre skor", + "comments-show-comment-link": "diskouez an evezhiadenn", + "comments-manage-blocklist-link": "Merañ ar roll dianavezout", + "comments-you": "C'hwi", + "comments-reply": "Respont", + "comments-login-required": "Ret eo deoc'h bezañ kevreet evit ouzhpennañ evezhiadennoù", + "comments-not-allowed": "N'oc'h ket aotreet da embann evezhiadennoù.", + "comments-post": "Lakaat un evezhiadenn", + "comments-submit": "Ouzhpennañ hoc'h evezhiadenn", + "comments-score-text": "Poentoù", + "comments-permalink": "Peurliamm", + "comments-delete-link": "Diverkañ an evezhiadenn", + "comments-anon-name": "Implijer dizanv", + "comments-links-are-forbidden": "Difennet eo lakaat liammoù diavaez en evezhiadennoù !", + "comments-ignore-item": "$2 war $3 (distankañ)", + "comments-ignore-no-users": "N'eus implijer stanket ebet evit bremañ.", + "comments-ignore-remove-message": "Ha sur oc'h e fell deoc'h distankañ evezhiadennoù an implijer $1 ?", + "comments-ignore-unblock": "Distankañ", + "comments-ignore-cancel": "Nullañ", + "log-name-comments": "Marilh an evezhiadennoù", + "log-description-comments": "Hemañ zo ur marilh evezhiadennoù.", + "logentry-comments-add": "$1 en deus embannet un evezhiadenn nevez war $3", + "logentry-comments-delete": "$1 en deus dilamet an evezhiadenn $4 war $3", + "comments-time-ago": "$1 zo", + "comments-time-months": "{{PLURAL:$1|ur miz|$1 miz}}", + "comments-time-days": "{{PLURAL:$1|un deiz|$1 deiz}}", + "comments-time-hours": "{{PLURAL:$1|un eur|$1 eur}}", + "comments-time-minutes": "{{PLURAL:$1|ur vunutenn|$1 munut}}", + "comments-time-seconds": "{{PLURAL:$1|un eiladenn|$1 eiladenn}}", + "log-show-hide-comments": "Marilh evezhiadennoù $1", + "group-commentadmin": "Merourien an evezhiadennoù", + "group-commentadmin-member": "{{GENDER:$1|merour|merourez}} an evezhiadennoù", + "grouppage-commentadmin": "{{ns:project}}:Merourien an evezhiadennoù", + "right-comment": "Kas an evezhiadennoù", + "right-commentadmin": "Merañ an evezhiadennoù kaset gant an implijerien", + "right-commentlinks": "Implijout liammoù diavaez en evezhiadennoù" +} diff --git a/i18n/bs.json b/i18n/bs.json new file mode 100644 index 0000000..0122f1b --- /dev/null +++ b/i18n/bs.json @@ -0,0 +1,8 @@ +{ + "@metadata": { + "authors": [ + "CERminator" + ] + }, + "comments-delete-warning": "Da li ste sigurni da želite obrisati ovaj komentar?" +} diff --git a/i18n/ca.json b/i18n/ca.json new file mode 100644 index 0000000..2bd36f6 --- /dev/null +++ b/i18n/ca.json @@ -0,0 +1,47 @@ +{ + "@metadata": { + "authors": [ + "Arnaugir", + "Pitort", + "Fitoschido", + "Ssola" + ] + }, + "comments-comment": "Comentari", + "comments-voted-label": "Votat", + "comments-loading": "Carregant...", + "comments-reply-to": "Respon a", + "comments-cancel-reply": "Cancel·la", + "comments-delete-warning": "Segur que voleu suprimir aquest comentari?", + "comments-sort-by-date": "Ordena per data", + "comments-sort-by-score": "Ordena per puntuació", + "comments-show-comment-link": "Mostra el comentari", + "comments-manage-blocklist-link": "Gestiona la llista d'ignorats", + "comments-ignore-message": "Estàs ignorant l'autor d'aquest comentari", + "comments-you": "Vostè", + "comments-reply": "Resposta", + "comments-login-required": "Has d'estar identificat per afegir comentaris", + "comments-not-allowed": "No teniu permís per enviar comentaris.", + "comments-post": "Publica un comentari", + "comments-submit": "Afegeix el teu comentari", + "comments-score-text": "Puntuació", + "comments-permalink": "enllaç permanent", + "comments-delete-link": "Suprimeix el comentari", + "comments-anon-name": "Usuari anònim", + "comments-ignore-no-users": "No hi ha cap usuari blocat.", + "comments-ignore-unblock": "Desbloca", + "comments-ignore-cancel": "Cancel·la", + "comments-ignore-title": "Llista d'ignorats dels comentaris", + "commentignorelist": "Llista d'ignorats dels comentaris", + "comments-no-comments-of-day": "No hi ha cap comentari del dia.", + "log-name-comments": "Registre de comentaris", + "log-description-comments": "Això és un registre de comentaris.", + "comments-time-ago": "fa $1", + "comments-time-days": "{{PLURAL:$1|un dia|$1 dies}}", + "comments-time-hours": "{{PLURAL:$1|una hora|$1 hores}}", + "comments-time-minutes": "{{PLURAL:$1|un minut|$1 minuts}}", + "comments-time-seconds": "{{PLURAL:$1|un segon|$1 segons}}", + "log-show-hide-comments": "Registre de comentaris de $1", + "group-commentadmin": "Administradors de comentaris", + "group-commentadmin-member": "{{GENDER:$1|adminsitrador|administradora}} de comentaris" +} diff --git a/i18n/ce.json b/i18n/ce.json new file mode 100644 index 0000000..5a4b7ff --- /dev/null +++ b/i18n/ce.json @@ -0,0 +1,27 @@ +{ + "@metadata": { + "authors": [ + "Умар" + ] + }, + "comments-comment": "Къамел", + "comments-voted-label": "Кхаж тесна", + "comments-loading": "Чуйолуш…", + "comments-auto-refresher-enable": "Латаде комментареш автоматически карладахар", + "comments-auto-refresher-pause": "Сацаде комментареш автоматически карладахар", + "comments-reply-to": "Жоп дала {{GENDER:$2|$1}}", + "comments-cancel-reply": "Цаоьшу", + "comments-sort-by-date": "Терхаца нисъе", + "comments-you": "Хьо", + "comments-reply": "Жоп далар", + "comments-post": "Дита къамел", + "comments-submit": "ТӀетоха хьай къамел", + "comments-score-text": "Мах хадор", + "comments-ignore-cancel": "Цаоьшу", + "comments-time-ago": "$1 юха", + "comments-time-months": "{{PLURAL:$1|цхьа бутт|$1 беттанаш}}", + "comments-time-days": "{{PLURAL:$1|де}}", + "comments-time-hours": "{{PLURAL:$1|сахьат}}", + "comments-time-minutes": "{{PLURAL:$1|$1 минот}}", + "comments-time-seconds": "{{PLURAL:$1|$1 секунд}}" +} diff --git a/i18n/cs.json b/i18n/cs.json new file mode 100644 index 0000000..699b633 --- /dev/null +++ b/i18n/cs.json @@ -0,0 +1,12 @@ +{ + "@metadata": { + "authors": [ + "Vks" + ] + }, + "comments-cancel-reply": "Zrušit", + "comments-ignore-unblock": "Odblokovat", + "log-name-comments": "Protokol o komentářích", + "comments-time-ago": "před $1", + "right-comment": "Odeslat komentář" +} diff --git a/i18n/cv.json b/i18n/cv.json new file mode 100644 index 0000000..1909da5 --- /dev/null +++ b/i18n/cv.json @@ -0,0 +1,8 @@ +{ + "@metadata": { + "authors": [ + "Chuvash2014" + ] + }, + "comments-you": "Эсир" +} diff --git a/i18n/cy.json b/i18n/cy.json new file mode 100644 index 0000000..ae80378 --- /dev/null +++ b/i18n/cy.json @@ -0,0 +1,16 @@ +{ + "@metadata": { + "authors": [ + "Lloffiwr", + "Robin Owain" + ] + }, + "comments-comment": "Sylw", + "comments-voted-label": "Wedi pleidleisio", + "comments-loading": "Wrthi'n llwytho...", + "comments-reply-to": "Ateb {{GENDER:$2|$1}}", + "comments-cancel-reply": "Diddymu", + "comments-delete-warning": "Ydych chi'n siwr eich bod am ddileu'r sylw hwn?", + "comments-sort-by-date": "Trefnu yn ôl dyddiad", + "comments-reply": "Ateb" +} diff --git a/i18n/da.json b/i18n/da.json new file mode 100644 index 0000000..61c1556 --- /dev/null +++ b/i18n/da.json @@ -0,0 +1,21 @@ +{ + "@metadata": { + "authors": [ + "Tjernobyl", + "Sarrus" + ] + }, + "comments-comment": "Kommentar", + "comments-loading": "Indlæser...", + "comments-cancel-reply": "Annuller", + "comments-sort-by-date": "Sorter efter dato", + "comments-show-comment-link": "Vis kommentar", + "comments-you": "Dig", + "comments-reply": "Svar", + "comments-submit": "Tilføj din kommentar", + "comments-score-text": "Point", + "comments-permalink": "Permanent henvisning", + "comments-delete-link": "Slet kommentar", + "comments-anon-name": "Anonym bruger", + "comments-ignore-cancel": "Annuller" +} diff --git a/i18n/de-formal.json b/i18n/de-formal.json new file mode 100644 index 0000000..3c5bfa3 --- /dev/null +++ b/i18n/de-formal.json @@ -0,0 +1,17 @@ +{ + "@metadata": { + "authors": [ + "Kghbln" + ] + }, + "comments-db-locked": "

Hinzufügen von Kommentaren

Die Datenbank ist momentan aufgrund routinemäßiger Wartungsarbeiten für den Schreibzugriff gesperrt. Bitte probieren Sie es später noch einmal.", + "comments-block-warning-anon": "Sind Sie sicher, dass Sie alle Kommentare dieses anonymen Benutzers (über seine IP-Adresse) dauerhaft ignorieren möchten?", + "comments-block-warning-user": "Sind Sie sicher, dass Sie alle Kommentare des Benutzers $1 dauerhaft ignorieren möchten?", + "comments-delete-warning": "Sind Sie sicher, dass Sie diesen Kommentar löschen möchten?", + "comments-ignore-message": "Sie ignorieren den Verfasser dieses Kommentars", + "comments-you": " Sie", + "comments-login-required": "Sie müssen angemeldet sein, um Kommentare hinzufügen zu können.", + "comments-not-allowed": "Sie sind nicht berechtigt Kommentare hinzuzufügen.", + "comments-anon-message": "{{SITENAME}} freut sich über alle Kommentare. Sofern Sie nicht anonym bleiben möchten, registrieren Sie sich bitte oder melden Sie sich an.", + "comments-ignore-remove-message": "Sind Sie sicher, dass Sie die Kommentare von Benutzer $1 wieder freigeben möchten?" +} diff --git a/i18n/de.json b/i18n/de.json new file mode 100644 index 0000000..5d7dc54 --- /dev/null +++ b/i18n/de.json @@ -0,0 +1,69 @@ +{ + "@metadata": { + "authors": [ + "Gerry", + "Kghbln", + "Metalhead64", + "Geitost" + ] + }, + "apihelp-commentlist-param-pagerPage": "Kommentarseitenzahl", + "apihelp-commentlist-param-showForm": "Zeigt das Kommentarformular", + "apihelp-commentsubmit-param-parentID": "Kommentarkennung des übergeordneten Kommentars", + "apihelp-commentsubmit-param-commentText": "Kommentartext", + "comments-comment": "Kommentar", + "comments-desc": "Ergänzt die Parsererweiterung <comments> zum Kommentieren von Seiten", + "comments-db-locked": "

Hinzufügen von Kommentaren

Die Datenbank ist momentan aufgrund routinemäßiger Wartungsarbeiten für den Schreibzugriff gesperrt. Bitte probiere es später noch einmal.", + "comments-voted-label": "Abgestimmt", + "comments-loading": "Lade …", + "comments-auto-refresher-enable": "Die automatische Aktualisierung der Kommentare aktivieren.", + "comments-auto-refresher-pause": "Die automatische Aktualisierung der Kommentare pausieren.", + "comments-reply-to": "Antworten auf {{GENDER:$2|$1}}", + "comments-cancel-reply": "Abbrechen", + "comments-block-warning-anon": "Bist du sicher, dass du alle Kommentare dieses anonymen Benutzers (über seine IP-Adresse) dauerhaft ignorieren möchtest?", + "comments-block-warning-user": "Bist du sicher, dass du alle Kommentare des Benutzers $1 dauerhaft ignorieren möchtest?", + "comments-delete-warning": "Bist du sicher, dass du diesen Kommentar löschen möchtest?", + "comments-sort-by-date": "Nach Datum sortieren", + "comments-sort-by-score": "Nach Punktzahl sortieren", + "comments-show-comment-link": "Kommentar anzeigen", + "comments-manage-blocklist-link": "Ignorierliste zu Kommentaren verwalten", + "comments-ignore-message": "Du ignorierst den Verfasser dieses Kommentars", + "comments-you": " Du", + "comments-reply": "Anworten", + "comments-login-required": "Du musst angemeldet sein, um Kommentare hinzufügen zu können.", + "comments-not-allowed": "Du bist nicht berechtigt Kommentare hinzuzufügen.", + "comments-post": "Kommentar speichern", + "comments-submit": "Kommentar hinzufügen", + "comments-score-text": "Punktzahl", + "comments-permalink": "Permanentlink", + "comments-delete-link": "Kommentar löschen", + "comments-anon-name": "Anonymer Benutzer", + "comments-anon-message": "{{SITENAME}} freut sich über alle Kommentare. Sofern du nicht anonym bleiben möchtest, registriere dich bitte oder melde dich an.", + "comments-links-are-forbidden": "Weblinks sind in Kommentaren verboten!", + "comments-is-spam": "Der eingegebene Kommentartext wurde als Spam interpretiert.", + "comments-ignore-item": "$2 am $3 (freigeben)", + "comments-ignore-no-users": "Momentan gibt es keine gesperrten Benutzer.", + "comments-ignore-remove-message": "Bist du sicher, dass du die Kommentare von Benutzer $1 wieder freigeben möchtest?", + "comments-ignore-unblock": "Freigeben", + "comments-ignore-cancel": "Abbrechen", + "comments-ignore-title": "Ignorierliste zu Kommentaren", + "commentignorelist": "Ignorierliste zu Kommentaren", + "comments-no-comments-of-day": "Es gibt keinen Kommentar des Tages.", + "log-name-comments": "Kommentar-Logbuch", + "log-description-comments": "Dies ist ein Logbuch von Kommentaren.", + "logentry-comments-add": "$1 hinterließ einen neuen Kommentar auf $3", + "logentry-comments-delete": "$1 löschte den Kommentar #$4 auf $3", + "comments-time-ago": "vor $1", + "comments-time-months": "{{PLURAL:$1|einem Monat|$1 Monaten}}", + "comments-time-days": "{{PLURAL:$1|einem Tag|$1 Tagen}}", + "comments-time-hours": "{{PLURAL:$1|einer Stunde|$1 Stunden}}", + "comments-time-minutes": "{{PLURAL:$1|einer Minute|$1 Minuten}}", + "comments-time-seconds": "{{PLURAL:$1|einer Sekunde|$1 Sekunden}}", + "log-show-hide-comments": "Kommentar-Logbuch $1", + "group-commentadmin": "Kommentaradministratoren", + "group-commentadmin-member": "{{GENDER:$1|Kommentaradministrator|Kommentaradministratorin}}", + "grouppage-commentadmin": "{{ns:project}}:Kommentaradministratoren", + "right-comment": "Kommentar abgeben", + "right-commentadmin": "Benutzerkommentare verwalten", + "right-commentlinks": "Weblinks in Kommentaren verwenden" +} diff --git a/i18n/diq.json b/i18n/diq.json new file mode 100644 index 0000000..7a241b7 --- /dev/null +++ b/i18n/diq.json @@ -0,0 +1,30 @@ +{ + "@metadata": { + "authors": [ + "Erdemaslancan", + "Gorizon", + "Mirzali", + "Marmase", + "Kumkumuk" + ] + }, + "comments-comment": "Mışewre", + "comments-voted-label": "Rey Bıdê", + "comments-loading": "Bar beno...", + "comments-reply-to": "Cewabê", + "comments-cancel-reply": "Bıtexelne", + "comments-show-comment-link": "Vatışi bıvin", + "comments-you": "Tı", + "comments-reply": "Cewab", + "comments-login-required": "Qandé vatış dayışi ronıştış icab keno", + "comments-post": "Mışewre bırışe", + "comments-submit": "Vatışa xo dekere de", + "comments-score-text": "Skor", + "comments-permalink": "Greyo Daimi", + "comments-delete-link": "Vatışi bestere", + "comments-anon-name": "Karbero bêname", + "comments-ignore-unblock": "bloqi hewad", + "comments-ignore-cancel": "Bıtexelne", + "log-name-comments": "Qeyda vatışan", + "comments-time-ago": "Verdê $1" +} diff --git a/i18n/dsb.json b/i18n/dsb.json new file mode 100644 index 0000000..2a57da8 --- /dev/null +++ b/i18n/dsb.json @@ -0,0 +1,61 @@ +{ + "@metadata": { + "authors": [ + "Michawiki" + ] + }, + "comments-comment": "Komentar", + "comments-desc": "Pśidawa parserowu kokulku <comments>, kótaraž zmóžnja komentěrowanje bokow.", + "comments-db-locked": "

Pśidawanje komentarow

Datowa banka jo tuchylu rutinowego wotwardowanja datoweje banki dla zastajone, pó kótaremž buźo zasej wšykno normalne. Pšosym wopytaj pózdźej hyšći raz!", + "comments-voted-label": "Wótgłosowany", + "comments-loading": "Zacytujo se...", + "comments-auto-refresher-enable": "Awtomatiske aktualizěrowanje komentarow zmóžniś", + "comments-auto-refresher-pause": "Awtomatiske aktualizěrowanje komentarow zastajiś", + "comments-reply-to": "Wótegroniś", + "comments-cancel-reply": "Pśetergnuś", + "comments-block-warning-anon": "Coš napšawdu wšykne komentary toś togo anonymnego wužywarja na pśecej ignorěrowaś (pśez jogo IP-adresu)?", + "comments-block-warning-user": "Coš napšawdu wšykne komentary wužywarja $1 na pśecej ignorěrowaś?", + "comments-delete-warning": "Coš toś ten komentar napšawdu lašowaś?", + "comments-sort-by-date": "Pó datumje sortěrowaś", + "comments-sort-by-score": "Pó licbje dypkow sortěrowaś", + "comments-show-comment-link": "Komentar pokazaś", + "comments-manage-blocklist-link": "Ignorěrowańsku lisćinu zastojaś", + "comments-ignore-message": "Ignorěrujoš awtora toś togo komentara", + "comments-you": "Ty", + "comments-reply": "Wótegroniś", + "comments-login-required": "Musyš se pśizjawiś, aby komentary pśidał", + "comments-not-allowed": "Njesmějoš žedne komentary pśidaś.", + "comments-post": "Komentar pósłaś", + "comments-submit": "Twój komentar pśidaś", + "comments-score-text": "Pógódnośenje", + "comments-permalink": "Trajny wótkaz", + "comments-delete-link": "Komentar lašowaś", + "comments-anon-name": "Anonymny wužywaŕ", + "comments-anon-message": "{{SITENAME}} wjaseli se wó wšych komentarach. Jolic njocoš anonymny byś, zregistrěruj se abo pśizjaw se. To jo dermo.", + "comments-links-are-forbidden": "Eksterne wótkaze su w komentarach zakazane!", + "comments-is-spam": "Wótpósłany komentarowy tekst jo se ako spam interpretěrował.", + "comments-ignore-item": "$2 $3 (wótblokěrowaś)", + "comments-ignore-no-users": "Tuchylu njejsu žedne wužywarje zablokowane.", + "comments-ignore-remove-message": "Coš napšawdu komentary wužywarja $1 wótblokěrowaś?", + "comments-ignore-unblock": "Wótblokěrowaś", + "comments-ignore-cancel": "Pśetergnuś", + "comments-ignore-title": "Ignorěrowańska lisćina komentarow", + "commentignorelist": "Ignorěrowańska lisćina komentarow", + "comments-no-comments-of-day": "Njedaju komentary dnja.", + "log-name-comments": "Komentarowy protokol", + "log-description-comments": "To jo komentarowy protokol.", + "logentry-comments-add": "$1 jo nowy komentar na $3 zawóstajił", + "logentry-comments-delete": "$1 jo komentar #$4 na $3 wulašował", + "comments-time-ago": "pśed $1", + "comments-time-days": "{{PLURAL:$1|jadnym dnjom|$1 dnjoma|$1 dnjami|}}", + "comments-time-hours": "{{PLURAL:$1|jadneju góźinu|$1 góźinoma|$1 góźinami}}", + "comments-time-minutes": "{{PLURAL:$1|jadneju minutu|$1 minutoma|$1 minutami}}", + "comments-time-seconds": "{{PLURAL:$1|jadneju sekundu|$1 sekundoma|$1 sekundami}}", + "log-show-hide-comments": "komentarowy protokol $1", + "group-commentadmin": "Komentarowe administratory", + "group-commentadmin-member": "{{GENDER:$1|komentarowy administrator|komentarowa administratorka}}", + "grouppage-commentadmin": "{{ns:project}}:Komentarowe administratory", + "right-comment": "Komentary wótpósłaś", + "right-commentadmin": "Wužywarske komentary zastojaś", + "right-commentlinks": "Eksterne wótkaze w komentarach wužywaś" +} diff --git a/i18n/el.json b/i18n/el.json new file mode 100644 index 0000000..fe5772c --- /dev/null +++ b/i18n/el.json @@ -0,0 +1,43 @@ +{ + "@metadata": { + "authors": [ + "Glavkos", + "ZaDiak", + "Protnet" + ] + }, + "comments-comment": "Σχόλιο", + "comments-voted-label": "Έχετε ψηφίσει", + "comments-loading": "Φόρτωση...", + "comments-auto-refresher-enable": "Ενεργοποίηση αυτόματης ανανέωσης σχολίων", + "comments-auto-refresher-pause": "Διακοπή αυτόματης ανανέωσης σχολίων", + "comments-reply-to": "Απάντηση σε {{GENDER:$2|$1}}", + "comments-cancel-reply": "Ακύρωση", + "comments-sort-by-date": "Ταξινόμηση κατά ημερομηνία", + "comments-sort-by-score": "Ταξινόμηση κατά βαθμολογία", + "comments-show-comment-link": "Προβολή σχολίου", + "comments-you": "Εσείς", + "comments-reply": "Απάντηση", + "comments-post": "Δημοσίευση σχολίου", + "comments-submit": "Προσθήκη του σχολίου σας", + "comments-score-text": "Βαθμολογία", + "comments-permalink": "Μόνιμος σύνδεσμος", + "comments-delete-link": "Διαγραφή σχολίου", + "comments-anon-name": "Ανώνυμος χρήστης", + "comments-ignore-unblock": "Άρση φραγής", + "comments-ignore-cancel": "Ακύρωση", + "comments-ignore-title": "Λίστα αγνόησης σχολίων", + "commentignorelist": "Λίστα αγνόησης σχολίων", + "log-name-comments": "Αρχείο καταγραφής σχολίων", + "log-description-comments": "Αυτό είναι ένα αρχείο καταγραφής σχολίων.", + "comments-time-ago": "πριν $1", + "comments-time-days": "{{PLURAL:$1|μια μέρα|$1 μέρες}}", + "comments-time-hours": "{{PLURAL:$1|μια ώρα|$1 ώρες}}", + "comments-time-minutes": "{{PLURAL:$1|ένα λεπτό|$1 λεπτά}}", + "comments-time-seconds": "{{PLURAL:$1|ένα δευτερόλεπτο|$1 δευτερόλεπτα}}", + "log-show-hide-comments": "$1 αρχείο καταγραφής σχολίων", + "group-commentadmin": "Διαχειριστές σχολίων", + "group-commentadmin-member": "{{GENDER:$1|διαχειριστής σχολίων|διαχειρίστρια σχολίων}}", + "grouppage-commentadmin": "{{ns:project}}:Διαχειριστές σχολίων", + "right-comment": "Καταχώρηση σχολίων" +} diff --git a/i18n/en.json b/i18n/en.json new file mode 100644 index 0000000..78e4940 --- /dev/null +++ b/i18n/en.json @@ -0,0 +1,87 @@ +{ + "@metadata": { + "authors": [ + "David Pean ", + "Mihir Thakkar " + ] + }, + "apihelp-commentblock-description": "The commentblock API allows blocking a user from the comment it originated from after filling out the following parameters: CommentID.", + "apihelp-commentblock-summary": "The commentblock API allows blocking a user from the comment it originated from after filling out the following parameters: CommentID.", + "apihelp-commentdelete-description": "The commentdelete API allows deleting a comment after filling out the following parameters: CommentID.", + "apihelp-commentdelete-summary": "The commentdelete API allows deleting a comment after filling out the following parameters: CommentID.", + "apihelp-commentlatestid-description": "The commentlatestID API allows to retrieve latest comment ID after filling out the following parameters: pageID", + "apihelp-commentlatestid-summary": "The commentlatestID API allows to retrieve latest comment ID after filling out the following parameters: pageID", + "apihelp-commentlist-description": "The commentlist API retrieves multiple comments and outputs them as a list after filling out the following parameters: pageID, order, pagerPage, and showForm.", + "apihelp-commentlist-summary": "The commentlist API retrieves multiple comments and outputs them as a list after filling out the following parameters: pageID, order, pagerPage, and showForm.", + "apihelp-commentsubmit-description": "The commentsubmit API allows to submit/post a comment after filling out the following parameters: pageID, parentID, commentText.", + "apihelp-commentsubmit-summary": "The commentsubmit API allows to submit/post a comment after filling out the following parameters: pageID, parentID, commentText.", + "apihelp-commentvote-description": "The commentvote API allows to vote on a comment after filling out the following parameters: commentID, voteValue.", + "apihelp-commentvote-summary": "The commentvote API allows to vote on a comment after filling out the following parameters: commentID, voteValue.", + "apihelp-commentblock-param-commentID": "Comment ID of the comment by user which is to be blocked", + "apihelp-commentdelete-param-commentID": "Comment ID of the comment to be deleted", + "apihelp-commentlatestid-param-pageID": "Page ID of the page on which latest comment is there", + "apihelp-commentlist-param-pageID": "Page ID of the page from which comment list is retrieved", + "apihelp-commentlist-param-order": "Defined whether comment list in ascending or descending order", + "apihelp-commentlist-param-pagerPage": "Comments page number", + "apihelp-commentlist-param-showForm": "Show comments form", + "apihelp-commentsubmit-param-pageID": "Page ID of the page on which comment is to be submitted", + "apihelp-commentsubmit-param-parentID": "Comment ID of the parent comment", + "apihelp-commentsubmit-param-commentText": "Comment Text", + "apihelp-commentvote-param-commentID": "Comment ID of the comment that is voted for", + "apihelp-commentvote-param-voteValue": "Vote value for the comment", + "comments-comment": "Comment", + "comments-desc": "Adds <comments> parser hook that allows commenting on pages", + "comments-db-locked": "

Adding comments

The database is currently locked for routine database maintenance, after which it will be back to normal. Please check back later!", + "comments-voted-label": "Voted", + "comments-loading": "Loading...", + "comments-auto-refresher-enable": "Enable comment auto-refresher", + "comments-auto-refresher-pause": "Pause comment auto-refresher", + "comments-reply-to": "Reply to {{GENDER:$2|$1}}", + "comments-cancel-reply": "Cancel", + "comments-block-warning-anon": "Are you sure you want to permanently ignore all comments from this anonymous user (via their IP address)?", + "comments-block-warning-user": "Are you sure you want to permanently ignore all comments from user $1?", + "comments-delete-warning": "Are you sure you want to delete this comment?", + "comments-sort-by-date": "Sort by date", + "comments-sort-by-score": "Sort by score", + "comments-show-comment-link": "Show comment", + "comments-manage-blocklist-link": "Manage ignore list", + "comments-ignore-message": "You are ignoring the author of this comment", + "comments-you": "You", + "comments-reply": "Reply", + "comments-login-required": "You must be logged in to add comments", + "comments-not-allowed": "You are not allowed to post comments.", + "comments-post": "Post comment", + "comments-submit": "Add your comment", + "comments-score-text": "Score", + "comments-permalink": "Permalink", + "comments-delete-link": "Delete comment", + "comments-anon-name": "Anonymous user", + "comments-anon-message": "{{SITENAME}} welcomes all comments. If you do not want to be anonymous, register or log in. It is free.", + "comments-links-are-forbidden": "External links in comments are forbidden!", + "comments-is-spam": "Submitted text of the comment was interpreted as spam.", + "comments-ignore-item": "$2 on $3 (unblock)", + "comments-ignore-no-users": "There are no users currently blocked.", + "comments-ignore-remove-message": "Are you sure you want to unblock user $1's comments?", + "comments-ignore-unblock": "Unblock", + "comments-ignore-cancel": "Cancel", + "comments-ignore-title": "Comment ignore list", + "commentignorelist": "Comment ignore list", + "comments-no-comments-of-day": "There are no comments of the day.", + "log-name-comments": "Comments log", + "log-description-comments": "This is a log of comments.", + "logentry-comments-add": "$1 posted a new comment on $3", + "logentry-comments-delete": "$1 deleted comment #$4 on $3", + "comments-time-ago": "$1 ago", + "comments-time-months": "{{PLURAL:$1|one month|$1 months}}", + "comments-time-days": "{{PLURAL:$1|one day|$1 days}}", + "comments-time-hours": "{{PLURAL:$1|one hour|$1 hours}}", + "comments-time-minutes": "{{PLURAL:$1|one minute|$1 minutes}}", + "comments-time-seconds": "{{PLURAL:$1|one second|$1 seconds}}", + "log-show-hide-comments": "$1 comment log", + "group-commentadmin": "Comment administrators", + "group-commentadmin-member": "{{GENDER:$1|comment administrator}}", + "grouppage-commentadmin": "{{ns:project}}:Comment administrators", + "right-comment": "Submit comments", + "right-commentadmin": "Administrate user-submitted comments", + "right-commentlinks": "Use external links in comments" +} diff --git a/i18n/eo.json b/i18n/eo.json new file mode 100644 index 0000000..70e229e --- /dev/null +++ b/i18n/eo.json @@ -0,0 +1,47 @@ +{ + "@metadata": { + "authors": [ + "Yekrats", + "Robin van der Vliet" + ] + }, + "comments-comment": "Komento", + "comments-voted-label": "Voĉdonita", + "comments-loading": "Ŝargante...", + "comments-reply-to": "Respondo al", + "comments-cancel-reply": "Nuligi", + "comments-sort-by-date": "Ordigi laŭ datoj", + "comments-sort-by-score": "Ordigi laŭ poentaro", + "comments-show-comment-link": "Montri komenton", + "comments-you": "Vi", + "comments-reply": "Respondi", + "comments-login-required": "Vi devas ensaluti por aldoni komentojn", + "comments-not-allowed": "Vi ne estas permesata por afiŝi komentojn.", + "comments-post": "Afiŝi komenton", + "comments-submit": "Aldoni vian komenton", + "comments-score-text": "Poentaro", + "comments-permalink": "Konstanta ligilo", + "comments-delete-link": "Forigi komenton", + "comments-anon-name": "Anonimulo", + "comments-anon-message": "{{SITENAME}} bonvenas ĉiujn komentojn. Se vi ne volas esti anonima, registriensaluti. Estas senpage.", + "comments-ignore-no-users": "Estas neniuj uzantoj nune forbaritaj.", + "comments-ignore-remove-message": "Ĉu vi certas ke vi volas malforbari komentojn de uzanto $1?", + "comments-ignore-unblock": "Malforbari", + "comments-ignore-cancel": "Nuligi", + "comments-ignore-title": "Ignor-listo de komentoj", + "commentignorelist": "Ignor-listo de komentoj", + "comments-no-comments-of-day": "Estas neniuj komentoj de la tago.", + "log-name-comments": "Protokolo pri komentoj", + "log-description-comments": "Jen protokolo de komentoj.", + "comments-time-ago": "antaŭ $1", + "comments-time-days": "{{PLURAL:$1|$1 tago|$1 tagoj}}", + "comments-time-hours": "{{PLURAL:$1|$1 horo|$1 horoj}}", + "comments-time-minutes": "{{PLURAL:$1|$1 minuto|$1 minutoj}}", + "comments-time-seconds": "{{PLURAL:$1|$1 sekundo|$1 sekundoj}}", + "log-show-hide-comments": "protokolo de komentoj $1", + "group-commentadmin": "Administrantoj de komentoj", + "group-commentadmin-member": "{{GENDER:$1|administranto de komentoj}}", + "grouppage-commentadmin": "{{ns:project}}:Administrantoj de komentoj", + "right-comment": "Publikigi komentojn", + "right-commentadmin": "Administri komentaron senditan de komentoj" +} diff --git a/i18n/es.json b/i18n/es.json new file mode 100644 index 0000000..8675d84 --- /dev/null +++ b/i18n/es.json @@ -0,0 +1,76 @@ +{ + "@metadata": { + "authors": [ + "AndreyWiki", + "Armando-Martin", + "Bernardom", + "Ciencia Al Poder", + "Fitoschido", + "Ihojose", + "Sporeunai", + "Frammm", + "Carlos Cristia", + "Macofe", + "Dgstranz" + ] + }, + "apihelp-commentvote-description": "La API commentvote permite votar un comentario tras proporcionar los parámetros siguientes: commentID, voteValue.", + "apihelp-commentblock-param-commentID": "Identificador del comentario del usuario que se bloqueará", + "apihelp-commentlist-param-pagerPage": "Número de la página de comentarios", + "apihelp-commentlist-param-showForm": "Mostrar el formulario de comentarios", + "comments-comment": "Comentario", + "comments-desc": "Añade el asociador analítico <comments> que permite hacer comentarios en las páginas", + "comments-db-locked": "

Agregar comentarios

En este momento la base de datos está bloqueada por tareas rutinarias de mantenimiento, luego de los cuales volverá a la normalidad. Regresa más tarde.", + "comments-voted-label": "Valorado", + "comments-loading": "Cargando...", + "comments-auto-refresher-enable": "Habilitar actualización automática de comentarios", + "comments-auto-refresher-pause": "Pausar actualización automática de comentarios", + "comments-reply-to": "Responder a {{GENDER:$2|$1}}", + "comments-cancel-reply": "Cancelar", + "comments-block-warning-anon": "¿Estás seguro que deseas ignorar permanentemente todos los comentarios de este usuario anónimo (a través de su dirección IP)?", + "comments-block-warning-user": "¿Estás seguro de que deseas ignorar permanentemente todos los comentarios {{GENDER:$1|del usuario|de la usuaria}} $1?", + "comments-delete-warning": "¿Estás seguro de que quieres eliminar este comentario?", + "comments-sort-by-date": "Ordenar por fecha", + "comments-sort-by-score": "Ordenar por valoración", + "comments-show-comment-link": "Mostrar comentario", + "comments-manage-blocklist-link": "Administrar lista de comentarios ignorados", + "comments-ignore-message": "Estás ignorando al autor de este comentario", + "comments-you": "Tú", + "comments-reply": "Responder", + "comments-login-required": "Debes iniciar sesión para agregar comentarios", + "comments-not-allowed": "No puedes publicar comentarios.", + "comments-post": "Publicar comentario", + "comments-submit": "Agrega tu comentario", + "comments-score-text": "Valoración", + "comments-permalink": "Enlace permanente", + "comments-delete-link": "Borrar comentario", + "comments-anon-name": "Usuario anónimo", + "comments-anon-message": "{{SITENAME}} valora todos los comentarios. Si no quieres ser un usuario anónimo, regístrate o inicia sesión. Es gratis.", + "comments-links-are-forbidden": "¡No está permitido poner enlaces externos en los comentarios!", + "comments-is-spam": "El texto enviado en el comentario ha sido interpretado como spam.", + "comments-ignore-item": "$2 el $3 (desbloquear)", + "comments-ignore-no-users": "No hay ningún usuario bloqueado.", + "comments-ignore-remove-message": "¿Estás seguro de que deseas desbloquear los comentarios de $1?", + "comments-ignore-unblock": "Desbloquear", + "comments-ignore-cancel": "Cancelar", + "comments-ignore-title": "Lista de comentarios ignorados", + "commentignorelist": "Lista de comentarios ignorados", + "comments-no-comments-of-day": "No hay ningún comentario del día.", + "log-name-comments": "Registro de comentarios", + "log-description-comments": "Este es un registro de los comentarios.", + "logentry-comments-add": "$1 publicó un comentario nuevo en $3", + "logentry-comments-delete": "$1 eliminó el comentario n.º $4 en $3", + "comments-time-ago": "hace $1", + "comments-time-months": "{{PLURAL:$1|un mes|$1 meses}}", + "comments-time-days": "{{PLURAL:$1|un día|$1 días}}", + "comments-time-hours": "{{PLURAL:$1|una hora|$1 horas}}", + "comments-time-minutes": "{{PLURAL:$1|un minuto|$1 minutos}}", + "comments-time-seconds": "{{PLURAL:$1|un segundo|$1 segundos}}", + "log-show-hide-comments": "$1 registro de comentarios", + "group-commentadmin": "Administradores de comentarios", + "group-commentadmin-member": "{{GENDER:$1|administrador de comentarios|administradora de comentarios|administrador de comentarios}}", + "grouppage-commentadmin": "{{ns:project}}:Administradores de comentarios", + "right-comment": "Enviar comentarios", + "right-commentadmin": "Administrar los comentarios enviados por los usuarios", + "right-commentlinks": "Usar enlaces externos en comentarios" +} diff --git a/i18n/et.json b/i18n/et.json new file mode 100644 index 0000000..eddcae6 --- /dev/null +++ b/i18n/et.json @@ -0,0 +1,48 @@ +{ + "@metadata": { + "authors": [ + "Avjoska", + "Pikne" + ] + }, + "comments-comment": "Kommenteeri", + "comments-loading": "Laadimine...", + "comments-reply-to": "Vasta kasutajale {{GENDER:$2|$1}}", + "comments-cancel-reply": "Loobu", + "comments-block-warning-anon": "Kas oled kindel, et soovid kõiki selle anonüümse kasutaja kommentaare jäädavalt eirata (IP-aadressi põhjal)?", + "comments-block-warning-user": "Kas oled kindel, et soovid kõiki kasutaja $1 kommentaare jäädavalt eirata?", + "comments-delete-warning": "Kas oled kindel, et tahad selle kommentaari kustutada?", + "comments-sort-by-date": "Järjesta kuupäeva järgi", + "comments-show-comment-link": "Näita kommentaari", + "comments-manage-blocklist-link": "Halda eiramisloendit", + "comments-ignore-message": "Sa eirad selle kommentaari autorit", + "comments-you": "Sina", + "comments-reply": "Vasta", + "comments-login-required": "Sa pead olema sisselogitud, et lisada kommentaare", + "comments-not-allowed": "Sul pole lubatud kommentaare postitada.", + "comments-post": "Saada kommentaar", + "comments-submit": "Lisa oma kommentaar", + "comments-permalink": "Püsilink", + "comments-delete-link": "Kustuta kommentaar", + "comments-anon-name": "Anonüümne kasutaja", + "comments-ignore-no-users": "Blokeeritud kasutajaid pole praegu.", + "comments-ignore-remove-message": "Kas oled kindel, et soovid kasutaja $1 kommentaaride blokeerimise tühistada?", + "comments-ignore-unblock": "Lõpeta blokeerimine", + "comments-ignore-cancel": "Loobu", + "comments-ignore-title": "Kommentaaride eiramisloend", + "commentignorelist": "Kommentaaride eiramisloend", + "comments-no-comments-of-day": "Päevakommentaarid puuduvad.", + "log-name-comments": "Kommentaarilogi", + "log-description-comments": "See on kommentaaride logi.", + "comments-time-ago": "$1 tagasi", + "comments-time-days": "{{PLURAL:$1|üks päev|$1 päeva}}", + "comments-time-hours": "{{PLURAL:$1|üks tund|$1 tundi}}", + "comments-time-minutes": "{{PLURAL:$1|üks minut|$1 minutit}}", + "comments-time-seconds": "{{PLURAL:$1|üks sekund|$1 sekundit}}", + "log-show-hide-comments": "$1 kommentaarilogi", + "group-commentadmin": "Kommentaariadministraatorid", + "group-commentadmin-member": "{{GENDER:$1|kommentaariadministraator}}", + "grouppage-commentadmin": "{{ns:project}}:Kommentaariadministraatorid", + "right-comment": "Saata kommentaare", + "right-commentadmin": "Hallata kasutajate saadetud kommentaare" +} diff --git a/i18n/eu.json b/i18n/eu.json new file mode 100644 index 0000000..4c7d151 --- /dev/null +++ b/i18n/eu.json @@ -0,0 +1,22 @@ +{ + "@metadata": { + "authors": [ + "Subi" + ] + }, + "comments-loading": "Kargatzen...", + "comments-cancel-reply": "Utzi", + "comments-delete-warning": "Ziur zaude iruzkin hau ezabatu nahi duzula?", + "comments-reply": "Erantzun", + "comments-submit": "Gehitu zure iruzkina", + "comments-delete-link": "Ezabatu iruzkina", + "comments-anon-name": "Erabiltzaile anonimoa", + "comments-ignore-cancel": "Utzi", + "comments-time-ago": "Duela $1", + "comments-time-months": "{{PLURAL:$1|hilabete bat|$1 hilabete}}", + "comments-time-days": "{{PLURAL:$1|egun bat|$1 egun}}", + "comments-time-hours": "{{PLURAL:$1|ordu bat|$1 ordu}}", + "comments-time-minutes": "{{PLURAL:$1|minutu bat|$1 minutu}}", + "comments-time-seconds": "{{PLURAL:$1|segundo bat|$1 segundo}}", + "right-comment": "Bidali iruzkinak" +} diff --git a/i18n/fa.json b/i18n/fa.json new file mode 100644 index 0000000..cc355c3 --- /dev/null +++ b/i18n/fa.json @@ -0,0 +1,71 @@ +{ + "@metadata": { + "authors": [ + "Alireza", + "Armin1392", + "Ebraminio", + "Mahdiz", + "Omidh", + "Reza1615", + "Taha", + "پاناروما", + "Rtemis", + "Alirezaaa" + ] + }, + "comments-comment": "نظر", + "comments-desc": "اضافه کردن <comments> قلاب تجزیه کننده که به نظر‌گذاری در صفحات اجازه می‌دهد", + "comments-db-locked": "

اضافه کردن نظرات

در حال حاضر پایگاه اطلاعاتی برای حفاظت پایگاه اطلاعاتی جاری فقل است، که پی از این به حالت عادی برخواهد گشت.لطفاً بعداً بررسي كنيد!", + "comments-voted-label": "رای", + "comments-loading": "در حال بارگذاری...", + "comments-auto-refresher-enable": "فعال کردن تازه‌کنندهٔ خودکار نظر", + "comments-auto-refresher-pause": "متوقف‌کردن تازه‌کنندهٔ خودکار نظر", + "comments-reply-to": "پاسخ به {{GENDER:$2|$1}}", + "comments-cancel-reply": "لغو", + "comments-block-warning-anon": "آیا مطمئن هستید که می‌خواهید همهٔ نظرات را از این کاربر ناشناش برای همیشه (از طریق آدرس آی‌پی شان) نادیده بگیرید؟", + "comments-block-warning-user": "آیا مطمئنید می‌خواهید همهٔ نظرات از کاربر $1 را برای همیشه نادیده بگیرید؟", + "comments-delete-warning": "آیا مطمئن هستید که می‌خواهید این نظر را حذف کنید؟", + "comments-sort-by-date": "مرتب سازی بر اساس تاریخ", + "comments-sort-by-score": "مرتب کردن بر اساس امتیاز", + "comments-show-comment-link": "نمایش نظرها", + "comments-manage-blocklist-link": "مدیریت فهرست چشم‌پوشی", + "comments-ignore-message": "شما از نویسندهٔ این نظر چشم‌پوشی می‌کنید", + "comments-you": "شما", + "comments-reply": "پاسخ دادن", + "comments-login-required": "برای نظردهی لازم است ابتدا وارد سامانه شوید", + "comments-not-allowed": "شما مجاز به ارسال نظر نیستید.", + "comments-post": "ارسال نظر", + "comments-submit": "اضافه کردن نظر شما", + "comments-score-text": "امتیاز", + "comments-permalink": "پیوند پایدار", + "comments-delete-link": "حذف نظر", + "comments-anon-name": "کاربر ناشناس", + "comments-anon-message": "{{SITENAME}} از همه نظرات استقبال می‌کند. اگر شما نمی‌خواهید به صورت ناشناس باشید، $1 ثبت نام کنید یا $2 وارد سامانه شوید.. این عمل رایگان است.", + "comments-links-are-forbidden": "اتصالات خارجی در نظرات ممنوع است!", + "comments-is-spam": " متن ارائه شدهٔ نظرات به عنوان اسپم ترجمه شده", + "comments-ignore-item": "$2 on $3 (unblock)", + "comments-ignore-no-users": "هیچ کاربری در حال حاضر بسته نشده است.", + "comments-ignore-remove-message": "آیا مطمئن هستید که می‌خواهید نظرات $1 کاربر را باز کنید؟", + "comments-ignore-unblock": "باز شود", + "comments-ignore-cancel": "لغو", + "comments-ignore-title": "فهرست نظرات نادیده گرفته شده", + "commentignorelist": "فهرست نظرات نادیده گرفته شده", + "comments-no-comments-of-day": "هیچ نظری از روز وجود ندارد.", + "log-name-comments": "سیاههٔ نظرات", + "log-description-comments": "این یک سیاههٔ نظرات است.", + "logentry-comments-add": "$1 نظری تازه در صفحهٔ $3 ارسال کرد", + "logentry-comments-delete": "$1 نظر #$4 را از صفحهٔ $3 حذف کرد", + "comments-time-ago": "$1 پیش", + "comments-time-months": "{{PLURAL:$1|۱ ماه|$1 ماه‌}}", + "comments-time-days": "{{PLURAL:$1|یک روز|$1 روز}}", + "comments-time-hours": "{{PLURAL:$1|یک ساعت|$1 ساعت}}", + "comments-time-minutes": "{{PLURAL:$1|یک دقیقه|$1 دقیقه}}", + "comments-time-seconds": "{{PLURAL:$1|یک ثانیه|$1 ثانیه}}", + "log-show-hide-comments": "سیاههٔ نظرات $1", + "group-commentadmin": "مدیران نظرات", + "group-commentadmin-member": "{{GENDER:$1|سرپرست نظرات}}", + "grouppage-commentadmin": "{{ns:project}}: سرپرستان نظرات", + "right-comment": "ارسال نظرات", + "right-commentadmin": "سرپرستی نظرات ارائه شدهٔ کاربران", + "right-commentlinks": "از اتصالات خارجی در نظرات استفاده کنید" +} diff --git a/i18n/fi.json b/i18n/fi.json new file mode 100644 index 0000000..34b8778 --- /dev/null +++ b/i18n/fi.json @@ -0,0 +1,59 @@ +{ + "@metadata": { + "authors": [ + "Crt", + "Jack Phoenix ", + "Nedergard", + "Nike", + "Pxos" + ] + }, + "comments-comment": "Kommentoi", + "comments-db-locked": "

Kommenttien lisääminen

Tietokanta on tällä hetkellä lukittu rutiinihuoltoa varten, jonka jälkeen se palautuu takaisin normaaliksi. Tule myöhemmin uudestaan!", + "comments-voted-label": "Äänestetty", + "comments-loading": "Ladataan...", + "comments-auto-refresher-enable": "Ota käyttöön kommenttien automaattinen päivitys", + "comments-auto-refresher-pause": "Pysäytä kommenttien automaattinen päivitys", + "comments-reply-to": "Vastaa käyttäjälle {{GENDER:$2|$1}}", + "comments-cancel-reply": "Peru", + "comments-block-warning-anon": "Oletko varma, että haluat lopullisesti jättää kaikki kommentit huomiotta tältä anonyymiltä käyttäjältä (IP-osoitteensa perusteella)?", + "comments-block-warning-user": "Oletko varma, että haluat lopullisesti jättää kaikki kommentit huomiotta käyttäjältä $1?", + "comments-delete-warning": "Oletko varma, että haluat poistaa tämän kommentin?", + "comments-sort-by-date": "Järjestä päivämäärän mukaan", + "comments-sort-by-score": "Järjestä pisteiden mukaan", + "comments-show-comment-link": "Näytä kommentti", + "comments-manage-blocklist-link": "Hallinnoi huomioimattomuuslistaa", + "comments-ignore-message": "Et huomioi tämän kommentin kirjoittajaa", + "comments-you": "Sinä", + "comments-reply": "Vastaa", + "comments-login-required": "Sinun tulee olla kirjautunut sisään voidaksesi lisätä kommentteja", + "comments-not-allowed": "Et voi lisätä kommentteja.", + "comments-post": "Lähetä kommentti", + "comments-submit": "Kommenttisi", + "comments-score-text": "Pistemäärä", + "comments-permalink": "Ikilinkki", + "comments-delete-link": "Poista kommentti", + "comments-anon-name": "Anonyymi käyttäjä", + "comments-anon-message": "{{SITENAME}} toivottaa tervetulleeksi kaikki kommentit. Jos et halua olla anonyymi, rekisteröidy tai kirjaudu sisään. Se on ilmaista.", + "comments-ignore-item": "$2; $3 (poista huomioimattomuuslistalta)", + "comments-ignore-no-users": "Sinulla ei ole yhtään käyttäjää huomioimattomuuslistallasi.", + "comments-ignore-remove-message": "Oletko varma, että haluat huomioida kommentit käyttäjältä $1?", + "comments-ignore-unblock": "Poista esto", + "comments-ignore-cancel": "Peruuta", + "comments-ignore-title": "Kommenttien huomioimattomuuslista", + "commentignorelist": "Kommenttien huomioimattomuuslista", + "comments-no-comments-of-day": "Ei päivän kommentteja.", + "log-name-comments": "Kommenttiloki", + "log-description-comments": "Tämä on loki kommenteista.", + "comments-time-ago": "$1 sitten", + "comments-time-days": "{{PLURAL:$1|yksi päivä|$1 päivää}}", + "comments-time-hours": "{{PLURAL:$1|tunti|$1 tuntia}}", + "comments-time-minutes": "{{PLURAL:$1|minuutti|$1 minuuttia}}", + "comments-time-seconds": "{{PLURAL:$1|sekunti|$1 sekuntia}}", + "log-show-hide-comments": "$1 kommenttiloki", + "group-commentadmin": "kommenttien ylläpitäjät", + "group-commentadmin-member": "{{GENDER:$1|kommenttien ylläpitäjä}}", + "grouppage-commentadmin": "{{ns:project}}:kommenttien ylläpitäjät", + "right-comment": "Lähettää kommentteja", + "right-commentadmin": "Hallinnoida käyttäjien lähettämiä kommentteja" +} diff --git a/i18n/fo.json b/i18n/fo.json new file mode 100644 index 0000000..074fbfb --- /dev/null +++ b/i18n/fo.json @@ -0,0 +1,23 @@ +{ + "@metadata": { + "authors": [ + "EileenSanda" + ] + }, + "comments-comment": "Viðmerk", + "comments-desc": "Leggur afturat <comments> parser-húk ið loyvir viðmerkingum á síðum", + "comments-voted-label": "Atkvøtt", + "comments-loading": "Innlesur...", + "comments-reply-to": "Svara", + "comments-cancel-reply": "Angra", + "comments-show-comment-link": "Vís viðmerking", + "comments-you": "Tú", + "comments-reply": "Svara", + "comments-anon-name": "Dulnevndur brúkari", + "comments-anon-message": "{{SITENAME}} vil gjarna hava viðmerkingar. Um tú ikki vilt vera dulnevnd/ur, so kanst tú skráseta teg ella rita inn. Tað er ókeypis.", + "comments-ignore-item": "$2 hin $3 (tak sperring burtur)", + "comments-time-ago": "$1 síðan", + "comments-time-days": "{{PLURAL:$1|ein dagur|$1 dagar}}", + "comments-time-hours": "{{PLURAL:$1|ein tími|$1 tímar}}", + "comments-time-minutes": "{{PLURAL:$1|ein minuttur|$1 minuttir}}" +} diff --git a/i18n/fr.json b/i18n/fr.json new file mode 100644 index 0000000..f7ba27b --- /dev/null +++ b/i18n/fr.json @@ -0,0 +1,93 @@ +{ + "@metadata": { + "authors": [ + "Crochet.david", + "Gomoko", + "Linedwell", + "0x010C", + "Tuxxic", + "Mattho69", + "Wladek92", + "Urhixidur" + ] + }, + "apihelp-commentblock-description": "L'API commentblock permet de bloquer un utilisateur à partir du commentaire dont elle est issue en fournissant les paramètres suivants: CommentID.", + "apihelp-commentblock-summary": "L’API commentblock permet de bloquer un utilisateur à partir d’un commentaire dont il est l’auteur, après le remplissage des paramètres suivants : CommentID", + "apihelp-commentdelete-description": "L'API commentdelete permet de supprimer un commentaire après avoir fourni les paramètres suivants: CommentID.", + "apihelp-commentdelete-summary": "L’API commentdelete permet de supprimer un commentaire après avoir saisi les paramètres suivants : CommentID.", + "apihelp-commentlatestid-description": "L'API commentlatestID permet de récupérer le dernier identifiant de commentaire (ID) après avoir fourni les paramètres suivants: pageID", + "apihelp-commentlatestid-summary": "L’API commentlatestID permet de récupérer le dernier ID de commentaire après avoir saisi les paramètres suivants : pageID", + "apihelp-commentlist-description": "L'API commentlist recherche les commentaires multiples et les affiche sous forme de liste après avoir fourni les paramètres suivants: pageID, order, pagerPage, and showForm.", + "apihelp-commentlist-summary": "L’API commentlist récupère de multiples commentaires et les ressort sous forme d’une liste, après avoir saisi les paramètres suivants : pageID, order, pagerPage, et showForm.", + "apihelp-commentsubmit-description": "L'API commentsubmit permet de soumettre/poster un commentaire après avoir fourni les paramètres suivants: pageID, parentID, commentText.", + "apihelp-commentsubmit-summary": "L’API commentsubmit permet de soumettre/publier un commentaire après avoir saisi les paramètres suivants : pageID, parentID, commentText.", + "apihelp-commentvote-description": "L'API commentvote permet de voter pour un commentaire après avoir fourni les paramètres suivants: commentID, voteValue.", + "apihelp-commentvote-summary": "L’API commentvote permet de voter sur un commentaire après avoir saisi les paramètres suivants : commentID, voteValue.", + "apihelp-commentblock-param-commentID": "Identificateur (ID) du commentaire par lequel l'utilisateur a été bloqué", + "apihelp-commentdelete-param-commentID": "Identificateur (ID) du commentaire à supprimer", + "apihelp-commentlatestid-param-pageID": "Identificateur (ID) de la page sur laquelle se trouve le dernier commentaire", + "apihelp-commentlist-param-pageID": "Identificateur (ID) de la page de où provient la liste de commentaires", + "apihelp-commentlist-param-order": "Défini si la liste de commentaires est dans l'ordre ascendant ou descendant", + "apihelp-commentlist-param-pagerPage": "Numéro de page du commentaire", + "apihelp-commentlist-param-showForm": "Afficher le formulaire de commentaire", + "apihelp-commentsubmit-param-pageID": "Identifiant (ID) de la page sur laquelle le commentaire est fait", + "apihelp-commentsubmit-param-parentID": "Identificateur (ID) du commentaire parent", + "apihelp-commentsubmit-param-commentText": "Texte du commentaire", + "apihelp-commentvote-param-commentID": "Identifiant (ID) du commentaire pour lequel on a voté", + "apihelp-commentvote-param-voteValue": "Valeur du vote pour le commentaire", + "comments-comment": "Commenter", + "comments-desc": "Ajoute une amorce d’analyse <comments> qui permet de commenter les pages", + "comments-db-locked": "

Ajouter des commentaires

La base de données est actuellement bloquée pour une maintenance de routine, elle sera ensuite de retour à la normale. Veuillez revenir plus tard !", + "comments-voted-label": "Voté", + "comments-loading": "Chargement...", + "comments-auto-refresher-enable": "Activer l'actualisation automatique des commentaires", + "comments-auto-refresher-pause": "Mettre en pause l'actualisation automatique des commentaires", + "comments-reply-to": "Répondre à {{GENDER:$2|$1}}", + "comments-cancel-reply": "Annuler", + "comments-block-warning-anon": "Êtes-vous sûr de vouloir ignorer de façon permanente tous les commentaires de cet utilisateur anonyme (via son adresse IP)?", + "comments-block-warning-user": "Êtes-vous sûr de vouloir ignorer de façon permanente tous les commentaires de l’utilisateur $1?", + "comments-delete-warning": "Êtes-vous sûr de vouloir supprimer ce commentaire?", + "comments-sort-by-date": "Trier par date", + "comments-sort-by-score": "Trier par pointage", + "comments-show-comment-link": "Voir commentaire", + "comments-manage-blocklist-link": "Gérer la liste des ignorés", + "comments-ignore-message": "Vous ignorez l’auteur de ce commentaire", + "comments-you": " Vous", + "comments-reply": "Répondre", + "comments-login-required": "Vous devez être connecté afin de pouvoir commenter", + "comments-not-allowed": "Vous n'êtes pas autorisé à publier de commentaire.", + "comments-post": "Publier le commentaire", + "comments-submit": "Ajouter votre commentaire", + "comments-score-text": "Pointage", + "comments-permalink": "Lien permanent", + "comments-delete-link": "Supprimer le commentaire", + "comments-anon-name": "Utilisateur anonyme", + "comments-anon-message": "{{SITENAME}} accueille tous les commentaires. Si vous ne voulez pas être anonyme, enregistrez-vous ou connectez-vous. C’est gratuit.", + "comments-links-are-forbidden": "Les liens externes dans les commentaires sont interdits !", + "comments-is-spam": "Le texte du commentaire soumis a été interprété comme pourriel.", + "comments-ignore-item": "$2 sur $3 (débloquer)", + "comments-ignore-no-users": "Il n’y a actuellement pas d’utilisateurs bloqués.", + "comments-ignore-remove-message": "Voulez-vous vraiment débloquer les commentaires de l’utilisateur $1 ?", + "comments-ignore-unblock": "Débloquer", + "comments-ignore-cancel": "Annuler", + "comments-ignore-title": "Liste des utilisateurs ignorés", + "commentignorelist": "Liste des utilisateurs dont les commentaires sont ignorés", + "comments-no-comments-of-day": "Il n’y a pas de commentaire du jour.", + "log-name-comments": "Historique des commentaires", + "log-description-comments": "Ceci est un journal de commentaires.", + "logentry-comments-add": "$1 a publié un nouveau commentaire sur $3", + "logentry-comments-delete": "$1 a supprimé le commentaire #$4 sur $3", + "comments-time-ago": "Il y a $1", + "comments-time-months": "{{PLURAL:$1|un mois|$1 mois}}", + "comments-time-days": "{{PLURAL:$1|un jour|$1 jours}}", + "comments-time-hours": "{{PLURAL:$1|une heure|$1 heures}}", + "comments-time-minutes": "{{PLURAL:$1|une minute|$1 minutes}}", + "comments-time-seconds": "{{PLURAL:$1|une seconde|$1 seconds}}", + "log-show-hide-comments": "$1 le journal des commentaires", + "group-commentadmin": "Administrateurs de commentaires", + "group-commentadmin-member": "{{GENDER:$1|administrateur de commentaires|administratrice de commentaires}}", + "grouppage-commentadmin": "{{ns:project}}:Administrateurs de commentaires", + "right-comment": "Publier les commentaires", + "right-commentadmin": "Administrer les commentaires soumis par les utilisateurs", + "right-commentlinks": "Utiliser les liens externes dans les commentaires" +} diff --git a/i18n/frp.json b/i18n/frp.json new file mode 100644 index 0000000..67fe389 --- /dev/null +++ b/i18n/frp.json @@ -0,0 +1,42 @@ +{ + "@metadata": { + "authors": [ + "ChrisPtDe" + ] + }, + "comments-comment": "Comentèro", + "comments-voted-label": "Votâ", + "comments-loading": "Chargement...", + "comments-reply-to": "Rèpondre a", + "comments-cancel-reply": "Anular", + "comments-sort-by-date": "Betar per dâta", + "comments-sort-by-score": "Betar per mârca", + "comments-show-comment-link": "Montrar lo comentèro", + "comments-you": "Vos", + "comments-reply": "Rèpondre", + "comments-post": "Mandar lo mèssâjo", + "comments-submit": "Apondre voutron comentèro", + "comments-score-text": "Mârca", + "comments-permalink": "Lim fixo", + "comments-delete-link": "Ôtar lo comentèro", + "comments-anon-name": "Utilisator anonimo", + "comments-ignore-item": "$2 sur $3 (dèblocar)", + "comments-ignore-no-users": "Ora y at gins d’utilisator blocâ.", + "comments-ignore-remove-message": "Voléd-vos franc dèblocar los comentèros de l’utilisator $1 ?", + "comments-ignore-unblock": "Dèblocar", + "comments-ignore-cancel": "Anular", + "comments-no-comments-of-day": "Y at gins de comentèro du jorn.", + "log-name-comments": "Jornal des comentèros", + "log-description-comments": "O est un jornal de comentèros.", + "comments-time-ago": "cen fât $1", + "comments-time-days": "{{PLURAL:$1|yon jorn|$1 jorns}}", + "comments-time-hours": "{{PLURAL:$1|yona hora|$1 hores}}", + "comments-time-minutes": "{{PLURAL:$1|yona menuta|$1 menutes}}", + "comments-time-seconds": "{{PLURAL:$1|yona seconda|$1 secondes}}", + "log-show-hide-comments": "$1 lo jornal des comentèros", + "group-commentadmin": "Administrators de comentèros", + "group-commentadmin-member": "administrat{{GENDER:$1|or|rice}} de comentèros", + "grouppage-commentadmin": "{{ns:project}}:Administrators de comentèros", + "right-comment": "Sometre des comentèros", + "right-commentadmin": "Administrar los comentèros somês per los utilisators" +} diff --git a/i18n/fy.json b/i18n/fy.json new file mode 100644 index 0000000..a0aa934 --- /dev/null +++ b/i18n/fy.json @@ -0,0 +1,16 @@ +{ + "@metadata": { + "authors": [ + "Kening Aldgilles", + "Robin0van0der0vliet" + ] + }, + "comments-cancel-reply": "Annulearje", + "comments-you": "Jo", + "comments-ignore-cancel": "Annulearje", + "comments-time-ago": "$1 lyn", + "comments-time-days": "{{PLURAL:$1|ien dei|$1 dagen}}", + "comments-time-hours": "{{PLURAL:$1|ien oere|$1 oere}}", + "comments-time-minutes": "{{PLURAL:$1|ien minút|$1 minuten}}", + "comments-time-seconds": "{{PLURAL:$1|ien sekonde|$1 sekonden}}" +} diff --git a/i18n/gl.json b/i18n/gl.json new file mode 100644 index 0000000..dcaaf80 --- /dev/null +++ b/i18n/gl.json @@ -0,0 +1,72 @@ +{ + "@metadata": { + "authors": [ + "Elisardojm", + "Toliño", + "Vivaelcelta" + ] + }, + "apihelp-commentblock-param-commentID": "Identificador do comentario do usuario que vai ser bloqueado", + "apihelp-commentdelete-param-commentID": "Identificador (ID) do comentario a borrar", + "apihelp-commentlist-param-pagerPage": "Número da páxina de comentarios", + "apihelp-commentlist-param-showForm": "Mostrar o formulario de comentarios", + "apihelp-commentsubmit-param-pageID": "Identificador (ID) da páxina na que se fai o comentario", + "apihelp-commentsubmit-param-parentID": "Identificador (ID) do comentario pai", + "apihelp-commentsubmit-param-commentText": "Texto do comentario", + "apihelp-commentvote-param-voteValue": "Valor do voto para o comentario", + "comments-comment": "Comentar", + "comments-desc": "Engade o asociador analítico <comments> que permite comentar nas páxinas", + "comments-db-locked": "

Engadir comentarios

A base de datos está pechada por razóns de mantemento, despois dos cales volverá á normalidade. Volva despois!", + "comments-voted-label": "Votado", + "comments-loading": "Cargando...", + "comments-auto-refresher-enable": "Activar a actualización automática dos comentarios", + "comments-auto-refresher-pause": "Deter a actualización automática dos comentarios", + "comments-reply-to": "Responder a {{GENDER:$2|$1}}", + "comments-cancel-reply": "Cancelar", + "comments-block-warning-anon": "Está seguro de querer ignorar permanentemente todos os comentarios deste usuario anónimo (mediante o seu enderezo IP)?", + "comments-block-warning-user": "Está seguro de querer ignorar permanentemente todos os comentarios do usuario $1?", + "comments-delete-warning": "Estás seguro de querer borrar este comentario?", + "comments-sort-by-date": "Ordenar por data", + "comments-sort-by-score": "Ordenar por puntuación", + "comments-show-comment-link": "Mostrar o comentario", + "comments-manage-blocklist-link": "Administrar a lista de ignorados", + "comments-ignore-message": "Está ignorando o autor deste comentario", + "comments-you": " Vostede", + "comments-reply": "Responder", + "comments-login-required": "Cómpre acceder ao sistema para engadir comentarios", + "comments-not-allowed": "Non ten os permisos necesarios para publicar comentarios.", + "comments-post": "Publicar o comentario", + "comments-submit": "Engada o seu comentario", + "comments-score-text": "Puntuación", + "comments-permalink": "Ligazón permanente", + "comments-delete-link": "Borrar o comentario", + "comments-anon-name": "Usuario anónimo", + "comments-anon-message": "{{SITENAME}} agradece todos os comentarios. Se non quere ser anónimo, rexístrese ou acceda ao sistema. É gratuíto.", + "comments-links-are-forbidden": "Están prohibidas as ligazóns externas nos comentarios!", + "comments-is-spam": "O texto enviado no comentario foi interpretado como publicidade.", + "comments-ignore-item": "$2 o $3 (desbloquear)", + "comments-ignore-no-users": "Actualmente non hai ningún usuario bloqueado.", + "comments-ignore-remove-message": "Está seguro de querer desbloquear os comentarios do usuario $1?", + "comments-ignore-unblock": "Desbloquear", + "comments-ignore-cancel": "Cancelar", + "comments-ignore-title": "Lista de comentarios ignorados", + "commentignorelist": "Lista de comentarios ignorados", + "comments-no-comments-of-day": "Non hai ningún comentario do día.", + "log-name-comments": "Rexistro de comentarios", + "log-description-comments": "Este é un rexistro de comentarios.", + "logentry-comments-add": "$1 deixou un novo comentario en \"$3\"", + "logentry-comments-delete": "$1 borrou o comentario nº$4 en \"$3\"", + "comments-time-ago": "hai $1", + "comments-time-months": "{{PLURAL:$1|un mes|$1 meses}}", + "comments-time-days": "{{PLURAL:$1|un día|$1 días}}", + "comments-time-hours": "{{PLURAL:$1|unha hora|$1 horas}}", + "comments-time-minutes": "{{PLURAL:$1|un minuto|$1 minutos}}", + "comments-time-seconds": "{{PLURAL:$1|un segundo|$1 segundos}}", + "log-show-hide-comments": "$1 o rexistro de comentarios", + "group-commentadmin": "Administradores de comentarios", + "group-commentadmin-member": "{{GENDER:$1|administrador|administradora}} de comentarios", + "grouppage-commentadmin": "{{ns:project}}:Administradores de comentarios", + "right-comment": "Enviar comentarios", + "right-commentadmin": "Administrar os comentarios enviados polos usuarios", + "right-commentlinks": "Usar ligazóns externas nos comentarios" +} diff --git a/i18n/he.json b/i18n/he.json new file mode 100644 index 0000000..936550f --- /dev/null +++ b/i18n/he.json @@ -0,0 +1,64 @@ +{ + "@metadata": { + "authors": [ + "Ofrahod", + "חיים", + "ערן", + "Amire80", + "Guycn2" + ] + }, + "comments-comment": "תגובה", + "comments-db-locked": "

הוספת הערות

מסד הנתונים נעול כעת עקב תחזוקה שגרתית במסד הנתונים, לאחר מכן האתר ישוב לקדמותו. אנא בדוק שנית במועד מאוחר יותר!", + "comments-voted-label": "הצבעה", + "comments-loading": "טוען...", + "comments-auto-refresher-enable": "אפשר רענון אוטומטי של תגובה", + "comments-auto-refresher-pause": "מנע רענון אוטומטי של תגובה", + "comments-reply-to": "להשיב ל{{GENDER:$2|$1}}", + "comments-cancel-reply": "ביטול", + "comments-block-warning-anon": "האם ברצונך באמת להתעלם לצמיתות מכל התגובות שנכתבות מכתובת ה־IP הזאת?", + "comments-block-warning-user": "האם ברצונך באמת להתעלם לצמיתות מכל התגובות של ה{{GENDER:$1|משתמש|משתמשת}} $1?", + "comments-delete-warning": "האם ברצונך באמת למחוק את התגובה הזאת?", + "comments-sort-by-date": "מיין לפי שם", + "comments-sort-by-score": "מיין לפי ציון", + "comments-show-comment-link": "הצג הערה", + "comments-manage-blocklist-link": "ניהול רשימת התעלמות", + "comments-ignore-message": "בחרת להתעלם מהמפרסם של התגובה הזאת", + "comments-you": "אתה", + "comments-reply": "השב", + "comments-login-required": "יש להיכנס לחשבון כדי להוסיף תגובות", + "comments-not-allowed": "אינך מורשה לפרסם תגובות.", + "comments-post": "פרסם תגובה", + "comments-submit": "הוסף את ההערה שלך", + "comments-score-text": "תוצאה", + "comments-permalink": "קישור קבוע", + "comments-delete-link": "מחק תגובה", + "comments-anon-name": "משתמש אנונימי", + "comments-anon-message": "אתר {{SITENAME}} מקבל בברכה את כל התגובות. אם אתם לא רוצים להיות אלמוניים, הירשמו או היכנסו לחשבון. זה בחינם.", + "comments-links-are-forbidden": "אין להוסיף קישורים חיצוניים בתגובות!", + "comments-is-spam": "טקסט מסוים בתגובה שלך זוהה כספאם.", + "comments-ignore-item": "$2 ב־$3 (ביטול חסימה)", + "comments-ignore-no-users": "אין משתמשים חסומים כרגע.", + "comments-ignore-remove-message": "האם ברצונך באמת לבטל את החסימה של התגובות של $1?", + "comments-ignore-unblock": "ביטול חסימה", + "comments-ignore-cancel": "ביטול", + "comments-ignore-title": "רשימת התעלמות בתגובות", + "commentignorelist": "רשימת התעלמות בתגובות", + "log-name-comments": "יומן ההערות", + "log-description-comments": "זהו יומן של התגובות.", + "logentry-comments-add": "$1 {{GENDER:$2|פרסם|פרסמה}} תגובה חדשה בדף $3", + "logentry-comments-delete": "$1 {{GENDER:$2|מחק|מחקה}} את התגובה #$4 בדף $3", + "comments-time-ago": "לפני $1", + "comments-time-months": "{{PLURAL:$1|חודש|חודשיים|$1 חודשים}}", + "comments-time-days": "{{PLURAL:$1|יום אחד|יומיים|$1 ימים}}", + "comments-time-hours": "{{PLURAL:$1|שעה אחת|שעתיים|$1 שעות}}", + "comments-time-minutes": "{{PLURAL:$1|דקה אחת|$1 דקות}}", + "comments-time-seconds": "{{PLURAL:$1|שנייה אחת|$1 שניות}}", + "log-show-hide-comments": "$1 יומן ההערות", + "group-commentadmin": "מנהלי תגובות", + "group-commentadmin-member": "{{GENDER:$1|מנהל|מנהלת}} תגובות", + "grouppage-commentadmin": "{{ns:project}}:מנהל תגובות", + "right-comment": "שליחת תגובות", + "right-commentadmin": "ניהול תגובות של משתמשים", + "right-commentlinks": "שימוש בקישורים חיצוניים בתגובות" +} diff --git a/i18n/hi.json b/i18n/hi.json new file mode 100644 index 0000000..1321ce2 --- /dev/null +++ b/i18n/hi.json @@ -0,0 +1,24 @@ +{ + "@metadata": { + "authors": [ + "Ansumang", + "Siddhartha Ghai", + "Vivek Rai", + "Smtchahal" + ] + }, + "comments-comment": "टिप्पणी", + "comments-loading": "लोड हो रहा है...", + "comments-reply-to": "{{GENDER:$2|$1}} को उत्तर दें", + "comments-cancel-reply": "रद्द करें", + "comments-show-comment-link": "टीप्पणी दिखाएँ", + "comments-you": "आप", + "comments-reply": "उत्तर दें", + "comments-post": "टिप्पणी पोस्ट करें", + "comments-submit": "अपनी टिप्पणी जोड़ें", + "comments-score-text": "अंक", + "comments-ignore-cancel": "रद्द करें", + "log-name-comments": "टिप्पणी लॉग", + "comments-time-ago": "$1 पहले", + "comments-time-months": "{{PLURAL:$1|एक महीना|$1 महीने}}" +} diff --git a/i18n/hr.json b/i18n/hr.json new file mode 100644 index 0000000..e451ede --- /dev/null +++ b/i18n/hr.json @@ -0,0 +1,8 @@ +{ + "@metadata": { + "authors": [ + "Bugoslav" + ] + }, + "comments-reply-to": "Odgovori {{GENDER:$2|suradniku $1|suradnici $1}}" +} diff --git a/i18n/hsb.json b/i18n/hsb.json new file mode 100644 index 0000000..215553f --- /dev/null +++ b/i18n/hsb.json @@ -0,0 +1,62 @@ +{ + "@metadata": { + "authors": [ + "Michawiki" + ] + }, + "comments-comment": "Komentar", + "comments-desc": "Přidawa parserowu hoku <comments>, kotraž komentowanje stronow zmóžnja.", + "comments-db-locked": "

Přidawanje komentarow

Datowa banka je tuchwilu rutinoweho wothladowanja datoweje banki dla zawrjena, po kotrymž budźe zaso wšitko normalne. Prošu spytaj pozdźišo hišće raz!", + "comments-voted-label": "Wothłosowany", + "comments-loading": "Začituje so...", + "comments-auto-refresher-enable": "Awtomatiske aktualizowanje komentarow zmóžnić", + "comments-auto-refresher-pause": "Awtomatiske aktualizowanje komentarow zastajić", + "comments-reply-to": "Wotmołwić", + "comments-cancel-reply": "Přetorhnyć", + "comments-block-warning-anon": "Chceš woprawdźe wšě komentary tutoho anonymneho wužiwarja na přeco ignorować (přez jeho IP-adresu)?", + "comments-block-warning-user": "Chceš woprawdźe wšě komentary wužiwarja $1 na přeco ignorować?", + "comments-delete-warning": "Chceće woprawdźe tutón komentar zhašeć?", + "comments-sort-by-date": "Po datumje sortěrować", + "comments-sort-by-score": "Po ličbje dypkow sortěrować", + "comments-show-comment-link": "Komentar pokazać", + "comments-manage-blocklist-link": "Ignorowansku lisćinu zrjadować", + "comments-ignore-message": "Ignoruješ awtora tutoho komentara", + "comments-you": "Ty", + "comments-reply": "Wotmołwić", + "comments-login-required": "Dyrbiš so přizjewić, zo by komentary přidał", + "comments-not-allowed": "Njesměš komentary pósłać.", + "comments-post": "Komentar spisać", + "comments-submit": "Twój komentar přidać", + "comments-score-text": "Ličba dypkow", + "comments-permalink": "Trajny wotkaz", + "comments-delete-link": "Komentar zhašeć", + "comments-anon-name": "Anonymny wužiwar", + "comments-anon-message": "{{SITENAME}} wjeseli so wo wšěch komentarach. Jeli nochceš anonymny być, registruj so abo přizjew so. To je zadarmo.", + "comments-links-are-forbidden": "Eksterne wotkazy su w komentarach zakazane!", + "comments-is-spam": "Wotpósłany komentarowy tekst je so jako spam interpretował.", + "comments-ignore-item": "$2 $3 (wotblokować)", + "comments-ignore-no-users": "Tuchwilu njejsu žani wužiwarjo zablokowani.", + "comments-ignore-remove-message": "Chceš woprawdźe komentary wužiwarja $1 wotblokować?", + "comments-ignore-unblock": "Wotblokować", + "comments-ignore-cancel": "Přetorhnyć", + "comments-ignore-title": "Ignorowanska lisćina komentarow", + "commentignorelist": "Ignorowanska lisćiny komentarow", + "comments-no-comments-of-day": "Komentary dnja njejsu.", + "log-name-comments": "Komentarowy protokol", + "log-description-comments": "To je komentarowy protokol.", + "logentry-comments-add": "$1 je nowy komentar na $3 zawostajił", + "logentry-comments-delete": "$1 je komentar #$4 na $3 zhašał", + "comments-time-ago": "před $1", + "comments-time-months": "{{PLURAL:$1|jednym měsacom|$1 měsacomaj|$1 měsacami}}", + "comments-time-days": "{{PLURAL:$1|$1 dnjom|$1 dnjomaj|$1 dnjemi|$1 dnjemi}}", + "comments-time-hours": "{{PLURAL:$1|$1 hodźinu|$1 hodźinomaj|$1 hodźinami|$1 hodźinami}}", + "comments-time-minutes": "{{PLURAL:$1|$1 mjeńšinu|$1 mjeńšinomaj|$1 mjeńšinami|$1 mjeńšinami}}", + "comments-time-seconds": "{{PLURAL:$1|$1 sekundu|$1 sekundomaj|$1 sekundami|$1 sekundami}}", + "log-show-hide-comments": "komentarowy protokol $1", + "group-commentadmin": "Komentarowi administratorojo", + "group-commentadmin-member": "{{GENDER:$1|komentarowy administrator|komentarowa administratorka}}", + "grouppage-commentadmin": "{{ns:project}}:Komentarowi administratorojo", + "right-comment": "Komentary wotpósłać", + "right-commentadmin": "Wužiwarske komentary zrjadować", + "right-commentlinks": "Eksterne wotkazy w komentarach wužiwać" +} diff --git a/i18n/hu.json b/i18n/hu.json new file mode 100644 index 0000000..3c66afe --- /dev/null +++ b/i18n/hu.json @@ -0,0 +1,59 @@ +{ + "@metadata": { + "authors": [ + "Dj", + "Wolf Rex" + ] + }, + "comments-comment": "Megjegyzés", + "comments-desc": "Hozzáadja a <comments> tag-et, és lehetőséget biztosít megjegyzéseket fűzni a lapokhoz", + "comments-db-locked": "

Megjegyzések hozzáadása

Az adatbázis jelenleg rutin karbantartás miatt zárolt, amely után ismét normál állapotba került. Kérlek próbáld meg később!", + "comments-voted-label": "Szavazott", + "comments-loading": "Betöltés…", + "comments-auto-refresher-enable": "Automatikus megjegyzés frissítő engedélyezése", + "comments-auto-refresher-pause": "Automatikus megjegyzés frissítő felfüggesztése", + "comments-reply-to": "Válasz", + "comments-cancel-reply": "Mégse", + "comments-block-warning-anon": "Biztos, hogy véglegesen figyelmen kívül hagyod ezen névtelen szerkesztő valamennyi megjegyzéseit (az IP-címe alapján)?", + "comments-block-warning-user": "Biztos, hogy véglegesen figyelmen kívül hagyod $1 valamennyi megjegyzését?", + "comments-delete-warning": "Biztos, hogy törölni akarod ezt a megjegyzést?", + "comments-sort-by-date": "Rendezés dátum szerint", + "comments-sort-by-score": "Rendezés pont szerint", + "comments-show-comment-link": "Hozzászólás megjelenítése", + "comments-manage-blocklist-link": "Figyelmen kívül hagyott megjegyzések kezelése", + "comments-ignore-message": "Figyelmen kívül hagyod ezen szerző megjegyzéseit", + "comments-you": "Te", + "comments-reply": "Válasz", + "comments-login-required": "Megjegyzés írásához be kell jelentkezned", + "comments-not-allowed": "Nincs jogosultságod megjegyzés írásához.", + "comments-post": "Hozzászólás elküldése", + "comments-submit": "Szólj hozzá!", + "comments-score-text": "Pont:", + "comments-permalink": "Permalink", + "comments-delete-link": "Megjegyzés törlése", + "comments-anon-name": "Névtelen felhasználó", + "comments-anon-message": "{{SITENAME}} üdvözöl minden hozzászólást. Ha nem akarsz névtelene lenni, regisztrálj vagy jelentkezz be. Ez ingyenes.", + "comments-ignore-item": "$2 $3 (felold)", + "comments-ignore-no-users": "Jelenleg nincs blokkolt felhasználó.", + "comments-ignore-remove-message": "Biztos, hogy meg akarod szüntetni $1 felhasználó megjegyzéseinek a blokkolását?", + "comments-ignore-unblock": "Blokk feloldása", + "comments-ignore-cancel": "Mégse", + "comments-ignore-title": "Figyelmen kívül hagyandó megjegyzések listája", + "commentignorelist": "Figyelmen kívül hagyandó megjegyzések listája", + "comments-no-comments-of-day": "Nincs napi hozzászólás.", + "log-name-comments": "Megjegyzés napló", + "log-description-comments": "Ez a megjegyzések naplója", + "comments-time-ago": "$1 ezelőtt", + "comments-time-months": "{{PLURAL:$1|egy hónap|$1 hónap}}", + "comments-time-days": "{{PLURAL:$1|egy|$1}} nappal", + "comments-time-hours": "{{PLURAL:$1|egy|$1}} órával", + "comments-time-minutes": "{{PLURAL:$1|egy|$1}} perccel", + "comments-time-seconds": "{{PLURAL:$1|egy|$1}} másodperccel", + "log-show-hide-comments": "$1 megjegyzés naplót", + "group-commentadmin": "Megjegyzés adminisztrátorok", + "group-commentadmin-member": "{{GENDER:$1|megjegyzés adminisztrátor}}", + "grouppage-commentadmin": "{{ns:project}}:Megjegyzés adminisztrátorok", + "right-comment": "Megjegyzés küldése", + "right-commentadmin": "Felhasználók által küldött megjegyzések adminisztrálása", + "right-commentlinks": "Külső hivatkozások használata hozzászólásokban" +} diff --git a/i18n/ia.json b/i18n/ia.json new file mode 100644 index 0000000..c5d2b55 --- /dev/null +++ b/i18n/ia.json @@ -0,0 +1,74 @@ +{ + "@metadata": { + "authors": [ + "McDutchie" + ] + }, + "apihelp-commentblock-param-commentID": "ID del commento del usator a blocar", + "apihelp-commentdelete-param-commentID": "ID del commento a deler", + "apihelp-commentlatestid-param-pageID": "ID del pagina ubi se trova le ultime commento", + "apihelp-commentlist-param-pageID": "ID del pagina de ubi proveni le lista de commentos", + "apihelp-commentlist-param-order": "Defini si le lista de commentos es in ordine ascendente o descendente", + "apihelp-commentlist-param-pagerPage": "Numero de pagina del commento", + "apihelp-commentlist-param-showForm": "Monstrar le formulario de commentos", + "apihelp-commentsubmit-param-pageID": "ID del pagina ubi submitter le commento", + "apihelp-commentsubmit-param-parentID": "ID del commento genitor", + "apihelp-commentsubmit-param-commentText": "Texto del commento", + "apihelp-commentvote-param-commentID": "ID del commento pro le qual votar", + "apihelp-commentvote-param-voteValue": "Valor del voto pro le commento", + "comments-comment": "Commento", + "comments-desc": "Adde un uncino del analysator syntactic <comments> que permitte commentar paginas", + "comments-db-locked": "

Addition de commentos

Le base de datos es presentemente serrate pro mantenentia routinari. Postea illo retornara al functionamento normal. Per favor reveni plus tarde.", + "comments-voted-label": "Votate", + "comments-loading": "Cargamento...", + "comments-auto-refresher-enable": "Activar le actualisation automatic de commentos", + "comments-auto-refresher-pause": "Pausar le actualisation automatic de commentos", + "comments-reply-to": "Responder a {{GENDER:$2|$1}}", + "comments-cancel-reply": "Cancellar", + "comments-block-warning-anon": "Es tu secur de voler ignorar permanentemente tote le commentos de iste usator anonyme (per medio de su adresse IP)?", + "comments-block-warning-user": "Es tu secur de voler ignorar permanentemente tote le commentos del usator $1?", + "comments-delete-warning": "Es tu secur de voler deler iste commento?", + "comments-sort-by-date": "Ordinar per data", + "comments-sort-by-score": "Ordinar per score", + "comments-show-comment-link": "Monstrar commento", + "comments-manage-blocklist-link": "Gerer lista de ignoratos", + "comments-ignore-message": "Tu ignora le autor de iste commento", + "comments-you": "Tu", + "comments-reply": "Responder", + "comments-login-required": "Es necessari aperir session pro poter adder commentos", + "comments-not-allowed": "Tu non ha le permission de commentar.", + "comments-post": "Adder commento", + "comments-submit": "Adder tu commento", + "comments-score-text": "Score", + "comments-permalink": "Permaligamine", + "comments-delete-link": "Deler commento", + "comments-anon-name": "Usator anonyme", + "comments-anon-message": "{{SITENAME}} accepta omne commentos. Si tu non vole esser anonyme, crea un conto o aperi session. Es gratuite.", + "comments-links-are-forbidden": "Ligamines externe non es permittite in commentos.", + "comments-is-spam": "Le texto submittite del commento ha essite interpretate como spam.", + "comments-ignore-item": "$2 le $3 (disblocar)", + "comments-ignore-no-users": "Il non ha usatores blocate.", + "comments-ignore-remove-message": "Es tu secur de voler disblocar le commentos del usator $1?", + "comments-ignore-unblock": "Disblocar", + "comments-ignore-cancel": "Cancellar", + "comments-ignore-title": "Lista de commentos ignorate", + "commentignorelist": "Lista de commentos ignorate", + "comments-no-comments-of-day": "Il non ha commentos del die.", + "log-name-comments": "Registro de commentos", + "log-description-comments": "Isto es un registro de commentos.", + "logentry-comments-add": "$1 lassava un nove commento sur $3", + "logentry-comments-delete": "$1 deleva le commento №$4 sur $3", + "comments-time-ago": "$1 retro", + "comments-time-months": "{{PLURAL:$1|un mense|$1 menses}}", + "comments-time-days": "{{PLURAL:$1|un die|$1 dies}}", + "comments-time-hours": "{{PLURAL:$1|un hora|$1 horas}}", + "comments-time-minutes": "{{PLURAL:$1|un minuta|$1 minutas}}", + "comments-time-seconds": "{{PLURAL:$1|un secunda|$1 secundas}}", + "log-show-hide-comments": "$1 le registro de commentos", + "group-commentadmin": "Administratores de commentos", + "group-commentadmin-member": "{{GENDER:$1|administrator de commentos}}", + "grouppage-commentadmin": "{{ns:project}}:Administratores de commentos", + "right-comment": "Submitter commentos", + "right-commentadmin": "Administrar commentos submittite per usatores", + "right-commentlinks": "Usar ligamines externe in commentos" +} diff --git a/i18n/id.json b/i18n/id.json new file mode 100644 index 0000000..ff4f8aa --- /dev/null +++ b/i18n/id.json @@ -0,0 +1,65 @@ +{ + "@metadata": { + "authors": [ + "Farras", + "පසිඳු කාවින්ද", + "C5st4wr6ch", + "William Surya Permana" + ] + }, + "comments-comment": "Komentar", + "comments-desc": "Menambahkan hook parser <comments> yang memperbolehkan komentar pada halaman", + "comments-db-locked": "

Menambahkan komentar

Basis data saat ini terkunci untuk pemeliharaan database rutin, setelahnya akan kembali ke normal. Silakan periksa kembali nanti!", + "comments-voted-label": "Dipilih", + "comments-loading": "Memuat...", + "comments-auto-refresher-enable": "Aktifkan pemuatan ulang komentar otomatis", + "comments-auto-refresher-pause": "Jedakan pemuatan ulang komentar otomatis", + "comments-reply-to": "Balas ke {{GENDER:$2|$1}}", + "comments-cancel-reply": "Batal", + "comments-block-warning-anon": "Apakah Anda yakin ingin mengabaikan secara permanen semua komentar dari pengguna anonim ini (melalui alamat IP mereka)?", + "comments-block-warning-user": "Apakah Anda yakin ingin mengabaikan secara permanen semua komentar dari pengguna $1?", + "comments-delete-warning": "Apakah Anda yakin ingin menghapus komentar ini?", + "comments-sort-by-date": "Urut berdasarkan tanggal", + "comments-sort-by-score": "Urut berdasarkan skor", + "comments-show-comment-link": "Tampilkan komentar", + "comments-manage-blocklist-link": "Kelola daftar abai", + "comments-ignore-message": "Kini Anda mengabaikan penulis dari komentar ini", + "comments-you": "Anda", + "comments-reply": "Balas", + "comments-login-required": "Anda harus masuk log untuk menambahkan komentar", + "comments-not-allowed": "Anda tidak diizinkan untuk mengirimkan komentar.", + "comments-post": "Kirimkan komentar", + "comments-submit": "Tambahkan komentar Anda", + "comments-score-text": "Skor", + "comments-permalink": "Pranala permanen", + "comments-delete-link": "Hapus komentar", + "comments-anon-name": "Pengguna anonim", + "comments-anon-message": "{{SITENAME}} menerima segala komentar. Jika Anda tidak ingin menjadi seorang anonim, silakan daftar atau masuk log. Gratis.", + "comments-links-are-forbidden": "Pranala luar pada komentar tidak diizinkan!", + "comments-is-spam": "Teks komentar yang dikirimkan dianggap sebagai spam.", + "comments-ignore-item": "$2 pada $3 (batalkan pemblokiran)", + "comments-ignore-no-users": "Tidak ada pengguna yang saat ini diblokir.", + "comments-ignore-remove-message": "Apakah Anda yakin ingin membatalkan pemblokiran komentar pengguna $1?", + "comments-ignore-unblock": "Batalkan pemblokiran", + "comments-ignore-cancel": "Batalkan", + "comments-ignore-title": "Daftar abai komentar", + "commentignorelist": "Daftar abai komentar", + "comments-no-comments-of-day": "Tidak ada komentar untuk hari ini.", + "log-name-comments": "Log komentar", + "log-description-comments": "Ini adalah log komentar.", + "logentry-comments-add": "$1 mengirimkan komentar baru pada $3", + "logentry-comments-delete": "$1 menghapus komentar #$4 pada $3", + "comments-time-ago": "$1 yang lalu", + "comments-time-months": "{{PLURAL:$1|sebulan|$1 bulan}}", + "comments-time-days": "{{PLURAL:$1|sehari|$1 hari}}", + "comments-time-hours": "{{PLURAL:$1|sejam|$1 jam}}", + "comments-time-minutes": "{{PLURAL:$1|semenit|$1 menit}}", + "comments-time-seconds": "{{PLURAL:$1|sedetik|$1 detik}}", + "log-show-hide-comments": "$1 log komentar", + "group-commentadmin": "Pengurus komentar", + "group-commentadmin-member": "{{GENDER:$1|pengurus komentar}}", + "grouppage-commentadmin": "{{ns:project}}:Pengurus komentar", + "right-comment": "Kirim komentar", + "right-commentadmin": "Administrasikan komentar yang dikirimkan pengguna", + "right-commentlinks": "Gunakan pranala luar pada komentar" +} diff --git a/i18n/is.json b/i18n/is.json new file mode 100644 index 0000000..26ec8c5 --- /dev/null +++ b/i18n/is.json @@ -0,0 +1,11 @@ +{ + "@metadata": { + "authors": [ + "පසිඳු කාවින්ද" + ] + }, + "comments-comment": "Athugasemd", + "comments-cancel-reply": "Hætta við", + "comments-reply": "Svara", + "comments-ignore-cancel": "Hætta við" +} diff --git a/i18n/it.json b/i18n/it.json new file mode 100644 index 0000000..71c2698 --- /dev/null +++ b/i18n/it.json @@ -0,0 +1,63 @@ +{ + "@metadata": { + "authors": [ + "Beta16", + "Darth Kule" + ] + }, + "comments-comment": "Commento", + "comments-desc": "Aggiunge l'hook del parser <comments> che permette di scrivere commenti sulle pagine", + "comments-db-locked": "

Aggiunta di commenti

Il database è attualmente bloccato per la manutenzione ordinaria, dopo la quale tornerà alla normalità. Riprovare più tardi.", + "comments-voted-label": "Votato", + "comments-loading": "Caricamento in corso...", + "comments-auto-refresher-enable": "Attivare l'aggiornamento automatico dei commenti", + "comments-auto-refresher-pause": "Ferma l'aggiornamento automatico dei commenti", + "comments-reply-to": "Rispondi a {{GENDER:$2|$1}}", + "comments-cancel-reply": "Annulla", + "comments-block-warning-anon": "Sei sicuro di voler ignorare permanentemente tutti i commenti dei questo utente anonimo (tramite il suo indirizzo IP)?", + "comments-block-warning-user": "Sei sicuro di voler ignorare permanentemente tutti i commenti dell'utente $1?", + "comments-delete-warning": "Sei sicuro di volere cancellare questo commento?", + "comments-sort-by-date": "Ordina per data", + "comments-sort-by-score": "Ordina per punteggio", + "comments-show-comment-link": "Mostra commento", + "comments-manage-blocklist-link": "Gestisci lista ignorati", + "comments-ignore-message": "Si sta ignorando l'autore di questo commento", + "comments-you": " Tu", + "comments-reply": "Rispondi", + "comments-login-required": "È necessario effettuare l'accesso per aggiungere commenti", + "comments-not-allowed": "Non si dispone dei permessi necessari per inviare commenti.", + "comments-post": "Pubblica commento", + "comments-submit": "Aggiungi il tuo commento", + "comments-score-text": "Punteggio", + "comments-permalink": "Link permanente", + "comments-delete-link": "Elimina commento", + "comments-anon-name": "Utente anonimo", + "comments-anon-message": "{{SITENAME}} accetta tutti i commenti. Se non vuoi restare anonimo, registrati o accedi. È gratuito.", + "comments-links-are-forbidden": "I collegamenti esterni nei commenti sono vietati!", + "comments-is-spam": "Il testo del commento inviato è stato interpretato come spam.", + "comments-ignore-item": "$2 il $3 (sblocca)", + "comments-ignore-no-users": "Non ci sono utenti attualmente bloccati.", + "comments-ignore-remove-message": "Sbloccare i commenti dell'utente $1?", + "comments-ignore-unblock": "Sblocca", + "comments-ignore-cancel": "Annulla", + "comments-ignore-title": "Lista ignorati dei commenti", + "commentignorelist": "Lista ignorati dei commenti", + "comments-no-comments-of-day": "Non sono presenti commenti del giorno.", + "log-name-comments": "Commenti", + "log-description-comments": "Di seguito sono elencati i commenti.", + "logentry-comments-add": "$1 ha pubblicato un nuovo commento su $3", + "logentry-comments-delete": "$1 ha cancellato il commento #$4 su $3", + "comments-time-ago": "$1 fa", + "comments-time-months": "{{PLURAL:$1|un mese|$1 mesi}}", + "comments-time-days": "{{PLURAL:$1|un giorno|$1 giorni}}", + "comments-time-hours": "{{PLURAL:$1|un'ora|$1 ore}}", + "comments-time-minutes": "{{PLURAL:$1|un minuto|$1 minuti}}", + "comments-time-seconds": "{{PLURAL:$1|un secondo|$1 secondi}}", + "log-show-hide-comments": "$1 registro commenti", + "group-commentadmin": "Amministratori dei commenti", + "group-commentadmin-member": "{{GENDER:$1|amministratore|amministratrice|amministratore/trice}} di commenti", + "grouppage-commentadmin": "{{ns:project}}:Amministratori di commenti", + "right-comment": "Invia commenti", + "right-commentadmin": "Gestisce i commenti inviati dagli utenti", + "right-commentlinks": "Usa collegamenti esterni nei commenti" +} diff --git a/i18n/ja.json b/i18n/ja.json new file mode 100644 index 0000000..d76d9eb --- /dev/null +++ b/i18n/ja.json @@ -0,0 +1,65 @@ +{ + "@metadata": { + "authors": [ + "Shirayuki", + "Whym", + "Sujiniku", + "Otokoume" + ] + }, + "comments-comment": "コメント", + "comments-desc": "ページにコメントできるようにする、パーサー フック <comments> を追加する", + "comments-db-locked": "

コメントの追加

データベースは現在、定期的なデータベース保守作業のためロックされており、終わりしだい正常に戻ります。あとで再度お試しください。", + "comments-voted-label": "投票済", + "comments-loading": "読み込み中...", + "comments-auto-refresher-enable": "コメントの自動更新を有効化", + "comments-auto-refresher-pause": "コメントの自動更新を一時停止", + "comments-reply-to": "{{GENDER:$2|$1}}への返信", + "comments-cancel-reply": "キャンセル", + "comments-block-warning-anon": "この匿名利用者 (の IP アドレス) によるコメントすべてを本当に永久的に無視しますか?", + "comments-block-warning-user": "利用者 $1 によるコメントすべてを本当に永久的に無視しますか?", + "comments-delete-warning": "このコメントを本当に削除しますか?", + "comments-sort-by-date": "日付順に並べ替え", + "comments-sort-by-score": "得点順に並べ替え", + "comments-show-comment-link": "コメントを表示", + "comments-manage-blocklist-link": "無視リストを管理", + "comments-ignore-message": "このコメントの作成者を無視しています", + "comments-you": "あなた", + "comments-reply": "返信", + "comments-login-required": "コメントを追加するにはログインしてください", + "comments-not-allowed": "あなたにはコメントを投稿する権限がありません。", + "comments-post": "コメントを投稿", + "comments-submit": "自分のコメントを追加", + "comments-score-text": "得点", + "comments-permalink": "固定リンク", + "comments-delete-link": "コメントを削除", + "comments-anon-name": "匿名利用者", + "comments-anon-message": "{{SITENAME}}はすべてのコメントを歓迎します。匿名で投稿したくない場合は、アカウント作成またはログインしてください。無料です。", + "comments-links-are-forbidden": "コメント内での外部リンクの使用は禁止されています。", + "comments-is-spam": "投稿したコメントの本文はスパムと判定されました。", + "comments-ignore-item": "$2 - $3 (ブロック解除)", + "comments-ignore-no-users": "現在ブロックされている利用者はいません。", + "comments-ignore-remove-message": "利用者 $1 によるコメントを本当にブロック解除しますか?", + "comments-ignore-unblock": "ブロック解除", + "comments-ignore-cancel": "キャンセル", + "comments-ignore-title": "コメント無視リスト", + "commentignorelist": "コメント無視リスト", + "comments-no-comments-of-day": "今日のコメントはありません。", + "log-name-comments": "コメント記録", + "log-description-comments": "これはコメントの記録です。", + "logentry-comments-add": "$1 が $3 に新しいコメントを投稿しました", + "logentry-comments-delete": "$1 が $3 のコメント #$4 を削除しました", + "comments-time-ago": "$1前", + "comments-time-months": "{{PLURAL:$1|$1 か月}}", + "comments-time-days": "{{PLURAL:$1|$1 日}}", + "comments-time-hours": "{{PLURAL:$1|$1 時間}}", + "comments-time-minutes": "{{PLURAL:$1|$1 分}}", + "comments-time-seconds": "{{PLURAL:$1|$1 秒}}", + "log-show-hide-comments": "コメント記録を$1", + "group-commentadmin": "コメント管理者", + "group-commentadmin-member": "{{GENDER:$1|コメント管理者}}", + "grouppage-commentadmin": "{{ns:project}}:コメント管理者", + "right-comment": "コメントを投稿", + "right-commentadmin": "利用者が投稿したコメントを管理", + "right-commentlinks": "コメント内で外部リンクを使用" +} diff --git a/i18n/ka.json b/i18n/ka.json new file mode 100644 index 0000000..136379a --- /dev/null +++ b/i18n/ka.json @@ -0,0 +1,37 @@ +{ + "@metadata": { + "authors": [ + "David1010" + ] + }, + "comments-comment": "კომენტარი", + "comments-voted-label": "ხმა მიცემულია", + "comments-loading": "იტვირთება…", + "comments-reply-to": "პასუხი მომხმარებელს {{GENDER:$2|$1}}", + "comments-cancel-reply": "გაუქმება", + "comments-delete-warning": "დარწმუნებული ხართ, რომ გსურთ ამ კომენტარის წაშლა?", + "comments-you": "თქვენ", + "comments-reply": "პასუხი", + "comments-post": "კომენტარის დატოვება", + "comments-submit": "დაამატეთ თქვენი კომენტარი", + "comments-score-text": "შეფასება", + "comments-permalink": "მუდმივი ბმული", + "comments-delete-link": "კომენტარის წაშლა", + "comments-anon-name": "ანონიმური მომხმარებელი", + "comments-anon-message": "{{SITENAME}} მიესალმება ყველა კომენტარს. თუ თქვენ არ გსურთ იყოთ ანონიმი, დარეგისტრირდით ან შედით სისტემაში. ეს უფასოა.", + "comments-ignore-item": "$2 $3-ზე (განბლოკვა)", + "comments-ignore-remove-message": "დარწმუნებული ხართ, რომ გსურთ განბლოკოთ მომხმარებელ $1-ის კომენტარი?", + "comments-ignore-unblock": "განბლოკვა", + "comments-ignore-cancel": "გაუქმება", + "comments-ignore-title": "კომენტარის იგნორირების სია", + "commentignorelist": "კომენტარის იგნორირების სია", + "comments-time-ago": "$1 წინ", + "comments-time-days": "{{PLURAL:$1|ერთი დღე|$1 დღე}}", + "comments-time-hours": "{{PLURAL:$1|ერთი საათი|$1 საათი}}", + "comments-time-minutes": "{{PLURAL:$1|ერთი წუთი|$1 წუთი}}", + "comments-time-seconds": "{{PLURAL:$1|ერთი წამი|$1 წამი}}", + "group-commentadmin": "კომენტარების ადმინისტრატორები", + "group-commentadmin-member": "{{GENDER:$1|კომენტარების ადმინისტრატორი}}", + "grouppage-commentadmin": "{{ns:project}}:კომენტარების ადმინისტრატორები", + "right-comment": "კომენტარის გაგზავნა" +} diff --git a/i18n/kk-cyrl.json b/i18n/kk-cyrl.json new file mode 100644 index 0000000..5e408d9 --- /dev/null +++ b/i18n/kk-cyrl.json @@ -0,0 +1,8 @@ +{ + "@metadata": { + "authors": [ + "Arystanbek" + ] + }, + "comments-reply-to": "{{GENDER:$2|$1}} дегенге жауап беру" +} diff --git a/i18n/kn.json b/i18n/kn.json new file mode 100644 index 0000000..43e99a6 --- /dev/null +++ b/i18n/kn.json @@ -0,0 +1,31 @@ +{ + "@metadata": { + "authors": [ + "Dimension10", + "VASANTH S.N." + ] + }, + "comments-comment": "ಟಿಪ್ಪಣಿ", + "comments-voted-label": "ಒಪ್ಪಿತ", + "comments-loading": "ತುಂಬಿಸಲಾಗುತ್ತಿದೆ....", + "comments-auto-refresher-pause": "ಟಿಪ್ಪಣಿಗಳ ಸ್ವಯಂ ಪುನಶ್ಚೇತನಕ್ಕೆ ವಿರಾಮಕೊಡಿ", + "comments-cancel-reply": "ರದ್ದುಗೊಳಿಸು", + "comments-delete-warning": "ಈ ಟಿಪ್ಪಣಿಯನ್ನು ಅಳಿಸಿಹಾಕಲು ನೀವು ನಿಶ್ಚಿತವಾಗಿ ಇಚ್ಛಿಸುತ್ತೀರಾ?", + "comments-sort-by-date": "ದಿನಾಂಕಕ್ಕೆ ಅನುಗುಣವಾಗಿ ವಿಂಗಡಿಸು", + "comments-sort-by-score": "ಅಂಕಕ್ಕೆ ಅನುಗುಣವಾಗಿ ವಿಂಗಡಿಸು", + "comments-show-comment-link": "ಟಿಪ್ಪಣಿಗಳನ್ನು ತೋರಿಸಿ", + "comments-you": "ನೀವು", + "comments-reply": "ಉತ್ತರಿಸಿ", + "comments-not-allowed": "ಟಿಪ್ಪಣಿಗಳನ್ನು ಅಂಟಿಸಲು ನಿಮಗೆ ಅನುಮತಿ ಇಲ್ಲ.", + "comments-post": "ಟಿಪ್ಪಣಿ ಹಾಕಿ", + "comments-submit": "ನಿಮ್ಮ ಟಿಪ್ಪಣಿಗಳನ್ನು ಸೇರಿಸಿ", + "comments-score-text": "ಅಂಕ", + "comments-delete-link": "ಟಿಪ್ಪಣಿಗಳನ್ನು ಅಳಿಸಿ", + "comments-anon-name": "ಅನಾಮಿಕ ಸದಸ್ಯ", + "comments-ignore-unblock": "ತಡೆಯನ್ನು ತಗೆ", + "comments-ignore-cancel": "ರದ್ದುಗೊಳಿಸಿ", + "comments-time-minutes": "$1 {{PLURAL:$1|ನಿಮಿಷ|ನಿಮಿಷಗಳು}}", + "comments-time-seconds": "$1 {{PLURAL:$1|ಕ್ಷಣ|ಕ್ಷಣಗಳು}}", + "group-commentadmin": "ಟಿಪ್ಪಣಿಗಳ ನಿರ್ವಾಹಕರು", + "right-comment": "ಟಿಪ್ಪಣಿಗಳನ್ನು ಒಪ್ಪಿಸಿ" +} diff --git a/i18n/ko.json b/i18n/ko.json new file mode 100644 index 0000000..00d77e4 --- /dev/null +++ b/i18n/ko.json @@ -0,0 +1,67 @@ +{ + "@metadata": { + "authors": [ + "LFM", + "Priviet", + "Yjs5497", + "아라", + "Keysuck", + "Ykhwong" + ] + }, + "comments-comment": "댓글", + "comments-desc": "문서에 댓글을 허용하는 <comments> 파서 훅을 추가합니다", + "comments-db-locked": "

댓글 추가

데이터베이스가 현재 정기적인 데이터베이스 유지 관리를 위해 잠겨 있으며 이후 정상으로 돌아옵니다. 나중에 다시 확인하세요!", + "comments-voted-label": "투표함", + "comments-loading": "불러오는 중...", + "comments-auto-refresher-enable": "댓글 자동 새로 고침 활성화", + "comments-auto-refresher-pause": "댓글 자동 새로 고침 일시 정지", + "comments-reply-to": "{{GENDER:$2|$1}}에게 답변하기", + "comments-cancel-reply": "취소", + "comments-block-warning-anon": "익명 사용자(IP 주소)에서 모든 댓글을 영구적으로 무시하겠습니까?", + "comments-block-warning-user": "$1 사용자에서 모든 댓글을 영구적으로 무시하겠습니까?", + "comments-delete-warning": "이 댓글을 삭제하겠습니까?", + "comments-sort-by-date": "날짜순으로 정렬", + "comments-sort-by-score": "점수순으로 정렬", + "comments-show-comment-link": "댓글 보기", + "comments-manage-blocklist-link": "무시 목록 관리", + "comments-ignore-message": "이 댓글을 남긴 사람을 무시하고 있습니다.", + "comments-you": "나", + "comments-reply": "답변", + "comments-login-required": "댓글을 추가하려면 로그인해야 합니다.", + "comments-not-allowed": "댓글을 남길 수 있는 권한이 없습니다.", + "comments-post": "댓글 남기기", + "comments-submit": "댓글을 추가합니다", + "comments-score-text": "점수", + "comments-permalink": "고유링크", + "comments-delete-link": "댓글 삭제", + "comments-anon-name": "익명 사용자", + "comments-anon-message": "{{SITENAME}}은(는) 모든 댓글을 환영합니다. 익명을 원하지 않으면 등록하거나 로그인하세요. 무료입니다.", + "comments-links-are-forbidden": "댓글 안의 바깥 링크는 접근 거부입니다!", + "comments-is-spam": "제출된 글이 스팸으로 판단됩니다.", + "comments-ignore-item": "$3에 $2 (차단 해제)", + "comments-ignore-no-users": "현재 차단된 사용자가 없습니다.", + "comments-ignore-remove-message": "정말로 사용자 $1의 댓글을 차단 해제하겠습니까?", + "comments-ignore-unblock": "차단 해제", + "comments-ignore-cancel": "취소", + "comments-ignore-title": "댓글 무시 목록", + "commentignorelist": "댓글 무시 목록", + "comments-no-comments-of-day": "오늘의 댓글이 없습니다.", + "log-name-comments": "댓글 기록", + "log-description-comments": "댓글의 기록입니다.", + "logentry-comments-add": "$1님이 $3에 새 댓글을 남겼습니다", + "logentry-comments-delete": "$1님이 $3에서 댓글 #$4을(를) 삭제했습니다", + "comments-time-ago": "$1 전", + "comments-time-months": "{{PLURAL:$1|1개월|$1개월}}", + "comments-time-days": "{{PLURAL:$1|1일|$1일}}", + "comments-time-hours": "{{PLURAL:$1|1시간|$1시간}}", + "comments-time-minutes": "{{PLURAL:$1|1분|$1분}}", + "comments-time-seconds": "{{PLURAL:$1|1초|$1초}}", + "log-show-hide-comments": "$1 댓글 기록", + "group-commentadmin": "댓글 관리자", + "group-commentadmin-member": "{{GENDER:$1|댓글 관리자}}", + "grouppage-commentadmin": "{{ns:project}}:댓글 관리자", + "right-comment": "댓글 제출", + "right-commentadmin": "사용자가 제출한 댓글 관리", + "right-commentlinks": "바깥 링크를 사용해 댓글 남기기" +} diff --git a/i18n/krc.json b/i18n/krc.json new file mode 100644 index 0000000..c9ae268 --- /dev/null +++ b/i18n/krc.json @@ -0,0 +1,14 @@ +{ + "@metadata": { + "authors": [ + "Iltever", + "Ernác" + ] + }, + "comments-anon-name": "Аноним", + "comments-time-ago": "$1 алгъа", + "comments-time-days": "{{PLURAL:$1|бир кюн|$1 кюн}}", + "comments-time-hours": "{{PLURAL:$1|бир сагъат|$1 сагъат}}", + "comments-time-minutes": "{{PLURAL:$1|бир минут|$1 минут}}", + "comments-time-seconds": "{{PLURAL:$1|бир секунд|$1 секунд}}" +} diff --git a/i18n/ksh.json b/i18n/ksh.json new file mode 100644 index 0000000..5b8e6ec --- /dev/null +++ b/i18n/ksh.json @@ -0,0 +1,43 @@ +{ + "@metadata": { + "authors": [ + "Purodha" + ] + }, + "comments-comment": "Aanmärkong", + "comments-voted-label": "Afjeschtemmp", + "comments-loading": "Ben aam Lahde …", + "comments-reply-to": "Antowoote aan:", + "comments-cancel-reply": "Ophühre", + "comments-delete-warning": "Wells De heh dä Beidraach verhaftesch fottschmieße?", + "comments-sort-by-date": "Nohm Dattum zoteere", + "comments-show-comment-link": "Aanmerkong aanzeije", + "comments-ignore-message": "Do övverjeihß dä Schriiver vun heh däm Beidraach", + "comments-you": "Do", + "comments-reply": "Antwoot", + "comments-login-required": "Do moß enjelogg sin, öm Aanmärkonge zoh Sigge schriive ze dörve", + "comments-not-allowed": "Do moß enjelogg sin, öm Aanmärkonge zoh Sigge schriive ze dörve", + "comments-post": "En Aanmärkong dobei donn", + "comments-submit": "Donn Ding Aanmärkong derbei", + "comments-score-text": "Punkte", + "comments-permalink": "Ene duurhafte Lengk", + "comments-delete-link": "Aanmärkong fottschmiiße", + "comments-anon-name": "Nameloose Metmaacher", + "comments-ignore-no-users": "Em Momang sen hein Metmaacher jeschpärrt.", + "comments-ignore-unblock": "Sperr ophävve", + "comments-ignore-cancel": "Ophüre", + "comments-no-comments-of-day": "Mer hann_er kein Aanmärkonge aan däm Daach.", + "log-name-comments": "Logbooch met Aanmärkonge", + "log-description-comments": "Heh is est Logbooch met Aanmärkonge", + "comments-time-ago": "vör $1", + "comments-time-days": "{{PLURAL:$1|einem Daach|$1 Dääsch|keinem Daach}}", + "comments-time-hours": "{{PLURAL:$1|eine Schtond|$1 Schtonde|keinem Schtond}}", + "comments-time-minutes": "{{PLURAL:$1|eine Menutt|$1 Menutte|keine Menutt}}", + "comments-time-seconds": "{{PLURAL:$1|eine Sekund|$1 Sekunde|keine Sekund}}", + "log-show-hide-comments": "Et Logbooch vun de Aanmärkonge $1", + "group-commentadmin": "Vewallder vun de Aanmärkonge", + "group-commentadmin-member": "{{GENDER:$1|Vewallder vun de Aanmärkonge|Vewallderėn vun de Aanmärkonge|Vewallder vun de Aanmärkonge|Vewallderėn vun de Aanmärkonge|Vewallder vun de Aanmärkonge}}", + "grouppage-commentadmin": "{{ns:project}}:{{int:group-commentadmin}}", + "right-comment": "Aanmärkonge enjävve", + "right-commentadmin": "Aanmärkonge vun Metmaachere Verwallde" +} diff --git a/i18n/ku-latn.json b/i18n/ku-latn.json new file mode 100644 index 0000000..5988cf7 --- /dev/null +++ b/i18n/ku-latn.json @@ -0,0 +1,19 @@ +{ + "@metadata": { + "authors": [ + "George Animal", + "Ghybu" + ] + }, + "comments-comment": "Şîrove", + "comments-loading": "Tê barkirin...", + "comments-cancel-reply": "Betal bike", + "comments-show-comment-link": "Şîroveyê nîşan bide", + "comments-you": "Tu", + "comments-reply": "Bersiv bide", + "comments-ignore-cancel": "Betal bike", + "comments-time-ago": "berî $1", + "comments-time-days": "{{PLURAL:$1|rojek|$1 roj}}", + "right-comment": "Şîroveyan tomar bike", + "right-commentlinks": "Girêdanên derve di nav şîroveyan de bi kar bîne" +} diff --git a/i18n/lb.json b/i18n/lb.json new file mode 100644 index 0000000..88d0b6b --- /dev/null +++ b/i18n/lb.json @@ -0,0 +1,66 @@ +{ + "@metadata": { + "authors": [ + "Robby", + "Soued031" + ] + }, + "apihelp-commentlist-param-pagerPage": "Nummer vun der Säit vun de Bemierkungen", + "apihelp-commentlist-param-showForm": "De Formulaire fir d'Bemierkunge weisen", + "apihelp-commentsubmit-param-commentText": "Text vun der Bemierkung", + "comments-comment": "Bemierkung", + "comments-desc": "Setzt d'Parsererweiderung <comments> derbäi déi et erlaabt fir Säiten ze kommentéieren", + "comments-db-locked": "

Bemierkungen derbäisetzen

D'Datebank ass elo wéinst Maintenance-Aarbechte gespaart. Probéiert w.e.g. méi spéit nach eng Kéier.", + "comments-voted-label": "Ofgestëmmt", + "comments-loading": "Lueden...", + "comments-auto-refresher-enable": "Automatesch Aktualisatioun vun de Bemierkungen aschalten", + "comments-auto-refresher-pause": "Automatesch Aktualisatioun vun de Bemierkungen ausschalten", + "comments-reply-to": "Äntwert fir {{GENDER:$2|$1}}", + "comments-cancel-reply": "Ofbriechen", + "comments-block-warning-anon": "Sidd Dir sécher datt Dir definitiv all Bemierkunge vun dësem anonyme Benotzer (iwwer seng IP-Adress) ignoréiere wëllt?", + "comments-block-warning-user": "Sidd Dir sécher datt Dir definitiv all Bemierkunge vum Benotzer $1 ignoréiere wëllt?", + "comments-delete-warning": "Sidd Dir sécher datt Dir dës Bemierkung läsche wëllt?", + "comments-sort-by-date": "Nom Datum zortéieren", + "comments-sort-by-score": "Nom Score zortéieren", + "comments-show-comment-link": "Bemierkung weisen", + "comments-manage-blocklist-link": "Lëscht vun den ignoréierte Bemierkungen geréieren", + "comments-ignore-message": "Dir ignoréiert den Auteur vun dëser Bemierkung", + "comments-you": "Dir", + "comments-reply": "Äntwerten", + "comments-login-required": "Dir musst ageloggt si fir Bemierkungen derbäizesetzen", + "comments-not-allowed": "Dir däerft keng Bemierkungen derbäisetzen.", + "comments-post": "Bemierkung derbäisetzen", + "comments-submit": "Setzt Är Bemierkung derbäi", + "comments-score-text": "Score", + "comments-permalink": "Permanentlink", + "comments-delete-link": "Bemierkung läschen", + "comments-anon-name": "Anonyme Benotzer", + "comments-anon-message": "{{SITENAME}} freet sech iwwer all Bemierkungen. Wann Dir net anonym bleiwe wëllt, da mellt Iech w.e.g. un oder loggt Iech an. Et ass gratis.", + "comments-links-are-forbidden": "Extern Linken a Bemierkunge si verbueden!", + "comments-is-spam": "Den Text vun der Bemierkung gouf als Spam interpretéiert.", + "comments-ignore-item": "$2 ëm $3 (Spär ophiewen)", + "comments-ignore-no-users": "Et sinn elo keng Benotzer gespaart.", + "comments-ignore-remove-message": "Sidd Dir sécher datt Dir d'Spär fir d'Bemierkunge vum Benotzer $1 ophiewe wëllt?", + "comments-ignore-unblock": "Spär ophiewen", + "comments-ignore-cancel": "Ofbriechen", + "comments-ignore-title": "Lëscht vun den ignoréierte Bemierkungen", + "commentignorelist": "Lëscht vun den ignoréierte Bemierkungen", + "comments-no-comments-of-day": "Et gëtt keng Bemierkunge vum Dag.", + "log-name-comments": "Logbuch vun de Bemierkungen", + "log-description-comments": "Dëst ass eng Lëscht vun all Bemierkungen.", + "logentry-comments-add": "$1 huet eng nei Bemierkung op $3 gemaach", + "logentry-comments-delete": "$1 huet d'Bemierkung #$4 op $3 geläscht", + "comments-time-ago": "viru(n) $1", + "comments-time-months": "{{PLURAL:$1|ee Mount|$1 Méint}}", + "comments-time-days": "{{PLURAL:$1|engem Dag|$1 Deeg}}", + "comments-time-hours": "{{PLURAL:$1|enger Stonn|$1 Stonnen}}", + "comments-time-minutes": "{{PLURAL:$1|enger Minutt|$1 Minutten}}", + "comments-time-seconds": "{{PLURAL:$1|enger Sekonn|$1 Sekonnen}}", + "log-show-hide-comments": "Logbuch vun de Bemierkunge $1", + "group-commentadmin": "Administrateure fir Bemierkungen", + "group-commentadmin-member": "{{GENDER:$1|Bemierkungs-Administrateur}}", + "grouppage-commentadmin": "{{ns:project}}:Bemierkungs-Administrateuren", + "right-comment": "Bemierkunge späicheren", + "right-commentadmin": "Bemierkunge vu Benotzer verwalten", + "right-commentlinks": "Extern Linken a Bemierkunge benotzen" +} diff --git a/i18n/lt.json b/i18n/lt.json new file mode 100644 index 0000000..5bc849b --- /dev/null +++ b/i18n/lt.json @@ -0,0 +1,35 @@ +{ + "@metadata": { + "authors": [ + "Eitvys200", + "Hugo.arg" + ] + }, + "comments-comment": "Paaiškinimas", + "comments-voted-label": "Balsavo", + "comments-loading": "Įkeliama…", + "comments-reply-to": "Atsakyti į", + "comments-cancel-reply": "Atšaukti", + "comments-delete-warning": "Ar tikrai norite ištrinti šį komentarą?", + "comments-sort-by-date": "Rūšiuoti pagal datą", + "comments-sort-by-score": "Rūšiuoti pagal rezultatą", + "comments-show-comment-link": "Rodyti komentarą", + "comments-manage-blocklist-link": "Valdyti ignoravimo sąrašą", + "comments-ignore-message": "Jūs ignoruojate šio komentaro autorių", + "comments-you": "Jūs", + "comments-reply": "Atsakyti", + "comments-login-required": "Jūs turite būti prisijungęs jei norite pridėti komentarus", + "comments-not-allowed": "Jums neleidžiama rašyti komentarus.", + "comments-post": "Rašyti komentarą", + "comments-submit": "Pridėk savo komentarą", + "comments-score-text": "Rezultatas", + "comments-delete-link": "Ištrinti komentarą", + "comments-anon-name": "Anoniminis vartotojas", + "comments-ignore-no-users": "Šiuo metu nėra užblokuotų vartotojų.", + "comments-ignore-remove-message": "Ar tikrai norite atblokuoti vartotojo $1 komentarus?", + "comments-ignore-unblock": "Atblokuoti", + "comments-ignore-cancel": "Atšaukti", + "log-name-comments": "Komentarų žurnalas", + "comments-time-ago": "prieš $1", + "right-comment": "Siųsti komentarus" +} diff --git a/i18n/lv.json b/i18n/lv.json new file mode 100644 index 0000000..531ebcf --- /dev/null +++ b/i18n/lv.json @@ -0,0 +1,25 @@ +{ + "@metadata": { + "authors": [ + "Papuass" + ] + }, + "comments-voted-label": "Nobalsots", + "comments-loading": "Ielādē…", + "comments-reply-to": "Atbildēt uz {{GENDER:$2|$1}}", + "comments-cancel-reply": "Atcelt", + "comments-sort-by-date": "Kārtot pēc datuma", + "comments-sort-by-score": "Kārtot pēc vērtējuma", + "comments-show-comment-link": "Parādīt komentāru", + "comments-reply": "Atbildēt", + "comments-login-required": "Jums ir jāpieslēdzas, lai pievienotu komentārus", + "comments-not-allowed": "Jums nav atļauts publicēt komentārus.", + "comments-post": "Publicēt komentāru", + "comments-submit": "Pievienot savu komentāru", + "comments-score-text": "Vērtējums", + "comments-permalink": "Pastāvīgā saite", + "comments-delete-link": "Dzēst komentāru", + "comments-anon-name": "Anonīms lietotājs", + "comments-ignore-unblock": "Atbloķēt", + "comments-ignore-cancel": "Atcelt" +} diff --git a/i18n/mai.json b/i18n/mai.json new file mode 100644 index 0000000..1a0db03 --- /dev/null +++ b/i18n/mai.json @@ -0,0 +1,13 @@ +{ + "@metadata": { + "authors": [ + "बिप्लब आनन्द" + ] + }, + "comments-comment": "समीक्षा", + "comments-loading": "लोड भऽ रहल अछि...", + "comments-cancel-reply": "रद्द करु", + "comments-you": "अहाँ", + "comments-reply": "उत्तर देल जाए", + "comments-ignore-cancel": "रद्द करु" +} diff --git a/i18n/mk.json b/i18n/mk.json new file mode 100644 index 0000000..7f12919 --- /dev/null +++ b/i18n/mk.json @@ -0,0 +1,86 @@ +{ + "@metadata": { + "authors": [ + "Bjankuloski06" + ] + }, + "apihelp-commentblock-description": "Прилогот за блокриање коментари овозможува блокирање на корисник од коментирање откако ќе ги пополните следниве параметри: CommentID.", + "apihelp-commentblock-summary": "Прилогот за блокриање коментари овозможува блокирање на корисник од коментирање откако ќе ги пополните следниве параметри: CommentID.", + "apihelp-commentdelete-description": "Прилогот за бришење коментари овозможува бришење на корисник од кого дошол коментар откако ќе ги пополните следниве параметри: CommentID.", + "apihelp-commentdelete-summary": "Прилогот за бришење коментари овозможува бришење на корисник од кого дошол коментар откако ќе ги пополните следниве параметри: CommentID.", + "apihelp-commentlatestid-description": "Прилогот за назнакаи на најнови коментари овозможува добивање на назнаки на најновите коментариќе ги пополните следниве параметри: pageID.", + "apihelp-commentlatestid-summary": "Прилогот за назнакаи на најнови коментари овозможува добивање на назнаки на најновите коментариќе ги пополните следниве параметри: pageID.", + "apihelp-commentlist-description": "Прилогот за список на коментари за добивање на повеќе коментари; ги дава во извод во облик на список, откако ќе се пополнат следниве параметри: pageID, order, pagerPage и showForm.", + "apihelp-commentlist-summary": "Прилогот за список на коментари за добивање на повеќе коментари; ги дава во извод во облик на список, откако ќе се пополнат следниве параметри: pageID, order, pagerPage и showForm.", + "apihelp-commentsubmit-description": "Прилогот за поднесување коментари овозможува однесување/објавување на коментар откако ќе се пополнат следниве параметри: pageID, parentID, commentText.", + "apihelp-commentsubmit-summary": "Прилогот за поднесување коментари овозможува однесување/објавување на коментар откако ќе се пополнат следниве параметри: pageID, parentID, commentText.", + "apihelp-commentvote-description": "Прилогот за гласање на коментари овозможува гласање за коментар откако ќе се пополнат следниве параметри: commentID, voteValue.", + "apihelp-commentvote-summary": "Прилогот за гласање на коментари овозможува гласање за коментар откако ќе се пополнат следниве параметри: commentID, voteValue.", + "apihelp-commentblock-param-commentID": "Назнака на коментарот по корисник што треба да се блокира", + "apihelp-commentdelete-param-commentID": "назнака на коментарот што треба да се избрише", + "apihelp-commentlatestid-param-pageID": "Назнака на страницата која го има последниот коментар", + "apihelp-commentlist-param-pageID": "Назнака на страницата за која се добива список на коментари", + "apihelp-commentlist-param-order": "Се задава дали списокот на коментари да биде по нагорен или надолен редослед", + "apihelp-commentlist-param-pagerPage": "Број на страницата на коментарите", + "apihelp-commentlist-param-showForm": "Прикажи коментари од", + "apihelp-commentsubmit-param-pageID": "Назнака на страницата на која се поднесува коментарот", + "apihelp-commentsubmit-param-parentID": "Назнака на матичниот коментар", + "apihelp-commentsubmit-param-commentText": "Текст на коментарот", + "apihelp-commentvote-param-commentID": "Назнака на коментарот за кој се гласа", + "apihelp-commentvote-param-voteValue": "Гласовна вредност на коментарот", + "comments-comment": "Коментар", + "comments-desc": "Додава расчленувачки пресретник <comments> што овозможува коментирање на страниците", + "comments-db-locked": "

Давање на коментари

Базата е моментално заклучена за редовно одржување, и потоа ќе се врати во нормална работна состојба. Навратете се подоцна!", + "comments-voted-label": "Гласано", + "comments-loading": "Вчитувам...", + "comments-auto-refresher-enable": "Вклучи автопревчитување на коментарите", + "comments-auto-refresher-pause": "Исклучи автопревчитување на коментарите", + "comments-reply-to": "Одговори на {{GENDER:$2|$1}}", + "comments-cancel-reply": "Откажи", + "comments-block-warning-anon": "Дали сте сигурни дека сакате трајно да ги занемарите сите коментари од овој анонимен корисник (преку неговата IP-адреса)?", + "comments-block-warning-user": "Дали сте сигурни дека сакате трајно да ги занемарите сите коментари од корисникот $1?", + "comments-delete-warning": "Дали сте сигурни дека сакате да го избришете коментарот?", + "comments-sort-by-date": "Подреди по датум", + "comments-sort-by-score": "Подреди по бодови", + "comments-show-comment-link": "Прикажи коментар", + "comments-manage-blocklist-link": "Раководење со списокот на занемарени", + "comments-ignore-message": "Го занемарувате авторот на коментаров", + "comments-you": " Вие", + "comments-reply": "Одговори", + "comments-login-required": "Мора да сте најавени за да давате кометари", + "comments-not-allowed": "Не ви е дозволено да објавувате коментари.", + "comments-post": "Објави коментар", + "comments-submit": "Дајте свој комнетар", + "comments-score-text": "Бодови", + "comments-permalink": "Постојана врска", + "comments-delete-link": "Избриши коментар", + "comments-anon-name": "Анонимен корисник", + "comments-anon-message": "На {{SITENAME}} се добредојдени секакви коментари. Ако не сакате да бидете анонимни, регистрирајте се или најавете се. Бесплатно е.", + "comments-links-are-forbidden": "Во коментарите се забранети надворешни врски!", + "comments-is-spam": "Поднесениот текст на коментарот беше протолкуван како спам.", + "comments-ignore-item": "$2 на $3 (одблокирај)", + "comments-ignore-no-users": "Моментално нема блокирани корисници.", + "comments-ignore-remove-message": "Дали сте сигурни дека сакате да ги одблокирате коментарите на корисникот $1?", + "comments-ignore-unblock": "Одблокирај", + "comments-ignore-cancel": "Откажи", + "comments-ignore-title": "Список на занемарени коментари", + "commentignorelist": "Список на занемарени коментари", + "comments-no-comments-of-day": "Нема коментари на денот.", + "log-name-comments": "Дневник на коментари", + "log-description-comments": "Ова е дневник на коментар.", + "logentry-comments-add": "$1 објави нов коментар на $3", + "logentry-comments-delete": "$1 го избриша коментарот бр. $4 на $3", + "comments-time-ago": "пред $1", + "comments-time-months": "{{PLURAL:$1|еден месец|$1 месеци}}", + "comments-time-days": "{{PLURAL:$1|еден ден|$1 дена}}", + "comments-time-hours": "{{PLURAL:$1|еден час|$1 часа}}", + "comments-time-minutes": "{{PLURAL:$1|една минута|$1 минути}}", + "comments-time-seconds": "{{PLURAL:$1|една секунда|$1 секунди}}", + "log-show-hide-comments": "$1 дневник на коментари", + "group-commentadmin": "Администратори на коментари", + "group-commentadmin-member": "{{GENDER:$1|администратор на коментари}}", + "grouppage-commentadmin": "{{ns:project}}:Администратори на коментари", + "right-comment": "Поднесување на коментари", + "right-commentadmin": "Раководење со кориснички коментари", + "right-commentlinks": "Употреба на надворешни врски во коментарите" +} diff --git a/i18n/mr.json b/i18n/mr.json new file mode 100644 index 0000000..fa9179e --- /dev/null +++ b/i18n/mr.json @@ -0,0 +1,31 @@ +{ + "@metadata": { + "authors": [ + "V.narsikar" + ] + }, + "comments-comment": "शेरा", + "comments-desc": "<comments>हा पार्सरहूक जोडते ज्याने पानावर शेरे टाकणे शक्य होते.", + "comments-loading": "प्रभारण करीत आहे", + "comments-auto-refresher-enable": "शेरा स्वयं-तरोताजा करणे शक्य करा", + "comments-auto-refresher-pause": "शेरा स्वयं-तरोताजा करणे थोडा वेळ थांबवा", + "comments-reply-to": "ला उत्तर द्या", + "comments-cancel-reply": "रद्द करा", + "comments-sort-by-date": "तारखेनुसार निवड करा", + "comments-sort-by-score": "प्राप्तांकानुसार निवड करा", + "comments-show-comment-link": "शेरा दाखवा", + "comments-ignore-message": "आपण या शेऱ्याच्या लेखकास टाळत आहात", + "comments-you": "आपण", + "comments-reply": "उत्तर", + "comments-submit": "आपला शेरा जोडा", + "comments-score-text": "प्राप्तांक", + "comments-delete-link": "शेरा वगळा", + "comments-anon-name": "अनामिक सदस्य", + "logentry-comments-add": "$1 ने $3 वर एक नविन शेरा टाकला", + "logentry-comments-delete": "$1 ने $3 वरचा #$4 हा शेरा वगळला", + "comments-time-ago": "$1पूर्वी", + "comments-time-days": "{{PLURAL:$1|एक दिवस|$1 दिवस}}", + "comments-time-hours": "{{PLURAL:$1|एक तास|$1 तास}}", + "comments-time-minutes": "{{PLURAL:$1|एक मिनीट|$1 मिनीट}}", + "comments-time-seconds": "{{PLURAL:$1|एक सेकंद|$1 सेकंद}}" +} diff --git a/i18n/ms.json b/i18n/ms.json new file mode 100644 index 0000000..562799f --- /dev/null +++ b/i18n/ms.json @@ -0,0 +1,59 @@ +{ + "@metadata": { + "authors": [ + "Anakmalaysia" + ] + }, + "comments-comment": "Komen", + "comments-desc": "Membubuh penghurai <comments> yang membolehkan komen pada halaman", + "comments-db-locked": "

Menambah komen

Pangkalan data kini dikunci untuk kerja penyelenggaraan rutin, selepas ini kembali normal. Sila datang balik nanti!", + "comments-voted-label": "Diundi", + "comments-loading": "Sedang dimuatkan...", + "comments-auto-refresher-enable": "Hidupkan pengemaskini komen automatik", + "comments-auto-refresher-pause": "Rehatkan pengemaskini komen automatik", + "comments-reply-to": "Balas", + "comments-cancel-reply": "Batalkan", + "comments-block-warning-anon": "Adakah anda benar-benar ingin mengabaikan semua komen daripada pengguna awanama ini (melalui alamat IP-nya) buat selama-lamanya?", + "comments-block-warning-user": "Adakah anda benar-benar ingin mengabaikan semua komen daripada pengguna $1 buat selama-lamanya?", + "comments-delete-warning": "Adakah anda benar-benar ingin memadamkan komen ini?", + "comments-sort-by-date": "Isih ikut tarikh", + "comments-sort-by-score": "Isih ikut markah", + "comments-show-comment-link": "Paparkan komen", + "comments-manage-blocklist-link": "Uruskan senarai abai", + "comments-ignore-message": "Anda sedang mengabaikan penulis komen ini", + "comments-you": "Anda", + "comments-reply": "Balas", + "comments-login-required": "Anda mesti log masuk untuk menambah komen", + "comments-not-allowed": "Anda tidak dibenarkan menghantar komen.", + "comments-post": "Hantar komen", + "comments-submit": "Letakkan komen anda", + "comments-score-text": "Markah", + "comments-permalink": "Pautan kekal", + "comments-delete-link": "Padamkan komen", + "comments-anon-name": "Pengguna awanama", + "comments-anon-message": "{{SITENAME}} mengalu-alukan semua komen. Jika anda tidak mahu berawanama, sila daftar atau log masuk. Percuma.", + "comments-links-are-forbidden": "Pautan luar dilarang dalam komen!", + "comments-is-spam": "Teks komen yang dihantar ini ditafsir sebagai spam.", + "comments-ignore-item": "$2 pada $3 (nyahsekat)", + "comments-ignore-no-users": "Tiada pengguna yang disekat sekarang.", + "comments-ignore-remove-message": "Adakah anda benar-benar ingin menyahsekat komen-komen pengguna $1?", + "comments-ignore-unblock": "Nyahsekat", + "comments-ignore-cancel": "Batalkan", + "comments-ignore-title": "Senarai abai komen", + "commentignorelist": "Senarai abai komen", + "comments-no-comments-of-day": "Tiada komen pada hari ini.", + "log-name-comments": "Log komen", + "log-description-comments": "Ini ialah log komen.", + "comments-time-ago": "$1 yang lalu", + "comments-time-days": "{{PLURAL:$1|sehari|$1 hari}}", + "comments-time-hours": "{{PLURAL:$1|sejam|$1 jam}}", + "comments-time-minutes": "{{PLURAL:$1|seminit|$1 minit}}", + "comments-time-seconds": "{{PLURAL:$1|sesaat|$1 saat}}", + "log-show-hide-comments": "$1 log komen", + "group-commentadmin": "Penyelia Komen", + "group-commentadmin-member": "{{GENDER:$1|penyelia komen}}", + "grouppage-commentadmin": "{{ns:project}}:Penyelia Komen", + "right-comment": "Menghantar komen", + "right-commentadmin": "Mentadbir urus komen serahan pengguna", + "right-commentlinks": "Menggunakan pautan luar dalam komen" +} diff --git a/i18n/mt.json b/i18n/mt.json new file mode 100644 index 0000000..e01407b --- /dev/null +++ b/i18n/mt.json @@ -0,0 +1,40 @@ +{ + "@metadata": { + "authors": [ + "Chrisportelli" + ] + }, + "comments-comment": "Kumment", + "comments-desc": "Iżżid il-''parser hook'' <comments> li tippermetti l-kummenti fuq paġni", + "comments-voted-label": "Ivvutajt", + "comments-loading": "Tiela'...", + "comments-auto-refresher-enable": "Attiva l-aġġornament awtomatikament tal-kummenti", + "comments-auto-refresher-pause": "Waqqaf l-aġġornament awtomatikament tal-kummenti", + "comments-reply-to": "Irrispondi lil", + "comments-cancel-reply": "Ħassar", + "comments-block-warning-anon": "Inti ċert li tixtieq tinjora għal kollox il-kummenti minn utenti anonimi (permezz tal-indirizz IP)?", + "comments-block-warning-user": "Inti ċert li tixtieq tinjora għal kollox il-kummenti mill-utent $1?", + "comments-delete-warning": "Inti ċert li tixtieq tħassar dan il-kumment?", + "comments-sort-by-date": "Ordna skont id-data", + "comments-sort-by-score": "Ordna skont il-punteġġ", + "comments-show-comment-link": "Uri l-kumment", + "comments-ignore-message": "Inti qiegħed tinjora l-awtur ta' dan il-kumment", + "comments-you": "Inti", + "comments-reply": "Irrispondi", + "comments-login-required": "Trid tkun fil-kont tiegħek sabiex tkun tista' iżżid kummenti", + "comments-not-allowed": "Inti ma tistax tħalli kummenti.", + "comments-post": "Ibgħat il-kumment", + "comments-submit": "Żid il-kumment tiegħek", + "comments-score-text": "Punteġġ", + "comments-permalink": "Ħolqa permanenti", + "comments-delete-link": "Ħassar il-kumment", + "comments-anon-name": "Utent anonimu", + "comments-anon-message": "{{SITENAME}} tilqa' il-kummenti kollha. Jekk ma tridx li tibqa' anonimu, irreġistra jew idħol fil-kont. Dan huwa b'xejn.", + "comments-ignore-item": "$2 nhar il-$3 (żblokka)", + "comments-ignore-no-users": "M'hemm l-ebda utent li huwa attwalment imblukkat.", + "comments-ignore-remove-message": "Inti ċert li tixtieq tiżblokka l-kummenti tal-utent $1?", + "comments-ignore-unblock": "Żblokka", + "comments-no-comments-of-day": "M'hemm l-ebda kummenti tal-ġurnata.", + "log-name-comments": "Reġistru tal-kummenti", + "log-description-comments": "Dan huwa reġistru tal-kummenti." +} diff --git a/i18n/myv.json b/i18n/myv.json new file mode 100644 index 0000000..23c65bf --- /dev/null +++ b/i18n/myv.json @@ -0,0 +1,8 @@ +{ + "@metadata": { + "authors": [ + "Botuzhaleny-sodamo" + ] + }, + "log-name-comments": "Мельтнеде-арсематнеде тешкстамот" +} diff --git a/i18n/nb.json b/i18n/nb.json new file mode 100644 index 0000000..cfcfd7e --- /dev/null +++ b/i18n/nb.json @@ -0,0 +1,8 @@ +{ + "@metadata": { + "authors": [ + "Cocu" + ] + }, + "comments-reply-to": "Svar til {{GENDER:$2|$1}}" +} diff --git a/i18n/nds-nl.json b/i18n/nds-nl.json new file mode 100644 index 0000000..2972943 --- /dev/null +++ b/i18n/nds-nl.json @@ -0,0 +1,9 @@ +{ + "@metadata": { + "authors": [ + "Servien" + ] + }, + "comments-time-ago": "$1 elejen", + "comments-time-months": "{{PLURAL:$1|een maond|$1 maonden}}" +} diff --git a/i18n/nds.json b/i18n/nds.json new file mode 100644 index 0000000..da5a18b --- /dev/null +++ b/i18n/nds.json @@ -0,0 +1,11 @@ +{ + "@metadata": { + "authors": [ + "Joachim Mos" + ] + }, + "comments-comment": "Kommentar", + "comments-loading": "Läädt…", + "comments-cancel-reply": "Afbreken", + "comments-you": "Du" +} diff --git a/i18n/nl-informal.json b/i18n/nl-informal.json new file mode 100644 index 0000000..f85996f --- /dev/null +++ b/i18n/nl-informal.json @@ -0,0 +1,16 @@ +{ + "@metadata": { + "authors": [ + "Siebrand" + ] + }, + "comments-block-warning-anon": "Weet je zeker dat je permanent alle reacties van deze anonieme gebruiker wilt negeren (via het IP-adres)?", + "comments-block-warning-user": "Weet je zeker dat je alle reacties van $1 permanent wilt negeren?", + "comments-delete-warning": "Weet je zeker dat je deze reactie wilt verwijderen?", + "comments-ignore-message": "Je negeert de auteur van deze reactie", + "comments-you": "Jij", + "comments-login-required": "Je moet aangemeld zijn om reacties toe te kunnen voegen", + "comments-not-allowed": "Je mag niet reageren.", + "comments-anon-message": "{{SITENAME}} verwelkomt alle reacties. Als je niet anoniem wilt zijn, Registreer je dan of meld je aan.", + "comments-ignore-remove-message": "Weet je zeker dat je de reacties van $1 weer wilt zien?" +} diff --git a/i18n/nl.json b/i18n/nl.json new file mode 100644 index 0000000..6e85e09 --- /dev/null +++ b/i18n/nl.json @@ -0,0 +1,69 @@ +{ + "@metadata": { + "authors": [ + "Arent", + "Hansmuller", + "Mark van Alphen", + "Mitchel Corstjens", + "SPQRobin", + "Siebrand", + "Wiki13", + "Southparkfan" + ] + }, + "comments-comment": "Reactie", + "comments-desc": "Voegt de parserhook <comments> toe die het mogelijk maakt te reageren op pagina's", + "comments-db-locked": "

Reacties toevoegen

De database is gesloten voor onderhoud. Probeer het later opnieuw.", + "comments-voted-label": "Gestemd", + "comments-loading": "Bezig met laden…", + "comments-auto-refresher-enable": "Automatisch bijwerken van reacties inschakelen", + "comments-auto-refresher-pause": "Automatisch bijwerken van reacties pauzeren", + "comments-reply-to": "Reageren op {{GENDER:$2|$1}}", + "comments-cancel-reply": "Annuleren", + "comments-block-warning-anon": "Weet u zeker dat u permanent alle reacties van deze anonieme gebruiker wilt negeren (via het IP-adres)?", + "comments-block-warning-user": "Weet u zeker dat u alle reacties van $1 permanent wilt negeren?", + "comments-delete-warning": "Weet u zeker dat u deze reactie wilt verwijderen?", + "comments-sort-by-date": "Op datum sorteren", + "comments-sort-by-score": "Op score sorteren", + "comments-show-comment-link": "Reactie weergeven", + "comments-manage-blocklist-link": "Negeerlijst beheren", + "comments-ignore-message": "U negeert de auteur van deze reactie", + "comments-you": "U", + "comments-reply": "Antwoorden", + "comments-login-required": "U moet aangemeld zijn om reacties toe te kunnen voegen", + "comments-not-allowed": "U mag niet reageren.", + "comments-post": "Reactie toevoegen", + "comments-submit": "Reageren", + "comments-score-text": "Score", + "comments-permalink": "Permanente koppeling", + "comments-delete-link": "Reactie verwijderen", + "comments-anon-name": "Anonieme gebruiker", + "comments-anon-message": "{{SITENAME}} verwelkomt alle reacties. Als u niet anoniem wilt zijn, Registreer u dan of meld u aan.", + "comments-links-are-forbidden": "Externe koppelingen in reacties zijn niet toegestaan!", + "comments-is-spam": "De opgegeven reactie is herhemd als spam.", + "comments-ignore-item": "$2 op $3 (zichtbaar maken)", + "comments-ignore-no-users": "Er zijn momenteel geen gebruikers geblokkeerd.", + "comments-ignore-remove-message": "Weet u zeker dat u de reacties van $1 weer wilt zien?", + "comments-ignore-unblock": "Deblokkeren", + "comments-ignore-cancel": "Annuleren", + "comments-ignore-title": "Negeerlijst voor reacties", + "commentignorelist": "Lijst voor te negeren reacties", + "comments-no-comments-of-day": "Er zijn geen reacties van de dag.", + "log-name-comments": "Berichtenlogboek", + "log-description-comments": "Dit is een logboek over reacties.", + "logentry-comments-add": "$1 stuurde een nieuwe opmerking over $3 in.", + "logentry-comments-delete": "$1 haalde commentaar #$4 over $3 weg.", + "comments-time-ago": "$1 geleden", + "comments-time-months": "{{PLURAL:$1|één maand|$1 maanden}}", + "comments-time-days": "{{PLURAL:$1|Eén dag|$1 dagen}}", + "comments-time-hours": "{{PLURAL:$1|Eén uur|$1 uren}}", + "comments-time-minutes": "{{PLURAL:$1|Eén minuut|$1 minuten}}", + "comments-time-seconds": "{{PLURAL:$1|Eén seconde|$1 seconden}}", + "log-show-hide-comments": "Opmerkingenlogboek $1", + "group-commentadmin": "Reactiebeheerders", + "group-commentadmin-member": "{{GENDER:$1|Opmerkingenbeheerder}}", + "grouppage-commentadmin": "{{ns:project}}:Opmerkingenbeheerders", + "right-comment": "Reacties toevoegen", + "right-commentadmin": "Gebruikersreacties beheren", + "right-commentlinks": "Externe koppelingen in reacties gebruiken" +} diff --git a/i18n/oc.json b/i18n/oc.json new file mode 100644 index 0000000..191ff06 --- /dev/null +++ b/i18n/oc.json @@ -0,0 +1,45 @@ +{ + "@metadata": { + "authors": [ + "Cedric31" + ] + }, + "comments-comment": "Comentari", + "comments-voted-label": "Votat", + "comments-loading": "Cargament...", + "comments-reply-to": "Respondre a {{GENDER:$2|$1}}", + "comments-cancel-reply": "Anullar", + "comments-sort-by-date": "Triar per data", + "comments-sort-by-score": "Triar per marca", + "comments-show-comment-link": "Veire lo comentari", + "comments-manage-blocklist-link": "Gerir la lista ignorar", + "comments-ignore-message": "Ignoratz l’autor d'aqueste comentari", + "comments-you": "Vos", + "comments-reply": "Respondre", + "comments-post": "Publicar lo comentari", + "comments-submit": "Apondre vòstre comentari", + "comments-score-text": "Marca", + "comments-permalink": "Ligam permanent", + "comments-delete-link": "Suprimir lo comentari", + "comments-anon-name": "Utilizaire anonim", + "comments-ignore-no-users": "Actualament, i a pas d’utilizaires de blocats.", + "comments-ignore-unblock": "Desblocar", + "comments-ignore-cancel": "Anullar", + "comments-ignore-title": "Lista dels comentaris ignorats", + "commentignorelist": "Lista dels comentaris ignorats", + "comments-no-comments-of-day": "I a pas de comentari del jorn.", + "log-name-comments": "Istoric dels comentaris", + "comments-time-ago": "I a $1", + "comments-time-months": "{{PLURAL:$1|un mes|$1 meses}}", + "comments-time-days": "{{PLURAL:$1|un jorn|$1 jorns}}", + "comments-time-hours": "{{PLURAL:$1|una ora|$1 oras}}", + "comments-time-minutes": "{{PLURAL:$1|una minuta|$1 minutas}}", + "comments-time-seconds": "{{PLURAL:$1|una segonda|$1 segondas}}", + "log-show-hide-comments": "jornal de comentaris $1", + "group-commentadmin": "Administrators de comentaris", + "group-commentadmin-member": "{{GENDER:$1|administrator de comentaris|administratritz de comentaris}}", + "grouppage-commentadmin": "{{ns:project}}:Administrators de comentaris", + "right-comment": "Publicar los comentaris", + "right-commentadmin": "Administrar los comentaris someses pels utilizaires", + "right-commentlinks": "Utilizar los ligams extèrnes dins los comentaris" +} diff --git a/i18n/or.json b/i18n/or.json new file mode 100644 index 0000000..c5d7ef2 --- /dev/null +++ b/i18n/or.json @@ -0,0 +1,37 @@ +{ + "@metadata": { + "authors": [ + "Ansumang", + "Jnanaranjan Sahu" + ] + }, + "comments-comment": "ମତାମତ", + "comments-voted-label": "ମତଦାନ", + "comments-loading": "ଖୋଲୁଅଛି...", + "comments-reply-to": "କୁ ଉତ୍ତର ଦେବେ", + "comments-cancel-reply": "ବାତିଲ", + "comments-block-warning-user": "ଆପଣ ନିଶ୍ଚିତ ଯେ $1ବ୍ୟବହାରକାରୀ ଦ୍ଵାରା ସମସ୍ତ ମତକୁ ସ୍ଥାୟୀରୂପେ ଅଣଦେଖା କରିବେ ?", + "comments-delete-warning": "ଆପଣ ନିଶ୍ଚିତ ଭାବେ ଏହି ମତଟିକୁ ହଟାଇବାକୁ ଚାହୁଁଛନ୍ତି ?", + "comments-sort-by-date": "ତାରିଖ ଅନୁଯାୟୀ ସଜାଇବେ", + "comments-show-comment-link": "ମନ୍ତବ୍ୟଗୁଡ଼ିକୁ ଦେଖାଇବେ", + "comments-manage-blocklist-link": "ଅଣଦେଖା ତାଳିକାଟିକୁ ପରିଚାଳନା କରିବେ", + "comments-ignore-message": "ଆପଣ ଏହି ମନ୍ତବ୍ୟର ଲେଖକଙ୍କୁ ଅଣଦେଖା କରୁଛନ୍ତି", + "comments-you": "ଆପଣ", + "comments-reply": "ଉତ୍ତର", + "comments-login-required": "ଆପଣଙ୍କୁ ମନ୍ତବ୍ୟଦେବା ପାଇଁ ଲଗଇନ କରିବାକୁ ପଡିବ", + "comments-not-allowed": "ଆପଣଙ୍କୁ ମନ୍ତବ୍ୟ ଦେବା ପାଇଁ ଅନୁମତି ନାହିଁ ।", + "comments-post": "ମତ ଦେବେ", + "comments-submit": "ଆପଣଙ୍କ ମତ ଦେବେ", + "comments-score-text": "ଗଣନା", + "comments-delete-link": "ମତ ହଟାଇବେ", + "comments-ignore-no-users": "ଏବେ କୌଣସି ବ୍ୟବହାରକାରୀଙ୍କୁ କିଳାଯାଇନାହିଁ ।", + "comments-ignore-cancel": "ବାତିଲ", + "comments-ignore-title": "ମତ ଅଣଦେଖା ତାଲିକା", + "commentignorelist": "ମତ ଅଣଦେଖା ତାଲିକା", + "comments-no-comments-of-day": "ଆଜି ପାଇଁ କୌଣସି ମତ ନାହିଁ ।", + "log-name-comments": "ମନ୍ତବ୍ୟ ତାଲିକା", + "log-description-comments": "ଏହା ମନ୍ତବ୍ୟଗୁଡିକର ଏକ ତାଲିକା ।", + "comments-time-ago": "$1 ପୂର୍ବରୁ", + "group-commentadmin": "ମନ୍ତବ୍ୟ ଅଧିକାରୀଗଣ", + "right-comment": "ମନ୍ତବ୍ୟ ଦାଖଲ କରିବେ" +} diff --git a/i18n/pl.json b/i18n/pl.json new file mode 100644 index 0000000..612e5ae --- /dev/null +++ b/i18n/pl.json @@ -0,0 +1,65 @@ +{ + "@metadata": { + "authors": [ + "Jacenty359", + "Odie2", + "Chrumps", + "Woytecr" + ] + }, + "comments-comment": "Komentarz", + "comments-desc": "Dodaje parser <comments> (komentarzy), który umożliwia komentowanie na stronach", + "comments-db-locked": "

Dodawanie komentarzy

Baza danych jest zablokowana z powodu rutynowej konserwacji. Prosimy spróbować ponownie później!", + "comments-voted-label": "Zagłosowało", + "comments-loading": "Ładowanie...", + "comments-auto-refresher-enable": "Włącz automatyczne korygowanie komentarzy", + "comments-auto-refresher-pause": "Wstrzymaj automatyczne korygowanie komentarzy", + "comments-reply-to": "Odpowiedz {{GENDER:$2|$1}}", + "comments-cancel-reply": "Anuluj", + "comments-block-warning-anon": "Naprawdę chcesz ciągle ignorować komentarze od tego anonimowego użytkownika (adres IP)?", + "comments-block-warning-user": "Naprawdę chcesz ciągle ignorować wszystkie komentarze od użytkownika $1?", + "comments-delete-warning": "Czy na pewno chcesz usunąć ten komentarz?", + "comments-sort-by-date": "Sortuj według daty", + "comments-sort-by-score": "Sortuj według wyników", + "comments-show-comment-link": "Pokaż komentarz", + "comments-manage-blocklist-link": "Zarządzaj listą ignorowanych", + "comments-ignore-message": "Ignorujesz autora tego komentarza", + "comments-you": "Ty", + "comments-reply": "Odpowiedź", + "comments-login-required": "Musisz być zalogowany, aby dodać komentarz", + "comments-not-allowed": "Nie możesz publikować komentarzy.", + "comments-post": "Prześlij komentarz", + "comments-submit": "Dodaj komentarz", + "comments-score-text": "Wynik", + "comments-permalink": "Stałe łącze", + "comments-delete-link": "Usuń komentarz", + "comments-anon-name": "Anonim", + "comments-anon-message": "{{SITENAME}} przyjmuje z zadowoleniem wszystkie komentarze. Jeśli nie chcesz być anonimowy, zarejestruj się lub zaloguj.", + "comments-links-are-forbidden": "Linki zewnętrzne w komentarzach są zabronione!", + "comments-is-spam": "Wysłany tekst komentarza został zinterpretowany jako spam.", + "comments-ignore-item": "$2, na $3 (odblokuj)", + "comments-ignore-no-users": "Brak obecnie zablokowanych użytkowników.", + "comments-ignore-remove-message": "Czy na pewno chcesz odblokować komentarze użytkownika $1?", + "comments-ignore-unblock": "Odblokuj", + "comments-ignore-cancel": "Anuluj", + "comments-ignore-title": "Lista ignorowanych komentarzy", + "commentignorelist": "Lista ignorowanych komentarzy", + "comments-no-comments-of-day": "Dziś brak komentarzy.", + "log-name-comments": "Dziennik komentarzy", + "log-description-comments": "Jest to dziennik komentarzy.", + "logentry-comments-add": "$1 {{GENDER:$2|napisał|napisała}} nowy komentarz na stronie $3", + "logentry-comments-delete": "$1 {{GENDER:$2|usunął|usunęła}} komentarz #$4 na stronie $3", + "comments-time-ago": "$1 temu", + "comments-time-months": "{{PLURAL:$1|jeden miesiąc|$1 miesiące}}", + "comments-time-days": "{{PLURAL:$1|dzień|$1 dni}}", + "comments-time-hours": "{{PLURAL:$1|godzina|$1 godzin}}", + "comments-time-minutes": "{{PLURAL:$1|minuta|$1 minut}}", + "comments-time-seconds": "{{PLURAL:$1|sekunda|$1 sekund}}", + "log-show-hide-comments": "$1 dziennik komentarzu", + "group-commentadmin": "Komentarz administratorów", + "group-commentadmin-member": "{{GENDER:$1|komentarz administratora}}", + "grouppage-commentadmin": "{{ns:project}}:Komentarz administratorów", + "right-comment": "Zgłoś komentarze", + "right-commentadmin": "Administrowanie wysłanych komentarzy użytkownika", + "right-commentlinks": "Używanie linków zewnętrznych w komentarzach" +} diff --git a/i18n/pms.json b/i18n/pms.json new file mode 100644 index 0000000..f5202d9 --- /dev/null +++ b/i18n/pms.json @@ -0,0 +1,57 @@ +{ + "@metadata": { + "authors": [ + "Borichèt", + "Dragonòt" + ] + }, + "comments-comment": "Coment", + "comments-desc": "A gionta un prinsipi d'anàlisi <comments> ch'a përmet ëd comenté le pàgine", + "comments-db-locked": "

Gionté dij coment

La base ëd dàit a l'é al moment blocà për manutension ordinaria dla base ëd dàit, ma apress a tornerà a la normalità. Për piasì, ch'a ven-a torna pi tard!", + "comments-voted-label": "Votà", + "comments-loading": "A caria ...", + "comments-auto-refresher-enable": "Ativé àuto-agiornament dij coment", + "comments-auto-refresher-pause": "Fermé l'agiornament automàtich dij coment", + "comments-reply-to": "Rësponde a", + "comments-cancel-reply": "Scancela", + "comments-block-warning-anon": "É-lo sigur ëd vorèj ignoré përmanentement tùit ij coment dë st'utent anònim (a travers soa adrëssa IP)?", + "comments-block-warning-user": "Ses-to sigur ëd vorèj ignoré përmanentement tùit ij coment da l'utent $1?", + "comments-delete-warning": "É-lo sicur ëd vorèj scancelé sto coment-sì?", + "comments-sort-by-date": "Ordiné për data", + "comments-sort-by-score": "Ordiné për valutassion", + "comments-show-comment-link": "Vëdde coment", + "comments-manage-blocklist-link": "Gestì lista da ignoré", + "comments-ignore-message": "A-j dà nen da ment a l'autor d'ës coment", + "comments-you": "Ti", + "comments-reply": "Rësponde", + "comments-login-required": "A dev esse intrà ant ël sistema për gionté dij coment", + "comments-not-allowed": "A l'ha nen ël drit dë scrive dij coment.", + "comments-post": "Coment a l'artìcol", + "comments-submit": "Gionta tò coment", + "comments-score-text": "Pontegi", + "comments-permalink": "Colegament përmanent", + "comments-delete-link": "Scancelé ël coment", + "comments-anon-name": "Utent anònim", + "comments-anon-message": "{{SITENAME}} a aceta tùit ij coment. Se chiel a veul nen esse anònim, ch'as argistra o ch'a intra ant ël sistema. A l'é a gràtis.", + "comments-ignore-item": "$2 dzor $3 (dësblòca)", + "comments-ignore-no-users": "A-i é pa gnun utent blocà al moment.", + "comments-ignore-remove-message": "Ses-to sigur ëd vorèj dësbloché ij coment ëd l'utent $1?", + "comments-ignore-unblock": "Dësbloché", + "comments-ignore-cancel": "Scancela", + "comments-ignore-title": "Lista dij coment ignorà", + "commentignorelist": "Lista dij coment ignorà", + "comments-no-comments-of-day": "A-i é pa gnun coment ëd la giornà.", + "log-name-comments": "Registr dij coment", + "log-description-comments": "Cost-sì a l'é un registr dij coment.", + "comments-time-ago": "$1 fa", + "comments-time-days": "{{PLURAL:$1|un di|$1 di}}", + "comments-time-hours": "{{PLURAL:$1|n'ora|$1 ore}}", + "comments-time-minutes": "{{PLURAL:$1|na minuta|$1 minute}}", + "comments-time-seconds": "{{PLURAL:$1|un second|$1 second}}", + "log-show-hide-comments": "$1 registr dij coment", + "group-commentadmin": "Aministrator dij Coment", + "group-commentadmin-member": "{{GENDER:$1|aministrator dij coment}}", + "grouppage-commentadmin": "{{ns:project}}:Aministrator dij Coment", + "right-comment": "Publiché ij coment", + "right-commentadmin": "Aministré ij coment mandà da j'utent" +} diff --git a/i18n/ps.json b/i18n/ps.json new file mode 100644 index 0000000..9f910bc --- /dev/null +++ b/i18n/ps.json @@ -0,0 +1,27 @@ +{ + "@metadata": { + "authors": [ + "Ahmed-Najib-Biabani-Ibrahimkhel" + ] + }, + "comments-comment": "تبصره", + "comments-loading": "رابرسېرېږي...", + "comments-cancel-reply": "ناگارل", + "comments-sort-by-date": "اوډنه د نېټې له مخې", + "comments-sort-by-score": "اوډنه د شمېرو له مخې", + "comments-show-comment-link": "تبصره ښکاره کول", + "comments-you": "تاسې", + "comments-reply": "ځوابول", + "comments-submit": "خپله تبصره ورگډول", + "comments-delete-link": "تبصره ړنگول", + "comments-anon-name": "ورکنومی کارن", + "comments-ignore-unblock": "بنديز لرې کول", + "comments-ignore-cancel": "ناگارل", + "log-name-comments": "د تبصرو يادښت", + "comments-time-ago": "$1 دمخه", + "comments-time-days": "{{PLURAL:$1|يو ورځ|$1 ورځې}}", + "comments-time-hours": "{{PLURAL:$1|يو ساعت|$1 ساعتونه}}", + "comments-time-minutes": "{{PLURAL:$1|يو دقيقه|$1 دقيقې}}", + "comments-time-seconds": "{{PLURAL:$1|يوه ثانيه|$1 ثانيې}}", + "right-comment": "تبصرې سپارل" +} diff --git a/i18n/pt-br.json b/i18n/pt-br.json new file mode 100644 index 0000000..bf5f9c2 --- /dev/null +++ b/i18n/pt-br.json @@ -0,0 +1,39 @@ +{ + "@metadata": { + "authors": [ + "Cainamarques", + "Luckas", + "Nemo bis" + ] + }, + "comments-loading": "Carregando...", + "comments-reply-to": "Responder a", + "comments-cancel-reply": "Cancelar", + "comments-delete-warning": "Você tem certeza que deseja excluir este comentário?", + "comments-sort-by-date": "Ordenar por data", + "comments-sort-by-score": "Ordenar por pontuação", + "comments-show-comment-link": "Mostrar comentário", + "comments-you": "Você", + "comments-reply": "Responder", + "comments-login-required": "Você precisa estar autenticado para adicionar comentários", + "comments-not-allowed": "Você não tem permissão para postar comentários.", + "comments-post": "Postar comentário", + "comments-submit": "Adicionar seu comentário", + "comments-score-text": "Pontuação", + "comments-permalink": "Link permanente", + "comments-delete-link": "Apagar comentário", + "comments-anon-name": "Usuário anônimo", + "comments-ignore-no-users": "Não há usuários atualmente bloqueados.", + "comments-ignore-remove-message": "Você tem certeza que deseja desbloquear os comentários do usuário $1?", + "comments-ignore-unblock": "Desbloquear", + "comments-ignore-cancel": "Cancelar", + "comments-ignore-title": "Lista de comentários ignorados", + "commentignorelist": "Lista de comentários ignorados", + "log-name-comments": "Registro de comentários", + "log-description-comments": "Este é um registro de comentários.", + "comments-time-days": "{{PLURAL:$1|um dia|$1 dias}}", + "comments-time-hours": "{{PLURAL:$1|uma hora|$1 horas}}", + "comments-time-minutes": "{{PLURAL:$1|um minuto|$1 minutos}}", + "comments-time-seconds": "{{PLURAL:$1|um segundo|$1 segundos}}", + "right-comment": "Enviar comentários" +} diff --git a/i18n/pt.json b/i18n/pt.json new file mode 100644 index 0000000..4e0ee40 --- /dev/null +++ b/i18n/pt.json @@ -0,0 +1,90 @@ +{ + "@metadata": { + "authors": [ + "Luckas", + "SandroHc", + "Imperadeiro98", + "Vitorvicentevalente", + "Hamilton Abreu" + ] + }, + "apihelp-commentblock-description": "A API commentblock permite bloquear um utilizador a partir de um comentário feito por ele, após preencher os seguintes parâmetros: CommentID.", + "apihelp-commentblock-summary": "A API commentblock permite bloquear um utilizador a partir de um comentário feito por ele, após preencher os seguintes parâmetros: CommentID.", + "apihelp-commentdelete-description": "A API commentdelete permite eliminar um comentário após preencher os seguintes parâmetros: CommentID.", + "apihelp-commentdelete-summary": "A API commentdelete permite eliminar um comentário após preencher os seguintes parâmetros: CommentID.", + "apihelp-commentlatestid-description": "A API commentlatestID permite obter o identificador do comentário mais recente após preencher os seguintes parâmetros: pageID", + "apihelp-commentlatestid-summary": "A API commentlatestID permite obter o identificador do comentário mais recente após preencher os seguintes parâmetros: pageID", + "apihelp-commentlist-description": "A API commentlist obtém vários comentários e fornece-os na forma de lista após preencher os seguintes parâmetros: pageID, order, pagerPage e showForm.", + "apihelp-commentlist-summary": "A API commentlist obtém vários comentários e fornece-os na forma de lista após preencher os seguintes parâmetros: pageID, order, pagerPage e showForm.", + "apihelp-commentsubmit-description": "A API commentsubmit permite enviar/publicar um comentário após preencher os seguintes parâmetros: pageID, parentID, commentText.", + "apihelp-commentsubmit-summary": "A API commentsubmit permite enviar/publicar um comentário após preencher os seguintes parâmetros: pageID, parentID, commentText.", + "apihelp-commentvote-description": "A API commentvote permite votar num comentário após preencher os seguintes parâmetros: commentID, voteValue.", + "apihelp-commentvote-summary": "A API commentvote permite votar num comentário após preencher os seguintes parâmetros: commentID, voteValue.", + "apihelp-commentblock-param-commentID": "Identificador do comentário do utilizador que vai ser bloqueado", + "apihelp-commentdelete-param-commentID": "Identificador do comentário a ser eliminado", + "apihelp-commentlatestid-param-pageID": "Identificador da página em que está o comentário mais recente", + "apihelp-commentlist-param-pageID": "Identificador da página de onde é obtida a lista de comentários", + "apihelp-commentlist-param-order": "Define se a lista de comentários tem ordem crescente ou decrescente", + "apihelp-commentlist-param-pagerPage": "Número da página de comentários", + "apihelp-commentlist-param-showForm": "Mostrar o formulário de comentários", + "apihelp-commentsubmit-param-pageID": "Identificador da página onde será feito o comentário", + "apihelp-commentsubmit-param-parentID": "Identificador do comentário mãe", + "apihelp-commentsubmit-param-commentText": "Texto do comentário", + "apihelp-commentvote-param-commentID": "Identificador do comentário que foi votado", + "apihelp-commentvote-param-voteValue": "Valor do voto para o comentário", + "comments-comment": "Comentário", + "comments-desc": "Adiciona ao analisador sintático o ''hook'' <comments> que permite comentar em páginas", + "comments-db-locked": "

A adicionar comentários

A base de dados está bloqueada para manutenção de rotina, após a qual voltará ao normal. Volte mais tarde, por favor!", + "comments-voted-label": "Votado", + "comments-loading": "A carregar…", + "comments-auto-refresher-enable": "Ativar a atualização automática de comentários", + "comments-auto-refresher-pause": "Parar a atualização automática de comentários", + "comments-reply-to": "Responder a {{GENDER:$2|$1}}", + "comments-cancel-reply": "Cancelar", + "comments-block-warning-anon": "Tem a certeza de que pretende ignorar permanentemente todos os comentários deste utilizador anónimo (através do seu endereço IP)?", + "comments-block-warning-user": "Tem a certeza de que pretende ignorar permanentemente todos os comentários do utilizador $1?", + "comments-delete-warning": "Tem a certeza de que pretende eliminar este comentário?", + "comments-sort-by-date": "Ordenar por data", + "comments-sort-by-score": "Ordenar por pontuação", + "comments-show-comment-link": "Mostrar comentário", + "comments-manage-blocklist-link": "Gerir lista de ignorados", + "comments-ignore-message": "Está a ignorar o autor deste comentário", + "comments-you": "Você", + "comments-reply": "Responder", + "comments-login-required": "Deve iniciar sessão para adicionar comentários", + "comments-not-allowed": "Não tem permissão para colocar comentários.", + "comments-post": "Publicar comentário", + "comments-submit": "Adicionar o seu comentário", + "comments-score-text": "Pontuação", + "comments-permalink": "Ligação permanente", + "comments-delete-link": "Eliminar comentário", + "comments-anon-name": "Utilizador anónimo", + "comments-anon-message": "A wiki {{SITENAME}} agradece todos os comentários. Se não quer ser anónimo, registe-se ou inicie a sua sessão. É gratuito.", + "comments-links-are-forbidden": "Ligações externas nos comentários são proibidas!", + "comments-is-spam": "O texto do comentário enviado foi interpretado como spam.", + "comments-ignore-item": "$2 a $3 (desbloquear)", + "comments-ignore-no-users": "Não existem utilizadores bloqueados.", + "comments-ignore-remove-message": "Tem a certeza de que pretende desbloquear os comentários do utilizador $1?", + "comments-ignore-unblock": "Desbloquear", + "comments-ignore-cancel": "Cancelar", + "comments-ignore-title": "Lista de comentários ignorados", + "commentignorelist": "Lista de comentários ignorados", + "comments-no-comments-of-day": "Não existem comentários do dia.", + "log-name-comments": "Registo de comentários", + "log-description-comments": "Este é um registo de comentários.", + "logentry-comments-add": "$1 publicou um novo comentário em $3", + "logentry-comments-delete": "$1 eliminou o comentário #$4 em $3", + "comments-time-ago": "há $1", + "comments-time-months": "{{PLURAL:$1|um mês|$1 meses}}", + "comments-time-days": "{{PLURAL:$1|um dia|$1 dias}}", + "comments-time-hours": "{{PLURAL:$1|uma hora|$1 horas}}", + "comments-time-minutes": "{{PLURAL:$1|um minuto|$1 minutos}}", + "comments-time-seconds": "{{PLURAL:$1|um segundo|$1 segundos}}", + "log-show-hide-comments": "$1 registo de comentários", + "group-commentadmin": "Administradores de comentários", + "group-commentadmin-member": "{{GENDER:$1|administrador|administradora}} de comentários", + "grouppage-commentadmin": "{{ns:project}}:Administradores de comentários", + "right-comment": "Enviar comentários", + "right-commentadmin": "Administrar comentários enviados por utilizadores", + "right-commentlinks": "Usar ligações externas em comentários" +} diff --git a/i18n/qqq.json b/i18n/qqq.json new file mode 100644 index 0000000..c6e6340 --- /dev/null +++ b/i18n/qqq.json @@ -0,0 +1,95 @@ +{ + "@metadata": { + "authors": [ + "Beta16", + "Darth Kule", + "Nike", + "Purodha", + "Raymond", + "Shirayuki", + "Siebrand", + "Liuxinyu970226", + "Umherirrender", + "Mihir Thakkar" + ] + }, + "apihelp-commentblock-description": "{{doc-apihelp-description|commentblock}}", + "apihelp-commentblock-summary": "{{doc-apihelp-summary|commentblock}}", + "apihelp-commentdelete-description": "{{doc-apihelp-description|commentdelete}}", + "apihelp-commentdelete-summary": "{{doc-apihelp-summary|commentdelete}}", + "apihelp-commentlatestid-description": "{{doc-apihelp-description|commentlatestid}}", + "apihelp-commentlatestid-summary": "{{doc-apihelp-summary|commentlatestid}}", + "apihelp-commentlist-description": "{{doc-apihelp-description|commentlist}}", + "apihelp-commentlist-summary": "{{doc-apihelp-summary|commentlist}}", + "apihelp-commentsubmit-description": "{{doc-apihelp-description|commentsubmit}}", + "apihelp-commentsubmit-summary": "{{doc-apihelp-summary|commentsubmit}}", + "apihelp-commentvote-description": "{{doc-apihelp-description|commentvote}}", + "apihelp-commentvote-summary": "{{doc-apihelp-summary|commentvote}}", + "apihelp-commentblock-param-commentID": "{{doc-apihelp-param|commentblock|commentID}}", + "apihelp-commentdelete-param-commentID": "{{doc-apihelp-param|commentdelete|commentID}}", + "apihelp-commentlatestid-param-pageID": "{{doc-apihelp-param|commentlatestid|pageID}}", + "apihelp-commentlist-param-pageID": "{{doc-apihelp-param|commentlist|pageID}}", + "apihelp-commentlist-param-order": "{{doc-apihelp-param|commentlist|order}}", + "apihelp-commentlist-param-pagerPage": "{{doc-apihelp-param|commentlist|pagerPage}}", + "apihelp-commentlist-param-showForm": "{{doc-apihelp-param|commentlist|showForm}}", + "apihelp-commentsubmit-param-pageID": "{{doc-apihelp-param|commentsubmit|pageID}}", + "apihelp-commentsubmit-param-parentID": "{{doc-apihelp-param|commentsubmit|parentID}}", + "apihelp-commentsubmit-param-commentText": "{{doc-apihelp-param|commentsubmit|commentText}}", + "apihelp-commentvote-param-commentID": "{{doc-apihelp-param|commentvote|commentID}}", + "apihelp-commentvote-param-voteValue": "{{doc-apihelp-param|commentvote|voteValue}}", + "comments-comment": "This message might be unused.\n{{Identical|Comment}}", + "comments-desc": "{{desc|name=Comments|url=https://www.mediawiki.org/wiki/Extension:Comments}}", + "comments-db-locked": "Displayed if a page contains the tag while the database is locked.", + "comments-voted-label": "Shown when you have voted (either thumbs up or thumbs down) for a given comment", + "comments-loading": "{{Identical|Loading}}", + "comments-auto-refresher-enable": "Auto-refresher is a feature where a page with the tag is automatically refreshed for new comments.\n\nRefer to the [[mw:File:Comments.png|image]] for details.", + "comments-auto-refresher-pause": "Auto-refresher is a feature where a page with the tag is automatically refreshed for new comments.\n\nRefer to the [[mw:File:Comments.png|image]] for details.", + "comments-reply-to": "This message contains the user's username whom you're about to reply to. For example, \"Reply to Jack Phoenix\".\n\nFollowed by the link {{msg-mw|Comments-cancel-reply}} and the \"Reply to user X\" form.\n\nParameters:\n* $1 - the user name to whom your are about to reply to\n* $2 - gender of that user\n{{Identical|Reply to}}", + "comments-cancel-reply": "Used as link text in JavaScript code.\n{{Identical|Cancel}}", + "comments-block-warning-anon": "{{doc-singularthey}}\nDisplayed in a JavaScript popup alert when the user is about to ignore the comments of an anonymous user.", + "comments-block-warning-user": "Displayed in a JavaScript pop-up alert when the user is about to ignore a registered user's comments.\n\nParameters:\n* $1 - the user name of the user whose comments we're about to ignore; can be used for GENDER", + "comments-delete-warning": "Displayed in a JavaScript popup alert when the user is about to delete someone's comment.", + "comments-sort-by-date": "Drop-down menu item; refer to the [[mw:File:Comments.png|image]] for details", + "comments-sort-by-score": "Drop-down menu item; refer to the [[mw:File:Comments.png|image]] for details", + "comments-show-comment-link": "When a user who is on your comment ignore list has posted a comment, you are shown an explanation ([[MediaWiki:Comment-ignore-message]]) and options on what to do. Clicking on this link will show the hidden comment.", + "comments-manage-blocklist-link": "When a user who is on your comment ignore list has posted a comment, you are shown an explanation ({{msg-mw|Comments-ignore-message}}) and options on what to do ({{msg-mw|Comments-show-comment-link}} and this message). Clicking on this link will take you to Special:CommentIgnoreList, where you can remove people from your comment ignore list.", + "comments-ignore-message": "Shown in the output of the tag instead of the person's comment if you're ignoring the said person.", + "comments-you": "Refer to the [[mw:File:Comments.png|image]] for details.\n{{Identical|You}}", + "comments-reply": "{{Identical|Reply}}", + "comments-login-required": "Shown when the user does not have the \"comment\" user right and they are logged out but a page contains the tag.", + "comments-not-allowed": "Shown when the user does not have the \"comment\" user right but a page contains the tag.", + "comments-post": "Button text, clicking on this button submits your comment; refer to the [[mw:File:Comments.png|image]] for details.\n{{Identical|Post comment}}", + "comments-submit": "This text is shown above the comment form (the form where you can submit your own comment(s)); refer to the [[mw:File:Comments.png|image]] for details", + "comments-score-text": "Followed by the comment's score; refer to the [[mw:File:Comments.png|image]] for details\n{{Identical|Score}}", + "comments-permalink": "\"Permalink\" means \"permanent link\" and clicking on it creates what is a permanent link to a comment, at least until a (comment) administrator deletes the comment or the whole page gets deleted or the tag is removed from it.\n{{Identical|Permalink}}", + "comments-delete-link": "Link text; clicking on this deletes the comment (duh)", + "comments-anon-name": "Generic name shown for anonymous (not logged in/unregistered) users, since their IP addresses aren't directly exposed.\n{{Identical|Anonymous user}}", + "comments-anon-message": "Shown above the comment form to anonymous users.\nParameters:\n* $1 - the URL to [[Special:UserLogin]]\n* $2 - the URL to [[Special:UserLogin/signup]]", + "comments-links-are-forbidden": "Error message shown to the user if they tried to post a comment that contains external links and they don't have the commentlinks user right.", + "comments-is-spam": "Error message shown to the user if they try to post a comment that matches the spam filter and they're not a member of the commentadmin group.", + "comments-ignore-item": "Shown on Special:CommentIgnoreList. Parameters:\n* $1 - the URL to the blocked user's user page\n* $2 - the name of the blocked user\n* $3 - the timestamp (when the user was blocked) (format: Y-m-d H:i:s)\n* $4 - the URL to the unblock form", + "comments-ignore-no-users": "Shown on Special:CommentIgnoreList if you haven't blocked anyone's comments.", + "comments-ignore-remove-message": "Confirmation message, shown when the user is about to unblock someone's comments on Special:CommentIgnoreList.\n\nParameters:\n* $1 - the username of the user whose comments the user has blocked", + "comments-ignore-unblock": "Used as Submit button text.\n{{Identical|Unblock}}", + "comments-ignore-cancel": "Used as Cancel button text.\n{{Identical|Cancel}}", + "comments-ignore-title": "Title of Special:CommentIgnoreList, as shown on the said page.", + "commentignorelist": "{{doc-special|CommentIgnoreList}}\nThe comment ignore list contains a list of users whose comments you are ignoring; an ignored comment won't show up by default and you have to click on a special link to view it", + "comments-no-comments-of-day": "Shown as the output of the parser hook if there are no comments of the day.", + "log-name-comments": "Shown on the dropdown on [[Special:Log]].", + "log-description-comments": "Explanation of the comments log, shown on [[Special:Log/comments]].", + "logentry-comments-add": "Parameters:\n* $1 - contains the user name + talk/block/contribs links, as is the standard with log entries nowadays\n* $2 - (Optional) username, for {{GENDER}} support\n* $3 - a wikilink to the page where the comment was posted; it contains a fragment that directly points to the new comment in question, i.e. [[Talk:Main Page#comment-10]] (the number is the internal comment identifier)", + "logentry-comments-delete": "Parameters:\n* $1 - contains the user name + talk/block/contribs links, as is the standard with log entries nowadays\n* $2 - (Optional) username, for {{GENDER}} support\n* $3 - a wikilink to the page where the comment was originally posted (and as opposed to the {{msg-mw|Logentry-comments-add}} message, it does '''not''' contain a fragment)\n* $4 - the internal comment ID", + "comments-time-ago": "Parameters:\n* $1 - the duration (e.g. \"{{int:comments-time-minutes|1}} {{int:comments-time-seconds|42}} \"), uses the following messages:\n** {{msg-mw|comments-time-days}}\n** {{msg-mw|comments-time-hours}}\n** {{msg-mw|comments-time-minutes}}\n** {{msg-mw|comments-time-seconds}}\n{{Identical|Ago}}", + "comments-time-months": "Used as $1 in {{msg-mw|Comments-time-ago}}.\n\nParameters:\n* $1 - number of months\n{{Related|Comments-time}}\n{{Identical|Day}}", + "comments-time-days": "Used as $1 in {{msg-mw|Comments-time-ago}}.\n\nParameters:\n* $1 - number of days\n{{Related|Comments-time}}\n{{Identical|Day}}", + "comments-time-hours": "Used as $1 in {{msg-mw|Comments-time-ago}}.\n\nParameters:\n* $1 - number of hours\n{{Related|Comments-time}}\n{{Identical|Hour}}", + "comments-time-minutes": "Used as the duration in {{msg-mw|Comments-time-ago}}.\n\nParameters:\n* $1 - number of minutes\n{{Related|Comments-time}}\n{{Identical|Minute}}", + "comments-time-seconds": "Used as the duration in {{msg-mw|Comments-time-ago}}.\n\nParameters:\n* $1 - number of seconds\n{{Related|Comments-time}}\n{{Identical|Second}}", + "log-show-hide-comments": "For [[Special:Log]]. Parameters:\n* $1 - one of {{msg-mw|Show}} or {{msg-mw|Hide}}\n{{Related|Log-show-hide}}", + "group-commentadmin": "Shown on [[Special:ListUsers]]. Members of this group can delete other users' comments.\n{{doc-group|commentadmin}}", + "group-commentadmin-member": "Member of the Comment Administrators (commentadmin) group, shown on [[Special:ListUsers]].\n{{doc-group|commentadmin|member}}", + "grouppage-commentadmin": "{{doc-group|commentadmin|page}}", + "right-comment": "{{doc-right|comment}}", + "right-commentadmin": "{{doc-right|commentadmin}}", + "right-commentlinks": "{{doc-right|commentlinks}}" +} diff --git a/i18n/qu.json b/i18n/qu.json new file mode 100644 index 0000000..b0753df --- /dev/null +++ b/i18n/qu.json @@ -0,0 +1,9 @@ +{ + "@metadata": { + "authors": [ + "AlimanRuna" + ] + }, + "comments-post": "Willapasqata uyaychay", + "comments-time-ago": "$1 ñaqha" +} diff --git a/i18n/ro.json b/i18n/ro.json new file mode 100644 index 0000000..ef07827 --- /dev/null +++ b/i18n/ro.json @@ -0,0 +1,44 @@ +{ + "@metadata": { + "authors": [ + "Firilacroco", + "Minisarm", + "Stelistcristi", + "Strainu" + ] + }, + "comments-comment": "Comentariu", + "comments-voted-label": "Votat", + "comments-loading": "Se încarcă...", + "comments-reply-to": "Răspundeți {{GENDER:$2|utilizatorului|utilizatoarei}} $1", + "comments-cancel-reply": "Revocare", + "comments-sort-by-date": "Sortare după dată", + "comments-sort-by-score": "Sortare după scor", + "comments-show-comment-link": "Arată comentariul", + "comments-manage-blocklist-link": "Administrează lista de ignorare", + "comments-ignore-message": "Autorul acestui comentariu este ignorat de către dv.", + "comments-you": "Dumneavoastră", + "comments-reply": "Răspunde", + "comments-login-required": "Trebuie să fiți autentificat pentru a adăuga comentarii", + "comments-not-allowed": "Nu sunteți autorizat să publicați comentarii.", + "comments-post": "Postează comentariul", + "comments-submit": "Adăugați comentariul dumneavoastră", + "comments-score-text": "Scor", + "comments-permalink": "Legătură permanentă", + "comments-delete-link": "Ștergere comentariul", + "comments-anon-name": "Utilizator anonim", + "comments-ignore-no-users": "Nu există utilizatori blocați.", + "comments-ignore-unblock": "Deblocare", + "comments-ignore-cancel": "Renunță", + "comments-no-comments-of-day": "Nu există niciun comentariu al zilei.", + "log-name-comments": "Jurnal comentarii", + "log-description-comments": "Acesta este un jurnal de comentarii.", + "comments-time-ago": "în urmă cu $1", + "comments-time-days": "{{PLURAL:$1|o zi|$1 zile}}", + "comments-time-hours": "{{PLURAL:$1|o oră|$1 ore}}", + "comments-time-minutes": "{{PLURAL:$1|un minut|$1 minute}}", + "comments-time-seconds": "{{PLURAL:$1|o secundă|$1 secunde}}", + "log-show-hide-comments": "$1 jurnalul de comentarii", + "group-commentadmin": "Administratori de comentarii", + "right-comment": "Trimite comentarii" +} diff --git a/i18n/roa-tara.json b/i18n/roa-tara.json new file mode 100644 index 0000000..004dc09 --- /dev/null +++ b/i18n/roa-tara.json @@ -0,0 +1,64 @@ +{ + "@metadata": { + "authors": [ + "Joetaras" + ] + }, + "apihelp-commentlist-param-showForm": "Fà 'ndrucà 'u module de le commende", + "apihelp-commentsubmit-param-commentText": "Teste d'u commende", + "comments-comment": "Commende", + "comments-desc": "Aggiunge <comments> cumme gance analizzatrice ca permette de commendà sus a le pàggene", + "comments-db-locked": "

Aggiunde de commende

'U database jè bloccate pe mò pe manutenzione, apprisse ca spicce torne normale. Pe piacere pruève cchiù tarde!", + "comments-voted-label": "Vutate", + "comments-loading": "Stoche a careche…", + "comments-auto-refresher-enable": "Abbilite l'aggiornamende automateche de le commende", + "comments-auto-refresher-pause": "Firme l'aggiornamende automateche de le commende", + "comments-reply-to": "Respunne a {{GENDER:$2|$1}}", + "comments-cancel-reply": "Annulle", + "comments-block-warning-anon": "Sì secure ca non ge vuè ccu pinze a le commende pe sembre da stu utende anonime (ausanne l'indirizze IP sue)?", + "comments-block-warning-user": "Sì secure ca non ge vuè ccu pinze a le commende pe sembre da l'utende $1?", + "comments-delete-warning": "Sì secure ca vuè ccu scangille stu commende?", + "comments-sort-by-date": "Ordine pe date", + "comments-sort-by-score": "Ordine pe pundegge", + "comments-show-comment-link": "Fà vedè 'u commende", + "comments-manage-blocklist-link": "Gestisce l'elenghe de le crestiane da cacà", + "comments-ignore-message": "Tu ste cache l'autore de stu commende", + "comments-you": "Tu", + "comments-reply": "Respunne", + "comments-login-required": "Tu à trasè pe aggiungere commende", + "comments-not-allowed": "Non ge sì abbilitate a mannà commende.", + "comments-post": "Mitte 'nu commende", + "comments-submit": "Aggiunge 'u commende tune", + "comments-score-text": "Pundegge", + "comments-permalink": "Collegamende permanende", + "comments-delete-link": "Scangille 'u commende", + "comments-anon-name": "Utende anonime", + "comments-anon-message": "{{SITENAME}} bovègne a tutte le commende. Ce tu non ge vuè essere anonime, reggistrate o tràse. Jè libbere.", + "comments-links-are-forbidden": "Collegaminde de fore jndr'à le commende sò vietate!", + "comments-is-spam": "'U teste scritte d'u commende ha state 'nderpretate cumme rummate.", + "comments-ignore-item": "$2 a le $3 (sblocche)", + "comments-ignore-no-users": "Non ge stonne utinde bloccate pe mò.", + "comments-ignore-remove-message": "Sì secure ca vuè ccu sblocche le commende de l'utende $1?", + "comments-ignore-unblock": "Sblocche", + "comments-ignore-cancel": "Annulle", + "comments-ignore-title": "Commende l'elenghe de scarte", + "commentignorelist": "Commende l'elenghe de scarte", + "comments-no-comments-of-day": "Non ge stonne commende d'a sciurnate.", + "log-name-comments": "Archivije de le commende", + "log-description-comments": "Quiste jè 'n'archivije de commende.", + "logentry-comments-add": "$1 ave mannate 'nu commende nuève sus a $3", + "logentry-comments-delete": "$1 ave scangellate 'u commende #$4 sus a $3", + "comments-time-ago": "$1 fà", + "comments-time-months": "{{PLURAL:$1|'nu mese|$1 mise}}", + "comments-time-days": "{{PLURAL:$1|'nu sciurne|$1 sciurne}}", + "comments-time-hours": "{{PLURAL:$1|'n'ore|$1 ore}}", + "comments-time-minutes": "{{PLURAL:$1|'nu minute|$1 minute}}", + "comments-time-seconds": "{{PLURAL:$1|'nu seconde|$1 seconde}}", + "log-show-hide-comments": "$1 archivije de commende", + "group-commentadmin": "Amministrature de le Commende", + "group-commentadmin-member": "{{GENDER:$1|amministratore d'u commende}}", + "grouppage-commentadmin": "{{ns:project}}:Amministrature d'u commende", + "right-comment": "Conferme le commende", + "right-commentadmin": "Gestisce le commende de le utinde confermate", + "right-commentlinks": "Ause le collegaminde de fore jndr'à le commende" +} diff --git a/i18n/ru.json b/i18n/ru.json new file mode 100644 index 0000000..2ee1864 --- /dev/null +++ b/i18n/ru.json @@ -0,0 +1,67 @@ +{ + "@metadata": { + "authors": [ + "Kaganer", + "Lockal", + "Okras", + "Ole Yves", + "SimonLitt" + ] + }, + "apihelp-commentsubmit-param-commentText": "Текст комментария", + "comments-comment": "Комментарий", + "comments-desc": "Добавляет перехватчик синтаксического анализатора <comments>, который позволяет комментировать страницы", + "comments-db-locked": "

Добавление комментариев

В настоящее время база данных заблокирована для планового обслуживания баз данных, после чего она вернётся в нормальное состояние. Пожалуйста, попробуйте позже!", + "comments-voted-label": "Проголосовал", + "comments-loading": "Загрузка...", + "comments-auto-refresher-enable": "Включить автоматическое обновление комментариев", + "comments-auto-refresher-pause": "Остановить автоматическое обновление комментариев", + "comments-reply-to": "Ответить {{GENDER:$2|участнику|участнице}} $1", + "comments-cancel-reply": "Отменить", + "comments-block-warning-anon": "Вы уверены, что хотите постоянно игнорировать все комментарии, поступающие от этого анонимного участника (через его IP-адрес)?", + "comments-block-warning-user": "Вы уверены, что хотите постоянно игнорировать все комментарии от участника $1?", + "comments-delete-warning": "Вы уверены, что хотите удалить данный комментарий?", + "comments-sort-by-date": "Упорядочить по дате", + "comments-sort-by-score": "Упорядочить по числу баллов", + "comments-show-comment-link": "Показать комментарий", + "comments-manage-blocklist-link": "Управление списком игнорируемых", + "comments-ignore-message": "Вы игнорируете автора этого комментария", + "comments-you": "Вы", + "comments-reply": "Ответить", + "comments-login-required": "Для добавления комментариев вы должны авторизоваться.", + "comments-not-allowed": "Вы не можете оставлять комментарии.", + "comments-post": "Оставить комментарий", + "comments-submit": "Добавить свой комментарий", + "comments-score-text": "Оценка", + "comments-permalink": "Постоянная ссылка", + "comments-delete-link": "Удалить комментарий", + "comments-anon-name": "Анонимный участник", + "comments-anon-message": "На сайте {{SITENAME}} приветствуются все комментарии. Если вы не хотите быть анонимным, зарегистрируйтесь или представьтесь. Это бесплатно.", + "comments-links-are-forbidden": "Внешние ссылки в комментариях запрещены!", + "comments-is-spam": "Представленный текст комментария был воспринят как спам.", + "comments-ignore-item": "$2 на $3 (разблокировать)", + "comments-ignore-no-users": "В настоящее время нет ни одного заблокированного участника.", + "comments-ignore-remove-message": "Вы уверены, что хотите разблокировать комментарии участника $1?", + "comments-ignore-unblock": "Разблокировать", + "comments-ignore-cancel": "Отменить", + "comments-ignore-title": "Список тех, чьи комментарии игнорируются", + "commentignorelist": "Список игнорируемых комментаторов", + "comments-no-comments-of-day": "Нет комментариев дня.", + "log-name-comments": "Журнал комментариев", + "log-description-comments": "Это журнал комментариев.", + "logentry-comments-add": "$1 опубликовал новый комментарий на $3", + "logentry-comments-delete": "$1 удалил комментарий #$4 на $3", + "comments-time-ago": "$1 назад", + "comments-time-months": "{{PLURAL:$1|один месяц|$1 месяца|$1 месяцев}}", + "comments-time-days": "{{PLURAL:$1|$1 день|$1 дня|$1 дней}}", + "comments-time-hours": "{{PLURAL:$1|$1 час|$1 часа|$1 часов}}", + "comments-time-minutes": "{{PLURAL:$1|$1 минуту|$1 минуты|$1 минут}}", + "comments-time-seconds": "{{PLURAL:$1|$1 секунду|$1 секунды|$1 секунд}}", + "log-show-hide-comments": "$1 комментарий из журнала", + "group-commentadmin": "Модераторы комментариев", + "group-commentadmin-member": "{{GENDER:$1|модератор комментариев}}", + "grouppage-commentadmin": "{{ns:project}}:Модераторы комментариев", + "right-comment": "Отправить комментарии", + "right-commentadmin": "Администрировать комментарии, опубликованные участником", + "right-commentlinks": "Использовать внешние ссылки в комментариях" +} diff --git a/i18n/sco.json b/i18n/sco.json new file mode 100644 index 0000000..11a6648 --- /dev/null +++ b/i18n/sco.json @@ -0,0 +1,62 @@ +{ + "@metadata": { + "authors": [ + "John Reid" + ] + }, + "comments-comment": "Comment", + "comments-desc": "Eiks <comments> parser huik that permits commentin oan pages", + "comments-db-locked": "

Eikin comments

The database is nou locked fer routine database maintenance, efter this it will be back til normal. Please check back later!", + "comments-voted-label": "Voted", + "comments-loading": "Laidin...", + "comments-auto-refresher-enable": "Enable comment autæ-refresher", + "comments-auto-refresher-pause": "Pause comment autæ-refresher", + "comments-reply-to": "Replie tae {{GENDER:$2|$1}}", + "comments-cancel-reply": "Cancel", + "comments-block-warning-anon": "Ar ye sair that ye want tae permanentlie ignore aw comments fae this anonymous uiser (bi waa o thair IP address)?", + "comments-block-warning-user": "Ar ye sair that ye want tae permanentlie ignore aw comments fae uiser $1?", + "comments-delete-warning": "Ar ye sair that ye want tae delyte this comment?", + "comments-sort-by-date": "Sort bi date", + "comments-sort-by-score": "Sort bi score", + "comments-show-comment-link": "Shaw comment", + "comments-manage-blocklist-link": "Manage ignore leet", + "comments-ignore-message": "Ye'r ignorin the auther o this comment", + "comments-you": "Ye", + "comments-reply": "Replie", + "comments-login-required": "Ye maun be loggit in tae eik comments", + "comments-not-allowed": "Ye'r na permitit tae post comments.", + "comments-post": "Post comment", + "comments-submit": "Eik yer comment", + "comments-score-text": "Score", + "comments-permalink": "Permalink", + "comments-delete-link": "Delyte comment", + "comments-anon-name": "Anonymous uiser", + "comments-anon-message": "{{SITENAME}} weelcomes aw comments. Gif ye dinna want tae be anonymous, register or log in. It's free.", + "comments-links-are-forbidden": "External links in comments ar forbidden!", + "comments-is-spam": "Submitted tex o the comment wis interpreted aes spam.", + "comments-ignore-item": "$2 oan $3 (onblock)", + "comments-ignore-no-users": "Thaur ar naw uisers blockit richt nou.", + "comments-ignore-remove-message": "Ar ye sair ye want tae onblock uiser $1's comments?", + "comments-ignore-unblock": "Onblock", + "comments-ignore-cancel": "Cancel", + "comments-ignore-title": "Comment ignore leet", + "commentignorelist": "Comment ignore leet", + "comments-no-comments-of-day": "Thaur ar naw comments o the day.", + "log-name-comments": "Comments log", + "log-description-comments": "This is ae log o comments.", + "logentry-comments-add": "$1 posted ae new comment oan $3", + "logentry-comments-delete": "$1 delytit comment #$4 oan $3", + "comments-time-ago": "$1 syne", + "comments-time-months": "{{PLURAL:$1|yin month|$1 months}}", + "comments-time-days": "{{PLURAL:$1|yin day|$1 days}}", + "comments-time-hours": "{{PLURAL:$1|yin hoor|$1 hoors}}", + "comments-time-minutes": "{{PLURAL:$1|yin minute|$1 minutes}}", + "comments-time-seconds": "{{PLURAL:$1|yin seicont|$1 seiconts}}", + "log-show-hide-comments": "$1 comment log", + "group-commentadmin": "Comment admeenistraters", + "group-commentadmin-member": "{{GENDER:$1|comment admeenistrater}}", + "grouppage-commentadmin": "{{ns:project}}:Comment admeenistraters", + "right-comment": "Haun comments in", + "right-commentadmin": "Admeenistrate uiser-haunit-in comments", + "right-commentlinks": "Uise external links in comments" +} diff --git a/i18n/sd.json b/i18n/sd.json new file mode 100644 index 0000000..a7adf64 --- /dev/null +++ b/i18n/sd.json @@ -0,0 +1,9 @@ +{ + "@metadata": { + "authors": [ + "Mehtab ahmed" + ] + }, + "comments-cancel-reply": "رد", + "comments-ignore-cancel": "رد" +} diff --git a/i18n/sh.json b/i18n/sh.json new file mode 100644 index 0000000..8176718 --- /dev/null +++ b/i18n/sh.json @@ -0,0 +1,9 @@ +{ + "@metadata": { + "authors": [ + "Conquistador" + ] + }, + "comments-cancel-reply": "Otkaži", + "comments-ignore-cancel": "Otkaži" +} diff --git a/i18n/si.json b/i18n/si.json new file mode 100644 index 0000000..3118dc7 --- /dev/null +++ b/i18n/si.json @@ -0,0 +1,53 @@ +{ + "@metadata": { + "authors": [ + "Sahan.ssw", + "Singhalawap", + "පසිඳු කාවින්ද" + ] + }, + "comments-comment": "පරිකථනය", + "comments-voted-label": "මනාපය දෙන ලදී", + "comments-loading": "ප්‍රවේශනය වෙමින් පවතී...", + "comments-auto-refresher-enable": "පරිකථන ස්වයං-නවමුව සක්‍රිය කරන්න", + "comments-auto-refresher-pause": "පරිකථන ස්වයං-නවමුව විරාම කරන්න", + "comments-reply-to": "පිළිතුරු දෙන්න", + "comments-cancel-reply": "අත් හරින්න", + "comments-delete-warning": "ඔබට මෙම පරිකථනය මැකීමට අවශ්‍යමද?", + "comments-sort-by-date": "දිනය අනුව පෙළගස්වන්න", + "comments-sort-by-score": "ලකුණ අනුව පෙළගස්වන්න", + "comments-show-comment-link": "පරිකථනය පෙන්වන්න", + "comments-manage-blocklist-link": "නොසලකා හැරීම් ලැයිස්තුව කළමනාකරණය කරන්න", + "comments-ignore-message": "ඔබ මෙම පරිකථනයේ කතෘ නොසලකා හරිමින් සිටියි", + "comments-you": "ඔබ", + "comments-reply": "පිළිතුරු දෙන්න", + "comments-login-required": "පරිකථන එක් කිරීම සඳහා ඔබ ප්‍රවිෂ්ට වී සිටිය යුතුය", + "comments-not-allowed": "ඔබට පරිකථන තැපැල් කිරීමට ඉඩ ලබා නොදේ.", + "comments-post": "පරිකථනය තැපැල් කරන්න", + "comments-submit": "ඔබේ පරිකථනය එක් කරන්න", + "comments-score-text": "ලකුණ", + "comments-permalink": "නිත්‍යසබැඳිය", + "comments-delete-link": "පරිකථනය මකන්න", + "comments-anon-name": "නිර්නාමික පරිශීලක", + "comments-ignore-item": "$2 මත $3 (ආවාරණය)", + "comments-ignore-no-users": "දැනට වාරණය කරන ලද පරිශීලකයන් නොමැත.", + "comments-ignore-unblock": "වාරණය ඉවත්කරන්න", + "comments-ignore-cancel": "අත් හරින්න", + "comments-ignore-title": "පරිකථන නොසලකා හැරීම් ලැයිස්තුව", + "commentignorelist": "පරිකථන නොසලකා හැරීම් ලැයිස්තුව", + "comments-no-comments-of-day": "දවසේ පරිකථන කිසිවක් එහි නොමැත.", + "log-name-comments": "පරිකථන ලඝු සටහන", + "log-description-comments": "මෙය පරිකථනවල ලඝු සටහනකි.", + "comments-time-ago": "$1 පෙර", + "comments-time-months": "{{PLURAL:$1|එක් මසක් |මාස $1ක් }}", + "comments-time-days": "{{PLURAL:$1|දවසක්|දවස් $1}}", + "comments-time-hours": "{{PLURAL:$1|පැයක්|පැය $1}}", + "comments-time-minutes": "{{PLURAL:$1|මිනිත්තුවක්|මිනිත්තු $1}}", + "comments-time-seconds": "{{PLURAL:$1|තත්පරයක්|තත්පර $1}}", + "log-show-hide-comments": "$1 පරිකථන සටහන", + "group-commentadmin": "පරිකථන පරිපාලකවරු", + "group-commentadmin-member": "{{GENDER:$1|පරිකථන පරිපාලක}}", + "grouppage-commentadmin": "{{ns:project}}:පරිකථන පරිපාලකවරු", + "right-comment": "පරිකථන යොමන්න", + "right-commentadmin": "පරිශීලක-යොමන ලද පරිකථන පාලනය කරන්න" +} diff --git a/i18n/sr-ec.json b/i18n/sr-ec.json new file mode 100644 index 0000000..9d8a90e --- /dev/null +++ b/i18n/sr-ec.json @@ -0,0 +1,42 @@ +{ + "@metadata": { + "authors": [ + "Rancher", + "Milicevic01", + "Сербијана", + "Obsuser" + ] + }, + "comments-comment": "Коментар", + "comments-voted-label": "Гласано", + "comments-loading": "Учитавам…", + "comments-auto-refresher-enable": "Омогући самоосвежавање коментара", + "comments-auto-refresher-pause": "Онемогући самоосвежавање коментара", + "comments-reply-to": "Одговори на {{GENDER:$2|$1}}", + "comments-cancel-reply": "Откажи", + "comments-block-warning-user": "Желите ли да трајно занемарите све коментаре корисника $1?", + "comments-delete-warning": "Желите ли да обришете овај коментар?", + "comments-sort-by-date": "Поређај по датуму", + "comments-sort-by-score": "Поређај по бодовима", + "comments-show-comment-link": "Прикажи коментар", + "comments-manage-blocklist-link": "Управљај списком занемарених", + "comments-ignore-message": "Занемарујете аутора овог коментара", + "comments-ignore-unblock": "Деблокирај", + "comments-ignore-cancel": "Откажи", + "comments-ignore-title": "Списак занемарених коментара", + "commentignorelist": "Списак занемарених коментара", + "comments-no-comments-of-day": "Нема коментара дана.", + "log-name-comments": "Дневник коментара", + "log-description-comments": "Ово је дневник коментара.", + "comments-time-ago": "пре $1", + "comments-time-days": "{{PLURAL:$1|један дан|$1 дана}}", + "comments-time-hours": "{{PLURAL:$1|један сат|$1 сата|$1 сати}}", + "comments-time-minutes": "{{PLURAL:$1|један минут|$1 минута}}", + "comments-time-seconds": "{{PLURAL:$1|1 секунд|$1 секунда|$1 секунди}}", + "log-show-hide-comments": "$1 дневник коментара", + "group-commentadmin": "Администратори коментара", + "group-commentadmin-member": "{{GENDER:$1|администратор|администраторка}} коментара", + "grouppage-commentadmin": "{{ns:project}}:Администратори коментара", + "right-comment": "слање коментара", + "right-commentadmin": "управљање корисничким коментарима" +} diff --git a/i18n/sr-el.json b/i18n/sr-el.json new file mode 100644 index 0000000..872bf50 --- /dev/null +++ b/i18n/sr-el.json @@ -0,0 +1,43 @@ +{ + "@metadata": { + "authors": [ + "Milicevic01", + "Сербијана", + "Obsuser" + ] + }, + "comments-comment": "Komentar", + "comments-voted-label": "Glasano", + "comments-loading": "Učitavam…", + "comments-auto-refresher-enable": "Omogući samoosvežavanje komentara", + "comments-auto-refresher-pause": "Onemogući samoosvežavanje komentara", + "comments-reply-to": "Odgovori na {{GENDER:$2|$1}}", + "comments-cancel-reply": "Otkaži", + "comments-block-warning-user": "Želite li da trajno zanemarite sve komentare korisnika $1?", + "comments-delete-warning": "Želite li da obrišete ovaj komentar?", + "comments-sort-by-date": "Poređaj po datumu", + "comments-sort-by-score": "Poređaj po bodovima", + "comments-show-comment-link": "Prikaži komentar", + "comments-manage-blocklist-link": "Upravljaj spiskom zanemarenih", + "comments-ignore-message": "Zanemarujete autora ovog komentara", + "comments-permalink": "Trajna veza", + "comments-ignore-unblock": "Deblokiraj", + "comments-ignore-cancel": "Otkaži", + "comments-ignore-title": "Spisak zanemarenih komentara", + "commentignorelist": "Spisak zanemarenih komentara", + "comments-no-comments-of-day": "Nema komentara dana.", + "log-name-comments": "Dnevnik komentara", + "log-description-comments": "Ovo je dnevnik komentara.", + "comments-time-ago": "pre $1", + "comments-time-months": "{{PLURAL:$1|jedan mesec|$1 meseci}}", + "comments-time-days": "{{PLURAL:$1|jedan dan|$1 dana}}", + "comments-time-hours": "{{PLURAL:$1|jedan sat|$1 sata|$1 sati}}", + "comments-time-minutes": "{{PLURAL:$1|jedan minut|$1 minuta}}", + "comments-time-seconds": "{{PLURAL:$1|1 sekunda|$1 sekunda|$1 sekundi}}", + "log-show-hide-comments": "$1 dnevnik komentara", + "group-commentadmin": "Administratori komentara", + "group-commentadmin-member": "{{GENDER:$1|administrator|administratorka}} komentara", + "grouppage-commentadmin": "{{ns:project}}:Administratori komentara", + "right-comment": "Slanje komentara", + "right-commentadmin": "upravljanje korisničkim komentarima" +} diff --git a/i18n/su.json b/i18n/su.json new file mode 100644 index 0000000..3009a54 --- /dev/null +++ b/i18n/su.json @@ -0,0 +1,9 @@ +{ + "@metadata": { + "authors": [ + "Uchup19" + ] + }, + "comments-cancel-reply": "Bolay", + "comments-ignore-cancel": "Bolay" +} diff --git a/i18n/sv.json b/i18n/sv.json new file mode 100644 index 0000000..66f5e98 --- /dev/null +++ b/i18n/sv.json @@ -0,0 +1,89 @@ +{ + "@metadata": { + "authors": [ + "Jopparn", + "Tobulos1", + "WikiPhoenix", + "Lokal Profil" + ] + }, + "apihelp-commentblock-description": "API:et commentblock gör det möjligt att blockera en användare från kommentaren den kommer ifrån efter att följande parametrar fylls i: CommentID", + "apihelp-commentblock-summary": "API:et commentblock gör det möjligt att blockera en användare från kommentaren den kommer ifrån efter att följande parametrar fylls i: CommentID.", + "apihelp-commentdelete-description": "API:et commentdelete gör det möjligt att radera en kommentar efter att följande parametrar fylls i: CommentID", + "apihelp-commentdelete-summary": "API:et commentdelete gör det möjligt att radera en kommentar efter att följande parametrar fylls i: CommentID.", + "apihelp-commentlatestid-description": "API:et commentlatestID gör det möjligt att hämta senaste kommentar-ID efter att följande parametrar fylls i: pageID", + "apihelp-commentlatestid-summary": "API:et commentlatestID gör det möjligt att hämta senaste kommentar-ID efter att följande parametrar fylls i: pageID", + "apihelp-commentlist-description": "API:et commentlist gör det möjligt att hämta flera kommentarer och matar ut dem som en lista efter att följande parametrar fylls i: pageID, order, pagerPage och showForm.", + "apihelp-commentlist-summary": "API:et commentlist gör det möjligt att hämta flera kommentarer och matar ut dem som en lista efter att följande parametrar fylls i: pageID, order, pagerPage och showForm.", + "apihelp-commentsubmit-description": "API:et commentsubmit gör det möjligt att skicka en kommentar efter att följande parametrar fylls i: pageID, parentID, commentText.", + "apihelp-commentsubmit-summary": "API:et commentsubmit gör det möjligt att skicka en kommentar efter att följande parametrar fylls i: pageID, parentID, commentText.", + "apihelp-commentvote-description": "API:et commentvote gör det möjligt att rösta på en kommentar efter att följande parametrar fylls i: pageID, parentID, commentText.", + "apihelp-commentvote-summary": "API:et commentvote gör det möjligt att rösta på en kommentar efter att följande parametrar fylls i: commentID, voteValue.", + "apihelp-commentblock-param-commentID": "Kommentar-ID för användarens kommentar som ska blockeras", + "apihelp-commentdelete-param-commentID": "Kommentar-ID för kommentaren att radera", + "apihelp-commentlatestid-param-pageID": "Sid-ID för sidan där den senaste kommentaren finns", + "apihelp-commentlist-param-pageID": "Sid-ID för sidan som kommentarslistan hämtas ifrån", + "apihelp-commentlist-param-order": "Definiera om kommentarslista sorteras fallande eller stigande", + "apihelp-commentlist-param-pagerPage": "Kommentarens sidnummer", + "apihelp-commentlist-param-showForm": "Visa kommentarformuläret", + "apihelp-commentsubmit-param-pageID": "Sid-ID för sidan där kommentaren som ska skickas finns", + "apihelp-commentsubmit-param-parentID": "Kommentar-ID för den överliggande kommentaren", + "apihelp-commentsubmit-param-commentText": "Kommentarstext", + "apihelp-commentvote-param-commentID": "Kommentar-ID för kommentar som ska röstas", + "apihelp-commentvote-param-voteValue": "Röstvärde för kommentaren", + "comments-comment": "Kommentar", + "comments-desc": "Lägger till parserkroken <comments> som tillåter kommentarer på sidor", + "comments-db-locked": "

Lägga till kommentarer

Databasen är för tillfället låst för rutinerat underhåll, och kommer att fungera normalt när det är klart. Var god kom tillbaka senare!", + "comments-voted-label": "Röstade", + "comments-loading": "Läser in...", + "comments-auto-refresher-enable": "Aktivera autouppdatering av kommentar", + "comments-auto-refresher-pause": "Pausa autouppdatering av kommentarer", + "comments-reply-to": "Besvara {{GENDER:$2|$1}}", + "comments-cancel-reply": "Avbryt", + "comments-block-warning-anon": "Är du säker på att du vill ignorera alla kommentarer från denna anonyma användare permanent (via dess IP-adress)?", + "comments-block-warning-user": "Är du säker på att du vill ignorera alla kommentarer från användaren $1?", + "comments-delete-warning": "Är du säker på att du vill radera denna kommentar?", + "comments-sort-by-date": "Sortera efter datum", + "comments-sort-by-score": "Sortera efter poäng", + "comments-show-comment-link": "Visa kommentar", + "comments-manage-blocklist-link": "Hantera ignoreringslista", + "comments-ignore-message": "Du ignorerar författaren till denna kommentar", + "comments-you": "Du", + "comments-reply": "Svara", + "comments-login-required": "Du måste vara inloggad för att lägga till kommentarer", + "comments-not-allowed": "Du får inte posta kommentarer.", + "comments-post": "Skicka kommentar", + "comments-submit": "Lägg till din kommentar", + "comments-score-text": "Poäng", + "comments-permalink": "Permanent länk", + "comments-delete-link": "Radera kommentar", + "comments-anon-name": "Anonym användare", + "comments-anon-message": "{{SITENAME}} välkomnar alla kommentarer. Om du inte vill vara anonym kan du registrera eller logga in. Det är gratis.", + "comments-links-are-forbidden": "Externa länkar i kommentarer är förbjudna!", + "comments-is-spam": "Texten i kommentaren tolkades som spam.", + "comments-ignore-item": "$2 den $3 (ta bort blockering)", + "comments-ignore-no-users": "Det finns inga användare som är blockerade för tillfället.", + "comments-ignore-remove-message": "Är du säker på att du vill ta bort blockeringen för användaren $1s kommentarer?", + "comments-ignore-unblock": "Ta bort blockering", + "comments-ignore-cancel": "Avbryt", + "comments-ignore-title": "Ignoreringslista för kommentarer", + "commentignorelist": "Ignoreringslista för kommentarer", + "comments-no-comments-of-day": "Det finns inga kommentarer idag.", + "log-name-comments": "Kommentarlogg", + "log-description-comments": "Detta är en logg för kommentarer.", + "logentry-comments-add": "$1 har postat en ny kommentar på $3", + "logentry-comments-delete": "$1 borttagen kommentar #$4 på $3", + "comments-time-ago": "$1 sedan", + "comments-time-months": "{{PLURAL:$1|en månad|$1 månader}}", + "comments-time-days": "{{PLURAL:$1|en dag|$1 dagar}}", + "comments-time-hours": "{{PLURAL:$1|en timme|$1 timmar}}", + "comments-time-minutes": "{{PLURAL:$1|en minut|$1 minuter}}", + "comments-time-seconds": "{{PLURAL:$1|en sekund|$1 sekunder}}", + "log-show-hide-comments": "$1 kommentarlogg", + "group-commentadmin": "Kommentaradministratörer", + "group-commentadmin-member": "{{GENDER:$1|kommentaradministratör}}", + "grouppage-commentadmin": "{{ns:project}}:Kommentaradministratörer", + "right-comment": "Skicka kommentarer", + "right-commentadmin": "Administrera kommentarer som användare har skickat", + "right-commentlinks": "Använd externa länkar i kommentarer" +} diff --git a/i18n/sw.json b/i18n/sw.json new file mode 100644 index 0000000..186a4c2 --- /dev/null +++ b/i18n/sw.json @@ -0,0 +1,15 @@ +{ + "@metadata": { + "authors": [ + "Stephenwanjau" + ] + }, + "comments-loading": "Inapakiwa...", + "comments-you": "Wewe", + "comments-reply": "Jibu", + "comments-post": "Chapisha maoni", + "comments-submit": "Ongeza maoni yako", + "comments-delete-link": "Futa maoni", + "comments-ignore-cancel": "Ghairi", + "log-name-comments": "Kumbukumbu ya maoni" +} diff --git a/i18n/ta.json b/i18n/ta.json new file mode 100644 index 0000000..db65d5b --- /dev/null +++ b/i18n/ta.json @@ -0,0 +1,41 @@ +{ + "@metadata": { + "authors": [ + "Shanmugamp7" + ] + }, + "comments-comment": "கருத்து", + "comments-voted-label": "வாக்களிக்கப்பட்டது", + "comments-loading": "ஏற்றப்படுகிறது...", + "comments-cancel-reply": "ரத்து செய்", + "comments-sort-by-date": "தேதியைப பொறுத்து வரிசைப்படுத்து", + "comments-show-comment-link": "கருத்தை காட்டு", + "comments-you": "தாங்கள்", + "comments-reply": "பதில் அளி", + "comments-login-required": "கருத்துக்களை சேர்க்க நீங்கள் புகுபதிகை செய்ய வேண்டும்", + "comments-not-allowed": "கருத்துகளை பதிவு செய்ய நீங்கள் அனுமதிக்கப்படவில்லை.", + "comments-post": "கருத்துக்களை பதியவும்", + "comments-submit": "உங்கள் கருத்தை சேர்க்கவும்", + "comments-score-text": "பெறுபுள்ளி", + "comments-permalink": "நிரந்தர இணைப்பு", + "comments-delete-link": "கருத்தை நீக்கவும்", + "comments-anon-name": "அடையாளம் காட்டாத பயனர்", + "comments-ignore-no-users": "தற்போது தடை செய்யப்பட பயனர்கள் யாரும் இல்லை.", + "comments-ignore-remove-message": "நீங்கள் உறுதியாக $1-ன் கருத்துக்களை தடை நீக்க விரும்புகிறீர்களா?", + "comments-ignore-unblock": "தடை நீக்கு", + "comments-ignore-cancel": "ரத்து செய்", + "comments-ignore-title": "கருத்து புறக்கணிப்பு பட்டியல்", + "commentignorelist": "கருத்து புறக்கணிப்பு பட்டியல்", + "log-name-comments": "கருத்துகள் பதிகை", + "log-description-comments": "இது கருத்துகளின் பதிகை ஆகும்.", + "comments-time-ago": "$1 முன்பு", + "comments-time-days": "{{PLURAL:$1|ஒரு நாள்|$1 நாட்கள்}}", + "comments-time-hours": "{{PLURAL:$1|ஒரு மணி|$1 மணிகள்}}", + "comments-time-minutes": "{{PLURAL:$1|ஒரு நிமிடம்|$1 நிமிடங்கள்}}", + "comments-time-seconds": "{{PLURAL:$1|ஒரு வினாடி|$1 வினாடிகள்}}", + "log-show-hide-comments": "$1 கருத்து பதிகை", + "group-commentadmin": "கருத்து நிர்வாகிகள்", + "group-commentadmin-member": "{{GENDER:$1|கருத்து நிர்வாகி}}", + "grouppage-commentadmin": "{{ns:project}}:கருத்து நிர்வாகிகள்", + "right-comment": "கருத்துகளை அனுப்பவும்" +} diff --git a/i18n/te.json b/i18n/te.json new file mode 100644 index 0000000..f82c696 --- /dev/null +++ b/i18n/te.json @@ -0,0 +1,42 @@ +{ + "@metadata": { + "authors": [ + "Chaduvari", + "Ravichandra", + "Veeven", + "Kiranmayee" + ] + }, + "comments-comment": "వ్యాఖ్య", + "comments-voted-label": "ఓటేశారు", + "comments-loading": "లోడవుతోంది...", + "comments-reply-to": "{{GENDER:$2|$1}}కి సమాధానం", + "comments-cancel-reply": "రద్దుచేయి", + "comments-delete-warning": "మీరు నిజంగానే ఈ వ్యాఖ్యను తొలగించాలని అనుకుంటున్నారా?", + "comments-sort-by-date": "తేది ప్రకారం అమర్చు", + "comments-sort-by-score": "స్కోరు ప్రకారం అమర్చు", + "comments-show-comment-link": "వ్యాఖ్యను చూపించు", + "comments-you": " మీరు", + "comments-reply": "స్పందించండి", + "comments-login-required": "వ్యాఖ్యలను చేర్చడానికి మీరు ప్రవేశించి ఉండాలి", + "comments-not-allowed": "వ్యాఖ్యానించే అనుమతి మీకు లేదు.", + "comments-submit": "మీ వ్యాఖ్యను చేర్చండి", + "comments-score-text": "స్కోరు", + "comments-permalink": "స్థిరలంకె", + "comments-delete-link": "వ్యాఖ్యను తొలగించు", + "comments-anon-name": "అజ్ఞాత వాడుకరి", + "comments-ignore-no-users": "ప్రస్తుతం నిరోధించబడిన వాడుకరులెవరూ లేరు.", + "comments-ignore-remove-message": "$1 యొక్క వ్యాఖ్యల నిరోధాన్ని ఎత్తివెయ్యాలనే మీరు నిశ్చయించుకున్నారా?", + "comments-ignore-unblock": "నిరోధాన్ని ఎత్తివేయి", + "comments-ignore-cancel": "రద్దుచేయి", + "log-name-comments": "వ్యాఖ్యల చిట్టా", + "log-description-comments": "ఇది వ్యాఖ్యల యొక్క చిట్టా.", + "comments-time-ago": "$1 క్రితం", + "comments-time-months": "{{PLURAL:$1|ఒక నెల|$1 నెలల}}", + "comments-time-days": "{{PLURAL:$1|ఒక రోజు|$1 రోజుల}}", + "comments-time-hours": "{{PLURAL:$1|ఒక గంట|$1 గంటల}}", + "comments-time-minutes": "{{PLURAL:$1|ఒక నిమిషం|$1 నిమిషాల}}", + "comments-time-seconds": "{{PLURAL:$1|$1 క్షణం|$1 క్షణాల}}", + "log-show-hide-comments": "వ్యాఖ్యల చిట్టాను $1", + "right-comment": "వ్యాఖ్యల్ని సమర్పించడం" +} diff --git a/i18n/th.json b/i18n/th.json new file mode 100644 index 0000000..2241250 --- /dev/null +++ b/i18n/th.json @@ -0,0 +1,62 @@ +{ + "@metadata": { + "authors": [ + "XthemeCore" + ] + }, + "comments-comment": "ความคิดเห็น", + "comments-desc": "เพิ่ม <comments> parser hook ซึ่งทำให้สามารถในการแสดงความคิดเห็นได้", + "comments-db-locked": "

เพิ่มความเห็นเห็น

ขออภัย ขณะนี้้ฐานข้อมูลถูกปิดการใช้งานเพื่อทำการบำรุงรักษา กรุณาลองใหม่ในภายหลัง", + "comments-voted-label": "โหวต", + "comments-loading": "กำลังโหลด...", + "comments-auto-refresher-enable": "เปิดการ รีเฟรส ความคิดเห็นอัตโนมัติ", + "comments-auto-refresher-pause": "หยุดการ รีเฟรส ความคิดเห็นอัตโนมัติ", + "comments-reply-to": "ตอบกลับ {{GENDER:$2|$1}}", + "comments-cancel-reply": "ยกเลิก", + "comments-block-warning-anon": "คุณต้องการเพิกเฉยความคิดเห็นทั้งหมดของผู้ใช้ไม่ระบุตัวตนอย่างถาวร (ผ่าน หมายเลขที่อยู่ไอพี ของพวกเขา)หรือไม่", + "comments-block-warning-user": "คุณต้องการเพิกเฉยความคิดเห็นทั้งหมดของ $1 อย่างถาวรหรือไม่", + "comments-delete-warning": "คุณต้องการลบความคิดเห็นนี้หรือไม่", + "comments-sort-by-date": "เรียงตามวันที่", + "comments-sort-by-score": "เรียงตามคะแนน", + "comments-show-comment-link": "ดูความคิดเห็น", + "comments-manage-blocklist-link": "จัดการรายการที่ถูกละเว้น", + "comments-ignore-message": "คุณกำลังเพิกเฉยผู้แสดงความคิดเห็นนี้", + "comments-you": "คุณ", + "comments-reply": "ตอบกลับ", + "comments-login-required": "คุณต้องเข้าสู่ระบบเพื่อแสดงความคิดเห็น", + "comments-not-allowed": "คุณไม่ได้รับอนุญาตให้แสดงความคิดเห็น", + "comments-post": "แสดงความคิดเห็น", + "comments-submit": "เพิ่มความคิดเห็นของคุณ", + "comments-score-text": "คะแนนโหวต", + "comments-permalink": "ลิงก์ถาวร", + "comments-delete-link": "ลบความคิดเห็น", + "comments-anon-name": "ผู้ใช้ไม่ระบุตัวตน", + "comments-anon-message": "{{SITENAME}} ขอน้อมรับ ทุกความคิดเห็น คุณกำลังใช้งานในฐานะผู้ใช้ไม่ระบุตัวตน ลงทะเบียน | เข้าสู่ระบบ", + "comments-links-are-forbidden": "ไม่อนุญาตให้แสดงความคิดเห็นที่มีการแนบลิงก์จากภายนอก", + "comments-is-spam": "ความคิดเห็นมีลักษณะเป็นสแปม", + "comments-ignore-item": "$2 เมื่อ $3 (ปลดล็อค)", + "comments-ignore-no-users": "ขณะนี้ไม่มีผู้ใช้ใดถูกล็อค", + "comments-ignore-remove-message": "คุณต้องการปลดล็อค ความคิดเห็นของผู้ใช้ $1 หรือไม่", + "comments-ignore-unblock": "ปลดล็อค", + "comments-ignore-cancel": "ยกเลิก", + "comments-ignore-title": "รายการความคิดเห็นที่ถูกเพิกเฉย", + "commentignorelist": "รายการความคิดเห็นที่ถูกเพิกเฉย", + "comments-no-comments-of-day": "ไม่มีความคิดเห็นประจำวันนี้", + "log-name-comments": "บันทึกรายการความคิดเห็น", + "log-description-comments": "นี่คือบันทึกรายการความคิดเห็น", + "logentry-comments-add": "$1 แสดงความคิดเห็นใน $3", + "logentry-comments-delete": "$1 ลบความคิดเห็นหมายเลข #$4 ใน $3", + "comments-time-ago": "เมื่อ $1", + "comments-time-months": "{{PLURAL:$1|เดือนเดียว|$1 เดือน}}", + "comments-time-days": "{{PLURAL:$1|วันเดียว|$1 วัน}}", + "comments-time-hours": "{{PLURAL:$1|ชั่วโมงเดียว|$1 ชั่วโมง}}", + "comments-time-minutes": "{{PLURAL:$1|นาทีเดียว|$1 นาที}}", + "comments-time-seconds": "{{PLURAL:$1|วินาทีเดียว|$1 วินาที}}", + "log-show-hide-comments": "$1 บันทึกรายการความคิดเห็น", + "group-commentadmin": "ผู้ดูแลระบบ", + "group-commentadmin-member": "{{GENDER:$1|ผู้ดูแลระบบ}}", + "grouppage-commentadmin": "{{ns:project}}:ผู้ดูแลระบบ", + "right-comment": "แสดงความคิดเห็น", + "right-commentadmin": "จัดการความคิดเห็น", + "right-commentlinks": "สามารถใช้ลิงก์จากภายนอกในความคิดเห็น" +} diff --git a/i18n/tt-cyrl.json b/i18n/tt-cyrl.json new file mode 100644 index 0000000..6e074c1 --- /dev/null +++ b/i18n/tt-cyrl.json @@ -0,0 +1,8 @@ +{ + "@metadata": { + "authors": [ + "Ильнар" + ] + }, + "comments-time-ago": "$1 элек" +} diff --git a/i18n/tzm.json b/i18n/tzm.json new file mode 100644 index 0000000..6fe144b --- /dev/null +++ b/i18n/tzm.json @@ -0,0 +1,12 @@ +{ + "@metadata": { + "authors": [ + "Tifinaghes" + ] + }, + "comments-comment": "ⵜⴰⵏⵏⴰⵢⵜ", + "comments-you": "ⴽⴻⵢⵢ", + "comments-reply": "ⵔⴰⵔ", + "comments-post": "ⵔⵏⵓ ⵜⴰⵏⵏⴰⵢⵜ", + "comments-submit": "ⵔⵏⵓ ⵜⴰⵏⵏⴰⵢⵜ" +} diff --git a/i18n/udm.json b/i18n/udm.json new file mode 100644 index 0000000..ab283bc --- /dev/null +++ b/i18n/udm.json @@ -0,0 +1,8 @@ +{ + "@metadata": { + "authors": [ + "Kaganer" + ] + }, + "comments-ignore-cancel": "Берытсконо" +} diff --git a/i18n/uk.json b/i18n/uk.json new file mode 100644 index 0000000..89ca18b --- /dev/null +++ b/i18n/uk.json @@ -0,0 +1,91 @@ +{ + "@metadata": { + "authors": [ + "Ahonc", + "Andriykopanytsia", + "Base", + "RLuts", + "Ата", + "Piramidion" + ] + }, + "apihelp-commentblock-description": "Commentblock API дозволяє заблокувати користувача за коментарем, за яким його можна відстежити, заповнивши такий параметр: CommentID.", + "apihelp-commentblock-summary": "Commentblock API дозволяє заблокувати користувача за коментарем, за яким його можна відстежити, заповнивши такий параметр: CommentID.", + "apihelp-commentdelete-description": "Commentdelete API дозволяє вилучити коментар після заповнення такого параметра: CommentID.", + "apihelp-commentdelete-summary": "Commentdelete API дозволяє вилучити коментар після заповнення такого параметра: CommentID.", + "apihelp-commentlatestid-description": "CommentlatestID API дозволяє отримати останній ідентифікатор коментаря після заповнення такого параметра: pageID", + "apihelp-commentlatestid-summary": "CommentlatestID API дозволяє отримати останній ідентифікатор коментаря після заповнення такого параметра: pageID", + "apihelp-commentlist-description": "Commentlist API отримує декілька коментарів і виводить їх як список після заповнення таких параметрів: pageID, order, pagerPage, і showForm.", + "apihelp-commentlist-summary": "Commentlist API отримує декілька коментарів і виводить їх як список після заповнення таких параметрів: pageID, order, pagerPage, і showForm.", + "apihelp-commentsubmit-description": "Commentsubmit API дозволяє надіслати/опублікувати коментар після заповнення таких параметрів: pageID, parentID, commentText.", + "apihelp-commentsubmit-summary": "Commentsubmit API дозволяє надіслати/опублікувати коментар після заповнення таких параметрів: pageID, parentID, commentText.", + "apihelp-commentvote-description": "Commentvote API дозволяє проголосувати щодо коментаря після заповнення таких параметрів: commentID, voteValue.", + "apihelp-commentvote-summary": "Commentvote API дозволяє проголосувати щодо коментаря після заповнення таких параметрів: commentID, voteValue.", + "apihelp-commentblock-param-commentID": "Ідентифікатор коментаря, залишеного користувачем, якого треба заблокувати", + "apihelp-commentdelete-param-commentID": "Ідентифікатор коментаря, якого треба вилучити", + "apihelp-commentlatestid-param-pageID": "Ідентифікатор сторінки, на якій розміщено останній коментар", + "apihelp-commentlist-param-pageID": "Ідентифікатор сторінки, з якої отримується список коментарів", + "apihelp-commentlist-param-order": "Визначається, чи список коментарів має бути у висхідному чи низхідному порядку", + "apihelp-commentlist-param-pagerPage": "Номер сторінки з коментарями", + "apihelp-commentlist-param-showForm": "Показати форму коментарів", + "apihelp-commentsubmit-param-pageID": "Ідентифікатор сторінки, на якій треба розмістити коментар", + "apihelp-commentsubmit-param-parentID": "Ідентифікатор батьківського коментаря", + "apihelp-commentsubmit-param-commentText": "Текст коментаря", + "apihelp-commentvote-param-commentID": "Ідентифікатор коментаря, щодо якого здійснюється голосування", + "apihelp-commentvote-param-voteValue": "Значення голосу для коментаря", + "comments-comment": "Коментарі", + "comments-desc": "Додає у парсер обробку <comments>, що вмикає підтримки коментування на сторінках", + "comments-db-locked": "

Додавання коментування

Базу даних наразі заблоковано для опрацювання, після якого вона повернеться у норму. Будь ласка, перевірте пізніше!", + "comments-voted-label": "Проголосували", + "comments-loading": "Завантаження…", + "comments-auto-refresher-enable": "Увімкнути автоновлення коментарів", + "comments-auto-refresher-pause": "Призупинити автооновлення коментарів", + "comments-reply-to": "Відповісти {{GENDER:$2|користувачу|користувачці}} $1", + "comments-cancel-reply": "Скасувати", + "comments-block-warning-anon": "Ви дійсно бажаєте постійно ігнорувати коментарі від цього анонімного користувача (за IP-адресою)?", + "comments-block-warning-user": "Ви дісно хочете постійно ігнорувати усі коментарі {{GENDER:$1|користувача|користувачки}} $1?", + "comments-delete-warning": "Ви дійсно бажаєте вилучити цей коментар?", + "comments-sort-by-date": "Сортувати за датою", + "comments-sort-by-score": "Сортувати за оцінками", + "comments-show-comment-link": "Показати коментар", + "comments-manage-blocklist-link": "Керувати списками ігнорування", + "comments-ignore-message": "Ви ігноруєте автора цього коментраря", + "comments-you": "Ви", + "comments-reply": "Відповісти", + "comments-login-required": "Ви повинні увійти до системи, щоб додавати коментарі", + "comments-not-allowed": "Вам не дозволено надсилати коментарі.", + "comments-post": "Надіслати коментар", + "comments-submit": "Додати свій коментар", + "comments-score-text": "Оцінка", + "comments-permalink": "Постійне посилання", + "comments-delete-link": "Вилучити коментар", + "comments-anon-name": "Анонімний користувач", + "comments-anon-message": "{{SITENAME}} вітає усі коментарі. Якщо Ви не хочете бути анонімними, зареєструйтесь або увійдіть. Це безкоштовно.", + "comments-links-are-forbidden": "Зовнішні посилання у коментарях - заборонені!", + "comments-is-spam": "Поданий текст коментаря був сприйнятий як спам.", + "comments-ignore-item": "$2, заблоковано $3 (розблокувати)", + "comments-ignore-no-users": "Користувачів, яких наразі заблоковано, немає.", + "comments-ignore-remove-message": "Ви впевнені, що хочете розблокувати коментарі користувача $1?", + "comments-ignore-unblock": "Розблокувати", + "comments-ignore-cancel": "Скасувати", + "comments-ignore-title": "Список коментарів, що ігноруються", + "commentignorelist": "Список коментарів, що ігноруються", + "comments-no-comments-of-day": "Сьогодні коментарів немає.", + "log-name-comments": "Журнал коментарів", + "log-description-comments": "Це журнал коментарів.", + "logentry-comments-add": "$1 {{GENDER:$1|додав|додала}} новий коментар на сторінку $3", + "logentry-comments-delete": "$1 видалив коментар #$4 на $3", + "comments-time-ago": "$1 тому", + "comments-time-months": "{{PLURAL:$1|$1 місяць|$1 місяців|$1 місяці}}", + "comments-time-days": "$1 {{PLURAL:$1|день|дні|днів}}", + "comments-time-hours": "$1 {{PLURAL:$1|годину|години|годин}}", + "comments-time-minutes": "$1 {{PLURAL:$1|хвилину|хвилини|хвилин}}", + "comments-time-seconds": "$1 {{PLURAL:$1|секунду|секунди|секунд}}", + "log-show-hide-comments": "$1 журнал коментарів", + "group-commentadmin": "Адміністратор коментарів", + "group-commentadmin-member": "{{GENDER:$1|адміністратор коментарів|адміністраторка коментрарів}}", + "grouppage-commentadmin": "{{ns:project}}:Адміністратори коментарів", + "right-comment": "робити коментарі", + "right-commentadmin": "Адмініструвати надіслані користувачами коментарі", + "right-commentlinks": "Вживати зовнішні посилання у коментарях" +} diff --git a/i18n/uz.json b/i18n/uz.json new file mode 100644 index 0000000..78188d2 --- /dev/null +++ b/i18n/uz.json @@ -0,0 +1,8 @@ +{ + "@metadata": { + "authors": [ + "Sociologist" + ] + }, + "comments-ignore-unblock": "Toʻsiqni olib tashlash" +} diff --git a/i18n/yi.json b/i18n/yi.json new file mode 100644 index 0000000..f40a945 --- /dev/null +++ b/i18n/yi.json @@ -0,0 +1,16 @@ +{ + "@metadata": { + "authors": [ + "פוילישער" + ] + }, + "comments-comment": "הערה", + "comments-loading": "אָנלאָדן...", + "comments-reply-to": "ענטפֿערן {{GENDER:$2|$1}}", + "comments-cancel-reply": "אַנולירן", + "comments-you": "איר", + "comments-reply": "אָנרופֿן", + "comments-time-months": "{{PLURAL:$1|איין מאנאַט|$1 מאנאַטן}}", + "comments-time-hours": "{{PLURAL:$1|איין שעה|$1 שעה׳ן}}", + "comments-time-minutes": "{{PLURAL:$1|איין מינוט|$1 מינוט}}" +} diff --git a/i18n/yo.json b/i18n/yo.json new file mode 100644 index 0000000..4ce5530 --- /dev/null +++ b/i18n/yo.json @@ -0,0 +1,12 @@ +{ + "@metadata": { + "authors": [ + "Demmy" + ] + }, + "comments-time-ago": "$1 sẹ́yìn", + "comments-time-days": "{{PLURAL:$1|ọjọ́ kan|ọjọ́ $1}}", + "comments-time-hours": "{{PLURAL:$1|wákàtí kan|wákàtí $1}}", + "comments-time-minutes": "{{PLURAL:$1|ìṣẹ́jú kan|ìṣẹ́jú $1}}", + "comments-time-seconds": "{{PLURAL:$1|ìṣẹ́júàáyá kan|ìṣẹ́júàáyá $1}}" +} diff --git a/i18n/zh-hans.json b/i18n/zh-hans.json new file mode 100644 index 0000000..8cf8c30 --- /dev/null +++ b/i18n/zh-hans.json @@ -0,0 +1,93 @@ +{ + "@metadata": { + "authors": [ + "Hydra", + "Hzy980512", + "Shirayuki", + "TianyinLee", + "Yfdyh000", + "Liuxinyu970226", + "Mywood", + "Impersonator 1" + ] + }, + "apihelp-commentblock-description": "评论封禁API允许封禁用户的评论权,它在填写以下参数后出现:评论ID。", + "apihelp-commentblock-summary": "评论封禁API允许封禁用户的评论权,它在填写以下参数后出现:评论ID。", + "apihelp-commentdelete-description": "评论封禁API允许删除评论,在填写完以下参数的情况下:评论ID。", + "apihelp-commentdelete-summary": "评论封禁API允许删除评论,在填写完以下参数的情况下:评论ID。", + "apihelp-commentlatestid-description": "评论最新ID API允许检索最近评论的ID,在填写完以下参数的情况下:页面ID。", + "apihelp-commentlatestid-summary": "评论最新ID API允许检索最近评论的ID,在填写完以下参数的情况下:页面ID。", + "apihelp-commentlist-description": "评论列表API检索多条评论,并将其输出为列表,在填写完以下参数的情况下:页面ID、排序、纸张页面及显示表单。", + "apihelp-commentlist-summary": "评论列表API检索多条评论,并将其输出为列表,在填写完以下参数的情况下:页面ID、排序、纸张页面及显示表单。", + "apihelp-commentsubmit-description": "评论提交API允许提交/发布评论,在填写完以下参数的情况下:页面ID、父ID及评论文本。", + "apihelp-commentsubmit-summary": "评论提交API允许提交/发布评论,在填写完以下参数的情况下:页面ID、父ID及评论文本。", + "apihelp-commentvote-description": "评论投票API允许对评论投票,在填写完以下参数的情况下:评论ID及投票值。", + "apihelp-commentvote-summary": "评论投票API允许对评论投票,在填写完以下参数的情况下:评论ID及投票值。", + "apihelp-commentblock-param-commentID": "由要被封禁的用户所作出评论的评论ID", + "apihelp-commentdelete-param-commentID": "要删除的评论的评论ID", + "apihelp-commentlatestid-param-pageID": "出现最新评论页面的页面ID", + "apihelp-commentlist-param-pageID": "取回评论列表的页面的页面ID", + "apihelp-commentlist-param-order": "定义评论以升序还是以降序排列", + "apihelp-commentlist-param-pagerPage": "评论页数", + "apihelp-commentlist-param-showForm": "显示评论来自", + "apihelp-commentsubmit-param-pageID": "要提交评论的页面的页面ID", + "apihelp-commentsubmit-param-parentID": "父评论的评论ID", + "apihelp-commentsubmit-param-commentText": "评论文本", + "apihelp-commentvote-param-commentID": "已投票评论的评论ID", + "apihelp-commentvote-param-voteValue": "用于评论的投票值", + "comments-comment": "评论", + "comments-desc": "增加<comments>解析器钩,允许在页面上发表评论", + "comments-db-locked": "

添加评论

数据库当前因正在进行日常维护而被锁定,过会它会恢复正常。请稍后再来!", + "comments-voted-label": "已投票", + "comments-loading": "载入中...", + "comments-auto-refresher-enable": "开启评论自动刷新", + "comments-auto-refresher-pause": "关闭评论自动刷新", + "comments-reply-to": "回复{{GENDER:$2|$1}}", + "comments-cancel-reply": "取消", + "comments-block-warning-anon": "您确定要永久忽略来自此IP地址的所有评论吗?", + "comments-block-warning-user": "您确定要永久忽略来自用户 $1 的所有评论吗?", + "comments-delete-warning": "您确定要删除此评论吗?", + "comments-sort-by-date": "按日期排序", + "comments-sort-by-score": "按分数排序", + "comments-show-comment-link": "显示评论", + "comments-manage-blocklist-link": "管理忽略列表", + "comments-ignore-message": "您正在忽略此评论的作者", + "comments-you": "您", + "comments-reply": "回复", + "comments-login-required": "您必须登录才能添加评论", + "comments-not-allowed": "您未被允许发表评论。", + "comments-post": "发表评论", + "comments-submit": "添加您的评论", + "comments-score-text": "分数", + "comments-permalink": "固定链接", + "comments-delete-link": "删除评论", + "comments-anon-name": "匿名用户", + "comments-anon-message": "{{SITENAME}}欢迎所有评论。如果您不想匿名,注册登录。它是免费的。", + "comments-links-are-forbidden": "评论中禁止外部链接!", + "comments-is-spam": "提交的评论文本像是垃圾信息。", + "comments-ignore-item": "$2于$3 (解封)", + "comments-ignore-no-users": "目前没有用户被屏蔽。", + "comments-ignore-remove-message": "您确定要解封$1的评论吗?", + "comments-ignore-unblock": "解封", + "comments-ignore-cancel": "取消", + "comments-ignore-title": "评论忽略名单", + "commentignorelist": "评论忽略名单", + "comments-no-comments-of-day": "今天没有新的评论。", + "log-name-comments": "评论日志", + "log-description-comments": "这是评论的日志。", + "logentry-comments-add": "$1在$3上添加了一则新评论", + "logentry-comments-delete": "$1删除了$3上的评论#$4", + "comments-time-ago": "$1前", + "comments-time-months": "{{PLURAL:$1|$1个月}}", + "comments-time-days": "{{PLURAL:$1|$1天}}", + "comments-time-hours": "{{PLURAL:$1|$1小时}}", + "comments-time-minutes": "{{PLURAL:$1|$1分钟}}", + "comments-time-seconds": "{{PLURAL:$1|$1秒}}", + "log-show-hide-comments": "$1评论日志", + "group-commentadmin": "评论管理员", + "group-commentadmin-member": "{{GENDER:$1|评论管理员}}", + "grouppage-commentadmin": "{{ns:project}}:评论管理员", + "right-comment": "提交评论", + "right-commentadmin": "管理用户提交的评论", + "right-commentlinks": "评论中使用外部链接" +} diff --git a/i18n/zh-hant.json b/i18n/zh-hant.json new file mode 100644 index 0000000..33f4f5d --- /dev/null +++ b/i18n/zh-hant.json @@ -0,0 +1,69 @@ +{ + "@metadata": { + "authors": [ + "Justincheng12345", + "Shirayuki", + "Simon Shek", + "Mywood", + "Cwlin0416", + "Impersonator 1", + "Liuxinyu970226", + "LNDDYL" + ] + }, + "comments-comment": "評論", + "comments-desc": "增加 <comments> 語法分析器連結,允許在頁面上發表評論", + "comments-db-locked": "

增加評論

資料庫因例行性維護目前已鎖定,待維護作業完成後會恢復正常。請稍後再檢查一次。", + "comments-voted-label": "已投票", + "comments-loading": "讀取中...", + "comments-auto-refresher-enable": "啟用自動更新評論", + "comments-auto-refresher-pause": "暫停自動更新評論", + "comments-reply-to": "回覆 {{GENDER:$2|$1}}", + "comments-cancel-reply": "取消", + "comments-block-warning-anon": "您確定要永久忽略所有來自此匿名使用者的評論 (透過 IP 位址) ?", + "comments-block-warning-user": "您確定要永久忽略所有來自使用者 $1 的評論?", + "comments-delete-warning": "您確定要刪除此評論?", + "comments-sort-by-date": "依日期排序", + "comments-sort-by-score": "依分數排序", + "comments-show-comment-link": "顯示評論", + "comments-manage-blocklist-link": "管理忽略清單", + "comments-ignore-message": "您已忽略此評論的作者", + "comments-you": "您", + "comments-reply": "回覆", + "comments-login-required": "您必須登入以發表評論。", + "comments-not-allowed": "您未被允許發表評論。", + "comments-post": "發表評論", + "comments-submit": "發表您的評論", + "comments-score-text": "分數", + "comments-permalink": "靜態連結", + "comments-delete-link": "刪除評論", + "comments-anon-name": "匿名使用者", + "comments-anon-message": "{{SITENAME}} 歡迎任何評論。若您不想以匿名發表評論,請 註冊登入。這是免費的。", + "comments-links-are-forbidden": "評論內容禁止使用外部連結!", + "comments-is-spam": "已送出的評論內容被判定為垃圾訊息。", + "comments-ignore-item": "$2 於 $3 (解除封鎖)", + "comments-ignore-no-users": "目前沒有使用者被封鎖。", + "comments-ignore-remove-message": "您確定要取消封鎖使用者 $1 的評論?", + "comments-ignore-unblock": "解除封鎖", + "comments-ignore-cancel": "取消", + "comments-ignore-title": "評論忽略清單", + "commentignorelist": "評論忽略清單", + "comments-no-comments-of-day": "當天沒有任何評論。", + "log-name-comments": "評論日誌", + "log-description-comments": "此為評論的日誌。", + "logentry-comments-add": "$1 已發表新的評論於 $3", + "logentry-comments-delete": "$1 已刪除評論 #$4 於 $3", + "comments-time-ago": "$1 前", + "comments-time-months": "$1 個月", + "comments-time-days": "$1 天", + "comments-time-hours": "$1 小時", + "comments-time-minutes": "$1 分鍾", + "comments-time-seconds": "$1 秒", + "log-show-hide-comments": "$1評論日誌", + "group-commentadmin": "評論管理員", + "group-commentadmin-member": "{{GENDER:$1|評論管理員}}", + "grouppage-commentadmin": "{{ns:project}}:Comment administrators", + "right-comment": "送出評論", + "right-commentadmin": "管理使用者送出的評論", + "right-commentlinks": "在評論中使用外部連結" +} diff --git a/includes/Comment.class.php b/includes/Comment.class.php new file mode 100644 index 0000000..1d56f1a --- /dev/null +++ b/includes/Comment.class.php @@ -0,0 +1,858 @@ + tag is in + */ + public $page = null; + + /** + * @var Integer: total amount of comments by distinct commenters that the + * current page has + */ + public $commentTotal = 0; + + /** + * @var String: text of the current comment + */ + public $text = null; + + /* START Anpassung znilwiki */ + public $CommentUsernameKOK = null; /* 25.10.2013 von Kai-Ole Kirsten */ + /* ENDE Anpassung znilwiki */ + + /** + * Date when the comment was posted + * + * @var null + */ + public $date = null; + + /** + * @var Integer: internal ID number (Comments.CommentID DB field) of the + * current comment that we're dealing with + */ + public $id = 0; + + /** + * @var Integer: ID of the parent comment, if this is a child comment + */ + public $parentID = 0; + + /** + * The current vote from this user on this comment + * + * @var int|boolean: false if no vote, otherwise -1, 0, or 1 + */ + public $currentVote = false; + + /** + * @var string: comment score (SUM() of all votes) of the current comment + */ + public $currentScore = '0'; + + /** + * Username of the user who posted the comment + * + * @var string + */ + public $username = ''; + + /** + * IP of the comment poster + * + * @var string + */ + public $ip = ''; + + /** + * ID of the user who posted the comment + * + * @var int + */ + public $userID = 0; + + /** + * @TODO document + * + * @var int + */ + public $userPoints = 0; + + /** + * Comment ID of the thread this comment is in + * this is the ID of the parent comment if there is one, + * or this comment if there is not + * Used for sorting + * + * @var null + */ + public $thread = null; + + /** + * Unix timestamp when the comment was posted + * Used for sorting + * Processed from $date + * + * @var null + */ + public $timestamp = null; + + /** + * Constructor - set the page ID + * + * @param $page CommentsPage: ID number of the current page + * @param IContextSource $context + * @param $data: straight from the DB about the comment + */ + public function __construct( CommentsPage $page, $context = null, $data ) { + $this->page = $page; + + $this->setContext( $context ); + + $this->username = $data['Comment_Username']; + $this->ip = $data['Comment_IP']; + $this->text = $data['Comment_Text']; + $this->date = $data['Comment_Date']; + $this->userID = $data['Comment_user_id']; + $this->userPoints = $data['Comment_user_points']; + $this->id = $data['CommentID']; + $this->parentID = $data['Comment_Parent_ID']; + $this->thread = $data['thread']; + $this->timestamp = $data['timestamp']; + + if ( isset( $data['current_vote'] ) ) { + $vote = $data['current_vote']; + } else { + $dbr = wfGetDB( DB_SLAVE ); + $row = $dbr->selectRow( + 'Comments_Vote', + array( 'Comment_Vote_Score' ), + array( + 'Comment_Vote_ID' => $this->id, + 'Comment_Vote_Username' => $this->getUser()->getName() + ), + __METHOD__ + ); + if ( $row !== false ) { + $vote = $row->Comment_Vote_Score; + } else { + $vote = false; + } + } + + $this->currentVote = $vote; + + $this->currentScore = isset( $data['total_vote'] ) + ? $data['total_vote'] : $this->getScore(); + } + + public static function newFromID( $id ) { + $context = RequestContext::getMain(); + $dbr = wfGetDB( DB_SLAVE ); + + if ( !is_numeric( $id ) || $id == 0 ) { + return null; + } + + $tables = array(); + $params = array(); + $joinConds = array(); + + // Defaults (for non-social wikis) + $tables[] = 'Comments'; + $fields = array( + 'Comment_Username', 'Comment_IP', 'Comment_Text', + 'Comment_Date', 'Comment_Date AS timestamp', + 'Comment_user_id', 'CommentID', 'Comment_Parent_ID', + 'CommentID', 'Comment_Page_ID' + ); + + // If SocialProfile is installed, query the user_stats table too. + if ( + class_exists( 'UserProfile' ) && + $dbr->tableExists( 'user_stats' ) + ) { + $tables[] = 'user_stats'; + $fields[] = 'stats_total_points'; + $joinConds = array( + 'Comments' => array( + 'LEFT JOIN', 'Comment_user_id = stats_user_id' + ) + ); + } + + // Perform the query + $res = $dbr->select( + $tables, + $fields, + array( 'CommentID' => $id ), + __METHOD__, + $params, + $joinConds + ); + + $row = $res->fetchObject(); + + if ( $row->Comment_Parent_ID == 0 ) { + $thread = $row->CommentID; + } else { + $thread = $row->Comment_Parent_ID; + } + $data = array( + 'Comment_Username' => $row->Comment_Username, + 'Comment_IP' => $row->Comment_IP, + 'Comment_Text' => $row->Comment_Text, + 'Comment_Date' => $row->Comment_Date, + 'Comment_user_id' => $row->Comment_user_id, + 'Comment_user_points' => ( isset( $row->stats_total_points ) ? number_format( $row->stats_total_points ) : 0 ), + 'CommentID' => $row->CommentID, + 'Comment_Parent_ID' => $row->Comment_Parent_ID, + 'thread' => $thread, + 'timestamp' => wfTimestamp( TS_UNIX, $row->timestamp ) + ); + + $page = new CommentsPage( $row->Comment_Page_ID, $context ); + + return new Comment( $page, $context, $data ); + } + + /** + * Parse and return the text for this comment + * + * @return mixed|string + * @throws MWException + */ + function getText() { + global $wgParser; + + $commentText = trim( str_replace( '"', "'", $this->text ) ); + $comment_text_parts = explode( "\n", $commentText ); + $comment_text_fix = ''; + foreach ( $comment_text_parts as $part ) { + $comment_text_fix .= ( ( $comment_text_fix ) ? "\n" : '' ) . trim( $part ); + } + + if ( $this->getTitle()->getArticleID() > 0 ) { + $commentText = $wgParser->recursiveTagParse( $comment_text_fix ); + } else { + $commentText = $this->getOutput()->parse( $comment_text_fix ); + } + + // really bad hack because we want to parse=firstline, but don't want wrapping

tags + if ( substr( $commentText, 0 , 3 ) == '

' ) { + $commentText = substr( $commentText, 3 ); + } + + if ( substr( $commentText, strlen( $commentText ) -4 , 4 ) == '

' ) { + $commentText = substr( $commentText, 0, strlen( $commentText ) -4 ); + } + + // make sure link text is not too long (will overflow) + // this function changes too long links to http://www.abc....xyz.html + $commentText = preg_replace_callback( + "/(]*>)(.*?)(<\/a>)/i", + array( 'CommentFunctions', 'cutCommentLinkText' ), + $commentText + ); + + return $commentText; + } + + /** + * Adds the comment and all necessary info into the Comments table in the + * database. + * + * @param string $text: text of the comment + * @param CommentsPage $page: container page + * @param User $user: user commenting + * @param int $parentID: ID of parent comment, if this is a reply + * + * @return Comment: the added comment + */ + static function add( $text, CommentsPage $page, User $user, $parentID ) { + global $wgCommentsInRecentChanges; + $dbw = wfGetDB( DB_MASTER ); + $context = RequestContext::getMain(); + + wfSuppressWarnings(); + $commentDate = date( 'Y-m-d H:i:s' ); + wfRestoreWarnings(); + /*if ( $this->getUser()->isLoggedIn() ) { + $kok_username = $user->getName(); + } else { + $kok_username = $this->CommentUsernameKOK; + $kok_username = preg_replace('/<.*>/i', '', $kok_username); + $kok_username = preg_replace('/[^A-Za-z0-9. \-\@]/i', '', $kok_username); + $kok_username = str_replace("1'1", '', $kok_username); + $kok_username = str_replace('USER_NAME', '', $kok_username); + $kok_username = str_replace('DESC', '', $kok_username); + $kok_username = str_replace('(*)', '', $kok_username); + $kok_username = str_replace('EXEC', '', $kok_username); + }*/ + $dbw->insert( + 'Comments', + array( + 'Comment_Page_ID' => $page->id, + 'Comment_Username' => $user->getName(), + 'Comment_user_id' => $user->getId(), + 'Comment_Text' => $text, + 'Comment_Date' => $commentDate, + 'Comment_Parent_ID' => $parentID, + 'Comment_IP' => $_SERVER['REMOTE_ADDR'] + ), + __METHOD__ + ); + $commentId = $dbw->insertId(); + $dbw->commit( __METHOD__ ); // misza: added this + $id = $commentId; + + $page->clearCommentListCache(); + + // Add a log entry. + self::log( 'add', $user, $page->id, $commentId, $text ); + + $dbr = wfGetDB( DB_SLAVE ); + if ( + class_exists( 'UserProfile' ) && + $dbr->tableExists( 'user_stats' ) + ) { + $res = $dbr->select( // need this data for seeding a Comment object + 'user_stats', + 'stats_total_points', + array( 'stats_user_id' => $user->getId() ), + __METHOD__ + ); + + $row = $res->fetchObject(); + $userPoints = number_format( $row->stats_total_points ); + } else { + $userPoints = 0; + } + + if ( $parentID == 0 ) { + $thread = $id; + } else { + $thread = $parentID; + } + $data = array( + 'Comment_Username' => $user->getName(), + 'Comment_IP' => $context->getRequest()->getIP(), + 'Comment_Text' => $text, + 'Comment_Date' => $commentDate, + 'Comment_user_id' => $user->getID(), + 'Comment_user_points' => $userPoints, + 'CommentID' => $id, + 'Comment_Parent_ID' => $parentID, + 'thread' => $thread, + 'timestamp' => strtotime( $commentDate ) + ); + + $page = new CommentsPage( $page->id, $context ); + $comment = new Comment( $page, $context, $data ); + + Hooks::run( 'Comment::add', array( $comment, $commentId, $comment->page->id ) ); + /* ## START Kommentar auch per Email versenden ## 11/2014 Bernhard Linz */ + $znilpageTitle = ""; + $comment_mailto = "root@linz.email"; + $comment_mailsubject = "Neuer Kommentar von: " . $kok_username . " - IP: " . $_SERVER['REMOTE_ADDR'] . " - DNS: " . gethostbyaddr($_SERVER['REMOTE_ADDR']) ; + $comment_mailfrom = "MIME-Version: 1.0\r\n"; + $comment_mailfrom .= "Content-type: text/html; charset=utf-8\r\n"; + $comment_mailfrom .= "From: znil.net Kommentare \r\n"; + $comment_url = "http://znil.net/index.php?title={$znilpageTitle}#comment-{$commentId}"; + $comment_mailtext = $commentDate . "

" . $comment_url . "


" . "IP: " . $_SERVER['REMOTE_ADDR'] . "
" . "DNS: " . gethostbyaddr($_SERVER['REMOTE_ADDR']) ."

" . $kok_username . "

" . $text; + $comment_mailtext = nl2br($comment_mailtext); + mail($comment_mailto, $comment_mailsubject, $comment_mailtext, $comment_mailfrom); + /* ## ENDE Bernhard Linz */ + return $comment; + } + + /** + * Gets the score for this comment from the database table Comments_Vote + * + * @return string + */ + function getScore() { + $dbr = wfGetDB( DB_SLAVE ); + $row = $dbr->selectRow( + 'Comments_Vote', + array( 'SUM(Comment_Vote_Score) AS CommentScore' ), + array( 'Comment_Vote_ID' => $this->id ), + __METHOD__ + ); + $score = '0'; + if ( $row !== false && $row->CommentScore ) { + $score = $row->CommentScore; + } + return $score; + } + + /* START Anpassungen znilwiki */ + /* ## START ## 25.10.2013 Hinzugefügt von Kai-Ole */ + function setCommentUsernameKOK( $UsernameKOK ) { + $this->CommentUsernameKOK = $UsernameKOK; + } + /* ## ENDE ## 25.10.2013 Kai-Ole */ + /* ENDE Anpassungen znilwiki */ + + /** + * Adds a vote for a comment if the user hasn't voted for said comment yet. + * + * @param $value int: upvote or downvote (1 or -1) + */ + function vote( $value ) { + global $wgMemc; + $dbw = wfGetDB( DB_MASTER ); + + if ( $value < -1 ) { // limit to range -1 -> 0 -> 1 + $value = -1; + } elseif ( $value > 1 ) { + $value = 1; + } + + if ( $value == $this->currentVote ) { // user toggling off a preexisting vote + $value = 0; + } + + wfSuppressWarnings(); + $commentDate = date( 'Y-m-d H:i:s' ); + wfRestoreWarnings(); + + if ( $this->currentVote === false ) { // no vote, insert + $dbw->insert( + 'Comments_Vote', + array( + 'Comment_Vote_id' => $this->id, + 'Comment_Vote_Username' => $this->getUser()->getName(), + 'Comment_Vote_user_id' => $this->getUser()->getId(), + 'Comment_Vote_Score' => $value, + 'Comment_Vote_Date' => $commentDate, + 'Comment_Vote_IP' => $_SERVER['REMOTE_ADDR'] + ), + __METHOD__ + ); + } else { // already a vote, update + $dbw->update( + 'Comments_Vote', + array( + 'Comment_Vote_Score' => $value, + 'Comment_Vote_Date' => $commentDate, + 'Comment_Vote_IP' => $_SERVER['REMOTE_ADDR'] + ), + array( + 'Comment_Vote_id' => $this->id, + 'Comment_Vote_Username' => $this->getUser()->getName(), + 'Comment_Vote_user_id' => $this->getUser()->getId(), + ), + __METHOD__ + ); + } + $dbw->commit( __METHOD__ ); + + // update cache for comment list + // should perform better than deleting cache completely since Votes happen more frequently + $key = wfMemcKey( 'comment', 'pagethreadlist', $this->page->id ); + $comments = $wgMemc->get( $key ); + if ( $comments ) { + foreach ( $comments as &$comment ) { + if ( $comment->id == $this->id ) { + $comment->currentScore = $this->currentScore; + } + } + $wgMemc->set( $key, $comments ); + } + + $score = $this->getScore(); + + $this->currentVote = $value; + $this->currentScore = $score; + } + + /** + * Deletes entries from Comments and Comments_Vote tables and clears caches + */ + function delete() { + $dbw = wfGetDB( DB_MASTER ); + $dbw->delete( + 'Comments', + array( 'CommentID' => $this->id ), + __METHOD__ + ); + $dbw->delete( + 'Comments_Vote', + array( 'Comment_Vote_ID' => $this->id ), + __METHOD__ + ); + $dbw->commit( __METHOD__ ); + + // Log the deletion to Special:Log/comments. + self::log( 'delete', $this->getUser(), $this->page->id, $this->id ); + + // Clear memcache & Squid cache + $this->page->clearCommentListCache(); + + // Ping other extensions that may have hooked into this point (i.e. LinkFilter) + Hooks::run( 'Comment::delete', array( $this, $this->id, $this->page->id ) ); + } + + /** + * Log an action in the comment log. + * + * @param string $action Action to log, can be either 'add' or 'delete' + * @param User $user User who performed the action + * @param int $pageId Page ID of the page that contains the comment thread + * @param int $commentId Comment ID of the affected comment + * @param string $commentText Supplementary log comment, if any + */ + static function log( $action, $user, $pageId, $commentId, $commentText = null ) { + global $wgCommentsInRecentChanges; + $logEntry = new ManualLogEntry( 'comments', $action ); + $logEntry->setPerformer( $user ); + $logEntry->setTarget( Title::newFromId( $pageId ) ); + if ( $commentText !== null ) { + $logEntry->setComment( $commentText ); + } + $logEntry->setParameters( array( + '4::commentid' => $commentId + ) ); + $logId = $logEntry->insert(); + $logEntry->publish( $logId, ( $wgCommentsInRecentChanges ? 'rcandudp' : 'udp' ) ); + } + + /** + * Return the HTML for the comment vote links + * + * @param int $voteType up (+1) vote or down (-1) vote + * @return string + */ + function getVoteLink( $voteType ) { + global $wgExtensionAssetsPath; + + // Blocked users cannot vote, obviously + if ( $this->getUser()->isBlocked() ) { + return ''; + } + if ( !$this->getUser()->isAllowed( 'comment' ) ) { + return ''; + } + + $voteLink = ''; + if ( $this->getUser()->isLoggedIn() ) { + $voteLink .= ''; + } else { + $login = SpecialPage::getTitleFor( 'Userlogin' ); // Anonymous users need to log in before they can vote + $returnTo = $this->page->title->getPrefixedDBkey(); // Determine a sane returnto URL parameter + + $voteLink .= + "getLocalURL( array( 'returnto' => $returnTo ) ) ) . + "\" rel=\"nofollow\">"; + } + + $imagePath = $wgExtensionAssetsPath . '/Comments/resources/images'; + if ( $voteType == 1 ) { + if ( $this->currentVote == 1 ) { + $voteLink .= "\"+\""; + } else { + $voteLink .= "\"+\""; + } + } else { + if ( $this->currentVote == -1 ) { + $voteLink .= "\"+\""; + } else { + $voteLink .= "\"+\""; + } + } + + return $voteLink; + } + + /** + * Show the HTML for this comment and ignore section + * + * @param array $blockList list of users the current user has blocked + * @param array $anonList map of ip addresses to names like anon#1, anon#2 + * @return string html + */ + function display( $blockList, $anonList ) { + if ( $this->parentID == 0 ) { + $container_class = 'full'; + } else { + $container_class = 'reply'; + } + + $output = ''; + + if ( in_array( $this->username, $blockList ) ) { + $output .= $this->showIgnore( false, $container_class ); + $output .= $this->showComment( true, $container_class, $blockList, $anonList ); + } else { + $output .= $this->showIgnore( true, $container_class ); + $output .= $this->showComment( false, $container_class, $blockList, $anonList ); + } + + return $output; + } + + function displayForCommentOfTheDay() { + $output = ''; + + $title2 = $this->page->getTitle(); + + if ( $this->userID != 0 ) { + $title = Title::makeTitle( NS_USER, $this->username ); + $commentPoster_Display = $this->username; + $commentPoster = '' . $this->username . ''; + if ( class_exists( 'wAvatar' ) ) { + $avatar = new wAvatar( $this->userID, 's' ); + $commentIcon = $avatar->getAvatarImage(); + } else { + $commentIcon = ''; + } + } else { + $commentPoster_Display = wfMessage( 'comments-anon-name' )->plain(); + $commentPoster = wfMessage( 'comments-anon-name' )->plain(); + $commentIcon = 'default_s.gif'; + } + + $avatarHTML = ''; + if ( class_exists( 'wAvatar' ) ) { + global $wgUploadPath; + $avatarHTML = ''; + } + + $comment_text = substr( $this->text, 0, 50 - strlen( $commentPoster_Display ) ); + if ( $comment_text != $this->text ) { + $comment_text .= wfMessage( 'ellipsis' )->plain(); + } + + $output .= '
'; + $sign = ''; + if ( $this->currentScore > 0 ) { + $sign = '+'; + } elseif ( $this->currentScore < 0 ) { + $sign = '-'; // this *really* shouldn't be happening... + } + $output .= '' . $sign . $this->currentScore . + ' ' . $avatarHTML . + '' . $commentPoster . ''; + $output .= '' . $comment_text . + ''; + $output .= '
'; + + return $output; + } + + /** + * Show the box for if this comment has been ignored + * + * @param bool $hide + * @param $containerClass + * @return string + */ + function showIgnore( $hide = false, $containerClass ) { + $blockListTitle = SpecialPage::getTitleFor( 'CommentIgnoreList' ); + + $style = ''; + if ( $hide ) { + $style = " style='display:none;'"; + } + + $output = "
\n"; + $output .= wfMessage( 'comments-ignore-message' )->parse(); + $output .= '' . "\n"; + $output .= '
' . "\n"; + + return $output; + } + + /** + * Show the comment + * + * @param bool $hide: if true, comment is returned but hidden (display:none) + * @param $containerClass + * @param $blockList + * @param $anonList + * @return string + */ + function showComment( $hide = false, $containerClass, $blockList, $anonList ) { + global $wgUserLevels, $wgExtensionAssetsPath; + + $style = ''; + if ( $hide ) { + $style = " style='display:none;'"; + } + + $commentPosterLevel = ''; + + if ( $this->userID != 0 ) { + $title = Title::makeTitle( NS_USER, $this->username ); + + $commentPoster = '' . $this->username . ''; + + $CommentReplyTo = $this->username; + + if ( $wgUserLevels && class_exists( 'UserLevel' ) ) { + $user_level = new UserLevel( $this->userPoints ); + $commentPosterLevel = "{$user_level->getLevelName()}"; + } + + $user = User::newFromId( $this->userID ); + $CommentReplyToGender = $user->getOption( 'gender', 'unknown' ); + } else { + $anonMsg = $this->msg( 'comments-anon-name' )->inContentLanguage()->plain(); + $commentPoster = $anonMsg . ' #' . $anonList[$this->username]; + $CommentReplyTo = $anonMsg; + $CommentReplyToGender = 'unknown'; // Undisclosed gender as anon user + } + + // Comment delete button for privileged users + $dlt = ''; + + if ( $this->getUser()->isAllowed( 'commentadmin' ) ) { + $dlt = ' | ' . + '' . + $this->msg( 'comments-delete-link' )->plain() . ''; + } + + // Reply Link (does not appear on child comments) + $replyRow = ''; + if ( $this->getUser()->isAllowed( 'comment' ) ) { + if ( $this->parentID == 0 ) { + if ( $replyRow ) { + $replyRow .= wfMessage( 'pipe-separator' )->plain(); + } + $replyRow .= " | id}\" data-comments-safe-username=\"" . + htmlspecialchars( $CommentReplyTo, ENT_QUOTES ) . "\" data-comments-user-gender=\"" . + htmlspecialchars( $CommentReplyToGender ) . '">' . + wfMessage( 'comments-reply' )->plain() . ''; + } + } + + if ( $this->parentID == 0 ) { + $comment_class = 'f-message'; + } else { + $comment_class = 'r-message'; + } + + // Display Block icon for logged in users for comments of users + // that are already not in your block list + $blockLink = ''; + + if ( + $this->getUser()->getID() != 0 && $this->getUser()->getID() != $this->userID && + !( in_array( $this->userID, $blockList ) ) + ) { + $blockLink = ' + \"\"/ + "; + } + + // Default avatar image, if SocialProfile extension isn't enabled + global $wgCommentsDefaultAvatar; + $avatarImg = ''; + // If SocialProfile *is* enabled, then use its wAvatar class to get the avatars for each commenter + if ( class_exists( 'wAvatar' ) ) { + $avatar = new wAvatar( $this->userID, 'ml' ); + $avatarImg = $avatar->getAvatarURL() . "\n"; + } + + $output = "
" . "\n"; + $output .= "
{$avatarImg}
" . "\n"; + $output .= '
' . "\n"; + $output .= '
' . "\n"; + $output .= "{$commentPoster}"; + $output .= "{$commentPosterLevel} {$blockLink}" . "\n"; + + wfSuppressWarnings(); // E_STRICT bitches about strtotime() + $output .= '
' . + wfMessage( + 'comments-time-ago', + CommentFunctions::getTimeAgo( strtotime( $this->date ) ) + )->parse() . '
' . "\n"; + wfRestoreWarnings(); + + $output .= '
' . "\n"; + $output .= $this->getScoreHTML(); + $output .= '
' . "\n"; + + $output .= '
' . "\n"; + $output .= "
" . "\n"; + $output .= $this->getText(); + $output .= '
' . "\n"; + $output .= '
' . "\n"; + if ( $this->page->title ) { // for some reason doesn't always exist + $output .= 'id}\" rel=\"nofollow\">" . + $this->msg( 'comments-permalink' )->plain() . ' '; + } + if ( $replyRow || $dlt ) { + $output .= "{$replyRow} {$dlt}" . "\n"; + } + $output .= '
' . "\n"; + $output .= '
' . "\n"; + $output .= '
' . "\n"; + $output .= '
' . "\n"; + + return $output; + } + + /** + * Get the HTML for the comment score section of the comment + * + * @return string + */ + function getScoreHTML() { + $output = ''; + + if ( $this->page->allowMinus == true || $this->page->allowPlus == true ) { + $output .= '' . + wfMessage( 'comments-score-text' )->plain() . + " id}\">{$this->currentScore}"; + + // Voting is possible only when database is unlocked + if ( !wfReadOnly() ) { + // You can only vote for other people's comments, not for your own + if ( $this->getUser()->getName() != $this->username ) { + $output .= "id}\">"; + if ( $this->page->allowPlus == true ) { + $output .= $this->getVoteLink( 1 ); + } + + if ( $this->page->allowMinus == true ) { + $output .= $this->getVoteLink( -1 ); + } + $output .= ''; + } else { + $output .= wfMessage( 'word-separator' )->plain() . wfMessage( 'comments-you' )->plain(); + } + } + } + + return $output; + } +} diff --git a/includes/CommentFunctions.class.php b/includes/CommentFunctions.class.php new file mode 100644 index 0000000..afaccd0 --- /dev/null +++ b/includes/CommentFunctions.class.php @@ -0,0 +1,319 @@ + 0 ) { + // Give grep a chance to find the usages: + // comments-time-days, comments-time-hours, comments-time-minutes, comments-time-seconds, comments-time-months + $timeStr = wfMessage( "comments-time-{$timename}", $time[$timeabrv] )->parse(); + } + if( $timeStr ) { + $timeStr .= ' '; + } + return $timeStr; + } + + static function getTimeAgo( $time ) { + $timeArray = self::dateDiff( time(), $time ); + $timeStr = ''; + $timeStrMo = self::getTimeOffset( $timeArray, 'mo', 'months' ); + $timeStrD = self::getTimeOffset( $timeArray, 'd', 'days' ); + $timeStrH = self::getTimeOffset( $timeArray, 'h', 'hours' ); + $timeStrM = self::getTimeOffset( $timeArray, 'm', 'minutes' ); + $timeStrS = self::getTimeOffset( $timeArray, 's', 'seconds' ); + + if ( $timeStrMo ) { + $timeStr = $timeStrMo; + } else { + $timeStr = $timeStrD; + if( $timeStr < 2 ) { + $timeStr .= $timeStrH; + $timeStr .= $timeStrM; + if( !$timeStr ) { + $timeStr .= $timeStrS; + } + } + } + if( !$timeStr ) { + $timeStr = wfMessage( 'comments-time-seconds', 1 )->parse(); + } + return $timeStr; + } + + /** + * Makes sure that link text is not too long by changing too long links to + * http://www.abc....xyz.html + * + * @param $matches Array + * @return String: shortened URL + */ + public static function cutCommentLinkText( $matches ) { + $tagOpen = $matches[1]; + $linkText = $matches[2]; + $tagClose = $matches[3]; + + $image = preg_match( "/ 30 ) { + $start = substr( $linkText, 0, ( 30 / 2 ) - 3 ); + $end = substr( $linkText, strlen( $linkText ) - ( 30 / 2 ) + 3, ( 30 / 2 ) - 3 ); + $linkText = trim( $start ) . wfMessage( 'ellipsis' )->escaped() . trim( $end ); + } + return $tagOpen . $linkText . $tagClose; + } + + /** + * Simple spam check -- checks the supplied text against MediaWiki's + * built-in regex-based spam filters + * + * @param $text String: text to check for spam patterns + * @return Boolean: true if it contains spam, otherwise false + */ + public static function isSpam( $text ) { + global $wgSpamRegex, $wgSummarySpamRegex; + + $retVal = false; + // Allow to hook other anti-spam extensions so that sites that use, + // for example, AbuseFilter, Phalanx or SpamBlacklist can add additional + // checks + Hooks::run( 'Comments::isSpam', array( &$text, &$retVal ) ); + if ( $retVal ) { + // Should only be true here... + return $retVal; + } + + // Run text through $wgSpamRegex (and $wgSummarySpamRegex if it has been specified) + if ( $wgSpamRegex && preg_match( $wgSpamRegex, $text ) ) { + return true; + } + + if ( $wgSummarySpamRegex && is_array( $wgSummarySpamRegex ) ) { + foreach ( $wgSummarySpamRegex as $spamRegex ) { + if ( preg_match( $spamRegex, $text ) ) { + return true; + } + } + } + + return $retVal; + } + + /** + * Checks the supplied text for links + * + * @param $text String: text to check + * @return Boolean: true if it contains links, otherwise false + */ + public static function haveLinks( $text ) { + $linkPatterns = array( + '/(https?)|(ftp):\/\//', + '/=\\s*[\'"]?\\s*mailto:/', + ); + foreach ( $linkPatterns as $linkPattern ) { + if ( preg_match( $linkPattern, $text ) ) { + return true; + } + } + + return false; + } + + /** + * Blocks comments from a user + * + * @param User $blocker The user who is blocking someone else's comments + * @param int $userId User ID of the guy whose comments we want to block + * @param mixed $userName User name of the same guy + */ + public static function blockUser( $blocker, $userId, $userName ) { + $dbw = wfGetDB( DB_MASTER ); + + wfSuppressWarnings(); // E_STRICT bitching + $date = date( 'Y-m-d H:i:s' ); + wfRestoreWarnings(); + $dbw->insert( + 'Comments_block', + array( + 'cb_user_id' => $blocker->getId(), + 'cb_user_name' => $blocker->getName(), + 'cb_user_id_blocked' => $userId, + 'cb_user_name_blocked' => $userName, + 'cb_date' => $date + ), + __METHOD__ + ); + $dbw->commit( __METHOD__ ); + } + + /** + * Fetches the list of blocked users from the database + * + * @param int $userId User ID for whom we're getting the blocks(?) + * @return array List of comment-blocked users + */ + static function getBlockList( $userId ) { + $blockList = array(); + $dbr = wfGetDB( DB_SLAVE ); + $res = $dbr->select( + 'Comments_block', + 'cb_user_name_blocked', + array( 'cb_user_id' => $userId ), + __METHOD__ + ); + foreach ( $res as $row ) { + $blockList[] = $row->cb_user_name_blocked; + } + return $blockList; + } + + static function isUserCommentBlocked( $userId, $userIdBlocked ) { + $dbr = wfGetDB( DB_SLAVE ); + $s = $dbr->selectRow( + 'Comments_block', + array( 'cb_id' ), + array( + 'cb_user_id' => $userId, + 'cb_user_id_blocked' => $userIdBlocked + ), + __METHOD__ + ); + if ( $s !== false ) { + return true; + } else { + return false; + } + } + + /** + * Deletes a user from your personal comment-block list. + * + * @param int $userId Your user ID + * @param int $userIdBlocked User ID of the blocked user + */ + public static function deleteBlock( $userId, $userIdBlocked ) { + $dbw = wfGetDB( DB_MASTER ); + $dbw->delete( + 'Comments_block', + array( + 'cb_user_id' => $userId, + 'cb_user_id_blocked' => $userIdBlocked + ), + __METHOD__ + ); + $dbw->commit( __METHOD__ ); + } + + /** + * Sort threads ascending + * + * @param $x + * @param $y + * @return int + */ + public static function sortAsc( $x, $y ) { + // return -1 - x goes above y + // return 1 - x goes below y + // return 0 - order irrelevant (only when x == y) + + if ( $x[0]->timestamp < $y[0]->timestamp ) { + return -1; + } else { + return 1; + } + } + + /** + * Sort threads descending + * + * @param $x + * @param $y + * @return int + */ + public static function sortDesc( $x, $y ) { + // return -1 - x goes above y + // return 1 - x goes below y + // return 0 - order irrelevant (only when x == y) + + if ( $x[0]->timestamp > $y[0]->timestamp ) { + return -1; + } else { + return 1; + } + } + + /** + * Sort threads by score + * + * @param $x + * @param $y + */ + public static function sortScore( $x, $y ) { + // return -1 - x goes above y + // return 1 - x goes below y + // return 0 - order irrelevant (only when x == y) + + if ( $x[0]->currentScore > $y[0]->currentScore ) { + return -1; + } else { + return 1; + } + } + + /** + * Sort COMMENTS (not threads) by score + * + * @param $x + * @param $y + */ + public static function sortCommentScore( $x, $y ) { + // return -1 - x goes above y + // return 1 - x goes below y + // return 0 - order irrelevant (only when x == y) + + if ( $x->currentScore > $y->currentScore ) { + return -1; + } else { + return 1; + } + } + + /** + * Sort the comments purely by the time, from earliest to latest + * + * @param $x + * @param $y + * @return int + */ + public static function sortTime( $x, $y ) { + // return -1 - x goes above y + // return 1 - x goes below y + // return 0 - order irrelevant (only when x == y) + if ( $x->timestamp == $y->timestamp ) { + return 0; + } elseif ( $x->timestamp < $y->timestamp ) { + return -1; + } else { + return 1; + } + } +} diff --git a/includes/Comments.alias.php b/includes/Comments.alias.php new file mode 100644 index 0000000..01a989e --- /dev/null +++ b/includes/Comments.alias.php @@ -0,0 +1,15 @@ + array( 'CommentIgnoreList' ), +); diff --git a/includes/Comments.hooks.php b/includes/Comments.hooks.php new file mode 100644 index 0000000..3b81f1a --- /dev/null +++ b/includes/Comments.hooks.php @@ -0,0 +1,173 @@ + + * @author Alexia E. Smith + * @copyright (c) 2013 Curse Inc. + * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later + * @link https://www.mediawiki.org/wiki/Extension:Comments Documentation + */ + +class CommentsHooks { + /** + * Registers the tag with the Parser. + * + * @param Parser $parser + * @return bool + */ + public static function onParserFirstCallInit( Parser &$parser ) { + $parser->setHook( 'comments', array( 'CommentsHooks', 'displayComments' ) ); + return true; + } + + /** + * Callback function for onParserFirstCallInit(). + * + * @param $input + * @param array $args + * @param Parser $parser + * @return string HTML + */ + public static function displayComments( $input, $args, $parser ) { + global $wgOut, $wgCommentsSortDescending; + + $parser->disableCache(); + // If an unclosed tag is added to a page, the extension will + // go to an infinite loop...this protects against that condition. + $parser->setHook( 'comments', array( 'CommentsHooks', 'nonDisplayComments' ) ); + + $title = $parser->getTitle(); + if ( $title->getArticleID() == 0 && $title->getDBkey() == 'CommentListGet' ) { + return self::nonDisplayComments( $input, $args, $parser ); + } + + // Add required CSS & JS via ResourceLoader + $wgOut->addModuleStyles( 'ext.comments.css' ); + $wgOut->addModules( 'ext.comments.js' ); + $wgOut->addJsConfigVars( array( 'wgCommentsSortDescending' => $wgCommentsSortDescending ) ); + + // Parse arguments + // The preg_match() lines here are to support the old-style way of + // adding arguments: + // + // Allow=Foo,Bar + // Voting=Plus + // + // whereas the normal, standard MediaWiki style, which this extension + // also supports is: + $allow = ''; + if ( preg_match( '/^\s*Allow\s*=\s*(.*)/mi', $input, $matches ) ) { + $allow = htmlspecialchars( $matches[1] ); + } elseif ( !empty( $args['allow'] ) ) { + $allow = $args['allow']; + } + + $voting = ''; + if ( preg_match( '/^\s*Voting\s*=\s*(.*)/mi', $input, $matches ) ) { + $voting = htmlspecialchars( $matches[1] ); + } elseif ( + !empty( $args['voting'] ) && + in_array( strtoupper( $args['voting'] ), array( 'OFF', 'PLUS', 'MINUS' ) ) + ) { + $voting = $args['voting']; + } + + $commentsPage = new CommentsPage( $title->getArticleID(), $wgOut->getContext() ); + $commentsPage->allow = $allow; + $commentsPage->setVoting( $voting ); + + $output = '
'; + + if ( $wgCommentsSortDescending ) { // form before comments + $output .= ''; + if ( !wfReadOnly() ) { + $output .= $commentsPage->displayForm(); + } else { + $output .= wfMessage( 'comments-db-locked' )->parse(); + } + } + + $output .= $commentsPage->displayOrderForm(); + + $output .= '
' . $commentsPage->display() . '
'; + + // If the database is in read-only mode, display a message informing the + // user about that, otherwise allow them to comment + if ( !$wgCommentsSortDescending ) { // form after comments + if ( !wfReadOnly() ) { + $output .= $commentsPage->displayForm(); + } else { + $output .= wfMessage( 'comments-db-locked' )->parse(); + } + $output .= ''; + } + + $output .= '
'; // div.comments-body + + return $output; + } + + public static function nonDisplayComments( $input, $args, $parser ) { + $attr = array(); + + foreach ( $args as $name => $value ) { + $attr[] = htmlspecialchars( $name ) . '="' . htmlspecialchars( $value ) . '"'; + } + + $output = '<comments'; + if ( count( $attr ) > 0 ) { + $output .= ' ' . implode( ' ', $attr ); + } + + if ( !is_null( $input ) ) { + $output .= '>' . htmlspecialchars( $input ) . '</comments>'; + } else { + $output .= ' />'; + } + + return $output; + } + + /** + * Adds the three new required database tables into the database when the + * user runs /maintenance/update.php (the core database updater script). + * + * @param DatabaseUpdater $updater + * @return bool + */ + public static function onLoadExtensionSchemaUpdates( $updater ) { + $dir = __DIR__ . '/../sql'; + + $dbType = $updater->getDB()->getType(); + // For non-MySQL/MariaDB/SQLite DBMSes, use the appropriately named file + if ( !in_array( $dbType, array( 'mysql', 'sqlite' ) ) ) { + $filename = "comments.{$dbType}.sql"; + } else { + $filename = 'comments.sql'; + } + + $updater->addExtensionUpdate( array( 'addTable', 'Comments', "{$dir}/{$filename}", true ) ); + $updater->addExtensionUpdate( array( 'addTable', 'Comments_Vote', "{$dir}/{$filename}", true ) ); + $updater->addExtensionUpdate( array( 'addTable', 'Comments_block', "{$dir}/{$filename}", true ) ); + + return true; + } + + /** + * For integration with the Renameuser extension. + * + * @param RenameuserSQL $renameUserSQL + * @return bool + */ + public static function onRenameUserSQL( $renameUserSQL ) { + $renameUserSQL->tables['Comments'] = array( 'Comment_Username', 'Comment_user_id' ); + $renameUserSQL->tables['Comments_Vote'] = array( 'Comment_Vote_Username', 'Comment_Vote_user_id' ); + $renameUserSQL->tables['Comments_block'] = array( 'cb_user_name', 'cb_user_id' ); + $renameUserSQL->tables['Comments_block'] = array( 'cb_user_name_blocked', 'cb_user_id_blocked' ); + return true; + } +} diff --git a/includes/Comments.i18n.magic.php b/includes/Comments.i18n.magic.php new file mode 100644 index 0000000..b91b254 --- /dev/null +++ b/includes/Comments.i18n.magic.php @@ -0,0 +1,12 @@ + array( 0, 'NUMBEROFCOMMENTS' ), + 'NUMBEROFCOMMENTSPAGE' => array( 0, 'NUMBEROFCOMMENTSPAGE' ), +); diff --git a/includes/CommentsLogFormatter.class.php b/includes/CommentsLogFormatter.class.php new file mode 100644 index 0000000..dbc2b54 --- /dev/null +++ b/includes/CommentsLogFormatter.class.php @@ -0,0 +1,65 @@ +canView( LogPage::DELETED_ACTION ) ) { + $element = $this->getActionMessage(); + if ( $element instanceof Message ) { + $element = $this->plaintext ? $element->text() : $element->parse(); // <-- here's the change! + } + if ( $this->entry->isDeleted( LogPage::DELETED_ACTION ) ) { + $element = $this->styleRestricedElement( $element ); + } + } else { + $performer = $this->getPerformerElement() . $this->msg( 'word-separator' )->text(); + $element = $performer . $this->getRestrictedElement( 'rev-deleted-event' ); + } + + return $element; + } + + /** + * Formats parameters intented for action message from + * array of all parameters. There are three hardcoded + * parameters (array is zero-indexed, this list not): + * - 1: user name with premade link + * - 2: usable for gender magic function + * - 3: target page with premade link + * @return array + */ + protected function getMessageParameters() { + if ( isset( $this->parsedParameters ) ) { + return $this->parsedParameters; + } + + $entry = $this->entry; + $params = $this->extractParameters(); + + $commentId = $params[3]; // = $4, because array numbering starts from 0 + + $params[0] = Message::rawParam( $this->getPerformerElement() ); + $params[1] = $this->canView( LogPage::DELETED_USER ) ? $entry->getPerformer()->getName() : ''; + $title = $entry->getTarget(); + if ( $title instanceof Title ) { // healthy paranoia + $title->setFragment( '#comment-' . $commentId ); + } + $params[2] = Message::rawParam( $this->makePageLink( $title ) ); + + // Bad things happens if the numbers are not in correct order + ksort( $params ); + return $this->parsedParameters = $params; + } +} diff --git a/includes/CommentsOfTheDay.class.php b/includes/CommentsOfTheDay.class.php new file mode 100644 index 0000000..4f89d34 --- /dev/null +++ b/includes/CommentsOfTheDay.class.php @@ -0,0 +1,120 @@ + parser hook with the Parser. + * + * @param Parser $parser Instance of Parser + * @return bool + */ + public static function registerTag( &$parser ) { + $parser->setHook( 'commentsoftheday', array( __CLASS__, 'getHTML' ) ); + return true; + } + + /** + * Get comments of the day -- five newest comments within the last 24 hours + * + * @return string HTML + */ + public static function getHTML( $input, $args, $parser ) { + $comments = self::get( (bool)$args['nocache'] ); + $commentOutput = ''; + + foreach ( $comments as $comment ) { + $commentOutput .= $comment->displayForCommentOfTheDay(); + } + + $output = ''; + if ( !empty( $commentOutput ) ) { + $output .= $commentOutput; + } else { + $output .= wfMessage( 'comments-no-comments-of-day' )->plain(); + } + + return $output; + } + + /** + * Get comments of the day, either from cache or the DB. + * + * @param bool $skipCache Skip using memcached and fetch data directly from the DB? + * @param int $cacheTime How long to cache the results in memcached? Default is one day (60 * 60 * 24). + * @param array $whereConds WHERE conditions for the SQL clause (if not using the defaults) + * @return array + */ + public static function get( $skipCache = false, $cacheTime = 86400, $whereConds = array() ) { + global $wgMemc; + + // Try memcached first + $key = wfMemcKey( 'comments-of-the-day', 'standalone-hook-new' ); + $data = $wgMemc->get( $key ); + + if ( $data ) { // success, got it from memcached! + $comments = $data; + } elseif ( !$data || $skipCache ) { // just query the DB + $dbr = wfGetDB( DB_SLAVE ); + + if ( empty( $whereConds ) ) { + $whereConds = array( + 'Comment_Page_ID = page_id', + 'UNIX_TIMESTAMP(Comment_Date) > ' . ( time() - ( $cacheTime ) ) + ); + } + + $res = $dbr->select( + array( 'Comments', 'page' ), + array( + 'Comment_Username', 'Comment_IP', 'Comment_Text', + 'Comment_Date', 'Comment_User_Id', 'CommentID', + 'Comment_Parent_ID', 'Comment_Page_ID' + ), + $whereConds, + __METHOD__ + ); + + $comments = array(); + + foreach ( $res as $row ) { + if ( $row->Comment_Parent_ID == 0 ) { + $thread = $row->CommentID; + } else { + $thread = $row->Comment_Parent_ID; + } + $data = array( + 'Comment_Username' => $row->Comment_Username, + 'Comment_IP' => $row->Comment_IP, + 'Comment_Text' => $row->Comment_Text, + 'Comment_Date' => $row->Comment_Date, + 'Comment_user_id' => $row->Comment_User_Id, + // @todo FIXME: absolutely disgusting -- should use Language's formatNum() for better i18n + 'Comment_user_points' => ( isset( $row->stats_total_points ) ? number_format( $row->stats_total_points ) : 0 ), + 'CommentID' => $row->CommentID, + 'Comment_Parent_ID' => $row->Comment_Parent_ID, + 'thread' => $thread, + 'timestamp' => wfTimestamp( TS_UNIX, $row->Comment_Date ) + ); + + $page = new CommentsPage( $row->Comment_Page_ID, new RequestContext() ); + $comments[] = new Comment( $page, new RequestContext(), $data ); + } + + usort( $comments, array( 'CommentFunctions', 'sortCommentScore' ) ); + $comments = array_slice( $comments, 0, 5 ); + + $wgMemc->set( $key, $comments, $cacheTime ); + } + + return $comments; + } + +} diff --git a/includes/CommentsPage.class.php b/includes/CommentsPage.class.php new file mode 100644 index 0000000..3887cb1 --- /dev/null +++ b/includes/CommentsPage.class.php @@ -0,0 +1,608 @@ +id = $pageID; + $this->setContext( $context ); + $this->title = Title::newFromID( $pageID ); + } + + /** + * Gets the total amount of comments on this page + * + * @return int + */ + function countTotal() { + $dbr = wfGetDB( DB_SLAVE ); + $count = 0; + $s = $dbr->selectRow( + 'Comments', + array( 'COUNT(*) AS CommentCount' ), + array( 'Comment_Page_ID' => $this->id ), + __METHOD__ + ); + if ( $s !== false ) { + $count = $s->CommentCount; + } + return $count; + } + + /** + * Gets the ID number of the latest comment for the current page. + * + * @return int + */ + function getLatestCommentID() { + $latestCommentID = 0; + $dbr = wfGetDB( DB_SLAVE ); + $s = $dbr->selectRow( + 'Comments', + array( 'CommentID' ), + array( 'Comment_Page_ID' => $this->id ), + __METHOD__, + array( 'ORDER BY' => 'Comment_Date DESC', 'LIMIT' => 1 ) + ); + if ( $s !== false ) { + $latestCommentID = $s->CommentID; + } + return $latestCommentID; + } + + /** + * Set voting either totally off, or disallow "thumbs down" or disallow + * "thumbs up". + * + * @param string $voting 'OFF', 'PLUS' or 'MINUS' (will be strtoupper()ed) + */ + function setVoting( $voting ) { + $this->voting = $voting; + $voting = strtoupper( $voting ); + + if ( $voting == 'OFF' ) { + $this->allowMinus = false; + $this->allowPlus = false; + } + if ( $voting == 'PLUS' ) { + $this->allowMinus = false; + } + if ( $voting == 'MINUS' ) { + $this->allowPlus = false; + } + } + + /** + * Fetches all comments, called by display(). + * + * @return array Array containing every possible bit of information about + * a comment, including score, timestamp and more + */ + public function getComments() { + $dbr = wfGetDB( DB_SLAVE ); + + // Defaults (for non-social wikis) + $tables = array( + 'Comments', + 'vote1' => 'Comments_Vote', + 'vote2' => 'Comments_Vote', + ); + $fields = array( + 'Comment_Username', 'Comment_IP', 'Comment_Text', + 'Comment_Date', 'Comment_Date AS timestamp', + 'Comment_user_id', 'CommentID', 'Comment_Parent_ID', + 'vote1.Comment_Vote_Score AS current_vote', + 'SUM(vote2.Comment_Vote_Score) AS comment_score' + ); + $joinConds = array( + // For current user's vote + 'vote1' => array( + 'LEFT JOIN', + array( + 'vote1.Comment_Vote_ID = CommentID', + 'vote1.Comment_Vote_Username' => $this->getUser()->getName() + ) + ), + // For total vote count + 'vote2' => array( 'LEFT JOIN', 'vote2.Comment_Vote_ID = CommentID' ) + ); + $params = array( 'GROUP BY' => 'CommentID' ); + + // If SocialProfile is installed, query the user_stats table too. + if ( + class_exists( 'UserProfile' ) && + $dbr->tableExists( 'user_stats' ) + ) { + $tables[] = 'user_stats'; + $fields[] = 'stats_total_points'; + $joinConds['Comments'] = array( + 'LEFT JOIN', 'Comment_user_id = stats_user_id' + ); + } + + // Perform the query + $res = $dbr->select( + $tables, + $fields, + array( 'Comment_Page_ID' => $this->id ), + __METHOD__, + $params, + $joinConds + ); + + $comments = array(); + + foreach ( $res as $row ) { + if ( $row->Comment_Parent_ID == 0 ) { + $thread = $row->CommentID; + } else { + $thread = $row->Comment_Parent_ID; + } + $data = array( + 'Comment_Username' => $row->Comment_Username, + 'Comment_IP' => $row->Comment_IP, + 'Comment_Text' => $row->Comment_Text, + 'Comment_Date' => $row->Comment_Date, + 'Comment_user_id' => $row->Comment_user_id, + 'Comment_user_points' => ( isset( $row->stats_total_points ) ? number_format( $row->stats_total_points ) : 0 ), + 'CommentID' => $row->CommentID, + 'Comment_Parent_ID' => $row->Comment_Parent_ID, + 'thread' => $thread, + 'timestamp' => wfTimestamp( TS_UNIX, $row->timestamp ), + 'current_vote' => ( isset( $row->current_vote ) ? $row->current_vote : false ), + 'total_vote' => ( isset( $row->comment_score ) ? $row->comment_score : 0 ), + ); + + $comments[] = new Comment( $this, $this->getContext(), $data ); + } + + $commentThreads = array(); + + foreach ( $comments as $comment ) { + if ( $comment->parentID == 0 ) { + $commentThreads[$comment->id] = array( $comment ); + } else { + $commentThreads[$comment->parentID][] = $comment; + } + } + + return $commentThreads; + } + + /** + * @return int The page we are currently paged to + * not used for any API calls + */ + function getCurrentPagerPage() { + if ( $this->currentPagerPage == 0 ) { + $this->currentPagerPage = $this->getRequest()->getInt( $this->pageQuery, 1 ); + + if ( $this->currentPagerPage < 1 ) { + $this->currentPagerPage = 1; + } + } + + return $this->currentPagerPage; + } + + /** + * Display pager for the current page. + * + * @param int $pagerCurrent Page we are currently paged to + * @param int $pagesCount The maximum page number + * + * @return string: the links for paging through pages of comments + */ + function displayPager( $pagerCurrent, $pagesCount ) { + // Middle is used to "center" pages around the current page. + $pager_middle = ceil( $this->pagerLimit / 2 ); + // first is the first page listed by this pager piece (re quantity) + $pagerFirst = $pagerCurrent - $pager_middle + 1; + // last is the last page listed by this pager piece (re quantity) + $pagerLast = $pagerCurrent + $this->pagerLimit - $pager_middle; + + // Prepare for generation loop. + $i = $pagerFirst; + if ( $pagerLast > $pagesCount ) { + // Adjust "center" if at end of query. + $i = $i + ( $pagesCount - $pagerLast ); + $pagerLast = $pagesCount; + } + if ( $i <= 0 ) { + // Adjust "center" if at start of query. + $pagerLast = $pagerLast + ( 1 - $i ); + $i = 1; + } + + $output = ''; + if ( $pagesCount > 1 ) { + $output .= '
    '; + $pagerEllipsis = '
  • ...
  • '; + + // Whether to display the "Previous page" link + if ( $pagerCurrent > 1 ) { + $output .= '
  • ' . + Html::rawElement( + 'a', + array( + 'rel' => 'nofollow', + 'class' => 'c-pager-link', + 'href' => '#cfirst', + 'data-' . $this->pageQuery => ( $pagerCurrent - 1 ), + ), + '<' + ) . + '
  • '; + } + + // Whether to display the "First page" link + if ( $i > 1 ) { + $output .= '
  • ' . + Html::rawElement( + 'a', + array( + 'rel' => 'nofollow', + 'class' => 'c-pager-link', + 'href' => '#cfirst', + 'data-' . $this->pageQuery => 1, + ), + 1 + ) . + '
  • '; + } + + // When there is more than one page, create the pager list. + if ( $i != $pagesCount ) { + if ( $i > 2 ) { + $output .= $pagerEllipsis; + } + + // Now generate the actual pager piece. + for ( ; $i <= $pagerLast && $i <= $pagesCount; $i++ ) { + if ( $i == $pagerCurrent ) { + $output .= '
  • ' . + $i . '
  • '; + } else { + $output .= '
  • ' . + Html::rawElement( + 'a', + array( + 'rel' => 'nofollow', + 'class' => 'c-pager-link', + 'href' => '#cfirst', + 'data-' . $this->pageQuery => $i, + ), + $i + ) . + '
  • '; + } + } + + if ( $i < $pagesCount ) { + $output .= $pagerEllipsis; + } + } + + // Whether to display the "Last page" link + if ( $pagesCount > ( $i - 1 ) ) { + $output .= '
  • ' . + Html::rawElement( + 'a', + array( + 'rel' => 'nofollow', + 'class' => 'c-pager-link', + 'href' => '#cfirst', + 'data-' . $this->pageQuery => $pagesCount, + ), + $pagesCount + ) . + '
  • '; + } + + // Whether to display the "Next page" link + if ( $pagerCurrent < $pagesCount ) { + $output .= '
  • ' . + Html::rawElement( + 'a', + array( + 'rel' => 'nofollow', + 'class' => 'c-pager-link', + 'href' => '#cfirst', + 'data-' . $this->pageQuery => ( $pagerCurrent + 1 ), + ), + '>' + ) . + '
  • '; + } + + $output .= '
'; + } + + return $output; + } + + /** + * Get this list of anon commenters in the given list of comments, + * and return a mapped array of IP adressess to the the number anon poster + * (so anon posters can be called Anon#1, Anon#2, etc + * + * @return array + */ + function getAnonList() { + $counter = 1; + $bucket = array(); + + $commentThreads = $this->comments; + + $comments = array(); // convert 2nd threads array to a simple list of comments + foreach ( $commentThreads as $thread ) { + $comments = array_merge( $comments, $thread ); + } + usort( $comments, array( 'CommentFunctions', 'sortTime' ) ); + + foreach ( $comments as $comment ) { + if ( + !array_key_exists( $comment->username, $bucket ) && + $comment->userID == 0 + ) { + $bucket[$comment->username] = $counter; + $counter++; + } + } + + return $bucket; + } + + /** + * Sort an array of comment threads + * @param $threads + * @return mixed + */ + function sort( $threads ) { + global $wgCommentsSortDescending; + + if ( $this->orderBy ) { + usort( $threads, array( 'CommentFunctions', 'sortScore' ) ); + } elseif ( $wgCommentsSortDescending ) { + usort( $threads, array( 'CommentFunctions', 'sortDesc' ) ); + } else { + usort( $threads, array( 'CommentFunctions', 'sortAsc' ) ); + } + + return $threads; + } + + /** + * Convert an array of comment threads into an array of pages (arrays) of comment threads + * @param $comments + * @return array + */ + function page( $comments ) { + return array_chunk( $comments, $this->limit ); + } + + /** + * Display all the comments for the current page. + * CSS and JS is loaded in CommentsHooks.php + */ + function display() { + $output = ''; + + $commentThreads = $this->getComments(); + $commentThreads = $this->sort( $commentThreads ); + + $this->comments = $commentThreads; + + $commentPages = $this->page( $commentThreads ); + $currentPageNum = $this->getCurrentPagerPage(); + $numPages = count( $commentPages ); + // Suppress random E_NOTICE about "Undefined offset: 0", which seems to + // be breaking ProblemReports (at least on my local devbox, not sure + // about prod). --Jack Phoenix, 13 July 2015 + wfSuppressWarnings(); + $currentPage = $commentPages[$currentPageNum - 1]; + wfRestoreWarnings(); + + // Load complete blocked list for logged in user so they don't see their comments + $blockList = array(); + if ( $this->getUser()->getID() != 0 ) { + $blockList = CommentFunctions::getBlockList( $this->getUser()->getId() ); + } + + if ( $currentPage ) { + $pager = $this->displayPager( $currentPageNum, $numPages ); + $output .= $pager; + $output .= ''; + + $anonList = $this->getAnonList(); + + foreach ( $currentPage as $thread ) { + foreach ( $thread as $comment ) { + $output .= $comment->display( $blockList, $anonList ); + } + } + $output .= $pager; + } + + return $output; + } + + /** + * Displays the "Sort by X" form and a link to auto-refresh comments + * + * @return string HTML + */ + function displayOrderForm() { + $output = '
+
+
+ +
+
+ +
+
+
' . "\n"; + + return $output; + } + + /** + * Displays the form for adding new comments + * + * @return string HTML output + */ + function displayForm() { + $output = '
' . "\n"; + + if ( $this->allow ) { + $pos = strpos( + strtoupper( addslashes( $this->allow ) ), + strtoupper( addslashes( $this->getUser()->getName() ) ) + ); + } + + // 'comment' user right is required to add new comments + if ( !$this->getUser()->isAllowed( 'comment' ) ) { + $output .= wfMessage( 'comments-not-allowed' )->parse(); + } else { + // Blocked users can't add new comments under any conditions... + // and maybe there's a list of users who should be allowed to post + // comments + if ( $this->getUser()->isBlocked() == false && ( $this->allow == '' || $pos !== false ) ) { + $output .= '
' . wfMessage( 'comments-submit' )->plain() . '
' . "\n"; + $output .= '
' . "\n"; + // Show a message to anons, prompting them to register or log in + if ( !$this->getUser()->isLoggedIn() ) { + $login_title = SpecialPage::getTitleFor( 'Userlogin' ); + $register_title = SpecialPage::getTitleFor( 'Userlogin', 'signup' ); + $output .= '
' . wfMessage( + 'comments-anon-message', + htmlspecialchars( $register_title->getFullURL() ), + htmlspecialchars( $login_title->getFullURL() ) + )->text() . '
' . "\n"; + } + + $output .= '' . "\n"; + $output .= '
' . "\n"; + } + $output .= '' . "\n"; + $output .= '' . "\n"; + $output .= '' . "\n"; + $output .= '' . "\n"; + $output .= '' . "\n"; + $output .= '' . "\n"; + $output .= Html::hidden( 'token', $this->getUser()->getEditToken() ); + } + $output .= '
' . "\n"; + return $output; + } + + /** + * Purge caches (parser cache and Squid cache) + */ + function clearCommentListCache() { + wfDebug( "Clearing comments for page {$this->id} from cache\n" ); + + if ( is_object( $this->title ) ) { + $this->title->invalidateCache(); + $this->title->purgeSquid(); + } + } + +} diff --git a/includes/NumberOfComments.class.php b/includes/NumberOfComments.class.php new file mode 100644 index 0000000..919c7a1 --- /dev/null +++ b/includes/NumberOfComments.class.php @@ -0,0 +1,135 @@ +setFunctionHook( 'NUMBEROFCOMMENTSPAGE', 'NumberOfComments::getNumberOfCommentsPageParser', Parser::SFH_NO_HASH ); + return true; + } + + /** + * Main backend logic for the {{NUMBEROFCOMMENTS}} and {{NUMBEROFCOMMENTSPAGE}} + * magic word. + * If the {{NUMBEROFCOMMENTS}} magic word is found, first checks memcached to + * see if we can get the value from cache, but if that fails for some reason, + * then a COUNT(*) SQL query is done to fetch the amount from the database. + * If the {{NUMBEROFCOMMENTSPAGE}} magic word is found, uses + * NumberOfComments::getNumberOfCommentsPage to get the number of comments + * for this article. + * + * @param $parser Parser + * @param $cache + * @param string $magicWordId Magic word identifier + * @param int $ret What to return to the user (in our case, the number of comments) + * @return bool + */ + public static function getNumberOfCommentsMagic( &$parser, &$cache, &$magicWordId, &$ret ) { + global $wgMemc; + + if ( $magicWordId == 'NUMBEROFCOMMENTS' ) { + $key = wfMemcKey( 'comments', 'magic-word' ); + $data = $wgMemc->get( $key ); + if ( $data != '' ) { + // We have it in cache? Oh goody, let's just use the cached value! + wfDebugLog( + 'Comments', + 'Got the amount of comments from memcached' + ); + // return value + $ret = $data; + } else { + // Not cached → have to fetch it from the database + $dbr = wfGetDB( DB_SLAVE ); + $commentCount = (int)$dbr->selectField( + 'Comments', + 'COUNT(*) AS count', + array(), + __METHOD__ + ); + wfDebugLog( 'Comments', 'Got the amount of comments from DB' ); + // Store the count in cache... + // (86400 = seconds in a day) + $wgMemc->set( $key, $commentCount, 86400 ); + // ...and return the value to the user + $ret = $commentCount; + } + } elseif ( $magicWordId == 'NUMBEROFCOMMENTSPAGE' ) { + $id = $parser->getTitle()->getArticleID(); + $ret = NumberOfComments::getNumberOfCommentsPage( $id ); + } + + return true; + } + + /** + * Hook for parser function {{NUMBEROFCOMMENTSPAGE:}} + * + * @param Parser $parser + * @param string $pagename Page name + * @return int Amount of comments on the given page + */ + static function getNumberOfCommentsPageParser( $parser, $pagename ) { + $page = Title::newFromText( $pagename ); + + if ( $page instanceof Title ) { + $id = $page->getArticleID(); + } else { + $id = $parser->getTitle()->getArticleID(); + } + + return NumberOfComments::getNumberOfCommentsPage( $id ); + } + + /** + * Get the actual number of comments + * + * @param int $pageId ID of page to get number of comments for + * @return int + */ + static function getNumberOfCommentsPage( $pageId ) { + global $wgMemc; + + $key = wfMemcKey( 'comments', 'numberofcommentspage', $pageId ); + $cache = $wgMemc->get( $key ); + + if ( $cache ) { + $val = intval( $cache ); + } else { + $dbr = wfGetDB( DB_SLAVE ); + + $res = $dbr->selectField( + 'Comments', + 'COUNT(*)', + array( 'Comment_Page_ID' => $pageId ), + __METHOD__ + ); + + if ( !$res ) { + $val = 0; + } else { + $val = intval( $res ); + } + $wgMemc->set( $key, $val, 60 * 60 ); // cache for an hour + } + + return $val; + } + +} diff --git a/includes/api/CommentBlock.api.php b/includes/api/CommentBlock.api.php new file mode 100644 index 0000000..b362649 --- /dev/null +++ b/includes/api/CommentBlock.api.php @@ -0,0 +1,52 @@ +selectRow( + 'Comments', + array( 'comment_username', 'comment_user_id' ), + array( 'CommentID' => $this->getMain()->getVal( 'commentID' ) ), + __METHOD__ + ); + if ( $s !== false ) { + $userID = $s->comment_user_id; + $username = $s->comment_username; + } + + CommentFunctions::blockUser( $this->getUser(), $userID, $username ); + + if ( class_exists( 'UserStatsTrack' ) ) { + $stats = new UserStatsTrack( $userID, $username ); + $stats->incStatField( 'comment_ignored' ); + } + + $result = $this->getResult(); + $result->addValue( $this->getModuleName(), 'ok', 'ok' ); + return true; + } + + public function needsToken() { + return 'csrf'; + } + + public function isWriteMode() { + return true; + } + + public function getAllowedParams() { + return array( + 'commentID' => array( + ApiBase::PARAM_REQUIRED => true, + ApiBase::PARAM_TYPE => 'integer' + ) + ); + } +} diff --git a/includes/api/CommentDelete.api.php b/includes/api/CommentDelete.api.php new file mode 100644 index 0000000..a77d2fb --- /dev/null +++ b/includes/api/CommentDelete.api.php @@ -0,0 +1,41 @@ +getUser(); + // Blocked users cannot delete comments, and neither can unprivileged ones. + // Also check for database read-only status + if ( + $user->isBlocked() || + !$user->isAllowed( 'commentadmin' ) || + wfReadOnly() + ) { + return true; + } + + $comment = Comment::newFromID( $this->getMain()->getVal( 'commentID' ) ); + $comment->delete(); + + $result = $this->getResult(); + $result->addValue( $this->getModuleName(), 'ok', 'ok' ); + return true; + } + + public function needsToken() { + return 'csrf'; + } + + public function isWriteMode() { + return true; + } + + public function getAllowedParams() { + return array( + 'commentID' => array( + ApiBase::PARAM_REQUIRED => true, + ApiBase::PARAM_TYPE => 'integer' + ) + ); + } +} diff --git a/includes/api/CommentLatestID.api.php b/includes/api/CommentLatestID.api.php new file mode 100644 index 0000000..0348a29 --- /dev/null +++ b/includes/api/CommentLatestID.api.php @@ -0,0 +1,22 @@ +getMain()->getVal( 'pageID' ); + + $commentsPage = new CommentsPage( $pageID, RequestContext::getMain() ); + + $result = $this->getResult(); + $result->addValue( $this->getModuleName(), 'id', $commentsPage->getLatestCommentID() ); + } + + public function getAllowedParams() { + return array( + 'pageID' => array( + ApiBase::PARAM_REQUIRED => true, + ApiBase::PARAM_TYPE => 'int' + ) + ); + } +} diff --git a/includes/api/CommentList.api.php b/includes/api/CommentList.api.php new file mode 100644 index 0000000..a14f5ee --- /dev/null +++ b/includes/api/CommentList.api.php @@ -0,0 +1,44 @@ +getMain()->getVal( 'pageID' ), RequestContext::getMain() ); + $commentsPage->orderBy = $this->getMain()->getVal( 'order' ); + $commentsPage->currentPagerPage = $this->getMain()->getVal( 'pagerPage' ); + + $output = ''; + if ( $this->getMain()->getVal( 'showForm' ) ) { + $output .= $commentsPage->displayOrderForm(); + } + $output .= $commentsPage->display(); + if ( $this->getMain()->getVal( 'showForm' ) ) { + $output .= $commentsPage->displayForm(); + } + + $result = $this->getResult(); + $result->addValue( $this->getModuleName(), 'html', $output ); + return true; + } + + public function getAllowedParams() { + return array( + 'pageID' => array( + ApiBase::PARAM_REQUIRED => true, + ApiBase::PARAM_TYPE => 'integer' + ), + 'order' => array( + ApiBase::PARAM_REQUIRED => true, + ApiBase::PARAM_TYPE => 'boolean' + ), + 'pagerPage' => array( + ApiBase::PARAM_REQUIRED => true, + ApiBase::PARAM_TYPE => 'integer' + ), + 'showForm' => array( + ApiBase::PARAM_REQUIRED => false, + ApiBase::PARAM_TYPE => 'integer' + ) + ); + } +} diff --git a/includes/api/CommentSubmit.api.php b/includes/api/CommentSubmit.api.php new file mode 100644 index 0000000..7746bc0 --- /dev/null +++ b/includes/api/CommentSubmit.api.php @@ -0,0 +1,73 @@ +getUser(); + // Blocked users cannot submit new comments, and neither can those users + // without the necessary privileges. Also prevent obvious cross-site request + // forgeries (CSRF) + if ( + $user->isBlocked() || + !$user->isAllowed( 'comment' ) || + wfReadOnly() + ) { + return true; + } + + $commentText = $this->getMain()->getVal( 'commentText' ); + + if ( $commentText != '' ) { + // To protect against spam, it's necessary to check the supplied text + // against spam filters (but comment admins are allowed to bypass the + // spam filters) + if ( !$user->isAllowed( 'commentadmin' ) && CommentFunctions::isSpam( $commentText ) ) { + $this->dieUsage( wfMessage( 'comments-is-spam' )->plain(), 'comments-is-spam' ); + } + + // If the comment contains links but the user isn't allowed to post + // links, reject the submission + if ( !$user->isAllowed( 'commentlinks' ) && CommentFunctions::haveLinks( $commentText ) ) { + $this->dieUsage( wfMessage( 'comments-links-are-forbidden' )->plain(), 'comments-links-are-forbidden' ); + } + + $page = new CommentsPage( $this->getMain()->getVal( 'pageID' ), $this->getContext() ); + + Comment::add( $commentText, $page, $user, $this->getMain()->getVal( 'parentID' ) ); + + if ( class_exists( 'UserStatsTrack' ) ) { + $stats = new UserStatsTrack( $user->getID(), $user->getName() ); + $stats->incStatField( 'comment' ); + } + } + + $result = $this->getResult(); + $result->addValue( $this->getModuleName(), 'ok', 'ok' ); + return true; + } + + public function needsToken() { + return 'csrf'; + } + + public function isWriteMode() { + return true; + } + + public function getAllowedParams() { + return array( + 'pageID' => array( + ApiBase::PARAM_REQUIRED => true, + ApiBase::PARAM_TYPE => 'integer' + ), + 'parentID' => array( + ApiBase::PARAM_REQUIRED => false, + ApiBase::PARAM_TYPE => 'integer' + ), + 'commentText' => array( + ApiBase::PARAM_REQUIRED => true, + ApiBase::PARAM_TYPE => 'string' + ) + ); + } +} diff --git a/includes/api/CommentVote.api.php b/includes/api/CommentVote.api.php new file mode 100644 index 0000000..5a2202f --- /dev/null +++ b/includes/api/CommentVote.api.php @@ -0,0 +1,72 @@ +getUser()->isBlocked() || + !$this->getUser()->isAllowed( 'comment' ) || + wfReadOnly() + ) { + return ''; + } + + $comment = Comment::newFromID( $this->getMain()->getVal( 'commentID' ) ); + $voteValue = $this->getMain()->getVal( 'voteValue' ); + + if ( $comment && is_numeric( $voteValue ) ) { + $comment->vote( $voteValue ); + + $html = $comment->getScoreHTML(); + $html = htmlspecialchars( $html ); + + if ( class_exists( 'UserStatsTrack' ) ) { + $stats = new UserStatsTrack( $this->getUser()->getID(), $this->getUser()->getName() ); + + // Must update stats for user doing the voting + if ( $voteValue == 1 ) { + $stats->incStatField( 'comment_give_plus' ); + } + if ( $voteValue == -1 ) { + $stats->incStatField( 'comment_give_neg' ); + } + + // Also must update the stats for user receiving the vote + $stats_comment_owner = new UserStatsTrack( $comment->userID, $comment->username ); + $stats_comment_owner->updateCommentScoreRec( $voteValue ); + + $stats_comment_owner->updateTotalPoints(); + if ( $voteValue === 1 ) { + $stats_comment_owner->updateWeeklyPoints( $stats_comment_owner->point_values['comment_plus'] ); + $stats_comment_owner->updateMonthlyPoints( $stats_comment_owner->point_values['comment_plus'] ); + } + } + + $result = $this->getResult(); + $result->addValue( $this->getModuleName(), 'html', $html ); + return true; + } + } + + public function needsToken() { + return 'csrf'; + } + + public function isWriteMode() { + return true; + } + + public function getAllowedParams() { + return array( + 'commentID' => array( + ApiBase::PARAM_REQUIRED => true, + ApiBase::PARAM_TYPE => 'integer' + ), + 'voteValue' => array( + ApiBase::PARAM_REQUIRED => true, + ApiBase::PARAM_TYPE => 'integer' + ), + ); + } +} diff --git a/includes/specials/SpecialCommentIgnoreList.php b/includes/specials/SpecialCommentIgnoreList.php new file mode 100644 index 0000000..557ca2e --- /dev/null +++ b/includes/specials/SpecialCommentIgnoreList.php @@ -0,0 +1,146 @@ +getOutput(); + $request = $this->getRequest(); + $user = $this->getUser(); + + $user_name = $request->getVal( 'user' ); + + /** + * Redirect anonymous users to Login Page + * It will automatically return them to the CommentIgnoreList page + */ + if ( $user->getID() == 0 && $user_name == '' ) { + $loginPage = SpecialPage::getTitleFor( 'Userlogin' ); + $out->redirect( $loginPage->getLocalURL( 'returnto=Special:CommentIgnoreList' ) ); + return; + } + + $out->setPageTitle( $this->msg( 'comments-ignore-title' )->text() ); + + $output = ''; // Prevent E_NOTICE + + if ( $user_name == '' ) { + $output .= $this->displayCommentBlockList(); + } else { + if ( $request->wasPosted() ) { + // Check for cross-site request forgeries (CSRF) + if ( !$user->matchEditToken( $request->getVal( 'token' ) ) ) { + $out->addWikiMsg( 'sessionfailure' ); + return; + } + $user_name = htmlspecialchars_decode( $user_name ); + $user_id = User::idFromName( $user_name ); + // Anons can be comment-blocked, but idFromName returns nothing + // for an anon, so... + if ( !$user_id ) { + $user_id = 0; + } + + CommentFunctions::deleteBlock( $user->getID(), $user_id ); + if ( $user_id && class_exists( 'UserStatsTrack' ) ) { + $stats = new UserStatsTrack( $user_id, $user_name ); + $stats->decStatField( 'comment_ignored' ); + } + $output .= $this->displayCommentBlockList(); + } else { + $output .= $this->confirmCommentBlockDelete(); + } + } + + $out->addHTML( $output ); + } + + /** + * Displays the list of users whose comments you're ignoring. + * + * @return string HTML + */ + function displayCommentBlockList() { + $lang = $this->getLanguage(); + $title = $this->getPageTitle(); + + $dbr = wfGetDB( DB_SLAVE ); + $res = $dbr->select( + 'Comments_block', + array( 'cb_user_name_blocked', 'cb_date' ), + array( 'cb_user_id' => $this->getUser()->getID() ), + __METHOD__, + array( 'ORDER BY' => 'cb_user_name' ) + ); + + if ( $dbr->numRows( $res ) > 0 ) { + $out = '
    '; + foreach ( $res as $row ) { + $user_title = Title::makeTitle( NS_USER, $row->cb_user_name_blocked ); + $out .= '
  • ' . $this->msg( + 'comments-ignore-item', + htmlspecialchars( $user_title->getFullURL() ), + $user_title->getText(), + $lang->timeanddate( $row->cb_date ), + htmlspecialchars( $title->getFullURL( 'user=' . $user_title->getText() ) ) + )->text() . '
  • '; + } + $out .= '
'; + } else { + $out = '
' . + $this->msg( 'comments-ignore-no-users' )->text() . '
'; + } + return $out; + } + + /** + * Asks for a confirmation when you're about to unblock someone's comments. + * + * @return string HTML + */ + function confirmCommentBlockDelete() { + $user_name = $this->getRequest()->getVal( 'user' ); + + $out = '
' . + $this->msg( 'comments-ignore-remove-message', $user_name )->parse() . + '
+
+
' . + Html::hidden( 'user', $user_name ) . "\n" . + Html::hidden( 'token', $this->getUser()->getEditToken() ) . "\n" . + ' + +
+
'; + return $out; + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..b3114a4 --- /dev/null +++ b/package.json @@ -0,0 +1,12 @@ +{ + "private": true, + "scripts": { + "test": "grunt test" + }, + "devDependencies": { + "grunt": "1.0.1", + "grunt-banana-checker": "0.4.0", + "grunt-contrib-jshint": "1.0.0", + "grunt-jsonlint": "1.0.7" + } +} diff --git a/resources/css/Comments.css b/resources/css/Comments.css new file mode 100644 index 0000000..93aa0f1 --- /dev/null +++ b/resources/css/Comments.css @@ -0,0 +1,169 @@ +/* CSS styles for Comments extension */ +.full { + width: 530px; +} + +.reply { + margin-left: 70px !important; + width: 460px; +} + +.c-item { + position: relative; + border-bottom: 1px solid #dcdcdc; +/* this works for Monaco, but not for Monobook. +Besides, ny.css sets it back to 10px anyway, so this way everyone can be happy. + padding: 0px 0px 10px 0px;*/ + padding: 0px 0px 35px 0px; + margin: 0px 0px 15px 0px; +} + +.c-avatar { + position: absolute; + top: 0px; + left: 0px; +} + +.c-avatar img { + padding: 3px; + border: 1px solid #dcdcdc; + background-color: #fff; +} + +.c-container { + position: relative; + top: 0px; + top: 0px; + margin: 0px 0px 0px 70px; +} + +.c-user { + font-weight: bold; + position: relative; + margin: 0px 0px 6px 0px; +} + +.c-user a { + font-size: 14px; + text-decoration: none; +} + +.c-time { + font-size: 10px; + color: #888; + line-height: 11px !important; + font-weight: normal !important; +} + +.c-user-level { + color: #666; + font-size: 11px; + margin: 0px 5px 0px 5px; +} + +.c-comment { + overflow: auto; +} + +.c-ignored { + color: #666; + font-size: 11px; + padding: 5px 0px 10px 0px; + margin: 0px 0px 15px 0px; + border-bottom: 1px solid #dcdcdc; +} + +.c-ignored-links a { +} + +.f-message { + width: 460px; +} + +.r-message { + width: 360px; +} + +.c-score { + position: absolute; + top: -2px; + right: 0px; + font-size: 11px; + padding-top: 6px; + font-weight: bold; + z-index: 4; +} + +.c-score-title { + margin: 0px 10px 0px 0px; +} + +.c-actions { + float: right; + font-size: 10px; + margin: 10px 0px 0px 0px; +} + +.c-delete a { + color: red !important; +} + +.c-score img { + vertical-align: middle; + margin: -5px 0px 0px 2px +} + +.c-form-title { + color: #333; + font-weight: bold; + font-size: 17px; + margin: 0px 0px 5px 0px; +} + +.c-form-message { + font-size: 11px; + width: 400px; + line-height: 13px; + color: #666; + padding: 5px 0px 10px 0px; +} + +textarea#comment { + width: 530px; +} + +.c-form-button { + padding: 10px 0px 0px; +} + +.c-order { + padding: 20px 0px; +} + +.c-spy { + float: left; + font-size: 10px; + margin: 0px 0px 0px 10px; +} + +.c-order-select { + float: left; +} + +/* Pager */ +ul.c-pager { + clear: both; + margin: 0; +} + +li.c-pager-item { + background-image: none; + display: inline; + font-size: 14px; + list-style-type: none; + padding: 0.5em; +} + +.cod img { + margin-bottom: 8px; +} diff --git a/resources/images/block.svg b/resources/images/block.svg new file mode 100644 index 0000000..98e1b7b --- /dev/null +++ b/resources/images/block.svg @@ -0,0 +1,41 @@ + + + + + + + + + image/svg+xml + + + + + + + + + + diff --git a/resources/images/down-unvoted.png b/resources/images/down-unvoted.png new file mode 100644 index 0000000..88a5c64 Binary files /dev/null and b/resources/images/down-unvoted.png differ diff --git a/resources/images/down-voted.png b/resources/images/down-voted.png new file mode 100644 index 0000000..ef25c1e Binary files /dev/null and b/resources/images/down-voted.png differ diff --git a/resources/images/up-unvoted.png b/resources/images/up-unvoted.png new file mode 100644 index 0000000..519c517 Binary files /dev/null and b/resources/images/up-unvoted.png differ diff --git a/resources/images/up-voted.png b/resources/images/up-voted.png new file mode 100644 index 0000000..c498432 Binary files /dev/null and b/resources/images/up-voted.png differ diff --git a/resources/images/voted.svg b/resources/images/voted.svg new file mode 100644 index 0000000..0746ef1 --- /dev/null +++ b/resources/images/voted.svg @@ -0,0 +1,36 @@ + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/resources/js/Comment.js b/resources/js/Comment.js new file mode 100644 index 0000000..427c582 --- /dev/null +++ b/resources/js/Comment.js @@ -0,0 +1,347 @@ +/** + * JavaScript for the Comments extension. + * Rewritten by Jack Phoenix to be more + * object-oriented. + * + * @file + * @date 6 December 2013 + */ +( function ( $, mw ) { +var Comment = { + submitted: 0, + isBusy: false, + timer: '', // has to have an initial value... + updateDelay: 7000, + LatestCommentID: '', + CurLatestCommentID: '', + pause: 0, + + /** + * When a comment's author is ignored, "Show Comment" link will be + * presented to the user. + * If the user clicks on it, this function is called to show the hidden + * comment. + */ + show: function( id ) { + $( '#ignore-' + id ).hide( 300 ); + $( '#comment-' + id ).show( 300 ); + }, + + /** + * This function is called whenever a user clicks on the "block" image to + * block another user's comments. + * + * @param username String: name of the user whose comments we want to block + * @param userID Integer: user ID number of the user whose comments we + * want to block (or 0 for anonymous users) + * @param commentID Integer: comment ID number + */ + blockUser: function( username, userID, commentID ) { + var message; + + // Display a different message depending on whether we're blocking an + // anonymous user or a registered one. + if ( !userID || userID === 0 ) { + message = mw.msg( 'comments-block-warning-anon' ); + } else { + message = mw.msg( 'comments-block-warning-user', username ); + } + + if ( window.confirm( message ) ) { + ( new mw.Api() ).postWithToken( 'csrf', { + action: 'commentblock', + commentID: commentID + } ).done( function( response ) { + if ( response.commentblock.ok ) { + $( 'a.comments-block-user[data-comments-user-id=' + userID + ']' ) + .parents( '.c-item' ).hide( 300 ) + .prev().show( 300 ); + } + } ); + } + }, + + /** + * This function is called whenever a user clicks on the "Delete Comment" + * link to delete a comment. + * + * @param commentID Integer: comment ID number + */ + deleteComment: function( commentID ) { + if ( window.confirm( mw.msg( 'comments-delete-warning' ) ) ) { + ( new mw.Api() ).postWithToken( 'csrf', { + action: 'commentdelete', + commentID: commentID + } ).done( function( response ) { + if ( response.commentdelete.ok ) { + $( '#comment-' + commentID ).hide( 2000 ); + } + } ); + } + }, + + /** + * Vote for a comment. + * + * @param commentID Integer: comment ID number + * @param voteValue Integer: vote value + */ + vote: function( commentID, voteValue ) { + ( new mw.Api() ).postWithToken( 'csrf', { + action: 'commentvote', + commentID: commentID, + voteValue: voteValue + } ).done( function( response ) { + $( '#comment-' + commentID + ' .c-score' ) + .html( response.commentvote.html ) // this will still be escaped + .html( $( '#comment-' + commentID + ' .c-score' ).text() ); // unescape + } ); + }, + + /** + * @param pageID Integer: page ID + * @param order Sorting order + * @param end Scroll to bottom after? + * @param cpage Integer: comment page number (used for pagination) + */ + viewComments: function( pageID, order, end, cpage ) { + document.commentForm.cpage.value = cpage; + document.getElementById( 'allcomments' ).innerHTML = mw.msg( 'comments-loading' ) + '

'; + + $.ajax( { + url: mw.config.get( 'wgScriptPath' ) + '/api.php', + data: { 'action': 'commentlist', 'format': 'json', 'pageID': pageID, 'order': order, 'pagerPage': cpage }, + cache: false + } ).done( function( response ) { + document.getElementById( 'allcomments' ).innerHTML = response.commentlist.html; + Comment.submitted = 0; + if ( end ) { + window.location.hash = 'end'; + } + } ); + }, + + /** + * Submit a new comment. + */ + submit: function() { + if ( Comment.submitted === 0 ) { + Comment.submitted = 1; + + var pageID = document.commentForm.pageId.value; + var parentID; + if ( !document.commentForm.commentParentId.value ) { + parentID = 0; + } else { + parentID = document.commentForm.commentParentId.value; + } + var commentText = document.commentForm.commentText.value; + + ( new mw.Api() ).postWithToken( 'csrf', { + action: 'commentsubmit', + pageID: pageID, + parentID: parentID, + commentText: commentText + } ).done( function( response ) { + if ( response.commentsubmit && response.commentsubmit.ok ) { + document.commentForm.commentText.value = ''; + var end = 1; + if ( mw.config.get( 'wgCommentsSortDescending' ) ) { + end = 0; + } + Comment.viewComments( document.commentForm.pageId.value, 0, end, document.commentForm.cpage.value ); + } else { + window.alert( response.error.info ); + Comment.submitted = 0; + } + } ); + + Comment.cancelReply(); + } + }, + + /** + * Toggle comment auto-refreshing on or off + * + * @param status + */ + toggleLiveComments: function( status ) { + if ( status ) { + Comment.pause = 0; + } else { + Comment.pause = 1; + } + var msg; + if ( status ) { + msg = mw.msg( 'comments-auto-refresher-pause' ); + } else { + msg = mw.msg( 'comments-auto-refresher-enable' ); + } + + $( 'body' ).on( 'click', 'div#spy a', function() { + Comment.toggleLiveComments( ( status ) ? 0 : 1 ); + } ); + $( 'div#spy a' ).css( 'font-size', '10px' ).text( msg ); + + if ( !Comment.pause ) { + Comment.LatestCommentID = document.commentForm.lastCommentId.value; + Comment.timer = setTimeout( + function() { Comment.checkUpdate(); }, + Comment.updateDelay + ); + } + }, + + checkUpdate: function() { + if ( Comment.isBusy ) { + return; + } + var pageID = document.commentForm.pageId.value; + + $.ajax( { + url: mw.config.get( 'wgScriptPath' ) + '/api.php', + data: { 'action': 'commentlatestid', 'format': 'json', 'pageID': pageID }, + cache: false + } ).done( function( response ) { + if ( response.commentlatestid.id ) { + // Get last new ID + Comment.CurLatestCommentID = response.commentlatestid.id; + if ( Comment.CurLatestCommentID !== Comment.LatestCommentID ) { + Comment.viewComments( document.commentForm.pageId.value, 0, 1, document.commentForm.cpage.value ); + Comment.LatestCommentID = Comment.CurLatestCommentID; + } + } + + Comment.isBusy = false; + if ( !Comment.pause ) { + clearTimeout( Comment.timer ); + Comment.timer = setTimeout( + function() { Comment.checkUpdate(); }, + Comment.updateDelay + ); + } + } ); + + Comment.isBusy = true; + return false; + }, + + /** + * Show the "reply to user X" form + * + * @param parentId Integer: parent comment (the one we're replying to) ID + * @param poster String: name of the person whom we're replying to + * @param posterGender String: gender of the person whom we're replying to + */ + reply: function( parentId, poster, posterGender ) { + $( '#replyto' ).text( + mw.msg( 'comments-reply-to', poster, posterGender ) + ' (' + ); + $( '', { + class: 'comments-cancel-reply-link', + style: 'cursor:pointer', + text: mw.msg( 'comments-cancel-reply' ) + } ).appendTo( '#replyto' ); + $( '#replyto' ).append( ')
' ); + + document.commentForm.commentParentId.value = parentId; + }, + + cancelReply: function() { + document.getElementById( 'replyto' ).innerHTML = ''; + document.commentForm.commentParentId.value = ''; + } +}; + +$( function() { + // Important note: these are all using $( 'body' ) as the selector + // instead of the class/ID/whatever so that they work after viewComments() + // has been called (i.e. so that "Delete comment", reply, etc. links + // continue working after you've submitted a comment yourself) + + // "Sort by X" feature + $( 'body' ).on( 'change', 'select[name="TheOrder"]', function() { + Comment.viewComments( + mw.config.get( 'wgArticleId' ), // or we could use $( 'input[name="pid"]' ).val(), too + $( this ).val(), + 0, + document.commentForm.cpage.value + ); + } ) + + // Comment auto-refresher + .on( 'click', 'div#spy a', function() { + Comment.toggleLiveComments( 1 ); + } ) + + // Voting links + .on( 'click', 'a#comment-vote-link', function() { + var that = $( this ); + Comment.vote( + that.data( 'comment-id' ), + that.data( 'vote-type' ) + ); + } ) + + // "Block this user" links + .on( 'click', 'a.comments-block-user', function() { + var that = $( this ); + Comment.blockUser( + that.data( 'comments-safe-username' ), + that.data( 'comments-user-id' ), + that.data( 'comments-comment-id' ) + ); + } ) + + // "Delete Comment" links + .on( 'click', 'a.comment-delete-link', function() { + Comment.deleteComment( $( this ).data( 'comment-id' ) ); + } ) + + // "Show this hidden comment" -- comments made by people on the user's + // personal block list + .on( 'click', 'div.c-ignored-links a', function() { + Comment.show( $( this ).data( 'comment-id' ) ); + } ) + + // Reply links + .on( 'click', 'a.comments-reply-to', function() { + Comment.reply( + $( this ).data( 'comment-id' ), + $( this ).data( 'comments-safe-username' ), + $( this ).data( 'comments-user-gender' ) + ); + } ) + + // "Reply to " links + .on( 'click', 'a.comments-cancel-reply-link', function() { + Comment.cancelReply(); + } ) + + // Handle clicks on the submit button (previously this was an onclick attr) + .on( 'click', 'div.c-form-button input[type="button"]', function() { + Comment.submit(); + } ) + + // Change page + .on( 'click', 'li.c-pager-item a.c-pager-link', function() { + var ord = 0, + commentsBody = $( this ).parents( 'div.comments-body:first' ); + + if ( commentsBody.length > 0 ) { + var ordCrtl = commentsBody.first().find( 'select[name="TheOrder"]:first' ); + if ( ordCrtl.length > 0 ) { + ord = ordCrtl.val(); + } + } + + Comment.viewComments( + mw.config.get( 'wgArticleId' ), // or we could use $( 'input[name="pid"]' ).val(), too + ord, + 0, + $( this ).data( 'cpage' ) + ); + } ); +} ); + +}( jQuery, mediaWiki ) ); diff --git a/sql/comments.mssql.sql b/sql/comments.mssql.sql new file mode 100644 index 0000000..b3db5c4 --- /dev/null +++ b/sql/comments.mssql.sql @@ -0,0 +1,47 @@ +-- Microsoft SQL Server (MSSQL) variant of Comments' database schema +-- This is probably crazy, but so is MSSQL. I've never used MSSQL so +-- there's a fair chance that the code is full of bugs, stupid things or both. +-- Please feel free to submit patches or just go ahead and fix it. +-- +-- Tested at SQLFiddle.com against MS SQL Server 2008 & 2012 and at least this +-- builds. Doesn't guarantee anything, though. +-- +-- Author: Jack Phoenix +-- Date: 24 July 2013 +CREATE TABLE /*$wgDBprefix*/Comments ( + CommentID INT NOT NULL PRIMARY KEY IDENTITY(0,1), + Comment_Page_ID INT NOT NULL default 0, + Comment_user_id INT NOT NULL default 0, + Comment_Username NVARCHAR(200) NOT NULL default '', + Comment_Text text NOT NULL, + Comment_Date DATETIME NOT NULL default '0000-00-00 00:00:00', + Comment_Parent_ID INT NOT NULL default 0, + Comment_IP NVARCHAR(45) NOT NULL default '', +) /*$wgDBTableOptions*/; + +CREATE INDEX /*i*/comment_page_id_index ON /*$wgDBprefix*/Comments (Comment_Page_ID); +CREATE INDEX /*i*/wiki_user_id ON /*$wgDBprefix*/Comments (Comment_user_id); +CREATE INDEX /*i*/wiki_user_name ON /*$wgDBprefix*/Comments (Comment_Username); + +CREATE TABLE /*$wgDBprefix*/Comments_Vote ( + Comment_Vote_ID INT NOT NULL default 0, + Comment_Vote_user_id INT NOT NULL default 0, + Comment_Vote_Username NVARCHAR(200) NOT NULL default '', + Comment_Vote_Score INT NOT NULL default 0, + Comment_Vote_Date DATETIME NOT NULL default '0000-00-00 00:00:00', + Comment_Vote_IP NVARCHAR(45) NOT NULL default '' +) /*$wgDBTableOptions*/; + +CREATE UNIQUE INDEX /*i*/Comments_Vote_user_id_index ON /*$wgDBprefix*/Comments_Vote (Comment_Vote_ID,Comment_Vote_Username); +CREATE INDEX /*i*/Comment_Vote_Score ON /*$wgDBprefix*/Comments_Vote (Comment_Vote_Score); +CREATE INDEX /*i*/Comment_Vote_user_id ON /*$wgDBprefix*/Comments_Vote (Comment_Vote_user_id); + +CREATE TABLE /*$wgDBprefix*/Comments_block ( + cb_id INT NOT NULL PRIMARY KEY IDENTITY(0,1), + cb_user_id INT NOT NULL default 0, + cb_user_name NVARCHAR(255) NOT NULL default '', + cb_user_id_blocked INT default NULL, + cb_user_name_blocked NVARCHAR(255) NOT NULL default '', + cb_date DATETIME default NULL +) /*$wgDBTableOptions*/; +CREATE INDEX /*i*/cb_user_id ON /*$wgDBprefix*/Comments_block (cb_user_id); diff --git a/sql/comments.oracle.sql b/sql/comments.oracle.sql new file mode 100644 index 0000000..2957692 --- /dev/null +++ b/sql/comments.oracle.sql @@ -0,0 +1,60 @@ +-- Oracle variant of Comments' database schema +-- This is probably crazy, but so is Oracle. I've never used Oracle so +-- there's a fair chance that the code is full of bugs, stupid things or both. +-- Please feel free to submit patches or just go ahead and fix it. +-- +-- This DOES NOT build at SQLFiddle.com... +-- +-- Author: Jack Phoenix +-- Date: 24 July 2013 + +-- No idea if this is needed, but /maintenance/oracle/tables.sql uses it, so I +-- guess it serves some purpose here, too +define mw_prefix='{$wgDBprefix}'; + +CREATE SEQUENCE Comments_CommentID_seq; + +CREATE TABLE &mw_prefix.Comments ( + CommentID NUMBER NOT NULL, + Comment_Page_ID NUMBER NOT NULL DEFAULT 0, + Comment_user_id NUMBER NOT NULL DEFAULT 0, + Comment_Username VARCHAR2(200) NOT NULL, + -- CLOB (original MySQL one uses text), as per http://stackoverflow.com/questions/1180204/oracle-equivalent-of-mysqls-text-type + Comment_Text CLOB NOT NULL, + Comment_Date TIMESTAMP(6) WITH TIME ZONE NOT NULL, + Comment_Parent_ID NUMBER NOT NULL DEFAULT 0, + Comment_IP VARCHAR2(45) NOT NULL, +); + +CREATE INDEX &mw_prefix.comment_page_id_index ON &mw_prefix.Comments (Comment_Page_ID); +CREATE INDEX &mw_prefix.wiki_user_id ON &mw_prefix.Comments (Comment_user_id); +CREATE INDEX &mw_prefix.wiki_user_name ON &mw_prefix.Comments (Comment_Username); + +ALTER TABLE &mw_prefix.Comments ADD CONSTRAINT &mw_prefix.Comments_pk PRIMARY KEY (CommentID); + +CREATE TABLE &mw_prefix.Comments_Vote ( + Comment_Vote_ID NUMBER NOT NULL DEFAULT 0, + Comment_Vote_user_id NUMBER NOT NULL DEFAULT 0, + Comment_Vote_Username VARCHAR2(200) NOT NULL, + Comment_Vote_Score NUMBER NOT NULL DEFAULT 0, + Comment_Vote_Date TIMESTAMP(6) WITH TIME ZONE NOT NULL, + Comment_Vote_IP VARCHAR2(45) NOT NULL +); + +CREATE UNIQUE INDEX &mw_prefix.Comments_Vote_user_id_index ON &mw_prefix.Comments_Vote (Comment_Vote_ID,Comment_Vote_Username); +CREATE INDEX &mw_prefix.Comment_Vote_Score ON &mw_prefix.Comments_Vote (Comment_Vote_Score); +CREATE INDEX &mw_prefix.Comment_Vote_user_id ON &mw_prefix.Comments_Vote (Comment_Vote_user_id); + +CREATE SEQUENCE Comments_block_cb_id_seq; + +CREATE TABLE &mw_prefix.Comments_block ( + cb_id NUMBER NOT NULL, + cb_user_id NUMBER NOT NULL DEFAULT 0, + cb_user_name VARCHAR2(255) NOT NULL, + cb_user_id_blocked NUMBER DEFAULT NULL, + cb_user_name_blocked VARCHAR2(255) NOT NULL, + cb_date TIMESTAMP(6) WITH TIME ZONE +); +CREATE INDEX &mw_prefix.cb_user_id ON &mw_prefix.Comments_block (cb_user_id); + +ALTER TABLE &mw_prefix.Comments_block ADD CONSTRAINT &mw_prefix.Comments_block_pk PRIMARY KEY (cb_id); diff --git a/sql/comments.postgres.sql b/sql/comments.postgres.sql new file mode 100644 index 0000000..8a397ff --- /dev/null +++ b/sql/comments.postgres.sql @@ -0,0 +1,53 @@ +-- PostgreSQL variant of Comments' database schema +-- This is probably crazy, but so is PostgreSQL. I've never used PGSQL so +-- there's a fair chance that the code is full of bugs, stupid things or both. +-- Please feel free to submit patches or just go ahead and fix it. +-- +-- Tested at SQLFiddle.com against PostgreSQL 8.3.20 & 9.1.9 and at least this +-- builds. Doesn't guarantee anything, though. +-- +-- Author: Jack Phoenix +-- Date: 24 July 2013 +DROP SEQUENCE IF EXISTS Comments_CommentID_seq CASCADE; +CREATE SEQUENCE Comments_CommentID_seq MINVALUE 0 START WITH 0; + +CREATE TABLE Comments ( + CommentID INTEGER NOT NULL PRIMARY KEY DEFAULT nextval('Comments_CommentID_seq'), + Comment_Page_ID INTEGER NOT NULL DEFAULT 0, + Comment_user_id INTEGER NOT NULL DEFAULT 0, + Comment_Username TEXT NOT NULL DEFAULT '', + Comment_Text TEXT NOT NULL, + Comment_Date TIMESTAMPTZ NOT NULL DEFAULT now(), + Comment_Parent_ID INTEGER NOT NULL DEFAULT 0, + Comment_IP TEXT NOT NULL DEFAULT '', +); + +CREATE INDEX comment_page_id_index ON Comments (Comment_Page_ID); +CREATE INDEX wiki_user_id ON Comments (Comment_user_id); +CREATE INDEX wiki_user_name ON Comments (Comment_Username); + +CREATE TABLE Comments_Vote ( + Comment_Vote_ID INTEGER NOT NULL DEFAULT 0, + Comment_Vote_user_id INTEGER NOT NULL DEFAULT 0, + Comment_Vote_Username TEXT NOT NULL DEFAULT '', + Comment_Vote_Score INTEGER NOT NULL DEFAULT 0, + Comment_Vote_Date TIMESTAMPTZ NOT NULL DEFAULT now(), + Comment_Vote_IP TEXT NOT NULL DEFAULT '' +); + +CREATE UNIQUE INDEX Comments_Vote_user_id_index ON Comments_Vote (Comment_Vote_ID,Comment_Vote_Username); +CREATE INDEX Comment_Vote_Score ON Comments_Vote (Comment_Vote_Score); +CREATE INDEX Comment_Vote_user_id ON Comments_Vote (Comment_Vote_user_id); + + +DROP SEQUENCE IF EXISTS Comments_block_cb_id_seq CASCADE; +CREATE SEQUENCE Comments_block_cb_id_seq MINVALUE 0 START WITH 0; +CREATE TABLE Comments_block ( + cb_id INTEGER NOT NULL PRIMARY KEY DEFAULT nextval('Comments_block_cb_id_seq'), + cb_user_id INTEGER NOT NULL DEFAULT 0, + cb_user_name TEXT NOT NULL DEFAULT '', + cb_user_id_blocked INTEGER DEFAULT NULL, + cb_user_name_blocked TEXT NOT NULL DEFAULT '', + cb_date TIMESTAMPTZ NOT NULL DEFAULT now() +); +CREATE INDEX cb_user_id ON Comments_block (cb_user_id); diff --git a/sql/comments.sql b/sql/comments.sql new file mode 100644 index 0000000..543d6b3 --- /dev/null +++ b/sql/comments.sql @@ -0,0 +1,38 @@ +-- MySQL/SQLite schema for the Comments extension +CREATE TABLE /*_*/Comments ( + CommentID int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT, + Comment_Page_ID int(11) NOT NULL default 0, + Comment_user_id int(11) NOT NULL default 0, + Comment_Username varchar(200) NOT NULL default '', + Comment_Text text NOT NULL, + Comment_Date datetime NOT NULL default '0000-00-00 00:00:00', + Comment_Parent_ID int(11) NOT NULL default 0, + Comment_IP varchar(45) NOT NULL default '' +) /*$wgDBTableOptions*/; + +CREATE INDEX /*i*/comment_page_id_index ON /*_*/Comments (Comment_Page_ID); +CREATE INDEX /*i*/wiki_user_id ON /*_*/Comments (Comment_user_id); +CREATE INDEX /*i*/wiki_user_name ON /*_*/Comments (Comment_Username); + +CREATE TABLE /*_*/Comments_Vote ( + Comment_Vote_ID int(11) NOT NULL default 0, + Comment_Vote_user_id int(11) NOT NULL default 0, + Comment_Vote_Username varchar(200) NOT NULL default '', + Comment_Vote_Score int(4) NOT NULL default 0, + Comment_Vote_Date datetime NOT NULL default '0000-00-00 00:00:00', + Comment_Vote_IP varchar(45) NOT NULL default '' +) /*$wgDBTableOptions*/; + +CREATE UNIQUE INDEX /*i*/Comments_Vote_user_id_index ON /*_*/Comments_Vote (Comment_Vote_ID,Comment_Vote_Username); +CREATE INDEX /*i*/Comment_Vote_Score ON /*_*/Comments_Vote (Comment_Vote_Score); +CREATE INDEX /*i*/Comment_Vote_user_id ON /*_*/Comments_Vote (Comment_Vote_user_id); + +CREATE TABLE /*_*/Comments_block ( + cb_id int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT, + cb_user_id int(5) NOT NULL default 0, + cb_user_name varchar(255) NOT NULL default '', + cb_user_id_blocked int(5) default NULL, + cb_user_name_blocked varchar(255) NOT NULL default '', + cb_date datetime default NULL +) /*$wgDBTableOptions*/; +CREATE INDEX /*i*/cb_user_id ON /*_*/Comments_block (cb_user_id); diff --git a/version b/version new file mode 100644 index 0000000..0e77934 --- /dev/null +++ b/version @@ -0,0 +1,4 @@ +Comments: master +2017-08-02T22:03:07 + +608f7af diff --git a/znilListAllComments.php b/znilListAllComments.php new file mode 100644 index 0000000..892e831 --- /dev/null +++ b/znilListAllComments.php @@ -0,0 +1,177 @@ + parser hook with the Parser. + * + * @param $parser Parser: instance of Parser (not necessarily $wgParser) + * @return Boolean: true + */ +function wfCommentsListAll( &$parser ) { + $parser->setHook( 'commentsAll', 'getcommentsAll' ); + return true; +} + +/** + * Get comments all -- + * + * @return String: HTML + */ +function getcommentsAll( $input, $args, $parser ) { + global $wgMemc, $wgUploadPath; + + $oneDay = 60 * 60 * 24 * 50000; + + // Try memcached first + $key = wfMemcKey( 'comments-all', 'standalone-hook' ); + $data = $wgMemc->get( $key ); + + if( $data ) { // success, got it from memcached! + $commentsAll = $data; + //$dbr = wfGetDB( DB_SLAVE ); + } elseif ( !$data || $args['nocache'] ) { // just query the DB + $dbr = wfGetDB( DB_SLAVE ); + + $res = $dbr->select( + array( 'Comments', 'page' ), + array( + 'Comment_Username', 'comment_ip', 'comment_text', + 'comment_date', 'Comment_user_id', 'CommentID', + 'IFNULL(Comment_Plus_Count - Comment_Minus_Count,0) AS Comment_Score', + 'Comment_Plus_Count AS CommentVotePlus', + 'Comment_Minus_Count AS CommentVoteMinus', + 'Comment_Parent_ID', 'page_title', 'page_namespace' + ), + array( + 'comment_page_id = page_id', + 'UNIX_TIMESTAMP(comment_date) > ' . ( time() - ( $oneDay ) ) + ), + __METHOD__, + array( 'ORDER BY' => '(comment_date) DESC') + ); + + $commentsAll = array(); + foreach ( $res as $row ) { + $commentsAll[] = array( + 'username' => $row->Comment_Username, + 'userid' => $row->Comment_user_id, + 'score' => $row->CommentVotePlus, + 'text' => $row->comment_text, + 'id' => $row->CommentID, + 'pagens' => $row->page_namespace, + 'pagetitle' => $row->page_title, + 'date' => $row->comment_date + ); + } + + $wgMemc->set( $key, $commentsAll, $oneDay ); + } + + $comments = ''; + + foreach ( $commentsAll as $commentsAllTemp ) { + $title2 = Title::makeTitle( + $commentsAllTemp['pagens'], + $commentsAllTemp['pagetitle'] + ); + + if( $commentsAllTemp['userid'] != 0 ) { + $title = Title::makeTitle( NS_USER, $commentsAllTemp['username'] ); + $commentPoster_Display = $commentsAllTemp['username']; + $commentPoster = '
' . + $commentsAllTemp['username'] . ''; + //avatar = new wAvatar( $commentsAllTemp['userid'], 's' ); + $commentIcon = 'extensions/Comments/images/default_s.gif'; + } else { + $title = Title::makeTitle( NS_USER, $commentsAllTemp['username'] ); + $commentPoster_Display = $commentsAllTemp['username']; + $commentPoster = '' . + $commentsAllTemp['username'] . ''; + //avatar = new wAvatar( $commentsAllTemp['userid'], 's' ); + $commentIcon = 'extensions/Comments/images/default_s.gif'; + + /* + $commentPoster_Display = wfMsg( 'comment-anon-name' ); + $commentPoster = wfMsg( 'comment-anon-name' ); + $commentIcon = '{$IP}/extensions/Comments/images/default_s.gif'; + */ + } + + // $comment_text = substr( $commentsAllTemp['text'], 0, 550 - strlen( $commentPoster_Display ) ); + $comment_text = $commentsAllTemp['text']; + if( $comment_text != $commentsAllTemp['text'] ) { + $comment_text .= wfMsg( 'ellipsis' ); + } + + + $comments .= '
'; + $comments .= '
'; + $comments .= '
'; + $comments .= '
' . $commentsAllTemp['date'] . ' -
'; + $comments .= '
' . $commentPoster . ':
'; + $comments .= '
'; + $comments .= ''; + $comments .= '

'; + +// $comments .= '
'; +// $sign = ''; +// /*if ( $commentsAllTemp['score'] > 0 ) { +// $sign = '+'; +// } elseif ( $commentsAllTemp['score'] < 0 ) { +// $sign = '-'; // this *really* shouldn't be happening... +// }*/ +// $comments .= '
' . $sign . +// ' +// ' . $commentsAllTemp['date'] . ' - ' . $commentPoster . ': '; +// $comments .= '' . '' . $comment_text . '
' . +// ''; +// $comments .= '
'; + } + + $output = ''; + if ( !empty( $comments ) ) { + $output .= $comments; + } else { + $output .= wfMsg( 'comments-no-comments-of-day' ); + } + + return $output; +} + + + + + + + + + + + + + + + + + + +