Jelajahi Sumber

Merge remote-tracking branch 'origin/master'

Owen Diffey 3 tahun lalu
induk
melakukan
efa2e2caae
100 mengubah file dengan 2143 tambahan dan 1433 penghapusan
  1. 59 0
      .github/workflows/commands.yaml
  2. 1 1
      RcGcDb
  3. 1 1
      bot.js
  4. 3 2
      cmds/eval.js
  5. 32 2
      cmds/get.js
  6. 3 3
      cmds/rcscript.js
  7. 2 2
      cmds/settings.js
  8. 8 2
      cmds/test.js
  9. 4 0
      cmds/verification.js
  10. 53 3
      cmds/wiki/general.js
  11. 1 1
      cmds/wiki/random.js
  12. 1 1
      cmds/wiki/special_page.js
  13. 0 3
      dashboard/functions.js
  14. 3 9
      dashboard/guilds.js
  15. 2 1
      dashboard/i18n.js
  16. 5 0
      dashboard/i18n/allLangs.json
  17. 14 24
      dashboard/i18n/bn.json
  18. 0 25
      dashboard/i18n/de.json
  19. 0 25
      dashboard/i18n/en.json
  20. 2 27
      dashboard/i18n/es.json
  21. 1 1
      dashboard/i18n/fr.json
  22. 71 97
      dashboard/i18n/hi.json
  23. 265 0
      dashboard/i18n/id.json
  24. 11 36
      dashboard/i18n/it.json
  25. 0 25
      dashboard/i18n/ja.json
  26. 0 25
      dashboard/i18n/ko.json
  27. 0 25
      dashboard/i18n/pl.json
  28. 0 25
      dashboard/i18n/pt-br.json
  29. 35 23
      dashboard/i18n/ru.json
  30. 34 2
      dashboard/i18n/sv.json
  31. 0 25
      dashboard/i18n/tr.json
  32. 0 25
      dashboard/i18n/zh-hans.json
  33. 0 25
      dashboard/i18n/zh-hant.json
  34. 0 4
      dashboard/index.html
  35. 6 7
      dashboard/index.js
  36. 16 6
      dashboard/oauth.js
  37. 7 5
      dashboard/rcscript.js
  38. 6 4
      dashboard/settings.js
  39. 0 319
      dashboard/slash.js
  40. 0 46
      dashboard/src/index.js
  41. 1 1
      dashboard/user.js
  42. 4 44
      dashboard/util.js
  43. 7 4
      dashboard/verification.js
  44. 3 3
      functions/global_block.js
  45. 3 2
      functions/parse_page.js
  46. 2 2
      functions/verify.js
  47. 5 0
      i18n/allLangs.json
  48. 15 8
      i18n/bn.json
  49. 0 6
      i18n/de.json
  50. 0 6
      i18n/en.json
  51. 0 6
      i18n/es.json
  52. 1 1
      i18n/fr.json
  53. 409 412
      i18n/hi.json
  54. 849 0
      i18n/id.json
  55. 10 16
      i18n/it.json
  56. 0 6
      i18n/ja.json
  57. 1 7
      i18n/ko.json
  58. 1 1
      i18n/nl.json
  59. 1 6
      i18n/pl.json
  60. 2 6
      i18n/pt-br.json
  61. 0 6
      i18n/ru.json
  62. 3 8
      i18n/sv.json
  63. 2 6
      i18n/tr.json
  64. 0 6
      i18n/uk.json
  65. 1 1
      i18n/vi.json
  66. TEMPAT SAMPAH
      i18n/widgets/bn.png
  67. TEMPAT SAMPAH
      i18n/widgets/de.png
  68. TEMPAT SAMPAH
      i18n/widgets/en.png
  69. TEMPAT SAMPAH
      i18n/widgets/es.png
  70. TEMPAT SAMPAH
      i18n/widgets/fr.png
  71. TEMPAT SAMPAH
      i18n/widgets/hi.png
  72. TEMPAT SAMPAH
      i18n/widgets/id.png
  73. TEMPAT SAMPAH
      i18n/widgets/it.png
  74. TEMPAT SAMPAH
      i18n/widgets/ja.png
  75. TEMPAT SAMPAH
      i18n/widgets/ko.png
  76. TEMPAT SAMPAH
      i18n/widgets/nl.png
  77. TEMPAT SAMPAH
      i18n/widgets/pl.png
  78. TEMPAT SAMPAH
      i18n/widgets/pt-br.png
  79. TEMPAT SAMPAH
      i18n/widgets/ru.png
  80. TEMPAT SAMPAH
      i18n/widgets/sr.png
  81. TEMPAT SAMPAH
      i18n/widgets/sv.png
  82. TEMPAT SAMPAH
      i18n/widgets/th.png
  83. TEMPAT SAMPAH
      i18n/widgets/tr.png
  84. TEMPAT SAMPAH
      i18n/widgets/uk.png
  85. TEMPAT SAMPAH
      i18n/widgets/vi.png
  86. TEMPAT SAMPAH
      i18n/widgets/zh-hans.png
  87. TEMPAT SAMPAH
      i18n/widgets/zh-hant.png
  88. 0 6
      i18n/zh-hans.json
  89. 0 6
      i18n/zh-hant.json
  90. 78 0
      interactions/commands/inline.json
  91. 77 0
      interactions/commands/verify.json
  92. 1 0
      interactions/i18n/bn.json
  93. 14 0
      interactions/i18n/de.json
  94. 1 0
      interactions/i18n/en.json
  95. 1 0
      interactions/i18n/es-ES.json
  96. 1 0
      interactions/i18n/fr.json
  97. 1 0
      interactions/i18n/hi.json
  98. 1 0
      interactions/i18n/id.json
  99. 1 0
      interactions/i18n/it.json
  100. 1 0
      interactions/i18n/ja.json

+ 59 - 0
.github/workflows/commands.yaml

@@ -0,0 +1,59 @@
+name: Update slash command localization
+on:
+  push:
+    branches: [ master ]
+    paths:
+      - 'interactions/i18n/*.json'
+jobs:
+  translations:
+    runs-on: ubuntu-latest
+    steps:
+    - name: Load Repository
+      uses: actions/checkout@v2
+      with:
+        token: ${{ secrets.WIKIBOT_TOKEN }}
+    - name: Update slash commands
+      run: |
+        for language in interactions/i18n/*.json
+        do
+          language=$(basename $language .json)
+          for file in `jq -r 'keys[]' interactions/i18n/$language.json`
+          do
+            if [[ "$file" =~ ^_ ]]
+            then
+              continue
+            fi
+            echo $file
+            for key in `jq -r ".$file | keys[]" interactions/i18n/$language.json`
+            do
+              echo $key
+              content="`jq \".$file.\\\"$key\\\"\" interactions/i18n/$language.json`"
+              if ! [[ "$key" =~ description$ || "$key" =~ choices\[[0-9]+\]\.name$ ]]
+              then
+                content=${content,,}
+              fi
+              echo $content
+              if [[ "$language" = "en" ]]
+              then
+                if [[ "$key" =~ description$ || "$key" =~ choices\[[0-9]+\]\.name$ ]]
+                then
+                  echo "`jq \".$key=$content\" interactions/commands/$file.json`" > interactions/commands/$file.json
+                fi
+                echo "`jq \".${key}_localizations.\\\"en-GB\\\"=$content\" interactions/commands/$file.json`" > interactions/commands/$file.json
+                echo "`jq \".${key}_localizations.\\\"en-US\\\"=$content\" interactions/commands/$file.json`" > interactions/commands/$file.json
+              else
+                echo "`jq \".${key}_localizations.\\\"$language\\\"=$content\" interactions/commands/$file.json`" > interactions/commands/$file.json
+              fi
+            done
+          done
+        done
+    - name: Commit changes
+      uses: EndBug/add-and-commit@v9
+      with:
+        author_name: WikiBot-bot
+        author_email: 69196528+WikiBot-bot@users.noreply.github.com
+        committer_name: WikiBot-bot
+        committer_email: 69196528+WikiBot-bot@users.noreply.github.com
+        message: "Update slash command localization"
+        add: "interactions/commands/*.json"
+        github_token: ${{ secrets.WIKIBOT_TOKEN }}

+ 1 - 1
RcGcDb

@@ -1 +1 @@
-Subproject commit 8a26be890697ca501bb1f24eda9da2b4f7b862af
+Subproject commit d47fd6df5c9a0275c44c130719be519ac61958c6

+ 1 - 1
bot.js

@@ -281,7 +281,7 @@ function messageCreate(msg) {
 				console.log( msg.guildId + ': Missing permissions - ' + missing.join(', ') );
 				if ( !missing.includes( 'SEND_MESSAGES' ) && !missing.includes( 'SEND_MESSAGES_IN_THREADS' ) ) {
 					db.query( 'SELECT lang FROM discord WHERE guild = $1 AND (channel = $2 OR channel = $3 OR channel IS NULL) ORDER BY channel DESC NULLS LAST LIMIT 1', sqlargs ).then( ({rows:[row]}) => {
-						return row.lang;
+						return row?.lang;
 					}, dberror => {
 						console.log( '- Error while getting the lang: ' + dberror );
 					} ).then( lang => {

+ 3 - 2
cmds/eval.js

@@ -1,5 +1,5 @@
 import { inspect } from 'util';
-import cheerio from 'cheerio';
+import { load as cheerioLoad } from 'cheerio';
 import Discord from 'discord.js';
 import { got } from '../util/functions.js';
 import newMessage from '../util/newMessage.js';
@@ -59,9 +59,10 @@ function database(sql, sqlargs = []) {
  */
 function checkWiki(wiki) {
 	wiki = Wiki.fromInput(wiki);
+	if ( !wiki ) return `Couldn't resolve "${wiki}" into a valid url.`;
 	return got.get( wiki + 'api.php?&action=query&meta=siteinfo&siprop=general&list=recentchanges&rcshow=!bot&rctype=edit|new|log|categorize&rcprop=ids|timestamp&rclimit=100&format=json' ).then( response => {
 		if ( response.statusCode === 404 && typeof response.body === 'string' ) {
-			let api = cheerio.load(response.body)('head link[rel="EditURI"]').prop('href');
+			let api = cheerioLoad(response.body)('head link[rel="EditURI"]').prop('href');
 			if ( api ) {
 				wiki = new Wiki(api.split('api.php?')[0], wiki);
 				return got.get( wiki + 'api.php?action=query&meta=siteinfo&siprop=general&list=recentchanges&rcshow=!bot&rctype=edit|new|log|categorize&rcprop=ids|timestamp&rclimit=100&format=json' );

+ 32 - 2
cmds/get.js

@@ -26,7 +26,7 @@ async function cmd_get(lang, msg, args, line, wiki) {
 			if ( discordClient.guilds.cache.has(evalData.id) ) {
 				var guild = discordClient.guilds.cache.get(evalData.id);
 				return {
-					name: guild.name, id: guild.id, memberCount: guild.memberCount,
+					name: guild.name, id: guild.id, memberCount: guild.approximateMemberCount ?? guild.memberCount,
 					ownerId: guild.ownerId, owner: discordClient.users.cache.get(guild.ownerId)?.tag,
 					channel: guild.publicUpdatesChannelId, icon: guild.iconURL({dynamic:true}),
 					permissions: guild.me.permissions.missing(evalData.defaultPermissions),
@@ -170,7 +170,37 @@ async function cmd_get(lang, msg, args, line, wiki) {
 			return msg.sendChannel( {content: text, embeds: [embed]}, true );
 		}
 		
-		msg.replyMsg( 'I couldn\'t find a result for `' + id + '`', true );
+		return db.query( 'SELECT guild, channel, wiki, lang, role, inline, prefix, patreon, voice FROM discord WHERE guild = $1 OR channel = $1 OR channel = $2 ORDER BY guild, channel DESC NULLS LAST LIMIT 1', [id, '#' + id] ).then( ({rows}) => {
+			if ( !rows.length ) return msg.replyMsg( 'I couldn\'t find a result for `' + id + '`', true );
+			var result = '```json\n' + JSON.stringify( rows, null, '\t' ) + '\n```';
+			if ( msg.showEmbed() ) {
+				var split = Util.splitMessage( result, {char:',\n',maxLength:1000,prepend:'```json\n',append:',\n```'} );
+				if ( split.length > 5 ) {
+					Util.splitMessage( '`' + id + '`: ' + result, {
+						char: ',\n',
+						maxLength: 2000,
+						prepend: '```json\n',
+						append: ',\n```'
+					} ).forEach( textpart => msg.sendChannel( textpart, true ) );
+				}
+				else {
+					var embed = new MessageEmbed();
+					split.forEach( textpart => embed.addField( '`' + id + '`: ', textpart ) );
+					msg.sendChannel( {embeds: [embed]}, true );
+				}
+			}
+			else {
+				Util.splitMessage( '`' + id + '`: ' + result, {
+					char: ',\n',
+					maxLength: 2000,
+					prepend: '```json\n',
+					append: ',\n```'
+				} ).forEach( textpart => msg.sendChannel( textpart, true ) );
+			}
+		}, dberror => {
+			console.log( '- Error while getting the settings: ' + dberror );
+			msg.reactEmoji('error');
+		} );
 	} catch ( error ) {
 		log_error(error);
 		msg.reactEmoji('error');

+ 3 - 3
cmds/rcscript.js

@@ -1,5 +1,5 @@
 import { existsSync } from 'fs';
-import cheerio from 'cheerio';
+import { load as cheerioLoad } from 'cheerio';
 import { Util, MessageActionRow, MessageButton, Permissions } from 'discord.js';
 import help_setup from '../functions/helpsetup.js';
 import { got } from '../util/functions.js';
@@ -76,7 +76,7 @@ function cmd_rcscript(lang, msg, args, line, wiki) {
 				}
 				catch (error) {
 					if ( response.statusCode === 404 && typeof response.body === 'string' ) {
-						let api = cheerio.load(response.body)('head link[rel="EditURI"]').prop('href');
+						let api = cheerioLoad(response.body)('head link[rel="EditURI"]').prop('href');
 						if ( api ) {
 							wikinew = new Wiki(api.split('api.php?')[0], wikinew);
 							return got.get( wikinew + 'api.php?action=query&meta=allmessages|siteinfo&ammessages=custom-RcGcDw|recentchanges&amenableparser=true&siprop=general&titles=Special:RecentChanges&format=json' );
@@ -246,7 +246,7 @@ function cmd_rcscript(lang, msg, args, line, wiki) {
 					}
 					catch (error) {
 						if ( response.statusCode === 404 && typeof response.body === 'string' ) {
-							let api = cheerio.load(response.body)('head link[rel="EditURI"]').prop('href');
+							let api = cheerioLoad(response.body)('head link[rel="EditURI"]').prop('href');
 							if ( api ) {
 								wikinew = new Wiki(api.split('api.php?')[0], wikinew);
 								return got.get( wikinew + 'api.php?action=query&meta=allmessages|siteinfo&ammessages=custom-RcGcDw&amenableparser=true&siprop=general&titles=Special:RecentChanges&format=json' );

+ 2 - 2
cmds/settings.js

@@ -1,4 +1,4 @@
-import cheerio from 'cheerio';
+import { load as cheerioLoad } from 'cheerio';
 import { MessageEmbed, Util, MessageActionRow, MessageButton } from 'discord.js';
 import { got } from '../util/functions.js';
 import Lang from '../util/i18n.js';
@@ -103,7 +103,7 @@ function cmd_settings(lang, msg, args, line, wiki) {
 					}
 					catch (error) {
 						if ( response.statusCode === 404 && typeof response.body === 'string' ) {
-							let api = cheerio.load(response.body)('head link[rel="EditURI"]').prop('href');
+							let api = cheerioLoad(response.body)('head link[rel="EditURI"]').prop('href');
 							if ( api ) {
 								wikinew = new Wiki(api.split('api.php?')[0], wikinew);
 								return got.get( wikinew + 'api.php?action=query&meta=siteinfo&siprop=general&format=json' );

+ 8 - 2
cmds/test.js

@@ -1,6 +1,6 @@
 import { MessageEmbed } from 'discord.js';
 import help_setup from '../functions/helpsetup.js';
-import { got } from '../util/functions.js';
+import { got, toMarkdown } from '../util/functions.js';
 import logging from '../util/logging.js';
 
 const wsStatus = [
@@ -70,6 +70,12 @@ function cmd_test(lang, msg, args, line, wiki) {
 				}
 				else logging(wiki, msg.guildId, 'test');
 				if ( notice.length ) embed.addField( lang.get('test.notice'), notice.join('\n') );
+				if ( body?.query?.general?.readonly !== undefined ) {
+					if ( body.query.general.readonlyreason ) {
+						embed.addField( lang.get('overview.readonly'), toMarkdown(body.query.general.readonlyreason, wiki, '', true) );
+					}
+					else embed.addField( '\u200b', '**' + lang.get('overview.readonly') + '**' );
+				}
 			}, error => {
 				var then = Date.now();
 				var ping = ( then - now ).toLocaleString(lang.get('dateformat')) + 'ms';
@@ -107,4 +113,4 @@ export default {
 	pause: true,
 	owner: false,
 	run: cmd_test
-};
+};

+ 4 - 0
cmds/verification.js

@@ -63,6 +63,7 @@ function cmd_verification(lang, msg, args, line, wiki) {
 			}
 			return db.query( 'INSERT INTO verification(guild, configid, channel, role) VALUES($1, $2, $3, $4)', [msg.guildId, new_configid, '|' + ( msg.channel.isThread() ? msg.channel.parentId : msg.channelId ) + '|', roles] ).then( () => {
 				console.log( '- Verification successfully added.' );
+				/*
 				if ( !rows.length ) msg.client.application.commands.cache.find( slashCommand => slashCommand.name === 'verify' )?.permissions.set( {
 					guild: msg.guildId,
 					permissions: [{
@@ -75,6 +76,7 @@ function cmd_verification(lang, msg, args, line, wiki) {
 				}, error => {
 					console.log( '- Error while enabling the slash command: ' + error );
 				} );
+				*/
 				msg.replyMsg( {content: lang.get('verification.added') + formatVerification(false, false, {configid: new_configid, role: roles}), components}, true );
 			}, dberror => {
 				console.log( '- Error while adding the verification: ' + dberror );
@@ -105,6 +107,7 @@ function cmd_verification(lang, msg, args, line, wiki) {
 			if ( process.env.READONLY ) return msg.replyMsg( lang.get('general.readonly') + '\n' + process.env.invite, true );
 			return db.query( 'DELETE FROM verification WHERE guild = $1 AND configid = $2', [msg.guildId, row.configid] ).then( () => {
 				console.log( '- Verification successfully removed.' );
+				/*
 				if ( rows.length === 1 ) msg.client.application.commands.cache.find( slashCommand => slashCommand.name === 'verify' )?.permissions.set( {
 					guild: msg.guildId,
 					permissions: []
@@ -113,6 +116,7 @@ function cmd_verification(lang, msg, args, line, wiki) {
 				}, error => {
 					console.log( '- Error while disabling the slash command: ' + error );
 				} );
+				*/
 				msg.replyMsg( {content: lang.get('verification.deleted'), components}, true );
 			}, dberror => {
 				console.log( '- Error while removing the verification: ' + dberror );

+ 53 - 3
cmds/wiki/general.js

@@ -191,7 +191,7 @@ export default function gamepedia_check_wiki(lang, msg, title, wiki, cmd, reacti
 				if ( reaction ) reaction.removeEmoji();
 				return;
 			}
-			if ( ( querypage.missing !== undefined && querypage.known === undefined && !( noRedirect || querypage.categoryinfo ) ) || querypage.invalid !== undefined ) return got.get( wiki + 'api.php?uselang=' + uselang + '&action=query&prop=categoryinfo|info|pageprops|pageimages|extracts&piprop=original|name&ppprop=description|displaytitle|page_image_free|disambiguation|infoboxes&explaintext=true&exsectionformat=raw&exlimit=1&generator=search&gsrnamespace=4|12|14|' + ( querypage.ns >= 0 ? querypage.ns + '|' : '' ) + Object.values(body.query.namespaces).filter( ns => ns.content !== undefined ).map( ns => ns.id ).join('|') + '&gsrlimit=1&gsrsearch=' + encodeURIComponent( title ) + '&format=json' ).then( srresponse => {
+			if ( ( querypage.missing !== undefined && querypage.known === undefined && !( noRedirect || querypage.categoryinfo ) ) || querypage.invalid !== undefined ) return got.get( wiki + 'api.php?uselang=' + uselang + '&action=query&iwurl=true&redirects=true&prop=categoryinfo|info|pageprops|pageimages|extracts&piprop=original|name&ppprop=description|displaytitle|page_image_free|disambiguation|infoboxes&explaintext=true&exsectionformat=raw&exlimit=1&generator=search&gsrnamespace=4|12|14|' + ( querypage.ns >= 0 ? querypage.ns + '|' : '' ) + Object.values(body.query.namespaces).filter( ns => ns.content !== undefined ).map( ns => ns.id ).join('|') + '&gsrlimit=1&gsrsearch=' + encodeURIComponent( title ) + '&format=json' ).then( srresponse => {
 				logging(wiki, msg.guildId, 'general', 'search');
 				var srbody = srresponse.body;
 				if ( srbody?.warnings ) log_warning(srbody.warnings);
@@ -239,7 +239,7 @@ export default function gamepedia_check_wiki(lang, msg, title, wiki, cmd, reacti
 					} );
 				}
 				if ( !srbody.query ) {
-					return got.get( wiki + 'api.php?uselang=' + uselang + '&action=query&prop=categoryinfo|info|pageprops|pageimages|extracts&piprop=original|name&ppprop=description|displaytitle|page_image_free|disambiguation|infoboxes&explaintext=true&exsectionformat=raw&exlimit=1&generator=search&gsrwhat=text&gsrnamespace=4|12|14|' + ( querypage.ns >= 0 ? querypage.ns + '|' : '' ) + Object.values(body.query.namespaces).filter( ns => ns.content !== undefined ).map( ns => ns.id ).join('|') + '&gsrlimit=1&gsrsearch=' + encodeURIComponent( title ) + '&format=json' ).then( tsrresponse => {
+					return got.get( wiki + 'api.php?uselang=' + uselang + '&action=query&iwurl=true&redirects=true&prop=categoryinfo|info|pageprops|pageimages|extracts&piprop=original|name&ppprop=description|displaytitle|page_image_free|disambiguation|infoboxes&explaintext=true&exsectionformat=raw&exlimit=1&generator=search&gsrwhat=text&gsrnamespace=4|12|14|' + ( querypage.ns >= 0 ? querypage.ns + '|' : '' ) + Object.values(body.query.namespaces).filter( ns => ns.content !== undefined ).map( ns => ns.id ).join('|') + '&gsrlimit=1&gsrsearch=' + encodeURIComponent( title ) + '&format=json' ).then( tsrresponse => {
 						var tsrbody = tsrresponse.body;
 						if ( tsrbody?.warnings ) log_warning(tsrbody.warnings);
 						if ( tsrresponse.statusCode !== 200 || !tsrbody || tsrbody.batchcomplete === undefined ) {
@@ -258,7 +258,57 @@ export default function gamepedia_check_wiki(lang, msg, title, wiki, cmd, reacti
 				}
 				return srbody;
 			} ).then( srbody => {
-				if ( !srbody?.query?.pages ) return;
+				if ( !srbody?.query?.pages ) {
+					if ( srbody?.query?.interwiki ) {
+						if ( breakOnTimeoutPause(msg) ) {
+							if ( reaction ) reaction.removeEmoji();
+							return;
+						}
+						var iw = new URL(srbody.query.interwiki[0].url.replace( /\\/g, '%5C' ).replace( /@(here|everyone)/g, '%40$1' ), wiki);
+						querystring.forEach( (value, name) => {
+							iw.searchParams.append(name, value);
+						} );
+						if ( fragment ) iw.hash = Wiki.toSection(fragment);
+						else fragment = iw.hash.substring(1);
+						if ( /^phabricator\.(wikimedia|miraheze)\.org$/.test(iw.hostname) ) {
+							return phabricator(lang, msg, wiki, iw, reaction, spoiler, noEmbed);
+						}
+						logging(wiki, msg.guildId, 'interwiki');
+						var maxselfcall = interwikiLimit[( patreonGuildsPrefix.has(msg.guildId) ? 'patreon' : 'default' )];
+						if ( selfcall < maxselfcall && ['http:','https:'].includes( iw.protocol ) ) {
+							selfcall++;
+							if ( iw.hostname.endsWith( '.gamepedia.com' ) ) {
+								let iwtitle = decodeURIComponent( iw.pathname.substring(1) ).replace( /_/g, ' ' );
+								cmd = '!' + iw.hostname.replace( '.gamepedia.com', ' ' );
+								if ( cmd !== '!www ' ) return this.general(lang, msg, iwtitle, new Wiki(iw.origin), cmd, reaction, spoiler, noEmbed, iw.searchParams, fragment, iw.href, selfcall);
+							}
+							if ( iw.hostname.endsWith( '.fandom.com' ) || iw.hostname.endsWith( '.wikia.org' ) ) {
+								let regex = iw.pathname.match( /^(\/(?!wiki\/)[a-z-]{2,12})?(?:\/wiki\/|\/?$)/ );
+								if ( regex ) {
+									let path = ( regex[1] || '' );
+									let iwtitle = decodeURIComponent( iw.pathname.replace( regex[0], '' ) ).replace( /_/g, ' ' );
+									cmd = ( iw.hostname.endsWith( '.wikia.org' ) ? '??' : '?' ) + ( path ? path.substring(1) + '.' : '' ) + iw.hostname.replace( /\.(?:fandom\.com|wikia\.org)/, ' ' );
+									return this.general(lang, msg, iwtitle, new Wiki(iw.origin + path + '/'), cmd, reaction, spoiler, noEmbed, iw.searchParams, fragment, iw.href, selfcall);
+								}
+							}
+							let project = wikiProjects.find( project => iw.hostname.endsWith( project.name ) );
+							if ( project ) {
+								let regex = ( iw.host + iw.pathname ).match( new RegExp( '^' + project.regex + '(?:' + project.articlePath + '|/?$)' ) );
+								if ( regex ) {
+									let iwtitle = decodeURIComponent( ( iw.host + iw.pathname ).replace( regex[0], '' ) ).replace( /_/g, ' ' );
+									cmd = '!!' + regex[1] + ' ';
+									return this.general(lang, msg, iwtitle, new Wiki('https://' + regex[1] + project.scriptPath), cmd, reaction, spoiler, noEmbed, iw.searchParams, fragment, iw.href, selfcall);
+								}
+							}
+						}
+						msg.sendChannel( spoiler + ( noEmbed ? '<' : ' ' ) + iw + ( noEmbed ? '>' : ' ' ) + spoiler ).then( message => {
+							if ( message && selfcall === maxselfcall ) message.reactEmoji('⚠️');
+						} );
+						if ( reaction ) reaction.removeEmoji();
+						return;
+					}
+					return;
+				}
 				querypage = Object.values(srbody.query.pages)[0];
 				querypage.uselang = uselang;
 				var pagelink = wiki.toLink(querypage.title, querystring, fragment);

+ 1 - 1
cmds/wiki/random.js

@@ -18,7 +18,7 @@ import extract_desc from '../../util/extract_desc.js';
  */
 export default function gamepedia_random(lang, msg, wiki, reaction, spoiler, noEmbed, namespace = ['0', '*'], querystring = new URLSearchParams(), fragment = '') {
 	var uselang = ( querystring.getAll('variant').pop() || querystring.getAll('uselang').pop() || lang.lang );
-	got.get( wiki + 'api.php?uselang=' + uselang + '&action=query&meta=allmessages|siteinfo&amenableparser=true&amtitle=Special:Random&ammessages=randompage|randompage-nopages&amargs=%1F' + namespace[1] + '%1F' + namespace[0].split('|').length + '&siprop=general&prop=categoryinfo|info|pageprops|pageimages|extracts&piprop=original|name&ppprop=description|displaytitle|page_image_free|disambiguation|infoboxes&explaintext=true&exsectionformat=raw&exlimit=1&converttitles=true&generator=random&grnfilterredir=nonredirects&grnlimit=1&grnnamespace=' + namespace[0] + '&format=json' ).then( response => {
+	got.get( wiki + 'api.php?uselang=' + uselang + '&action=query&meta=allmessages|siteinfo&amenableparser=true&amtitle=Special:Random&ammessages=randompage|randompage-nopages&amargs=%1F' + encodeURIComponent( namespace[1] ) + '%1F' + namespace[0].split('|').length + '&siprop=general&prop=categoryinfo|info|pageprops|pageimages|extracts&piprop=original|name&ppprop=description|displaytitle|page_image_free|disambiguation|infoboxes&explaintext=true&exsectionformat=raw&exlimit=1&converttitles=true&generator=random&grnfilterredir=nonredirects&grnlimit=1&grnnamespace=' + encodeURIComponent( namespace[0] ) + '&format=json' ).then( response => {
 		var body = response.body;
 		if ( body && body.warnings ) log_warning(body.warnings);
 		if ( response.statusCode !== 200 || !body || body.batchcomplete === undefined || !body.query || !body.query.general ) {

+ 1 - 1
cmds/wiki/special_page.js

@@ -9,7 +9,7 @@ const overwrites = {
 	randompage: (fn, lang, msg, wiki, querystring, fragment, reaction, spoiler, noEmbed, args, embed, query) => {
 		let namespaces = Object.values(query.namespaces);
 		let contentNamespaces = namespaces.filter( ns => ns.content !== undefined );
-		let namespaceData = [contentNamespaces.map( ns => ns.id ).join('|'), contentNamespaces.map( ns => ( ns['*'] || '*' )  ).join(', ')];
+		let namespaceData = [contentNamespaces.map( ns => ns.id ).join('|'), contentNamespaces.map( ns => ( ns['*'] || '*' ) ).join(', ')];
 		if ( args[0] ) {
 			args[0] = args[0].replace( /_/g, ' ' ).toLowerCase().trim();
 			let namespaceMap = {};

+ 0 - 3
dashboard/functions.js

@@ -1,20 +1,17 @@
 import { get as rcscript_get, post as rcscript_post } from './rcscript.js';
 import { get as settings_get, post as settings_post } from './settings.js';
-import { get as slash_get, post as slash_post } from './slash.js';
 import { get as user_get, post as user_post } from './user.js';
 import { get as verification_get, post as verification_post } from './verification.js';
 
 export const forms = {
 	rcscript: rcscript_get,
 	settings: settings_get,
-	slash: slash_get,
 	user: user_get,
 	verification: verification_get
 };
 export const posts = {
 	rcscript: rcscript_post,
 	settings: settings_post,
-	slash: slash_post,
 	user: user_post,
 	verification: verification_post
 };

+ 3 - 9
dashboard/guilds.js

@@ -1,5 +1,5 @@
 import { readFileSync } from 'fs';
-import cheerio from 'cheerio';
+import { load as cheerioLoad } from 'cheerio';
 import { forms } from './functions.js';
 import Lang from './i18n.js';
 import { oauth, enabledOAuth2, settingsData, addWidgets, createNotice } from './util.js';
@@ -21,7 +21,7 @@ const file = readFileSync('./dashboard/index.html');
  * @param {String[]} [actionArgs] - The arguments for the action
  */
 export default function dashboard_guilds(res, dashboardLang, theme, userSession, reqURL, action, actionArgs) {
-	reqURL.pathname = reqURL.pathname.replace( /^(\/(?:user|guild\/\d+(?:\/(?:settings|verification|rcscript|slash)(?:\/(?:\d+|new|notice))?)?)?)(?:\/.*)?$/, '$1' );
+	reqURL.pathname = reqURL.pathname.replace( /^(\/(?:user|guild\/\d+(?:\/(?:settings|verification|rcscript)(?:\/(?:\d+|new|notice))?)?)?)(?:\/.*)?$/, '$1' );
 	var args = reqURL.pathname.split('/');
 	var settings = settingsData.get(userSession.user_id);
 	if ( reqURL.searchParams.get('owner') && process.env.owner.split('|').includes(userSession.user_id) ) {
@@ -29,7 +29,7 @@ export default function dashboard_guilds(res, dashboardLang, theme, userSession,
 	}
 	dashboardLang = new Lang(...dashboardLang.fromCookie, settings.user.locale, dashboardLang.lang);
 	res.setHeader('Content-Language', [dashboardLang.lang]);
-	var $ = cheerio.load(file);
+	var $ = cheerioLoad(file);
 	$('html').attr('lang', dashboardLang.lang);
 	if ( theme === 'light' ) $('html').addClass('theme-light');
 	$('<script>').text(`
@@ -43,8 +43,6 @@ export default function dashboard_guilds(res, dashboardLang, theme, userSession,
 	$('.channel#verification').attr('title', dashboardLang.get('general.verification'));
 	$('.channel#rcscript div').text(dashboardLang.get('general.rcscript'));
 	$('.channel#rcscript').attr('title', dashboardLang.get('general.rcscript'));
-	$('.channel#slash div').text(dashboardLang.get('general.slash'));
-	$('.channel#slash').attr('title', dashboardLang.get('general.slash'));
 	$('.guild#invite a').attr('alt', dashboardLang.get('general.invite'));
 	$('.guild#refresh a').attr('alt', dashboardLang.get('general.refresh'));
 	$('.guild#theme-dark a').attr('alt', dashboardLang.get('general.theme-dark'));
@@ -136,11 +134,9 @@ export default function dashboard_guilds(res, dashboardLang, theme, userSession,
 		$('.channel#settings').attr('href', `/guild/${guild.id}/settings`);
 		$('.channel#verification').attr('href', `/guild/${guild.id}/verification`);
 		$('.channel#rcscript').attr('href', `/guild/${guild.id}/rcscript`);
-		$('.channel#slash').attr('href', `/guild/${guild.id}/slash`);
 		if ( args[3] === 'settings' ) return forms.settings(res, $, guild, args, dashboardLang);
 		if ( args[3] === 'verification' ) return forms.verification(res, $, guild, args, dashboardLang);
 		if ( args[3] === 'rcscript' ) return forms.rcscript(res, $, guild, args, dashboardLang);
-		if ( args[3] === 'slash' ) return forms.slash(res, $, guild, args, dashboardLang);
 		return forms.settings(res, $, guild, args, dashboardLang);
 	}
 	else if ( settings.guilds.notMember.has(id) ) {
@@ -180,11 +176,9 @@ export default function dashboard_guilds(res, dashboardLang, theme, userSession,
 		$('.channel#settings').attr('href', `/guild/${guild.id}/settings?owner=true`);
 		$('.channel#verification').attr('href', `/guild/${guild.id}/verification?owner=true`);
 		$('.channel#rcscript').attr('href', `/guild/${guild.id}/rcscript?owner=true`);
-		$('.channel#slash').attr('href', `/guild/${guild.id}/slash?owner=true`);
 		if ( args[3] === 'settings' ) return forms.settings(res, $, guild, args, dashboardLang);
 		if ( args[3] === 'verification' ) return forms.verification(res, $, guild, args, dashboardLang);
 		if ( args[3] === 'rcscript' ) return forms.rcscript(res, $, guild, args, dashboardLang);
-		if ( args[3] === 'slash' ) return forms.slash(res, $, guild, args, dashboardLang);
 		return forms.settings(res, $, guild, args, dashboardLang);
 	}
 	else {

+ 2 - 1
dashboard/i18n.js

@@ -30,7 +30,7 @@ export default class Lang {
 	 * Get a localized message.
 	 * @param {String} message - Name of the message.
 	 * @param {Boolean} escaped - If the message should be HTML escaped.
-	 * @param {(String|import('cheerio').default)[]} args - Arguments for the message.
+	 * @param {(String|import('cheerio').CheerioAPI)[]} args - Arguments for the message.
 	 * @returns {String}
 	 */
 	get(message = '', escaped = false, ...args) {
@@ -140,6 +140,7 @@ function plural(lang, number, args) {
 		case 'de':
 		case 'en':
 		case 'es':
+		case 'id':
 		case 'it':
 		case 'ja':
 		case 'ko':

+ 5 - 0
dashboard/i18n/allLangs.json

@@ -7,6 +7,7 @@
 			"es": "Español (es)",
 			"fr": "Français (fr)",
 			"hi": "हिन्दी (hi)",
+			"id": "Bahasa Indonesia (id)",
 			"it": "Italiano (it)",
 			"ja": "日本語 (ja)",
 			"ko": "한국어 (ko)",
@@ -45,6 +46,10 @@
 			"hindi": "hi",
 			"हिन्दी": "hi",
 			"हिन्दी (hi)": "hi",
+			"id": "id",
+			"indonesian":"id",
+			"bahasa indonesia": "id",
+			"bahasa indonesia (id)": "id",
 			"it": "it",
 			"italian":"it",
 			"italiano": "it",

File diff ditekan karena terlalu besar
+ 14 - 24
dashboard/i18n/bn.json


+ 0 - 25
dashboard/i18n/de.json

@@ -21,7 +21,6 @@
         "save": "Speichern",
         "selector": "Serverauswahl",
         "settings": "Einstellungen",
-        "slash": "Slash-Befehle",
         "support": "Support-Server",
         "theme-dark": "Nutze das dunkle Design",
         "theme-light": "Nutze das helle Design",
@@ -93,15 +92,6 @@
             "text": "Bitte nimm für diesen Server vorher noch Einstellungen vor.",
             "title": "Server noch nicht aufgesetzt!"
         },
-        "noslash": {
-            "note": "Aktiviere Slash-Befehle.",
-            "text": "Die Slash-Befehle von Wiki-Bot sind auf diesem Server nicht aktiviert.",
-            "title": "Slash-Befehle sind nicht aktiviert!"
-        },
-        "noverify": {
-            "text": "Die Beschränkungen für den Befehl $1 können nicht geändert werden, ohne dass Verifizierungen eingerichtet wurden.",
-            "title": "Verifizierungen nicht eingerichtet!"
-        },
         "oauth": {
             "text": "Dein Wiki-Account wurde erfolgreich mit Wiki-Bot verbunden.",
             "title": "Account erfolgreich verbunden!"
@@ -235,21 +225,6 @@
         },
         "new": "Neue Überschreibung"
     },
-    "slash": {
-        "desc": "Dies sind die Slash-Befehle für $1:",
-        "explanation": "<h2>Slash-Befehle</h2>\n<p>Die Nutzung von Slash-Befehlen kann pro Rolle beschränkt werden. Dies kannst du hier für die Slash-Befehle von Wiki-Bot tun.</p>",
-        "form": {
-            "add": "Hinzufügen",
-            "allow": "Erlaubt",
-            "default": "Standard",
-            "default_allow": "Standardmäßig kann dieser Befehl von allen genutzt werden.",
-            "default_deny": "Standardmäßig kann dieser Befehl von niemandem genutzt werden.",
-            "deny": "Verboten",
-            "entry": "Befehl $1",
-            "role": "Rolle:",
-            "select_role": "-- Wähle eine Rolle --"
-        }
-    },
     "verification": {
         "desc": "Dies sind die Verifizierungen für $1:",
         "explanation": "<h2>Wiki-Benutzer Verifizierung</h2>\n<p>Mit dem <code class=\"prefix\">verify &lt;Wiki-Benutzername&gt;</code>-Befehl können Discord-Benutzer sich selbst als ein bestimmter Wiki-Benutzer verifizieren mithilfe des Discord-Feldes auf deren Wiki-Profil. Falls der Benutzer übereinstimmt und Verifizierungen auf dem Server vorhanden sind, wird Wiki-Bot dem Benutzer die Rollen für alle Verifizierungs-Einträge geben, die der Benutzer erfüllt.</p>\n<p>Jeder Verifizierungs-Eintrag erlaubt mehrere Bedingungen, die der Wiki-Benutzer erreicht haben muss um die Verifizierung zu erfüllen:</p>\n<ul>\n<li>Kanal in dem der <code class=\"prefix\">verify</code>-Befehl genutzt werden muss.</li>\n<li>Discord-Rolle die vergeben wird, wenn der Benutzer die Verifizierung erfüllt.</li>\n<li>Mindestens benötigte Bearbeitungsanzahl auf dem Wiki um den Verifizierungs-Eintrag zu erfüllen.</li>\n<li>Benötigte Wiki-Benutzergruppe um den Verifizierungs-Eintrag zu erfüllen.</li>\n<li>Mindestalter des Wiki-Accounts in Tagen um den Verifizierungs-Eintrag zu erfüllen.</li>\n<li>Ob der Discord-Benutzername zu dem Wiki-Benutzernamen geändert werden soll, wenn der Benutzer die Verifizierung erfüllt.</li>\n</ul>",

+ 0 - 25
dashboard/i18n/en.json

@@ -21,7 +21,6 @@
         "save": "Save",
         "selector": "Server Selector",
         "settings": "Settings",
-        "slash": "Slash Commands",
         "support": "Support Server",
         "theme-dark": "Use dark theme",
         "theme-light": "Use light theme",
@@ -93,15 +92,6 @@
             "text": "Please define settings for the server first.",
             "title": "Server not set up yet!"
         },
-        "noslash": {
-            "note": "Enable slash commands.",
-            "text": "The slash commands of Wiki-Bot are not enabled on this server.",
-            "title": "Slash commands are not enabled!"
-        },
-        "noverify": {
-            "text": "The restrictions for the $1 command can't be changed without verifications being set up.",
-            "title": "Verifications are not set up!"
-        },
         "oauth": {
             "text": "Your wiki account has been successfully connected with Wiki-Bot.",
             "title": "Account successfully connected!"
@@ -235,21 +225,6 @@
         },
         "new": "New channel overwrite"
     },
-    "slash": {
-        "desc": "These are the slash commands for $1:",
-        "explanation": "<h2>Slash Commands</h2>\n<p>The usage of specific slash commands can be restricted per role. You can do that for the slash commands of Wiki-Bot here.</p>",
-        "form": {
-            "add": "Add",
-            "allow": "Allow",
-            "default": "Default",
-            "default_allow": "By default this command is allowed to be used by everyone.",
-            "default_deny": "By default this command is not allowed to be used by anyone.",
-            "deny": "Deny",
-            "entry": "Command $1",
-            "role": "Role:",
-            "select_role": "-- Select a Role --"
-        }
-    },
     "verification": {
         "desc": "These are the verifications for $1:",
         "explanation": "<h2>User Verification</h2>\n<p>Using the <code class=\"prefix\">verify &lt;wiki username&gt;</code> command, users are able to verify themselves as a specific wiki user by using the Discord field on their wiki profile. If the user matches and user verifications are set up on the server, Wiki-Bot will give them the roles for all verification entries they matched.</p>\n<p>Every verification entry allows for multiple restrictions on when a user should match the verification:</p>\n<ul>\n<li>Channel to use the <code class=\"prefix\">verify</code> command in.</li>\n<li>Role to get when matching the verification entry.</li>\n<li>Required edit count on the wiki to match the verification entry.</li>\n<li>Required user group to be a member of on the wiki to match the verification entry.</li>\n<li>Required account age in days to match the verification entry.</li>\n<li>Whether the Discord users nickname should be set to their wiki username when they match the verification entry.</li>\n</ul>",

+ 2 - 27
dashboard/i18n/es.json

@@ -21,7 +21,6 @@
         "save": "Guardar",
         "selector": "Selector de Servidor",
         "settings": "Ajustes",
-        "slash": "Comandos de barra",
         "support": "Servidor de Soporte",
         "theme-dark": "Usar tema oscuro",
         "theme-light": "Usar tema claro",
@@ -93,15 +92,6 @@
             "text": "Primero, define la configuración del servidor.",
             "title": "¡El servidor aún no está configurado!"
         },
-        "noslash": {
-            "note": "Habilitar comandos de barra inclinada.",
-            "text": "Los comandos de barra inclinada de Wiki-Bot no están habilitados en este servidor.",
-            "title": "¡Los comandos de barra inclinada no están habilitados!"
-        },
-        "noverify": {
-            "text": "Las restricciones para el comando $1 no se pueden cambiar sin que se configuren las verificaciones.",
-            "title": "¡Las verificaciones no están configuradas!"
-        },
         "oauth": {
             "text": "Tu cuenta wiki se ha conectado correctamente con Wiki-Bot.",
             "title": "¡Cuenta conectada correctamente!"
@@ -182,14 +172,14 @@
     },
     "rcscript": {
         "desc": "Estos son los webhooks de cambios recientes para $1:",
-        "explanation": "<h2>Webhook de Cambios Recientes</h2>\n<p>Wiki-Bot puede ejecutar un webhook de cambios recientes basado en <a href=\"https://gitlab.com/piotrex43/RcGcDw\" target=\"_blank\">RcGcDw</a>. Los cambios recientes se pueden mostrar en mensajes de texto compactos con enlaces en la misma línea o mensajes adjuntos con etiquetas de edición y cambios de categoría.</p>\n<p>Requisitos para agregar un webhook de cambios recientes:</p>\n<ul>\n<li>El wiki necesita ejecutarse en <a href=\"https://www.mediawiki.org/wiki/MediaWiki_1.30\" target=\"_blank\">MediaWiki 1.30</a> o superior.</li>\n<li>El mensaje del sistema <code class=\"user-select\">MediaWiki:Custom-RcGcDw</code> debe configurarse con el ID del servidor Discord <code class=\"user-select\" id=\"server-id\"></code>.</li>\n</ul>",
+        "explanation": "<h2>Webhook de Cambios Recientes</h2>\n<p>Wiki-Bot puede ejecutar un webhook de cambios recientes basado en <a href=\"https://gitlab.com/piotrex43/RcGcDw\" target=\"_blank\">RcGcDw</a>. Los cambios recientes se pueden mostrar en mensajes de texto compactos con inline links o mensajes adjuntos con etiquetas de edición y cambios de categoría.</p>\n<p>Requisitos para agregar un webhook de cambios recientes:</p>\n<ul>\n<li>El wiki necesita ejecutarse en <a href=\"https://www.mediawiki.org/wiki/MediaWiki_1.30\" target=\"_blank\">MediaWiki 1.30</a> o superior.</li>\n<li>El mensaje del sistema <code class=\"user-select\">MediaWiki:Custom-RcGcDw</code> debe configurarse con el ID del servidor Discord <code class=\"user-select\" id=\"server-id\"></code>.</li>\n</ul>",
         "form": {
             "avatar": "Avatar del webhook:",
             "avatar_preview": "Vista previa",
             "channel": "Canal:",
             "confirm": "¿Realmente deseas eliminar el webhook de cambios recientes?",
             "display": "Modo de visualización:",
-            "display_compact": "Mensajes de texto compactos con enlaces en la misma línea.",
+            "display_compact": "Mensajes de texto compactos con inline links.",
             "display_diff": "Mensajes adjuntos con vistas previas de imágenes y diferencias entre ediciones.",
             "display_embed": "Mensajes adjuntos con etiquetas de edición y cambios de categoría.",
             "display_image": "Mensajes adjuntos con vistas previas de imágenes.",
@@ -235,21 +225,6 @@
         },
         "new": "Nueva sobrescritura de canal"
     },
-    "slash": {
-        "desc": "Estos son los comandos de barra inclinada para $1:",
-        "explanation": "<h2>Comandos de barra inclinada</h2>\n<p>El uso de comandos específicos de barra inclinada se puede restringir por rol. Puedes hacerlo con los comandos de barra inclinada de Wiki-Bot aquí.</p>",
-        "form": {
-            "add": "Agregar",
-            "allow": "Permitir",
-            "default": "Predeterminado",
-            "default_allow": "Por defecto, todo el mundo puede utilizar este comando.",
-            "default_deny": "Por defecto, nadie puede utilizar este comando.",
-            "deny": "Negar",
-            "entry": "Comando $1",
-            "role": "Rol:",
-            "select_role": "-- Selecciona un Rol --"
-        }
-    },
     "verification": {
         "desc": "Estas son las verificaciones en $1:",
         "explanation": "<h2>Verificación de Usuario</h2>\n<p>Con el comando <code class=\"prefix\">verify &lt;wiki username&gt;</code> , los usuarios pueden verificarse a sí mismos como usuarios wiki específicos mediante el campo Discord en su perfil wiki. Si las coincidencias de usuario y las verificaciones de usuario están configuradas en el servidor, Wiki-Bot les dará los roles para todas las entradas de verificación que coincidieron.</p>\n<p>Cada entrada de verificación permite múltiples restricciones sobre cuándo un usuario debe coincidir con la verificación:</p>\n<ul>\n<li>Canal donde usar el comando <code class=\"prefix\">verify</code> .</li>\n<li>Rol a conseguir cuando coincida la entrada de verificación.</li>\n<li>Número de ediciones necesarias en el wiki para que coincida con la entrada de verificación.</li>\n<li>Grupo de usuarios requerido que sea miembro en el wiki para que coincida con la entrada de verificación.</li>\n<li>Antigüedad de la cuenta requerida en días para que coincida con la entrada de verificación.</li>\n<li>Si el alias de los usuarios de Discord debe establecerse como su nombre de usuario wiki cuando coincida con la entrada de verificación.</li>\n</ul>",

+ 1 - 1
dashboard/i18n/fr.json

@@ -127,7 +127,7 @@
     },
     "rcscript": {
         "desc": "Voici les intégrations de modifications récentes pour $1 :",
-        "explanation": "<h2>Intégration des modifications récentes</h2>\n<p>Wiki-Bot peut ajouter une intégration des modifications récentes basée sur <a href=\"https://gitlab.com/piotrex43/RcGcDw\" target=\"_blank\">RcGcDw</a>. Les modifications récentes peuvent être affichées en paragraphes de texte, avec des liens inter-textes ou avec les changements de balises et de catégories intégrés.</p>\n<p>Prérequis pour rajouter une intégration de modifications récentes :</p>\n<ul>\n<li>Le wiki doit utiliser la version <a href=\"https://www.mediawiki.org/wiki/MediaWiki_1.30\" target=\"_blank\">1.30 de MediaWiki</a> ou plus haut.</li>\n<li>Le message système <code>MediaWiki:Custom-RcGcDw</code> doit correspondre à l'id du serveur Discord <code class=\"user-select\" id=\"server-id\"></code>.</li>\n</ul>",
+        "explanation": "<h2>Intégration des modifications récentes</h2>\n<p>Wiki-Bot peut ajouter une intégration des modifications récentes basée sur <a href=\"https://gitlab.com/piotrex43/RcGcDw\" target=\"_blank\">RcGcDw</a>. Les modifications récentes peuvent être affichées en paragraphes de texte, avec des liens inter-textes ou avec les changements de balises et de catégories intégrés.</p>\n<p>Prérequis pour rajouter une intégration de modifications récentes :</p>\n<ul>\n<li>Le wiki doit utiliser la version <a href=\"https://www.mediawiki.org/wiki/MediaWiki_1.30\" target=\"_blank\">1.30 de MediaWiki</a> ou plus haut.</li>\n<li>Le message système <code class=\"user-select\">MediaWiki:Custom-RcGcDw</code> doit correspondre à l'id du serveur Discord <code class=\"user-select\" id=\"server-id\"></code>.</li>\n</ul>",
         "form": {
             "channel": "Salon :",
             "confirm": "Voulez-vous vraiment supprimer l'intégration de modifications récentes ?",

File diff ditekan karena terlalu besar
+ 71 - 97
dashboard/i18n/hi.json


+ 265 - 0
dashboard/i18n/id.json

@@ -0,0 +1,265 @@
+{
+    "fallback": [
+        "en",
+        " ",
+        " ",
+        " ",
+        " "
+    ],
+    "general": {
+        "botlist": {
+            "text": "Bantu pengguna lain menemukan Wiki-Bot dengan memberikan suara pada daftar bot:",
+            "title": "Daftar Bot"
+        },
+        "delete": "Hapus",
+        "invite": "Undang Wiki-Bot",
+        "language": "Ubah Bahasa",
+        "login": "Masuk",
+        "logout": "Keluar",
+        "rcscript": "Perubahan Terbaru",
+        "refresh": "Refresh daftar server",
+        "save": "Simpan",
+        "selector": "Memilih Server",
+        "settings": "Setelan",
+        "support": "Dukungan Server",
+        "theme-dark": "Gunakan tema gelap",
+        "theme-light": "Gunakan tema terang",
+        "title": "Pengaturan Wiki-Bot",
+        "verification": "Verifikasi",
+        "welcome": "<h2>Selamat datang di Wiki-Bot Dashboard.</h2>\n<p>Wiki-Bot adalah bot Discord yang dibuat untuk menyatukan server Discord dan wiki MediaWiki. Ini membantu dengan menghubungkan halaman wiki, memverifikasi pengguna wiki, menginformasikan tentang perubahan terbaru di wiki dan banyak lagi. <a href=\"https://wiki.wikibot.de/wiki/Wiki-Bot_Wiki\" target=\"_blank\">[Informasi selengkapnya]</a></p>\n<p>Di sini Kamu dapat mengubah pengaturan bot yang berbeda untuk server tempat Kamu memiliki izin Kelola Server. Untuk memulai, Kamu harus mengautentikasi akun Discord Kamu yang dapat Kamu lakukan dengan tombol ini:</p>"
+    },
+    "indexjs": {
+        "avatar": {
+            "content_type": "Tautan yang disediakan memiliki tipe konten $1, tetapi hanya tipe konten berikut yang diizinkan:",
+            "invalid_url": "URL tidak dapat diselesaikan menjadi file gambar yang valid."
+        },
+        "invalid": {
+            "note_http": "Situs web yang disediakan tidak memiliki sertifikat TLS/SSL yang valid! Untuk alasan keamanan, hanya wiki yang menggunakan HTTPS yang didukung.",
+            "note_private": "Wiki yang disediakan bersifat pribadi!",
+            "note_timeout": "Tautan yang disediakan terlalu lama untuk ditanggapi!",
+            "text": "URL tidak dapat diselesaikan ke situs MediaWiki yang valid!",
+            "title": "wiki Error/Invalid!"
+        },
+        "outdated": {
+            "text": "Perubahan terbaru webhook membutuhkan setidaknya MediaWiki 1.30!",
+            "title": "Versi MediaWiki yang ketinggalan zaman!"
+        },
+        "prefix": {
+            "backslash": "Prefix tidak boleh menyertakan garis miring terbalik!",
+            "code": "Awalan mungkin tidak menyertakan kode markdown!",
+            "space": "Prefix tidak boleh menyertakan spasi!"
+        },
+        "sysmessage": {
+            "text": "Halaman $1 harus cocok dengan id server $2.",
+            "title": "Pesan sistem tidak cocok!"
+        },
+        "valid": {
+            "MediaWiki": "Peringatan: Membutuhkan setidaknya $1 untuk fungsionalitas penuh.",
+            "title": "Wiki ini valid dan dapat digunakan!"
+        }
+    },
+    "notice": {
+        "error": {
+            "text": "Terjadi kesalahan yang tidak diketahui, harap coba lagi.",
+            "title": "Kesalahan yang tidak diketahui!"
+        },
+        "invalidusergroup": {
+            "text": "Nama grup pengguna terlalu panjang atau Kamu yang memberikan terlalu banyak.",
+            "title": "Grup pengguna tidak valid!"
+        },
+        "loginfail": {
+            "text": "Terjadi kesalahan saat kamu masuk, coba lagi.",
+            "title": "Gagal masuk!"
+        },
+        "logout": {
+            "text": "Kamu telah berhasil logout. Untuk mengubah pengaturan apa pun, Kamu harus masuk kembali.",
+            "title": "Berhasil Keluar!"
+        },
+        "missingperm": {
+            "text": "Kamu atau Wiki-Bot tidak memiliki izin $1 untuk fungsi ini.",
+            "title": "Izin hilang/kurang!"
+        },
+        "mwversion": {
+            "text": "Membutuhkan setidaknya MediaWiki 1.30, ditemukan $1 pada $2.",
+            "title": "Versi MediaWiki lawas!"
+        },
+        "nochange": {
+            "text": "Pengaturan cocok dengan pengaturan utama saat ini.",
+            "title": "Gagal menyimpan!"
+        },
+        "nosettings": {
+            "note": "Ubah Setelan.",
+            "text": "Harap tentukan pengaturan untuk server terlebih dahulu.",
+            "title": "Server belum disiapkan!"
+        },
+        "oauth": {
+            "text": "Akun wiki mu telah berhasil terhubung dengan Wiki-Bot.",
+            "title": "Akun berhasil terhubung!"
+        },
+        "oauthfail": {
+            "text": "Akun wiki mu tidak dapat terhubung, silakan coba lagi.",
+            "title": "Koneksi gagal!"
+        },
+        "oauthlogin": {
+            "text": "Silakan masuk jika Kamu tidak ingin Wiki-Bot mengingat akun wiki kamu.",
+            "title": "Akun wiki Kamu yang terhubung telah disimpan!"
+        },
+        "oauthother": {
+            "note": "Beralih akun.",
+            "text": "Harap dicatat bahwa akun wiki kamu terhubung dengan akun Discord yang berbeda dari yang kamu gunakan saat ini.",
+            "title": "Akun berhasil terhubung!"
+        },
+        "oauthverify": {
+            "text": "Akun wiki mu telah berhasil diverifikasi.",
+            "title": "Akun berhasil diverifikasi!"
+        },
+        "readonly": {
+            "text": "Saat ini kamu hanya dapat melihat pengaturan anda, tetapi tidak dapat mengubahnya.",
+            "title": "Read-only database!"
+        },
+        "refresh": {
+            "text": "Daftar server kamu telah berhasil di-refresh.",
+            "title": "Penyegaran berhasil!"
+        },
+        "refreshfail": {
+            "text": "Daftar server Kamu tidak dapat di-refresh, silakan coba lagi.",
+            "title": "Penyegaran gagal!"
+        },
+        "save": {
+            "text": "Pengaturan telah berhasil diperbarui.",
+            "title": "Pengaturan disimpan!"
+        },
+        "savefail": {
+            "note_http": "Situs web yang disediakan tidak memiliki sertifikat TLS/SSL yang valid! Untuk alasan keamanan, hanya wiki yang menggunakan HTTPS yang didukung.",
+            "note_private": "Wiki yang disediakan bersifat pribadi!",
+            "note_timeout": "Tautan yang disediakan terlalu lama untuk ditanggapi!",
+            "text": "Pengaturan tidak dapat disimpan, harap coba lagi.",
+            "title": "Gagal menyimpan!"
+        },
+        "sysmessage": {
+            "text": "Halaman $1 harus cocok dengan id server $2.",
+            "title": "Pesan sistem tidak cocok!"
+        },
+        "unauthorized": {
+            "text": "Silakan masuk sebelum Kamu dapat mengubah pengaturan apa pun.",
+            "title": "Belum masuk!"
+        },
+        "webhookfail": {
+            "note": "Webhook Discord tidak dapat diubah!",
+            "text": "Pengaturan hanya sebagian diperbarui.",
+            "title": "Pengaturan disimpan sebagian!"
+        },
+        "wikiblocked": {
+            "note": "Alasan:",
+            "text": "$1 telah diblokir agar tidak ditambahkan sebagai webhook untuk perubahan terbaru.",
+            "title": "Wiki diblokir!"
+        }
+    },
+    "oauth": {
+        "desc": "Ini adalah pengaturan OAuth2 kamu untuk menghubungkan akun wiki:",
+        "failed": "Gagal memuat setelan OAuth2!",
+        "form": {
+            "connect": "Hubungkan akun.",
+            "connected": "Terhubung",
+            "current": "Status terkini:",
+            "default": "Koneksi Akun Wiki",
+            "disable": "Jangan ingat akun saya!",
+            "disabled": "Tidak Aktif",
+            "disconnect": "Putuskan akun.",
+            "enable": "Ingat akun saya.",
+            "unconnected": "Tidak terhubung"
+        }
+    },
+    "rcscript": {
+        "desc": "Ini adalah webhook perubahan terbaru untuk $1:",
+        "explanation": "<h2>Webhook Perubahan Terbaru</h2>\n<p>Wiki-Bot dapat menjalankan webhook perubahan terbaru berdasarkan <a href=\"https://gitlab.com/piotrex43/RcGcDw\" target=\"_blank\">RcGcDw</a>. Perubahan terbaru dapat ditampilkan dalam pesan teks ringkas dengan tautan sebaris atau pesan tersemat dengan tag edit dan perubahan kategori.</p>\n<p>Persyaratan untuk menambahkan webhook perubahan terbaru:</p>\n<ul>\n<li>Wiki harus berjalan di <a href=\"https://www.mediawiki.org/wiki/MediaWiki_1.30\" target=\"_blank\">MediaWiki 1.30</a> atau lebih tinggi.</li>\n<li>Pesan sistem <code class=\"user-select\">MediaWiki:Custom-RcGcDw</code> perlu disetel ke id server Discord <code class=\"user-select\" id=\"server-id\"></code>.</li>\n</ul>",
+        "form": {
+            "avatar": "Avatar webhook:",
+            "avatar_preview": "Pratinjau",
+            "channel": "Saluran:",
+            "confirm": "Apakah Anda benar-benar ingin menghapus webhook perubahan terbaru?",
+            "display": "Mode tampilan:",
+            "display_compact": "Pesan teks ringkas dengan tautan sebaris.",
+            "display_diff": "Sematkan pesan dengan pratinjau gambar dan edit perbedaan.",
+            "display_embed": "Sematkan pesan dengan tag edit dan perubahan kategori.",
+            "display_image": "Sematkan pesan dengan pratinjau gambar.",
+            "entry": "Perubahan Terbaru Webhook #$1",
+            "feeds": "Perubahan berbasis feed:",
+            "feeds_only": "Hanya perubahan berbasis feed:",
+            "lang": "Bahasa:",
+            "name": "Nama webhook:",
+            "new": "Webhook Perubahan Terbaru Baru",
+            "select_channel": "-- Pilih Saluran --",
+            "wiki": "Wiki:",
+            "wiki_check": "Cek wiki"
+        },
+        "new": "Webhook Baru"
+    },
+    "selector": {
+        "desc": "Ini adalah daftar semua server tempat Kamu dapat mengubah pengaturan karena Kamu memiliki izin [Kelola Server]($1). Silakan pilih server:",
+        "invite": "Wiki-Bot belum menjadi anggota $1, tetapi Kamu dapat [mengundang Wiki-Bot]($2).",
+        "none": "Saat ini Anda tidak memiliki izin [Kelola Server]($1) di server mana pun, apakah Anda masuk ke akun yang benar?",
+        "switch": "Ganti Akun",
+        "title": "Memilih Server",
+        "user": "Akun Wiki",
+        "with": "Server dengan Wiki-Bot",
+        "without": "Server tanpa Wiki-Bot"
+    },
+    "settings": {
+        "desc": "Ini adalah pengaturan untuk $1:",
+        "failed": "Gagal memuat pengaturan!",
+        "form": {
+            "channel": "Saluran:",
+            "confirm": "Apakah kamu benar-benar ingin menghapus penimpaan saluran?",
+            "default": "Pengaturan di seluruh server",
+            "inline": "Perintah sebaris:",
+            "lang": "Bahasa:",
+            "new": "Penimpaan Saluran Baru",
+            "overwrite": "$1 Pengaturan",
+            "prefix": "Prefix:",
+            "prefix_space": "Awalan diakhiri dengan spasi:",
+            "role": "Role Minimal:",
+            "select_channel": "-- Pilih Saluran --",
+            "wiki": "Wiki Utama:",
+            "wiki_check": "Cek wiki"
+        },
+        "new": "Saluran baru ditimpa"
+    },
+    "verification": {
+        "desc": "Ini adalah verifikasi untuk $1:",
+        "explanation": "<h2>Verifikasi Pengguna</h2>\n<p>Menggunakan perintah <code class=\"prefix\">verify &lt;wiki username&gt;</code>, pengguna dapat memverifikasi diri mereka sendiri sebagai pengguna wiki tertentu dengan menggunakan bidang Discord pada profil wiki mereka. Jika pengguna cocok dan verifikasi pengguna diatur di server, Wiki-Bot akan memberi mereka peran untuk semua entri verifikasi yang cocok.</p>\n<p>Setiap entri verifikasi memungkinkan beberapa batasan tentang kapan pengguna harus cocok dengan verifikasi:</p>\n<ul>\n<li>Saluran untuk menggunakan perintah <code class=\"prefix\">verifikasi</code>.</li>\n<li>Peran yang didapat saat mencocokkan entri verifikasi.</li>\n<li>Jumlah edit yang diperlukan di wiki untuk mencocokkan entri verifikasi.</li>\n<li>Grup pengguna yang diperlukan untuk menjadi anggota di wiki agar cocok dengan entri verifikasi.</li>\n<li>Usia akun yang diperlukan dalam hari agar sesuai dengan entri verifikasi.</li>\n<li>Apakah nama panggilan pengguna Discord harus disetel ke nama pengguna wiki mereka saat mereka cocok dengan entri verifikasi.</li>\n</ul>",
+        "form": {
+            "accountage": "Usia akun (dalam hari):",
+            "channel": "Minimal Role:",
+            "confirm": "Apakah Kamu benar-benar ingin menghapus verifikasi?",
+            "editcount": "Jumlah edit minimal:",
+            "entry": "Verifikasi #$1",
+            "flag_logall": "Log verifikasi yang gagal:",
+            "flag_private": "Tanggapan perintah pribadi:",
+            "logging": "Log Saluran:",
+            "match": "Pemberitahuan persyaratan yang tidak ada:",
+            "match_placeholder": "Teks MD pada tag Discord yang cocok tetapi tidak memenuhi persyaratan apa pun untuk peran.",
+            "more": "Tambahkan lebih banyak",
+            "new": "Verifikasi Baru",
+            "notice": "Pemberitahuan Verifikasi",
+            "postcount": "Jumlah posting minimal:",
+            "postcount_and": "Memerlukan edit dan jumlah posting.",
+            "postcount_both": "Memerlukan gabungan edit dan jumlah posting.",
+            "postcount_fandom": "Hanya wiki Fandom:",
+            "postcount_or": "Memerlukan edit atau jumlah posting.",
+            "rename": "Ganti nama Pengguna:",
+            "role": "Role:",
+            "role_add": "Tambahkan",
+            "role_remove": "Hapus",
+            "select_channel": "-- Pilih Saluran --",
+            "select_role": "-- Pilih Peran --",
+            "success": "Pemberitahuan sukses:",
+            "success_placeholder": "Teks MD tentang verifikasi yang berhasil.",
+            "usergroup": "Grup pengguna Wiki:",
+            "usergroup_and": "Wajibkan semua grup pengguna:"
+        },
+        "help_notice": "<p>Pemberitahuan khusus mendukung beberapa fungsi dan variabel sederhana.</p>\n<ul>\n<li><code class=\"form-button user-select\">$editcount</code> – Jumlah edit pengguna saat ini.</li>\n<li><code class=\"form-button user-select\">$accountage</code> – Usia akun pengguna saat ini dalam hari penuh.</li>\n<li><code class=\"form-button user-select\">$postcount</code> – Jumlah posting diskusi saat ini dari pengguna (hanya wiki Fandom).</li>\n<li><code class=\"form-button user-select\" data-after=\" }}\" data-before=\"{{#expr: \">{{#expr: 1+1}}</code> – Mengembalikan hasil ekspresi.\n<ul>\n<li>Hanya mendukung penambahan <code class=\"form-button user-select\">+</code> dan pengurangan <code class=\"form-button user-select\">-</code>.</li>\n</ul></li>\n<li><code class=\"form-button user-select\" data-after=\" |  |  }}\" data-before=\"{{#ifexpr: \">{{#ifexpr: 1 &gt; 1 | <i>if true</i> | <i>if false</i> }}</code> – Mengembalikan teks tergantung pada hasil ekspresi.\n<ul>\n<li>Dukung<code class=\"form-button user-select\">&lt;</code>, <code class=\"form-button user-select\">&gt;</code>, <code class=\"form-button user-select\">=</code>, <code class=\"form-button user-select\">&lt;=</code>, <code class=\"form-button user-select\">&gt;=</code>, <code class=\"form-button user-select\">!=</code>, <code class=\"form-button user-select\">&lt;&gt;</code> serta <code class=\"form-button user-select\">dan</code>, <code class=\"form-button user-select\">atau</code>.</li>\n</ul></li>\n</ul>",
+        "new": "Verifikasi baru",
+        "notice": "Pemberitahuan verifikasi"
+    }
+}

+ 11 - 36
dashboard/i18n/it.json

@@ -16,23 +16,22 @@
         "language": "Cambia lingua",
         "login": "Accedi",
         "logout": "Esci",
-        "rcscript": "Ultime modifiche",
+        "rcscript": "Ultime Modifiche",
         "refresh": "Aggiorna lista dei server",
         "save": "Salva",
-        "selector": "Selettore server",
+        "selector": "Seleziona il server",
         "settings": "Impostazioni",
-        "slash": "Comandi slash",
         "support": "Server di supporto",
         "theme-dark": "Usa il tema scuro",
         "theme-light": "Usa il tema chiaro",
         "title": "Impostazioni Wiki-Bot",
         "verification": "Verifiche",
-        "welcome": "<h2>Benvenuto sulla Dashboard di Wiki-Bot.</h2>\n<p>Wiki-Bot è un bot Discord creato per collegare i server Discord e le wiki di MediaWiki. Aiuta nella creazione di link alle pagine delle wiki, nel verificare gli utenti della wiki, nell'informare delle modifiche più recenti e altro. <a href=\"https://wiki.wikibot.de/wiki/Wiki-Bot_Wiki\" target=\"_blank\">[Maggiori informazioni]</a></p>\n<p>Qui puoi modificare diverse impostazioni del bot per i server sui quali hai il permesso Gestire Server. Per iniziare, dovrai autenticare il tuo account Discord, cosa che puoi fare con questo pulsante:</p>"
+        "welcome": "<h2>Benvenuto sulla Dashboard di Wiki-Bot.</h2>\n<p>Wiki-Bot è un bot Discord creato per collegare i server Discord e le wiki di MediaWiki. Aiuta nel linkare alle pagine delle wiki, nel verificare gli utenti della wiki, nel riportare le modifiche più recenti sulla wiki e altro ancora. <a href=\"https://wiki.wikibot.de/wiki/Wiki-Bot_Wiki\" target=\"_blank\">[Maggiori informazioni]</a></p>\n<p>Qui puoi modificare diverse impostazioni del bot per i server sui quali hai il permesso \"Gestire Server\". Per iniziare, dovrai autenticare il tuo account Discord, cosa che puoi fare con questo pulsante:</p>"
     },
     "indexjs": {
         "avatar": {
             "content_type": "Il link fornito ha $1 come tipo di contenuto, ma solo i seguenti tipi di contenuto sono permessi:",
-            "invalid_url": "Non è stato possibile risolvere l'URL ad un file immagine valido."
+            "invalid_url": "Non è stato possibile risolvere l'URL in un file immagine valido."
         },
         "invalid": {
             "note_http": "Il sito web fornito non ha un certificato TLS/SSL valido! Per motivi di sicurezza, sono supportate solo wiki che usano HTTPS.",
@@ -65,7 +64,7 @@
             "title": "Errore sconosciuto!"
         },
         "invalidusergroup": {
-            "text": "Il nome del gruppo utente era troppo lungo o nei hai forniti troppi.",
+            "text": "Il nome del gruppo utente era troppo lungo o ne hai forniti troppi.",
             "title": "Gruppo utente invalido!"
         },
         "loginfail": {
@@ -93,15 +92,6 @@
             "text": "Per favore definisci prima le impostazioni del server.",
             "title": "Il server non è ancora impostato!"
         },
-        "noslash": {
-            "note": "Abilita i comandi slash.",
-            "text": "I comandi slash di Wiki-Bot non sono abilitati su questo server.",
-            "title": "I comandi slash non sono abilitati!"
-        },
-        "noverify": {
-            "text": "Le restrizioni per il comando $1 non possono essere modificate senza aver impostato le verifiche.",
-            "title": "Le verifiche non sono impostate!"
-        },
         "oauth": {
             "text": "Il tuo account sulla wiki è stato connesso con successo da Wiki-Bot.",
             "title": "Account connesso con successo!"
@@ -124,7 +114,7 @@
             "title": "Account verificato con successo!"
         },
         "readonly": {
-            "text": "Puoi attualmente solo vedere le tue impostazioni, ma non cambiarle.",
+            "text": "Attualmente puoi solo vedere le tue impostazioni, ma non cambiarle.",
             "title": "Database in sola lettura!"
         },
         "refresh": {
@@ -141,7 +131,7 @@
         },
         "savefail": {
             "note_http": "Il sito web fornito non ha un certificato TLS/SSL valido! Per motivi di sicurezza, sono supportate solo wiki che usano HTTPS.",
-            "note_private": "La wiki fornita è private!",
+            "note_private": "La wiki fornita è privata!",
             "note_timeout": "Il link fornito ha impiegato troppo tempo a rispondere!",
             "text": "Non è stato possibile salvare le impostazioni, per favore riprova di nuovo.",
             "title": "Salvataggio fallito!"
@@ -172,7 +162,7 @@
             "connect": "Connetti l'account.",
             "connected": "Connesso",
             "current": "Stato attuale:",
-            "default": "Connessioni Acccount Wiki",
+            "default": "Connessioni Account Wiki",
             "disable": "Non ricordo il mio account!",
             "disabled": "Disabilitato",
             "disconnect": "Disconnetti l'account.",
@@ -193,7 +183,7 @@
             "display_diff": "Messaggi incorporati con anteprima delle immagini e differenze di modifica.",
             "display_embed": "Messaggi incorporati con tag di modifica e cambi di categoria.",
             "display_image": "Messaggi incorporati con anteprima delle immagini.",
-            "entry": "Webhook delle ultime modifiche #$1",
+            "entry": "Webhook Ultime Modifiche #$1",
             "feeds": "Attività nei feed:",
             "feeds_only": "Solo attività nei feed:",
             "lang": "Lingua:",
@@ -235,24 +225,9 @@
         },
         "new": "Nuova sovrascrittura canale"
     },
-    "slash": {
-        "desc": "Questi sono i comandi slash per $1:",
-        "explanation": "<h2>Comandi slash</h2>\n<p>L'uso di specifici comandi slash può essere ristretto ad alcuni ruoli. Puoi farlo per i comandi slash di Wiki-Bot qui.</p>",
-        "form": {
-            "add": "Aggiungi",
-            "allow": "Acconsenti",
-            "default": "Default",
-            "default_allow": "Di default questo comando può essere usato da tutti.",
-            "default_deny": "Di default questo comando non può essere usato da tutti.",
-            "deny": "Nega",
-            "entry": "Comando $1",
-            "role": "Ruolo:",
-            "select_role": "-- Seleziona un ruolo --"
-        }
-    },
     "verification": {
         "desc": "Queste sono le verifiche per $1:",
-        "explanation": "<h2>Verifica utente</h2>\n<p>Usando il comando <code class=\"prefix\">verify &lt;nome utente wiki&gt;</code>, gli utenti possono confermare di essere uno specifico utente della wiki utilizzando il campo Discord del proprio profilo. Se l'utente corrisponde e le verifiche degli utenti sono impostate sul server, Wiki-Bot assegnerà i ruoli corrispondenti alle verifiche superate dall'utente.</p>\n<p>Ciascuna entrata permette di inserire restrizioni multiple sulle condizioni che un utente deve soddisfare per essere verificato:</p>\n<ul>\n<li>Il canale in cui usare il comando <code class=\"prefix\">verify</code>.</li>\n<li>Il ruolo che si ottiene superando la verifica.</li>\n<li>Il conteggio delle modifiche richiesto sulla wiki per superare la verifica.</li>\n<li>Il gruppo utente di cui è richiesto essere membri sulla wiki per superare la verifica.</li>\n<li>Età dell'account in giorni richiesta per superare la verifica.</li>\n<li>Opzione per cambiare il soprannome dell'utente Discord nel nome utente sulla wiki quando supera la verifica.</li>\n</ul>",
+        "explanation": "<h2>Verifica utente</h2>\n<p>Usando il comando <code class=\"prefix\">verify &lt;nome utente wiki&gt;</code>, gli utenti possono confermare di essere uno specifico utente della wiki utilizzando il campo Discord del proprio profilo. Se l'utente corrisponde e le verifiche degli utenti sono impostate sul server, Wiki-Bot assegnerà i ruoli corrispondenti a tutte le entrate di verifica superate.</p>\n<p>Ciascuna entrata permette di inserire restrizioni multiple sulle condizioni che un utente deve soddisfare per essere verificato:</p>\n<ul>\n<li>Il canale in cui usare il comando <code class=\"prefix\">verify</code>.</li>\n<li>Il ruolo che si ottiene superando la verifica.</li>\n<li>Il conteggio delle modifiche richiesto sulla wiki per superare la verifica.</li>\n<li>Il gruppo utente di cui è richiesto essere membri sulla wiki per superare la verifica.</li>\n<li>Età dell'account in giorni richiesta per superare la verifica.</li>\n<li>Opzione per cambiare il soprannome dell'utente Discord nel nome utente della wiki quando si supera la verifica.</li>\n</ul>",
         "form": {
             "accountage": "Età dell'account (in giorni):",
             "channel": "Canale:",
@@ -283,7 +258,7 @@
             "usergroup": "Gruppo utente della wiki:",
             "usergroup_and": "Richiedi tutti i gruppi utente:"
         },
-        "help_notice": "<p>Gli avvisi personalizzati supportano alcune semplici funzioni e variabili.</p>\n<ul>\n<li><code class=\"form-button user-select\">$editcount</code> – L'attuale conteggio delle modifiche dell'utente.</li>\n<li><code class=\"form-button user-select\">$accountage</code> – L'attuale età dell'account dell'utente in giorni.</li>\n<li><code class=\"form-button user-select\">$postcount</code> – L'attuale conteggio dei post di discussione dell'utente (solo per le wiki di Fandom).</li>\n<li><code class=\"form-button user-select\" data-after=\" }}\" data-before=\"{{#expr: \">{{#expr: 1+1}}</code> – Ritorna il risultato di un'espressione.\n<ul>\n<li>Supporta solo la somma <code class=\"form-button user-select\">+</code> e la sottrazione <code class=\"form-button user-select\">-</code>.</li>\n</ul></li>\n<li><code class=\"form-button user-select\" data-after=\" |  |  }}\" data-before=\"{{#ifexpr: \">{{#ifexpr: 1 &gt; 1 | <i>if true</i> | <i>if false</i> }}</code> – Ritorna il testo a seconda del risultato dell'espressione.\n<ul>\n<li>Supporta <code class=\"form-button user-select\">&lt;</code>, <code class=\"form-button user-select\">&gt;</code>, <code class=\"form-button user-select\">=</code>, <code class=\"form-button user-select\">&lt;=</code>, <code class=\"form-button user-select\">&gt;=</code>, <code class=\"form-button user-select\">!=</code>, <code class=\"form-button user-select\">&lt;&gt;</code> così come <code class=\"form-button user-select\">e</code>, <code class=\"form-button user-select\">o</code>.</li>\n</ul></li>\n</ul>",
+        "help_notice": "<p>Gli avvisi personalizzati supportano alcune semplici funzioni e variabili.</p>\n<ul>\n<li><code class=\"form-button user-select\">$editcount</code> – L'attuale conteggio delle modifiche dell'utente.</li>\n<li><code class=\"form-button user-select\">$accountage</code> – L'attuale età dell'account dell'utente in giorni.</li>\n<li><code class=\"form-button user-select\">$postcount</code> – L'attuale conteggio dei post di Discussioni dell'utente (solo per le wiki di Fandom).</li>\n<li><code class=\"form-button user-select\" data-after=\" }}\" data-before=\"{{#expr: \">{{#expr: 1+1}}</code> – Ritorna il risultato di un'espressione.\n<ul>\n<li>Supporta solo la somma <code class=\"form-button user-select\">+</code> e la sottrazione <code class=\"form-button user-select\">-</code>.</li>\n</ul></li>\n<li><code class=\"form-button user-select\" data-after=\" |  |  }}\" data-before=\"{{#ifexpr: \">{{#ifexpr: 1 &gt; 1 | <i>if true</i> | <i>if false</i> }}</code> – Ritorna il testo a seconda del risultato dell'espressione.\n<ul>\n<li>Supporta <code class=\"form-button user-select\">&lt;</code>, <code class=\"form-button user-select\">&gt;</code>, <code class=\"form-button user-select\">=</code>, <code class=\"form-button user-select\">&lt;=</code>, <code class=\"form-button user-select\">&gt;=</code>, <code class=\"form-button user-select\">!=</code>, <code class=\"form-button user-select\">&lt;&gt;</code> così come <code class=\"form-button user-select\">e</code>, <code class=\"form-button user-select\">o</code>.</li>\n</ul></li>\n</ul>",
         "new": "Nuova verifica",
         "notice": "Avvisi di verifica"
     }

+ 0 - 25
dashboard/i18n/ja.json

@@ -21,7 +21,6 @@
         "save": "保存",
         "selector": "サーバーを選択",
         "settings": "設定",
-        "slash": "スラッシュコマンド",
         "support": "サポートしているサーバー",
         "theme-dark": "ダークテーマを使う",
         "theme-light": "ライトテーマを使う",
@@ -93,15 +92,6 @@
             "text": "初めに、サーバーの設定を行ってください。",
             "title": "サーバーがまだセットアップされていません!"
         },
-        "noslash": {
-            "note": "スラッシュコマンドを有効にする。",
-            "text": "このサーバーでは、Wiki-Botのスラッシュコマンドが有効になっていません。",
-            "title": "スラッシュコマンドが有効ではありません!"
-        },
-        "noverify": {
-            "text": "認証がセットアップされていないと、 $1 コマンドの制限は変更できません。",
-            "title": "認証がセットアップされていません!"
-        },
         "oauth": {
             "text": "あなたのWikiアカウントとWiki-Botの連携が完了しました。",
             "title": "アカウントの連携が完了しました!"
@@ -235,21 +225,6 @@
         },
         "new": "別のWikiの通知を追加"
     },
-    "slash": {
-        "desc": "これらは、 $1 のスラッシュコマンドです:",
-        "explanation": "<h2>スラッシュコマンド</h2>\n<p>特定のスラッシュコマンドの使用をロールごとに制限することができます。Wiki-Botのスラッシュコマンドについては、ここで制限することができます。</p>",
-        "form": {
-            "add": "追加",
-            "allow": "許可",
-            "default": "既定",
-            "default_allow": "既定では、このコマンドは誰でも使用できるようになっています。",
-            "default_deny": "既定では、このコマンドは誰にも使用されないようになっています。",
-            "deny": "拒否",
-            "entry": "コマンド $1",
-            "role": "ロール:",
-            "select_role": "-- ロールを選択 --"
-        }
-    },
     "verification": {
         "desc": "$1 の認証結果:",
         "explanation": "<h2>利用者認証</h2>\n<p><code class=\"prefix\">verify &lt;wiki username&gt;</code>コマンドを使用すると、利用者は自分のWikiプロフィールのDiscord欄を使用し、自分が特定のWiki利用者であることを認証することができます。利用者が一致し、サーバー上で利用者認証が設定されている場合、Wiki-Botは一致したすべての認証エントリの役割を与えます。</p>\n<p>各認証項目では、利用者がどのような場合に認証に一致するかについて、複数の制限を設けることができます。:</p>\n<ul>\n<li><code class=\"prefix\">verify</code>コマンドを使用するチャンネル。</li>\n<li>認証項目の照合時に取得する役割</li>\n<li>認証項目と一致するために必要なWikiの編集回数。</li>\n<li>認証項目と一致するために、Wiki上でメンバーとなる必要のある利用者グループ。</li>\n<li>認証項目と一致するために必要なアカウントを作成してからの日数。</li>\n<li>Discord利用者のニックネームを、認証項目に一致したときのWiki利用者名に設定するかどうか。</li>\n</ul>",

+ 0 - 25
dashboard/i18n/ko.json

@@ -21,7 +21,6 @@
         "save": "저장",
         "selector": "서버 선택기",
         "settings": "설정",
-        "slash": "슬래시 명령어",
         "support": "지원 서버",
         "theme-dark": "다크 테마 사용",
         "theme-light": "밝은 테마 사용",
@@ -93,15 +92,6 @@
             "text": "서버 설정을 먼저 정의해 주세요.",
             "title": "서버가 설정되지 않았습니다!"
         },
-        "noslash": {
-            "note": "슬래시 명령어를 활성화합니다.",
-            "text": "이 서버에서는 Wiki-Bot의 슬래시 명령어 기능이 활성화되어 있지 않습니다.",
-            "title": "슬래시 명령어가 활성화되어있지 않습니다!"
-        },
-        "noverify": {
-            "text": "인증을 설정하지 않으면 $1 명령어에 대한 제한을 변경할 수 없습니다.",
-            "title": "인증이 설정되어 있지 않습니다!"
-        },
         "readonly": {
             "text": "현재 설정을 볼 수는 있지만, 변경할 수는 없습니다.",
             "title": "데이터베이스 읽기 전용!"
@@ -198,21 +188,6 @@
         },
         "new": "새 채널 덮어쓰기"
     },
-    "slash": {
-        "desc": "$1 서버의 슬래시 명령어입니다:",
-        "explanation": "<h2>슬래시 명령어</h2>\n<p>특정 슬래시 명령어의 사용을 역할별로 제한할 수 있습니다. 이곳에서 Wiki-Bot의 슬래시 명령어 사용 제한을 설정할 수 있습니다.</p>",
-        "form": {
-            "add": "추가",
-            "allow": "허용",
-            "default": "기본값",
-            "default_allow": "기본적으로 이 명령어는 누구나 사용할 수 있습니다.",
-            "default_deny": "기본적으로 이 명령어는 아무나 사용할 수 없습니다.",
-            "deny": "거부",
-            "entry": "명령어 $1",
-            "role": "역할:",
-            "select_role": "-- 역할을 선택하세요 --"
-        }
-    },
     "verification": {
         "desc": "$1 서버의 인증입니다:",
         "explanation": "<h2>사용자 인증</h2>\n<p><code class=\"prefix\">verify &lt;위키 사용자이름&gt;</code>명령어를 이용해, 사용자가 위키 프로필의 디스코드 태그와 일치한다는 것을 증명할 수 있습니다. 사용자 계정이 일치하고, 사용자 인증이 서버에 설정되어 있는 경우, Wiki-Bot이 해당하는 인증 역할을 부여합니다.</p>\n<p>각각의 인증 항목을 통해 인증 조건을 세부설정할 수 있습니다:</p>\n<ul>\n<li><code class=\"prefix\">verify</code> 명령어를 사용할 수 있는 채널.</li>\n<li>인증이 성공하면 얻을 역할.</li>\n<li>인증이 성공하기 위해 필요한 위키 편집 횟수.</li>\n<li>인증이 성공하기 위해 필요한 사용자 권한.</li>\n<li>인증이 성공하기 위해 필요한 계정 생성 이후 지난 시간.</li>\n<li>인증이 성공하면 디스코드 닉네임을 위키 계정과 일치하도록 변경할지 여부</li>\n</ul>",

+ 0 - 25
dashboard/i18n/pl.json

@@ -21,7 +21,6 @@
         "save": "Zapisz",
         "selector": "Selektor serwera",
         "settings": "Ustawienia",
-        "slash": "Komendy po ukośniku",
         "support": "Serwer wsparcia",
         "theme-dark": "Używaj ciemnego stylu",
         "theme-light": "Używaj jasnego stylu",
@@ -89,15 +88,6 @@
             "text": "Najpierw zdefiniuj ustawienia serwera.",
             "title": "Serwer nie został jeszcze skonfigurowany!"
         },
-        "noslash": {
-            "note": "Włącz komendy po ukośniku.",
-            "text": "Komendy po ukośniku Wiki-Bota nie są włączone na tym serwerze.",
-            "title": "Komendy po ukośniku są wyłączone!"
-        },
-        "noverify": {
-            "text": "Ograniczenia dla komendy $1 nie mogą zostać zmienione bez wcześniejszej konfiguracji weryfikacji.",
-            "title": "Weryfikacje nie zostały skonfigurowane!"
-        },
         "readonly": {
             "text": "Aktualnie możliwy jest jedynie podgląd ustawień, zapisywanie nie jest możliwe.",
             "title": "Baza danych w trybie tylko do odczytu!"
@@ -186,21 +176,6 @@
         },
         "new": "Nowe ustawienia kanału"
     },
-    "slash": {
-        "desc": "Komendy po ukośniku dla $1:",
-        "explanation": "<h2>Komendy po ukośniku</h2>\n<p>Używanie poszczególnych komend po ukośniku może być ograniczone w zależności od roli co może zostać zmienione tutaj.</p>",
-        "form": {
-            "add": "Dodaj",
-            "allow": "Zezwalaj",
-            "default": "Domyślne",
-            "default_allow": "Domyślnie ta komenda może być używana przez każdego.",
-            "default_deny": "Domyślnie ta komenda nie może być używana przez każdego.",
-            "deny": "Zabraniaj",
-            "entry": "Komenda $1",
-            "role": "Rola:",
-            "select_role": "-- Wybierz rolę --"
-        }
-    },
     "verification": {
         "desc": "Weryfikacje dla $1:",
         "explanation": "<h2>Weryfikacja użytkownika</h2>\n<p>Używając komendy <code class=\"prefix\">weryfikuj &lt;nazwa użytkownika na wiki&gt;</code>, użytkownicy mogą się zweryfikować swoje konto na wiki z użyciem pola „Discord” na swoim profilu bądź stronie użytkownika. Jeżeli nazwa użytkownika na Discordzie oraz wiki się pokrywając oraz weryfikacje użytkowników są skonfigurowane - Wiki-Bot nada odpowiednie role dla wszystkich pasujących reguł weryfikacji które pasują.</p>\n<p>Każda reguła weryfikacji pozwala na nadawanie wielu restrykcji oraz opcji, które zmieniają zachowanie weryfikacji na daną rolę:</p>\n<ul>\n<li>Kanał na którym można użyć komendy <code class=\"prefix\">weryfikuj</code>.</li>\n<li>Rola do otrzymania po poprawnym spełnieniu warunków reguły weryfikacji.</li>\n<li>Wymagana ilość edycji do spełnienia warunku.</li>\n<li>Wymagane grupy użytkowników konta wiki do spełniania warunku.</li>\n<li>Wymagany wiek konta (w dniach) do spełnienia warunku.</li>\n<li>Czy nazwa użytkownika Discord powinna zostać zmieniona na nazwę użytkownika na wiki gdy warunki weryfikacji reguły zostaną spełnione.</li>\n</ul>",

+ 0 - 25
dashboard/i18n/pt-br.json

@@ -21,7 +21,6 @@
         "save": "Salvar",
         "selector": "Seletor de servidor",
         "settings": "Configurações",
-        "slash": "Comandos de slash",
         "support": "Servidor de suporte",
         "theme-dark": "Usar tema escuro",
         "theme-light": "Usar tema claro",
@@ -93,15 +92,6 @@
             "text": "Primeiro defina as configurações para o servidor.",
             "title": "Servidor ainda não configurado!"
         },
-        "noslash": {
-            "note": "Ativar os comandos de barra.",
-            "text": "Os comandos de barra do Wiki-Bot não estão habilitados neste servidor.",
-            "title": "Os comandos de barra não estão habilitados!"
-        },
-        "noverify": {
-            "text": "As restrições para o comando $1 não podem ser alteradas sem que as verificações sejam configuradas.",
-            "title": "As verificações não foram configuradas!"
-        },
         "oauth": {
             "text": "Sua conta wiki foi conectada com sucesso ao Wiki-Bot.",
             "title": "Conta conectada com sucesso!"
@@ -235,21 +225,6 @@
         },
         "new": "Nova sobreposição de canal"
     },
-    "slash": {
-        "desc": "Estes são os comandos de slash para $1:",
-        "explanation": "<h2>Comandos slash</h2>\n<p>O uso de comandos de slash específicos pode ser restrito por função. Você pode fazer isso para os comandos de slash do Wiki-Bot aqui.</p>",
-        "form": {
-            "add": "Adicionar",
-            "allow": "Permitir",
-            "default": "Padrão",
-            "default_allow": "Por padrão, este comando pode ser usado por todos.",
-            "default_deny": "Por padrão, este comando não pode ser usado por ninguém.",
-            "deny": "Negar",
-            "entry": "Comando $1",
-            "role": "Cargo:",
-            "select_role": "-- Selecionar cargo --"
-        }
-    },
     "verification": {
         "desc": "Estas são as verificações para $1:",
         "explanation": "<h2>Verificação de usuários</h2>\n<p>Usando o comando <code class=\"prefix\">verify &lt;wiki username&gt;</code>, os usuários podem verificar a si mesmos como um usuário específico do wiki usando o campo do Discord em seu perfil da wiki. Se o usuário corresponder e as verificações do usuário forem configuradas no servidor, o Wiki-Bot dará a ele as funções para todas as entradas de verificação que corresponderem.</p>\n<p>Cada entrada de verificação permite várias restrições sobre quando um usuário deve corresponder à verificação:</p>\n<ul>\n<li>Canal para usar o comando <code class=\"prefix\">verify</code>.</li>\n<li>Cargo obtido caso a entrada de verificação corresponda.</li>\n<li>Contagem de edições necessária na wiki para corresponder à entrada de verificação.</li>\n<li>Grupo de usuários obrigatório para ser um membro na wiki para corresponder à entrada de verificação.</li>\n<li>Idade necessária da conta em dias para corresponder à entrada de verificação.</li>\n<li>Se o apelido do usuário do Discord deve ser definido como o nome de usuário da wiki quando corresponder à entrada de verificação.</li>\n</ul>",

+ 35 - 23
dashboard/i18n/ru.json

@@ -21,7 +21,6 @@
         "save": "Сохранить",
         "selector": "Выбор Сервера",
         "settings": "Настройки",
-        "slash": "Слэш-Команды",
         "support": "Сервер Поддержки",
         "theme-dark": "Переключиться на тёмную тему",
         "theme-light": "Переключиться на светлую тему",
@@ -93,14 +92,26 @@
             "text": "Сначала определите настройки для всего сервера.",
             "title": "Сервер ещё не настроен!"
         },
-        "noslash": {
-            "note": "Включить слэш-команды.",
-            "text": "Слэш-команды Вики-Бота не включены на этом сервере.",
-            "title": "Слэш-команды не включены!"
+        "oauth": {
+            "text": "Ваша учетная запись вики успешно привязана к Вики-Боту.",
+            "title": "Учетная запись успешно привязана!"
         },
-        "noverify": {
-            "text": "Ограничения для команды $1 не могут быть изменены, если верификации не настроены.",
-            "title": "Верификации не настроены!"
+        "oauthfail": {
+            "text": "Не удалось привязать вашу учетную запись вики, пожалуйста, повторите попытку.",
+            "title": "Сбой привязки!"
+        },
+        "oauthlogin": {
+            "text": "Пожалуйста, войдите в систему, если вы не хотите, чтобы Wiki-Bot запомнил вашу учетную запись вики.",
+            "title": "Ваша привязанная учетная запись вики была сохранена!"
+        },
+        "oauthother": {
+            "note": "Переключение учётных записей.",
+            "text": "Пожалуйста, обратите внимание, что ваша учетная запись вики была привязана к учетной записи Discord, отличной от той, под которой вы сейчас вошли в систему.",
+            "title": "Учетная запись успешно привязана!"
+        },
+        "oauthverify": {
+            "text": "Ваша учетная запись вики была успешно подтверждена.",
+            "title": "Учетная запись успешно подтверждена!"
         },
         "readonly": {
             "text": "На данный момент вы можете лишь просматривать настройки, но не изменять их.",
@@ -144,6 +155,21 @@
             "title": "Вики заблокирована!"
         }
     },
+    "oauth": {
+        "desc": "Ваши настройки OAuth2 для привязки учетных записей на вики:",
+        "failed": "Не удалось загрузить настройки OAuth2!",
+        "form": {
+            "connect": "Привяжите учётную запись.",
+            "connected": "Привязано",
+            "current": "Текущий статус:",
+            "default": "Привязки к учетным записям вики",
+            "disable": "Не запоминать мою учётную запись!",
+            "disabled": "Отключено",
+            "disconnect": "Отвязать учетную запись.",
+            "enable": "Запомнить мой аккаунт.",
+            "unconnected": "Не привязано"
+        }
+    },
     "rcscript": {
         "desc": "Вебхуки свежих правок на $1:",
         "explanation": "<h2>Вебхук Свежих Правок</h2>\n<p>Вики-Бот может создавать вебхук свежих правок, основанный на <a href=\"https://gitlab.com/piotrex43/RcGcDw\" target=\"_blank\">RcGcDw</a>. Свежие правки могут отображаться как компактные текстовые сообщения со встроенными ссылками или встроенные сообщения с метками правок и изменениями категорий.</p>\n<p>Требования для создания нового вебхука свежих правок:</p>\n<ul>\n<li>Вики должна работать на <a href=\"https://www.mediawiki.org/wiki/MediaWiki_1.30\" target=\"_blank\">MediaWiki 1.30</a> или выше.</li>\n<li>Системное сообщение <code class=\"user-select\">MediaWiki:Custom-RcGcDw</code> должно содержать ID сервера: <code class=\"user-select\" id=\"server-id\"></code>.</li>\n</ul>",
@@ -175,6 +201,7 @@
         "none": "У вас на данный момент нет разрешения [Управлять Сервером]($1) ни на одном сервере, вы вошли в правильный аккаунт?",
         "switch": "Сменить Аккаунт",
         "title": "Выбор Сервера",
+        "user": "Учётные записи на Вики",
         "with": "Сервера с Вики-Ботом",
         "without": "Сервера без Вики-Бота"
     },
@@ -198,21 +225,6 @@
         },
         "new": "Новая перезапись настроек канала"
     },
-    "slash": {
-        "desc": "Слэш-Команды на $1:",
-        "explanation": "<h2>Слэш-Команды</h2>\n<p>Использование конкретных слэш-команд может быть ограничено по ролям. Здесь вы можете это сделать для слэш-команд Вики-Бота.</p>",
-        "form": {
-            "add": "Добавить",
-            "allow": "Разрешить",
-            "default": "По умолчанию",
-            "default_allow": "По умолчанию все могут пользоваться этой командой.",
-            "default_deny": "По умолчанию никто не может пользоваться этой командой.",
-            "deny": "Запретить",
-            "entry": "Команда $1",
-            "role": "Роль:",
-            "select_role": "-- Выберите Роль --"
-        }
-    },
     "verification": {
         "desc": "Верификации для $1:",
         "explanation": "<h2>Верификация Пользователей</h2>\n<p>Используя команду <code class=\"prefix\">verify &lt;имя пользователя на вики&gt;</code>, пользователи могут подтвердить, что их аккаунт Discord и их учётная запись на вики принадлежат им, используя поле \"Discord\" в вики-профиле. Если пользователи совпадают и верификации настроены на сервере, Вики-Бот назначит им роли за все верификации, под которые они подходят.</p>\n<p>Для каждой верификации можно настроить ограничения, которым должен следовать пользователь, чтобы подойти под верификацию:</p>\n<ul>\n<li>Канал, в котором можно использовать команду <code class=\"prefix\">verify</code>.</li>\n<li>Роль, которую получит пользователь при успешной верификации.</li>\n<li>Необходимое количество правок на вики для успешной верификации.</li>\n<li>Группа пользователей на вики, в которой необходимо состоять для успешной верификации.</li>\n<li>Необходимое время с момента создания аккаунта в днях для успешной верификации.</li>\n<li>Изменять ли никнейм пользователя Discord на имя участника на вики при успешной верификации.</li>\n</ul>",

+ 34 - 2
dashboard/i18n/sv.json

@@ -21,10 +21,42 @@
         "save": "Spara",
         "selector": "Serverväljare",
         "settings": "Inställningar",
-        "slash": "Slash-kommandon",
         "support": "Support-server",
         "theme-dark": "Använd mörkt tema",
-        "theme-light": "Använd ljust tema"
+        "theme-light": "Använd ljust tema",
+        "title": "Wiki Bot-inställningar",
+        "verification": "Verifieringar"
+    },
+    "indexjs": {
+        "avatar": {
+            "invalid_url": "Det gick inte att hämta en giltig bildfil från webbadressen."
+        },
+        "invalid": {
+            "title": "Ogiltig wiki!"
+        },
+        "outdated": {
+            "text": "Webhooken för de senaste ändringarna kräver minst MediaWiki 1.30!",
+            "title": "En gammal MediaWiki version används!"
+        },
+        "prefix": {
+            "backslash": "Prefixet får inte innehålla snedstreck!",
+            "code": "Prefixet får inte innehålla kodmarkering!",
+            "space": "Prefixet får inte innehålla mellanslag!"
+        },
+        "sysmessage": {
+            "text": "Sidan $1 måste matcha server-id:t $2.",
+            "title": "Systemmeddelandet matchar inte!"
+        },
+        "valid": {
+            "MediaWiki": "Varning: Kräver minst $1 för full funktionalitet.",
+            "title": "Wikin är giltig och kan användas!"
+        }
+    },
+    "notice": {
+        "error": {
+            "text": "Ett okänt fel uppstod, försök igen.",
+            "title": "Okänt fel!"
+        }
     },
     "rcscript": {
         "form": {

+ 0 - 25
dashboard/i18n/tr.json

@@ -21,7 +21,6 @@
         "save": "Kaydet",
         "selector": "Sunucu Seçici",
         "settings": "Ayarlar",
-        "slash": "Eğik Çizgi Komutları",
         "support": "Destek Sunucusu",
         "theme-dark": "Karanlık temayı kullan",
         "theme-light": "Aydınlık temayı kullan",
@@ -93,15 +92,6 @@
             "text": "Lütfen sunucu için ayarları belirtin.",
             "title": "Sunucu kurulmamış!"
         },
-        "noslash": {
-            "note": "Eğik çizgi komutlarını etkinleştir.",
-            "text": "Wiki-Bot'un eğik çizgi komutları bu sunucuda etkin.",
-            "title": "Eğik çizgi komutları etkin değil!"
-        },
-        "noverify": {
-            "text": "$1 komutunun kısıtlamaları doğrulamalar kurulmadan önce değiştirilemez.",
-            "title": "Doğrulamalar kurulmamış!"
-        },
         "oauth": {
             "text": "Viki hesabın başarıyla Wiki-Bot ile bağlandı.",
             "title": "Hesap başarıyla bağlandı!"
@@ -235,21 +225,6 @@
         },
         "new": "Yeni kanal üzerine yazması"
     },
-    "slash": {
-        "desc": "$1 için mevcut eğik çizgi komutları:",
-        "explanation": "<h2>Eğik Çizgi Komutları</h2>\n<p>Spesifik eğik çizgi komutlarının kullanımı role göre kısıtlanabilir. Bunu Wiki-Bot'un eğik çizgi komutları için burada düzenleyebilirsin.</p>",
-        "form": {
-            "add": "Ekle",
-            "allow": "İzin ver",
-            "default": "Varsayılan",
-            "default_allow": "Varsayılan hali ile bu komut herkes tarafından kullanılabiliyor.",
-            "default_deny": "Varsayılan hali ile kimse bu komutu kullanamıyor.",
-            "deny": "Reddet",
-            "entry": "$1 komutu",
-            "role": "Rol:",
-            "select_role": "-- Bir Rol Seç --"
-        }
-    },
     "verification": {
         "desc": "$1 doğrulamaları:",
         "explanation": "<h2>Kullanıcı Doğrulaması</h2>\n<p>Kullanıcılar <code class=\"prefix\">verify &lt;viki kullanıcı adı&gt;</code> komutunu kullanarak kendilerini viki profillerindeki Discord bölümü sayesinde belirli spesifik bir viki kullanıcısı olarak doğrulayabilirler. Eğer kullanıcı eşleşirse ve sunucuda doğrulama sistemi kuruluysa Wiki-Bot eşleşen bütün doğrulama girdileri için ilgili rolleri verecektir.</p>\n<p>Her doğrulama girdisi, kullanıcının doğrulamayı nasıl tamamlayacağı konusunda bir kısıtlama getirir:</p>\n<ul>\n<li><code class=\"prefix\">verify</code> komutunun kullanılacağı kanal.</li>\n<li>Doğrulama girdisi eşleştiğinde verilecek rol.</li>\n<li>Doğrulama girdisinin eşleşebilmesi için gerekli minimum düzenleme sayısı.</li>\n<li>Doğrulama girdisinin eşleşebilmesi için üyenin vikide üyesi olması gereken kullanıcı grupları.</li>\n<li>Doğrulama girdisinin eşleşebilmesi için hesabın gün bakımından yaşı.</li>\n<li>Doğrulama girdisi eşleştiğinde Discord kullanıcı adının viki kullanıcı adıyla değiştirilip değiştirilmeyeceği.</li>\n</ul>",

+ 0 - 25
dashboard/i18n/zh-hans.json

@@ -21,7 +21,6 @@
         "save": "保存",
         "selector": "选择服务器",
         "settings": "设置",
-        "slash": "斜杠命令",
         "support": "支持服务器",
         "theme-dark": "使用酷黑主题",
         "theme-light": "使用明亮主题",
@@ -93,15 +92,6 @@
             "text": "请先定义服务器的设置。",
             "title": "尚未配置服务器!"
         },
-        "noslash": {
-            "note": "启用斜杠命令。",
-            "text": "Wiki-Bot 的斜杠命令在本服务器上未启用。",
-            "title": "斜杠命令未启用!"
-        },
-        "noverify": {
-            "text": "在没有设置验证方式的情况下,无法对命令$1设置使用限制。",
-            "title": "未配置验证方式!"
-        },
         "oauth": {
             "text": "您的wiki账号已成功连接到 Wiki-Bot。",
             "title": "账号成功连接!"
@@ -235,21 +225,6 @@
         },
         "new": "新的频道覆写设置"
     },
-    "slash": {
-        "desc": "以下是$1的斜杠命令:",
-        "explanation": "<h2>斜杠命令</h2>\n<p>可以为每个身份组设置特定斜杠命令的使用限制。在此你可以设置 Wiki-Bot 斜杠命令的使用限制。</p>",
-        "form": {
-            "add": "添加",
-            "allow": "允许",
-            "default": "默认",
-            "default_allow": "默认情况下,此命令可被任何人使用。",
-            "default_deny": "默认情况下,此命令不允许任何人使用。",
-            "deny": "拒绝",
-            "entry": "命令 $1",
-            "role": "身份组:",
-            "select_role": "-- 选择身份组 --"
-        }
-    },
     "verification": {
         "desc": "以下是 $1 的验证方式:",
         "explanation": "<h2>用户验证</h2>\n<p>使用<code class=\"prefix\">verify &lt;wiki用户名&gt;</code>命令,用户可以将他们验证为特定的 wiki 用户,只需要他们在 wiki 个人资料的 Discord 栏位中填入自己的 Discord 即可。若验证结果匹配并且服务器设置了用户验证,那么 Wiki-Bot 就会对应所有与他们相匹配的验证项,给予相应的用户组。</p>\n<p>每条验证项都允许填入多条匹配条件:</p>\n<ul>\n<li>允许使用 <code class=\"prefix\">verify</code> 命令的频道。</li>\n<li>匹配该验证项时授予的身份组。</li>\n<li>匹配该验证项所需的编辑次数。</li>\n<li>匹配该验证项所需的 wiki 用户组。</li>\n<li>匹配该验证项所需的账号注册时长(单位为天)。</li>\n<li>匹配该验证项时是否将 Discord 用户的昵称设置为他们的 wiki 用户名。</li>\n</ul>",

+ 0 - 25
dashboard/i18n/zh-hant.json

@@ -21,7 +21,6 @@
         "save": "儲存",
         "selector": "選擇伺服器",
         "settings": "設定",
-        "slash": "斜線指令",
         "support": "支援伺服器",
         "theme-dark": "使用灰暗主題",
         "theme-light": "使用明亮主題",
@@ -93,15 +92,6 @@
             "text": "請先定義伺服器設定。",
             "title": "尚未設定伺服器!"
         },
-        "noslash": {
-            "note": "啟用斜線指令。",
-            "text": "Wiki-Bot的斜線指令在本伺服器上未啟用。",
-            "title": "斜線指令未啟用!"
-        },
-        "noverify": {
-            "text": "在未設定驗證方式時,無法對指令$1設定使用限制。",
-            "title": "未設定驗證方式!"
-        },
         "oauth": {
             "text": "您的wiki帳號已成功連接到Wiki-Bot。",
             "title": "帳號成功連接!"
@@ -235,21 +225,6 @@
         },
         "new": "新的頻道覆寫設定"
     },
-    "slash": {
-        "desc": "以下是$1的斜線指令:",
-        "explanation": "<h2>斜線指令</h2>\n<p>可以為每個身分組設定特定斜線指令的使用限制。在此你可以設定Wiki-Bot斜線指令的使用限制。</p>",
-        "form": {
-            "add": "新增",
-            "allow": "允許",
-            "default": "預設",
-            "default_allow": "預設情況下,此指令可被任何人使用。",
-            "default_deny": "預設情況下,此指令不允許被任何人使用。",
-            "deny": "拒絕",
-            "entry": "指令$1",
-            "role": "身分組:",
-            "select_role": "-- 選擇身分組 --"
-        }
-    },
     "verification": {
         "desc": "以下為 $1 的驗證方式:",
         "explanation": "<h2>使用者驗證功能</h2>\n<p>使用 <code class=\"prefix\">verify &lt;wiki使用者名稱&gt;</code> 指令時,使用者可以透過填寫wiki個人檔案的Discord欄位將自己的帳號驗證為特定的wiki使用者。若該伺服器有設定驗證功能且驗證條件相符,則Wiki-Bot會根據符合的驗證規則授與相對應的身分組。</p>\n<p>每項驗證規則都允許填入多個條件:</p>\n<ul>\n<li>允許使用 <code class=\"prefix\">verify</code> 指令的頻道。</li>\n<li>符合該驗證規則時需授予的身分組。</li>\n<li>符合該驗證規則所需的編輯次數。</li>\n<li>符合該驗證規則所需的wiki使用者群組。</li>\n<li>符合該驗證規則所需的帳號註冊時長(以天為單位)。</li>\n<li>符合該驗證規則時是否要將Discord使用者的暱稱變更為其wiki使用者名稱。</li>\n</ul>",

+ 0 - 4
dashboard/index.html

@@ -33,10 +33,6 @@
 				<img src="/src/settings.svg" alt="Settings">
 				<div>Recent Changes</div>
 			</a>
-			<a class="channel channel-header" id="slash" title="Slash Commands">
-				<img src="/src/settings.svg" alt="Settings">
-				<div>Slash Commands</div>
-			</a>
 		</div>
 		<div id="navbar">
 			<a id="selector" href="/" style="width: 230px;">

+ 6 - 7
dashboard/index.js

@@ -52,7 +52,7 @@ const server = http.createServer( (req, res) => {
 		} )?.map( cookie => cookie.replace( /^wikibot="([\da-f]+(?:-\d+)*)"$/, '$1' ) )?.join();
 
 		if ( state && sessionData.has(state) && settingsData.has(sessionData.get(state).user_id) &&
-		( ( args.length === 5 && ['settings', 'verification', 'rcscript', 'slash'].includes( args[3] ) && /^(?:default|new|notice|\d+)$/.test(args[4])
+		( ( args.length === 5 && ['settings', 'verification', 'rcscript'].includes( args[3] ) && /^(?:default|new|notice|\d+)$/.test(args[4])
 		&& settingsData.get(sessionData.get(state).user_id).guilds.isMember.has(args[2]) ) || req.url === '/user' ) ) {
 			let body = [];
 			req.on( 'data', chunk => {
@@ -164,8 +164,8 @@ const server = http.createServer( (req, res) => {
 	res.setHeader('Content-Language', [dashboardLang.lang]);
 
 	var lastGuild = req.headers?.cookie?.split('; ')?.filter( cookie => {
-		return cookie.split('=')[0] === 'guild' && /^"(?:user|\d+\/(?:settings|verification|rcscript|slash)(?:\/(?:\d+|new|notice))?)"$/.test(( cookie.split('=')[1] || '' ));
-	} )?.map( cookie => cookie.replace( /^guild="(user|\d+\/(?:settings|verification|rcscript|slash)(?:\/(?:\d+|new|notice))?)"$/, '$1' ) )?.join();
+		return cookie.split('=')[0] === 'guild' && /^"(?:user|\d+\/(?:settings|verification|rcscript)(?:\/(?:\d+|new|notice))?)"$/.test(( cookie.split('=')[1] || '' ));
+	} )?.map( cookie => cookie.replace( /^guild="(user|\d+\/(?:settings|verification|rcscript)(?:\/(?:\d+|new|notice))?)"$/, '$1' ) )?.join();
 	if ( lastGuild ) res.setHeader('Set-Cookie', ['guild=""; SameSite=Lax; Path=/; Max-Age=0']);
 
 	var state = req.headers.cookie?.split('; ')?.filter( cookie => {
@@ -196,7 +196,7 @@ const server = http.createServer( (req, res) => {
 		if ( reqURL.pathname !== '/' ) action = 'unauthorized';
 		if ( reqURL.pathname.startsWith( '/guild/' ) ) {
 			let pathGuild = reqURL.pathname.split('/').slice(2, 5).join('/');
-			if ( /^\d+\/(?:settings|verification|rcscript|slash)(?:\/(?:\d+|new|notice))?$/.test(pathGuild) ) {
+			if ( /^\d+\/(?:settings|verification|rcscript)(?:\/(?:\d+|new|notice))?$/.test(pathGuild) ) {
 				res.setHeader('Set-Cookie', [`guild="${pathGuild}"; SameSite=Lax; Path=/`]);
 			}
 		}
@@ -219,7 +219,7 @@ const server = http.createServer( (req, res) => {
 		if ( reqURL.pathname !== '/' ) action = 'unauthorized';
 		if ( reqURL.pathname.startsWith( '/guild/' ) ) {
 			let pathGuild = reqURL.pathname.split('/').slice(2, 5).join('/');
-			if ( /^\d+\/(?:settings|verification|rcscript|slash)(?:\/(?:\d+|new|notice))?$/.test(pathGuild) ) {
+			if ( /^\d+\/(?:settings|verification|rcscript)(?:\/(?:\d+|new|notice))?$/.test(pathGuild) ) {
 				res.setHeader('Set-Cookie', [`guild="${pathGuild}"; SameSite=Lax; Path=/`]);
 			}
 		}
@@ -235,7 +235,7 @@ const server = http.createServer( (req, res) => {
 
 	if ( reqURL.pathname === '/refresh' ) {
 		let returnLocation = reqURL.searchParams.get('return');
-		if ( !/^\/(?:user|guild\/\d+\/(?:settings|verification|rcscript|slash)(?:\/(?:\d+|new|notice))?)$/.test(returnLocation) ) {
+		if ( !/^\/(?:user|guild\/\d+\/(?:settings|verification|rcscript)(?:\/(?:\d+|new|notice))?)$/.test(returnLocation) ) {
 			returnLocation = '/';
 		}
 		return pages.refresh(res, sessionData.get(state), returnLocation);
@@ -249,7 +249,6 @@ const server = http.createServer( (req, res) => {
 	let action = '';
 	if ( reqURL.searchParams.get('refresh') === 'success' ) action = 'refresh';
 	if ( reqURL.searchParams.get('refresh') === 'failed' ) action = 'refreshfail';
-	if ( reqURL.searchParams.get('slash') === 'noverify' && reqURL.pathname.split('/')[3] === 'slash' ) action = 'noverify';
 	if ( reqURL.pathname === '/user' ) {
 		if ( reqURL.searchParams.get('oauth') === 'success' ) action = 'oauth';
 		if ( reqURL.searchParams.get('oauth') === 'failed' ) action = 'oauthfail';

+ 16 - 6
dashboard/oauth.js

@@ -1,6 +1,6 @@
 import { readFileSync } from 'fs';
 import { randomBytes } from 'crypto';
-import cheerio from 'cheerio';
+import { load as cheerioLoad } from 'cheerio';
 import Wiki from '../util/wiki.js';
 import { allLangs } from './i18n.js';
 import { got, db, oauth, enabledOAuth2, sessionData, settingsData, oauthVerify, sendMsg, addWidgets, createNotice, hasPerm } from './util.js';
@@ -27,7 +27,7 @@ function dashboard_login(res, dashboardLang, theme, state, action) {
 		}
 		sessionData.delete(state);
 	}
-	var $ = cheerio.load(file);
+	var $ = cheerioLoad(file);
 	$('html').attr('lang', dashboardLang.lang);
 	if ( theme === 'light' ) $('html').addClass('theme-light');
 	$('<script>').text(`
@@ -164,7 +164,7 @@ function dashboard_oauth(res, state, searchParams, lastGuild) {
 				let returnLocation = '/';
 				if ( lastGuild ) {
 					if ( lastGuild === 'user' ) returnLocation += lastGuild;
-					else if ( /^\d+\/(?:settings|verification|rcscript|slash)(?:\/(?:\d+|new|notice))?$/.test(lastGuild) ) returnLocation += 'guild/' + lastGuild;
+					else if ( /^\d+\/(?:settings|verification|rcscript)(?:\/(?:\d+|new|notice))?$/.test(lastGuild) ) returnLocation += 'guild/' + lastGuild;
 				}
 				res.writeHead(302, {
 					Location: returnLocation,
@@ -255,14 +255,24 @@ function dashboard_api(res, input) {
 		api: true,
 		error: false,
 		error_code: '',
-		wiki: wiki.href,
+		wiki: wiki?.href,
 		base: '',
 		sitename: '',
 		logo: '',
 		MediaWiki: false,
 		RcGcDw: '',
-		customRcGcDw: wiki.toLink('MediaWiki:Custom-RcGcDw', 'action=edit')
+		customRcGcDw: wiki?.toLink('MediaWiki:Custom-RcGcDw', 'action=edit')
 	};
+	if ( !wiki ) {
+		result.error = true;
+		let body = JSON.stringify(result);
+		res.writeHead(200, {
+			'Content-Length': Buffer.byteLength(body),
+			'Content-Type': 'application/json'
+		});
+		res.write( body );
+		return res.end();
+	}
 	return got.get( wiki + 'api.php?&action=query&meta=allmessages|siteinfo&ammessages=custom-RcGcDw&amenableparser=true&siprop=general&format=json', {
 		responseType: 'text'
 	} ).then( response => {
@@ -271,7 +281,7 @@ function dashboard_api(res, input) {
 		}
 		catch (error) {
 			if ( response.statusCode === 404 && typeof response.body === 'string' ) {
-				let api = cheerio.load(response.body)('head link[rel="EditURI"]').prop('href');
+				let api = cheerioLoad(response.body)('head link[rel="EditURI"]').prop('href');
 				if ( api ) {
 					wiki = new Wiki(api.split('api.php?')[0], wiki);
 					return got.get( wiki + 'api.php?action=query&meta=allmessages|siteinfo&ammessages=custom-RcGcDw&amenableparser=true&siprop=general&format=json' );

+ 7 - 5
dashboard/rcscript.js

@@ -1,4 +1,4 @@
-import cheerio from 'cheerio';
+import { load as cheerioLoad } from 'cheerio';
 import Lang from '../util/i18n.js';
 import Wiki from '../util/wiki.js';
 import { got, db, sendMsg, createNotice, hasPerm } from './util.js';
@@ -66,7 +66,7 @@ const fieldset = {
 
 /**
  * Create a settings form
- * @param {import('cheerio').default} $ - The response body
+ * @param {import('cheerio').CheerioAPI} $ - The response body
  * @param {String} header - The form header
  * @param {import('./i18n.js').default} dashboardLang - The user language
  * @param {Object} settings - The current settings
@@ -197,7 +197,7 @@ function createForm($, header, dashboardLang, settings, guildChannels, allWikis)
 /**
  * Let a user change recent changes scripts
  * @param {import('http').ServerResponse} res - The server response
- * @param {import('cheerio').default} $ - The response body
+ * @param {import('cheerio').CheerioAPI} $ - The response body
  * @param {import('./util.js').Guild} guild - The current guild
  * @param {String[]} args - The url parts
  * @param {import('./i18n.js').default} dashboardLang - The user language
@@ -378,6 +378,7 @@ function update_rcscript(res, userSettings, guild, type, settings) {
 				return res(`/guild/${guild}/rcscript`, 'savefail');
 			}
 			var wiki = Wiki.fromInput(settings.wiki);
+			if ( !wiki ) return res(`/guild/${guild}/rcscript/new`, 'savefail');
 			return got.get( wiki + 'api.php?&action=query&meta=allmessages|siteinfo&ammessages=custom-RcGcDw|recentchanges&amenableparser=true&siprop=general&titles=Special:RecentChanges&format=json', {
 				responseType: 'text'
 			} ).then( fresponse => {
@@ -386,7 +387,7 @@ function update_rcscript(res, userSettings, guild, type, settings) {
 				}
 				catch (error) {
 					if ( fresponse.statusCode === 404 && typeof fresponse.body === 'string' ) {
-						let api = cheerio.load(fresponse.body)('head link[rel="EditURI"]').prop('href');
+						let api = cheerioLoad(fresponse.body)('head link[rel="EditURI"]').prop('href');
 						if ( api ) {
 							wiki = new Wiki(api.split('api.php?')[0], wiki);
 							return got.get( wiki + 'api.php?action=query&meta=allmessages|siteinfo&ammessages=custom-RcGcDw|recentchanges&amenableparser=true&siprop=general&titles=Special:RecentChanges&format=json' );
@@ -622,6 +623,7 @@ function update_rcscript(res, userSettings, guild, type, settings) {
 				if ( ( row.postid === '-1' ) !== !settings.feeds ) hasDiff = true;
 				if ( !hasDiff ) return res(`/guild/${guild}/rcscript/${type}`, 'save');
 				var wiki = Wiki.fromInput(settings.wiki);
+				if ( !wiki ) return res(`/guild/${guild}/rcscript/${type}`, 'savefail');
 				return got.get( wiki + 'api.php?&action=query&meta=allmessages|siteinfo&ammessages=custom-RcGcDw&amenableparser=true&siprop=general&format=json', {
 					responseType: 'text'
 				} ).then( fresponse => {
@@ -630,7 +632,7 @@ function update_rcscript(res, userSettings, guild, type, settings) {
 					}
 					catch (error) {
 						if ( fresponse.statusCode === 404 && typeof fresponse.body === 'string' ) {
-							let api = cheerio.load(fresponse.body)('head link[rel="EditURI"]').prop('href');
+							let api = cheerioLoad(fresponse.body)('head link[rel="EditURI"]').prop('href');
 							if ( api ) {
 								wiki = new Wiki(api.split('api.php?')[0], wiki);
 								return got.get( wiki + 'api.php?action=query&meta=allmessages|siteinfo&ammessages=custom-RcGcDw&amenableparser=true&siprop=general&format=json' );

+ 6 - 4
dashboard/settings.js

@@ -1,4 +1,4 @@
-import cheerio from 'cheerio';
+import { load as cheerioLoad } from 'cheerio';
 import Lang from '../util/i18n.js';
 import Wiki from '../util/wiki.js';
 import { got, db, sendMsg, createNotice, hasPerm } from './util.js';
@@ -40,7 +40,7 @@ const fieldset = {
 
 /**
  * Create a settings form
- * @param {import('cheerio').default} $ - The response body
+ * @param {import('cheerio').CheerioAPI} $ - The response body
  * @param {String} header - The form header
  * @param {import('./i18n.js').default} dashboardLang - The user language
  * @param {Object} settings - The current settings
@@ -167,7 +167,7 @@ function createForm($, header, dashboardLang, settings, guildRoles, guildChannel
 /**
  * Let a user change settings
  * @param {import('http').ServerResponse} res - The server response
- * @param {import('cheerio').default} $ - The response body
+ * @param {import('cheerio').CheerioAPI} $ - The response body
  * @param {import('./util.js').Guild} guild - The current guild
  * @param {String[]} args - The url parts
  * @param {import('./i18n.js').default} dashboardLang - The user language
@@ -346,6 +346,7 @@ function update_settings(res, userSettings, guild, type, settings) {
 			return res(`/guild/${guild}/settings/${type}`, 'savefail');
 		} );
 		var wiki = Wiki.fromInput(settings.wiki);
+		if ( !wiki ) return res(`/guild/${guild}/settings`, 'savefail');
 		var embed;
 		return got.get( wiki + 'api.php?&action=query&meta=siteinfo&siprop=general&format=json', {
 			responseType: 'text'
@@ -355,7 +356,7 @@ function update_settings(res, userSettings, guild, type, settings) {
 			}
 			catch (error) {
 				if ( fresponse.statusCode === 404 && typeof fresponse.body === 'string' ) {
-					let api = cheerio.load(fresponse.body)('head link[rel="EditURI"]').prop('href');
+					let api = cheerioLoad(fresponse.body)('head link[rel="EditURI"]').prop('href');
 					if ( api ) {
 						wiki = new Wiki(api.split('api.php?')[0], wiki);
 						return got.get( wiki + 'api.php?action=query&meta=siteinfo&siprop=general&format=json' );
@@ -377,6 +378,7 @@ function update_settings(res, userSettings, guild, type, settings) {
 				}
 				wiki.updateWiki(body.query.general);
 				if ( !wiki.isFandom() ) {
+					let lang = new Lang(( type === 'default' && settings.lang || row?.guildlang ));
 					let notice = [];
 					if ( body.query.general.generator.replace( /^MediaWiki 1\.(\d\d).*$/, '$1' ) <= 30 ) {
 						console.log( '- Dashboard: This wiki is using ' + body.query.general.generator + '.' );

+ 0 - 319
dashboard/slash.js

@@ -1,319 +0,0 @@
-import Lang from '../util/i18n.js';
-import { got, db, slashCommands, sendMsg, createNotice, hasPerm } from './util.js';
-
-const fieldset = {
-	role: '<label for="wb-settings-addrole">Role:</label>'
-	+ '<select id="wb-settings-addrole" name="role"></select>'
-	+ '<button type="button" id="wb-settings-addrole-add">Add</button>'
-	+ '<hr>',
-	permission: '<span title="@UNKNOWN">@UNKNOWN:</span>'
-	+ '<div class="wb-settings-permission">'
-	+ '<input type="radio" id="wb-settings-permission-0" name="permission" value="0" required>'
-	+ '<label for="wb-settings-permission-0" class="wb-settings-permission-deny radio-label">Deny</label>'
-	+ '</div><div class="wb-settings-permission">'
-	+ '<input type="radio" id="wb-settings-permission-1" name="permission" value="1" required>'
-	+ '<label for="wb-settings-permission-1" class="wb-settings-permission-allow radio-label">Allow</label>'
-	+ '</div><div class="wb-settings-permission">'
-	+ '<input type="radio" id="wb-settings-permission-default" name="permission" value="" required>'
-	+ '<label for="wb-settings-permission-default" class="wb-settings-permission-default radio-label">Default</label>'
-	+ '</div>',
-	save: '<input type="submit" id="wb-settings-save" name="save_settings">'
-};
-
-/**
- * Create a settings form
- * @param {import('cheerio').default} $ - The response body
- * @param {slashCommands[0]} slashCommand - The slash command
- * @param {import('./i18n.js').default} dashboardLang - The user language
- * @param {Object[]} permissions - The current permissions
- * @param {String} permissions.id
- * @param {Number} permissions.type
- * @param {Boolean} permissions.permission
- * @param {String} guildId - The guild id
- * @param {import('./util.js').Role[]} guildRoles - The guild roles
- */
-function createForm($, slashCommand, dashboardLang, permissions, guildId, guildRoles) {
-	var readonly = ( process.env.READONLY ? true : false );
-	var fields = [];
-	if ( !readonly ) {
-		$('<script>').text(`const i18nSlashPermission = ${JSON.stringify({
-			allow: dashboardLang.get('slash.form.allow'),
-			deny: dashboardLang.get('slash.form.deny'),
-			default: dashboardLang.get('slash.form.default')
-		})};`).insertBefore('script#indexjs');
-		let role = $('<div>').append(fieldset.role);
-		role.find('label').text(dashboardLang.get('slash.form.role'));
-		role.find('#wb-settings-addrole').append(
-			$(`<option id="wb-settings-channel-default" selected hidden>`).val('').text(dashboardLang.get('slash.form.select_role')),
-			...guildRoles.filter( guildRole => !permissions.some( perm => perm.id === guildRole.id ) ).map( guildRole => {
-				return $(`<option id="wb-settings-addrole-${guildRole.id}">`).val(guildRole.id).text(`${guildRole.id} – @${guildRole.name}`)
-			} ),
-			( permissions.some( perm => perm.id === guildId ) ? '' : $(`<option id="wb-settings-addrole-${guildId}">`).val(guildId).text(`@everyone`) )
-		);
-		role.find('#wb-settings-addrole-add').text(dashboardLang.get('slash.form.add'));
-		fields.push(role);
-	}
-	let perms = permissions.sort( (a, b) => {
-		if ( a.id === guildId ) return 1;
-		if ( b.id === guildId ) return -1;
-		return guildRoles.findIndex( guildRole => guildRole.id === a.id ) - guildRoles.findIndex( guildRole => guildRole.id === b.id );
-	} ).map( perm => {
-		let permission = $('<div>').append(fieldset.permission);
-		let span = permission.find('span').attr('title', perm.id);
-		if ( perm.id === guildId ) span.text('@everyone').attr('title', '@everyone');
-		else span.text(`@${( guildRoles.find( guildRole => guildRole.id === perm.id )?.name || 'UNKNOWN' )}`);
-		permission.find('input[name="permission"]').attr('name', `permission-${perm.id}`);
-		permission.find('input#wb-settings-permission-0').attr('id', `wb-settings-permission-${perm.id}-0`);
-		permission.find('label[for="wb-settings-permission-0"]').attr('for', `wb-settings-permission-${perm.id}-0`);
-		permission.find('input#wb-settings-permission-1').attr('id', `wb-settings-permission-${perm.id}-1`);
-		permission.find('label[for="wb-settings-permission-1"]').attr('for', `wb-settings-permission-${perm.id}-1`);
-		permission.find('input#wb-settings-permission-default').attr('id', `wb-settings-permission-${perm.id}-default`);
-		permission.find('label[for="wb-settings-permission-default"]').attr('for', `wb-settings-permission-${perm.id}-default`);
-		permission.find(`#wb-settings-permission-${perm.id}-${( perm.permission ? '1' : '0' )}`).attr('checked', '');
-		return permission;
-	} );
-	fields.push(...perms);
-	fields.push($(fieldset.save).val(dashboardLang.get('general.save')));
-	var form = $('<fieldset>').append(
-		$('<legend>').text(( slashCommand.default_permission ? dashboardLang.get('slash.form.default_allow') : dashboardLang.get('slash.form.default_deny') )),
-		...fields);
-	if ( readonly ) {
-		form.find('input').attr('readonly', '');
-		form.find('input[type="radio"]:not(:checked), option').attr('disabled', '');
-		form.find('input[type="submit"]').remove();
-	}
-	form.find('label.wb-settings-permission-deny').text(dashboardLang.get('slash.form.deny'));
-	form.find('label.wb-settings-permission-allow').text(dashboardLang.get('slash.form.allow'));
-	form.find('label.wb-settings-permission-default').text(dashboardLang.get('slash.form.default'));
-	return $('<form id="wb-settings" method="post" enctype="application/x-www-form-urlencoded">').append(
-		$('<h2>').html(dashboardLang.get('slash.form.entry', true, $('<code>').text('/' + slashCommand.name))),
-		form
-	);
-}
-
-/**
- * Let a user change slashs
- * @param {import('http').ServerResponse} res - The server response
- * @param {import('cheerio').default} $ - The response body
- * @param {import('./util.js').Guild} guild - The current guild
- * @param {String[]} args - The url parts
- * @param {import('./i18n.js').default} dashboardLang - The user language
- */
-function dashboard_slash(res, $, guild, args, dashboardLang) {
-	let suffix = ( args[0] === 'owner' ? '?owner=true' : '' );
-	$('#channellist #slash').after(
-		...slashCommands.filter( slashCommand => slashCommand.id ).map( slashCommand => {
-			return $('<a class="channel">').attr('id', `channel-${slashCommand.id}`).append(
-				$('<img>').attr('src', '/src/channel.svg'),
-				$('<div>').text(slashCommand.name)
-			).attr('title', slashCommand.name).attr('href', `/guild/${guild.id}/slash/${slashCommand.id}${suffix}`);
-		} )
-	);
-	if ( args[4] ) {
-		let slashCommand = slashCommands.find( slashCommand => args[4] === slashCommand.id );
-		if ( slashCommand ) return got.get( `https://discord.com/api/v8/applications/${process.env.bot}/guilds/${guild.id}/commands/${slashCommand.id}/permissions`, {
-			headers: {
-				Authorization: `Bot ${process.env.token}`
-			},
-			timeout: {
-				request: 10000
-			}
-		} ).then( response=> {
-			var permissions = [];
-			if ( response.statusCode !== 200 || !response.body ) {
-				if ( response.statusCode !== 404 || response.body?.message !== 'Unknown application command permissions' ) {
-					if ( response.statusCode === 403 && response.body?.message === 'Missing Access' ) {
-						createNotice($, 'noslash', dashboardLang, [guild.id]);
-					}
-					else {
-						console.log( '- Dashboard: ' + response.statusCode + ': Error while getting the slash command permissions: ' + response.body?.message );
-						createNotice($, 'error', dashboardLang);
-					}
-					$('#text .description').html(dashboardLang.get('slash.explanation'));
-					$('.channel#slash').addClass('selected');
-					return;
-				}
-				else if ( slashCommand.name === 'verify' ) return db.query( 'SELECT 1 FROM verification WHERE guild = $1 LIMIT 1', [guild.id] ).then( ({rows}) => {
-					if ( rows.length ) {
-						$('<p>').html(dashboardLang.get('slash.desc', true, $('<code>').text(guild.name))).appendTo('#text .description');
-						$(`.channel#channel-${slashCommand.id}`).addClass('selected');
-						createForm($, slashCommand, dashboardLang, permissions, guild.id, guild.roles).attr('action', `/guild/${guild.id}/slash/${slashCommand.id}`).appendTo('#text');
-						return;
-					}
-					res.writeHead(302, {Location: `/guild/${guild.id}/verification/new${suffix}` + ( suffix ? '&' : '?' ) + 'slash=noverify'});
-					res.end();
-					return true;
-				}, dberror => {
-					console.log( '- Dashboard: Error while checking for verifications: ' + dberror );
-					res.writeHead(302, {Location: `/guild/${guild.id}/verification/new${suffix}` + ( suffix ? '&' : '?' ) + 'slash=noverify'});
-					res.end();
-					return true;
-				} );
-			}
-			else permissions = response.body.permissions;
-			$('<p>').html(dashboardLang.get('slash.desc', true, $('<code>').text(guild.name))).appendTo('#text .description');
-			$(`.channel#channel-${slashCommand.id}`).addClass('selected');
-			createForm($, slashCommand, dashboardLang, permissions, guild.id, guild.roles).attr('action', `/guild/${guild.id}/slash/${slashCommand.id}`).appendTo('#text');
-		}, error => {
-			console.log( '- Dashboard: Error while getting the slash command permissions: ' + error );
-			createNotice($, 'error', dashboardLang);
-			$('#text .description').html(dashboardLang.get('slash.explanation'));
-			$('.channel#slash').addClass('selected');
-		} ).then( isRedirected => {
-			if ( isRedirected ) return;
-			let body = $.html();
-			res.writeHead(200, {'Content-Length': Buffer.byteLength(body)});
-			res.write( body );
-			return res.end();
-		} );
-	}
-	$('#text .description').html(dashboardLang.get('slash.explanation'));
-	$('.channel#slash').addClass('selected');
-	let body = $.html();
-	res.writeHead(200, {'Content-Length': Buffer.byteLength(body)});
-	res.write( body );
-	return res.end();
-}
-
-/**
- * Change slashs
- * @param {Function} res - The server response
- * @param {import('./util.js').Settings} userSettings - The settings of the user
- * @param {String} guild - The id of the guild
- * @param {String} type - The setting to change
- * @param {Object} settings - The new settings
- */
-function update_slash(res, userSettings, guild, type, settings) {
-	if ( !slashCommands.some( slashCommand => slashCommand.id === type ) ) {
-		return res(`/guild/${guild}/slash`, 'savefail');
-	}
-	if ( !settings.save_settings ) {
-		return res(`/guild/${guild}/slash/${type}`, 'savefail');
-	}
-	let roles = userSettings.guilds.isMember.get(guild).roles;
-	var permissions = Object.keys(settings).filter( perm => roles.some( role => ( 'permission-' + role.id === perm ) ) || perm === 'permission-' + guild ).map( perm => {
-		return {
-			id: perm.replace( 'permission-', '' ), type: 1,
-			permission: ( settings[perm] === '1' ? true : false )
-		};
-	} );
-	sendMsg( {
-		type: 'getMember',
-		member: userSettings.user.id,
-		guild: guild
-	} ).then( response => {
-		if ( !response ) {
-			userSettings.guilds.notMember.set(guild, userSettings.guilds.isMember.get(guild));
-			userSettings.guilds.isMember.delete(guild);
-			return res(`/guild/${guild}`, 'savefail');
-		}
-		if ( response === 'noMember' || !hasPerm(response.userPermissions, 'MANAGE_GUILD') ) {
-			userSettings.guilds.isMember.delete(guild);
-			return res('/', 'savefail');
-		}
-		var commandName = slashCommands.find( slashCommand => slashCommand.id === type )?.name;
-		return got.get( `https://discord.com/api/v8/applications/${process.env.bot}/guilds/${guild}/commands/${type}/permissions`, {
-			headers: {
-				Authorization: `Bot ${process.env.token}`
-			},
-			timeout: {
-				request: 10000
-			}
-		} ).then( response=> {
-			if ( response.statusCode !== 200 || !response.body ) {
-				if ( response.statusCode === 403 && response.body?.message === 'Missing Access' ) {
-					res(`/guild/${guild}/slash/${type}`, 'noslash', guild);
-					return Promise.reject();
-				}
-				else if ( response.statusCode !== 404 || response.body?.message !== 'Unknown application command permissions' ) {
-					console.log( '- Dashboard: ' + response.statusCode + ': Error while getting the old slash command permissions: ' + response.body?.message );
-				}
-				else if ( commandName === 'verify' ) return db.query( 'SELECT 1 FROM verification WHERE guild = $1 LIMIT 1', [guild] ).then( ({rows}) => {
-					if ( rows.length ) return [];
-					res(`/guild/${guild}/verification/new`, 'noverify');
-					return Promise.reject();
-				}, dberror => {
-					console.log( '- Dashboard: Error while checking for verifications: ' + dberror );
-					res(`/guild/${guild}/verification/new`, 'noverify');
-					return Promise.reject();
-				} );
-				return [];
-			}
-			return response.body.permissions;
-		}, error => {
-			console.log( '- Dashboard: Error while getting the old slash command permissions: ' + error );
-			return [];
-		} ).then( oldPermissions => {
-			return got.put( `https://discord.com/api/v8/applications/${process.env.bot}/guilds/${guild}/commands/${type}/permissions`, {
-				headers: {
-					Authorization: `Bot ${process.env.token}`
-				},
-				json: {permissions},
-				timeout: {
-					request: 10000
-				}
-			} ).then( response=> {
-				if ( response.statusCode !== 200 || !response.body ) {
-					console.log( '- Dashboard: ' + response.statusCode + ': Error while saving the slash command permissions: ' + response.body?.message );
-					return res(`/guild/${guild}/slash/${type}`, 'savefail');
-				}
-				res(`/guild/${guild}/slash/${type}`, 'save');
-				var changes = [
-					...permissions.map( perm => {
-						var oldPerm = oldPermissions.find( oldPerm => oldPerm.id === perm.id );
-						if ( !oldPerm ) return {
-							role: ( perm.id === guild ? '@everyone' : `<@&${perm.id}>` ),
-							old: 'default',
-							new: ( perm.permission ? 'allow' : 'deny' )
-						};
-						if ( perm.permission === oldPerm.permission ) return null;
-						return {
-							role: ( perm.id === guild ? '@everyone' : `<@&${perm.id}>` ),
-							old: ( oldPerm.permission ? 'allow' : 'deny' ),
-							new: ( perm.permission ? 'allow' : 'deny' )
-						};
-					} ).filter( change => change ),
-					...oldPermissions.filter( oldPerm => !permissions.some( perm => perm.id === oldPerm.id ) ).map( oldPerm => {
-						return {
-							role: ( oldPerm.id === guild ? '@everyone' : `<@&${oldPerm.id}>` ),
-							old: ( oldPerm.permission ? 'allow' : 'deny' ),
-							new: 'default'
-						};
-					} )
-				];
-				if ( !changes.length ) return;
-				return db.query( 'SELECT lang FROM discord WHERE guild = $1 AND channel IS NULL', [guild] ).then( ({rows:[channel]}) => {
-					var lang = new Lang(channel?.lang);
-					var text = lang.get('interaction.dashboard.updated', `<@${userSettings.user.id}>`, '/' + commandName);
-					text += '\n' + changes.map( change => {
-						return change.role + ': ~~`' + lang.get('interaction.dashboard.perm_' + change.old) + '`~~ → `' + lang.get('interaction.dashboard.perm_' + change.new) + '`';
-					} ).join('\n');
-					text += `\n<${new URL(`/guild/${guild}/slash/${type}`, process.env.dashboard).href}>`;
-					sendMsg( {
-						type: 'notifyGuild', guild, text
-					} ).catch( error => {
-						console.log( '- Dashboard: Error while notifying the guild: ' + error );
-					} );
-				}, dberror => {
-					console.log( '- Dashboard: Error while notifying the guild: ' + dberror );
-				} );
-			}, error => {
-				console.log( '- Dashboard: Error while saving the slash command permissions: ' + error );
-				return res(`/guild/${guild}/slash/${type}`, 'savefail');
-			} );
-		}, error => {
-			if ( error ) {
-				console.log( '- Dashboard: Error while getting the old slash command permissions: ' + error );
-				return res(`/guild/${guild}/slash/${type}`, 'savefail');
-			}
-		} );
-	}, error => {
-		console.log( '- Dashboard: Error while getting the member: ' + error );
-		return res(`/guild/${guild}/slash/${type}`, 'savefail');
-	} );
-}
-
-export {
-	dashboard_slash as get,
-	update_slash as post
-};

+ 0 - 46
dashboard/src/index.js

@@ -499,52 +499,6 @@ if ( prefix ) prefix.addEventListener( 'input', function() {
 	else prefix.setCustomValidity('');
 } );
 
-/** @type {HTMLSelectElement} */
-const addRole = document.getElementById('wb-settings-addrole');
-/** @type {HTMLButtonElement} */
-const addRoleButton = document.getElementById('wb-settings-addrole-add');
-if ( addRole && addRoleButton ) addRoleButton.onclick = function() {
-	if ( addRole.value ) {
-		var selectedRole = addRole.selectedOptions.item(0);
-		var newPermission = document.createElement('div');
-		var selectedRoleInfo = selectedRole.textContent.split(' – ');
-		var newPermissionSpan = document.createElement('span');
-		newPermissionSpan.textContent = ( selectedRoleInfo[1] || selectedRoleInfo[0] );
-		newPermissionSpan.title = selectedRoleInfo[0];
-		var newPermissionDiv0 = document.createElement('div');
-		newPermissionDiv0.classList.add('wb-settings-permission');
-		var newPermissionInput = document.createElement('input');
-		newPermissionInput.type = 'radio';
-		newPermissionInput.name = 'permission-' +  addRole.value;
-		newPermissionInput.required = true;
-		newPermissionDiv0.append(newPermissionInput, document.createElement('label'));
-		/** @type {HTMLDivElement} */
-		var newPermissionDiv1 = newPermissionDiv0.cloneNode(true);
-		/** @type {HTMLDivElement} */
-		var newPermissionDiv2 = newPermissionDiv0.cloneNode(true);
-		newPermissionDiv0.firstElementChild.id = 'wb-settings-permission-' + addRole.value + '-0';
-		newPermissionDiv1.firstElementChild.id = 'wb-settings-permission-' + addRole.value + '-1';
-		newPermissionDiv2.firstElementChild.id = 'wb-settings-permission-' + addRole.value + '-default';
-		newPermissionDiv0.firstElementChild.value = '0';
-		newPermissionDiv1.firstElementChild.value = '1';
-		newPermissionDiv2.firstElementChild.value = '';
-		newPermissionDiv0.lastElementChild.htmlFor = 'wb-settings-permission-' + addRole.value + '-0';
-		newPermissionDiv1.lastElementChild.htmlFor = 'wb-settings-permission-' + addRole.value + '-1';
-		newPermissionDiv2.lastElementChild.htmlFor = 'wb-settings-permission-' + addRole.value + '-default';
-		newPermissionDiv0.lastElementChild.classList.add('wb-settings-permission-deny', 'radio-label');
-		newPermissionDiv1.lastElementChild.classList.add('wb-settings-permission-allow', 'radio-label');
-		newPermissionDiv2.lastElementChild.classList.add('wb-settings-permission-default', 'radio-label');
-		newPermissionDiv0.lastElementChild.textContent = i18nSlashPermission.deny;
-		newPermissionDiv1.lastElementChild.textContent = i18nSlashPermission.allow;
-		newPermissionDiv2.lastElementChild.textContent = i18nSlashPermission.default;
-		newPermissionDiv2.firstElementChild.defaultChecked = true;
-		newPermission.append(newPermissionSpan, newPermissionDiv0, newPermissionDiv1, newPermissionDiv2);
-		addRole.parentElement.after(newPermission);
-		selectedRole.remove();
-		addRole.firstElementChild.selected = true;
-	}
-};
-
 var textAreas = document.getElementsByTagName('textarea');
 if ( textAreas.length ) {
 	/** @type {HTMLTextAreaElement} */

+ 1 - 1
dashboard/user.js

@@ -3,7 +3,7 @@ import { db, enabledOAuth2 } from './util.js';
 /**
  * Let a user change settings
  * @param {import('http').ServerResponse} res - The server response
- * @param {import('cheerio').default} $ - The response body
+ * @param {import('cheerio').CheerioAPI} $ - The response body
  * @param {import('./util.js').User} user - The current user
  * @param {import('./i18n.js').default} dashboardLang - The user language
  */

+ 4 - 44
dashboard/util.js

@@ -2,9 +2,6 @@ import gotDefault from 'got';
 import pg from 'pg';
 import DiscordOauth2 from 'discord-oauth2';
 import { oauthSites } from '../util/wiki.js';
-import { createRequire } from 'module';
-const require = createRequire(import.meta.url);
-const slashCommands = require('../interactions/commands.json');
 
 globalThis.isDebug = ( process.argv[2] === 'debug' );
 
@@ -58,31 +55,6 @@ if ( process.env.oauth_wikimedia && process.env.oauth_wikimedia_secret ) {
 	});
 }
 
-got.get( `https://discord.com/api/v8/applications/${process.env.bot}/commands`, {
-	headers: {
-		Authorization: `Bot ${process.env.token}`
-	},
-	timeout: {
-		request: 10000
-	}
-} ).then( response=> {
-	if ( response.statusCode !== 200 || !response.body ) {
-		console.log( '- Dashboard: ' + response.statusCode + ': Error while getting the global slash commands: ' + response.body?.message );
-		return;
-	}
-	console.log( '- Dashboard: Slash commands successfully loaded.' );
-	response.body.forEach( command => {
-		var slashCommand = slashCommands.find( slashCommand => slashCommand.name === command.name );
-		if ( slashCommand ) {
-			slashCommand.id = command.id;
-			slashCommand.application_id = command.application_id;
-		}
-		else slashCommands.push(slashCommand);
-	} );
-}, error => {
-	console.log( '- Dashboard: Error while getting the global slash commands: ' + error );
-} );
-
 /**
  * @typedef UserSession
  * @property {String} state
@@ -233,9 +205,9 @@ if ( process.env.botlist ) {
 
 /**
  * Add bot list widgets.
- * @param {import('cheerio').default} $ - The cheerio static
+ * @param {import('cheerio').CheerioAPI} $ - The cheerio static
  * @param {import('./i18n.js').default} dashboardLang - The user language
- * @returns {import('cheerio').default}
+ * @returns {import('cheerio').CheerioAPI}
 */
 function addWidgets($, dashboardLang) {
 	if ( !botLists.length ) return;
@@ -248,11 +220,11 @@ function addWidgets($, dashboardLang) {
 
 /**
  * Create a red notice
- * @param {import('cheerio').default} $ - The cheerio static
+ * @param {import('cheerio').CheerioAPI} $ - The cheerio static
  * @param {String} notice - The notice to create
  * @param {import('./i18n.js').default} dashboardLang - The user language
  * @param {String[]} [args] - The arguments for the notice
- * @returns {import('cheerio').default}
+ * @returns {import('cheerio').CheerioAPI}
  */
 function createNotice($, notice, dashboardLang, args = []) {
 	if ( !notice ) return;
@@ -347,17 +319,6 @@ function createNotice($, notice, dashboardLang, args = []) {
 			title.text(dashboardLang.get('notice.invalidusergroup.title'));
 			text.text(dashboardLang.get('notice.invalidusergroup.text'));
 			break;
-		case 'noverify':
-			type = 'info';
-			title.text(dashboardLang.get('notice.noverify.title'));
-			text.html(dashboardLang.get('notice.noverify.text', true, $('<code>').text('/verify')));
-			break;
-		case 'noslash':
-			type = 'error';
-			title.text(dashboardLang.get('notice.noslash.title'));
-			text.text(dashboardLang.get('notice.noslash.text'));
-			note = $('<a target="_blank">').text(dashboardLang.get('notice.noslash.note')).attr('href', `https://discord.com/api/oauth2/authorize?client_id=${process.env.bot}&scope=applications.commands&guild_id=${args[0]}&disable_guild_select=true`);
-			break;
 		case 'wikiblocked':
 			type = 'error';
 			title.text(dashboardLang.get('notice.wikiblocked.title'));
@@ -454,7 +415,6 @@ export {
 	db,
 	oauth,
 	enabledOAuth2,
-	slashCommands,
 	sessionData,
 	settingsData,
 	oauthVerify,

+ 7 - 4
dashboard/verification.js

@@ -1,9 +1,8 @@
 import Lang from '../util/i18n.js';
-import { got, db, slashCommands, sendMsg, createNotice, escapeText, hasPerm } from './util.js';
+import { got, db, sendMsg, createNotice, escapeText, hasPerm } from './util.js';
 import { createRequire } from 'module';
 const require = createRequire(import.meta.url);
 const {limit: {verification: verificationLimit}, usergroups} = require('../util/default.json');
-const slashCommand = slashCommands.find( slashCommand => slashCommand.name === 'verify' );
 
 const fieldset = {
 	channel: '<div>'
@@ -60,7 +59,7 @@ const fieldset = {
 
 /**
  * Create a settings form
- * @param {import('cheerio').default} $ - The response body
+ * @param {import('cheerio').CheerioAPI} $ - The response body
  * @param {String} header - The form header
  * @param {import('./i18n.js').default} dashboardLang - The user language
  * @param {Object} settings - The current settings
@@ -248,7 +247,7 @@ function createForm($, header, dashboardLang, settings, guildChannels, guildRole
 /**
  * Let a user change verifications
  * @param {import('http').ServerResponse} res - The server response
- * @param {import('cheerio').default} $ - The response body
+ * @param {import('cheerio').CheerioAPI} $ - The response body
  * @param {import('./util.js').Guild} guild - The current guild
  * @param {String[]} args - The url parts
  * @param {import('./i18n.js').default} dashboardLang - The user language
@@ -520,6 +519,7 @@ function update_verification(res, userSettings, guild, type, settings) {
 		if ( settings.delete_settings ) return db.query( 'DELETE FROM verification WHERE guild = $1 AND configid = $2 RETURNING channel, role, editcount, postcount, usergroup, accountage, rename', [guild, type] ).then( ({rows:[row]}) => {
 			console.log( `- Dashboard: Verification successfully removed: ${guild}#${type}` );
 			res(`/guild/${guild}/verification`, 'save');
+			/*
 			if ( slashCommand?.id ) db.query( 'SELECT COUNT(1) FROM verification WHERE guild = $1', [guild] ).then( ({rows:[{count}]}) => {
 				if ( count > 0 ) return;
 				got.put( 'https://discord.com/api/v8/applications/' + process.env.bot + '/guilds/' + guild + '/commands/' + slashCommand.id + '/permissions', {
@@ -544,6 +544,7 @@ function update_verification(res, userSettings, guild, type, settings) {
 			}, dberror => {
 				console.log( '- Dashboard: Error while disabling the slash command: ' + dberror );
 			} );
+			*/
 			if ( row ) db.query( 'SELECT lang FROM discord WHERE guild = $1 AND channel IS NULL', [guild] ).then( ({rows:[channel]}) => {
 				var lang = new Lang(channel.lang);
 				var text = lang.get('verification.dashboard.removed', `<@${userSettings.user.id}>`, type);
@@ -626,6 +627,7 @@ function update_verification(res, userSettings, guild, type, settings) {
 				db.query( 'INSERT INTO verification(guild, configid, channel, role, editcount, postcount, usergroup, accountage, rename) VALUES($1, $2, $3, $4, $5, $6, $7, $8, $9)', [guild, configid, '|' + channels.join('|') + '|', roles.map( role => role.prefix + role.id ).join('|'), settings.editcount, settings.postcount, settings.usergroup.join('|'), settings.accountage, ( settings.rename ? 1 : 0 )] ).then( () => {
 					console.log( `- Dashboard: Verification successfully added: ${guild}#${configid}` );
 					res(`/guild/${guild}/verification/${configid}`, 'save');
+					/*
 					if ( !row.count.length && slashCommand?.id ) got.put( 'https://discord.com/api/v8/applications/' + process.env.bot + '/guilds/' + guild + '/commands/' + slashCommand.id + '/permissions', {
 						headers:{
 							Authorization: 'Bot ' + process.env.token
@@ -651,6 +653,7 @@ function update_verification(res, userSettings, guild, type, settings) {
 					}, error => {
 						console.log( '- Dashboard: Error while enabling the slash command: ' + error );
 					} );
+					*/
 					var lang = new Lang(row.lang);
 					var text = lang.get('verification.dashboard.added', `<@${userSettings.user.id}>`, configid);
 					text += '\n' + lang.get('verification.channel') + ' <#' + channels.join('>, <#') + '>';

+ 3 - 3
functions/global_block.js

@@ -1,4 +1,4 @@
-import cheerio from 'cheerio';
+import { load as cheerioLoad } from 'cheerio';
 import { got, escapeFormatting } from '../util/functions.js';
 
 /**
@@ -37,7 +37,7 @@ export default function global_block(lang, msg, username, text, embed, wiki, spo
 				console.log( '- ' + response.statusCode + ': Error while getting the global block.' );
 			}
 			else {
-				let $ = cheerio.load(body);
+				let $ = cheerioLoad(body);
 				if ( $('#mw-content-text .errorbox').length ) {
 					if ( embed && msg.showEmbed() ) embed.addField( '\u200b', '**' + lang.get('user.gblock.disabled') + '**' );
 					else text += '\n\n**' + lang.get('user.gblock.disabled') + '**';
@@ -58,7 +58,7 @@ export default function global_block(lang, msg, username, text, embed, wiki, spo
 				console.log( '- ' + gresponse.statusCode + ': Error while getting the global edit count.' );
 			}
 			else {
-				let $ = cheerio.load(gbody);
+				let $ = cheerioLoad(gbody);
 				var wikisedited = $('.curseprofile .rightcolumn .section.stats dd').eq(0).text().replace( /[,\.]/g, '' );
 				if ( wikisedited ) {
 					wikisedited = parseInt(wikisedited, 10).toLocaleString(lang.get('dateformat'));

+ 3 - 2
functions/parse_page.js

@@ -1,4 +1,4 @@
-import cheerio from 'cheerio';
+import { load as cheerioLoad } from 'cheerio';
 import { MessageEmbed } from 'discord.js';
 import { toSection } from '../util/wiki.js';
 import { got, parse_infobox, htmlToPlain, htmlToDiscord, escapeFormatting, limitLength } from '../util/functions.js';
@@ -52,6 +52,7 @@ const removeClasses = [
 	'.noexcerpt',
 	'.sortkey',
 	'.mw-collapsible.mw-collapsed',
+	'.c-item-hoverbox__display',
 	'wb\\:sectionedit'
 ];
 
@@ -269,7 +270,7 @@ export default function parse_page(lang, msg, content, embed, wiki, reaction, {n
 				if ( displaytitle.length > 250 ) displaytitle = displaytitle.substring(0, 250) + '\u2026';
 				embed.setTitle( displaytitle );
 			}
-			var $ = cheerio.load(response.body.parse.text['*'].replace( /\n?<br(?: ?\/)?>\n?/g, '<br>' ));
+			var $ = cheerioLoad(response.body.parse.text['*'].replace( /\n?<br(?: ?\/)?>\n?/g, '<br>' ));
 			if ( embed.brokenInfobox && $('aside.portable-infobox').length ) {
 				let infobox = $('aside.portable-infobox');
 				embed.fields.forEach( field => {

+ 2 - 2
functions/verify.js

@@ -1,4 +1,4 @@
-import cheerio from 'cheerio';
+import { load as cheerioLoad } from 'cheerio';
 import { MessageEmbed, MessageActionRow, MessageButton, Permissions } from 'discord.js';
 import db from '../util/database.js';
 import Lang from '../util/i18n.js';
@@ -124,7 +124,7 @@ export default function verify(lang, channel, member, username, wiki, rows, old_
 				comment.push(lang.get('verify.failed_gblock'));
 			}
 			else {
-				let $ = cheerio.load(gbresponse.body);
+				let $ = cheerioLoad(gbresponse.body);
 				if ( $('#mw-content-text .errorbox').length ) {
 					return Promise.reject({
 						desc: lang.get('verify.user_disabled', '[' + escapeFormatting(username) + '](' + pagelink + ')'),

+ 5 - 0
i18n/allLangs.json

@@ -7,6 +7,7 @@
 			"es": "Español (es)",
 			"fr": "Français (fr)",
 			"hi": "हिन्दी (hi)",
+			"id": "Bahasa Indonesia (id)",
 			"it": "Italiano (it)",
 			"ko": "한국어 (ko)",
 			"pl": "Polski (pl)",
@@ -45,6 +46,10 @@
 			"hindi": "hi",
 			"हिन्दी": "hi",
 			"हिन्दी (hi)": "hi",
+			"id": "id",
+			"indonesian":"id",
+			"bahasa indonesia": "id",
+			"bahasa indonesia (id)": "id",
 			"it": "it",
 			"italian":"it",
 			"italiano": "it",

+ 15 - 8
i18n/bn.json

@@ -1,6 +1,6 @@
 {
     "__translator": [
-        "ThisIsACreeper0101",
+        "Saurmandal",
         "R4356th",
         " ",
         " ",
@@ -138,7 +138,7 @@
         "votes": "$1 {{PLURAL:$2|ভোট|টি ভোট}} ($3%)"
     },
     "fallback": [
-        " ",
+        "en",
         " ",
         " ",
         " ",
@@ -393,12 +393,6 @@
         "pause": "**আমাকে এই সময় এই সার্ভারে পজ করা হয়েছে!**\nশুধু এই কমান্ডগুলোর ব্যাবহার করা যাবে:"
     },
     "interaction": {
-        "dashboard": {
-            "perm_allow": "অনুমতি দিন",
-            "perm_default": "ডিফল্ট",
-            "perm_deny": "অস্বীকার করুন",
-            "updated": "$1 `$2`এর জন্যে স্ল্যাশ কমান্ড অনুমতি ওভার্রাইট আপডেট করলো।"
-        },
         "inline": "এই কমাণ্ডের ব্যবহার করার জন্যে অনুগ্রহ করে [[উইকিটেক্সট]] লিংক দিয়ে কোনো টেক্সট দেন।",
         "nowiki": "ব্যবহৃত উইকিটি পাওয়া যাচ্ছে না!",
         "verify": "এই কমান্ডের ব্যাবহার করে নিজের ডিসকোর্ড একাউন্টকে উইকি একাউন্টের সঙ্গে সংযোগ করে রোল পাওয়ার জন্যে অনুগ্রহ করে নিজের উইকি একাউন্টের নাম দিন।"
@@ -591,6 +585,8 @@
         "infosearch": "সঠিক উত্তর না? ডাইরেক্ট লিংকের জন্যে $1এর বা সব ফলাফলের জন্যে $2এর ব্যাবহার করুন।",
         "loading": "পৃষ্ঠের বর্ণনা লোড হচ্ছে…",
         "media": "বর্ণনা পৃষ্ঠ পর্যন্ত",
+        "messagedefault": "ডিফল্ট:",
+        "messagedefaultnone": "*কোনও*",
         "results": "$1 total {{PLURAL:$2|ফল|টি ফল}}",
         "special": "এই বিশেষ পৃষ্ঠের কনটেন্ট:"
     },
@@ -658,6 +654,7 @@
         "MediaWiki": "পুরোপুরি কাজ করার জন্যে কমপক্ষে $1 লাগবে, `$2` পাওয়া গেলো।",
         "notice": "সীমিত কাজ",
         "pause": "আমাকে এই সময় এই সার্ভারে প'জ করে রাখা হয়েছে।",
+        "slow": "দুঃখিত, আমি এখন একটু ধীর মনে হচ্ছে.",
         "text": [
             "আমি পুরোপুরি কাজ করছি!",
             "আমি এখনও জেন্ত! ",
@@ -808,9 +805,19 @@
         "help_fandom": "https://community.fandom.com/wiki/Special:VerifyUser",
         "help_gamepedia": "https://help.fandom.com/Gamepedia_Help_Wiki:Discord_verification",
         "help_guide": "নিজের প্রোফাইলে ডিসকর্ড ট্যাগ লাগানোর জন্যে [এই গাইডে]($1)র ব্যাবহার করুন:",
+        "help_missing": "অনুগ্রহ করে নিশ্চিত করুন যে আপনি আপনার উইকি ব্যবহারকারী নাম ব্যবহার করছেন এবং কেসিং সঠিক।",
         "help_subpage": "অনুগ্রহ করে নিজের ডিসকর্ড ট্যাগ ($1) নিজের Discord উপপৃষ্ঠে লাগান:",
         "missing": "এই চ্যানেলের জন্যে কোনও ভেরিফিকেশন নেই।",
         "notice": "বিজ্ঞপ্তি:",
+        "oauth_button": "প্রমাণীকরণ",
+        "oauth_message": "আপনার উইকি অ্যাকাউন্ট প্রমাণীকরণ করতে অনুগ্রহ করে [এই লিঙ্ক]($1) ব্যবহার করুন।",
+        "oauth_message_dm": "অনুগ্রহ করে এই লিঙ্কটি ব্যবহার করুন আপনার উইকি অ্যাকাউন্টকে $1 -এর জন্য প্রমাণীকরণ করতে।",
+        "oauth_private": "এই উইকি যাচাইয়ের জন্য ওঅথ২ ব্যবহার করে। অনুগ্রহ করে এই সার্ভার থেকে সরাসরি বার্তা সক্রিয় করুন বা `/verify` কমান্ড ব্যবহার করুন যাতে আমি আপনাকে ব্যক্তিগতভাবে একটি প্রমাণীকরণ লিঙ্ক পাঠাতে পারি।",
+        "oauth_used": "*ওঅথ২ ব্যবহার করে যাচাই করা হয়েছে*",
+        "qualified_add": "যোগ করো:",
+        "qualified_add_error": "যোগ করা যাবে না:",
+        "qualified_remove": "সরানো হয়েছে:",
+        "qualified_remove_error": "সরানো যাবে না:",
         "user_blocked": "**উইকি ব্যাবহারকারি $1 ব্লক্ড!**",
         "user_blocked_reply": "আপনি লিংক করা উইকি ব্যাবহারকারি **\"$1\" ব্লক্ড!**",
         "user_disabled": "**উইকি ব্যাবহারকারি $1 অক্ষম!**",

+ 0 - 6
i18n/de.json

@@ -393,12 +393,6 @@
         "pause": "**Ich bin auf diesem Server derzeit pausiert!**\nNur diese Befehle können ausgeführt werden:"
     },
     "interaction": {
-        "dashboard": {
-            "perm_allow": "Erlaubt",
-            "perm_default": "Standard",
-            "perm_deny": "Verboten",
-            "updated": "$1 hat die Berechtigungen für `$2` bearbeitet."
-        },
         "inline": "Bitte gebe einen Text mit [[Wikitext]]-Links an um diesen Befehl zu nutzen.",
         "nowiki": "Das genutzte Wiki existiert nicht!",
         "verify": "Bitte gebe deinen Wiki-Benutzernamen an um diesen Befehl dazu zu nutzen, deinen Discord-Account mit deinem Wiki-Account zu verifizieren und Rollen passend zu deinem Wiki-Account zu erhalten."

+ 0 - 6
i18n/en.json

@@ -393,12 +393,6 @@
         "pause": "**I'm currently paused on this server!**\nOnly these commands can be performed:"
     },
     "interaction": {
-        "dashboard": {
-            "perm_allow": "Allow",
-            "perm_default": "Default",
-            "perm_deny": "Deny",
-            "updated": "$1 updated the slash command permission overwrites for `$2`."
-        },
         "inline": "Please provide some text with [[wikitext]] links to use this command.",
         "nowiki": "The used wiki doesn't exist!",
         "verify": "Please provide your wiki username to use this command to verify your Discord account with your wiki account and get roles matching your wiki account."

+ 0 - 6
i18n/es.json

@@ -393,12 +393,6 @@
         "pause": "**¡Actualmente estoy en pausa en este servidor!**\nSolo se pueden ejecutar estos comandos:"
     },
     "interaction": {
-        "dashboard": {
-            "perm_allow": "Permitir",
-            "perm_default": "Predeterminado",
-            "perm_deny": "Negar",
-            "updated": "$1 actualizó el permiso del comando de barra inclinada sobreescrito para `$2`."
-        },
         "inline": "Por favor proporciona un texto con enlaces de [[wikitexto]] para usar este comando.",
         "nowiki": "¡El wiki usado no existe!",
         "verify": "Por favor proporciona tu nombre de usuario wiki para usar este comando para verificar tu cuenta en Discord con tu cuenta wiki y obtener roles que coincidan con tu cuenta wiki."

+ 1 - 1
i18n/fr.json

@@ -636,7 +636,7 @@
         "wikichanged": "le wiki par défaut a été changé pour :",
         "wikihelp": "Utilisez `$1 <lien>` pour changer le wiki par défaut.\nLien du wiki : `https://<wiki>.fandom.com/`",
         "wikiinvalid": "veuillez fournir un lien valide vers un wiki de Fandom ou Wikipedia !",
-        "wikiinvalid_http": "le site web fourni ne dispose pas d'un certificat TLS/SSL valide ! Pour des raisons de sécurité, seuls les wikis utilisant le protocole HTTPS sont pris en charge.\nSi vous êtes un administrateur de site, vous pouvez obtenir un certificat auprès d'une autorité de certification comme *Let's Encrypt* :\n<https://letsencrypt.org/getting-started/>",
+        "wikiinvalid_http": "le site web fourni ne dispose pas d'un certificat TLS/SSL valide ! Pour des raisons de sécurité, seuls les wikis utilisant le protocole HTTPS sont pris en charge.\nSi vous êtes un administrateur de site, vous pouvez obtenir un certificat auprès d'une autorité de certification comme *Lets Encrypt* :\n<https://letsencrypt.org/getting-started/>",
         "wikiinvalid_private": "le wiki fourni est privé ! Seuls les wikis publics qui peuvent être lus par tout le monde sont pris en charge.",
         "wikiinvalid_timeout": "le lien fourni a mis trop de temps à répondre !",
         "wikimissing": "aucun wiki n'est encore défini pour ce serveur !"

+ 409 - 412
i18n/hi.json

@@ -1,6 +1,6 @@
 {
     "__translator": [
-        "ThisIsACreeper0101",
+        "Saurmandal",
         " ",
         " ",
         " ",
@@ -14,7 +14,7 @@
     "aliases": {
         "bug": [
             "बग",
-            " ",
+            "समस्या",
             " ",
             " ",
             " "
@@ -28,14 +28,14 @@
         ],
         "diff": [
             "डिफ",
-            " ",
+            "अंतर",
             " ",
             " ",
             " "
         ],
         "discussion": [
-            "डिसकशंस",
             "डिस्कशन",
+            "चर्चा",
             " ",
             " ",
             " "
@@ -48,21 +48,21 @@
             " "
         ],
         "info": [
+            "इन्फो",
             "जानकारी",
             " ",
             " ",
-            " ",
             " "
         ],
         "invite": [
             "इनवाइट",
-            " ",
+            "आमंत्रण",
             " ",
             " ",
             " "
         ],
         "overview": [
-            "जानकारी",
+            "अवलोकन",
             " ",
             " ",
             " ",
@@ -83,7 +83,7 @@
             " "
         ],
         "search": [
-            "तलाश",
+            "खोज",
             " ",
             " ",
             " ",
@@ -91,20 +91,20 @@
         ],
         "test": [
             "टेस्ट",
-            " ",
-            " ",
+            "परीक्षण",
+            "पिंग",
             " ",
             " "
         ],
         "user": [
-            "यूज़र",
             "सदस्य",
             " ",
             " ",
+            " ",
             " "
         ],
         "verify": [
-            "वेरीफाई",
+            "प्रमाण",
             " ",
             " ",
             " ",
@@ -113,29 +113,29 @@
     },
     "dateformat": "hi-IN",
     "diff": {
-        "badrev": "कम से कम एक रिवीशन नहीं है!",
-        "hidden": "*छिपाया गया*",
+        "badrev": "कम से कम एक अवतरण मौजूद नहीं है!",
+        "hidden": "छिपाया गया",
         "info": {
             "added": "जोड़ा:",
-            "bytes": "$1 {{PLURAL:$2|बाइट|बाइट}}",
-            "comment": "कमेंट:",
-            "editor": "सदस्य:",
+            "bytes": "$1 {{PLURAL:$2|बाइट}}",
+            "comment": "टिप्पणी:",
+            "editor": "संपादक:",
             "minor": "_(छो)",
-            "more": "और भी",
+            "more": "अधिक",
             "removed": "हटाया:",
             "size": "अंतर:",
             "tags": "टैग:",
-            "timestamp": "सम्पादना की तारीख:",
+            "timestamp": "संपादन की तारीख:",
             "whitespace": "सिर्फ वाइटस्पेस"
         },
-        "nocomment": "*कोई विवरण नहीं दिया गया*"
+        "nocomment": "कोई विवरण नहीं दिया गया"
     },
     "discussion": {
         "image": "चित्र देखें",
-        "main": "डिसकशंस",
+        "main": "चर्चा",
         "post": "पोस्ट",
-        "tags": "टैग:",
-        "votes": "$1 {{PLURAL:$2|वोट|वोट}} ($3%)"
+        "tags": "टैग्स:",
+        "votes": "$1 {{PLURAL:$2|वोट}} ($3%)"
     },
     "fallback": [
         "en",
@@ -145,67 +145,67 @@
         " "
     ],
     "general": {
-        "database": "⚠️ **सीमित सुविधाएँ** ⚠️\nकोई सेटिंग नहीं मिला, कृपया बॉट के मालिक से संपर्क करें!",
-        "default": "इस सर्वर को अभी तक सेट नहीं किया गया है। सेटिंग्स बदलने के लिए $1 या डैशबोर्ड का इस्तेमाल करें।",
-        "disclaimer": "मैं एक छोटा बॉट हूँ जो आसानी से विकिपीडिया और फैनडम विकियों जैसे मीडियाविकि साइटों को खोज और लिंक कर सकता हूँ। मैं पृष्ठों के बारे में छोटे विस्तार और अतिरिक्त विवरण दिखा सकता हूँ और इंटरविकी लिंक को फॉलो कर और दुने-रेडिरेक्टों को सुलझा सकता हूँ। $1 ने मुझे जावास्क्रिप्ट पर लिखा।\n\nआप मेरी पैट्रियॉन पर मदद कर सकते हैं:",
-        "experimental": "**यह फीचर परीक्षाणित है! यह काम न भी कर सकता है और भविष्य में इसे हटा भी दिया जा सकता है।**",
-        "helpserver": "कोई सवाल हो तो मेरे सहायता सर्वर में शामिल हो जाएँ:",
-        "limit": "🚨 **रुकिए, आप हद तक आ चुके हैं** 🚨\n\n$1, आपके मैसेज पर कुछ ज़्यादा ही कमांड हैं!",
-        "missingperm": "मुझे इस कमांड के लिए कुछ और अनुमतियाँ चाहिए:",
-        "patreon": "यह एक पैट्रियॉन विशिष्ट फीचर है!\nआप इस फीचर को पाने के लिए मेरी पैट्रियॉन पर मदद कर सकते हैं:",
-        "prefix": "इस सर्वर का उपसर्ग है `$1`. आप उपसर्ग को `$1settings prefix` की मदद से बदल सकते हैं। सारे कमांडों के सूचि के लिए `$1help` देखें।",
-        "readonly": "**डेटाबेस अब बस रीड-ओनली मोड में है; आप इस समय कोई भी बदलाव नहीं ला सकतें!**"
+        "database": "⚠️ **सीमित कार्यक्षमता** ⚠️\nकोई सेटिंग नहीं मिला, कृपया बॉट के मालिक से संपर्क करें!",
+        "default": "इस सर्वर को अभी तक सेट नहीं किया गया है। सेटिंग्स को बदलने के लिए $1 या डैशबोर्ड का इस्तेमाल करें।",
+        "disclaimer": "मैं एक छोटा-सा बॉट हूँ जिसका काम है आसानी से विकिपीडिया, और Fandom विकियों जैसे मीडियाविकि साइटों की कड़ी जोड़ना और उन पर खोजना। मैं पृष्ठों के बारे में छोटे विवरण और अतिरिक्त जानकारी दिखाता हूँ, और साथ में अनुप्रेषण और इंटरविकि कड़ियों के पीछे जा सकता हूँ। $1 ने मुझे जावास्क्रिप्ट में लिखा है।\n\nआप Patreon पर मेरी मदद कर सकते हैं:",
+        "experimental": "**इस सुविधा पर अब भी परीक्षण चल रही है! यह ठीक से काम न कर सकता है, और शायद भविष्य में इसे हटा ही दिया जाए।**",
+        "helpserver": "सवालों और समस्याओं के लिए कृपया मेरे सहायता सर्वर पर जाएँ:",
+        "limit": "🚨 **रुकिए, आप एक सीमा पर आ गए हैं!** 🚨\n\n$1, आपके संदेश पर कुछ ज़्यादा ही कमांड्स थे!",
+        "missingperm": "मेरे पास इस कमांड के लिए अनुमतियाँ कुछ कम हैं:",
+        "patreon": "यह सुविधा सिर्फ Patreon के लिए है!\nआप इस सुविधा का इस्तेमाल करने के लिए Patreon पर मेरी मदद कर सकते हैं:",
+        "prefix": "इस सर्वर का उपसर्ग है `$1`। आप `$1settings prefix` से उपसर्ग बदल सकते हैं। सभी कमांड्स की सूची के लिए `$1help` देखें।",
+        "readonly": "**इस समय में डेटाबेस को सिर्फ पढ़ा जा सकता है, तो आप अभी कोई भी सेटिंग नहीं बदल सकते!**"
     },
     "help": {
-        "admin": "इन कमांडों का बस एडमिनिस्ट्रेटरों द्वारा इस्तेमाल किया जा सकता है:",
-        "adminfooter": "एडमिनिस्ट्रेटर बॉट सेटिंग्स बदलने के लिए डैशबोर्ड का भी इस्तेमाल कर सकते हैं:",
-        "all": "तो, आप जानना चाहते हैं कि माँ क्या-क्या कर सकता हूँ? यह उन सारे कमांडों की सूचि है जो मुझे समझ में आती है:",
-        "footer": "अगर आपको एक अनचाहा जवाब आता है, आप मेरे मैसेज पर 🗑️ (`:wastebasket:`) से रियेक्ट कर सकते हैं और मैं उसे डिलीट कर दूँगा।",
+        "admin": "सिर्फ प्रबंधक ही इन कमांड्स का इस्तेमाल कर सकते हैं:",
+        "adminfooter": "प्रबंधक बॉट के सेटिंग्स को बदलने के लिए डैशबोर्ड का भी इस्तेमाल कर सकते हैं:",
+        "all": "तो, आप जानना चाहते हैं कि मैं क्या-क्या कर सकता हूँ? यह रही उन सभी कमांड्स की सूची जो मुझे समझ में आती है:",
+        "footer": "अगर आपको एक अनचाहा संदेश मिलता है, आप 🗑️ (`:wastebasket:`) का रिएक्शन जोड़ सकते हैं और मैं उसे हटा दूँगा।",
         "list": {
             "default": {
-                "cmd": "<खोजने के लिए टर्म>",
-                "desc": "मैं विकी पर मौजूद इससे मिलते-जुलते एक पृष्ठ के लिंक के साथ जवाब दूँगा।"
+                "cmd": "<खोजने के लिए शब्द>",
+                "desc": "मैं विकि पर मेल खाने वाले लेख की कड़ी के साथ जवाब दूँगा।"
             },
             "diff": {
                 "id": {
-                    "cmd": "diff <डिफ> [<oldid>]",
-                    "desc": "मैं विकी पर एक डिफ के साथ जवाब दूँगा।"
+                    "cmd": "diff <अंतर> [<पुराना id>]",
+                    "desc": "मैं विकि पर अंतर की कड़ी के साथ जवाब दूँगा।"
                 },
                 "name": {
                     "cmd": "diff <पृष्ठ का नाम>",
-                    "desc": "मैं विकी के उस आर्टिकल के आखिरी डिफ के लिंक के साथ जवाब दूँगा।"
+                    "desc": "मैं विकि पर लेख के आखिरी अंतर की कड़ी के साथ जवाब दूँगा।"
                 }
             },
             "discussion": {
                 "post": {
-                    "cmd": "discussion पोस्ट <खोजने के लिए टर्म>",
-                    "desc": "मैं फैनडम विकी पर इससे मिलते-जुलते डिस्कशन पोस्ट के लिंक के साथ जवाब दूँगा।"
+                    "cmd": "discussion post <खोजने के लिए शब्द>",
+                    "desc": "मैं Fandom विकि पर मेल खाने वाले चर्चा पोस्ट की कड़ी के साथ जवाब दूँगा।"
                 },
                 "thread": {
-                    "cmd": "discussion <खोजने के लिए टर्म>",
-                    "desc": "मैं फैनडम विकी पर इससे मिलते-जुलते डिस्कशन थ्रेड के लिंक के साथ जवाब दूँगा।"
+                    "cmd": "discussion <खोजने के लिए शब्द>",
+                    "desc": "मैं Fandom विकि पर मेल खाने वाले चर्चा थ्रेड की कड़ी के साथ जवाब दूँगा।"
                 }
             },
             "fandom": {
-                "cmd": "?<विकी> <खोजने के लिए टर्म>",
-                "desc": "मैं दिए फैनडम विकी: `https://<विकी>.fandom.com/` से एक मिलते-जुलते पृष्ठ के लिंक के साथ जवाब दूँगा"
+                "cmd": "?<विकि> <खोजने के लिए शब्द>",
+                "desc": "मैं दिए गए Fandom विकि पर खाने वाले लेख की कड़ी के साथ जवाब दूँगा: `https://<विकि>.fandom.com/`"
             },
             "gamepedia": {
-                "cmd": "!<विकी> <खोजने के लिए टर्म>",
-                "desc": "मैं दिए गेमपीडिया विकी: `https://<wiki>.gamepedia.com/` से एक मिलते-जुलते पृष्ठ के लिंक के साथ जवाब दूँगा"
+                "cmd": "!<विकि> <खोजने के लिए शब्द>",
+                "desc": "मैं दिए गए गेमपीडिया विकि पर खाने वाले लेख की कड़ी के साथ जवाब दूँगा: `https://<विकि>.gamepedia.com/`"
             },
             "help": {
                 "admin": {
                     "cmd": "help admin",
-                    "desc": "मैं सारे एडमिनिस्ट्रेटर कमांडों की सूचि पेश करूँगा।"
+                    "desc": "मैं प्रबंधकों को उपलब्ध सभी कमांड्स की सूची पेश करूँगा।"
                 },
                 "command": {
-                    "cmd": "help <बॉट कमांड>",
-                    "desc": "जानना चाहते हैं कि एक कमांड कैसे काम करता है? मुझे समझाने दीजिए!"
+                    "cmd": "help <bot command>",
+                    "desc": "जानना चाहते हैं कि कोई कमांड काम कैसे करता है? मैं आपको समझा दूँगा!"
                 },
                 "default": {
                     "cmd": "help",
-                    "desc": "मैं उन सारे कमांडों की सूचि पेश करूँगा जो मुझे समझ आती है।"
+                    "desc": "मैं उन सभी कमांड्स की सूची प्रदान करूँगा जो मुझे समझ आती है।"
                 }
             },
             "info": {
@@ -215,458 +215,455 @@
             "inline": {
                 "link": {
                     "cmd": "[[<पृष्ठ का नाम>]]",
-                    "desc": "मैं विकी पर आर्टिकल के डायरेक्ट लिंक के साथ जवाब दूँगा।"
+                    "desc": "मैं विकि पर लेख की सीधी कड़ी के साथ जवाब दूँगा।"
                 },
                 "template": {
                     "cmd": "{{<पृष्ठ का नाम>}}",
-                    "desc": "मैं विकी पर आर्टिकल के लिंक के साथ जवाब दूँगा।"
+                    "desc": "मैं विकि पर लेख की कड़ी के साथ जवाब दूँगा।"
                 }
             },
             "minecraft": {
                 "bug": {
-                    "cmd": "bug <माइनक्राफ्ट बग>",
-                    "desc": "मैं माइनक्राफ्ट के बग ट्रैकर की मदद से बग के एक लिंक के साथ जवाब दूँगा।"
+                    "cmd": "bug <Minecraft बग>",
+                    "desc": "मैं Minecraft बग ट्रैकर पर से बग की कड़ी के साथ जवाब दूँगा।"
                 },
                 "command": {
-                    "cmd": "command <माइनक्राफ्ट कमांड>",
-                    "desc": "मैं उस माइनक्राफ्ट कमांड और माइनक्राफ्ट विकी पर उसके बारे में मौजूद आर्टिकल के लिंक के साथ जवाब दूँगा।"
+                    "cmd": "command <Minecraft कमांड>",
+                    "desc": "मैं Minecraft कमांड के सिनटैक्स, और Minecraft विकि से कमांड के लेख की कड़ी के साथ जवाब दूँगा।"
                 },
                 "default": {
-                    "cmd": "/<माइनक्राफ्ट कमांड>",
-                    "desc": "मैं उस माइनक्राफ्ट कमांड और माइनक्राफ्ट विकी पर उसके बारे में मौजूद आर्टिकल के लिंक के साथ जवाब दूँगा।"
+                    "cmd": "/<Minecraft कमांड>",
+                    "desc": "मैं Minecraft कमांड के सिनटैक्स, और Minecraft विकि से कमांड के लेख की कड़ी के साथ जवाब दूँगा।"
                 }
             },
             "mwprojects": {
-                "cmd": "!!<wiki> <खोजने के लिए टर्म>",
-                "desc": "मैं मीडियाविकी प्रोजेक्ट में से मिलते-जुलते आर्टिकल के लिंक के साथ जवाब दूँगा। उदहारण: `$1!!en.wikipedia.org Cookie`"
+                "cmd": "!!<विकि> <खोजने के लिए शब्द>",
+                "desc": "मैं निर्धारित मीडियाविकि परियोजना पर मेल खाते हुए लेख की कड़ी के साथ जवाब दूँगा। जैसे: `$1!!hi.wikipedia.org बिस्कुट`"
             },
             "overview": {
                 "cmd": "overview",
-                "desc": "मैं विकी के बारे में कुछ आँकड़ों के साथ जवाब दूँगा।"
+                "desc": "मैं विकि के बारे में कुछ जानकारी और आँकड़ें दिखाऊँगा।"
             },
             "page": {
                 "cmd": "page <पृष्ठ का नाम>",
-                "desc": "मैं विकी पर मौजूद आर्टिकल के डायरेक्ट लिंक के साथ जवाब दूँगा।"
+                "desc": "मैं विकि पर लेख की सीधी कड़ी के साथ जवाब दूँगा।"
             },
             "pause": {
                 "active": {
                     "cmd": "pause $1",
-                    "desc": "मैं फिर सारे कमांडों का जवाब दूँगा।"
+                    "desc": "मैं इस सर्वर पर फिर से सभी कमांड्स का जवाब दूँगा।"
                 },
                 "inactive": {
                     "cmd": "pause $1",
-                    "desc": "मैं कुछ एडमिन कमांडों के सिवाय सारे कमांडों को अनदेखा कर दूँगा।"
+                    "desc": "कुछ प्रबंधक कमांड्स के अलावा मैं इस सर्वर पर सभी कमांड्स को अनदेखा कर दूँगा।"
                 }
             },
             "random": {
                 "cmd": "random",
-                "desc": "मैं विकी पर से एक रैंडम पृष्ठ के लिंक के साथ जवाब दूँगा।"
+                "desc": "मैं विकि पर एक बेतरतीब पृष्ठ की कड़ी के साथ जवाब दूँगा।"
             },
             "rcscript": {
                 "add": {
-                    "cmd": "rcscript add [<विक>]",
-                    "desc": "मैं एक नया रीसेंट चेंजेस वेबहुक बनाऊँगा।"
+                    "cmd": "rcscript add [<विकि>]",
+                    "desc": "मैं एक हाल में हुए बदलावों का नया वेबहुक बनाऊँगा।"
                 },
                 "default": {
                     "cmd": "rcscript",
-                    "desc": "मैं रीसेंट चेंजेस वेबहुक को बदल दूँगा।"
+                    "desc": "मैं हाल में हुए बदलावों के वेबहुक को बदलूँगा।"
                 },
                 "delete": {
                     "cmd": "rcscript delete",
-                    "desc": "मैं रीसेंट चेंजेस वेबहुक को डिलीट कर दूँगा।"
+                    "desc": "मैं हाल में हुए बदलावों के वेबहुक को हटा दूँगा।"
                 },
                 "display": {
-                    "cmd": "rcscript display <नया डिस्प्ले मोड>",
-                    "desc": "मैं रीसेंट चेंजेस वेबहुक के डिस्प्ले मोड को बदल दूँगा।"
+                    "cmd": "rcscript display <नया दिखावट मोड>",
+                    "desc": "मैं हाल में हुए बदलावों का दिखावट मोड बदल दूँगा।"
                 },
                 "feeds": {
                     "cmd": "rcscript feeds",
-                    "desc": "मैं रीसेंट चेंजेस वेबहुक के लिए फैनडम विकी पर डिस्कशन चेंजेस को टॉगल करूँगा।"
+                    "desc": "मैं Fandom विकि पर हाल में हुए बदलावों के वेबहुक के लिए चर्चा-आधारित बदलाव को टॉगल करूँगा।"
                 },
                 "lang": {
                     "cmd": "rcscript lang <नई भाषा>",
-                    "desc": "मैं रीसेंट चेंजेस वेबहुक के भाषा को बदल दूँगा।"
+                    "desc": "मैं हाल में हुए बदलावों के वेबहुक की भाषा को बदल दूँगा।"
                 },
                 "wiki": {
-                    "cmd": "rcscript wiki <नया विक>",
-                    "desc": "मैं रीसेंट चेंजेस वेबहुक के विकी को बदल दूँगा।"
+                    "cmd": "rcscript wiki <नया विकि>",
+                    "desc": "मैं हाल में हुए बदलावों के वेबहुक के लिए विकि को बदल दूँगा।"
                 }
             },
             "search": {
-                "cmd": "search <खोजने के लिए टर्म>",
-                "desc": "मैं विकी पर आर्टिकल के सर्च पृष्ठ के डायरेक्ट लिंक के साथ जवाब दूँगा।"
+                "cmd": "search <खोजने के लिए शब्द>",
+                "desc": "मैं विकि पर लेख के खोज पृष्ठ की सीधी कड़ी के साथ जवाब दूँगा।"
             },
             "settings": {
                 "channel": {
                     "cmd": "settings channel",
-                    "desc": "मैं वर्तमान चैनल के ओवर्राइ को बदल दूँगा।"
+                    "desc": "मैं वर्तमान चैनल के ओवर्राइट्स को बदल दूँगा।"
                 },
                 "default": {
                     "cmd": "settings",
-                    "desc": "मैं इस सर्वर के सेटिंग्स को बदल दूँगा।"
+                    "desc": "मैं सर्वर के सेटिंग्स को बदल दूँगा।"
                 },
                 "inline": {
                     "cmd": "settings inline toggle",
-                    "desc": "मैं सर्वर के इनलाइन कमांडों को टॉगल करूँगा।"
+                    "desc": "मैं इस सर्वर के लिए इनलाइन कमांड्स को टॉगल करूँगा।"
                 },
                 "lang": {
                     "cmd": "settings lang <भाषा>",
-                    "desc": "मैं सर्वर के भाषा को बदल दूँगा।"
+                    "desc": "मैं सर्वर की भाषा को बदलूँगा।"
                 },
                 "prefix": {
                     "cmd": "settings prefix <उपसर्ग>",
-                    "desc": "मैं सर्वर के उपसर्ग को बदलूँगा।"
+                    "desc": "मैं इस सर्वर के उपसर्ग को बदलूँगा।"
                 },
                 "role": {
                     "cmd": "settings role <रोल>",
-                    "desc": "मैं सर्वर में कमांडों का इस्तेमाल करने के लिए ज़रूरी न्यूनतम रोल को बदल दूँगा।"
+                    "desc": "मैं इस सर्वर पर कमांड्स का इस्तेमाल करने के लिए आवश्यक न्यूनतम रोल को बदलूँगा।"
                 },
                 "wiki": {
-                    "cmd": "settings wiki <विक>",
-                    "desc": "मैं सर्वर के डिफ़ॉल्ट विकी को बदल दूँगा।"
+                    "cmd": "settings wiki <विकि>",
+                    "desc": "मैं सर्वर के लिए डिफॉल्ट विकि को बदलूँगा।"
                 }
             },
             "test": {
                 "cmd": "test",
-                "desc": "अगर मैं सक्रीय होता हूँ, मैं जवाब दूँगा। अन्यथा नहीं।"
+                "desc": "अगर मैं सक्रिय हूँ, तो मैं जवाब दूँगा। वरना नहीं।"
             },
             "user": {
-                "cmd": "सदस्य:<यूज़रनेम>",
+                "cmd": "सदस्य:<सदस्यनाम>",
                 "desc": "मैं सदस्य के बारे में कुछ जानकारी दिखाऊँगा।"
             },
             "verification": {
                 "accountage": {
-                    "cmd": "verification <id> accountage <नई अकाउंट-उम्र>",
-                    "desc": "मैं विकी वेरिफिकेशन के लिए अकाउंट के न्यूनतम उम्र (दिनों में) बदल दूँगा।"
+                    "cmd": "verification <id> accountage <खाते की नई उम्र>",
+                    "desc": "मैं विकि प्रमाणीकरण के लिए खाते की न्यूनतम उम्र (दिन के नाप में) बदल दूँगा।"
                 },
                 "add": {
                     "cmd": "verification add <रोल>",
-                    "desc": "मैं एक नया वेरिफिकेशन जोड़ूँगा। `|` से अलग की गई सूचि स्वीकृत है।"
+                    "desc": "मैं एक नया प्रमाणीकरण जोड़ूँगा। `|` से अलग की गई सूची को स्वीकार करता है।"
                 },
                 "channel": {
                     "cmd": "verification <id> channel <नया चैनल>",
-                    "desc": "मैं विकी वेरिफिकेशन के लिए चैनल बदल दूँगा। `|` से अलग की गई सूचि स्वीकृत है।"
+                    "desc": "मैं विकि प्रमाणीकरण के चैनल को बदल दूँगा। `|` से अलग की गई सूची को स्वीकार करता है।"
                 },
                 "default": {
                     "cmd": "verification",
-                    "desc": "मैं `$1वेरीफाई` कमांड के विकी वेरिफिकेशन को बदल दूँगा।"
+                    "desc": "मैं `$1verify` कमांड द्वारा उपयुक्त विकि प्रमाणीकरणों को बदल दूँगा।"
                 },
                 "delete": {
                     "cmd": "verification <id> delete",
-                    "desc": "मैं विकी वेरिफिकेशन को डिलीट कर दूँगा।"
+                    "desc": "मैं विकि प्रमाणीकरण को हटा दूँगा।"
                 },
                 "editcount": {
-                    "cmd": "verification <id> editcount <नई सम्पादना की मात्रा>",
-                    "desc": "मैं विकी वेरिफिकेशन के न्यूनतम सम्पादना के मात्रा को बदल दूँगा।"
+                    "cmd": "verification <id> editcount <संपादन की नई मात्रा>",
+                    "desc": "मैं विकि प्रमाणीकरण के लिए संपादन की न्यूनतम मात्रा को बदल दूँगा।"
                 },
                 "postcount": {
-                    "cmd": "verification <ID> postcount <नई पोस्ट की मात्रा>",
-                    "desc": "मैं विकि वेरिफिकेशन के लिए न्यूनतम डिस्कशन पोस्ट की मात्रा को बदल दूँगा।\n\t• सिर्फ सम्पादना या पोस्ट की मात्रा के लिए एक ऋणात्मक संख्या दें।\n\t• सम्पादना और पोस्ट का मात्रा के लिए `null` दें।"
+                    "cmd": "verification <id> postcount <पोस्ट्स की नई संख्या>",
+                    "desc": "मैं विकि प्रमाणीकरण के लिए चर्चा पोस्ट्स की न्यूनतम संख्या को बदल दूँगा।\n\t• Provide a negative number to require either the edit or the post count.\n\t• संपादन और पोस्ट्स दोनों को मिलाकर जाँचने के लिए `null` प्रदान करें।"
                 },
                 "rename": {
                     "cmd": "verification <id> rename",
-                    "desc": "मैं यह बदल दूँगा कि क्या उनके डिस्कॉर्ड के नाम को उनके विकी वेरिफिकेशन में इस्तेमाल किए गए नाम से बदलना है कि नहीं।"
+                    "desc": "अगर विकि प्रमाणीकरण के लिए सदस्य के डिस्कॉर्ड उपनाम को उनके विकि के सदस्यनाम पर बदलना होगा, तो मैं उसे बदल दूँगा।"
                 },
                 "role": {
                     "cmd": "verification <id> role <नया रोल>",
-                    "desc": "मैं विकी वेरिफिकेशन के रोल को बदल दूँगा। `|` से अलग की गई सूचि स्वीकृत है।"
+                    "desc": "मैं विकि प्रमाणीकरण के लिए रोल को बदल दूँगा। `|` से अलग की गई सूची को स्वीकार करता है।"
                 },
                 "usergroup": {
-                    "cmd": "verification <id> usergroup <नया यूज़र ग्रुप>",
-                    "desc": "मैं विकी वेरिफिकेशन के यूज़र ग्रुप को बदल दूँगा। `|` से अलग की गई सूचि स्वीकृत है।\n\t• सारे दिए यूज़र ग्रुपों को अनिवार्य बनाने के लिए पहले लिस्ट एंट्री को `AND` के रूप में जोड़ें।"
+                    "cmd": "verification <id> usergroup <नया सदस्य समूह>",
+                    "desc": "मैं विकि प्रमाणीकरण के लिए सदस्य समूह को बदल दूँगा। `|` से अलग की गई सूची को स्वीकार करता है।\n\t• सभी सदस्य समूहों को अनिवार्य बनाने के लिए सूची की पहली पंक्ति पर `AND` जोड़ें।"
                 }
             },
             "verify": {
-                "cmd": "verify <विकी यूज़रनेम>",
-                "desc": "इस कमांड को अपने डिस्कॉर्ड एकाउंट से विकी अकाउंट को वेरीफाई करने के लिए इस्तेमाल करें और अपने यूज़रग्रुप के अनुसार रोल पाएँ।"
+                "cmd": "verify <विकि सदस्यनाम>",
+                "desc": "इस कमांड की मदद से अपने डिस्कॉर्ड खाते को अपने विकि खाते के साथ प्रमाणित करें और अपने विकि खाते से मेल खाने वाले रोल्स पाएँ।"
             },
             "voice": {
                 "cmd": "voice",
-                "desc": "मैं वॉइस चैनल पर सबको एक विशेष रोल देने की कोशिश करता हूँ।"
+                "desc": "मैं वॉइस चैनल पर सभी को एक रोल देने की कोशिश करता हूँ।"
             },
             "wikia": {
-                "cmd": "??<wiki> <खोजने के लिए टर्म>",
-                "desc": "मैं दिए विकिया विकी: `https://<विकी>.wikia.org/` पर एक मिलते-जुलते आर्टिकल के लिंक के साथ जवाब दूँगा"
+                "cmd": "??<wiki> <खोजने के लिए शब्द>",
+                "desc": "मैं निर्धारित विकिया विकि पर मेल खाने वाले लेख की कड़ी के साथ जवाब दूँगा: `https://<विकि>.wikia.org/`"
             }
         },
-        "noadmin": "आपको इन कमांडों के लिए `Manage Server` अनुमति चाहिए!",
-        "pause": "**मुझे इस समय इस सर्वर पर पॉज़ किया गया है!**\nसिर्फ इन कमांडों का इस्तेमाल किया जा सकता है:"
+        "noadmin": "इन कमांड्स के लिए आपको `सर्वर मैनेज करें` अनुमति की ज़रूरत है!",
+        "pause": "**मुझे इस समय इस सर्वर पर रोका गया है!**\nसिर्फ इन्हीं कमांड्स का इस्तेमाल किया जा सकता है:"
     },
     "interaction": {
-        "dashboard": {
-            "perm_allow": "अनुमति दें",
-            "perm_default": "डिफ़ॉल्ट",
-            "perm_deny": "अस्वीकार करें",
-            "updated": "$1 ने `$2` के लिए स्लैश कमांड अनुमति ओवर्राइट को अपडेट किया।"
-        },
-        "inline": "इस कमांड का इस्तेमाल करने के लिए कृपया [[विकिटेक्स्ट]] लिंक के साथ कोई टेक्स्ट दें।",
-        "nowiki": "यह विकि मौजूद नहीं है!",
-        "verify": "इस कमांड का इस्तेमाल करके अपने डिस्कॉर्ड अकाउंट को विकि अकाउंट के साथ जोड़कर विकि अकाउंट से संबंधित रोल पाने के लिए कृपया अपने विकि अकाउंट का नाम दें।"
+        "inline": "इस कमांड का इस्तेमाल करने के लिए कृपया [[विकिटेक्स्ट]] कड़ियों के साथ कोई टेक्स्ट प्रदान करें।",
+        "nowiki": "निर्धारित विकि मौजूद नहीं है!",
+        "verify": "इस कमांड की मदद से अपने डिस्कॉर्ड खाते को अपने विकि खाते के साथ प्रमाणित करके और अपने विकि खाते से मेल खाने वाले रोल्स पाने के लिए कृपया अपना विकि सदस्यनाम दर्ज करें।"
     },
     "invite": {
-        "bot": "मुझे दूसरे सर्वर पर इनवाइट करने के लिए इस लिंक का इस्तेमाल करें:"
+        "bot": "मुझे दूसरे सर्वर पर जोड़ने के लिए इस इनवाइट कड़ी का इस्तेमाल करें:"
     },
     "minecraft": {
-        "fixed": "ठीक {{PLURAL:$1|किया गया संस्करण|किए गए संस्करण}}:",
+        "fixed": "Fixed {{PLURAL:$1|संस्करण}}:",
         "issue_link": {
             "Blocks": {
-                "inward": "$1 द्वारा ब्लॉक्ड है",
-                "outward": "$1 को ब्लॉक करता है"
+                "inward": "को $1 द्वारा अवरोधित किया गया है",
+                "outward": "$1 को अवरोधित करता है"
             },
             "Bonfire Testing": {
-                "inward": "$1 को टेस्ट करते वक्त पाया गया",
-                "outward": "टेस्ट में $1 पाया गया"
+                "inward": "$1 को परीक्षणित करते समय पाया गया",
+                "outward": "परीक्षण से $1 पाया गया"
             },
             "Cloners": {
-                "inward": "$1 द्वारा क्लोन किया गया है",
+                "inward": "को $1 द्वारा क्लोन किया गया है",
                 "outward": "$1 को क्लोन करता है"
             },
             "Duplicate": {
-                "inward": "$1 द्वारा डुप्लीकेट किया गया है",
-                "outward": "$1 को डुप्लीकेट करता है"
+                "inward": "की $1 द्वारा नकल की जा रही है",
+                "outward": "$1 की नकल है"
             },
             "Relates": {
-                "inward": "$1 से सम्बंधित है",
-                "outward": "$1 से सम्बंधित है"
+                "inward": "$1 से सबंधित है",
+                "outward": "$1 से सबंधित है"
             }
         },
-        "more": "और $1 ज़्यादा।",
+        "more": "और $1 अधिक।",
         "private": "**व्यक्तिगत समस्या**",
         "status": {
-            "Awaiting Response": "जवाब की अपेक्षा की जा रही है",
-            "Cannot Reproduce": "दोबारा बनाया नहीं जा सका",
-            "Closed": "बंद कर दिया गया है",
-            "Done": "हो गया",
+            "Awaiting Response": "जवाब की अपेक्षा है",
+            "Cannot Reproduce": "वापस पाया नहीं जा रहा",
+            "Closed": "बंद",
+            "Done": "समाप्त",
             "Duplicate": "नकली",
-            "Fixed": "ठीक हो चुका है",
-            "In Progress": "काम हो रहा है",
+            "Fixed": "ठीक किया गया",
+            "In Progress": "काम चल रहा है",
             "Incomplete": "अधूरा",
-            "Invalid": "अस्वीकृत",
+            "Invalid": "अमान्य",
             "Open": "खुला",
-            "Postponed": "टाल दिया गया",
-            "Reopened": "फिर से खोला गया",
-            "Resolved": "ठीक कर दिया गया",
+            "Postponed": "टाला गया",
+            "Reopened": "दोबारा खोला गया",
+            "Resolved": "सुलझाया गया",
             "Won't Fix": "ठीक नहीं होगा",
-            "Works As Intended": "अपेक्षा के हिसाब से ही काम करता है"
+            "Works As Intended": "ठीक से काम करता है"
         },
-        "total": "$1 {{PLURAL:$2|समस्या|समस्याएँ}} ठीक हो चुके हैं"
+        "total": "$1 {{PLURAL:$2|समस्या ठीक हो चुकी है|समस्याएँ ठीक हो चुकी हैं}}"
     },
     "overview": {
         "admins": "प्रबंधक:",
-        "articles": "आर्टिकल:",
-        "comments": "आर्टिकल कमेंट:",
-        "created": "बनाया गया:",
-        "crossover": "मर्ज किया गया:",
+        "articles": "लेख:",
+        "comments": "लेख पर कमेंट्स:",
+        "created": "सृष्टि:",
+        "crossover": "इसपर मर्ज किया गया:",
         "description": "विवरण:",
-        "edits": "सम्पादनाएँ:",
+        "edits": "संपादन:",
         "founder": "संस्थापक:",
         "image": "चित्र:",
         "inaccurate": "आँकड़ें गलत भी हो सकते हैं",
         "lang": "भाषा:",
         "license": "लाइसेंस:",
-        "manager": "विकी मैनेजर:",
+        "manager": "विकि प्रबंधक:",
         "misermode": "कंजूस मोड:",
         "no": "नहीं",
-        "none": "*नहीं है*",
-        "official": "आधिकारिक विक:",
-        "pages": "कुल पृष्ठों की संख्या:",
-        "posts": "डिस्कशन पोस्ट:",
-        "readonly": "यह विकी इस समय रीड-ओनली मोड में है!",
-        "rtl": "दाए-से-बाए:",
-        "talk": "टॉक",
+        "none": "कुछ नहीं",
+        "official": "आधिकारिक विकि:",
+        "pages": "कुल पृष्ठ:",
+        "posts": "चर्चा पोस्ट्स:",
+        "readonly": "यह विकि इस समय सिर्फ-पाठक मोड में है!",
+        "rtl": "दाए-से-बाए:",
+        "talk": "वार्ता",
         "topic": "विषय:",
-        "unknown": "*अनजान*",
-        "users": "सक्रय सदस्य:",
+        "unknown": "अनजान",
+        "users": "सक्रिय सदस्य:",
         "version": "संस्करण:",
-        "vertical": "वर्टकल:",
-        "walls": "मैसेज वॉल पोस्ट:",
-        "wikiid": "विकी ID:",
+        "vertical": "वर्टिकल:",
+        "walls": "मैसेज वॉल पर पोस्ट्स:",
+        "wikiid": "विकि की ID:",
         "yes": "हाँ"
     },
     "pause": {
-        "off": "मैं इस विकी पर आज़ाद हो चुका हूँ और अब फिर से सारे कमांडों के जवाब दे सकता हूँ!",
-        "on": "मुझे इस समय पॉज़ करके और मैं ज़्यादातर कमांडों को अनदेखा कर दूँगा!"
+        "off": "मुझे अब इस सर्वर पर रोका नहीं जा रहा और मैं दोबारा सभी कमांड्स का जवाब दूँगा!",
+        "on": "मुझे अब इस सर्वर पर रोका जा रहा है और मैं ज़्यादातर कमांड्स को अनदेखा कर दूँगा!"
     },
     "rcscript": {
-        "ad": "क्या आपको रीसेंट चेंजेस सीधे डिस्कॉर्ड पर चाहिए? अपने डिस्कॉर्ड सर्वर पर **$2** पर आधारित एक रीसेंट चेंजेस वेबहुक लगाने के लिए `$1rcscript` का इस्तेमाल करें!",
-        "add_more": "और रीसेंट चेंजेस वेबहुक जोड़ें:",
-        "added": "एक वेबहुक इसके लिए बनाया गया है:",
-        "all_inactive": "आप विकी-बदलाव और फीड-आधारित बदलावों को एक साथ सक्षम नहीं रख सकतें।",
-        "audit_reason": "\"$1\" के लिए रीसेंट चेंजेस वेबहुक",
-        "audit_reason_delete": "रीसेंट चेंजेस वेबहुक हटा दिया गया",
-        "audit_reason_edit": "रीसेंट चेंजेस वेबहुक को अपडेट किया गया",
+        "ad": "क्या आपको हाल में हुए बदलाव सीधे डिस्कॉर्ड पर चाहिए? अपने डिस्कॉर्ड सर्वर पर **$2** पर आधारित हाल में हुए बदलावों का एक वेबहुक जोड़ने के लिए `$1rcscript` का इस्तेमाल करें!",
+        "add_more": "हाल में हुए बदलावों के और भी वेबहुक जोड़ें:",
+        "added": "इसके लिए हाल में हुए बदलावों का एक वेबहुक जोड़ा गया है:",
+        "all_inactive": "आप विकि के बदलाव और फीड-आधारित बदलावों को एक साथ अक्षम नहीं रख सकते।",
+        "audit_reason": "\"$1\" के लिए हाल में हुए बदलावों का वेबहुक",
+        "audit_reason_delete": "हाल में हुए बदलावों के वेबहुक को हटाया गया",
+        "audit_reason_edit": "हाल में हुए बदलावों के वेबहुक को संपादित किया गया",
         "avatar": "वेबहुक का अवतार:",
-        "blocked": "इस विकी को रीसेंट चेंजेस वेबहुक बनाने से ब्लॉक कर दिया गया है!",
-        "blocked_reason": "इस विकि को `$1` के लिए रीसेंट चेंजेस वेबहुक बनाने से ब्लॉक कर दिया गया है!",
+        "blocked": "इस विकि को हाल में हुए बदलावों के वेबहुक पर जोड़े जाने से रोका गया है!",
+        "blocked_reason": "इस विकि को `$1` के लिए हाल में हुए बदलावों के वेबहुक पर जोड़े जाने से रोका गया है!",
         "channel": "चैनल:",
-        "current": "इस सर्वर पर ये वर्तमान रीसेंट चेंजेस वेबहुक हैं:",
-        "current_display": "इस वेबहुक का डिस्प्ले मोड है:",
+        "current": "ये इस सर्वर के लिए वर्तमान हाल में हुए बदलावों के वेबहुक हैं:",
+        "current_display": "इस वेबहुक का दिखावट मोड है:",
         "current_lang": "इस वेबहुक की भाषा है:",
-        "current_selected": "यह इस सर्वर का वर्तमान रीसेंट चेंजेस वेबहुक `$1` है:",
-        "current_wiki": "वेबहुक का विकि है:",
+        "current_selected": "यह इस सर्वर के लिए हाल में हुए बदलावों का वेबहुक `$1` है:",
+        "current_wiki": "इस विकि का वेबहुक है:",
         "dashboard": {
-            "added": "$1 ने ID `$2` के साथ रीसेंट चेंजेस वेबहुक जोड़ा है।",
-            "removed": "$1 ने ID `$2` के साथ रीसेंट चेंजेस वेबहुक हटाया है।",
-            "updated": "$1 ने ID `$2` के साथ रीसेंट चेंजेस वेबहुक को अपडेट किया है।"
+            "added": "$1 ने ID `$2` वाला हाल में हुए बदलावों का वेबहुक जोड़ा।",
+            "removed": "$1 ने ID `$2` वाला हाल में हुए बदलावों का वेबहुक हटाया।",
+            "updated": "$1 ने ID `$2` वाला हाल में हुए बदलावों के वेबहुक को संपादित किया।"
         },
-        "delete": "इस रीसेंट चेंजेस वेबहुक को डिलीट करें:",
-        "deleted": "रीसेंट चेंजेस वेबहुक को डिलीट कर दिया गया है।",
+        "delete": "हाल में हुए बदलावों के इस वेबहुक को हटाएँ:",
+        "deleted": "हाल में हुए बदलावों के वेबहुक को हटा दिया गया है।",
         "disabled": "अक्षम",
-        "disabled_feeds": "फीड-आधारित बदलाव, जैसे चर्चा, मैसेज वॉल और आर्टिकल कमेंट, इस वेबहुक के लिए अक्षम हैं।",
-        "disabled_rc": "इस वेबहुक के लिए विकि के बदलाव अक्षम है।",
-        "display": "डिस्प्ले मोड:",
+        "disabled_feeds": "इस वेबहुक के लिए फीड-आधारित बदलाव, जैसे चर्चा, मैसेज वॉल और लेख पर कमेंट्स, को अक्षम कर दिए गए हैं।",
+        "disabled_rc": "इस वेबहुक के लिए विकि के बदलावों को अक्षम किया गया है।",
+        "display": "दिखावट मोड:",
         "enabled": "सक्षम",
-        "enabled_feeds": "फीड-आधारित बदलाव, जैसे चर्चा, मैसेज वॉल और आर्टिकल कमेंट, इस वेबहुक के लिए सक्षम कर दिए गए हैं।",
-        "enabled_rc": "इस वेबहुक के लिए विकि के बदलाव सक्षम कर दिए गए हैं।",
+        "enabled_feeds": "इस वेबहुक के लिए फीड-आधारित बदलाव, जैसे चर्चा, मैसेज वॉल और लेख पर कमेंट्स, को सक्षम कर दिए गए हैं।",
+        "enabled_rc": "इस वेबहुक के लिए विकि के बदलावों को सक्षम किया गया है।",
         "feeds": "फीड-आधारित बदलाव:",
-        "help_display_compact": "इनलाइन लिंकों वाला कॉम्पैक्ट टेक्स्ट।",
-        "help_display_diff": "चित्र पूर्वावलोकन और सम्पादना बदलावों के साथ मैसेजों को एम्बेड करें।",
-        "help_display_embed": "एडिट-टैग और श्रेणी बदलावों के साथ मैसेजों को एम्बेड करें।",
-        "help_display_image": "चित्र पूर्वावलोकनों के साथ मैसेजों को एम्बेड करें।",
-        "help_feeds": "(डिसकशंस, मैसेज वॉल, आर्टिकल कमेंट)",
+        "help_display_compact": "छोटे टेक्स्ट संदेश और इनलाइन कड़ियों वाले संदेश।",
+        "help_display_diff": "चित्र पूर्वावलोकन और संपादन अंतर वाले एम्बेड संदेश।",
+        "help_display_embed": "संपादन टैग्स और श्रेणी में बदलाव वाले एम्बेड संदेश।",
+        "help_display_image": "चित्र पूर्वावलोकन वाले एम्बेड संदेश।",
+        "help_feeds": "(चर्चा, मैसेज वॉल, लेख पर कमेंट्स)",
         "help_lang": "वर्तमान में समर्थित भाषाएँ हैं:",
-        "help_wiki": "`https://<विकि>.fandom.com/` जैसे मीडियाविकी साइटों तक लिंक करें",
+        "help_wiki": "`https://<विकि>.fandom.com/` की तरह मीडियाविकि साइट की कड़ी",
         "lang": "भाषा:",
-        "max_entries": "आप रीसेंट चेंजेस वेबहुक के अधिकतम संख्या तक पहुँच चुके हैं।",
-        "missing": "इस सर्वर के लिए अब तक कोई रीसेंट चेंजेस वेबहुक नहीं बना है।",
+        "max_entries": "आप हाल में हुए बदलावों के वेबहुक की उच्चतम सीमा तक पहुँच चुके हैं।",
+        "missing": "इस सर्वर के लिए अभी भी हाल में हुए बदलावों का कोई वेबहुक नहीं है।",
         "name": "वेबहुक का नाम:",
         "new_lang": "<नई भाषा>",
-        "new_wiki": "<विकी का लिंक>",
-        "no_feeds": "इस वेबहुक के विकि पर कोई फीड-आधारित बदलाव, जैसे चर्चा, मैसेज वॉल और आर्टिकल कमेंट, सक्षम नहीं है।",
-        "noadmin": "इस कमांड का इस्तेमाल करने के लिए आपको `Manage Webhooks` अनुमति चाहिए!",
-        "rc": "विक के बदलाव:",
-        "sysmessage": "रीसेंट चेंजेस वेबहुक जोड़ने के लिए सिस्टम मैसेज `$1` को सर्वर ID `$2` होना होगा।",
-        "title": "रीसेंट चेंजेस वेबहुक",
-        "toggle": "(टॉगल)",
-        "updated_display": "इस वेबहुक के डिस्प्ले मोड को इस में बदल दिया गया है:",
-        "updated_lang": "इस वेबहुक के भाषा को इस में बदल दिया गया है:",
-        "updated_wiki": "इस वेबहुक के विकि को इस में बदल दिया गया है:",
+        "new_wiki": "<विकि की कड़ी>",
+        "no_feeds": "इस वेबहुक के विकि पर चर्चा, मैसेज वॉल पोस्ट्स या लेख पर कमेंट्स जैसा कोई फीड-आधारित बदलाव सक्षम नहीं है।",
+        "noadmin": "इस कमांड के लिए आपको `वेबहुक को मैनेज करें` अनुमति की ज़रूरत है!",
+        "rc": "विकि के बदलाव:",
+        "sysmessage": "हाल में हुए बदलावों का वेबहुक जोड़ने के लिए सिस्टम संदेश `$1` को सर्वर की ID `$2` से मेल खाना होगा।",
+        "title": "हाल में हुए बदलावों का वेबहुक",
+        "toggle": "(टॉगल करें)",
+        "updated_display": "इस वेबहुक के दिखावट मोड को इसमें बदला गया है:",
+        "updated_lang": "इस वेबहुक की भाषा को इसमें बदला गया है:",
+        "updated_wiki": "इस वेबहुक के विकि को इसमें बदला गया है:",
         "webhook": {
-            "blocked": "इस रीसेंट चेंजेस वेबहुक को डिलीट कर दिया जाएगा क्योंकि विकी को ब्लॉक कर दिया गया है!",
-            "blocked_help": "आप [सहायता सर्वर]($1) पर और जानकारी पा सकते हैं।",
-            "blocked_reason": "इस रीसेंट चेंजेस वेबहुक को डिलीट कर दिया जाएगा क्योंकि विकी को `$1` के लिए ब्लॉक कर दिया गया है!",
-            "created": "$1 के लिए एक रीसेंट चेंजेस वेबहुक को इस चैनल पर जोड़ दिया गया है।",
+            "blocked": "हाल में हुए बदलावों के इस वेबहुक को हटा दिया जाएगा क्योंकि इस विकि को अवरोधित कर दिया गया है!",
+            "blocked_help": "आप [सहायता सर्वर]($1) पर अधिक जानकारी पा सकते हैं।",
+            "blocked_reason": "हाल में हुए बदलावों के इस वेबहुक को हटा दिया जाएगा क्योंकि इस विकि को `$1` के लिए अवरोधित कर दिया गया है!",
+            "created": "इस चैनल पर $1 के लिए हाल में हुए बदलावों का एक वेबहुक जोड़ा गया।",
             "dashboard": {
-                "avatar": "• वेबहुक के अवतार को बदल दिया गया है।",
-                "channel": "• वेबहुक को इस चैनल पर लाया गया है।",
-                "disabled_feeds": "• फीड-आधारित बदलावों, जैसे डिसकशंस, मैसेज वॉल, और आर्टिकल कमेंट, को अक्षम कर दिया गया है।",
-                "disabled_rc": "• विकी बदलावों को अक्षम कर दिया गया है।",
-                "display_compact": "• डिस्प्ले मोड को इनलाइन लिंकों के साथ कॉम्पैक्ट मैसेज में बदल दिया गया है।",
-                "display_diff": "• डिस्प्ले मोड को चित्र पूर्वावलोकन और सम्पादना बदलावों के साथ एम्बेड में बदल दिया गया है।",
-                "display_embed": "• डिस्प्ले मोड को सम्पादना टैग और श्रेणी बदलावों के साथ एम्बेड में बदल दिया गया है।",
-                "display_image": "• डिस्प्ले मोड को चित्र पूर्वावलोकन के साथ एम्बेड में बदल दिया गया है।",
-                "enabled_feeds": "• फीड-आधारित बदलावों, जैसे डिसकशंस, मैसेज वॉल, और आर्टिकल कमेंट, को सक्षम कर दिया गया है।",
-                "enabled_rc": "• विकी बदलावों को सक्षम कर दिया गया है।",
-                "lang": "• भाषा को $1 में बदल दिया गया है।",
-                "name": "• वेबहुक के नाम को \"$1\" में बदल दिया गया है।",
-                "updated": "रीसेंट चेंजेस वेबहुक को अपडेट किया गया है:",
-                "wiki": "• विकी को $1 में बदल दिया गया है।"
+                "avatar": "• वेबहुक का अवतार बदला गया।",
+                "channel": "• वेबहुक को इस चैनल पर ले आया गया।",
+                "disabled_feeds": "• फीड-आधारित बदलाव, जैसे चर्चा, मैसेज वॉल और लेख पर कमेंट्स, को अक्षम कर दिए गए हैं।",
+                "disabled_rc": "• विकि के बदलाव अक्षम कर दिए गए हैं।",
+                "display_compact": "• दिखावट मोड छोटे टेक्स्ट संदेश और इनलाइन कड़ियों वाले संदेश पर सेट की गई।",
+                "display_diff": "• दिखावट मोड चित्र पूर्वावलोकन और संपादन अंतर वाले एम्बेड संदेश पर सेट की गई।",
+                "display_embed": "• दिखावट मोड संपादन टैग्स और श्रेणी में बदलाव वाले एम्बेड संदेश पर सेट की गई।",
+                "display_image": "• दिखावट मोड चित्र पूर्वावलोकन वाले एम्बेड संदेश पर सेट की गई।",
+                "enabled_feeds": "• फीड-आधारित बदलाव, जैसे चर्चा, मैसेज वॉल और लेख पर कमेंट्स, को सक्षम कर दिए गए हैं।",
+                "enabled_rc": "• विकि के बदलाव सक्षम कर दिए गए हैं।",
+                "lang": "• भाषा $1 में बदली गई।",
+                "name": "• वेबहुक के नाम को \"$1\" में बदला गया।",
+                "updated": "हाल में हुए बदलावों के वेबहुक को अपडेट किया गया:",
+                "wiki": "• विकि $1 में बदली गई।"
             },
-            "deleted": "इस रीसेंट चेंजेस वेबहुक को डिलीट कर दिया जाएगा।",
-            "disabled_feeds": "फीड-आधारित बदलाव, जैसे डिसकशंस, मैसेज वॉल और आर्टिकल कमेंट, इस वेबहुक के लिए अक्षम कर दिए गए हैं।",
-            "disabled_rc": "इस वेबहुक के लिए विकी के बदलाव अक्षम कर दिए गए हैं।",
-            "enabled_feeds": "फीड-आधारित बदलाव, जैसे डिसकशंस, मैसेज वॉल और आर्टिकल कमेंट, इस वेबहुक के लिए सक्षम कर दिए गए हैं।",
-            "enabled_rc": "इस वेबहुक के लिए विकी के बदलाव सक्षम कर दिए गए हैं।",
-            "updated_display_compact": "इस वेबहुक के डिस्प्ले मोड को इनलाइन लिंकों वाले कॉम्पैक्ट टेक्स्ट में बदल दिया गया है।",
-            "updated_display_diff": "इस वेबहुक के डिस्प्ले मोड को चित्र पूर्वावलोकन और सम्पादना बदलावों में बदल दिया गया है।",
-            "updated_display_embed": "इस वेबहुक के डिस्प्ले मोड को एडिट-टैग और श्रेणी बदलावों में बदल दिया गया है।",
-            "updated_display_image": "इस वेबहुक के डिस्प्ले मोड को चित्र पूर्वावलोकनों में बदल दिया गया है।",
-            "updated_lang": "इस वेबहुक के भाषा को `$1` में बदल दिया गया है।",
-            "updated_wiki": "इस वेबहुक के विकी को $1 में बदल दिया गया है।"
+            "deleted": "हाल में हुए बदलावों के इस वेबहुक को हटा दिया जाएगा।",
+            "disabled_feeds": "इस वेबहुक के लिए फीड-आधारित बदलाव, जैसे चर्चा, मैसेज वॉल और लेख पर कमेंट्स, को अक्षम कर दिए गए हैं।",
+            "disabled_rc": "इस वेबहुक के लिए विकि के बदलावों को अक्षम किया गया है।",
+            "enabled_feeds": "इस वेबहुक के लिए फीड-आधारित बदलाव, जैसे चर्चा, मैसेज वॉल और लेख पर कमेंट्स, को सक्षम कर दिए गए हैं।",
+            "enabled_rc": "इस वेबहुक के लिए विकि के बदलावों को सक्षम किया गया है।",
+            "updated_display_compact": "इस वेबहुक के लिए दिखावट मोड छोटे टेक्स्ट संदेश और इनलाइन कड़ियों वाले संदेश पर सेट की गई।",
+            "updated_display_diff": "इस वेबहुक के लिए दिखावट मोड चित्र पूर्वावलोकन और संपादन अंतर वाले एम्बेड संदेश पर सेट की गई।",
+            "updated_display_embed": "इस वेबहुक के लिए दिखावट मोड संपादन टैग्स और श्रेणी में बदलाव वाले एम्बेड संदेश पर सेट की गई",
+            "updated_display_image": "इस वेबहुक के लिए दिखावट मोड चित्र पूर्वावलोकन वाले एम्बेड संदेश पर सेट की गई।",
+            "updated_lang": "हाल में हुए बदलावों के इस वेबहुक पर भाषा `$1` में बदली गई।",
+            "updated_wiki": "हाल में हुए बदलावों के इस वेबहुक पर विकि $1 में बदली गई।"
         },
-        "webhook_failed": "बदकिस्मती से, वेबहुक इस समय नहीं बन पाया, कृपया थोड़ी देर बाद कोशिश करें।",
-        "wiki": "विक:"
+        "webhook_failed": "बदकिस्मती से, वेबहुक नहीं बन पाया। कृपया बाद में दोबारा कोशिश करें।",
+        "wiki": "विकि:"
     },
     "search": {
-        "cached": "आखिरी कैश अपडेट:",
+        "cached": "कैश पर आखिरी अपडेट:",
         "category": {
-            "content": "इस श्रेणी का कंटेंट:",
-            "empty": "*यह श्रेणी खाली है*",
-            "files": "$1 {{PLURAL:$2|चित्र|चित्र}}",
-            "pages": "$1 {{PLURAL:$2|पृष्ठ|पृष्ठ}}",
+            "content": "इस श्रेणी की सामग्री:",
+            "empty": "यह श्रेणी खाली है",
+            "files": "$1 {{PLURAL:$2|चित्र}}",
+            "pages": "$1 {{PLURAL:$2|पृष्ठ}}",
             "subcats": "$1 {{PLURAL:$2|श्रेणी|श्रेणियाँ}}"
         },
-        "empty": "*यह विशेष पृष्ठ खाली है*",
-        "infopage": "सही जवाब नहीं है? एक डायरेक्ट लिंक के लिए $1 का इस्तेमाल करें।",
-        "infosearch": "सही जवाब नहीं है? एक डायरेक्ट लिंक के लिए $1 और सारे जवाबों के सूचि के लिए $2 का इस्तेमाल करें।",
+        "empty": "यह विशेष पृष्ठ खाली है",
+        "infopage": "सही अंजाम नहीं है। सीधी कड़ी के लिए $1 का इस्तेमाल करें।",
+        "infosearch": "सही अंजाम नहीं है? सीधी कड़ी के लिए $1 या सभी अंजामों की सूची के लिए $2 देखें।",
         "loading": "पृष्ठ का विवरण लोड हो रहा है…",
-        "media": "विवरण पृष्ठ तक",
-        "results": "$1 कुल {{PLURAL:$2|परिणाम|परिणाम}}",
-        "special": "इस विशेष पृष्ठ का कंटेंट:"
+        "media": "चित्र के विवरण पृष्ठ पर",
+        "messagedefault": "डिफॉल्ट:",
+        "messagedefaultnone": "कुछ नहीं",
+        "results": "कुल $1 {{PLURAL:$2|अंजाम}}",
+        "special": "इस विशेष पृष्ठ की सामग्री:"
     },
     "settings": {
         "button": "डैशबोर्ड का इस्तेमाल करें",
         "channel current": "ये इस चैनल के वर्तमान सेटिंग्स हैं:",
         "channel lang": "इस चैनल की भाषा है:",
-        "channel langchanged": "आपने इस चैनल के भाषा को इस में बदला:",
-        "channel role": "इस चैनल का न्यूनतम ज़रूरी रोल है:",
-        "channel rolechanged": "आपने इस चैनल के न्यूनतम ज़रूरी रोल को इस में बदला:",
-        "channel wiki": "इस चैनल का डिफॉल्ट विकि है:",
-        "channel wikichanged": "आपने इस चैनल के डिफॉल्ट विकि को इस में बदला:",
+        "channel langchanged": "आपने इस चैनल की भाषा को इसमें बदला:",
+        "channel role": "इस चैनल का न्यूनतम आवश्यक रोल है:",
+        "channel rolechanged": "आपने इस चैनल के न्यूनतम आवश्यक रोल को इसमें बदला:",
+        "channel wiki": "इस चैनल का डिफॉल्ट विकि है:",
+        "channel wikichanged": "आपने इस चैनल के डिफॉल्ट विकि को इसमें बदला:",
         "current": "ये इस सर्वर के वर्तमान सेटिंग्स हैं:",
         "currentchannel": "चैनल ओवर्राइट्स:",
-        "currentinline": "इनलाइन कमांड:",
+        "currentinline": "इनलाइन कमांड्स:",
         "currentlang": "भाषा:",
         "currentprefix": "उपसर्ग:",
         "currentrole": "न्यूनतम रोल:",
-        "currentwiki": "डिफ़ॉल्ट विकी:",
+        "currentwiki": "डिफॉल्ट विकि:",
         "dashboard": {
-            "channel": "$1 ने $2 के लिए सेटिंग्स को अपडेट किया।",
-            "removed": "$1 ने $2 के लिए सेटिंग्स को हटा दिया।",
-            "updated": "$1 ने सर्वर सेटिंग्स को बदला।"
+            "channel": "$1 ने $2 के सेटिंग्स को अपडेट किया।",
+            "removed": "$1 ने $2 के सेटिंग्स हटाए।",
+            "updated": "$1 ने सर्वर सेटिंग्स को अपडेट किया।"
         },
-        "foundwikis": "क्या आपका मतलब इन में से कोई विकी था?",
+        "foundwikis": "क्या आप इनमें से किसी विकि की बात कर रहे थे?",
         "inline disabled": {
-            "channel inline": "इनलाइन कमांड इस चैनल के लिए इस समय अक्षम हैं।",
-            "channel inlinechanged": "आपने इस चैनल के लिए इनलाइन कमांड अक्षम किया।",
-            "help": "`[[$2]]` और `{{$2}}` जैसे इनलाइन कमांडों को सक्षम करने के लिए `$1` का इस्तेमाल करें।",
-            "inline": "इनलाइन कमांड इस सर्वर के लिए इस समय अक्षम हैं।",
-            "inlinechanged": "आपने इस सर्वर के लिए इनलाइन कमांड अक्षम किया।"
+            "channel inline": "इस समय इस चैनल के लिए इनलाइन कमांड्स अक्षम हैं।",
+            "channel inlinechanged": "आपने इस चैनल के लिए इनलाइन कमांड्स को अक्षम किया।",
+            "help": "`[[$2]]` और `{{$2}}` जैसे इनलाइन कमांड्स सक्षम करने के लिए `$1` का इस्तेमाल करें।",
+            "inline": "इस समय इस सर्वर के लिए इनलाइन कमांड्स अक्षम हैं।",
+            "inlinechanged": "आपने इस सर्वर के लिए इनलाइन कमांड्स को अक्षम किया।"
         },
         "inline enabled": {
-            "channel inline": "इनलाइन कमांड इस चैनल के लिए इस समय सक्षम हैं।",
-            "channel inlinechanged": "आपने इस चैनल के लिए इनलाइन कमांड सक्षम किया।",
-            "help": "`[[$2]]` और `{{$2}}` जैसे इनलाइन कमांडों को अक्षम करने के लिए `$1` का इस्तेमाल करें।",
-            "inline": "इनलाइन कमांड इस सर्वर के लिए इस समय सक्षम हैं।",
-            "inlinechanged": "आपने इस सर्वर के लिए इनलाइन कमांड सक्षम किया।"
+            "channel inline": "इस समय इस चैनल के लिए इनलाइन कमांड्स सक्षम हैं।",
+            "channel inlinechanged": "आपने इस चैनल के लिए इनलाइन कमांड्स को सक्षम किया।",
+            "help": "`[[$2]]` और `{{$2}}` जैसे इनलाइन कमांड्स अक्षम करने के लिए `$1` का इस्तेमाल करें।",
+            "inline": "इस समय इस सर्वर के लिए इनलाइन कमांड्स सक्षम हैं।",
+            "inlinechanged": "आपने इस सर्वर के लिए इनलाइन कमांड्स को सक्षम किया।"
         },
         "lang": "इस सर्वर की भाषा है:",
-        "langchanged": "आपने इस सर्वर के भाषा को इस में बदला:",
-        "langhelp": "भाषा बदलने के लिए `$1 <भाषा>` का इस्तेमाल करें।\nवर्तमान में समर्थित भाषाएँ हैं:",
+        "langchanged": "आपने इस सर्वर की भाषा को इसमें बदला:",
+        "langhelp": "भाषा को बदलने के लिए `$1 <भाषा>` का इस्तेमाल करें।\nइस समय समर्थित भाषाएँ हैं:",
         "langinvalid": "मुझे यह भाषा नहीं आती!",
-        "missing": "इस सर्वर को अ तक सेट नहीं किया गया है। सेटिंग्स बदलने के लिए $1 और $2 का इस्तेमाल करें।",
-        "nochannels": "*अब तक इस चैनल के लिए कोई ओवर्राइट नहीं है*",
+        "missing": "इस सर्वर को अभी तक सेट नहीं किया गया है। सेटिंग्स बदलने के लिए $1 और $2 का इस्तेमाल करें।",
+        "nochannels": "अब तक कोई चैनल ओवर्राइट नहीं है",
         "prefix": "इस सर्वर का उपसर्ग है:",
-        "prefixchanged": "आपने इस सर्वर के उपसर्ग को इस में बदला:",
-        "prefixhelp": "उपसर्ग बदलने के लिए `$1 <उपसर्ग>` का इस्तेमाल करें।\nउपसर्ग के अंत में खली स्थान मार्क करने के लिए `_` का इस्तेमाल करें।\nइस में मेंशन नहीं होने चाहिए!",
-        "prefixinvalid": "यह उपसर्ग समर्थित नहीं है!",
-        "role": "इस सर्वर का न्यूनतम ज़रूरी रोल है:",
-        "rolechanged": "आपने इस सर्वर के न्यूनतम ज़रूरी रोल को इस में बदला:",
-        "rolehelp": "न्यूनतम ज़रूरी रोल को बदलने के लिए `$1<रोल>` का इस्तेमाल करें।",
-        "roleinvalid": "दिया गया रोल मौजूद नहीं है!",
-        "save_failed": "बदकिस्मती से सेटिंग्स सेव नहीं हो पाए। कृपया थोड़ी देर बाद कोशिश करें।",
-        "wiki": "इस सर्वर का डिफॉल्ट विकि है:",
-        "wikichanged": "आपने इस सर्वर के डिफॉल्ट विकि को इस में बदला:",
-        "wikihelp": "डिफ़ॉल्ट विकी बदलने के लिए $1 <लिंक>` का इस्तेमाल करें।\n`https://<विकि>.fandom.com/` जैसे मीडियाविकी साइट तक लिंक करें",
-        "wikiinvalid": "कृपया किसी फैनडम विकि या विकिपीडिया जैसे स्वीकृत मीडियाविकि साइट के लिंक दें!",
-        "wikiinvalid_http": "इस वेबसाइट के पास कोई स्वीकृत TLS/SSL प्रमाणपत्र नहीं है! सुरक्षा के कारणों से सिर्फ HTTPS का इस्तेमाल करने वाले विकियाँ ही समर्थित हैं।\nअगर आप साइट के प्रबंधक हैं, *Let’s Encrypt* जैसे किसी प्रमाणपत्र प्राधिकारी से प्रमाणपत्र पा सकते हैं।\n<https://letsencrypt.org/getting-started/>",
-        "wikiinvalid_private": "यह विकि व्यक्तिगत हैं! सिर्फ सार्वजनिक विकियाँ ही समर्थित हैं जिन्हें सब पढ़ सकते हैं।",
-        "wikiinvalid_timeout": "इस लिंक को जवाब देने में कुछ ज़्यादा ही वक्त लग गया!",
-        "wikimissing": "इस सर्वर के लिए कोई डिफॉल्ट विकि नहीं है!"
+        "prefixchanged": "आपने इस सर्वर के उपसर्ग को इसमें बदला:",
+        "prefixhelp": "उपसर्ग को बदलने के लिए `$1 <उपसर्ग>` का इस्तेमाल करें\nउपसर्ग के आखिर में खाली स्थान दर्शाने के लिए आखिर में `_` लिखें।\nउपसर्ग में मेंशन नहीं हो सकते!",
+        "prefixinvalid": "निर्धारित उपसर्ग अमान्य है!",
+        "role": "इस सर्वर के लिए न्यूनतम आवश्यक रोल है:",
+        "rolechanged": "आपने इस सर्वर के न्यूनतम आवश्यक रोल को इसमें बदला:",
+        "rolehelp": "न्यूनतम आवश्यक रोल को बदलने के लिए `$1 <रोल>` का इस्तेमाल करें।",
+        "roleinvalid": "निर्धारित रोल मौजूद नहीं!",
+        "save_failed": "बदकिस्मती से सेटिंग्स सहेजे नहीं जा सके, कृपया बाद में दोबारा कोशिश करें।",
+        "wiki": "सर्वर का डिफॉल्ट विकि है:",
+        "wikichanged": "आपने इस सर्वर के डिफॉल्ट विकि को इसमें बदला:",
+        "wikihelp": "डिफॉल्ट विकि को बदलने के लिए `$1 <कड़ी>` का इस्तेमाल करें।\n`https://<विकि>.fandom.com/` जैसे किसी मीडियाविकि साइट की कड़ी दें",
+        "wikiinvalid": "कृपया विकिपीडिया या किसी Fandom विकि जैसे, किसी मीडियाविकि साइट की मान्य कड़ी दें!",
+        "wikiinvalid_http": "निर्धारित वेबसाइट पर एक मान्य TLS/SSL प्रमाणपत्र नहीं है! सुरक्षा के कारणों से सिर्फ HTTPS का इस्तेमाल कर रहे विकियों को ही समर्थित किया जाता है।\nअगर आप एक साइट प्रबंधक हैं, आप 'Let’s Encrypt' जैसे किसी प्रमाणपत्र अधिकारी से प्रमाणपत्र प्राप्त कर सकते हैं:\n<https://letsencrypt.org/getting-started/>",
+        "wikiinvalid_private": "निर्धारित विकि व्यक्तिगत है! सिर्फ वही विकियाँ समर्थित हैं जो सार्वजनिक हैं और जिन्हें सभी पढ़ सकते हैं।",
+        "wikiinvalid_timeout": "निर्धारित कड़ी को जवाब देने में काफी ज़्यादा समय लग गया!",
+        "wikimissing": "इस सर्वर के लिए कोई डिफॉल्ट विकि सेट नहीं किया गया है!"
     },
     "test": {
-        "MediaWiki": "पूरे काम के लिए कम-से-कम $1 चाहिए, `$2` मिला।",
-        "notice": "सीमित काम",
-        "pause": "मुझे इस समय इस सर्वर के लिए पॉज़ किया गया है।",
+        "MediaWiki": "पूरी कार्यक्षमता के लिए कम से कम $1 चाहिए, `$2` मिला।",
+        "notice": "सीमित कार्यक्षमता",
+        "pause": "मुझे इस समय इस सर्वर पर रोककर रखा गया है।",
+        "slow": "माफ़ कीजिए, लगता मैं इस समय कुछ धीमा हूँ।",
         "text": [
-            "मैं अभी भी काम करता हूँ!",
-            "मैं ज़िंदा हूँ, जी!",
-            "मानो या न मानो, मैं ज़िंदा हूँ।",
-            "मैंने विज्ञान पढ़ा था और मैं अभी भी ज़िंदा हूँ।",
+            "मैं पूरी तरह से काम कर रहा हूँ!",
+            "मैं अब भी ज़िंदा हूँ!",
+            "मानो या न मानो, मैं अब भी ज़िंदा हूँ।",
+            "मैंने विज्ञान पढ़ा है और मैं अब भी ज़िंदा हूँ।",
             "मैं ज़िंदा हूँ और यह ज़िन्दगी कितनी सुहानी है।",
-            "हाँ जी, काम तो मैं अभी भी करता हूँ।",
-            "अरे वाह, मैं अभी भी ज़िंदा हूँ!",
-            "मैं ज़िंदा हूँ। क्या हुक्म है, मेरे आका?",
+            "मैं बिना कसरत किए ही स्वस्थ हूँ!",
+            " ",
+            " ",
             " ",
             " ",
             " ",
@@ -690,163 +687,163 @@
             " ",
             " "
         ],
-        "time": "जवाब में लगा वक्त"
+        "time": "जवाब में लगा समय"
     },
     "user": {
         "block": {
             "duration": {
-                "days": "$1 दिन",
-                "hours": "$1 {{PLURAL:$2|घंटा|घंटे}}",
-                "minutes": "$1 मिनट",
-                "months": "$1 {{PLURAL:$2|महीना|महीने}}",
+                "days": "$1 {{PLURAL:$2|दिन}}",
+                "hours": "$1 {{PLURAL:$2|घंटे}}",
+                "minutes": "$1 {{PLURAL:$2|मिनट}}",
+                "months": "$1 {{PLURAL:$2|महीने}}",
                 "separator": ",_",
-                "separator_last": "_और_",
-                "weeks": "$1 {{PLURAL:$2|हफ्ता|हफ्ते}}",
-                "years": "$1 साल"
+                "separator_last": "_and_",
+                "weeks": "$1 {{PLURAL:$2|हफ्ते}}",
+                "years": "$1 {{PLURAL:$2|वर्ष}}"
             },
-            "header": "$1 इस समय ब्लॉक्ड है!",
-            "indef_noreason": "$4 द्वारा $1 को बेमियादी ब्लॉक किया गया।",
-            "indef_text": "$1 को $4 द्वारा कारण \"$5\" के साथ ब्लॉक किया गया।",
-            "noreason": "$4 द्वारा $1 को $3 तक $2 के लिए ब्लॉक किया गया।",
-            "text": "$4 द्वारा $1 को $3 तक कारण \"$5\" से $2 के लिए ब्लॉक किया गया।"
+            "header": "$1 को इस समय अवरोधित किया गया है!",
+            "indef_noreason": "$1 पर $4 द्वारा हमेशा के लिए अवरोधित।",
+            "indef_text": "$1 पर $4 द्वारा कारण \"$5\" के साथ हमेशा के लिए अवरोधित।",
+            "noreason": "$1 को $2 के लिए $3 तक $4 द्वारा अवरोधित।",
+            "text": "$1 को $2 के लिए $3 तक $4 द्वारा कारण \"$5\" के साथ अवरोधित।"
         },
         "gblock": {
-            "disabled": "यह अकाउंट ग्लोबल रूप से ब्लॉक हो चुका है!",
-            "header": "$1 इस समय ग्लोबल रूप से ब्लॉक्ड है!"
+            "disabled": "यह खाता इस समय अक्षम है!",
+            "header": "$1 इस समय ग्लोबल रूप से अक्षम हैं!"
         },
         "gender": {
-            "female": "महिला",
-            "male": "पुरुष",
+            "female": "स्त्रीलिंग",
+            "male": "पुल्लिंग",
             "unknown": "अनजान"
         },
         "info": {
             "discord": "डिस्कॉर्ड:",
-            "editcount": "सम्पादना की मात्रा:",
-            "favwiki": "पसंदीदा विकी:",
+            "editcount": "संपादनों की संख्या:",
+            "favwiki": "पंसदीदा विकि:",
             "gender": "लिंग:",
-            "globaleditcount": "ग्लोबल सम्पादना की मात्रा:",
-            "globalgroup": "ग्लोबल ग्रुप:",
-            "group": "ग्रुप:",
+            "globaleditcount": "ग्लोबल संपादनों की संख्या:",
+            "globalgroup": "ग्लोबल {{PLURAL:$1|समूह}}:",
+            "group": "{{PLURAL:$1|समूह}}:",
             "loading": "ग्लोबल आँकड़ें लोड हो रहे हैं…",
-            "postcount": "डिस्कशन पोस्ट:",
-            "registration": "पंजीकरण की तारीख:",
-            "wikisedited": "सम्पादित किए गए विकियाँ:"
+            "postcount": "चर्चा पोस्ट्स:",
+            "registration": "पंजीकरण की तिथि:",
+            "wikisedited": "संपादित की गई विकियाँ:"
         }
     },
     "verification": {
-        "accountage": "अकाउंट की उम्र:",
-        "add_more": "और वेरिफिकेशन बनाएँ:",
-        "added": "वेरिफिकेशन को जोड़ दिया गया है:",
+        "accountage": "खाते की उम्र:",
+        "add_more": "अधिक प्रमाणीकरण जोड़ें:",
+        "added": "प्रमाणीकरण जोड़ी गई:",
         "and": "और",
         "channel": "चैनल:",
         "channel_max": "आपने कुछ ज़्यादा ही चैनल दे दिए हैं।",
-        "channel_missing": "दिया गया चैनल मौजूद नहीं है।",
-        "current": "ये इस सर्वर के वर्तमान वेरिफिकेशन हैं:",
-        "current_selected": "यह इस सर्वर का वेरिफिकेशन `$1` है:",
+        "channel_missing": "निर्धारित चैनल मौजूद नहीं है।",
+        "current": "ये इस सर्वर के वर्तमान प्रमाणीकरण हैं:",
+        "current_selected": "यह इस सर्वर का प्रमाणीकरण `$1` है:",
         "dashboard": {
-            "added": "$1 ने ID `$2` के साथ वेरिफिकेशन जोड़ा।",
-            "added_notice": "$1 ने कुछ वेरिफिकेशन सूचनाएँ जोड़े।",
-            "removed": "$1 ने ID `$2` के साथ वेरिफिकेशन को हटा दिया।",
-            "updated": "$1 ने ID `$2` के साथ वेरिफिकेशन को अपडेट किया।",
-            "updated_notice": "$1 ने कुछ वेरिफिकेशन सूचनाओं को अपडेट किया।"
+            "added": "$1 ने ID `$2` वाला प्रमाणीकरण जोड़ा।",
+            "added_notice": "$1 ने कुछ प्रमाणीकरण की सूचनाएँ जोड़ी।",
+            "removed": "$1 ने ID `$2` वाला प्रमाणीकरण हटाया।",
+            "updated": "$1 ने ID `$2` वाले प्रमाणीकरण को अपडेट किया।",
+            "updated_notice": "$1 ने कुछ प्रमाणीकरण की सूचनाओं को अपडेट किया।"
         },
-        "delete_current": "इस वेरिफिकेशन को डिलीट करें:",
-        "deleted": "इस वेरिफिकेशन को डिलीट कर दिया गया है।",
+        "delete_current": "इस प्रमाणीकरण को हटाएँ:",
+        "deleted": "प्रमाणीकरण को हटा दिया गया है।",
         "disabled": "अक्षम",
-        "editcount": "सम्पादना की मात्रा:",
+        "editcount": "संपादनों की संख्या:",
         "enabled": "सक्षम",
-        "flag_logall": "असफल वेरिफिकेशनों को लॉग करना:",
-        "flag_private": "वेरिफिकेशन कमांड के जवाब को व्यक्तिगत रूप में भेजना:",
-        "indays": "(दिनों में)",
+        "flag_logall": "असफल प्रमाणीकरणों के लॉग करना:",
+        "flag_private": "प्रमाणीकरण के उत्तर व्यक्तिगत रूप से भेजना:",
+        "indays": "(दिन के नाप में)",
         "logging": "लॉग करने के लिए चैनल:",
-        "match": "आवश्यकता में न आने के लिए सूचना:",
-        "max_entries": "आप वेरिफिकेशनों के अधिकतम मात्रा तक पहुँच चुके हैं।",
-        "missing": "इस सर्वर पर इस समय कोई वेरिफिकेशन नहीं है।",
-        "new_accountage": "<नई अकाउंट उम्र>",
+        "match": "लापता आवश्यकताओं की सूचना:",
+        "max_entries": "आप प्रमाणीकरणों की उच्चतम संख्या पर पहुँच चुके हैं।",
+        "missing": "इस सर्वर पर अब तक कोई प्रमाणीकरण नहीं है।",
+        "new_accountage": "<खाते की नई उम्र>",
         "new_channel": "<नया चैनल>",
-        "new_editcount": "<नई सम्पादना की मात्रा>",
-        "new_postcount": "<नई पोस्ट की मात्रा>",
+        "new_editcount": "<संपादनों की नई संख्या>",
+        "new_postcount": "<पोस्ट्स की नई संख्या>",
         "new_role": "<नया रोल>",
-        "new_usergroup": "<नया यूज़र ग्रुप>",
-        "no_role": "कृपया वेरिफिकेशन के लिए एक नया रोल दें।",
-        "notice_embed": "कुछ सूचनाओं पर मास्क किए गए मार्कडाउन लिंक हैं। सुनिश्चित करें कि बॉट के पास हर वेरिफिकेशन चानल पर `लिंक एम्बेड करें` अनुमति है ताकि यह ठीक से काम कर सके।",
+        "new_usergroup": "<नया सदस्य समूह>",
+        "no_role": "कृपया नए प्रमाणीकरण के लिए एक रोल प्रदान करें।",
+        "notice_embed": "कुछ सूचनाओं में मास्क किए गए मार्कडाउन कड़ियाँ हैं। उनके काम करने के लिए निश्चित करें कि बॉट के पास सभी प्रमाणीकरण चैनलों पर `लिंक एम्बेड करें` अनुमति है।",
         "or": "या",
-        "postcount": "पोस्ट की मात्रा (सिर्फ फैनडम विकियों के लिए):",
-        "postcount_or": "(सम्पादना की मात्रा के लिए एक दूसरा विकल्प)",
-        "posteditcount": "सम्पादना और पोस्ट की मात्रा को मिलाकर:",
-        "rename": "निकनेम बदलें:",
-        "rename_no_permission": "**$1 के पास विकी यूज़रनेम पर मजबूर करने के लिए `Manage Nicknames` अनुमति नहीं है!**",
+        "postcount": "पोस्ट्स की संख्या (सिर्फ Fandom विकियों के लिए):",
+        "postcount_or": "(संपादनों की संख्या का विकल्प)",
+        "posteditcount": "संपादनों और पोस्ट्स की संख्या को मिलाकर:",
+        "rename": "उपनाम बदलें:",
+        "rename_no_permission": "**सदस्यनाम पर मजबूर करने के लिए $1 के पास `निकनेम को मैनेज करें` अनुमति नहीं है!**",
         "role_add": "जोड़ने के लिए रोल:",
-        "role_deleted": "**शायद रोल $1 अब मौजूद नहीं है!**",
-        "role_managed": "इस रोल को नहीं दिया जा सकता।",
-        "role_max": "आपने कुछ ज़्यादा ही रोल दे दिए हैं।",
-        "role_missing": "यह रोल मौजूद नहीं है।",
+        "role_deleted": "**ऐसा लगता है कि रोल $1 अब मौजूद नहीं है!**",
+        "role_managed": "निर्धारित रोल नहीं दिया जा सकता।",
+        "role_max": "आपने कुछ ज़्यादा ही रोल्स दे दिए हैं।",
+        "role_missing": "निर्धारित रोल मौजूद नहीं है।",
         "role_none": "कुछ नहीं",
         "role_remove": "हटाने के लिए रोल:",
         "role_too_high": "**रोल $1 $2 को देने के लिए कुछ ज़्यादा ही ऊँचा है!**",
-        "save_failed": "बदकिस्मती से वेरिफिकेशन सेव नहीं हो पाया। कृपया थोड़ी देर बाद कोशिश करें।",
+        "save_failed": "बदकिस्मती से प्रमाणीकरण को सहेजा नहीं जा सका, कृपया दोबारा फिर से बाद में कोशिश करें।",
         "success": "सफलता की सूचना:",
-        "toggle": "(टॉगल)",
-        "updated": "वेरिफिकेशन को अपडेट कर दिया गया है:",
-        "usergroup": "यूज़र ग्रुप:",
-        "usergroup_max": "आपने कुछ ज़्यादा ही यूज़र ग्रुप दे दिए हैं।",
-        "usergroup_too_long": "दिया गया यूज़र ग्रुप कुछ ज़्यादा ही लंबा है।",
-        "value_too_high": "दिया गया वैल्यू कुछ ज़्यादा ही ऊँचा है।"
+        "toggle": "(टॉगल करें",
+        "updated": "प्रमाणीकरण को अपडेट किया गया है:",
+        "usergroup": "सदस्य समूह",
+        "usergroup_max": "आपने कुछ ज़्यादा ही समूह दे दिए हैं।",
+        "usergroup_too_long": "निर्धारित सदस्य समूह कुछ ज़्यादा ही लंबा है।",
+        "value_too_high": "निर्धारित वैल्यू कुछ ज़्यादा ही ऊँचा है।"
     },
     "verify": {
-        "audit_reason": "\"$1\" के रूप में वेरीफाई किया गया है",
-        "button_again": "फिर से जाँचें",
-        "button_wrong_user": "आ इस वेरिफिकेशन को फिर से नहीं जाँच सकते, यह $1 का वेरिफिकेशन है!",
+        "audit_reason": "\"$1\" के रूप में प्रमाणित",
+        "button_again": "दोबारा जाँचें",
+        "button_wrong_user": "आप इस प्रमाणीकरण को दोबारा नहीं जाँच सकते, यह $1 का प्रमाणीकरण है!",
         "discord": "डिस्कॉर्ड सदस्य:",
-        "empty": "*खाली*",
-        "error": "एक गलती के चलते वेरिफिकेशन असफल रहा।",
-        "error_reply": "किसी गलती के चलते वेरिफिकेशन असफल रहा। कृपया थोड़ी देर बाद कोशिश करें।",
-        "failed_gblock": "**ग्लोबल ब्लॉक की जाँच नाकामयाब रही!**",
-        "failed_rename": "**उसके डिस्कॉर्ड निकनेम को बदला न जा सका!**",
-        "failed_roles": "**रोल जोड़ा न जा सका!**",
-        "footer": "विकी अकाउंट वेरिफिकेशन",
+        "empty": "खाली",
+        "error": "एक त्रुटि के चलते प्रमाणीकरण असफल रहा।",
+        "error_reply": "एक त्रुटि के चलते प्रमाणीकरण असफल रहा, कृपया दोबारा कोशिश करें।",
+        "failed_gblock": "**ग्लोबल ब्लॉक की जाँच असफल रही!**",
+        "failed_rename": "**{{GENDER:$1|उनका}} डिस्कॉर्ड उपनाम बदला नहीं जा सका!**",
+        "failed_roles": "**रोल्स जोड़े नहीं जा सके!**",
+        "footer": "विकि खाते का प्रमाणीकरण",
         "help_fandom": "https://community.fandom.com/wiki/Special:VerifyUser",
-        "help_gamepedia": "https://help.fandom.com/Gamepedia_Help_Wiki:Discord_verification",
-        "help_guide": "अपने विकी प्रोफाइल पर डिस्कॉर्ड टैग जोड़ने के लिए [इस गाइड]($1) की मदद लें:",
-        "help_missing": "कृपया सुनिश्चित करें कि आप अपने विकि के यूज़रनेम का इस्तेमाल कर रहे हैं और केस सही है।",
-        "help_subpage": "कृपया अपने डिस्कॉर्ड टैग ($1) को विकी पर अपने Discord उप-पृष्ठ पर जोड़ें:",
-        "missing": "इस चैनल के लिए कोई वेरिफिकेशन नहीं है।",
+        "help_gamepedia": "https://help.fandom.com/wiki/Gamepedia_Help_Wiki:Discord_verification",
+        "help_guide": "अपने विकि प्रोफ़ाइल पर अपना डिस्कॉर्ड टैग जोड़ने के लिए [इस विधि]($1) का पालन करें:",
+        "help_missing": "कृपया जाँचें कि आप अपने विकि का सदस्यनाम ही जोड़ रहे हैं और इसका केस ठीक है कि नहीं।",
+        "help_subpage": "कृपया अपना डिस्कॉर्ड टैग ($1) विकि पर अपने Discord उपपृष्ठ पर जोड़ें:",
+        "missing": "इस चैनल के लिए कोई प्रमाणीकरण सेट नहीं किया गया है।",
         "notice": "सूचना:",
-        "oauth_button": "ऑथेंटिकेट करें",
-        "oauth_message": "अपने विकि अकाउंट को ऑथेंटिकेट करने के लिए [इस लिंक]($1) का इस्तेमाल करें।",
-        "oauth_message_dm": "कृपया $1 के लिए अपने विकि अकाउंट को ऑथेंटिकेट करने के लिए इस लिंक का इस्तेमाल करें।",
-        "oauth_private": "यह विकि वेरिफिकेशन के लिए OAuth2 का इस्तेमाल करता है। कृपया सर्वर से डायरेक्ट मैसेज सक्षम करें या `/verify` कमांड का इस्तेमाल करें ताकि मैं आपको व्यक्तिगत रूप से एक ऑथेंटिकेशन लिंक भेज सकूँ।",
-        "oauth_used": "*OAuth2 द्वारा वेरिफाई किया गया*",
-        "qualified_add": "इसमें जोड़ा गया है:",
-        "qualified_add_error": "इसमें जोड़ा नहीं गया है:",
-        "qualified_remove": "इससे हटाया गया है:",
-        "qualified_remove_error": "इससे हटाया नहीं गया है:",
-        "user_blocked": "**विकी सदस्य $1 ब्लॉक्ड है!**",
-        "user_blocked_reply": "आप द्वारा लिंक किया गया विकी सदस्य **\"$1\" ब्लॉक्ड है!**",
-        "user_disabled": "**विकी अकाउंट $1 अक्षम है!**",
-        "user_disabled_reply": "आप द्वारा लिंक किया गया विकी सदस्य **\"$1\" अक्षम है!**",
-        "user_failed": "डिस्कॉर्ड सदस्य $1 विकी सदस्य $2 से मिलता नहीं।",
-        "user_failed_reply": "आपका डिस्कॉर्ड टैग विकी सदस्य \"$1\" से मिलता नहीं।",
-        "user_gblocked": "**विकी सदस्य $1 ग्लोबल रूप से ब्लॉक्ड है!**",
-        "user_gblocked_reply": "आप द्वारा लिंक किया गया विकी सदस्य **\"$1\" ग्लोबल रूप से ब्लॉक्ड है!**",
-        "user_matches": "डिस्कॉर्ड सदस्य $1 विकी सदस्य $2 से मिलता है, पर किसी रोल के योग्य नहीं।",
-        "user_matches_reply": "आपका डिस्कॉर्ड सदस्य $1 विकी सदस्य $2 से मिलता है, पर आप किसी रोल के योग्य नहीं।",
-        "user_missing": "विक सदस्य \"$1\" मौजूद नहीं है।",
-        "user_missing_reply": "आप द्वारा लिंक किया गया विकी सदस्य \"$1\" मौजूद नहीं है।",
-        "user_renamed": "उसके डिस्कॉर्ड निकनेम को उसके विकी यूज़रनेम में बदल दिया गया है।",
-        "user_verified": "डिस्कॉर्ड सदस्य $1 को सफलतापूर्वक विकी सदस्य $2 के रूप में वेरीफाई कर लिया गया है।",
-        "user_verified_reply": "आपको सफलतापूर्वक विकी सदस्य \"$1\" के रूप में वेरीफाई कर लिया गया है।",
-        "wiki": "विक सदस्य:"
+        "oauth_button": "प्रमाणित करें",
+        "oauth_message": "अपने विकि खाते को प्रमाणित करने के लिए [इस कड़ी]($1) का इस्तेमाल करें।",
+        "oauth_message_dm": "अपने विकि खाते को $1 के लिए प्रमाणित करने के लिए इस कड़ी का इस्तेमाल करें।",
+        "oauth_private": "यह विकि प्रमाणीकरण के लिए OAuth2 का इस्तेमाल करता है। कृपया इस सर्वर से व्यक्तिगत संदेश सक्षम करें या फिर `/verify` कमांड का इस्तेमाल करें ताकि मैं आपको निजी रूप से एक प्रमाणीकरण कड़ी भेज पाऊँ।",
+        "oauth_used": "OAuth2 की मदद से प्रमाणित",
+        "qualified_add": "इनमें जोड़ा गया:",
+        "qualified_add_error": "इनमें जोड़ा नहीं जा सका:",
+        "qualified_remove": "इनसे हटाया गया:",
+        "qualified_remove_error": "इनसे हटाया नहीं जा सका:",
+        "user_blocked": "**विकि सदस्य $1 अवरोधित हैं!**",
+        "user_blocked_reply": "आपका निर्धारित विकि सदस्य **\"$1\" अवरोधित है!**",
+        "user_disabled": "**विकि खाताt $1 अक्षम है!**",
+        "user_disabled_reply": "आपका निर्धारित विकि सदस्य **\"$1\" अक्षम है!**",
+        "user_failed": "डिस्कॉर्ड सदस्य $1 विकि सदस्य $2 से मेल नहीं खाता।",
+        "user_failed_reply": "आपका डिस्कॉर्ड टैग विकि सदस्य \"$1\" से मेल नहीं खाता।",
+        "user_gblocked": "**विकि सदस्य $1 ग्लोबल रूप से अवरोधित है!**",
+        "user_gblocked_reply": "आपका निर्धारित विकि सदस्य **\"$1\" ग्लोबल रूप से अवरोधित है!**",
+        "user_matches": "डिस्कॉर्ड सदस्य $1 विकि सदस्य $2 से मेल खाता है, मगर वे किसी रोल के लिए आवश्यकताओं को पूरा नहीं कर पाए हैं।",
+        "user_matches_reply": "आपका डिस्कॉर्ड टैग विकि सदस्य \"$1\" से मेल खाता है, मगर आप किसी रोल के लिए आवश्यकताओं को पूरा नहीं कर पाए हैं।",
+        "user_missing": "विकि सदस्य \"$1\" मौजूद नहीं है।",
+        "user_missing_reply": "आपका निर्धारित विकि सदस्य \"$1\" मौजूद नहीं है।",
+        "user_renamed": "{{GENDER:$1|उनके}} डिस्कॉर्ड उपनाम को {{GENDER:$1|उनके}} विकि सदस्यनाम पर बदल दिया गया है।",
+        "user_verified": "डिस्कॉर्ड सदस्य $1 को सफलतापूर्वक विकि सदस्य $2 के रूप में प्रमाणित कर लिया गया है।",
+        "user_verified_reply": "आपको सफलतापूर्वक विकि सदस्य \"$1\" के रूप में प्रमाणित कर लिया गया है।",
+        "wiki": "विकि सदस्य:"
     },
     "voice": {
         "channel": "वॉइस चैनल",
-        "disable": "इस फंक्शन को अक्षम करने के लिए `$1` का इस्तेमाल करें।",
-        "disabled": "आपने वॉइस चैनल पर रोल देने के फंक्शन को अक्षम किया है।",
-        "enable": "इस फंक्शन को अक्षम करने के लिए `$1` का इस्तेमाल करें।",
-        "enabled": "आपने वॉइस चैनल पर रोल देने के फंक्शन को सक्षम किया है।",
+        "disable": "इस सुविधा को अक्षम करने के लिए `$1` का इस्तेमाल करें।",
+        "disabled": "आपने वॉइस चैनल पर रोल्स जोड़ने की सुविधा को अक्षम किया।",
+        "enable": "इस सुविधा को सक्षम करने के लिए `$1` का इस्तेमाल करें।",
+        "enabled": "आपने वॉइस चैनल पर रोल्स जोड़ने की सुविधा को सक्षम किया।",
         "join": "$1 वॉइस चैनल \"$2\" में शामिल हुए।",
-        "left": "$1 ने वॉइस चैनल \"$2\" को छोड़ दिया।",
+        "left": "$1 वॉइस चैनल \"$2\" से निकल गए।",
         "name": "वॉइस चैनल का नाम",
-        "text": "मैं वॉइस चैनल पर सबको एक विशेष रोल देने की कोशिश करूँगा:"
+        "text": "मैं वॉइस चैनल पर सभी को एक रोल देने की कोशिश करता हूँ:"
     }
 }

+ 849 - 0
i18n/id.json

@@ -0,0 +1,849 @@
+{
+    "__translator": [
+        "NFXL",
+        " ",
+        " ",
+        " ",
+        " ",
+        " ",
+        " ",
+        " ",
+        " ",
+        " "
+    ],
+    "aliases": {
+        "bug": [
+            "bugs",
+            " ",
+            " ",
+            " ",
+            " "
+        ],
+        "command": [
+            "perintah",
+            " ",
+            " ",
+            " ",
+            " "
+        ],
+        "diff": [
+            "beda",
+            " ",
+            " ",
+            " ",
+            " "
+        ],
+        "discussion": [
+            "diskusi",
+            " ",
+            " ",
+            " ",
+            " "
+        ],
+        "help": [
+            "bantuan",
+            " ",
+            " ",
+            " ",
+            " "
+        ],
+        "info": [
+            "informasi",
+            " ",
+            " ",
+            " ",
+            " "
+        ],
+        "invite": [
+            "undang",
+            " ",
+            " ",
+            " ",
+            " "
+        ],
+        "overview": [
+            "gambaran",
+            " ",
+            " ",
+            " ",
+            " "
+        ],
+        "page": [
+            "halaman",
+            " ",
+            " ",
+            " ",
+            " "
+        ],
+        "random": [
+            "acak",
+            " ",
+            " ",
+            " ",
+            " "
+        ],
+        "search": [
+            "pencarian",
+            " ",
+            " ",
+            " ",
+            " "
+        ],
+        "test": [
+            "tes",
+            " ",
+            " ",
+            " ",
+            " "
+        ],
+        "user": [
+            "pengguna",
+            " ",
+            " ",
+            " ",
+            " "
+        ],
+        "verify": [
+            "verifikasi",
+            " ",
+            " ",
+            " ",
+            " "
+        ]
+    },
+    "dateformat": "id-ID",
+    "diff": {
+        "badrev": "Setidaknya satu revisi tidak ada!",
+        "hidden": "*tersembunyi*",
+        "info": {
+            "added": "Ditambahkan:",
+            "bytes": "$1 {{PLURAL:$2|byte|bytes}}",
+            "comment": "Komentar:",
+            "editor": "Editor:",
+            "minor": "_(m)",
+            "more": "Dan banyak lagi",
+            "removed": "Dibuang:",
+            "size": "Perbedaan:",
+            "tags": "Tags:",
+            "timestamp": "Ubah tanggal:",
+            "whitespace": "Hanya ruang kosong"
+        },
+        "nocomment": "*Tidak ada deskripsi yang tersedia*"
+    },
+    "discussion": {
+        "image": "Lihat gambar",
+        "main": "Diskusi",
+        "post": "post",
+        "tags": "Tags:",
+        "votes": "$1 {{PLURAL:$2|pilih|suara}} ($3%)"
+    },
+    "fallback": [
+        "en",
+        " ",
+        " ",
+        " ",
+        " "
+    ],
+    "general": {
+        "database": "⚠️ **Fungsi Dibatasi**⚠️\nTidak ada pengaturan yang ditemukan, Silakan hubungi pemilik bot!",
+        "default": "Server ini belum disiapkan. Gunakan $1 atau dasbor untuk mengubah setelan.",
+        "disclaimer": "Saya adalah bot kecil dengan tujuan sederhana untuk menautkan dan mencari situs MediaWiki seperti Wikipedia dan wiki Fandom. Saya menunjukkan deskripsi singkat dan info tambahan tentang suatu halaman dan juga saya dapat menyelesaikan pengalihan dan mengikuti tautan interwiki. $1 menulis saya dalam JavaScript.\n\nKamu dapat mendukung $1 di Patreon berikut ini:",
+        "experimental": "**Fitur ini dalam uji coba! Itu tidak dijamin berfungsi dengan benar dan dapat dihapus di masa mendatang.**",
+        "helpserver": "Untuk pertanyaan dan masalah, silakan kunjungi server dukungan saya:",
+        "limit": "**Berhenti, Kamu mencapai batas!**\n\n$1, pesan mu berisi terlalu banyak perintah!",
+        "missingperm": "Saya kehilangan beberapa izin untuk perintah ini:",
+        "patreon": "Ini adalah satu-satunya fitur Patreon!\nKamu dapat mendukung saya di Patreon untuk mendapatkan akses ke fitur ini:",
+        "prefix": "Prefix untuk server ini adalah `$1`. Kamu dapat mengubah awalan dengan `$1settings prefix`. Untuk melihat semua daftar perintah, ketik dan lihat `$1help`.",
+        "readonly": "**Basis data saat ini dalam mode read-only, Kamu tidak dapat mengubah pengaturan apa pun sekarang!**"
+    },
+    "help": {
+        "admin": "Perintah ini hanya dapat dilakukan oleh administrator:",
+        "adminfooter": "Administrator juga dapat menggunakan dasbor untuk mengubah pengaturan bot:",
+        "all": "Jadi, kamu ingin tahu hal-hal apa yang bisa saya lakukan? Berikut adalah daftar semua perintah yang saya mengerti:",
+        "footer": "Jika Kamu mendapat respons yang tidak diinginkan, kamu dapat bereaksi dengan 🗑️ (`:wastebasket:`) ke pesan saya dan saya akan menghapusnya.",
+        "list": {
+            "default": {
+                "cmd": "<istilah pencarian>",
+                "desc": "Saya akan menjawab dengan tautan ke artikel yang cocok di wiki."
+            },
+            "diff": {
+                "id": {
+                    "cmd": "diff <beda> [<oldid>]",
+                    "desc": "Saya akan menjawab dengan tautan ke diff di wiki."
+                },
+                "name": {
+                    "cmd": "diff <nama halaman>",
+                    "desc": "Saya akan menjawab dengan tautan ke diff terakhir pada artikel di wiki."
+                }
+            },
+            "discussion": {
+                "post": {
+                    "cmd": "discussion post <istilah penelusuran>",
+                    "desc": "Saya akan menjawab dengan tautan ke posting diskusi yang cocok di wiki Fandom."
+                },
+                "thread": {
+                    "cmd": "discussion <istilah penelusuran>",
+                    "desc": "Saya akan menjawab dengan tautan ke utas diskusi yang cocok di wiki Fandom."
+                }
+            },
+            "fandom": {
+                "cmd": "?<wiki> <istilah pencarian>",
+                "desc": "Saya akan menjawab dengan tautan ke artikel yang cocok di wiki Fandom bernama: `https://<wiki>.fandom.com/`"
+            },
+            "gamepedia": {
+                "cmd": "!<wiki> <search term>",
+                "desc": "Saya akan menjawab dengan tautan ke artikel yang cocok di wiki Gamepedia bernama: `https://<wiki>.gamepedia.com/`"
+            },
+            "help": {
+                "admin": {
+                    "cmd": "help admin",
+                    "desc": "Saya akan mencantumkan semua perintah administrator."
+                },
+                "command": {
+                    "cmd": "help <perintah bot>",
+                    "desc": "Ingin tahu bagaimana sebuah perintah bekerja? Biarkan saya menjelaskannya kepada mu!"
+                },
+                "default": {
+                    "cmd": "help",
+                    "desc": "Saya akan membuat daftar semua perintah yang saya mengerti."
+                }
+            },
+            "info": {
+                "cmd": "info",
+                "desc": "Biarkan saya memperkenalkan diri."
+            },
+            "inline": {
+                "link": {
+                    "cmd": "[[<nama halaman>]]",
+                    "desc": "Saya akan menjawab dengan tautan langsung ke artikel di wiki."
+                },
+                "template": {
+                    "cmd": "{{<nama halaman>}}",
+                    "desc": "Saya akan menjawab dengan tautan ke artikel di wiki."
+                }
+            },
+            "minecraft": {
+                "bug": {
+                    "cmd": "bug <Minecraft bug>",
+                    "desc": "Saya akan menjawab dengan tautan ke Minecraft bug tracker."
+                },
+                "command": {
+                    "cmd": "command <Perintah Minecraft>",
+                    "desc": "Saya akan menjawab dengan sintaks perintah Minecraft dan tautan ke artikel untuk perintah di Wiki Minecraft."
+                },
+                "default": {
+                    "cmd": "/<Perintah Minecraft>",
+                    "desc": "Saya akan menjawab dengan sintaks perintah Minecraft dan tautan ke artikel untuk perintah di Wiki Minecraft."
+                }
+            },
+            "mwprojects": {
+                "cmd": "!!<wiki> <istilah pencarian>",
+                "desc": "Saya akan menjawab dengan tautan ke artikel yang cocok di proyek MediaWiki bernama. Contoh: `$1!!en.wikipedia.org Cookie`"
+            },
+            "overview": {
+                "cmd": "overview",
+                "desc": "Saya akan menunjukkan beberapa informasi dan statistik tentang wiki."
+            },
+            "page": {
+                "cmd": "page <nama halaman>",
+                "desc": "Saya akan menjawab dengan tautan langsung ke artikel di wiki."
+            },
+            "pause": {
+                "active": {
+                    "cmd": "pause $1",
+                    "desc": "Saya akan menanggapi semua perintah di server ini lagi."
+                },
+                "inactive": {
+                    "cmd": "pause $1",
+                    "desc": "Saya akan mengabaikan semua perintah di server ini, kecuali beberapa perintah admin."
+                }
+            },
+            "random": {
+                "cmd": "random",
+                "desc": "Saya akan menjawab dengan tautan ke halaman acak di wiki."
+            },
+            "rcscript": {
+                "add": {
+                    "cmd": "rcscript add [<wiki>]",
+                    "desc": "Saya akan menambahkan webhook perubahan baru."
+                },
+                "default": {
+                    "cmd": "rcscript",
+                    "desc": "Saya akan mengubah webhook perubahan terbaru."
+                },
+                "delete": {
+                    "cmd": "rcscript delete",
+                    "desc": "Saya akan menghapus webhook perubahan terbaru."
+                },
+                "display": {
+                    "cmd": "rcscript display <mode tampilan baru>",
+                    "desc": "Saya akan mengubah mode tampilan untuk webhook perubahan terbaru."
+                },
+                "feeds": {
+                    "cmd": "rcscript feeds",
+                    "desc": "Saya akan mengaktifkan perubahan diskusi di wiki Fandom untuk webhook perubahan terbaru."
+                },
+                "lang": {
+                    "cmd": "rcscript lang <bahasa baru>",
+                    "desc": "Saya akan mengubah mode tampilan untuk webhook perubahan terbaru."
+                },
+                "wiki": {
+                    "cmd": "rcscript wiki <wiki baru>",
+                    "desc": "Saya akan mengubah wiki untuk webhook perubahan terbaru."
+                }
+            },
+            "search": {
+                "cmd": "search <istilah pencarian>",
+                "desc": "Saya akan menjawab dengan tautan langsung ke halaman pencarian artikel di wiki."
+            },
+            "settings": {
+                "channel": {
+                    "cmd": "settings channel",
+                    "desc": "Saya akan mengubah penimpaan untuk saluran saat ini."
+                },
+                "default": {
+                    "cmd": "settings",
+                    "desc": "Saya akan mengubah pengaturan untuk server ini."
+                },
+                "inline": {
+                    "cmd": "settings inline toggle",
+                    "desc": "Saya akan mengaktifkan perintah sebaris untuk server ini."
+                },
+                "lang": {
+                    "cmd": "settings lang <bahasa>",
+                    "desc": "Saya akan mengubah bahasa untuk server ini."
+                },
+                "prefix": {
+                    "cmd": "settings prefix <prefix>",
+                    "desc": "Saya akan mengubah awalan untuk server ini."
+                },
+                "role": {
+                    "cmd": "settings role <role>",
+                    "desc": "Saya akan mengubah peran minimal yang diperlukan untuk menggunakan perintah untuk server ini."
+                },
+                "wiki": {
+                    "cmd": "settings wiki <wiki>",
+                    "desc": "Saya akan mengubah wiki default untuk server ini."
+                }
+            },
+            "test": {
+                "cmd": "test",
+                "desc": "Jika saya aktif, saya akan menjawab! Jika tidak."
+            },
+            "user": {
+                "cmd": "User:<username>",
+                "desc": "Saya akan menunjukkan beberapa informasi tentang pengguna."
+            },
+            "verification": {
+                "accountage": {
+                    "cmd": "verification <id> accountage <umur akun baru>",
+                    "desc": "Saya akan mengubah usia akun minimal (dalam hari) untuk verifikasi wiki."
+                },
+                "add": {
+                    "cmd": "verification add <role>",
+                    "desc": "Saya akan menambahkan verifikasi wiki baru. Menerima `|` daftar terpisah."
+                },
+                "channel": {
+                    "cmd": "verification <id> channel <saluran baru>",
+                    "desc": "Saya akan mengubah saluran untuk verifikasi wiki. Menerima `|` daftar terpisah."
+                },
+                "default": {
+                    "cmd": "verification",
+                    "desc": "Saya akan mengubah verifikasi wiki yang digunakan oleh perintah `$1verify`."
+                },
+                "delete": {
+                    "cmd": "verification <id> delete",
+                    "desc": "Saya akan menghapus verifikasi wiki."
+                },
+                "editcount": {
+                    "cmd": "verification <id> editcount <jumlah edit baru>",
+                    "desc": "Saya akan mengubah jumlah edit minimal untuk verifikasi wiki."
+                },
+                "postcount": {
+                    "cmd": "verification <id> postcount <jumlah posting baru>",
+                    "desc": "Saya akan mengubah jumlah posting diskusi minimal untuk verifikasi wiki.\n• Berikan nomor negatif untuk meminta edit atau jumlah posting.\n• Berikan `null` untuk memeriksa gabungan edit dan jumlah posting."
+                },
+                "rename": {
+                    "cmd": "verification <id> rename",
+                    "desc": "Saya akan mengubah jika nama panggilan Discord pengguna harus diubah menjadi nama pengguna wiki mereka untuk verifikasi wiki."
+                },
+                "role": {
+                    "cmd": "verification <id> role <role baru>",
+                    "desc": "Saya akan mengubah peran untuk verifikasi wiki. Menerima daftar terpisah `|`."
+                },
+                "usergroup": {
+                    "cmd": "verification <id> usergroup <grup pengguna baru>",
+                    "desc": "Saya akan mengubah grup pengguna untuk verifikasi wiki. Menerima daftar terpisah `|`.\n• Berikan `AND` sebagai entri daftar pertama untuk membuat semua grup pengguna yang disediakan diperlukan."
+                }
+            },
+            "verify": {
+                "cmd": "verify <nama pengguna wiki>",
+                "desc": "Gunakan perintah ini untuk memverifikasi akun Discord kamu dengan akun wiki dan mendapatkan lah peran yang cocok dengan akun wiki Anda."
+            },
+            "voice": {
+                "cmd": "voice",
+                "desc": "Saya mencoba memberi semua orang di saluran suara peran tertentu."
+            },
+            "wikia": {
+                "cmd": "??<wiki> <search term>",
+                "desc": "Saya akan menjawab dengan tautan ke artikel yang cocok di wiki Wikia bernama: `https://<wiki>.wikia.org/`"
+            }
+        },
+        "noadmin": "Kamu memerlukan izin `Kelola Server` untuk perintah ini!",
+        "pause": "**Saat ini saya sedang dijeda di server ini!**\nHanya perintah ini yang dapat dilakukan:"
+    },
+    "interaction": {
+        "inline": "Harap berikan beberapa teks dengan tautan [[wikitext]] untuk menggunakan perintah ini.",
+        "nowiki": "Wiki yang dicantumkan tidak ada!",
+        "verify": "Harap berikan nama pengguna wiki kamu untuk menggunakan perintah ini untuk memverifikasi akun Discord milik kamu dengan akun wiki dan dapatkan peran yang cocok dengan akun wiki mu."
+    },
+    "invite": {
+        "bot": "Gunakan tautan ini untuk mengundang saya ke server lain:"
+    },
+    "minecraft": {
+        "fixed": "Gunakan tautan ini untuk mengundang saya ke server lain: {{PLURAL:$1|Versi|Versi}} telah diperbaiki:",
+        "issue_link": {
+            "Blocks": {
+                "inward": "diblokir oleh $1",
+                "outward": "blok $1"
+            },
+            "Bonfire Testing": {
+                "inward": "ditemukan saat menguji $1",
+                "outward": "pengujian ditemukan $1"
+            },
+            "Cloners": {
+                "inward": "dikloning oleh $1",
+                "outward": "kloningan $1"
+            },
+            "Duplicate": {
+                "inward": "diduplikasikan oleh $1",
+                "outward": "duplikat $1"
+            },
+            "Relates": {
+                "inward": "berhubungan dengan $1",
+                "outward": "berhubungan dengan $1"
+            }
+        },
+        "more": "Dan $1 selebihnya.",
+        "private": "**Masalah Pribadi**",
+        "status": {
+            "Awaiting Response": "Menunggu Respon",
+            "Cannot Reproduce": "Tidak Dapat Mereproduksi",
+            "Closed": "Tertutup",
+            "Done": "Selesai",
+            "Duplicate": "Duplikat",
+            "Fixed": "Diperbaiki",
+            "In Progress": "Dalam Proses",
+            "Incomplete": "Belum Selesai",
+            "Invalid": "Tidak sah",
+            "Open": "Terbuka",
+            "Postponed": "Ditunda",
+            "Reopened": "dibuka kembali",
+            "Resolved": "Terselesaikan",
+            "Won't Fix": "Tidak akan Memperbaiki",
+            "Works As Intended": "Bekerja Seperti yang Dimaksudkan"
+        },
+        "total": "$1 {{PLURAL:$2|masalah|masalah}} diperbaiki"
+    },
+    "overview": {
+        "admins": "Pengurus:",
+        "articles": "Artikel:",
+        "comments": "Komentar artikel:",
+        "created": "Dibuat:",
+        "crossover": "Digabung menjadi:",
+        "description": "Deskripsi:",
+        "edits": "Suntingan:",
+        "founder": "Pendiri:",
+        "image": "Gambar:",
+        "inaccurate": "Statistik mungkin tidak akurat",
+        "lang": "Bahasa:",
+        "license": "Lisensi:",
+        "manager": "Manajer Wiki:",
+        "misermode": "Mode miser:",
+        "no": "Tidak",
+        "none": "*kosong*",
+        "official": "Wiki resmi:",
+        "pages": "Jumlah halaman:",
+        "posts": "Postingan diskusi:",
+        "readonly": "Wiki ini sedang dalam mode hanya-baca!",
+        "rtl": "Kanan ke kiri:",
+        "talk": "bicara",
+        "topic": "Tema:",
+        "unknown": "*tidak diketahui*",
+        "users": "Pengguna aktif:",
+        "version": "Versi:",
+        "vertical": "Vertikal:",
+        "walls": "Postingan dinding pesan:",
+        "wikiid": "ID Wiki:",
+        "yes": "Iya"
+    },
+    "pause": {
+        "off": "Saya tidak lagi dijeda di server ini dan akan menanggapi semua perintah lagi!",
+        "on": "Saya sekarang dijeda di server ini dan akan mengabaikan sebagian besar perintah!"
+    },
+    "rcscript": {
+        "ad": "Anda ingin perubahan terbaru langsung di Discord? Gunakan `$1rcscript` untuk menambahkan webhook perubahan terbaru berdasarkan **$2** ke server Discord Anda!",
+        "add_more": "Tambahkan lebih banyak perubahan terbaru webhook:",
+        "added": "Webhook perubahan terbaru telah ditambahkan untuk:",
+        "all_inactive": "Kamu tidak dapat menonaktifkan perubahan wiki dan perubahan berbasis feed secara bersamaan.",
+        "audit_reason": "Perubahan terbaru webhook untuk \"$1\"",
+        "audit_reason_delete": "Menghapus webhook perubahan terbaru",
+        "audit_reason_edit": "Webhook perubahan terbaru yang diperbarui",
+        "avatar": "Avatar webhook:",
+        "blocked": "Wiki ini telah diblokir agar tidak ditambahkan sebagai webhook perubahan terbaru!",
+        "blocked_reason": "Wiki ini telah diblokir agar tidak ditambahkan sebagai webhook perubahan terbaru untuk `$1`!",
+        "channel": "Saluran:",
+        "current": "Ini adalah webhook perubahan terbaru saat ini untuk server ini:",
+        "current_display": "Mode tampilan untuk webhook ini adalah:",
+        "current_lang": "Bahasa untuk webhook ini adalah:",
+        "current_selected": "Ini adalah perubahan terbaru webhook `$1` untuk server ini:",
+        "current_wiki": "Wiki untuk webhook ini adalah:",
+        "dashboard": {
+            "added": "$1 menambahkan webhook perubahan terbaru dengan id `$2`.",
+            "removed": "$1 menghapus webhook perubahan terbaru dengan id `$2`.",
+            "updated": "$1 memperbarui webhook perubahan terbaru dengan id `$2`."
+        },
+        "delete": "Hapus webhook perubahan terbaru ini:",
+        "deleted": "Webhook perubahan terbaru telah dihapus.",
+        "disabled": "dimatikan",
+        "disabled_feeds": "Perubahan berbasis umpan, seperti diskusi, dinding pesan, dan komentar artikel, untuk webhook ini telah dinonaktifkan.",
+        "disabled_rc": "Perubahan wiki untuk webhook ini telah dinonaktifkan.",
+        "display": "Mode tampilan:",
+        "enabled": "dihidupkan",
+        "enabled_feeds": "Perubahan berbasis umpan, seperti diskusi, dinding pesan, dan komentar artikel, untuk webhook ini telah diaktifkan.",
+        "enabled_rc": "Perubahan wiki untuk webhook ini telah diaktifkan.",
+        "feeds": "Perubahan berbasis feed:",
+        "help_display_compact": "Pesan teks ringkas dengan tautan sebaris.",
+        "help_display_diff": "Sematkan pesan dengan pratinjau gambar dan edit perbedaan.",
+        "help_display_embed": "Sematkan pesan dengan tag edit dan perubahan kategori.",
+        "help_display_image": "Sematkan pesan dengan pratinjau gambar.",
+        "help_feeds": "(diskusi, dinding pesan, komentar artikel)",
+        "help_lang": "Bahasa yang didukung saat ini adalah:",
+        "help_wiki": "Tautan ke situs MediaWiki seperti `https://<wiki>.fandom.com/`",
+        "lang": "Bahasa:",
+        "max_entries": "Kamu telah mencapai jumlah maksimal webhook perubahan terbaru.",
+        "missing": "Belum ada webhook perubahan terbaru untuk server ini.",
+        "name": "Nama webhook:",
+        "new_lang": "<bahasa baru>",
+        "new_wiki": "<tautan ke wiki>",
+        "no_feeds": "Wiki untuk webhook ini tidak mengaktifkan fitur berbasis umpan, seperti diskusi, dinding pesan, atau komentar artikel.",
+        "noadmin": "Kamu memerlukan izin `Kelola Webhooks` untuk perintah ini!",
+        "rc": "Perubahan Wiki:",
+        "sysmessage": "Pesan sistem `$1` harus berupa id server `$2` untuk menambahkan webhook perubahan terbaru.",
+        "title": "Perubahan terbaru webhook",
+        "toggle": "(beralih)",
+        "updated_display": "Mode tampilan untuk webhook ini telah diubah menjadi:",
+        "updated_lang": "Bahasa untuk webhook ini telah diubah menjadi:",
+        "updated_wiki": "Wiki untuk webhook ini telah diubah menjadi:",
+        "webhook": {
+            "blocked": "Webhook perubahan terbaru ini akan dihapus karena wiki telah diblokir!",
+            "blocked_help": "Kamu dapat meminta detail lebih lanjut di [server dukungan]($1).",
+            "blocked_reason": "Webhook perubahan terbaru ini akan dihapus karena wiki telah diblokir untuk `$1`!",
+            "created": "Webhook perubahan terbaru untuk $1 telah ditambahkan ke saluran ini.",
+            "dashboard": {
+                "avatar": "• Avatar webhook telah diubah.",
+                "channel": "• Webhook telah dipindahkan ke saluran ini.",
+                "disabled_feeds": "• Perubahan berbasis feed, seperti diskusi, dinding pesan, dan komentar artikel, telah dinonaktifkan.",
+                "disabled_rc": "• Perubahan wiki telah dinonaktifkan.",
+                "display_compact": "• Mode tampilan telah diubah menjadi pesan teks ringkas dengan tautan sebaris.",
+                "display_diff": "• Mode tampilan telah diubah untuk menyematkan pesan dengan pratinjau gambar dan mengedit perbedaan.",
+                "display_embed": "• Mode tampilan telah diubah untuk menyematkan pesan dengan tag edit dan perubahan kategori.",
+                "display_image": "• Mode tampilan telah diubah untuk menyematkan pesan dengan pratinjau gambar.",
+                "enabled_feeds": "• Perubahan berbasis feed, seperti diskusi, dinding pesan, dan komentar artikel, telah diaktifkan.",
+                "enabled_rc": "• Perubahan wiki telah diaktifkan.",
+                "lang": "• Bahasa telah diubah menjadi $1.",
+                "name": "• Nama webhook telah diubah menjadi \"$1\".",
+                "updated": "Webhook perubahan terbaru ini telah diperbarui:",
+                "wiki": "• Wiki telah diubah menjadi $1."
+            },
+            "deleted": "Webhook perubahan terbaru ini akan dihapus.",
+            "disabled_feeds": "Perubahan berbasis umpan, seperti diskusi, dinding pesan, dan komentar artikel, telah dinonaktifkan untuk webhook perubahan terbaru ini.",
+            "disabled_rc": "Perubahan wiki telah dinonaktifkan untuk webhook perubahan terbaru ini.",
+            "enabled_feeds": "Perubahan berbasis umpan, seperti diskusi, dinding pesan, dan komentar artikel, telah diaktifkan untuk webhook perubahan terbaru ini.",
+            "enabled_rc": "Perubahan wiki telah diaktifkan untuk webhook perubahan terbaru ini.",
+            "updated_display_compact": "Mode tampilan telah diubah menjadi pesan teks ringkas dengan tautan sebaris untuk webhook perubahan terbaru ini.",
+            "updated_display_diff": "Mode tampilan telah diubah untuk menyematkan pesan dengan pratinjau gambar dan mengedit perbedaan untuk webhook perubahan terbaru ini.",
+            "updated_display_embed": "Mode tampilan telah diubah untuk menyematkan pesan dengan tag edit dan perubahan kategori untuk webhook perubahan terbaru ini.",
+            "updated_display_image": "Mode tampilan telah diubah untuk menyematkan pesan dengan pratinjau gambar untuk webhook perubahan terbaru ini.",
+            "updated_lang": "Bahasa telah diubah menjadi `$1` untuk webhook perubahan terbaru ini.",
+            "updated_wiki": "Wiki telah diubah menjadi $1 untuk webhook perubahan terbaru ini."
+        },
+        "webhook_failed": "Sayangnya webhook tidak dapat dibuat, coba lagi nanti.",
+        "wiki": "Wiki:"
+    },
+    "search": {
+        "cached": "Tembolok terakhir diperbarui:",
+        "category": {
+            "content": "Isi dari kategori ini:",
+            "empty": "*Kategori ini kosong*",
+            "files": "$1 {{PLURAL:$2|berkas|berkas}}",
+            "pages": "$1 {{PLURAL:$2|halaman|halaman}}",
+            "subcats": "$1 {{PLURAL:$2|kategori|kategori}}"
+        },
+        "empty": "*Halaman khusus ini kosong*",
+        "infopage": "Bukan hasil yang benar? Gunakan $1 untuk tautan langsung.",
+        "infosearch": "Bukan hasil yang benar? Gunakan $1 untuk tautan langsung atau $2 untuk daftar semua hit.",
+        "loading": "Memuat deskripsi halaman…",
+        "media": "Ke halaman deskripsi file",
+        "messagedefault": "Bawaan:",
+        "messagedefaultnone": "*tidak ada*",
+        "results": "$1 total {{PLURAL:$2|hasil|hasil}}",
+        "special": "Konten halaman khusus ini:"
+    },
+    "settings": {
+        "button": "Gunakan Dasbor",
+        "channel current": "Ini adalah pengaturan saat ini untuk saluran ini:",
+        "channel lang": "Bahasa untuk saluran ini adalah:",
+        "channel langchanged": "Kamu mengubah bahasa saluran ini menjadi:",
+        "channel role": "Peran minimal yang diperlukan untuk saluran ini adalah:",
+        "channel rolechanged": "Kamu mengubah peran minimal yang diperlukan untuk saluran ini menjadi:",
+        "channel wiki": "Wiki default untuk saluran ini adalah:",
+        "channel wikichanged": "Kamu mengubah wiki default untuk saluran ini menjadi:",
+        "current": "Ini adalah pengaturan saat ini untuk server ini:",
+        "currentchannel": "Penimpaan saluran:",
+        "currentinline": "Perintah sebaris:",
+        "currentlang": "Bahasa:",
+        "currentprefix": "Prefix:",
+        "currentrole": "Peran minimal:",
+        "currentwiki": "Wiki utama:",
+        "dashboard": {
+            "channel": "$1 memperbarui pengaturan untuk $2.",
+            "removed": "$1 menghapus pengaturan untuk $2.",
+            "updated": "$1 memperbarui pengaturan server."
+        },
+        "foundwikis": "Apakah maksud mu salah satu dari wiki ini?",
+        "inline disabled": {
+            "channel inline": "Perintah sebaris saat ini dinonaktifkan untuk saluran ini.",
+            "channel inlinechanged": "Kamu menonaktifkan perintah sebaris untuk saluran ini.",
+            "help": "Gunakan `$1` untuk mengaktifkan perintah sebaris seperti `[[$2]]` dan `{{$2}}`.",
+            "inline": "Perintah sebaris saat ini dinonaktifkan untuk server ini.",
+            "inlinechanged": "Kamu menonaktifkan perintah sebaris untuk server ini."
+        },
+        "inline enabled": {
+            "channel inline": "Perintah sebaris saat ini diaktifkan untuk saluran ini.",
+            "channel inlinechanged": "Kamu mengaktifkan perintah sebaris untuk saluran ini.",
+            "help": "Gunakan `$1` untuk menonaktifkan perintah sebaris seperti `[[$2]]` dan `{{$2}}`.",
+            "inline": "Perintah sebaris saat ini diaktifkan untuk server ini.",
+            "inlinechanged": "Kamu mengaktifkan perintah sebaris untuk server ini."
+        },
+        "lang": "Bahasa untuk server ini adalah:",
+        "langchanged": "Kamu mengubah bahasa untuk server ini menjadi:",
+        "langhelp": "Gunakan `$1 <bahasa>` untuk mengubah bahasa.\nBahasa yang didukung saat ini adalah:",
+        "langinvalid": "Bahasa yang ditentukan tidak didukung!",
+        "missing": "Server ini belum disiapkan. Gunakan $1 dan $2 untuk mengubah pengaturan.",
+        "nochannels": "*Belum ada saluran yang ditimpa*",
+        "prefix": "Awalan untuk server ini adalah:",
+        "prefixchanged": "Kamu mengubah awalan untuk server ini menjadi:",
+        "prefixhelp": "Gunakan `$1 <prefix>` untuk mengubah awalan.\nGunakan `_` di akhir untuk menunjukkan spasi di akhir awalan.\nAwalan mungkin tidak termasuk sebutan!",
+        "prefixinvalid": "Awalan yang ditentukan tidak didukung!",
+        "role": "Peran minimal yang diperlukan untuk server ini adalah:",
+        "rolechanged": "Kamu mengubah peran minimal yang diperlukan untuk server ini menjadi:",
+        "rolehelp": "Gunakan `$1 <role>` untuk mengubah peran minimal yang diperlukan.",
+        "roleinvalid": "Peran yang ditentukan tidak ada!",
+        "save_failed": "Sayangnya pengaturannys tidak dapat disimpan, coba lagi nanti.",
+        "wiki": "Wiki default untuk server ini adalah:",
+        "wikichanged": "Kamu mengubah wiki default untuk server ini menjadi:",
+        "wikihelp": "Gunakan `$1 <link>` untuk mengubah wiki default.\nTautan ke situs MediaWiki seperti `https://<wiki>.fandom.com/`",
+        "wikiinvalid": "Harap berikan tautan yang valid ke situs MediaWiki, seperti Wikipedia atau wiki Fandom!",
+        "wikiinvalid_http": "Situs web yang disediakan tidak memiliki sertifikat TLS/SSL yang valid! Untuk alasan keamanan, hanya wiki yang menggunakan HTTPS yang didukung.\nJika Kamu adalah administrator situs, kamu bisa mendapatkan sertifikat dari otoritas sertifikat seperti *Let’s Encrypt*:\n<https://letsencrypt.org/getting-started/>",
+        "wikiinvalid_private": "Wiki yang disediakan bersifat pribadi! Hanya wiki publik yang dapat dibaca oleh semua orang yang didukung.",
+        "wikiinvalid_timeout": "Tautan yang disediakan terlalu lama untuk ditanggapi!",
+        "wikimissing": "Belum ada wiki default yang disetel untuk server ini!"
+    },
+    "test": {
+        "MediaWiki": "Membutuhkan setidaknya $1 untuk fungsionalitas penuh, ditemukan `$2`.",
+        "notice": "Fungsionalitas terbatas",
+        "pause": "Saat ini saya dijeda di server ini.",
+        "slow": "Maaf, sepertinya saya agak lambat sekarang.",
+        "text": [
+            "Saya berfungsi penuh!",
+            " ",
+            " ",
+            " ",
+            " ",
+            " ",
+            " ",
+            " ",
+            " ",
+            " ",
+            " ",
+            " ",
+            " ",
+            " ",
+            " ",
+            " ",
+            " ",
+            " ",
+            " ",
+            " ",
+            " ",
+            " ",
+            " ",
+            " ",
+            " ",
+            " ",
+            " ",
+            " ",
+            " ",
+            " "
+        ],
+        "time": "Waktu merespon"
+    },
+    "user": {
+        "block": {
+            "duration": {
+                "days": "$1 {{PLURAL:$2|hari|hari}}",
+                "hours": "$1 {{PLURAL:$2|jam|jam}}",
+                "minutes": "$1 {{PLURAL:$2|minute|minutes}}",
+                "months": "$1 {{PLURAL:$2|bulan|bulan}}",
+                "separator": ",_",
+                "separator_last": "_dan_",
+                "weeks": "$1 {{PLURAL:$2|minggu|minggu}}",
+                "years": "$1 {{PLURAL:$2|tahun|tahun}}"
+            },
+            "header": "$1 saat ini diblokir!",
+            "indef_noreason": "Diblokir tanpa batas pada $1 oleh $4.",
+            "indef_text": "Diblokir tanpa batas pada $1 oleh $4 dengan alasan \"$5\".",
+            "noreason": "Diblokir pada $1 untuk $2 hingga $3 oleh $4.",
+            "text": "Diblokir pada $1 untuk $2 hingga $3 oleh $4 dengan alasan \"$5\"."
+        },
+        "gblock": {
+            "disabled": "Akun ini saat ini dinonaktifkan!",
+            "header": "$1 saat ini diblokir secara global!"
+        },
+        "gender": {
+            "female": "Wanita",
+            "male": "Pria",
+            "unknown": "Privasi"
+        },
+        "info": {
+            "discord": "Discord:",
+            "editcount": "Mengedit jumlah:",
+            "favwiki": "wiki favorit:",
+            "gender": "Jenis kelamin:",
+            "globaleditcount": "Jumlah edit global:",
+            "globalgroup": "{{PLURAL:$1|grup|grup}} global:",
+            "group": "{{PLURAL:$1|Grup|Grup}}:",
+            "loading": "Sedang memuat statistik global…",
+            "postcount": "Postingan diskusi:",
+            "registration": "Tanggal registrasi:",
+            "wikisedited": "Wiki diedit:"
+        }
+    },
+    "verification": {
+        "accountage": "Usia akun:",
+        "add_more": "Tambahkan lebih banyak verifikasi:",
+        "added": "Verifikasi telah ditambahkan:",
+        "and": "dan",
+        "channel": "Saluran:",
+        "channel_max": "Kamu menyediakan terlalu banyak saluran.",
+        "channel_missing": "Saluran yang disediakan tidak ada.",
+        "current": "Ini adalah verifikasi saat ini untuk server ini:",
+        "current_selected": "Ini adalah verifikasi `$1` untuk server ini:",
+        "dashboard": {
+            "added": "$1 menambahkan verifikasi dengan id `$2`.",
+            "added_notice": "$1 menambahkan beberapa pemberitahuan verifikasi.",
+            "removed": "$1 menghapus verifikasi dengan id `$2`.",
+            "updated": "$1 memperbarui verifikasi dengan id `$2`.",
+            "updated_notice": "$1 memperbarui beberapa pemberitahuan verifikasi."
+        },
+        "delete_current": "Hapus verifikasi ini:",
+        "deleted": "Verifikasi telah dihapus.",
+        "disabled": "dimatikan",
+        "editcount": "Jumlah edit:",
+        "enabled": "diaktifkan",
+        "flag_logall": "Pencatatan verifikasi yang gagal:",
+        "flag_private": "Mengirim tanggapan perintah verifikasi secara pribadi:",
+        "indays": "(dalam hari)",
+        "logging": "Saluran pencatatan:",
+        "match": "Pemberitahuan persyaratan yang tidak ada:",
+        "max_entries": "Kamu telah mencapai jumlah verifikasi maksimal.",
+        "missing": "Belum ada verifikasi untuk server ini.",
+        "new_accountage": "<usia akun baru>",
+        "new_channel": "<saluran baru>",
+        "new_editcount": "<jumlah edit baru>",
+        "new_postcount": "<jumlah postingan baru>",
+        "new_role": "<role baru>",
+        "new_usergroup": "<grup pengguna baru>",
+        "no_role": "Harap berikan peran untuk verifikasi baru.",
+        "notice_embed": "Beberapa pemberitahuan menyertakan tautan penurunan harga bertopeng. Pastikan bot memiliki izin `Sematkan Tautan` di semua saluran verifikasi agar berfungsi dengan baik.",
+        "or": "atau",
+        "postcount": "Jumlah postingan (hanya wiki Fandom):",
+        "postcount_or": "(alternatif untuk mengedit hitungan)",
+        "posteditcount": "Edit dan jumlah posting digabungkan:",
+        "rename": "Ubah nama panggilan:",
+        "rename_no_permission": "**$1 tidak memiliki izin `Kelola Nama Panggilan` untuk memaksa nama pengguna wiki!**",
+        "role_add": "Peran untuk ditambahkan:",
+        "role_deleted": "**Role $1 sepertinya sudah tidak ada lagi!**",
+        "role_managed": "Peran yang diberikan tidak dapat ditetapkan.",
+        "role_max": "Kamu memberikan terlalu banyak peran.",
+        "role_missing": "Peran yang diberikan tidak ada.",
+        "role_none": "tidak ada",
+        "role_remove": "Role dicabut:",
+        "role_too_high": "**Peran $1 terlalu tinggi untuk ditetapkan $2!**",
+        "save_failed": "Sayangnya verifikasi tidak dapat disimpan, coba lagi nanti.",
+        "success": "Pemberitahuan sukses:",
+        "toggle": "(beralih)",
+        "updated": "Verifikasi telah diperbarui:",
+        "usergroup": "Grup pengguna:",
+        "usergroup_max": "Kamu memberikan terlalu banyak grup pengguna.",
+        "usergroup_too_long": "Grup pengguna yang diberikan terlalu panjang.",
+        "value_too_high": "Nilai yang diberikan terlalu tinggi."
+    },
+    "verify": {
+        "audit_reason": "Diverifikasi sebagai \"$1\"",
+        "button_again": "Periksa lagi",
+        "button_wrong_user": "Kamu tidak dapat memeriksa verifikasi ini lagi, ini adalah verifikasi $1!",
+        "discord": "Pengguna Discord:",
+        "empty": "*kosong*",
+        "error": "Verifikasi gagal karena kesalahan.",
+        "error_reply": "Verifikasi gagal karena kesalahan, harap coba lagi.",
+        "failed_gblock": "**Periksa blok global gagal!**",
+        "failed_rename": "**Gagal mengubah nama panggilan Discord {{GENDER:$1|dia laki-laki|dia perempuan|mereka}}!**",
+        "failed_roles": "**Gagal menambahkan role!**",
+        "footer": "Verifikasi Akun Wiki",
+        "help_fandom": "https://community.fandom.com/wiki/Special:VerifyUser",
+        "help_gamepedia": "https://help.fandom.com/wiki/Gamepedia_Help_Wiki:Discord_verification",
+        "help_guide": "Ikuti [panduan ini]($1) untuk menambahkan tag Discord kamuke profil wiki mu:",
+        "help_missing": "Harap pastikan bahwa Kamu menggunakan nama pengguna wiki mu dan penggunaan huruf besar/kecil sudah benar.",
+        "help_subpage": "Silakan tambahkan tag Discord Kamu ($1) ke subhalaman Discord mu di wiki:",
+        "missing": "Tidak ada verifikasi yang disiapkan untuk saluran ini.",
+        "notice": "Pemberitahuan:",
+        "oauth_button": "Otentikasi",
+        "oauth_message": "Harap gunakan [tautan ini]($1) untuk mengautentikasi akun wiki kamu.",
+        "oauth_message_dm": "Silakan gunakan tautan ini untuk mengautentikasi akun wiki kamu untuk pengguna $1.",
+        "oauth_private": "Wiki menggunakan OAuth2 untuk verifikasi. Harap aktifkan pesan langsung dari server ini atau gunakan perintah `/verify` sehingga saya dapat mengirimi Kamu tautan autentikasi secara pribadi.",
+        "oauth_used": "*Diverifikasi menggunakan OAuth2*",
+        "qualified_add": "Ditambahkan ke:",
+        "qualified_add_error": "Tidak dapat ditambahkan ke:",
+        "qualified_remove": "Dihapus dari:",
+        "qualified_remove_error": "Tidak dapat dihapus dari:",
+        "user_blocked": "**Pengguna wiki $1 diblokir!**",
+        "user_blocked_reply": "pengguna wiki yang tertaut dikamu **\"$1\" diblokir!**",
+        "user_disabled": "**Akun wiki $1 dinonaktifkan!**",
+        "user_disabled_reply": "akun wiki mu yang tertaut **\"$1\" dinonaktifkan!**",
+        "user_failed": "Pengguna Discord $1 tidak cocok dengan pengguna wiki $2.",
+        "user_failed_reply": "tag Discord Kamu tidak cocok dengan pengguna wiki \"$1\".",
+        "user_gblocked": "**Pengguna wiki $1 diblokir secara global!**",
+        "user_gblocked_reply": "pengguna wiki tertaut kamu **\"$1\" diblokir secara global!**",
+        "user_matches": "Pengguna Discord $1 cocok dengan pengguna wiki $2, tetapi tidak memenuhi persyaratan untuk peran apa pun.",
+        "user_matches_reply": "tag Discord kamu cocok dengan pengguna wiki \"$1\", tetapi sayangnya kamu tidak memenuhi persyaratan untuk role apa pun.",
+        "user_missing": "Pengguna wiki \"$1\" tidak tersedia.",
+        "user_missing_reply": "pengguna wiki yang tertaut di kamu \"$1\" tidak tersedia.",
+        "user_renamed": "{{GENDER:$1|dia laki-laki|dia perempuan|mereka}} Nama panggilan Discord telah diubah menjadi {{GENDER:$1|dia laki-laki|dia perempuan|mereka}} nama pengguna.",
+        "user_verified": "Pengguna Discord $1 telah berhasil diverifikasi sebagai pengguna wiki $2.",
+        "user_verified_reply": "Kamu telah berhasil diverifikasi sebagai pengguna wiki \"$1\".",
+        "wiki": "Pengguna Wiki:"
+    },
+    "voice": {
+        "channel": "Saluran suara",
+        "disable": "Gunakan `$1` untuk menonaktifkan fungsi ini.",
+        "disabled": "Kamu menonaktifkan fungsi untuk menambahkan peran untuk saluran suara.",
+        "enable": "Gunakan `$1` untuk mengaktifkan fungsi ini.",
+        "enabled": "Kamu mengaktifkan fungsi untuk menambahkan peran untuk saluran suara.",
+        "join": "$1 bergabung dengan saluran suara \"$2\".",
+        "left": "$1 meninggalkan saluran suara \"$2\".",
+        "name": "nama saluran suara",
+        "text": "Saya mencoba memberi semua orang di saluran suara peran tertentu:"
+    }
+}

+ 10 - 16
i18n/it.json

@@ -154,12 +154,12 @@
         "missingperm": "Mi mancano alcuni permessi per questo comando:",
         "patreon": "Questa è una funzione esclusiva per i Patreon!\nPuoi supportarmi su Patreon per avere accesso a questa funzione:",
         "prefix": "Il prefisso per questo server è `$1`. Puoi cambiare il prefisso con `$1settings prefix`. Per un elenco di tutti i comandi vedi `$1help`.",
-        "readonly": "**Il database è attualmente nella modalità di sola lettura, non puoi cambiare alcuna impostazione per adesso!**"
+        "readonly": "**Il database è attualmente in modalità di sola lettura, non puoi cambiare nessuna impostazione per adesso!**"
     },
     "help": {
         "admin": "Questi comandi possono essere eseguiti solo dagli amministratori:",
         "adminfooter": "Gli amministratori possono anche usare la dashboard per cambiare le impostazioni del bot:",
-        "all": "Quindi, vuoi sapere quali cose so fare? Ecco un elenco di tutti i comandi che capisco:",
+        "all": "Quindi vuoi sapere cosa so fare? Ecco un elenco di tutti i comandi che capisco:",
         "footer": "Se hai ricevuto una risposta non voluta, puoi reagire con 🗑️ (`:wastebasket:`) al mio messaggio e lo cancellerò.",
         "list": {
             "default": {
@@ -361,11 +361,11 @@
                 },
                 "postcount": {
                     "cmd": "verification <id> postcount <nuovo numero di post>",
-                    "desc": "Cambierò il numero minimo di post in discussioni per la verifica tramite wiki.\n\t• Inserisci un numero negativo per richiedere o il numero di modifiche o quello di post.\n\t• Inserisci `null` per controllare il numero combinato di modifiche e post."
+                    "desc": "Cambierò il numero minimo di post in discussioni per la verifica tramite wiki.\n\t• Inserisci un numero negativo per richiedere o il conteggio delle modifiche o quello dei post.\n\t• Inserisci `null` per controllare il conteggio combinato di modifiche e post."
                 },
                 "rename": {
                     "cmd": "verification <id> rename",
-                    "desc": "Cambierò se il soprannome dell'utente su Discord debba essere modificato nel nome utente sulla wiki o meno durante la verifica tramite wiki."
+                    "desc": "Cambierò se il soprannome dell'utente su Discord debba essere modificato o meno nel nome utente della wiki durante la verifica tramite wiki."
                 },
                 "role": {
                     "cmd": "verification <id> role <nuovo ruolo>",
@@ -393,12 +393,6 @@
         "pause": "**Sono attualmente in pausa su questo server!**\nPosso eseguire solo questi comandi:"
     },
     "interaction": {
-        "dashboard": {
-            "perm_allow": "Acconsenti",
-            "perm_default": "Default",
-            "perm_deny": "Nega",
-            "updated": "$1 ha aggiornato le sovrascritture per i permessi del comando slash `$2`."
-        },
         "inline": "Per favore fornisci del testo con link [[wikitext]] per usare questo comando.",
         "nowiki": "La wiki utilizzata non esiste!",
         "verify": "Per favore fornisci il tuo nome utente sulla wiki per usare questo comando per verificare il tuo account Discord tramite il tuo account sulla wiki e ottenere i ruoli corrispondenti al tuo account sulla wiki."
@@ -536,7 +530,7 @@
         "noadmin": "Hai bisogno del permesso `Gestire i webhook` per questo comando!",
         "rc": "Modifiche sulla wiki:",
         "sysmessage": "Il messaggio di sistema `$1` deve contenere il server id `$2` per aggiungere un webhook delle ultime modifiche.",
-        "title": "Webhook delle ultime modifiche",
+        "title": "Webhook ultime modifiche",
         "toggle": "(attiva/disattiva)",
         "updated_display": "La modalità di visualizzazione di questo webhook è stata cambiata in:",
         "updated_lang": "La lingua per questo webhook è stata cambiata in:",
@@ -811,7 +805,7 @@
         "help_fandom": "https://community.fandom.com/wiki/Special:VerifyUser",
         "help_gamepedia": "https://help.fandom.com/wiki/Gamepedia_Help_Wiki:Discord_verification",
         "help_guide": "Segui [questa guida]($1) per aggiungere il tuo tag Discord al tuo profilo della wiki:",
-        "help_missing": "Per favore assicurati di usare il tuo nome utente sulla wiki e che le maiuscole/minuscole siano corrette.",
+        "help_missing": "Per favore assicurati di usare il nome utente che hai sulla wiki e che le maiuscole/minuscole siano corrette.",
         "help_subpage": "Per favore aggiungi il tuo tag Discord ($1) nella tua sottopagina Discord sulla wiki:",
         "missing": "Non ci sono verifiche impostate per questo canale.",
         "notice": "Avviso:",
@@ -825,17 +819,17 @@
         "qualified_remove": "Rimosso da:",
         "qualified_remove_error": "Non può essere rimosso da:",
         "user_blocked": "**L'utente della wiki $1 è bloccato!**",
-        "user_blocked_reply": "il tuo utente della wiki collegato **\"$1\" è bloccato!**",
+        "user_blocked_reply": "il tuo utente della wiki linkato **\"$1\" è bloccato!**",
         "user_disabled": "**L'account della wiki $1 è disabilitato!**",
-        "user_disabled_reply": "il tuo account della wiki collegato **\"$1\" è disabilitato!**",
+        "user_disabled_reply": "il tuo account della wiki linkato **\"$1\" è disabilitato!**",
         "user_failed": "L'utente Discord $1 non corrisponde all'utente $2 della wiki.",
         "user_failed_reply": "il tuo tag Discord non corrisponde all'utente della wiki \"$1\".",
         "user_gblocked": "**L'utente della wiki $1 è bloccato globalmente!**",
-        "user_gblocked_reply": "il tuo utente della wiki collegato **\"$1\" è bloccato globalmente!**",
+        "user_gblocked_reply": "il tuo utente della wiki linkato **\"$1\" è bloccato globalmente!**",
         "user_matches": "L'utente Discord $1 corrisponde all'utente wiki $2, ma non soddisfa i requisiti per alcun ruolo.",
         "user_matches_reply": "il tuo tag Discord corrisponde all'utente della wiki \"$1\", ma non soddisfi i requisiti per alcun ruolo.",
         "user_missing": "L'utente della wiki \"$1\" non esiste.",
-        "user_missing_reply": "il tuo utente della wiki collegato \"$1\" non esiste.",
+        "user_missing_reply": "il tuo utente della wiki linkato \"$1\" non esiste.",
         "user_renamed": "Il suo soprannome Discord è stato cambiato nel suo nome utente sulla wiki.",
         "user_verified": "L'utente Discord $1 è {{GENDER:$3|stato verificato|stata verificata|statə verificatə}} con successo come l'utente della wiki $2.",
         "user_verified_reply": "sei {{GENDER:$2|stato verificato|stata verificata|statə verificatə}} con successo come l'utente della wiki \"$1\".",

+ 0 - 6
i18n/ja.json

@@ -393,12 +393,6 @@
         "pause": "**このサーバーでは現在停止中です!**\nこれらのコマンドのみが実行可能です。"
     },
     "interaction": {
-        "dashboard": {
-            "perm_allow": "許可",
-            "perm_default": "デフォルト",
-            "perm_deny": "拒否",
-            "updated": "$1は、`$2`のスラッシュコマンドのパーミッションを上書き更新しました。"
-        },
         "inline": "このコマンドを使用するには、参照するテキストを[[wikitext]]リンクを指定します。",
         "nowiki": "使われているWikiは存在しません!",
         "verify": "このコマンドでWikiのユーザー名を入力すると、DiscordアカウントとWikiアカウントが本人のものであることを確認し、Wikiアカウントに関連するロールを取得することができます。"

+ 1 - 7
i18n/ko.json

@@ -393,12 +393,6 @@
         "pause": "**저는 이 서버에서 일시중지되어 있어요!**\n지금은 이 명령어만 사용할 수 있어요."
     },
     "interaction": {
-        "dashboard": {
-            "perm_allow": "허용",
-            "perm_default": "기본값",
-            "perm_deny": "거부",
-            "updated": "$1 님이 `$2` 슬래시 명령어 권한을 업데이트했습니다."
-        },
         "inline": "이 명령어를 사용하려면 [[위키텍스트]]와 다른 텍스트를 같이 제공해야 합니다.",
         "nowiki": "언급한 위키는 존재하지 않아요!",
         "verify": "위키 계정 이름을 명령어 뒤에 입력하여 디스코드 계정과 위키 계정을 인증하고 위키 계정에 해당하는 역할을 받으세요."
@@ -648,7 +642,7 @@
         "wikichanged": "이 서버의 기본 위키를 다음 위키로 변경했습니다:",
         "wikihelp": "`$1 <링크>` 명령어로 기본 위키를 변경하세요.\n`https://<위키>.fandom.com` 과 같은 미디어위키 사이트 링크를 입력하세요",
         "wikiinvalid": "위키백과나 팬덤 위키와 같은 유효한 미디어위키 사이트로 가는 링크를 제공해 주세요!",
-        "wikiinvalid_http": "제공된 웹사이트에 해당하는 TLS/SSL 인증서를 찾을 수 없습니다! 보안상의 이유로 HTTPS를 사용하는 위키만 지원됩니다.\n사이트 관리자라면 *Let's Encrypt*와 같은 인증 기관에서 인증서를 받을 수 있습니다.\n<https://letsencrypt.org/ko/getting-started/>",
+        "wikiinvalid_http": "제공된 웹사이트에 해당하는 TLS/SSL 인증서를 찾을 수 없습니다! 보안상의 이유로 HTTPS를 사용하는 위키만 지원됩니다.\n사이트 관리자라면 *Lets Encrypt*와 같은 인증 기관에서 인증서를 받을 수 있습니다.\n<https://letsencrypt.org/ko/getting-started/>",
         "wikiinvalid_private": "제공된 위키는 비공개 위키입니다! 모두가 읽을 수 있는 공개 위키만 지원하고 있습니다.",
         "wikiinvalid_timeout": "이 링크는 응답하기에는 너무 깁니다!",
         "wikimissing": "이 서버의 기본 위키가 설정되지 않았습니다!"

+ 1 - 1
i18n/nl.json

@@ -155,7 +155,7 @@
     "help": {
         "admin": "Deze opdrachten kunnen alleen door administratoren uitgevoerd worden:",
         "all": "Zo, dus je wilt weten welke dingen ik kan doen? Hier is een lijst van alle opdrachten die ik begrijp:",
-        "footer": "Als je een ongewenst antwoord krijgt, kun je reageren met 🗑️ op mijn bericht en ik zal het verwijderen.",
+        "footer": "Als je een ongewenst antwoord krijgt, kun je reageren met 🗑️ (`:wastebasket:`) op mijn bericht en ik zal het verwijderen.",
         "list": {
             "default": {
                 "cmd": "<zoek term>",

+ 1 - 6
i18n/pl.json

@@ -393,12 +393,6 @@
         "pause": "**Moja praca na tym serwerze została wstrzymana!**\nTylko następujące komendy mogą być używane:"
     },
     "interaction": {
-        "dashboard": {
-            "perm_allow": "Zezwalaj",
-            "perm_default": "Domyślne",
-            "perm_deny": "Zabraniaj",
-            "updated": "$1 zaktualizował zezwolenia specjalne komendy po ukośniku dla `$2`."
-        },
         "inline": "Wyślij wiadomość z linkami [[wikitekstu]] aby użyć tej komendy.",
         "nowiki": "Używana wiki nie istnieje!",
         "verify": "Podaj swoją nazwę użytkownika na wiki aby użyć komendy do zweryfikowania swojego konta na Discordzie kontem na wiki oraz otrzymać role odpowiadające Twojemu koncie na wiki."
@@ -658,6 +652,7 @@
         "MediaWiki": "Wymaga przynajmniej $1 dla pełnej funkcjonalności, znaleziono `$2`.",
         "notice": "Niepełna funkcjonalność",
         "pause": "Moje działanie jest obecnie wstrzymane na tym serwerze.",
+        "slow": "Przepraszam, jestem trochę powolny w tej chwili :(",
         "text": [
             "Jestem w pełni funkcjonalny!",
             "Wciąż tu jestem!",

+ 2 - 6
i18n/pt-br.json

@@ -393,12 +393,6 @@
         "pause": "**Estou atualmente em pausa neste servidor!**\nSom estes comandos podem ser executados:"
     },
     "interaction": {
-        "dashboard": {
-            "perm_allow": "Permitir",
-            "perm_default": "Padrão",
-            "perm_deny": "Negar",
-            "updated": "$1 atualizou as substituições de permissão do comando slash para `$2`."
-        },
         "inline": "Forneça algum texto com links de [[wikitexto]] para usar este comando.",
         "nowiki": "A wiki utilizada não existe!",
         "verify": "Por favor, forneça o seu nome de usuário na wiki para usar este comando e verificar a sua conta do Discord com a sua conta da wiki e obter cargos correspondentes à sua conta da wiki."
@@ -591,6 +585,8 @@
         "infosearch": "Não é o resultado correto? Use $1 para um link direto ou $2 para uma lista de todos os acessos.",
         "loading": "Carregando descrição da página…",
         "media": "Para a página de descrição do arquivo",
+        "messagedefault": "Padrão:",
+        "messagedefaultnone": "*ninguém*",
         "results": "$1 total {{PLURAL:$2|resultado|resultados}}",
         "special": "Conteúdo desta página especial:"
     },

+ 0 - 6
i18n/ru.json

@@ -393,12 +393,6 @@
         "pause": "**Я в сейчас приостановлен на этом сервере!**\nМогут быть выполнены только эти команды:"
     },
     "interaction": {
-        "dashboard": {
-            "perm_allow": "Разрешить",
-            "perm_default": "По умолчанию",
-            "perm_deny": "Запретить",
-            "updated": "$1 обновил перезаписи разрешений на использование слэш-команды `$2`."
-        },
         "inline": "Чтобы использовать эту команду, предоставьте текст со ссылками в [[викитекст-разметке]].",
         "nowiki": "Используемая вики не существует!",
         "verify": "Укажите ваше имя пользователя на вики через эту команду, чтобы подтвердить, что ваш аккаунт Discord и ваша учётная запись на вики принадлежат вам, и получить роли соответствующие вашей учётной записи на вики."

+ 3 - 8
i18n/sv.json

@@ -27,7 +27,7 @@
             " "
         ],
         "diff": [
-            "diff",
+            " ",
             " ",
             " ",
             " ",
@@ -48,7 +48,7 @@
             " "
         ],
         "info": [
-            "info",
+            " ",
             " ",
             " ",
             " ",
@@ -90,7 +90,7 @@
             " "
         ],
         "test": [
-            "test",
+            " ",
             " ",
             " ",
             " ",
@@ -389,11 +389,6 @@
         "pause": "**Jag är tillfälligt avstängd på den här servern!**\nEndast dessa kommandon fungerar:"
     },
     "interaction": {
-        "dashboard": {
-            "perm_allow": "Tillåt",
-            "perm_default": "Standard",
-            "perm_deny": "Neka"
-        },
         "inline": "Var snäll och ange text med [[wikitext]]-länkar för att använda detta kommando.",
         "nowiki": "Den använda wikin existerar inte!",
         "verify": "Var snäll och ange ditt wiki-användarnamn för att använda detta kommando till att verifiera ditt Discord-konto med ditt wiki-konto, och få roller som matchar ditt wiki-konto."

+ 2 - 6
i18n/tr.json

@@ -393,12 +393,6 @@
         "pause": "**Şu an bu sunucuda duraklatılmış durumdayım!**\nSadece bu komutlar gerçekleştirilebilir:"
     },
     "interaction": {
-        "dashboard": {
-            "perm_allow": "İzin ver",
-            "perm_default": "Varsayılan",
-            "perm_deny": "Reddet",
-            "updated": "$1, `$2` eğik çizgi komutu yetkilerini güncelledi."
-        },
         "inline": "Bu komutu kullanmak için [[wikitext]] ile bir metin girin.",
         "nowiki": "Kullanılan viki mevcut değil!",
         "verify": "Discord hesabını viki hesabın ile doğrulamak ve hesabın ile uyumlu rolleri almak için viki kullanıcı adını sağlayarak bu komutu kullan."
@@ -591,6 +585,8 @@
         "infosearch": "Doğru sonucu alamadın mı? Doğrudan bir bağlantı için $1, tüm isabetlerin listesi için $2 kullan.",
         "loading": "Sayfa açıklaması yükleniyor…",
         "media": "Dosya açıklama sayfasına",
+        "messagedefault": "Varsayılan:",
+        "messagedefaultnone": "*hiç*",
         "results": "Toplam $1 sonuç",
         "special": "Bu özel sayfanın içeriği:"
     },

+ 0 - 6
i18n/uk.json

@@ -393,12 +393,6 @@
         "pause": "**Я в зараз припинений на цьому сервері!**\nМожуть бути виконані тільки ці команди:"
     },
     "interaction": {
-        "dashboard": {
-            "perm_allow": "Дозволити",
-            "perm_default": "за замовчуванням",
-            "perm_deny": "Заборонити",
-            "updated": "$1 оновив перезаписі дозволів на використання слеш-команди `$2`."
-        },
         "inline": "Будь ласка, надайте деякий текст з посиланнями [[wikitext]], щоб використовувати цю команду.",
         "nowiki": "Використовувана вікі не існує!",
         "verify": "Будь ласка, вкажіть своє ім'я користувача вікі, щоб використовувати цю команду для перевірки вашого облікового запису Discord з вашим обліковим записом вікі і отримання ролей, відповідних вашого облікового запису вікі."

+ 1 - 1
i18n/vi.json

@@ -104,7 +104,7 @@
             " "
         ],
         "verify": [
-            "Xác Thực",
+            " ",
             " ",
             " ",
             " ",

TEMPAT SAMPAH
i18n/widgets/bn.png


TEMPAT SAMPAH
i18n/widgets/de.png


TEMPAT SAMPAH
i18n/widgets/en.png


TEMPAT SAMPAH
i18n/widgets/es.png


TEMPAT SAMPAH
i18n/widgets/fr.png


TEMPAT SAMPAH
i18n/widgets/hi.png


TEMPAT SAMPAH
i18n/widgets/id.png


TEMPAT SAMPAH
i18n/widgets/it.png


TEMPAT SAMPAH
i18n/widgets/ja.png


TEMPAT SAMPAH
i18n/widgets/ko.png


TEMPAT SAMPAH
i18n/widgets/nl.png


TEMPAT SAMPAH
i18n/widgets/pl.png


TEMPAT SAMPAH
i18n/widgets/pt-br.png


TEMPAT SAMPAH
i18n/widgets/ru.png


TEMPAT SAMPAH
i18n/widgets/sr.png


TEMPAT SAMPAH
i18n/widgets/sv.png


TEMPAT SAMPAH
i18n/widgets/th.png


TEMPAT SAMPAH
i18n/widgets/tr.png


TEMPAT SAMPAH
i18n/widgets/uk.png


TEMPAT SAMPAH
i18n/widgets/vi.png


TEMPAT SAMPAH
i18n/widgets/zh-hans.png


TEMPAT SAMPAH
i18n/widgets/zh-hant.png


+ 0 - 6
i18n/zh-hans.json

@@ -393,12 +393,6 @@
         "pause": "**我目前处于暂停状态!**\n仅能使用以下命令:"
     },
     "interaction": {
-        "dashboard": {
-            "perm_allow": "允许",
-            "perm_default": "默认",
-            "perm_deny": "拒绝",
-            "updated": "$1更新了`$2`的斜杠命令权限覆写。"
-        },
         "inline": "请提供一些有 [[wiki 文本]] 的文字来使用此命令。",
         "nowiki": "所使用的 wiki 不存在!",
         "verify": "为了验证您的 Discord 与您的 wiki 账户相匹配并授予与您 wiki 账户相符合的身份组,请提供您的 wiki 用户名。"

+ 0 - 6
i18n/zh-hant.json

@@ -393,12 +393,6 @@
         "pause": "**我目前處於暫停狀態!**\n僅能使用以下指令:"
     },
     "interaction": {
-        "dashboard": {
-            "perm_allow": "允許",
-            "perm_default": "預設",
-            "perm_deny": "拒絕",
-            "updated": "$1更新了`$2`的斜線指令權限覆寫。"
-        },
         "inline": "請提供一些有 [[wikitext]] 的文字來使用此指令。",
         "nowiki": "所使用的wiki不存在!",
         "verify": "為了能透過您的wiki帳號驗證您的Discord帳號與並授予與您wiki帳號相符的身分組,請提供您的wiki使用者名稱以使用此指令。"

+ 78 - 0
interactions/commands/inline.json

@@ -0,0 +1,78 @@
+{
+  "id": "",
+  "application_id": "",
+  "name": "inline",
+  "name_localizations": {
+    "en-GB": "inline",
+    "en-US": "inline",
+    "de": "inline",
+    "it": "inline",
+    "sv-SE": "inline",
+    "tr": "inline",
+    "hi": "inline",
+    "pl": "inline",
+    "ru": "inline",
+    "zh-CN": "inline",
+    "zh-TW": "inline",
+    "es-ES": "inline",
+    "pt-BR": "inline",
+    "id": "inline"
+  },
+  "description": "Post a message with inline wiki links.",
+  "description_localizations": {
+    "en-GB": "Post a message with inline wiki links.",
+    "en-US": "Post a message with inline wiki links.",
+    "de": "Sende eine Nachricht mit Inline-Links zum Wiki.",
+    "es-ES": "Publicar un mensaje con inline wiki links.",
+    "it": "Posta un messaggio con link wiki inline.",
+    "sv-SE": "Skicka ett meddelande med wikilänkar på samma rad.",
+    "tr": "Satır içi viki bağlantıları ile mesaj paylaş.",
+    "hi": "इनलाइन विकि कड़ियों के साथ एक संदेश पोस्ट करें।",
+    "pl": "Utwórz wiadomość z linkami pisanymi składnią wiki.",
+    "ru": "Разместите сообщение со встроенными вики-ссылками.",
+    "zh-CN": "发送一条带有行内wiki链接的消息。",
+    "zh-TW": "傳送含有行內wiki連結的訊息。",
+    "id": "Posting pesan dengan tautan wiki inline."
+  },
+  "default_permission": true,
+  "default_member_permissions": "68608",
+  "dm_permission": true,
+  "options": [
+    {
+      "type": 3,
+      "name": "text",
+      "name_localizations": {
+        "en-GB": "text",
+        "en-US": "text",
+        "de": "text",
+        "it": "testo",
+        "sv-SE": "text",
+        "tr": "text",
+        "hi": "text",
+        "pl": "tekst",
+        "ru": "text",
+        "zh-CN": "文本",
+        "zh-TW": "文字",
+        "es-ES": "texto",
+        "id": "teks"
+      },
+      "description": "Text including wikitext links.",
+      "description_localizations": {
+        "en-GB": "Text including wikitext links.",
+        "en-US": "Text including wikitext links.",
+        "de": "Text mit Wikitext-Links.",
+        "it": "Testo che include link in wikitext.",
+        "sv-SE": "Text med länkar till wikitext.",
+        "tr": "Wikitext bağlantılarını içeren metin.",
+        "hi": "विकिटेक्स्ट कड़ियों वाला टेक्स्ट।",
+        "pl": "Tekst zawierający linki pisane składnią wiki.",
+        "ru": "Текст, включающий ссылки на вики-текст.",
+        "zh-CN": "包含wikitext链接的文本。",
+        "zh-TW": "含有wikitext連結的文字。",
+        "es-ES": "Texto que incluye enlaces de wikitexto.",
+        "id": "Teks termasuk tautan wikitext."
+      },
+      "required": true
+    }
+  ]
+}

+ 77 - 0
interactions/commands/verify.json

@@ -0,0 +1,77 @@
+{
+  "id": "",
+  "application_id": "",
+  "name": "verify",
+  "name_localizations": {
+    "en-GB": "verify",
+    "en-US": "verify",
+    "de": "verify",
+    "it": "verifica",
+    "sv-SE": "verifiera",
+    "tr": "verify",
+    "hi": "verify",
+    "pl": "weryfikuj",
+    "ru": "verify",
+    "zh-CN": "verify",
+    "zh-TW": "verify",
+    "es-ES": "verificar",
+    "id": "verifikasi"
+  },
+  "description": "Verify your Discord account with your wiki account.",
+  "description_localizations": {
+    "en-GB": "Verify your Discord account with your wiki account.",
+    "en-US": "Verify your Discord account with your wiki account.",
+    "de": "Verifiziere deinen Discord-Account mit deinem Wiki-Account.",
+    "it": "Verifica il tuo account Discord tramite il tuo account sulla wiki.",
+    "sv-SE": "Verifiera ditt Discord-konto med ditt wiki-konto.",
+    "tr": "Viki hesabın ile Discord hesabını doğrula.",
+    "hi": "अपने विकि खाते के साथ अपने डिस्कॉर्ड खाते को प्रमाणित करें।",
+    "pl": "Zweryfikuj swoje konto Discord używając konta na wiki.",
+    "ru": "Подтвердите свою учетную запись Discord с помощью вашей учетной записи wiki.",
+    "zh-CN": "使用你的wiki账号来验证你的Discord账号。",
+    "zh-TW": "使用您的wiki帳號驗證您的Discord帳號。",
+    "es-ES": "Verifica tu cuenta de Discord con tu cuenta wiki.",
+    "id": "Verifikasi akun Discord kamu dengan akun wiki."
+  },
+  "default_permission": false,
+  "default_member_permissions": "68608",
+  "dm_permission": false,
+  "options": [
+    {
+      "type": 3,
+      "name": "username",
+      "name_localizations": {
+        "en-GB": "username",
+        "en-US": "username",
+        "de": "benutzername",
+        "it": "username",
+        "sv-SE": "username",
+        "tr": "username",
+        "hi": "username",
+        "pl": "nick",
+        "ru": "username",
+        "zh-CN": "用户名",
+        "zh-TW": "使用者名稱",
+        "es-ES": "nombre_de_usuario",
+        "id": "username"
+      },
+      "description": "Your username on the wiki.",
+      "description_localizations": {
+        "en-GB": "Your username on the wiki.",
+        "en-US": "Your username on the wiki.",
+        "de": "Dein Benutzername im Wiki.",
+        "it": "Il tuo nome utente sulla wiki.",
+        "sv-SE": "Ditt användarnamn på wikin.",
+        "tr": "Vikideki kullanıcı adın.",
+        "hi": "विकि पर आपका सदस्यनाम।",
+        "pl": "Twoja nazwa użytkownika na wiki.",
+        "ru": "Ваше имя пользователя на вики.",
+        "zh-CN": "你在此wiki上的用户名。",
+        "zh-TW": "您在此wiki上的使用者名稱。",
+        "es-ES": "Tu nombre de usuario en el wiki.",
+        "id": "Nama pengguna kamu di wiki."
+      },
+      "required": false
+    }
+  ]
+}

+ 1 - 0
interactions/i18n/bn.json

@@ -0,0 +1 @@
+{}

+ 14 - 0
interactions/i18n/de.json

@@ -0,0 +1,14 @@
+{
+    "inline": {
+        "description": "Sende eine Nachricht mit Inline-Links zum Wiki.",
+        "name": "inline",
+        "options[0].description": "Text mit Wikitext-Links.",
+        "options[0].name": "text"
+    },
+    "verify": {
+        "description": "Verifiziere deinen Discord-Account mit deinem Wiki-Account.",
+        "name": "verify",
+        "options[0].description": "Dein Benutzername im Wiki.",
+        "options[0].name": "benutzername"
+    }
+}

File diff ditekan karena terlalu besar
+ 1 - 0
interactions/i18n/en.json


File diff ditekan karena terlalu besar
+ 1 - 0
interactions/i18n/es-ES.json


+ 1 - 0
interactions/i18n/fr.json

@@ -0,0 +1 @@
+{}

File diff ditekan karena terlalu besar
+ 1 - 0
interactions/i18n/hi.json


File diff ditekan karena terlalu besar
+ 1 - 0
interactions/i18n/id.json


File diff ditekan karena terlalu besar
+ 1 - 0
interactions/i18n/it.json


+ 1 - 0
interactions/i18n/ja.json

@@ -0,0 +1 @@
+{}

Beberapa file tidak ditampilkan karena terlalu banyak file yang berubah dalam diff ini