diff --git a/Branding/Event/Music-fireworks-santa.png b/Branding/Event/Music-fireworks-santa.png new file mode 100644 index 000000000..0a050cb7c Binary files /dev/null and b/Branding/Event/Music-fireworks-santa.png differ diff --git a/Branding/Event/Patreon-fireworks-santa.png b/Branding/Event/Patreon-fireworks-santa.png new file mode 100644 index 000000000..0a52c5f4c Binary files /dev/null and b/Branding/Event/Patreon-fireworks-santa.png differ diff --git a/Branding/html/dbl.html b/Branding/html/dbl.html new file mode 100644 index 000000000..387a2434b --- /dev/null +++ b/Branding/html/dbl.html @@ -0,0 +1,169 @@ + +
+

Meet FredBoat♪♪

+
+ +
+
+
+

FredBoat♪♪ is one of the most popular music bots around.

+

Features:

+
+ +
+ +

With support for:

+
+ +
+
+ + +
+ +

What are you waiting for?

+ +
+ Invite FredBoat +
+ +
+ Join FredBoat Hangout + See the Documentation +
+ + +
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 20c9a6d77..31a8c10a0 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,3 +1,8 @@ +# Submitting issues +When submitting issues please state if you are using the publicly hosted FredBoat or if you are selfhosting. If you are selfhosting please state which version you are using. You can find the version by running the `;;mstats` command. + +**If your issue is about an exploit please email `frogkr@gmail.com` about it. Do not publicly disclose exploits.** + # Contributing FredBoat is built using Gradle, so you should just be able to import the project in your favorite IDE and download all dependencies while building. Check out the [issues](https://github.com/Frederikam/FredBoat/issues) to find out what needs to be done. diff --git a/FredBoat/.dockerignore b/FredBoat/.dockerignore index f49ddd863..fc46b7361 100644 --- a/FredBoat/.dockerignore +++ b/FredBoat/.dockerignore @@ -3,3 +3,4 @@ !Dockerfile !FredBoat.jar !config.yaml +!credentials.yaml.example diff --git a/FredBoat/Dockerfile b/FredBoat/Dockerfile index 6bbe8cd76..0f4cca099 100644 --- a/FredBoat/Dockerfile +++ b/FredBoat/Dockerfile @@ -1,11 +1,11 @@ -FROM openjdk:8-jre-alpine +FROM openjdk:8-jdk-slim ENV ENV docker -RUN mkdir /opt -RUN mkdir /opt/FredBoat +RUN mkdir -p /opt/FredBoat COPY config.yaml /opt/FredBoat/config.yaml +COPY credentials.yaml.example /opt/FredBoat/credentials.yaml COPY FredBoat.jar /opt/FredBoat/FredBoat.jar EXPOSE 1356 diff --git a/FredBoat/build.gradle b/FredBoat/build.gradle index 8a0c20114..5039b4760 100644 --- a/FredBoat/build.gradle +++ b/FredBoat/build.gradle @@ -1,6 +1,6 @@ buildscript { dependencies { - classpath 'org.junit.platform:junit-platform-gradle-plugin:1.0.1' + classpath 'org.junit.platform:junit-platform-gradle-plugin:1.0.2' } } plugins { @@ -13,7 +13,7 @@ apply plugin: 'org.junit.platform.gradle.plugin' description = 'FredBoat Discord Music Bot' mainClassName = "fredboat.FredBoat" -version '1.1' +version '2.0' ext { moduleName = 'FredBoat' } @@ -31,17 +31,15 @@ shadowJar { dependencies { compile project(':Shared') - compile group: 'net.dv8tion', name: 'JDA', version: '3.3.1_300' - compile group: 'com.github.FredBoat', name: 'lavaplayer', version: '1.2.44.2-FredBoat' - compile group: 'com.github.FredBoat', name: 'jda-nas', version: '1.0.5.1-JDA' + compile group: 'net.dv8tion', name: 'JDA', version: '3.3.1_308' + compile group: 'com.sedmelluq', name: 'lavaplayer', version: '1.2.45' + compile group: 'com.sedmelluq', name: 'jda-nas', version: '1.0.6' if (System.getenv('dev') == 'true') { compile(group: 'lavalink', name: 'Lavalink-Client', version: '-SNAPSHOT') } else { //production - compile(group: 'com.github.Frederikam', name: 'Lavalink', version: '69c54a9c0efa0e364dd45e837c97ed4990ce460c') { - exclude(module: 'Lavalink-Server') - } + compile(group: 'com.github.Frederikam.Lavalink', name: 'Lavalink-Client', version: '8fa6dd5d5013cbb2eb0d35be077048022f08c0eb') } compile group: 'org.apache.commons', name: 'commons-text', version: '1.1' @@ -49,12 +47,12 @@ dependencies { compile group: 'commons-codec', name: 'commons-codec', version: '1.11' compile group: 'org.apache.httpcomponents', name: 'httpclient', version: '4.5.3' compile group: 'ch.qos.logback', name: 'logback-classic', version: '1.2.3' - compile group: 'io.sentry', name: 'sentry-logback', version: '1.6.1' - compile group: 'com.squareup.okhttp3', name: 'okhttp', version: '3.9.0' - compile group: 'com.sparkjava', name: 'spark-core', version: '2.6.0' + compile group: 'io.sentry', name: 'sentry-logback', version: '1.6.3' + compile group: 'com.squareup.okhttp3', name: 'okhttp', version: '3.9.1' + compile group: 'com.sparkjava', name: 'spark-core', version: '2.7.1' compile group: 'org.yaml', name: 'snakeyaml', version: '1.19' - compile group: 'it.unimi.dsi', name: 'fastutil', version: '8.1.0' - compile group: 'com.github.spotbugs', name: 'spotbugs-annotations', version: '3.1.0' + compile group: 'it.unimi.dsi', name: 'fastutil', version: '8.1.1' + compile group: 'com.github.spotbugs', name: 'spotbugs-annotations', version: '3.1.1' compile group: 'io.prometheus', name: 'simpleclient', version: '0.1.0' compile group: 'io.prometheus', name: 'simpleclient_hotspot', version: '0.1.0' compile group: 'io.prometheus', name: 'simpleclient_logback', version: '0.1.0' @@ -62,22 +60,17 @@ dependencies { compile group: 'io.prometheus', name: 'simpleclient_guava', version: '0.1.0' compile group: 'io.prometheus', name: 'simpleclient_servlet', version: '0.1.0' - compile group: 'org.hibernate', name: 'hibernate-core', version: '5.2.12.Final' + compile group: 'space.npstr.SqlSauce', name: 'sqlsauce-core', version: 'a5c9afd96d1928d9a51e799249a6eb5b08b4f473' compile group: 'org.hibernate', name: 'hibernate-ehcache', version: '5.2.12.Final' - compile group: 'org.hibernate', name: 'hibernate-hikaricp', version: '5.2.12.Final' - compile group: 'org.springframework.boot', name: 'spring-boot-starter-web', version: '1.5.8.RELEASE' - compile group: 'org.springframework', name: 'spring-orm', version: '4.3.11.RELEASE' - compile group: 'org.postgresql', name: 'postgresql', version: '42.1.4' - compile group: 'org.xerial', name: 'sqlite-jdbc', version: '3.20.1' - compile group: 'com.github.gwenn', name: 'sqlite-dialect', version: '24970986d0' - compile group: 'com.jcraft', name: 'jsch', version: '0.1.54' - compile group: 'org.togglz', name: 'togglz-core', version: '2.4.1.Final' - compile group: 'com.google.guava', name: 'guava', version: '23.0' + compile group: 'org.flywaydb', name: 'flyway-core', version: '5.0.3' + + compile group: 'org.togglz', name: 'togglz-core', version: '2.5.0.Final' + compile group: 'com.google.guava', name: 'guava', version: '23.5-jre' compile group: 'com.github.vladimir-bukhtoyarov', name: 'bucket4j-core', version: '3.0.2' //tests - testCompile group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: '5.0.1' - testRuntime group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version: '5.0.1' + testCompile group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: '5.0.2' + testRuntime group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version: '5.0.2' // To avoid compiler warnings about @API annotations in JUnit code. testCompileOnly group: 'org.apiguardian', name: 'apiguardian-api', version: '1.0.0' } @@ -86,7 +79,7 @@ import org.apache.tools.ant.filters.ReplaceTokens processResources { //inject values into app.properties - filesMatching("**/*.properties") { + filesMatching("**/app.properties") { filter ReplaceTokens, tokens: [ "project.version" : project.version, "project.groupId" : project.group, diff --git a/FredBoat/credentials.yaml.example b/FredBoat/credentials.yaml.example index fb992b1cd..700cffcfc 100644 --- a/FredBoat/credentials.yaml.example +++ b/FredBoat/credentials.yaml.example @@ -8,7 +8,20 @@ ### IF YOU POST THIS FILE ONLINE (such as on GitHub) YOUR BOT COULD BE COMPROMISED ### ### +### Use a proper text editor when editing this file, for example Sublime. ### Do not use tab characters in this file, use plain spaces. +### +### Keep at least one space after a colon, like so: +### +### key: value +### +### You can wrap most values into quotation marks, except numbers and booleans: +### +### someUrl: "http://example.com" +### someToken: "123.qwe.456[DFG=" +### somePortNumber: 22 +### useSomeFeature: true +### ### More information on correctly formatting yaml files: http://www.yaml.org/start.html @@ -17,18 +30,18 @@ ### Essential credentials ################################################################ - -token: # Add your discord bot token below to the beta and patron slots, between the quotation marks +# Add your discord bot token below to the beta and patron slots, between the quotation marks +token: # Don't remove or add anything in this line. This is how a map works in YAML. Just edit the lines below. # Find the token of your bot on https://discordapp.com/developers/applications/me # Tutorial: https://github.com/reactiflux/discord-irc/wiki/Creating-a-discord-bot-&-getting-a-token beta: "PutYourDiscordBotTokenHere" patron: "PutYourDiscordBotTokenHere" + # Used by the ;;split and ;;np commands. Must be hooked up to the Youtube Data API. -# Add your google API key in the brackets below between the quotation marks +# Add your google API key between the quotation marks # How to get the key: https://developers.google.com/youtube/registering_an_application - -googleServerKeys: ["PutYourGoogleAPIKeyHere"] +googleServerKeys: "PutYourGoogleAPIKeyHere" @@ -38,62 +51,109 @@ googleServerKeys: ["PutYourGoogleAPIKeyHere"] # For the ;;mal command # Create an account on https://myanimelist.net/ and enter its login below -malUser: -malPassword: +malUser: "" +malPassword: "" # Used to access imgur galleries for some RandomImageCommands # Acquired from here: https://api.imgur.com/oauth2/addclient # Choose an option that does not require an Authorization callback URL -imgurClientId: +imgurClientId: "" # Used to retrieve Spotify playlists # Get them from here: https://developer.spotify.com/my-applications -spotifyId: -spotifySecret: +spotifyId: "" +spotifySecret: "" # Used by ;;weather command. # Get them from: http://openweathermap.org/appid -openWeatherKey: +openWeatherKey: "" + + ################################################################ -### Developers and advanced users only +### Developers and very experienced users only ################################################################ -# database url for when you don't want to run on the default built in sqlite db. -# FredBoat was written to work with PostgreSQL -jdbcUrl: #jdbc:postgresql://localhost:5432/fredboat?user=fredboat&password=youshallnotpass +# FredBoat was written to work with PostgreSQL. +# If you are running with docker-compose then you don't need to change the jdbcUrl here. +# In PostgreSQL, role means user and vice versa. Keep that in mind when reading the following help and the provided links. +# If you are running your own PostgreSQL database, you will need to provide a role and a database belonging to that role. +# The role needs at least the permission to log in. +# All postgres databases used by FredBoat are required to have the Hstore extension enabled. +# Learn more about roles here: https://www.postgresql.org/docs/10/static/database-roles.html +# Learn more about creating databases here: https://www.postgresql.org/docs/10/static/manage-ag-createdb.html +# Learn more about the postgres jdbc url here: https://jdbc.postgresql.org/documentation/head/connect.html +# Learn more about creating extensions here: https://www.postgresql.org/docs/current/static/sql-createextension.html +# If you are using an SSH tunnel, you need to point your jdbc url to localhost and the configured tunnelLocalPort +# Example jdbc: "jdbc:postgresql://localhost:5432/fredboat?user=fredboat&password=youshallnotpass" +jdbcUrl: "" -# ssh tunnel for a remote database. this is useful for when you don't want to expose your database on the remote server +# Ssh tunnel for a remote database. this is useful for when you don't want to expose your database on the remote server # and instead use ssh tunneling to access it -# useSshTunnel: false -# sshHost: -# sshUser: -# sshPrivateKeyFile: -# forwardToPort: +# If you are running with docker-compose then you don't need to change any ssh value here. +# If you are using an SSH tunnel, you need to point your jdbc url to localhost and the configured tunnelLocalPort +useSshTunnel: false +sshHost: "" # add the ssh port to the ip / url, usually 22, for example: "db.example.com:22" +sshUser: "" # user on the remote machine +sshPrivateKeyFile: "" # path to an ssh private key file which is authorized to log in to the sshUser on the remote machine. learn how to create these: https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-16-04#step-four-—-add-public-key-authentication-(recommended) +sshKeyPassphrase: "" # optional passphrase for the ssh key file +tunnelLocalPort: 5432 # endpoint port of the tunnel on the machine running fredboat; makes sure these dont collide; this one needs to be used in the jdbc url +tunnelRemotePort: 5432 # port of the PostgreSQL on the remote machine, 5432 by default + +# Database for caching things, see config of main database above for details about the individual values. +# If you are running with docker-compose then you don't need to change the cache jdbcUrl here. +# The main and cache databases can be two databases inside a single postgres instance. +# They CANNOT be the same database due to the way flyway migrations work. +# The main benefit is that you don't have to backup/migrate the cache database, it can just be dropped/recreated +# If you do not provide a jdbc url for the cache database, FredBoat will still work (most likely), but may have a degraded +# performance, especially in high usage environments and when using Spotify playlists. +# If you are going to use two different ssh tunnels for both database connections, make sure that the local tunnel ports don't collide +cacheJdbcUrl: "" + +cacheUseSshTunnel: false +cacheSshHost: "" +cacheSshUser: "" +cacheSshPrivateKeyFile: "" +cacheSshKeyPassphrase: "" +cacheTunnelLocalPort: 5433 +cacheTunnelRemotePort: 5432 + + + +# Additional google keys +# If you find yourself running a big bot and hitting youtube API ratelimits, you can add several keys via the list below. +# Remember to comment out the other "googleServerKeys" entry in this file, you can have only one of them. +# FredBoat will pick the keys by random to to access Youtube. +#googleServerKeys: ["Key1", "Key2", "Key3"] # error aggregation service -sentryDsn: +sentryDsn: "" + +# If you are running lavalink nodes this is the place to add them. +# Examples shown below, don't forget to uncomment them properly. +# More on Lavalink: https://github.com/Frederikam/Lavalink +#lavalinkHosts: + #"ws://localhost:5555": "youshallnotpass" + #"ws://192.168.1.20:5556": "youshallnotpass" + #"ws://lavalink.example.com:5557": "youshallnotpass" -# if you are running lavalink nodes this is the place to add them -# lavalinkHosts: - # "ws://localhost:5555": "youshallnotpass" - # "ws://192.168.1.20:5556": "youshallnotpass" - # "ws://lavalink.example.com:5557": "youshallnotpass" +# Webhooks to Discord channels that will post some guild stats and shard status changes +# More information on webhooks: https://support.discordapp.com/hc/en-us/articles/228383668-Intro-to-Webhooks +# Example: "https://canary.discordapp.com/api/webhooks/1234567890/QWERTZUIOPasdfghjklYXCVBNM" (no, this one will not work) +eventLogWebhook: "" # webhook url for connect / disconnect events +eventLogInterval: 1 # interval at which connect / disconnect events are posted in minutes +guildStatsWebhook: "" # webhook url for guild stats +guildStatsInterval: 60 # interval at which guild stats are posted in minutes -# Webhook to a Discord channel that will post some guild stats and shard status changes -# More information: https://support.discordapp.com/hc/en-us/articles/228383668-Intro-to-Webhooks -# These are the id and token that you are looking for: https://canary.discordapp.com/api/webhooks// -# eventLogWebhookId: -# eventLogWebhookToken: -# post build tool test results into a discord channel. the token must be discord bot token -testToken: -testChannelId: +# Post build tool test results into a discord channel. The token must be a discord bot token. +testToken: "" +testChannelId: "" diff --git a/FredBoat/docker-compose.yml b/FredBoat/docker-compose.yml index 5f8580fdc..371856951 100644 --- a/FredBoat/docker-compose.yml +++ b/FredBoat/docker-compose.yml @@ -25,7 +25,7 @@ services: ################################################################################ db: build: ./docker/database/ - restart: on-failure:3 + restart: always # WINDOWS ONLY: if you are running under windows you need to comment out the following two lines: volumes: diff --git a/FredBoat/docker/database/Dockerfile b/FredBoat/docker/database/Dockerfile index 971390c75..33e287936 100644 --- a/FredBoat/docker/database/Dockerfile +++ b/FredBoat/docker/database/Dockerfile @@ -1,5 +1,5 @@ FROM postgres:10.0 ENV POSTGRES_USER fredboat -COPY postgres-healthcheck.sh /usr/local/bin/ -COPY initdb.sh /docker-entrypoint-initdb.d/ -HEALTHCHECK CMD ["postgres-healthcheck.sh"] +COPY initdb.sh /usr/local/bin/ +COPY run.sh /usr/local/bin/ +ENTRYPOINT ["/bin/bash", "run.sh"] diff --git a/FredBoat/docker/database/initdb.sh b/FredBoat/docker/database/initdb.sh old mode 100644 new mode 100755 index 5fd6fa1d5..be44a8813 --- a/FredBoat/docker/database/initdb.sh +++ b/FredBoat/docker/database/initdb.sh @@ -1,5 +1,31 @@ #!/bin/bash set -e -psql -v ON_ERROR_STOP=1 --username "postgres" -d fredboat -c "CREATE EXTENSION hstore;" -psql -v ON_ERROR_STOP=1 --username "postgres" -d fredboat -c "CREATE EXTENSION pg_trgm;" +while ! psql -U postgres -tAc "SELECT 1 FROM pg_roles WHERE rolname='$POSTGRES_USER'" | grep -q 1; do + echo "Waiting on postgres own initial setup to finish" + sleep 1 +done +sleep 1 +while ! pg_isready -U postgres; do + echo "Waiting on postgres to be ready" + sleep 1 +done + +# make sure the fredboat user exists +psql -v ON_ERROR_STOP=1 -U "$POSTGRES_USER" -tAc "SELECT 1 FROM pg_roles WHERE rolname='fredboat'" | grep -q 1 || createuser -U "$POSTGRES_USER" fredboat + +# make sure the fredboat database exists +psql -v ON_ERROR_STOP=1 -U "$POSTGRES_USER" -tc "SELECT 1 FROM pg_database WHERE datname = 'fredboat';" | grep -q 1 || psql -U "$POSTGRES_USER" -c "CREATE DATABASE fredboat WITH OWNER = fredboat;" +# make sure the fredboat datbase is owned by the user fredboat +psql -v ON_ERROR_STOP=1 -U "$POSTGRES_USER" -c "ALTER DATABASE fredboat OWNER TO fredboat;" +psql -v ON_ERROR_STOP=1 -U "$POSTGRES_USER" -c "GRANT ALL PRIVILEGES ON DATABASE fredboat TO fredboat;" +# make sure HSTORE extension is enabled +psql -v ON_ERROR_STOP=1 -U "$POSTGRES_USER" -d fredboat -c "CREATE EXTENSION IF NOT EXISTS hstore;" + +# make sure the cache database exists +psql -v ON_ERROR_STOP=1 -U "$POSTGRES_USER" -tc "SELECT 1 FROM pg_database WHERE datname = 'fredboat_cache';" | grep -q 1 || psql -U "$POSTGRES_USER" -c "CREATE DATABASE fredboat_cache WITH OWNER = fredboat;" +# make sure the cache database is owned by the user fredboat +psql -v ON_ERROR_STOP=1 -U "$POSTGRES_USER" -c "ALTER DATABASE fredboat_cache OWNER TO fredboat;" +psql -v ON_ERROR_STOP=1 -U "$POSTGRES_USER" -c "GRANT ALL PRIVILEGES ON DATABASE fredboat_cache TO fredboat;" +# make sure HSTORE extension is enabled +psql -v ON_ERROR_STOP=1 -U "$POSTGRES_USER" -d fredboat_cache -c "CREATE EXTENSION IF NOT EXISTS hstore;" diff --git a/FredBoat/docker/database/postgres-healthcheck.sh b/FredBoat/docker/database/postgres-healthcheck.sh deleted file mode 100644 index 299416740..000000000 --- a/FredBoat/docker/database/postgres-healthcheck.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/bin/bash -set -eo pipefail - -host="$(hostname -i || echo '127.0.0.1')" -user="${POSTGRES_USER:-postgres}" -db="${POSTGRES_DB:-$POSTGRES_USER}" -export PGPASSWORD="${POSTGRES_PASSWORD:-}" - -args=( - # force postgres to not use the local unix socket (test "external" connectibility) - --host "$host" - --username "$user" - --dbname "$db" - --quiet --no-align --tuples-only -) - -if select="$(echo 'SELECT 1' | psql "${args[@]}")" && [ "$select" = '1' ]; then - exit 0 -fi - -exit 1 diff --git a/FredBoat/docker/database/run.sh b/FredBoat/docker/database/run.sh new file mode 100755 index 000000000..593f835da --- /dev/null +++ b/FredBoat/docker/database/run.sh @@ -0,0 +1,29 @@ +#!/bin/bash + +# We are using this script, because we need to reliably execute a script on each start of the db container, +# to migrate the database for containers with an external volume persisting the database data, where the scripts in +# /docker-entrypoint-initdb.d/ are getting skipped. +# Relevant issue: https://github.com/docker-library/postgres/issues/191 + +set -e + +_term() { + echo "Caught SIGTERM signal!" + # sending SIGINT to postgres tells it to do a fast shutdown, which is what we want here due to the default 10 seconds + # which docker waits until send a SIGKILL which we want to avoid. + # Relevant docs: https://www.postgresql.org/docs/10/static/server-shutdown.html + kill -INT "$child" 2>/dev/null +} +trap _term SIGTERM + +# running the official postgres entry script in the background +echo "Running entry point" +docker-entrypoint.sh postgres & + +# run our own init script +echo "Running init db" +initdb.sh + +# Wait on the "docker-entrypoint.sh postgres &" process that we started in the background +child=$! +wait "$child" diff --git a/FredBoat/src/main/java/fredboat/Config.java b/FredBoat/src/main/java/fredboat/Config.java index 1b8e05fce..bb99c9791 100644 --- a/FredBoat/src/main/java/fredboat/Config.java +++ b/FredBoat/src/main/java/fredboat/Config.java @@ -36,7 +36,10 @@ import org.slf4j.LoggerFactory; import org.yaml.snakeyaml.Yaml; import org.yaml.snakeyaml.error.YAMLException; +import space.npstr.sqlsauce.ssh.SshTunnel; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; @@ -106,19 +109,25 @@ public class Config { private String spotifySecret; private String openWeatherKey; - // database + SSH tunnel + // main database + SSH tunnel + @Nonnull private String jdbcUrl; - private boolean useSshTunnel; - private String sshHost; //Eg localhost:22 - private String sshUser; //Eg fredboat - private String sshPrivateKeyFile; - private int forwardToPort; //port where the remote database is listening, postgres default: 5432 + @Nullable + private SshTunnel.SshDetails mainSshTunnelConfig; + + // cache database + SSH tunnel + @Nullable + private String cacheJdbcUrl; + @Nullable + private SshTunnel.SshDetails cacheSshTunnelConfig; // misc private String sentryDsn; private List lavalinkHosts = new ArrayList<>(); - private long eventLogWebhookId; - private String eventLogWebhookToken; + private String eventLogWebhook; + private int eventLogInterval; + private String guildStatsWebhook; + private int guildStatsInterval; private String testBotToken; private String testChannelId; @@ -229,14 +238,91 @@ public Config(File credentialsFile, File configFile) { openWeatherKey = (String) creds.getOrDefault("openWeatherKey", ""); - // database + // main database jdbcUrl = (String) creds.getOrDefault("jdbcUrl", ""); - useSshTunnel = (boolean) creds.getOrDefault("useSshTunnel", false); - sshHost = (String) creds.getOrDefault("sshHost", "localhost:22"); - sshUser = (String) creds.getOrDefault("sshUser", "fredboat"); - sshPrivateKeyFile = (String) creds.getOrDefault("sshPrivateKeyFile", "database.ppk"); - forwardToPort = (int) creds.getOrDefault("forwardToPort", 5432); + if (jdbcUrl == null || jdbcUrl.isEmpty()) { + if ("docker".equals(System.getenv("ENV"))) { + log.info("No main JDBC URL found, docker environment detected. Using default docker main JDBC url"); + jdbcUrl = "jdbc:postgresql://db:5432/fredboat?user=fredboat"; + } else { + String message = "No main jdbcUrl provided in a non-docker environment. FredBoat cannot work without a database."; + log.error(message); + throw new RuntimeException(message); + } + } + boolean useSshTunnel = (boolean) creds.getOrDefault("useSshTunnel", false); + if (useSshTunnel) { + //Parse host:port + String sshHostRaw = (String) creds.getOrDefault("sshHost", "localhost:22"); + String sshHost = sshHostRaw.split(":")[0]; + int sshPort; + try { + sshPort = Integer.parseInt(sshHostRaw.split(":")[1]); + } catch (Exception e) { + sshPort = 22; + } + String sshUser = (String) creds.getOrDefault("sshUser", "fredboat"); + String sshPrivateKeyFile = (String) creds.getOrDefault("sshPrivateKeyFile", "database.ppk"); + String sshKeyPassphrase = (String) creds.getOrDefault("sshKeyPassphrase", ""); + int tunnelLocalPort = (int) creds.getOrDefault("tunnelLocalPort", 9333);//9333 is a legacy port for backwards compatibility + String tunnelRemotePortKey = "tunnelRemotePort"; + if (creds.containsKey("forwardToPort")) {//legacy check + tunnelRemotePortKey = "forwardToPort"; + } + int tunnelRemotePort = (int) creds.getOrDefault(tunnelRemotePortKey, 5432); + + mainSshTunnelConfig = new SshTunnel.SshDetails(sshHost, sshUser) + .setKeyFile(sshPrivateKeyFile) + .setPassphrase(sshKeyPassphrase == null || sshKeyPassphrase.isEmpty() ? null : sshKeyPassphrase) + .setSshPort(sshPort) + .setLocalPort(tunnelLocalPort) + .setRemotePort(tunnelRemotePort); + } + + // cache database + cacheJdbcUrl = (String) creds.getOrDefault("cacheJdbcUrl", ""); + if (cacheJdbcUrl == null || cacheJdbcUrl.isEmpty()) { + if ("docker".equals(System.getenv("ENV"))) { + log.info("No cache jdbcUrl found, docker environment detected. Using default docker cache JDBC url"); + cacheJdbcUrl = "jdbc:postgresql://db:5432/fredboat_cache?user=fredboat"; + } else { + log.warn("No cache jdbcUrl provided in a non-docker environment. This may lead to a degraded performance, " + + "especially in a high usage environment, or when using Spotify playlists."); + cacheJdbcUrl = null; + } + } + if (jdbcUrl.equals(cacheJdbcUrl)) { + log.warn("The main and cache jdbc urls may not point to the same database due to how flyway handles migrations. " + + "Please read (an updated version of) the credentials.yaml.example on configuring the cache jdbc url. " + + "The cache database will not be available in this execution of FredBoat. This may lead to a degraded performance, " + + "especially in a high usage environment, or when using Spotify playlists."); + cacheJdbcUrl = null; + } + boolean cacheUseSshTunnel = (boolean) creds.getOrDefault("cacheUseSshTunnel", false); + if (cacheUseSshTunnel) { + //Parse host:port + String cacheSshHostRaw = (String) creds.getOrDefault("cacheSshHost", "localhost:22"); + String cacheSshHost = cacheSshHostRaw.split(":")[0]; + int cacheSshPort; + try { + cacheSshPort = Integer.parseInt(cacheSshHostRaw.split(":")[1]); + } catch (Exception e) { + cacheSshPort = 22; + } + String cacheSshUser = (String) creds.getOrDefault("cacheSshUser", "fredboat"); + String cacheSshPrivateKeyFile = (String) creds.getOrDefault("cacheSshPrivateKeyFile", "database.ppk"); + String cacheSshKeyPassphrase = (String) creds.getOrDefault("cacheSshKeyPassphrase", ""); + int cacheTunnelLocalPort = (int) creds.getOrDefault("cacheTunnelLocalPort", 5433); + int cacheTunnelRemotePort = (int) creds.getOrDefault("cacheTunnelRemotePort", 5432); + + cacheSshTunnelConfig = new SshTunnel.SshDetails(cacheSshHost, cacheSshUser) + .setKeyFile(cacheSshPrivateKeyFile) + .setPassphrase(cacheSshKeyPassphrase == null || cacheSshKeyPassphrase.isEmpty() ? null : cacheSshKeyPassphrase) + .setSshPort(cacheSshPort) + .setLocalPort(cacheTunnelLocalPort) + .setRemotePort(cacheTunnelRemotePort); + } // misc Map linkNodes = (Map) creds.get("lavalinkHosts"); @@ -251,8 +337,10 @@ public Config(File credentialsFile, File configFile) { }); } - eventLogWebhookId = (long) creds.getOrDefault("eventLogWebhookId", 0L); - eventLogWebhookToken = (String) creds.getOrDefault("eventLogWebhookToken", ""); + eventLogWebhook = (String) creds.getOrDefault("eventLogWebhook", ""); + eventLogInterval = (int) creds.getOrDefault("eventLogInterval", 1); //minutes + guildStatsWebhook = (String) creds.getOrDefault("guildStatsWebhook", ""); + guildStatsInterval = (int) creds.getOrDefault("guildStatsInterval", 60); //minutes testBotToken = (String) creds.getOrDefault("testToken", ""); testChannelId = creds.getOrDefault("testChannelId", "") + ""; @@ -280,19 +368,15 @@ public Config(File credentialsFile, File configFile) { numShards = recommendedShardCount; log.info("Discord recommends " + numShards + " shard(s)"); - //more database connections don't help with performance, so use a value based on available cores + //more database connections don't help with performance, so use a value based on available cores, but not too low //http://www.dailymotion.com/video/x2s8uec_oltp-performance-concurrent-mid-tier-connections_tech - if (jdbcUrl == null || jdbcUrl.isEmpty() || distribution == DistributionEnum.DEVELOPMENT) - //more than one connection for the fallback sqlite db is problematic as there is currently (2017-04-16) - // no supported way in the custom driver and/or dialect to set lock timeouts - hikariPoolSize = 1; - else hikariPoolSize = Math.max(2, Runtime.getRuntime().availableProcessors()); + hikariPoolSize = Math.max(4, Runtime.getRuntime().availableProcessors()); log.info("Hikari max pool size set to " + hikariPoolSize); PlayerLimitManager.setLimit((Integer) config.getOrDefault("playerLimit", -1)); } catch (IOException e) { log.error("Failed to read config and or credentials files into strings.", e); - throw new RuntimeException(e); + throw new RuntimeException("Failed to read config and or credentials files into strings.", e); } catch (YAMLException | ClassCastException e) { log.error("Could not parse the credentials and/or config yaml files! They are probably misformatted. " + "Try using an online yaml validator.", e); @@ -323,13 +407,31 @@ private static String cleanTabs(String content, String file) { } } - public String getRandomGoogleKey() { - if (googleKeys.isEmpty()) { - throw new MessagingException("No Youtube API key detected. Please read the documentation of the credentials file on how to obtain one."); + + public static class LavalinkHost { + + private final URI uri; + private final String password; + + public LavalinkHost(URI uri, String password) { + this.uri = uri; + this.password = password; + } + + public URI getUri() { + return uri; + } + + public String getPassword() { + return password; } - return googleKeys.get((int) Math.floor(Math.random() * getGoogleKeys().size())); } + + // ******************************************************************************** + // Config Getters + // ******************************************************************************** + public DistributionEnum getDistribution() { return distribution; } @@ -342,175 +444,184 @@ public boolean isDevDistribution() { return distribution == DistributionEnum.DEVELOPMENT; } - public String getBotToken() { - return botToken; + public String getPrefix() { + return prefix; } - public String getJdbcUrl() { - return jdbcUrl; + public boolean isRestServerEnabled() { + return restServerEnabled; } - public int getHikariPoolSize() { - return hikariPoolSize; + public List getAdminIds() { + return adminIds; } - //this static method works even when called from tests with invalid config files leading to a null config - public static int getNumShards() { - if (CONFIG != null) { - return CONFIG.numShards; + public boolean useAutoBlacklist() { + return useAutoBlacklist; + } + + public String getGame() { + if (game == null || game.isEmpty()) { + return "Say " + getPrefix() + "help"; } else { - return 1; + return game; } } - public String getMalUser() { - return malUser; + public boolean getContinuePlayback() { + return continuePlayback; } - public String getMalPassword() { - return malPassword; + public boolean isYouTubeEnabled() { + return youtubeAudio; } - public String getImgurClientId() { - return imgurClientId; + public boolean isSoundCloudEnabled() { + return soundcloudAudio; } - public List getGoogleKeys() { - return googleKeys; + public boolean isBandCampEnabled() { + return bandcampAudio; } - public String getCarbonKey() { - return carbonKey; + public boolean isTwitchEnabled() { + return twitchAudio; } - public String getSpotifyId() { - return spotifyId; + public boolean isVimeoEnabled() { + return vimeoAudio; } - public String getSpotifySecret() { - return spotifySecret; + public boolean isMixerEnabled() { + return mixerAudio; } - public String getPrefix() { - return prefix; + public boolean isSpotifyEnabled() { + return spotifyAudio; } - public String getOpenWeatherKey() { - return openWeatherKey; + public boolean isHttpEnabled() { + return httpAudio; } - public long getEventLogWebhookId() { - return eventLogWebhookId; + + public boolean useVoiceChannelCleanup() { + return useVoiceChannelCleanup; } - public String getEventLogWebhookToken() { - return eventLogWebhookToken; + // ******************************************************************************** + // Credentials Getters + // ******************************************************************************** + + public String getBotToken() { + return botToken; } - public boolean isRestServerEnabled() { - return restServerEnabled; + public List getGoogleKeys() { + return googleKeys; } - public List getAdminIds() { - return adminIds; + public String getRandomGoogleKey() { + if (googleKeys.isEmpty()) { + throw new MessagingException("No Youtube API key detected. Please read the documentation of the credentials file on how to obtain one."); + } + return googleKeys.get((int) Math.floor(Math.random() * getGoogleKeys().size())); } - public boolean useAutoBlacklist() { - return useAutoBlacklist; + public String getMalUser() { + return malUser; } - public String getGame() { - if (game == null || game.isEmpty()) { - return "Say " + getPrefix() + "help"; - } else { - return game; - } + public String getMalPassword() { + return malPassword; } - public boolean getContinuePlayback() { return continuePlayback; } + public String getImgurClientId() { + return imgurClientId; + } - public String getTestBotToken() { - return testBotToken; + public String getSpotifyId() { + return spotifyId; } - public String getTestChannelId() { - return testChannelId; + public String getSpotifySecret() { + return spotifySecret; } - public boolean isUseSshTunnel() { - return useSshTunnel; + public String getOpenWeatherKey() { + return openWeatherKey; } - public String getSshHost() { - return sshHost; + @Nonnull + public String getMainJdbcUrl() { + return jdbcUrl; } - public String getSshUser() { - return sshUser; + @Nullable + public SshTunnel.SshDetails getMainSshTunnelConfig() { + return mainSshTunnelConfig; } - public String getSshPrivateKeyFile() { - return sshPrivateKeyFile; + @Nullable + //may return null if no cache database was provided. + public String getCacheJdbcUrl() { + return cacheJdbcUrl; } - public int getForwardToPort() { - return forwardToPort; + @Nullable + public SshTunnel.SshDetails getCacheSshTunnelConfig() { + return cacheSshTunnelConfig; } public List getLavalinkHosts() { return lavalinkHosts; } - public class LavalinkHost { - - private final URI uri; - private final String password; - - public LavalinkHost(URI uri, String password) { - this.uri = uri; - this.password = password; - } - - public URI getUri() { - return uri; - } - - public String getPassword() { - return password; - } + public String getEventLogWebhook() { + return eventLogWebhook; } - public boolean isYouTubeEnabled() { - return youtubeAudio; + //minutes + public int getEventLogInterval() { + return eventLogInterval; } - public boolean isSoundCloudEnabled() { - return soundcloudAudio; + public String getGuildStatsWebhook() { + return guildStatsWebhook; } - public boolean isBandCampEnabled() { - return bandcampAudio; + //minutes + public int getGuildStatsInterval() { + return guildStatsInterval; } - public boolean isTwitchEnabled() { - return twitchAudio; + public String getTestBotToken() { + return testBotToken; } - public boolean isVimeoEnabled() { - return vimeoAudio; + public String getTestChannelId() { + return testChannelId; } - public boolean isMixerEnabled() { - return mixerAudio; - } - public boolean isSpotifyEnabled() { - return spotifyAudio; + // ******************************************************************************** + // Derived and unofficial values + // ******************************************************************************** + + //this static method works even when called from tests with invalid config files leading to a null config + public static int getNumShards() { + if (CONFIG != null) { + return CONFIG.numShards; + } else { + return 1; + } } - public boolean isHttpEnabled() { - return httpAudio; + public int getHikariPoolSize() { + return hikariPoolSize; } - public boolean useVoiceChannelCleanup() {return useVoiceChannelCleanup; } + public String getCarbonKey() { + return carbonKey; + } } diff --git a/FredBoat/src/main/java/fredboat/FredBoat.java b/FredBoat/src/main/java/fredboat/FredBoat.java index b9e911b11..29c3ac020 100644 --- a/FredBoat/src/main/java/fredboat/FredBoat.java +++ b/FredBoat/src/main/java/fredboat/FredBoat.java @@ -39,11 +39,7 @@ import fredboat.feature.metrics.Metrics; import fredboat.shared.constant.DistributionEnum; import fredboat.shared.constant.ExitCodes; -import fredboat.util.AppInfo; -import fredboat.util.ConnectQueue; -import fredboat.util.GitRepoState; -import fredboat.util.JDAUtil; -import fredboat.util.TextUtils; +import fredboat.util.*; import fredboat.util.rest.Http; import fredboat.util.rest.OpenWeatherAPI; import fredboat.util.rest.models.weather.RetrievedWeather; @@ -59,6 +55,9 @@ import org.json.JSONObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import space.npstr.sqlsauce.DatabaseConnection; +import space.npstr.sqlsauce.DatabaseException; +import space.npstr.sqlsauce.DatabaseWrapper; import javax.annotation.Nonnull; import javax.annotation.Nullable; @@ -66,6 +65,7 @@ import java.io.IOException; import java.util.Collection; import java.util.List; +import java.util.Objects; import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -89,10 +89,14 @@ public abstract class FredBoat { protected final static StatsAgent jdaEntityCountAgent = new StatsAgent("jda entity counter"); private final static JdaEntityCounts jdaEntityCountsTotal = new JdaEntityCounts(); - private static DatabaseManager dbManager; + private static DatabaseWrapper mainDbWrapper; + + @Nullable //will be null if no cache database has been configured + private static DatabaseConnection cacheDbConn; private static final List shards = new CopyOnWriteArrayList<>(); - public static void main(String[] args) throws LoginException, IllegalArgumentException, InterruptedException, IOException { + public static void main(String[] args) throws LoginException, IllegalArgumentException, InterruptedException, + IOException, DatabaseException { //just post the info to the console if (args.length > 0 && (args[0].equalsIgnoreCase("-v") @@ -108,15 +112,20 @@ public static void main(String[] args) throws LoginException, IllegalArgumentExc Runtime.getRuntime().addShutdownHook(new Thread(ON_SHUTDOWN, "FredBoat main shutdownhook")); log.info(getVersionInfo()); - String javaVersionMinor = System.getProperty("java.version").split("\\.")[1]; + String javaVersionMinor = null; + try { + javaVersionMinor = System.getProperty("java.version").split("\\.")[1]; + } catch (Exception e) { + log.error("Exception while checking if java 8", e); + } - if (!javaVersionMinor.equals("8")) { + if (!Objects.equals(javaVersionMinor, "8")) { log.warn("\n\t\t __ ___ ___ _ _ ___ _ _ ___ \n" + "\t\t \\ \\ / /_\\ | _ \\ \\| |_ _| \\| |/ __|\n" + "\t\t \\ \\/\\/ / _ \\| / .` || || .` | (_ |\n" + "\t\t \\_/\\_/_/ \\_\\_|_\\_|\\_|___|_|\\_|\\___|\n" + "\t\t "); - log.warn("FredBoat only supports Java 8. You are running Java " + javaVersionMinor); + log.warn("FredBoat only officially supports Java 8. You are running Java {}", System.getProperty("java.version")); } I18n.start(); @@ -127,24 +136,37 @@ public static void main(String[] args) throws LoginException, IllegalArgumentExc log.info("Failed to ignite Spark, FredBoat API unavailable", e); } - dbManager = DatabaseManager.postgres(); //attempt to connect to the database a few times // this is relevant in a dockerized environment because after a reboot there is no guarantee that the db // container will be started before the fredboat one int dbConnectionAttempts = 0; - while (!dbManager.isAvailable() && dbConnectionAttempts++ < 10) { + DatabaseConnection mainDbConn = null; + while ((mainDbConn == null || !mainDbConn.isAvailable()) && dbConnectionAttempts++ < 10) { try { - dbManager.startup(); + if (mainDbConn != null) { + mainDbConn.shutdown(); + } + mainDbConn = DatabaseManager.main(); } catch (Exception e) { - log.error("Could not connect to the database. Retrying in a moment...", e); - Thread.sleep(5000); + log.info("Could not connect to the database. Retrying in a moment...", e); + Thread.sleep(6000); } } - if (!dbManager.isAvailable()) { + if (mainDbConn == null || !mainDbConn.isAvailable()) { log.error("Could not establish database connection. Exiting..."); shutdown(ExitCodes.EXIT_CODE_ERROR); + return; + } + FredBoatAgent.start(new DBConnectionWatchdogAgent(mainDbConn)); + mainDbWrapper = new DatabaseWrapper(mainDbConn); + + try { + cacheDbConn = DatabaseManager.cache(); + } catch (Exception e) { + log.error("Exception when connecting to cache db", e); + shutdown(ExitCodes.EXIT_CODE_ERROR); } - FredBoatAgent.start(new DBConnectionWatchdogAgent(dbManager)); + Metrics.instance().hibernateStats.register(); //call this exactly once after all db connections have been created //Initialise event listeners mainEventListener = new EventListenerBoat(); @@ -328,7 +350,12 @@ private static boolean areWeReadyYet() { } executor.shutdown(); - dbManager.shutdown(); + if (cacheDbConn != null) { + cacheDbConn.shutdown(); + } + if (mainDbWrapper != null) { + mainDbWrapper.unwrap().shutdown(); + } }; public static void shutdown(int code) { @@ -437,9 +464,19 @@ public static FredBoat getShard(int id) { return shards.get(id); } - @Nullable - public static DatabaseManager getDbManager() { - return dbManager; + @Nonnull + public static DatabaseConnection getMainDbConnection() { + return mainDbWrapper.unwrap(); + } + + @Nonnull + public static DatabaseWrapper getMainDbWrapper() { + return mainDbWrapper; + } + + @Nullable //may return null if no cache database has been configured + public static DatabaseConnection getCacheDbConnection() { + return cacheDbConn; } private static String getVersionInfo() { diff --git a/FredBoat/src/main/java/fredboat/FredBoatShard.java b/FredBoat/src/main/java/fredboat/FredBoatShard.java index ba71535d7..93ac1be6e 100644 --- a/FredBoat/src/main/java/fredboat/FredBoatShard.java +++ b/FredBoat/src/main/java/fredboat/FredBoatShard.java @@ -284,7 +284,7 @@ protected synchronized static JDABuilder getDefaultShardBuilder(@Nonnull EventLi if (defaultShardBuilder == null) { JDABuilder builder = new JDABuilder(AccountType.BOT) .setToken(Config.CONFIG.getBotToken()) - .setGame(Game.of(Config.CONFIG.getGame())) + .setGame(Game.playing(Config.CONFIG.getGame())) .setBulkDeleteSplittingEnabled(false) .setEnableShutdownHook(false) .setAudioEnabled(true) @@ -293,9 +293,16 @@ protected synchronized static JDABuilder getDefaultShardBuilder(@Nonnull EventLi .setReconnectQueue(connectQueue) .setHttpClientBuilder(new OkHttpClient.Builder() .eventListener(new OkHttpEventMetrics("jda"))) - .addEventListener(Metrics.instance().jdaEventsMetricsListener) - .addEventListener(new EventLogger(Config.CONFIG.getEventLogWebhookId(), - Config.CONFIG.getEventLogWebhookToken())); + .addEventListener(Metrics.instance().jdaEventsMetricsListener); + + String eventLogWebhook = Config.CONFIG.getEventLogWebhook(); + if (eventLogWebhook != null && !eventLogWebhook.isEmpty()) { + try { + builder.addEventListener(new EventLogger()); + } catch (Exception e) { + log.error("Failed to create Eventlogger, events will not be logged to discord via webhook", e); + } + } if (LavalinkManager.ins.isEnabled()) { diff --git a/FredBoat/src/main/java/fredboat/agent/DBConnectionWatchdogAgent.java b/FredBoat/src/main/java/fredboat/agent/DBConnectionWatchdogAgent.java index 72f66b88d..ebb95fb6c 100644 --- a/FredBoat/src/main/java/fredboat/agent/DBConnectionWatchdogAgent.java +++ b/FredBoat/src/main/java/fredboat/agent/DBConnectionWatchdogAgent.java @@ -24,9 +24,9 @@ package fredboat.agent; -import fredboat.db.DatabaseManager; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import space.npstr.sqlsauce.DatabaseConnection; import java.util.concurrent.TimeUnit; @@ -40,31 +40,21 @@ public class DBConnectionWatchdogAgent extends FredBoatAgent { private static final Logger log = LoggerFactory.getLogger(DBConnectionWatchdogAgent.class); - private DatabaseManager dbManager; + private DatabaseConnection dbConn; - public DBConnectionWatchdogAgent(DatabaseManager dbManager) { + public DBConnectionWatchdogAgent(DatabaseConnection dbConn) { super("database connection", 5, TimeUnit.SECONDS); - this.dbManager = dbManager; + this.dbConn = dbConn; } @Override public void doRun() { - try { - - //we have to proactively call this, as it checks the ssh tunnel for connectivity and does a validation - //query against the DB - //the ssh tunnel does detect a disconnect, but doesn't provide a callback for that, so we have to check - //it ourselves - dbManager.isAvailable(); - - //only recover the database from a failed state - if (dbManager.getState() == DatabaseManager.DatabaseState.FAILED) { - log.info("Attempting to recover failed database connection"); - dbManager.reconnectSSH(); + if (!dbConn.healthCheck()) { + log.warn("Database connection not available!"); } } catch (Exception e) { - log.error("Caught an exception while trying to recover database connection!", e); + log.error("Caught an exception while performing healthcheck on database connection.", e); } } } diff --git a/FredBoat/src/main/java/fredboat/audio/player/AbstractPlayer.java b/FredBoat/src/main/java/fredboat/audio/player/AbstractPlayer.java index ebbc1e652..e5fab7b19 100644 --- a/FredBoat/src/main/java/fredboat/audio/player/AbstractPlayer.java +++ b/FredBoat/src/main/java/fredboat/audio/player/AbstractPlayer.java @@ -76,12 +76,12 @@ public abstract class AbstractPlayer extends AudioEventAdapterWrapped implements protected AudioTrackContext context; private final AudioLossCounter audioLossCounter = new AudioLossCounter(); - protected Consumer onPlayHook; - protected Consumer onErrorHook; + Consumer onPlayHook; + Consumer onErrorHook; private static final int MAX_HISTORY_SIZE = 20; private AudioTrackContext queuedTrackInHistory = null; - protected ConcurrentLinkedQueue historyQueue = new ConcurrentLinkedQueue<>(); + private ConcurrentLinkedQueue historyQueue = new ConcurrentLinkedQueue<>(); @SuppressWarnings("LeakingThisInConstructor") AbstractPlayer(String guildId) { @@ -322,7 +322,7 @@ private void updateHistoryQueue() { *

* Silently playing a track will not trigger the onPlayHook (which announces the track usually) */ - protected void playTrack(AudioTrackContext trackContext, boolean... silent) { + private void playTrack(AudioTrackContext trackContext, boolean... silent) { log.debug("playTrack({})", trackContext.getEffectiveTitle()); context = trackContext; diff --git a/FredBoat/src/main/java/fredboat/audio/player/GuildPlayer.java b/FredBoat/src/main/java/fredboat/audio/player/GuildPlayer.java index 0a34e2832..088dcb012 100644 --- a/FredBoat/src/main/java/fredboat/audio/player/GuildPlayer.java +++ b/FredBoat/src/main/java/fredboat/audio/player/GuildPlayer.java @@ -39,7 +39,7 @@ import fredboat.commandmeta.abs.CommandContext; import fredboat.db.DatabaseNotReadyException; import fredboat.db.EntityReader; -import fredboat.db.entity.GuildConfig; +import fredboat.db.entity.main.GuildConfig; import fredboat.feature.I18n; import fredboat.messaging.CentralMessaging; import fredboat.perms.PermissionLevel; diff --git a/FredBoat/src/main/java/fredboat/audio/player/LavalinkManager.java b/FredBoat/src/main/java/fredboat/audio/player/LavalinkManager.java index 23a49ff8f..e312a2b53 100644 --- a/FredBoat/src/main/java/fredboat/audio/player/LavalinkManager.java +++ b/FredBoat/src/main/java/fredboat/audio/player/LavalinkManager.java @@ -49,10 +49,8 @@ private LavalinkManager() { public void start() { if (!isEnabled()) return; - String userId = DiscordUtil.getUserId(Config.CONFIG.getBotToken()); - lavalink = new Lavalink( - userId, + Long.toString(DiscordUtil.getBotId()), Config.getNumShards(), shardId -> FredBoat.getShard(shardId).getJda() ); diff --git a/FredBoat/src/main/java/fredboat/audio/source/SpotifyPlaylistSourceManager.java b/FredBoat/src/main/java/fredboat/audio/source/SpotifyPlaylistSourceManager.java index 53377f81d..176be4c84 100644 --- a/FredBoat/src/main/java/fredboat/audio/source/SpotifyPlaylistSourceManager.java +++ b/FredBoat/src/main/java/fredboat/audio/source/SpotifyPlaylistSourceManager.java @@ -71,8 +71,7 @@ public class SpotifyPlaylistSourceManager implements AudioSourceManager, Playlis //https://regex101.com/r/AEWyxi/3 private static final Pattern PLAYLIST_PATTERN = Pattern.compile("https?://.*\\.spotify\\.com/user/(.*)/playlist/([^?/\\s]*)"); - //Take care when deciding on upping the core pool size: The threads may hog database connections - // (for selfhosters running on the SQLite db) when loading an uncached playlist. + //Take care when deciding on upping the core pool size: The threads may hog database connections when loading an uncached playlist. // Upping the threads will also fire search requests more aggressively against Youtube which is probably better avoided. public static ScheduledExecutorService loader = Executors.newScheduledThreadPool(1); diff --git a/FredBoat/src/main/java/fredboat/command/admin/TestCommand.java b/FredBoat/src/main/java/fredboat/command/admin/TestCommand.java index 07132f161..15918b08f 100644 --- a/FredBoat/src/main/java/fredboat/command/admin/TestCommand.java +++ b/FredBoat/src/main/java/fredboat/command/admin/TestCommand.java @@ -29,14 +29,17 @@ import fredboat.commandmeta.abs.Command; import fredboat.commandmeta.abs.CommandContext; import fredboat.commandmeta.abs.ICommandRestricted; -import fredboat.db.DatabaseManager; +import fredboat.db.DatabaseNotReadyException; import fredboat.messaging.internal.Context; import fredboat.perms.PermissionLevel; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import space.npstr.sqlsauce.DatabaseConnection; +import space.npstr.sqlsauce.DatabaseException; import javax.annotation.Nonnull; import javax.persistence.EntityManager; +import javax.persistence.PersistenceException; /** * Stress tests the database @@ -47,7 +50,6 @@ public class TestCommand extends Command implements ICommandRestricted { private enum Result {WORKING, SUCCESS, FAILED} - // the SQL syntax used here work with both SQLite and PostgreSQL, beware when altering private final String DROP_TEST_TABLE = "DROP TABLE IF EXISTS test;"; private final String CREATE_TEST_TABLE = "CREATE TABLE IF NOT EXISTS test (id serial, val integer, PRIMARY KEY (id));"; private final String INSERT_TEST_TABLE = "INSERT INTO test (val) VALUES (:val) "; @@ -58,10 +60,10 @@ public TestCommand(String name, String... aliases) { @Override public void onInvoke(@Nonnull CommandContext context) { - FredBoat.executor.submit(() -> invoke(FredBoat.getDbManager(), context, context.args)); + FredBoat.executor.submit(() -> invoke(FredBoat.getMainDbConnection(), context, context.args)); } - boolean invoke(DatabaseManager dbm, Context context, String args[]) { + boolean invoke(DatabaseConnection dbConn, Context context, String args[]) { boolean result = false; @@ -77,14 +79,14 @@ boolean invoke(DatabaseManager dbm, Context context, String args[]) { context.replyWithName("Beginning stress test with " + threads + " threads each doing " + operations + " operations"); } - prepareStressTest(dbm); + prepareStressTest(dbConn); long started = System.currentTimeMillis(); Result[] results = new Result[threads]; Throwable[] exceptions = new Throwable[threads]; for (int i = 0; i < threads; i++) { results[i] = Result.WORKING; - new StressTestThread(i, operations, results, exceptions, dbm).start(); + new StressTestThread(i, operations, results, exceptions, dbConn).start(); } //wait for when it's done and report the results @@ -134,16 +136,21 @@ private boolean doneYet(Result[] results) { return true; } - private void prepareStressTest(DatabaseManager dbm) { + private void prepareStressTest(DatabaseConnection dbConn) { //drop and recreate the test table - EntityManager em = dbm.getEntityManager(); + EntityManager em = null; try { + em = dbConn.getEntityManager(); em.getTransaction().begin(); em.createNativeQuery(DROP_TEST_TABLE).executeUpdate(); em.createNativeQuery(CREATE_TEST_TABLE).executeUpdate(); em.getTransaction().commit(); + } catch (DatabaseException | PersistenceException e) { + throw new DatabaseNotReadyException(e); } finally { - em.close(); + if (em != null) { + em.close(); + } } } @@ -153,16 +160,16 @@ private class StressTestThread extends Thread { private int operations; private Result[] results; private Throwable[] exceptions; - private DatabaseManager dbm; + private DatabaseConnection dbConn; + - - StressTestThread(int number, int operations, Result[] results, Throwable[] exceptions, DatabaseManager dbm) { + StressTestThread(int number, int operations, Result[] results, Throwable[] exceptions, DatabaseConnection dbConn) { super(StressTestThread.class.getSimpleName() + " number"); this.number = number; this.operations = operations; this.results = results; this.exceptions = exceptions; - this.dbm = dbm; + this.dbConn = dbConn; } @Override @@ -171,7 +178,7 @@ public void run() { EntityManager em = null; try { for (int i = 0; i < operations; i++) { - em = dbm.getEntityManager(); + em = dbConn.getEntityManager(); try { em.getTransaction().begin(); em.createNativeQuery(INSERT_TEST_TABLE) diff --git a/FredBoat/src/main/java/fredboat/db/entity/UConfig.java b/FredBoat/src/main/java/fredboat/command/fun/MagicCommand.java similarity index 50% rename from FredBoat/src/main/java/fredboat/db/entity/UConfig.java rename to FredBoat/src/main/java/fredboat/command/fun/MagicCommand.java index 64282fac3..f39347b8c 100644 --- a/FredBoat/src/main/java/fredboat/db/entity/UConfig.java +++ b/FredBoat/src/main/java/fredboat/command/fun/MagicCommand.java @@ -1,4 +1,5 @@ /* + * * MIT License * * Copyright (c) 2017 Frederik Ar. Mikkelsen @@ -20,70 +21,40 @@ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. - * */ -package fredboat.db.entity; - -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.Table; - -@Entity -@Table(name = "user_config") -public class UConfig implements IEntity { - - @Id - private String userId; - private String bearer; - private String refresh; - private long bearerexpiration; +package fredboat.command.fun; - public String getBearer() { - return bearer; - } - - public String getRefresh() { - return refresh; - } - - public String getUserId() { - return userId; - } +import fredboat.commandmeta.abs.Command; +import fredboat.commandmeta.abs.CommandContext; +import fredboat.commandmeta.abs.IFunCommand; +import fredboat.messaging.internal.Context; +import fredboat.util.AsciiArtConstant; +import fredboat.util.TextUtils; - public long getBearerExpiration() { - return bearerexpiration; - } +import javax.annotation.Nonnull; - public UConfig(String id) { - this.userId = id; +/** + * Created by napster on 24.12.17. + */ +public class MagicCommand extends Command implements IFunCommand { + public MagicCommand(@Nonnull String name, String... aliases) { + super(name, aliases); } @Override - public void setId(String id) { - this.userId = id; - } - - public UConfig() { - } + public void onInvoke(@Nonnull CommandContext context) { + String message = "ABRA KADABRA..."; + if (context.hasArguments()) { + message = TextUtils.defuseMentions(context.rawArgs); + } - public UConfig setBearer(String bearer) { - this.bearer = bearer; - return this; + context.reply(AsciiArtConstant.MAGICAL_LENNY + message); } - public UConfig setRefresh(String refresh) { - this.refresh = refresh; - return this; - } - - public UConfig setUserId(String userId) { - this.userId = userId; - return this; - } - - public UConfig setBearerExpiration(long bearerExpiration) { - this.bearerexpiration = bearerExpiration; - return this; + @Nonnull + @Override + public String help(@Nonnull Context context) { + return "{0}{1} [message]\n#This command is magic ( ͡° ͜ʖ ͡°)"; } -} \ No newline at end of file +} diff --git a/FredBoat/src/main/java/fredboat/command/moderation/ConfigCommand.java b/FredBoat/src/main/java/fredboat/command/moderation/ConfigCommand.java index d53b498a1..1302cc881 100644 --- a/FredBoat/src/main/java/fredboat/command/moderation/ConfigCommand.java +++ b/FredBoat/src/main/java/fredboat/command/moderation/ConfigCommand.java @@ -32,7 +32,7 @@ import fredboat.commandmeta.abs.IModerationCommand; import fredboat.db.EntityReader; import fredboat.db.EntityWriter; -import fredboat.db.entity.GuildConfig; +import fredboat.db.entity.main.GuildConfig; import fredboat.messaging.CentralMessaging; import fredboat.messaging.internal.Context; import fredboat.perms.PermissionLevel; diff --git a/FredBoat/src/main/java/fredboat/command/moderation/PermissionsCommand.java b/FredBoat/src/main/java/fredboat/command/moderation/PermissionsCommand.java index f92c7c442..8717b08ce 100644 --- a/FredBoat/src/main/java/fredboat/command/moderation/PermissionsCommand.java +++ b/FredBoat/src/main/java/fredboat/command/moderation/PermissionsCommand.java @@ -31,7 +31,7 @@ import fredboat.commandmeta.abs.IModerationCommand; import fredboat.db.EntityReader; import fredboat.db.EntityWriter; -import fredboat.db.entity.GuildPermissions; +import fredboat.db.entity.main.GuildPermissions; import fredboat.feature.togglz.FeatureFlags; import fredboat.messaging.CentralMessaging; import fredboat.messaging.internal.Context; diff --git a/FredBoat/src/main/java/fredboat/command/moderation/PrefixCommand.java b/FredBoat/src/main/java/fredboat/command/moderation/PrefixCommand.java index b5c741071..497c683a9 100644 --- a/FredBoat/src/main/java/fredboat/command/moderation/PrefixCommand.java +++ b/FredBoat/src/main/java/fredboat/command/moderation/PrefixCommand.java @@ -36,7 +36,7 @@ import fredboat.commandmeta.abs.IModerationCommand; import fredboat.db.EntityReader; import fredboat.db.EntityWriter; -import fredboat.db.entity.GuildConfig; +import fredboat.db.entity.main.GuildConfig; import fredboat.messaging.internal.Context; import fredboat.perms.PermissionLevel; import fredboat.perms.PermsUtil; @@ -66,7 +66,7 @@ public PrefixCommand(@Nonnull String name, String... aliases) { //the refresh value to have the changes reflect faster in the bot, or consider implementing a FredBoat wide //Listen/Notify system for changes to in memory cached values backed by the db .recordStats() - .refreshAfterWrite(1, TimeUnit.MINUTES) //NOTE: never use refreshing without async reloading + .refreshAfterWrite(1, TimeUnit.MINUTES) //NOTE: never use refreshing without async reloading, because Guavas cache uses the thread calling it to do cleanup tasks (including refreshing) .expireAfterAccess(1, TimeUnit.MINUTES) //evict inactive guilds .concurrencyLevel(Config.getNumShards()) //each shard has a thread (main JDA thread) accessing this cache many times .build(CacheLoader.asyncReloading(CacheLoader.from(GuildConfig::getPrefix), FredBoat.executor)); @@ -84,7 +84,7 @@ public static String giefPrefix(@Nullable Guild guild) { return Config.CONFIG.getPrefix(); } - if (guild.getJDA().getSelfUser().getId().equalsIgnoreCase(BotConstants.PATRON_BOT_ID)) { + if (guild.getJDA().getSelfUser().getIdLong() == BotConstants.PATRON_BOT_ID) { return Config.CONFIG.getPrefix(); //todo lift this limitation after sorting out a data strategy } @@ -103,7 +103,7 @@ public void onInvoke(@Nonnull CommandContext context) { return; } - if (context.guild.getJDA().getSelfUser().getId().equalsIgnoreCase(BotConstants.PATRON_BOT_ID)) { + if (context.guild.getJDA().getSelfUser().getIdLong() == BotConstants.PATRON_BOT_ID) { context.reply("Sorry, this feature has not yet been enabled for the PatronBot! Have a picture of a wombat instead."); wombats.onInvoke(context); return; diff --git a/FredBoat/src/main/java/fredboat/command/music/control/SelectCommand.java b/FredBoat/src/main/java/fredboat/command/music/control/SelectCommand.java index 16d0ee0bb..c9859637c 100644 --- a/FredBoat/src/main/java/fredboat/command/music/control/SelectCommand.java +++ b/FredBoat/src/main/java/fredboat/command/music/control/SelectCommand.java @@ -73,21 +73,16 @@ static void select(CommandContext context) { // LinkedHashSet to handle order of choices + duplicates LinkedHashSet requestChoices = new LinkedHashSet<>(); - // Combine all args and the command trigger. if the trigger is not a number it will be sanitized away - String commandOptions = (context.trigger + " " + context.rawArgs).trim(); - String sanitizedQuery = sanitizeQueryForMultiSelect(commandOptions).trim(); + // Combine all args and the command trigger if it is numeric + String commandOptions = context.rawArgs; + if (StringUtils.isNumeric(context.trigger)) { + commandOptions = (context.trigger + " " + commandOptions).trim(); + } if (StringUtils.isNumeric(commandOptions)) { requestChoices.add(Integer.valueOf(commandOptions)); - } else if (TextUtils.isSplitSelect(sanitizedQuery)) { - // Remove all non comma or number characters - String[] querySplit = sanitizedQuery.split(",|\\s"); - - for (String value : querySplit) { - if (StringUtils.isNumeric(value)) { - requestChoices.add(Integer.valueOf(value)); - } - } + } else if (TextUtils.isSplitSelect(commandOptions)) { + requestChoices.addAll(TextUtils.getSplitSelect(commandOptions)); } //Step 2: Use only valid numbers (usually 1-5) @@ -147,15 +142,4 @@ public String help(@Nonnull Context context) { public PermissionLevel getMinimumPerms() { return PermissionLevel.USER; } - - /** - * Helper method to remove all characters from arg that is not numerical or comma. - * - * @param arg String to be sanitized. - * @return Sanitized string. - */ - private static String sanitizeQueryForMultiSelect(@Nonnull String arg) { - return arg.replaceAll("[^0-9$., ]", ""); - } - } diff --git a/FredBoat/src/main/java/fredboat/command/util/HelpCommand.java b/FredBoat/src/main/java/fredboat/command/util/HelpCommand.java index a173deadb..ddd9a107e 100644 --- a/FredBoat/src/main/java/fredboat/command/util/HelpCommand.java +++ b/FredBoat/src/main/java/fredboat/command/util/HelpCommand.java @@ -34,26 +34,25 @@ import fredboat.commandmeta.abs.CommandContext; import fredboat.commandmeta.abs.ICommandRestricted; import fredboat.commandmeta.abs.IUtilCommand; -import fredboat.feature.I18n; import fredboat.messaging.CentralMessaging; import fredboat.messaging.internal.Context; import fredboat.perms.PermissionLevel; +import fredboat.shared.constant.BotConstants; import fredboat.util.Emojis; import fredboat.util.TextUtils; import net.dv8tion.jda.core.Permission; import net.dv8tion.jda.core.entities.Guild; +import net.dv8tion.jda.core.entities.Member; +import net.dv8tion.jda.core.entities.TextChannel; +import net.dv8tion.jda.core.entities.User; import net.dv8tion.jda.core.events.message.priv.PrivateMessageReceivedEvent; import javax.annotation.Nonnull; -import javax.annotation.Nullable; import java.text.MessageFormat; import java.util.concurrent.TimeUnit; public class HelpCommand extends Command implements IUtilCommand { - //This can be set using eval in case we need to change it in the future ~Fre_d - public static String inviteLink = "https://discord.gg/cgPFW4q"; - //keeps track of whether a user received help lately to avoid spamming/clogging up DMs which are rather harshly ratelimited public static final Cache HELP_RECEIVED_RECENTLY = CacheBuilder.newBuilder() .recordStats() @@ -87,7 +86,7 @@ public static void sendGeneralHelp(@Nonnull CommandContext context) { return; } - context.replyPrivate(getHelpDmMsg(context.guild), + context.replyPrivate(getHelpDmMsg(context), success -> { HELP_RECEIVED_RECENTLY.put(userId, true); String out = context.i18n("helpSent"); @@ -113,7 +112,27 @@ public static void sendGeneralHelp(@Nonnull PrivateMessageReceivedEvent event) { } HELP_RECEIVED_RECENTLY.put(event.getAuthor().getIdLong(), true); - CentralMessaging.sendMessage(event.getChannel(), getHelpDmMsg(null)); + CentralMessaging.sendMessage(event.getChannel(), getHelpDmMsg(new Context() { //yeah this is ugly ¯\_(ツ)_/¯ + @Override + public TextChannel getTextChannel() { + return null; + } + + @Override + public Guild getGuild() { + return null; + } + + @Override + public Member getMember() { + return null; + } + + @Override + public User getUser() { + return event.getAuthor(); + } + })); } public static String getFormattedCommandHelp(Context context, Command command, String commandOrAlias) { @@ -154,7 +173,12 @@ private static void sendFormattedCommandHelp(CommandContext context, String trig context.replyWithName(out); } - public static String getHelpDmMsg(@Nullable Guild guild) { - return MessageFormat.format(I18n.get(guild).getString("helpDM"), inviteLink); + @Nonnull + public static String getHelpDmMsg(@Nonnull Context context) { + String docsLocation = context.i18n("helpDocsLocation") + "\n" + BotConstants.DOCS_URL; + String botInvite = context.i18n("helpBotInvite") + "\n<" + BotConstants.botInvite + ">"; + String hangoutInvite = context.i18n("helpHangoutInvite") + "\n" + BotConstants.hangoutInvite; + String footer = context.i18n("helpNoDmCommands") + "\n" + context.i18n("helpCredits"); + return docsLocation + "\n\n" + botInvite + "\n\n" + hangoutInvite + "\n\n" + footer; } } diff --git a/FredBoat/src/main/java/fredboat/commandmeta/CommandManager.java b/FredBoat/src/main/java/fredboat/commandmeta/CommandManager.java index 581dfe43c..d225f1714 100644 --- a/FredBoat/src/main/java/fredboat/commandmeta/CommandManager.java +++ b/FredBoat/src/main/java/fredboat/commandmeta/CommandManager.java @@ -26,7 +26,6 @@ package fredboat.commandmeta; -import fredboat.Config; import fredboat.audio.player.PlayerRegistry; import fredboat.command.fun.AkinatorCommand; import fredboat.commandmeta.abs.Command; @@ -40,7 +39,6 @@ import fredboat.perms.PermissionLevel; import fredboat.perms.PermsUtil; import fredboat.shared.constant.BotConstants; -import fredboat.shared.constant.DistributionEnum; import fredboat.util.TextUtils; import net.dv8tion.jda.core.entities.Guild; import net.dv8tion.jda.core.entities.Member; @@ -70,13 +68,6 @@ public static void prefixCalled(CommandContext context) { totalCommandsExecuted.incrementAndGet(); Metrics.commandsExecuted.labels(invoked.getClass().getSimpleName()).inc(); - if (guild.getJDA().getSelfUser().getId().equals(BotConstants.PATRON_BOT_ID) - && Config.CONFIG.getDistribution() == DistributionEnum.PATRON - && guild.getId().equals(BotConstants.FREDBOAT_HANGOUT_ID)) { - log.info("Ignored command because patron bot is not allowed in FredBoatHangout"); - return; - } - if (FeatureFlags.PATRON_VALIDATION.isActive()) { PatronageChecker.Status status = PatronageCheckerHolder.instance.getStatus(guild); if (!status.isValid()) { @@ -92,8 +83,8 @@ public static void prefixCalled(CommandContext context) { //Hardcode music commands in FredBoatHangout. Blacklist any channel that isn't #general or #staff, but whitelist Frederikam if ((invoked instanceof IMusicCommand || invoked instanceof AkinatorCommand) // the hate is real - && guild.getId().equals(BotConstants.FREDBOAT_HANGOUT_ID) - && guild.getJDA().getSelfUser().getId().equals(BotConstants.MUSIC_BOT_ID)) { + && guild.getIdLong() == BotConstants.FREDBOAT_HANGOUT_ID + && guild.getJDA().getSelfUser().getIdLong() == BotConstants.MUSIC_BOT_ID) { if (!channel.getId().equals("174821093633294338") // #spam_and_music && !channel.getId().equals("217526705298866177") // #staff && !invoker.getUser().getId().equals("203330266461110272")//Cynth diff --git a/FredBoat/src/main/java/fredboat/commandmeta/abs/CommandContext.java b/FredBoat/src/main/java/fredboat/commandmeta/abs/CommandContext.java index a1b6eca27..2159a0fb9 100644 --- a/FredBoat/src/main/java/fredboat/commandmeta/abs/CommandContext.java +++ b/FredBoat/src/main/java/fredboat/commandmeta/abs/CommandContext.java @@ -118,7 +118,8 @@ public static CommandContext parse(MessageReceivedEvent event) { } } - String[] args = input.split("\\s+"); //split by any length of white space characters (including new lines) + // the \p{javaSpaceChar} instead of the better known \s is used because it actually includes unicode whitespaces + String[] args = input.split("\\p{javaSpaceChar}+"); if (args.length < 1) { return null; //while this shouldn't technically be possible due to the preprocessing of the input, better be safe than throw exceptions } @@ -157,8 +158,10 @@ private CommandContext(@Nonnull Guild guild, @Nonnull TextChannel channel, @Nonn */ public void deleteMessage() { TextChannel tc = msg.getTextChannel(); - if (tc != null && hasPermissions(tc, Permission.MESSAGE_MANAGE, Permission.MESSAGE_READ)) { - CentralMessaging.deleteMessage(msg); + if (tc != null && hasPermissions(tc, Permission.MESSAGE_MANAGE, //While Manage Message _should_ be enough as it _should_ + Permission.MESSAGE_READ, // implicitly give us all the other Text permissions, + Permission.MESSAGE_HISTORY)) { // it is bugged, so we do some additional checks here. + CentralMessaging.deleteMessage(msg); // See https://github.com/DV8FromTheWorld/JDA/issues/414 for more info. } } diff --git a/FredBoat/src/main/java/fredboat/commandmeta/init/MainCommandInitializer.java b/FredBoat/src/main/java/fredboat/commandmeta/init/MainCommandInitializer.java index de476a3c0..021a5ef61 100644 --- a/FredBoat/src/main/java/fredboat/commandmeta/init/MainCommandInitializer.java +++ b/FredBoat/src/main/java/fredboat/commandmeta/init/MainCommandInitializer.java @@ -116,7 +116,7 @@ public static void initCommands() { CommandRegistry.registerCommand(new TextCommand("/╲/╭( ͡° ͡° ͜ʖ ͡° ͡°)╮/╱\\", "spiderlenny")); CommandRegistry.registerCommand(new TextCommand("( ͡° ͜ʖ ͡°)", "lenny")); CommandRegistry.registerCommand(new TextCommand("┬┴┬┴┤ ͜ʖ ͡°) ├┬┴┬┴", "peeking", "peekinglenny", "peek")); - CommandRegistry.registerCommand(new TextCommand(AsciiArtConstant.MAGICAL_LENNY, "magicallenny", "lennymagical")); + CommandRegistry.registerCommand(new MagicCommand("magic", "magicallenny", "lennymagical")); CommandRegistry.registerCommand(new TextCommand(AsciiArtConstant.EAGLE_OF_LENNY, "eagleoflenny", "eol", "lennyeagle")); /* Misc - All commands under this line fall in this category */ diff --git a/FredBoat/src/main/java/fredboat/db/DatabaseManager.java b/FredBoat/src/main/java/fredboat/db/DatabaseManager.java index 5b540f421..9fd32a57f 100644 --- a/FredBoat/src/main/java/fredboat/db/DatabaseManager.java +++ b/FredBoat/src/main/java/fredboat/db/DatabaseManager.java @@ -25,332 +25,128 @@ package fredboat.db; -import com.jcraft.jsch.JSch; -import com.jcraft.jsch.Session; -import com.zaxxer.hikari.HikariDataSource; +import com.zaxxer.hikari.HikariConfig; import fredboat.Config; -import fredboat.FredBoat; import fredboat.feature.metrics.Metrics; import net.sf.ehcache.CacheManager; import net.sf.ehcache.config.CacheConfiguration; import net.sf.ehcache.config.PersistenceConfiguration; -import org.hibernate.engine.jdbc.connections.spi.ConnectionProvider; -import org.hibernate.internal.SessionFactoryImpl; -import org.hibernate.jpa.HibernatePersistenceProvider; +import org.flywaydb.core.Flyway; +import org.flywaydb.core.api.MigrationVersion; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; -import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; +import space.npstr.sqlsauce.DatabaseConnection; +import space.npstr.sqlsauce.DatabaseException; -import javax.persistence.EntityManager; -import javax.persistence.EntityManagerFactory; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; import java.util.Properties; public class DatabaseManager { private static final Logger log = LoggerFactory.getLogger(DatabaseManager.class); - private static final String DEFAULT_PERSISTENCE_UNIT_NAME = "fredboat.default"; - - //see https://github.com/brettwooldridge/HikariCP connectionTimeout - private static final int HIKARI_TIMEOUT_MILLISECONDS = 1000; - - private EntityManagerFactory emf; - private Session sshTunnel; - private DatabaseState state = DatabaseState.UNINITIALIZED; - - //local port, if using SSH tunnel point your jdbc to this, e.g. jdbc:postgresql://localhost:9333/... - private static final int SSH_TUNNEL_PORT = 9333; - - private final String jdbcUrl; - private final int poolSize; - - /** - * @param jdbcUrl connection to the database - * @param poolSize max size of the connection pool - */ - private DatabaseManager(String jdbcUrl, int poolSize) { - this.jdbcUrl = jdbcUrl; - this.poolSize = poolSize; - } - - - public static DatabaseManager postgres() { - String jdbc = Config.CONFIG.getJdbcUrl(); - if (jdbc == null || jdbc.isEmpty()) { - log.info("No JDBC URL found, assuming this is a docker environment. Trying default docker JDBC url"); - jdbc = "jdbc:postgresql://db:5432/fredboat?user=fredboat"; - } - return new DatabaseManager(jdbc, Config.CONFIG.getHikariPoolSize()); - } - - /** - * Starts the database connection. - * - * @throws IllegalStateException if trying to start a database that is READY or INITIALIZING - */ - public synchronized DatabaseManager startup() { - if (state == DatabaseState.READY || state == DatabaseState.INITIALIZING) { - throw new IllegalStateException("Can't start the database, when it's current state is " + state); - } - - state = DatabaseState.INITIALIZING; - - try { - if (Config.CONFIG.isUseSshTunnel()) { - //don't connect again if it's already connected - if (sshTunnel == null || !sshTunnel.isConnected()) { - connectSSH(); - } - } - - //These are now located in the resources directory as XML - Properties properties = new Properties(); - properties.put("configLocation", "hibernate.cfg.xml"); - - properties.put("hibernate.connection.provider_class", "org.hibernate.hikaricp.internal.HikariCPConnectionProvider"); - properties.put("hibernate.connection.url", jdbcUrl); - properties.put("hibernate.dialect", "org.hibernate.dialect.PostgreSQL95Dialect"); - properties.put("hibernate.cache.use_second_level_cache", "true"); - properties.put("hibernate.cache.provider_configuration_file_resource_path", "ehcache.xml"); - properties.put("hibernate.cache.region.factory_class", "org.hibernate.cache.ehcache.EhCacheRegionFactory"); - - //this does a lot of logs - //properties.put("hibernate.show_sql", "true"); - - //automatically update the tables we need - //caution: only add new columns, don't remove or alter old ones, otherwise manual db table migration needed - properties.put("hibernate.hbm2ddl.auto", "update"); - - //disable autocommit, it is not recommended for our usecases, and interferes with some of them - // see https://vladmihalcea.com/2017/05/17/why-you-should-always-use-hibernate-connection-provider_disables_autocommit-for-resource-local-jpa-transactions/ - // this also means all EntityManager interactions need to be wrapped into em.getTransaction.begin() and - // em.getTransaction.commit() to prevent a rollback spam at the database - properties.put("hibernate.connection.autocommit", "true"); - properties.put("hibernate.connection.provider_disables_autocommit", "false"); - - properties.put("hibernate.hikari.maximumPoolSize", Integer.toString(poolSize)); - - //how long to wait for a connection becoming available, also the timeout when a DB fails - properties.put("hibernate.hikari.connectionTimeout", Integer.toString(HIKARI_TIMEOUT_MILLISECONDS)); - //this helps with sorting out connections in pgAdmin - properties.put("hibernate.hikari.dataSource.ApplicationName", "FredBoat_" + Config.CONFIG.getDistribution()); - - //timeout the validation query (will be done automatically through Connection.isValid()) - properties.put("hibernate.hikari.validationTimeout", "1000"); - - properties.put("hibernate.hikari.driverClassName", "org.postgresql.Driver"); - - - LocalContainerEntityManagerFactoryBean emfb = new LocalContainerEntityManagerFactoryBean(); - emfb.setPackagesToScan("fredboat.db.entity"); - emfb.setJpaVendorAdapter(new HibernateJpaVendorAdapter()); - emfb.setJpaProperties(properties); - emfb.setPersistenceUnitName(DEFAULT_PERSISTENCE_UNIT_NAME); - emfb.setPersistenceProviderClass(HibernatePersistenceProvider.class); - emfb.afterPropertiesSet(); - - //leak prevention, close existing factory if possible - closeEntityManagerFactory(); - - emf = emfb.getObject(); - - try { - //add metrics to hikari and hibernate - SessionFactoryImpl sessionFactory = emf.unwrap(SessionFactoryImpl.class); - sessionFactory.getServiceRegistry().getService(ConnectionProvider.class) - .unwrap(HikariDataSource.class) - .setMetricsTrackerFactory(Metrics.instance().hikariStats); - //NOTE the register() on the HibernateCollector may only be called once so this will break in case we create 2 connections - Metrics.instance().hibernateStats.add(sessionFactory, DEFAULT_PERSISTENCE_UNIT_NAME).register(); - } catch (Exception e) { - log.warn("Exception when registering database metrics. This is not expected to happen outside of tests.", e); - } - - //adjusting the ehcache config - if (!Config.CONFIG.isUseSshTunnel()) { - //local database: turn off overflow to disk of the cache - for (CacheManager cacheManager : CacheManager.ALL_CACHE_MANAGERS) { - for (String cacheName : cacheManager.getCacheNames()) { - CacheConfiguration cacheConfig = cacheManager.getCache(cacheName).getCacheConfiguration(); - cacheConfig.getPersistenceConfiguration().strategy(PersistenceConfiguration.Strategy.NONE); - } - } - } - for (CacheManager cacheManager : CacheManager.ALL_CACHE_MANAGERS) { - log.debug(cacheManager.getActiveConfigurationText()); + private static final String MAIN_PERSISTENCE_UNIT_NAME = "fredboat.main"; + private static final String CACHE_PERSISTENCE_UNIT_NAME = "fredboat.cache"; + + @Nonnull + public static DatabaseConnection main() throws DatabaseException { + String jdbc = Config.CONFIG.getMainJdbcUrl(); + + Flyway flyway = new Flyway(); + flyway.setBaselineOnMigrate(true); + flyway.setBaselineVersion(MigrationVersion.fromVersion("0")); + flyway.setBaselineDescription("Base Migration"); + flyway.setLocations("classpath:fredboat/db/migrations/main"); + + HikariConfig hikariConfig = DatabaseConnection.Builder.getDefaultHikariConfig(); + hikariConfig.setMaximumPoolSize(Config.CONFIG.getHikariPoolSize()); + + Properties hibernateProps = DatabaseConnection.Builder.getDefaultHibernateProps(); + hibernateProps.put("hibernate.cache.use_second_level_cache", "true"); + hibernateProps.put("hibernate.cache.use_query_cache", "true"); + hibernateProps.put("net.sf.ehcache.configurationResourceName", "/ehcache_main.xml"); + hibernateProps.put("hibernate.cache.provider_configuration_file_resource_path", "ehcache_main.xml"); + hibernateProps.put("hibernate.cache.region.factory_class", "org.hibernate.cache.ehcache.EhCacheRegionFactory"); + //we use flyway db now for migrations, hibernate shall only run validations + hibernateProps.put("hibernate.hbm2ddl.auto", "validate"); + + DatabaseConnection databaseConnection = new DatabaseConnection.Builder(MAIN_PERSISTENCE_UNIT_NAME, jdbc) + .setHikariConfig(hikariConfig) + .setHibernateProps(hibernateProps) + .setDialect("org.hibernate.dialect.PostgreSQL95Dialect") + .addEntityPackage("fredboat.db.entity.main") + .setAppName("FredBoat_" + Config.CONFIG.getDistribution()) + .setSshDetails(Config.CONFIG.getMainSshTunnelConfig()) + .setHikariStats(Metrics.instance().hikariStats) + .setHibernateStats(Metrics.instance().hibernateStats) + .setCheckConnection(false) + .setFlyway(flyway) + .build(); + + //adjusting the ehcache config + if (Config.CONFIG.getMainSshTunnelConfig() == null) { + //local database: turn off overflow to disk of the cache + CacheManager cacheManager = CacheManager.getCacheManager("MAIN_CACHEMANAGER"); + for (String cacheName : cacheManager.getCacheNames()) { + CacheConfiguration cacheConfig = cacheManager.getCache(cacheName).getCacheConfiguration(); + cacheConfig.getPersistenceConfiguration().strategy(PersistenceConfiguration.Strategy.NONE); } - - log.info("Started Hibernate"); - state = DatabaseState.READY; - } catch (Exception ex) { - state = DatabaseState.FAILED; - throw new RuntimeException("Failed starting database connection", ex); } - return this; - } + log.debug(CacheManager.getCacheManager("MAIN_CACHEMANAGER").getActiveConfigurationText()); - public void reconnectSSH() { - connectSSH(); - //try a test query and if successful set state to ready - EntityManager em = getEntityManager(); - try { - em.getTransaction().begin(); - em.createNativeQuery("SELECT 1;").getResultList(); - em.getTransaction().commit(); - state = DatabaseState.READY; - } finally { - em.close(); - } + return databaseConnection; } - private synchronized void connectSSH() { - if (!Config.CONFIG.isUseSshTunnel()) { - log.warn("Cannot connect ssh tunnel as it is not specified in the config"); - return; - } - if (sshTunnel != null && sshTunnel.isConnected()) { - log.info("Tunnel is already connected, disconnect first before reconnecting"); - return; - } - try { - //establish the tunnel - log.info("Starting SSH tunnel"); - - java.util.Properties config = new java.util.Properties(); - JSch jsch = new JSch(); - JSch.setLogger(new JSchLogger()); - - //Parse host:port - String sshHost = Config.CONFIG.getSshHost().split(":")[0]; - int sshPort = Integer.parseInt(Config.CONFIG.getSshHost().split(":")[1]); - - Session session = jsch.getSession(Config.CONFIG.getSshUser(), - sshHost, - sshPort - ); - jsch.addIdentity(Config.CONFIG.getSshPrivateKeyFile()); - config.put("StrictHostKeyChecking", "no"); - config.put("ConnectionAttempts", "3"); - session.setConfig(config); - session.setServerAliveInterval(1000);//milliseconds - session.connect(); - - log.info("SSH Connected"); - - //forward the port - int assignedPort = session.setPortForwardingL( - SSH_TUNNEL_PORT, - "localhost", - Config.CONFIG.getForwardToPort() - ); - - sshTunnel = session; - log.info("localhost:" + assignedPort + " -> " + sshHost + ":" + Config.CONFIG.getForwardToPort()); - log.info("Port Forwarded"); - } catch (Exception e) { - throw new RuntimeException("Failed to start SSH tunnel", e); - } - } - - /** - * Please call close() on the EntityManager object you receive after you are done to let the pool recycle the - * connection and save the nature from environmental toxins like open database connections. - */ - public EntityManager getEntityManager() { - return emf.createEntityManager(); - } - - /** - * Performs health checks on the ssh tunnel and database - * - * @return true if the database is operational, false if not - */ - public boolean isAvailable() { - if (state != DatabaseState.READY) { - return false; - } - - //is the ssh connection still alive? - if (sshTunnel != null && !sshTunnel.isConnected()) { - log.error("SSH tunnel lost connection."); - state = DatabaseState.FAILED; - //immediately try to reconnect the tunnel - //DBConnectionWatchdogAgent should take further care of this - FredBoat.executor.submit(this::reconnectSSH); - return false; + @Nullable //may return null of no cache db has been configured + public static DatabaseConnection cache() throws DatabaseException { + String cacheJdbc = Config.CONFIG.getCacheJdbcUrl(); + if (cacheJdbc == null) { + return null; } - return state == DatabaseState.READY; - } - - /** - * Avoid multiple threads calling a close on the factory by wrapping it into this synchronized method - */ - private synchronized void closeEntityManagerFactory() { - if (emf != null && emf.isOpen()) { - try { - emf.close(); - } catch (IllegalStateException ignored) { - //it has already been closed, nothing to catch here + Flyway flyway = new Flyway(); + flyway.setBaselineOnMigrate(true); + flyway.setBaselineVersion(MigrationVersion.fromVersion("0")); + flyway.setBaselineDescription("Base Migration"); + flyway.setLocations("classpath:fredboat/db/migrations/cache"); + + HikariConfig hikariConfig = DatabaseConnection.Builder.getDefaultHikariConfig(); + hikariConfig.setMaximumPoolSize(Config.CONFIG.getHikariPoolSize()); + + Properties hibernateProps = DatabaseConnection.Builder.getDefaultHibernateProps(); + hibernateProps.put("hibernate.cache.use_second_level_cache", "true"); + hibernateProps.put("hibernate.cache.use_query_cache", "true"); + hibernateProps.put("net.sf.ehcache.configurationResourceName", "/ehcache_cache.xml"); + hibernateProps.put("hibernate.cache.provider_configuration_file_resource_path", "ehcache_cache.xml"); + hibernateProps.put("hibernate.cache.region.factory_class", "org.hibernate.cache.ehcache.EhCacheRegionFactory"); + //we use flyway db now for migrations, hibernate shall only run validations + hibernateProps.put("hibernate.hbm2ddl.auto", "validate"); + + DatabaseConnection databaseConnection = new DatabaseConnection.Builder(CACHE_PERSISTENCE_UNIT_NAME, cacheJdbc) + .setHikariConfig(hikariConfig) + .setHibernateProps(hibernateProps) + .setDialect("org.hibernate.dialect.PostgreSQL95Dialect") + .addEntityPackage("fredboat.db.entity.cache") + .setAppName("FredBoat_" + Config.CONFIG.getDistribution()) + .setSshDetails(Config.CONFIG.getCacheSshTunnelConfig()) + .setHikariStats(Metrics.instance().hikariStats) + .setHibernateStats(Metrics.instance().hibernateStats) + .setFlyway(flyway) + .build(); + + //adjusting the ehcache config + if (Config.CONFIG.getMainSshTunnelConfig() == null) { + //local database: turn off overflow to disk of the cache + CacheManager cacheManager = CacheManager.getCacheManager("CACHE_CACHEMANAGER"); + for (String cacheName : cacheManager.getCacheNames()) { + CacheConfiguration cacheConfig = cacheManager.getCache(cacheName).getCacheConfiguration(); + cacheConfig.getPersistenceConfiguration().strategy(PersistenceConfiguration.Strategy.NONE); } } - } - - public DatabaseState getState() { - return state; - } - - public enum DatabaseState { - UNINITIALIZED, - INITIALIZING, - FAILED, - READY, - SHUTDOWN - } - - /** - * Shutdown, close, stop, halt, burn down all resources this object has been using - */ - public void shutdown() { - log.info("DatabaseManager shutdown call received, shutting down"); - state = DatabaseState.SHUTDOWN; - closeEntityManagerFactory(); - - if (sshTunnel != null) - sshTunnel.disconnect(); - } - - private static class JSchLogger implements com.jcraft.jsch.Logger { - - private static final Logger logger = LoggerFactory.getLogger("JSch"); - - @Override - public boolean isEnabled(int level) { - return true; - } + log.debug(CacheManager.getCacheManager("CACHE_CACHEMANAGER").getActiveConfigurationText()); - @Override - public void log(int level, String message) { - switch (level) { - case com.jcraft.jsch.Logger.DEBUG: - logger.debug(message); - break; - case com.jcraft.jsch.Logger.INFO: - logger.info(message); - break; - case com.jcraft.jsch.Logger.WARN: - logger.warn(message); - break; - case com.jcraft.jsch.Logger.ERROR: - case com.jcraft.jsch.Logger.FATAL: - logger.error(message); - break; - default: - throw new RuntimeException("Invalid log level"); - } - } + return databaseConnection; } - } diff --git a/FredBoat/src/main/java/fredboat/db/EntityReader.java b/FredBoat/src/main/java/fredboat/db/EntityReader.java index 82c75a3b5..d3151bbc9 100644 --- a/FredBoat/src/main/java/fredboat/db/EntityReader.java +++ b/FredBoat/src/main/java/fredboat/db/EntityReader.java @@ -27,14 +27,14 @@ import fredboat.FredBoat; -import fredboat.db.entity.BlacklistEntry; -import fredboat.db.entity.GuildConfig; -import fredboat.db.entity.GuildPermissions; import fredboat.db.entity.IEntity; -import fredboat.db.entity.UConfig; +import fredboat.db.entity.main.BlacklistEntry; +import fredboat.db.entity.main.GuildConfig; +import fredboat.db.entity.main.GuildPermissions; import net.dv8tion.jda.core.entities.Guild; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import space.npstr.sqlsauce.DatabaseException; import javax.persistence.EntityManager; import javax.persistence.PersistenceException; @@ -44,10 +44,6 @@ public class EntityReader { private static final Logger log = LoggerFactory.getLogger(EntityReader.class); - public static UConfig getUConfig(String id) { - return getEntity(id, UConfig.class); - } - public static GuildConfig getGuildConfig(String id) { return getEntity(id, GuildConfig.class); } @@ -57,22 +53,20 @@ public static GuildPermissions getGuildPermissions(Guild guild) { } private static E getEntity(String id, Class clazz) throws DatabaseNotReadyException { - DatabaseManager dbManager = FredBoat.getDbManager(); - if (dbManager == null || !dbManager.isAvailable()) { - throw new DatabaseNotReadyException(); - } - - EntityManager em = dbManager.getEntityManager(); - E config = null; + EntityManager em = null; + E config; try { + em = FredBoat.getMainDbConnection().getEntityManager(); em.getTransaction().begin(); config = em.find(clazz, id); em.getTransaction().commit(); - } catch (PersistenceException e) { - log.error("Error while trying to find entity of class {} from DB for id {}", clazz.getName(), id, e); + } catch (DatabaseException | PersistenceException e) { + log.error("Failed to find entity of class {} from DB for id {}", clazz.getName(), id, e); throw new DatabaseNotReadyException(e); } finally { - em.close(); + if (em != null) { + em.close(); + } } //return a fresh object if we didn't find the one we were looking for if (config == null) config = newInstance(id, clazz); @@ -90,18 +84,20 @@ private static E newInstance(String id, Class clazz) { } public static List loadBlacklist() { - DatabaseManager dbManager = FredBoat.getDbManager(); - if (dbManager == null || !dbManager.isAvailable()) { - throw new DatabaseNotReadyException("The database is not available currently. Please try again later."); - } - EntityManager em = dbManager.getEntityManager(); + EntityManager em = null; List result; try { + em = FredBoat.getMainDbConnection().getEntityManager(); em.getTransaction().begin(); result = em.createQuery("SELECT b FROM BlacklistEntry b", BlacklistEntry.class).getResultList(); em.getTransaction().commit(); + } catch (DatabaseException | PersistenceException e) { + log.error("Failed to load blacklist", e); + throw new DatabaseNotReadyException(e); } finally { - em.close(); + if (em != null) { + em.close(); + } } return result; } diff --git a/FredBoat/src/main/java/fredboat/db/EntityWriter.java b/FredBoat/src/main/java/fredboat/db/EntityWriter.java index 4b69b4dc2..725e2080b 100644 --- a/FredBoat/src/main/java/fredboat/db/EntityWriter.java +++ b/FredBoat/src/main/java/fredboat/db/EntityWriter.java @@ -26,25 +26,21 @@ package fredboat.db; import fredboat.FredBoat; -import fredboat.db.entity.BlacklistEntry; -import fredboat.db.entity.GuildConfig; -import fredboat.db.entity.GuildPermissions; import fredboat.db.entity.IEntity; -import fredboat.db.entity.UConfig; -import org.hibernate.exception.JDBCConnectionException; +import fredboat.db.entity.main.BlacklistEntry; +import fredboat.db.entity.main.GuildConfig; +import fredboat.db.entity.main.GuildPermissions; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import space.npstr.sqlsauce.DatabaseException; import javax.persistence.EntityManager; +import javax.persistence.PersistenceException; public class EntityWriter { private static final Logger log = LoggerFactory.getLogger(EntityWriter.class); - public static void mergeUConfig(UConfig config) { - merge(config); - } - public static void mergeGuildConfig(GuildConfig config) { merge(config); } @@ -58,32 +54,26 @@ public static void mergeGuildPermissions(GuildPermissions guildPermissions) { } private static void merge(IEntity entity) { - DatabaseManager dbManager = FredBoat.getDbManager(); - if (dbManager == null || !dbManager.isAvailable()) { - throw new DatabaseNotReadyException(); - } - - EntityManager em = dbManager.getEntityManager(); + EntityManager em = null; try { + em = FredBoat.getMainDbConnection().getEntityManager(); em.getTransaction().begin(); em.merge(entity); em.getTransaction().commit(); - } catch (JDBCConnectionException e) { + } catch (PersistenceException | DatabaseException e) { log.error("Failed to merge entity {}", entity, e); throw new DatabaseNotReadyException(e); } finally { - em.close(); + if (em != null) { + em.close(); + } } } public static void deleteBlacklistEntry(long id) { - DatabaseManager dbManager = FredBoat.getDbManager(); - if (dbManager == null || !dbManager.isAvailable()) { - throw new DatabaseNotReadyException("The database is not available currently. Please try again later."); - } - - EntityManager em = dbManager.getEntityManager(); + EntityManager em = null; try { + em = FredBoat.getMainDbConnection().getEntityManager(); em.getTransaction().begin(); BlacklistEntry ble = em.find(BlacklistEntry.class, id); em.getTransaction().commit(); @@ -93,8 +83,13 @@ public static void deleteBlacklistEntry(long id) { em.remove(ble); em.getTransaction().commit(); } + } catch (DatabaseException | PersistenceException e) { + log.error("Db blew up while deleting black list entry for id {}", id, e); + throw new DatabaseNotReadyException("The database is not available currently. Please try again later."); } finally { - em.close(); + if (em != null) { + em.close(); + } } } } diff --git a/FredBoat/src/main/java/fredboat/db/entity/SearchResult.java b/FredBoat/src/main/java/fredboat/db/entity/cache/SearchResult.java similarity index 91% rename from FredBoat/src/main/java/fredboat/db/entity/SearchResult.java rename to FredBoat/src/main/java/fredboat/db/entity/cache/SearchResult.java index 355010a65..29921d257 100644 --- a/FredBoat/src/main/java/fredboat/db/entity/SearchResult.java +++ b/FredBoat/src/main/java/fredboat/db/entity/cache/SearchResult.java @@ -23,7 +23,7 @@ * SOFTWARE. */ -package fredboat.db.entity; +package fredboat.db.entity.cache; import com.sedmelluq.discord.lavaplayer.player.AudioPlayerManager; import com.sedmelluq.discord.lavaplayer.tools.io.MessageInput; @@ -32,7 +32,6 @@ import com.sedmelluq.discord.lavaplayer.track.AudioTrack; import com.sedmelluq.discord.lavaplayer.track.BasicAudioPlaylist; import fredboat.FredBoat; -import fredboat.db.DatabaseManager; import fredboat.db.DatabaseNotReadyException; import fredboat.util.rest.SearchUtil; import org.apache.commons.lang3.SerializationUtils; @@ -40,16 +39,11 @@ import org.hibernate.annotations.CacheConcurrencyStrategy; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import space.npstr.sqlsauce.DatabaseConnection; +import space.npstr.sqlsauce.DatabaseException; -import javax.persistence.Cacheable; -import javax.persistence.Column; -import javax.persistence.Embeddable; -import javax.persistence.Entity; -import javax.persistence.EntityManager; -import javax.persistence.Id; -import javax.persistence.Lob; -import javax.persistence.PersistenceException; -import javax.persistence.Table; +import javax.annotation.Nullable; +import javax.persistence.*; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; @@ -102,27 +96,31 @@ public SearchResult(AudioPlayerManager playerManager, SearchUtil.SearchProvider * @param provider the search provider that shall be used for this search * @param searchTerm the query to search for * @param maxAgeMillis the maximum age of the cached search result; provide a negative value for eternal cache - * @return the cached search result; may return null for a non-existing or outdated search + * @return the cached search result; may return null for a non-existing or outdated search, or when there is no + * cache database */ + @Nullable public static AudioPlaylist load(AudioPlayerManager playerManager, SearchUtil.SearchProvider provider, String searchTerm, long maxAgeMillis) throws DatabaseNotReadyException { - DatabaseManager dbManager = FredBoat.getDbManager(); - if (dbManager == null || !dbManager.isAvailable()) { - throw new DatabaseNotReadyException(); - } - - EntityManager em = dbManager.getEntityManager(); + EntityManager em = null; SearchResult sr; SearchResultId sId = new SearchResultId(provider, searchTerm); + DatabaseConnection cacheDbConn = FredBoat.getCacheDbConnection(); + if (cacheDbConn == null) { + return null; + } try { + em = cacheDbConn.getEntityManager(); em.getTransaction().begin(); sr = em.find(SearchResult.class, sId); em.getTransaction().commit(); - } catch (PersistenceException e) { + } catch (DatabaseException | PersistenceException e) { log.error("Unexpected error while trying to look up a search result for provider {} and search term {}", provider.name(), searchTerm, e); throw new DatabaseNotReadyException(e); } finally { - em.close(); + if (em != null) { + em.close(); + } } if (sr != null && (maxAgeMillis < 0 || System.currentTimeMillis() < sr.timestamp + maxAgeMillis)) { @@ -135,26 +133,29 @@ public static AudioPlaylist load(AudioPlayerManager playerManager, SearchUtil.Se /** * Persist a search in the database. * - * @return the merged SearchResult object + * @return the merged SearchResult object, or null when there is no cache database */ + @Nullable public SearchResult save() { - DatabaseManager dbManager = FredBoat.getDbManager(); - if (dbManager == null || !dbManager.isAvailable()) { - throw new DatabaseNotReadyException(); + DatabaseConnection cacheDbConn = FredBoat.getCacheDbConnection(); + if (cacheDbConn == null) { + return null; } - - EntityManager em = dbManager.getEntityManager(); + EntityManager em = null; try { + em = cacheDbConn.getEntityManager(); em.getTransaction().begin(); SearchResult managed = em.merge(this); em.getTransaction().commit(); return managed; - } catch (PersistenceException e) { + } catch (DatabaseException | PersistenceException e) { log.error("Unexpected error while saving a search result for provider {} and search term {}", searchResultId.provider, searchResultId.searchTerm, e); throw new DatabaseNotReadyException(e); } finally { - em.close(); + if (em != null) { + em.close(); + } } } diff --git a/FredBoat/src/main/java/fredboat/db/entity/BlacklistEntry.java b/FredBoat/src/main/java/fredboat/db/entity/main/BlacklistEntry.java similarity index 95% rename from FredBoat/src/main/java/fredboat/db/entity/BlacklistEntry.java rename to FredBoat/src/main/java/fredboat/db/entity/main/BlacklistEntry.java index 295fc2f83..a09e61837 100644 --- a/FredBoat/src/main/java/fredboat/db/entity/BlacklistEntry.java +++ b/FredBoat/src/main/java/fredboat/db/entity/main/BlacklistEntry.java @@ -1,4 +1,5 @@ /* + * * MIT License * * Copyright (c) 2017 Frederik Ar. Mikkelsen @@ -22,9 +23,9 @@ * SOFTWARE. */ -package fredboat.db.entity; +package fredboat.db.entity.main; -import org.hibernate.annotations.ColumnDefault; +import fredboat.db.entity.IEntity; import javax.persistence.Column; import javax.persistence.Entity; @@ -42,6 +43,7 @@ public class BlacklistEntry implements IEntity { //id of the user or guild that this blacklist entry belongs to @Id + @Column(name = "id", nullable = false) public long id; //blacklist level that the user or guild is on @@ -55,7 +57,6 @@ public class BlacklistEntry implements IEntity { //when was the ratelimit hit the last time? @Column(name = "rate_limit_timestamp", nullable = false) - @ColumnDefault("0") //tells hibernate ddl how to fill this by default with a zero public long rateLimitReachedTimestamp; //time when the id was blacklisted diff --git a/FredBoat/src/main/java/fredboat/db/entity/GuildConfig.java b/FredBoat/src/main/java/fredboat/db/entity/main/GuildConfig.java similarity index 89% rename from FredBoat/src/main/java/fredboat/db/entity/GuildConfig.java rename to FredBoat/src/main/java/fredboat/db/entity/main/GuildConfig.java index 8c1ec9d2a..3d916f8f8 100644 --- a/FredBoat/src/main/java/fredboat/db/entity/GuildConfig.java +++ b/FredBoat/src/main/java/fredboat/db/entity/main/GuildConfig.java @@ -23,24 +23,19 @@ * */ -package fredboat.db.entity; +package fredboat.db.entity.main; import fredboat.FredBoat; -import fredboat.db.DatabaseManager; import fredboat.db.DatabaseNotReadyException; +import fredboat.db.entity.IEntity; import org.hibernate.annotations.Cache; import org.hibernate.annotations.CacheConcurrencyStrategy; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import space.npstr.sqlsauce.DatabaseException; import javax.annotation.Nullable; -import javax.persistence.Cacheable; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.EntityManager; -import javax.persistence.Id; -import javax.persistence.PersistenceException; -import javax.persistence.Table; +import javax.persistence.*; import java.io.Serializable; import java.util.List; import java.util.Optional; @@ -56,6 +51,7 @@ public class GuildConfig implements IEntity, Serializable { private static final long serialVersionUID = 5055243002380106205L; @Id + @Column(name = "guildid", nullable = false) private String guildId; @Column(name = "track_announce", nullable = false) @@ -161,14 +157,11 @@ public long getGuildId() { @Nullable public static Optional getPrefix(long guildId) { log.debug("loading prefix for guild {}", guildId); - DatabaseManager dbManager = FredBoat.getDbManager(); - if (dbManager == null || !dbManager.isAvailable()) { - throw new DatabaseNotReadyException(); - } //language=JPAQL String query = "SELECT gf.prefix FROM GuildConfig gf WHERE gf.guildId = :guildId"; - EntityManager em = dbManager.getEntityManager(); + EntityManager em = null; try { + em = FredBoat.getMainDbConnection().getEntityManager(); em.getTransaction().begin(); List result = em.createQuery(query, String.class) .setParameter("guildId", Long.toString(guildId)) @@ -179,11 +172,13 @@ public static Optional getPrefix(long guildId) { } else { return Optional.ofNullable(result.get(0)); } - } catch (PersistenceException e) { + } catch (DatabaseException | PersistenceException e) { log.error("Failed to load prefix for guild {}", guildId, e); throw new DatabaseNotReadyException(e); } finally { - em.close(); + if (em != null) { + em.close(); + } } } } diff --git a/FredBoat/src/main/java/fredboat/db/entity/GuildPermissions.java b/FredBoat/src/main/java/fredboat/db/entity/main/GuildPermissions.java similarity index 97% rename from FredBoat/src/main/java/fredboat/db/entity/GuildPermissions.java rename to FredBoat/src/main/java/fredboat/db/entity/main/GuildPermissions.java index 7336db097..fcd91f1d4 100644 --- a/FredBoat/src/main/java/fredboat/db/entity/GuildPermissions.java +++ b/FredBoat/src/main/java/fredboat/db/entity/main/GuildPermissions.java @@ -23,8 +23,9 @@ * */ -package fredboat.db.entity; +package fredboat.db.entity.main; +import fredboat.db.entity.IEntity; import fredboat.perms.PermissionLevel; import org.hibernate.annotations.Cache; import org.hibernate.annotations.CacheConcurrencyStrategy; @@ -49,6 +50,7 @@ public class GuildPermissions implements IEntity, Serializable { // Guild ID @Id + @Column(name = "id") private String id; public GuildPermissions() {} diff --git a/FredBoat/src/main/java/fredboat/db/migrations/cache/V1__InitialSchema.java b/FredBoat/src/main/java/fredboat/db/migrations/cache/V1__InitialSchema.java new file mode 100644 index 000000000..75cd1d33f --- /dev/null +++ b/FredBoat/src/main/java/fredboat/db/migrations/cache/V1__InitialSchema.java @@ -0,0 +1,66 @@ +/* + * + * MIT License + * + * Copyright (c) 2017 Frederik Ar. Mikkelsen + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package fredboat.db.migrations.cache; + +import org.flywaydb.core.api.migration.jdbc.JdbcMigration; + +import java.sql.Connection; +import java.sql.Statement; + +/** + * Created by napster on 23.12.17. + */ +public class V1__InitialSchema implements JdbcMigration { + @Override + public void migrate(Connection connection) throws Exception { + + //SearchResult + String createSearchResultsSql + = "CREATE TABLE IF NOT EXISTS public.search_results " + + "( " + + " provider CHARACTER VARYING(255) COLLATE pg_catalog.\"default\" NOT NULL, " + + " search_term TEXT COLLATE pg_catalog.\"default\" NOT NULL, " + + " search_result OID, " + + " \"timestamp\" BIGINT, " + + " CONSTRAINT search_results_pkey PRIMARY KEY (provider, search_term) " + + ");"; + try (Statement createSearchResults = connection.createStatement()) { + createSearchResults.execute(createSearchResultsSql); + } + + //HStorex (from sqlsauce, requires hstore extension to be enabled) + String createHstorexSql + = "CREATE TABLE IF NOT EXISTS public.hstorex " + + "( " + + " name TEXT COLLATE pg_catalog.\"default\" NOT NULL, " + + " hstorex HSTORE, " + + " CONSTRAINT hstorex_pkey PRIMARY KEY (name) " + + ")"; + try (Statement createHstorex = connection.createStatement()) { + createHstorex.execute(createHstorexSql); + } + } +} diff --git a/FredBoat/src/main/java/fredboat/db/migrations/main/V1__InitialSchema.java b/FredBoat/src/main/java/fredboat/db/migrations/main/V1__InitialSchema.java new file mode 100644 index 000000000..1068c19b4 --- /dev/null +++ b/FredBoat/src/main/java/fredboat/db/migrations/main/V1__InitialSchema.java @@ -0,0 +1,106 @@ +/* + * + * MIT License + * + * Copyright (c) 2017 Frederik Ar. Mikkelsen + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package fredboat.db.migrations.main; + +import org.flywaydb.core.api.migration.jdbc.JdbcMigration; + +import java.sql.Connection; +import java.sql.Statement; + +/** + * Created by napster on 23.12.17. + *

+ * This initializes our schema at the point where we turned off hibernate-auto-ddl + */ +public class V1__InitialSchema implements JdbcMigration { + + @Override + public void migrate(Connection connection) throws Exception { + + //UConfig + //drop UConfig if exists; it was never used anyways, and can be readded later if we actually use it + String dropUConfigSql = "DROP TABLE IF EXISTS public.user_config;"; + try (Statement dropUConfig = connection.createStatement()) { + dropUConfig.execute(dropUConfigSql); + } + + //BlacklistEntry + String createBlacklistSql + = "CREATE TABLE IF NOT EXISTS public.blacklist " + + "( " + + " id BIGINT NOT NULL, " + + " level INTEGER NOT NULL, " + + " rate_limit_reached INTEGER NOT NULL, " + + " rate_limit_timestamp BIGINT NOT NULL, " + + " blacklisted_timestamp BIGINT NOT NULL, " + + " CONSTRAINT blacklist_pkey PRIMARY KEY (id) " + + ");"; + try (Statement createBlacklist = connection.createStatement()) { + createBlacklist.execute(createBlacklistSql); + } + + //GuildConfig + String createGuildConfigSql + = "CREATE TABLE IF NOT EXISTS public.guild_config " + + "( " + + " guildid CHARACTER VARYING(255) COLLATE pg_catalog.\"default\" NOT NULL, " + + " track_announce BOOLEAN NOT NULL, " + + " auto_resume BOOLEAN NOT NULL, " + + " lang CHARACTER VARYING(255) COLLATE pg_catalog.\"default\" NOT NULL, " + + " prefix TEXT COLLATE pg_catalog.\"default\", " + + " CONSTRAINT guild_config_pkey PRIMARY KEY(guildid) " + + ");"; + try (Statement createGuildConfig = connection.createStatement()) { + createGuildConfig.execute(createGuildConfigSql); + } + + //GuildPermissions + String createGuildPermissionsSql + = "CREATE TABLE IF NOT EXISTS public.guild_permissions " + + "( " + + " id CHARACTER VARYING(255) COLLATE pg_catalog.\"default\" NOT NULL, " + + " list_admin TEXT COLLATE pg_catalog.\"default\" NOT NULL, " + + " list_dj TEXT COLLATE pg_catalog.\"default\" NOT NULL, " + + " list_user TEXT COLLATE pg_catalog.\"default\" NOT NULL, " + + " CONSTRAINT guild_permissions_pkey PRIMARY KEY (id) " + + ");"; + try (Statement createGuildPermissions = connection.createStatement()) { + createGuildPermissions.execute(createGuildPermissionsSql); + } + + //HStorex (from sqlsauce, requires hstore extension to be enabled) + String createHstorexSql + = "CREATE TABLE IF NOT EXISTS public.hstorex " + + "( " + + " name TEXT COLLATE pg_catalog.\"default\" NOT NULL, " + + " hstorex HSTORE, " + + " CONSTRAINT hstorex_pkey PRIMARY KEY (name) " + + ")"; + try (Statement createHstorex = connection.createStatement()) { + createHstorex.execute(createHstorexSql); + } + } +} diff --git a/FredBoat/src/main/java/fredboat/event/EventListenerBoat.java b/FredBoat/src/main/java/fredboat/event/EventListenerBoat.java index 8e5b365a2..797f27256 100644 --- a/FredBoat/src/main/java/fredboat/event/EventListenerBoat.java +++ b/FredBoat/src/main/java/fredboat/event/EventListenerBoat.java @@ -60,6 +60,7 @@ import net.dv8tion.jda.core.events.message.priv.PrivateMessageReceivedEvent; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.slf4j.MDC; import java.util.concurrent.TimeUnit; @@ -81,7 +82,17 @@ public EventListenerBoat() { @Override public void onMessageReceived(MessageReceivedEvent event) { + try (// before execution set some variables that can help with finding traces that belong to each other + MDC.MDCCloseable _guild = MDC.putCloseable("guild", event.getGuild() != null ? event.getGuild().getId() : "PRIVATE"); + MDC.MDCCloseable _channel = MDC.putCloseable("channel", event.getChannel().getId()); + MDC.MDCCloseable _invoker = MDC.putCloseable("invoker", event.getAuthor().getId()); + ) { + + doOnMessageReceived(event); + } + } + private void doOnMessageReceived(MessageReceivedEvent event) { if (FeatureFlags.RATE_LIMITER.isActive()) { if (Ratelimiter.getRatelimiter().isBlacklisted(event.getAuthor().getIdLong())) { Metrics.blacklistedMessagesReceived.inc(); @@ -95,7 +106,7 @@ public void onMessageReceived(MessageReceivedEvent event) { } if (event.getAuthor().equals(event.getJDA().getSelfUser())) { - log.info(event.getGuild().getName() + " \t " + event.getAuthor().getName() + " \t " + event.getMessage().getRawContent()); + log.info(event.getMessage().getRawContent()); return; } @@ -116,7 +127,7 @@ public void onMessageReceived(MessageReceivedEvent event) { if (context == null) { return; } - log.info(event.getGuild().getName() + " \t " + event.getAuthor().getName() + " \t " + event.getMessage().getRawContent()); + log.info(event.getMessage().getRawContent()); //ignore all commands in channels where we can't write, except for the help command if (!channel.canTalk() && !(context.command instanceof HelpCommand)) { diff --git a/FredBoat/src/main/java/fredboat/event/EventLogger.java b/FredBoat/src/main/java/fredboat/event/EventLogger.java index 410bf6167..44ab3bb81 100644 --- a/FredBoat/src/main/java/fredboat/event/EventLogger.java +++ b/FredBoat/src/main/java/fredboat/event/EventLogger.java @@ -25,18 +25,15 @@ package fredboat.event; +import fredboat.Config; import fredboat.FredBoat; import fredboat.messaging.CentralMessaging; import fredboat.util.Emojis; import fredboat.util.TextUtils; -import net.dv8tion.jda.core.MessageBuilder; +import net.dv8tion.jda.core.EmbedBuilder; import net.dv8tion.jda.core.entities.Message; -import net.dv8tion.jda.core.entities.MessageEmbed; -import net.dv8tion.jda.core.events.DisconnectEvent; -import net.dv8tion.jda.core.events.ReadyEvent; -import net.dv8tion.jda.core.events.ReconnectedEvent; -import net.dv8tion.jda.core.events.ResumedEvent; -import net.dv8tion.jda.core.events.ShutdownEvent; +import net.dv8tion.jda.core.entities.User; +import net.dv8tion.jda.core.events.*; import net.dv8tion.jda.core.events.guild.GuildJoinEvent; import net.dv8tion.jda.core.events.guild.GuildLeaveEvent; import net.dv8tion.jda.core.hooks.ListenerAdapter; @@ -45,19 +42,15 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import javax.annotation.Nonnull; import javax.annotation.Nullable; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; import java.util.Objects; import java.util.Queue; -import java.util.concurrent.ConcurrentLinkedQueue; -import java.util.concurrent.CopyOnWriteArrayList; -import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.TimeUnit; +import java.util.concurrent.*; import java.util.concurrent.atomic.AtomicInteger; -import java.util.stream.Collectors; /** * This overengineered class logs some events via a webhook into Discord. @@ -71,53 +64,57 @@ public class EventLogger extends ListenerAdapter { public static final Logger log = LoggerFactory.getLogger(EventLogger.class); - private final static int MAX_MESSAGE_QUEUE_SIZE = 30; - private final ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor( runnable -> new Thread(runnable, "eventlogger")); @Nullable - private WebhookClient eventLoggerWebhook; + private WebhookClient eventLogWebhook; + @Nullable + private WebhookClient guildStatsWebhook; //saves some messages, so that in case we run into occasional connection issues we dont just drop them due to the webhook timing out - private final Queue toBeSent = new ConcurrentLinkedQueue<>(); + private final Queue toBeSentEventLog = new ConcurrentLinkedQueue<>(); + private final Queue toBeSentGuildStats = new ConcurrentLinkedQueue<>(); private final List statusStats = new CopyOnWriteArrayList<>(); private final AtomicInteger guildsJoinedEvents = new AtomicInteger(0); private final AtomicInteger guildsLeftEvents = new AtomicInteger(0); - public EventLogger(long id, String token) { - this(new WebhookClientBuilder(id, token).build()); + public EventLogger() { + this(new WebhookClientBuilder(Config.CONFIG.getEventLogWebhook()).build(), + new WebhookClientBuilder(Config.CONFIG.getGuildStatsWebhook()).build()); } - // this relies on https://github.com/DV8FromTheWorld/JDA/pull/530 being merged into master -// public EventLogger(String eventLogWebhookUrl) { -// this(new WebhookClientBuilder(eventLogWebhookUrl).build()); -// } - @Override public void onReady(ReadyEvent event) { - statusStats.add(new ShardStatusEvent(event.getJDA().getShardInfo().getShardId(), ShardStatusEvent.StatusEvent.READY)); + statusStats.add(new ShardStatusEvent(event.getJDA().getShardInfo().getShardId(), + ShardStatusEvent.StatusEvent.READY, "")); } @Override public void onResume(ResumedEvent event) { - statusStats.add(new ShardStatusEvent(event.getJDA().getShardInfo().getShardId(), ShardStatusEvent.StatusEvent.RESUME)); + statusStats.add(new ShardStatusEvent(event.getJDA().getShardInfo().getShardId(), + ShardStatusEvent.StatusEvent.RESUME, "")); } @Override public void onReconnect(ReconnectedEvent event) { - statusStats.add(new ShardStatusEvent(event.getJDA().getShardInfo().getShardId(), ShardStatusEvent.StatusEvent.RECONNECT)); + statusStats.add(new ShardStatusEvent(event.getJDA().getShardInfo().getShardId(), + ShardStatusEvent.StatusEvent.RECONNECT, "")); } @Override public void onDisconnect(DisconnectEvent event) { - statusStats.add(new ShardStatusEvent(event.getJDA().getShardInfo().getShardId(), ShardStatusEvent.StatusEvent.DISCONNECT)); + String closeCodeStr = "close code " + (event.getCloseCode() == null ? "null" : event.getCloseCode().getCode()); + statusStats.add(new ShardStatusEvent(event.getJDA().getShardInfo().getShardId(), + ShardStatusEvent.StatusEvent.DISCONNECT, "with " + closeCodeStr)); } @Override public void onShutdown(ShutdownEvent event) { - statusStats.add(new ShardStatusEvent(event.getJDA().getShardInfo().getShardId(), ShardStatusEvent.StatusEvent.SHUTDOWN)); + String closeCodeStr = "close code " + (event.getCloseCode() == null ? "null" : event.getCloseCode().getCode()); + statusStats.add(new ShardStatusEvent(event.getJDA().getShardInfo().getShardId(), + ShardStatusEvent.StatusEvent.SHUTDOWN, "with " + closeCodeStr)); } @Override @@ -140,20 +137,26 @@ public void onGuildLeave(GuildLeaveEvent event) { message = Emojis.DOOR + "Exiting with unknown code."; } log.info(message); - if (eventLoggerWebhook != null) { - eventLoggerWebhook.send(message); + Future elw = null; + Future gsw = null; + if (eventLogWebhook != null) elw = eventLogWebhook.send(message); + if (guildStatsWebhook != null) gsw = guildStatsWebhook.send(message); + try { + if (elw != null) elw.get(); + if (gsw != null) gsw.get(); + } catch (ExecutionException | InterruptedException ignored) { } }; //actual constructor - private EventLogger(WebhookClient eventLoggerWebhook) { + private EventLogger(@Nonnull WebhookClient eventLoggerWebhook, @Nonnull WebhookClient guildStatsWebhook) { Runtime.getRuntime().addShutdownHook(new Thread(ON_SHUTDOWN, EventLogger.class.getSimpleName() + " shutdownhook")); - //test the provided webhook before assigning it, otherwise it will spam our logs with exceptions + //test the provided webhooks before assigning them, otherwise they will spam our logs with exceptions WebhookClient workingWebhook = null; if (eventLoggerWebhook.getIdLong() > 0) { //id is 0 when there is no webhookid configured in the config; skip this in that case try { - eventLoggerWebhook.send(Emojis.PENCIL + "Eventlogger started.") + eventLoggerWebhook.send(Emojis.PENCIL + "Event logger started.") .get(); workingWebhook = eventLoggerWebhook; //webhook test was successful; FIXME occasionally this might fail during the start due to connection issues, while the provided values are actually valid } catch (Exception e) { @@ -163,39 +166,70 @@ private EventLogger(WebhookClient eventLoggerWebhook) { } else { eventLoggerWebhook.close(); } + this.eventLogWebhook = workingWebhook; + + if (eventLogWebhook != null) { + scheduler.scheduleAtFixedRate(() -> { + try { + sendEventLogs(); + } catch (Exception e) { + log.error("Failed to send shard status summary to event log webhook", e); + } + }, 0, Math.max(Config.CONFIG.getEventLogInterval(), 1), TimeUnit.MINUTES); + } - this.eventLoggerWebhook = workingWebhook; - - scheduler.scheduleAtFixedRate(() -> { - try { - sendShardStatusSummary(); - } catch (Exception e) { - log.error("Failed to send shard status summary to event log webhook", e); - } - }, 0, 1, TimeUnit.MINUTES); - - scheduler.scheduleAtFixedRate(() -> { + workingWebhook = null; + if (guildStatsWebhook.getIdLong() > 0) { //id is 0 when there is no webhookid configured in the config; skip this in that case try { - sendGuildsSummary(); + guildStatsWebhook.send(Emojis.PENCIL + "Guild stats logger started.") + .get(); + workingWebhook = guildStatsWebhook; //webhook test was successful; FIXME occasionally this might fail during the start due to connection issues, while the provided values are actually valid } catch (Exception e) { - log.error("Failed to send guilds summary to event log webhook", e); + log.error("Failed to create guild stats webhook. Guild stats will not be available. Doublecheck your configuration values."); + guildStatsWebhook.close(); } - }, 0, 1, TimeUnit.HOURS); + } else { + guildStatsWebhook.close(); + } + this.guildStatsWebhook = workingWebhook; + + int interval = Math.max(Config.CONFIG.getGuildStatsInterval(), 1); + if (this.guildStatsWebhook != null) { + scheduler.scheduleAtFixedRate(() -> { + try { + sendGuildStats(); + } catch (Exception e) { + log.error("Failed to send guilds summary to guild stats webhook", e); + } + }, interval, interval, TimeUnit.MINUTES); + } } - private void sendGuildsSummary() { - MessageEmbed embed = CentralMessaging.getColoredEmbedBuilder() + private void sendGuildStats() { + if (guildStatsWebhook == null) { + return; + } + + EmbedBuilder eb = CentralMessaging.getColoredEmbedBuilder() .setTimestamp(LocalDateTime.now()) .setTitle("Joins and Leaves since the last update") .addField("Guilds joined", Integer.toString(guildsJoinedEvents.getAndSet(0)), true) - .addField("Guilds left", Integer.toString(guildsLeftEvents.getAndSet(0)), true) - .build(); + .addField("Guilds left", Integer.toString(guildsLeftEvents.getAndSet(0)), true); + + if (!FredBoat.getShards().isEmpty()) { + FredBoat anyShard = FredBoat.getShards().get(0); + User self = anyShard.getJda().getSelfUser(); + eb.setFooter(self.getName(), self.getEffectiveAvatarUrl()); + } - addMessageToWebhookQueue(CentralMessaging.getClearThreadLocalMessageBuilder().setEmbed(embed).build()); - drainMessageQueue(); + toBeSentGuildStats.add(CentralMessaging.from(eb.build())); + drainMessageQueue(toBeSentGuildStats, guildStatsWebhook); } - private void sendShardStatusSummary() { + private void sendEventLogs() { + if (eventLogWebhook == null) { + return; + } List events = new ArrayList<>(statusStats); statusStats.removeAll(events); @@ -203,112 +237,49 @@ private void sendShardStatusSummary() { return;//nothing to report } - //~35 lines fit into a 2k char message, if we can get away with a max of 5 messages, post those, otherwise post a summary - if (events.size() <= 35 * 5) { - List sublist = new ArrayList<>(); - for (int i = 0; i < events.size(); i++) { - sublist.add(events.get(i)); - if (i != 0 && (i % 35 == 0 || i == events.size() - 1)) { - addMessageToWebhookQueue(CentralMessaging.getClearThreadLocalMessageBuilder() - .appendCodeBlock(String.join("\n", sublist.stream().map(ShardStatusEvent::toString).collect(Collectors.toList())), - "diff") - .build()); - sublist.clear(); - } - } - drainMessageQueue(); - return; - } - - //too many events in a short time. sum them up - List readied = new ArrayList<>(); - List resumed = new ArrayList<>(); - List reconnected = new ArrayList<>(); - List disconnected = new ArrayList<>(); - List shutdown = new ArrayList<>(); - + //split into messages of acceptable size (2k chars max) + StringBuilder msg = new StringBuilder(); for (ShardStatusEvent event : events) { - switch (event.event) { - case READY: - readied.add(event.shardId); - break; - case RESUME: - resumed.add(event.shardId); - break; - case RECONNECT: - reconnected.add(event.shardId); - break; - case DISCONNECT: - disconnected.add(event.shardId); - break; - case SHUTDOWN: - shutdown.add(event.shardId); - break; - default: - log.error("Unexpected status event type: {}", event.event.name()); + String eventStr = event.toString(); + if (msg.length() + eventStr.length() > 1900) { + toBeSentEventLog.add(CentralMessaging.getClearThreadLocalMessageBuilder() + .appendCodeBlock(msg.toString(), "diff").build()); + msg = new StringBuilder(); } + msg.append("\n").append(eventStr); } - - String output = TextUtils.getTimeInCentralEurope() + " **Shard Events Summary:**\n"; - if (!readied.isEmpty()) { - String shards = String.join(", ", readied.stream().map(i -> Integer.toString(i)).collect(Collectors.toList())); - output += TextUtils.asCodeBlock("+ " + readied.size() + " shard ready events:\n+ " + shards, "diff") + "\n"; - } - if (!resumed.isEmpty()) { - String shards = String.join(", ", resumed.stream().map(i -> Integer.toString(i)).collect(Collectors.toList())); - output += TextUtils.asCodeBlock("+ " + resumed.size() + " shard resume events:\n+ " + shards, "diff") + "\n"; - } - if (!reconnected.isEmpty()) { - String shards = String.join(", ", reconnected.stream().map(i -> Integer.toString(i)).collect(Collectors.toList())); - output += TextUtils.asCodeBlock("+" + reconnected.size() + " shard reconnect events:\n+ " + shards, "diff") + "\n"; - } - if (!disconnected.isEmpty()) { - String shards = String.join(", ", disconnected.stream().map(i -> Integer.toString(i)).collect(Collectors.toList())); - output += TextUtils.asCodeBlock("-" + disconnected.size() + " shard disconnect events:\n- " + shards, "diff") + "\n"; + if (msg.length() > 0) {//any leftovers? + toBeSentEventLog.add(CentralMessaging.getClearThreadLocalMessageBuilder() + .appendCodeBlock(msg.toString(), "diff").build()); } - if (!shutdown.isEmpty()) { - String shards = String.join(", ", shutdown.stream().map(i -> Integer.toString(i)).collect(Collectors.toList())); - output += TextUtils.asCodeBlock("- " + shutdown.size() + " shard shutdown events:\n- " + shards, "diff") + "\n"; - } - - CentralMessaging.getClearThreadLocalMessageBuilder() - .append(output) - .buildAll(MessageBuilder.SplitPolicy.NEWLINE) - .forEach(this::addMessageToWebhookQueue); - drainMessageQueue(); + drainMessageQueue(toBeSentEventLog, eventLogWebhook); } - private synchronized void drainMessageQueue() { - if (eventLoggerWebhook == null) { - return; - } + private static void drainMessageQueue(@Nonnull Queue queue, @Nonnull WebhookClient webhook) { try { - while (!toBeSent.isEmpty()) { - Message message = toBeSent.peek(); - eventLoggerWebhook.send(message).get(); - toBeSent.poll(); + while (!queue.isEmpty()) { + Message message = queue.peek(); + webhook.send(message).get(); + queue.poll(); } } catch (Exception e) { - log.warn("Event log webhook failed to send a message. Will try again later.", e); - } - } - - private void addMessageToWebhookQueue(Message message) { - while (toBeSent.size() > MAX_MESSAGE_QUEUE_SIZE) { - toBeSent.poll(); //drop messages above max size + log.warn("Webhook failed to send a message. Will try again next time.", e); } - toBeSent.add(message); } private static class ShardStatusEvent { final int shardId; + @Nonnull final StatusEvent event; + @Nonnull + final String additionalInfo; final long timestamp; - private ShardStatusEvent(int shardId, StatusEvent event) { + private ShardStatusEvent(int shardId, @Nonnull StatusEvent event, @Nonnull String additionalInfo) { this.shardId = shardId; this.event = event; + this.additionalInfo = additionalInfo; this.timestamp = System.currentTimeMillis(); } @@ -330,8 +301,9 @@ enum StatusEvent { @Override public String toString() { - return String.format("%s [%s] Shard %s %s", //NOTE when changing this, make sure the max message size is still respected in those place using this method - event.diff, TextUtils.asTimeInCentralEurope(timestamp), TextUtils.forceNDigits(shardId, 3), event.str); + return String.format("%s [%s] Shard %s %s %s", + event.diff, TextUtils.asTimeInCentralEurope(timestamp), + TextUtils.forceNDigits(shardId, 3), event.str, additionalInfo); } @Override diff --git a/FredBoat/src/main/java/fredboat/feature/I18n.java b/FredBoat/src/main/java/fredboat/feature/I18n.java index 07d4bc5b5..88ec78f9b 100644 --- a/FredBoat/src/main/java/fredboat/feature/I18n.java +++ b/FredBoat/src/main/java/fredboat/feature/I18n.java @@ -28,7 +28,7 @@ import fredboat.db.DatabaseNotReadyException; import fredboat.db.EntityReader; import fredboat.db.EntityWriter; -import fredboat.db.entity.GuildConfig; +import fredboat.db.entity.main.GuildConfig; import net.dv8tion.jda.core.entities.Guild; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -50,6 +50,7 @@ public class I18n { public static void start() { LANGS.put("en_US", DEFAULT); LANGS.put("af_ZA", new FredBoatLocale(new Locale("af", "ZA"), "af_ZA", "Afrikaans")); + LANGS.put("ar_SA", new FredBoatLocale(new Locale("ar", "SA"), "ar_SA", "ﺔﻴﺐﺮﻌﻠﺍ")); LANGS.put("bg_BG", new FredBoatLocale(new Locale("bg", "BG"), "bg_BG", "български език")); LANGS.put("ca_ES", new FredBoatLocale(new Locale("ca", "ES"), "ca_ES", "Catalan")); LANGS.put("zh_CN", new FredBoatLocale(new Locale("zh", "CN"), "zh_CN", "简体中文")); @@ -58,11 +59,15 @@ public static void start() { LANGS.put("hr_HR", new FredBoatLocale(new Locale("hr", "HR"), "hr_HR", "Hrvatski")); LANGS.put("da_DK", new FredBoatLocale(new Locale("da", "DK"), "da_DK", "Dansk")); LANGS.put("nl_NL", new FredBoatLocale(new Locale("nl", "NL"), "nl_NL", "Nederlands")); + LANGS.put("fi_FI", new FredBoatLocale(new Locale("fi", "FI"), "fi_FI", "suomi")); LANGS.put("fr_FR", new FredBoatLocale(new Locale("fr", "FR"), "fr_FR", "Français")); LANGS.put("de_DE", new FredBoatLocale(new Locale("de", "DE"), "de_DE", "Deutsch")); + LANGS.put("el_GR", new FredBoatLocale(new Locale("el", "GR"), "el_GR", "ελληνικά")); LANGS.put("he_IL", new FredBoatLocale(new Locale("he", "IL"), "he_IL", "עברית")); + LANGS.put("hu_HU", new FredBoatLocale(new Locale("hu", "HU"), "hu_HU", "magyar")); LANGS.put("id_ID", new FredBoatLocale(new Locale("id", "ID"), "id_ID", "Bahasa Indonesia")); LANGS.put("it_IT", new FredBoatLocale(new Locale("it", "IT"), "it_IT", "Italiano")); + LANGS.put("ja_JP", new FredBoatLocale(new Locale("ja", "JP"), "ja_JP", "日本語")); LANGS.put("ko_KR", new FredBoatLocale(new Locale("ko", "KR"), "ko_KR", "한국어")); LANGS.put("pl_PL", new FredBoatLocale(new Locale("pl", "PL"), "pl_PL", "Polski")); LANGS.put("pt_BR", new FredBoatLocale(new Locale("pt", "BR"), "pt_BR", "Português (Brazil)")); @@ -71,6 +76,7 @@ public static void start() { LANGS.put("ru_RU", new FredBoatLocale(new Locale("ru", "RU"), "ru_RU", "Русский")); LANGS.put("es_ES", new FredBoatLocale(new Locale("es", "ES"), "es_ES", "Español")); LANGS.put("sv_SE", new FredBoatLocale(new Locale("sv", "SE"), "sv_SE", "Svenska")); + LANGS.put("th_TH", new FredBoatLocale(new Locale("th", "TH"), "th_TH", "ไทย")); LANGS.put("tr_TR", new FredBoatLocale(new Locale("tr", "TR"), "tr_TR", "Türkçe")); LANGS.put("vi_VN", new FredBoatLocale(new Locale("vi", "VN"), "vi_VN", "Tiếng Việt")); LANGS.put("cy_GB", new FredBoatLocale(new Locale("cy", "GB"), "cy_GB", "Cymraeg")); diff --git a/FredBoat/src/main/java/fredboat/feature/metrics/collectors/ThreadPoolCollector.java b/FredBoat/src/main/java/fredboat/feature/metrics/collectors/ThreadPoolCollector.java index 8ed9199dc..ca6b2691c 100644 --- a/FredBoat/src/main/java/fredboat/feature/metrics/collectors/ThreadPoolCollector.java +++ b/FredBoat/src/main/java/fredboat/feature/metrics/collectors/ThreadPoolCollector.java @@ -87,6 +87,10 @@ public List collect() { "Amount of active threads in a thread pool", labelNames); mfs.add(activeThreads); + GaugeMetricFamily queueSize = new GaugeMetricFamily("fredboat_threadpool_queue_size_current", + "Size of queue of a thread pool (including scheduled tasks)", labelNames); + mfs.add(queueSize); + CounterMetricFamily completedTasks = new CounterMetricFamily("fredboat_threadpool_completed_tasks_total", "Total completed tasks by a thread pool", labelNames); mfs.add(completedTasks); @@ -97,6 +101,7 @@ public List collect() { List labels = Collections.singletonList(poolName); activeThreads.addMetric(labels, pool.getActiveCount()); + queueSize.addMetric(labels, pool.getQueue().size()); completedTasks.addMetric(labels, pool.getCompletedTaskCount()); //guaranteed to always increase, ergo good fit for a counter } diff --git a/FredBoat/src/main/java/fredboat/messaging/CentralMessaging.java b/FredBoat/src/main/java/fredboat/messaging/CentralMessaging.java index c71a91b9c..73691e534 100644 --- a/FredBoat/src/main/java/fredboat/messaging/CentralMessaging.java +++ b/FredBoat/src/main/java/fredboat/messaging/CentralMessaging.java @@ -57,20 +57,24 @@ /** * Created by napster on 10.09.17. *

- * Everything related to sending things out from FredBoat + * Everything related to sending RestActions from FredBoat */ +@SuppressWarnings("UnusedReturnValue") public class CentralMessaging { + @Nonnull private static final Logger log = LoggerFactory.getLogger(CentralMessaging.class); //this is needed for when we absolutely don't care about a rest action failing (use this only after good consideration!) // because if we pass null for a failure handler to JDA it uses a default handler that results in a warning/error level log + @Nonnull public static final Consumer NOOP_EXCEPTION_HANDLER = __ -> { }; //use this to schedule rest actions whenever queueAfter() or similar JDA methods would be used // this makes it way easier to track stats + handle failures of such delayed RestActions // instead of implementing a ton of overloaded methods in this class + @Nonnull public static final ScheduledExecutorService restService = Executors.newScheduledThreadPool(10, runnable -> new Thread(runnable, "central-messaging-scheduler")); @@ -83,19 +87,24 @@ public class CentralMessaging { // a per-thread scope // this makes sense since the vast majority of message processing in FredBoat is happening in the main JDA threads + @Nonnull private static ThreadLocal threadLocalMessageBuilder = ThreadLocal.withInitial(MessageBuilder::new); + @Nonnull private static ThreadLocal threadLocalEmbedBuilder = ThreadLocal.withInitial(EmbedBuilder::new); + @Nonnull public static MessageBuilder getClearThreadLocalMessageBuilder() { return threadLocalMessageBuilder.get().clear(); } //presets fredboat color on a clear embed + @Nonnull public static EmbedBuilder getColoredEmbedBuilder() { return getClearThreadLocalEmbedBuilder() .setColor(BotConstants.FREDBOAT_COLOR); } + @Nonnull public static EmbedBuilder getClearThreadLocalEmbedBuilder() { return threadLocalEmbedBuilder.get() .clearFields() @@ -110,11 +119,13 @@ public static EmbedBuilder getClearThreadLocalEmbedBuilder() { } //May not be an empty string, as MessageBuilder#build() will throw an exception - public static Message from(String string) { + @Nonnull + public static Message from(@Nonnull String string) { return getClearThreadLocalMessageBuilder().append(string).build(); } - public static Message from(MessageEmbed embed) { + @Nonnull + public static Message from(@Nonnull MessageEmbed embed) { return getClearThreadLocalMessageBuilder().setEmbed(embed).build(); } @@ -133,6 +144,7 @@ public static Message from(MessageEmbed embed) { * @return Future that can be waited on in case the code requires completion. Similar to JDA's RestAction#complete, * avoid usage where not absolutely needed. */ + @Nonnull public static MessageFuture sendMessage(@Nonnull MessageChannel channel, @Nonnull Message message, @Nullable Consumer onSuccess, @Nullable Consumer onFail) { return sendMessage0( @@ -144,6 +156,7 @@ public static MessageFuture sendMessage(@Nonnull MessageChannel channel, @Nonnul } // Message + @Nonnull public static MessageFuture sendMessage(@Nonnull MessageChannel channel, @Nonnull Message message, @Nullable Consumer onSuccess) { return sendMessage0( @@ -155,6 +168,7 @@ public static MessageFuture sendMessage(@Nonnull MessageChannel channel, @Nonnul } // Message + @Nonnull public static MessageFuture sendMessage(@Nonnull MessageChannel channel, @Nonnull Message message) { return sendMessage0( channel, @@ -165,6 +179,7 @@ public static MessageFuture sendMessage(@Nonnull MessageChannel channel, @Nonnul } // Embed + @Nonnull public static MessageFuture sendMessage(@Nonnull MessageChannel channel, @Nonnull MessageEmbed embed, @Nullable Consumer onSuccess, @Nullable Consumer onFail) { return sendMessage0( @@ -176,6 +191,7 @@ public static MessageFuture sendMessage(@Nonnull MessageChannel channel, @Nonnul } // Embed + @Nonnull public static MessageFuture sendMessage(@Nonnull MessageChannel channel, @Nonnull MessageEmbed embed, @Nullable Consumer onSuccess) { return sendMessage0( @@ -187,6 +203,7 @@ public static MessageFuture sendMessage(@Nonnull MessageChannel channel, @Nonnul } // Embed + @Nonnull public static MessageFuture sendMessage(@Nonnull MessageChannel channel, @Nonnull MessageEmbed embed) { return sendMessage0( channel, @@ -197,6 +214,7 @@ public static MessageFuture sendMessage(@Nonnull MessageChannel channel, @Nonnul } // String + @Nonnull public static MessageFuture sendMessage(@Nonnull MessageChannel channel, @Nonnull String content, @Nullable Consumer onSuccess, @Nullable Consumer onFail) { return sendMessage0( @@ -208,6 +226,7 @@ public static MessageFuture sendMessage(@Nonnull MessageChannel channel, @Nonnul } // String + @Nonnull public static MessageFuture sendMessage(@Nonnull MessageChannel channel, @Nonnull String content, @Nullable Consumer onSuccess) { return sendMessage0( @@ -219,6 +238,7 @@ public static MessageFuture sendMessage(@Nonnull MessageChannel channel, @Nonnul } // String + @Nonnull public static MessageFuture sendMessage(@Nonnull MessageChannel channel, @Nonnull String content) { return sendMessage0( channel, @@ -243,6 +263,7 @@ public static MessageFuture sendMessage(@Nonnull MessageChannel channel, @Nonnul * @return Future that can be waited on in case the code requires completion. Similar to JDA's RestAction#complete, * avoid usage where not absolutely needed. */ + @Nonnull public static MessageFuture sendFile(@Nonnull MessageChannel channel, @Nonnull File file, @Nullable Message message, @Nullable Consumer onSuccess, @Nullable Consumer onFail) { return sendFile0( @@ -254,6 +275,7 @@ public static MessageFuture sendFile(@Nonnull MessageChannel channel, @Nonnull F ); } + @Nonnull public static MessageFuture sendFile(@Nonnull MessageChannel channel, @Nonnull File file, @Nullable Message message, @Nullable Consumer onSuccess) { return sendFile0( @@ -265,6 +287,7 @@ public static MessageFuture sendFile(@Nonnull MessageChannel channel, @Nonnull F ); } + @Nonnull public static MessageFuture sendFile(@Nonnull MessageChannel channel, @Nonnull File file, @Nullable Message message) { return sendFile0( channel, @@ -275,6 +298,7 @@ public static MessageFuture sendFile(@Nonnull MessageChannel channel, @Nonnull F ); } + @Nonnull public static MessageFuture sendFile(@Nonnull MessageChannel channel, @Nonnull File file, @Nullable Consumer onSuccess, @Nullable Consumer onFail) { return sendFile0( @@ -286,6 +310,7 @@ public static MessageFuture sendFile(@Nonnull MessageChannel channel, @Nonnull F ); } + @Nonnull public static MessageFuture sendFile(@Nonnull MessageChannel channel, @Nonnull File file, @Nullable Consumer onSuccess) { return sendFile0( @@ -297,6 +322,7 @@ public static MessageFuture sendFile(@Nonnull MessageChannel channel, @Nonnull F ); } + @Nonnull public static MessageFuture sendFile(@Nonnull MessageChannel channel, @Nonnull File file) { return sendFile0( channel, @@ -322,6 +348,7 @@ public static MessageFuture sendFile(@Nonnull MessageChannel channel, @Nonnull F * @return Future that can be waited on in case the code requires completion. Similar to JDA's RestAction#complete, * avoid usage where not absolutely needed. */ + @Nonnull public static MessageFuture editMessage(@Nonnull Message oldMessage, @Nonnull Message newMessage, @Nullable Consumer onSuccess, @Nullable Consumer onFail) { return editMessage0( @@ -333,6 +360,7 @@ public static MessageFuture editMessage(@Nonnull Message oldMessage, @Nonnull Me ); } + @Nonnull public static MessageFuture editMessage(@Nonnull Message oldMessage, @Nonnull Message newMessage) { return editMessage0( oldMessage.getChannel(), @@ -343,6 +371,7 @@ public static MessageFuture editMessage(@Nonnull Message oldMessage, @Nonnull Me ); } + @Nonnull public static MessageFuture editMessage(@Nonnull Message oldMessage, @Nonnull String newContent) { return editMessage0( oldMessage.getChannel(), @@ -353,7 +382,7 @@ public static MessageFuture editMessage(@Nonnull Message oldMessage, @Nonnull St ); } - + @Nonnull public static MessageFuture editMessage(@Nonnull MessageChannel channel, long oldMessageId, @Nonnull Message newMessage, @Nullable Consumer onSuccess, @Nullable Consumer onFail) { return editMessage0( @@ -365,6 +394,7 @@ public static MessageFuture editMessage(@Nonnull MessageChannel channel, long ol ); } + @Nonnull public static MessageFuture editMessage(@Nonnull MessageChannel channel, long oldMessageId, @Nonnull Message newMessage) { return editMessage0( channel, @@ -375,6 +405,7 @@ public static MessageFuture editMessage(@Nonnull MessageChannel channel, long ol ); } + @Nonnull public static MessageFuture editMessage(@Nonnull MessageChannel channel, long oldMessageId, @Nonnull String newContent) { return editMessage0( channel, @@ -389,7 +420,7 @@ public static MessageFuture editMessage(@Nonnull MessageChannel channel, long ol // Miscellaneous messaging related methods // ******************************************************************************** - public static void sendTyping(MessageChannel channel) { + public static void sendTyping(@Nonnull MessageChannel channel) { try { channel.sendTyping().queue( __ -> Metrics.successfulRestActions.labels("sendTyping").inc(), @@ -459,15 +490,9 @@ public static EmbedBuilder addNpFooter(@Nonnull EmbedBuilder eb, @Nonnull Member // ******************************************************************************** //class internal message sending method + @Nonnull private static MessageFuture sendMessage0(@Nonnull MessageChannel channel, @Nonnull Message message, @Nullable Consumer onSuccess, @Nullable Consumer onFail) { - if (channel == null) { - throw new IllegalArgumentException("Channel is null"); - } - if (message == null) { - throw new IllegalArgumentException("Message is null"); - } - MessageFuture result = new MessageFuture(); Consumer successWrapper = m -> { result.complete(m); @@ -491,7 +516,9 @@ private static MessageFuture sendMessage0(@Nonnull MessageChannel channel, @Nonn try { channel.sendMessage(message).queue(successWrapper, failureWrapper); } catch (InsufficientPermissionException e) { - failureWrapper.accept(e); + if (onFail != null) { + onFail.accept(e); + } if (e.getPermission() == Permission.MESSAGE_EMBED_LINKS) { handleInsufficientPermissionsException(channel, e); } else { @@ -503,14 +530,9 @@ private static MessageFuture sendMessage0(@Nonnull MessageChannel channel, @Nonn } //class internal file sending method + @Nonnull private static MessageFuture sendFile0(@Nonnull MessageChannel channel, @Nonnull File file, @Nullable Message message, @Nullable Consumer onSuccess, @Nullable Consumer onFail) { - if (channel == null) { - throw new IllegalArgumentException("Channel is null"); - } - if (file == null) { - throw new IllegalArgumentException("File is null"); - } MessageFuture result = new MessageFuture(); Consumer successWrapper = m -> { @@ -538,7 +560,9 @@ private static MessageFuture sendFile0(@Nonnull MessageChannel channel, @Nonnull // this is scheduled to be fixed through JDA's message-rw branch channel.sendFile(FileUtils.readFileToByteArray(file), file.getName(), message).queue(successWrapper, failureWrapper); } catch (InsufficientPermissionException e) { - failureWrapper.accept(e); + if (onFail != null) { + onFail.accept(e); + } handleInsufficientPermissionsException(channel, e); } catch (IOException e) { log.error("Could not send file {}, it appears to be borked", file.getAbsolutePath(), e); @@ -547,14 +571,9 @@ private static MessageFuture sendFile0(@Nonnull MessageChannel channel, @Nonnull } //class internal editing method + @Nonnull private static MessageFuture editMessage0(@Nonnull MessageChannel channel, long oldMessageId, @Nonnull Message newMessage, @Nullable Consumer onSuccess, @Nullable Consumer onFail) { - if (channel == null) { - throw new IllegalArgumentException("Channel is null"); - } - if (newMessage == null) { - throw new IllegalArgumentException("New message is null"); - } MessageFuture result = new MessageFuture(); Consumer successWrapper = m -> { @@ -580,7 +599,9 @@ private static MessageFuture editMessage0(@Nonnull MessageChannel channel, long try { channel.editMessageById(oldMessageId, newMessage).queue(successWrapper, failureWrapper); } catch (InsufficientPermissionException e) { - failureWrapper.accept(e); + if (onFail != null) { + onFail.accept(e); + } handleInsufficientPermissionsException(channel, e); } return result; @@ -600,7 +621,8 @@ private static void handleInsufficientPermissionsException(@Nonnull MessageChann //handles failed JDA rest actions by logging them with an informational string and optionally ignoring some error response codes - public static Consumer getJdaRestActionFailureHandler(String info, ErrorResponse... ignored) { + @Nonnull + public static Consumer getJdaRestActionFailureHandler(@Nonnull String info, ErrorResponse... ignored) { return t -> { if (t instanceof ErrorResponseException) { ErrorResponseException e = (ErrorResponseException) t; diff --git a/FredBoat/src/main/java/fredboat/messaging/internal/Context.java b/FredBoat/src/main/java/fredboat/messaging/internal/Context.java index e5776c73d..236d4f790 100644 --- a/FredBoat/src/main/java/fredboat/messaging/internal/Context.java +++ b/FredBoat/src/main/java/fredboat/messaging/internal/Context.java @@ -188,7 +188,14 @@ public String i18nFormat(@Nonnull String key, Object... params) { log.warn("Context#i18nFormat() called with empty or null params, this is likely a bug.", new MessagingException("a stack trace to help find the source")); } - return MessageFormat.format(this.i18n(key), params); + try { + return MessageFormat.format(this.i18n(key), params); + } catch (IllegalArgumentException e) { + log.warn("Failed to format key '{}' for language '{}' with following parameters: {}", + key, getI18n().getBaseBundleName(), params, e); + //fall back to default props + return MessageFormat.format(I18n.DEFAULT.getProps().getString(key), params); + } } diff --git a/FredBoat/src/main/java/fredboat/perms/PermsUtil.java b/FredBoat/src/main/java/fredboat/perms/PermsUtil.java index d666c9d45..8b07b3146 100644 --- a/FredBoat/src/main/java/fredboat/perms/PermsUtil.java +++ b/FredBoat/src/main/java/fredboat/perms/PermsUtil.java @@ -28,7 +28,7 @@ import fredboat.Config; import fredboat.commandmeta.abs.CommandContext; import fredboat.db.EntityReader; -import fredboat.db.entity.GuildPermissions; +import fredboat.db.entity.main.GuildPermissions; import fredboat.feature.togglz.FeatureFlags; import fredboat.util.DiscordUtil; import net.dv8tion.jda.core.Permission; diff --git a/FredBoat/src/main/java/fredboat/util/AsciiArtConstant.java b/FredBoat/src/main/java/fredboat/util/AsciiArtConstant.java index 7be3bd351..f79ef11b1 100644 --- a/FredBoat/src/main/java/fredboat/util/AsciiArtConstant.java +++ b/FredBoat/src/main/java/fredboat/util/AsciiArtConstant.java @@ -13,7 +13,7 @@ public final class AsciiArtConstant { "⊂   ノ    ・゜+.", " しーJ   °。+ ´¨)", "         .· ´¸.·´¨) ¸.·*¨)", - "          (¸.·´ (¸.·' ☆ ABRA KADABRA..." + "          (¸.·´ (¸.·' ☆ " ); public static final String EAGLE_OF_LENNY = String.join("\n", diff --git a/FredBoat/src/main/java/fredboat/util/BrainfuckException.java b/FredBoat/src/main/java/fredboat/util/BrainfuckException.java index bb248cc39..016671cff 100644 --- a/FredBoat/src/main/java/fredboat/util/BrainfuckException.java +++ b/FredBoat/src/main/java/fredboat/util/BrainfuckException.java @@ -25,11 +25,12 @@ package fredboat.util; -public class BrainfuckException extends RuntimeException { +import fredboat.commandmeta.MessagingException; + +public class BrainfuckException extends MessagingException { + + private static final long serialVersionUID = -8343893398101119524L; - private BrainfuckException() { - } - public BrainfuckException(String string, Throwable thrwbl) { super(string, thrwbl); } diff --git a/FredBoat/src/main/java/fredboat/util/DiscordUtil.java b/FredBoat/src/main/java/fredboat/util/DiscordUtil.java index 54790c356..1c85e3714 100644 --- a/FredBoat/src/main/java/fredboat/util/DiscordUtil.java +++ b/FredBoat/src/main/java/fredboat/util/DiscordUtil.java @@ -25,6 +25,11 @@ package fredboat.util; +import com.google.common.cache.CacheBuilder; +import com.google.common.cache.CacheLoader; +import com.google.common.cache.LoadingCache; +import fredboat.Config; +import fredboat.FredBoat; import fredboat.commandmeta.abs.CommandContext; import fredboat.feature.I18n; import fredboat.feature.metrics.Metrics; @@ -53,7 +58,8 @@ public class DiscordUtil { private static final Logger log = LoggerFactory.getLogger(DiscordUtil.class); - private static final String USER_AGENT = "FredBoat DiscordBot (https://github.com/Frederikam/FredBoat, 1.0)"; + private static final String USER_AGENT = String.format("DiscordBot (https://github.com/Frederikam/FredBoat, %s)", + AppInfo.getAppInfo().getVersionBuild()); private static volatile DiscordAppInfo selfDiscordAppInfo; //access this object through getApplicationInfo(jda) private static final Object selfDiscordAppInfoLock = new Object(); @@ -132,8 +138,18 @@ public static DiscordAppInfo getApplicationInfo(@Nonnull JDA jda) { return info; } + //token <-> botid @Nonnull - public static String getUserId(@Nonnull String token) { + public static final LoadingCache BOT_ID = CacheBuilder.newBuilder() + .build(CacheLoader.asyncReloading(CacheLoader.from(DiscordUtil::getUserId), FredBoat.executor)); + + + //uses our configured bot token to retrieve our own userid + public static long getBotId() { + return BOT_ID.getUnchecked(Config.CONFIG.getBotToken()); + } + + private static long getUserId(@Nonnull String token) { Http.SimpleRequest request = Http.get(Requester.DISCORD_API_PREFIX + "/users/@me") .auth("Bot " + token) .header("User-agent", USER_AGENT); @@ -153,9 +169,19 @@ public static String getUserId(@Nonnull String token) { } } if (result.isEmpty()) { - throw new RuntimeException("Failed to retrieve my own userId from Discord"); + throw new RuntimeException("Failed to retrieve my own userId from Discord, the result is empty"); } - return result; + + long botId; + try { + botId = Long.parseUnsignedLong(result); + } catch (NumberFormatException e) { + //logging the error and rethrowing a new one, because it might expose information that we dont want users to see + log.error("Failed to retrieve my own userId from Discord", e); + throw new RuntimeException("Failed to retrieve my own userId from Discord, see error log for more information."); + } + + return botId; } // ########## Moderation related helper functions @@ -198,7 +224,7 @@ public DiscordAppInfo(ApplicationInfo applicationInfo) { // when rightclick -> copy Id or mentioning, but a different one, an application id. due to risks of // introducing bugs on the public boat when using this (as happened with the mention prefix) it has been // commented out and shall stay this way as a warning to not use it. Usually the JDA#getSelfUser() method is - // accessible to gain access to our own bot id + // accessible to gain access to our own bot id, otherwise use DiscordUtil.getDefaultBotId() //this.botIdLong = applicationInfo.getIdLong(); //this.botId = applicationInfo.getId(); this.iconId = applicationInfo.getIconId(); diff --git a/FredBoat/src/main/java/fredboat/util/TextUtils.java b/FredBoat/src/main/java/fredboat/util/TextUtils.java index bb897b352..9a0fc0070 100644 --- a/FredBoat/src/main/java/fredboat/util/TextUtils.java +++ b/FredBoat/src/main/java/fredboat/util/TextUtils.java @@ -25,6 +25,9 @@ package fredboat.util; +import com.google.common.base.CharMatcher; +import com.google.common.base.Splitter; +import com.google.common.collect.Streams; import fredboat.Config; import fredboat.commandmeta.MessagingException; import fredboat.messaging.CentralMessaging; @@ -33,6 +36,8 @@ import net.dv8tion.jda.core.MessageBuilder; import net.dv8tion.jda.core.entities.Member; import net.dv8tion.jda.core.entities.Message; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.math.NumberUtils; import org.json.JSONException; import org.slf4j.LoggerFactory; @@ -44,9 +49,14 @@ import java.time.ZoneId; import java.time.format.DateTimeFormatter; import java.util.Arrays; +import java.util.Collection; +import java.util.LinkedHashSet; import java.util.List; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.regex.Matcher; import java.util.regex.Pattern; +import java.util.stream.Collectors; +import java.util.stream.Stream; public class TextUtils { @@ -54,6 +64,18 @@ public class TextUtils { private static final List markdownChars = Arrays.asList('*', '`', '~', '_'); + public static final CharMatcher SPLIT_SELECT_SEPARATOR = + CharMatcher.whitespace().or(CharMatcher.is(',')) + .precomputed(); + + public static final CharMatcher SPLIT_SELECT_ALLOWED = + SPLIT_SELECT_SEPARATOR.or(CharMatcher.inRange('0', '9')) + .precomputed(); + + public static final Splitter COMMA_OR_WHITESPACE = Splitter.on(SPLIT_SELECT_SEPARATOR) + .omitEmptyStrings() // 1,,2 doesn't sound right + .trimResults();// have it nice and trim + public static final DateTimeFormatter TIME_IN_CENTRAL_EUROPE = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss z") .withZone(ZoneId.of("Europe/Copenhagen")); @@ -283,17 +305,48 @@ public static String padWithSpaces(@Nullable String str, int totalLength, boolea } /** - * Helper method to check for string that matches ONLY contain digit(s), comma(s) or space(s). + * Helper method to check for string that matches ONLY a comma-separated string of numeric values. * - * @param arg String of the argument. - * @return True if it matches, false if empty string or not match. + * @param arg the string to test. + * @return whether the string matches */ public static boolean isSplitSelect(@Nonnull String arg) { - String temp = arg.replaceAll(" +", " "); + String cleaned = SPLIT_SELECT_ALLOWED.negate().collapseFrom(arg, ' '); + int numberOfCollapsed = arg.length() - cleaned.length(); + if (numberOfCollapsed >= 5) { + // rationale: prefix will be collapsed to 1 char, won't matter that much + // small typos (1q 2 3 4) will be collapsed in place, won't matter that much + // longer strings will be collapsed, words reduced to 1 char + // when enough changes happen, it's not a split select + return false; + } + AtomicBoolean empty = new AtomicBoolean(true); + boolean allDigits = splitSelectStream(arg) + .peek(__ -> empty.set(false)) + .allMatch(NumberUtils::isDigits); + return !empty.get() && allDigits; + } - return arg.length() > 0 && temp.matches("(\\d*,*\\s*)*"); + /** + * Helper method that decodes a split select string, as identified by {@link #isSplitSelect(String)}. + *

+ * NOTE: an empty string produces an empty Collection. + * + * @param arg the string to decode + * @return the split select + */ + public static Collection getSplitSelect(@Nonnull String arg) { + return splitSelectStream(arg) + .map(Integer::valueOf) + .collect(Collectors.toCollection(LinkedHashSet::new)); + } + + private static Stream splitSelectStream(@Nonnull String arg) { + return Streams.stream(COMMA_OR_WHITESPACE.split(arg)) + .map(SPLIT_SELECT_ALLOWED::retainFrom) + .filter(StringUtils::isNotEmpty); } - + public static String getTimeInCentralEurope() { return asTimeInCentralEurope(System.currentTimeMillis()); } @@ -323,4 +376,11 @@ public static String shorten(@Nonnull String input, int size) { } return shortened.toString(); } + + //put a zero width space between any @ and "here" and "everyone" in the input string + @Nonnull + public static String defuseMentions(@Nonnull String input) { + return input.replaceAll("@here", "@" + ZERO_WIDTH_CHAR + "here") + .replaceAll("@everyone", "@" + ZERO_WIDTH_CHAR + "everyone"); + } } diff --git a/FredBoat/src/main/java/fredboat/util/ratelimit/Blacklist.java b/FredBoat/src/main/java/fredboat/util/ratelimit/Blacklist.java index 812788975..377dbaae0 100644 --- a/FredBoat/src/main/java/fredboat/util/ratelimit/Blacklist.java +++ b/FredBoat/src/main/java/fredboat/util/ratelimit/Blacklist.java @@ -26,7 +26,7 @@ import fredboat.db.EntityReader; import fredboat.db.EntityWriter; -import fredboat.db.entity.BlacklistEntry; +import fredboat.db.entity.main.BlacklistEntry; import fredboat.feature.metrics.Metrics; import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap; diff --git a/FredBoat/src/main/java/fredboat/util/ratelimit/Ratelimiter.java b/FredBoat/src/main/java/fredboat/util/ratelimit/Ratelimiter.java index e65ae8e85..445c623d1 100644 --- a/FredBoat/src/main/java/fredboat/util/ratelimit/Ratelimiter.java +++ b/FredBoat/src/main/java/fredboat/util/ratelimit/Ratelimiter.java @@ -36,11 +36,11 @@ import fredboat.util.DiscordUtil; import fredboat.util.Tuple2; import net.dv8tion.jda.core.JDA; -import org.eclipse.jetty.util.ConcurrentHashSet; import java.util.ArrayList; import java.util.List; import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; /** * Created by napster on 17.04.17. @@ -76,7 +76,7 @@ public static Ratelimiter getRatelimiter() { private Blacklist autoBlacklist = null; private Ratelimiter() { - Set whitelist = new ConcurrentHashSet<>(); + Set whitelist = ConcurrentHashMap.newKeySet(); //it is ok to use the jda of any shard as long as we aren't using it for guild specific stuff JDA jda = FredBoat.getShard(0).getJda(); diff --git a/FredBoat/src/main/java/fredboat/util/rest/SearchUtil.java b/FredBoat/src/main/java/fredboat/util/rest/SearchUtil.java index 2aafd47f0..13fda1298 100644 --- a/FredBoat/src/main/java/fredboat/util/rest/SearchUtil.java +++ b/FredBoat/src/main/java/fredboat/util/rest/SearchUtil.java @@ -37,7 +37,7 @@ import fredboat.Config; import fredboat.FredBoat; import fredboat.db.DatabaseNotReadyException; -import fredboat.db.entity.SearchResult; +import fredboat.db.entity.cache.SearchResult; import fredboat.feature.metrics.Metrics; import fredboat.feature.togglz.FeatureFlags; import org.apache.http.client.config.CookieSpecs; @@ -57,7 +57,7 @@ public class SearchUtil { public static final int MAX_RESULTS = 5; - public static final long DEFAULT_CACHE_MAX_AGE = TimeUnit.HOURS.toMillis(24); //24 hours + public static final long DEFAULT_CACHE_MAX_AGE = TimeUnit.HOURS.toMillis(48); public static final String PUNCTUATION_REGEX = "[.,/#!$%^&*;:{}=\\-_`~()\"\']"; private static final Logger log = LoggerFactory.getLogger(SearchUtil.class); @@ -86,7 +86,7 @@ public static AudioPlaylist searchForTracks(String query, List p /** * @param query The search term - * @param cacheMaxAge Age of acceptable results from cache. See {@link fredboat.db.entity.SearchResult#load} for details. + * @param cacheMaxAge Age of acceptable results from cache. See {@link SearchResult#load} for details. * @param timeoutMillis How long to wait for each lavaplayer search to answer * @param providers Providers that shall be used for the search. They will be used in the order they are provided, the * result of the first successful one will be returned diff --git a/FredBoat/src/main/resources/ehcache_cache.xml b/FredBoat/src/main/resources/ehcache_cache.xml new file mode 100644 index 000000000..b71010032 --- /dev/null +++ b/FredBoat/src/main/resources/ehcache_cache.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/FredBoat/src/main/resources/ehcache.xml b/FredBoat/src/main/resources/ehcache_main.xml similarity index 90% rename from FredBoat/src/main/resources/ehcache.xml rename to FredBoat/src/main/resources/ehcache_main.xml index f9b8a22f8..d8de7cc93 100644 --- a/FredBoat/src/main/resources/ehcache.xml +++ b/FredBoat/src/main/resources/ehcache_main.xml @@ -26,9 +26,9 @@ + monitoring="autodetect" dynamicConfig="true" name="MAIN_CACHEMANAGER"> - + - - - - - - - - - - - true - true - /ehcache.xml - org.hibernate.cache.ehcache.EhCacheRegionFactory - - \ No newline at end of file diff --git a/FredBoat/src/main/resources/lang/README.md b/FredBoat/src/main/resources/lang/README.md index b10533074..edf38103a 100644 --- a/FredBoat/src/main/resources/lang/README.md +++ b/FredBoat/src/main/resources/lang/README.md @@ -1,4 +1,4 @@ -# FredBoat-i13n +# FredBoat-i18n Localization for FredBoat See https://crowdin.com/project/fredboat diff --git a/FredBoat/src/main/resources/lang/af_ZA.properties b/FredBoat/src/main/resources/lang/af_ZA.properties index 7e485a852..33d4b21bb 100644 --- a/FredBoat/src/main/resources/lang/af_ZA.properties +++ b/FredBoat/src/main/resources/lang/af_ZA.properties @@ -183,7 +183,7 @@ ratelimitedGeneralInfo=Jy is koers beperk word\! Asseblief vertraag. ratelimitedSkipCommand=Jy kan meer as een liedjie slaan deur die gebruik van hierdie opdrag\: {0} ratelimitedGuildSlowLoadingPlaylist=Hierdie bediener is nie toegelaat om by te voeg meer speellyste op hierdie oomblik. Asseblief Moenie lang speellyste spam. unblacklisted=Verwyder {0} uit die swartlys. -serverinfoTitle=Inligting oor * *{0} * *\: +serverinfoTitle=Info about {0}\: serverinfoOnlineUsers=Gebruikers aanlyn\: serverinfoTotalUsers=Totale gebruikers\: serverinfoRoles=Rolle\: @@ -193,7 +193,7 @@ serverinfoGuildID=Gilde ID\: serverinfoCreationDate=Skepping datum\: serverinfoOwner=Eienaar\: serverinfoVLv=Verifikasie vlak\: -userinfoTitle=Inligting oor * *{0} * *\: +userinfoTitle=Information about {0}\: userinfoUsername=Gebruikersnaam\: userinfoId=ID\: userinfoNick=Bynaam\: @@ -212,7 +212,11 @@ commandsMaintenance=Onderhoud commandsBotOwner=Bot eienaar commandsMoreHelp=S\u00ea {0} om meer inligting oor ''n spesifieke opdrag te kry. helpUnknownCommand=Onbekende bevel. -helpDM=Documentation can be found at\:\nhttps\://fredboat.com/docs\n\nWant to add FredBoat to your server? If you have Manage Server permissions for your guild, you can invite it here\:\n*This one doesn''t play music*\n\n\nIf you want to add the music bot, you will want to invite this bot\:\n\n\nNeed help or have any ideas for the bot? Perhaps you just want to hang out? Come on over to FredBoat hangout\!\n{0}\n\nYou cannot send this bot commands through DM.\nBot created by Fre_d +helpDocsLocation=Documentation can be found at\: +helpBotInvite=Want to add FredBoat to your server? If you have Manage Server permissions for your guild, you can invite FredBoat\: +helpHangoutInvite=Need help or have any ideas for FredBoat? Perhaps you just want to hang out? Join the FredBoat community\! +helpNoDmCommands=You cannot send FredBoat commands through DMs. +helpCredits=Created by Fre_d and open source contributors helpSent=Dokumentasie is aan jou DMs gestuur\! helpProperUsage=Behoorlike gebruik\: helpCommandOwnerRestricted=Hierdie bevel is beperk tot die eienaar van die bot. diff --git a/FredBoat/src/main/resources/lang/ar_SA.properties b/FredBoat/src/main/resources/lang/ar_SA.properties index cfe6587b8..0151e0d27 100644 --- a/FredBoat/src/main/resources/lang/ar_SA.properties +++ b/FredBoat/src/main/resources/lang/ar_SA.properties @@ -14,7 +14,7 @@ pauseSuccess=\u062a\u0645 \u0625\u064a\u0642\u0627\u0641 \u0644\u0644\u0627\u063 repeatOnSingle=\u0627\u0644\u0645\u0648\u0633\u064a\u0642\u0627\u0631 \u0633\u0648\u0641 \u064a\u0642\u0648\u0645 \u0628\u062a\u0643\u0631\u0627\u0631 \u0627\u0644\u0623\u063a\u0646\u064a\u0629 \u0627\u0644\u062d\u0627\u0644\u064a\u0629. repeatOnAll=\u0627\u0644\u0645\u0648\u0633\u064a\u0642\u0627\u0631 \u0633\u0648\u0641 \u064a\u0642\u0648\u0645 \u0628\u062a\u0643\u0631\u0627\u0631 \u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0627\u0646\u062a\u0638\u0627\u0631. repeatOff=\u0627\u0644\u0644\u0627\u0639\u0628 \u0644\u0646 \u064a\u0643\u0631\u0631 \u0627\u0644\u0623\u063a\u0646\u064a\u0629. -selectSuccess=\u0642\u062f \u062a\u0645 \u0627\u062e\u062a\u064a\u0627\u0631\: * *{1} * * ({2}) \u0623\u063a\u0646\u064a\u0629 * * \#{0} * * +selectSuccess=\u0642\u062f \u062a\u0645 \u0627\u062e\u062a\u064a\u0627\u0631\: **{1}** ({2}) \u0623\u063a\u0646\u064a\u0629 **\#{0} ** selectInterval=\u064a\u062c\u0628 \u0623\u0646 \u064a\u0643\u0648\u0646 \u0631\u0642\u0645 1-{0}. selectSelectionNotGiven=\ \u064a\u062c\u0628 \u0623\u0646 \u062a\u0639\u0637\u0649 \u0645\u062c\u0645\u0648\u0639\u0629 \u0644\u0644\u0627\u062e\u062a\u064a\u0627\u0631 \u0645\u0646\u0647\u0627. shuffleOn=\u062a\u0645 \u062e\u0644\u0637 \u0627\u0644\u0644\u0627\u0639\u0628. @@ -45,7 +45,7 @@ exportPlaylistFail=\u0641\u0634\u0644 \u0641\u064a \u062a\u062d\u0645\u064a\u064 listShowShuffled=\u0639\u0631\u0636 \u062a\u0639\u062f\u064a\u0644\u0627\u064b \u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u062a\u0634\u063a\u064a\u0644. listShowRepeatSingle=\u0625\u0639\u0627\u062f\u0629 \u0627\u0644\u0623\u063a\u0646\u064a\u0629 \u0627\u0644\u062d\u0627\u0644\u064a\u0629. listShowRepeatAll=\u062a\u0643\u0631\u0627\u0631 \u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0627\u0646\u062a\u0638\u0627\u0631 \u0627\u0644\u062d\u0627\u0644\u064a\u0629. -listShowHistory=Showing tracks in history. +listShowHistory=\u0639\u0631\u0636 \u0627\u0644\u0645\u0633\u0627\u0631\u0627\u062a \u0641\u064a \u0627\u0644\u0645\u0634\u063a\u0644. listAddedBy=* *{0} * * \u0625\u0636\u0627\u0641\u062a\u0647\u0627 \u0628\u0648\u0627\u0633\u0637\u0629 * *{1} * * ''[{2}]'' listStreamsOnlySingle=\u0647\u0646\u0627\u0643 * *{0} * * {1} \u064a\u0639\u064a\u0634 \u0641\u064a \u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0627\u0646\u062a\u0638\u0627\u0631. listStreamsOnlyMultiple=\u0648\u0647\u0646\u0627\u0643 * *{0} * * {1} \u064a\u0639\u064a\u0634 \u0641\u064a \u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0627\u0646\u062a\u0638\u0627\u0631. @@ -57,7 +57,7 @@ listAsWellAsLiveStreams=\u060c \u0643\u0630\u0644\u0643 * *{0} * * {1} \u0644\u0 trackSingular=\u0645\u0633\u0627\u0631 trackPlural=\u0627\u0644\u0645\u0633\u0627\u0631\u0627\u062a npNotPlaying=\u0644\u0627 \u062d\u0627\u0644\u064a\u0627 \u062a\u0634\u063a\u064a\u0644 \u0623\u064a \u0634\u064a\u0621. -npNotInHistory=Currently no tracks in history. +npNotInHistory=\u0644\u0627 \u062a\u0648\u062c\u062f \u0627\u064a \u0645\u0633\u0627\u0631\u0627\u062a \u0641\u064a \u0627\u0644\u0633\u062c\u0644. npDescription=\u0627\u0644\u0648\u0635\u0641 npLoadedSoundcloud=[{0}/{1}] \u062a\u062d\u0645\u064a\u0644 \u0645\u0646 \u0633\u0648\u0646\u062f\u0643\u0644\u0648\u062f npLoadedBandcamp={0} \u062a\u062d\u0645\u064a\u0644 \u0645\u0646 Bandcamp @@ -79,7 +79,7 @@ restartSuccess=**{0}** \u062a\u0645 \u0625\u0639\u0627\u062f\u0629 \u0627\u0644\ queueEmpty=\u0627\u0644\u0642\u0627\u0626\u0645\u0629 \u0641\u0627\u0631\u063a\u0629. rewSuccess=\u0625\u0639\u0627\u062f\u0629 \u062a\u0648\u062c\u064a\u0647 **{0}** \u0628 {1}. seekSuccess=\u062a\u0633\u0639\u0649 * *{0} * * \u0625\u0644\u0649 {1}. -seekDeniedLiveTrack=You can't seek a live track. +seekDeniedLiveTrack=\u0644\u0627 \u064a\u0645\u0643\u0646 \u0628\u062d\u062b \u0627\u0644\u0645\u0633\u0627\u0631 \u0645\u0628\u0627\u0634\u0631. loadPlaySplitListFail=\u064a\u0624\u062f\u064a \u0647\u0630\u0627 \u0627\u0644\u0627\u0631\u062a\u0628\u0627\u0637 \u0625\u0644\u0649 \u0642\u0627\u0626\u0645\u0629 \u062a\u0634\u063a\u064a\u0644\u060c \u0644\u0627 \u0639\u0644\u0649 \u0645\u0633\u0627\u0631. \u062d\u0627\u0648\u0644 '\u061b\u061b \u0627\u0644\u0644\u0639\u0628 ' \u0628\u062f\u0644\u0627\u064b \u0645\u0646 \u0630\u0644\u0643. loadListSuccess=\u0627\u0644\u0639\u062b\u0648\u0631 \u0639\u0644\u0649 \u0648\u0625\u0636\u0627\u0641\u0629 \u0627\u0644\u0623\u063a\u0627\u0646\u064a ''{0}'' \u0645\u0646 \u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u062a\u0634\u063a\u064a\u0644 * *{1} * *. loadNoMatches=\u062a\u0639\u0630\u0631 \u0627\u0644\u062d\u0636\u0644 \u0639\u0644\u0649 \u0627\u064a \u0635\u0648\u062a \u0644`{0}`. @@ -125,15 +125,15 @@ luaError=\ \u062d\u062f\u062b \u062e\u0637\u0623 \u0641\u064a \u0644\u0648\u0627 luaErrorOutputTooBig=\ \u0627\u0644\u0645\u062e\u0632\u0646 \u0627\u0644\u0645\u0624\u0642\u062a \u0644\u0644\u0625\u062e\u0631\u0627\u062c \u0647\u0648 \:anger\: \u0643\u0628\u064a\u0631 \u062c\u062f\u0627\u064b \u0627\u0644\u0634\u0642\u0627\u0642 \u064a\u0633\u0645\u062d \u0641\u0642\u0637 \u0627\u0644\u0623\u062d\u0631\u0641 2000 \u0643\u0644 \u0631\u0633\u0627\u0644\u0629\u060c \u062d\u0635\u0644\u062a \u0639\u0644\u0649 {0} luaTimeout=\ \u0645\u0647\u0644\u0629 \u062f\u0627\u0644\u0629 \:anger\: \u064a\u0633\u0645\u062d \u0628\u062d\u0633\u0627\u0628 \u0627\u0644\u0648\u0642\u062a {0} \u062b\u0627\u0646\u064a\u0629. helpSuccess=\u062a\u0645 \u0625\u0631\u0633\u0627\u0644 \u0627\u0644\u0648\u062b\u0627\u0626\u0642 \u0625\u0644\u0649 \u0631\u0633\u0627\u0626\u0644\u0643 \u0627\u0644\u0645\u0628\u0627\u0634\u0631\u0629\!\n \n\u0627\u0644\u0633\u064a\u0627\u0642 | \u0633\u064a\u0627\u0642 \u0627\u0644\u0637\u0644\u0628\! -helpDmFailed=Could not send documentation to your DMs. Please check that you don't have them disabled\! +helpDmFailed=\u062a\u0639\u0630\u0631 \u0625\u0631\u0633\u0627\u0644 \u0627\u0644\u0645\u0633\u062a\u0646\u062f \u0641\u064a \u0627\u0644 \u062f\u0645 \u0627\u0644\u062e\u0627\u0635 \u0628\u0643. \u064a\u0631\u062c\u0649 \u0627\u0644\u062a\u062d\u0642\u0642 \u0645\u0646 \u0639\u062f\u0645 \u062a\u0639\u0637\u064a\u0644\u0647\u0627\! helpCommandsPromotion=\u0642\u0648\u0644 {0} \u0644\u0645\u0639\u0631\u0641\u0629 \u0645\u0627 \u064a\u0645\u0643\u0646 \u0627\u0644\u0642\u064a\u0627\u0645 \u0628\u0647 \u0647\u0630\u0627 \u0628\u0648\u062a\! fuzzyNoResults=\u0644\u0627 \u064a\u0648\u062c\u062f \u0645\u0633\u062a\u062e\u062f\u0645 \u0628\u0627\u0633\u0645 %s brainfuckCycleLimit=\u0627\u0644\u0628\u0631\u0646\u0627\u0645\u062c \u062a\u062c\u0627\u0648\u0632 \u062f\u0648\u0631\u0629 \u0643\u062d\u062f \u0623\u0642\u0635\u0649 \u0627\u0644\u0639\u062f\u062f \u0645\u0646 {0} brainfuckDataPointerOutOfBounds=\u0645\u0624\u0634\u0631 \u0627\u0644\u0628\u064a\u0627\u0646\u0627\u062a \u062e\u0627\u0631\u062c \u0627\u0644\u062d\u062f\u0648\u062f\: {0} brainfuckInputOOB=\u0627\u0644\u0625\u062f\u062e\u0627\u0644 \u062e\u0627\u0631\u062c \u0627\u0644\u062d\u062f\u0648\u062f \u0641\u064a \u0627\u0644\u0645\u0648\u0636\u0639\: {0} brainfuckNoOutput=\ \u0648\u0643\u0627\u0646 \u0647\u0646\u0627\u0643 \u0623\u064a\u0629 \u0627\u0644\u0625\u062e\u0631\u0627\u062c -weatherLocationNotFound=Unable to find location, please check your input {0}. -weatherError=Error retrieving weather for {0} +weatherLocationNotFound=\u062a\u0639\u0630\u0631 \u0639\u0644\u0649 \u0625\u064a\u062c\u0627\u062f \u0627\u0644\u0645\u0648\u0642\u0639. \u064a\u0631\u062c\u0649 \u0627\u0644\u062a\u062d\u0642\u0642 \u0639\u0646 \u0627\u0644\u0627\u062f\u062e\u0627\u0644. +weatherError=\u062d\u062f\u062b \u062e\u0637\u0623 \u0623\u062b\u0646\u0627\u0621 \u0627\u0633\u062a\u0631\u062f\u0627\u062f \u0627\u0644\u0637\u0642\u0633 \u0644 avatarSuccess=\ \u0648\u062c\u062a\u0647 configNoArgs=\u0627\u0644\u062a\u0643\u0648\u064a\u0646 \u0644 * *{0} * *\: '''' '' configSetTo=\u064a\u062a\u0645 \u0627\u0644\u0622\u0646 \u062a\u0639\u064a\u064a\u0646 \u0625\u0644\u0649 ''{0}''. @@ -171,7 +171,7 @@ hugSuccess=\u0627\u0644\u0639\u0646\u0627\u0642 {0}. patBot=\u0634\u0643\u0631\u0627 \u0639\u0644\u0649 \:blush\: \u0627\u0644\u0631\u0628\u062a\u0627\u062a\: patSuccess={0} \u0627\u0644\u0631\u0628\u062a\u0627\u062a. rollSuccess=\u062d\u0648\u0644 \u0627\u0644\u0642\u0648\u0627\u0626\u0645 {0} \u0639\u0644\u0649 \u0627\u0644\u0623\u0631\u0636. -facedeskSuccess={0} facedesks. +facedeskSuccess=\u0645\u062d\u0637 \u0648\u062c\u0647\u0647. langInvalidCode={0} \u0631\u0645\u0632 \u0627\u0644\u0644\u063a\u0629 \u063a\u064a\u0631 \u0645\u0648\u062c\u0648\u062f \u0623\u0648 \u0623\u0646\u0647 \u063a\u064a\u0631 \u0645\u0639\u062a\u0645\u062f. langSuccess=\u062a\u062d\u0648\u0644\u062a \u0625\u0644\u0649\: \u062a\u0643\u0644\u0645 {0}. langInfo=\u0641\u0631\u064a\u062f\u0628\u0648\u0627\u062a \u064a\u062f\u0639\u0645 \u0639\u062f\u0629 \u0644\u063a\u0627\u062a \u0633\u0627\u0647\u0645 \u0627\u0644\u0645\u0633\u062a\u062e\u062f\u0645 \u0627\u0644\u062a\u064a \u064a\u0645\u0643\u0646\u0643 \u062a\u062d\u062f\u064a\u062f\u0647\u0627 \u0645\u0639 \u0647\u0630\u0627 \u0627\u0644\u0623\u0645\u0631. \u0627\u0644\u0645\u0634\u0631\u0641\u0648\u0646 \u0639\u0644\u0649 \u0647\u0630\u0627 \u0627\u0644\u0645\u0644\u0642\u0645 \u064a\u0645\u0643\u0646 \u062a\u062d\u062f\u064a\u062f \u0644\u063a\u0629 \u0645\u0639 '\u061b\u061b \u0644\u0627\u0646\u062c ' \u0625\u0644\u064a\u0643 \u0627\u0644\u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0643\u0627\u0645\u0644\u0629 \u0644\u0644\u063a\u0627\u062a \u0627\u0644\u0645\u062f\u0639\u0648\u0645\u0629\: @@ -200,10 +200,10 @@ userinfoNick=\u0644\u0642\u0628\: userinfoKnownServer=\u0645\u0644\u0642\u0645\u0627\u062a \u0645\u0639\u0631\u0648\u0641\u0629\: userinfoJoinDate=\u062a\u0627\u0631\u064a\u062e \u0627\u0644\u0627\u0646\u062a\u062f\u0627\u0628\: userinfoCreationTime=\u062a\u0627\u0631\u064a\u062e \u0627\u0644\u0625\u0646\u0634\u0627\u0621\: -userinfoBlacklisted=Blacklisted\: -skipDeniedTooManyTracks=You can't skip someone else's tracks if you are not a DJ.\nConsider using the Voteskip command. +userinfoBlacklisted=\u0627\u0644\u0642\u0627\u0621\u0645\u0629 \u0627\u0644\u0633\u0648\u062f\u0627\u0621\: +skipDeniedTooManyTracks=\u0644\u0627 \u064a\u0645\u0643\u0646\u0643 \u062a\u062e\u0637\u064a \u0645\u0633\u0627\u0631\u0627\u062a \u0634\u062e\u0635 \u0623\u062e\u0631 \u0625\u0630\u0627 \u0644\u0645 \u062a\u0643\u0646 DJ. \u0641\u0643\u0631 \u0641\u064a \u0627\u0633\u062a\u062e\u062f\u0627\u0645 \u0627\u0644\u0627\u0645\u0631 Voteskip. eventUsersLeftVC=\u0648\u062a\u0631\u0643\u062a \u062c\u0645\u064a\u0639 \u0645\u0633\u062a\u062e\u062f\u0645\u064a \u0642\u0646\u0627\u0629 \u0635\u0648\u062a. \u062a\u0645 \u0625\u064a\u0642\u0627\u0641 \u0627\u0644\u0644\u0627\u0639\u0628. -eventAutoResumed=User presence detected, automatically resuming the player. +eventAutoResumed=\u062a\u0645 \u0623\u0643\u062a\u0634\u0627\u0641 \u0648\u062c\u0648\u062f \u0627\u0644\u0645\u0633\u062a\u062e\u062f\u0645\u060c \u0633\u064a\u0643\u0645\u0644 \u0627\u0644\u0645\u0634\u063a\u0644 \u062a\u0644\u0642\u0627\u0621\u064a\u0627. commandsFun=\u0645\u062a\u0639\u0629 commandsMemes=Memes commandsUtility=\u0627\u0644\u0623\u062f\u0648\u0627\u062a @@ -212,7 +212,11 @@ commandsMaintenance=\u0627\u0644\u0635\u064a\u0627\u0646\u0629 commandsBotOwner=\u0645\u0627\u0644\u0643 \u0628\u0648\u062a commandsMoreHelp=\u0648\u064a\u0642\u0648\u0644 {0} \u0644\u0644\u062d\u0635\u0648\u0644 \u0639\u0644\u0649 \u0645\u0632\u064a\u062f \u0645\u0646 \u0627\u0644\u0645\u0639\u0644\u0648\u0645\u0627\u062a \u062d\u0648\u0644 \u0623\u0645\u0631 \u0645\u0639\u064a\u0646. helpUnknownCommand=\u0623\u0645\u0631 \u063a\u064a\u0631 \u0645\u0639\u0631\u0648\u0641. -helpDM=\u0648\u064a\u0645\u0643\u0646 \u0627\u0644\u0627\u0637\u0644\u0627\u0639 \u0639\u0644\u0649 \u0627\u0644\u0648\u062b\u0627\u0626\u0642 \u0639\u0644\u0649 \u0627\u0644\u0639\u0646\u0648\u0627\u0646 \u0627\u0644\u062a\u0627\u0644\u064a\:\nhttps\://fredboat.com/docs\n\n\u062a\u0631\u064a\u062f \u0625\u0636\u0627\u0641\u0629 \u0641\u0631\u064a\u062f\u0628\u0648\u0627\u062a \u0625\u0644\u0649 \u0627\u0644\u062e\u0627\u062f\u0645 \u0627\u0644\u062e\u0627\u0635 \u0628\u0643\u061f \u0625\u0630\u0627 \u0643\u0627\u0646 \u0644\u062f\u064a\u0643 \u0623\u0630\u0648\u0646\u0627\u062a \u0625\u062f\u0627\u0631\u0629 \u0627\u0644\u062e\u0627\u062f\u0645 \u0644\u0646\u0642\u064a\u0628\u062a\u0643\u060c \u0641\u064a\u0645\u0643\u0646\u0643 \u062f\u0639\u0648\u062a\u0647\u0627 \u0647\u0646\u0627\:\n* \u0647\u0630\u0627 \u0648\u0627\u062d\u062f \u0644\u0627 \u062a\u0644\u0639\u0628 \u0627\u0644\u0645\u0648\u0633\u064a\u0642\u0649 *\n\n\n\u0625\u0630\u0627 \u0643\u0646\u062a \u062a\u0631\u063a\u0628 \u0641\u064a \u0625\u0636\u0627\u0641\u0629 \u0628\u0648\u062a \u0627\u0644\u0645\u0648\u0633\u064a\u0642\u0649\u060c \u0648\u0633\u0648\u0641 \u062a\u062d\u062a\u0627\u062c \u0625\u0644\u0649 \u062f\u0639\u0648\u0629 \u0647\u0630\u0627 \u0628\u0648\u062a\:\n\n\n\u062a\u062d\u062a\u0627\u062c \u0625\u0644\u0649 \u0645\u0633\u0627\u0639\u062f\u0629 \u0623\u0648 \u0644\u062f\u064a\u0643 \u0623\u064a \u0623\u0641\u0643\u0627\u0631 \u0644\u0644\u0628\u0648\u062a\u061f \u0631\u0628\u0645\u0627 \u0643\u0646\u062a \u062a\u0631\u063a\u0628 \u0641\u0642\u0637 \u0641\u064a \u0634\u0646\u0642\u061f \u0647\u064a\u0627 \u0625\u0644\u0649 \u0641\u0631\u064a\u062f\u0628\u0648\u062a \u0647\u0646\u063a\u0648\u062a\!\n{0}\n\n\u0644\u0627 \u064a\u0645\u0643\u0646\u0643 \u0625\u0631\u0633\u0627\u0644 \u0647\u0630\u0647 \u0627\u0644\u0623\u0648\u0627\u0645\u0631 \u0628\u0648\u062a \u0645\u0646 \u062e\u0644\u0627\u0644 \u062f\u0645.\n\u0628\u0648\u062a \u0627\u0644\u062a\u064a \u0623\u0646\u0634\u0623\u062a\u0647\u0627 Fre_d +helpDocsLocation=\u064a\u0645\u0643\u0646 \u0627\u0644\u0627\u0637\u0644\u0627\u0639 \u0639\u0644\u0649 \u0627\u0644\u0648\u062b\u0627\u0626\u0642 \u0641\u064a\: +helpBotInvite=\u0647\u0644 \u062a\u0631\u064a\u062f \u0625\u0636\u0627\u0641\u0629 \u0641\u0631\u064a\u062f\u0628\u0648\u0627\u062a \u0625\u0644\u0649 \u0627\u0644\u062e\u0627\u062f\u0645 \u0627\u0644\u062e\u0627\u0635 \u0628\u0643\u061f \u0625\u0630\u0627 \u0643\u0627\u0646 \u0644\u062f\u064a\u0643 \u0623\u0630\u0648\u0646\u0627\u062a "\u0625\u062f\u0627\u0631\u0629 \u0627\u0644\u0645\u0644\u0642\u0645" \u0644\u0644\u0646\u0642\u0627\u0628\u0629 \u0627\u0644\u062e\u0627\u0635\u0629 \u0628\u0643\u060c \u064a\u0645\u0643\u0646\u0643 \u062f\u0639\u0648\u0629 \u0641\u0631\u064a\u062f\u0628\u0648\u0627\u062a\: +helpHangoutInvite=\u0628\u062d\u0627\u062c\u0629 \u0625\u0644\u0649 \u0645\u0633\u0627\u0639\u062f\u0629 \u0623\u0648 \u0644\u062f\u064a\u0643 \u0623\u064a \u0623\u0641\u0643\u0627\u0631 \u0641\u0631\u064a\u062f\u0628\u0648\u0627\u062a\u061f \u0631\u0628\u0645\u0627 \u0643\u0646\u062a \u062a\u0631\u063a\u0628 \u0641\u0642\u0637 \u0634\u0646\u0642\u061f \u0627\u0644\u0627\u0646\u0636\u0645\u0627\u0645 \u0625\u0644\u0649 \u0627\u0644\u0645\u062c\u062a\u0645\u0639 \u0641\u0631\u064a\u062f\u0628\u0648\u0627\u062a\! +helpNoDmCommands=\u0644\u0627 \u064a\u0645\u0643\u0646\u0643 \u0625\u0631\u0633\u0627\u0644 \u0623\u0648\u0627\u0645\u0631 \u0641\u0631\u064a\u062f\u0628\u0648\u0627\u062a \u0645\u0646 \u062e\u0644\u0627\u0644 \u0646\u0638\u0627\u0645 \u0625\u062f\u0627\u0631\u0629 \u0627\u0644\u0648\u062c\u0647\u0627\u062a \u0627\u0644\u0633\u064a\u0627\u062d\u064a\u0629. +helpCredits=\u062a\u0645 \u0625\u0646\u0634\u0627\u0624\u0647\u0627 \u0628\u0648\u0627\u0633\u0637\u0629 Fre_d \u0648\u0627\u0644\u0645\u0633\u0627\u0647\u0645\u064a\u0646 \u0645\u0641\u062a\u0648\u062d\u0629 \u0627\u0644\u0645\u0635\u062f\u0631 helpSent=\u062a\u0645 \u0625\u0631\u0633\u0627\u0644 \u0627\u0644\u0648\u062b\u0627\u0626\u0642 \u0625\u0644\u0649 \u0625\u062f\u0627\u0631\u0629 \u0627\u0644\u0648\u062c\u0647\u0627\u062a \u0627\u0644\u0633\u064a\u0627\u062d\u064a\u0629 \u0627\u0644\u062e\u0627\u0635\u0629 \u0628\u0643\! helpProperUsage=\u0627\u0644\u0627\u0633\u062a\u062e\u062f\u0627\u0645 \u0627\u0644\u0635\u062d\u064a\u062d\: helpCommandOwnerRestricted=\u064a\u0642\u062a\u0635\u0631 \u0647\u0630\u0627 \u0627\u0644\u0623\u0645\u0631 \u0639\u0644\u0649 \u0645\u0627\u0644\u0643 \u0627\u0644\u0628\u0648\u062a. @@ -225,20 +229,20 @@ helpMusicCommandsHeader=\u0623\u0648\u0627\u0645\u0631 \u0627\u0644\u0645\u0648\ helpJoinCommand=\u062c\u0639\u0644 \u0628\u0648\u062a \u0627\u0644\u0627\u0646\u0636\u0645\u0627\u0645 \u0625\u0644\u0649 \u0642\u0646\u0627\u0629 \u0627\u0644\u0635\u0648\u062a \u0627\u0644\u062d\u0627\u0644\u064a \u0627\u0644\u062e\u0627\u0635 \u0628\u0643. helpLeaveCommand=\u062c\u0639\u0644 \u0628\u0648\u062a \u0645\u063a\u0627\u062f\u0631\u0629 \u0627\u0644\u0642\u0646\u0627\u0629 \u0627\u0644\u0635\u0648\u062a\u064a\u0629 \u0627\u0644\u062d\u0627\u0644\u064a\u0629. helpPauseCommand=\u0625\u064a\u0642\u0627\u0641 \u0627\u0644\u0644\u0627\u0639\u0628. -helpPlayCommand=Play music from the given URL or search for a track. For a full list of sources please visit {0} +helpPlayCommand=\u062a\u0634\u063a\u064a\u0644 \u0627\u0644\u0645\u0648\u0633\u064a\u0642\u0649 \u0645\u0646 \u0639\u0646\u0648\u0627\u0646 URL \u0645\u0639\u064a\u0646 \u0623\u0648 \u0627\u0644\u0628\u062d\u062b \u0639\u0646 \u0645\u0633\u0627\u0631. \u0644\u0644\u062d\u0635\u0648\u0644 \u0639\u0644\u0649 \u0642\u0627\u0626\u0645\u0629 \u0643\u0627\u0645\u0644\u0629 \u0645\u0646 \u0627\u0644\u0645\u0635\u0627\u062f\u0631 \u064a\u0631\u062c\u0649 \u0632\u064a\u0627\u0631\u0629 helpPlaySplitCommand=\u062a\u0642\u0633\u064a\u0645 \u0641\u064a\u062f\u064a\u0648 \u064a\u0648\u062a\u064a\u0648\u0628 \u0625\u0644\u0649 \u0627\u0644\u062a\u0633\u0637\u064a\u0628 \u0627\u0644\u0645\u0646\u0635\u0648\u0635 \u0639\u0644\u064a\u0647\u0627 \u0641\u064a \u0648\u0635\u0641 \u0623\u0646\u0647\u0627. helpRepeatCommand=\u0627\u0644\u062a\u0628\u062f\u064a\u0644 \u0628\u064a\u0646 \u0648\u0636\u0639\u064a \u062a\u0643\u0631\u0627\u0631. helpReshuffleCommand=\u062a\u0639\u062f\u064a\u0644 \u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0627\u0646\u062a\u0638\u0627\u0631 \u0627\u0644\u062d\u0627\u0644\u064a\u0629. helpSelectCommand=\u062d\u062f\u062f \u0623\u062d\u062f \u0627\u0644\u0645\u0633\u0627\u0631\u0627\u062a \u0627\u0644\u0645\u0642\u062f\u0645\u0629 \u0628\u0639\u062f \u0628\u062d\u062b \u0644\u0644\u0639\u0628. helpShuffleCommand=\u062a\u0628\u062f\u064a\u0644 \u0648\u0636\u0639 \u0627\u0644\u0645\u0631\u0627\u0648\u063a\u0629 \u0644\u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0627\u0646\u062a\u0638\u0627\u0631 \u0627\u0644\u062d\u0627\u0644\u064a\u0629. -helpSkipCommand=Skip the current song, the n'th song in the queue, all songs from n to m, or all songs from mentioned users. Please use in moderation. +helpSkipCommand=\u062a\u062e\u0637\u064a \u0627\u0644\u0623\u063a\u0646\u064a\u0629 \u0627\u0644\u062d\u0627\u0644\u064a\u0629\u060c \u0623\u063a\u0646\u064a\u0629 n&\#39; th \u0641\u064a \u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0627\u0646\u062a\u0638\u0627\u0631\u060c \u062c\u0645\u064a\u0639 \u0627\u0644\u0623\u063a\u0627\u0646\u064a \u0645\u0646 n \u0625\u0644\u0649 m\u060c \u0623\u0648 \u062c\u0645\u064a\u0639 \u0627\u0644\u0623\u063a\u0627\u0646\u064a \u0645\u0646 \u0627\u0644\u0645\u0633\u062a\u062e\u062f\u0645\u064a\u0646 \u0627\u0644\u0645\u0630\u0643\u0648\u0631\u0629. \u0627\u0644\u0631\u062c\u0627\u0621 \u0627\u0633\u062a\u062e\u062f\u0627\u0645 \u0644\u0644\u0627\u0639\u062a\u062f\u0627\u0644. helpStopCommand=\u0625\u064a\u0642\u0627\u0641 \u0627\u0644\u0644\u0627\u0639\u0628 \u0648\u0645\u0633\u062d \u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u062a\u0634\u063a\u064a\u0644. \u0645\u062d\u0641\u0648\u0638\u0629 \u0644\u0644\u0645\u0634\u0631\u0641\u064a\u0646 \u0645\u0639 "\u0625\u062f\u0627\u0631\u0629 \u0631\u0633\u0627\u0626\u0644" \u0627\u0644\u0625\u0630\u0646. helpUnpauseCommand=\u0625\u0644\u063a\u0627\u0621 \u0627\u0644\u0625\u064a\u0642\u0627\u0641 \u0627\u0644\u0645\u0624\u0642\u062a \u0644\u0644\u0627\u0639\u0628. helpVolumeCommand=\u062a\u063a\u064a\u064a\u0631 \u0648\u062d\u062f\u0629 \u0627\u0644\u062a\u062e\u0632\u064a\u0646. \u062a\u0643\u0648\u0646 \u0627\u0644\u0642\u064a\u0645 0-150 \u0648 100 \u0647\u0648 \u0627\u0644\u0625\u0639\u062f\u0627\u062f \u0627\u0644\u0627\u0641\u062a\u0631\u0627\u0636\u064a. \u062a\u0645 \u0625\u0647\u0645\u0627\u0644 \u0647\u0630\u0627 \u0627\u0644\u0623\u0645\u0631 \u0648\u062d\u062f\u0629 \u0627\u0644\u062a\u062e\u0632\u064a\u0646 \u0639\u0644\u0649 \u0628\u0648\u062a \u0627\u0644\u0639\u0627\u0645\u0629. helpExportCommand=\u062a\u0635\u062f\u064a\u0631 \u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0627\u0646\u062a\u0638\u0627\u0631 \u0627\u0644\u062d\u0627\u0644\u064a\u0629 \u0625\u0644\u0649 \u0627\u0631\u062a\u0628\u0627\u0637 \u0647\u0627\u0633\u062a\u064a\u0628\u064a\u0646\u060c \u0648\u064a\u0645\u0643\u0646 \u0627\u0633\u062a\u062e\u062f\u0627\u0645\u0647\u0627 \u0641\u064a \u0648\u0642\u062a \u0644\u0627\u062d\u0642 \u0643\u0642\u0627\u0626\u0645\u0629 \u062a\u0634\u063a\u064a\u0644. helpGensokyoRadioCommand=\u0625\u0638\u0647\u0627\u0631 \u0627\u0644\u0623\u063a\u0646\u064a\u0629 \u0627\u0644\u062d\u0627\u0644\u064a\u0629 \u0644\u0639\u0628\u062a \u0639\u0644\u0649 gensokyoradio.net helpListCommand=\u0639\u0631\u0636 \u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0623\u063a\u0627\u0646\u064a \u0627\u0644\u062d\u0627\u0644\u064a\u0629 \u0641\u064a \u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u062a\u0634\u063a\u064a\u0644. -helpHistoryCommand=Display a list of the songs in playlist history. +helpHistoryCommand=\u0639\u0631\u0636 \u0642\u0627\u0626\u0645\u0629 \u0628\u0627\u0644\u0623\u063a\u0627\u0646\u064a \u0641\u064a \u0633\u062c\u0644 \u0642\u0648\u0627\u0626\u0645 \u0627\u0644\u062a\u0634\u063a\u064a\u0644. helpNowplayingCommand=\u0639\u0631\u0636 \u0627\u0644\u0623\u063a\u0646\u064a\u0629 \u0642\u064a\u062f \u0627\u0644\u062a\u0634\u063a\u064a\u0644 \u062d\u0627\u0644\u064a\u0627. helpForwardCommand=\u0625\u0644\u0649 \u0627\u0644\u0623\u0645\u0627\u0645 \u0639\u0644\u0649 \u0627\u0644\u0645\u0633\u0627\u0631 \u0628\u0645\u0642\u062f\u0627\u0631 \u0645\u0639\u064a\u0646 \u0645\u0646 \u0627\u0644\u0648\u0642\u062a. \u0639\u0644\u0649 \u0633\u0628\u064a\u0644 \u0627\u0644\u0645\u062b\u0627\u0644\: helpRestartCommand=\u0642\u0645 \u0628\u0625\u0639\u0627\u062f\u0629 \u062a\u0634\u063a\u064a\u0644 \u0627\u0644\u0645\u0633\u0627\u0631 \u0642\u064a\u062f \u0627\u0644\u062a\u0634\u063a\u064a\u0644 \u062d\u0627\u0644\u064a\u0627. @@ -246,7 +250,7 @@ helpRewindCommand=\u0625\u0631\u062c\u0627\u0639 \u0627\u0644\u0645\u0633\u0627\ helpSeekCommand=\u062a\u0639\u064a\u064a\u0646 \u0645\u0648\u0636\u0639 \u0627\u0644\u0645\u0633\u0627\u0631 \u0644\u0648\u0642\u062a \u0645\u0639\u064a\u0646. \u0639\u0644\u0649 \u0633\u0628\u064a\u0644 \u0627\u0644\u0645\u062b\u0627\u0644\: helpAvatarCommand=\u0639\u0631\u0636 \u0627\u0644\u0635\u0648\u0631\u0629 \u0627\u0644\u0631\u0645\u0632\u064a\u0629 \u0644\u0644\u0645\u0633\u062a\u062e\u062f\u0645. helpBrainfuckCommand=\u064a\u0646\u0641\u0630 \u0627\u0644\u062a\u0639\u0644\u064a\u0645\u0627\u062a \u0627\u0644\u0628\u0631\u0645\u062c\u064a\u0629 \u0628\u0631\u064a\u0646\u0641\u0648\u0643. \u0639\u0644\u0649 \u0633\u0628\u064a\u0644 \u0627\u0644\u0645\u062b\u0627\u0644\: -helpWeatherCommand=Display current weather by location. +helpWeatherCommand=\u0639\u0631\u0636 \u0627\u0644\u0637\u0642\u0635 \u0627\u0644\u062d\u0627\u0644\u064a \u0645\u0646 \u0645\u0648\u0642\u0639\u0643. helpClearCommand=\u062d\u0630\u0641 \u0643\u0627\u0641\u0629 \u0627\u0644\u0631\u0633\u0627\u0626\u0644 \u0628\u0647\u0630\u0627 \u0628\u0648\u062a \u0641\u064a \u0622\u062e\u0631 50 \u0631\u0633\u0627\u0626\u0644 \u0647\u0630\u0647 \u0627\u0644\u0642\u0646\u0627\u0629. helpCommandsCommand=\u062a\u0638\u0647\u0631 \u0627\u0644\u0623\u0648\u0627\u0645\u0631 \u0627\u0644\u0645\u062a\u0648\u0641\u0631\u0629. helpHelpCommand=\u0627\u0644\u062d\u0635\u0648\u0644 \u0639\u0644\u0649 \u062a\u0639\u0644\u064a\u0645\u0627\u062a \u062d\u0648\u0644 \u0647\u0630\u0627 \u0628\u0648\u062a \u0623\u0648 \u0645\u0633\u0627\u0639\u062f\u0629 \u0644\u0623\u064a \u0623\u0645\u0631. @@ -257,16 +261,16 @@ helpSayCommand=\u062c\u0639\u0644 \u0628\u0648\u062a \u0635\u062f\u0649 \u0634\u helpServerInfoCommand=\u0639\u0631\u0636 \u0628\u0639\u0636 \u0627\u0644\u0625\u062d\u0635\u0627\u0626\u064a\u0627\u062a \u062d\u0648\u0644 \u0647\u0630\u0647 \u0627\u0644\u0646\u0642\u0627\u0628\u0629. helpUserInfoCommand=\u0639\u0631\u0636 \u0645\u0639\u0644\u0648\u0645\u0627\u062a \u062d\u0648\u0644 \u0646\u0641\u0633\u0643 \u0623\u0648 \u0645\u0633\u062a\u062e\u062f\u0645 \u0645\u0639\u0631\u0648\u0641 \u0627\u0644\u0628\u0648\u062a. helpPerms=\u0644\u0627\u0644\u0633\u0645\u0627\u062d \u0644\u0623\u0639\u0636\u0627\u0621 \u0627\u0644\u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0628\u064a\u0636\u0627\u0621 \u0648\u0627\u0644\u0623\u062f\u0648\u0627\u0631 \u0644\u0631\u062a\u0628\u0629 {0}. -helpPrefixCommand=Set the prefix for this guild. -helpVoteSkip=Vote to skip the current song. Needs 50% of all users in the voice chat to vote. -helpMathOperationAdd=Print the sum of num1 and num2. -helpMathOperationSub=Print the difference of subtracting num2 from num1. -helpMathOperationMult=Print the product of num1*num2. -helpMathOperationDiv=Print the quotient of dividing num1 by num2. -helpMathOperationMod=Print the remainder of dividing num1 by num2. -helpMathOperationPerc=Print the percentage represented by num1 in num2. -helpMathOperationSqrt=Print the square root of num. -helpMathOperationPow=Print the result of num1^num2. +helpPrefixCommand=\u0642\u0645 \u0628\u062a\u0639\u064a\u064a\u0646 \u0627\u0644\u0628\u0627\u062f\u0626\u0629 \u0644\u0647\u0630\u0647 \u0627\u0644\u0646\u0642\u0627\u0628\u0629. +helpVoteSkip=\u0627\u0644\u062a\u0635\u0648\u064a\u062a \u0644\u062a\u062e\u0637\u064a \u0627\u0644\u0623\u063a\u0646\u064a\u0629 \u0627\u0644\u062d\u0627\u0644\u064a\u0629. \u064a\u062d\u062a\u0627\u062c \u0625\u0644\u0649 50 \u0641\u064a \u0627\u0644\u0645\u0627\u0626\u0629 \u0645\u0646 \u0643\u0627\u0641\u0629 \u0627\u0644\u0645\u0633\u062a\u062e\u062f\u0645\u064a\u0646 \u0641\u064a \u0627\u0644\u0645\u062d\u0627\u062f\u062b\u0629 \u0627\u0644\u0635\u0648\u062a\u064a\u0629 \u0627\u0644\u062a\u0635\u0648\u064a\u062a. +helpMathOperationAdd=\u0627\u0637\u0628\u0639 \u0645\u062c\u0645\u0648\u0639 num1 \u0648 num2. +helpMathOperationSub=\u0627\u0637\u0628\u0639 \u0627\u0644\u0641\u0631\u0642 \u0645\u0646 \u0637\u0631\u062d num2 \u0645\u0646 num1. +helpMathOperationMult=\u0627\u0637\u0628\u0639 \u0627\u0644\u0636\u0631\u0628 num1 * num2. +helpMathOperationDiv=\u0627\u0637\u0628\u0639 \u062d\u0627\u0635\u0644 \u0642\u0633\u0645\u0629 num1 / num2. +helpMathOperationMod=\u0627\u0637\u0628\u0639 \u0645\u0627 \u062a\u0628\u0642\u0649 \u0645\u0646 \u0642\u0633\u0645\u0629 num1 / num2. +helpMathOperationPerc=\u0627\u0637\u0628\u0639 \u0627\u0644\u0646\u0633\u0628\u0629 \u0627\u0644\u0645\u0626\u0648\u064a\u0629 \u0627\u0644\u062a\u064a \u064a\u0645\u062b\u0644\u0647\u0627 num1 \u0641\u064a num2. +helpMathOperationSqrt=\u0637\u0628\u0627\u0639\u0629 \u0627\u0644\u062c\u0630\u0631 \u0627\u0644\u062a\u0631\u0628\u064a\u0639\u064a \u0644num. +helpMathOperationPow=\u0627\u0637\u0628\u0639 \u0646\u062a\u064a\u062c\u0629 num1 \u0645\u0631\u0641\u0648\u0639 \u0628 num2. \u0627\u0648 num1^num2. destroyDenied=\u064a\u062c\u0628 \u0623\u0646 \u064a\u0643\u0648\u0646 \u0644\u062f\u064a\u0643 \u0627\u0644\u0625\u0630\u0646 \u0631\u0633\u0627\u0626\u0644 \u0625\u062f\u0627\u0631\u0629 \u0644\u0625\u0639\u0627\u062f\u0629 \u0627\u0644\u0644\u0627\u0639\u0628. destroyHelp=\u0625\u0639\u0627\u062f\u0629 \u062a\u0639\u064a\u064a\u0646 \u0627\u0644\u0644\u0627\u0639\u0628 \u0648\u0645\u0633\u062d \u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u062a\u0634\u063a\u064a\u0644. \u0645\u062d\u0641\u0648\u0638\u0629 \u0644\u0644\u0645\u0634\u0631\u0641\u064a\u0646 \u0645\u0639 "\u0625\u062f\u0627\u0631\u0629 \u0631\u0633\u0627\u0626\u0644" \u0627\u0644\u0625\u0630\u0646. destroySucc=\u0625\u0639\u0627\u062f\u0629 \u062a\u0639\u064a\u064a\u0646 \u0627\u0644\u0644\u0627\u0639\u0628 \u0648\u0645\u0633\u062d \u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0627\u0646\u062a\u0638\u0627\u0631. @@ -275,27 +279,27 @@ permsListTitle=\u0627\u0644\u0645\u0633\u062a\u062e\u062f\u0645\u064a\u0646 \u06 permsAdded=\u0648\u0623\u0636\u0627\u0641 ''{0}'' \u0625\u0644\u0649 ''{1}''. permsRemoved=\u0625\u0632\u0627\u0644\u0629 ''{0}'' \u0645\u0646 ''{1}''. permsFailSelfDemotion=\u0644\u0627 \u064a\u0645\u0643\u0646\u0643 \u0625\u0632\u0627\u0644\u0629 \u0647\u0630\u0627 \u0643\u0645\u0627 \u0623\u0646\u0647 \u0633\u064a\u062c\u0639\u0644 \u0644\u0643 \u062f\u0648\u0646 \u0623\u0630\u0648\u0646\u0627\u062a \u0627\u0644\u0645\u0633\u0624\u0648\u0644\! -permsAlreadyAdded={0} already added to {1} -permsNotAdded={0} is not in {1} +permsAlreadyAdded=\u062a\u0645\u062a \u0627\u0644\u0625\u0636\u0627\u0641\u0629 \u0627\u0644\u0649 +permsNotAdded=\u0644\u064a\u0633\u062a \u0641\u064a fuzzyMultiple=\u062a\u0645 \u0627\u0644\u0639\u062b\u0648\u0631 \u0639\u0644\u0649 \u0639\u0646\u0627\u0635\u0631 \u0645\u062a\u0639\u062f\u062f\u0629. \u0647\u0644 \u062a\u0642\u0635\u062f \u0623\u064a \u0645\u0646 \u0647\u0630\u0647\u061f fuzzyNothingFound=\u0644\u0645 \u064a\u062a\u0645 \u0627\u0644\u0639\u062b\u0648\u0631 \u0639\u0644\u0649 \u0623\u064a \u0634\u064a\u0621 \u0639\u0646 ''{0}''. cmdPermsTooLow=\u0644\u064a\u0633 \u0644\u062f\u064a\u0643 \u0627\u0644\u0625\u0630\u0646 \u0644\u062a\u0634\u063a\u064a\u0644 \u0647\u0630\u0627 \u0627\u0644\u0623\u0645\u0631\! \u0648\u064a\u062a\u0637\u0644\u0628 \u0647\u0630\u0627 \u0627\u0644\u0623\u0645\u0631 ''{0}'' \u0648\u0644\u0643\u0646 \u0644\u062f\u064a\u0643 \u0641\u0642\u0637 ''{1}''. playersLimited=\u0641\u0631\u064a\u062f\u0628\u0648\u0627\u062a \u062d\u0627\u0644\u064a\u0627 \u0628\u0623\u0642\u0635\u0649 \u0637\u0627\u0642\u062a\u0647\u0627\! \u064a\u062a\u0645 \u062d\u0627\u0644\u064a\u0627 \u0625\u0635\u0644\u0627\u062d \u0627\u0644\u0628\u0648\u062a \u0644\u0644\u0639\u0628 \u0641\u0642\u0637 \u0644\u062a\u064a\u0627\u0631\u0627\u062a ''{0}''\u060c \u0648\u0625\u0644\u0627 \u0633\u0648\u0641 \u0646\u062e\u0627\u0637\u0631 \u0628\u0642\u0637\u0639 \u0627\u0644\u0634\u0642\u0627\u0642 \u062a\u062d\u062a \u062a\u062d\u0645\u064a\u0644 \u0627\u0644\u0634\u0628\u0643\u0629. \u0625\u0630\u0627 \u0623\u0631\u062f\u062a \u0623\u0646 \u062a\u0633\u0627\u0639\u062f\u0646\u0627 \u0639\u0644\u0649 \u0632\u064a\u0627\u062f\u0629 \u0627\u0644\u062d\u062f \u0623\u0648 \u062a\u0631\u064a\u062f \u0627\u0633\u062a\u062e\u062f\u0627\u0645 \u0644\u062f\u064a\u0646\u0627 \u0628\u0648\u062a \u063a\u064a\u0631 \u0645\u0643\u062a\u0638\u0629\u060c \u064a\u0631\u062c\u0649 \u062f\u0639\u0645 \u0639\u0645\u0644\u0646\u0627 \u0641\u064a \u0628\u062a\u0631\u0648\u0646\:{1} \u0639\u0630\u0631\u0627\u064b \u0644\u0644\u0625\u0632\u0639\u0627\u062c\! \u0642\u062f \u062a\u0631\u063a\u0628 \u0641\u064a \u0627\u0644\u0645\u062d\u0627\u0648\u0644\u0629 \u0645\u0631\u0629 \u0623\u062e\u0631\u0649 \u0644\u0627\u062d\u0642\u0627\u064b. \u0648\u0639\u0627\u062f\u0629 \u0645\u0627 \u062a\u0638\u0647\u0631 \u0647\u0630\u0647 \u0627\u0644\u0631\u0633\u0627\u0644\u0629 \u0641\u0642\u0637 \u0641\u064a \u0648\u0642\u062a \u0627\u0644\u0630\u0631\u0648\u0629. -tryLater=Please try again later. -skipUserSingle=Skipped {0} added by {1}. -skipUserMultiple=Skipped {0} tracks added by {1}. -skipUsersMultiple=Skipped {0} tracks added by {1} users. -skipUserNoTracks=None of the mentioned users have any tracks queued. -voteSkipAdded=Your vote has been added\! -voteSkipAlreadyVoted=You already voted to skip this track\! -voteSkipSkipping={0} have voted to skip. Skipping track {1}. -voteSkipNotEnough={0} have voted to skip. At least {1} needed. -voteSkipEmbedNoVotes=No votes to skip this track yet. -voteSkipEmbedVoters={0} out of {1} have voted to skip the current track -mathOperationResult=The result is -mathOperationDivisionByZeroError=I cannot divide by zero. -mathOperationInfinity=The number is too big to be displayed\! -prefix=Prefix -prefixGuild=The prefix for this guild is {0} -prefixShowAgain=You can show the prefix anytime again by mentioning me. +tryLater=\u064a\u0631\u062c\u0649 \u0627\u0644\u0645\u062d\u0648\u0644\u0629 \u0645\u0631\u0629 \u0623\u062e\u0631\u0649 \u0644\u0627\u062d\u0642\u0627. +skipUserSingle=\u062a\u0645 \u062a\u062e\u0637 0 \u062a\u0645\u062a \u0625\u0636\u0627\u0641\u062a\u0647 \u0628\u0648\u0627\u0633\u0637\u0629 1. +skipUserMultiple=\u062a\u0645 \u062a\u062e\u0637\u064a 0 \u0645\u0633\u0627\u0631 \u062a\u0645\u062a \u0625\u0636\u0627\u0641\u062a\u0647 \u0628\u0648\u0627\u0633\u0637\u0629 1. +skipUsersMultiple=\u062a\u0645 \u062a\u062e\u0637\u064a 0 \u0645\u0633\u0627\u0631 \u062a\u0645\u062a \u0625\u0636\u0627\u0641\u062a\u0647 \u0628\u0648\u0627\u0633\u0637\u0629 1 \u0645\u0633\u062a\u062e\u062f\u0645\u064a\u0646. +skipUserNoTracks=\u0644\u064a\u0633 \u0644\u062f\u0649 \u0623\u064a \u0645\u0646 \u0627\u0644\u0645\u0633\u062a\u062e\u062f\u0645\u064a\u0646 \u0627\u0644\u0645\u0630\u0643\u0648\u0631\u064a\u0646 \u0623\u064a \u0645\u0633\u0627\u0631\u0627\u062a \u0641\u064a \u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0627\u0646\u062a\u0638\u0627\u0631. +voteSkipAdded=\u062a\u0645\u062a \u0625\u0636\u0627\u0641\u0629 \u062a\u0635\u0648\u064a\u062a\u0643\! +voteSkipAlreadyVoted=\u0644\u0642\u062f \u0635\u0648\u062a\u062a \u0628\u0627\u0644\u0641\u0639\u0644 \u0644\u062a\u062e\u0637\u064a \u0647\u0630\u0627 \u0627\u0644\u0645\u0633\u0627\u0631\! +voteSkipSkipping={0} \u0635\u0648\u062a\u0648\u0627 \u0644\u0644\u062a\u062e\u0637\u064a. \u062a\u062e\u0637\u064a \u0627\u0644\u0645\u0633\u0627\u0631 {1}. +voteSkipNotEnough={0} \u0635\u0648\u062a\u0648\u0627 \u0644\u0644\u062a\u062e\u0637\u064a. \u062a\u062d\u062a\u0627\u062c {1} \u0639\u0644\u0649 \u0627\u0644\u0623\u0642\u0644. +voteSkipEmbedNoVotes=\u0644\u0627 \u062a\u0648\u062c\u062f \u0627\u0635\u0648\u0627\u062a \u0644\u062a\u062e\u0637\u064a \u0647\u0630\u0627 \u0627\u0644\u0645\u0633\u0627\u0631 \u0628\u0639\u062f. +voteSkipEmbedVoters={0} \u0645\u0646 {1} \u0635\u0648\u062a\u0648\u0627 \u0644\u062a\u062e\u0637\u064a \u0627\u0644\u0645\u0633\u0627\u0631 \u0627\u0644\u062d\u0627\u0644\u064a +mathOperationResult=\u0648\u0627\u0644\u0646\u062a\u064a\u062c\u0629 \u0647\u064a +mathOperationDivisionByZeroError=\u0644\u0627 \u0627\u0633\u062a\u0637\u064a\u0639 \u0627\u0644\u0642\u0633\u0645\u0629 \u0639\u0644\u0649 \u0635\u0641\u0631. +mathOperationInfinity=\u0627\u0644\u0631\u0642\u0645 \u0643\u0628\u064a\u0631 \u062c\u062f\u0627 \u0644\u064a\u062a\u0645 \u0639\u0631\u0636\u0647\! +prefix=\u0627\u0644\u0628\u0627\u062f\u0626\u0629 +prefixGuild=\u0627\u0644\u0628\u0627\u062f\u0626\u0629 \u0644\u0647\u0630\u0647 \u0627\u0644\u0646\u0642\u0627\u0628\u0629 \u0647\u064a {0} +prefixShowAgain=\u064a\u0645\u0643\u0646\u0643 \u0625\u0638\u0647\u0627\u0631 \u0627\u0644\u0628\u0627\u062f\u0626\u0629 \u0641\u064a \u0623\u064a \u0648\u0642\u062a \u0645\u0631\u0629 \u0623\u062e\u0631\u0649 \u0645\u0646 \u062e\u0644\u0627\u0644 \u0630\u0643\u0631 \u0644\u064a. diff --git a/FredBoat/src/main/resources/lang/bg_BG.properties b/FredBoat/src/main/resources/lang/bg_BG.properties index 8be48b3ed..33cd5e1df 100644 --- a/FredBoat/src/main/resources/lang/bg_BG.properties +++ b/FredBoat/src/main/resources/lang/bg_BG.properties @@ -183,7 +183,7 @@ ratelimitedGeneralInfo=\u0412\u0438\u0435 \u0441\u0442\u0435 \u043e\u0433\u0440\ ratelimitedSkipCommand=\u041c\u043e\u0436\u0435\u0442\u0435 \u0434\u0430 \u043f\u0440\u043e\u043f\u0443\u0441\u043d\u0435\u0442\u0435 \u043f\u043e\u0432\u0435\u0447\u0435 \u043e\u0442 \u0435\u0434\u043d\u0430 \u043f\u0435\u0441\u0435\u043d \u0441 \u0442\u0430\u0437\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u0430\: {0} ratelimitedGuildSlowLoadingPlaylist=\u0422\u043e\u0437\u0438 \u0441\u044a\u0440\u0432\u044a\u0440 \u043d\u0435 \u0435 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d \u0434\u0430 \u0434\u043e\u0431\u0430\u0432\u044f \u043f\u043e\u0432\u0435\u0447\u0435 playlists \u0432 \u0442\u043e\u0437\u0438 \u043c\u043e\u043c\u0435\u043d\u0442. \u041c\u043e\u043b\u044f \u043d\u0435 \u0441\u043f\u0430\u043c\u0435\u0442\u0435 \u0434\u044a\u043b\u0433\u0438 playlists. unblacklisted=\u041f\u0440\u0435\u043c\u0430\u0445\u043d\u0430\u0442 {0} \u043e\u0442 \u0447\u0435\u0440\u043d\u0438\u044f \u0441\u043f\u0438\u0441\u044a\u043a. -serverinfoTitle=\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u0437\u0430 **{0} **\: +serverinfoTitle=Info about {0}\: serverinfoOnlineUsers=\u041e\u043d\u043b\u0430\u0439\u043d \u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u0438\: serverinfoTotalUsers=\u041e\u0431\u0449\u0438 \u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u0438\: serverinfoRoles=\u0420\u043e\u043b\u0438\: @@ -193,7 +193,7 @@ serverinfoGuildID=\u0413\u0438\u043b\u0434\u0438\u044f\u0442\u0430 \u0418\u0414\ serverinfoCreationDate=\u0414\u0430\u0442\u0430 \u043d\u0430 \u0441\u044a\u0437\u0434\u0430\u0432\u0430\u043d\u0435\: serverinfoOwner=\u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u0438\u043a\: serverinfoVLv=\u041a\u043e\u0434 \u0437\u0430 \u043f\u043e\u0442\u0432\u044a\u0440\u0436\u0434\u0430\u0432\u0430\u043d\u0435\: -userinfoTitle=\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u0437\u0430 **{0} **\: +userinfoTitle=Information about {0}\: userinfoUsername=\u041f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u0441\u043a\u043e \u0438\u043c\u0435\: userinfoId=ID\: userinfoNick=\u041f\u0440\u044f\u043a\u043e\u0440\: @@ -212,7 +212,11 @@ commandsMaintenance=\u0422\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0430 commandsBotOwner=\u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u0438\u043a \u043d\u0430 \u0431\u043e\u0442\u0430 commandsMoreHelp=\u041a\u0430\u0436\u0430 {0} \u0434\u0430 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 \u043f\u043e\u0432\u0435\u0447\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u0437\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0430. helpUnknownCommand=Unknown command. -helpDM=Documentation can be found at\:\nhttps\://fredboat.com/docs\n\nWant to add FredBoat to your server? If you have Manage Server permissions for your guild, you can invite it here\:\n*This one doesn''t play music*\n\n\nIf you want to add the music bot, you will want to invite this bot\:\n\n\nNeed help or have any ideas for the bot? Perhaps you just want to hang out? Come on over to FredBoat hangout\!\n{0}\n\nYou cannot send this bot commands through DM.\nBot created by Fre_d +helpDocsLocation=Documentation can be found at\: +helpBotInvite=Want to add FredBoat to your server? If you have Manage Server permissions for your guild, you can invite FredBoat\: +helpHangoutInvite=Need help or have any ideas for FredBoat? Perhaps you just want to hang out? Join the FredBoat community\! +helpNoDmCommands=You cannot send FredBoat commands through DMs. +helpCredits=Created by Fre_d and open source contributors helpSent={0}\: \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u0435 \u0438\u0437\u043f\u0440\u0430\u0442\u0435\u043d\u0430 \u0434\u043e \u0432\u0430\u0448\u0438\u0442\u0435 \u043b\u0438\u0447\u043d\u0438 \u0441\u044a\u043e\u0431\u0449\u0435\u043d\u0438\u044f\! helpProperUsage=\u041f\u0440\u0430\u0432\u0438\u043b\u043d\u043e\u0442\u043e \u043f\u043e\u043b\u0437\u0432\u0430\u043d\u0435\: helpCommandOwnerRestricted=\u0422\u0430\u0437\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0441\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0430\u0432\u0430 \u0434\u043e \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u0438\u043a\u0430 \u043d\u0430 \u0431\u043e\u0442\u0430. diff --git a/FredBoat/src/main/resources/lang/bn_BD.properties b/FredBoat/src/main/resources/lang/bn_BD.properties new file mode 100644 index 000000000..a2e81a5a2 --- /dev/null +++ b/FredBoat/src/main/resources/lang/bn_BD.properties @@ -0,0 +1,305 @@ +#X-Generator: crowdin.com +playQueueEmpty=\u0996\u09c7\u09b2\u09cb\u09af\u09bc\u09be\u09a1\u09bc \u09ac\u09b0\u09cd\u09a4\u09ae\u09be\u09a8\u09c7 \u0995\u09cb\u09a8 \u0996\u09c7\u09b2\u09be \u09a8\u09af\u09bc\u0964 \u0997\u09be\u09a8 \u09af\u09cb\u0997 \u0995\u09b0\u09c1\u09a8 \u09a8\u09bf\u09ae\u09cd\u09a8\u09c7\u09b0 \u09ac\u09be\u0995\u09cd\u09af\u09b0\u09c0\u09a4\u09bf \u09ac\u09cd\u09af\u09ac\u09b9\u09be\u09b0 \u0995\u09b0\u09c1\u09a8\u0964\u0964\u0964\: ;;\u0996\u09c7\u09b2\u09be +playAlreadyPlaying=\u0987\u099f \u0987\u09b8 \u0985\u09b2\u09b0\u09c7\u09a1\u09bf \u09aa\u09cd\u09b2\u09c7\u09df\u09bf\u0982. +playVCEmpty=\u09ad\u09af\u09bc\u09c7\u09b8 \u099a\u09cd\u09af\u09be\u099f\u09c7 \u0995\u09cb\u09a8 \u09ac\u09cd\u09af\u09ac\u09b9\u09be\u09b0\u0995\u09be\u09b0\u09c0. +playWillNowPlay=\u09aa\u09cd\u09b2\u09c7\u09af\u09bc\u09be\u09b0 \u098f\u0996\u09a8 \u0996\u09c7\u09b2\u09be \u09b9\u09ac\u09c7. +playSearching=\u09b2\u09c1\u0995\u09bf\u0982 \u09ab\u09b0 `{q}`\u0987\u09a8 YouTube... +playYoutubeSearchError=\u0987\u0989\u099f\u09bf\u0989\u09ac \u09b8\u09a8\u09cd\u09a7\u09be\u09a8 \u0995\u09b0\u09be\u09b0 \u09b8\u09ae\u09af\u09bc \u098f\u0995\u099f\u09bf \u09a4\u09cd\u09b0\u09c1\u099f\u09bf \u09b8\u0982\u0998\u099f\u09bf\u09a4 \u09b9\u09af\u09bc\u09c7\u099b\u09c7\u0964 \u098f\u09b0 \u09aa\u09b0\u09bf\u09ac\u09b0\u09cd\u09a4\u09c7 \u09b8\u09b0\u09be\u09b8\u09b0\u09bf \u0985\u09a1\u09bf\u0993 \u0989\u09ce\u09b8\u09c7\u09b0 \u09b8\u09be\u09a5\u09c7 \u09ac\u09bf\u09ac\u09c7\u099a\u09a8\u09be \u0995\u09b0\u09ac\u09cb\u0964 ``` ;; \u0996\u09c7\u09b2\u09be "\u0964 +playSearchNoResults=''{q}''-\u098f\u09b0 \u099c\u09a8\u09cd\u09af \u0995\u09cb\u09a8\u09cb \u09ab\u09b2\u09be\u09ab\u09b2 \u09a8\u09c7\u0987 +playSelectVideo=* * \u09a6\u09af\u09bc\u09be \u0995\u09b0\u09c7 \u099f\u09cd\u09b0\u09cd\u09af\u09be\u0995 \u09a6\u09bf\u09af\u09bc\u09c7 \u09a8\u09bf\u09b0\u09cd\u09ac\u09be\u099a\u09a8 ''{0}play 1-5'' \u0995\u09ae\u09be\u09a8\u09cd\u09a1\: * * +joinJoining=\u098f\u09a8\u09cd\u099f\u09be\u09b0\u09bf\u0982 {0} +joinErrorAlreadyJoining=\u098f\u0995\u099f\u09bf \u09a4\u09cd\u09b0\u09c1\u099f\u09bf \u09b8\u0982\u0998\u099f\u09bf\u09a4 \u09b9\u09af\u09bc\u09c7\u099b\u09c7\u0964 {0} \u09af\u09cb\u0997 \u09a6\u09bf\u09a4\u09c7 \u09aa\u09be\u09b0\u09b2\u09be\u09ae \u09a8\u09be \u0995\u09be\u09b0\u09a8 \u0986\u09ae\u09bf \u0987\u09a4\u09bf\u09ae\u09a7\u09cd\u09af\u09c7\u0987 \u0993\u0987 \u099a\u09cd\u09af\u09be\u09a8\u09c7\u09b2\u09c7\u09b0 \u09b8\u09be\u09a5\u09c7 \u09b8\u0982\u09af\u09cb\u0997 \u0995\u09b0\u09be\u09b0 \u099a\u09c7\u09b7\u09cd\u099f\u09be \u0995\u09b0\u099b\u09bf\u0964 \u0985\u09a8\u09c1\u0997\u09cd\u09b0\u09b9 \u0995\u09b0\u09c7 \u0986\u09ac\u09be\u09b0 \u099a\u09c7\u09b7\u09cd\u099f\u09be \u0995\u09b0\u09c1\u09a8\u0964. +pauseAlreadyPaused=\u09aa\u09cd\u09b2\u09c7\u09af\u09bc\u09be\u09b0 \u0987\u09a4\u09bf\u09ae\u09a7\u09cd\u09af\u09c7 \u09a5\u09be\u09ae\u09be\u09a8\u09cb \u09b9\u09af\u09bc\u09c7\u099b\u09c7. +pauseSuccess=\u0996\u09c7\u09b2\u09cb\u09af\u09bc\u09be\u09a1\u09bc \u098f\u0996\u09a8 \u09b9\u09a4\u09c7 \u09ac\u09bf\u09b0\u09a4 \u09b0\u09be\u0996\u09be \u09b9\u09af\u09bc\u09c7\u099b\u09c7\u0964 \u0986\u09aa\u09a8\u09bf \u098f\u099f\u09bf{0}unpause \u09b8\u09be\u09a5\u09c7 unpause \u0995\u09b0\u09a4\u09c7 \u09aa\u09be\u09b0\u09c7\u09a8\u0964. +repeatOnSingle=\u09ac\u09b0\u09cd\u09a4\u09ae\u09be\u09a8 \u099f\u09cd\u09b0\u09cd\u09af\u09be\u0995 \u0996\u09c7\u09b2\u09cb\u09af\u09bc\u09be\u09a1\u09bc \u098f\u0996\u09a8 \u09aa\u09c1\u09a8\u09b0\u09be\u09ac\u09c3\u09a4\u09cd\u09a4\u09bf \u09b9\u09ac\u09c7\u0964. +repeatOnAll=\u09a8\u09be\u0989 \u09b0\u09bf\u09aa\u09bf\u099f\u09bf\u0982. +repeatOff=\u09b0\u09bf\u09aa\u09bf\u099f\u09bf\u0982 \u09b8\u09cd\u099f\u09aa\u09c7\u09a1. +selectSuccess=\u09b8\u0982 **\#{0}** \u09b8\u09bf\u09b2\u09c7\u0995\u09cd\u099f\u09c7\u09a1\: **{1}** ({2}) +selectInterval=\u09b8\u0982\u0996\u09cd\u09af\u09be\u099f\u09bf \u09b9\u09b2 1-{0}. +selectSelectionNotGiven=\u0986\u09aa\u09a8\u09bf \u09aa\u09cd\u09b0\u09a5\u09ae \u09a5\u09c7\u0995\u09c7 \u09aa\u099b\u09a8\u09cd\u09a6 \u0995\u09b0\u09c7 \u09a8\u09bf\u09a8 \u09a8\u09bf\u09b0\u09cd\u09ac\u09be\u099a\u09a8 \u09a6\u09c7\u0993\u09af\u09bc\u09be \u0989\u099a\u09bf\u09a4\u0964 +shuffleOn=\u09b8\u09cd\u09ac\u09aa \u0995\u09ae\u09aa\u09cd\u09b2\u09bf\u099f +shuffleOff=\u09b8\u09cd\u09ac\u09aa \u0995\u09ae\u09aa\u09cd\u09b2\u09bf\u099f. +reshufflePlaylist=\u09b8\u09be\u09b0\u09bf \u09b8\u09cd\u09a5\u09b2\u09c7\u0964. +reshufflePlayerNotShuffling=\u0986\u09aa\u09a8\u09bf \u09aa\u09cd\u09b0\u09a5\u09ae\u09c7 \u0993\u09b2\u099f\u09aa\u09be\u09b2\u099f \u0995\u09b0\u09be\u09b0 \u09ae\u09cb\u09a1 \u098f \u099a\u09be\u09b2\u09c1 \u0995\u09b0\u09a4\u09c7 \u09b9\u09ac\u09c7\u0964. +skipEmpty=\u0987\u099f \u0987\u099c \u098f\u09ae\u09cd\u09aa\u099f\u09bf\! +skipOutOfBounds=\u099f\u09cd\u09b0\u09cd\u09af\u09be\u0995 \u09a8\u09ae\u09cd\u09ac\u09b0 {0} \u09af\u0996\u09a8 {1} \u099f\u09cd\u09b0\u09be\u0995 \u098f\u0995\u09ae\u09be\u09a4\u09cd\u09b0 \u0985\u09aa\u09b8\u09be\u09b0\u09a3 \u0995\u09b0\u09a4\u09c7 \u09aa\u09be\u09b0\u099b\u09bf \u09a8\u09be\u0964. +skipNumberTooLow=\u09a8\u09ae\u09cd\u09ac\u09b0 \u09a6\u09c7\u0993\u09af\u09bc\u09be 0 \u099a\u09c7\u09af\u09bc\u09c7 \u09ac\u09c7\u09b6\u09bf \u09b9\u09ac\u09c7\u0964\! +skipSuccess=\u099f\u09cd\u09b0\u09cd\u09af\u09be\u0995 \#{0} \u098f\u09a1\u09bc\u09bf\u09af\u09bc\u09c7 \u09af\u09be\u0993\u09af\u09bc\u09be, * *{1} * * +skipRangeInvalid=Specified track range is invalid. +skipRangeSuccess=Tracks \#{0} to \#{1} have been removed. +skipTrackNotFound=Couldn't find track to skip. +stopAlreadyEmpty=The queue was already empty. +stopEmptyOne=The queue has been emptied, `1` track has been removed. +stopEmptySeveral=The queue has been emptied, `{0}` tracks have been removed. +stopAccessDenied=In order to prevent abuse, this command is only available to those who can manage messages. +unpauseQueueEmpty=The queue is empty. +unpausePlayerNotPaused=The player is not paused. +unpauseNoUsers=There are no users in the voice chat. +unpauseSuccess=The player is now unpaused. +volumeApology=Sorry\! The ;;volume command has now been deprecated on the public music bot. This is because of how it causes the bot to spend a lot more time processing audio, some tracks up to 5 times more, causing everyone to hear stutter. By disabling this feature FredBoat can play much more music without lag.\nI recommend setting the bot's volume via the dropdown menu https\://fred.moe/1vD.png +volumeSyntax=Use `;;volume <0-150>`. {0}% is the default.\nThe player is currently at **{1}%**. +volumeSuccess=Changed volume from **{0}%** to **{1}%**. +exportEmpty=Nothing to export, the queue is empty. +exportPlaylistResulted=Exported playlist\: {0}\nYou can provide this URL to play the current playlist later. +exportPlaylistFail=Failed to upload playlist to hastebin.com +listShowShuffled=Showing shuffled playlist. +listShowRepeatSingle=Repeating current track. +listShowRepeatAll=Repeating current queue. +listShowHistory=Showing tracks in history. +listAddedBy=**{0}** added by **{1}** `[{2}]` +listStreamsOnlySingle=There is **{0}** live {1} in the queue. +listStreamsOnlyMultiple=There are **{0}** live {1} in the queue. +listStreamsOrTracksSingle=There is **{0}** {1} with a remaining length of **[{2}]**{3} in the queue. +listStreamsOrTracksMultiple=There are **{0}** {1} with a remaining length of **[{2}]**{3} in the queue. +streamSingular=stream +streamPlural=streams +listAsWellAsLiveStreams=, as well as **{0}** live {1} +trackSingular=track +trackPlural=tracks +npNotPlaying=Not currently playing anything. +npNotInHistory=Currently no tracks in history. +npDescription=Description +npLoadedSoundcloud=[{0}/{1}]\n\nLoaded from Soundcloud +npLoadedBandcamp={0}\n\nLoaded from Bandcamp +npLoadedTwitch=Loaded from Twitch +permissionMissingBot=I need the following permission to perform that action\: +permissionEmbedLinks=Embed Links +rating=Rating +listeners=Listeners +year=Year +album=Album +artist=Artist +circle=Circle +npLoadedFromHTTP={0}\n\nLoaded from {1} +npLoadedDefault={0}\n\nLoaded from {1} +noneYet=None yet +npRatingRange={0}/5 from {1} vote(s) +fwdSuccess=Forwarding **{0}** by {1}. +restartSuccess=**{0}** has been restarted. +queueEmpty=The queue is empty. +rewSuccess=Rewinding **{0}** by {1}. +seekSuccess=Seeking **{0}** to {1}. +seekDeniedLiveTrack=You can't seek a live track. +loadPlaySplitListFail=That link leads to a playlist, not a track. Try `;;play` instead. +loadListSuccess=Found and added `{0}` songs from playlist **{1}**. +loadNoMatches=No audio could be found for `{0}`. +loadSplitNotYouTube=This is not a YouTube track. Only YouTube tracks are supported with the `;;split` command. Try using `;;play` instead. +loadSplitNotResolves=Couldn't resolve that video's tracklist. Try using `;;play` instead. +loadFollowingTracksAdded=The following tracks were added\: +loadPlaylistTooMany=Added {0} tracks. Found too many tracks to display. +loadErrorCommon=Error occurred when loading info for `{0}`\:\n{1} +loadErrorSusp=Suspicious error when loading info for `{0}`. +loadQueueTrackLimit=You can''t add tracks to a queue with more than {0} tracks\! This is to prevent abuse. +loadAnnouncePlaylist=About to load playlist **{0}** with up to `{1}` tracks. This may take a while, please be patient. +playerUserNotInChannel=You must join a voice channel first. +playerJoinConnectDenied=I am not permitted to connect to that voice channel. +playerJoinSpeakDenied=I am not permitted to play music in that voice channel. +playerNotInChannel=Not currently in a channel. +playerLeftChannel=Left channel {0}. +shutdownUpdating=FredBoat\u266a\u266a is updating. This should only take a minute and will reload the current playlist. +shutdownRestarting=FredBoat\u266a\u266a is restarting. This should only take a minute and will reload the current playlist. +shutdownIndef=FredBoat\u266a\u266a is shutting down. Once the bot comes back the current playlist will reload. +shutdownPersistenceFail=Error occurred when saving persistence file\: {0} +reloadSuccess=Reloading playlist. `{0}` tracks found. +trackAnnounce=Now playing **{0}**. +cmdAccessDenied=You are not allowed to use that command\! +utilErrorOccurred=\ an error occured \:anger\: ```java\n{0}\n +errorOccurredTooLong=An error occurred \:anger\: Error was too long to display.\n{0}.txt +errorOccurredTooLongAndUnirestException=An error occurred \:anger\: Was too long and was unable to post to Hastebin\! +malRevealAnime={0}\: Search revealed an anime.\n +malTitle={0}**Title\: **{1}\n +malEnglishTitle={0}**English\: **{1}\n +malSynonyms={0}**Synonyms\: **{1}\n +malEpisodes={0}**Episodes\: **{1}\n +malScore={0}**Score\: **{1}\n +malType={0}**Type\: **{1}\n +malStatus={0}**Status\: **{1}\n +malStartDate={0}**Start date\: **{1}\n +malEndDate={0}**End date\: **{1} +malSynopsis={0}**Synopsis\: **"{1}"\n +malUserReveal={0}\: Search revealed a user.\n +malNoResults={0}\: No results. +malUserName={0}**Name\: **{1}\n +malUrl={0}**URL\: **{1}\n +luaError=\ A Lua error occured \:anger\:\n```{0}``` +luaErrorOutputTooBig=\ Output buffer is too large \:anger\: Discord only allows 2000 characters per message, got {0} +luaTimeout=\ Function timed out \:anger\: allowed computation time is {0} seconds. +helpSuccess=Documentation has been sent to your direct messages\! +helpDmFailed=Could not send documentation to your DMs. Please check that you don't have them disabled\! +helpCommandsPromotion=Say {0} to learn what this bot can do\! +fuzzyNoResults=No such users +brainfuckCycleLimit=Program exceeded the maximum cycle count of {0} +brainfuckDataPointerOutOfBounds=Data pointer out of bounds\: {0} +brainfuckInputOOB=Input out of bounds at position\: {0} +brainfuckNoOutput=\ There was no output +weatherLocationNotFound=Unable to find location, please check your input {0}. +weatherError=Error retrieving weather for {0} +avatarSuccess=\ found it\n{0} +configNoArgs=Configuration for **{0}**\:``` +configSetTo=is now set to `{0}`. +configUnknownKey={0}\: Unknown key. +configMustBeBoolean={0}\: Value must be true or false. +modReason=Reason +modAuditLogMessage=Action issued by {0}\#{1} [{2}] +modFailUserHierarchy=You do not have a higher role than {0}. +modFailBotHierarchy=I need to have a higher role than {0}. +modBanFail=Failed to ban {0} +modKickBanFailUserPerms=You must have permission to kick and ban to be able to use this command. +modBanBotPerms=I need to have permission to ban members. +modKickBotPerms=I need to have permission to kick members. +kickSuccess=User {0}\#{1} [{2}] has been kicked. +kickFail=Failed to kick {0} +kickFailSelf=You can't kick yourself. +kickFailOwner=You can't kick the server owner. +kickFailMyself=I can't kick myself. +kickFailUserPerms=You must have permission to kick to be able to use this command. +softbanSuccess=User {0}\#{1} [{2}] has been softbanned. +softbanFailSelf=You can't softban yourself. +softbanFailOwner=You can't softban the server owner. +softbanFailMyself=I can't softban myself. +hardbanSuccess=User {0}\#{1} [{2}] has been banned. +hardbanFailSelf=You can't ban yourself. +hardbanFailOwner=You can't ban the server owner. +hardbanFailMyself=I can't ban myself. +getidSuccess=The id of this guild is {0}. The id of this text channel is {1}. +statsParagraph=\ This bot has been running for {0} days, {1} hours, {2} minutes and {3} seconds.\nThis bot has executed {4} commands this session. +statsRate={0}That''s a rate of {1} commands per hour +catgirlFail=Failed to extract image from {0} +catgirlFailConn=Failed to connect to {0} +hugBot=Thanks for the hugs \:blush\: +hugSuccess=Hugs {0}. +patBot=Thanks for the pats \:blush\: +patSuccess=Pats {0}. +rollSuccess={0} rolls around on the floor. +facedeskSuccess={0} facedesks. +langInvalidCode=The language code {0} doesn''t exist or is unsupported. +langSuccess=Switched to speaking {0}. +langInfo=FredBoat supports several user-contributed languages that you can select with this command. Admins on this server can select a language with `;;lang ` Here is the full list of supported languages\: +langDisclaimer=Translations may not be 100% accurate or complete. Missing translations may be contributed at . +loadSingleTrack=**{0}** has been added to the queue. +loadSingleTrackAndPlay=**{0}** will now play. +invite=Invite link for **{0}**\: +ratelimitedGeneralInfo=You are being rate limited\! Please slow down. +ratelimitedSkipCommand=You can skip more than one song by using this command\: {0} +ratelimitedGuildSlowLoadingPlaylist=This server is not allowed to add more playlists at this moment. Please don't spam long playlists. +unblacklisted=Removed {0} from the blacklist. +serverinfoTitle=Info about {0}\: +serverinfoOnlineUsers=Online Users\: +serverinfoTotalUsers=Total Users\: +serverinfoRoles=Roles\: +serverinfoText=Text Channels\: +serverinfoVoice=Voice Channels\: +serverinfoGuildID=Guild ID\: +serverinfoCreationDate=Creation Date\: +serverinfoOwner=Owner\: +serverinfoVLv=Verification Level\: +userinfoTitle=Information about {0}\: +userinfoUsername=Username\: +userinfoId=ID\: +userinfoNick=Nickname\: +userinfoKnownServer=Known Servers\: +userinfoJoinDate=Join Date\: +userinfoCreationTime=Creation Date\: +userinfoBlacklisted=Blacklisted\: +skipDeniedTooManyTracks=You can't skip someone else's tracks if you are not a DJ.\nConsider using the Voteskip command. +eventUsersLeftVC=All users have left the voice channel. The player has been paused. +eventAutoResumed=User presence detected, automatically resuming the player. +commandsFun=Fun +commandsMemes=Memes +commandsUtility=Utility +commandsModeration=Moderation +commandsMaintenance=Maintenance +commandsBotOwner=Bot owner +commandsMoreHelp=Say {0} to get more information on a specific command. +helpUnknownCommand=Unknown command. +helpDocsLocation=Documentation can be found at\: +helpBotInvite=Want to add FredBoat to your server? If you have Manage Server permissions for your guild, you can invite FredBoat\: +helpHangoutInvite=Need help or have any ideas for FredBoat? Perhaps you just want to hang out? Join the FredBoat community\! +helpNoDmCommands=You cannot send FredBoat commands through DMs. +helpCredits=Created by Fre_d and open source contributors +helpSent=Documentation has been sent to your DMs\! +helpProperUsage=Proper usage\: +helpCommandOwnerRestricted=This command is restricted to the owner of the bot. +helpConfigCommand=Show the config of this guild or adjust settings. +helpLanguageCommand=Show available languages or set a language for this guild. +helpHardbanCommand=Ban a user and delete his messages from the last 7 days. +helpKickCommand=Kick a user from this guild. +helpSoftbanCommand=Softban a user by kicking him and deleting his messages from the last 7 days. +helpMusicCommandsHeader=FredBoat Music Commands +helpJoinCommand=Make the bot join your current voice channel. +helpLeaveCommand=Make the bot leave the current voice channel. +helpPauseCommand=Pause the player. +helpPlayCommand=Play music from the given URL or search for a track. For a full list of sources please visit {0} +helpPlaySplitCommand=Split a YouTube video into a tracklist provided in it's description. +helpRepeatCommand=Toggle between repeat modes. +helpReshuffleCommand=Reshuffle the current queue. +helpSelectCommand=Select one of the offered tracks after a search to play. +helpShuffleCommand=Toggle shuffle mode for the current queue. +helpSkipCommand=Skip the current song, the n'th song in the queue, all songs from n to m, or all songs from mentioned users. Please use in moderation. +helpStopCommand=Stop the player and clear the playlist. Reserved for moderators with Manage Messages permission. +helpUnpauseCommand=Unpause the player. +helpVolumeCommand=Changes the volume. Values are 0-150 and 100 is the default. The volume command is deprecated on the public bot. +helpExportCommand=Export the current queue to a hastebin link, can be later used as a playlist. +helpGensokyoRadioCommand=Show the current song played on gensokyoradio.net +helpListCommand=Display a list of the current songs in the playlist. +helpHistoryCommand=Display a list of the songs in playlist history. +helpNowplayingCommand=Display the currently playing song. +helpForwardCommand=Forward the track by a given amount of time. Example\: +helpRestartCommand=Restart the currently playing track. +helpRewindCommand=Rewind the track by a given amount of time. Example\: +helpSeekCommand=Set the position of the track to the given time. Example\: +helpAvatarCommand=Display the avatar of a user. +helpBrainfuckCommand=Executes Brainfuck code. Example\: +helpWeatherCommand=Display current weather by location. +helpClearCommand=Delete all messages by this bot in the last 50 messages of this channel. +helpCommandsCommand=Show available commands. +helpHelpCommand=Receive help for this bot or help for any command. +helpInviteCommand=Post invite link for this bot. +helpMALCommand=Search MyAnimeList and display an anime or profile of a user. +helpMusicHelpCommand=Show music commands and their usage. +helpSayCommand=Make the bot echo something. +helpServerInfoCommand=Display some stats about this guild. +helpUserInfoCommand=Display information about yourself or a user known to the bot. +helpPerms=Allows whitelisting members and roles for the {0} rank. +helpPrefixCommand=Set the prefix for this guild. +helpVoteSkip=Vote to skip the current song. Needs 50% of all users in the voice chat to vote. +helpMathOperationAdd=Print the sum of num1 and num2. +helpMathOperationSub=Print the difference of subtracting num2 from num1. +helpMathOperationMult=Print the product of num1*num2. +helpMathOperationDiv=Print the quotient of dividing num1 by num2. +helpMathOperationMod=Print the remainder of dividing num1 by num2. +helpMathOperationPerc=Print the percentage represented by num1 in num2. +helpMathOperationSqrt=Print the square root of num. +helpMathOperationPow=Print the result of num1^num2. +destroyDenied=You must have the manage messages permission to reset the player. +destroyHelp=Reset the player and clear the playlist. Reserved for moderators with Manage Messages permission. +destroySucc=Reset the player and cleared the queue. +listPageNum=Page **{0}** of **{1}**. +permsListTitle=Users and roles with the {0} permissions +permsAdded=Added `{0}` to `{1}`. +permsRemoved=Removed `{0}` from `{1}`. +permsFailSelfDemotion=You cannot remove this as it would render you without admin permissions\! +permsAlreadyAdded={0} already added to {1} +permsNotAdded={0} is not in {1} +fuzzyMultiple=Multiple items were found. Did you mean any of these? +fuzzyNothingFound=Nothing found for `{0}`. +cmdPermsTooLow=You don''t have permission to run this command\! This command requires `{0}` but you only have `{1}`. +playersLimited=FredBoat is currently at maximum capacity\! The bot is currently fixed to only play up to `{0}` streams, otherwise we would risk disconnecting from Discord under the network load.\nIf you want to help us increase the limit or you want to use our non-overcrowded bot, please support our work on Patreon\:\n{1}\n\nSorry for the inconvenience\! You might want to try again later. This message usually only appears at peak time. +tryLater=Please try again later. +skipUserSingle=Skipped {0} added by {1}. +skipUserMultiple=Skipped {0} tracks added by {1}. +skipUsersMultiple=Skipped {0} tracks added by {1} users. +skipUserNoTracks=None of the mentioned users have any tracks queued. +voteSkipAdded=Your vote has been added\! +voteSkipAlreadyVoted=You already voted to skip this track\! +voteSkipSkipping={0} have voted to skip. Skipping track {1}. +voteSkipNotEnough={0} have voted to skip. At least {1} needed. +voteSkipEmbedNoVotes=No votes to skip this track yet. +voteSkipEmbedVoters={0} out of {1} have voted to skip the current track +mathOperationResult=The result is +mathOperationDivisionByZeroError=I cannot divide by zero. +mathOperationInfinity=The number is too big to be displayed\! +prefix=Prefix +prefixGuild=The prefix for this guild is {0} +prefixShowAgain=You can show the prefix anytime again by mentioning me. + diff --git a/FredBoat/src/main/resources/lang/ca_ES.properties b/FredBoat/src/main/resources/lang/ca_ES.properties index 4de1033a1..a437e2251 100644 --- a/FredBoat/src/main/resources/lang/ca_ES.properties +++ b/FredBoat/src/main/resources/lang/ca_ES.properties @@ -183,7 +183,7 @@ ratelimitedGeneralInfo=You are being rate limited\! Please slow down. ratelimitedSkipCommand=You can skip more than one song by using this command\: {0} ratelimitedGuildSlowLoadingPlaylist=This server is not allowed to add more playlists at this moment. Please don't spam long playlists. unblacklisted=Removed {0} from the blacklist. -serverinfoTitle=Informaci\u00f3 sobre ''{0}''\: +serverinfoTitle=Info about {0}\: serverinfoOnlineUsers=Usuaris en l\u00ednia\: serverinfoTotalUsers=Usuaris totals serverinfoRoles=Rols\: @@ -193,7 +193,7 @@ serverinfoGuildID=Guild ID\: serverinfoCreationDate=Data de Creaci\u00f3\: serverinfoOwner=Propietari\: serverinfoVLv=Verification Level\: -userinfoTitle=Informaci\u00f3 sobre ''{0}''\: +userinfoTitle=Information about {0}\: userinfoUsername=Nom d'usuari/a\: userinfoId=ID\: userinfoNick=\u00c0lies\: @@ -212,7 +212,11 @@ commandsMaintenance=Maintenance commandsBotOwner=Bot owner commandsMoreHelp=Say {0} to get more information on a specific command. helpUnknownCommand=Unknown command. -helpDM=Documentation can be found at\:\nhttps\://fredboat.com/docs\n\nWant to add FredBoat to your server? If you have Manage Server permissions for your guild, you can invite it here\:\n*This one doesn''t play music*\n\n\nIf you want to add the music bot, you will want to invite this bot\:\n\n\nNeed help or have any ideas for the bot? Perhaps you just want to hang out? Come on over to FredBoat hangout\!\n{0}\n\nYou cannot send this bot commands through DM.\nBot created by Fre_d +helpDocsLocation=Documentation can be found at\: +helpBotInvite=Want to add FredBoat to your server? If you have Manage Server permissions for your guild, you can invite FredBoat\: +helpHangoutInvite=Need help or have any ideas for FredBoat? Perhaps you just want to hang out? Join the FredBoat community\! +helpNoDmCommands=You cannot send FredBoat commands through DMs. +helpCredits=Created by Fre_d and open source contributors helpSent=Documentation has been sent to your DMs\! helpProperUsage=Proper usage\: helpCommandOwnerRestricted=This command is restricted to the owner of the bot. diff --git a/FredBoat/src/main/resources/lang/cs_CZ.properties b/FredBoat/src/main/resources/lang/cs_CZ.properties index 7504fa382..66167e045 100644 --- a/FredBoat/src/main/resources/lang/cs_CZ.properties +++ b/FredBoat/src/main/resources/lang/cs_CZ.properties @@ -183,7 +183,7 @@ ratelimitedGeneralInfo=You are being rate limited\! Please slow down. ratelimitedSkipCommand=You can skip more than one song by using this command\: {0} ratelimitedGuildSlowLoadingPlaylist=This server is not allowed to add more playlists at this moment. Please don't spam long playlists. unblacklisted=Removed {0} from the blacklist. -serverinfoTitle=Informace o **{0}**\: +serverinfoTitle=Info about {0}\: serverinfoOnlineUsers=Online u\u017eivatel\u016f\: serverinfoTotalUsers=Celkem u\u017eivatel\u016f\: serverinfoRoles=Role\: @@ -193,7 +193,7 @@ serverinfoGuildID=Guild ID\: serverinfoCreationDate=Datum vytvo\u0159en\u00ed\: serverinfoOwner=Vlastn\u00edk\: serverinfoVLv=Verification Level\: -userinfoTitle=Informace o **{0}**\: +userinfoTitle=Information about {0}\: userinfoUsername=U\u017eivatelsk\u00e9 jm\u00e9no\: userinfoId=ID\: userinfoNick=P\u0159ezd\u00edvka\: @@ -212,7 +212,11 @@ commandsMaintenance=\u00dadr\u017eba commandsBotOwner=Vlastn\u00edk bota commandsMoreHelp=Say {0} to get more information on a specific command. helpUnknownCommand=Nezn\u00e1m\u00fd p\u0159\u00edkaz. -helpDM=Documentation can be found at\:\nhttps\://fredboat.com/docs\n\nWant to add FredBoat to your server? If you have Manage Server permissions for your guild, you can invite it here\:\n*This one doesn''t play music*\n\n\nIf you want to add the music bot, you will want to invite this bot\:\n\n\nNeed help or have any ideas for the bot? Perhaps you just want to hang out? Come on over to FredBoat hangout\!\n{0}\n\nYou cannot send this bot commands through DM.\nBot created by Fre_d +helpDocsLocation=Documentation can be found at\: +helpBotInvite=Want to add FredBoat to your server? If you have Manage Server permissions for your guild, you can invite FredBoat\: +helpHangoutInvite=Need help or have any ideas for FredBoat? Perhaps you just want to hang out? Join the FredBoat community\! +helpNoDmCommands=You cannot send FredBoat commands through DMs. +helpCredits=Created by Fre_d and open source contributors helpSent=Documentation has been sent to your DMs\! helpProperUsage=Spr\u00e1vn\u00e9 pou\u017eit\u00ed\: helpCommandOwnerRestricted=This command is restricted to the owner of the bot. diff --git a/FredBoat/src/main/resources/lang/cy_GB.properties b/FredBoat/src/main/resources/lang/cy_GB.properties index 1d9a22deb..eff733512 100644 --- a/FredBoat/src/main/resources/lang/cy_GB.properties +++ b/FredBoat/src/main/resources/lang/cy_GB.properties @@ -183,7 +183,7 @@ ratelimitedGeneralInfo=Yr ydych yn gyfradd cyfyngedig\! Os gwelwch yn dda yn ara ratelimitedSkipCommand=Gall anwybyddu''r mwy nag un g\u00e2n gan ddefnyddio Gorchymyn hwn\: {0} ratelimitedGuildSlowLoadingPlaylist=Ni chaiff y gweinydd hwn i ychwanegu rhestri chwarae mwy ar hyn o bryd. Os gwelwch yn dda Peidiwch \u00e2 sbam rhestri chwarae hir. unblacklisted={0} wedi ei dynnu oddi wrth y chynaliadwy. -serverinfoTitle=Gwybodaeth am **{0} **\: +serverinfoTitle=Info about {0}\: serverinfoOnlineUsers=Defnyddwyr ar-lein\: serverinfoTotalUsers=Cyfanswm defnyddwyr\: serverinfoRoles=Swyddogaethau\: @@ -193,7 +193,7 @@ serverinfoGuildID=Urdd ID\: serverinfoCreationDate=Dyddiad creu\: serverinfoOwner=Perchennog\: serverinfoVLv=Gwirio lefel\: -userinfoTitle=Gwybodaeth am **{0} **\: +userinfoTitle=Information about {0}\: userinfoUsername=Enw defnyddiwr\: userinfoId=ID\: userinfoNick=Llysenw\: @@ -212,7 +212,11 @@ commandsMaintenance=Cynnal commandsBotOwner=Perchennog bot commandsMoreHelp=Dweud {0} i gael rhagor o wybodaeth ar Gorchymyn penodol. helpUnknownCommand=Gorchymyn anhysbys. -helpDM=Gellir dod o hyd i ddogfennau yn\:\nhttps\://fredboat.com/docs\n\nYdych chi eisiau ychwanegu FredBoat at eich gweinydd? Os oes gennych ganiat\u00e2d Rheoli Gweinyddwr ar gyfer eich urdd, gallwch ei wahodd yma\:\n* Nid yw hyn yn chwarae cerddoriaeth *\n\n\nOs ydych chi am ychwanegu''r bot cerddoriaeth, byddwch am wahodd y bot hwn\:\n\n\nAngen help neu a oes gennych unrhyw syniadau ar gyfer y bot? Efallai eich bod chi eisiau hongian allan? Dewch draw i FredBoat hangout\!\n{0}\n\nNi allwch chi anfon y gorchmynion bot yma trwy DM.\nBot wedi''i greu gan Fre_d +helpDocsLocation=Documentation can be found at\: +helpBotInvite=Want to add FredBoat to your server? If you have Manage Server permissions for your guild, you can invite FredBoat\: +helpHangoutInvite=Need help or have any ideas for FredBoat? Perhaps you just want to hang out? Join the FredBoat community\! +helpNoDmCommands=You cannot send FredBoat commands through DMs. +helpCredits=Created by Fre_d and open source contributors helpSent=Mae dogfennaeth wedi'i anfon at eich negeseuon uniongyrchol\! helpProperUsage=Defnydd priodol\: helpCommandOwnerRestricted=Gorchymyn hwn wedi'i gyfyngu i berchennog y bot. diff --git a/FredBoat/src/main/resources/lang/da_DK.properties b/FredBoat/src/main/resources/lang/da_DK.properties index 616da3de4..fdc5db773 100644 --- a/FredBoat/src/main/resources/lang/da_DK.properties +++ b/FredBoat/src/main/resources/lang/da_DK.properties @@ -45,7 +45,7 @@ exportPlaylistFail=Fejlede at uploade playlist til hastebin.com listShowShuffled=Viser blandet playlist.\n\n listShowRepeatSingle=Gentager aktuelle sang. listShowRepeatAll=Gentager nuv\u00e6rende k\u00f8. -listShowHistory=Showing tracks in history. +listShowHistory=Viser spor i historien. listAddedBy=**{0} ** tilf\u00f8jet af **{1} ** ''[{2}]'' listStreamsOnlySingle=Der er **{0}** live {1} i k\u00f8en. listStreamsOnlyMultiple=Der er **{0}** live {1} i k\u00f8en. @@ -57,7 +57,7 @@ listAsWellAsLiveStreams=, s\u00e5 vel som **{0}** live {1} trackSingular=track trackPlural=tracks npNotPlaying=Spiller i \u00f8jeblikket ikke noget. -npNotInHistory=Currently no tracks in history. +npNotInHistory=I \u00f8jeblikket ingen spor i historien. npDescription=Beskrivelse npLoadedSoundcloud=[{0}/{1}]\nIndl\u00e6st fra Soundcloud npLoadedBandcamp={0}\n\nIndl\u00e6st fra Bandcamp @@ -79,7 +79,7 @@ restartSuccess=**{0}** er blevet genstartet. queueEmpty=K\u00f8en er tom. rewSuccess=Tilbagespoler **{0}** med {1}. seekSuccess=Spoler **{0}** til {1}. -seekDeniedLiveTrack=You can't seek a live track. +seekDeniedLiveTrack=Du kan ikke s\u00f8ge et live spor. loadPlaySplitListFail=Dette link f\u00f8rer til en afspilningsliste, ikke et spor. Pr\u00f8v `;;play` i stedet. loadListSuccess=Fandt og tilf\u00f8jede ''{0}'' sange fra playlisten **{1} **. loadNoMatches=Ingen lyd kunne findes for ''{0}''. @@ -125,15 +125,15 @@ luaError=\ Opstod en fejl i Lua \:anger\: ''''''{0} '''''' luaErrorOutputTooBig=\ Outputbuffer er for stor \:anger\: Discord tillader kun 2000 tegn pr. besked, fik {0} luaTimeout=\ Funktionen timeout \:anger\: tilladt computation tid er {0} sekunder. helpSuccess=Dokumentation er blevet sendt til dine direkte meddelelser\! -helpDmFailed=Could not send documentation to your DMs. Please check that you don't have them disabled\! +helpDmFailed=Kunne ikke sende dokumentationen til DMs. Kontroller, at du ikke har deaktiveret dem\! helpCommandsPromotion=Sig {0} for at f\u00e5 at vide hvad denne bot kan g\u00f8re\! fuzzyNoResults=Ingen s\u00e5danne brugere brainfuckCycleLimit=Programet overskrev det maksimale antal cyklusser af {0} brainfuckDataPointerOutOfBounds=Data pointer out of bounds\: {0} brainfuckInputOOB=Input out of bounds p\u00e5 position\: {0} brainfuckNoOutput=\ Der var ingen output -weatherLocationNotFound=Unable to find location, please check your input {0}. -weatherError=Error retrieving weather for {0} +weatherLocationNotFound=Kan ikke finde lokation, tjek venligst dit input {0}. +weatherError=Fejl under hentning af vejret for {0} avatarSuccess=\ fandt den\n{0} configNoArgs=Konfiguration for **{0} **\:'''' '' configSetTo=er nu sat til ''{0}''. @@ -183,7 +183,7 @@ ratelimitedGeneralInfo=Du bliver bredb\u00e5nds begr\u00e6nset\! S\u00e6t venlig ratelimitedSkipCommand=Du kan springe over flere sange ved hj\u00e6lp af kommandoen\: {0} ratelimitedGuildSlowLoadingPlaylist=Denne server har ikke tilladelse til at tilf\u00f8je flere spillelister p\u00e5 dette tidspunkt. Venligst, ikke spam lange spillelister. unblacklisted=Fjernede {0} fra blacklist. -serverinfoTitle=Info om **{0} **\: +serverinfoTitle=Info about {0}\: serverinfoOnlineUsers=Online brugere\: serverinfoTotalUsers=Antal brugere\: serverinfoRoles=Roller\: @@ -193,7 +193,7 @@ serverinfoGuildID=Guild ID\: serverinfoCreationDate=Oprettelsesdato\: serverinfoOwner=Ejer\: serverinfoVLv=Verifikation niveau\: -userinfoTitle=Oplysninger om **{0} **\: +userinfoTitle=Information about {0}\: userinfoUsername=Brugernavn\: userinfoId=ID\: userinfoNick=Kaldenavn\: @@ -201,9 +201,9 @@ userinfoKnownServer=Kendte servere\: userinfoJoinDate=Join dato\: userinfoCreationTime=Oprettelsesdato\: userinfoBlacklisted=sortlisted"\: -skipDeniedTooManyTracks=You can't skip someone else's tracks if you are not a DJ.\nConsider using the Voteskip command. +skipDeniedTooManyTracks=Du kan ikke springe en andens spor, hvis du ikke er en DJ. Overvej at bruge kommandoen Voteskip. eventUsersLeftVC=Alle brugere har forladt tale kanalen. Musikken er midlertidigt afbrudt. -eventAutoResumed=User presence detected, automatically resuming the player. +eventAutoResumed=Bruger tilstedev\u00e6relse opdaget, automatisk genoptagelse. commandsFun=Sjov commandsMemes=Memes commandsUtility=Nytte @@ -212,7 +212,11 @@ commandsMaintenance=Vedligeholdelse commandsBotOwner=Bot ejeren commandsMoreHelp=Sig {0} for at f\u00e5 flere oplysninger om en bestemt kommando. helpUnknownCommand=Ukendt kommando. -helpDM=Documentation can be found at\:\nhttps\://fredboat.com/docs\n\nWant to add FredBoat to your server? If you have Manage Server permissions for your guild, you can invite it here\:\n*This one doesn''t play music*\n\n\nIf you want to add the music bot, you will want to invite this bot\:\n\n\nNeed help or have any ideas for the bot? Perhaps you just want to hang out? Come on over to FredBoat hangout\!\n{0}\n\nYou cannot send this bot commands through DM.\nBot created by Fre_d +helpDocsLocation=Documentation can be found at\: +helpBotInvite=Want to add FredBoat to your server? If you have Manage Server permissions for your guild, you can invite FredBoat\: +helpHangoutInvite=Need help or have any ideas for FredBoat? Perhaps you just want to hang out? Join the FredBoat community\! +helpNoDmCommands=You cannot send FredBoat commands through DMs. +helpCredits=Created by Fre_d and open source contributors helpSent=Dokumentation er blevet sendt til dine DMs\! helpProperUsage=Korrekt anvendelse\: helpCommandOwnerRestricted=Denne kommando er begr\u00e6nset til ejeren af botten. @@ -225,28 +229,28 @@ helpMusicCommandsHeader=FredBoat musik kommandoer helpJoinCommand=F\u00e5 botten til at joine din tale kanal. helpLeaveCommand=F\u00e5 botten til at leave din tale kanal. helpPauseCommand=Pause musikken. -helpPlayCommand=Play music from the given URL or search for a track. For a full list of sources please visit {0} +helpPlayCommand=Afspil musik fra den givne URL eller S\u00f8g efter et spor. For en komplet liste over kilder kan du bes\u00f8ge {0} helpPlaySplitCommand=Opdele en YouTube-video i en playliste i sin beskrivelse. helpRepeatCommand=Skift mellem gentagelsesfunktioner. helpReshuffleCommand=Shuffle nuv\u00e6rende k\u00f8en. helpSelectCommand=V\u00e6lg en af de tilbudte sange efter en s\u00f8gning for at spille. helpShuffleCommand=Skift shuffle tilstand for den aktuelle k\u00f8. -helpSkipCommand=Skip the current song, the n'th song in the queue, all songs from n to m, or all songs from mentioned users. Please use in moderation. +helpSkipCommand=Springe den aktuelle sang, n'th sang i k\u00f8en, alle sange fra n til m eller alle sange fra n\u00e6vnte brugere. Brug i moderation. helpStopCommand=Stop spilleren og fjern afspilningslisten. Forbeholdt redakt\u00f8rer med Administrer meddelelser om tilladelse. helpUnpauseCommand=Genoptag spilleren. helpVolumeCommand=\u00c6ndr lydstyrken. V\u00e6rdierne er 0-150 og 100 er standard. Kommandoen volumen frar\u00e5des p\u00e5 det offentlige bot. helpExportCommand=Eksportere den aktuelle k\u00f8 til en hastebin link, kan bruges senere som en afspilningsliste. helpGensokyoRadioCommand=Vis den aktuelle sang spillet p\u00e5 gensokyoradio.net helpListCommand=F\u00e5 vist en liste over de aktuelle sange i afspilningslisten. -helpHistoryCommand=Display a list of the songs in playlist history. +helpHistoryCommand=Vis en liste over sangene i afspilningslisten historie. helpNowplayingCommand=F\u00e5 vist den sang, der aktuelt afspilles. helpForwardCommand=Fremad banen af en given m\u00e6ngde tid. Eksempel\: helpRestartCommand=Genstart den aktuelle sang. helpRewindCommand=Spol frem i sangen med en given m\u00e6ngde tid. Eksempel\: -helpSeekCommand=Set the position of the track to the given time. Example\: +helpSeekCommand=Angiv placeringen af sporet til den givne tid. Eksempel\: helpAvatarCommand=Vis en brugers avatar. helpBrainfuckCommand=Udf\u00f8rer Brainfuck kode. Eksempel\: -helpWeatherCommand=Display current weather by location. +helpWeatherCommand=F\u00e5 vist aktuelt vejr ved placering. helpClearCommand=Slet bottens seneste 50 beskeder i denne kanal. helpCommandsCommand=Vis tilg\u00e6ngelige kommandoer. helpHelpCommand=Modtag hj\u00e6lp til denne bot eller hj\u00e6lp til en kommando. @@ -256,46 +260,46 @@ helpMusicHelpCommand=Vis kommandoer til musik og deres anvendelse. helpSayCommand=F\u00e5 botten til at gentage noget. helpServerInfoCommand=F\u00e5 vist nogle stats om denne guild. helpUserInfoCommand=Vis oplysninger om dig selv eller en bruger, der er kendt til botten. -helpPerms=Allows whitelisting members and roles for the {0} rank. -helpPrefixCommand=Set the prefix for this guild. -helpVoteSkip=Vote to skip the current song. Needs 50% of all users in the voice chat to vote. -helpMathOperationAdd=Print the sum of num1 and num2. -helpMathOperationSub=Print the difference of subtracting num2 from num1. -helpMathOperationMult=Print the product of num1*num2. -helpMathOperationDiv=Print the quotient of dividing num1 by num2. -helpMathOperationMod=Print the remainder of dividing num1 by num2. -helpMathOperationPerc=Print the percentage represented by num1 in num2. -helpMathOperationSqrt=Print the square root of num. -helpMathOperationPow=Print the result of num1^num2. -destroyDenied=You must have the manage messages permission to reset the player. -destroyHelp=Reset the player and clear the playlist. Reserved for moderators with Manage Messages permission. -destroySucc=Reset the player and cleared the queue. -listPageNum=Page **{0}** of **{1}**. -permsListTitle=Users and roles with the {0} permissions -permsAdded=Added `{0}` to `{1}`. -permsRemoved=Removed `{0}` from `{1}`. -permsFailSelfDemotion=You cannot remove this as it would render you without admin permissions\! -permsAlreadyAdded={0} already added to {1} -permsNotAdded={0} is not in {1} -fuzzyMultiple=Multiple items were found. Did you mean any of these? -fuzzyNothingFound=Nothing found for `{0}`. -cmdPermsTooLow=You don''t have permission to run this command\! This command requires `{0}` but you only have `{1}`. -playersLimited=FredBoat is currently at maximum capacity\! The bot is currently fixed to only play up to `{0}` streams, otherwise we would risk disconnecting from Discord under the network load.\nIf you want to help us increase the limit or you want to use our non-overcrowded bot, please support our work on Patreon\:\n{1}\n\nSorry for the inconvenience\! You might want to try again later. This message usually only appears at peak time. -tryLater=Please try again later. -skipUserSingle=Skipped {0} added by {1}. -skipUserMultiple=Skipped {0} tracks added by {1}. -skipUsersMultiple=Skipped {0} tracks added by {1} users. -skipUserNoTracks=None of the mentioned users have any tracks queued. +helpPerms=Tillader whitelisting medlemmer og roller for {0} rang. +helpPrefixCommand=Angiv pr\u00e6fiks for denne guild. +helpVoteSkip=Stem for at springe den aktuelle sang over. Har brug for 50% af alle brugere i tale-chat til at stemme. +helpMathOperationAdd=Udskriv summen af num1 og num2. +helpMathOperationSub=Udskriv forskellen p\u00e5 at fratr\u00e6kke num2 fra num1. +helpMathOperationMult=Udskriv produktet af num1 * num2. +helpMathOperationDiv=Udskriv kvotienten af at dividere num1 med num2. +helpMathOperationMod=Udskriv resten fra at dividere num1 med num2. +helpMathOperationPerc=Udskriv den procentdel, der er repr\u00e6senteret ved num1 i num2. +helpMathOperationSqrt=Udskriv kvadratroden af num. +helpMathOperationPow=Udskriv resultatet af num1 ^ num2. +destroyDenied=Du skal have tilladelsen administrer beskeder for at nulstille afspilleren. +destroyHelp=Nulstil afspilleren og fjern p\u00e5 afspilningslisten. Forbeholdt redakt\u00f8rer med Administrer meddelelsers tilladelse. +destroySucc=Nulstillede afspilleren og ryddede k\u00f8en. +listPageNum=Side **{0} ** af **{1} **. +permsListTitle=Brugere og roller med {0} tilladelser +permsAdded=Tilf\u00f8jet ''{0}'' til ''{1}''. +permsRemoved=Fjernede ''{0}'' fra ''{1}''. +permsFailSelfDemotion=Du kan ikke fjerne dette, da det ville g\u00f8re dig uden admin-tilladelser\! +permsAlreadyAdded={0} allerede f\u00f8jet til {1} +permsNotAdded={0} er ikke i {1} +fuzzyMultiple=Der blev fundet flere elementer. Mente du nogen af disse? +fuzzyNothingFound=Intet fundet for ''{0}''. +cmdPermsTooLow=Du har ikke tilladelse til at k\u00f8re denne kommando\! Denne kommando kr\u00e6ver ''{0}'' men du kun har ''{1}''. +playersLimited=FredBoat er i \u00f8jeblikket p\u00e5 maksimal kapacitet\! Botten er i \u00f8jeblikket fastsat til at kun spille til \u00ab{0}\u00bb streams, ellers ville vi risikerer frakobling fra Discord under netv\u00e6rksbelastning. Hvis du \u00f8nsker at hj\u00e6lpe os med at \u00f8ge gr\u00e6nsen eller du \u00f8nsker at bruge vores ikke-overfyldte bot, st\u00f8t vores arbejde p\u00e5 Patreon\:\n{1} \nBeklager ulejligheden\! Du kan pr\u00f8ve igen senere. Denne besked vises normalt kun i spidsbelastningen. +tryLater=Pr\u00f8v venligst igen senere. +skipUserSingle=Oversprunget {0} tilf\u00f8jet af {1}. +skipUserMultiple=Oversprunget {0} spor, tilf\u00f8jet af {1}. +skipUsersMultiple=Oversprunget {0} spor, tilf\u00f8jet af {1} brugere. +skipUserNoTracks=Ingen af de n\u00e6vnte brugere har nogen spor i k\u00f8. voteSkipAdded=Dit valg er tilf\u00f8jet\! -voteSkipAlreadyVoted=You already voted to skip this track\! -voteSkipSkipping={0} have voted to skip. Skipping track {1}. -voteSkipNotEnough={0} have voted to skip. At least {1} needed. -voteSkipEmbedNoVotes=No votes to skip this track yet. -voteSkipEmbedVoters={0} out of {1} have voted to skip the current track -mathOperationResult=The result is -mathOperationDivisionByZeroError=I cannot divide by zero. -mathOperationInfinity=The number is too big to be displayed\! -prefix=Prefix -prefixGuild=The prefix for this guild is {0} -prefixShowAgain=You can show the prefix anytime again by mentioning me. +voteSkipAlreadyVoted=Du har allerede stemt for at springe dette spor over\! +voteSkipSkipping={0} har stemt for at springe. Spring spor {1}. +voteSkipNotEnough={0} har stemt for at springe. Mindst {1} behov. +voteSkipEmbedNoVotes=Ingen stemmer for at springe dette spor over endnu. +voteSkipEmbedVoters={0} ud af {1} har stemt at overspringe det aktuelle spor +mathOperationResult=Resultatet er +mathOperationDivisionByZeroError=Jeg kan ikke dividere med nul. +mathOperationInfinity=Antallet er for stort til at blive vist\! +prefix=Pr\u00e6fiks +prefixGuild=Pr\u00e6fikset for denne guild er {0} +prefixShowAgain=Du kan vise pr\u00e6fikset igen til en hver tid ved at n\u00e6vne mig. diff --git a/FredBoat/src/main/resources/lang/de_DE.properties b/FredBoat/src/main/resources/lang/de_DE.properties index f57800d96..8995a7e05 100644 --- a/FredBoat/src/main/resources/lang/de_DE.properties +++ b/FredBoat/src/main/resources/lang/de_DE.properties @@ -125,7 +125,7 @@ luaError=\ Ein Lua-Fehler ist aufgetreten \:anger\:\n```{0}``` luaErrorOutputTooBig=\ Ausgabepuffer ist zu gro\u00df \:anger\: Discord erlaubt nur 2000 Zeichen pro Nachricht, statt **{0}** luaTimeout=\ Zeit\u00fcberschreitung der Funktion. \:anger\: erlaubte Berechnungszeit betr\u00e4gt {0} Sekunden. helpSuccess=Dokumentation wurde zu Deinen Direktnachrichten gesendet\! -helpDmFailed=Konnte Dokumentation nicht senden. Bitte schaue ob du DM's aktiviert hast\! +helpDmFailed=Konnte Dokumentation nicht senden. Bitte \u00fcberpr\u00fcfe ob du DMs aktiviert hast\! helpCommandsPromotion=Sag {0}, um zu erfahren, was dieser Bot machen kann\! fuzzyNoResults=Besagter Nutzer existiert nicht brainfuckCycleLimit=Programm \u00fcberschritt die maximale Zyklenzahl von {0} @@ -183,7 +183,7 @@ ratelimitedGeneralInfo=Du benutzt diesen Command zu schnell\! Bitte warte einen ratelimitedSkipCommand=Du kannst mehr als einen Titel mit diesem Befehl \u00fcberspringen\: {0} ratelimitedGuildSlowLoadingPlaylist=Diesem Server ist es zur Zeit nicht mehr gestattet, weitere Playlists zu laden. Bitte spamme keine langen Playlists. unblacklisted={0} wurde von der Blacklist entfernt. -serverinfoTitle=Informationen \u00fcber **{0}**\: +serverinfoTitle=Infos \u00fcber {0}\: serverinfoOnlineUsers=Nutzer online\: serverinfoTotalUsers=Nutzer gesamt\: serverinfoRoles=Rollen\: @@ -193,7 +193,7 @@ serverinfoGuildID=Gilden-ID\: serverinfoCreationDate=Erstellungsdatum\: serverinfoOwner=Eigent\u00fcmer\: serverinfoVLv=Verifizierungslevel\: -userinfoTitle=Informationen \u00fcber **{0}**\: +userinfoTitle=Infos \u00fcber {0}\: userinfoUsername=Benutzername\: userinfoId=ID\: userinfoNick=Spitzname\: @@ -212,7 +212,11 @@ commandsMaintenance=Wartung commandsBotOwner=Boteigent\u00fcmer commandsMoreHelp=Sag {0}, um mehr Informationen zu einem bestimmten Befehl zu erhalten. helpUnknownCommand=Unbekannter Befehl. -helpDM=Dokumentationen findest du auf\: https\://fredboat.com/docs\n\nM\u00f6chtest du FredBoat zu deinem Server hinzuf\u00fcgen? Wenn du die Berechtigung zum Verwalten des Servers hast, kannst du FredBoat von hier aus hinzuf\u00fcgen\:\n*Dieser spielt keine Musik*\n\n\nWenn du jedoch den Musik Bot hinzuf\u00fcgen willst, solltest du diesen hier nehmen\:\n\n\nBrauchst du Hilfe oder hast Ideen f\u00fcr den Bot? Vielleicht m\u00f6chtest du auch nur mit uns abh\u00e4ngen? Dann h\u00fcpf doch r\u00fcber zu FredBoat Hangout\!\n{0}\n\nDu kannst diesem Bot keine Befehle im privaten Chat schicken.\nBot entwickelt von Fre_d +helpDocsLocation=Die Dokumentation befindet sich hier\: +helpBotInvite=Willst du FredBoat zu deinem Server hinzuf\u00fcgen? Wenn du die "Server verwalten"-Berechtigung f\u00fcr deine Gilde hast, kannst du FredBoat einladen\: +helpHangoutInvite=Brauchst du Hilfe oder hast du irgendwelche Ideen f\u00fcr FredBoat? Vielleicht willst du nur abh\u00e4ngen? Tritt der FredBoat-Community bei\! +helpNoDmCommands=Du kannst FredBoat keine Befehle per DM senden. +helpCredits=Erstellt von Fre_d und Open-Source-Mitwirkenden helpSent=Die Dokumentation wurde dir privat zugesendet\! helpProperUsage=Ordnungsgem\u00e4\u00dfe Verwendung\: helpCommandOwnerRestricted=Dieser Befehl beschr\u00e4nkt sich auf den Besitzer des Bots. @@ -257,16 +261,16 @@ helpSayCommand=L\u00e4sst den Bot Deine Nachricht wiederholen. helpServerInfoCommand=Zeigen Sie einige Statistiken \u00fcber diese Gilde an. helpUserInfoCommand=Zeigen Sie Informationen \u00fcber sich selbst oder einen Benutzer an, der dem Bot bekannt ist. helpPerms=Erm\u00f6glicht das whitelisten von Mitgliedern und Rollen f\u00fcr den {0} Rang. -helpPrefixCommand=Set the prefix for this guild. -helpVoteSkip=Voten um Song zu \u00fcberspringen. Es m\u00fcssen mindestens 50% von allen Usern gevotet haben um den Song zu \u00fcberspringen. +helpPrefixCommand=Legt einen Pr\u00e4fix f\u00fcr diese Gilde fest. +helpVoteSkip=Abstimmen um den aktuellen Track zu \u00fcberspringen. Es m\u00fcssen mindestens 50% aller Benutzern abgestimmt haben, um einen Track zu \u00fcberspringen. helpMathOperationAdd=Ergibt die Summe von Num1 und Num2. -helpMathOperationSub=Gebe die Differenz von num1-num2 aus. +helpMathOperationSub=Gibt die Differenz von num1-num2 aus. helpMathOperationMult=Gebe das Produkt von num1*num2 aus. helpMathOperationDiv=Gebe den Quotienten von num1/num2 aus. helpMathOperationMod=Gebe den Restwert von num1/num2 aus. helpMathOperationPerc=Gebe den Prozentsatz num1 in num2 aus. helpMathOperationSqrt=Gebe die Quadratwurzel von num aus. -helpMathOperationPow=Print the result of num1^num2. +helpMathOperationPow=Gebe das Ergebnis von num1^num2 aus. destroyDenied=Du ben\u00f6tigst die Nachrichten-Verwalten Berechtigung um den Spieler zur\u00fcckzusetzen. destroyHelp=Setzt den Player zur\u00fcck und leert die Playlist. Nur f\u00fcr Moderatoren mit Berechtigung zum Verwalten von Nachrichten. destroySucc=Setzt den Player zur\u00fcck und leert die Wiedergabeliste. @@ -294,8 +298,8 @@ voteSkipEmbedNoVotes=Aktuell gibt es keine stimmen um das Lied zu \u00fcbersprin voteSkipEmbedVoters={0} von {1} haben f\u00fcr das \u00dcberspringen des aktuellen Liedes abgestimmt. mathOperationResult=Das Ergebnis ist mathOperationDivisionByZeroError=Ich kann keine Zahl durch Null dividieren. -mathOperationInfinity=Dieese Zahl ist zu gro\u00df, um angezeigt zu werden\! -prefix=Prefix -prefixGuild=The prefix for this guild is {0} -prefixShowAgain=You can show the prefix anytime again by mentioning me. +mathOperationInfinity=Diese Zahl ist zu gro\u00df, um angezeigt zu werden\! +prefix=Pr\u00e4fix +prefixGuild=Das Pr\u00e4fix f\u00fcr diese Gilde ist {0} +prefixShowAgain=Du kannst das Pr\u00e4fix jederzeit wieder anzeigen indem du mich erw\u00e4hnst. diff --git a/FredBoat/src/main/resources/lang/el_GR.properties b/FredBoat/src/main/resources/lang/el_GR.properties index 433b805d0..21be1d880 100644 --- a/FredBoat/src/main/resources/lang/el_GR.properties +++ b/FredBoat/src/main/resources/lang/el_GR.properties @@ -212,7 +212,11 @@ commandsMaintenance=\u03a3\u03c5\u03bd\u03c4\u03ae\u03c1\u03b7\u03c3\u03b7 commandsBotOwner=\u0399\u03b4\u03b9\u03bf\u03ba\u03c4\u03ae\u03c4\u03b7\u03c2 bot commandsMoreHelp=\u03a0\u03b5\u03af\u03c4\u03b5 {0} \u03b3\u03b9\u03b1 \u03bd\u03b1 \u03c0\u03ac\u03c1\u03b5\u03c4\u03b5 \u03c0\u03b5\u03c1\u03b9\u03c3\u03c3\u03cc\u03c4\u03b5\u03c1\u03b5\u03c2 \u03c0\u03bb\u03b7\u03c1\u03bf\u03c6\u03bf\u03c1\u03af\u03b5\u03c2 \u03c3\u03c7\u03b5\u03c4\u03b9\u03ba\u03ac \u03bc\u03b5 \u03bc\u03b9\u03b1 \u03c3\u03c5\u03b3\u03ba\u03b5\u03ba\u03c1\u03b9\u03bc\u03ad\u03bd\u03b7 \u03b5\u03bd\u03c4\u03bf\u03bb\u03ae. helpUnknownCommand=\u0386\u03b3\u03bd\u03c9\u03c3\u03c4\u03b7 \u0395\u03bd\u03c4\u03bf\u03bb\u03ae. -helpDM=\u0397 \u03c4\u03b5\u03ba\u03bc\u03b7\u03c1\u03af\u03c9\u03c3\u03b7 \u03bc\u03c0\u03bf\u03c1\u03b5\u03af \u03bd\u03b1 \u03b2\u03c1\u03b5\u03b8\u03b5\u03af \u03c3\u03c4\u03b9\u03c2 GitHub \u03c3\u03b5\u03bb\u03af\u03b4\u03b5\u03c2 \u03c4\u03bf\u03c5 bot\: \nhttp\://docs.frederikam.com\n\n\u0398\u03ad\u03bb\u03b5\u03c4\u03b5 \u03bd\u03b1 \u03c0\u03c1\u03bf\u03c3\u03b8\u03ad\u03c3\u03b5\u03c4\u03b5 \u03c4\u03bf FredBoat \u03c3\u03c4\u03bf \u03c3\u03ad\u03c1\u03b2\u03b5\u03c1 \u03c3\u03b1\u03c2; \u0395\u03ac\u03bd \u03ad\u03c7\u03b5\u03c4\u03b5 \u03b4\u03b9\u03ba\u03b1\u03b9\u03ce\u03bc\u03b1\u03c4\u03b1 \u03b4\u03b9\u03b1\u03c7\u03b5\u03af\u03c1\u03b9\u03c3\u03b7\u03c2 \u03c3\u03b5\u03c1\u03b2\u03b5\u03c1 \u03b3\u03b9\u03b1 \u03c4\u03b7\u03bd \u03bf\u03bc\u03ac\u03b4\u03b1 \u03c3\u03b1\u03c2, \u03bc\u03c0\u03bf\u03c1\u03b5\u03af\u03c4\u03b5 \u03bd\u03b1 \u03c0\u03c1\u03bf\u03c3\u03ba\u03b1\u03bb\u03ad\u03c3\u03b5\u03c4\u03b5 \u03b1\u03c5\u03c4\u03cc \u03b5\u03b4\u03ce\:\n *\u03b1\u03c5\u03c4\u03cc \u03b4\u03b5\u03bd \u03c0\u03b1\u03af\u03b6\u03b5\u03b9 \u03bc\u03bf\u03c5\u03c3\u03b9\u03ba\u03ae *\nhttps\://discordapp.com/oauth2/authorize?&client_id\=168686772216135681&scope\=bot\n\n\u0391\u03bd \u03b8\u03ad\u03bb\u03b5\u03c4\u03b5 \u03bd\u03b1 \u03c0\u03c1\u03bf\u03c3\u03b8\u03ad\u03c3\u03b5\u03c4\u03b5 \u03c4\u03bf bot \u03b3\u03b9\u03b1 \u03bc\u03bf\u03c5\u03c3\u03b9\u03ba\u03ae\:\nhttps\://discordapp.com/oauth2/authorize?&client_id\=184405253028970496&scope\=bot \n\n\u03a7\u03c1\u03b5\u03b9\u03ac\u03b6\u03b5\u03c3\u03c4\u03b5 \u03b2\u03bf\u03ae\u03b8\u03b5\u03b9\u03b1 \u03ae \u03ad\u03c7\u03b5\u03c4\u03b5 \u03ba\u03ac\u03c0\u03bf\u03b9\u03b1 \u03b9\u03b4\u03ad\u03b1 \u03b3\u03b9\u03b1 \u03c4\u03bf bot; \u0388\u03bb\u03ac\u03c4\u03b5 \u03c3\u03c4\u03bf \u03c3\u03c4\u03ad\u03ba\u03b9 \u03c4\u03bf\u03c5 FredBoat\!{0} \n\n\u0394\u03b5\u03bd \u03bc\u03c0\u03bf\u03c1\u03b5\u03af\u03c4\u03b5 \u03bd\u03b1 \u03c3\u03c4\u03b5\u03af\u03bb\u03b5\u03c4\u03b5 \u03c3\u03b5 \u03b1\u03c5\u03c4\u03cc \u03c4\u03bf bot \u03b5\u03bd\u03c4\u03bf\u03bb\u03ad\u03c2 \u03bc\u03ad\u03c3\u03c9 DM. \n\u03a4\u03bf Bot \u03b4\u03b7\u03bc\u03b9\u03bf\u03c5\u03c1\u03b3\u03ae\u03b8\u03b7\u03ba\u03b5 \u03b1\u03c0\u03cc Fre_d +helpDocsLocation=\u03a4\u03b5\u03ba\u03bc\u03b7\u03c1\u03af\u03c9\u03c3\u03b7 \u03bc\u03c0\u03bf\u03c1\u03b5\u03af \u03bd\u03b1 \u03b2\u03c1\u03b5\u03b8\u03b5\u03af \u03c3\u03b5\: +helpBotInvite=\u0398\u03ad\u03bb\u03b5\u03c4\u03b5 \u03bd\u03b1 \u03c0\u03c1\u03bf\u03c3\u03b8\u03ad\u03c3\u03b5\u03c4\u03b5 FredBoat \u03c3\u03c4\u03bf \u03b4\u03b9\u03b1\u03ba\u03bf\u03bc\u03b9\u03c3\u03c4\u03ae \u03c3\u03b1\u03c2; \u0395\u03ac\u03bd \u03ad\u03c7\u03b5\u03c4\u03b5 \u03b4\u03b9\u03ba\u03b1\u03b9\u03ce\u03bc\u03b1\u03c4\u03b1 \u03b4\u03b9\u03b1\u03c7\u03b5\u03af\u03c1\u03b9\u03c3\u03b7\u03c2 \u03b4\u03b9\u03b1\u03ba\u03bf\u03bc\u03b9\u03c3\u03c4\u03ae \u03b3\u03b9\u03b1 \u03c4\u03b7\u03bd \u03c3\u03c5\u03bd\u03c4\u03b5\u03c7\u03bd\u03af\u03b1 \u03c3\u03b1\u03c2, \u03bc\u03c0\u03bf\u03c1\u03b5\u03af\u03c4\u03b5 \u03bd\u03b1 \u03c0\u03c1\u03bf\u03c3\u03ba\u03b1\u03bb\u03ad\u03c3\u03b5\u03c4\u03b5 FredBoat\: +helpHangoutInvite=\u03a7\u03c1\u03b5\u03b9\u03ac\u03b6\u03b5\u03c3\u03c4\u03b5 \u03b2\u03bf\u03ae\u03b8\u03b5\u03b9\u03b1 \u03ae \u03ad\u03c7\u03b5\u03c4\u03b5 \u03bf\u03c0\u03bf\u03b9\u03b5\u03c3\u03b4\u03ae\u03c0\u03bf\u03c4\u03b5 \u03b9\u03b4\u03ad\u03b5\u03c2 \u03b3\u03b9\u03b1 FredBoat; \u038a\u03c3\u03c9\u03c2 \u03b8\u03ad\u03bb\u03b5\u03c4\u03b5 \u03b1\u03ba\u03c1\u03b9\u03b2\u03ce\u03c2 \u03bd\u03b1 \u03ba\u03c1\u03b5\u03bc\u03ac\u03c3\u03b5\u03b9 \u03ad\u03be\u03c9; \u0393\u03af\u03bd\u03b5\u03c4\u03b5 \u03bc\u03ad\u03bb\u03bf\u03c2 \u03c4\u03b7\u03c2 \u039a\u03bf\u03b9\u03bd\u03cc\u03c4\u03b7\u03c4\u03b1\u03c2 FredBoat\! +helpNoDmCommands=\u0394\u03b5\u03bd \u03bc\u03c0\u03bf\u03c1\u03b5\u03af\u03c4\u03b5 \u03bd\u03b1 \u03c3\u03c4\u03b5\u03af\u03bb\u03b5\u03c4\u03b5 FredBoat \u03b5\u03bd\u03c4\u03bf\u03bb\u03ad\u03c2 \u03bc\u03ad\u03c3\u03c9 DMs. +helpCredits=\u0394\u03b7\u03bc\u03b9\u03bf\u03c5\u03c1\u03b3\u03ae\u03b8\u03b7\u03ba\u03b5 \u03b1\u03c0\u03cc Fre_d \u03ba\u03b1\u03b9 \u03b1\u03bd\u03bf\u03b9\u03ba\u03c4\u03bf\u03cd\u03c2 \u03c0\u03b7\u03b3\u03b1\u03af\u03bf\u03c5\u03c2 helpSent=\u0397 \u03c4\u03b5\u03ba\u03bc\u03b7\u03c1\u03af\u03c9\u03c3\u03b7 \u03ad\u03c7\u03b5\u03b9 \u03b1\u03c0\u03bf\u03c3\u03c4\u03b1\u03bb\u03b5\u03af \u03c3\u03c4\u03bf DM \u03c3\u03b1\u03c2\! helpProperUsage=\u03a3\u03c9\u03c3\u03c4\u03ae \u03c7\u03c1\u03ae\u03c3\u03b7\: helpCommandOwnerRestricted=\u0391\u03c5\u03c4\u03ae \u03b7 \u03b5\u03bd\u03c4\u03bf\u03bb\u03ae \u03b5\u03af\u03bd\u03b1\u03b9 \u03c0\u03b5\u03c1\u03b9\u03bf\u03c1\u03b9\u03c3\u03bc\u03ad\u03bd\u03b7 \u03c3\u03c4\u03bf\u03bd \u03b9\u03b4\u03b9\u03bf\u03ba\u03c4\u03ae\u03c4\u03b7 \u03c4\u03bf\u03c5 bot. @@ -257,7 +261,7 @@ helpSayCommand=\u039a\u03ac\u03bd\u03b5\u03b9 \u03c4\u03bf bot \u03bd\u03b1 \u03 helpServerInfoCommand=\u0395\u03bc\u03c6\u03b1\u03bd\u03af\u03b6\u03b5\u03b9 \u03ba\u03ac\u03c0\u03bf\u03b9\u03b1 \u03c3\u03c4\u03b1\u03c4\u03b9\u03c3\u03c4\u03b9\u03ba\u03ac \u03c3\u03c7\u03b5\u03c4\u03b9\u03ba\u03ac \u03bc\u03b5 \u03b1\u03c5\u03c4\u03cc \u03c4\u03bf guild. helpUserInfoCommand=\u0395\u03bc\u03c6\u03b1\u03bd\u03af\u03b6\u03b5\u03b9 \u03c0\u03bb\u03b7\u03c1\u03bf\u03c6\u03bf\u03c1\u03af\u03b5\u03c2 \u03c3\u03c7\u03b5\u03c4\u03b9\u03ba\u03ac \u03bc\u03b5 \u03c4\u03bf\u03bd \u03b5\u03b1\u03c5\u03c4\u03cc \u03c3\u03b1\u03c2 \u03ae \u03ad\u03bd\u03b1 \u03c7\u03c1\u03ae\u03c3\u03c4\u03b7 \u03c0\u03bf\u03c5 \u03b5\u03af\u03bd\u03b1\u03b9 \u03b3\u03bd\u03c9\u03c3\u03c4\u03cc\u03c2 \u03c3\u03c4\u03bf bot. helpPerms=\u0395\u03c0\u03b9\u03c4\u03c1\u03ad\u03c0\u03b5\u03b9 \u03c4\u03bf whitelisting \u03bc\u03b5\u03bb\u03ce\u03bd \u03ba\u03b1\u03b9 \u03c1\u03cc\u03bb\u03c9\u03bd \u03b3\u03b9\u03b1 \u03c4\u03bf \u03b2\u03b1\u03b8\u03bc\u03cc \u03c4\u03bf\u03c5 {0}. -helpPrefixCommand=Set the prefix for this guild. +helpPrefixCommand=\u039f\u03c1\u03af\u03c3\u03c4\u03b5 \u03c4\u03b7 prefix \u03b3\u03b9\u03b1 \u03b1\u03c5\u03c4\u03cc \u03c4\u03bf guild. helpVoteSkip=\u03a8\u03b7\u03c6\u03af\u03b6\u03b5\u03b9 \u03b3\u03b9\u03b1 \u03bd\u03b1 \u03c0\u03b1\u03c1\u03b1\u03ba\u03ac\u03bc\u03c8\u03b5\u03b9 \u03c4\u03bf \u03c4\u03c1\u03ad\u03c7\u03bf\u03bd \u03c4\u03c1\u03b1\u03b3\u03bf\u03cd\u03b4\u03b9. \u03a7\u03c1\u03b5\u03b9\u03ac\u03b6\u03b5\u03c4\u03b1\u03b9 \u03c4\u03bf 50% \u03cc\u03bb\u03c9\u03bd \u03c4\u03c9\u03bd \u03c7\u03c1\u03b7\u03c3\u03c4\u03ce\u03bd \u03bc\u03b5 \u03c4\u03b7 \u03b4\u03c5\u03bd\u03b1\u03c4\u03cc\u03c4\u03b7\u03c4\u03b1 \u03c6\u03c9\u03bd\u03b7\u03c4\u03b9\u03ba\u03ae\u03c2 \u03c3\u03c5\u03bd\u03bf\u03bc\u03b9\u03bb\u03af\u03b1\u03c2 \u03bd\u03b1 \u03c8\u03b7\u03c6\u03af\u03c3\u03bf\u03c5\u03bd. helpMathOperationAdd=\u0395\u03ba\u03c4\u03c5\u03c0\u03ce\u03bd\u03b5\u03b9 \u03c4\u03bf \u03ac\u03b8\u03c1\u03bf\u03b9\u03c3\u03bc\u03b1 \u03c4\u03c9\u03bd num1 \u03ba\u03b1\u03b9 num2. helpMathOperationSub=\u0395\u03ba\u03c4\u03c5\u03c0\u03ce\u03bd\u03b5\u03b9 \u03c4\u03b7 \u03b4\u03b9\u03b1\u03c6\u03bf\u03c1\u03ac \u03c4\u03b7\u03c2 \u03b1\u03c6\u03b1\u03af\u03c1\u03b5\u03c3\u03b7\u03c2 \u03c4\u03bf\u03c5 num2 \u03b1\u03c0\u03cc \u03c4\u03bf num1. @@ -295,7 +299,7 @@ voteSkipEmbedVoters={0} \u03b1\u03c0\u03cc {1} \u03c8\u03ae\u03c6\u03b9\u03c3\u0 mathOperationResult=\u03a4\u03bf \u03b1\u03c0\u03bf\u03c4\u03ad\u03bb\u03b5\u03c3\u03bc\u03b1 \u03b5\u03af\u03bd\u03b1\u03b9 mathOperationDivisionByZeroError=\u0394\u03b5\u03bd \u03bc\u03c0\u03bf\u03c1\u03ce \u03bd\u03b1 \u03c7\u03c9\u03c1\u03af\u03c3\u03c9 \u03bc\u03b5 \u03c4\u03bf \u03bc\u03b7\u03b4\u03ad\u03bd. mathOperationInfinity=\u039f \u03b1\u03c1\u03b9\u03b8\u03bc\u03cc\u03c2 \u03b5\u03af\u03bd\u03b1\u03b9 \u03c0\u03ac\u03c1\u03b1 \u03c0\u03bf\u03bb\u03cd \u03bc\u03b5\u03b3\u03ac\u03bb\u03bf\u03c2 \u03b3\u03b9\u03b1 \u03bd\u03b1 \u03b5\u03bc\u03c6\u03b1\u03bd\u03b9\u03c3\u03c4\u03b5\u03af\! -prefix=Prefix -prefixGuild=The prefix for this guild is {0} -prefixShowAgain=You can show the prefix anytime again by mentioning me. +prefix=\u03a0\u03c1\u03cc\u03b8\u03b5\u03bc\u03b1 +prefixGuild=H prefix \u03b3\u03b9\u03b1 \u03b1\u03c5\u03c4\u03cc \u03c4\u03bf guild \u03b5\u03af\u03bd\u03b1\u03b9 {0} +prefixShowAgain=\u039c\u03c0\u03bf\u03c1\u03b5\u03af\u03c4\u03b5 \u03bd\u03b1 \u03b5\u03bc\u03c6\u03b1\u03bd\u03af\u03c3\u03b5\u03c4\u03b5 \u03c4\u03bf prefix \u03b1\u03bd\u03ac \u03c0\u03ac\u03c3\u03b1 \u03c3\u03c4\u03b9\u03b3\u03bc\u03ae \u03b1\u03bd\u03b1\u03c6\u03ad\u03c1\u03bf\u03bd\u03c4\u03ac\u03c2 \u03bc\u03b5. diff --git a/FredBoat/src/main/resources/lang/en_PT.properties b/FredBoat/src/main/resources/lang/en_PT.properties index 2b0b82ee7..f92062410 100644 --- a/FredBoat/src/main/resources/lang/en_PT.properties +++ b/FredBoat/src/main/resources/lang/en_PT.properties @@ -183,7 +183,7 @@ ratelimitedGeneralInfo=You are being rate limited\! Please slow down. ratelimitedSkipCommand=You can skip more than one song by using this command\: {0} ratelimitedGuildSlowLoadingPlaylist=This server is not allowed to add more playlists at this moment. Please don't spam long playlists. unblacklisted=Removed {0} from the blacklist. -serverinfoTitle=Tales ''bout **{0}**\: +serverinfoTitle=Tales ''bout {0}\: serverinfoOnlineUsers=Lively hands\: serverinfoTotalUsers=All ye mates\: serverinfoRoles=Ranks\: @@ -193,7 +193,7 @@ serverinfoGuildID=Guild ID\: serverinfoCreationDate='Tis made on\: serverinfoOwner=Captain\: serverinfoVLv=Verification Level\: -userinfoTitle=Tales ''bout **{0}**\: +userinfoTitle=Information about {0}\: userinfoUsername=Ye name\: userinfoId=Flag\: userinfoNick=How we call ye\: @@ -211,8 +211,12 @@ commandsModeration=Captains commandsMaintenance=Maintenance commandsBotOwner=Bot owner commandsMoreHelp=Say {0} to get more information on a specific command. -helpUnknownCommand=Unknown command. -helpDM=Documentation can be found at\:\nhttps\://fredboat.com/docs\n\nWant to add FredBoat to your server? If you have Manage Server permissions for your guild, you can invite it here\:\n*This one doesn''t play music*\n\n\nIf you want to add the music bot, you will want to invite this bot\:\n\n\nNeed help or have any ideas for the bot? Perhaps you just want to hang out? Come on over to FredBoat hangout\!\n{0}\n\nYou cannot send this bot commands through DM.\nBot created by Fre_d +helpUnknownCommand=The crew dunno yer order. +helpDocsLocation=Documentation can be found at\: +helpBotInvite=Want to add FredBoat to your server? If you have Manage Server permissions for your guild, you can invite FredBoat\: +helpHangoutInvite=Need help or have any ideas for FredBoat? Perhaps you just want to hang out? Join the FredBoat community\! +helpNoDmCommands=You cannot send FredBoat commands through DMs. +helpCredits=Created by Fre_d and open source contributors helpSent=Documentation has been sent to your DMs\! helpProperUsage=Proper usage\: helpCommandOwnerRestricted=This command is restricted to the owner of the bot. diff --git a/FredBoat/src/main/resources/lang/en_TS.properties b/FredBoat/src/main/resources/lang/en_TS.properties index 995b7dc23..7006118d0 100644 --- a/FredBoat/src/main/resources/lang/en_TS.properties +++ b/FredBoat/src/main/resources/lang/en_TS.properties @@ -19,7 +19,7 @@ selectInterval=Must be a number 1-{0} you dummy. selectSelectionNotGiven=I haven't given you any choices yet, you can't just ask on your own\! shuffleOn=I'll mix the song list for you... but only once\! shuffleOff=But I just shuffled it\! Now you want me to sort it... Fine\! This is so labor intensive... I hate you\! -reshufflePlaylist=Queue reshuffled. +reshufflePlaylist=I put your stupid playlist back in order, it was tough FYI\! reshufflePlayerNotShuffling=You big dummy\! If you want me to shuffle the queue you have to tun it on\! Type {0}shuffle. skipEmpty=Why would you even want to empty a queue when it is already empty? Call me again when you've figured out how to actually add tracks. skipOutOfBounds=Are you blind\! Track {0} doesn''t exist\! chose between 1-{1} idiot\! @@ -87,9 +87,9 @@ loadSplitNotYouTube=This is not from YouTube\! You can't use `;;split` with that loadSplitNotResolves=I can't resolve that video's tracklist. Use `;;play` silly. loadFollowingTracksAdded=I've added some tracks\: loadPlaylistTooMany=I added {0} tracks... But, there''s too many. No way am I typing that out. -loadErrorCommon=Error occurred when loading info for `{0}`\:\n{1} +loadErrorCommon=Something''s not right\! I couldn''t load the info for `{0}`\: \n{1}\nMust be your fault.. m-mostly. loadErrorSusp=That''s.. weird. It''s strange and I don''t like it\! I couldn''t load the info for '' {0} ''. -loadQueueTrackLimit=You can''t add tracks to a queue with more than {0} tracks\! This is to prevent abuse. +loadQueueTrackLimit=Why should I add something when there''s already {0} tracks? Anyone (like you) trying to do that would be naughty. loadAnnouncePlaylist=About to load playlist **{0}** with up to `{1}` tracks. This may take a while, please be patient. playerUserNotInChannel=You're not in a voice channel, it's rude if you're asking for a song and not gonna listen to it idiot\! playerJoinConnectDenied=I won't go into that voice channel because you want me to\! @@ -183,7 +183,7 @@ ratelimitedGeneralInfo=Jeez, would you cool it? I'm going to have to rate limit ratelimitedSkipCommand=You can skip more than one song by using this command\: {0} ratelimitedGuildSlowLoadingPlaylist=This server is not allowed to add more playlists at this moment. Please don't spam long playlists. unblacklisted=Removed {0} from the blacklist. -serverinfoTitle=This should tell you more about {0} +serverinfoTitle=Info about {0}\: serverinfoOnlineUsers=Users Online right now\: serverinfoTotalUsers=Everyone here\: serverinfoRoles=Roles\: @@ -193,7 +193,7 @@ serverinfoGuildID=Guild ID\: serverinfoCreationDate=I was created on\: serverinfoOwner=The Owner is\: serverinfoVLv=Verification Level\: -userinfoTitle=This should tell you more about {0} +userinfoTitle=Information about {0}\: userinfoUsername=Username\: userinfoId=ID\: userinfoNick=Nickname\: @@ -212,7 +212,11 @@ commandsMaintenance=Maintenance commandsBotOwner=Bot owner commandsMoreHelp=Say {0} to get more information on a specific command. helpUnknownCommand=I don't even know what you want from me. That command makes no sense. -helpDM=Documentation can be found at\:\nhttps\://fredboat.com/docs\n\nWant to add FredBoat to your server? If you have Manage Server permissions for your guild, you can invite it here\:\n*This one doesn''t play music*\n\n\nIf you want to add the music bot, you will want to invite this bot\:\n\n\nNeed help or have any ideas for the bot? Perhaps you just want to hang out? Come on over to FredBoat hangout\!\n{0}\n\nYou cannot send this bot commands through DM.\nBot created by Fre_d +helpDocsLocation=Documentation can be found at\: +helpBotInvite=Want to add FredBoat to your server? If you have Manage Server permissions for your guild, you can invite FredBoat\: +helpHangoutInvite=Need help or have any ideas for FredBoat? Perhaps you just want to hang out? Join the FredBoat community\! +helpNoDmCommands=You cannot send FredBoat commands through DMs. +helpCredits=Created by Fre_d and open source contributors helpSent=Documentation has been sent to your DMs\! helpProperUsage=This is how you do it b-baka\: helpCommandOwnerRestricted=This command is restricted to the owner of the bot. diff --git a/FredBoat/src/main/resources/lang/en_US.properties b/FredBoat/src/main/resources/lang/en_US.properties index 79b315c68..f711baa10 100644 --- a/FredBoat/src/main/resources/lang/en_US.properties +++ b/FredBoat/src/main/resources/lang/en_US.properties @@ -215,7 +215,11 @@ commandsMaintenance=Maintenance commandsBotOwner=Bot owner commandsMoreHelp=Say {0} to get more information on a specific command. helpUnknownCommand=Unknown command. -helpDM=Documentation can be found at\:\nhttps\://fredboat.com/docs\n\nWant to add FredBoat to your server? If you have Manage Server permissions for your guild, you can invite it here\:\n*This one doesn''t play music*\n\n\nIf you want to add the music bot, you will want to invite this bot\:\n\n\nNeed help or have any ideas for the bot? Perhaps you just want to hang out? Come on over to FredBoat hangout!\n{0}\n\nYou cannot send this bot commands through DM.\nBot created by Fre_d +helpDocsLocation=Documentation can be found at: +helpBotInvite=Want to add FredBoat to your server? If you have Manage Server permissions for your guild, you can invite FredBoat: +helpHangoutInvite=Need help or have any ideas for FredBoat? Perhaps you just want to hang out? Join the FredBoat community! +helpNoDmCommands=You cannot send FredBoat commands through DMs. +helpCredits=Created by Fre_d and open source contributors helpSent=Documentation has been sent to your DMs! helpProperUsage=Proper usage: helpCommandOwnerRestricted=This command is restricted to the owner of the bot. diff --git a/FredBoat/src/main/resources/lang/es_ES.properties b/FredBoat/src/main/resources/lang/es_ES.properties index e59015399..5a9da4dd2 100644 --- a/FredBoat/src/main/resources/lang/es_ES.properties +++ b/FredBoat/src/main/resources/lang/es_ES.properties @@ -183,7 +183,7 @@ ratelimitedGeneralInfo=\u00a1Estas llegando al limite\! Por favor, c\u00e1lmate. ratelimitedSkipCommand=Puedes omitir m\u00e1s de una canci\u00f3n usando este comando\: {0} ratelimitedGuildSlowLoadingPlaylist=Este servidor no est\u00e1 permitido a\u00f1adir m\u00e1s listas en este momento. Por favor no a\u00f1adas largas listas de reproducci\u00f3n. unblacklisted={0} fue eliminado de la lista negra. -serverinfoTitle=Informaci\u00f3n sobre **{0}**\: +serverinfoTitle=informaci\u00f3n sobre {0}\: serverinfoOnlineUsers=Usuarios en l\u00ednea\: serverinfoTotalUsers=Usuarios totales\: serverinfoRoles=Roles\: @@ -193,7 +193,7 @@ serverinfoGuildID=ID del servidor\: serverinfoCreationDate=Fecha de creaci\u00f3n\: serverinfoOwner=Due\u00f1o\: serverinfoVLv=Nivel de verificaci\u00f3n\: -userinfoTitle=Informaci\u00f3n sobre **{0}**\: +userinfoTitle=Informaci\u00f3n sobre {0}\: userinfoUsername=Nombre de usuario\: userinfoId=ID\: userinfoNick=Apodo\: @@ -212,7 +212,11 @@ commandsMaintenance=Mantenimiento commandsBotOwner=Due\u00f1o del bot commandsMoreHelp=Di {0} para obtener m\u00e1s informaci\u00f3n sobre un comando espec\u00edfico. helpUnknownCommand=Comando desconocido. -helpDM=La documentaci\u00f3n se puede encontrar en\:\n https\://fredboat.com/docs\n\u00bfQuieres a\u00f1adir FredBoat a tu servidor? Si tienes permisos de Manage Server para tu gremio, puedes invitarlo aqu\u00ed\:\n* Este no reproduce m\u00fasica *\n\n\nSi quieres a\u00f1adir el bot musical, deber\u00e1s invitar Este bot\:\n \n\n\u00bfNecesita ayuda o tiene alguna idea para el bot? Tal vez usted s\u00f3lo quiere salir? \u00a1Venga al hangout de FredBoat\!\n{0}\n\nNo puedes enviar este bot comandos a trav\u00e9s de DM.\nBot creado por Fre_d +helpDocsLocation=Documentaci\u00f3n se puede contrar en\: +helpBotInvite="Quieres agregar FredBoat a tu servidor? Si tienes permisos administrativos en tu servidor, puedes invitar a FredBoat"\: +helpHangoutInvite=Necesitas ayuda o tienes algun idea para FredBoat? Ta vez s\u00f3lo quieres pasar el rato? \u00danete a la communidad de FredBoat\! +helpNoDmCommands=Usted no puede mandar FredBoat commandos a trav\u00e9s de DMs. +helpCredits=Creado por Fr_ed y de abierto c\u00f3digo colaboradores helpSent=\u00a1La documentaci\u00f3n ha sido enviada a tus mensajes privados\! helpProperUsage=Uso correcto\: helpCommandOwnerRestricted=Este comando se limita al due\u00f1o del bot. @@ -257,7 +261,7 @@ helpSayCommand=Hacer que el bot haga eco de algo. helpServerInfoCommand=Mostrar algunas estad\u00edsticas sobre este servidor. helpUserInfoCommand=Mostrar informaci\u00f3n acerca de usted o un usuario conocido por el bot. helpPerms=Permite la inclusi\u00f3n de miembros y roles para el rango {0}. -helpPrefixCommand=Set the prefix for this guild. +helpPrefixCommand=Configura el prefijo para este gremio. helpVoteSkip=Vota para saltar la canci\u00f3n. Se requiere que el 50% de los usuarios vote. helpMathOperationAdd=Muesta la suma de n\u00famero 1 y n\u00famero 2. helpMathOperationSub=Muestra el resultado de n\u00famero 2 menos n\u00famero 1. @@ -295,7 +299,7 @@ voteSkipEmbedVoters={0} de {1} han votado para saltar la canci\u00f3n actual mathOperationResult=El resultado es mathOperationDivisionByZeroError=No puedo dividir entre cero. mathOperationInfinity=\u00a1Este n\u00famero es muy grande para mostrarse\! -prefix=Prefix -prefixGuild=The prefix for this guild is {0} -prefixShowAgain=You can show the prefix anytime again by mentioning me. +prefix=Prefijo +prefixGuild=El prefijo para el gremio es {0} +prefixShowAgain=Usted puede mostrar el prefijo de cualquier momento de nuevo por mencion\u00e1ndome. diff --git a/FredBoat/src/main/resources/lang/et_EE.properties b/FredBoat/src/main/resources/lang/et_EE.properties index 7ed9f697a..b07cfdd26 100644 --- a/FredBoat/src/main/resources/lang/et_EE.properties +++ b/FredBoat/src/main/resources/lang/et_EE.properties @@ -183,7 +183,7 @@ ratelimitedGeneralInfo=You are being rate limited\! Please slow down. ratelimitedSkipCommand=You can skip more than one song by using this command\: {0} ratelimitedGuildSlowLoadingPlaylist=This server is not allowed to add more playlists at this moment. Please don't spam long playlists. unblacklisted=Removed {0} from the blacklist. -serverinfoTitle=Info about **{0}**\: +serverinfoTitle=Info about {0}\: serverinfoOnlineUsers=Online Users\: serverinfoTotalUsers=Total Users\: serverinfoRoles=Roles\: @@ -193,7 +193,7 @@ serverinfoGuildID=Guild ID\: serverinfoCreationDate=Creation Date\: serverinfoOwner=Owner\: serverinfoVLv=Verification Level\: -userinfoTitle=Information about **{0}**\: +userinfoTitle=Information about {0}\: userinfoUsername=Username\: userinfoId=ID\: userinfoNick=Nickname\: @@ -212,7 +212,11 @@ commandsMaintenance=Maintenance commandsBotOwner=Bot owner commandsMoreHelp=Say {0} to get more information on a specific command. helpUnknownCommand=Unknown command. -helpDM=Documentation can be found at\:\nhttps\://fredboat.com/docs\n\nWant to add FredBoat to your server? If you have Manage Server permissions for your guild, you can invite it here\:\n*This one doesn''t play music*\n\n\nIf you want to add the music bot, you will want to invite this bot\:\n\n\nNeed help or have any ideas for the bot? Perhaps you just want to hang out? Come on over to FredBoat hangout\!\n{0}\n\nYou cannot send this bot commands through DM.\nBot created by Fre_d +helpDocsLocation=Documentation can be found at\: +helpBotInvite=Want to add FredBoat to your server? If you have Manage Server permissions for your guild, you can invite FredBoat\: +helpHangoutInvite=Need help or have any ideas for FredBoat? Perhaps you just want to hang out? Join the FredBoat community\! +helpNoDmCommands=You cannot send FredBoat commands through DMs. +helpCredits=Created by Fre_d and open source contributors helpSent=Documentation has been sent to your DMs\! helpProperUsage=Proper usage\: helpCommandOwnerRestricted=This command is restricted to the owner of the bot. diff --git a/FredBoat/src/main/resources/lang/fa_IR.properties b/FredBoat/src/main/resources/lang/fa_IR.properties index d1a7c5093..2a9fc9828 100644 --- a/FredBoat/src/main/resources/lang/fa_IR.properties +++ b/FredBoat/src/main/resources/lang/fa_IR.properties @@ -183,7 +183,7 @@ ratelimitedGeneralInfo=You are being rate limited\! Please slow down. ratelimitedSkipCommand=You can skip more than one song by using this command\: {0} ratelimitedGuildSlowLoadingPlaylist=This server is not allowed to add more playlists at this moment. Please don't spam long playlists. unblacklisted=Removed {0} from the blacklist. -serverinfoTitle=Info about **{0}**\: +serverinfoTitle=Info about {0}\: serverinfoOnlineUsers=Online Users\: serverinfoTotalUsers=Total Users\: serverinfoRoles=Roles\: @@ -193,7 +193,7 @@ serverinfoGuildID=Guild ID\: serverinfoCreationDate=Creation Date\: serverinfoOwner=Owner\: serverinfoVLv=Verification Level\: -userinfoTitle=Information about **{0}**\: +userinfoTitle=Information about {0}\: userinfoUsername=Username\: userinfoId=ID\: userinfoNick=Nickname\: @@ -212,7 +212,11 @@ commandsMaintenance=\u062a\u0639\u0645\u06cc\u0631\u0627\u062a commandsBotOwner=\u0635\u0627\u062d\u0628 \u0631\u0628\u0627\u062a commandsMoreHelp=\u0628\u0627 \u06af\u0641\u062a\u0646 {0} \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0628\u06cc\u0634\u062a\u0631\u06cc \u062f\u0631\u0628\u0627\u0631\u0647 \u06cc\u06a9 \u0641\u0631\u0645\u0627\u0646 \u06a9\u0633\u0628 \u0645\u06cc\u06a9\u0646\u06cc\u062f. helpUnknownCommand=Unknown command. -helpDM=Documentation can be found at\:\nhttps\://fredboat.com/docs\n\nWant to add FredBoat to your server? If you have Manage Server permissions for your guild, you can invite it here\:\n*This one doesn''t play music*\n\n\nIf you want to add the music bot, you will want to invite this bot\:\n\n\nNeed help or have any ideas for the bot? Perhaps you just want to hang out? Come on over to FredBoat hangout\!\n{0}\n\nYou cannot send this bot commands through DM.\nBot created by Fre_d +helpDocsLocation=Documentation can be found at\: +helpBotInvite=Want to add FredBoat to your server? If you have Manage Server permissions for your guild, you can invite FredBoat\: +helpHangoutInvite=Need help or have any ideas for FredBoat? Perhaps you just want to hang out? Join the FredBoat community\! +helpNoDmCommands=You cannot send FredBoat commands through DMs. +helpCredits=Created by Fre_d and open source contributors helpSent=Documentation has been sent to your DMs\! helpProperUsage=\u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0635\u062d\u06cc\u062d\: helpCommandOwnerRestricted=This command is restricted to the owner of the bot. diff --git a/FredBoat/src/main/resources/lang/fi_FI.properties b/FredBoat/src/main/resources/lang/fi_FI.properties index eafdef9fb..73f78187b 100644 --- a/FredBoat/src/main/resources/lang/fi_FI.properties +++ b/FredBoat/src/main/resources/lang/fi_FI.properties @@ -183,7 +183,7 @@ ratelimitedGeneralInfo=Sinut on rajoitettu k\u00e4ytt\u00e4m\u00e4st\u00e4 liika ratelimitedSkipCommand=Voit ohittaa useamman kuin yhden kappaleen k\u00e4ytt\u00e4m\u00e4ll\u00e4 t\u00e4t\u00e4 komentoa\: {0} ratelimitedGuildSlowLoadingPlaylist=T\u00e4m\u00e4 serveri ei saa lis\u00e4t\u00e4 yht\u00e4\u00e4n enemp\u00e4\u00e4 soittolistaa t\u00e4ll\u00e4 hetkell\u00e4. \u00c4l\u00e4 lis\u00e4\u00e4 ylti\u00f6m\u00e4\u00e4r\u00e4\u00e4 pitki\u00e4 soittolistoja. unblacklisted={0} poistettiin mustalta listalta. -serverinfoTitle=Tietoja t\u00e4st\u00e4 serverist\u00e4 **{0}**\: +serverinfoTitle=Tietoja t\u00e4st\u00e4 serverist\u00e4 {0}\: serverinfoOnlineUsers=K\u00e4ytt\u00e4ji\u00e4 paikalla\: serverinfoTotalUsers=K\u00e4ytt\u00e4ji\u00e4 yhteens\u00e4\: serverinfoRoles=Roolit\: @@ -193,7 +193,7 @@ serverinfoGuildID=Palvelimen tunniste\: serverinfoCreationDate=Luontip\u00e4iv\u00e4m\u00e4\u00e4r\u00e4\: serverinfoOwner=Omistaja\: serverinfoVLv=Vahvistustaso\: -userinfoTitle=Tietoja t\u00e4st\u00e4 henkil\u00f6st\u00e4 **{0}**\: +userinfoTitle=Informaatio {0}\: userinfoUsername=K\u00e4ytt\u00e4j\u00e4nimi\: userinfoId=Tunnus\: userinfoNick=Nimimerkki\: @@ -212,7 +212,11 @@ commandsMaintenance=Huolto commandsBotOwner=Botin omistaja commandsMoreHelp=Sano {0} saadaksesi lis\u00e4tietoa tietyst\u00e4 komennosta. helpUnknownCommand=Tuntematon komento. -helpDM=Haluatko lis\u00e4t\u00e4 Fredboardin serverillesi? Jos sinulla on manage servers permissionit serverill\u00e4, voit lis\u00e4t\u00e4 sen t\u00e4ll\u00e4 linkill\u00e4 (t\u00e4m\u00e4 ei soita musiikkia)\: \n\nJos haluat lis\u00e4t\u00e4 musiikki botin, lis\u00e4\u00e4 t\u00e4m\u00e4\: \n\nTarvitsetko apua tai sinulla on ideoita bottia varten? Tai haluat vain olla jossain? Tule FredBoat hangouttiin\: {0}\n\nEt voi l\u00e4hett\u00e4\u00e4 t\u00e4lle botilla viestej\u00e4 yksityisesti\!\n\nBotin teki Fre_d +helpDocsLocation=Dokumentit l\u00f6yt\u00e4\u00e4\: +helpBotInvite=Haluatko lis\u00e4t\u00e4 FredBoatin serverillesi? Jos sinulla on Serverin Muutto oikeudet, voit lis\u00e4t\u00e4 FredBoatin\: +helpHangoutInvite=Tarvitko apua tai ideoita FredBoattia varten? Vai haluatko vain hengailla? Liity FredBoatin ryhm\u00e4\u00e4n\! +helpNoDmCommands=Et voi l\u00e4hett\u00e4\u00e4 FredBoatille komentoja yksityisviestill\u00e4. +helpCredits=Tekij\u00e4\: Fre_d ja avoimenl\u00e4hteen avustajat helpSent=Dokumentaatio on l\u00e4hetetty sinun yksityisviesteihisi\! helpProperUsage=Asianmukainen k\u00e4ytt\u00f6\: helpCommandOwnerRestricted=T\u00e4m\u00e4 komento on rajoitettu vain botin omistajalle. @@ -231,14 +235,14 @@ helpRepeatCommand=Vaihda toistomuotojen v\u00e4lill\u00e4. helpReshuffleCommand=Sekoita nykyinen soittolista. helpSelectCommand=Valitse yksi tarjotuista kappaleista haun j\u00e4lkeen soittaaksesi sen. helpShuffleCommand=Vaihda sekoitustila p\u00e4\u00e4lle nykyiselle soittolistalle. -helpSkipCommand=Skip the current song, the n'th song in the queue, all songs from n to m, or all songs from mentioned users. Please use in moderation. +helpSkipCommand=Ohita nykyinen laulu, Muut laulut jonosta, tai kaikki laulut. K\u00e4yt\u00e4 moderaattorina. helpStopCommand=Pys\u00e4yt\u00e4 soitin ja raivaa t\u00e4m\u00e4nhetkinen soittolista. K\u00e4yt\u00f6ss\u00e4 moderaattoreille jotka pystyv\u00e4t hallitsemaan viestej\u00e4. helpUnpauseCommand=Anna soittimen jatkaa. helpVolumeCommand=S\u00e4\u00e4t\u00e4 \u00e4\u00e4nenvoimakkuutta. Arvot ovat 0-150 ja 100 on oletusarvo. \u00c4\u00e4nenvoimakkuus komento on poistettu k\u00e4yt\u00f6st\u00e4 julkisella botilla. helpExportCommand=Vie t\u00e4m\u00e4nhetkinen soittolista hastebin linkkiin, jotta voit k\u00e4ytt\u00e4\u00e4 sit\u00e4 my\u00f6hemmin soittolistana. helpGensokyoRadioCommand=N\u00e4yt\u00e4 t\u00e4m\u00e4nhetkinen kappale gensokyoradio.netiss\u00e4 helpListCommand=N\u00e4yt\u00e4 luettelo t\u00e4m\u00e4nhetkisist\u00e4 kappaleista soittolistassa. -helpHistoryCommand=Display a list of the songs in playlist history. +helpHistoryCommand=N\u00e4yt\u00e4 lista musiikeista soittohistoriassa. helpNowplayingCommand=N\u00e4yt\u00e4 parhaillaan toistettava kappale. helpForwardCommand=Vie kappaletta eteenp\u00e4in tietyll\u00e4 m\u00e4\u00e4r\u00e4ll\u00e4 aikaa. Esimerkiksi\: helpRestartCommand=K\u00e4ynnist\u00e4 parhaillaan soiva kappale uudelleen. @@ -257,16 +261,16 @@ helpSayCommand=Laita botti toistamaan jotain kaikuna. helpServerInfoCommand=N\u00e4yt\u00e4 joitakin tilastoja t\u00e4st\u00e4 killasta. helpUserInfoCommand=N\u00e4yt\u00e4 tietoja itsest\u00e4si tai botin tiedossa olevista k\u00e4ytt\u00e4jist\u00e4. helpPerms=Sallii k\u00e4ytt\u00e4jien ja roolien valkolistaamisen {0} arvolle. -helpPrefixCommand=Set the prefix for this guild. +helpPrefixCommand=Aseta etuliite t\u00e4lle ryhm\u00e4lle. helpVoteSkip=\u00c4\u00e4nest\u00e4 skipataksesi biisi. 50% k\u00e4ytt\u00e4jist\u00e4 puhekanavalle t\u00e4ytyy \u00e4\u00e4nest\u00e4\u00e4. helpMathOperationAdd=Laske numero 1 + numero 2. -helpMathOperationSub=Print the difference of subtracting num2 from num1. -helpMathOperationMult=Print the product of num1*num2. -helpMathOperationDiv=Print the quotient of dividing num1 by num2. -helpMathOperationMod=Print the remainder of dividing num1 by num2. -helpMathOperationPerc=Print the percentage represented by num1 in num2. -helpMathOperationSqrt=Print the square root of num. -helpMathOperationPow=Print the result of num1^num2. +helpMathOperationSub=Muuta ero numero 2\:n v\u00e4henemisest\u00e4 numero 1\:seen +helpMathOperationMult=Muunna numero 1\: sen ja numero 2\: sen ero. +helpMathOperationDiv=Munna numero 1\: sen ja numero 2\: sen jakautuminen. +helpMathOperationMod=Muunna nykyinen tulos jaetun kanssa. +helpMathOperationPerc=Muunna numeron 1 ja 2 prosenttiosuus. +helpMathOperationSqrt=Muunna numeroiden neli\u00f6juuri. +helpMathOperationPow=Muunna numero 1\: sen ja 2\: sen ero. destroyDenied=Sinulla pit\u00e4\u00e4 olla hallitse viestej\u00e4 oikeus nollataksesi soittimen. destroyHelp=Nollaa soitin ja tyhjenn\u00e4 jono. Tarkoitettu yll\u00e4pit\u00e4jille joilla on hallitse viestej\u00e4 oikeus. destroySucc=Soitin on nollattu ja jono tyhjennetty. @@ -275,27 +279,27 @@ permsListTitle=K\u00e4ytt\u00e4j\u00e4t ja roolit joilla on oikeus\: {0} permsAdded=Lis\u00e4ttiin `{0}` kohteeseen `{1}`. permsRemoved=Poistettiin `{0}`kohteesta `{1}`. permsFailSelfDemotion=Et voi poistaa t\u00e4t\u00e4, koska se poistaisi sinulta j\u00e4rjestelm\u00e4valvojan oikeuden\! -permsAlreadyAdded={0} already added to {1} -permsNotAdded={0} is not in {1} +permsAlreadyAdded={0} on jo lis\u00e4tty {1} +permsNotAdded={0} ei ole {1} fuzzyMultiple=L\u00f6ydettiin useita kohteita. Tarkoititko mit\u00e4\u00e4n n\u00e4ist\u00e4? fuzzyNothingFound=Ei tuloksia haulla `{0}`. cmdPermsTooLow=Sinulla ei ole tarvittavia oikeuksia kyseisen komennon k\u00e4ytt\u00e4miseen\! T\u00e4m\u00e4 komento vaatii `{0}`, mutta sinulla on vain `{1}`. -playersLimited=FredBoat is currently at maximum capacity\! The bot is currently fixed to only play up to `{0}` streams, otherwise we would risk disconnecting from Discord under the network load.\nIf you want to help us increase the limit or you want to use our non-overcrowded bot, please support our work on Patreon\:\n{1}\n\nSorry for the inconvenience\! You might want to try again later. This message usually only appears at peak time. +playersLimited=FredBoat on t\u00e4ll\u00e4 hetkell\u00e4 t\u00e4ynn\u00e4. Botti on t\u00e4ll\u00e4 hetkell\u00e4 korjattavana ja voi toistaa yli `{0}`\nStriimi\u00e4, muuten se voi menett\u00e4\u00e4 yhteytens\u00e4 discordiin netti loadin alla. Jos haluat meid\u00e4n lis\u00e4\u00e4v\u00e4n maksimim\u00e4\u00e4r\u00e4\u00e4 tai haluat k\u00e4ytt\u00e4\u00e4 loputonta m\u00e4\u00e4r\u00e4\u00e4, Ota yhteytt\u00e4 Patreoniin\:\n{1}\n\nAnteeksi h\u00e4iri\u00f6st\u00e4\! Voit yritt\u00e4\u00e4 pian uudelleen. T\u00e4m\u00e4 viesti yleens\u00e4 tulee vain aikana, jolloin botti kaatuu. tryLater=Yrit\u00e4 uudestaan my\u00f6hemmin. -skipUserSingle=Skipped {0} added by {1}. -skipUserMultiple=Skipped {0} tracks added by {1}. -skipUsersMultiple=Skipped {0} tracks added by {1} users. -skipUserNoTracks=None of the mentioned users have any tracks queued. +skipUserSingle=Skipattu {0} ja lis\u00e4tty {1}. +skipUserMultiple=Skipattu {0} Musiikkej\u00e4 lis\u00e4si\: {1}. +skipUsersMultiple=Skipattu {0} Musiikkeja lis\u00e4tty {1} k\u00e4ytt\u00e4j\u00e4. +skipUserNoTracks=Yksik\u00e4\u00e4n mainituista k\u00e4ytt\u00e4jist\u00e4 ei omista lauluja musiikkijonossa. voteSkipAdded=\u00c4\u00e4nesi on otettu huomioon\! voteSkipAlreadyVoted=\u00c4\u00e4nestit jo skipataksesi t\u00e4m\u00e4n biisin\! voteSkipSkipping={0} ihmist\u00e4 on \u00e4\u00e4nest\u00e4nyt ohittamista. Ohitetaan biisi {1}. voteSkipNotEnough={0} \u00e4\u00e4nesti ohitusta. V\u00e4hint\u00e4\u00e4n {1} tarvitaan. voteSkipEmbedNoVotes=Ei \u00e4\u00e4ni\u00e4 ohittaa biisi\u00e4 viel\u00e4. -voteSkipEmbedVoters={0} out of {1} have voted to skip the current track +voteSkipEmbedVoters={0} pois {1} on ehdottanut ohittaa nykyist\u00e4 laulua mathOperationResult=Tulos on mathOperationDivisionByZeroError=En voi jakaa nollalla. -mathOperationInfinity=The number is too big to be displayed\! -prefix=Prefix -prefixGuild=The prefix for this guild is {0} -prefixShowAgain=You can show the prefix anytime again by mentioning me. +mathOperationInfinity=Numero on liian iso n\u00e4ytett\u00e4v\u00e4ksi\! +prefix=Etuliite +prefixGuild=T\u00e4m\u00e4n ryhm\u00e4n etuliite on {0} +prefixShowAgain=Voit n\u00e4ytt\u00e4\u00e4 etuliitteen aina, mainitsemalla minut. diff --git a/FredBoat/src/main/resources/lang/fil_PH.properties b/FredBoat/src/main/resources/lang/fil_PH.properties index d1fb1c530..2298dbde3 100644 --- a/FredBoat/src/main/resources/lang/fil_PH.properties +++ b/FredBoat/src/main/resources/lang/fil_PH.properties @@ -45,7 +45,7 @@ exportPlaylistFail=Hindi na upload ang mga tugtog sa hastebin.com listShowShuffled=Pinapakita ang halohalong tugtogan. listShowRepeatSingle=Uulitin ang kasalukuyang track. listShowRepeatAll=Uulitin ang kasalukuyang mga nakalista. -listShowHistory=Showing tracks in history. +listShowHistory=Pagpapakita ng bakas sa kasaysayan. listAddedBy=**{0}** idinagdag ni **{1}** `[{2}]` listStreamsOnlySingle=Merong **{0}** live {1} sa loob ng listahan. listStreamsOnlyMultiple=Merong mga **{0}** live {1} sa loob ng listahan. @@ -57,7 +57,7 @@ listAsWellAsLiveStreams=, pati * *{0} * * live {1} trackSingular=subaybayan ang trackPlural=mga track npNotPlaying=Kasalukuyang hindi nag plaplay ng kahit ano. -npNotInHistory=Currently no tracks in history. +npNotInHistory=Kasalukuyang walang bakas sa kasaysayan. npDescription=Description npLoadedSoundcloud=[{0}/{1}]\n\nNakuha mula sa Soundcloud npLoadedBandcamp={0}\n\nNakuha mula sa Bandcamp @@ -74,7 +74,7 @@ npLoadedFromHTTP={0}\n\nNakuha mula sa {1} npLoadedDefault={0}\n\nNakuha mula sa {1} noneYet=Wala pa npRatingRange={0}/5 galing sa {1} boto -fwdSuccess=Forwarding **{0}** by {1}. +fwdSuccess=Pagpapasulong ng **{0}** sa {1}. restartSuccess=* *{0} * * ay na-restart na. queueEmpty=Walang nakalagay sa listahan. rewSuccess=Ni-rerewind ang * *{0} * * ng {1}. @@ -124,142 +124,146 @@ malUrl={0}**URL\: **{1}\n luaError=\ Nagkaroon ng isang error ng Lua ang \:anger\: '' ''{0} '' '' luaErrorOutputTooBig=\ Masyadong malaki ang output buffer \:anger\: Ang Discord ay nagpapahintulot lamang ng 2000 na characters kada message, mayroong {0} luaTimeout=\ Nag-time out ang function \:anger\: Ang pinahintulutuang computation time ay {0} segundo. -helpSuccess=Documentation has been sent to your direct messages\! -helpDmFailed=Could not send documentation to your DMs. Please check that you don't have them disabled\! -helpCommandsPromotion=Say {0} to learn what this bot can do\! +helpSuccess=Ang dokumentasyon ay ipinadala direkta sa inyong mensahe\! +helpDmFailed=Maaaring hindi kayang magpadala ng dokumentasyon sa inyong DMs. Pakiusap pakitignan na wala sa kanilang may kapansanan\! +helpCommandsPromotion=Sabihin {0} para malaman kung anong kayang gawin ng bot na ito\! fuzzyNoResults=Walang ganitong mga gumagamit -brainfuckCycleLimit=Program exceeded the maximum cycle count of {0} -brainfuckDataPointerOutOfBounds=Data pointer out of bounds\: {0} -brainfuckInputOOB=Input out of bounds at position\: {0} -brainfuckNoOutput=\ There was no output -weatherLocationNotFound=Unable to find location, please check your input {0}. -weatherError=Error retrieving weather for {0} -avatarSuccess=\ found it\n{0} -configNoArgs=Configuration for **{0}**\:``` -configSetTo=is now set to `{0}`. -configUnknownKey={0}\: Unknown key. -configMustBeBoolean={0}\: Value must be true or false. -modReason=Reason -modAuditLogMessage=Action issued by {0}\#{1} [{2}] -modFailUserHierarchy=You do not have a higher role than {0}. -modFailBotHierarchy=I need to have a higher role than {0}. -modBanFail=Failed to ban {0} -modKickBanFailUserPerms=You must have permission to kick and ban to be able to use this command. -modBanBotPerms=I need to have permission to ban members. -modKickBotPerms=I need to have permission to kick members. -kickSuccess=User {0}\#{1} [{2}] has been kicked. -kickFail=Failed to kick {0} -kickFailSelf=You can't kick yourself. -kickFailOwner=You can't kick the server owner. -kickFailMyself=I can't kick myself. -kickFailUserPerms=You must have permission to kick to be able to use this command. -softbanSuccess=User {0}\#{1} [{2}] has been softbanned. -softbanFailSelf=You can't softban yourself. -softbanFailOwner=You can't softban the server owner. -softbanFailMyself=I can't softban myself. -hardbanSuccess=User {0}\#{1} [{2}] has been banned. -hardbanFailSelf=You can't ban yourself. -hardbanFailOwner=You can't ban the server owner. -hardbanFailMyself=I can't ban myself. -getidSuccess=The id of this guild is {0}. The id of this text channel is {1}. -statsParagraph=\ This bot has been running for {0} days, {1} hours, {2} minutes and {3} seconds.\nThis bot has executed {4} commands this session. -statsRate={0}That''s a rate of {1} commands per hour -catgirlFail=Failed to extract image from {0} -catgirlFailConn=Failed to connect to {0} -hugBot=Thanks for the hugs \:blush\: -hugSuccess=Hugs {0}. -patBot=Thanks for the pats \:blush\: -patSuccess=Pats {0}. -rollSuccess={0} rolls around on the floor. -facedeskSuccess={0} facedesks. -langInvalidCode=The language code {0} doesn''t exist or is unsupported. -langSuccess=Switched to speaking {0}. -langInfo=FredBoat supports several user-contributed languages that you can select with this command. Admins on this server can select a language with `;;lang ` Here is the full list of supported languages\: -langDisclaimer=Translations may not be 100% accurate or complete. Missing translations may be contributed at . -loadSingleTrack=**{0}** has been added to the queue. -loadSingleTrackAndPlay=**{0}** will now play. -invite=Invite link for **{0}**\: -ratelimitedGeneralInfo=You are being rate limited\! Please slow down. -ratelimitedSkipCommand=You can skip more than one song by using this command\: {0} -ratelimitedGuildSlowLoadingPlaylist=This server is not allowed to add more playlists at this moment. Please don't spam long playlists. -unblacklisted=Removed {0} from the blacklist. -serverinfoTitle=Info about **{0}**\: -serverinfoOnlineUsers=Online Users\: -serverinfoTotalUsers=Total Users\: +brainfuckCycleLimit=Ang programa ay lumagpas sa pinakamataas na siklo ng pagbibilang {0} +brainfuckDataPointerOutOfBounds=Ang panturo ng datos ay lumabas sa mga hanggan\: {0} +brainfuckInputOOB=Mag input sa labas ng mga posisyon ng mg hangganan\: {0} +brainfuckNoOutput=\ Diyan ay walang output +weatherLocationNotFound=Hindi makita ang inyong lokasyon, Pakiusap pakitignan ang inyong input {0}. +weatherError=Maling pagkuha para sa panahon {0} +avatarSuccess=\ natagpuan ito {0} +configNoArgs=Kompigurasyon para sa **{0}**\:``` +configSetTo=ito ay nakatakda na ngayon `{0}`. +configUnknownKey={0}\: Hindi kilala na susi. +configMustBeBoolean={0}\: Ang halaga ay kailangan tama or mali. +modReason=Dahilan +modAuditLogMessage=Mula sa aksyon na inilabas ng {0}\#{1} [{2}] +modFailUserHierarchy=Wala ka ng mataas na tungkulin kasya sa {0}. +modFailBotHierarchy=Kailangan kong magkaroon ng mas mataas na tungkulin kaysa sa {0}. +modBanFail=Nabigo sa pagbabawal sa {0} +modKickBanFailUserPerms=Kailangan mong magkaroon ng pahintulot na sipain at pagbawalan upang hindi magamit ang kautosang ito. +modBanBotPerms=Kailangan kong magkaroon ng pahintulot para pagbawalan ang mga miyembro. +modKickBotPerms=Kailangan kong magkaroon ng pahintulot para sipain ang mga miyembro. +kickSuccess=Ang mga gumagamit ng {0}\#{1} [{2}] ay pinagsisipa. +kickFail=Nabigo sa pagsipa {0} +kickFailSelf=Hindi mo kayang sipain ang iyong sarili. +kickFailOwner=Hindi mo kayang sipain ang may ari ng serber. +kickFailMyself=Hindi ko kayang sipain ang aking sarili. +kickFailUserPerms=Kailangan mong magkaroon ng pahintulot na sipain at pagbawalan upang hindi magamit ang kautosang ito. +softbanSuccess=Ang gumagamit {0}\#{1} [{2}] ay pansamatalang pinagbawalan. +softbanFailSelf=Hindi mo kayang pansamantalang pagbawalan ang iyong sarili. +softbanFailOwner=Hindi mo kayang pansamantalang pagbawalan ang may ari ng serber. +softbanFailMyself=Hindi ko kayang pagbawalan ng pansamantala ang aking sarili. +hardbanSuccess=Ang mga gumagamit ng {0}\#{1} [{2}] ay pinagbawalan. +hardbanFailSelf=Hindi mo kayang pagbawalan ang iyong sarili. +hardbanFailOwner=Hindi mo kayang pagbawalan ang may ari ng serber. +hardbanFailMyself=Hindi ko kayang pagbawalan ang aking sarili. +getidSuccess=Ang id ng mga samahan ay {0}. Ang id ng tsanel ng tekstong ito ay {1}. +statsParagraph=\ Ang bot na ito ay tumatakbo para sa {0} araw, {1} oras, {2} minuto at {3} segundo. Ang bot na ito ay magsasagawa ng {4} utos sa sesyong ito. +statsRate={0} Yan ang halaga ng {1} ng utos kada oras +catgirlFail=Nabigo sa paghugot ng larawan mula sa {0} +catgirlFailConn=Nabigong kumoknekta sa {0} +hugBot=Maraming salamat sa mga yakap \:blush\: +hugSuccess=Mga yakap {0}. +patBot=Maraming salamat sa pagtapik \:blush\: +patSuccess=Mga tapik {0}. +rollSuccess={0} gumulong sa palibot ng sahig. +facedeskSuccess={0} mukhasulatan. +langInvalidCode=Ang kowd para sa lengwahe {0} ay hindi umiiral o kaya ay hindi suportado. +langSuccess=Lumipat para sa pagsasalit {0}. +langInfo=Ang FredBoat ay sinusuportahan ang mga gumagamit, nag-ambag ng wikang iyong mapipili sa komandong ito. Ang taga pangasiwa sa serber na ito ay may kakayahang pumili ng wika ng `;;lang ` Ito ang kabuoang listahan ng mga suportadong wika\: +langDisclaimer=Ang pagpapalit ay maaaring hindi 100% na tumpak o kumpleto. Ang pagpapalit na nawawala ay maaaring naiambag dito sa . +loadSingleTrack=**{0}** ay naidagdag na sa pagpipilian. +loadSingleTrackAndPlay=**{0}** ay tumutugtog ngayon. +invite=Mag-imbita ng mga link para sa **{0}**\: +ratelimitedGeneralInfo=Ang iyong halaga ay limitado lang\! Kaya pakiusap huminahon ka muna. +ratelimitedSkipCommand=Maaaring mong laktawan ng higit sa isa ang mga awitin sa pamamagitan ng pindutang ito\: {0} +ratelimitedGuildSlowLoadingPlaylist=Ang serber na ito ay pansamantalang hindi pwedeng mag dagdag ng maraming palatugtogan. Pakiusap huwag iispam ang mahabang palatugtogan. +unblacklisted=Tinanggal {0} mula sa pagkakablaklist. +serverinfoTitle=Impormasyon tungkol sa {0}\: +serverinfoOnlineUsers=Online ang mga gumagamit\: +serverinfoTotalUsers=Lahat ng mga gumagamit\: serverinfoRoles=Mga tungkulin\: serverinfoText=Text ka nya -serverinfoVoice=Voice Channels\: -serverinfoGuildID=Guild ID\: -serverinfoCreationDate=Creation Date\: -serverinfoOwner=Owner\: -serverinfoVLv=Verification Level\: -userinfoTitle=Information about **{0}**\: +serverinfoVoice=Tsanel ng boses\: +serverinfoGuildID=ID ng kapisanan\: +serverinfoCreationDate=Petsa ng pagkakagawa\: +serverinfoOwner=Nagmamay-ari\: +serverinfoVLv=Antas ng pagpapatunay\: +userinfoTitle=Impormasyon tungkol sa {0}\: userinfoUsername=Username\: userinfoId=ID\: -userinfoNick=Nickname\: -userinfoKnownServer=Known Servers\: -userinfoJoinDate=Join Date\: -userinfoCreationTime=Creation Date\: +userinfoNick=Palayaw\: +userinfoKnownServer=Kilalang mga serber\: +userinfoJoinDate=Petsa ng pagsali\: +userinfoCreationTime=Petsa ng pagkakagawa\: userinfoBlacklisted=Blacklisted\: -skipDeniedTooManyTracks=You can't skip someone else's tracks if you are not a DJ.\nConsider using the Voteskip command. -eventUsersLeftVC=All users have left the voice channel. The player has been paused. -eventAutoResumed=User presence detected, automatically resuming the player. -commandsFun=Fun +skipDeniedTooManyTracks=Hindi mo pwedeng laktawan ang traks ng iba kung hindi ka isang DJ. Konsindera na gamitin ang Voteskip na pindutan. +eventUsersLeftVC=Nagsi-alisan ang lahat ng gumagamit sa stanel ng mga boses. Inihinto ang pagpapatugtog. +eventAutoResumed=Natukoy ang kinaroroonan ng mga gumagamit, awtomatiko ang pagpapatutog muli. +commandsFun=Masaya commandsMemes=Memes -commandsUtility=Utility -commandsModeration=Moderation -commandsMaintenance=Maintenance -commandsBotOwner=Bot owner -commandsMoreHelp=Say {0} to get more information on a specific command. -helpUnknownCommand=Unknown command. -helpDM=Documentation can be found at\:\nhttps\://fredboat.com/docs\n\nWant to add FredBoat to your server? If you have Manage Server permissions for your guild, you can invite it here\:\n*This one doesn''t play music*\n\n\nIf you want to add the music bot, you will want to invite this bot\:\n\n\nNeed help or have any ideas for the bot? Perhaps you just want to hang out? Come on over to FredBoat hangout\!\n{0}\n\nYou cannot send this bot commands through DM.\nBot created by Fre_d -helpSent=Documentation has been sent to your DMs\! -helpProperUsage=Proper usage\: -helpCommandOwnerRestricted=This command is restricted to the owner of the bot. -helpConfigCommand=Show the config of this guild or adjust settings. -helpLanguageCommand=Show available languages or set a language for this guild. -helpHardbanCommand=Ban a user and delete his messages from the last 7 days. -helpKickCommand=Kick a user from this guild. -helpSoftbanCommand=Softban a user by kicking him and deleting his messages from the last 7 days. -helpMusicCommandsHeader=FredBoat Music Commands -helpJoinCommand=Make the bot join your current voice channel. -helpLeaveCommand=Make the bot leave the current voice channel. -helpPauseCommand=Pause the player. -helpPlayCommand=Play music from the given URL or search for a track. For a full list of sources please visit {0} -helpPlaySplitCommand=Split a YouTube video into a tracklist provided in it's description. -helpRepeatCommand=Toggle between repeat modes. -helpReshuffleCommand=Reshuffle the current queue. -helpSelectCommand=Select one of the offered tracks after a search to play. -helpShuffleCommand=Toggle shuffle mode for the current queue. -helpSkipCommand=Skip the current song, the n'th song in the queue, all songs from n to m, or all songs from mentioned users. Please use in moderation. -helpStopCommand=Stop the player and clear the playlist. Reserved for moderators with Manage Messages permission. -helpUnpauseCommand=Unpause the player. -helpVolumeCommand=Changes the volume. Values are 0-150 and 100 is the default. The volume command is deprecated on the public bot. -helpExportCommand=Export the current queue to a hastebin link, can be later used as a playlist. -helpGensokyoRadioCommand=Show the current song played on gensokyoradio.net -helpListCommand=Display a list of the current songs in the playlist. -helpHistoryCommand=Display a list of the songs in playlist history. -helpNowplayingCommand=Display the currently playing song. -helpForwardCommand=Forward the track by a given amount of time. Example\: -helpRestartCommand=Restart the currently playing track. -helpRewindCommand=Rewind the track by a given amount of time. Example\: -helpSeekCommand=Set the position of the track to the given time. Example\: -helpAvatarCommand=Display the avatar of a user. -helpBrainfuckCommand=Executes Brainfuck code. Example\: -helpWeatherCommand=Display current weather by location. -helpClearCommand=Delete all messages by this bot in the last 50 messages of this channel. -helpCommandsCommand=Show available commands. -helpHelpCommand=Receive help for this bot or help for any command. -helpInviteCommand=Post invite link for this bot. -helpMALCommand=Search MyAnimeList and display an anime or profile of a user. -helpMusicHelpCommand=Show music commands and their usage. -helpSayCommand=Make the bot echo something. -helpServerInfoCommand=Display some stats about this guild. -helpUserInfoCommand=Display information about yourself or a user known to the bot. -helpPerms=Allows whitelisting members and roles for the {0} rank. -helpPrefixCommand=Set the prefix for this guild. -helpVoteSkip=Vote to skip the current song. Needs 50% of all users in the voice chat to vote. -helpMathOperationAdd=Print the sum of num1 and num2. +commandsUtility=Kagamitan +commandsModeration=Moderasyon +commandsMaintenance=Pagpapanatili +commandsBotOwner=May-ari ng bot +commandsMoreHelp=Sabihin na {0} kumuha ng maraming impormasyon sa partikular na pindutan. +helpUnknownCommand=Di-matukoy na pindutan. +helpDocsLocation=Ang dokumento ay matatagpuan sa\: +helpBotInvite=Gusto mong bang magdagdag ng FredBoat sa iyong serber? Kung pinapangasiwaan mo ang pahintulot ng seber para sa iyong guild, Maaaring mong maimbita ang FredBoat\: +helpHangoutInvite=Kailangan ng tulong o mayroong kahit anong ideya para sa FredBoat? Marahil ay guto mong umistambay? Sumali sa kominidad ng FredBoat\! +helpNoDmCommands=Hindi ka pwedeng magpadala ng FredBoat na mga utos sa pamamagitan ng DMs. +helpCredits=Ginawa sa pamamagitan ni Fre_d at sa mga nagambag ng open source +helpSent=Ang dokumentasyon ay ipinadala sa inyong DMs\! +helpProperUsage=Wastong paggamit\: +helpCommandOwnerRestricted=Ang pindutan na ito ay takda ng may ari ng mga bot. +helpConfigCommand=Ipakita ang kumpig ng guild na ito o kaya ay ayosin ang mga setings. +helpLanguageCommand=Ipakita ang mga wikang pwede or magtakda ng mga wika sa guild na ito. +helpHardbanCommand=Pagbawalan ang gumagami na burahin ang mga mensahe sa nakalipas na pitong araw. +helpKickCommand=Patalsikin ang mga gumgamit sa guild na ito. +helpSoftbanCommand=Pansamantalang pagbabawal sa mga gumagamit na pagsipa sa kanya at pagbubura ng mga mensahe mula sa nakalipas na pitong 7 araw. +helpMusicCommandsHeader=FredBoat Direksyon ng Musika +helpJoinCommand=Gumawa ang bot para sumali sa inyong kasalukuyang tsanel ng tinig. +helpLeaveCommand=Nagawa na bot na iwanan ang kasalukuyang tsanel ng tinig. +helpPauseCommand=Ihinto ang musiko. +helpPlayCommand=Magpatugtog ng musika mula sa ibinigay na URL o kaya ay humanap sa trak. Para sa kabuong listahan ng mapagkukunan mangyaring bisitahin ang {0} +helpPlaySplitCommand=Nahati ang bidyo sa YouTube sa traklis na inilalalaan sa paglalarawan. +helpRepeatCommand=Magpaulit-ulit sa pagitan ng inulit na modes. +helpReshuffleCommand=Pag-aayos sa kasalukuyang pila. +helpSelectCommand=Pumili ng isa sa mga inaalok ng traks pagkatapos ng paghahanap para patutugin. +helpShuffleCommand=Toggle ayusin ang mode para sa kasalukuyang pila. +helpSkipCommand=Laktawan ang kasalukuyang awitin, ang n'th na awitin sa mga pagpipilian, ang lahat ng awitin mula sa n to m, o kaya ang lahat ng awitin mula sa nabanggit ng mga gumagamit. Pakiusap gamitin lamang sa kahinahunan. +helpStopCommand=Ihinto ang pagpapatugtutog at linisin ang listahan. Nakareserba para sa moderators sa pahintulot ng pangangasiwa ng mga mensahe. +helpUnpauseCommand=Alisin sa pagkakahinto ang tugtog. +helpVolumeCommand=Hinaan ang tunog. Ang halaga ay 0-150 at 100 ang pangunahin. Ang tunog ay naririnig sa publiko ng bot. +helpExportCommand=I-eksport ang kasulukuyang pagpipilian para sa hastebin link, Kalaunan ay magagamit bilang isang palatugtugan. +helpGensokyoRadioCommand=Ipakita ang kasalukuyang awiting tumutugtog sa gensokyoradio.net +helpListCommand=Ihayag ang kasalukuyang listahan ng mga kana sa palagtugtugan. +helpHistoryCommand=Ihayag ang listahan ng mga awitin sa kasaysayan ng palatugtugan. +helpNowplayingCommand=Ihayag ang kasalukuyang awiting pinapatugtog. +helpForwardCommand=Madaliin ang trak na nagbibigay ng maraming oras. Halimbawa\: +helpRestartCommand=Ulitin ang kasalukuyang trak ng tugtog. +helpRewindCommand=Madaliin ang trak na nagbibigay ng maraming oras. Halimbawa\: +helpSeekCommand=Ayosin ang posisyon ng mga trak sa ibinigay na oras. Halimbawa\: +helpAvatarCommand=Ipakita ang hitsura ng mga gumagamit. +helpBrainfuckCommand=Patayin ang kowd ng brainfuck. Halimbawa\: +helpWeatherCommand=Ihayag ang kasalukuyang lokasyon ng panahon. +helpClearCommand=Burahin ang lahat ng mensahe sa bot na ito sa nakalipas na 50 na mensahe sa tsanel na ito. +helpCommandsCommand=Ipakita ang mga pwedeng pindutan. +helpHelpCommand=Tanggapin ang tulong mula sa bot na ito o kaya ay tulongan ang anumang gawain. +helpInviteCommand=I-post ang link ng mga imbitado sa bot na ito. +helpMALCommand=Hanapin ang listahan ng aking anime at ihayag ang anime o kaya ay propayl ng mga gumagamit. +helpMusicHelpCommand=Ipakita ang pindutang ng musika at ang kanilang gamit. +helpSayCommand=Gumagawa ng bot na alingawngaw. +helpServerInfoCommand=Ihayag ang ilang estadistika tungkol sa guild na ito. +helpUserInfoCommand=Ihayag ang imporsyon tungkol sa iyong sarili o kaya ay mga gumagamit na kilala ang bot. +helpPerms=Payagan ang mga miyembro ng putinglistahan at gampanan para sa {0} ranggo. +helpPrefixCommand=Itakda ang unlapit para sa guild na ito. +helpVoteSkip=Bumoto para malaktawan ang kasalukuyang awitin. Kailangan ang 50% ng lahat ng gumagamit ng tinig sa usapan upang bumoto. +helpMathOperationAdd=I-print ang kabuuan ng num1 at num2. helpMathOperationSub=Print the difference of subtracting num2 from num1. helpMathOperationMult=Print the product of num1*num2. helpMathOperationDiv=Print the quotient of dividing num1 by num2. @@ -291,11 +295,11 @@ voteSkipAlreadyVoted=You already voted to skip this track\! voteSkipSkipping={0} have voted to skip. Skipping track {1}. voteSkipNotEnough={0} have voted to skip. At least {1} needed. voteSkipEmbedNoVotes=No votes to skip this track yet. -voteSkipEmbedVoters={0} out of {1} have voted to skip the current track -mathOperationResult=The result is -mathOperationDivisionByZeroError=I cannot divide by zero. -mathOperationInfinity=The number is too big to be displayed\! -prefix=Prefix -prefixGuild=The prefix for this guild is {0} -prefixShowAgain=You can show the prefix anytime again by mentioning me. +voteSkipEmbedVoters={0} mula sa {1} ay bumuto upang laktawan ang kasalukuyang trak +mathOperationResult=Ang resulta ay +mathOperationDivisionByZeroError=Hindi ko kayang hatiin mula sa sero. +mathOperationInfinity=Ang bilang ay masyadong malaki para maipakita\! +prefix=Unlapi +prefixGuild=Ang unlapi para sa guild na ito ay {0} +prefixShowAgain=Muli maaaring mong maipakita ang unlapi anomang oras sa pamamagitan ng pagbanggit sakin. diff --git a/FredBoat/src/main/resources/lang/fr_FR.properties b/FredBoat/src/main/resources/lang/fr_FR.properties index cc6c60495..3142d4a7e 100644 --- a/FredBoat/src/main/resources/lang/fr_FR.properties +++ b/FredBoat/src/main/resources/lang/fr_FR.properties @@ -183,7 +183,7 @@ ratelimitedGeneralInfo=Vous \u00eates en taux limit\u00e9\u00a0\! S\u2019il vous ratelimitedSkipCommand=Vous pouvez passer plus d''une chanson en utilisant la commande suivante \: {0} ratelimitedGuildSlowLoadingPlaylist=Ce serveur ne peut pas charger plus de listes de lecture pour le moment. S'il vous pla\u00eet, ne spammez pas de longues listes de lecture. unblacklisted={0} a \u00e9t\u00e9 retir\u00e9 de la liste noire. -serverinfoTitle=Informations sur **{0}** \: +serverinfoTitle=Infos \u00e0 propos de {0} \: serverinfoOnlineUsers=Utilisateurs en ligne \: serverinfoTotalUsers=Nombre total d'utilisateurs \: serverinfoRoles=R\u00f4les \: @@ -193,7 +193,7 @@ serverinfoGuildID=Identifiant de la guilde \: serverinfoCreationDate=Date de cr\u00e9ation \: serverinfoOwner=Propri\u00e9taire \: serverinfoVLv=Niveau de v\u00e9rification\u00a0\: -userinfoTitle=Informations sur **{0}** \: +userinfoTitle=Informations \u00e0 propos de {0} \: userinfoUsername=Nom d'utilisateur \: userinfoId=Identifiant \: userinfoNick=Pseudonyme \: @@ -212,7 +212,11 @@ commandsMaintenance=Maintenance commandsBotOwner=Propri\u00e9taire du bot commandsMoreHelp=Dites {0} pour obtenir plus d\u2019informations sur une commande sp\u00e9cifique. helpUnknownCommand=Commande inconnue. -helpDM=Vous pouvez acc\u00e9der \u00e0 la documentation du bot via ce lien \:\nhttp\://docs.frederikam.com\n\nEnvie d''ajouter FredBoat \u00e0 votre serveur ? Si vous avez les permissions requises pour g\u00e9rer le serveur, vous pouvez l''inviter via ce lien \:\n*Celui-ci ne joue pas de musique*\n\n\nSi vous recherchez plut\u00f4t un bot musical, invitez ce bot \:\n\n\nVous avez besoin d''aide ou souhaitez contribuer \u00e0 l''am\u00e9lioration du bot ? Ou vous voulez juste passer le temps ? Venez donc faire un tour dans le repaire de FredBoat \!\n{0}\n\nVous ne pouvez pas utiliser les commandes de ce bot via MP.\nBot cr\u00e9\u00e9 par Fre_d +helpDocsLocation=La documentation peut \u00eatre trouv\u00e9e ici \: +helpBotInvite=Vous voulez ajouter FredBoat \u00e0 votre serveur ? Si vous avez la permission de g\u00e9rer cette guilde, vous pouvez inviter FredBoat \: +helpHangoutInvite=Vous avez besoin d'aide ou avez des id\u00e9es pour FredBoat ? Ou vous voulez juste passer le temps ? Rejoignez la communaut\u00e9 FredBoat \! +helpNoDmCommands=Vous ne pouvez pas envoyer de commandes via la messagerie priv\u00e9e. +helpCredits=Cr\u00e9\u00e9 par Fre_d et ses contributeurs en open-source helpSent=La documentation a \u00e9t\u00e9 envoy\u00e9 dans votre messagerie priv\u00e9e \! helpProperUsage=Utilisation ad\u00e9quate \: helpCommandOwnerRestricted=Cette commande est r\u00e9serv\u00e9e au propri\u00e9taire du bot. @@ -225,7 +229,7 @@ helpMusicCommandsHeader=Commandes musicales de Fredboat helpJoinCommand=Fait venir le bot dans votre canal vocal actuel. helpLeaveCommand=Fait partir le bot de votre canal vocal actuel. helpPauseCommand=Met le lecteur en pause. -helpPlayCommand=Play music from the given URL or search for a track. For a full list of sources please visit {0} +helpPlayCommand=Joue de la musique \u00e0 partir d''un lien ou recherche une piste. Pour une liste compl\u00e8te des sources, veuillez visiter {0} helpPlaySplitCommand=Divise une vid\u00e9o YouTube en une liste de lecture fournie depuis sa description. helpRepeatCommand=Bascule entre les modes de r\u00e9p\u00e9tition. helpReshuffleCommand=Remet en mode al\u00e9atoire la file d'attente actuelle. @@ -257,7 +261,7 @@ helpSayCommand=Faire dire quelque chose au bot. helpServerInfoCommand=Affiche les statistiques sur cette guilde. helpUserInfoCommand=Affiche les informations sur vous ou un autre utilisateur connu du bot. helpPerms=Permet d''ajouter les membres et les r\u00f4les \u00e0 la liste blanche pour le grade {0}. -helpPrefixCommand=Set the prefix for this guild. +helpPrefixCommand=Configure le pr\u00e9fixe pour le serveur. helpVoteSkip=Vote pour passer la musique en cours. A besoin de 50 % de tous les d'utilisateurs dans le salon vocal pour voter. helpMathOperationAdd=\u00c9crit la somme de num1 et num2. helpMathOperationSub=\u00c9crit le r\u00e9sultat de la soustraction de num1 moins num2. @@ -295,7 +299,7 @@ voteSkipEmbedVoters={0} sur {1} ont vot\u00e9 pour passer la musique en cours mathOperationResult=Le r\u00e9sultat est mathOperationDivisionByZeroError=Je ne peux pas diviser par z\u00e9ro. mathOperationInfinity=Le nombre est trop grand pour \u00eatre affich\u00e9 \! -prefix=Prefix -prefixGuild=The prefix for this guild is {0} -prefixShowAgain=You can show the prefix anytime again by mentioning me. +prefix=Pr\u00e9fixe +prefixGuild=Le pr\u00e9fixe pour cette guilde est {0} +prefixShowAgain=Vous pouvez montrer le pr\u00e9fixe quand vous le voulez en me mentionnant. diff --git a/FredBoat/src/main/resources/lang/he_IL.properties b/FredBoat/src/main/resources/lang/he_IL.properties index 2b4cd07e8..e2b5ad103 100644 --- a/FredBoat/src/main/resources/lang/he_IL.properties +++ b/FredBoat/src/main/resources/lang/he_IL.properties @@ -11,8 +11,8 @@ joinJoining=\u05de\u05e6\u05d8\u05e8\u05e3 \u05d0\u05dc {0} joinErrorAlreadyJoining=\u05d0\u05d9\u05e8\u05e2\u05d4 \u05e9\u05d2\u05d9\u05d0\u05d4. \u05dc\u05d0 \u05d9\u05db\u05d5\u05dc\u05ea\u05d9 \u05dc\u05d4\u05e6\u05d8\u05e8\u05e3 \u05d0\u05dc {0} \u05de\u05db\u05d9\u05d5\u05d5\u05df \u05e9\u05d0\u05e0\u05d9 \u05db\u05d1\u05e8 \u05de\u05e0\u05e1\u05d4 \u05dc\u05d4\u05ea\u05d7\u05d1\u05e8 \u05dc\u05e2\u05e8\u05d5\u05e5 \u05d6\u05d4. \u05d0\u05e0\u05d0 \u05e0\u05e1\u05d4 \u05e9\u05e0\u05d9\u05ea. pauseAlreadyPaused=\u05d4\u05e0\u05d2\u05df \u05db\u05d1\u05e8 \u05d1\u05d4\u05e9\u05d4\u05d9\u05d4. pauseSuccess=\u05d4\u05e0\u05d2\u05df \u05de\u05d5\u05e9\u05d4\u05d4 \u05db\u05e8\u05d2\u05e2. \u05d0\u05ea\u05d4 \u05d9\u05db\u05d5\u05dc \u05dc\u05d1\u05d8\u05dc \u05d0\u05ea \u05d4\u05d4\u05e9\u05e2\u05d9\u05d9\u05d4 \u05d1\u05d0\u05de\u05e6\u05e2\u05d5\u05ea `{0}unpause`. -repeatOnSingle=The player will now repeat the current track. -repeatOnAll=The player will now repeat the queue. +repeatOnSingle=\u05d4\u05e0\u05d2\u05df \u05d9\u05d7\u05d6\u05d5\u05e8 \u05db\u05e8\u05d2\u05e2 \u05e2\u05dc \u05d4\u05e9\u05d9\u05e8 \u05d4\u05e0\u05d5\u05db\u05d7\u05d9. +repeatOnAll=\u05d4\u05e0\u05d2\u05df \u05d9\u05d7\u05d6\u05d5\u05e8 \u05db\u05e8\u05d2\u05e2 \u05e2\u05dc \u05e8\u05e9\u05d9\u05de\u05ea \u05d4\u05d4\u05e9\u05de\u05e2\u05d4. repeatOff=\u05d4\u05e0\u05d2\u05df \u05dc\u05d0 \u05d9\u05d7\u05d6\u05d5\u05e8 \u05e2\u05dc \u05e2\u05e6\u05de\u05d5. selectSuccess=\u05e9\u05d9\u05e8 **\#{0}** \u05e0\u05d1\u05d7\u05e8\: **{1}** ({2}) selectInterval=\u05d7\u05d9\u05d9\u05d1 \u05dc\u05d4\u05d9\u05d5\u05ea \u05de\u05e1\u05e4\u05e8 \u05d1\u05d9\u05df 1-{0}. @@ -20,7 +20,7 @@ selectSelectionNotGiven=\u05d0\u05ea\u05d4 \u05e7\u05d5\u05d3\u05dd \u05e6\u05e8 shuffleOn=\u05d4\u05e0\u05d2\u05df \u05e2\u05db\u05e9\u05d9\u05d5 \u05de\u05e2\u05d5\u05e8\u05d1\u05d1. shuffleOff=\u05d4\u05e0\u05d2\u05df \u05d0\u05d9\u05e0\u05d5 \u05de\u05e2\u05d5\u05e8\u05d1\u05d1. reshufflePlaylist=\u05d4\u05ea\u05d5\u05e8 \u05d4\u05ea\u05e2\u05e8\u05d1\u05d1. -reshufflePlayerNotShuffling=You must first turn on shuffle mode. +reshufflePlayerNotShuffling=\u05d0\u05ea\u05d4 \u05d7\u05d9\u05d9\u05d1 \u05dc\u05d4\u05e4\u05e2\u05d9\u05dc \u05d0\u05ea \u05e8\u05e9\u05d9\u05de\u05ea \u05d4\u05d4\u05e9\u05de\u05e2\u05d4 \u05d1\u05e1\u05d3\u05e8 \u05e8\u05e0\u05d3\u05d5\u05de\u05dc\u05d9. skipEmpty=\u05e8\u05e9\u05d9\u05de\u05ea \u05d4\u05e9\u05d9\u05e8\u05d9\u05dd \u05e8\u05d9\u05e7\u05d4\! skipOutOfBounds=\u05d0\u05d9\u05df \u05d0\u05e4\u05e9\u05e8\u05d5\u05ea \u05dc\u05d4\u05e1\u05d9\u05e8 \u05d0\u05ea \u05e9\u05d9\u05e8 \u05de\u05e1\u05e4\u05e8 {0} \u05db\u05d0\u05e9\u05e8 \u05d9\u05e9 \u05e8\u05e7 {1} \u05e9\u05d9\u05e8\u05d9\u05dd. skipNumberTooLow=\u05d4\u05de\u05e1\u05e4\u05e8 \u05d4\u05e0\u05ea\u05d5\u05df \u05d7\u05d9\u05d9\u05d1 \u05dc\u05d4\u05d9\u05d5\u05ea \u05d2\u05d3\u05d5\u05dc \u05de-0. @@ -43,7 +43,7 @@ exportEmpty=\u05d0\u05d9\u05df \u05de\u05d4 \u05dc\u05d9\u05d9\u05e6\u05d0, \u05 exportPlaylistResulted=\u05e4\u05dc\u05d9\u05d9\u05dc\u05d9\u05e1\u05d8 \u05de\u05d9\u05d5\u05e6\u05d0\: {0}\n\u05d0\u05ea\u05d4 \u05d9\u05db\u05d5\u05dc \u05dc\u05ea\u05ea \u05db\u05ea\u05d5\u05d1\u05ea \u05d0\u05ea\u05e8 \u05e2\u05dc \u05de\u05e0\u05ea \u05dc\u05d3\u05d7\u05d5\u05ea \u05d0\u05ea \u05d4\u05e4\u05dc\u05d9\u05d9\u05dc\u05d9\u05d8\u05e1 \u05d4\u05e0\u05d5\u05db\u05d7\u05d9 \u05dc\u05d0\u05d7\u05e8 \u05db\u05da. exportPlaylistFail=\u05d4\u05e2\u05dc\u05d0\u05ea \u05d4\u05e4\u05dc\u05d9\u05d9\u05dc\u05d9\u05e1\u05d8 \u05dchastebin.com \u05e0\u05db\u05e9\u05dc\u05d4 listShowShuffled=\u05de\u05e6\u05d9\u05d2 \u05e4\u05dc\u05d9\u05d9\u05dc\u05d9\u05e1\u05d8 \u05de\u05e2\u05d5\u05e8\u05d1\u05d1.\n\n -listShowRepeatSingle=Repeating current track. +listShowRepeatSingle=\u05d7\u05d5\u05d6\u05e8 \u05e2\u05dc \u05d4\u05e9\u05d9\u05e8 \u05d4\u05e0\u05d5\u05db\u05d7\u05d9. listShowRepeatAll=Repeating current queue. listShowHistory=Showing tracks in history. listAddedBy=**{0}** added by **{1}** `[{2}]` @@ -183,7 +183,7 @@ ratelimitedGeneralInfo=You are being rate limited\! Please slow down. ratelimitedSkipCommand=You can skip more than one song by using this command\: {0} ratelimitedGuildSlowLoadingPlaylist=This server is not allowed to add more playlists at this moment. Please don't spam long playlists. unblacklisted=Removed {0} from the blacklist. -serverinfoTitle=Info about **{0}**\: +serverinfoTitle=Info about {0}\: serverinfoOnlineUsers=\u05de\u05e9\u05ea\u05de\u05e9\u05d9\u05dd \u05de\u05d7\u05d5\u05d1\u05e8\u05d9\u05dd\: serverinfoTotalUsers=\u05e1\u05da \u05d4\u05db\u05dc \u05de\u05e9\u05ea\u05de\u05e9\u05d9\u05dd\: serverinfoRoles=\u05ea\u05e4\u05e7\u05d9\u05d3\u05d9\u05dd\: @@ -193,7 +193,7 @@ serverinfoGuildID=Guild ID\: serverinfoCreationDate=Creation Date\: serverinfoOwner=\u05d1\u05e2\u05dc\u05d9\u05dd\: serverinfoVLv=Verification Level\: -userinfoTitle=Information about **{0}**\: +userinfoTitle=Information about {0}\: userinfoUsername=\u05e9\u05dd \u05de\u05e9\u05ea\u05de\u05e9\: userinfoId=ID\: userinfoNick=Nickname\: @@ -212,7 +212,11 @@ commandsMaintenance=Maintenance commandsBotOwner=Bot owner commandsMoreHelp=Say {0} to get more information on a specific command. helpUnknownCommand=Unknown command. -helpDM=Documentation can be found at\:\nhttps\://fredboat.com/docs\n\nWant to add FredBoat to your server? If you have Manage Server permissions for your guild, you can invite it here\:\n*This one doesn''t play music*\n\n\nIf you want to add the music bot, you will want to invite this bot\:\n\n\nNeed help or have any ideas for the bot? Perhaps you just want to hang out? Come on over to FredBoat hangout\!\n{0}\n\nYou cannot send this bot commands through DM.\nBot created by Fre_d +helpDocsLocation=Documentation can be found at\: +helpBotInvite=Want to add FredBoat to your server? If you have Manage Server permissions for your guild, you can invite FredBoat\: +helpHangoutInvite=Need help or have any ideas for FredBoat? Perhaps you just want to hang out? Join the FredBoat community\! +helpNoDmCommands=You cannot send FredBoat commands through DMs. +helpCredits=Created by Fre_d and open source contributors helpSent=Documentation has been sent to your DMs\! helpProperUsage=Proper usage\: helpCommandOwnerRestricted=This command is restricted to the owner of the bot. diff --git a/FredBoat/src/main/resources/lang/hr_HR.properties b/FredBoat/src/main/resources/lang/hr_HR.properties index 458b71ce4..b8e1b56c7 100644 --- a/FredBoat/src/main/resources/lang/hr_HR.properties +++ b/FredBoat/src/main/resources/lang/hr_HR.properties @@ -183,7 +183,7 @@ ratelimitedGeneralInfo=You are being rate limited\! Please slow down. ratelimitedSkipCommand=You can skip more than one song by using this command\: {0} ratelimitedGuildSlowLoadingPlaylist=This server is not allowed to add more playlists at this moment. Please don't spam long playlists. unblacklisted=Removed {0} from the blacklist. -serverinfoTitle=Informacije o **{0} **\: +serverinfoTitle=Info about {0}\: serverinfoOnlineUsers=Online korisnika\: serverinfoTotalUsers=Ukupno korisnika\: serverinfoRoles=Uloge\: @@ -193,7 +193,7 @@ serverinfoGuildID=ID guilda\: serverinfoCreationDate=Datum kreiranja\: serverinfoOwner=Vlasnik\: serverinfoVLv=Provjera razine\: -userinfoTitle=Informacije o **{0} **\: +userinfoTitle=Information about {0}\: userinfoUsername=Korisni\u010dko ime\: userinfoId=ID\: userinfoNick=Nadimak\: @@ -212,7 +212,11 @@ commandsMaintenance=Odr\u017eavanje commandsBotOwner=Vlasnik bota commandsMoreHelp=Napi\u0161ite {0} da biste dobili vi\u0161e informacija o odre\u0111enoj naredbi. helpUnknownCommand=Unknown command. -helpDM=Documentation can be found at\:\nhttps\://fredboat.com/docs\n\nWant to add FredBoat to your server? If you have Manage Server permissions for your guild, you can invite it here\:\n*This one doesn''t play music*\n\n\nIf you want to add the music bot, you will want to invite this bot\:\n\n\nNeed help or have any ideas for the bot? Perhaps you just want to hang out? Come on over to FredBoat hangout\!\n{0}\n\nYou cannot send this bot commands through DM.\nBot created by Fre_d +helpDocsLocation=Documentation can be found at\: +helpBotInvite=Want to add FredBoat to your server? If you have Manage Server permissions for your guild, you can invite FredBoat\: +helpHangoutInvite=Need help or have any ideas for FredBoat? Perhaps you just want to hang out? Join the FredBoat community\! +helpNoDmCommands=You cannot send FredBoat commands through DMs. +helpCredits=Created by Fre_d and open source contributors helpSent=Upute su poslane u va\u0161 sandu\u010di\u0107 s porukama\! helpProperUsage=Pravilno kori\u0161tenje\: helpCommandOwnerRestricted=Ova naredba je ograni\u010dena na vlasnika bota. diff --git a/FredBoat/src/main/resources/lang/hu_HU.properties b/FredBoat/src/main/resources/lang/hu_HU.properties index 7fd848139..2279835ce 100644 --- a/FredBoat/src/main/resources/lang/hu_HU.properties +++ b/FredBoat/src/main/resources/lang/hu_HU.properties @@ -36,7 +36,7 @@ unpauseQueueEmpty=A lista \u00fcres. unpausePlayerNotPaused=A lej\u00e1tsz\u00f3 nem le\u00e1ll\u00edtott. unpauseNoUsers=Nincsenek felhaszn\u00e1l\u00f3k a voice chat-en. unpauseSuccess=A lej\u00e1tsz\u00f3 most elindult. -volumeApology=Bocsi\! A ;;volume parancs le\u00e1llt a publikus bot-on. Ez az\u00e9rt van mert id\u00f6 kell az audio feldolgoz\u00e1s\u00e1ra, csak 5 zen\u00e9t tud lej\u00e1tszani egyszerre, nehogy mindenkinek megzavarja a f\u00fcl\u00e9t. A FredBot kikapcsol\u00e1s\u00e1val t\u00f6bb zen\u00e9t tudsz j\u00e1tszani kevesebb lagg-al. Aj\u00e1nlom a bot be\u00e1ll\u00edt\u00e1s\u00e1t a dropdown men\u00fc-n\u00e9l https\://fred.moe/1vD.png +volumeApology=Bocsi\! A ;;volume parancs le\u00e1llt a publikus bot-on. Ez az\u00e9rt t\u00f6rt\u00e9nt mert id\u0151 kell a hang feldolgoz\u00e1s\u00e1ra, egy p\u00e1r sz\u00e1mn\u00e1l ak\u00e1r \u00f6tsz\u00f6r t\u00f6bb ideig, hang akad\u00e1s\u00e1t okozva mindenkin\u00e9l. Ennek a funkci\u00f3nak a kikapcsol\u00e1s\u00e1val t\u00f6bb zen\u00e9t tudsz j\u00e1tszani kevesebb lagg-al. Aj\u00e1nlom a bot hang erej\u00e9nek a be\u00e1ll\u00edt\u00e1s\u00e1t a dropdown men\u00fc-n\u00e9l https\://fred.moe/1vD.png volumeSyntax=Haszn\u00e1ld a `;;volume <0-150>`. {0}% az alap. A lej\u00e1tsz\u00f3 most **{1}%** n\u00e1l van. volumeSuccess=A hanger\u00f6t **{0}%** r\u00f3l **{1}%** ra v\u00e1ltoztattad. exportEmpty=Semmi sincs hogy kibontsad, a lista \u00fcres. @@ -45,7 +45,7 @@ exportPlaylistFail=Hiba a lej\u00e1tsz\u00e1si lista felt\u00f6lt\u00e9s\u00e9n\ listShowShuffled=\u00d6sszekevert lista mutat\u00e1sa. listShowRepeatSingle=Mostani zene ism\u00e9tl\u00e9se. listShowRepeatAll=Mostani sor ism\u00e9tl\u00e9se. -listShowHistory=Showing tracks in history. +listShowHistory=Sz\u00e1mok mutat\u00e1sa az el\u0151zm\u00e9nyekben. listAddedBy=**{0}** hozz\u00e1 lett adva **{1}** `[{2}]` listStreamsOnlySingle=Itt csak **{0}** \u00e9l {1} a sorban. listStreamsOnlyMultiple=Itt **{0}** \u00e9l {1} a sor-ban. @@ -57,7 +57,7 @@ listAsWellAsLiveStreams=, meg **{0}** \u00e9l\u00f6 {1} trackSingular=zene trackPlural=zen\u00e9k npNotPlaying=Nem j\u00e1tszik semmit. -npNotInHistory=Currently no tracks in history. +npNotInHistory=Jelenleg nincsenek sz\u00e1mok az el\u0151zm\u00e9nyekben. npDescription=Le\u00edr\u00e1s npLoadedSoundcloud=[{0}/{1}]\n\nBet\u00f6lt\u00f6tt a Soundcloud-r\u00f3l npLoadedBandcamp={0}\n\nBet\u00f6lt\u00f6tt a Bandcamp-r\u00f6l @@ -79,7 +79,7 @@ restartSuccess=**{0}** \u00fajraindult. queueEmpty=A lista \u00fcres. rewSuccess=Felh\u00faz\u00e1s **{0}** {1}. seekSuccess=Keres\u00e9s **{0}** {1}. -seekDeniedLiveTrack=You can't seek a live track. +seekDeniedLiveTrack=Nem kereshetsz egy \u00e9l\u0151 sz\u00e1mban. loadPlaySplitListFail=A link egy lej\u00e1tsz\u00e1si list\u00e1hoz vezet, nem zen\u00e9hez. Pr\u00f3b\u00e1ld meg `;;play` helyett. loadListSuccess=Tal\u00e1lt \u00e9s hozz\u00e1adott `{0}` zen\u00e9t a lej\u00e1tsz\u00e1si list\u00e1r\u00f3l **{1}**. loadNoMatches=Nincs tal\u00e1lhat\u00f3 zene erre `{0}`. @@ -132,8 +132,8 @@ brainfuckCycleLimit=A program meghaladta a maximum ciklus sz\u00e1m\u00e1t\n{0} brainfuckDataPointerOutOfBounds=Adat mutat\u00f3nak nincs t\u00f6bb helye\: {0} brainfuckInputOOB=Glm helyzete\: {0} brainfuckNoOutput=\ Nem volt semmi -weatherLocationNotFound=Unable to find location, please check your input {0}. -weatherError=Error retrieving weather for {0} +weatherLocationNotFound=Hely keres\u00e9se sikertelen, k\u00e9rj\u00fck ellen\u0151rizd a bevitelt {0}. +weatherError=Hiba az id\u0151j\u00e1r\u00e1si adatok lek\u00e9r\u00e9s\u00e9ben {0}-hoz avatarSuccess=\ megtal\u00e1ltam\n{0} configNoArgs=Konfigur\u00e1ci\u00f3 ehhez **{0}**\:``` configSetTo=\u00e1llitva van erre `{0}`. @@ -183,7 +183,7 @@ ratelimitedGeneralInfo=Lelet\u00e9l sebess\u00e9g korl\u00e1t\u00f3zva\! K\u00e9 ratelimitedSkipCommand=E parancs haszn\u00e1lat\u00e1val \u00e1tugorhat egyn\u00e9l t\u00f6bb sz\u00e1mot\: {0} ratelimitedGuildSlowLoadingPlaylist=Ez a szerver nem enged\u00e9lyezett ahoz t\u00f6bb lej\u00e1tsz\u00e1si list\u00e1t j\u00e1tsz\u00f3n le, ebben a pillanatban. K\u00e9rj\u00fck, ne spamelj hossz\u00fa list\u00e1kat. unblacklisted=Elt\u00e1volitva {0} a a feketelist\u00e1ra. -serverinfoTitle=Inf\u00f3 err\u00f6l **{0}**\: +serverinfoTitle=Info about {0}\: serverinfoOnlineUsers=Online Felhaszn\u00e1l\u00f3k\: serverinfoTotalUsers=\u00d6sszes Felhaszn\u00e1l\u00f3\: serverinfoRoles=Szerepk\u00f6r\u00f6k\: @@ -193,17 +193,17 @@ serverinfoGuildID=Guild Azonos\u00edt\u00f3\: serverinfoCreationDate=L\u00e9trehoz\u00e1s D\u00e1tuma\: serverinfoOwner=Tulajdonos\: serverinfoVLv=Ellen\u00f6rz\u00e9si Szint\: -userinfoTitle=Inf\u00f3 r\u00f3la **{0}**\: +userinfoTitle=Information about {0}\: userinfoUsername=Felhaszn\u00e1l\u00f3n\u00e9v\: userinfoId=Azonos\u00edt\u00f3\: userinfoNick=Becen\u00e9v\: userinfoKnownServer=Ismert Szerverek\: userinfoJoinDate=Csatlakoz\u00e1s D\u00e1tuma\: userinfoCreationTime=L\u00e9trehoz\u00e1s D\u00e1tuma\: -userinfoBlacklisted=Blacklisted\: -skipDeniedTooManyTracks=You can't skip someone else's tracks if you are not a DJ.\nConsider using the Voteskip command. +userinfoBlacklisted=Tilt\u00f3list\u00e1n\: +skipDeniedTooManyTracks=Nem ugorhatod \u00e1t valaki m\u00e1s sz\u00e1m\u00e1t ha nem vagy DJ.\nFontold meg a Voteskip parancs haszn\u00e1lat\u00e1t. eventUsersLeftVC=Minden felhaszn\u00e1l\u00f3 lel\u00e9pett. A lej\u00e1tsz\u00f3 meg lett \u00e1ll\u00edtva. -eventAutoResumed=User presence detected, automatically resuming the player. +eventAutoResumed=Felhaszn\u00e1l\u00f3 \u00e9szlelve, lej\u00e1tsz\u00f3 automatikus ind\u00edt\u00e1sa. commandsFun=Sz\u00f3rakoz\u00e1s commandsMemes=M\u00e9mek commandsUtility=Seg\u00e9dprogram @@ -212,7 +212,11 @@ commandsMaintenance=Karbantart\u00e1s alatt commandsBotOwner=Bot tulajdonos commandsMoreHelp=Irj {0} hogy kapj t\u00f6bb inform\u00e1ci\u00f3t. helpUnknownCommand=Ismeretlen parancs. -helpDM=Dokument\u00e1ci\u00f3 itt tal\u00e1lhat\u00f3\:\nhttps\://fredboat.com/docs\n\nHozz\u00e1 akarod adni FredBoat-ot a szerveredhez? Ha van Manage Server enged\u00e9lyed a sz\u00f6vets\u00e9gedhez, itt h\u00edvhatod meg\:\n*Ez nem j\u00e1tszik zen\u00e9t*\n\n\nHa a zenebotot akarod akkor itt kell megh\u00edvni\:\n\n\nKell seg\u00edts\u00e9g vagy van b\u00e1rmi \u00f6tleted a bothoz? Esetleg csak l\u00f3gni akarsz? Gyere \u00e1t a FredBoat hangout-ba\!\n{0}\n\nNem tudod elk\u00fcldeni ennek a botnak a parancsait K\u00f6zvetlen \u00dczenetben.\nBot created by Fre_d +helpDocsLocation=Documentation can be found at\: +helpBotInvite=Want to add FredBoat to your server? If you have Manage Server permissions for your guild, you can invite FredBoat\: +helpHangoutInvite=Need help or have any ideas for FredBoat? Perhaps you just want to hang out? Join the FredBoat community\! +helpNoDmCommands=You cannot send FredBoat commands through DMs. +helpCredits=Created by Fre_d and open source contributors helpSent=A dokumentum el lett k\u00fcldve a DM edhez\! helpProperUsage=Megfelel\u00f6 haszn\u00e1lat\: helpCommandOwnerRestricted=Ez a command csak a tulajdonosra \u00e9s a botra tartozik. @@ -225,7 +229,7 @@ helpMusicCommandsHeader=FredBoat Zene Parancsok helpJoinCommand=Csin\u00e1ld meg a botot hogy csatlakozzon a voice channelhez. helpLeaveCommand=Csin\u00e1ld meg a botot hogy lel\u00e9pjen a voice channelr\u00f6l. helpPauseCommand=Sz\u00fcneteld a lej\u00e1tsz\u00f3t. -helpPlayCommand=Play music from the given URL or search for a track. For a full list of sources please visit {0} +helpPlayCommand=J\u00e1tssz le egy zen\u00e9t a megadott URL alapj\u00e1n vagy keress egy sz\u00e1mo. A forr\u00e1sok teljes list\u00e1j\u00e1hoz k\u00e9rj\u00fck l\u00e1togasd meg a {0} oldalt helpPlaySplitCommand=YouTube vide\u00f3 feloszt\u00e1sa a list\u00e1ba. helpRepeatCommand=Ism\u00e9tl\u00f6 m\u00f3d k\u00f6z\u00f6tt kapcsold be. helpReshuffleCommand=Keverd \u00f6ssze a list\u00e1t. @@ -259,7 +263,7 @@ helpUserInfoCommand=Inform\u00e1ci\u00f3k megjelen\u00edt\u00e9se r\u00f3lad vag helpPerms=Allows whitelisting members and roles for the {0} rank. helpPrefixCommand=Set the prefix for this guild. helpVoteSkip=Vote to skip the current song. Needs 50% of all users in the voice chat to vote. -helpMathOperationAdd=Print the sum of num1 and num2. +helpMathOperationAdd=Ki\u00edrja num1 \u00e9s num2 \u00f6sszeg\u00e9t. helpMathOperationSub=Print the difference of subtracting num2 from num1. helpMathOperationMult=Print the product of num1*num2. helpMathOperationDiv=Print the quotient of dividing num1 by num2. @@ -281,7 +285,7 @@ fuzzyMultiple=Multiple items were found. Did you mean any of these? fuzzyNothingFound=Nem talalom ''{0}''. cmdPermsTooLow=Ehhez nincs jogod\! playersLimited=FredBoat \u00e9ppen maximum kapacit\u00e1son van\! A bot \u00e9ppen r\u00f6gz\u00edtett hogy csak `{0}` helyen \u00e1ramoljon, m\u00e1sk\u00e9ppen megkock\u00e1ztatn\u00e1nk, hogy lecsatlakozzon a Discord-r\u00f3l h\u00e1l\u00f3zat t\u00f6lt\u00e9se k\u00f6zben.\nHa seg\u00edteni akarsz n\u00f6velni a limitet vagy nem t\u00falzs\u00fafolt botot akarsz haszn\u00e1lni, k\u00e9rlek seg\u00edts a munk\u00e1nkon a Patreon oldalon\:\n{1}\n\nEln\u00e9z\u00e9st a k\u00e9nyelmetlens\u00e9g\u00e9rt. Tal\u00e1n pr\u00f3b\u00e1ld \u00fajra k\u00e9s\u00f6bb. Ez az \u00fczenet \u00e1ltal\u00e1ban cs\u00facsid\u0151k\u00f6n szokott megjelenni. -tryLater=Please try again later. +tryLater=K\u00e9rj\u00fck, pr\u00f3b\u00e1lja \u00fajra k\u00e9s\u0151bb. skipUserSingle=Skipped {0} added by {1}. skipUserMultiple=Skipped {0} tracks added by {1}. skipUsersMultiple=Skipped {0} tracks added by {1} users. diff --git a/FredBoat/src/main/resources/lang/id_ID.properties b/FredBoat/src/main/resources/lang/id_ID.properties index 72dba6480..30d077cc3 100644 --- a/FredBoat/src/main/resources/lang/id_ID.properties +++ b/FredBoat/src/main/resources/lang/id_ID.properties @@ -45,8 +45,8 @@ exportPlaylistFail=Gagal mengupload Playlist ke hastebin.com listShowShuffled=Menampilkan Playlist Acak.\n\n listShowRepeatSingle=Mengulang trek saat ini. listShowRepeatAll=Mengulang antrian lagu saat ini. -listShowHistory=Showing tracks in history. -listAddedBy=**{0}** added by **{1}** `[{2}]` +listShowHistory=Menampilkan trek dalam sejarah. +listAddedBy=**{0}** ditambahkan oleh **{1}** `[{2}]` listStreamsOnlySingle=Ada **{0} ** stream {1} dalam antrian. listStreamsOnlyMultiple=Ada **{0} ** stream {1} dalam antrian. listStreamsOrTracksSingle=Ada **{0} ** {1} dengan waktu tersisa ** [{2}] **{3} dalam antrian. @@ -57,7 +57,7 @@ listAsWellAsLiveStreams=serta **{0}** sedang diputar {1} trackSingular=track trackPlural=tracks npNotPlaying=Tidak sedang memainkan apapun. -npNotInHistory=Currently no tracks in history. +npNotInHistory=Saat ini tidak ada jejak dalam sejarah. npDescription=Deskripsi npLoadedSoundcloud=[{0}/{1}]\n\nmengambil dari Soundcloud npLoadedBandcamp={0}\n\nMengambil dari Bandcamp @@ -79,7 +79,7 @@ restartSuccess=**{0}** telah di restart. queueEmpty=Antrian lagu kosong. rewSuccess=Memutar balik **{0}** ke {1}. seekSuccess=Mencari **{0} ** untuk {1}. -seekDeniedLiveTrack=You can't seek a live track. +seekDeniedLiveTrack=Anda tidak bisa mencari lagu live. loadPlaySplitListFail=Link tersebut mengarah ke Playlist. Bukan track. Gunakan `;;play`. loadListSuccess=Menemukan dan menambahkan `{0}` dari playlist **{1}**. loadNoMatches=Tidak ada Audio ditemukan dari `{0}`. @@ -125,15 +125,15 @@ luaError=\ A Lua error occured \:anger\:\n```{0}``` luaErrorOutputTooBig=\ Output buffer terlalu besar \:anger\: Discord membatasi 2000 karakter per pesan, terdapat {0} Karakter luaTimeout=\ Fungsi habis \:anger\: memungkinkan perhitungan waktu {0} detik. helpSuccess=Dokumentasi telah dikirim ke pesan langsung kamu\! -helpDmFailed=Could not send documentation to your DMs. Please check that you don't have them disabled\! +helpDmFailed=Tidak dapat mengirim dokumentasi ke DM Anda. Harap periksa apakah Anda tidak memilikinya dinonaktifkan\! helpCommandsPromotion=Sebut {0} untuk mempelajari apa yang dapat bot ini lakukan\! fuzzyNoResults=Tidak ada pengguna tersebut brainfuckCycleLimit=Program melebihi jumlah maksimum siklus {0} brainfuckDataPointerOutOfBounds=Data pointer out of bounds\: {0} brainfuckInputOOB=Input out of bounds at position\: {0} brainfuckNoOutput=\ Tidak ada Output -weatherLocationNotFound=Unable to find location, please check your input {0}. -weatherError=Error retrieving weather for {0} +weatherLocationNotFound=Tidak dapat menemukan lokasi, harap periksa masukan Anda {0}. +weatherError=Terjadi kesalahan saat mengambil cuaca untuk {0} avatarSuccess=\ aku menemukannya\n{0} configNoArgs=Konfigurasi untuk **{0}**\:``` configSetTo=sekarang diatur ke ''{0}''. @@ -200,10 +200,10 @@ userinfoNick=Nama Panggilan\: userinfoKnownServer=Server yang dikenal\: userinfoJoinDate=Tanggal Bergabung\: userinfoCreationTime=Tanggal Pembuatan\: -userinfoBlacklisted=Blacklisted\: -skipDeniedTooManyTracks=You can't skip someone else's tracks if you are not a DJ.\nConsider using the Voteskip command. +userinfoBlacklisted=Daftar hitam\: +skipDeniedTooManyTracks=Anda tidak bisa melewati jejak orang lain jika Anda bukan seorang DJ. Pertimbangkan untuk menggunakan perintah Voteskip. eventUsersLeftVC=Semua pengguna telah meninggalkan channel suara. Pemutar musik telah dijeda. -eventAutoResumed=User presence detected, automatically resuming the player. +eventAutoResumed=Kehadiran pengguna terdeteksi, otomatis melanjutkan player. commandsFun=Kesenangan commandsMemes=Meme commandsUtility=Kegunaan @@ -212,7 +212,11 @@ commandsMaintenance=Perbaikan commandsBotOwner=Pemilik bot commandsMoreHelp=Katakanlah {0} untuk mendapatkan informasi lebih lanjut tentang perintah tertentu helpUnknownCommand=Perintah Tidak Ditemukan. -helpDM=Documentation can be found at\:\nhttps\://fredboat.com/docs\n\nWant to add FredBoat to your server? If you have Manage Server permissions for your guild, you can invite it here\:\n*This one doesn''t play music*\n\n\nIf you want to add the music bot, you will want to invite this bot\:\n\n\nNeed help or have any ideas for the bot? Perhaps you just want to hang out? Come on over to FredBoat hangout\!\n{0}\n\nYou cannot send this bot commands through DM.\nBot created by Fre_d +helpDocsLocation=Dokumentasi dapat ditemukan di\: +helpBotInvite=Ingin menambahkan FredBoat ke server Anda? Jika Anda memiliki Server mengelola izin untuk guild, Anda dapat mengundang FredBoat\: +helpHangoutInvite=Memerlukan bantuan atau punya ide untuk FredBoat? Mungkin Anda hanya ingin bergaul? Ikut komunitas FredBoat\! +helpNoDmCommands=Anda tidak dapat mengirim perintah FredBoat melalui DMs. +helpCredits=Dibuat oleh Fre_d dan sumber terbuka kontributor helpSent=Dokumentasi telah dikirim ke DMS Anda\! helpProperUsage=Penggunaan yang tepat\: helpCommandOwnerRestricted=Perintah ini di ban oleh pemilik bot. @@ -225,20 +229,20 @@ helpMusicCommandsHeader=FredBoat Perintah Musik helpJoinCommand=Membuat bot bergabung kedalam voice channel yang Anda masuki. helpLeaveCommand=Membuat bot meninggalkan voice channel yang telah masuki. helpPauseCommand=Menjeda pemutar musik. -helpPlayCommand=Play music from the given URL or search for a track. For a full list of sources please visit {0} +helpPlayCommand=Mainkan musik dari URL yang diberikan atau cari trek. Untuk daftar lengkap sumber silakan kunjungi {0} helpPlaySplitCommand=Membagi YouTube video ke dalam daftar lagu yang disediakan dalam deskripsi tersebut. helpRepeatCommand=Beralih antara mode berulang. helpReshuffleCommand=Mengacak ulang antrian lagu saat ini. helpSelectCommand=Pilih salah satu trek yang ditawarkan setelah pencarian untuk memainkannya. helpShuffleCommand=Beralih mode acak untuk antrian lagu saat ini. -helpSkipCommand=Skip the current song, the n'th song in the queue, all songs from n to m, or all songs from mentioned users. Please use in moderation. +helpSkipCommand=Lewati lagu saat ini, lagu n'th dalam antrian, semua lagu dari n ke m, atau semua lagu dari pengguna yang disebutkan di atas. Mohon gunakan secukupnya. helpStopCommand=Menghentikan pemutar musik dan membersihkan daftar lagu. Diperuntukkan bagi moderator dengan izin mengelola pesan. helpUnpauseCommand=Menjalankan kembali pemutar musik. helpVolumeCommand=Mengubah volume. Nilainya dari 0-150 dan 100 adalah default. Perintah volume tidak digunakan lagi pada bot publik. helpExportCommand=Ekspor antrian saat ini ke tautan hastebin, dapat digunakan nanti sebagai daftar putar. helpGensokyoRadioCommand=Menampilkan lagu saat ini yang dimainkan di gensokyoradio.net helpListCommand=Menampilkan daftar lagu saat ini dalam daftar putar. -helpHistoryCommand=Display a list of the songs in playlist history. +helpHistoryCommand=Tampilkan daftar lagu dalam riwayat daftar putar. helpNowplayingCommand=Menampilkan lagu yang sedang diputar. helpForwardCommand=Meneruskan trek dengan jumlah waktu yang ditentukan. \nContoh\: helpRestartCommand=Restart trek yang sedang diputar. @@ -246,7 +250,7 @@ helpRewindCommand=Memundurkan trek dengan jumlah waktu yang ditentukan.\nContoh\ helpSeekCommand=Mengatur posisi trek ke waktu yang ditentukan.\nContoh\: helpAvatarCommand=Menampilkan avatar pengguna. helpBrainfuckCommand=Mengeksekusi kode Brainfuck. Contoh\: -helpWeatherCommand=Display current weather by location. +helpWeatherCommand=Tampilkan cuaca saat ini menurut lokasi. helpClearCommand=Menghapus semua pesan oleh bot ini dalam pesan terakhir 50 channel ini. helpCommandsCommand=Menampilkan perintah yang tersedia. helpHelpCommand=Menerima bantuan untuk bot ini atau bantuan untuk setiap perintah. @@ -257,16 +261,16 @@ helpSayCommand=Membuat bot mengatakan sesuatu. helpServerInfoCommand=Menampilkan beberapa statistik tentang server ini. helpUserInfoCommand=Menampilkan informasi yang diketahui bot tentang diri kamu atau pengguna. helpPerms=Membolehkan Anggota Untuk Mengakses Dan Peran Untuk Peringkat. {0} -helpPrefixCommand=Set the prefix for this guild. -helpVoteSkip=Vote to skip the current song. Needs 50% of all users in the voice chat to vote. -helpMathOperationAdd=Print the sum of num1 and num2. -helpMathOperationSub=Print the difference of subtracting num2 from num1. -helpMathOperationMult=Print the product of num1*num2. -helpMathOperationDiv=Print the quotient of dividing num1 by num2. -helpMathOperationMod=Print the remainder of dividing num1 by num2. -helpMathOperationPerc=Print the percentage represented by num1 in num2. -helpMathOperationSqrt=Print the square root of num. -helpMathOperationPow=Print the result of num1^num2. +helpPrefixCommand=Tetapkan awalan untuk guild ini. +helpVoteSkip=Pilih untuk melewatkan lagu yang sedang diputar. Membutuhkan 50% dari semua pengguna di voice chat untuk memilih. +helpMathOperationAdd=Cetak jumlah num1 dan num2. +helpMathOperationSub=Cetak perbedaan penguraian num2 dari num1. +helpMathOperationMult=Cetak produk num1 * num2. +helpMathOperationDiv=Cetak hasil bagi membagi num1 dengan num2. +helpMathOperationMod=Cetak sisa membagi num1 dengan num2. +helpMathOperationPerc=Cetak persentase yang ditunjukkan oleh num1 di num2. +helpMathOperationSqrt=Cetak akar kuadrat num. +helpMathOperationPow=Cetak hasil num1 ^ num2. destroyDenied=Kamu Harus Memiliki Izin Pengaturan Pesan Untuk Mengatur Ulang Pemutar. destroyHelp=Mengatur Ulang Pemutar Dan Membersihkan Daftar Lagu. Diperuntukkan Untuk Moderator Dengan Izin Mengelola Pesan. destroySucc=Mengatur Kembali Pemutar Dan Membersihkan Antrian. @@ -275,27 +279,27 @@ permsListTitle=Pengguna Dan Peran Dengan Izin {0} permsAdded=Menambahkan ''{0}'' Ke ''{1}''. permsRemoved=Menghapus ''{0}'' Dari ''{1}''. permsFailSelfDemotion=Kamu Tidak Bisa Menghapus Ini Karena akan membuat Anda tanpa izin Admin\! -permsAlreadyAdded={0} already added to {1} -permsNotAdded={0} is not in {1} +permsAlreadyAdded={0} sudah ditambahkan ke {1} +permsNotAdded={0} tidak di {1} fuzzyMultiple=Beberapa Lagu Yang Ditemukan. Apa Yang Kamu Cari Dengan Lagu ini? fuzzyNothingFound=Tidak Ada Yang Ditemukan Untuk ''{0}''. cmdPermsTooLow=Anda tidak memiliki izin untuk menjalankan perintah ini\! Perintah ini Membutuhkan ''{0}'' tetapi Anda hanya memiliki ''{1}''. -playersLimited=FredBoat is currently at maximum capacity\! The bot is currently fixed to only play up to `{0}` streams, otherwise we would risk disconnecting from Discord under the network load.\nIf you want to help us increase the limit or you want to use our non-overcrowded bot, please support our work on Patreon\:\n{1}\n\nSorry for the inconvenience\! You might want to try again later. This message usually only appears at peak time. +playersLimited=FredBoat saat ini kapasitas maksimal\! Bot saat ini diperbaiki hanya untuk bermain dengan aliran ` {0} `, jika tidak, kami akan mengambil risiko melepaskan diri dari Discord di bawah beban jaringan. Jika Anda ingin membantu kami meningkatkan batas atau Anda ingin menggunakan bot kami yang tidak terlalu penuh, tolong dukung pekerjaan kami di Patreon\:\n {1} \n\nMaaf atas ketidaknyamanannya\! Anda mungkin ingin mencoba lagi nanti. Pesan ini biasanya hanya muncul pada waktu puncak. tryLater=Silakan coba sesaat lagi. -skipUserSingle=Skipped {0} added by {1}. -skipUserMultiple=Skipped {0} tracks added by {1}. -skipUsersMultiple=Skipped {0} tracks added by {1} users. -skipUserNoTracks=None of the mentioned users have any tracks queued. -voteSkipAdded=Your vote has been added\! -voteSkipAlreadyVoted=You already voted to skip this track\! -voteSkipSkipping={0} have voted to skip. Skipping track {1}. -voteSkipNotEnough={0} have voted to skip. At least {1} needed. -voteSkipEmbedNoVotes=No votes to skip this track yet. -voteSkipEmbedVoters={0} out of {1} have voted to skip the current track -mathOperationResult=The result is +skipUserSingle=Dilewati {0} ditambahkan oleh {1}. +skipUserMultiple=Melewati {0} trek yang ditambahkan oleh {1}. +skipUsersMultiple=Melewati {0} trek yang ditambahkan oleh {1} pengguna. +skipUserNoTracks=Tidak satu pun pengguna yang disebutkan memiliki antrean. +voteSkipAdded=Suara Anda telah ditambahkan\! +voteSkipAlreadyVoted=Anda telah memilih untuk melewati jalur ini\! +voteSkipSkipping={0} telah memilih untuk melompati Melewati lintasan {1}. +voteSkipNotEnough={0} telah memilih untuk melompati Paling sedikit dibutuhkan {1}. +voteSkipEmbedNoVotes=Tidak ada suara untuk melewati jalur ini. +voteSkipEmbedVoters={0} dari {1} telah memilih untuk melewati jalur saat ini +mathOperationResult=Hasilnya adalah mathOperationDivisionByZeroError=Gua ga bisa bagi nol dengan nol >\:(. mathOperationInfinity=Angkanya terlalu besar untuk ditampilkan\! -prefix=Prefix -prefixGuild=The prefix for this guild is {0} -prefixShowAgain=You can show the prefix anytime again by mentioning me. +prefix=Awalan +prefixGuild=Awalan untuk guild ini adalah {0} +prefixShowAgain=Anda bisa menunjukkan awalan kapan saja dengan menyebutkan saya. diff --git a/FredBoat/src/main/resources/lang/it_IT.properties b/FredBoat/src/main/resources/lang/it_IT.properties index f5ac79384..a03639529 100644 --- a/FredBoat/src/main/resources/lang/it_IT.properties +++ b/FredBoat/src/main/resources/lang/it_IT.properties @@ -183,7 +183,7 @@ ratelimitedGeneralInfo=Sei limitato\! Per favore rallenta. ratelimitedSkipCommand=Si pu\u00f2 saltare pi\u00f9 di una canzone utilizzando questo comando\: {0} ratelimitedGuildSlowLoadingPlaylist=A questo server non \u00e8 consentito aggiungere pi\u00f9 playlist in questo momento. Per favore, non spam le liste di gioco lunghe. unblacklisted=Rimosso {0} dalla lista nera. -serverinfoTitle=Info su **{0}**\: +serverinfoTitle=Info su {0}\: serverinfoOnlineUsers=Utenti online\: serverinfoTotalUsers=Utenti totali\: serverinfoRoles=Ruoli\: @@ -193,7 +193,7 @@ serverinfoGuildID=ID della gilda\: serverinfoCreationDate=Data di creazione\: serverinfoOwner=Proprietario\: serverinfoVLv=Verifica del testo\: -userinfoTitle=Informazioni su **{0}**\: +userinfoTitle=Informazioni su {0}\: userinfoUsername=Nome utente\: userinfoId=ID\: userinfoNick=Nickname\: @@ -212,7 +212,11 @@ commandsMaintenance=Manutenzione commandsBotOwner=Proprietario di Bot commandsMoreHelp=Dire {0} per ottenere ulteriori informazioni su un comando specifico. helpUnknownCommand=Comando sconosciuto. -helpDM=La documentazione si trova a\:\nhttps\://fredboat.com/docs\n\nVuoi aggiungere FredBoat al tuo server? Se hai le autorizzazioni di Gestione Server per la tua gilda, puoi invitarlo qui\:\n* Questo non suona musica *\n\n\nSe vuoi aggiungere il bot di musica, vuoi invitare questo bot\:\n\n\nHai bisogno di aiuto o hai qualche idea per il bot? Forse vuoi solo uscire? Vieni al hangout di FredBoat\!\n{0}\n\nNon \u00e8 possibile inviare i comandi di bot tramite DM.\nBot creato da Fre_d +helpDocsLocation=Si puo trovare la documentazione su\: +helpBotInvite=Vuoi aggiungere FredBoat al tuo server? se hai l'autorizzazione per aggiungere membri, puoi invitare FredBoat\: +helpHangoutInvite=Bai bisogno di aiuto o hai qualche idea per FredBoat? Forse volete solo parlare? Unisciti alla comunit\u00e0 di FredBoat\! +helpNoDmCommands=Non \u00e8 possibile inviare comandi di FredBoat tramite DMs. +helpCredits=Creato da Fre_d e collaboratori open source helpSent=La documentazione \u00e8 stata inviata ai vostri DM\! helpProperUsage=Utilizzo corretto\: helpCommandOwnerRestricted=Questo comando \u00e8 limitato al proprietario del bot. @@ -257,7 +261,7 @@ helpSayCommand=Fare il bot eco qualcosa. helpServerInfoCommand=Visualizzare alcune statistiche circa questa gilda. helpUserInfoCommand=Visualizzare le informazioni su di te o un utente noto al bot. helpPerms=Concedi ai ruoli e membri autorizzati il rank {0}. -helpPrefixCommand=Set the prefix for this guild. +helpPrefixCommand=Imposta il prefisso per questa gilda. helpVoteSkip=Votare per saltare il brano corrente. Ha bisogno del 50% di tutti gli utenti nella chat vocale per saltare. helpMathOperationAdd=Ti dice la somma del numero 1 e del numero 2. helpMathOperationSub=Ti dice la differenza tra il numero 1 e il numero 2. @@ -295,7 +299,7 @@ voteSkipEmbedVoters={0} su {1} hanno votato per saltare il brano mathOperationResult=Il risultato \u00e8 mathOperationDivisionByZeroError=Io non posso dividere per zero. mathOperationInfinity=Il numero \u00e8 troppo grande per essere visualizzato\! -prefix=Prefix -prefixGuild=The prefix for this guild is {0} -prefixShowAgain=You can show the prefix anytime again by mentioning me. +prefix=Prefisso +prefixGuild=Il prefisso per questa gilda \u00e8 {0} +prefixShowAgain=Puoi visualizzare il prefisso ogni volta menzionandomi. diff --git a/FredBoat/src/main/resources/lang/ja_JP.properties b/FredBoat/src/main/resources/lang/ja_JP.properties index 49cfe5ff2..d8a9e686d 100644 --- a/FredBoat/src/main/resources/lang/ja_JP.properties +++ b/FredBoat/src/main/resources/lang/ja_JP.properties @@ -8,7 +8,7 @@ playYoutubeSearchError=YouTube\u3092\u691c\u7d22\u3059\u308b\u3068\u304d\u306b\u playSearchNoResults=`{q}`\u306e\u691c\u7d22\u7d50\u679c\u304c\u3042\u308a\u307e\u305b\u3093\u3067\u3057\u305f\u3002 playSelectVideo=** ` {0} play 1-5`\u30b3\u30de\u30f3\u30c9\u3067\u66f2\u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044\uff1a** joinJoining={0} \u306b\u53c2\u52a0\u3057\u307e\u3057\u305f\u3002 -joinErrorAlreadyJoining=\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002Fredboat\u306f\u3059\u3067\u306b\u305d\u306e\u30c1\u30e3\u30cd\u30eb\u306b\u63a5\u7d9a\u3057\u3088\u3046\u3068\u3057\u3066\u3044\u308b\u306e\u3067\u3001{0} \u3092\u53c2\u52a0\u3067\u304d\u306a\u304b\u3063\u305f\u3002\u3082\u3046\u4e00\u5ea6\u3084\u308a\u76f4\u3057\u3066\u304f\u3060\u3055\u3044\u3002 +joinErrorAlreadyJoining=\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002Fredboat\u306f\u3059\u3067\u306b\u305d\u306e\u30c1\u30e3\u30cd\u30eb\u306b\u63a5\u7d9a\u3057\u3088\u3046\u3068\u3057\u3066\u3044\u308b\u306e\u3067\u3001{0} \u306b\u306f\u53c2\u52a0\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002\u3082\u3046\u4e00\u5ea6\u3084\u308a\u76f4\u3057\u3066\u304f\u3060\u3055\u3044\u3002 pauseAlreadyPaused=\u30d7\u30ec\u30fc\u30e4\u30fc\u306f\u65e2\u306b\u4e00\u6642\u505c\u6b62\u3057\u3066\u3044\u307e\u3059\u3002 pauseSuccess=\u30d7\u30ec\u30a4\u30e4\u30fc\u306f\u3053\u306e\u4e00\u6642\u505c\u6b62\u3067\u3059\u3002''{0}unpause'' \u3067\u518d\u958b\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002 repeatOnSingle=\u3053\u306e\u30c8\u30e9\u30c3\u30af\u306f\u4eca\u30ea\u30d4\u30fc\u30c8\u4e2d\u3067\u3059\u3002 @@ -19,7 +19,7 @@ selectInterval=\u756a\u53f7 1-{0} \u3092\u9078\u629e\u3059\u308b\u5fc5\u8981\u30 selectSelectionNotGiven=\u6700\u521d\u306b\u9078\u629e\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002 shuffleOn=\u3053\u306e\u30d7\u30ec\u30a4\u30e4\u30fc\u306f\u30b7\u30e3\u30c3\u30d5\u30eb\u3055\u308c\u307e\u3057\u305f\u3002 shuffleOff=\u30d7\u30ec\u30a4\u30e4\u30fc\u306f\u30b7\u30e3\u30c3\u30d5\u30eb\u3055\u308c\u306a\u304f\u306a\u308a\u307e\u3057\u305f\u3002 -reshufflePlaylist=\u30ad\u30e5\u30fc\u304c\u518d\u7de8\u3055\u308c\u307e\u3057\u305f\u3002 +reshufflePlaylist=\u30ad\u30e5\u30fc\u3092\u3082\u3046\u4e00\u5ea6\u30b7\u30e3\u30c3\u30d5\u30eb\u3057\u307e\u3059\u3002 reshufflePlayerNotShuffling=\u307e\u305a\u3001\u30b7\u30e3\u30c3\u30d5\u30eb \u30e2\u30fc\u30c9\u3092\u30aa\u30f3\u306b\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002 skipEmpty=\u30ad\u30e5\u30fc\u306b\u4f55\u3082\u3042\u308a\u307e\u305b\u3093\uff01 skipOutOfBounds={1} \u30c8\u30e9\u30c3\u30af\u304c\u304c\u3042\u308b\u3068\u304d\u306f\u3001\u30c8\u30e9\u30c3\u30af\u756a\u53f7 {0} \u3092\u524a\u9664\u3067\u304d\u307e\u305b\u3093\u3002 @@ -183,7 +183,7 @@ ratelimitedGeneralInfo=\u3042\u306a\u305f\u306f\u30ec\u30fc\u30c8\u5236\u9650\u3 ratelimitedSkipCommand=\u6b21\u306e\u30b3\u30de\u30f3\u30c9\u3092\u4f7f\u7528\u3057\u3066\u8907\u6570\u306e\u66f2\u3092\u30b9\u30ad\u30c3\u30d7\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\uff1a{0} ratelimitedGuildSlowLoadingPlaylist=\u73fe\u5728\u3001\u3053\u306e\u30b5\u30fc\u30d0\u30fc\u3067\u306f\u3001\u3053\u308c\u4ee5\u4e0a\u30d7\u30ec\u30a4\u30ea\u30b9\u30c8\u3092\u8ffd\u52a0\u3059\u308b\u3053\u3068\u306f\u8a31\u53ef\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002\u9577\u3044\u30d7\u30ec\u30a4\u30ea\u30b9\u30c8\u3092\u30b9\u30d1\u30e0\u3057\u306a\u3044\u3067\u304f\u3060\u3055\u3044\u3002 unblacklisted={0} \u3092\u30d6\u30e9\u30c3\u30af\u30ea\u30b9\u30c8\u304b\u3089\u6d88\u53bb\u3057\u307e\u3057\u305f\u3002 -serverinfoTitle=**{0}** \u306b\u95a2\u3057\u3066\u306e\u60c5\u5831\: +serverinfoTitle={0} \u306b\u95a2\u3059\u308b\u60c5\u5831\: serverinfoOnlineUsers=\u30aa\u30f3\u30e9\u30a4\u30f3\u30e6\u30fc\u30b6\u30fc\: serverinfoTotalUsers=\u5408\u8a08\u30e6\u30fc\u30b6\u30fc\u6570\uff1a serverinfoRoles=\u5f79\u5272\: @@ -193,7 +193,7 @@ serverinfoGuildID=\u30ae\u30eb\u30c9ID\: serverinfoCreationDate=\u4f5c\u6210\u65e5\: serverinfoOwner=\u30aa\u30fc\u30ca\u30fc\: serverinfoVLv=\u8a8d\u8a3c\u30ec\u30d9\u30eb\: -userinfoTitle=**{0}** \u306b\u95a2\u3059\u308b\u60c5\u5831\: +userinfoTitle={0} \u306b\u95a2\u3059\u308b\u60c5\u5831\: userinfoUsername=\u30e6\u30fc\u30b6\u30fc\u540d\uff1a userinfoId=ID\: userinfoNick=\u30cb\u30c3\u30af\u30cd\u30fc\u30e0\: @@ -212,7 +212,11 @@ commandsMaintenance=\u30e1\u30f3\u30c6\u30ca\u30f3\u30b9 commandsBotOwner=bot\u306e\u30aa\u30fc\u30ca\u30fc commandsMoreHelp={0} \u3068\u767a\u8a00\u3059\u308b\u3053\u3068\u3067\u3001\u7279\u5b9a\u306e\u30b3\u30de\u30f3\u30c9\u306b\u3064\u3044\u3066\u306e\u60c5\u5831\u3092\u8a73\u3057\u304f\u8868\u793a\u3067\u304d\u307e\u3059\u3002 helpUnknownCommand=\u4e0d\u660e\u306a\u30b3\u30de\u30f3\u30c9\u3002 -helpDM=\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u306fhttps\://fredboat.com/docs\u306b\u3042\u308a\u307e\u3059\u3002\u30b5\u30fc\u30d0\u30fc\u306bFredBoat\u3092\u8ffd\u52a0\u3057\u307e\u3059\u304b\uff1f\u3042\u306a\u305f\u306e\u30ae\u30eb\u30c9\u306e\u30b5\u30fc\u30d0\u7ba1\u7406\u6a29\u9650\u304c\u3042\u308b\u5834\u5408\u306f\u3001\u3053\u3053\u306b\u62db\u5f85\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\uff1a*\u3053\u308c\u306f\u97f3\u697d\u3092\u518d\u751f\u3057\u307e\u305b\u3093\u3002*\n \n\n\u97f3\u697d\u30dc\u30c3\u30c8\u3092\u8ffd\u52a0\u3057\u305f\u3044\u5834\u5408\u306f\u3001\u3053\u306e\u30dc\u30c3\u30c8\uff1a\u30dc\u30c3\u30c8\u306e\n \n\n\u52a9\u3051\u3084\u30a2\u30a4\u30c7\u30a2\u304c\u5fc5\u8981\u3067\u3059\u304b\uff1f\u305f\u3076\u3093\u3042\u306a\u305f\u306f\u30cf\u30f3\u30b0\u30a2\u30a6\u30c8\u3057\u305f\u3044\u306e\u3067\u3059\u304b\uff1fFredBoat\u30cf\u30f3\u30b0\u30a2\u30a6\u30c8\u306b\u6765\u3066\u304f\u3060\u3055\u3044\uff01\n{0} \n\n\u3053\u306e\u30dc\u30c3\u30c8\u30b3\u30de\u30f3\u30c9\u3092DM\u7d4c\u7531\u3067\u9001\u4fe1\u3059\u308b\u3053\u3068\u306f\u3067\u304d\u307e\u305b\u3093\u3002Fre_d\u306b\u3088\u3063\u3066\u4f5c\u6210\u3055\u308c\u305f\u30dc\u30c3\u30c8 +helpDocsLocation=\u4ed5\u69d8\u66f8\u306f\u3053\u3061\u3089\: +helpBotInvite=Fredboat\u3092\u3042\u306a\u305f\u306e\u30b5\u30fc\u30d0\u30fc\u306b\u8ffd\u52a0\u3057\u305f\u3044\u3067\u3059\u304b\uff1f\u3082\u3057\u3042\u306a\u305f\u304c\u30b5\u30fc\u30d0\u30fc\u306e\u7ba1\u7406\u306e\u6a29\u9650\u3092\u304a\u6301\u3061\u3067\u3057\u305f\u3089\u3001\u3053\u3061\u3089\u304b\u3089Fredboat\u3092\u62db\u5f85\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002\: +helpHangoutInvite=Fredboat\u306b\u95a2\u3057\u3066\u30d8\u30eb\u30d7\u304c\u5fc5\u8981\u3067\u3059\u304b\uff1f\u305d\u308c\u3068\u3082\u30a2\u30a4\u30c7\u30a2\u304c\u3042\u308a\u307e\u3059\u304b\uff1f\u3082\u3057\u304b\u3057\u3066\u4ed6\u306e\u4eba\u3068\u96c6\u307e\u308a\u305f\u3044\u3067\u3059\u304b\uff1f\u306a\u3089\u3070\u662f\u975eFredboat\u30b3\u30df\u30e5\u30cb\u30c6\u30a3\u306b\u6765\u307e\u3057\u3087\u3046\uff01 +helpNoDmCommands=DM\u3067Fredboat\u306e\u30b3\u30de\u30f3\u30c9\u3092\u4f7f\u3046\u3053\u3068\u306f\u3067\u304d\u307e\u305b\u3093\u3002 +helpCredits=Fre_d\u3068\u30aa\u30fc\u30d7\u30f3\u30bd\u30fc\u30b9\u8ca2\u732e\u8005\u306b\u3088\u3063\u3066\u4f5c\u6210\u3055\u308c\u307e\u3057\u305f\u3002 helpSent=\u30d8\u30eb\u30d7\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u3092DM\u3067\u9001\u308a\u307e\u3057\u305f\uff01 helpProperUsage=\u9069\u5207\u306a\u4f7f\u7528\u65b9\u6cd5\: helpCommandOwnerRestricted=\u3053\u306e\u30b3\u30de\u30f3\u30c9\u306fbot\u306e\u30aa\u30fc\u30ca\u30fc\u306b\u3088\u3063\u3066\u5236\u9650\u3055\u308c\u3066\u3044\u307e\u3059\u3002 @@ -257,7 +261,7 @@ helpSayCommand=\u30dc\u30c3\u30c8\u30a8\u30b3\u30fc\u3092\u4f55\u304b\u306b\u305 helpServerInfoCommand=\u3053\u306e\u30ae\u30eb\u30c9\u306b\u95a2\u3057\u3066\u306e\u60c5\u5831\u3092\u3001\u3044\u304f\u3064\u304b\u8868\u793a\u3002 helpUserInfoCommand=\u81ea\u5206\u307e\u305f\u306f\u30dc\u30c3\u30c8\u306b\u77e5\u3089\u308c\u3066\u3044\u308b\u30e6\u30fc\u30b6\u30fc\u306b\u95a2\u3059\u308b\u60c5\u5831\u3092\u8868\u793a\u3057\u307e\u3059\u3002 helpPerms={0} \u30e9\u30f3\u30af\u306e\u30db\u30ef\u30a4\u30c8\u30ea\u30b9\u30c8\u30e1\u30f3\u30d0\u30fc\u3068\u30ed\u30fc\u30eb\u3092\u8a31\u53ef\u3057\u307e\u3059\u3002 -helpPrefixCommand=Set the prefix for this guild. +helpPrefixCommand=\u3053\u306e\u30ae\u30eb\u30c9\u306e\u30d7\u30ec\u30d5\u30a3\u30c3\u30af\u30b9\u3092\u8a2d\u5b9a\u3057\u307e\u3059\u3002 helpVoteSkip=\u73fe\u5728\u306e\u66f2\u3092\u30b9\u30ad\u30c3\u30d7\u3059\u308b\u305f\u3081\u306b\u6295\u7968\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u30dc\u30a4\u30b9\u30c1\u30e3\u30c3\u30c8\u306e\u5168\u30e6\u30fc\u30b6\u30fc\u306e50\uff05\u304c\u6295\u7968\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002 helpMathOperationAdd=num1\u3068num2\u306e\u5408\u8a08\u3092\u51fa\u529b\u3057\u307e\u3059\u3002 helpMathOperationSub=num2\u304b\u3089num1\u3092\u5f15\u3044\u305f\u5dee\u3092\u51fa\u529b\u3057\u307e\u3059\u3002 @@ -295,7 +299,7 @@ voteSkipEmbedVoters={0} \u304b\u3089{1} \u3001\u73fe\u5728\u306e\u30c8\u30e9\u30 mathOperationResult=\u7d50\u679c\u306f\u6b21\u306e\u3068\u304a\u308a\u3067\u3059\u3002 mathOperationDivisionByZeroError=\u79c1\u306f\u30bc\u30ed\u3067\u5272\u308b\u3053\u3068\u306f\u3067\u304d\u307e\u305b\u3093\u3002 mathOperationInfinity=\u6570\u5b57\u304c\u5927\u304d\u3059\u304e\u3066\u8868\u793a\u3067\u304d\u307e\u305b\u3093\u3002 -prefix=Prefix -prefixGuild=The prefix for this guild is {0} -prefixShowAgain=You can show the prefix anytime again by mentioning me. +prefix=\u30d7\u30ec\u30d5\u30a3\u30c3\u30af\u30b9 +prefixGuild=\u3053\u306e\u30ae\u30eb\u30c9\u306e\u30d7\u30ec\u30d5\u30a3\u30c3\u30af\u30b9\u306f {0} +prefixShowAgain=\u79c1\u306b\u8a00\u53ca\u3001\u3044\u3064\u3067\u3082\u518d\u3073\u30d7\u30ec\u30d5\u30a3\u30c3\u30af\u30b9\u3092\u8868\u793a\u3067\u304d\u307e\u3059\u3002 diff --git a/FredBoat/src/main/resources/lang/ko_KR.properties b/FredBoat/src/main/resources/lang/ko_KR.properties index 641dfdbee..aa86db800 100644 --- a/FredBoat/src/main/resources/lang/ko_KR.properties +++ b/FredBoat/src/main/resources/lang/ko_KR.properties @@ -45,7 +45,7 @@ exportPlaylistFail=hastebin.com \uc5d0 \ud50c\ub808\uc774\ub9ac\uc2a4\ud2b8\ub97 listShowShuffled=\uc154\ud50c(\ub79c\ub364) \uae30\ub2a5\uc774 \uc801\uc6a9\ub41c \ud50c\ub808\uc774\ub9ac\uc2a4\ud2b8 \uc785\ub2c8\ub2e4.\n\n listShowRepeatSingle=\ud604\uc7ac \ud2b8\ub799\uc744 \ubc18\ubcf5\ud569\ub2c8\ub2e4 listShowRepeatAll=\ud604\uc7ac \ub300\uae30 \ubaa9\ub85d\uc744 \ubc18\ubcf5 \ud569\ub2c8\ub2e4 -listShowHistory=Showing tracks in history. +listShowHistory=\uc5ed\uc0ac\uc758 \ud754\uc801\ubcf4\uae30. listAddedBy=**{0}**, **{1}**\uc5d0 \uc758\ud574 \ucd94\uac00\ub428. `[{2}]` listStreamsOnlySingle=\ucd1d **{0}** \uac1c\uc758 \ub77c\uc774\ube0c {1} \uac00 \uc7ac\uc0dd \ud050\uc5d0 \uc788\uc2b5\ub2c8\ub2e4. listStreamsOnlyMultiple=\ucd1d **{0}** \uac1c\uc758 \ub77c\uc774\ube0c {1} \uac00 \uc7ac\uc0dd \ud050\uc5d0 \uc788\uc2b5\ub2c8\ub2e4. @@ -57,7 +57,7 @@ listAsWellAsLiveStreams=, \ucd1d **{0}** \uac1c\uc758 \ub77c\uc774\ube0c {1} trackSingular=\ud2b8\ub799 trackPlural=\ud2b8\ub799 npNotPlaying=\ud604\uc7ac \uc7ac\uc0dd\uc911\uc778 \uc74c\uc545\uc774 \uc5c6\uc2b5\ub2c8\ub2e4. -npNotInHistory=Currently no tracks in history. +npNotInHistory=\uc774\uc804 \ub0a0\uc528\ub97c \ucc3e\uc2b5\ub2c8\ub2e4 npDescription=\uc124\uba85 npLoadedSoundcloud=[{0}/{1}]\n\nSoundCloud\uc5d0\uc11c \ubd88\ub7ec\uc634 npLoadedBandcamp={0}\n\nBandcamp\uc5d0\uc11c \ubd88\ub7ec\uc634 @@ -133,7 +133,7 @@ brainfuckDataPointerOutOfBounds=\ub370\uc774\ud130 \ud3ec\uc778\ud130\uac00 \ubc brainfuckInputOOB={0} \uc704\uce58\uc5d0\uc11c \ud55c\uacc4\ub97c \ubc97\uc5b4\ub0ac\uc2b5\ub2c8\ub2e4. brainfuckNoOutput=\ucd9c\ub825\uc774 \uc5c6\uc5c8\ub2e4. weatherLocationNotFound=\uc704\uce58\ub97c \ucc3e\uc744 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. \uc785\ub825\uac12 {0}\uc744 \ud655\uc778\ud558\uc2dc\uae30 \ubc14\ub78d\ub2c8\ub2e4. -weatherError=Error retrieving weather for {0} +weatherError={0} \uc5d0 \ub300 \ud55c \ub0a0\uc528\ub97c \uac80\uc0c9 \ud558\ub358 \ub3c4\uc911 \uc624\ub958 avatarSuccess=\uadf8\uac83\uc744 \ubc1c\uacac\n{0} configNoArgs=** {0} **\uc5d0 \ub300\ud55c \uad6c\uc131 \:``` configSetTo=\uc774\uc81c`{0}`\uc73c\ub85c \uc124\uc815\ub429\ub2c8\ub2e4. @@ -183,7 +183,7 @@ ratelimitedGeneralInfo=\ub2f9\uc2e0\uc740 \uc18d\ub3c4\uac00 \uc81c\ud55c\ub418\ ratelimitedSkipCommand={0} \uba85\ub839\uc5b4\ub97c \uc0ac\uc6a9\ud558\uc5ec \ud558\ub098 \uc774\uc0c1\uc758 \uace1\uc744 \uac74\ub108\ub6f8 \uc218 \uc788\uc2b5\ub2c8\ub2e4. ratelimitedGuildSlowLoadingPlaylist=\uc774 \uc11c\ubc84\ub294 \ud604\uc7ac \uc7ac\uc0dd \ubaa9\ub85d\uc744 \ub354 \uc774\uc0c1 \ucd94\uac00\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. \uae34 \uc7ac\uc0dd \ubaa9\ub85d\uc744 \uc7ac\uc0dd\ud558\uc9c0 \ub9c8\uc2ed\uc2dc\uc624. unblacklisted=\ube14\ub799 \ub9ac\uc2a4\ud2b8\uc5d0\uc11c {0} \uc744(\ub97c) \uc81c\uac70\ud588\uc2b5\ub2c8\ub2e4. -serverinfoTitle=**{0}**\uc5d0 \ub300\ud55c \uc815\ubcf4. +serverinfoTitle={0}\uc5d0 \ub300\ud55c \uc815\ubcf4\: serverinfoOnlineUsers=\uc628\ub77c\uc778 \uc720\uc800\ub4e4\: serverinfoTotalUsers=\ucd1d \uc720\uc800\ub4e4\: serverinfoRoles=\uc5ed\ud560\ub4e4\: @@ -193,17 +193,17 @@ serverinfoGuildID=\uae38\ub4dc \uc544\uc774\ub514\: serverinfoCreationDate=\uc0dd\uc131 \ub0a0\uc9dc\: serverinfoOwner=\uc8fc\uc778\: serverinfoVLv=\uc778\uc99d \ub808\ubca8\: -userinfoTitle=**{0}**\uc5d0 \ub300\ud55c \uc815\ubcf4. +userinfoTitle={0}\uc5d0 \ub300\ud55c \uc815\ubcf4\: userinfoUsername=\uc720\uc800\ub124\uc784\: userinfoId=\uc544\uc774\ub514\: userinfoNick=\ubcc4\uba85\: userinfoKnownServer=\uc544\ub294 \uc11c\ubc84\ub4e4\: userinfoJoinDate=\uac00\uc785 \ub0a0\uc9dc\: userinfoCreationTime=\uc0dd\uc131 \ub0a0\uc9dc\: -userinfoBlacklisted=Blacklisted\: -skipDeniedTooManyTracks=You can't skip someone else's tracks if you are not a DJ.\nConsider using the Voteskip command. +userinfoBlacklisted=\ube14\ub799 \ub9ac\uc2a4\ud2b8\: +skipDeniedTooManyTracks=Dj\uac00 \uc544\ub2cc\uacbd\uc6b0 \ub2e4\ub978\uc0ac\ub78c\uc758 \ub178\ub798\ub97c \uac74\ub108\ub6f8 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. Voteskip \uba85\ub839\uc5b4\ub97c \uc0ac\uc6a9\ud558\uc2dc\ub294\uac83\uc774 \uc88b\uc2b5\ub2c8\ub2e4. eventUsersLeftVC=\ubaa8\ub4e0 \uc720\uc800\ub4e4\uc774 \uc74c\uc131 \ucc44\ub110\uc744 \ub5a0\ub0ac\uc2b5\ub2c8\ub2e4. \uc74c\uc545 \ud50c\ub808\uc774\uc5b4\uac00 \uc77c\uc2dc\uc911\uc9c0 \ub418\uc5c8\uc2b5\ub2c8\ub2e4. -eventAutoResumed=User presence detected, automatically resuming the player. +eventAutoResumed=\uc74c\uc131\uccb4\ub123\uc758 \uc0ac\uc6a9\uc790 \uac10\uc9c0\! \uc790\ub3d9\uc73c\ub85c \ub178\ub798\ub97c \ub2e4\uc2dc \uc2dc\uc791 \ud569\ub2c8\ub2e4\! commandsFun=\uc7ac\ubbf8 commandsMemes=\ubc08\ub4e4 commandsUtility=\uc720\ud2f8\ub9ac\ud2f0 @@ -212,7 +212,11 @@ commandsMaintenance=\uc810\uac80 commandsBotOwner=\ubd07 \uc8fc\uc778 commandsMoreHelp={0} \uc744 \ub9d0\ud558\uc5ec \ud2b9\uc815 \uba85\ub839\uc5b4\uc5d0 \ub300\ud55c \ub354 \ub9ce\uc740\uac83\uc744 \uc54c\uc544\ubcf4\uc138\uc694. helpUnknownCommand=\uc54c \uc218 \uc5c6\ub294 \uba85\ub839\uc5b4\uc785\ub2c8\ub2e4. -helpDM=\ubb38\uc11c\ub294 \uc774\uacf3\uc5d0\uc11c \ubcfc \uc218 \uc788\uc2b5\ub2c8\ub2e4.\nhttps\://fredboat.com/docs\n\n\ud504\ub808\ub4dc\ubcf4\ud2b8\ub97c \ub2f9\uc2e0\uc758 \uc11c\ubc84\uc5d0 \ucd94\uac00\ud558\uace0 \uc2f6\uc73c\uc2e0\uac00\uc694?\n\ub2f9\uc2e0\uc774 \uad00\ub9ac \uad8c\ud55c\uc744 \uac00\uc9c0\uace0 \uc788\ub2e4\uba74 \uc5ec\uae30\uc11c \ucd08\ub300\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.\n*\uc774 \ubd07\uc740 \ubba4\uc9c1 \ud50c\ub808\uc774\uc5b4 \uae30\ub2a5\uc774 \uc5c6\uc2b5\ub2c8\ub2e4.*\n\n\n\ubba4\uc9c1 \ud50c\ub808\uc774\uc5b4 \uae30\ub2a5\uc774 \uc788\ub294 \ubd07\uc740 \uc5ec\uae30\uc11c \ucd08\ub300\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.\n\n\n\ub3c4\uc6c0\uc774 \ud544\uc694\ud558\uac70\ub098, \ubd07\uc5d0 \ub300\ud55c \uc544\uc774\ub514\uc5b4\uac00 \uc788\ub098\uc694?\n\uc544\ub2c8\uba74 \uadf8\uc800 \ub180\uace0\uc2f6\uc740\uac00\uc694? \ud504\ub808\ub4dc\ubcf4\ud2b8 \ud589\uc544\uc6c3\uc73c\ub85c \uc624\uc138\uc694\!\n{0}\n\n\ubd07 \uba85\ub839\uc5b4\ub294 DM\uc73c\ub85c \ubcf4\ub0bc \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.\n\uc774 \ubd07\uc740 Fre_d\uc5d0 \uc758\ud574 \uc81c\uc791\ub418\uc5c8\uc2b5\ub2c8\ub2e4. +helpDocsLocation=\ubb38\uc11c\ub97c \uc774\uacf3\uc5d0\uc11c \ucc3e\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4\: +helpBotInvite=FredBoat\ub97c \ub2f9\uc2e0\uc758 \uc11c\ubc84\uc5d0 \ucd94\uac00\ud558\uae30\ub97c \uc6d0\ud558\uc2dc\ub098\uc694? \uc11c\ubc84 \uad00\ub9ac\uc790 \uad8c\ud55c\uc774 \uc788\ub2e4\uba74, FredBoat\ub97c \ucd94\uac00\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4\: +helpHangoutInvite=FredBoat\uc5d0 \ub3c4\uc6c0\uc774 \ud544\uc694\ud558\uac70\ub098, \uc544\uc774\ub514\uc5b4\uac00 \uc788\uc73c\uc2dc\ub098\uc694? \uc544\ub2c8\uba74 \uadf8\ub0e5 \ub180\uace0 \uc2f6\ub098\uc694? FredBoat \ucee4\ubba4\ub2c8\ud2f0\uc5d0 \uac00\uc785\ud558\uc138\uc694\! +helpNoDmCommands=\uac1c\uc778 \uba54\uc138\uc9c0\ub97c \ud1b5\ud574 FredBoat\uc5d0\uac8c \uba85\ub839\uc5b4\ub97c \ubcf4\ub0bc \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. +helpCredits=Fre_d\uc640 \uc624\ud508 \uc18c\uc2a4 \uae30\uc5ec\uc790\uc5d0 \uc758\ud574\uc11c \ub9cc\ub4e4\uc5b4\uc9d0 helpSent=\ubb38\uc11c \uadc0\ud558\uc758 DMs\ub97c \ubcf4\ub0c8\uc2b5\ub2c8\ub2e4\! helpProperUsage=\uc815\ud655\ud55c \uc0ac\uc6a9\ubc95\: helpCommandOwnerRestricted=\uc774 \uba85\ub839\uc5b4\ub294 \ubd07 \uc8fc\uc778\ub9cc \uc0ac\uc6a9 \ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. @@ -225,20 +229,20 @@ helpMusicCommandsHeader=\ud504\ub808\ub4dc\ubcf4\ud2b8 \uc74c\uc545 \uba85\ub839 helpJoinCommand=\ubd07\uc744 \ub2f9\uc2e0\uc774 \ud604\uc7ac \ub4e4\uc5b4\uac00 \uc788\ub294 \uc74c\uc131 \ucc44\ub110\uc5d0 \ub4e4\uc5b4\uac00\uac8c \ud558\uc138\uc694. helpLeaveCommand=\ubd07\uc744 \ud604\uc7ac \uc74c\uc131 \ucc44\ub110\uc5d0\uc11c \ub5a0\ub098\uac8c \ud558\uc138\uc694. helpPauseCommand=\ud50c\ub808\uc774\uc5b4\ub97c \uc77c\uc2dc \uc911\uc9c0 \ud569\ub2c8\ub2e4. -helpPlayCommand=Play music from the given URL or search for a track. For a full list of sources please visit {0} +helpPlayCommand=\uc9c0\uc815\ub41c URL\uc5d0\uc11c \uc74c\uc545\uc744 \uc7ac\uc0dd\ud558\uac70\ub098 \ud2b8\ub799\uc744 \uac80\uc0c9\ud569\ub2c8\ub2e4. \uc804\uccb4 \uc18c\uc2a4 \ubaa9\ub85d\uc744 \ubcf4\ub824\uba74{0} \uc744(\ub97c) \ubc29\ubb38\ud558\uc2ed\uc2dc\uc624. helpPlaySplitCommand=\uc720\ud29c\ube0c \uc601\uc0c1\uc744 \uc124\uba85\uc5d0 \uc81c\uacf5\ub41c \ud2b8\ub799\ubaa9\ub85d\uc73c\ub85c \ub098\ub204\uc138\uc694. helpRepeatCommand=\ubc18\ubcf5 \ubaa8\ub4dc \uc5d0\uc11c \uc804\ud658\ud568 helpReshuffleCommand=\ud604\uc7ac \ub300\uae30 \ubaa9\ub85d\uc744 \ub2e4\uc2dc \uc154\ud50c \ud558\uc138\uc694. helpSelectCommand=\uac80\uc0c9 \ud6c4 \uc81c\uacf5\ub41c \ud2b8\ub799\uc911\uc5d0\uc11c \uc120\ud0dd\uc744 \ud558\uc5ec \uc7ac\uc0dd\ud558\uc138\uc694. helpShuffleCommand=\ud604\uc7ac \ub300\uae30\ubaa9\ub85d\uc744 \uc704\ud55c \uc154\ud50c \ubaa8\ub4dc\ub97c \ud0b5\ub2c8\ub2e4. -helpSkipCommand=Skip the current song, the n'th song in the queue, all songs from n to m, or all songs from mentioned users. Please use in moderation. +helpSkipCommand=\ud604\uc7ac \uace1, N\ubc88\uc9f8 \uace1, \ubaa8\ub4e0 \ub178\ub798, \ub610\ub294 \uc5b8\uae09\ub41c \uc0ac\uc6a9\uc790\uc758 \ubaa8\ub4e0 \ub178\ub798\ub97c \uac74\ub108\ub701\ub2c8\ub2e4. \uc801\ub2f9\ud788 \uc0ac\uc6a9\ud574 \uc8fc\uc138\uc694. helpStopCommand=\ud50c\ub808\uc774\uc5b4\ub97c \uc911\uc9c0\ud558\uace0 \ud50c\ub808\uc774\ub9ac\uc2a4\ud2b8\ub97c \uae54\ub054\ud558\uac8c \uc0ad\uc81c\ud569\ub2c8\ub2e4. \uba54\uc2dc\uc9c0 \uad00\ub9ac \uad8c\ud55c\uc774 \uc788\ub294 \uad00\ub9ac\uc790\ub4e4\ud55c\ud14c \uad8c\ud55c\uc774 \uc788\uc2b5\ub2c8\ub2e4. helpUnpauseCommand=\ud50c\ub808\uc774\uc5b4\ub97c \ub2e4\uc2dc \uc7ac\uc0dd \ud569\ub2c8\ub2e4. helpVolumeCommand=\uc74c\uc545\uc758 \ubcfc\ub968\uc744 \uc870\uc808\ud569\ub2c8\ub2e4. \uc22b\uc790 0-150 \uc0ac\uc774\uc5d0\uc11c \uc870\uc808\uc774 \uac00\ub2a5\ud569\ub2c8\ub2e4 \uae30\ubcf8 \uac12\uc740 100 \uc785\ub2c8\ub2e4. \ubcfc\ub968 \uba85\ub839\uc5b4\ub294 \uc77c\ubc18\ubd07\uc5d0\uc11c\ub294 \uc0ac\uc6a9\uc744 \ud558\uc2e4 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. helpExportCommand=Hastebin \ub9c1\ud06c\ub85c \ud604\uc7ac \ub300\uae30 \ubaa9\ub85d\uc744 \ube7c\uac11\ub2c8\ub2e4, \ub098\uc911\uc5d0 \uc7ac\uc0dd \ubaa9\ub85d\uc73c\ub85c \uc0ac\uc6a9 \ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. helpGensokyoRadioCommand=\uc9c0\uae08 gensokyoradio.net \uc5d0\uc11c \uc7ac\uc0dd\ub418\uace0 \uc788\ub294 \uc74c\uc545\uc744 \ubcf4\uc5ec\uc90d\ub2c8\ub2e4. helpListCommand=\uc7ac\uc0dd \ubaa9\ub85d\uc5d0 \uc788\ub294 \ud604\uc7ac \uc74c\uc545\uc758 \ubaa9\ub85d\uc744 \ubcf4\uc5ec\uc90d\ub2c8\ub2e4. -helpHistoryCommand=Display a list of the songs in playlist history. +helpHistoryCommand=\uc7ac\uc0dd \ubaa9\ub85d \ubaa9\ub85d\uc5d0 \uace1 \ubaa9\ub85d\uc744 \ud45c\uc2dc\ud569\ub2c8\ub2e4. helpNowplayingCommand=\ud604\uc7ac \uc7ac\uc0dd\ub418\uace0 \uc788\ub294 \uc74c\uc545\uc744 \ubcf4\uc5ec\uc90d\ub2c8\ub2e4. helpForwardCommand=\ud2b8\ub799\uc744 \uc8fc\uc5b4\uc9c4 \uc2dc\uac04\uc73c\ub85c \ud2b8\ub799\uc744 \ub418\uac10\uc2b5\ub2c8\ub2e4.\n\uc608\: helpRestartCommand=\ud604\uc7ac \ud2b8\ub799\uc744 \uc7ac\uc2dc\uc791 \ud569\ub2c8\ub2e4. @@ -246,7 +250,7 @@ helpRewindCommand=\ud2b8\ub799\uc744 \uc8fc\uc5b4\uc9c4 \uc2dc\uac04\uc73c\ub85c helpSeekCommand=\uc8fc\uc5b4\uc9c4 \uc2dc\uac04\uc73c\ub85c \ud2b8\ub799\uc758 \uc704\uce58\ub97c \uc124\uc815\ud569\ub2c8\ub2e4.\n\uc608\: helpAvatarCommand=\uc720\uc800\uc758 \uc544\ubc14\ud0c0\ub97c \ud45c\uc2dc\ud569\ub2c8\ub2e4. helpBrainfuckCommand=Brainfuck \ucf54\ub4dc\ub97c \uc2e4\ud589\ud569\ub2c8\ub2e4. \uc608\: -helpWeatherCommand=Display current weather by location. +helpWeatherCommand=\ud604\uc7ac \uc704\uce58\ubcc4\ub85c \ud604\uc7ac \ub0a0\uc528\ub97c \ud45c\uc2dc\ud569\ub2c8\ub2e4. helpClearCommand=\uc774 \ubd07\uc758 50\uac1c\uc758 \uba54\uc2dc\uc9c0\ub97c \uc774 \ucc44\ub110\uc5d0\uc11c \uc0ad\uc81c \ud569\ub2c8\ub2e4. helpCommandsCommand=\uc0ac\uc6a9\ud560 \uc218 \uc788\ub294 \uba85\ub839\uc744 \ud45c\uc2dc \ud569\ub2c8\ub2e4. helpHelpCommand=\uc774 \ubd07\uc5d0 \ub300\ud55c \ub3c4\uc6c0\uc744 \ubc1b\uac70\ub098 \uc544\ubb34 \uba85\ub839\uc5b4\uc5d0 \ub300\ud55c \ub3c4\uc6c0\uc744 \ubc1b\uc73c\uc138\uc694. @@ -257,16 +261,16 @@ helpSayCommand=\ubd07\uc774 \ubb34\uc5b8\uac00\ub97c \uc5d0\ucf54\ud558\uac8c \u helpServerInfoCommand=\uc774 \uae38\ub4dc\uc5d0 \ub300\ud55c \uba87 \uac00\uc9c0 \ud1b5\uacc4\ub97c \ud45c\uc2dc\ud569\ub2c8\ub2e4. helpUserInfoCommand=\ub2f9\uc2e0\uc758 \ub300\ud55c \uc815\ubcf4\ub098 \ubd07\uc774 \uc544\ub294 \ub2e4\ub978 \uc720\uc800\uc5d0 \ub300\ud55c \uc815\ubcf4\ub97c \ud45c\uc2dc\ud569\ub2c8\ub2e4. helpPerms={0} \uad8c\ud55c\uc758 \uc720\uc800\uc640 \uc5ed\ud560\uc5d0 \ub300\ud55c \ud654\uc774\ud2b8\ub9ac\uc2a4\ud305\uc744 \ud5c8\uc6a9\ud569\ub2c8\ub2e4. -helpPrefixCommand=Set the prefix for this guild. +helpPrefixCommand=\uc774 \uc11c\ubc84\uc758 \uc811\ub450\uc0ac( prefix) \ub97c \uc124\uc815\ud558\uc138\uc694. helpVoteSkip=\uc774 \uc74c\uc545\uc744 \uac74\ub108\ub6f0\uae30 \uc704\ud574 \ud22c\ud45c\ud558\uc2ed\uc2dc\uc624. \uc74c\uc131 \ucc44\ud305\ubc29\uc5d0 \uc788\ub294 50% \uc774\uc0c1\uc758 \uc720\uc800\uc758 \ud22c\ud45c\uac00 \ud544\uc694\ud569\ub2c8\ub2e4. -helpMathOperationAdd=Print the sum of num1 and num2. -helpMathOperationSub=Print the difference of subtracting num2 from num1. -helpMathOperationMult=Print the product of num1*num2. -helpMathOperationDiv=Print the quotient of dividing num1 by num2. -helpMathOperationMod=Print the remainder of dividing num1 by num2. -helpMathOperationPerc=Print the percentage represented by num1 in num2. -helpMathOperationSqrt=Print the square root of num. -helpMathOperationPow=Print the result of num1^num2. +helpMathOperationAdd=Num1\uacfc num2\uc758 \ud569\uacc4\ub97c \ucd9c\ub825\ud569\ub2c8\ub2e4. +helpMathOperationSub=Num1 \uc5d0\uc11c num2\ub97c \ube80 \ucc28\uc774\ub97c \ucd9c\ub825\ud569\ub2c8\ub2e4. +helpMathOperationMult=Num1\uacfcnum2 \ub97c \uacf1\ud55c\uac12\uc744 \ucd9c\ub825\ud569\ub2c8\ub2e4 +helpMathOperationDiv=Num2 num1 \ub098\ub208 \ubaab\uc744 \ucd9c\ub825 \ud569\ub2c8\ub2e4. +helpMathOperationMod=Num2 num1 \ub098\ub208 \ub098\uba38\uc9c0\ub97c \ucd9c\ub825 \ud569\ub2c8\ub2e4. +helpMathOperationPerc=Num1 num2\uc5d0\uc11c \ub098\ud0c0\ub0b4\ub294 \ubc31\ubd84\uc728\uc744 \ucd9c\ub825 \ud569\ub2c8\ub2e4. +helpMathOperationSqrt=\uc22b\uc790\uc758 \uc81c\uacf1\uadfc\uc744 \ucd9c\ub825 +helpMathOperationPow=Num1^num2 \uc758 \uac12\uc744 \ucd9c\ub825 destroyDenied=\ud50c\ub808\uc774\uc5b4\ub97c \uc7ac\uc124\uc815\ud558\ub824\uba74 \uba54\uc2dc\uc9c0 \uad00\ub9ac \uad8c\ud55c\uc774 \uc788\uc5b4\uc57c \ud569\ub2c8\ub2e4. destroyHelp=\ud50c\ub808\uc774\uc5b4\ub97c \uc7ac\uc124\uc815\ud558\uace0 \uc7ac\uc0dd \ubaa9\ub85d\uc744 \uc9c0\uc6c1\ub2c8\ub2e4. \uba54\uc2dc\uc9c0 \uad00\ub9ac \uad8c\ud55c\uc744 \uac00\uc9c4 \uc870\uc815\uc790\uc6a9\uc73c\ub85c \uc608\uc57d\ub418\uc5c8\uc2b5\ub2c8\ub2e4. destroySucc=\ud50c\ub808\uc774\uc5b4\ub97c \uc7ac\uc124\uc815\ud558\uace0 \ud050\ub97c \uc0ad\uc81c\ud569\ub2c8\ub2e4. @@ -275,27 +279,27 @@ permsListTitle={0} \uad8c\ud55c\uc758 \uc720\uc800\uc640 \uc5ed\ud560 permsAdded=`{0}`\uc744 `{1}`\uc5d0 \ucd94\uac00\ud588\uc2b5\ub2c8\ub2e4. permsRemoved=`{0}`\uc744 `{1}`\uc5d0\uc11c \uc81c\uac70\ud588\uc2b5\ub2c8\ub2e4. permsFailSelfDemotion=\uad00\ub9ac\uc790 \uad8c\ud55c\uc774 \uc5c6\uc774\ub294 \uc81c\uac70\uac00 \ubd88\uac00\ub2a5\ud569\ub2c8\ub2e4. -permsAlreadyAdded={0} already added to {1} -permsNotAdded={0} is not in {1} +permsAlreadyAdded={0} \uc774(\uac00) \uc774\ubbf8{1} \uc5d0 \ucd94\uac00\ub418\uc5c8\uc2b5\ub2c8\ub2e4. +permsNotAdded={0} \uc774(\uac00){1} \uc5d0 \uc5c6\uc2b5\ub2c8\ub2e4. fuzzyMultiple=\uc5ec\ub7ec \ud56d\ubaa9\uc744 \ucc3e\uc558\uc2b5\ub2c8\ub2e4. \ubb34\uc5c7\uc744 \uc120\ud0dd\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? fuzzyNothingFound=`{0}`\uc744 \ucc3e\uc744 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. cmdPermsTooLow=\uc774 \uba85\ub839\uc5b4\ub97c \uc2e4\ud589\ud558\uae30 \uc704\ud55c \uad8c\ud55c\uc774 \uc5c6\uc2b5\ub2c8\ub2e4. \uc2e4\ud589\ud558\uae30 \uc704\ud574\uc11c\ub294 `{0}` \uad8c\ud55c\uc774 \ud544\uc694\ud569\ub2c8\ub2e4. playersLimited=\ud504\ub808\ub4dc\ubcf4\ud2b8\uc758 \uc6a9\ub7c9\uc774 \uac00\ub4dd \ucc3c\uc2b5\ub2c8\ub2e4\! \uc9c0\uae08 \ud504\ub808\ub4dc\ubcf4\ud2b8\ub294 \ucd5c\ub300 `{0}`\uacf3\uc5d0\uc11c \uc5f0\uacb0\ud560 \uc218 \uc788\ub3c4\ub85d \uc81c\ud55c\ub418\uc5b4\uc788\uc73c\uba70, \uadf8\ub807\uc9c0 \uc54a\uc73c\uba74 \ub124\ud2b8\uc6cc\ud06c \ubd80\ud558\ub85c \uc778\ud574 \ub514\uc2a4\ucf54\ub4dc\uc5d0\uc11c \uc5f0\uacb0\uc774 \ub04a\uc5b4\uc9d1\ub2c8\ub2e4.\n\uc6b0\ub9ac\ub97c \ub3c4\uc640 \uc81c\ud55c\uc744 \uc62c\ub9ac\uac70\ub098 \ubd80\ud558\ub418\uc9c0 \uc54a\uc740 \ubd07\uc744 \uc0ac\uc6a9\ud558\uace0\uc2f6\ub2e4\uba74, \ud30c\ud2b8\ub808\uc628\uc5d0\uc11c \uc791\uc5c5\uc744 \ub3c4\uc640\uc8fc\uc2ed\uc2dc\uc624.\n{1}\n\n\ubd88\ud3b8\uc744 \ub07c\uccd0 \ub4dc\ub824 \uc8c4\uc1a1\ud569\ub2c8\ub2e4\! \ub098\uc911\uc5d0 \ub2e4\uc2dc \uc2dc\ub3c4\ud574 \uc8fc\uc138\uc694.\n\uc774 \uba54\uc2dc\uc9c0\ub294 \ubcf4\ud1b5 \ud53c\ud06c\ud0c0\uc784\uc5d0 \ub098\ud0c0\ub0a9\ub2c8\ub2e4. tryLater=\ub098\uc911\uc5d0 \ub2e4\uc2dc \uc2dc\ub3c4\ud574 \uc8fc\uc138\uc694. skipUserSingle={1}\uac00 \ucd94\uac00\ud55c {0}\uc744 \uac74\ub108\ub6f0\uc5c8\uc2b5\ub2c8\ub2e4. -skipUserMultiple=Skipped {0} tracks added by {1}. -skipUsersMultiple=Skipped {0} tracks added by {1} users. -skipUserNoTracks=None of the mentioned users have any tracks queued. -voteSkipAdded=Your vote has been added\! -voteSkipAlreadyVoted=You already voted to skip this track\! -voteSkipSkipping={0} have voted to skip. Skipping track {1}. -voteSkipNotEnough={0} have voted to skip. At least {1} needed. -voteSkipEmbedNoVotes=No votes to skip this track yet. -voteSkipEmbedVoters={0} out of {1} have voted to skip the current track +skipUserMultiple={1} \uac1c\uc758 \ucd94\uc801\ub41c{0} \uac1c\uc758 \ud2b8\ub799\uc774 \ucd94\uac00\ub418\uc5c8\uc2b5\ub2c8\ub2e4. +skipUsersMultiple={1} \uc0ac\uc6a9\uc790\uac00 \ucd94\uac00\ud55c \uac74\ub108\ub6f4\ub41c {0} \ucd94\uc801 \ud569\ub2c8\ub2e4. +skipUserNoTracks=\uc5b8\uae09 \ud55c \uc0ac\uc6a9\uc790 \uc911 \ub204\uad6c\ub3c4 \uc5b4\ub5a4 \ud2b8\ub799 \ub300\uae30. +voteSkipAdded=\ud22c\ud45c \ucd94\uac00 \ub418\uc5c8\uc2b5\ub2c8\ub2e4\! +voteSkipAlreadyVoted=\ub2f9\uc2e0\uc740 \uc774\ubbf8\uc774 \ud2b8\ub799\uc744 \uac74\ub108\ub6f8 \ud558\uae30\ub85c \uacb0\uc815\! +voteSkipSkipping={0} \uba85\uc774 \uc2a4\ud0b5\uc5d0 \ub3d9\uc758\ud574 {1} \ud2b8\ub799\uc744 \uc2a4\ud0b5\ud569\ub2c8\ub2e4. +voteSkipNotEnough={0} \uba85\uc774 \uc2a4\ud0b5\uc5d0 \ub3d9\uc758\ud588\uc9c0\ub9cc \uc2a4\ud0b5 \ucd5c\uc18c \uc778\uc6d0 ({1} \uba85) \uc5d0 \ubbf8\uce58\uc9c0 \ubabb\ud588\uc2b5\ub2c8\ub2e4. +voteSkipEmbedNoVotes=\uc544\uc9c1 \uc774 \ud2b8\ub799\uc744 \uac74\ub108\ub6f8 \uc218 \uc5c6\ub294 \ub4dd\ud45c\uc218\uc785\ub2c8\ub2e4. +voteSkipEmbedVoters={1} \uc911 {0} \uc774(\uac00) \ud604\uc7ac \ud2b8\ub799\ub97c \uac74\ub108\ub6f0\uae30\ub85c \uacb0\uc815\ud588\uc2b5\ub2c8\ub2e4. mathOperationResult=\uacb0\uacfc\uac12\uc740 mathOperationDivisionByZeroError=0\uc73c\ub85c \ub098\ub20c \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. mathOperationInfinity=\ud574\ub2f9 \uc22b\uc790\ub294 \ubcf4\uc5ec\uc8fc\uae30\uc5d0 \ub108\ubb34 \ud07d\ub2c8\ub2e4\! -prefix=Prefix -prefixGuild=The prefix for this guild is {0} -prefixShowAgain=You can show the prefix anytime again by mentioning me. +prefix=\uc811\ub450\uc0ac +prefixGuild=\uc774 \uc11c\ubc84\uc758 \uc811\ub450\uc0ac\ub294 {0} \uc785\ub2c8\ub2e4. +prefixShowAgain=\uc800\ub97c \uc5b8\uae09\ud558\uc5ec \uc5b8\uc81c\ub4e0\uc9c0 \uc811\ub450\uc0ac\ub97c \ud45c\uc2dc\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. diff --git a/FredBoat/src/main/resources/lang/ms_MY.properties b/FredBoat/src/main/resources/lang/ms_MY.properties index a6c6602c3..e8a64d93e 100644 --- a/FredBoat/src/main/resources/lang/ms_MY.properties +++ b/FredBoat/src/main/resources/lang/ms_MY.properties @@ -8,56 +8,56 @@ playYoutubeSearchError=Terdapat ralat ketika mencari di YouTube. Sebaliknya, tim playSearchNoResults=Tiada keputusan untuk `{q}` playSelectVideo=**Sila pilih lagu dengan perintah `{0}play n`\:** joinJoining=Menyertai {0} -joinErrorAlreadyJoining=An error occurred. Couldn''t join {0} because I am already trying to connect to that channel. Please try again. -pauseAlreadyPaused=The player is already paused. -pauseSuccess=The player is now paused. You can unpause it with `{0}unpause`. -repeatOnSingle=The player will now repeat the current track. -repeatOnAll=The player will now repeat the queue. -repeatOff=The player is no longer on repeat. -selectSuccess=Song **\#{0}** has been selected\: **{1}** ({2}) -selectInterval=Must be a number 1-{0}. -selectSelectionNotGiven=You must first be given a selection to choose from. -shuffleOn=The player is now shuffled. -shuffleOff=The player is no longer shuffled. -reshufflePlaylist=Queue reshuffled. -reshufflePlayerNotShuffling=You must first turn on shuffle mode. -skipEmpty=The queue is empty\! -skipOutOfBounds=Can''t remove track number {0} when there are only {1} tracks. -skipNumberTooLow=Given number must be greater than 0. -skipSuccess=Skipped track \#{0}\: **{1}** -skipRangeInvalid=Specified track range is invalid. -skipRangeSuccess=Tracks \#{0} to \#{1} have been removed. -skipTrackNotFound=Couldn't find track to skip. -stopAlreadyEmpty=The queue was already empty. -stopEmptyOne=The queue has been emptied, `1` track has been removed. -stopEmptySeveral=The queue has been emptied, `{0}` tracks have been removed. -stopAccessDenied=In order to prevent abuse, this command is only available to those who can manage messages. -unpauseQueueEmpty=The queue is empty. -unpausePlayerNotPaused=The player is not paused. -unpauseNoUsers=There are no users in the voice chat. -unpauseSuccess=The player is now unpaused. -volumeApology=Sorry\! The ;;volume command has now been deprecated on the public music bot. This is because of how it causes the bot to spend a lot more time processing audio, some tracks up to 5 times more, causing everyone to hear stutter. By disabling this feature FredBoat can play much more music without lag.\nI recommend setting the bot's volume via the dropdown menu https\://fred.moe/1vD.png -volumeSyntax=Use `;;volume <0-150>`. {0}% is the default.\nThe player is currently at **{1}%**. -volumeSuccess=Changed volume from **{0}%** to **{1}%**. -exportEmpty=Nothing to export, the queue is empty. -exportPlaylistResulted=Exported playlist\: {0}\nYou can provide this URL to play the current playlist later. -exportPlaylistFail=Failed to upload playlist to hastebin.com -listShowShuffled=Showing shuffled playlist. -listShowRepeatSingle=Repeating current track. -listShowRepeatAll=Repeating current queue. -listShowHistory=Showing tracks in history. -listAddedBy=**{0}** added by **{1}** `[{2}]` -listStreamsOnlySingle=There is **{0}** live {1} in the queue. -listStreamsOnlyMultiple=There are **{0}** live {1} in the queue. -listStreamsOrTracksSingle=There is **{0}** {1} with a remaining length of **[{2}]**{3} in the queue. -listStreamsOrTracksMultiple=There are **{0}** {1} with a remaining length of **[{2}]**{3} in the queue. +joinErrorAlreadyJoining=Satu ralat telah berlaku. Tidak dapat menyertai {0} kerana saya telah cuba untuk menyambung ke saluran itu. Sila cuba lagi. +pauseAlreadyPaused=Pemain telah dihentikan sementara. +pauseSuccess=Pemain sedang dihentikan sementara. Anda boleh mainkan semula dengan ''{0}main''. +repeatOnSingle=Pemain akan mengulang semula trek semasa. +repeatOnAll=Pemain akan mengulang semula aturan. +repeatOff=Pemain tidak akan lagi mengulang. +selectSuccess=Lagu **\#{0} ** telah dipilih\: **{1} ** ({2}) +selectInterval=Mestilah nombor 1-{0}. +selectSelectionNotGiven=Anda mesti terlebih dahulu diberi pilihan untuk memilih. +shuffleOn=Pemain sekarang akan 'shuffled'. +shuffleOff=Pemain sekarang tidak lagi 'shuffled'. +reshufflePlaylist=Aturan telah di'shuffle' semula. +reshufflePlayerNotShuffling=Anda mesti menghidupkan mod 'shuffle'. +skipEmpty=Aturan masih kosong\! +skipOutOfBounds=Tidak dapat mengalih keluar {0} nombor aturan apabila terdapat hanya {1} aturan. +skipNumberTooLow=Nombor yang diberi mestilah lebih daripada 0. +skipSuccess=Skip trek \#{0}\: **{1} ** +skipRangeInvalid=Pelbagai trek yang ditentukan tidak sah. +skipRangeSuccess=Trek \#{0} untuk \#{1} telah dibuang. +skipTrackNotFound=Tidak dapat mencari trek yang betul untuk di skip. +stopAlreadyEmpty=Aturan sudah kosong. +stopEmptyOne=Aturan yang telah dikosongkan, trek '1' telah dikeluarkan. +stopEmptySeveral=Aturan yang telah dikosongkan, trek `{0}` telah dikeluarkan. +stopAccessDenied=Untuk mengelakkan penyalahgunaan, command ini hanya disediakan untuk orang yang boleh menguruskan mesej. +unpauseQueueEmpty=Aturan masih kosong. +unpausePlayerNotPaused=Pemain tidak dihentikan. +unpauseNoUsers=Tiada pengguna yang terdapat dalam voice chat. +unpauseSuccess=Pemain sekarang tidak lagi dihentikan. +volumeApology=Maaf\! Command ;;volume kini telah tidak digalakkan atas bot muzik awam. Ini adalah kerana ia menyebabkan bot untuk menghabiskan lebih banyak masa pemprosesan audio, beberapa trek sehingga 5 kali lebih, menyebabkan semua pengguna mendengar stutter. Dengan menyahdayakan command ini, FredBoat boleh mainkan muzik lebih tanpa lag. \nSaya cadangkan menetapkan jumlah bot yang melalui menu https\://fred.moe/1vD.png +volumeSyntax=Gunakan '';;volume <0-150>''. {0}% adalah default. Para pemain sedang pada **{1}% **. +volumeSuccess=Menukar volume dari **{0}% ** ke **{1}% **. +exportEmpty=Tiada apa-apa untuk dieksport, aturan adalah kosong. +exportPlaylistResulted=Senarai yang dieksport\: {0}\nAnda boleh berikan URL ini untuk memainkan senarai main semasa nanti. +exportPlaylistFail=Gagal untuk muat naik senarai main ke hastebin.com +listShowShuffled=Menunjukkan senarai main shuffled. +listShowRepeatSingle=Mengulang semula trek semasa. +listShowRepeatAll=Mengulang semula aturan semasa. +listShowHistory=Menunjukkan history trek. +listAddedBy=**{0} ** ditambah oleh **{1} ** ''[{2}]'' +listStreamsOnlySingle=Terdapat **{0} ** yang live {1} dalam aturan. +listStreamsOnlyMultiple=Terdapat **{0} ** yang live {1} dalam aturan. +listStreamsOrTracksSingle=Terdapat **{0} ** {1} dengan masa yang tinggal selama ** [{2}] **{3} dalam aturan. +listStreamsOrTracksMultiple=Terdapat **{0} ** {1} dengan masa yang tinggal selama ** [{2}] **{3} dalam aturan. streamSingular=stream streamPlural=streams -listAsWellAsLiveStreams=, as well as **{0}** live {1} -trackSingular=track -trackPlural=tracks -npNotPlaying=Not currently playing anything. -npNotInHistory=Currently no tracks in history. +listAsWellAsLiveStreams=, serta **{0} ** {1} yang live +trackSingular=trek +trackPlural=treks +npNotPlaying=Tidak memainkan apa-apa. +npNotInHistory=Tiada dalam history trek yang terkini. npDescription=Description npLoadedSoundcloud=[{0}/{1}]\n\nLoaded from Soundcloud npLoadedBandcamp={0}\n\nLoaded from Bandcamp @@ -112,36 +112,36 @@ malEnglishTitle={0}**English\: **{1}\n malSynonyms={0}**Synonyms\: **{1}\n malEpisodes={0}**Episodes\: **{1}\n malScore={0}**Score\: **{1}\n -malType={0}**Type\: **{1}\n -malStatus={0}**Status\: **{1}\n -malStartDate={0}**Start date\: **{1}\n -malEndDate={0}**End date\: **{1} -malSynopsis={0}**Synopsis\: **"{1}"\n -malUserReveal={0}\: Search revealed a user.\n -malNoResults={0}\: No results. -malUserName={0}**Name\: **{1}\n -malUrl={0}**URL\: **{1}\n -luaError=\ A Lua error occured \:anger\:\n```{0}``` -luaErrorOutputTooBig=\ Output buffer is too large \:anger\: Discord only allows 2000 characters per message, got {0} -luaTimeout=\ Function timed out \:anger\: allowed computation time is {0} seconds. -helpSuccess=Documentation has been sent to your direct messages\! -helpDmFailed=Could not send documentation to your DMs. Please check that you don't have them disabled\! -helpCommandsPromotion=Say {0} to learn what this bot can do\! -fuzzyNoResults=No such users -brainfuckCycleLimit=Program exceeded the maximum cycle count of {0} -brainfuckDataPointerOutOfBounds=Data pointer out of bounds\: {0} -brainfuckInputOOB=Input out of bounds at position\: {0} -brainfuckNoOutput=\ There was no output -weatherLocationNotFound=Unable to find location, please check your input {0}. -weatherError=Error retrieving weather for {0} -avatarSuccess=\ found it\n{0} -configNoArgs=Configuration for **{0}**\:``` -configSetTo=is now set to `{0}`. -configUnknownKey={0}\: Unknown key. -configMustBeBoolean={0}\: Value must be true or false. -modReason=Reason -modAuditLogMessage=Action issued by {0}\#{1} [{2}] -modFailUserHierarchy=You do not have a higher role than {0}. +malType={0} ** jenis\: **{1}\n +malStatus={0} ** Status\: **{1}\n +malStartDate={0} ** Tarikh mula\: **{1}\n +malEndDate={0} ** Tarikh berhenti\: **{1} +malSynopsis={0} ** Sinopsis\: ** "{1}"\n +malUserReveal={0}\: Carian telah mendedahkan seorang pengguna.\n +malNoResults={0}\: Tiada keputusan. +malUserName={0} ** Nama\: **{1}\n +malUrl={0} ** URL\: **{1}\n +luaError=\ Satu error Lua berlaku \:anger\: ''''''{0} '''''' +luaErrorOutputTooBig=\ Penampan output adalah terlalu besar \:anger\: perbalahan hanya membenarkan lingkungan 2000 huruf setiap mesej, mendapat {0} +luaTimeout=\ Majlis tamat \:anger\: dibenarkan pengiraan masa ialah {0} saat. +helpSuccess=Dokumentasi telah dihantar ke mesej anda langsung\! +helpDmFailed=Tidak dapat menghantar dokumentasi untuk DMs anda. Sila pastikan bahawa anda tidak mempunyai Upaya\! +helpCommandsPromotion=Katakan {0} untuk belajar apa yang bot ini boleh lakukan\! +fuzzyNoResults=Tiada pengguna tersebut +brainfuckCycleLimit=Program melebihi kiraan kitaran maksimum {0} +brainfuckDataPointerOutOfBounds=Penuding data daripada batas-batas\: {0} +brainfuckInputOOB=Input daripada batas-batas di posisi\: {0} +brainfuckNoOutput=\ Jadilah output tidak +weatherLocationNotFound=Tidak dapat mencari lokasi, sila semak {0} input anda. +weatherError=Ralat mendapatkan keadaan cuaca di {0} +avatarSuccess=\ mendapati{0} +configNoArgs=Konfigurasi untuk **{0} **\:'''' '' +configSetTo=kini sudah bersedia untuk ''{0}''. +configUnknownKey={0}\: kekunci tidak diketahui. +configMustBeBoolean={0}\: nilai mestilah benar atau palsu. +modReason=Sebab +modAuditLogMessage=Tindakan yang dikeluarkan oleh {0}\#{1} [{2}] +modFailUserHierarchy=Anda tidak mempunyai peranan yang lebih tinggi daripada {0}. modFailBotHierarchy=I need to have a higher role than {0}. modBanFail=Failed to ban {0} modKickBanFailUserPerms=You must have permission to kick and ban to be able to use this command. @@ -183,7 +183,7 @@ ratelimitedGeneralInfo=Kadar anda sedang dihadkan\! Sila perlahankan. ratelimitedSkipCommand=You can skip more than one song by using this command\: {0} ratelimitedGuildSlowLoadingPlaylist=Server ini tidak dibenarkan untuk menambah lagi senarai main buat masa sekarang. Mohon jangan spam senerai main yang panjang. unblacklisted={0} dibuang dari senarai hitam. -serverinfoTitle=Info about **{0}**\: +serverinfoTitle=Info about {0}\: serverinfoOnlineUsers=Online Users\: serverinfoTotalUsers=Total Users\: serverinfoRoles=Roles\: @@ -193,7 +193,7 @@ serverinfoGuildID=Guild ID\: serverinfoCreationDate=Creation Date\: serverinfoOwner=Owner\: serverinfoVLv=Verification Level\: -userinfoTitle=Information about **{0}**\: +userinfoTitle=Information about {0}\: userinfoUsername=Username\: userinfoId=ID\: userinfoNick=Nickname\: @@ -212,7 +212,11 @@ commandsMaintenance=Maintenance commandsBotOwner=Bot owner commandsMoreHelp=Say {0} to get more information on a specific command. helpUnknownCommand=Unknown command. -helpDM=Documentation can be found at\:\nhttps\://fredboat.com/docs\n\nWant to add FredBoat to your server? If you have Manage Server permissions for your guild, you can invite it here\:\n*This one doesn''t play music*\n\n\nIf you want to add the music bot, you will want to invite this bot\:\n\n\nNeed help or have any ideas for the bot? Perhaps you just want to hang out? Come on over to FredBoat hangout\!\n{0}\n\nYou cannot send this bot commands through DM.\nBot created by Fre_d +helpDocsLocation=Documentation can be found at\: +helpBotInvite=Want to add FredBoat to your server? If you have Manage Server permissions for your guild, you can invite FredBoat\: +helpHangoutInvite=Need help or have any ideas for FredBoat? Perhaps you just want to hang out? Join the FredBoat community\! +helpNoDmCommands=You cannot send FredBoat commands through DMs. +helpCredits=Created by Fre_d and open source contributors helpSent=Documentation has been sent to your DMs\! helpProperUsage=Proper usage\: helpCommandOwnerRestricted=This command is restricted to the owner of the bot. diff --git a/FredBoat/src/main/resources/lang/nl_NL.properties b/FredBoat/src/main/resources/lang/nl_NL.properties index 61a4f6c05..432b3400a 100644 --- a/FredBoat/src/main/resources/lang/nl_NL.properties +++ b/FredBoat/src/main/resources/lang/nl_NL.properties @@ -193,7 +193,7 @@ serverinfoGuildID=Gilde ID\: serverinfoCreationDate=Aanmaakdatum\: serverinfoOwner=Eigenaar\: serverinfoVLv=Verificatie Level\: -userinfoTitle=Informatie over **{0}**\: +userinfoTitle=Informatie over {0}\: userinfoUsername=Gebruikersnaam\: userinfoId=ID\: userinfoNick=Bijnaam\: @@ -212,7 +212,11 @@ commandsMaintenance=Onderhoud commandsBotOwner=Bot eigenaar commandsMoreHelp=Zeg {0} om meer informatie te krijgen over een specifieke opdracht. helpUnknownCommand=Onbekende opdracht. -helpDM=De documentatie kan hier worden gevonden\:\nhttps\://fredboat.com/docs\n\nWil je FredBoat op je eigen server? Als je server beheer rechten hebt voor je Gilde, dan kan je het hier uitnodigen\:\n*Deze bot speelt geen muziek*\n\n\nAls je muziek bot wilt toevoegen, dan kan je deze bot hier uitnodigen\:\n\n\nHeb je hulp nodig of heb je idee\u00ebn voor de bot? Of wil je lekker rondhangen? Kom dan lekker naar de FredBoat Hangout\!\n{0}\n\nJe kan geen opdrachten via DM naar deze bot versturen.\nBot is gemaakt door Fre_d +helpDocsLocation=Documentatie kan worden gevonden op\: +helpBotInvite=Wilt u FredBoat aan uw server toevoegen? Als u gemachtigd bent deze Server te beheren voor uw gilde, kunt u FredBoat uitnodigen\: +helpHangoutInvite=Hulp nodig of nog idee\u00ebn voor FredBoat? Misschien wilt u gewoon hangen? Voeg u bij FredBoats gemeenschap\! +helpNoDmCommands=U kunt geen FredBoat commandos verzenden via DMs. +helpCredits=Gemaakt door Fre_d en opensource leverden helpSent=De documenten met instructies zijn naar Uw Directe Berichten verstuurd\! helpProperUsage=Correcte gebruik\: helpCommandOwnerRestricted=Deze opdracht is beperkt tot de eigenaar van de bot. @@ -225,7 +229,7 @@ helpMusicCommandsHeader=FredBoat Muziek Opdrachten helpJoinCommand=Voeg de bot aan je huidige stemkanaal toe. helpLeaveCommand=Laat de bot je huidige stemkanaal verlaten. helpPauseCommand=Pauzeer de Bot. -helpPlayCommand=Speel muziek van de gegeven URL of zoek naar een nummer. Bezoek {0} voor een volledige lijst van bronnen +helpPlayCommand=Speel muziek van de gegeven URL of zoek naar een nummer. Bezoek alsjeblieft {0} voor een volledige lijst van bronnen helpPlaySplitCommand=Verdeel een YouTube video in een nummerreeks voorzien in zijn descriptie. helpRepeatCommand=Schakel tussen herhaal modi. helpReshuffleCommand=Schuifel de huidige nummerreeks opnieuw. @@ -257,7 +261,7 @@ helpSayCommand=Laat de bot iets echo\u00ebn. helpServerInfoCommand=Laat een aantal statistieken zien over deze gild. helpUserInfoCommand=Toon informatie over jezelf of een gebruiker die bekend is met de bot. helpPerms=Laat de {0} rang leden en rollen op de witte lijst zetten. -helpPrefixCommand=Set the prefix for this guild. +helpPrefixCommand=Stel de prefix in voor deze guild. helpVoteSkip=Stem om het huidige nummer te kunnen overslaan. Minstens 50% van alle gebruikers in de voice chat moeten mee stemmen. helpMathOperationAdd=Print de sum van num 1 en num2. helpMathOperationSub=Print het verschil tussen het aftrekken van num2 en van num1. @@ -296,6 +300,6 @@ mathOperationResult=Het resultaat is mathOperationDivisionByZeroError=Ik kan niet delen door nul. mathOperationInfinity=Het nummer is te groot om te laten zien\! prefix=Prefix -prefixGuild=The prefix for this guild is {0} -prefixShowAgain=You can show the prefix anytime again by mentioning me. +prefixGuild=De prefix van deze guild is {0} +prefixShowAgain=Je kan de prefix zien als je mij pinged. diff --git a/FredBoat/src/main/resources/lang/no_NO.properties b/FredBoat/src/main/resources/lang/no_NO.properties index 2fcd2849d..8f4095c6b 100644 --- a/FredBoat/src/main/resources/lang/no_NO.properties +++ b/FredBoat/src/main/resources/lang/no_NO.properties @@ -183,7 +183,7 @@ ratelimitedGeneralInfo=Du sender kommandoer for fort\! Ro ned tempoet. ratelimitedSkipCommand=You can skip more than one song by using this command\: {0} ratelimitedGuildSlowLoadingPlaylist=Denne serveren f\u00e5r ikke legge til flere spillelister for \u00f8yeblikket. Vennligst unng\u00e5 \u00e5 spamme lange spillelister. unblacklisted=Fjernet {0} fra sperrelisten. -serverinfoTitle=Info om **{0} **\: +serverinfoTitle=Info about {0}\: serverinfoOnlineUsers=P\u00e5loggede brukere\: serverinfoTotalUsers=Totalt antall brukere\: serverinfoRoles=Roller\: @@ -193,7 +193,7 @@ serverinfoGuildID=Laug-ID\: serverinfoCreationDate=Opprettelsesdato\: serverinfoOwner=Eier\: serverinfoVLv=Verifikasjon niv\u00e5\: -userinfoTitle=Informasjon om **{0} **\: +userinfoTitle=Information about {0}\: userinfoUsername=Brukernavn\: userinfoId=ID\: userinfoNick=Kallenavn\: @@ -212,7 +212,11 @@ commandsMaintenance=Vedlikehold commandsBotOwner=Bot eier commandsMoreHelp=Si {0} for \u00e5 f\u00e5 mer informasjon om en bestemt kommando. helpUnknownCommand=Unknown command. -helpDM=Documentation can be found at\:\nhttps\://fredboat.com/docs\n\nWant to add FredBoat to your server? If you have Manage Server permissions for your guild, you can invite it here\:\n*This one doesn''t play music*\n\n\nIf you want to add the music bot, you will want to invite this bot\:\n\n\nNeed help or have any ideas for the bot? Perhaps you just want to hang out? Come on over to FredBoat hangout\!\n{0}\n\nYou cannot send this bot commands through DM.\nBot created by Fre_d +helpDocsLocation=Documentation can be found at\: +helpBotInvite=Want to add FredBoat to your server? If you have Manage Server permissions for your guild, you can invite FredBoat\: +helpHangoutInvite=Need help or have any ideas for FredBoat? Perhaps you just want to hang out? Join the FredBoat community\! +helpNoDmCommands=You cannot send FredBoat commands through DMs. +helpCredits=Created by Fre_d and open source contributors helpSent=Dokumentasjon er sendt til DMs\! helpProperUsage=Riktig bruk\: helpCommandOwnerRestricted=Denne kommandoen er begrenset til eieren av botten. diff --git a/FredBoat/src/main/resources/lang/pl_PL.properties b/FredBoat/src/main/resources/lang/pl_PL.properties index f9e5fffac..e74e524ba 100644 --- a/FredBoat/src/main/resources/lang/pl_PL.properties +++ b/FredBoat/src/main/resources/lang/pl_PL.properties @@ -45,7 +45,7 @@ exportPlaylistFail=Wyst\u0105pi\u0142 b\u0142\u0105d podczas przesy\u0142ania pl listShowShuffled=Pokazano wymieszan\u0105 list\u0119 odtwarzania.\n\n listShowRepeatSingle=Powtarzanie bie\u017c\u0105cych utwor\u00f3w. listShowRepeatAll=Powtarzanie bie\u017c\u0105cej kolejki. -listShowHistory=poka\u017c histori\u0119 utwor\u00f3w +listShowHistory=Pokazuj\u0119 histori\u0119 utwor\u00f3w. listAddedBy=**{0} ** dodane przez **{1} ** ''[{2}]'' listStreamsOnlySingle=Znajduje si\u0119 **{0}** na \u017cywo {1} w kolejce. listStreamsOnlyMultiple=Znajduj\u0105 si\u0119 **{0}** na \u017cywo {1} w kolejce. @@ -183,7 +183,7 @@ ratelimitedGeneralInfo=Jeste\u015b ograniczony od stawek. Prosz\u0119 zwolnij. ratelimitedSkipCommand=Za pomoc\u0105 tego polecenia mo\u017cna pomin\u0105\u0107 wi\u0119cej ni\u017c jednej piosenk\u0119\: {0} ratelimitedGuildSlowLoadingPlaylist=W tej chwili nie mo\u017cna doda\u0107 wi\u0119cej list na tym serwerze. Prosz\u0119 nie spam d\u0142ugimi listami. unblacklisted={0} usuni\u0119ty z czarnej listy. -serverinfoTitle=Informacje o **{0} **\: +serverinfoTitle=Info about {0}\: serverinfoOnlineUsers=U\u017cytkownik\u00f3w online\: serverinfoTotalUsers=U\u017cytkownik\u00f3w razem\: serverinfoRoles=Role\: @@ -193,7 +193,7 @@ serverinfoGuildID=ID Gildii\: serverinfoCreationDate=Data Utworzenia\: serverinfoOwner=W\u0142a\u015bciciel\: serverinfoVLv=Poziom weryfikacji\: -userinfoTitle=Informacje o **{0} **\: +userinfoTitle=Information about {0}\: userinfoUsername=Nazwa u\u017cytkownika\: userinfoId=ID\: userinfoNick=Nick\: @@ -212,7 +212,11 @@ commandsMaintenance=Przerwa Techniczna commandsBotOwner=W\u0142a\u015bciciel bota commandsMoreHelp=Napisz {0} aby dosta\u0107 wi\u0119cej informacji o specyficznej komendzie. helpUnknownCommand=Nieznana komenda. -helpDM=Dokumentacje znajdziesz poni\u017cej\:\nhttps\://fredboat.com/docs\n\nChcesz zaprosi\u0107 FredBoata na sw\u00f3j serwer? Je\u017celi masz uprawnienia do zarz\u0105dzania swoj\u0105 gildi\u0105, zapro\u015b go tu\:\n*Ten bot nie odtwarza muzyki*\n\n\nJe\u017celi chcesz doda\u0107 Musicbota, zapro\u015b go tu.\:\n\n\nPotrzebujesz pomocy lub masz pomys\u0142y jak ulepszy\u0107 bota? A mo\u017ce tylko chcesz sp\u0119dzi\u0107 sw\u00f3j czas? Cho\u0107 na sp\u0119dzanie czasu z FredBoatem\!\n{0}\n\nNie mozesz wysylac komend poprzez prywatna wiadomosc.\nBot stworzony przez Fre_d +helpDocsLocation=Documentation can be found at\: +helpBotInvite=Want to add FredBoat to your server? If you have Manage Server permissions for your guild, you can invite FredBoat\: +helpHangoutInvite=Need help or have any ideas for FredBoat? Perhaps you just want to hang out? Join the FredBoat community\! +helpNoDmCommands=You cannot send FredBoat commands through DMs. +helpCredits=Created by Fre_d and open source contributors helpSent=Dokumentacja zosta\u0142a wys\u0142ana do swojego Na prywatn\u0105 wiadomo\u015b\u0107\! helpProperUsage=Poprawne zastosowanie\: helpCommandOwnerRestricted=Ta komenda jest tylko ograniczona dla W\u0142a\u015bciciela bota. @@ -257,7 +261,7 @@ helpSayCommand=Zr\u00f3b Botowi Echo Co\u015b. helpServerInfoCommand=Wy\u015bwietl niekt\u00f3re statystyki dotycz\u0105ce tej gildii. helpUserInfoCommand=Wy\u015bwietlanie informacji o sobie lub u\u017cytkowniku znanemu przez bot'a. helpPerms=Pozwala gracz\u0105 kt\u00f3rzy s\u0105 w bia\u0142ej li\u015bcie oraz rangach z {0} rang. -helpPrefixCommand=Set the prefix for this guild. +helpPrefixCommand=Ustaw prefiks dla tego serwera. helpVoteSkip=G\u0142osuj, aby pomin\u0105\u0107 bie\u017c\u0105c\u0105 piosenk\u0119. Do g\u0142osowania potrzeba 50% wszystkich u\u017cytkownik\u00f3w czatu g\u0142osowego. helpMathOperationAdd=Wydrukuj sum\u0119 liczb1 i num2. helpMathOperationSub=Print the difference of subtracting num2 from num1. @@ -295,7 +299,7 @@ voteSkipEmbedVoters={0} spo\u015br\u00f3d {1} g\u0142osowali, aby pomin\u0105\u0 mathOperationResult=Wynik jest mathOperationDivisionByZeroError=Ja nie mo\u017cna dzieli\u0107 przez zero. mathOperationInfinity=Liczba jest zbyt du\u017ca, aby by\u0107 wy\u015bwietlane\! -prefix=Prefix -prefixGuild=The prefix for this guild is {0} -prefixShowAgain=You can show the prefix anytime again by mentioning me. +prefix=Prefiks +prefixGuild=Prefiks tego serwera to {0} +prefixShowAgain=Mo\u017cesz wy\u015bwietli\u0107 prefiks, za ka\u017cdym razem, kiedy mnie wspomnisz. diff --git a/FredBoat/src/main/resources/lang/pt_BR.properties b/FredBoat/src/main/resources/lang/pt_BR.properties index 06a130c89..998d55c97 100644 --- a/FredBoat/src/main/resources/lang/pt_BR.properties +++ b/FredBoat/src/main/resources/lang/pt_BR.properties @@ -183,7 +183,7 @@ ratelimitedGeneralInfo=Voc\u00ea est\u00e1 sendo taxa limitada\! Por favor, deva ratelimitedSkipCommand=Voc\u00ea pode pular mais de uma m\u00fasica usando este comando\: {0} ratelimitedGuildSlowLoadingPlaylist=Neste servidor n\u00e3o \u00e9 permitido adicionar playlists mais neste momento. Por favor n\u00e3o spam longas listas de reprodu\u00e7\u00e3o. unblacklisted={0} removido da lista negra. -serverinfoTitle=Informa\u00e7\u00e3o sobre * *{0} * *\: +serverinfoTitle=Informa\u00e7\u00e3o sobre {0}\: serverinfoOnlineUsers=Usu\u00e1rios online\: serverinfoTotalUsers=Total de usu\u00e1rios\: serverinfoRoles=Pap\u00e9is\: @@ -193,7 +193,7 @@ serverinfoGuildID=ID da Guilda\: serverinfoCreationDate=Data de cria\u00e7\u00e3o\: serverinfoOwner=Dono\: serverinfoVLv=N\u00edvel de Verifica\u00e7\u00e3o\: -userinfoTitle=Informa\u00e7\u00f5es sobre * *{0} * *\: +userinfoTitle=Informa\u00e7\u00f5es sobre {0}\: userinfoUsername=Nome de Usu\u00e1rio\: userinfoId=ID\: userinfoNick=Nickname\: @@ -212,7 +212,11 @@ commandsMaintenance=Manuten\u00e7\u00e3o commandsBotOwner=Dono do Bot commandsMoreHelp=Diga {0} para obter mais informa\u00e7\u00f5es sobre um comando espec\u00edfico. helpUnknownCommand=Comando desconhecido. -helpDM=A documenta\u00e7\u00e3o pode ser encontrada em\:\nhttps\://fredboat.com/docs\n\nQuer adicionar o FredBoat ao seu servidor? Se voc\u00ea tem as permiss\u00f5es de Gerenciar Servidor na sua guilda, voc\u00ea pode convida-lo aqui\:\n*Esse n\u00e3o reproduz m\u00fasica*\n\n\nSe voc\u00ea quer adicionar o bot de m\u00fasica, voc\u00ea vai querer convidar esse bot\:\n\n\nPrecisa de ajuda ou tem alguma ideia para o bot? Talvez voc\u00ea s\u00f3 queira relaxar? Venha para o FredBoat hangout\!\n{0}\n\nVoc\u00ea n\u00e3o pode mandar comandos para esse bot por DM.\nBot criado por Fre_d +helpDocsLocation=Documenta\u00e7\u00e3o pode ser encontrada em\: +helpBotInvite=Deseja adicionar FredBoat ao seu servidor? Se voc\u00ea tiver a permiss\u00e3o Gerenciar Servidor na sua guilda, voc\u00ea pode convidar FredBoat\: +helpHangoutInvite=Precisar de ajuda ou tem alguma ideia para o FredBoat? Talvez voc\u00ea s\u00f3 quer bater um papo? Participe da Comunidade FredBoat\! +helpNoDmCommands=Voc\u00ea n\u00e3o pode enviar comandos do FredBoat atrav\u00e9s de DMs. +helpCredits=Criado por Fre_d e contribuidores open source helpSent=Documenta\u00e7\u00e3o foi enviada para seus DMs\! helpProperUsage=Uso correto\: helpCommandOwnerRestricted=Este comando \u00e9 restrito para o dono do bot. @@ -257,7 +261,7 @@ helpSayCommand=Fazer o bot ecoar algo. helpServerInfoCommand=Exibe algumas estat\u00edsticas sobre esta guilda. helpUserInfoCommand=Exibe informa\u00e7\u00f5es sobre voc\u00ea ou um usu\u00e1rio conhecido para o bot. helpPerms=Permite que membros de whitelisting e fun\u00e7\u00f5es para o posto de {0}. -helpPrefixCommand=Set the prefix for this guild. +helpPrefixCommand=Defina o prefixo para essa guilda. helpVoteSkip=Vote para ignorar a m\u00fasica atual. Precisa que 50% de todos os usu\u00e1rios no bate-papo votem. helpMathOperationAdd=Imprime a soma do num1 e num2. helpMathOperationSub=Mostra a diferen\u00e7a entre a sub-faixa num2 para a num1. @@ -295,7 +299,7 @@ voteSkipEmbedVoters={0} de {1} votaram para pular a faixa atual mathOperationResult=O resultado \u00e9 mathOperationDivisionByZeroError=Eu n\u00e3o posso dividir por zero. mathOperationInfinity=O n\u00famero \u00e9 muito grande para ser exibido\! -prefix=Prefix -prefixGuild=The prefix for this guild is {0} -prefixShowAgain=You can show the prefix anytime again by mentioning me. +prefix=Prefixo +prefixGuild=O prefixo para essa guild \u00e9 {0} +prefixShowAgain=Voc\u00ea pode mostrar o prefixo novamente a qualquer momento me mencionando. diff --git a/FredBoat/src/main/resources/lang/pt_PT.properties b/FredBoat/src/main/resources/lang/pt_PT.properties index eba02c434..c31b161ae 100644 --- a/FredBoat/src/main/resources/lang/pt_PT.properties +++ b/FredBoat/src/main/resources/lang/pt_PT.properties @@ -45,7 +45,7 @@ exportPlaylistFail=Falha ao carregar a lista para hastebin.com listShowShuffled=A exibir lista emparelhada.\n\n listShowRepeatSingle=Repetindo a faixa atual. listShowRepeatAll=Repetindo a fila atual. -listShowHistory=Showing tracks in history. +listShowHistory=A mostrar faixas anteriores. listAddedBy=**{0}** foi adicionado por **{1}** `[{2}]` listStreamsOnlySingle=H\u00e1 * *{0} * * {1} ao vivo na fila. listStreamsOnlyMultiple=Existem * *{0} * * {1} ao vivo na fila. @@ -57,7 +57,7 @@ listAsWellAsLiveStreams=, assim como **{0}** {1} ao vivo trackSingular=faixa trackPlural=faixas npNotPlaying=N\u00e3o estou tocando nada. -npNotInHistory=Currently no tracks in history. +npNotInHistory=N\u00e3o existem faixas na sua historia. npDescription=Descrip\u00e7\u00e3o npLoadedSoundcloud=[{0}/{1}] \n\nCarregado do Soundcloud npLoadedBandcamp={0} \n\nCarregado do Bandcamp @@ -79,7 +79,7 @@ restartSuccess=* *{0} * * foi reiniciado. queueEmpty=A fila est\u00e1 vazia. rewSuccess=Rebobinando de **{0}** por {1}. seekSuccess=Procurando de **{0}** a {1}. -seekDeniedLiveTrack=You can't seek a live track. +seekDeniedLiveTrack=Voee n\u00e3o pode avancar/recuar numa musica/transmiss\u00e3o ao vivo. loadPlaySplitListFail=Esse link \u00e9 de uma playlist, n\u00e3o de uma faixa. Experimente `;;play` em vez disso. loadListSuccess=Encontrando e adicionadas`{0}` m\u00fasicas da lista **{1}**. loadNoMatches=Nenhum audio p\u00f4de ser encontrado para ''{0}''. @@ -125,15 +125,15 @@ luaError=\ Ocorreu um erro Lua \:anger\: ```{0}``` luaErrorOutputTooBig=\ Buffer de s\u00e1ida \u00e9 muito largo \:anger\: a Discord s\u00f3 permite 2000 caracteres por mensagem, got {0} luaTimeout=\ Fun\u00e7\u00e3o expirou \:anger\: tempo de computa\u00e7\u00e3o permitido \u00e9 {0} segundos. helpSuccess=A documenta\u00e7\u00e3o foi enviada para suas mensagens diretas\! -helpDmFailed=Could not send documentation to your DMs. Please check that you don't have them disabled\! +helpDmFailed=N\u00e3o consegui enviar a documenta\u00e7\u00e3o para os seus DMs. Por favor verifique que n\u00e3o as tem desactivadas\! helpCommandsPromotion=Diga {0} para saber o que esse bot pode fazer\! fuzzyNoResults=Sem tais usu\u00e1rios brainfuckCycleLimit=Programa excedeu a contagem de ciclo m\u00e1ximo de {0} brainfuckDataPointerOutOfBounds=Ponteiro de datas fora dos limites\: {0} brainfuckInputOOB=Entrada fora dos limites na posi\u00e7\u00e3o\: {0} brainfuckNoOutput=\ N\u00e3o havia nenhuma sa\u00edda -weatherLocationNotFound=Unable to find location, please check your input {0}. -weatherError=Error retrieving weather for {0} +weatherLocationNotFound=N\u00e3o foi possivel encontrar essa localiza\u00e7\u00e3o, por favor verifique os seus argumentos {0}. +weatherError=Erro a buscar o tempo para {0} avatarSuccess=\ achei\n{0} configNoArgs=Configura\u00e7\u00e3o para **{0}**\:``` configSetTo=agora est\u00e1 definido para `{0}`. @@ -183,7 +183,7 @@ ratelimitedGeneralInfo=Voc\u00ea est\u00e1 sendo taxa limitada\! Por favor, abra ratelimitedSkipCommand=Voc\u00ea podes pular mais que uma m\u00fasica usando este comando\: {0} ratelimitedGuildSlowLoadingPlaylist=Neste servidor n\u00e3o \u00e9 permitido adicionar mais playlists de momento. Por favor n\u00e3o spame longas listas de reprodu\u00e7\u00e3o. unblacklisted={0} removido da lista negra. -serverinfoTitle=Informa\u00e7\u00e3o sobre * *{0} * *\: +serverinfoTitle=Informa\u00e7\u00e3o sobre {0}\: serverinfoOnlineUsers=Usu\u00e1rios online\: serverinfoTotalUsers=Total de usu\u00e1rios\: serverinfoRoles=Fun\u00e7\u00f5es\: @@ -193,17 +193,17 @@ serverinfoGuildID=ID de guilda\: serverinfoCreationDate=Data de cria\u00e7\u00e3o\: serverinfoOwner=Propriet\u00e1rio\: serverinfoVLv=N\u00edvel de verifica\u00e7\u00e3o\: -userinfoTitle=Informa\u00e7\u00f5es sobre * *{0} * *\: +userinfoTitle=Informa\u00e7\u00e3o sobre {0}\: userinfoUsername=Nome de usu\u00e1rio\: userinfoId=ID\: userinfoNick=Usu\u00e1rio\: userinfoKnownServer=Servidores conhecidos\: userinfoJoinDate=Data de entrada\: userinfoCreationTime=Data de cria\u00e7\u00e3o\: -userinfoBlacklisted=Blacklisted\: -skipDeniedTooManyTracks=You can't skip someone else's tracks if you are not a DJ.\nConsider using the Voteskip command. +userinfoBlacklisted=Bloqueado\: +skipDeniedTooManyTracks=N\u00e3o podes passar a musica de outra pessoa se n\u00e3o fores o DJ\nConsidera usar o commando Voteskip. eventUsersLeftVC=Todos os usu\u00e1rios deixaram o canal de voz. O reprodutor foi pausado. -eventAutoResumed=User presence detected, automatically resuming the player. +eventAutoResumed=Foi detectada a presen\u00e7a de um utilizador foi resumido automaticamente a musica. commandsFun=Divers\u00e3o commandsMemes=Memes commandsUtility=Utilit\u00e1rio de @@ -212,7 +212,11 @@ commandsMaintenance=Manuten\u00e7\u00e3o commandsBotOwner=Dono do bot commandsMoreHelp=Diga {0} para obter mais informa\u00e7\u00f5es sobre um comando espec\u00edfico. helpUnknownCommand=Comando desconhecido. -helpDM=A documenta\u00e7\u00e3o pode ser encontrada em\:\nhttps\://fredboat.com/docs\n\nQuer adicionar o FredBoat ao seu servidor? Se voc\u00ea tem as permiss\u00f5es de Gerenciar Servidor em seu servidor, voc\u00ea pode convida-lo aqui\:\n*Esse n\u00e3o reproduz m\u00fasica*\n\n\nSe voc\u00ea quer adicionar o bot de m\u00fasica, voc\u00ea vai querer convidar esse bot\:\n\n\nPrecisa de ajuda ou tem alguma ideia para o bot? Talvez voc\u00ea s\u00f3 queira relaxar? Venha para o FredBoat Hangout\!\n{0}\n\nVoc\u00ea n\u00e3o pode mandar comandos para esse bot por DM.\nBot criado por Fre_d +helpDocsLocation=A documenta\u00e7\u00e3o pode ser encontrada em\: +helpBotInvite=Queres adicionar o FredBoat ao teu server? Se tens permiss\u00f5es administrativas, tu podes convdar o FredBoat aqui\: +helpHangoutInvite=Percisas de ajuda ou tens algumas ideias para o FredBoad? Ou se calhar apenas queres conviver? Junta-te a communidade FredBoat\! +helpNoDmCommands=N\u00e3o podes enviar commandos por DMs. +helpCredits=Criado por Fre_d e contribuidores de Git Hub helpSent=A documenta\u00e7\u00e3o foi enviada para as suas mensagens privadas\! helpProperUsage=Uso correto\: helpCommandOwnerRestricted=Este comando \u00e9 restrito para o dono do bot. @@ -225,20 +229,20 @@ helpMusicCommandsHeader=Comandos de M\u00fasica do FredBoat helpJoinCommand=Fa\u00e7a o bot entrar no seu atual canal de voz. helpLeaveCommand=Fa\u00e7a o bot sair do atual canal de voz. helpPauseCommand=Pause o player. -helpPlayCommand=Play music from the given URL or search for a track. For a full list of sources please visit {0} +helpPlayCommand=Toque m\u00fasica pelo o dado URL ou pesquisa pela faixa. Para uma lista cheia de fontes viste {0} helpPlaySplitCommand=Dividi um v\u00eddeo do YouTube em um tracklist fornecido na descri\u00e7\u00e3o do que \u00e9. helpRepeatCommand=Alternar entre modos de repeti\u00e7\u00e3o. helpReshuffleCommand=Reorganizar a fila atual. helpSelectCommand=Selecione uma das faixas oferecidas depois de uma busca para reproduzir. helpShuffleCommand=Alternar modo de reorganiza\u00e7\u00e3o da fila atual. -helpSkipCommand=Skip the current song, the n'th song in the queue, all songs from n to m, or all songs from mentioned users. Please use in moderation. +helpSkipCommand=Ignore a m\u00fasica atual, a can\u00e7\u00e3o de n'th na fila ou todas as m\u00fasicas de n para m. Por favor, use com modera\u00e7\u00e3o. helpStopCommand=Pare o reprodutor e limpe a lista de reprodu\u00e7\u00e3o. Reservado para moderadores com permiss\u00e3o de gerenciar mensagens. helpUnpauseCommand=Despausar o reprodutor. helpVolumeCommand=Altera o volume. Os valores s\u00e3o 0-150 e 100 \u00e9 o padr\u00e3o. O comando de volume \u00e9 preterido no p\u00fablico bot. helpExportCommand=Exportar a fila atual para um link de hastebin, pode ser usado mais tarde como uma lista de reprodu\u00e7\u00e3o. helpGensokyoRadioCommand=Mostrar a atual m\u00fasica tocada na gensokyoradio.net helpListCommand=Exibir uma lista de m\u00fasicas atuais na lista de reprodu\u00e7\u00e3o. -helpHistoryCommand=Display a list of the songs in playlist history. +helpHistoryCommand=Mostra uma lista de musicas na historia da playlist. helpNowplayingCommand=Exiba a m\u00fasica que est\u00e1 tocando. helpForwardCommand=Avancei a faixa por um determinado per\u00edodo de tempo. Exemplo\: helpRestartCommand=Reinicie a faixa atualmente sendo reproduzida. diff --git a/FredBoat/src/main/resources/lang/ro_RO.properties b/FredBoat/src/main/resources/lang/ro_RO.properties index 8e004edb0..55dfa3ed5 100644 --- a/FredBoat/src/main/resources/lang/ro_RO.properties +++ b/FredBoat/src/main/resources/lang/ro_RO.properties @@ -183,7 +183,7 @@ ratelimitedGeneralInfo=Viteza dumneavoastr\u0103 este limitat\u0103\! V\u0103 ru ratelimitedSkipCommand=Pute\u021bi s\u0103ro mai mult de o pies\u0103 folosind comanda\: {0} ratelimitedGuildSlowLoadingPlaylist=Acestui server nu-i este permis s\u0103 adauge mai multe liste de redare \u00een acest moment. V\u0103 rug\u0103m s\u0103 nu spama\u021bi liste de redare lungi. unblacklisted=Am \u0219ters {0} de pe lista neagr\u0103. -serverinfoTitle=Informa\u0163ii despre **{0}**\: +serverinfoTitle=Info about {0}\: serverinfoOnlineUsers=Utilizatori online\: serverinfoTotalUsers=Total de utilizatori\: serverinfoRoles=Roluri\: @@ -193,7 +193,7 @@ serverinfoGuildID=ID-ul server-ului\: serverinfoCreationDate=Data Cre\u0103rii\: serverinfoOwner=Proprietar\: serverinfoVLv=Nivel de verificare\: -userinfoTitle=Informa\u0163ii despre **{0}**\: +userinfoTitle=Information about {0}\: userinfoUsername=Nume de utilizator\: userinfoId=ID\: userinfoNick=Nickname\: @@ -212,7 +212,11 @@ commandsMaintenance=Mentenan\u0163\u0103 commandsBotOwner=Proprietarul bot-ului commandsMoreHelp=Spune {0} pentru a ob\u021bine mai multe informa\u021bii despre o anumit\u0103 comand\u0103. helpUnknownCommand=Comand\u0103 necunoscut\u0103. -helpDM=Documenta\u021bia poate fi g\u0103sit\u0103 pe\:\nhttps\://fredboat.com/docs\n\n\u00cel vrei pe FredBoat \u00een server-ul t\u0103u? Dac\u0103 ai permisiunea Manage Server pentru server-ul t\u0103u, \u00eel po\u021bi invita de aici\:\n*Acesta nu red\u0103 muzic\u0103*\n\n\nDac\u0103 vrei s\u0103 adaugi botul care red\u0103 muzica, vei dori s\u0103 invi\u021bi acest bot\:\n\n\nAi nevoie de ajutor sau idei pentru bot? Poate doar vrei s\u0103 por\u021bi discu\u021bii? Vino \u00een FredBoat hangout\!\n{0}\n\nNu po\u021bi trimite comenzi prin DM acestui bot.\nBot creat de Fre_d +helpDocsLocation=Documentation can be found at\: +helpBotInvite=Want to add FredBoat to your server? If you have Manage Server permissions for your guild, you can invite FredBoat\: +helpHangoutInvite=Need help or have any ideas for FredBoat? Perhaps you just want to hang out? Join the FredBoat community\! +helpNoDmCommands=You cannot send FredBoat commands through DMs. +helpCredits=Created by Fre_d and open source contributors helpSent=Documenta\u021bia \u021bi-a fost trimis\u0103 \u00een DM-uri\! helpProperUsage=Utilizare corect\u0103\: helpCommandOwnerRestricted=Aceast\u0103 comand\u0103 este restric\u021bionat\u0103 proprietarului bot-ului. @@ -257,7 +261,7 @@ helpSayCommand=Face ca bot-ul s\u0103 spun\u0103 ceva. helpServerInfoCommand=Afi\u015feaz\u0103 unele statistici despre acest server. helpUserInfoCommand=Afi\u015feaz\u0103 informa\u0163ii despre tine sau despre un utilizator cunoscut de bot. helpPerms=Permite ad\u0103ugarea membrilor la lista alb\u0103 \u0219i a rolurilor pentru rangul {0}. -helpPrefixCommand=Set the prefix for this guild. +helpPrefixCommand=Seteaz\u0103 prefixul pentru serverul acesta. helpVoteSkip=Voteaz\u0103 pentru a s\u0103ri piesa curent\u0103. Este necesar c\u0103 50% din utilizatorii din chatul vocal s\u0103 voteze. helpMathOperationAdd=Scrie suma lui num1 cu num2. helpMathOperationSub=Scrie diferen\u021ba sc\u0103derii lui num2 din num1. @@ -296,6 +300,6 @@ mathOperationResult=Rezultatul este mathOperationDivisionByZeroError=Nu pot \u00eemp\u0103r\u021bi la zero. mathOperationInfinity=Num\u0103rul este prea marea pentru a fi ar\u0103tat\! prefix=Prefix -prefixGuild=The prefix for this guild is {0} -prefixShowAgain=You can show the prefix anytime again by mentioning me. +prefixGuild=Prefixul pentru acest server este {0} +prefixShowAgain=Po\u021bi afi\u0219a prefixul oric\u00e2nd vrei men\u021bion\u00e2ndu-m\u0103. diff --git a/FredBoat/src/main/resources/lang/ru_RU.properties b/FredBoat/src/main/resources/lang/ru_RU.properties index 13c9f5b83..c9228ad43 100644 --- a/FredBoat/src/main/resources/lang/ru_RU.properties +++ b/FredBoat/src/main/resources/lang/ru_RU.properties @@ -183,7 +183,7 @@ ratelimitedGeneralInfo=\u041f\u0440\u0435\u0432\u044b\u0448\u0435\u043d \u043b\u ratelimitedSkipCommand=\u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u0447\u0435\u043c \u043e\u0434\u043d\u0443 \u043f\u0435\u0441\u043d\u044e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u044d\u0442\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u044b\: {0} ratelimitedGuildSlowLoadingPlaylist=\u041d\u0430 \u044d\u0442\u043e\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u0437\u0430\u043f\u0440\u0435\u0449\u0435\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u043b\u0435\u0439\u043b\u0438\u0441\u0442\u044b \u0432 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442. \u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043d\u0435 \u043d\u0430\u0434\u043e \u0441\u043f\u0430\u043c\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u043d\u044b\u043c\u0438 \u043f\u043b\u0435\u0439\u043b\u0438\u0441\u0442\u0430\u043c\u0438. unblacklisted={0} \u0443\u0431\u0440\u0430\u043d \u0438\u0437 \u0447\u0451\u0440\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430. -serverinfoTitle=\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e **{0} **\: +serverinfoTitle=Info about {0}\: serverinfoOnlineUsers=\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u043e\u043d\u043b\u0430\u0439\u043d\: serverinfoTotalUsers=\u0412\u0441\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439\: serverinfoRoles=\u0420\u043e\u043b\u0438\: @@ -193,7 +193,7 @@ serverinfoGuildID=ID \u0421\u0435\u0440\u0432\u0435\u0440\u0430\: serverinfoCreationDate=\u0414\u0430\u0442\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f\: serverinfoOwner=\u0412\u043b\u0430\u0434\u0435\u043b\u0435\u0446\: serverinfoVLv=\u0423\u0440\u043e\u0432\u0435\u043d\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438\: -userinfoTitle=\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e **{0} **\: +userinfoTitle=Information about {0}\: userinfoUsername=\u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\: userinfoId=ID\: userinfoNick=\u041d\u0438\u043a\: @@ -212,7 +212,11 @@ commandsMaintenance=\u0422\u0435\u0445\u043e\u0431\u0441\u043b\u0443\u0436\u0438 commandsBotOwner=\u0412\u043b\u0430\u0434\u0435\u043b\u0435\u0446 \u0431\u043e\u0442\u0430 commandsMoreHelp=\u041d\u0430\u043f\u0438\u0448\u0438\u0442\u0435 {0} \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u0435. helpUnknownCommand=\u041d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u0430\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0430. -helpDM=\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u043d\u0430\:\nhttps\://fredboat.com/docs\n\n\u0425\u043e\u0442\u0438\u0442\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c FredBoat \u043d\u0430 \u0441\u0432\u043e\u0439 \u0441\u0435\u0440\u0432\u0435\u0440? \u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u043f\u043e\u043b\u043d\u043e\u043c\u043e\u0447\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440, \u0442\u043e \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0435\u0433\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c\:\n*\u042d\u0442\u043e\u0442 \u043c\u0443\u0437\u044b\u043a\u0443 \u043d\u0435 \u0438\u0433\u0440\u0430\u0435\u0442*\n\n\n*\u0410 \u044d\u0442\u043e\u0442 \u0438\u0433\u0440\u0430\u0435\u0442*\:\n\n\n\u041d\u0443\u0436\u043d\u0430 \u043f\u043e\u043c\u043e\u0449\u044c \u0438\u043b\u0438 \u0435\u0441\u0442\u044c \u0438\u0434\u0435\u0438 \u0434\u043b\u044f \u0431\u043e\u0442\u0430? \u0418\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u043e\u0440\u0430\u0437\u0432\u043b\u0435\u044c\u0447\u0441\u044f? \u0417\u0430\u0445\u043e\u0434\u0438 \u043d\u0430 FredBoat \u0441\u0435\u0440\u0432\u0435\u0440\!\n{0}\n\n\u0412\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u0441\u044b\u043b\u0430\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u044d\u0442\u043e\u043c\u0443 \u0431\u043e\u0442\u0443 \u0447\u0435\u0440\u0435\u0437 \u041b\u0421.\n\u0411\u043e\u0442 \u0441\u043e\u0437\u0434\u0430\u043d Fre_d +helpDocsLocation=Documentation can be found at\: +helpBotInvite=Want to add FredBoat to your server? If you have Manage Server permissions for your guild, you can invite FredBoat\: +helpHangoutInvite=Need help or have any ideas for FredBoat? Perhaps you just want to hang out? Join the FredBoat community\! +helpNoDmCommands=You cannot send FredBoat commands through DMs. +helpCredits=Created by Fre_d and open source contributors helpSent=\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u0431\u044b\u043b\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0430 \u0442\u0435\u0431\u0435 \u0432 \u043b\u0438\u0447\u043d\u044b\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\! helpProperUsage=\u041f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\: helpCommandOwnerRestricted=\u042d\u0442\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u043b\u0430\u0434\u0435\u043b\u044c\u0446\u0443 \u0431\u043e\u0442\u0430. diff --git a/FredBoat/src/main/resources/lang/sr_SP.properties b/FredBoat/src/main/resources/lang/sr_SP.properties index b2104ac13..7fbb0965f 100644 --- a/FredBoat/src/main/resources/lang/sr_SP.properties +++ b/FredBoat/src/main/resources/lang/sr_SP.properties @@ -183,7 +183,7 @@ ratelimitedGeneralInfo=You are being rate limited\! Please slow down. ratelimitedSkipCommand=You can skip more than one song by using this command\: {0} ratelimitedGuildSlowLoadingPlaylist=This server is not allowed to add more playlists at this moment. Please don't spam long playlists. unblacklisted=Removed {0} from the blacklist. -serverinfoTitle=Info about **{0}**\: +serverinfoTitle=Info about {0}\: serverinfoOnlineUsers=Online Users\: serverinfoTotalUsers=Total Users\: serverinfoRoles=Roles\: @@ -193,7 +193,7 @@ serverinfoGuildID=Guild ID\: serverinfoCreationDate=Creation Date\: serverinfoOwner=Owner\: serverinfoVLv=Verification Level\: -userinfoTitle=Information about **{0}**\: +userinfoTitle=Information about {0}\: userinfoUsername=Username\: userinfoId=ID\: userinfoNick=Nickname\: @@ -212,7 +212,11 @@ commandsMaintenance=Maintenance commandsBotOwner=Bot owner commandsMoreHelp=Say {0} to get more information on a specific command. helpUnknownCommand=Unknown command. -helpDM=Documentation can be found at\:\nhttps\://fredboat.com/docs\n\nWant to add FredBoat to your server? If you have Manage Server permissions for your guild, you can invite it here\:\n*This one doesn''t play music*\n\n\nIf you want to add the music bot, you will want to invite this bot\:\n\n\nNeed help or have any ideas for the bot? Perhaps you just want to hang out? Come on over to FredBoat hangout\!\n{0}\n\nYou cannot send this bot commands through DM.\nBot created by Fre_d +helpDocsLocation=Documentation can be found at\: +helpBotInvite=Want to add FredBoat to your server? If you have Manage Server permissions for your guild, you can invite FredBoat\: +helpHangoutInvite=Need help or have any ideas for FredBoat? Perhaps you just want to hang out? Join the FredBoat community\! +helpNoDmCommands=You cannot send FredBoat commands through DMs. +helpCredits=Created by Fre_d and open source contributors helpSent=Documentation has been sent to your DMs\! helpProperUsage=Proper usage\: helpCommandOwnerRestricted=This command is restricted to the owner of the bot. diff --git a/FredBoat/src/main/resources/lang/sv_SE.properties b/FredBoat/src/main/resources/lang/sv_SE.properties index 556d4bc4e..ce09a9709 100644 --- a/FredBoat/src/main/resources/lang/sv_SE.properties +++ b/FredBoat/src/main/resources/lang/sv_SE.properties @@ -183,7 +183,7 @@ ratelimitedGeneralInfo=Du skickar kommandon f\u00f6r snabbt\! Sakta ner grabben. ratelimitedSkipCommand=Du kan hoppa \u00f6ver mer \u00e4n en l\u00e5t genom att anv\u00e4nda detta kommando\: {0} ratelimitedGuildSlowLoadingPlaylist=Denna server f\u00e5r inte skapa mer spellistor f\u00f6r tillf\u00e4llet. Var sn\u00e4ll och spamma inte med l\u00e5nga spellistor. unblacklisted=Tog bort {0} fr\u00e5n svarta listan. -serverinfoTitle=Info om **{0}**\: +serverinfoTitle=Info om {0}\: serverinfoOnlineUsers=Anv\u00e4ndare online\: serverinfoTotalUsers=Antal anv\u00e4ndare\: serverinfoRoles=Roller\: @@ -193,7 +193,7 @@ serverinfoGuildID=Guild ID\: serverinfoCreationDate=Skapades\: serverinfoOwner=\u00c4gare\: serverinfoVLv=Kontroll niv\u00e5\: -userinfoTitle=Info om **{0}**\: +userinfoTitle=Information om {0}\: userinfoUsername=Anv\u00e4ndarnamn\: userinfoId=ID\: userinfoNick=Smeknamn\: @@ -212,7 +212,11 @@ commandsMaintenance=Underh\u00e5ll commandsBotOwner=Bot\u00e4gare commandsMoreHelp=Skriv {0} f\u00f6r att f\u00e5 specifik information f\u00f6r ett kommando. helpUnknownCommand=Ok\u00e4nt kommando. -helpDM=Info kan hittas p\u00e5 botens GitHub-sida\nhttp\://docs.frederikam.com\n\nVill du ha FredBoat p\u00e5 din server? Om du har till\u00e5telsen "Hantera Server" p\u00e5 den s\u00e5 kan du bjuda in den h\u00e4r\: \n*Denna spelar inte musik*\n\n\nOm du vill l\u00e4gga till musikboten s\u00e5 b\u00f6r du bjuda in denna bot\:\n\n\nOm du beh\u00f6ver hj\u00e4lp, om du har id\u00e9er f\u00f6r boten eller om du bara vill h\u00e4nga s\u00e5 kan du g\u00f6ra p\u00e5 FredBoat Hangout\! \n{0}\n\nDu kan inte skicka kommandon till denna bot genom DM.\nBot skapad av Fre_d +helpDocsLocation=Dokumentation kan hittas p\u00e5\: +helpBotInvite=Vill du l\u00e4gga till FredBoat till din server? Har du hantera Server-beh\u00f6righeter f\u00f6r din guild, kan du bjuda in FredBoat\: +helpHangoutInvite=Beh\u00f6ver du hj\u00e4lp eller har n\u00e5gra id\u00e9er f\u00f6r FredBoat? Kanske vill du bara umg\u00e5s? G\u00e5 med i FredBoat community\! +helpNoDmCommands=Du kan inte skicka FredBoat kommandon via DMs. +helpCredits=Skapad av Fre_d och \u00f6ppen k\u00e4llkod bidragsgivare helpSent=Info har skickats direkt till dig\! helpProperUsage=R\u00e4tt anv\u00e4ndning\: helpCommandOwnerRestricted=Detta kommando \u00e4r endast tillg\u00e4ngligt f\u00f6r bot\u00e4garen. @@ -225,7 +229,7 @@ helpMusicCommandsHeader=FredBoat-Musics kommandon helpJoinCommand=F\u00e5 botten att ansluta till din nuvarande r\u00f6stkanal. helpLeaveCommand=F\u00e5 botten att l\u00e4mna den nuvarande r\u00f6stkanalen. helpPauseCommand=Pausa spelaren. -helpPlayCommand=Play music from the given URL or search for a track. For a full list of sources please visit {0} +helpPlayCommand=Spela upp musik fr\u00e5n den angivna URLen eller s\u00f6k efter ett sp\u00e5r. F\u00f6r en full lista av k\u00e4llor v\u00e4nligen bes\u00f6k {0} helpPlaySplitCommand=Dela upp en YouTube-video i en l\u00e5tlista angiven i beskrivningen. helpRepeatCommand=V\u00e4xla mellan upprepningsl\u00e4gen. helpReshuffleCommand=Blandar om den aktuella k\u00f6n. @@ -257,7 +261,7 @@ helpSayCommand=F\u00e5 boten att s\u00e4ga n\u00e5got. helpServerInfoCommand=Visa lite statistik om denna server. helpUserInfoCommand=Visa information om dig sj\u00e4lv eller en anv\u00e4ndare som \u00e4r k\u00e4nd av boten. helpPerms=Till\u00e5ter vitlistning medlemmar och roller f\u00f6r {0} rang. -helpPrefixCommand=Set the prefix for this guild. +helpPrefixCommand=S\u00e4tt prefixen f\u00f6r denna server. helpVoteSkip=R\u00f6sta f\u00f6r att hoppa \u00f6ver den nuvarande l\u00e5ten. 50% av alla anv\u00e4ndare m\u00e5ste r\u00f6sta f\u00f6r att det ska funka. helpMathOperationAdd=Skriv ut summan av num1 och num2. helpMathOperationSub=Skriv ut differensen av att subtrahera num2 fr\u00e5n num1. @@ -296,6 +300,6 @@ mathOperationResult=Resultatet \u00e4r mathOperationDivisionByZeroError=Jag kan inte dela med noll. mathOperationInfinity=Numret \u00e4r f\u00f6r stort f\u00f6r att visas\! prefix=Prefix -prefixGuild=The prefix for this guild is {0} -prefixShowAgain=You can show the prefix anytime again by mentioning me. +prefixGuild=Prefixen f\u00f6r denna server \u00e4r {0} +prefixShowAgain=Du kan se prefixen n\u00e4r som helst igen genom att @a mig. diff --git a/FredBoat/src/main/resources/lang/th_TH.properties b/FredBoat/src/main/resources/lang/th_TH.properties index 8175c7818..f407ff197 100644 --- a/FredBoat/src/main/resources/lang/th_TH.properties +++ b/FredBoat/src/main/resources/lang/th_TH.properties @@ -45,7 +45,7 @@ exportPlaylistFail=\u0e01\u0e32\u0e23\u0e2d\u0e31\u0e1e\u0e42\u0e2b\u0e25\u0e14\ listShowShuffled=\u0e01\u0e33\u0e25\u0e31\u0e07\u0e40\u0e40\u0e2a\u0e14\u0e07\u0e40\u0e1e\u0e25\u0e22\u0e4c\u0e25\u0e34\u0e2a\u0e15\u0e4c\u0e17\u0e35\u0e48\u0e1c\u0e48\u0e32\u0e19\u0e01\u0e32\u0e23\u0e2a\u0e31\u0e1a\u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19[shuffle] \u0e40\u0e40\u0e25\u0e49\u0e27 listShowRepeatSingle=\u0e40\u0e14\u0e35\u0e4b\u0e22\u0e27\u0e40\u0e1b\u0e34\u0e14\u0e40\u0e40\u0e17\u0e23\u0e47\u0e04\u0e19\u0e35\u0e49\u0e43\u0e2b\u0e49\u0e2d\u0e35\u0e01\u0e23\u0e2d\u0e1a\u0e19\u0e30 listShowRepeatAll=\u0e40\u0e14\u0e35\u0e4b\u0e22\u0e27\u0e40\u0e1b\u0e34\u0e14\u0e40\u0e1e\u0e25\u0e07\u0e43\u0e19\u0e04\u0e34\u0e27\u0e17\u0e31\u0e49\u0e07\u0e2b\u0e21\u0e14\u0e2d\u0e35\u0e01\u0e23\u0e2d\u0e1a\u0e43\u0e2b\u0e49\u0e19\u0e30 -listShowHistory=Showing tracks in history. +listShowHistory=\u0e1f\u0e31\u0e07\u0e40\u0e1e\u0e25\u0e07 listAddedBy=**{0}** \u0e16\u0e39\u0e01\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e40\u0e02\u0e49\u0e32\u0e44\u0e1b\u0e43\u0e19\u0e04\u0e34\u0e27\u0e42\u0e14\u0e22 **{1}** `[{2}]` listStreamsOnlySingle=\u0e21\u0e35\u0e44\u0e25\u0e1f\u0e2a\u0e15\u0e23\u0e35\u0e21 **{0}** \u0e44\u0e25\u0e1f {1} \u0e43\u0e19\u0e04\u0e34\u0e27 listStreamsOnlyMultiple=\u0e21\u0e35\u0e44\u0e25\u0e1f\u0e2a\u0e15\u0e23\u0e35\u0e21 **{0}** \u0e44\u0e25\u0e1f {1} \u0e43\u0e19\u0e04\u0e34\u0e27 @@ -183,7 +183,7 @@ ratelimitedGeneralInfo=\u0e04\u0e38\u0e13\u0e08\u0e30\u0e16\u0e39\u0e01\u0e08\u0 ratelimitedSkipCommand=\u0e04\u0e38\u0e13\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e02\u0e49\u0e32\u0e21\u0e40\u0e1e\u0e25\u0e07\u0e17\u0e35\u0e48\u0e21\u0e32\u0e01\u0e01\u0e27\u0e48\u0e32\u0e2b\u0e19\u0e36\u0e48\u0e07 \u0e42\u0e14\u0e22\u0e43\u0e0a\u0e49\u0e04\u0e33\u0e2a\u0e31\u0e48\u0e07\u0e19\u0e35\u0e49\: {0} ratelimitedGuildSlowLoadingPlaylist=\u0e40\u0e0b\u0e34\u0e23\u0e4c\u0e1f\u0e40\u0e27\u0e2d\u0e23\u0e4c\u0e19\u0e35\u0e49\u0e44\u0e21\u0e48\u0e2d\u0e19\u0e38\u0e0d\u0e32\u0e15\u0e43\u0e2b\u0e49\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e23\u0e32\u0e22\u0e01\u0e32\u0e23\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e40\u0e15\u0e34\u0e21\u0e43\u0e19\u0e02\u0e13\u0e30\u0e19\u0e35\u0e49 \u0e23\u0e32\u0e22\u0e01\u0e32\u0e23\u0e17\u0e35\u0e48\u0e40\u0e25\u0e48\u0e19\u0e22\u0e32\u0e27\u0e2a\u0e41\u0e1b\u0e21 unblacklisted={0} \u0e2d\u0e2d\u0e01\u0e08\u0e32\u0e01\u0e1a\u0e31\u0e0d\u0e0a\u0e35\u0e14\u0e33 -serverinfoTitle=\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25\u0e40\u0e01\u0e35\u0e48\u0e22\u0e27\u0e01\u0e31\u0e1a **{0} **\: +serverinfoTitle=Info about {0}\: serverinfoOnlineUsers=\u0e1c\u0e39\u0e49\u0e43\u0e0a\u0e49\u0e2d\u0e2d\u0e19\u0e44\u0e25\u0e19\u0e4c\: serverinfoTotalUsers=\u0e1c\u0e39\u0e49\u0e43\u0e0a\u0e49\u0e23\u0e27\u0e21\: serverinfoRoles=\u0e1a\u0e17\u0e1a\u0e32\u0e17\: @@ -193,7 +193,7 @@ serverinfoGuildID=\u0e01\u0e34\u0e25\u0e14\u0e4c ID\: serverinfoCreationDate=\u0e27\u0e31\u0e19\u0e17\u0e35\u0e48\u0e2a\u0e23\u0e49\u0e32\u0e07\: serverinfoOwner=\u0e40\u0e08\u0e49\u0e32\u0e02\u0e2d\u0e07\: serverinfoVLv=\u0e23\u0e30\u0e14\u0e31\u0e1a\u0e01\u0e32\u0e23\u0e15\u0e23\u0e27\u0e08\u0e2a\u0e2d\u0e1a\: -userinfoTitle=\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25\u0e40\u0e01\u0e35\u0e48\u0e22\u0e27\u0e01\u0e31\u0e1a **{0} **\: +userinfoTitle=Information about {0}\: userinfoUsername=\u0e0a\u0e37\u0e48\u0e2d\u0e1c\u0e39\u0e49\u0e43\u0e0a\u0e49\: userinfoId=\u0e23\u0e2b\u0e31\u0e2a\: userinfoNick=\u0e0a\u0e37\u0e48\u0e2d\u0e40\u0e25\u0e48\u0e19\: @@ -212,7 +212,11 @@ commandsMaintenance=\u0e01\u0e32\u0e23\u0e1a\u0e33\u0e23\u0e38\u0e07\u0e23\u0e31 commandsBotOwner=\u0e40\u0e08\u0e49\u0e32\u0e02\u0e2d\u0e07\u0e1a\u0e2d\u0e17 commandsMoreHelp=\u0e1a\u0e2d\u0e01 {0} \u0e08\u0e30\u0e44\u0e14\u0e49\u0e23\u0e31\u0e1a\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e40\u0e15\u0e34\u0e21\u0e40\u0e01\u0e35\u0e48\u0e22\u0e27\u0e01\u0e31\u0e1a\u0e04\u0e33\u0e2a\u0e31\u0e48\u0e07\u0e40\u0e09\u0e1e\u0e32\u0e30 helpUnknownCommand=\u0e04\u0e33\u0e2a\u0e31\u0e48\u0e07\u0e17\u0e35\u0e48\u0e44\u0e21\u0e48\u0e23\u0e39\u0e49\u0e08\u0e31\u0e01 -helpDM=Documentation can be found at\:\nhttps\://fredboat.com/docs\n\nWant to add FredBoat to your server? If you have Manage Server permissions for your guild, you can invite it here\:\n*This one doesn''t play music*\n\n\nIf you want to add the music bot, you will want to invite this bot\:\n\n\nNeed help or have any ideas for the bot? Perhaps you just want to hang out? Come on over to FredBoat hangout\!\n{0}\n\nYou cannot send this bot commands through DM.\nBot created by Fre_d +helpDocsLocation=Documentation can be found at\: +helpBotInvite=Want to add FredBoat to your server? If you have Manage Server permissions for your guild, you can invite FredBoat\: +helpHangoutInvite=Need help or have any ideas for FredBoat? Perhaps you just want to hang out? Join the FredBoat community\! +helpNoDmCommands=You cannot send FredBoat commands through DMs. +helpCredits=Created by Fre_d and open source contributors helpSent=\u0e02\u0e49\u0e2d\u0e04\u0e27\u0e32\u0e21\u0e16\u0e39\u0e01\u0e2a\u0e48\u0e07\u0e44\u0e1b\u0e22\u0e31\u0e07\u0e41\u0e0a\u0e17\u0e42\u0e14\u0e22\u0e15\u0e23\u0e07\u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13\u0e41\u0e25\u0e49\u0e27\! helpProperUsage=\u0e01\u0e32\u0e23\u0e43\u0e0a\u0e49\u0e07\u0e32\u0e19\u0e17\u0e35\u0e48\u0e40\u0e2b\u0e21\u0e32\u0e30\u0e2a\u0e21\: helpCommandOwnerRestricted=\u0e04\u0e33\u0e2a\u0e31\u0e48\u0e07\u0e19\u0e35\u0e49\u0e16\u0e39\u0e01\u0e08\u0e33\u0e01\u0e31\u0e14\u0e44\u0e1b\u0e22\u0e31\u0e07\u0e40\u0e08\u0e49\u0e32\u0e02\u0e2d\u0e07\u0e1a\u0e2d\u0e17 diff --git a/FredBoat/src/main/resources/lang/tr_TR.properties b/FredBoat/src/main/resources/lang/tr_TR.properties index 44cde7551..dd5ce38f3 100644 --- a/FredBoat/src/main/resources/lang/tr_TR.properties +++ b/FredBoat/src/main/resources/lang/tr_TR.properties @@ -183,7 +183,7 @@ ratelimitedGeneralInfo=Oran\u0131 k\u0131s\u0131tl\u0131yorsun\! L\u00fctfen yav ratelimitedSkipCommand=Bu komutu kullanarak birden fazla \u015fark\u0131 ge\u00e7ebilirsiniz\: {0} ratelimitedGuildSlowLoadingPlaylist=Bu sunucunun \u015fu anda daha fazla oynatma listesi eklemesine izin verilmez. L\u00fctfen uzun \u00e7alma listeleriyle spam g\u00f6ndermeyin. unblacklisted=Kara listeden {0} kald\u0131r\u0131ld\u0131. -serverinfoTitle=**{0}** hakk\u0131nda bilgi\: +serverinfoTitle={0} hakk\u0131nda bilgi\: serverinfoOnlineUsers=Aktif kullan\u0131c\u0131lar\: serverinfoTotalUsers=Toplam Kullan\u0131c\u0131\: serverinfoRoles=Roller\: @@ -193,7 +193,7 @@ serverinfoGuildID=Klan ID\: serverinfoCreationDate=Olu\u015fturulma Tarihi\: serverinfoOwner=Sahibi\: serverinfoVLv=Do\u011frulama Seviyesi\: -userinfoTitle=**{0}** hakk\u0131nda bilgi\: +userinfoTitle={0} hakk\u0131nda bilgi\: userinfoUsername=Kullan\u0131c\u0131 ad\u0131\: userinfoId=ID\: userinfoNick=Rumuzu\: @@ -212,7 +212,11 @@ commandsMaintenance=Bak\u0131m commandsBotOwner=Bot sahibi commandsMoreHelp=Belirli bir komutla ilgili daha fazla bilgi almak i\u00e7in {0} yaz. helpUnknownCommand=Bilinmeyen komut. -helpDM=D\u00f6k\u00fcmasyonlara buradan ula\u015fabilirsiniz\:\nhttps\://fredboat.com/docs\n\nSunucuza FredBoat''\u0131 eklemek istiyor musunuz? E\u011fer sunucunun izinlerini y\u00f6netebiliyorsan, botu buradan davet edebilirsin\:\n*Bu bot m\u00fczik \u00e7almaz*\n\n\nM\u00fczik botu eklemek istiyorsan ve hala bu botu davet etmek istersen\:\n\n\nBot i\u00e7in yard\u0131ma ihtiyac\u0131n m\u0131 var? yada akl\u0131na g\u00fczel bir fikir mi geldi? Yoksa sadece tak\u0131lmak m\u0131 istiyorsun? Buraya gel ve FredBoat ile tak\u0131l\! {0}\n\nBot komutlar\u0131n\u0131 \u00f6zel mesaj yoluyla g\u00f6nderemezsin\nBot Fre_d taraf\u0131ndan yap\u0131lm\u0131\u015ft\u0131r +helpDocsLocation=Belgeler \u015furada bulunabilir\: +helpBotInvite=FredBoat'\u0131 sunucunuza eklemek ister misiniz? E\u011fer eklemek istedi\u011finiz sunucuda "Sunucuyu Y\u00f6net" yetkiniz varsa, FredBoat'\u0131 buradan davet edebilirsiniz\: +helpHangoutInvite=FredBoat hakk\u0131nda yard\u0131ma ihtiyac\u0131n\u0131z m\u0131 var ya da akl\u0131n\u0131za herhangi bir fikir mi geldi? Ya da sadece tak\u0131lmak m\u0131 istiyorsunuz? FredBoat toplulu\u011funa kat\u0131l\u0131n\! +helpNoDmCommands=FredBoat komutlar\u0131n\u0131 DM \u00fczerinden g\u00f6nderemezsiniz. +helpCredits=Fre_d ve a\u00e7\u0131k kaynak destek\u00e7ileri taraf\u0131ndan olu\u015fturuldu helpSent=D\u00f6k\u00fcmanlar DM ile g\u00f6nderildi\! helpProperUsage=Do\u011fru kullan\u0131m\: helpCommandOwnerRestricted=Bu komutu sadece bot sahibi kullanabilir. @@ -257,7 +261,7 @@ helpSayCommand=Botun sizin yazd\u0131\u011f\u0131n\u0131z \u015feyi yazmas\u0131 helpServerInfoCommand=Bu klan hakk\u0131nda baz\u0131 istatistikleri g\u00f6r\u00fcnt\u00fcler. helpUserInfoCommand=Kendiniz veya bot i\u00e7in bilinen bir kullan\u0131c\u0131 hakk\u0131ndaki bilgileri g\u00f6r\u00fcnt\u00fcler. helpPerms={0} s\u0131ralamas\u0131 i\u00e7in beyaz listeye eklenen \u00fcyelere ve rollere izin verir. -helpPrefixCommand=Set the prefix for this guild. +helpPrefixCommand=L\u00fctfen sunucunuz i\u00e7in bir "prefix" ayarlay\u0131n. helpVoteSkip=\u00c7alan \u015fark\u0131y\u0131 atlamak i\u00e7in oylama yap. Sohbetteki kullan\u0131c\u0131lar\u0131n en az %50'sinin oyu gereklidir. helpMathOperationAdd=num1 + num2 sonucunu yazd\u0131r. helpMathOperationSub=num1 - num2 sonucunu yazd\u0131r. @@ -295,7 +299,7 @@ voteSkipEmbedVoters={1} ki\u015fiden {0} ki\u015fi \u00e7alan par\u00e7an\u0131n mathOperationResult=Sonu\u00e7 mathOperationDivisionByZeroError=S\u0131f\u0131ra b\u00f6lemem. mathOperationInfinity=Say\u0131 g\u00f6r\u00fcnt\u00fclemek i\u00e7in \u00e7ok b\u00fcy\u00fck\! -prefix=Prefix -prefixGuild=The prefix for this guild is {0} -prefixShowAgain=You can show the prefix anytime again by mentioning me. +prefix=\u00d6n ek +prefixGuild=Bu sunucu i\u00e7in prefix\: {0} +prefixShowAgain=Her zaman benden bahsederek (mention) \u00f6n eki ortaya \u00e7\u0131karabilirsiniz. diff --git a/FredBoat/src/main/resources/lang/uk_UA.properties b/FredBoat/src/main/resources/lang/uk_UA.properties index f031ba696..8242cdcd8 100644 --- a/FredBoat/src/main/resources/lang/uk_UA.properties +++ b/FredBoat/src/main/resources/lang/uk_UA.properties @@ -183,7 +183,7 @@ ratelimitedGeneralInfo=You are being rate limited\! Please slow down. ratelimitedSkipCommand=You can skip more than one song by using this command\: {0} ratelimitedGuildSlowLoadingPlaylist=This server is not allowed to add more playlists at this moment. Please don't spam long playlists. unblacklisted=Removed {0} from the blacklist. -serverinfoTitle=Info about **{0}**\: +serverinfoTitle=Info about {0}\: serverinfoOnlineUsers=Online Users\: serverinfoTotalUsers=Total Users\: serverinfoRoles=Roles\: @@ -193,7 +193,7 @@ serverinfoGuildID=Guild ID\: serverinfoCreationDate=Creation Date\: serverinfoOwner=Owner\: serverinfoVLv=Verification Level\: -userinfoTitle=Information about **{0}**\: +userinfoTitle=Information about {0}\: userinfoUsername=Username\: userinfoId=ID\: userinfoNick=Nickname\: @@ -212,7 +212,11 @@ commandsMaintenance=Maintenance commandsBotOwner=Bot owner commandsMoreHelp=Say {0} to get more information on a specific command. helpUnknownCommand=Unknown command. -helpDM=Documentation can be found at\:\nhttps\://fredboat.com/docs\n\nWant to add FredBoat to your server? If you have Manage Server permissions for your guild, you can invite it here\:\n*This one doesn''t play music*\n\n\nIf you want to add the music bot, you will want to invite this bot\:\n\n\nNeed help or have any ideas for the bot? Perhaps you just want to hang out? Come on over to FredBoat hangout\!\n{0}\n\nYou cannot send this bot commands through DM.\nBot created by Fre_d +helpDocsLocation=Documentation can be found at\: +helpBotInvite=Want to add FredBoat to your server? If you have Manage Server permissions for your guild, you can invite FredBoat\: +helpHangoutInvite=Need help or have any ideas for FredBoat? Perhaps you just want to hang out? Join the FredBoat community\! +helpNoDmCommands=You cannot send FredBoat commands through DMs. +helpCredits=Created by Fre_d and open source contributors helpSent=Documentation has been sent to your DMs\! helpProperUsage=Proper usage\: helpCommandOwnerRestricted=This command is restricted to the owner of the bot. diff --git a/FredBoat/src/main/resources/lang/vi_VN.properties b/FredBoat/src/main/resources/lang/vi_VN.properties index fb8d26c86..f9390f760 100644 --- a/FredBoat/src/main/resources/lang/vi_VN.properties +++ b/FredBoat/src/main/resources/lang/vi_VN.properties @@ -45,7 +45,7 @@ exportPlaylistFail=T\u1ea3i danh s\u00e1ch l\u00ean hastebin.com kh\u00f4ng th\u listShowShuffled=Hi\u1ec3n th\u1ecb danh s\u00e1ch ph\u00e1t \u0111ang x\u00e1o tr\u1ed9n. listShowRepeatSingle=\u0110ang l\u1eb7p l\u1ea1i b\u00e0i hi\u1ec7n t\u1ea1i. listShowRepeatAll=\u0110ang l\u1eb7p l\u1ea1i h\u00e0ng ch\u1edd hi\u1ec7n t\u1ea1i. -listShowHistory=Showing tracks in history. +listShowHistory=Hi\u1ec3n th\u1ecb b\u00e0i h\u00e1t trong l\u1ecbch s\u1eed. listAddedBy=**{0}** \u0111\u00e3 \u0111\u01b0\u1ee3c th\u00eam b\u1edfi **{1}** `[{2}]` listStreamsOnlySingle=C\u00f3 **{0}** \u0111ang ch\u1edd {1} trong h\u00e0ng \u0111\u1ee3i. listStreamsOnlyMultiple=C\u00f3 **{0}** \u0111ang ch\u1edd {1} trong h\u00e0ng \u0111\u1ee3i. @@ -57,7 +57,7 @@ listAsWellAsLiveStreams=, c\u0169ng nh\u01b0 **{0}** tr\u1ef1c ti\u1ebfp {1} trackSingular=b\u00e0i nha\u0323c trackPlural=b\u00e0i h\u00e1t npNotPlaying=Hi\u1ec7n \u0111ang kh\u00f4ng ch\u01a1i b\u00e0i g\u00ec. -npNotInHistory=Currently no tracks in history. +npNotInHistory=Hi\u1ec7n kh\u00f4ng c\u00f3 b\u00e0i h\u00e1t trong l\u1ecbch s\u1eed. npDescription=Mi\u00eau t\u1ea3 npLoadedSoundcloud=[{0}/{1}]\n\n\u0110\u00e3 n\u1ea1p t\u1eeb Soundcloud npLoadedBandcamp={0}\n\n\u0110\u00e3 n\u1ea1p t\u1eeb Bandcamp @@ -79,7 +79,7 @@ restartSuccess=**{0}** \u0111\u00e3 \u0111\u01b0\u1ee3c kh\u1edfi \u0111\u1ed9ng queueEmpty=H\u00e0ng \u0111\u1ee3i \u0111ang tr\u1ed1ng. rewSuccess=\u0110ang tua l\u1ea1i **{0}** b\u1edfi {1}. seekSuccess=\u0110ang t\u00ecm ki\u1ebfm t\u1eeb **{0}** \u0111\u1ebfn {1}. -seekDeniedLiveTrack=You can't seek a live track. +seekDeniedLiveTrack=B\u1ea1n kh\u00f4ng th\u1ec3 t\u00ecm ki\u1ebfm ca kh\u00fac n\u00e0y. loadPlaySplitListFail=Li\u00ean k\u1ebft \u0111\u00f3 d\u1eabn \u0111\u1ebfn m\u1ed9t danh s\u00e1ch ph\u00e1t, kh\u00f4ng ph\u1ea3i l\u00e0 m\u1ed9t b\u00e0i h\u00e1t. H\u00e3y thay th\u1ebf b\u1eb1ng `;;play`. loadListSuccess=\u0110\u00e3 t\u00ecm \u0111\u01b0\u1ee3c v\u00e0 th\u00eam ''{0} b\u00e0i h\u00e1t t\u1eeb danh s\u00e1ch ph\u00e1t **{1}**. loadNoMatches=Kh\u00f4ng c\u00f3 \u00e2m thanh \u0111\u01b0\u1ee3c t\u00ecm th\u1ea5y cho `{0}`. @@ -125,15 +125,15 @@ luaError=\ \u0110\u00e3 x\u1ea3y ra l\u1ed7i Lua \:anger\:\n```{0}``` luaErrorOutputTooBig=\ B\u1ed9 \u0111\u1ec7m \u0111\u1ea7u ra l\u00e0 qu\u00e1 l\u1edbn \:anger\: Discord ch\u1ec9 cho ph\u00e9p 2000 k\u00fd t\u1ef1 cho tin nh\u1eafn, \u0111\u00e3 ghi {0} luaTimeout=\ Ch\u1ee9c n\u0103ng \u0111\u00e3 qu\u00e1 gi\u1edd \:anger\: cho ph\u00e9p t\u00ednh to\u00e1n th\u1eddi gian l\u00e0 {0} gi\u00e2y. helpSuccess=T\u00e0i li\u1ec7u h\u01b0\u1edbng d\u1eabn \u0111\u00e3 \u0111\u01b0\u1ee3c g\u1eedi tr\u1ef1c ti\u1ebfp cho b\u1ea1n\! -helpDmFailed=Could not send documentation to your DMs. Please check that you don't have them disabled\! +helpDmFailed=C\u00f3 th\u1ec3 kh\u00f4ng g\u1eedi t\u00e0i li\u1ec7u c\u1ee7a b\u1ea1n DMs. H\u00e3y ki\u1ec3m tra r\u1eb1ng b\u1ea1n kh\u00f4ng c\u00f3 h\u1ecd v\u00f4 hi\u1ec7u h\u00f3a\! helpCommandsPromotion=Chat {0} \u0111\u1ec3 t\u00ecm hi\u1ec3u bot n\u00e0y c\u00f3 th\u1ec3 l\u00e0m \u0111\u01b0\u1ee3c g\u00ec\! fuzzyNoResults=Kh\u00f4ng c\u00f3 ng\u01b0\u1eddi d\u00f9ng n\u00e0y brainfuckCycleLimit=Ch\u01b0\u01a1ng tr\u00ecnh \u0111\u00e3 v\u01b0\u1ee3t qu\u00e1 s\u1ed1 l\u1ea7n l\u1eb7p l\u1ea1i t\u1ed1i \u0111a l\u00e0 {0} brainfuckDataPointerOutOfBounds=Con tr\u1ecf d\u1eef li\u1ec7u n\u1eb1m ngo\u00e0i gi\u1edbi h\u1ea1n\: {0} brainfuckInputOOB=Nh\u1eadp n\u1eb1m ngo\u00e0i gi\u1edbi h\u1ea1n\: {0} brainfuckNoOutput=\ Kh\u00f4ng c\u00f3 \u0111\u1ea7u ra -weatherLocationNotFound=Unable to find location, please check your input {0}. -weatherError=Error retrieving weather for {0} +weatherLocationNotFound=Kh\u00f4ng th\u1ec3 t\u00ecm th\u1ea5y \u0111\u1ecba \u0111i\u1ec3m, h\u00e3y ki\u1ec3m tra \u0111\u1ecbnh v\u1ecb c\u1ee7a b\u1ea1n {0}. +weatherError=Kh\u00f4ng th\u1ec3 hi\u1ec3n th\u1ecb th\u1eddi ti\u1ebft cho {0} avatarSuccess=\ \u0111\u00e3 t\u00ecm th\u1ea5y\n{0} configNoArgs=C\u1ea5u h\u00ecnh cho **{0}**\:``` configSetTo=hi\u1ec7n \u0111\u01b0\u1ee3c thi\u1ebft l\u1eadp th\u00e0nh `{0}`. @@ -183,7 +183,7 @@ ratelimitedGeneralInfo=B\u1ea1n \u0111ang b\u1ecb gi\u1edbi h\u1ea1n\! H\u00e3y ratelimitedSkipCommand=B\u1ea1n c\u00f3 th\u1ec3 b\u1ecf qua nhi\u1ec1u h\u01a1n m\u1ed9t b\u00e0i h\u00e1t b\u1eb1ng c\u00e1ch d\u00f9ng l\u1ec7nh\: {0} ratelimitedGuildSlowLoadingPlaylist=M\u00e1y ch\u1ee7 n\u00e0y kh\u00f4ng \u0111\u01b0\u1ee3c cho ph\u00e9p \u0111\u1ec3 th\u00eam nhi\u1ec1u danh s\u00e1ch ph\u00e1t t\u1ea1i l\u00fac n\u00e0y. Xin \u0111\u1eebng spam danh s\u00e1ch ph\u00e1t d\u00e0i. unblacklisted=\u0110\u00e3 lo\u1ea1i b\u1ecf {0} kh\u1ecfi danh s\u00e1ch \u0111en. -serverinfoTitle=Xem th\u00f4ng tin v\u1ec1 **{0}**\: +serverinfoTitle=Th\u00f4ng tin v\u1ec1 {0}\: serverinfoOnlineUsers=Ng\u01b0\u1eddi \u0111ang online\: serverinfoTotalUsers=T\u1ed5ng s\u1ed1 ng\u01b0\u1eddi d\u00f9ng\: serverinfoRoles=Vai tro\u0300\: @@ -193,17 +193,17 @@ serverinfoGuildID=Guild ID\: serverinfoCreationDate=Ng\u00e0y t\u1ea1o\: serverinfoOwner=Ch\u1ee7 s\u1edf h\u1eefu\: serverinfoVLv=C\u1ea5p \u0111\u1ed9 x\u00e1c minh\: -userinfoTitle=Th\u00f4ng tin v\u1ec1 **{0}**\: +userinfoTitle=Th\u00f4ng tin v\u1ec1 {0}\: userinfoUsername=T\u00ean \u0111\u0103ng nh\u1eadp\: userinfoId=ID\: userinfoNick=Bi\u1ec7t danh\: userinfoKnownServer=M\u00e1y ch\u1ee7 \u0111\u00e3 bi\u1ebft\: userinfoJoinDate=Ng\u00e0y tham gia\: userinfoCreationTime=Ng\u00e0y t\u1ea1o\: -userinfoBlacklisted=Blacklisted\: -skipDeniedTooManyTracks=You can't skip someone else's tracks if you are not a DJ.\nConsider using the Voteskip command. +userinfoBlacklisted=Danh s\u00e1ch \u0111en\: +skipDeniedTooManyTracks=B\u1ea1n kh\u00f4ng th\u1ec3 b\u1ecf qua b\u00e0i h\u00e1t c\u1ee7a ng\u01b0\u1eddi kh\u00e1c n\u1ebfu b\u1ea1n kh\u00f4ng ph\u1ea3i l\u00e0 m\u1ed9t DJ. N\u1ebfu mu\u1ed1n chuy\u1ec3n b\u00e0i d\u00f9ng Voteskip. eventUsersLeftVC=T\u1ea5t c\u1ea3 ng\u01b0\u1eddi d\u00f9ng \u0111\u00e3 r\u1eddi kh\u1ecfi k\u00eanh tho\u1ea1i. M\u00e1y nghe nh\u1ea1c \u0111\u00e3 t\u1ea1m d\u1eebng. -eventAutoResumed=User presence detected, automatically resuming the player. +eventAutoResumed=T\u1ef1 \u0111\u1ed9ng ph\u00e1t hi\u1ec7n s\u1ef1 hi\u1ec7n di\u1ec7n c\u1ee7a ng\u01b0\u1eddi s\u1eed d\u1ee5ng, t\u1ef1 \u0111\u1ed9ng ch\u1ea1y l\u1ea1i nh\u1ea1c. commandsFun=Tr\u00f2 vui commandsMemes=Meme commandsUtility=Ti\u1ec7n \u00edch @@ -212,7 +212,11 @@ commandsMaintenance=B\u1ea3o tr\u00ec commandsBotOwner=Ch\u1ee7 s\u1edf h\u1eefu bot commandsMoreHelp=Chat {0} \u0111\u1ec3 bi\u1ebft th\u00eam th\u00f4ng tin v\u1ec1 m\u1ed9t l\u1ec7nh c\u1ee5 th\u1ec3. helpUnknownCommand=L\u1ec7nh kh\u00f4ng r\u00f5. -helpDM=T\u00e0i li\u1ec7u c\u00f3 th\u1ec3 \u0111\u01b0\u1ee3c t\u00ecm th\u1ea5y t\u1ea1i\:\nhttps\://fredboat.com/docs\n\nB\u1ea1n mu\u1ed1n th\u00eam FredBoat v\u00e0o m\u00e1y ch\u1ee7 c\u1ee7a m\u00ecnh? N\u1ebfu b\u1ea1n c\u00f3 quy\u1ec1n qu\u1ea3i l\u00ed m\u00e1y ch\u1ee7 cho guild c\u1ee7a b\u1ea1n, b\u1ea1n c\u00f3 th\u1ec3 m\u1eddi bot v\u00e0o \u1edf \u0111\u00e2y\:\n*con n\u00e0y kh\u00f4ng bi\u1ebft ch\u01a1i nh\u1ea1c*\n\n\nN\u1ebfu b\u1ea1n mu\u1ed1n th\u00eam con bi\u1ebft ch\u01a1i nh\u1ea1c, b\u1ea1n s\u1ebd ph\u1ea3i m\u1eddi bot n\u00e0y\:\n\n\nC\u1ea7n gi\u00fap \u0111\u1ee1ho\u1eb7c c\u00f3 \u00fd t\u01b0\u1edfng m\u1edbi cho bot? C\u00f3 th\u1ec3 b\u1ea1n ch\u1ec9 mu\u1ed1n vui \u0111\u00f9a? H\u00e3y \u0111\u1ebfn khu vui \u0111\u00f9a c\u1ee7a FredBoat\!\n{0}\n\nB\u1ea1n kh\u00f4ng th\u1ec3 g\u1eedi l\u1ec7nh cho bot th\u00f4ng qua DM (Tin nh\u1eafn tr\u1ef1c ti\u1ebfp)\nBot \u0111\u01b0\u1ee3c t\u1ea1o b\u1edfi Fre_d, d\u1ecbch ti\u1ebfng Vi\u1ec7t b\u1edfi phjtieudoc (Drake Srike) +helpDocsLocation=T\u00e0i li\u1ec7u h\u01b0\u1edbng d\u1eabn c\u00f3 th\u1ec3 \u0111\u01b0\u1ee3c t\u00ecm th\u1ea5y t\u1ea1i\: +helpBotInvite=B\u1ea1n mu\u1ed1n th\u00eam FredBoat v\u00e0o m\u00e1y ch\u1ee7 c\u1ee7a b\u1ea1n? N\u1ebfu b\u1ea1n c\u00f3 quy\u1ec1n truy c\u1eadp qu\u1ea3n l\u00fd m\u00e1y ch\u1ee7 cho guild c\u1ee7a b\u1ea1n, b\u1ea1n c\u00f3 th\u1ec3 m\u1eddi FredBoat\: +helpHangoutInvite=C\u1ea7n gi\u00fap \u0111\u1ee1 ho\u1eb7c c\u00f3 b\u1ea5t k\u1ef3 \u00fd t\u01b0\u1edfng cho FredBoat? C\u00f3 l\u1ebd b\u1ea1n ch\u1ec9 mu\u1ed1n hang out? Tham gia c\u1ed9ng \u0111\u1ed3ng FredBoat\! +helpNoDmCommands=B\u1ea1n kh\u00f4ng th\u1ec3 g\u1eedi l\u1ec7nh FredBoat qua DMs. +helpCredits=T\u1ea1o b\u1edfi Fre_d v\u00e0 nh\u1eefng ng\u01b0\u1eddi \u0111\u00f3ng g\u00f3p m\u00e3 ngu\u1ed3n m\u1edf helpSent=T\u00e0i li\u1ec7u \u0111\u00e3 \u0111\u01b0\u1ee3c g\u1eedi tr\u1ef1c ti\u1ebfp cho b\u1ea1n\! helpProperUsage=C\u00e1ch d\u00f9ng ch\u00ednh x\u00e1c\: helpCommandOwnerRestricted=L\u1ec7nh n\u00e0y ch\u1ec9 \u0111\u01b0\u1ee3c gi\u1edbi h\u1ea1n cho c\u00e1c ch\u1ee7 s\u1edf h\u1eefu c\u1ee7a bot. @@ -225,20 +229,20 @@ helpMusicCommandsHeader=L\u1ec7nh FredBoat \u00c2m nh\u1ea1c helpJoinCommand=L\u00e0m cho bot tham gia k\u00eanh tho\u1ea1i hi\u1ec7n t\u1ea1i. helpLeaveCommand=L\u00e0m cho bot r\u1eddi kh\u1ecfi k\u00eanh tho\u1ea1i hi\u1ec7n t\u1ea1i. helpPauseCommand=T\u1ea1m d\u1eebng m\u00e1y nghe nh\u1ea1c. -helpPlayCommand=Play music from the given URL or search for a track. For a full list of sources please visit {0} +helpPlayCommand=Ch\u01a1i nh\u1ea1c t\u1eeb URL \u0111\u00e3 cho ho\u1eb7c t\u00ecm ki\u1ebfm m\u1ed9t b\u00e0i h\u00e1t. \u0110\u1ec3 c\u00f3 danh s\u00e1ch \u0111\u1ea7y \u0111\u1ee7 ngu\u1ed3n vui l\u00f2ng truy c\u1eadp {0} helpPlaySplitCommand=T\u00e1ch m\u1ed9t video Youtube th\u00e0nh m\u1ed9t danh s\u00e1ch b\u00e0i h\u00e1t \u0111\u01b0\u1ee3c cho \u1edf ph\u1ea7n mi\u00eau t\u1ea3. helpRepeatCommand=Chuy\u1ec3n \u0111\u1ed5i gi\u1eefa c\u00e1c ch\u1ebf \u0111\u1ed9 l\u1eb7p l\u1ea1i. helpReshuffleCommand=X\u00e1o tr\u1ed9n l\u1ea1i h\u00e0ng ch\u1edd hi\u1ec7n t\u1ea1i. helpSelectCommand=Ch\u1ecdn m\u1ed9t trong c\u00e1c b\u00e0i h\u00e1t \u0111\u01b0\u1ee3c y\u00eau c\u1ea7u sau khi t\u00ecm ki\u1ebfm \u0111\u1ec3 ch\u01a1i. helpShuffleCommand=B\u1eadt t\u1eaft ch\u1ebf \u0111\u1ed9 ng\u1eabu nhi\u00ean cho h\u00e0ng ch\u1edd hi\u1ec7n t\u1ea1i. -helpSkipCommand=Skip the current song, the n'th song in the queue, all songs from n to m, or all songs from mentioned users. Please use in moderation. +helpSkipCommand=B\u1ecf qua b\u00e0i h\u00e1t hi\u1ec7n t\u1ea1i, b\u00e0i h\u00e1t n'th trong h\u00e0ng ch\u1edd ho\u1eb7c t\u1ea5t c\u1ea3 b\u00e0i h\u00e1t t\u1eeb n t\u1edbi m. Xin vui l\u00f2ng s\u1eed d\u1ee5ng trong tr\u00ecnh qu\u1ea3n l\u00ed. helpStopCommand=D\u1eebng m\u00e1y nghe nh\u1ea1c v\u00e0 d\u1ecdn danh s\u00e1ch ph\u00e1t. D\u00e0nh ri\u00eang cho ng\u01b0\u1eddi ki\u1ec3m duy\u1ec7t v\u1edbi quy\u1ec1n qu\u1ea3n l\u00fd tin nh\u1eafn. helpUnpauseCommand=H\u1ee7y t\u1ea1m d\u1eebng m\u00e1y nghe nh\u1ea1c. helpVolumeCommand=Thay \u0111\u1ed5i \u00e2m l\u01b0\u1ee3ng. G\u00eda tr\u1ecb t\u1eeb 0-150 v\u00e0 100 l\u00e0 m\u1eb7c \u0111\u1ecbnh. L\u1ec7nh \u00e2m l\u01b0\u1ee3ng \u0111\u01b0\u1ee3c c\u00e1ch bi\u1ec7t v\u1edbi bot c\u00f4ng khai. helpExportCommand=Xu\u1ea5t ra h\u00e0ng ch\u1edd hi\u1ec7n t\u1ea1i v\u00e0o m\u1ed9t li\u00ean k\u1ebft hastebin, sau \u0111\u00f3 c\u00f3 th\u1ec3 \u0111\u01b0\u1ee3c d\u00f9ng nh\u01b0 m\u1ed9t danh s\u00e1ch ph\u00e1t. helpGensokyoRadioCommand=Hi\u1ec3n th\u1ecb b\u00e0i h\u00e1t hi\u1ec7n t\u1ea1i \u0111\u01b0\u1ee3c ch\u01a1i tr\u00ean gensokyoradio.net helpListCommand=Hi\u1ec3n th\u1ecb m\u1ed9t danh s\u00e1ch b\u00e0i h\u00e1t hi\u1ec7n t\u1ea1i trong danh s\u00e1ch ph\u00e1t. -helpHistoryCommand=Display a list of the songs in playlist history. +helpHistoryCommand=Hi\u1ec3n th\u1ecb m\u1ed9t danh s\u00e1ch c\u00e1c b\u00e0i h\u00e1t trong danh s\u00e1ch l\u1ecbch s\u1eed. helpNowplayingCommand=Hi\u1ec3n th\u1ecb b\u00e0i h\u00e1t \u0111ang ph\u00e1t. helpForwardCommand=Chuy\u1ec3n ti\u1ebfp b\u00e0i h\u00e1t b\u1eb1ng m\u1ed9t s\u1ed1 l\u01b0\u1ee3ng th\u1eddi gian nh\u1ea5t \u0111\u1ecbnh. V\u00ed d\u1ee5\: helpRestartCommand=Kh\u1edfi \u0111\u1ed9ng l\u1ea1i ca kh\u00fac hi\u1ec7n \u0111ang ph\u00e1t. @@ -246,7 +250,7 @@ helpRewindCommand=Tua l\u1ea1i b\u00e0i h\u00e1t b\u1eb1ng m\u1ed9t s\u1ed1 l\u0 helpSeekCommand=\u0110\u1eb7t v\u1ecb tr\u00ed c\u1ee7a b\u00e0i h\u00e1t tr\u00ean th\u1eddi gian nh\u1ea5t \u0111\u1ecbnh. V\u00ed d\u1ee5\: helpAvatarCommand=Hi\u1ec3n th\u1ecb \u1ea3nh \u0111\u1ea1i di\u1ec7n c\u1ee7a m\u1ed9t ng\u01b0\u1eddi d\u00f9ng. helpBrainfuckCommand=Th\u1ef1c thi m\u00e3 Hackn\u00e3o. V\u00ed d\u1ee5\: -helpWeatherCommand=Display current weather by location. +helpWeatherCommand=Hi\u1ec3n th\u1ecb hi\u1ec7n nay th\u1eddi ti\u1ebft theo \u0111\u1ecba \u0111i\u1ec3m. helpClearCommand=X\u00f3a t\u1ea5t c\u1ea3 tin nh\u0103n b\u1eb1ng bot n\u00e0y trong 50 tin nh\u1eafn \u1edf k\u00eanh n\u00e0y. helpCommandsCommand=Hi\u1ec3n th\u1ecb c\u00e1c l\u1ec7nh c\u00f3 s\u1eb5n. helpHelpCommand=Nh\u1eadn gi\u00fap \u0111\u1ee1 cho bot n\u00e0y ho\u1eb7c tr\u1ee3 gi\u00fap cho b\u1ea5t c\u1ee9 l\u1ec7nh. @@ -257,16 +261,16 @@ helpSayCommand=L\u00e0m cho bot nh\u1edb v\u1ec1 phjtieudoc. helpServerInfoCommand=Hi\u1ec3n th\u1ecb m\u1ed9t s\u1ed1 s\u1ed1 li\u1ec7u th\u1ed1ng k\u00ea v\u1ec1 guild n\u00e0y. helpUserInfoCommand=Hi\u1ec3n th\u1ecb th\u00f4ng tin v\u1ec1 ch\u00ednh m\u00ecnh ho\u1eb7c ng\u01b0\u1eddi d\u00f9ng kh\u00e1c \u0111\u1ebfn c\u00e1c bot. helpPerms=Cho ph\u00e9p c\u00e1c th\u00e0nh vi\u00ean whitelist v\u00e0 vai tr\u00f2 c\u1ee7a h\u1ea1ng {0}. -helpPrefixCommand=Set the prefix for this guild. -helpVoteSkip=Vote to skip the current song. Needs 50% of all users in the voice chat to vote. -helpMathOperationAdd=Print the sum of num1 and num2. -helpMathOperationSub=Print the difference of subtracting num2 from num1. -helpMathOperationMult=Print the product of num1*num2. -helpMathOperationDiv=Print the quotient of dividing num1 by num2. -helpMathOperationMod=Print the remainder of dividing num1 by num2. -helpMathOperationPerc=Print the percentage represented by num1 in num2. -helpMathOperationSqrt=Print the square root of num. -helpMathOperationPow=Print the result of num1^num2. +helpPrefixCommand=Thi\u1ebft l\u1eadp ti\u1ec1n t\u1ed1 cho guild n\u00e0y. +helpVoteSkip=B\u00ecnh ch\u1ecdn \u0111\u1ec3 b\u1ecf qua b\u00e0i h\u00e1t hi\u1ec7n t\u1ea1i. C\u1ea7n s\u1ef1 \u0111\u1ed3ng thu\u1eadn c\u1ee7a 50% ng\u01b0\u1eddi d\u00f9ng trong k\u00eanh \u0111\u1ec3 b\u1ecf qua b\u00e0i h\u00e1t. +helpMathOperationAdd=In t\u1ed5ng c\u1ee7a num1 v\u00e0 num2. +helpMathOperationSub=In s\u1ef1 kh\u00e1c bi\u1ec7t c\u1ee7a tr\u1eeb num2 t\u1eeb num1. +helpMathOperationMult=In c\u00e1c s\u1ea3n ph\u1ea9m c\u1ee7a num1 * num2. +helpMathOperationDiv=In th\u01b0\u01a1ng chia num1 b\u1edfi num2. +helpMathOperationMod=In th\u01b0\u01a1ng chia num1 b\u1edfi num2. +helpMathOperationPerc=In t\u1ef7 l\u1ec7 ph\u1ea7n tr\u0103m \u0111\u01b0\u1ee3c \u0111\u1ea1i di\u1ec7n b\u1edfi num1 \u1edf num2. +helpMathOperationSqrt=In b\u1eadc hai c\u1ee7a s\u1ed1 c\u00f2n t. +helpMathOperationPow=In c\u00e1c s\u1ea3n ph\u1ea9m c\u1ee7a num1 * num2. destroyDenied=B\u1ea1n c\u1ea7n ph\u1ea3i c\u00f3 quy\u1ec1n qu\u1ea3n l\u00ed tin nh\u1eafn \u0111\u1ec3 \u0111\u1eb7t l\u1ea1i m\u00e1y nghe nh\u1ea1c. destroyHelp=\u0110\u1eb7t l\u1ea1i m\u00e1y nghe nh\u1ea1c v\u00e0 d\u1ecdn danh s\u00e1ch ph\u00e1t. D\u00e0nh ri\u00eang cho ng\u01b0\u1eddi ki\u1ec3m duy\u1ec7t v\u1edbi quy\u1ec1n qu\u1ea3n l\u00fd tin nh\u1eafn. destroySucc=\u0110\u00e3 \u0111\u1eb7t l\u1ea1i m\u00e1y nghe nh\u1ea1c v\u00e0 x\u00f3a h\u00e0ng ch\u1edd. @@ -275,27 +279,27 @@ permsListTitle=Ng\u01b0\u1eddi d\u00f9ng v\u00e0 c\u00e1c vai tr\u00f2 v\u1edbi permsAdded=\u0110\u00e3 th\u00eam `{0}` t\u1edbi `{1}`. permsRemoved=\u0110\u00e3 lo\u1ea1i b\u1ecf `{0}` t\u1eeb `{1}`. permsFailSelfDemotion=B\u1ea1n kh\u00f4ng th\u1ec3 lo\u1ea1i b\u1ecf \u0111i\u1ec1u n\u00e0y v\u00ec n\u00f3 s\u1ebd khi\u1ebfn b\u1ea1n kh\u00f4ng c\u00f3 quy\u1ec1n qu\u1ea3n tr\u1ecb\! -permsAlreadyAdded={0} already added to {1} -permsNotAdded={0} is not in {1} +permsAlreadyAdded={0} \u0111\u00e3 \u0111\u01b0\u1ee3c th\u00eam v\u00e0o {1} +permsNotAdded={0} kh\u00f4ng ph\u1ea3i l\u00e0 {1} fuzzyMultiple=Nhi\u1ec1u kho\u1ea3n m\u1ee5c \u0111\u00e3 \u0111\u01b0\u1ee3c t\u00ecm th\u1ea5y. B\u1ea1n c\u00f3 hi\u1ec3u b\u1ea5t k\u00ec g\u00ec kh\u00f4ng? fuzzyNothingFound=Kh\u00f4ng t\u00ecm th\u1ea5y g\u00ec cho `{0}`. cmdPermsTooLow=B\u1ea1n kh\u00f4ng c\u00f3 quy\u1ec1n \u0111\u1ec3 ch\u1ea1y l\u1ec7nh n\u00e0y\! L\u1ec7nh n\u00e0y y\u00eau c\u1ea7u `{0}`, nh\u01b0ng b\u1ea1n ch\u1ec9 c\u00f3 `{1}`. playersLimited=FredBoat hi\u1ec7n \u0111\u00e3 \u0111\u1ea1t t\u1ed1i \u0111a n\u0103ng l\u1ef1c\! Bot n\u00e0y hi\u1ec7n \u0111ang \u0111\u01b0\u1ee3c s\u1eeda \u0111\u1ec3 ph\u00e1t nh\u1ea1c \u0111\u1ebfn `{0}` b\u00e0i, n\u1ebfu kh\u00f4ng ch\u00fang t\u00f4i ph\u1ea3i ng\u1eaft k\u1ebft n\u1ed1i kh\u1ecfi Discord d\u01b0\u1edbi trang t\u1ea3i m\u1ea1ng.\nN\u1ebfu b\u1ea1n mu\u1ed1n h\u1ed7 tr\u1ee3 ch\u00fang t\u00f4i t\u0103ng th\u00eam gi\u1edbi h\u1ea1n hay b\u1ea1n mu\u1ed1n s\u1eed d\u1ee5ng bot t\u1ed1i thi\u1ec3u c\u1ee7a ch\u00fang t\u00f4i, h\u00e3y h\u1ed7 tr\u1ee3 ch\u00fang t\u00f4i qua Patreon\:\n{1}\n\nXin l\u1ed7i v\u00ec s\u1ef1 b\u1ea5t ti\u1ec7n\! B\u1ea1n c\u00f3 th\u1ec3 ph\u1ea3i th\u1eed l\u1ea1i sau. Tin nh\u1eafn n\u00e0y th\u01b0\u1eddng ch\u1ec9 xu\u1ea5t hi\u1ec7n m\u1ed9t v\u00e0i l\u1ea7n. -tryLater=Please try again later. -skipUserSingle=Skipped {0} added by {1}. -skipUserMultiple=Skipped {0} tracks added by {1}. -skipUsersMultiple=Skipped {0} tracks added by {1} users. -skipUserNoTracks=None of the mentioned users have any tracks queued. -voteSkipAdded=Your vote has been added\! -voteSkipAlreadyVoted=You already voted to skip this track\! -voteSkipSkipping={0} have voted to skip. Skipping track {1}. -voteSkipNotEnough={0} have voted to skip. At least {1} needed. -voteSkipEmbedNoVotes=No votes to skip this track yet. -voteSkipEmbedVoters={0} out of {1} have voted to skip the current track +tryLater=Vui l\u00f2ng th\u1eed l\u1ea1i sau. +skipUserSingle=\u0110\u00e3 b\u1ecf qua {0} \u0111\u01b0\u1ee3c th\u00eam v\u00e0o b\u1edfi {1}. +skipUserMultiple=\u0110\u00e3 b\u1ecf qua {0} \u0111\u01b0\u1ee3c th\u00eam v\u00e0o b\u1edfi {1}. +skipUsersMultiple=\u0110\u00e3 b\u1ecf qua {0} \u0111\u01b0\u1ee3c th\u00eam v\u00e0o b\u1edfi {1}. +skipUserNoTracks=Kh\u00f4ng c\u00f3 \u0111\u1ec1 c\u1eadp \u0111\u1ebfn ng\u01b0\u1eddi d\u00f9ng c\u00f3 b\u1ea5t k\u1ef3 b\u00e0i h\u00e1t \u0111\u00e3 x\u1ebfp h\u00e0ng. +voteSkipAdded=Phi\u1ebfu b\u1ea7u c\u1ee7a b\u1ea1n \u0111\u00e3 \u0111\u01b0\u1ee3c th\u00eam\! +voteSkipAlreadyVoted=B\u1ea1n \u0111\u00e3 b\u1ecf phi\u1ebfu \u0111\u1ec3 b\u1ecf qua vi\u1ec7c theo d\u00f5i n\u00e0y\! +voteSkipSkipping={0} \u0111\u00e3 b\u1ecf phi\u1ebfu \u0111\u1ec3 b\u1ecf qua. \u0110ang b\u1ecf qua b\u00e0i h\u00e1t {1}. +voteSkipNotEnough={0} \u0111\u00e3 b\u1ecf phi\u1ebfu \u0111\u1ec3 b\u1ecf qua. C\u1ea7n \u00edt nh\u1ea5t l\u00e0 {1}. +voteSkipEmbedNoVotes=Ch\u01b0a c\u00f3 phi\u1ebfu \u0111\u1ec3 b\u1ecf qua b\u00e0i h\u00e1t n\u00e0y. +voteSkipEmbedVoters={0} tr\u00ean {1} \u0111\u00e3 b\u1ecf phi\u1ebfu \u0111\u1ec3 b\u1ecf qua vi\u1ec7c theo d\u00f5i hi\u1ec7n t\u1ea1i mathOperationResult=K\u1ebft qu\u1ea3 l\u00e0 mathOperationDivisionByZeroError=Kh\u00f4ng th\u1ec3 chia cho 0. mathOperationInfinity=S\u1ed1 qu\u00e1 l\u1edbn \u0111\u1ec3 \u0111\u01b0\u1ee3c hi\u1ec3n th\u1ecb\! -prefix=Prefix -prefixGuild=The prefix for this guild is {0} -prefixShowAgain=You can show the prefix anytime again by mentioning me. +prefix=Ti\u1ec1n t\u1ed1 +prefixGuild=Ti\u1ec1n t\u1ed1 cho guild n\u00e0y l\u00e0 {0} +prefixShowAgain=B\u1ea1n c\u00f3 th\u1ec3 hi\u1ec3n th\u1ecb c\u00e1c ti\u1ec1n t\u1ed1 b\u1ea5t c\u1ee9 l\u00fac n\u00e0o m\u1ed9t l\u1ea7n n\u1eefa b\u1eb1ng c\u00e1ch nh\u1eafc \u0111\u1ebfn t\u00f4i. diff --git a/FredBoat/src/main/resources/lang/zh_CN.properties b/FredBoat/src/main/resources/lang/zh_CN.properties index f95226396..73e7c2588 100644 --- a/FredBoat/src/main/resources/lang/zh_CN.properties +++ b/FredBoat/src/main/resources/lang/zh_CN.properties @@ -19,14 +19,14 @@ selectInterval=\u6570\u5b57\u5fc5\u987b\u5728 1 \u5230 {0} \u4e4b\u95f4 selectSelectionNotGiven=\u5f53\u524d\u65e0\u641c\u7d22\u7ed3\u679c\u4f9b\u60a8\u9009\u62e9\u3002 shuffleOn=\u300c\u968f\u673a\u64ad\u653e\u300d\u6a21\u5f0f\u5df2\u6253\u5f00\u3002 shuffleOff=\u300c\u968f\u673a\u64ad\u653e\u300d\u6a21\u5f0f\u5df2\u5173\u95ed\u3002 -reshufflePlaylist=I have translated reshuffled as reorganized, I am not entirely sure that it is a correct translation. +reshufflePlaylist=\u961f\u5217\u6539\u7ec4\u3002 reshufflePlayerNotShuffling=\u5fc5\u987b\u5148\u6253\u5f00 "\u65e0\u5e8f\u64ad\u653e" \u6a21\u5f0f\u3002 skipEmpty=\u5f53\u524d\u64ad\u653e\u5217\u8868\u4e3a\u7a7a\u3002 skipOutOfBounds=\u65e0\u6cd5\u79fb\u9664\u7b2c {0} \u9996\u6b4c\uff0c\u56e0\u4e3a\u5f53\u524d\u64ad\u653e\u5217\u8868\u53ea\u6709 {1} \u9996\u6b4c\u66f2\u3002 skipNumberTooLow=\u60a8\u8f93\u5165\u7684\u6570\u5b57\u5fc5\u987b\u5927\u4e8e 0\u3002 skipSuccess=\u5df2\u8df3\u8fc7 \#{0}\: **{1}** skipRangeInvalid=\u6307\u5b9a\u7684\u6b4c\u66f2\u8303\u56f4\u65e0\u6548\u3002 -skipRangeSuccess=Tracks between \#{0} to \#{}~\#{1} have been removed. +skipRangeSuccess=\u5e8f\u53f7\u4e3a {0} ~ {1} \u7684\u6b4c\u66f2\u5df2\u88ab\u79fb\u9664\u3002 skipTrackNotFound=\u5f53\u524d\u64ad\u653e\u5217\u8868\u4e3a\u7a7a\uff0c\u65e0\u6cd5\u4f7f\u7528\u8df3\u8fc7\u529f\u80fd\u3002 stopAlreadyEmpty=\u64ad\u653e\u5217\u8868\u5df2\u6e05\u7a7a\u3002 stopEmptyOne=\u64ad\u653e\u5217\u8868\u5df2\u6e05\u7a7a\uff0c`1` \u9996\u6b4c\u66f2\u5df2\u88ab\u79fb\u9664\u3002 @@ -212,7 +212,11 @@ commandsMaintenance=\u7cfb\u7edf\u7ef4\u62a4 commandsBotOwner=\u673a\u5668\u4eba\u4e3b\u4eba commandsMoreHelp=\u8bf4{0} \u83b7\u53d6\u6709\u5173\u7279\u5b9a\u547d\u4ee4\u7684\u66f4\u591a\u4fe1\u606f\u3002 helpUnknownCommand=\u672a\u77e5\u7684\u6307\u4ee4\u3002 -helpDM=\u6587\u6863\u53ef\u4ee5\u5728 bot \u7684 GitHub \u9875\u9762\u627e\u5230\uff1a\nhttp\://docs.frederikam.com\n\n\u60f3\u6dfb\u52a0 FredBoat \u5230\u60a8\u7684\u670d\u52a1\u5668\uff1f\u5982\u679c\u60a8\u6709\u60a8\u7684\u516c\u4f1a\u7684\u7ba1\u7406\u670d\u52a1\u5668\u6743\u9650\uff0c\u5373\u53ef\u901a\u8fc7\u4e0b\u9762\u7684\u94fe\u63a5\u9080\u8bf7 bot\uff1a\n*This one doesn't play music*\nhttps\://discordapp.com/oauth2/authorize?&client_id\=168686772216135681&scope\=bot\n\n\u5982\u679c\u60f3\u6dfb\u52a0\u97f3\u4e50 bot\uff0c\u53ef\u901a\u8fc7\u4e0b\u9762\u7684\u94fe\u63a5\u9080\u8bf7\uff1a\nhttps\://discordapp.com/oauth2/authorize?&client_id\=184405253028970496&scope\=bot\n\n\u9700\u8981\u5e2e\u52a9\uff1f\u6709\u5173\u4e8e bot \u7684\u70b9\u5b50\uff1f\u6216\u8005\u53ea\u662f\u60f3\u901b\u901b\uff1f\u5feb\u6765 FredBoat \u7684 Discord \u516c\u4f1a\u5427\uff01\nhttps\://discord.gg/0yXhQ9c36F4zsJMG/0yXhQ9c36F4zsJMG\n\n\u60a8\u4e0d\u80fd\u5728\u4e0e bot \u7684\u79c1\u804a\u4e2d\u4f7f\u7528\u547d\u4ee4\u3002\nBot \u4f5c\u8005\uff1aFre_d +helpDocsLocation=\u6587\u6863\u53ef\u4ee5\u5728\u4ee5\u4e0b\u65b9\u9762\u627e\u5230\: +helpBotInvite=\u8981\u5c06 FredBoat \u6dfb\u52a0\u5230\u60a8\u7684\u670d\u52a1\u5668\u5417\uff1f\u5982\u679c\u60a8\u6709\u7ba1\u7406\u516c\u4f1a\u7684\u670d\u52a1\u5668\u6743\u9650, \u60a8\u53ef\u4ee5\u9080\u8bf7 FredBoat\: +helpHangoutInvite=\u9700\u8981\u5e2e\u52a9\u6216\u6709\u4efb\u4f55\u60f3\u6cd5\u7684 FredBoat\uff1f\u4e5f\u8bb8\u4f60\u53ea\u662f\u60f3\u51fa\u53bb\u73a9\uff1f\u52a0\u5165 FredBoat \u793e\u533a\! +helpNoDmCommands=\u60a8\u4e0d\u80fd\u901a\u8fc7 DMs \u53d1\u9001 FredBoat \u547d\u4ee4\u3002 +helpCredits=\u7531 Fre_d \u548c\u5f00\u6e90\u8d21\u732e\u8005\u521b\u5efa helpSent=\u5e2e\u52a9\u6587\u6863\u5df2\u901a\u8fc7\u79c1\u804a\u53d1\u7ed9\u60a8\uff01 helpProperUsage=\u6b63\u786e\u4f7f\u7528\: helpCommandOwnerRestricted=\u6b64\u547d\u4ee4\u4ec5\u9650\u4e8e \n\u673a\u5668\u4eba\u4e3b\u4eba @@ -257,7 +261,7 @@ helpSayCommand=\u8ba9\u673a\u5668\u4eba\u56de\u58f0\u7684\u4e1c\u897f\u3002 helpServerInfoCommand=\u663e\u793a\u5173\u4e8e\u8fd9\u4e2a\u884c\u4f1a\u7684\u4e00\u4e9b\u7edf\u8ba1\u6570\u636e\u3002 helpUserInfoCommand=\u663e\u793a\u6709\u5173\u60a8\u81ea\u5df1\u6216 bot \u6240\u77e5\u7528\u6237\u7684\u4fe1\u606f\u3002 helpPerms=\u5141\u8bb8{0} \u79e9\u7684\u540d\u5355\u6210\u5458\u548c\u89d2\u8272\u3002 -helpPrefixCommand=Set the prefix for this guild. +helpPrefixCommand=\u8bbe\u7f6e\u8be5\u884c\u4f1a\u7684\u524d\u7f00\u3002 helpVoteSkip=\u6295\u7968\u8df3\u8fc7\u5f53\u524d\u7684\u6b4c\u66f2\u3002\u9700\u898150% \u7684\u6240\u6709\u7528\u6237\u5728\u8bed\u97f3\u804a\u5929\u4e2d\u6295\u7968\u3002 helpMathOperationAdd=\u6253\u5370 num1 \u548c num2 \u7684\u603b\u548c\u3002 helpMathOperationSub=\u6253\u5370\u4ece num1 \u4e2d\u51cf\u53bb num2 \u7684\u5dee\u5f02\u3002 @@ -295,7 +299,7 @@ voteSkipEmbedVoters={0} \u51fa\u4e86{1} \u5df2\u7ecf\u6295\u7968\u8df3\u8fc7\u5f mathOperationResult=\u5176\u7ed3\u679c\u662f mathOperationDivisionByZeroError=\u6211\u4e0d\u80fd\u9664\u4ee5\u96f6\u3002 mathOperationInfinity=\u6570\u5b57\u592a\u5927, \u4e0d\u80fd\u663e\u793a\! -prefix=Prefix -prefixGuild=The prefix for this guild is {0} -prefixShowAgain=You can show the prefix anytime again by mentioning me. +prefix=\u524d\u7f00 +prefixGuild=\u8fd9\u4e2a\u516c\u4f1a\u7684\u524d\u7f00\u662f{0} +prefixShowAgain=\u60a8\u53ef\u4ee5\u968f\u65f6\u901a\u8fc7\u63d0\u53ca\u6211\u6765\u663e\u793a\u524d\u7f00\u3002 diff --git a/FredBoat/src/main/resources/lang/zh_TW.properties b/FredBoat/src/main/resources/lang/zh_TW.properties index 022ff0476..cd97eeb75 100644 --- a/FredBoat/src/main/resources/lang/zh_TW.properties +++ b/FredBoat/src/main/resources/lang/zh_TW.properties @@ -45,9 +45,9 @@ exportPlaylistFail=\u7121\u6cd5\u5c07\u64ad\u653e\u6e05\u55ae\u4e0a\u50b3\u81f3 listShowShuffled=\u76ee\u524d\u7684\u64ad\u653e\u5e8f\u5217\uff1a\n\n listShowRepeatSingle=\u91cd\u8907\u64ad\u653e\u76ee\u524d\u97f3\u8ecc listShowRepeatAll=\u91cd\u8907\u64ad\u653e\u76ee\u524d\u64ad\u653e\u5e8f\u5217 -listShowHistory=Musica +listShowHistory=\u986f\u793a\u6b77\u53f2\u64ad\u653e\u66f2\u76ee\u3002 listAddedBy=**{0}** \u7531 **{1}** `[{2}]` \u6dfb\u52a0 -listStreamsOnlySingle=\u5e8f\u5217\u4e2d\u6709 **{0}** \u500b\u53ca\u6642 {1} +listStreamsOnlySingle=\u5e8f\u5217\u4e2d\u6709 **{0}** \u500b\u5373\u6642 {1}\u3002 listStreamsOnlyMultiple=\u5e8f\u5217\u4e2d\u6709 **{0}** \u500b\u53ca\u6642 {1} listStreamsOrTracksSingle=\u5e8f\u5217\u4e2d\u76ee\u524d\u6709 **{0}** \u500b {1} \uff0c\u9577\u5ea6\u662f **[{2}]**{3} listStreamsOrTracksMultiple=\u5e8f\u5217\u4e2d\u76ee\u524d\u6709 **{0}** \u500b {1} \uff0c\u9577\u5ea6\u662f **[{2}]**{3} @@ -57,7 +57,7 @@ listAsWellAsLiveStreams=\uff0c\u4ee5\u53ca **{0}** \u500b\u53ca\u6642 {1} trackSingular=\u66f2\u76ee trackPlural=\u66f2\u76ee npNotPlaying=\u76ee\u524d\u6c92\u6709\u5728\u64ad\u653e\u4efb\u4f55\u6771\u897f -npNotInHistory=\#musica +npNotInHistory=\u76ee\u524d\u6b77\u53f2\u7d00\u9304\u6c92\u6709\u64ad\u653e\u66f2\u76ee\u3002 npDescription=\u63cf\u8ff0 npLoadedSoundcloud=[{0}/{1}]\n\n\u5df2\u5f9e Soundcloud \u4e2d\u8f09\u5165 npLoadedBandcamp={0} \n\n\u5df2\u5f9e Bandcamp \u4e2d\u8f09\u5165 @@ -75,11 +75,11 @@ npLoadedDefault={0}\n\n\u5df2\u5f9e {1} \u8f09\u5165 noneYet=\u6c92\u6771\u897f npRatingRange={0}/5 \u4f86\u81ea\u6295\u7968 {1} fwdSuccess=\u6b63\u5728\u5c07 **{0}** \u5feb\u8f49 {1}. -restartSuccess=**{0}** \u5df2\u5f9e\u65b0\u958b\u59cb +restartSuccess=**{0}** \u5df2\u91cd\u65b0\u958b\u59cb\u3002 queueEmpty=\u64ad\u653e\u5e8f\u5217\u662f\u7a7a\u7684 rewSuccess=\u6b63\u5728\u5c07 **{0}** \u5012\u5e36 {1} seekSuccess=\u6b63\u5728\u5c07 **{0}** \u79fb\u52d5\u5230 {1} -seekDeniedLiveTrack=\u4f60\u4e0d\u80fd\u79fb\u52d5\u73fe\u5834\u97f3\u8ecc\u3002 +seekDeniedLiveTrack=\u4f60\u4e0d\u80fd\u79fb\u52d5\u5373\u6642\u4e32\u6d41\u7684\u97f3\u8ecc\u3002 loadPlaySplitListFail=\u8a72\u9023\u7d50\u6307\u5411\u4e00\u500b\u64ad\u653e\u6e05\u55ae\uff0c\u4e0d\u662f\u4e00\u9996\u6b4c\u3002\u8acb\u4f7f\u7528 `;;play` loadListSuccess=\u5df2\u5f9e\u64ad\u653e\u6e05\u55ae **{1}** \u65b0\u589e `{0}` \u9996\u6b4c loadNoMatches=\u5728 `{0}` \u627e\u4e0d\u5230\u4efb\u4f55\u97f3\u8a0a @@ -184,9 +184,9 @@ ratelimitedSkipCommand=\u60a8\u53ef\u4ee5\u901a\u904e\u4f7f\u7528\u6b64\u547d\u4 ratelimitedGuildSlowLoadingPlaylist=\u6b64\u4f3a\u670d\u5668\u4e0d\u5141\u8a31\u5728\u6b64\u6642\u65b0\u589e\u66f4\u591a\u64ad\u653e\u6e05\u55ae\u3002\u8acb\u4e0d\u8981\u5237\u5f88\u9577\u7684\u64ad\u653e\u6e05\u55ae unblacklisted=\u5f9e\u9ed1\u540d\u55ae\u79fb\u9664 {0} serverinfoTitle=\u95dc\u65bc **{0}** \u7684\u8cc7\u8a0a -serverinfoOnlineUsers=\u5df2\u4e0a\u7dda\u7528\u6236\uff1a -serverinfoTotalUsers=\u7528\u6236\u7e3d\u6578\uff1a -serverinfoRoles=\u8077\u8cac\uff1a +serverinfoOnlineUsers=\u7dda\u4e0a\u4f7f\u7528\u8005\uff1a +serverinfoTotalUsers=\u4f7f\u7528\u8005\u7e3d\u6578\: +serverinfoRoles=\u8eab\u4efd\uff1a serverinfoText=\u6587\u5b57\u983b\u9053\uff1a serverinfoVoice=\u8a9e\u97f3\u983b\u9053\uff1a serverinfoGuildID=\u516c\u6703ID\: @@ -200,7 +200,7 @@ userinfoNick=\u66b1\u7a31\uff1a userinfoKnownServer=\u5df2\u77e5\u4f3a\u670d\u5668\uff1a userinfoJoinDate=\u52a0\u5165\u65e5\u671f\uff1a userinfoCreationTime=\u5efa\u7acb\u65e5\u671f\uff1a -userinfoBlacklisted="\u5df2\u5217\u5165\u9ed1\u540d\u55ae\: +userinfoBlacklisted=\u5df2\u5217\u5165\u9ed1\u540d\u55ae\: skipDeniedTooManyTracks=\u5982\u679c\u4f60\u4e0d\u662f DJ, \u4f60\u4e0d\u80fd\u8df3\u904e\u5225\u4eba\u7684\u66f2\u76ee\u3002\u8acb\u8003\u616e\u4f7f\u7528 Voteskip \u547d\u4ee4\u3002 eventUsersLeftVC=\u6240\u6709\u7528\u6236\u5df2\u7d93\u96e2\u958b\u4e86\u983b\u9053\uff0c\u64ad\u653e\u5668\u5df2\u7d93\u66ab\u505c eventAutoResumed=\u6aa2\u6e2c\u5230\u4f7f\u7528\u8005\u72c0\u614b, \u81ea\u52d5\u5fa9\u539f\u64ad\u653e\u6a5f\u3002 @@ -212,7 +212,11 @@ commandsMaintenance=\u7dad\u8b77 commandsBotOwner=Bot \u64c1\u6709\u8005 commandsMoreHelp=\u8aaa {0} \u4ee5\u7372\u5f97\u7279\u5b9a\u6307\u4ee4\u7684\u66f4\u591a\u8cc7\u8a0a helpUnknownCommand=\u672a\u77e5\u7684\u6307\u4ee4 -helpDM=\u6587\u6a94\u53ef\u4ee5\u5728\u4ee5\u4e0b\u4f4d\u5740\u627e\u5230\: HTTPs\://fredboat.com/docs \u8981\u5c07 fredboat \u6dfb\u52a0\u5230\u60a8\u7684\u4f3a\u670d\u5668\uff1f\u5982\u679c\u60a8\u6709\u7ba1\u7406\u884c\u6703\u7684\u4f3a\u670d\u5668\u8a31\u53ef\u6b0a, \u60a8\u53ef\u4ee5\u5728\u9019\u88e1\u9080\u8acb\u5b83\: * \u9019\u500b\u4e0d\u64ad\u653e\u97f3\u6a02 * \u5982\u679c\u60a8\u8981\u6dfb\u52a0\u97f3\u6a02 bot, \u60a8\u5c07\u5e0c\u671b\u9080\u8acb\u6b64 bot\: \u9700\u8981\u5e6b\u52a9\u6216\u5c0d bot \u6709\u4ec0\u9ebc\u60f3\u6cd5\uff1f\u4e5f\u8a31\u4f60\u53ea\u662f\u60f3\u51fa\u53bb\u73a9\uff1f\u5feb\u4f86 FredBoat \u7684\u4f4f\u8655\!{0} \u60a8\u4e0d\u80fd\u901a\u904e DM \u767c\u9001\u6b64 bot \u547d\u4ee4. Fre_d \u5275\u5efa\u7684 bot +helpDocsLocation=\u627e\u4e0d\u5230\u6587\u4ef6 +helpBotInvite=\u8981\u5c07 FredBoat \u6dfb\u52a0\u5230\u60a8\u7684\u4f3a\u670d\u5668\u55ce\uff1f\u5982\u679c\u60a8\u6709\u7ba1\u7406\u516c\u6703\u7684\u4f3a\u670d\u5668\u8a31\u53ef\u6b0a, \u60a8\u53ef\u4ee5\u9080\u8acb FredBoat\: +helpHangoutInvite=\u9700\u8981\u5e6b\u52a9\u6216\u6709\u4efb\u4f55\u60f3\u6cd5\u7684 FredBoat\uff1f\u4e5f\u8a31\u4f60\u53ea\u662f\u60f3\u51fa\u53bb\u73a9\uff1f\u52a0\u5165 FredBoat \u793e\u5340\! +helpNoDmCommands=\u60a8\u4e0d\u80fd\u901a\u904e DMs \u767c\u9001 FredBoat \u547d\u4ee4\u3002 +helpCredits=\u7531 Fre_d \u548c\u958b\u6e90\u8ca2\u737b\u8005\u5275\u5efa helpSent=\u6587\u4ef6\u5df2\u7d93\u79c1\u8a0a\u7d66\u4f60 helpProperUsage=\u6b63\u78ba\u7528\u6cd5\: helpCommandOwnerRestricted=\u6b64\u6307\u4ee4\u53ea\u9650Bot\u7684\u64c1\u6709\u8005\u4f7f\u7528 @@ -257,7 +261,7 @@ helpSayCommand=\u8b93 Bot \u91cd\u8907\u60a8\u8aaa\u7684\u5b57 helpServerInfoCommand=\u986f\u793a\u6b64\u516c\u6703\u7684\u4e00\u4e9b\u72c0\u614b helpUserInfoCommand=\u986f\u793a\u95dc\u65bc\u60a8\u81ea\u5df1\u6216\u5df2\u77e5Bot\u4f7f\u7528\u8005\u7684\u8cc7\u8a0a helpPerms=\u5141\u8a31{0} \u79e9\u7684\u540d\u55ae\u6210\u54e1\u548c\u89d2\u8272\u3002 -helpPrefixCommand=Set the prefix for this guild. +helpPrefixCommand=\u8a2d\u7f6e\u8a72\u884c\u6703\u7684\u9996\u78bc\u3002 helpVoteSkip=\u6295\u7968\u8df3\u904e\u7576\u524d\u7684\u6b4c\u66f2\u3002\u9700\u898150% \u7684\u6240\u6709\u4f7f\u7528\u8005\u5728\u8a9e\u97f3\u804a\u5929\u4e2d\u6295\u7968\u3002 helpMathOperationAdd=\u5217\u5370 num1 \u548c num2 \u7684\u7e3d\u548c\u3002 helpMathOperationSub=\u5217\u5370\u5f9e num1 \u4e2d\u6e1b\u53bb num2 \u7684\u5dee\u7570\u3002 @@ -295,7 +299,7 @@ voteSkipEmbedVoters={0} \u51fa\u4e86{1} \u5df2\u7d93\u6295\u7968\u8df3\u904e\u75 mathOperationResult=\u7d50\u679c\u662f mathOperationDivisionByZeroError=\u4e0d\u80fd\u9664\u4ee5 0\u3002 mathOperationInfinity=\u6578\u5b57\u904e\u5927\u7121\u6cd5\u986f\u793a\! -prefix=Prefix -prefixGuild=The prefix for this guild is {0} -prefixShowAgain=You can show the prefix anytime again by mentioning me. +prefix=\u9996\u78bc +prefixGuild=\u9019\u500b\u516c\u6703\u7684\u9996\u78bc\u662f{0} +prefixShowAgain=\u60a8\u53ef\u4ee5\u96a8\u6642\u901a\u904e\u63d0\u53ca\u6211\u4f86\u986f\u793a\u9996\u78bc\u3002 diff --git a/FredBoat/src/main/resources/logback.xml b/FredBoat/src/main/resources/logback.xml index 516f443a4..11ea18cbc 100644 --- a/FredBoat/src/main/resources/logback.xml +++ b/FredBoat/src/main/resources/logback.xml @@ -34,7 +34,7 @@ 30 - [%date{HH:mm:ss}] [ %-5level] [%logger{0}] %msg%n + [%date{HH:mm:ss}] [ %-5level] [%mdc] [%logger{0}] %msg%n @@ -48,7 +48,7 @@ 5 - [%d] [ %-5level] [%thread] %logger{35}: %msg%n + [%d] [ %-5level] [%mdc] [%thread] %logger{35}: %msg%n @@ -62,7 +62,7 @@ 30 - [%date{HH:mm:ss}] [%thread] [%logger{0}] %msg%n + [%date{HH:mm:ss}] [%mdc] [%thread] [%logger{0}] %msg%n @@ -85,7 +85,7 @@ INFO - [%date{HH:mm:ss}] [ %-5level] [%logger{0}] %msg%n + [%date{HH:mm:ss}] [ %-5level] [%mdc] [%logger{0}] %msg%n diff --git a/FredBoat/src/main/resources/natives/darwin/libudpqueue.dylib b/FredBoat/src/main/resources/natives/darwin/libudpqueue.dylib new file mode 100755 index 000000000..f1ef2e399 Binary files /dev/null and b/FredBoat/src/main/resources/natives/darwin/libudpqueue.dylib differ diff --git a/FredBoat/src/test/java/fredboat/util/TextUtilsTest.java b/FredBoat/src/test/java/fredboat/util/TextUtilsTest.java new file mode 100644 index 000000000..3b4b1f78f --- /dev/null +++ b/FredBoat/src/test/java/fredboat/util/TextUtilsTest.java @@ -0,0 +1,68 @@ +package fredboat.util; + +import org.junit.jupiter.api.*; + +import java.util.Arrays; +import java.util.Collection; +import java.util.List; +import java.util.stream.Stream; + +class TextUtilsTest { + + private final List one_two_three = Arrays.asList(1, 2, 3); + + @TestFactory + Stream simpleSplitSelect() { + String[] testCases = { + "1,2,3", + "1 2 3", + "1, 2, 3", + }; + + return DynamicTest.stream(Arrays.asList(testCases).iterator(), + testCase -> String.format("split select of `%s`", testCase), + testCase -> assertSplitSelect(one_two_three, testCase) + ); + } + + @Test + void blanksInSplitSelect() { + assertSplitSelect( + Arrays.asList(1, 2, 3, 4), + "1, ,2 ,, 3, 4"); + } + + @TestFactory + Stream nonDigitsInSplitSelect() { + return Stream.concat( + DynamicTest.stream(Arrays.asList( + "1q 2 3", + "1q 2what 3" + ).iterator(), + testCase -> String.format("split select of `%s`", testCase), + testCase -> assertSplitSelect(one_two_three, testCase)), + + DynamicTest.stream(Arrays.asList( + "q", + "We are number 1 but this string doesn't match", + "1, 2, 3, 4, 5 Once we caught a fish alive" + ).iterator(), + testCase -> String.format("not matching split select of `%s`", testCase), + testCase -> assertNoSplitSelect(testCase) + ) + ); + } + + private void assertSplitSelect(Collection expected, String testCase) { + Assertions.assertTrue( + TextUtils.isSplitSelect(testCase), + () -> String.format("`%s` is not a split select", testCase)); + Assertions.assertIterableEquals( + expected, TextUtils.getSplitSelect(testCase) + ); + } + + private void assertNoSplitSelect(String testCase) { + Assertions.assertFalse(TextUtils.isSplitSelect(testCase)); + } +} diff --git a/README.md b/README.md index 6da833d81..484a83176 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![FredBoat](https://fred.moe/YY1.png) -# FredBoat [![Build Status](https://travis-ci.org/Frederikam/FredBoat.svg?branch=master)](https://travis-ci.org/Frederikam/FredBoat) [![Crowdin](https://d322cqt584bo4o.cloudfront.net/fredboat/localized.svg)](https://crowdin.com/project/fredboat) [![Twitter Follow](https://img.shields.io/twitter/follow/DiscordFredBoat.svg?style=social&label=Follow)]() [![Dependency Status](https://www.versioneye.com/user/projects/59ff43de15f0d72f79c07210/badge.svg?style=flat-square)](https://www.versioneye.com/user/projects/59ff43de15f0d72f79c07210) +# FredBoat [![Build Status](https://travis-ci.org/Frederikam/FredBoat.svg?branch=master)](https://travis-ci.org/Frederikam/FredBoat) [![Crowdin](https://d322cqt584bo4o.cloudfront.net/fredboat/localized.svg)](https://crowdin.com/project/fredboat) [![Twitter Follow](https://img.shields.io/twitter/follow/DiscordFredBoat.svg?style=social&label=Follow)]() FredBoat is a bot that has various features, but most notably is that it can play music. Pull requests are welcome and please report any issues you find in [issues](https://github.com/Frederikam/FredBoat/issues). FredBoat is licensed under the MIT license, so feel free to copy small or large parts of the code here without having to ask. I would love to see what you can create with it! @@ -8,9 +8,9 @@ FredBoat is licensed under the MIT license, so feel free to copy small or large [![Join FredBoat Hangout](https://discordapp.com/api/guilds/174820236481134592/embed.png?style=banner2)](https://discord.gg/cgPFW4q) ## Documentation -Help can be found at https://fredboat.com/docs +Help can be found at [https://fredboat.com/docs](https://fredboat.com/docs). -For installation instructions, go to https://fredboat.com/docs/selfhosting +For installation instructions, go to [https://fredboat.com/docs/selfhosting](https://fredboat.com/docs/selfhosting). ## Contributing If you are interested, you can read about contributing to this project [here](https://github.com/Frederikam/FredBoat/blob/master/CONTRIBUTING.md). diff --git a/Shared/src/main/java/fredboat/shared/constant/BotConstants.java b/Shared/src/main/java/fredboat/shared/constant/BotConstants.java index d08ff5035..655c9dc4a 100644 --- a/Shared/src/main/java/fredboat/shared/constant/BotConstants.java +++ b/Shared/src/main/java/fredboat/shared/constant/BotConstants.java @@ -29,12 +29,12 @@ public class BotConstants { - public static final String MUSIC_BOT_ID = "184405311681986560"; - public static final String BETA_BOT_ID = "152691313123393536"; - public static final String MAIN_BOT_ID = "150376112944447488"; - public static final String PATRON_BOT_ID = "241950106125860865"; + public static final long MUSIC_BOT_ID = 184405311681986560L; + public static final long BETA_BOT_ID = 152691313123393536L; + public static final long MAIN_BOT_ID = 150376112944447488L; + public static final long PATRON_BOT_ID = 241950106125860865L; - public static final String FREDBOAT_HANGOUT_ID = "174820236481134592"; + public static final long FREDBOAT_HANGOUT_ID = 174820236481134592L; public static final Color FREDBOAT_COLOR = new Color(28, 191, 226); //#1CBFE2 public static final String FREDBOAT_URL = "https://fredboat.com"; @@ -42,6 +42,10 @@ public class BotConstants { public static final String DOCS_PERMISSIONS_URL = DOCS_URL + "/permissions"; public static final String DOCS_DONATE_URL = DOCS_URL + "/donate"; + //These can be set using eval in case we need to change it in the future ~Fre_d + public static String hangoutInvite = "https://discord.gg/cgPFW4q"; + public static String botInvite = "https://goo.gl/cFs5M9"; + private BotConstants() { } diff --git a/docker-compose.yml b/docker-compose.yml index 0c7702c8d..948fd2acd 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -19,7 +19,7 @@ services: ################################################################################ db: image: fredboat/postgres - restart: on-failure:3 + restart: always # WINDOWS ONLY: if you are running under windows you need to comment out the following two lines: volumes: