Default localization strings

Be sure to read the Localization Guide for information on how localization templates and template scripting work

When translating these strings for your own localizations remember that it's not necessary to place them all into a single file. You can separate them into multiple files and they will all be loaded and merged together into a single set of strings for one language as long as they all have the same language name as the first part of the file name. For example, you could separate strings used in two separate commands into files en_us.cmd.foo.lang and en_us.cmd.bar.lang.

Note: Anything after the language name and before .lang in a lang file's filename is not used for anything and can simply be used as a distinction between different lang files for the same language.

This list is automatically generated and may be incomplete during development until YAMDBF 3.0.0 is finalized.

[CMD_BLACKLIST_ERR_NOSELF]
You can not blacklist your own account.

[CMD_BLACKLIST_ERR_NOBOT]
Bots cannot call commands and thus do not need to be blacklisted.

[CMD_BLACKLIST_ERR_OWNERONLY]
Only bot owners may blacklist globally.

[CMD_BLACKLIST_ERR_ALREADYGLOBAL]
That user is already globally blacklisted.

[CMD_BLACKLIST_ERR_BADTARGET]
You may not use this command on that person.

[CMD_BLACKLIST_ERR_ALREADYBLACKLISTED]
That user is already blacklisted in this server.

[CMD_BLACKLIST_GLOBALSUCCESS]
Added {{ user }} to the global blacklist.

[CMD_BLACKLIST_SUCCESS]
Added {{ user }} to the blacklist for this server.

[CMD_WHITELIST_ERR_OWNERONLY]
Only bot owners may remove a user from the global blacklist.

[CMD_WHITELIST_ERR_NOTGLOBAL]
That user is not currently on the global blacklist.

[CMD_WHITELIST_ERR_NOTBLACKLISTED]
That user is not currently blacklisted in this server.

[CMD_WHITELIST_GLOBALSUCCESS]
Removed {{ user }} from the global blacklist.

[CMD_WHITELIST_SUCCESS]
Removed {{ user }} from the blacklist for this server.

[CMD_EVAL_ERR_NOCODE]
**ERROR:**
```xl
No code provided to evaluate.
```

[CMD_EVAL_RESULT]
**INPUT:**
```js
{{ code }}
```
**OUTPUT:**
```xl
{{ result }}
```

[CMD_EVAL_ERROR]
**INPUT:**
```js
{{ code }}
```
**ERROR:**
```xl
{{ error }}
```

[CMD_EVAL_ERR_OUTPUT_LENGTH]
The output was too long and has been attached as a file

[CMD_EVAL_ERR_OUTPUT_LENGTH_FAIL_FILESIZE]
The output was too long but the output file failed
to upload because file size exceeded 10 MB ({{ size }})

[CMD_EVAL_ERR_OUTPUT_LENGTH_FAIL_UNKNOWN]
The output was too long but the output file failed
to upload for an unknown reason

[CMD_EVAL_ERR_MISSING_TS]
Missing TypeScript dependency. Install TypeScript or disable this command

[CMD_GROUPS_LIST]
## <groups: string[], info: string[], disabledGroups: string[]>
**Command groups:** (Groups marked with ***** are disabled)
```ldif
{{!
    function padRight(text, length)
    {
        let pad = Math.max(0, Math.min(length, length - text.length));
        return `${text}${' '.repeat(pad)}`;
    }

    let { groups, info, disabledGroups: disabled } = args;

    let widest = groups
        .map(g => g.length)
        .reduce((a, b) => Math.max(a, b));

    let combined = [];
    for (const group in groups) combined.push([groups[group], info[group]]);

    return combined
        .map(c => `${padRight(c[0], widest + 1)}${disabled.includes(c[0]) ? '*' : ' '}: ${c[1]}`)
        .join('\n');
!}}
```

[CMD_GROUPS_ERR_NOEXIST]
Command group "{{ group }}" does not exist.

[CMD_GROUPS_ERR_ENABLED]
Command group "{{ group }}" is already enabled.

