Skip to content

Commit

Permalink
Current state
Browse files Browse the repository at this point in the history
  • Loading branch information
Danielxs01 committed May 15, 2021
1 parent 287e0cc commit c3408f8
Show file tree
Hide file tree
Showing 6 changed files with 217 additions and 29 deletions.
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

<groupId>net.landofrails</groupId>
<artifactId>MessageAPI</artifactId>
<version>1.0.0</version>
<version>1.2.2</version>
<packaging>jar</packaging>

<name>MessageAPI</name>
Expand Down
10 changes: 9 additions & 1 deletion src/main/java/net/landofrails/MessageAPI/api/ELanguage.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,13 @@

import java.util.Optional;

/**
*
* Contains almost every minecraft language.
*
* @author Daniel
*
*/
public enum ELanguage {

// @formatter:off
Expand Down Expand Up @@ -133,8 +140,9 @@ public enum ELanguage {
CHINESE_SIMPLIFIED("简体中文 (中国) (Jiǎntǐ Zhōngwén (Zhōngguó))", "zh_cn"),
CHINESE_TRADITIONAL_HONGKONG("繁體中文 (香港) (Fántǐ Zhōngwén (Xiānggǎng))", "zh_hk"),
CHINESE_TRADITIONAL_TAIWAN("繁體中文 (台灣) (Fántǐ Zhōngwén (Táiwān))", "zh_tw");

// @formatter:on

private String name;
private String locale;

Expand Down
87 changes: 68 additions & 19 deletions src/main/java/net/landofrails/MessageAPI/api/MessageAPI.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,14 @@
import java.io.File;
import java.io.IOException;
import java.text.MessageFormat;
import java.util.AbstractMap.SimpleEntry;
import java.util.EnumMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import org.bukkit.Bukkit;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.InvalidConfigurationException;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;
Expand All @@ -20,13 +23,10 @@ public final class MessageAPI<E extends Enum<E> & IMessageAPI> {

public static final ELanguage DEFAULT_LANGUAGE = ELanguage.AMERICAN_ENGLISH;

private Map<ELanguage, FileConfiguration> configuration = new EnumMap<>(ELanguage.class);
private Map<ELanguage, File> configurationFiles = new EnumMap<>(ELanguage.class);
private Map<ELanguage, Entry<FileConfiguration, File>> configs = new EnumMap<>(ELanguage.class);

private MessageAPI(JavaPlugin plugin, Class<E> enumClass) {

checkConfigs(plugin, enumClass);

}

/**
Expand All @@ -46,13 +46,13 @@ public static <E extends Enum<E> & IMessageAPI> MessageAPI<E> register(JavaPlugi
/**
*
* Returns the players language, if that fails it will return the value from
* {@link MessageAPI#defaultLanguage()}.
* {@link MessageAPI#serverLanguage()}.
*
* @param player
* @return ELanguage
*/
public static ELanguage getLanguage(Player player) {
return ELanguage.getFromLocale(player.getLocale().toLowerCase()).orElse(defaultLanguage());
return ELanguage.getFromLocale(player.getLocale().toLowerCase()).orElse(serverLanguage());
}

/**
Expand All @@ -62,60 +62,110 @@ public static ELanguage getLanguage(Player player) {
*
* @return ELanguage
*/
private static ELanguage defaultLanguage() {
public static ELanguage serverLanguage() {
try {
return MessageAPIPlugin.getInstance().getServerLanguage();
} catch (Exception e) {
return DEFAULT_LANGUAGE;
}
}

/**
*
* Sends a message to the console. Calls {@link MessageAPI#serverLanguage()}
* for the wanted language.
*
* @param message
* @param arguments
*/
public void sendToConsole(IMessageAPI message, Object... arguments) {
String text = getTranslatedText(message, defaultLanguage(), true, arguments);
String text = getTranslatedText(message, serverLanguage(), true, arguments);
Bukkit.getConsoleSender().sendMessage(text);
}

/**
*
* Sends a message to a player. Calls {@link MessageAPI#getLanguage(Player)}
* for the players language.
*
* @param player
* @param message
* @param arguments
*/
public void sendTo(Player player, IMessageAPI message, Object... arguments) {
String text = getTranslatedText(message, getLanguage(player), true, arguments);
player.sendMessage(text);
}

public void sendTo(CommandSender sender, IMessageAPI message, Object... arguments) {
ELanguage lang = sender instanceof Player ? getLanguage((Player) sender) : serverLanguage();
String text = getTranslatedText(message, lang, true, arguments);
sender.sendMessage(text);
}

/**
*
* Calls {@link MessageAPI#sendTo(Player, IMessageAPI, Object...)} for every
* player.
*
* @param players
* @param message
* @param arguments
*/
public void sendTo(List<Player> players, IMessageAPI message, Object... arguments) {
players.forEach(p -> sendTo(p, message, true, arguments));
}

/**
*
* Translates the text in the given language. Arguments are inserted via
* {@link MessageFormat#format(String, Object...)}.
*
* @param message
* @param language
* @param returnPathIfMissing
* @param arguments
* @return
*/
public String getTranslatedText(IMessageAPI message, ELanguage language, boolean returnPathIfMissing, Object... arguments) {
if (configuration.containsKey(language)) {
FileConfiguration config = configuration.get(language);
if (configs.containsKey(language)) {
FileConfiguration config = configs.get(language).getKey();
if (config.contains(message.getPath())) {
return MessageFormat.format(config.getString(message.getPath()), arguments);
}
}
return returnPathIfMissing ? message.getPath() : null;
}

/**
*
* Creates lang files for the enum constants. Loads all lang files.
*
* @param plugin
* @param enumClass
*/
private void checkConfigs(JavaPlugin plugin, Class<E> enumClass) {

// For existing constant languages
for (E enumConstant : enumClass.getEnumConstants()) {
for (TranslatedText text : enumConstant.getText()) {
if (!configuration.containsKey(text.getLanguage())) {
if (!configs.containsKey(text.getLanguage())) {
// Create config
FileConfiguration config = new YamlConfiguration();
try {
File folder = new File(plugin.getDataFolder(), "messages");
folder.mkdirs();
File configFile = new File(folder, text.getLanguage().getLocale() + ".yml");
configFile.createNewFile();
configurationFiles.put(text.getLanguage(), configFile);
config.load(configFile);

configs.put(text.getLanguage(), new SimpleEntry<FileConfiguration, File>(config, configFile));
} catch (IOException | InvalidConfigurationException e) {
e.printStackTrace();
}
configuration.put(text.getLanguage(), config);
}

FileConfiguration config = configuration.get(text.getLanguage());
FileConfiguration config = configs.get(text.getLanguage()).getKey();
if (!config.contains(enumConstant.getPath())) {
config.set(enumConstant.getPath(), text.getText());
}
Expand All @@ -124,27 +174,26 @@ private void checkConfigs(JavaPlugin plugin, Class<E> enumClass) {
}

// Save changes made
for (ELanguage lang : configuration.keySet()) {
for (ELanguage lang : configs.keySet()) {
try {
configuration.get(lang).save(configurationFiles.get(lang));
configs.get(lang).getKey().save(configs.get(lang).getValue());
} catch (IOException e) {
e.printStackTrace();
}
}

// check if there are other lang files
for (ELanguage lang : ELanguage.values()) {
if (!configuration.containsKey(lang)) {
if (!configs.containsKey(lang)) {
// Create config
FileConfiguration config = new YamlConfiguration();
try {
File folder = new File(plugin.getDataFolder(), "messages");
folder.mkdirs();
File configFile = new File(folder, lang.getLocale() + ".yml");
if (configFile.exists()) {
configurationFiles.put(lang, configFile);
config.load(configFile);
configuration.put(lang, config);
configs.put(lang, new SimpleEntry<FileConfiguration, File>(config, configFile));
}
} catch (IOException | InvalidConfigurationException e) {
e.printStackTrace();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,13 @@
package net.landofrails.MessageAPI.plugin;

import static net.landofrails.MessageAPI.api.ELanguage.AMERICAN_ENGLISH;
import static net.landofrails.MessageAPI.api.ELanguage.AUSTRALIAN_ENGLISH;
import static net.landofrails.MessageAPI.api.ELanguage.AUSTRIAN_GERMAN;
import static net.landofrails.MessageAPI.api.ELanguage.BRITISH_ENGLISH;
import static net.landofrails.MessageAPI.api.ELanguage.CANADIAN_ENGLISH;
import static net.landofrails.MessageAPI.api.ELanguage.GERMAN;
import static net.landofrails.MessageAPI.api.ELanguage.NEW_ZEALAND_ENGLISH;
import static net.landofrails.MessageAPI.api.ELanguage.SWISS_GERMAN;

import net.landofrails.MessageAPI.api.IMessageAPI;
import net.landofrails.MessageAPI.api.TranslatedText;
Expand All @@ -12,12 +18,89 @@ public enum MessageAPIMessages implements IMessageAPI {
LOADING_START(
"loading.start",
new TranslatedText(AMERICAN_ENGLISH, "[MessageAPI] Loading phase started.."),
new TranslatedText(GERMAN, "[MessageAPI] Lade-Phase begonnen..")
new TranslatedText(AUSTRALIAN_ENGLISH, "[MessageAPI] Loading phase started.."),
new TranslatedText(CANADIAN_ENGLISH, "[MessageAPI] Loading phase started.."),
new TranslatedText(BRITISH_ENGLISH, "[MessageAPI] Loading phase started.."),
new TranslatedText(NEW_ZEALAND_ENGLISH, "[MessageAPI] Loading phase started.."),

new TranslatedText(GERMAN, "[MessageAPI] Lade-Phase begonnen.."),
new TranslatedText(SWISS_GERMAN, "[MessageAPI] Lade-Phase begonnen.."),
new TranslatedText(AUSTRIAN_GERMAN, "[MessageAPI] Lade-Phase begonnen..")
),
LOADING_END(
"loading.end",
new TranslatedText(AMERICAN_ENGLISH, "[MessageAPI] Loading phase finished."),
new TranslatedText(GERMAN, "[MessageAPI] Lade-Phase beendet.")
new TranslatedText(AUSTRALIAN_ENGLISH, "[MessageAPI] Loading phase finished."),
new TranslatedText(CANADIAN_ENGLISH, "[MessageAPI] Loading phase finished."),
new TranslatedText(BRITISH_ENGLISH, "[MessageAPI] Loading phase finished."),
new TranslatedText(NEW_ZEALAND_ENGLISH, "[MessageAPI] Loading phase finished."),

new TranslatedText(GERMAN, "[MessageAPI] Lade-Phase beendet."),
new TranslatedText(SWISS_GERMAN, "[MessageAPI] Lade-Phase beendet."),
new TranslatedText(AUSTRIAN_GERMAN, "[MessageAPI] Lade-Phase beendet.")
),

REGISTER_COMMAND_START(
"register_command.start",
new TranslatedText(AMERICAN_ENGLISH, "[MessageAPI] Starting command registration.."),
new TranslatedText(AUSTRALIAN_ENGLISH, "[MessageAPI] Starting command registration.."),
new TranslatedText(CANADIAN_ENGLISH, "[MessageAPI] Starting command registration.."),
new TranslatedText(BRITISH_ENGLISH, "[MessageAPI] Starting command registration.."),
new TranslatedText(NEW_ZEALAND_ENGLISH, "[MessageAPI] Starting command registration.."),

new TranslatedText(GERMAN, "[MessageAPI] Registriere Befehl.."),
new TranslatedText(SWISS_GERMAN, "[MessageAPI] Registriere Befehl.."),
new TranslatedText(AUSTRIAN_GERMAN, "[MessageAPI] Registriere Befehl..")
),
REGISTER_COMMAND_END(
"register_command.end",
new TranslatedText(AMERICAN_ENGLISH, "[MessageAPI] Command registrated."),
new TranslatedText(AUSTRALIAN_ENGLISH, "[MessageAPI] Command registrated."),
new TranslatedText(CANADIAN_ENGLISH, "[MessageAPI] Command registrated."),
new TranslatedText(BRITISH_ENGLISH, "[MessageAPI] Command registrated."),
new TranslatedText(NEW_ZEALAND_ENGLISH, "[MessageAPI] Command registrated."),

new TranslatedText(GERMAN, "[MessageAPI] Befehl registriert."),
new TranslatedText(SWISS_GERMAN, "[MessageAPI] Befehl registriert."),
new TranslatedText(AUSTRIAN_GERMAN, "[MessageAPI] Befehl registriert.")
),

DISABLING_PLUGIN(
"disabling_plugin",
new TranslatedText(AMERICAN_ENGLISH, "[MessageAPI] Disabling plugin."),
new TranslatedText(AUSTRALIAN_ENGLISH, "[MessageAPI] Disabling plugin."),
new TranslatedText(CANADIAN_ENGLISH, "[MessageAPI] Disabling plugin."),
new TranslatedText(BRITISH_ENGLISH, "[MessageAPI] Disabling plugin."),
new TranslatedText(NEW_ZEALAND_ENGLISH, "[MessageAPI] Disabling plugin."),

new TranslatedText(GERMAN, "[MessageAPI] Plugin wird gestoppt."),
new TranslatedText(SWISS_GERMAN, "[MessageAPI] Plugin wird gestoppt."),
new TranslatedText(AUSTRIAN_GERMAN, "[MessageAPI] Plugin wird gestoppt.")
),

LANGUAGE_SERVER(
"language.server",
new TranslatedText(AMERICAN_ENGLISH, "[MessageAPI] Server language: {0}, {1}"),
new TranslatedText(AUSTRALIAN_ENGLISH, "[MessageAPI] Server language: {0}, {1}"),
new TranslatedText(CANADIAN_ENGLISH, "[MessageAPI] Server language: {0}, {1}"),
new TranslatedText(BRITISH_ENGLISH, "[MessageAPI] Server language: {0}, {1}"),
new TranslatedText(NEW_ZEALAND_ENGLISH, "[MessageAPI] Server language: {0}, {1}"),

new TranslatedText(GERMAN, "[MessageAPI] Server Sprache: {0}, {1}"),
new TranslatedText(SWISS_GERMAN, "[MessageAPI] Server Sprache: {0}, {1}"),
new TranslatedText(AUSTRIAN_GERMAN, "[MessageAPI] Server Sprache: {0}, {1}")
),
LANGUAGE_PLAYER(
"language.player",
new TranslatedText(AMERICAN_ENGLISH, "[MessageAPI] {0}s language: {1}, {2}"),
new TranslatedText(AUSTRALIAN_ENGLISH, "[MessageAPI] {0}s language: {1}, {2}"),
new TranslatedText(CANADIAN_ENGLISH, "[MessageAPI] {0}s language: {1}, {2}"),
new TranslatedText(BRITISH_ENGLISH, "[MessageAPI] {0}s language: {1}, {2}"),
new TranslatedText(NEW_ZEALAND_ENGLISH, "[MessageAPI] {0}s language: {1}, {2}"),

new TranslatedText(GERMAN, "[MessageAPI] {0}s Sprache: {1}, {2}"),
new TranslatedText(SWISS_GERMAN, "[MessageAPI] {0}s Sprache: {1}, {2}"),
new TranslatedText(AUSTRIAN_GERMAN, "[MessageAPI] {0}s Sprache: {1}, {2}")
);
// @formatter:on

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@

import net.landofrails.MessageAPI.api.ELanguage;
import net.landofrails.MessageAPI.api.MessageAPI;
import net.landofrails.MessageAPI.plugin.utils.MessageAPIPluginUtils;

public class MessageAPIPlugin extends JavaPlugin {

Expand Down Expand Up @@ -39,6 +40,7 @@ public void onLoad() {

@Override
public void onEnable() {
messageAPI.sendToConsole(MessageAPIMessages.REGISTER_COMMAND_START);
try {
final Field bukkitCommandMap = Bukkit.getServer().getClass().getDeclaredField("commandMap");

Expand All @@ -48,11 +50,13 @@ public void onEnable() {
commandMap.register("lang", new BukkitCommand("lang") {
@Override
public boolean execute(CommandSender sender, String commandLabel, String[] args) {
if (sender instanceof Player) {
sender.sendMessage("PlayerLang: " + MessageAPI.getLanguage((Player) sender));
sender.sendMessage("ServerLang: " + getServerLanguage().getName());
} else {
System.out.println("Du bist kein Spieler!");
ELanguage lang = MessageAPI.serverLanguage();
messageAPI.sendTo(sender, MessageAPIMessages.LANGUAGE_SERVER, lang.getName(), lang.getLocale());

for (Player p : Bukkit.getOnlinePlayers()) {
ELanguage playerLang = MessageAPI.getLanguage(p);
messageAPI.sendTo(sender, MessageAPIMessages.LANGUAGE_PLAYER, p.getName(), playerLang.getName(),
playerLang.getLocale());
}
return true;
}
Expand All @@ -62,11 +66,14 @@ public boolean execute(CommandSender sender, String commandLabel, String[] args)
} catch (IllegalArgumentException | IllegalAccessException | NoSuchFieldException | SecurityException e) {
e.printStackTrace();
}
messageAPI.sendToConsole(MessageAPIMessages.REGISTER_COMMAND_END);
}

@Override
public void onDisable() {

MessageAPIPluginUtils.unRegisterBukkitCommand(this, Bukkit.getPluginCommand("lang"));
messageAPI.sendToConsole(MessageAPIMessages.DISABLING_PLUGIN);
messageAPI = null;
}

private void checkConfig() {
Expand Down
Loading

0 comments on commit c3408f8

Please sign in to comment.