Merge branch 'master' into pre-release-cleanup
# Conflicts: # pom.xml # src/test/java/fr/xephi/authme/service/GeoIpServiceTest.java # src/test/java/fr/xephi/authme/service/ValidationServiceTest.java
This commit is contained in:
commit
c880298e5d
2
.github/dependabot.yml
vendored
2
.github/dependabot.yml
vendored
@ -10,3 +10,5 @@ updates:
|
||||
- dependency-name: com.google.guava:guava
|
||||
- dependency-name: org.apache.logging.log4j:log4j-core
|
||||
- dependency-name: com.zaxxer:HikariCP
|
||||
- dependency-name: "org.mockito:mockito-core" # Mockito 5 requires Java 11
|
||||
versions: ">= 5"
|
||||
|
||||
@ -403,6 +403,8 @@ Protection:
|
||||
# Apply the protection also to registered usernames
|
||||
enableProtectionRegistered: true
|
||||
geoIpDatabase:
|
||||
# Enable GeoIp database
|
||||
enabled: true
|
||||
# The MaxMind clientId used to download the GeoIp database,
|
||||
# get one at https://www.maxmind.com/en/accounts/current/license-key
|
||||
# The EssentialsX project has a very useful tutorial on how to generate
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
<!-- AUTO-GENERATED FILE! Do not edit this directly -->
|
||||
<!-- File auto-generated on Sun Apr 04 21:31:44 CEST 2021. See docs/translations/translations.tpl.md -->
|
||||
<!-- File auto-generated on Wed Jun 21 12:14:29 CEST 2023. See docs/translations/translations.tpl.md -->
|
||||
|
||||
# AuthMe Translations
|
||||
The following translations are available in AuthMe. Set `messagesLanguage` to the language code
|
||||
@ -22,10 +22,11 @@ Code | Language | Translated |
|
||||
[hu](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_hu.yml) | Hungarian | 99% | <img src="https://via.placeholder.com/99x7/66ee55?text=%20" alt="99" />
|
||||
[id](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_id.yml) | Indonesian | 93% | <img src="https://via.placeholder.com/93x7/77dd44?text=%20" alt="93" />
|
||||
[it](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_it.yml) | Italian | 100% | <img src="https://via.placeholder.com/100x7/66ff66?text=%20" alt="100" />
|
||||
[ja](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_ja.yml) | Japanese | 100% | <img src="https://via.placeholder.com/100x7/66ff66?text=%20" alt="100" />
|
||||
[ko](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_ko.yml) | Korean | 99% | <img src="https://via.placeholder.com/99x7/66ee55?text=%20" alt="99" />
|
||||
[lt](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_lt.yml) | Lithuanian | 36% | <img src="https://via.placeholder.com/36x7/aa4400?text=%20" alt="36" />
|
||||
[lt](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_lt.yml) | Lithuanian | 100% | <img src="https://via.placeholder.com/100x7/66ff66?text=%20" alt="100" />
|
||||
[nl](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_nl.yml) | Dutch | 100% | <img src="https://via.placeholder.com/100x7/66ff66?text=%20" alt="100" />
|
||||
[pl](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_pl.yml) | Polish | 99% | <img src="https://via.placeholder.com/99x7/66ee55?text=%20" alt="99" />
|
||||
[pl](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_pl.yml) | Polish | 100% | <img src="https://via.placeholder.com/100x7/66ff66?text=%20" alt="100" />
|
||||
[pt](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_pt.yml) | Portuguese | 100% | <img src="https://via.placeholder.com/100x7/66ff66?text=%20" alt="100" />
|
||||
[ro](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_ro.yml) | Romanian | 100% | <img src="https://via.placeholder.com/100x7/66ff66?text=%20" alt="100" />
|
||||
[ru](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_ru.yml) | Russian | 100% | <img src="https://via.placeholder.com/100x7/66ff66?text=%20" alt="100" />
|
||||
@ -34,13 +35,13 @@ Code | Language | Translated |
|
||||
[sr](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_sr.yml) | Serbian | 99% | <img src="https://via.placeholder.com/99x7/66ee55?text=%20" alt="99" />
|
||||
[tr](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_tr.yml) | Turkish | 100% | <img src="https://via.placeholder.com/100x7/66ff66?text=%20" alt="100" />
|
||||
[uk](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_uk.yml) | Ukrainian | 100% | <img src="https://via.placeholder.com/100x7/66ff66?text=%20" alt="100" />
|
||||
[vn](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_vn.yml) | Vietnamese | 77% | <img src="https://via.placeholder.com/77x7/bb9900?text=%20" alt="77" />
|
||||
[vn](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_vn.yml) | Vietnamese | 100% | <img src="https://via.placeholder.com/100x7/66ff66?text=%20" alt="100" />
|
||||
[zhcn](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_zhcn.yml) | Chinese (China) | 100% | <img src="https://via.placeholder.com/100x7/66ff66?text=%20" alt="100" />
|
||||
[zhhk](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_zhhk.yml) | Chinese (Hong Kong) | 99% | <img src="https://via.placeholder.com/99x7/66ee55?text=%20" alt="99" />
|
||||
[zhmc](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_zhmc.yml) | Chinese (Macau) | 64% | <img src="https://via.placeholder.com/64x7/bb7700?text=%20" alt="64" />
|
||||
[zhtw](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_zhtw.yml) | Chinese (Taiwan) | 86% | <img src="https://via.placeholder.com/86x7/99bb22?text=%20" alt="86" />
|
||||
[zhtw](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_zhtw.yml) | Chinese (Taiwan) | 100% | <img src="https://via.placeholder.com/100x7/66ff66?text=%20" alt="100" />
|
||||
|
||||
|
||||
---
|
||||
|
||||
This page was automatically generated on the [AuthMe/AuthMeReloaded repository](https://github.com/AuthMe/AuthMeReloaded/tree/master/docs/) on Sun Apr 04 21:31:44 CEST 2021
|
||||
This page was automatically generated on the [AuthMe/AuthMeReloaded repository](https://github.com/AuthMe/AuthMeReloaded/tree/master/docs/) on Wed Jun 21 12:14:29 CEST 2023
|
||||
|
||||
2
pom.xml
2
pom.xml
@ -78,7 +78,7 @@
|
||||
<pluginDescription.name>${project.outputName}</pluginDescription.name>
|
||||
<pluginDescription.version>${project.versionCode}</pluginDescription.version>
|
||||
<pluginDescription.main>${project.groupId}.${project.artifactId}.${pluginDescription.name}</pluginDescription.main>
|
||||
<pluginDescription.authors>sgdc3, ljacqu, games647, Hex3l, krusic22</pluginDescription.authors>
|
||||
<pluginDescription.authors>sgdc3, games647, Hex3l, krusic22</pluginDescription.authors>
|
||||
|
||||
<!-- Java libraries -->
|
||||
<dependencies.injector.version>1.0</dependencies.injector.version>
|
||||
|
||||
@ -226,8 +226,8 @@ public class CommandDescription {
|
||||
*/
|
||||
public CommandDescription build() {
|
||||
checkArgument(!Utils.isCollectionEmpty(labels), "Labels may not be empty");
|
||||
checkArgument(!StringUtils.isEmpty(description), "Description may not be empty");
|
||||
checkArgument(!StringUtils.isEmpty(detailedDescription), "Detailed description may not be empty");
|
||||
checkArgument(!StringUtils.isBlank(description), "Description may not be empty");
|
||||
checkArgument(!StringUtils.isBlank(detailedDescription), "Detailed description may not be empty");
|
||||
checkArgument(executableCommand != null, "Executable command must be set");
|
||||
// parents and permissions may be null; arguments may be empty
|
||||
|
||||
|
||||
@ -131,7 +131,7 @@ public class CommandHandler {
|
||||
private static List<String> skipEmptyArguments(String[] args) {
|
||||
List<String> cleanArguments = new ArrayList<>();
|
||||
for (String argument : args) {
|
||||
if (!StringUtils.isEmpty(argument)) {
|
||||
if (!StringUtils.isBlank(argument)) {
|
||||
cleanArguments.add(argument);
|
||||
}
|
||||
}
|
||||
|
||||
@ -89,7 +89,7 @@ class PlayerAuthViewer implements DebugSection {
|
||||
* or empty string if the string is null or empty
|
||||
*/
|
||||
private static String safeSubstring(String str, int length) {
|
||||
if (StringUtils.isEmpty(str)) {
|
||||
if (StringUtils.isBlank(str)) {
|
||||
return "";
|
||||
} else if (str.length() < length) {
|
||||
return str.substring(0, str.length() / 2) + "...";
|
||||
|
||||
@ -160,7 +160,7 @@ public class OnJoinVerifier implements Reloadable {
|
||||
if (auth != null && settings.getProperty(RegistrationSettings.PREVENT_OTHER_CASE)) {
|
||||
String realName = auth.getRealName(); // might be null or "Player"
|
||||
|
||||
if (StringUtils.isEmpty(realName) || "Player".equals(realName)) {
|
||||
if (StringUtils.isBlank(realName) || "Player".equals(realName)) {
|
||||
dataSource.updateRealName(connectingName.toLowerCase(Locale.ROOT), connectingName);
|
||||
} else if (!realName.equals(connectingName)) {
|
||||
throw new FailedVerificationException(MessageKey.INVALID_NAME_CASE, realName, connectingName);
|
||||
|
||||
@ -51,11 +51,11 @@ public class SendMailSsl {
|
||||
* @throws EmailException if the mail is invalid
|
||||
*/
|
||||
public HtmlEmail initializeMail(String emailAddress) throws EmailException {
|
||||
String senderMail = StringUtils.isEmpty(settings.getProperty(EmailSettings.MAIL_ADDRESS))
|
||||
String senderMail = StringUtils.isBlank(settings.getProperty(EmailSettings.MAIL_ADDRESS))
|
||||
? settings.getProperty(EmailSettings.MAIL_ACCOUNT)
|
||||
: settings.getProperty(EmailSettings.MAIL_ADDRESS);
|
||||
|
||||
String senderName = StringUtils.isEmpty(settings.getProperty(EmailSettings.MAIL_SENDER_NAME))
|
||||
String senderName = StringUtils.isBlank(settings.getProperty(EmailSettings.MAIL_SENDER_NAME))
|
||||
? senderMail
|
||||
: settings.getProperty(EmailSettings.MAIL_SENDER_NAME);
|
||||
String mailPassword = settings.getProperty(EmailSettings.MAIL_PASSWORD);
|
||||
|
||||
@ -36,4 +36,12 @@ public class MigraterYamlFileResource extends YamlFileResource {
|
||||
}
|
||||
return singleQuoteYaml;
|
||||
}
|
||||
|
||||
// Because we set the YAML object to put strings in single quotes, this method by default uses that YAML object
|
||||
// and also puts all paths as single quotes. Override to just always return the same string since we know those
|
||||
// are only message names (so never any conflicting strings like "true" or "0").
|
||||
@Override
|
||||
protected String escapePathElementIfNeeded(String path) {
|
||||
return path;
|
||||
}
|
||||
}
|
||||
|
||||
@ -324,7 +324,7 @@ public class PermissionsManager implements Reloadable {
|
||||
* False is also returned if this feature isn't supported for the current permissions system.
|
||||
*/
|
||||
public boolean addGroup(OfflinePlayer player, UserGroup groupName) {
|
||||
if (!isEnabled() || StringUtils.isEmpty(groupName.getGroupName())) {
|
||||
if (!isEnabled() || StringUtils.isBlank(groupName.getGroupName())) {
|
||||
return false;
|
||||
}
|
||||
return handler.addToGroup(player, groupName);
|
||||
|
||||
@ -89,6 +89,12 @@ public class GeoIpService {
|
||||
* @return True if the data is available, false otherwise.
|
||||
*/
|
||||
private synchronized boolean isDataAvailable() {
|
||||
|
||||
// If this feature is disabled, just stop
|
||||
if (!settings.getProperty(ProtectionSettings.ENABLE_GEOIP)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (downloading) {
|
||||
// we are currently downloading the database
|
||||
return false;
|
||||
|
||||
@ -38,7 +38,7 @@ public class JoinMessageService {
|
||||
*/
|
||||
public void sendMessage(String playerName) {
|
||||
String joinMessage = joinMessages.remove(playerName);
|
||||
if (!StringUtils.isEmpty(joinMessage)) {
|
||||
if (!StringUtils.isBlank(joinMessage)) {
|
||||
bukkitService.broadcastMessage(joinMessage);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,6 +1,7 @@
|
||||
package fr.xephi.authme.service;
|
||||
|
||||
import ch.jalu.configme.properties.Property;
|
||||
import com.google.common.annotations.VisibleForTesting;
|
||||
import com.google.common.collect.HashMultimap;
|
||||
import com.google.common.collect.Multimap;
|
||||
import fr.xephi.authme.ConsoleLogger;
|
||||
@ -23,6 +24,7 @@ import org.bukkit.entity.Player;
|
||||
|
||||
import javax.annotation.PostConstruct;
|
||||
import javax.inject.Inject;
|
||||
import java.net.InetSocketAddress;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
@ -156,7 +158,7 @@ public class ValidationService implements Reloadable {
|
||||
}
|
||||
|
||||
String ip = PlayerUtils.getPlayerIp(player);
|
||||
String domain = player.getAddress().getHostName();
|
||||
String domain = getHostName(player.getAddress());
|
||||
for (String restriction : restrictions) {
|
||||
if (restriction.startsWith("regex:")) {
|
||||
restriction = restriction.replace("regex:", "");
|
||||
@ -173,6 +175,11 @@ public class ValidationService implements Reloadable {
|
||||
return false;
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
protected String getHostName(InetSocketAddress inetSocketAddr) {
|
||||
return inetSocketAddr.getHostName();
|
||||
}
|
||||
|
||||
/**
|
||||
* Verifies whether the given value is allowed according to the given whitelist and blacklist settings.
|
||||
* Whitelist has precedence over blacklist: if a whitelist is set, the value is rejected if not present
|
||||
|
||||
@ -114,7 +114,7 @@ public class SettingsMigrationService extends PlainMigrationService {
|
||||
// Old other accounts
|
||||
// --------
|
||||
public boolean hasOldOtherAccountsCommand() {
|
||||
return !StringUtils.isEmpty(oldOtherAccountsCommand);
|
||||
return !StringUtils.isBlank(oldOtherAccountsCommand);
|
||||
}
|
||||
|
||||
public String getOldOtherAccountsCommand() {
|
||||
|
||||
@ -293,7 +293,7 @@ public class SpawnLoader implements Reloadable {
|
||||
String prefix = pathPrefix + ".";
|
||||
String worldName = configuration.getString(prefix + "world");
|
||||
World world = Bukkit.getWorld(worldName);
|
||||
if (!StringUtils.isEmpty(worldName) && world != null) {
|
||||
if (!StringUtils.isBlank(worldName) && world != null) {
|
||||
return new Location(world, configuration.getDouble(prefix + "x"),
|
||||
configuration.getDouble(prefix + "y"), configuration.getDouble(prefix + "z"),
|
||||
getFloat(configuration, prefix + "yaw"), getFloat(configuration, prefix + "pitch"));
|
||||
@ -315,7 +315,7 @@ public class SpawnLoader implements Reloadable {
|
||||
String prefix = pathPrefix + ".";
|
||||
String worldName = configuration.getString(prefix + "World");
|
||||
World world = Bukkit.getWorld(worldName);
|
||||
if (!StringUtils.isEmpty(worldName) && world != null) {
|
||||
if (!StringUtils.isBlank(worldName) && world != null) {
|
||||
return new Location(world, configuration.getDouble(prefix + "X"),
|
||||
configuration.getDouble(prefix + "Y"), configuration.getDouble(prefix + "Z"),
|
||||
getFloat(configuration, prefix + "Yaw"), getFloat(configuration, prefix + "Pitch"));
|
||||
|
||||
@ -20,6 +20,10 @@ public final class ProtectionSettings implements SettingsHolder {
|
||||
public static final Property<Boolean> ENABLE_PROTECTION_REGISTERED =
|
||||
newProperty("Protection.enableProtectionRegistered", true);
|
||||
|
||||
@Comment("Enable GeoIp database")
|
||||
public static final Property<Boolean> ENABLE_GEOIP =
|
||||
newProperty("Protection.geoIpDatabase.enabled", true);
|
||||
|
||||
@Comment({"The MaxMind clientId used to download the GeoIp database,",
|
||||
"get one at https://www.maxmind.com/en/accounts/current/license-key",
|
||||
"The EssentialsX project has a very useful tutorial on how to generate",
|
||||
|
||||
@ -14,12 +14,11 @@ public final class StringUtils {
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the difference of two strings.
|
||||
* Calculates the difference of two strings.
|
||||
*
|
||||
* @param first First string
|
||||
* @param second Second string
|
||||
*
|
||||
* @return The difference value
|
||||
* @param first first string
|
||||
* @param second second string
|
||||
* @return the difference value
|
||||
*/
|
||||
public static double getDifference(String first, String second) {
|
||||
// Make sure the strings are valid.
|
||||
@ -35,12 +34,11 @@ public final class StringUtils {
|
||||
}
|
||||
|
||||
/**
|
||||
* Return whether the given string contains any of the provided elements.
|
||||
* Returns whether the given string contains any of the provided elements.
|
||||
*
|
||||
* @param str The string to analyze
|
||||
* @param pieces The items to check the string for
|
||||
*
|
||||
* @return True if the string contains at least one of the items
|
||||
* @param str the string to analyze
|
||||
* @param pieces the items to check the string for
|
||||
* @return true if the string contains at least one of the items
|
||||
*/
|
||||
public static boolean containsAny(String str, Iterable<String> pieces) {
|
||||
if (str == null) {
|
||||
@ -58,21 +56,19 @@ public final class StringUtils {
|
||||
* Null-safe method for checking whether a string is empty. Note that the string
|
||||
* is trimmed, so this method also considers a string with whitespace as empty.
|
||||
*
|
||||
* @param str The string to verify
|
||||
*
|
||||
* @return True if the string is empty, false otherwise
|
||||
* @param str the string to verify
|
||||
* @return true if the string is empty, false otherwise
|
||||
*/
|
||||
public static boolean isEmpty(String str) {
|
||||
public static boolean isBlank(String str) {
|
||||
return str == null || str.trim().isEmpty();
|
||||
}
|
||||
|
||||
/**
|
||||
* Check that the given needle is in the middle of the haystack, i.e. that the haystack
|
||||
* Checks that the given needle is in the middle of the haystack, i.e. that the haystack
|
||||
* contains the needle and that it is not at the very start or end.
|
||||
*
|
||||
* @param needle the needle to search for
|
||||
* @param haystack the haystack to search in
|
||||
*
|
||||
* @return true if the needle is in the middle of the word, false otherwise
|
||||
*/
|
||||
// Note ljacqu 20170314: `needle` is restricted to char type intentionally because something like
|
||||
|
||||
@ -105,6 +105,6 @@ public final class Utils {
|
||||
* @return true if the email is empty
|
||||
*/
|
||||
public static boolean isEmailEmpty(String email) {
|
||||
return StringUtils.isEmpty(email) || "your@email.com".equalsIgnoreCase(email);
|
||||
return StringUtils.isBlank(email) || "your@email.com".equalsIgnoreCase(email);
|
||||
}
|
||||
}
|
||||
|
||||
45
src/main/resources/messages/help_ja.yml
Normal file
45
src/main/resources/messages/help_ja.yml
Normal file
@ -0,0 +1,45 @@
|
||||
# Translation config for the AuthMe help, e.g. when /authme help or /authme help register is called
|
||||
|
||||
# -------------------------------------------------------
|
||||
# List of texts used in the help section
|
||||
common:
|
||||
header: '==========[ AuthMeReloaded ヘルプ ]=========='
|
||||
optional: 'オプション'
|
||||
hasPermission: '権限を持っています'
|
||||
noPermission: '権限がありません'
|
||||
default: 'デフォルト'
|
||||
result: '結果'
|
||||
defaultPermissions:
|
||||
notAllowed: '権限がありません'
|
||||
opOnly: 'OPのみ'
|
||||
allowed: '全員に許可'
|
||||
|
||||
# -------------------------------------------------------
|
||||
# Titles of the individual help sections
|
||||
# Set the translation text to empty text to disable the section, e.g. to hide alternatives:
|
||||
# alternatives: ''
|
||||
section:
|
||||
command: 'コマンド'
|
||||
description: '簡単な説明'
|
||||
detailedDescription: '詳細な説明'
|
||||
arguments: '引数'
|
||||
permissions: '権限'
|
||||
alternatives: '代替'
|
||||
children: 'コマンド'
|
||||
|
||||
# -------------------------------------------------------
|
||||
# You can translate the data for all commands using the below pattern.
|
||||
# For example to translate /authme reload, create a section "authme.reload", or "login" for /login
|
||||
# If the command has arguments, you can use arg1 as below to translate the first argument, and so forth
|
||||
# Translations don't need to be complete; any missing section will be taken from the default silently
|
||||
# Important: Put main commands like "authme" before their children (e.g. "authme.reload")
|
||||
commands:
|
||||
authme.register:
|
||||
description: 'プレイヤーを登録します'
|
||||
detailedDescription: '指定されたプレイヤーを指定されたパスワードで登録します。'
|
||||
arg1:
|
||||
label: 'プレイヤー名'
|
||||
description: 'プレイヤー名'
|
||||
arg2:
|
||||
label: 'パスワード'
|
||||
description: 'パスワード'
|
||||
45
src/main/resources/messages/help_lt.yml
Normal file
45
src/main/resources/messages/help_lt.yml
Normal file
@ -0,0 +1,45 @@
|
||||
# Translation config for the AuthMe help, e.g. when /authme help or /authme help register is called
|
||||
|
||||
# -------------------------------------------------------
|
||||
# List of texts used in the help section
|
||||
common:
|
||||
header: '==========[ AuthMeReloaded PAGALBA ]=========='
|
||||
optional: 'Neprivaloma'
|
||||
hasPermission: 'Jūs turite leidimą'
|
||||
noPermission: 'Jūs neturite leidimo'
|
||||
default: 'Numatytas'
|
||||
result: 'Rezultatas'
|
||||
defaultPermissions:
|
||||
notAllowed: 'Nėra leidimo'
|
||||
opOnly: 'Tik OP'
|
||||
allowed: 'Visiems leistina'
|
||||
|
||||
# -------------------------------------------------------
|
||||
# Titles of the individual help sections
|
||||
# Set the translation text to empty text to disable the section, e.g. to hide alternatives:
|
||||
# alternatives: ''
|
||||
section:
|
||||
command: 'Komanda'
|
||||
description: 'Trumpas aprašas'
|
||||
detailedDescription: 'Detalus aprašas'
|
||||
arguments: 'Argumentai'
|
||||
permissions: 'Leidimai'
|
||||
alternatives: 'Alternatyvos'
|
||||
children: 'Komandos'
|
||||
|
||||
# -------------------------------------------------------
|
||||
# You can translate the data for all commands using the below pattern.
|
||||
# For example to translate /authme reload, create a section "authme.reload", or "login" for /login
|
||||
# If the command has arguments, you can use arg1 as below to translate the first argument, and so forth
|
||||
# Translations don't need to be complete; any missing section will be taken from the default silently
|
||||
# Important: Put main commands like "authme" before their children (e.g. "authme.reload")
|
||||
commands:
|
||||
authme.register:
|
||||
description: 'Užregistruoti žaidėją'
|
||||
detailedDescription: 'Užregistruokite nurodytą žaidėją su nurodytu slaptažodžiu.'
|
||||
arg1:
|
||||
label: 'žaidėjas'
|
||||
description: 'Žaidėjo vardas'
|
||||
arg2:
|
||||
label: 'slaptažodis'
|
||||
description: 'Slaptažodis'
|
||||
156
src/main/resources/messages/messages_ja.yml
Normal file
156
src/main/resources/messages/messages_ja.yml
Normal file
@ -0,0 +1,156 @@
|
||||
# List of global tags:
|
||||
# %nl% - Goes to new line.
|
||||
# %username% - Replaces the username of the player receiving the message.
|
||||
# %displayname% - Replaces the nickname (and colors) of the player receiving the message.
|
||||
|
||||
# Registration
|
||||
registration:
|
||||
register_request: '&3サーバーに登録するには、次のコマンドを使用してください: /register <パスワード> <パスワードの確認>'
|
||||
command_usage: '&c使用方法: /register <パスワード> <パスワードの確認>'
|
||||
reg_only: '&4登録済みのユーザーのみサーバーに参加できます! 自分自身を登録するには、http://example.com にアクセスしてください!'
|
||||
kicked_admin_registered: '管理者があなたを登録しました。再度ログインしてください。'
|
||||
success: '&2登録が完了しました!'
|
||||
disabled: '&cゲーム内での登録は無効になっています!'
|
||||
name_taken: '&cこのユーザー名はすでに登録されています!'
|
||||
|
||||
# Password errors on registration
|
||||
password:
|
||||
match_error: '&cパスワードが一致しません。もう一度確認してください!'
|
||||
name_in_password: '&cパスワードには自分の名前を使用することはできません。別のパスワードを選択してください...'
|
||||
unsafe_password: '&c選択したパスワードは安全ではありません。別のパスワードを選択してください...'
|
||||
forbidden_characters: '&4パスワードに不正な文字が含まれています。許可されている文字: %valid_chars'
|
||||
wrong_length: '&cパスワードが短すぎるか長すぎます!別のパスワードを試してください!'
|
||||
|
||||
# Login
|
||||
login:
|
||||
command_usage: '&c使用方法: /login <パスワード>'
|
||||
wrong_password: '&cパスワードが間違っています!'
|
||||
success: '&2ログインが成功しました!'
|
||||
login_request: '&c次のコマンドを使用してログインしてください: /login <パスワード>'
|
||||
timeout_error: '&4ログインのタイムアウトが発生しました。サーバーからキックされました。もう一度試してください!'
|
||||
|
||||
# Errors
|
||||
error:
|
||||
unregistered_user: '&cこのユーザーは登録されていません!'
|
||||
denied_command: '&cこのコマンドを使用するには認証が必要です!'
|
||||
denied_chat: '&cチャットするには認証が必要です!'
|
||||
not_logged_in: '&cログインしていません!'
|
||||
tempban_max_logins: '&cログインに失敗した回数が多すぎるため、一時的にアクセスが制限されています。'
|
||||
max_registration: '&c接続ごとの登録数が最大値を超えています(%reg_count/%max_acc %reg_names)!'
|
||||
no_permission: '&4この操作を実行する権限がありません!'
|
||||
unexpected_error: '&4予期しないエラーが発生しました。管理者に連絡してください!'
|
||||
kick_for_vip: '&3VIPプレイヤーがサーバーが満員の状態で参加しました!'
|
||||
logged_in: '&cすでにログイン済みです!'
|
||||
kick_unresolved_hostname: '&cエラーが発生しました:解決できないプレイヤーのホスト名!'
|
||||
|
||||
# AntiBot
|
||||
antibot:
|
||||
kick_antibot: 'AntiBot保護モードが有効です!サーバーに参加するまでにしばらくお待ちください。'
|
||||
auto_enabled: '&4[AntiBotService] 接続数が非常に多いため、AntiBotが有効になりました!'
|
||||
auto_disabled: '&2[AntiBotService] %m 分後にAntiBotが無効になりました!'
|
||||
|
||||
unregister:
|
||||
success: '&c登録が正常に解除されました!'
|
||||
command_usage: '&c使用方法: /unregister <パスワード>'
|
||||
|
||||
# Other messages
|
||||
misc:
|
||||
accounts_owned_self: '所持しているアカウント数:%count 個'
|
||||
accounts_owned_other: 'プレイヤー %name のアカウント数:%count 個'
|
||||
account_not_activated: '&cアカウントはまだ有効化されていません。メールを確認してください!'
|
||||
password_changed: '&2パスワードが正常に変更されました!'
|
||||
logout: '&2正常にログアウトしました!'
|
||||
reload: '&2設定とデータベースが正常に再読み込みされました!'
|
||||
usage_change_password: '&c使用方法: /changepassword <旧パスワード> <新パスワード>'
|
||||
|
||||
# Session messages
|
||||
session:
|
||||
invalid_session: '&cIPアドレスが変更され、セッションのデータが期限切れです!'
|
||||
valid_session: '&2セッションの再接続によるログインです。'
|
||||
|
||||
# Error messages when joining
|
||||
on_join_validation:
|
||||
name_length: '&4ユーザー名が短すぎるか長すぎます!'
|
||||
characters_in_name: '&4ユーザー名に無効な文字が含まれています。許可される文字:%valid_chars'
|
||||
country_banned: '&4このサーバーへのアクセスは、お使いの国から制限されています!'
|
||||
not_owner_error: 'このアカウントの所有者ではありません。別の名前を選択してください!'
|
||||
kick_full_server: '&4サーバーが満員です。後でもう一度お試しください!'
|
||||
same_nick_online: '&4同じユーザー名のプレイヤーが既にサーバーでプレイしています!'
|
||||
invalid_name_case: '正しいユーザー名は %valid です。%invalid ではなく、このユーザー名で参加してください。'
|
||||
same_ip_online: '同じIPアドレスを持つプレイヤーが既にゲーム内にいます!'
|
||||
quick_command: 'コマンドを速すぎる速度で使用しました!もう一度サーバーに参加してから、コマンドを使用する前にしばらくお待ちください。'
|
||||
|
||||
# Email
|
||||
email:
|
||||
usage_email_add: '&c使用方法:/email add <メールアドレス> <メールアドレスの確認>'
|
||||
usage_email_change: '&c使用方法:/email change <古いメールアドレス> <新しいメールアドレス>'
|
||||
new_email_invalid: '&c無効な新しいメールアドレスです。もう一度やり直してください!'
|
||||
old_email_invalid: '&c無効な古いメールアドレスです。もう一度やり直してください!'
|
||||
invalid: '&c無効なメールアドレスです。もう一度やり直してください!'
|
||||
added: '&2メールアドレスがアカウントに正常に追加されました!'
|
||||
request_confirmation: '&cメールアドレスを確認してください!'
|
||||
changed: '&2メールアドレスが正しく変更されました!'
|
||||
email_show: '&2現在のメールアドレスは:%email'
|
||||
incomplete_settings: 'エラー:メールの送信に必要なすべての設定が設定されていません。管理者に連絡してください。'
|
||||
already_used: '&4そのメールアドレスは既に使用されています'
|
||||
send_failure: 'メールを送信できませんでした。管理者に連絡してください。'
|
||||
no_email_for_account: '&2現在、このアカウントに関連付けられたメールアドレスはありません。'
|
||||
add_email_request: '&3コマンド「/email add <あなたのメールアドレス> <確認用メールアドレス>」を使用して、アカウントにメールアドレスを追加してください。'
|
||||
change_password_expired: 'このコマンドを使用してパスワードを変更することはできません。'
|
||||
email_cooldown_error: '&c最近すでにメールが送信されています。新しいメールを送信する前に、%time 待つ必要があります。'
|
||||
add_not_allowed: '&cメールアドレスの追加は許可されていません。'
|
||||
change_not_allowed: '&cメールアドレスの変更は許可されていません。'
|
||||
|
||||
# Password recovery by email
|
||||
recovery:
|
||||
forgot_password_hint: '&3パスワードを忘れましたか?次のコマンドを使用してください:/email recovery <あなたのメールアドレス>'
|
||||
command_usage: '&c使用方法:/email recovery <メールアドレス>'
|
||||
email_sent: '&2パスワードの回復メールが正常に送信されました!メールの受信トレイを確認してください!'
|
||||
code:
|
||||
code_sent: 'パスワードをリセットするための回復コードがメールで送信されました。'
|
||||
incorrect: '回復コードが正しくありません!残りの試行回数:%count'
|
||||
tries_exceeded: '回復コードの入力試行回数が上限を超えました。新しいコードを生成するには、"/email recovery [メールアドレス]" を実行してください。'
|
||||
correct: '回復コードが正しく入力されました!'
|
||||
change_password: '即座にパスワードを変更するには、コマンド「/email setpassword <新しいパスワード>」を使用してください。'
|
||||
|
||||
# Captcha
|
||||
captcha:
|
||||
usage_captcha: '&3ログインするには、Captchaコードを解決する必要があります。次のコマンドを使用してください:/captcha %captcha_code'
|
||||
wrong_captcha: '&cCaptchaコードが間違っています。チャットに「/captcha %captcha_code」と入力してください!'
|
||||
valid_captcha: '&2Captchaコードが正しく解決されました!'
|
||||
captcha_for_registration: '登録するには、まずCaptchaを解決する必要があります。次のコマンドを使用してください:/captcha %captcha_code'
|
||||
register_captcha_valid: '&2有効なCaptchaです!/register を使用して登録できます'
|
||||
|
||||
# Verification code
|
||||
verification:
|
||||
code_required: '&3このコマンドはセンシティブな操作であり、メールの認証が必要です!受信トレイを確認し、メールの指示に従ってください。'
|
||||
command_usage: '&c使用方法:/verification <コード>'
|
||||
incorrect_code: '&cコードが正しくありません。メールで受け取ったコードを使用して、「/verification <コード>」とチャットに入力してください。'
|
||||
success: '&2身元が確認されました!現在のセッション内ですべてのコマンドを実行できます!'
|
||||
already_verified: '&2現在のセッションでは、既にすべてのセンシティブなコマンドを実行できます!'
|
||||
code_expired: '&3コードの有効期限が切れています!新しいコードを取得するには、別のセンシティブなコマンドを実行してください!'
|
||||
email_needed: '&3アカウントにはメールアドレスのリンクが必要です。身元を確認するためにはメールアドレスを関連付けてください!'
|
||||
|
||||
# Two-factor authentication
|
||||
two_factor:
|
||||
code_created: '&2秘密コードは %code です。こちらからスキャンできます:%url'
|
||||
confirmation_required: 'コードを確認するには、/2fa confirm <コード> を使用してください'
|
||||
code_required: '二要素認証コードを提出するには、/2fa code <コード> を使用してください'
|
||||
already_enabled: 'アカウントで既に二要素認証が有効になっています!'
|
||||
enable_error_no_code: '2要素認証キーが生成されていないか、期限が切れています。/2fa add を実行してください'
|
||||
enable_success: 'アカウントでの二要素認証が正常に有効になりました'
|
||||
enable_error_wrong_code: 'コードが間違っているか、期限が切れています。/2fa add を実行してください'
|
||||
not_enabled_error: 'アカウントでは二要素認証が有効になっていません。/2fa add を実行してください'
|
||||
removed_success: 'アカウントから二要素認証が正常に削除されました'
|
||||
invalid_code: '無効なコードです!'
|
||||
|
||||
# Time units
|
||||
time:
|
||||
second: '秒'
|
||||
seconds: '秒'
|
||||
minute: '分'
|
||||
minutes: '分'
|
||||
hour: '時間'
|
||||
hours: '時間'
|
||||
day: '日'
|
||||
days: '日'
|
||||
@ -5,153 +5,153 @@
|
||||
|
||||
# Registration
|
||||
registration:
|
||||
disabled: '&6Registracija yra isjungta'
|
||||
name_taken: '&cVartotojo vardas jau uzregistruotas'
|
||||
register_request: '&ePrasome prisiregistruoti: /register slaptazodis pakartotiSlaptazodi'
|
||||
command_usage: '&eNaudojimas: /register slaptazodis pakartotiSlaptazodi'
|
||||
reg_only: '&cTik prisiregistravusiem zaidejams: apsilankykite: http://example.com tam kad uzsiregistruoti.'
|
||||
success: '&aSekmingai prisiregistravote.'
|
||||
kicked_admin_registered: 'Administatorius jus uzregistravo. Prisijunkite isnaujo'
|
||||
disabled: '&6Registracija yra išjungta'
|
||||
name_taken: '&cVartotojo vardas jau užregistruotas'
|
||||
register_request: '&ePrašome prisiregistruoti: /register slaptažodis pakartotiSlaptažodį'
|
||||
command_usage: '&eNaudojimas: /register slaptažodis pakartotiSlaptažodį'
|
||||
reg_only: '&cTik prisiregistravusiems žaidėjams: apsilankykite: http://example.com tam, kad užsiregistruoti.'
|
||||
success: '&aSėkmingai prisiregistravote.'
|
||||
kicked_admin_registered: 'Administatorius Jus užregistravo. Prisijunkite iš naujo'
|
||||
|
||||
# Password errors on registration
|
||||
password:
|
||||
match_error: '&cSlaptazodziai nesutampa'
|
||||
name_in_password: '&cJus negalite naudoti savo varda slaptazodyje'
|
||||
unsafe_password: '&cSi slaptazodi lengva nulausti, pasirinkite kita slaptazodi'
|
||||
forbidden_characters: '&4Jusus slaptazodis turi netinkamu simboliu. Leidziami simboliai: %valid_chars'
|
||||
wrong_length: '&cJusu slaptazodis buvo per ilgas arba per trumpas.'
|
||||
match_error: '&cSlaptažodžiai nesutampa'
|
||||
name_in_password: '&cJūs negalite naudoti savo vardo slaptažodyje'
|
||||
unsafe_password: '&cŠį Slaptažodį lengva nulaužti, pasirinkite kitą slaptažodį'
|
||||
forbidden_characters: '&4Jūsų slaptažodis turi netinkamų simbolių. Leidžiami simboliai: %valid_chars'
|
||||
wrong_length: '&cJūsų pasirinktas slaptažodis per ilgas arba per trumpas.'
|
||||
|
||||
# Login
|
||||
login:
|
||||
command_usage: '&eKomandos panaudojimas: /login slaptazodis'
|
||||
wrong_password: '&cNeteisingas slaptazosdis'
|
||||
success: '&aSekmingai prisijungete'
|
||||
login_request: '&ePrasome prisijungti: /login slaptazodis'
|
||||
timeout_error: '&cNespejote prisijungti'
|
||||
command_usage: '&eKomandos panaudojimas: /login slaptažodis'
|
||||
wrong_password: '&cNeteisingas Slaptažosdis'
|
||||
success: '&aSėkmingai prisijungėte'
|
||||
login_request: '&ePrašome prisijungti: /login slaptažodis'
|
||||
timeout_error: '&cNespėjote prisijungti'
|
||||
|
||||
# Errors
|
||||
error:
|
||||
denied_command: '&cKad galetumete naudoti sia komanda turite buti prisijunge!'
|
||||
denied_chat: '&cKad galetumete kalbeti jus turite buti prisijunge!'
|
||||
unregistered_user: '&cVartotojas neprisiregistraves'
|
||||
not_logged_in: '&cTu neprisijunges!'
|
||||
no_permission: '&cNera leidimo'
|
||||
unexpected_error: '&cAtsirado klaida, praneskite adminstratoriui.'
|
||||
max_registration: '&cJus pasiekete maksimalu registraciju skaiciu.'
|
||||
logged_in: '&cTu jau prisijunges!'
|
||||
kick_for_vip: '&cA VIP prisijunge i pilna serveri!'
|
||||
kick_unresolved_hostname: '&cIvyko klaida: Ivyko klaida su zaidejo adresu!'
|
||||
tempban_max_logins: '&cJus laikinai uzblokuotas nes kelis kartus neteisingai suvedete salptazodi.'
|
||||
denied_command: '&cKad galetumėte naudoti šią komandą turite būti prisijungę!'
|
||||
denied_chat: '&cKad galetumėte kalbėti Jūs turite būti prisijungę!'
|
||||
unregistered_user: '&cVartotojas neprisiregistravęs'
|
||||
not_logged_in: '&cJūs neprisijungę!'
|
||||
no_permission: '&cNėra leidimo'
|
||||
unexpected_error: '&cAtsirado klaida, praneškite adminstratoriui.'
|
||||
max_registration: '&cJūs pasiekėte maksimalų registracijų skaičių.'
|
||||
logged_in: '&cTu jau prisijungęs!'
|
||||
kick_for_vip: '&cRėmėjas prisijungė į pilną serverį!'
|
||||
kick_unresolved_hostname: '&cĮvyko klaida su žaidejo adresu!'
|
||||
tempban_max_logins: '&cJūs laikinai užblokuotas, nes kelis kartus neteisingai suvedėte slaptažodį.'
|
||||
|
||||
# AntiBot
|
||||
antibot:
|
||||
kick_antibot: 'AntiBot prevencija ijungta! Palaukite pries prisijungiant.'
|
||||
auto_enabled: '&4[AntiBotService] AntiBot prevencija pajungta del didelio kiekio prisijungimu!'
|
||||
auto_disabled: '&2[AntiBotService] AntiBot isjungtas po: %m minutes!'
|
||||
kick_antibot: 'AntiBot prevencija įjungta! Palaukite prieš prisijungiant.'
|
||||
auto_enabled: '&4[AntiBotService] AntiBot prevencija pajungta dėl didelio kiekio prisijungimų!'
|
||||
auto_disabled: '&2[AntiBotService] AntiBot bus išjungtas po %m minučių!'
|
||||
|
||||
# Unregister
|
||||
unregister:
|
||||
success: '&aSekmingai issiregistravote!'
|
||||
command_usage: '&ePanaikinti registracija: "/unregister slaptazodis"'
|
||||
success: '&aSėkmingai išsiregistravote!'
|
||||
command_usage: '&ePanaikinti registraciją: "/unregister slaptažodis"'
|
||||
|
||||
# Other messages
|
||||
misc:
|
||||
account_not_activated: '&aJusu vartotojas nera patvirtintas, patikrinkite el.pasta.'
|
||||
password_changed: '&aSlaptazodis pakeistas'
|
||||
logout: '&aSekmingai atsijungete'
|
||||
reload: '&aNustatymai ir duomenu baze buvo perkrauta.'
|
||||
usage_change_password: '&ePanaudojimas: /changepassword senasSlaptazodis naujasSlaptazodis'
|
||||
accounts_owned_self: 'Jus turite %count paskyra(-s):'
|
||||
accounts_owned_other: 'Zaidejas %name turi %count paskyra(-s):'
|
||||
account_not_activated: '&aJūsų vartotojas nėra patvirtintas, pasitikrinkite el.paštą.'
|
||||
password_changed: '&aSlaptažodis pakeistas'
|
||||
logout: '&aSėkmingai atsijungėte'
|
||||
reload: '&aNustatymai ir duomenų bazė buvo perkrauta.'
|
||||
usage_change_password: '&ePanaudojimas: /changepassword senasSlaptažodis naujasSlaptažodis'
|
||||
accounts_owned_self: 'Jūs turite %count paskyrą(-s):'
|
||||
accounts_owned_other: 'Žaidejas %name turi %count paskyrą(-s):'
|
||||
|
||||
# Session messages
|
||||
session:
|
||||
valid_session: '&aSesijos prisijungimas'
|
||||
invalid_session: '&cSesijos laikai nesutampa, prasome palaukti kol secija baigsis.'
|
||||
valid_session: '&aAutomatinis sesijos prisijungimas'
|
||||
invalid_session: '&cSesijos laikai nesutampa. Prašome palaukti kol sesija baigsis.'
|
||||
|
||||
# Error messages when joining
|
||||
on_join_validation:
|
||||
same_ip_online: 'Zaidejas su tuo paciu ip jau yra zaidime!'
|
||||
same_nick_online: '&cKazkas situo vardu jau zaidzia.'
|
||||
name_length: '&cJusu varsdas yra per ilgas arba per trumpas.'
|
||||
characters_in_name: '&cJusu varde yra neledziamu simboliu, leidziami: %valid_chars'
|
||||
kick_full_server: '&cServeris yra pilnas, Atsiprasome.'
|
||||
country_banned: '&4Jusu salis yra uzblokuota siame serveryje!'
|
||||
not_owner_error: 'Tu neesi sios paskyros savininkas, pasirinkite kita varda!'
|
||||
invalid_name_case: 'Turetumete prisijungti su vardu: %valid, o ne su: %invalid.'
|
||||
quick_command: 'Tu panaudojai komanda per greitai! Prisijunkite isnaujo ir siek tiek palaukite pries naudojant komandas.'
|
||||
same_ip_online: 'Žaidejas su tuo pačiu IP adresu jau yra žaidime!'
|
||||
same_nick_online: '&cKažkas šituo vardu jau žaidžia.'
|
||||
name_length: '&cJūsų vardas yra per ilgas arba per trumpas.'
|
||||
characters_in_name: '&cJūsų varde yra neledziamų simbolių. Leidžiami: %valid_chars'
|
||||
kick_full_server: '&cServeris yra pilnas, atsiprašome.'
|
||||
country_banned: '&4Jūsų šalis yra užblokuota šiame serveryje!'
|
||||
not_owner_error: 'J0s nesate šios paskyros savininkas, pasirinkite kitą vardą!'
|
||||
invalid_name_case: 'Turėtumėte prisijungti su vardu %valid, o ne su: %invalid.'
|
||||
quick_command: 'Jūs panaudojote komandą per greitai! Prisijunkite iš naujo ir šiek tiek palaukite prieš naudojant komandas.'
|
||||
|
||||
# Email
|
||||
email:
|
||||
add_email_request: '&ePrasau pridekite savo el.pasta : /email add <el.pastas> <el.pastas>'
|
||||
usage_email_add: '&cNaudojimas: /email add <el.pastas> <el.pastas>'
|
||||
add_email_request: '&ePrašome jūsų pridėti savo el.paštą : /email add <el.paštas> <el.paštas>'
|
||||
usage_email_add: '&cNaudojimas: /email add <el.paštas> <el.paštas>'
|
||||
usage_email_change: '&cNaudojimas: /email change <senas el.pastas> <naujas el.pastas>'
|
||||
new_email_invalid: '&cNeteisingas el.pastas, bandykite isnaujo!'
|
||||
old_email_invalid: '&cNeteisingas senas el.pastas, bandykite isnaujo!'
|
||||
invalid: '&cNeteisingas el.pastas, bandykite isnaujo!'
|
||||
added: '&2El.pastas sekmingai pridetas!'
|
||||
add_not_allowed: '&cNaujo el.pasto pridejimas nera galimas'
|
||||
request_confirmation: '&cPatvirtinkite savo el.pasta!'
|
||||
changed: '&2El.pasta pakeistas sekmingai!'
|
||||
change_not_allowed: '&cEl.pasto keitimas nera galimas'
|
||||
email_show: '&2Jusu dabartinis el.pasto adresas: &f%email'
|
||||
no_email_for_account: '&2Siuo metu jus neturite prideja jokio el.pasto adreso.'
|
||||
already_used: '&4Jis el.pasto adresas jau yra naudojamas'
|
||||
incomplete_settings: 'Klaidas: Nevisi nustatymai yra nustatyti laisko siuntimui. Susikietite su administratorium.'
|
||||
send_failure: 'El.pasto laiskas nebuvo issiustas. Susikietite su administratorium.'
|
||||
change_password_expired: 'Jus nebegalite pakeisti savo slaptazodzio naudojant sia komanda.'
|
||||
email_cooldown_error: '&cEl.pasto laiskas jau buvo issiustas. Palaukite %time pries siunciant nauja.'
|
||||
new_email_invalid: '&cNeteisingas el.paštas, bandykite iš naujo!'
|
||||
old_email_invalid: '&cNeteisingas senas el.paštas, bandykite iš naujo!'
|
||||
invalid: '&cNeteisingas el.paštas, bandykite iš naujo!'
|
||||
added: '&2El.paštas sėkmingai pridėtas!'
|
||||
add_not_allowed: '&cNaujo el.pašto pridejimas nėra galimas'
|
||||
request_confirmation: '&cPatvirtinkite savo el.paštą!'
|
||||
changed: '&2El.paštą pakeistas sėkmingai!'
|
||||
change_not_allowed: '&cEl.pašto keitimas nėra galimas'
|
||||
email_show: '&2Jūsų dabartinis el.pašto adresas: &f%email'
|
||||
no_email_for_account: '&2Šiuo metu Jūs neturite pridėję jokio el.pašto adreso.'
|
||||
already_used: '&4Jis el.pašto adresas jau yra naudojamas'
|
||||
incomplete_settings: 'Klaida: Ne visi nustatymai yra nustatyti laiško siuntimui. Susikietite su administratoriumi.'
|
||||
send_failure: 'El.pašto laiškas nebuvo išsiųstas. Susikietite su administratoriumi.'
|
||||
change_password_expired: 'Jūs nebegalite pakeisti savo slaptažodzio naudojant šią komandą.'
|
||||
email_cooldown_error: '&cEl.pašto laiškas jau buvo išsiųstas. Palaukite %time prieš šiunčiant naują.'
|
||||
|
||||
# Password recovery by email
|
||||
recovery:
|
||||
forgot_password_hint: '&cPamirsote slaptazodi? Rasykite: /email recovery el.pastas'
|
||||
command_usage: '&cNaudojimas: /email recovery el.pastas'
|
||||
email_sent: '&2Laiskas i jusu pasto adresa buvo issiustas!'
|
||||
forgot_password_hint: '&cPamiršote savo slaptažodį? Rašykite: /email recovery el.paštas'
|
||||
command_usage: '&cNaudojimas: /email recovery el.paštas'
|
||||
email_sent: '&2Laiškas į Jūsų el.pašto adresą buvo išsiųstas!'
|
||||
code:
|
||||
code_sent: 'Kodas slaptazodzio atstatymui buvo issiustas i jusu pasta.'
|
||||
incorrect: 'Kodas neteisingas! jums liko %count bandymai(-as).'
|
||||
tries_exceeded: 'Jus isnaudojote visus bandymus. Naudokite "/email recovery el.pastas" kad gauti nauja koda.'
|
||||
correct: 'Kodas ivestas sekmingai!'
|
||||
change_password: 'Naudokite /email setpassword <Naujas_Slaptazodis> kad pasikeistumete slaptazodi.'
|
||||
code_sent: 'Kodas slaptažodžio atstatymui buvo išsiųstas į Jūsų el.paštą.'
|
||||
incorrect: 'Kodas neteisingas! Jums liko %count bandymai(-as).'
|
||||
tries_exceeded: 'Jūs išnaudojote visus bandymus. Naudokite "/email recovery el.paštas", kad gauti naują kodą.'
|
||||
correct: 'Kodas įvestas sėkmingai!'
|
||||
change_password: 'Naudokite /email setpassword <Naujas_slaptažodis>, kad pasikeistumėte slaptažodį.'
|
||||
|
||||
# Captcha
|
||||
captcha:
|
||||
usage_captcha: '&cPanaudojimas: /captcha %captcha_code'
|
||||
wrong_captcha: '&cNeteisinga Captcha, naudokite : /captcha %captcha_code'
|
||||
valid_captcha: '&cJusu captcha Teisinga!'
|
||||
captcha_for_registration: 'Kad prisiregistruotumete turite ivygdyti captcha, rasykite: /captcha %captcha_code'
|
||||
register_captcha_valid: '&2Captcha Teisinga! Galite naudoti /register'
|
||||
wrong_captcha: '&cNeteisinga captcha, naudokite : /captcha %captcha_code'
|
||||
valid_captcha: '&cJūsų captcha teisinga!'
|
||||
captcha_for_registration: 'Kad prisiregistruotumėte turite įvygdyti captchą. Rašykite: /captcha %captcha_code'
|
||||
register_captcha_valid: '&2Captcha teisinga! Galite naudoti /register'
|
||||
|
||||
# Verification code
|
||||
verification:
|
||||
code_required: '&3Kad naudotumete sia komanda turi patvirtinti savo pasto adresa! Sekite instrukcijas savo el.paste.'
|
||||
code_required: '&3Kad galėtumėte naudoti šią komandą turite patvirtinti savo el.pašto adresą! Sekite instrukcijas savo el.pašte.'
|
||||
command_usage: '&cNaudojimas: /verification <kodas>'
|
||||
incorrect_code: '&cNeteisingas kodas, naudokite "/verification <kodas>" ivesdami koda gauta savo el.paste'
|
||||
success: '&2Jusu paskyra patvirtinta! Jus galite naudoti visas komandas!'
|
||||
already_verified: '&2Jus jau esate patvirtintas ir galite naudoti visas komandas!'
|
||||
code_expired: '&3Jusu kodo galiojimas baigesi! Panaudokite komanda isnaujo kad gauti nauja koda!'
|
||||
email_needed: '&3Kad patvirtinti savo paskyra turite prideti el.pasto adresa!'
|
||||
incorrect_code: '&cNeteisingas kodas, naudokite "/verification <kodas>" įvesdami kodą gautą savo el.pašte'
|
||||
success: '&2Jūsų paskyra patvirtinta! Jūs galite naudoti visas komandas!'
|
||||
already_verified: '&2Jūs jau esate patvirtinę savo paskyrą ir galite naudoti visas komandas!'
|
||||
code_expired: '&3Jūsų kodo galiojimas baigėsi! Panaudokite komandą iš naujo, kad gautumėte naują kodą!'
|
||||
email_needed: '&3Kad patvirtinti savo paskyra turite pridėti el.pašto adresą!'
|
||||
|
||||
# Time units
|
||||
time:
|
||||
second: 'sekunde'
|
||||
second: 'sekundę'
|
||||
seconds: 'sekundes'
|
||||
minute: 'minute'
|
||||
minute: 'minutę'
|
||||
minutes: 'minutes'
|
||||
hour: 'valanda'
|
||||
hour: 'valandą'
|
||||
hours: 'valandas'
|
||||
day: 'diena'
|
||||
day: 'dieną'
|
||||
days: 'dienas'
|
||||
|
||||
# Two-factor authentication
|
||||
two_factor:
|
||||
code_created: '&2Tavo slaptas kodas yra %code. Ji gali nuskenuoti cia: %url'
|
||||
confirmation_required: 'Patvirtinkite savo koda su: /2fa confirm <kodas>'
|
||||
code_required: 'Patvirkinkite savo koda su: /2fa code <kodas>'
|
||||
already_enabled: 'Jus jau turite dvieju faktoriu autentifikacija!'
|
||||
enable_error_no_code: 'Jus neturite dvieju faktoriu autentifikacijos arba ji pasibaige. Rasykite /2fa add'
|
||||
enable_success: 'Dvieju faktoriu autentifikacija sekmingai ijungta'
|
||||
enable_error_wrong_code: 'Wrong code or code has expired. Please run /2fa add'
|
||||
not_enabled_error: 'Two-factor authentication is not enabled for your account. Run /2fa add'
|
||||
removed_success: 'Successfully removed two-factor auth from your account'
|
||||
code_created: '&2Jūsų slaptas kodas yra %code. Jį galite nuskenuoti čia: %url'
|
||||
confirmation_required: 'Patvirtinkite savo kodą su: /2fa confirm <kodas>'
|
||||
code_required: 'Patvirkinkite savo kodą su: /2fa code <kodas>'
|
||||
already_enabled: 'Jūs jau turite dviejų faktorių autentifikaciją!'
|
||||
enable_error_no_code: 'Jūs neturite dviejų faktorių autentifikacijos arba ji pasibaigė. Rašykite /2fa add'
|
||||
enable_success: 'Dviejų faktorių autentifikacija sėkmingai įjungta'
|
||||
enable_error_wrong_code: 'Neteisingas arba pasibaigęs kodas. Rašykite /2fa add'
|
||||
not_enabled_error: 'Dviejų faktorių autentifikavimas nėra įjungtas ant jūsų paskyros. Rašykite /2fa add'
|
||||
removed_success: 'Dviejų faktorių autentifikavimas sėkmingai pašalintas iš jūsų paskyros.'
|
||||
invalid_code: 'Neteisingas kodas!'
|
||||
|
||||
@ -5,13 +5,13 @@
|
||||
|
||||
# Registration
|
||||
registration:
|
||||
disabled: '&cRegistracija v igri je onemogočena!'
|
||||
name_taken: '&cTo uporabniško ime ste ze registrirali!'
|
||||
register_request: '&3Registrirajte se z ukazom "/register <geslo> <PotrdiGeslo>"'
|
||||
command_usage: '&cUporaba: /register <geslo> <PotrdiGeslo>'
|
||||
reg_only: '&4Samo registrirani uporabniki se lahko povezejo! Obiscite http://example.com , da se registrirate!'
|
||||
kicked_admin_registered: 'Administrator vas je registriral; prosimo, da se prijavite.'
|
||||
success: '&2Uspešno registriran!'
|
||||
disabled: '&cRegistracija v igri je onemogočena!'
|
||||
name_taken: '&cTo uporabniško ime ste ze registrirali!'
|
||||
kicked_admin_registered: 'Administrator vas je registriral; prosimo, da se prijavite.'
|
||||
|
||||
# Password errors on registration
|
||||
password:
|
||||
@ -40,6 +40,7 @@ error:
|
||||
max_registration: '&cPresegli ste največjo stevilo registracij (%reg_count/%max_acc %reg_names) za vašo povezavo!'
|
||||
logged_in: '&cSte že povezani!'
|
||||
kick_for_vip: '&3VIP igralec se je pridruzil serverju, ko je bil poln!'
|
||||
# TODO kick_unresolved_hostname: '&cAn error occurred: unresolved player hostname!'
|
||||
tempban_max_logins: '&cBil si začasno izločen zaradi preveč neuspešnih prijav.'
|
||||
|
||||
# AntiBot
|
||||
@ -131,6 +132,17 @@ verification:
|
||||
code_expired: '&3Your code has expired! Execute another sensitive command to get a new code!'
|
||||
email_needed: '&3To verify your identity you need to link an email address with your account!'
|
||||
|
||||
# Time units
|
||||
time:
|
||||
second: 'sekunda'
|
||||
seconds: 'sekund'
|
||||
minute: 'minuta'
|
||||
minutes: 'minut'
|
||||
hour: 'ur'
|
||||
hours: 'ure'
|
||||
day: 'dan'
|
||||
days: 'dni'
|
||||
|
||||
# Two-factor authentication
|
||||
two_factor:
|
||||
code_created: '&2Vasa skrivna koda je %code. Lahko je skenirate tu %url!'
|
||||
@ -143,15 +155,3 @@ two_factor:
|
||||
not_enabled_error: 'Dvo stopična prijava ni vključena za vaš račun. Uporabite /2fa add'
|
||||
removed_success: 'Usprešno ste odstranili dvo stopično prijavo za vaš račun.'
|
||||
invalid_code: 'Nepravilna koda!'
|
||||
|
||||
# Time units
|
||||
time:
|
||||
second: 'sekunda'
|
||||
seconds: 'sekund'
|
||||
minute: 'minuta'
|
||||
minutes: 'minut'
|
||||
hour: 'ur'
|
||||
hours: 'ure'
|
||||
day: 'dan'
|
||||
days: 'dni'
|
||||
|
||||
@ -7,132 +7,132 @@
|
||||
|
||||
# Registration
|
||||
registration:
|
||||
disabled: '&b【AuthMe】&6已關閉註冊功能'
|
||||
name_taken: '&b【AuthMe】&6這個帳號已經被註冊過了!'
|
||||
disabled: '&b【AuthMe】&6已關閉註冊功能。'
|
||||
name_taken: '&b【AuthMe】&6這個帳號已經被註冊過了!'
|
||||
register_request: '&b【AuthMe】&6請使用 "&c/register <密碼> <確認密碼>" 來註冊。'
|
||||
command_usage: '&b【AuthMe】&6用法: &c"/register <密碼> <確認密碼>"'
|
||||
reg_only: '&b【AuthMe】&6請到下列網站 :「 https://example.tw 」 進行註冊'
|
||||
success: '&b【AuthMe】&6您已成功註冊'
|
||||
kicked_admin_registered: '&b【AuthMe】&6管理員已協助您註冊,請重新登入'
|
||||
reg_only: '&b【AuthMe】&6請到下列網站:「 https://example.tw 」進行註冊。'
|
||||
success: '&b【AuthMe】&6您已成功註冊!'
|
||||
kicked_admin_registered: '&b【AuthMe】&6管理員已協助您註冊,請重新登入。'
|
||||
|
||||
# Password errors on registration
|
||||
password:
|
||||
match_error: '&b【AuthMe】&6兩次輸入的密碼不一致!'
|
||||
name_in_password: '&b【AuthMe】&6您不可以用您的 ID (遊戲名稱) 來當作密碼 !'
|
||||
unsafe_password: '&b【AuthMe】&6您不可以使用這個不安全的密碼'
|
||||
forbidden_characters: '&b【AuthMe】&c密碼包含非法字符. 可使用: %valid_chars'
|
||||
match_error: '&b【AuthMe】&6兩次輸入的密碼不一致!'
|
||||
name_in_password: '&b【AuthMe】&6您不可以用您的 ID (遊戲名稱) 來當作密碼!'
|
||||
unsafe_password: '&b【AuthMe】&6您不可以使用這個不安全的密碼!'
|
||||
forbidden_characters: '&b【AuthMe】&c密碼包含非法字符,可使用:%valid_chars'
|
||||
wrong_length: '&b【AuthMe】&6您的密碼 超過最大字數 / 小於最小字數'
|
||||
|
||||
# Login
|
||||
login:
|
||||
command_usage: '&b【AuthMe】&6用法: &c"/login <密碼>"'
|
||||
wrong_password: '&b【AuthMe】&6密碼錯誤!'
|
||||
success: '&b【AuthMe】&6密碼正確,您已成功登入!'
|
||||
wrong_password: '&b【AuthMe】&6密碼錯誤!'
|
||||
success: '&b【AuthMe】&6密碼正確,您已成功登入!'
|
||||
login_request: '&b【AuthMe】&6請使用 &c"/login <密碼>" &6來登入。'
|
||||
timeout_error: '&b【AuthMe】&6超過登入時間,請稍後再試一次'
|
||||
timeout_error: '&b【AuthMe】&6超過登入時間,請稍後再試一次。'
|
||||
|
||||
# Errors
|
||||
error:
|
||||
denied_command: '&b【AuthMe】&c使用指令之前必須通過驗證!'
|
||||
denied_chat: '&b【AuthMe】&c說話之前必須通過驗證!'
|
||||
unregistered_user: '&b【AuthMe】&6這個帳號還沒有註冊過'
|
||||
not_logged_in: '&b【AuthMe】&6您還沒有登入!'
|
||||
denied_command: '&b【AuthMe】&c使用指令之前必須通過驗證!'
|
||||
denied_chat: '&b【AuthMe】&c說話之前必須通過驗證!'
|
||||
unregistered_user: '&b【AuthMe】&6這個帳號還沒有註冊過。'
|
||||
not_logged_in: '&b【AuthMe】&6您還沒有登入!'
|
||||
no_permission: '&b【AuthMe】&6您沒有使用該指令的權限。'
|
||||
unexpected_error: '&b【AuthMe】&6發生錯誤,請聯繫管理員'
|
||||
max_registration: '&b【AuthMe】&6您的 IP 位置所註冊的帳號數量已經達到最大。'
|
||||
logged_in: '&b【AuthMe】&6您已經登入了!'
|
||||
kick_for_vip: '&b【AuthMe】&6您已經被請出。&c原因 : 有 VIP 玩家登入伺服器'
|
||||
# TODO kick_unresolved_hostname: '&cAn error occurred: unresolved player hostname!'
|
||||
tempban_max_logins: '&b【AuthMe】&c您已被暫時封鎖IP位置,因為您登入失敗太多次.'
|
||||
max_registration: '&b【AuthMe】&6您的 IP 位置所註冊的帳號數量已經達到最大限制。'
|
||||
logged_in: '&b【AuthMe】&6您已經登入了!'
|
||||
kick_for_vip: '&b【AuthMe】&6您已經被請出。&c原因:有 VIP 玩家登入伺服器'
|
||||
kick_unresolved_hostname: '&b【AuthMe】&6無法解析玩家主機名稱。'
|
||||
tempban_max_logins: '&b【AuthMe】&c您已被暫時封鎖IP位置,因為您登入失敗太多次。'
|
||||
|
||||
# AntiBot
|
||||
antibot:
|
||||
kick_antibot: '&b【AuthMe】&cAntiBotMod 正在啟用中,請稍後再嘗試登入吧!'
|
||||
auto_enabled: '&b【AuthMe】&6AntiBotMod 已自動啟用!'
|
||||
auto_disabled: '&b【AuthMe】&6AntiBotMod 將會於 &c%m &6分鐘後自動關閉'
|
||||
auto_enabled: '&b【AuthMe】&6AntiBotMod 已自動啟用!'
|
||||
auto_disabled: '&b【AuthMe】&6AntiBotMod 將於 &c%m &6分鐘後自動關閉'
|
||||
|
||||
# Unregister
|
||||
unregister:
|
||||
success: '&b【AuthMe】&6您已經成功註銷。'
|
||||
command_usage: '&b【AuthMe】&6用法: &c"/unregister <密碼>"'
|
||||
command_usage: '&b【AuthMe】&6用法:&c"/unregister <密碼>"'
|
||||
|
||||
# Other messages
|
||||
misc:
|
||||
account_not_activated: '&b【AuthMe】&6您的帳號還沒有經過驗證! 檢查看看您的電子信箱 (Email) 吧!'
|
||||
password_changed: '&b【AuthMe】&6密碼變更成功!'
|
||||
logout: '&b【AuthMe】&6您已成功登出'
|
||||
reload: '&b【AuthMe】&6已重新讀取設定檔及資料庫'
|
||||
usage_change_password: '&b【AuthMe】&6用法: &c"/changepassword <舊密碼> <新密碼>"'
|
||||
accounts_owned_self: '&b【AuthMe】&6您擁有 %count 個帳號:'
|
||||
accounts_owned_other: '&b【AuthMe】&6玩家 %name 擁有 %count 個帳號:'
|
||||
account_not_activated: '&b【AuthMe】&6您的帳號還沒有經過驗證!檢查看看您的電子郵件 (Email) 吧!'
|
||||
password_changed: '&b【AuthMe】&6密碼變更成功!'
|
||||
logout: '&b【AuthMe】&6您已成功登出。'
|
||||
reload: '&b【AuthMe】&6已重新讀取設定檔及資料庫。'
|
||||
usage_change_password: '&b【AuthMe】&6用法:&c"/changepassword <舊密碼> <新密碼>"'
|
||||
accounts_owned_self: '&b【AuthMe】&6您擁有 %count 個帳號:'
|
||||
accounts_owned_other: '&b【AuthMe】&6玩家 %name 擁有 %count 個帳號:'
|
||||
|
||||
# Session messages
|
||||
session:
|
||||
valid_session: '&b【AuthMe】&6您已經成功登入!'
|
||||
invalid_session: '&b【AuthMe】&6Session驗證不相符!'
|
||||
valid_session: '&b【AuthMe】&6您已經成功登入!'
|
||||
invalid_session: '&b【AuthMe】&6Session驗證不相符!'
|
||||
|
||||
# Error messages when joining
|
||||
on_join_validation:
|
||||
same_ip_online: '&b【AuthMe】&6同樣IP玩家在線上!'
|
||||
same_nick_online: '&b【AuthMe】&6有同樣帳號的玩家在線上!'
|
||||
name_length: '&b【AuthMe】&6您的暱稱 太長 / 太短 了!'
|
||||
same_ip_online: '&b【AuthMe】&6相同IP玩家在線上!'
|
||||
same_nick_online: '&b【AuthMe】&6有同樣帳號的玩家在線上!'
|
||||
name_length: '&b【AuthMe】&6您的暱稱 太長 / 太短 了!'
|
||||
characters_in_name: '&b【AuthMe】&6暱稱裡能使用的字符為: %valid_chars'
|
||||
kick_full_server: '&b【AuthMe】&6伺服器已經滿了,請等等再試一次'
|
||||
country_banned: '&b【AuthMe】&6您所在的地區無法進入此伺服器'
|
||||
kick_full_server: '&b【AuthMe】&6伺服器已經滿了,請等等再試一次。'
|
||||
country_banned: '&b【AuthMe】&6您所在的地區無法進入此伺服器。'
|
||||
not_owner_error: '&b【AuthMe】&4警告!&c您並不是此帳戶持有人,請立即登出。'
|
||||
invalid_name_case: '&b【AuthMe】&4警告!&c您應該使用「%valid」而並非「%invalid」登入遊戲。'
|
||||
# TODO quick_command: 'You used a command too fast! Please, join the server again and wait more before using any command.'
|
||||
quick_command: '&b【AuthMe】&4指令使用過快,請加入伺服器後稍等一下再使用指令。'
|
||||
|
||||
# Email
|
||||
email:
|
||||
add_email_request: '&b【AuthMe】&6請使用 &c"/email add <您的Email> <再次輸入您的Email>" &6來添加 Email'
|
||||
usage_email_add: '&b【AuthMe】&6用法: &c"/email add <您的Email> <重複Email>"'
|
||||
usage_email_change: '&b【AuthMe】&6用法: &c"/email change <舊的Email> <新的Email>"'
|
||||
new_email_invalid: '&b【AuthMe】&6新的Email無效!'
|
||||
old_email_invalid: '&b【AuthMe】&6舊的Email無效!'
|
||||
invalid: '&b【AuthMe】&6無效的Email!'
|
||||
added: '&b【AuthMe】&6已添加Email!'
|
||||
# TODO add_not_allowed: '&cAdding email was not allowed'
|
||||
request_confirmation: '&b【AuthMe】&6請驗證您的Email!'
|
||||
changed: '&b【AuthMe】&6Email已變更!'
|
||||
# TODO change_not_allowed: '&cChanging email was not allowed'
|
||||
email_show: '&b【AuthMe】&2目前的電子郵件: &f%email'
|
||||
no_email_for_account: '&b【AuthMe】&2您目前沒有設置電子郵件.'
|
||||
already_used: '&b【AuthMe】&4這個電郵地址已被使用。'
|
||||
incomplete_settings: '&b【AuthMe】&4因為電子郵件設定無完整導致無法傳送,請聯絡管理員.'
|
||||
send_failure: '&b【AuthMe】&4無法傳送電子郵件,請聯絡管理員.'
|
||||
change_password_expired: '&b【AuthMe】&6您現在不能使用這個指令變更密碼了.'
|
||||
email_cooldown_error: '&b【AuthMe】&c電子郵件已經寄出了. 您只能在 %time 後才能傳送.'
|
||||
add_email_request: '&b【AuthMe】&6請使用 &c"/email add <電子郵件> <再次輸入電子郵件>" &6來新增電子郵件'
|
||||
usage_email_add: '&b【AuthMe】&6用法: &c"/email add <電子郵件> <再次輸入電子郵件>"'
|
||||
usage_email_change: '&b【AuthMe】&6用法: &c"/email change <舊的電子郵件> <新的電子郵件>"'
|
||||
new_email_invalid: '&b【AuthMe】&6新的電子郵件無效!'
|
||||
old_email_invalid: '&b【AuthMe】&6舊的電子郵件無效!'
|
||||
invalid: '&b【AuthMe】&6無效的電子郵件!'
|
||||
added: '&b【AuthMe】&6已新增電子郵件!'
|
||||
add_not_allowed: '&b【AuthMe】&c不允許新增電子郵件'
|
||||
request_confirmation: '&b【AuthMe】&6請驗證您的電子郵件!'
|
||||
changed: '&b【AuthMe】&6電子郵件已變更!'
|
||||
change_not_allowed: '&b【AuthMe】&c不允許變更電子郵件'
|
||||
email_show: '&b【AuthMe】&2目前的電子郵件:&f%email'
|
||||
no_email_for_account: '&b【AuthMe】&2您目前沒有設定電子郵件。'
|
||||
already_used: '&b【AuthMe】&4這個電子郵件已被使用。'
|
||||
incomplete_settings: '&b【AuthMe】&4因為電子郵件設定不完整導致無法傳送,請聯絡管理員。'
|
||||
send_failure: '&b【AuthMe】&4無法傳送電子郵件,請聯絡管理員。'
|
||||
change_password_expired: '&b【AuthMe】&6您現在不能使用這個指令變更密碼了。'
|
||||
email_cooldown_error: '&b【AuthMe】&c電子郵件已經寄出了,您只能在 %time 後才能傳送。'
|
||||
|
||||
# Password recovery by email
|
||||
recovery:
|
||||
forgot_password_hint: '&b【AuthMe】&6忘記密碼了嗎? 使用 &c"/email recovery <您的Email>"'
|
||||
command_usage: '&b【AuthMe】&6用法: &c"/email recovery <您的Email>"'
|
||||
email_sent: '&b【AuthMe】&6已經送出重設密碼要求至您的Email , 請查收。'
|
||||
forgot_password_hint: '&b【AuthMe】&6忘記密碼了嗎?使用 &c"/email recovery <電子郵件>"'
|
||||
command_usage: '&b【AuthMe】&6用法: &c"/email recovery <電子郵件>"'
|
||||
email_sent: '&b【AuthMe】&6已經送出重設密碼要求至您的電子郵件,請查收。'
|
||||
code:
|
||||
code_sent: '&b【AuthMe】&6忘記密碼的恢復密碼電子郵件已傳送至您的信箱中.'
|
||||
incorrect: '&b【AuthMe】&6恢復密碼錯誤! 您剩餘 %count 次嘗試機會.'
|
||||
tries_exceeded: '&b【AuthMe】&6恢復密碼過多次數錯誤. 使用 "/email recovery [email]" 取得新的恢復密碼.'
|
||||
correct: '&b【AuthMe】&6恢復密碼正確!'
|
||||
change_password: '&b【AuthMe】&6請使用 "/email setpassword <新密碼>" 變更您的密碼.'
|
||||
code_sent: '&b【AuthMe】&6忘記密碼的恢復密碼電子郵件已傳送至您的信箱中。'
|
||||
incorrect: '&b【AuthMe】&6恢復密碼錯誤!您剩餘 %count 次嘗試機會。'
|
||||
tries_exceeded: '&b【AuthMe】&6恢復密碼過多次數錯誤。使用 "/email recovery [電子郵件]" 取得新的恢復密碼。'
|
||||
correct: '&b【AuthMe】&6恢復密碼正確!'
|
||||
change_password: '&b【AuthMe】&6請使用 "/email setpassword <新密碼>" 變更您的密碼。'
|
||||
|
||||
# Captcha
|
||||
captcha:
|
||||
usage_captcha: '&b【AuthMe】&6請用 &c"/captcha %captcha_code" &6來輸入您的驗證碼.'
|
||||
wrong_captcha: '&b【AuthMe】&6錯誤的驗證碼,請使用 "/captcha %captcha_code" 再試一次.'
|
||||
valid_captcha: '&b【AuthMe】&6驗證碼無效!'
|
||||
# TODO captcha_for_registration: 'To register you have to solve a captcha first, please use the command: /captcha %captcha_code'
|
||||
# TODO register_captcha_valid: '&2Valid captcha! You may now register with /register'
|
||||
usage_captcha: '&b【AuthMe】&6請用 &c"/captcha %captcha_code" &6來輸入您的驗證碼。'
|
||||
wrong_captcha: '&b【AuthMe】&6錯誤的驗證碼,請使用 "/captcha %captcha_code" 再試一次。'
|
||||
valid_captcha: '&b【AuthMe】&6驗證碼無效。'
|
||||
captcha_for_registration: '&b【AuthMe】&6註冊前必須先提供驗證碼,使用 /captcha %captcha_code 來驗證。'
|
||||
register_captcha_valid: '&b【AuthMe】&2驗證已通過,現在可以使用 /register 來進行註冊了。'
|
||||
|
||||
# Verification code
|
||||
verification:
|
||||
code_required: '&b【AuthMe】&3敏感指令,需要電子郵件驗證後才能執行,請檢查電子郵件.'
|
||||
command_usage: '&b【AuthMe】&c用法: /verification <驗證碼>'
|
||||
code_required: '&b【AuthMe】&3敏感指令,需要電子郵件驗證後才能執行,請檢查電子郵件。'
|
||||
command_usage: '&b【AuthMe】&c用法:/verification <驗證碼>'
|
||||
incorrect_code: '&b【AuthMe】&c驗證碼錯誤,請在聊天室使用 "/verification <驗證碼>" 電子郵件收到的驗證碼'
|
||||
success: '&b【AuthMe】&2身分已驗證,您現在可以使用所有指令!'
|
||||
already_verified: '&b【AuthMe】&2您已經可以使用所有指令!'
|
||||
code_expired: '&b【AuthMe】&3驗證碼已過期,請使用其他敏感指令來取得新的驗證碼!'
|
||||
email_needed: '&b【AuthMe】&3若需要身分驗證,請先添加電子郵件!!'
|
||||
success: '&b【AuthMe】&2身分已驗證,您現在可以使用所有指令!'
|
||||
already_verified: '&b【AuthMe】&2您已經可以使用所有指令!'
|
||||
code_expired: '&b【AuthMe】&3驗證碼已過期,請使用其他敏感指令來取得新的驗證碼!'
|
||||
email_needed: '&b【AuthMe】&3若需要身分驗證,請先新增電子郵件!'
|
||||
|
||||
# Time units
|
||||
time:
|
||||
@ -147,13 +147,13 @@ time:
|
||||
|
||||
# Two-factor authentication
|
||||
two_factor:
|
||||
code_created: '&b【AuthMe - 兩步驗證碼】&b您的登入金鑰為&9「%c%code&9」&b,掃描連結為:&c %url'
|
||||
# TODO confirmation_required: 'Please confirm your code with /2fa confirm <code>'
|
||||
# TODO code_required: 'Please submit your two-factor authentication code with /2fa code <code>'
|
||||
# TODO already_enabled: 'Two-factor authentication is already enabled for your account!'
|
||||
# TODO enable_error_no_code: 'No 2fa key has been generated for you or it has expired. Please run /2fa add'
|
||||
# TODO enable_success: 'Successfully enabled two-factor authentication for your account'
|
||||
# TODO enable_error_wrong_code: 'Wrong code or code has expired. Please run /2fa add'
|
||||
# TODO not_enabled_error: 'Two-factor authentication is not enabled for your account. Run /2fa add'
|
||||
# TODO removed_success: 'Successfully removed two-factor auth from your account'
|
||||
# TODO invalid_code: 'Invalid code!'
|
||||
code_created: '&b【AuthMe】&b您的登入金鑰為&9「%c%code&9」&b,掃描連結為:&c %url'
|
||||
confirmation_required: '&b【AuthMe】&6請使用 /2fa confirm <驗證碼> 來確認雙重驗證。'
|
||||
code_required: '&b【AuthMe】&c請使用 /2fa code <驗證碼> 來完成驗證。'
|
||||
already_enabled: '&b【AuthMe】&c雙重驗證已經開啟。'
|
||||
enable_error_no_code: '&b【AuthMe】&6雙重驗證代碼不存在或失效,使用 /2fa add 來新增。'
|
||||
enable_success: '&b【AuthMe】&6雙重驗證已開啟!'
|
||||
enable_error_wrong_code: '&b【AuthMe】&6雙重驗證代碼錯誤或失效,使用 /2fa add 來新增。'
|
||||
not_enabled_error: '&b【AuthMe】&6雙重驗證尚未開啟,使用 /2fa add 來開啟。'
|
||||
removed_success: '&b【AuthMe】&6雙重驗證已成功移除!'
|
||||
invalid_code: '&b【AuthMe】&c驗證碼錯誤。'
|
||||
|
||||
@ -11,13 +11,13 @@ import java.net.InetSocketAddress;
|
||||
import java.net.URI;
|
||||
import java.net.URISyntaxException;
|
||||
import java.net.URL;
|
||||
import java.net.UnknownHostException;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
import static org.mockito.ArgumentMatchers.any;
|
||||
import static org.mockito.BDDMockito.given;
|
||||
import static org.mockito.Mockito.mock;
|
||||
|
||||
/**
|
||||
* AuthMe test utilities.
|
||||
@ -98,11 +98,14 @@ public final class TestHelper {
|
||||
* @param player the player mock
|
||||
* @param ip the ip address it should return
|
||||
*/
|
||||
public static void mockPlayerIp(Player player, String ip) {
|
||||
InetAddress inetAddress = mock(InetAddress.class);
|
||||
given(inetAddress.getHostAddress()).willReturn(ip);
|
||||
InetSocketAddress inetSocketAddress = new InetSocketAddress(inetAddress, 8093);
|
||||
given(player.getAddress()).willReturn(inetSocketAddress);
|
||||
public static void mockIpAddressToPlayer(Player player, String ip) {
|
||||
try {
|
||||
InetAddress inetAddress = InetAddress.getByName(ip);
|
||||
InetSocketAddress inetSocketAddress = new InetSocketAddress(inetAddress, 8093);
|
||||
given(player.getAddress()).willReturn(inetSocketAddress);
|
||||
} catch (UnknownHostException e) {
|
||||
throw new IllegalStateException("Invalid IP address: " + ip, e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@ -138,11 +138,11 @@ public class CommandInitializerTest {
|
||||
String forCommandText = " for command with labels '" + command.getLabels() + "'";
|
||||
|
||||
assertThat("has description" + forCommandText,
|
||||
StringUtils.isEmpty(command.getDescription()), equalTo(false));
|
||||
StringUtils.isBlank(command.getDescription()), equalTo(false));
|
||||
assertThat("short description doesn't end in '.'" + forCommandText,
|
||||
command.getDescription().endsWith("."), equalTo(false));
|
||||
assertThat("has detailed description" + forCommandText,
|
||||
StringUtils.isEmpty(command.getDetailedDescription()), equalTo(false));
|
||||
StringUtils.isBlank(command.getDetailedDescription()), equalTo(false));
|
||||
assertThat("detailed description ends in '.'" + forCommandText,
|
||||
command.getDetailedDescription().endsWith("."), equalTo(true));
|
||||
}
|
||||
|
||||
@ -93,7 +93,7 @@ public class ConverterCommandTest {
|
||||
// when / then
|
||||
for (Map.Entry<String, Class<? extends Converter>> entry : ConverterCommand.CONVERTERS.entrySet()) {
|
||||
assertThat("Name is not null or empty",
|
||||
StringUtils.isEmpty(entry.getKey()), equalTo(false));
|
||||
StringUtils.isBlank(entry.getKey()), equalTo(false));
|
||||
|
||||
assertThat("Converter class is unique for each entry",
|
||||
classes.add(entry.getValue()), equalTo(true));
|
||||
|
||||
@ -100,7 +100,7 @@ public class GetIpCommandTest {
|
||||
private static Player mockPlayer(String name, String ip) {
|
||||
Player player = mock(Player.class);
|
||||
given(player.getName()).willReturn(name);
|
||||
TestHelper.mockPlayerIp(player, ip);
|
||||
TestHelper.mockIpAddressToPlayer(player, ip);
|
||||
return player;
|
||||
}
|
||||
}
|
||||
|
||||
@ -23,14 +23,14 @@ public class HelpMessageAndHelpSectionConsistencyTest {
|
||||
// when / then
|
||||
for (HelpMessage message : HelpMessage.values()) {
|
||||
assertThat("Key for message '" + message + "' is empty",
|
||||
StringUtils.isEmpty(message.getKey()), equalTo(false));
|
||||
StringUtils.isBlank(message.getKey()), equalTo(false));
|
||||
if (!keys.add(message.getKey())) {
|
||||
fail("Key for message '" + message + "' is already used elsewhere");
|
||||
}
|
||||
}
|
||||
for (HelpSection section : HelpSection.values()) {
|
||||
assertThat("Key for section '" + section + "' is empty",
|
||||
StringUtils.isEmpty(section.getKey()), equalTo(false));
|
||||
StringUtils.isBlank(section.getKey()), equalTo(false));
|
||||
if (!keys.add(section.getKey())) {
|
||||
fail("Key for section '" + section + "' is already used elsewhere");
|
||||
}
|
||||
|
||||
@ -147,7 +147,7 @@ public class TempbanManagerTest {
|
||||
// given
|
||||
Player player = mock(Player.class);
|
||||
String ip = "123.45.67.89";
|
||||
TestHelper.mockPlayerIp(player, ip);
|
||||
TestHelper.mockIpAddressToPlayer(player, ip);
|
||||
String banReason = "IP ban too many logins";
|
||||
given(messages.retrieveSingle(player, MessageKey.TEMPBAN_MAX_LOGINS)).willReturn(banReason);
|
||||
Settings settings = mockSettings(2, 100, "");
|
||||
@ -175,7 +175,7 @@ public class TempbanManagerTest {
|
||||
Player player = mock(Player.class);
|
||||
given(player.getName()).willReturn("Bob");
|
||||
String ip = "143.45.77.89";
|
||||
TestHelper.mockPlayerIp(player, ip);
|
||||
TestHelper.mockIpAddressToPlayer(player, ip);
|
||||
String banCommand = "banip %ip% 15d IP ban too many logins";
|
||||
Settings settings = mockSettings(2, 100, banCommand);
|
||||
TempbanManager manager = new TempbanManager(bukkitService, messages, settings);
|
||||
@ -193,7 +193,7 @@ public class TempbanManagerTest {
|
||||
// given
|
||||
Player player = mock(Player.class);
|
||||
String ip = "22.44.66.88";
|
||||
TestHelper.mockPlayerIp(player, ip);
|
||||
TestHelper.mockIpAddressToPlayer(player, ip);
|
||||
String banReason = "kick msg";
|
||||
given(messages.retrieveSingle(player, MessageKey.TEMPBAN_MAX_LOGINS)).willReturn(banReason);
|
||||
Settings settings = mockSettings(10, 60, "");
|
||||
|
||||
@ -27,7 +27,7 @@ public class MessageKeyTest {
|
||||
String key = messageKey.getKey();
|
||||
if (!keys.add(key)) {
|
||||
fail("Found key '" + messageKey.getKey() + "' twice!");
|
||||
} else if (StringUtils.isEmpty(key)) {
|
||||
} else if (StringUtils.isBlank(key)) {
|
||||
fail("Key for message key '" + messageKey + "' is empty");
|
||||
}
|
||||
}
|
||||
|
||||
@ -40,7 +40,7 @@ public class MessagesFileConsistencyTest {
|
||||
final String key = messageKey.getKey();
|
||||
final String message = reader.getString(key);
|
||||
|
||||
if (StringUtils.isEmpty(message)) {
|
||||
if (StringUtils.isBlank(message)) {
|
||||
errors.add("Messages file should have message for key '" + key + "'");
|
||||
return;
|
||||
}
|
||||
|
||||
@ -81,7 +81,7 @@ public class YamlTextFileCheckerTest {
|
||||
private void checkFile(File file, String mandatoryKey, List<String> errors) {
|
||||
try {
|
||||
PropertyReader reader = new YamlFileReader(file);
|
||||
if (StringUtils.isEmpty(reader.getString(mandatoryKey))) {
|
||||
if (StringUtils.isBlank(reader.getString(mandatoryKey))) {
|
||||
errors.add("Message for '" + mandatoryKey + "' is empty");
|
||||
}
|
||||
} catch (Exception e) {
|
||||
|
||||
@ -125,7 +125,7 @@ public class AsynchronousLoginTest {
|
||||
String name = "oscar";
|
||||
String ip = "1.1.1.245";
|
||||
Player player = mockPlayer(name);
|
||||
TestHelper.mockPlayerIp(player, ip);
|
||||
TestHelper.mockIpAddressToPlayer(player, ip);
|
||||
given(playerCache.isAuthenticated(name)).willReturn(false);
|
||||
PlayerAuth auth = PlayerAuth.builder().name(name).build();
|
||||
given(dataSource.getAuth(name)).willReturn(auth);
|
||||
@ -148,7 +148,7 @@ public class AsynchronousLoginTest {
|
||||
String name = "oscar";
|
||||
String ip = "1.1.1.245";
|
||||
Player player = mockPlayer(name);
|
||||
TestHelper.mockPlayerIp(player, ip);
|
||||
TestHelper.mockIpAddressToPlayer(player, ip);
|
||||
given(playerCache.isAuthenticated(name)).willReturn(false);
|
||||
PlayerAuth auth = PlayerAuth.builder().name(name).build();
|
||||
given(dataSource.getAuth(name)).willReturn(auth);
|
||||
@ -243,26 +243,26 @@ public class AsynchronousLoginTest {
|
||||
private void mockOnlinePlayersInBukkitService() {
|
||||
// 1.1.1.1: albania (online), brazil (offline)
|
||||
Player playerA = mockPlayer("albania");
|
||||
TestHelper.mockPlayerIp(playerA, "1.1.1.1");
|
||||
TestHelper.mockIpAddressToPlayer(playerA, "1.1.1.1");
|
||||
given(dataSource.isLogged(playerA.getName())).willReturn(true);
|
||||
Player playerB = mockPlayer("brazil");
|
||||
TestHelper.mockPlayerIp(playerB, "1.1.1.1");
|
||||
TestHelper.mockIpAddressToPlayer(playerB, "1.1.1.1");
|
||||
given(dataSource.isLogged(playerB.getName())).willReturn(false);
|
||||
|
||||
// 2.2.2.2: congo (online), denmark (offline), ecuador (online)
|
||||
Player playerC = mockPlayer("congo");
|
||||
TestHelper.mockPlayerIp(playerC, "2.2.2.2");
|
||||
TestHelper.mockIpAddressToPlayer(playerC, "2.2.2.2");
|
||||
given(dataSource.isLogged(playerC.getName())).willReturn(true);
|
||||
Player playerD = mockPlayer("denmark");
|
||||
TestHelper.mockPlayerIp(playerD, "2.2.2.2");
|
||||
TestHelper.mockIpAddressToPlayer(playerD, "2.2.2.2");
|
||||
given(dataSource.isLogged(playerD.getName())).willReturn(false);
|
||||
Player playerE = mockPlayer("ecuador");
|
||||
TestHelper.mockPlayerIp(playerE, "2.2.2.2");
|
||||
TestHelper.mockIpAddressToPlayer(playerE, "2.2.2.2");
|
||||
given(dataSource.isLogged(playerE.getName())).willReturn(true);
|
||||
|
||||
// 3.3.3.3: france (offline)
|
||||
Player playerF = mockPlayer("france");
|
||||
TestHelper.mockPlayerIp(playerF, "3.3.3.3");
|
||||
TestHelper.mockIpAddressToPlayer(playerF, "3.3.3.3");
|
||||
|
||||
List<Player> onlinePlayers = Arrays.asList(playerA, playerB, playerC, playerD, playerE, playerF);
|
||||
given(bukkitService.getOnlinePlayers()).willReturn(onlinePlayers);
|
||||
|
||||
@ -111,7 +111,7 @@ public class AsyncRegisterTest {
|
||||
// given
|
||||
String name = "edbert";
|
||||
Player player = mockPlayerWithName(name);
|
||||
TestHelper.mockPlayerIp(player, "33.44.55.66");
|
||||
TestHelper.mockIpAddressToPlayer(player, "33.44.55.66");
|
||||
given(playerCache.isAuthenticated(name)).willReturn(false);
|
||||
given(commonService.getProperty(RegistrationSettings.IS_ENABLED)).willReturn(true);
|
||||
given(dataSource.isAuthAvailable(name)).willReturn(false);
|
||||
@ -136,7 +136,7 @@ public class AsyncRegisterTest {
|
||||
// given
|
||||
String name = "edbert";
|
||||
Player player = mockPlayerWithName(name);
|
||||
TestHelper.mockPlayerIp(player, "33.44.55.66");
|
||||
TestHelper.mockIpAddressToPlayer(player, "33.44.55.66");
|
||||
given(playerCache.isAuthenticated(name)).willReturn(false);
|
||||
given(commonService.getProperty(RegistrationSettings.IS_ENABLED)).willReturn(true);
|
||||
given(commonService.getProperty(RestrictionSettings.MAX_REGISTRATION_PER_IP)).willReturn(0);
|
||||
|
||||
@ -110,7 +110,7 @@ public class EmailRegisterExecutorTest {
|
||||
given(passwordSecurity.computeHash(anyString(), anyString())).willAnswer(
|
||||
invocation -> new HashedPassword(invocation.getArgument(0)));
|
||||
Player player = mock(Player.class);
|
||||
TestHelper.mockPlayerIp(player, "123.45.67.89");
|
||||
TestHelper.mockIpAddressToPlayer(player, "123.45.67.89");
|
||||
given(player.getName()).willReturn("Veronica");
|
||||
EmailRegisterParams params = EmailRegisterParams.of(player, "test@example.com");
|
||||
|
||||
|
||||
@ -97,7 +97,7 @@ public class PasswordRegisterExecutorTest {
|
||||
given(passwordSecurity.computeHash(anyString(), anyString())).willAnswer(
|
||||
invocation -> new HashedPassword(invocation.getArgument(0)));
|
||||
Player player = mockPlayerWithName("S1m0N");
|
||||
TestHelper.mockPlayerIp(player, "123.45.67.89");
|
||||
TestHelper.mockIpAddressToPlayer(player, "123.45.67.89");
|
||||
PasswordRegisterParams params = PasswordRegisterParams.of(player, "pass", "mail@example.org");
|
||||
|
||||
// when
|
||||
|
||||
@ -25,7 +25,7 @@ public class PlayerAuthBuilderHelperTest {
|
||||
Player player = mock(Player.class);
|
||||
given(player.getName()).willReturn("Noah");
|
||||
String ip = "192.168.34.47";
|
||||
TestHelper.mockPlayerIp(player, ip);
|
||||
TestHelper.mockIpAddressToPlayer(player, ip);
|
||||
HashedPassword hashedPassword = new HashedPassword("myHash0001");
|
||||
String email = "test@example.org";
|
||||
|
||||
|
||||
@ -74,9 +74,9 @@ public class HashAlgorithmIntegrationTest {
|
||||
}
|
||||
HashedPassword hashedPassword = method.computeHash("pwd", "name");
|
||||
assertThat("Salt should not be null if method.hasSeparateSalt(), and vice versa. Method: '"
|
||||
+ method + "'", StringUtils.isEmpty(hashedPassword.getSalt()), equalTo(!method.hasSeparateSalt()));
|
||||
+ method + "'", StringUtils.isBlank(hashedPassword.getSalt()), equalTo(!method.hasSeparateSalt()));
|
||||
assertThat("Hash should not be empty for method '" + method + "'",
|
||||
StringUtils.isEmpty(hashedPassword.getHash()), equalTo(false));
|
||||
StringUtils.isBlank(hashedPassword.getHash()), equalTo(false));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -8,6 +8,7 @@ import com.maxmind.geoip2.DatabaseReader;
|
||||
import com.maxmind.geoip2.model.CountryResponse;
|
||||
import com.maxmind.geoip2.record.Country;
|
||||
import fr.xephi.authme.settings.Settings;
|
||||
import fr.xephi.authme.settings.properties.ProtectionSettings;
|
||||
import org.junit.Before;
|
||||
import org.junit.Rule;
|
||||
import org.junit.Test;
|
||||
@ -24,6 +25,7 @@ import static org.hamcrest.Matchers.equalTo;
|
||||
import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.never;
|
||||
import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.Mockito.verifyNoInteractions;
|
||||
|
||||
/**
|
||||
* Test for {@link GeoIpService}.
|
||||
@ -63,6 +65,7 @@ public class GeoIpServiceTest {
|
||||
CountryResponse response = mock(CountryResponse.class);
|
||||
given(response.getCountry()).willReturn(country);
|
||||
given(lookupService.country(ip)).willReturn(response);
|
||||
given(settings.getProperty(ProtectionSettings.ENABLE_GEOIP)).willReturn(true);
|
||||
|
||||
// when
|
||||
String result = geoIpService.getCountryCode(ip.getHostAddress());
|
||||
@ -97,6 +100,7 @@ public class GeoIpServiceTest {
|
||||
CountryResponse response = mock(CountryResponse.class);
|
||||
given(response.getCountry()).willReturn(country);
|
||||
given(lookupService.country(ip)).willReturn(response);
|
||||
given(settings.getProperty(ProtectionSettings.ENABLE_GEOIP)).willReturn(true);
|
||||
|
||||
// when
|
||||
String result = geoIpService.getCountryName(ip.getHostAddress());
|
||||
@ -118,4 +122,18 @@ public class GeoIpServiceTest {
|
||||
assertThat(result, equalTo("LocalHost"));
|
||||
verify(lookupService, never()).country(ip);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void shouldNotLookUpCountryNameIfDisabled() throws Exception {
|
||||
// given
|
||||
InetAddress ip = InetAddress.getByName("24.45.167.89");
|
||||
given(settings.getProperty(ProtectionSettings.ENABLE_GEOIP)).willReturn(false);
|
||||
|
||||
// when
|
||||
String result = geoIpService.getCountryName(ip.getHostAddress());
|
||||
|
||||
// then
|
||||
assertThat(result, equalTo("N/A"));
|
||||
verifyNoInteractions(lookupService);
|
||||
}
|
||||
}
|
||||
|
||||
@ -78,15 +78,15 @@ public class PasswordRecoveryServiceTest {
|
||||
public void shouldKeepTrackOfSuccessfulRecoversByIp() {
|
||||
// given
|
||||
Player bobby = mock(Player.class);
|
||||
TestHelper.mockPlayerIp(bobby, "192.168.8.8");
|
||||
TestHelper.mockIpAddressToPlayer(bobby, "192.168.8.8");
|
||||
given(bobby.getName()).willReturn("bobby");
|
||||
|
||||
Player bobby2 = mock(Player.class);
|
||||
TestHelper.mockPlayerIp(bobby2, "127.0.0.1");
|
||||
TestHelper.mockIpAddressToPlayer(bobby2, "127.0.0.1");
|
||||
given(bobby2.getName()).willReturn("bobby");
|
||||
|
||||
Player other = mock(Player.class);
|
||||
TestHelper.mockPlayerIp(other, "192.168.8.8");
|
||||
TestHelper.mockIpAddressToPlayer(other, "192.168.8.8");
|
||||
given(other.getName()).willReturn("other");
|
||||
|
||||
// when
|
||||
@ -102,12 +102,12 @@ public class PasswordRecoveryServiceTest {
|
||||
public void shouldRemovePlayerFromSuccessfulRecovers() {
|
||||
// given
|
||||
Player bobby = mock(Player.class);
|
||||
TestHelper.mockPlayerIp(bobby, "192.168.8.8");
|
||||
TestHelper.mockIpAddressToPlayer(bobby, "192.168.8.8");
|
||||
given(bobby.getName()).willReturn("bobby");
|
||||
recoveryService.addSuccessfulRecovery(bobby);
|
||||
|
||||
Player other = mock(Player.class);
|
||||
TestHelper.mockPlayerIp(other, "8.8.8.8");
|
||||
TestHelper.mockIpAddressToPlayer(other, "8.8.8.8");
|
||||
given(other.getName()).willReturn("other");
|
||||
recoveryService.addSuccessfulRecovery(other);
|
||||
|
||||
|
||||
@ -240,7 +240,7 @@ public class SessionServiceTest {
|
||||
private static Player mockPlayerWithNameAndIp(String name, String ip) {
|
||||
Player player = mock(Player.class);
|
||||
given(player.getName()).willReturn(name);
|
||||
TestHelper.mockPlayerIp(player, ip);
|
||||
TestHelper.mockIpAddressToPlayer(player, ip);
|
||||
return player;
|
||||
}
|
||||
}
|
||||
|
||||
@ -21,7 +21,9 @@ import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.mockito.ArgumentCaptor;
|
||||
import org.mockito.Mock;
|
||||
import org.mockito.Mockito;
|
||||
|
||||
import java.net.InetSocketAddress;
|
||||
import java.util.Collections;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
@ -30,7 +32,9 @@ import static java.util.Arrays.asList;
|
||||
import static org.hamcrest.Matchers.containsString;
|
||||
import static org.hamcrest.Matchers.equalTo;
|
||||
import static org.hamcrest.MatcherAssert.assertThat;
|
||||
import static org.mockito.ArgumentMatchers.any;
|
||||
import static org.mockito.BDDMockito.given;
|
||||
import static org.mockito.BDDMockito.willReturn;
|
||||
import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.Mockito.verifyNoInteractions;
|
||||
@ -358,18 +362,23 @@ public class ValidationServiceTest {
|
||||
Player gabriel2 = mockPlayer("Gabriel", "93.23.33.34");
|
||||
Player emanuel = mockPlayer("emanuel", "94.65.24.10");
|
||||
Player emanuel2 = mockPlayer("emanuel", "94.65.60.10");
|
||||
Player imyourisp = mockPlayer("imyourisp", "bazinga.yourisp.net");
|
||||
Player imYourIsp = mockPlayer("imyourisp", "65.65.65.65");
|
||||
Player notRestricted = mockPlayer("notRestricted", "0.0.0.0");
|
||||
|
||||
ValidationService validationServiceSpy = Mockito.spy(validationService);
|
||||
willReturn("bogus.tld").given(validationServiceSpy).getHostName(any(InetSocketAddress.class));
|
||||
InetSocketAddress imYourIspSocketAddr = imYourIsp.getAddress();
|
||||
willReturn("bazinga.yourisp.net").given(validationServiceSpy).getHostName(imYourIspSocketAddr);
|
||||
|
||||
// when
|
||||
boolean isBobbyAdmitted = validationService.fulfillsNameRestrictions(bobby);
|
||||
boolean isTamaraAdmitted = validationService.fulfillsNameRestrictions(tamara);
|
||||
boolean isGabrielAdmitted = validationService.fulfillsNameRestrictions(gabriel);
|
||||
boolean isGabriel2Admitted = validationService.fulfillsNameRestrictions(gabriel2);
|
||||
boolean isEmanuelAdmitted = validationService.fulfillsNameRestrictions(emanuel);
|
||||
boolean isEmanuel2Admitted = validationService.fulfillsNameRestrictions(emanuel2);
|
||||
boolean isImyourispAdmitted = validationService.fulfillsNameRestrictions(imyourisp);
|
||||
boolean isNotRestrictedAdmitted = validationService.fulfillsNameRestrictions(notRestricted);
|
||||
boolean isBobbyAdmitted = validationServiceSpy.fulfillsNameRestrictions(bobby);
|
||||
boolean isTamaraAdmitted = validationServiceSpy.fulfillsNameRestrictions(tamara);
|
||||
boolean isGabrielAdmitted = validationServiceSpy.fulfillsNameRestrictions(gabriel);
|
||||
boolean isGabriel2Admitted = validationServiceSpy.fulfillsNameRestrictions(gabriel2);
|
||||
boolean isEmanuelAdmitted = validationServiceSpy.fulfillsNameRestrictions(emanuel);
|
||||
boolean isEmanuel2Admitted = validationServiceSpy.fulfillsNameRestrictions(emanuel2);
|
||||
boolean isImYourIspAdmitted = validationServiceSpy.fulfillsNameRestrictions(imYourIsp);
|
||||
boolean isNotRestrictedAdmitted = validationServiceSpy.fulfillsNameRestrictions(notRestricted);
|
||||
|
||||
// then
|
||||
assertThat(isBobbyAdmitted, equalTo(true));
|
||||
@ -378,7 +387,7 @@ public class ValidationServiceTest {
|
||||
assertThat(isGabriel2Admitted, equalTo(false));
|
||||
assertThat(isEmanuelAdmitted, equalTo(true));
|
||||
assertThat(isEmanuel2Admitted, equalTo(false));
|
||||
assertThat(isImyourispAdmitted, equalTo(true));
|
||||
assertThat(isImYourIspAdmitted, equalTo(true));
|
||||
assertThat(isNotRestrictedAdmitted, equalTo(true));
|
||||
}
|
||||
|
||||
@ -402,8 +411,7 @@ public class ValidationServiceTest {
|
||||
private static Player mockPlayer(String name, String ip) {
|
||||
Player player = mock(Player.class);
|
||||
given(player.getName()).willReturn(name);
|
||||
TestHelper.mockPlayerIp(player, ip);
|
||||
given(player.getAddress().getHostName()).willReturn("--");
|
||||
TestHelper.mockIpAddressToPlayer(player, ip);
|
||||
return player;
|
||||
}
|
||||
|
||||
|
||||
@ -92,7 +92,7 @@ public class WelcomeMessageConfigurationTest {
|
||||
|
||||
Player player = mock(Player.class);
|
||||
given(player.getName()).willReturn("Bobby");
|
||||
TestHelper.mockPlayerIp(player, "123.45.66.77");
|
||||
TestHelper.mockIpAddressToPlayer(player, "123.45.66.77");
|
||||
given(geoIpService.getCountryName("123.45.66.77")).willReturn("Syldavia");
|
||||
given(service.getProperty(PluginSettings.SERVER_NAME)).willReturn("CrazyServer");
|
||||
|
||||
|
||||
@ -313,7 +313,7 @@ public class CommandManagerTest {
|
||||
given(player.getName()).willReturn("Bobby");
|
||||
given(player.getDisplayName()).willReturn("bob");
|
||||
String ip = "127.0.0.3";
|
||||
TestHelper.mockPlayerIp(player, ip);
|
||||
TestHelper.mockIpAddressToPlayer(player, ip);
|
||||
given(geoIpService.getCountryName(ip)).willReturn("Syldavia");
|
||||
return player;
|
||||
}
|
||||
|
||||
@ -40,10 +40,10 @@ public class ExceptionUtilsTest {
|
||||
@Test
|
||||
public void shouldHandleCircularCausesGracefully() {
|
||||
// given
|
||||
IllegalStateException ise = new IllegalStateException();
|
||||
UnsupportedOperationException uoe = new UnsupportedOperationException(ise);
|
||||
ExceptionWithSettableCause exceptionWithSettableCause = new ExceptionWithSettableCause();
|
||||
UnsupportedOperationException uoe = new UnsupportedOperationException(exceptionWithSettableCause);
|
||||
ReflectiveOperationException roe = new ReflectiveOperationException(uoe);
|
||||
ReflectionTestUtils.setField(Throwable.class, ise, "cause", roe);
|
||||
exceptionWithSettableCause.cause = roe;
|
||||
|
||||
// when
|
||||
NullPointerException resultNpe = ExceptionUtils.findThrowableInCause(NullPointerException.class, uoe);
|
||||
@ -65,4 +65,14 @@ public class ExceptionUtilsTest {
|
||||
// then
|
||||
assertThat(result, equalTo("[MalformedURLException]: Unrecognized URL format"));
|
||||
}
|
||||
|
||||
private static final class ExceptionWithSettableCause extends Exception {
|
||||
|
||||
Exception cause;
|
||||
|
||||
@Override
|
||||
public synchronized Throwable getCause() {
|
||||
return cause;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -25,7 +25,7 @@ public class PlayerUtilsTest {
|
||||
// given
|
||||
Player player = mock(Player.class);
|
||||
String ip = "124.86.248.62";
|
||||
TestHelper.mockPlayerIp(player, ip);
|
||||
TestHelper.mockIpAddressToPlayer(player, ip);
|
||||
|
||||
// when
|
||||
String result = PlayerUtils.getPlayerIp(player);
|
||||
|
||||
@ -49,15 +49,15 @@ public class StringUtilsTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void shouldCheckIsEmptyUtil() {
|
||||
public void shouldCheckIfIsBlankString() {
|
||||
// Should be true for null/empty/whitespace
|
||||
assertTrue(StringUtils.isEmpty(null));
|
||||
assertTrue(StringUtils.isEmpty(""));
|
||||
assertTrue(StringUtils.isEmpty(" \t"));
|
||||
assertTrue(StringUtils.isBlank(null));
|
||||
assertTrue(StringUtils.isBlank(""));
|
||||
assertTrue(StringUtils.isBlank(" \t"));
|
||||
|
||||
// Should be false if string has content
|
||||
assertFalse(StringUtils.isEmpty("P"));
|
||||
assertFalse(StringUtils.isEmpty(" test"));
|
||||
assertFalse(StringUtils.isBlank("P"));
|
||||
assertFalse(StringUtils.isBlank(" test"));
|
||||
}
|
||||
|
||||
@Test
|
||||
|
||||
@ -121,6 +121,7 @@ public class TranslationPageGenerator implements AutoToolTask {
|
||||
.put("hu", "Hungarian")
|
||||
.put("id", "Indonesian")
|
||||
.put("it", "Italian")
|
||||
.put("ja", "Japanese")
|
||||
.put("ko", "Korean")
|
||||
.put("lt", "Lithuanian")
|
||||
.put("nl", "Dutch")
|
||||
|
||||
@ -44,7 +44,7 @@ public final class VerifyMessagesTask implements ToolTask {
|
||||
boolean addMissingKeys = "y".equalsIgnoreCase(scanner.nextLine());
|
||||
|
||||
List<File> messageFiles;
|
||||
if (StringUtils.isEmpty(inputFile)) {
|
||||
if (StringUtils.isBlank(inputFile)) {
|
||||
messageFiles = getMessagesFiles();
|
||||
} else {
|
||||
File customFile = new File(MAIN_RESOURCES_ROOT, MessagePathHelper.createMessageFilePath(inputFile));
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user