[CMD_GROUPS_ENABLE_SUCCESS]
**Enabled command group "{{ group }}"**

[CMD_GROUPS_ERR_DISABLED]
Command group "{{ group }}" is already disabled or is not allowed to be disabled.

[CMD_GROUPS_DISABLE_SUCCESS]
**Disabled command group "{{ group }}"**

[CMD_HELP_COMMAND_LIST]
##! <namesOnly?: boolean, isGuild: boolean, commandList: string[], shortcuts: string[], usage: string, mentionUsage: string>
Available commands: (Commands marked with `*` are server-only)
```ldif
{{!
    if (args.namesOnly)
    {
        let list = '';
        for (let i = 0; i < args.commandList.length; i++)
        {
            list += args.commandList[i];
            if ((i + 1) % 3 === 0) list += '\n';        
        }
        return list;
    }
    else return args.commandList.join('\n');
!}}{{!
    if (args.isGuild && args.shortcuts.length > 0)
        return `\`\`\`Available shortcuts:\n\`\`\`ldif\n${args.shortcuts.join(', ')}\n`;
!}}
## A newline after the end of this codeblock gives
## weird spacing between it and the last line.
## I don't recommend using one
```Use `{{ usage }}` or `{{ mentionUsage }}` for more info

[CMD_HELP_UNKNOWN_COMMAND]
A command by that name could not be found or you do
not have permission to view it.

[CMD_HELP_SERVERONLY]
[Server Only]

[CMD_HELP_OWNERONLY]
[Owner Only]

[CMD_HELP_ALIASES]
##! <aliases: string[]>
## outputs: 'Aliases: foo, bar' | 'Alias: foo'
{{! args.aliases.length > 1 ? 'Aliases' : 'Alias' !}}: {{! args.aliases.join(', ') !}}

[CMD_HELP_CODEBLOCK]
## I feel ldif is the best codeblock language for
## displaying all of the help commands but it could
## be changed without any consequence if desired
```ldif
{{ serverOnly ?}}
{{ ownerOnly ?}}
Command: {{ commandName }}
Description: {{ desc }}
{{ aliasText ?}}
Usage: {{ usage }}
{{ info ?}}
```

[CMD_HELP_REPLY_CMD]
Sent you a DM with command help information.

[CMD_HELP_REPLY_ALL]
Sent you a DM with a list of commands.

[CMD_HELP_REPLY_FAIL]
Failed to DM help information. Do you have DMs blocked?

[CMD_LIMIT_ERR_INVALID_GROUP]
Cannot limit base commands.

[CMD_LIMIT_ERR_INVALID_ROLE]
Failed to find {{!
    args.invalidRoles.split(',').length > 1 ? 'roles' : 'role'
!}}: {{ invalidRoles }}

[CMD_LIMIT_ERR_NO_ROLES]
Failed to add any roles to the command.

[CMD_LIMIT_SUCCESS]
Successfully added {{!
    args.roles.split(',').length > 1 ? 'roles' : 'role'
!}}: {{ roles }} to the limiter for command: `{{ commandName }}`

[CMD_LIMIT_CLEAR_SUCCESS]
Successfully cleared role limits for command: `{{ commandName }}`

[CMD_RELOAD_SUCCESS]
Reloaded {{ commandNumber }} command{{!
    parseInt(args.commandNumber) === 1 ? '' : 's'
!}}. ({{ commandTime }} ms)
Reloaded {{ eventNumber }} event{{!
    parseInt(args.eventNumber) === 1 ? '' : 's'
!}}. ({{ eventTime }} ms)
Check the logger for relevant information.

[CMD_SETLANG_LIST]
Available languages: (Language marked with `*` is the current language)
```css
{{ langList }}
## Be sure to preserve the `{{ prefix }}setlang #` part
```Use `{{ prefix }}setlang #`, where `#` is the number of the language to set the
language to use for this server

