diff --git a/src/main/java/fr/xephi/authme/message/AbstractMessageFileHandler.java b/src/main/java/fr/xephi/authme/message/AbstractMessageFileHandler.java index 5e6fc221..d7cc73f0 100644 --- a/src/main/java/fr/xephi/authme/message/AbstractMessageFileHandler.java +++ b/src/main/java/fr/xephi/authme/message/AbstractMessageFileHandler.java @@ -14,6 +14,7 @@ import org.bukkit.configuration.file.YamlConfiguration; import javax.annotation.PostConstruct; import javax.inject.Inject; import java.io.File; +import java.util.concurrent.ConcurrentHashMap; import static fr.xephi.authme.message.MessagePathHelper.DEFAULT_LANGUAGE; @@ -33,6 +34,7 @@ public abstract class AbstractMessageFileHandler implements Reloadable { private String filename; private FileConfiguration configuration; + private ConcurrentHashMap i18nConfiguration; private final String defaultFile; protected AbstractMessageFileHandler() { @@ -46,6 +48,7 @@ public abstract class AbstractMessageFileHandler implements Reloadable { filename = createFilePath(language); File messagesFile = initializeFile(filename); configuration = YamlConfiguration.loadConfiguration(messagesFile); + i18nConfiguration = null; } protected String getLanguage() { @@ -83,6 +86,24 @@ public abstract class AbstractMessageFileHandler implements Reloadable { : message; } + /** + * Returns the i18n message for the given key and given locale. + * + * @param key the key to retrieve the message for + * @param locale the locale that player client setting uses + * @return the message + */ + public String getMessageByLocale(String key, String locale) { + if (locale == null || !settings.getProperty(PluginSettings.I18N_MESSAGES)) { + return getMessage(key); + } + + String message = getI18nConfiguration(locale).getString(key); + return message == null + ? "Error retrieving message '" + key + "'" + : message; + } + /** * Returns the message for the given key only if it exists, * i.e. without falling back to the default file. @@ -94,6 +115,25 @@ public abstract class AbstractMessageFileHandler implements Reloadable { return configuration.getString(key); } + public FileConfiguration getI18nConfiguration(String locale) { + if (i18nConfiguration == null) { + i18nConfiguration = new ConcurrentHashMap<>(); + } + + if (i18nConfiguration.containsKey(locale)) { + return i18nConfiguration.get(locale); + } else { + // Sync with reload(); + String i18nFilename = createFilePath(locale); + File i18nMessagesFile = initializeFile(i18nFilename); + FileConfiguration config = YamlConfiguration.loadConfiguration(i18nMessagesFile); + + i18nConfiguration.put(locale, config); + + return config; + } + } + /** * Creates the path to the messages file for the given language code. * diff --git a/src/main/java/fr/xephi/authme/message/Messages.java b/src/main/java/fr/xephi/authme/message/Messages.java index 1989fddd..ad781bd8 100644 --- a/src/main/java/fr/xephi/authme/message/Messages.java +++ b/src/main/java/fr/xephi/authme/message/Messages.java @@ -4,6 +4,7 @@ import com.google.common.collect.ImmutableMap; import fr.xephi.authme.ConsoleLogger; import fr.xephi.authme.mail.EmailService; import fr.xephi.authme.output.ConsoleLoggerFactory; +import fr.xephi.authme.util.PlayerUtils; import fr.xephi.authme.util.expiring.Duration; import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; @@ -120,7 +121,8 @@ public class Messages { * @return The message from the file */ private String retrieveMessage(MessageKey key, CommandSender sender) { - String message = messagesFileHandler.getMessage(key.getKey()); + String locale = PlayerUtils.getLocale(sender); + String message = messagesFileHandler.getMessageByLocale(key.getKey(), locale); String displayName = sender.getName(); if (sender instanceof Player) { displayName = ((Player) sender).getDisplayName(); diff --git a/src/main/java/fr/xephi/authme/settings/properties/PluginSettings.java b/src/main/java/fr/xephi/authme/settings/properties/PluginSettings.java index 1047cf01..2859a509 100644 --- a/src/main/java/fr/xephi/authme/settings/properties/PluginSettings.java +++ b/src/main/java/fr/xephi/authme/settings/properties/PluginSettings.java @@ -16,6 +16,13 @@ public final class PluginSettings implements SettingsHolder { public static final Property MENU_UNREGISTER_COMPATIBILITY = newProperty("3rdPartyFeature.compatibility.menuPlugins", false); + @Comment({ + "Send i18n messages to player based on their client settings, this option will override `settings.messagesLanguage`", + "This will not affect language of authme help command." + }) + public static final Property I18N_MESSAGES = + newProperty("3rdPartyFeature.features.i18nMessages.enabled", false); + @Comment({ "Do you want to enable the session feature?", "If enabled, when a player authenticates successfully,", diff --git a/src/main/java/fr/xephi/authme/util/PlayerUtils.java b/src/main/java/fr/xephi/authme/util/PlayerUtils.java index d9b867d7..d25d71bb 100644 --- a/src/main/java/fr/xephi/authme/util/PlayerUtils.java +++ b/src/main/java/fr/xephi/authme/util/PlayerUtils.java @@ -1,7 +1,10 @@ package fr.xephi.authme.util; +import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +import java.lang.reflect.Method; + /** * Player utilities. */ @@ -36,4 +39,30 @@ public final class PlayerUtils { } } + /** + * Returns the locale that player uses. + * + * @param sender The player + */ + public static String getLocale(CommandSender sender) { + String locale = null; + + if (sender instanceof Player) { + Player player = (Player) sender; + if (Utils.majorVersion >= 12) { + locale = player.getLocale(); + } else { + try { + Method spigotMethod = player.getClass().getMethod("spigot"); + Object spigot = spigotMethod.invoke(player); + + Method spigotGetLocaleMethod = spigot.getClass().getMethod("getLocale"); + locale = (String) spigotGetLocaleMethod.invoke(spigot); + } catch (Exception ignored) { + } + } + } + + return locale; + } } diff --git a/src/main/java/fr/xephi/authme/util/Utils.java b/src/main/java/fr/xephi/authme/util/Utils.java index 4165b007..565780ea 100644 --- a/src/main/java/fr/xephi/authme/util/Utils.java +++ b/src/main/java/fr/xephi/authme/util/Utils.java @@ -2,6 +2,7 @@ package fr.xephi.authme.util; import fr.xephi.authme.ConsoleLogger; import fr.xephi.authme.output.ConsoleLoggerFactory; +import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; import org.bukkit.command.ConsoleCommandSender; @@ -107,4 +108,12 @@ public final class Utils { public static boolean isEmailEmpty(String email) { return StringUtils.isBlank(email) || "your@email.com".equalsIgnoreCase(email); } + + private final static String[] serverVersion = Bukkit.getServer().getBukkitVersion() + .substring(0, Bukkit.getServer().getBukkitVersion().indexOf("-")) + .split("\\."); + + private final static int mcFirstVersion = Integer.parseInt(serverVersion[0]); + public final static int majorVersion = Integer.parseInt(serverVersion[1]); + public final static int minorVersion = Integer.parseInt(serverVersion[2]); }