[CMD_SETLANG_ERR_INVALID]
That is not a valid language choice!

[CMD_SETLANG_SUCCESS]
Set language for this server to: `{{ lang }}`

[CMD_PREFIX_CURRENT]
{{!
    args.prefix ?
        `Current prefix is \`${args.prefix}\`` :
        'There is currently no prefix.'
!}}

[CMD_PREFIX_ERR_CHAR_LIMIT]
Prefixes may only be up to 10 chars in length.

[CMD_PREFIX_ERR_INVALID_CHARS]
Prefixes may not contain backticks or backslashes.

[CMD_PREFIX_SUCCESS]
{{!
    args.prefix === '' ?
        'Command prefix removed.' :
        `Command prefix set to \`${args.prefix}\``
!}}

[CMD_SHORTCUTS_LIST]
List of command shortcuts:
```ldif
{{ names }}
```

[CMD_SHORTCUTS_SET_SUCCESS]
Set shortcut **"{{ name }}"** with content: 
```md
{{ content }}
```

[CMD_SHORTCUTS_GET_CONTENT]
Shortcut **"{{ name }}"** content:
```md
{{ content }}
```

[CMD_SHORTCUTS_REMOVE_SUCCESS]
Removed shortcut **"{{ name }}"**.

[CMD_SHORTCUTS_ERR_NO_SHORTCUTS]
Error: This server has no configured command shortcuts.

[CMD_SHORTCUTS_ERR_MISSING]
Error: A shortcut called **"{{ name }}"** does not exist.

[CMD_SHORTCUTS_ERR_SET_LENGTH]
Error: Shortcut content is limited to 500 characters.

[CMD_SHORTCUTS_ERR_MAX_SHORTCUTS]
Error: Servers may only have up to 50 command shortcuts.

[DISPATCHER_ERR_RATELIMIT_EXCEED_GLOBAL]
You have used too many commands and may not use any more for **{{ time }}**.

[DISPATCHER_ERR_RATELIMIT_EXCEED]
You have used this command too many times and may not use it again for **{{ time }}**.

[DISPATCHER_ERR_INVALID_SHORTCUT]
Error: Shortcut **"{{ name }}"** does not map to a valid command.

[DISPATCHER_ERR_UNKNOWN_COMMAND]
Sorry, I could not recognize any command in your message.
Try saying "help" to view a list of commands.

[DISPATCHER_ERR_GUILD_ONLY]
That command is for servers only. Try saying "help" to view a list of commands.

[DISPATCHER_ERR_MISSING_CLIENT_PERMISSIONS]
**I must be given the following permission{{!
    args.missing.split(', ').length > 1 ? 's' : ''
!}} for that command to be usable in this channel:**
```css
{{ missing }}
```

[DISPATCHER_ERR_MISSING_CALLER_PERMISSIONS]
**You are missing the following permission{{!
    args.missing.split(', ').length > 1 ? 's' : ''
!}} for that command:**
```css
{{ missing }}
```

[DISPATCHER_ERR_MISSING_ROLES]
## This message is used for the missing roles error
## and for failing to pass the command limiter
**You must have {{!
    args.roles.split(', ').length > 1
        ? 'one of the following roles'
        : 'the following role'
!}} to use that command:**
```css
{{ roles }}
```

[DISPATCHER_ERR_COMMAND_LOCKED]
This command is currently busy.

[EXPECT_ERR_MISSING_VALUE]
Missing or null value for arg: `{{ name }}`{{!
    args.type.split(', ').length > 1
        ? `\nExpected one of: ${args.type}`
        : `, expected ${args.type}`
!}}
Usage: `{{ usage }}`

[EXPECT_ERR_INVALID_OPTION]
## Using the `CLEAN_ARG` template script from from
## the `resolve` middleware string definitions
in arg `{{ name }}`: `{{! res.CLEAN_ARG() !}}` is not a valid option
Usage: `{{ usage }}`
Valid options for arg `{{ name }}`: {{ type }}

[EXPECT_ERR_EXPECTED_TYPE]
## This is a developer error message and does
## not need to be translated. I have only extracted
## this string for ease of re-use as it is used a lot
in arg `{{ name }}`: `{{ expected }}` expected, got `{{ type }}`

[RESOLVE_TYPE]
## Only translate the string return values here
## Also don't do anything with the default return
{{!
    switch (args.type)
    {
        case 'Command': return 'command';
        case 'CommandGroup': return 'command group';
        case 'User': return 'user';
        case 'Member': return 'member';
        case 'BannedUser': return 'banned user';
        case 'Channel': return 'channel';
        case 'Role': return 'role';
        case 'String': return 'string';
        case 'Number': return 'number';
        case 'Duration': return 'duration';
        default: return args.type;
    }
!}}

[CLEAN_ARG]
## Simple template script to truncate long input `args.arg`,
## and overcompensate for URL escaping with an abundance of
## zero-width spaces without having to fuss with URL parsing/regex
## because who wants to bother with that?
##
## Returns the modified value of `args.arg`
{{!
    let { arg } = args;
    if (arg.length > 50) arg = arg.slice(0, 47) + '...';
    return arg.split('').join('\u200b');
!}}

[RESOLVE_ERR_RESOLVE_BOOLEAN]
in arg `{{ name }}`: `{{! res.CLEAN_ARG() !}}` could not be resolved to a boolean.
Usage: `{{ usage }}`
Boolean examples: `true`, `on`, `yes`, `false`, `off`, `no`

[RESOLVE_ERR_RESOLVE_NUMBER]
in arg `{{ name }}`: `{{! res.CLEAN_ARG() !}}` could not be resolved to a number.
Usage: `{{ usage }}`

[RESOLVE_ERR_RESOLVE_DURATION]
in arg `{{ name }}`: `{{! res.CLEAN_ARG() !}}` could not be resolved to a duration.
Usage: `{{ usage }}`
Duration examples: `10m`, `2h`, `1.5d`

[RESOLVE_ERR_RESOLVE_TYPE_ID]
in arg `{{ name }}`: Failed to find a {{! res.RESOLVE_TYPE() !}} with ID `{{ arg }}`
Usage: `{{ usage }}`

[RESOLVE_ERR_RESOLVE_TYPE_TEXT]
in arg `{{ name }}`: Failed to find a {{! res.RESOLVE_TYPE() !}} containing the text `{{! res.CLEAN_ARG() !}}`
Usage: `{{ usage }}`

[RESOLVE_ERR_MULTIPLE_USER_RESULTS]
Found multiple potential matches for arg `{{ name }}`:
{{!
    const users = args.users.split(', ');
    if (users.length > 5)
    {
        const slice = users.slice(0, 5);
        return `${slice.join(', ')}, plus ${users.length - slice.length} more.`
    }
    else return users.join(', ');
!}}
Please refine your search or consider using an ID/mention
Usage: `{{ usage }}`

[RESOLVE_ERR_MULTIPLE_CHANNEL_RESULTS]
Found multiple potential matches for arg `{{ name }}`:
{{!
    const channels = args.channels.split(', ');
    if (channels.length > 5)
    {
        const slice = channels.slice(0, 5);
        return `${slice.join(', ')}, plus ${channels.length - slice.length} more.`
    }
    else return channels.join(', ');
!}}
Please refine your search or consider using an ID/channel link
Usage: `{{ usage }}`

[RESOLVE_ERR_MULTIPLE_ROLE_RESULTS]
Found multiple potential matches for arg `{{ name }}`:
{{!
    const roles = args.roles.split(', ');
    if (roles.length > 5)
    {
        const slice = roles.slice(0, 5);
        return `${slice.join(', ')}, plus ${roles.length - slice.length} more.`
    }
    else return roles.join(', ');
!}}
Please refine your search or consider using an ID/role mention
Usage: `{{ usage }}`