diff --git a/src/main/java/net/citizensnpcs/Citizens.java b/src/main/java/net/citizensnpcs/Citizens.java index 730e59a74..5712bb246 100644 --- a/src/main/java/net/citizensnpcs/Citizens.java +++ b/src/main/java/net/citizensnpcs/Citizens.java @@ -3,6 +3,7 @@ package net.citizensnpcs; import java.io.File; import java.io.IOException; import java.util.Iterator; +import java.util.Locale; import net.citizensnpcs.Settings.Setting; import net.citizensnpcs.api.CitizensAPI; @@ -36,8 +37,10 @@ import net.citizensnpcs.editor.Editor; import net.citizensnpcs.npc.CitizensNPCRegistry; import net.citizensnpcs.npc.CitizensTraitFactory; import net.citizensnpcs.npc.NPCSelector; +import net.citizensnpcs.util.Messages; import net.citizensnpcs.util.Messaging; import net.citizensnpcs.util.StringHelper; +import net.citizensnpcs.util.Translator; import net.milkbowl.vault.economy.Economy; import org.bukkit.Bukkit; @@ -199,7 +202,7 @@ public class Citizens extends JavaPlugin implements CitizensPlugin { config = new Settings(getDataFolder()); saves = NPCDataStore.create(getDataFolder()); if (saves == null) { - Messaging.severeF("Unable to load saves, disabling..."); + Messaging.severeTr(Messages.FAILED_LOAD_SAVES); getServer().getPluginManager().disablePlugin(this); return; } @@ -211,12 +214,11 @@ public class Citizens extends JavaPlugin implements CitizensPlugin { getServer().getPluginManager().registerEvents(new EventListen(), this); - if (Setting.NPC_COST.asDouble() > 0) { + if (Setting.NPC_COST.asDouble() > 0) setupEconomy(); - } registerCommands(); - + setupTranslator(); Messaging.logF("v%s enabled.", getDescription().getVersion()); // Setup NPCs after all plugins have been enabled (allows for multiworld @@ -238,7 +240,7 @@ public class Citizens extends JavaPlugin implements CitizensPlugin { @Override public void onImplementationChanged() { - Messaging.severe("Citizens implementation changed, disabling plugin."); + Messaging.severeTr(Messages.CITIZENS_IMPLEMENTATION_DISABLED); Bukkit.getPluginManager().disablePlugin(this); } @@ -303,6 +305,26 @@ public class Citizens extends JavaPlugin implements CitizensPlugin { // allows all plugin classes to be imported. } + private void setupTranslator() { + Locale locale = Locale.getDefault(); + String[] parts = Setting.LOCALE.asString().split("[\\._]"); + switch (parts.length) { + case 1: + locale = new Locale(parts[0]); + break; + case 2: + locale = new Locale(parts[0], parts[1]); + break; + case 3: + locale = new Locale(parts[0], parts[1], parts[2]); + break; + default: + break; + } + Translator.setInstance(new File(getDataFolder(), "i18n"), locale); + Messaging.logF("Using locale %s.", locale); + } + private void startMetrics() { new Thread() { @Override diff --git a/src/main/java/net/citizensnpcs/Settings.java b/src/main/java/net/citizensnpcs/Settings.java index a7f652463..b11eee9f2 100644 --- a/src/main/java/net/citizensnpcs/Settings.java +++ b/src/main/java/net/citizensnpcs/Settings.java @@ -69,6 +69,7 @@ public class Settings { value = list; } }, + LOCALE("general.translation.locale", "en"), MAX_NPC_LIMIT_CHECKS("npc.limits.max-permission-checks", 100), NPC_COST("economy.npc.cost", 100D), QUICK_SELECT("npc.selection.quick-select", false), diff --git a/src/main/java/net/citizensnpcs/util/Messages.java b/src/main/java/net/citizensnpcs/util/Messages.java index b63cabe5b..c7c9c1143 100644 --- a/src/main/java/net/citizensnpcs/util/Messages.java +++ b/src/main/java/net/citizensnpcs/util/Messages.java @@ -3,40 +3,45 @@ package net.citizensnpcs.util; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; +import java.io.IOException; import java.io.OutputStream; import java.util.ListResourceBundle; import java.util.Properties; import java.util.PropertyResourceBundle; import java.util.ResourceBundle; -import net.citizensnpcs.api.CitizensAPI; - import com.google.common.io.Closeables; public enum Messages { - ; + CITIZENS_IMPLEMENTATION_DISABLED("citizens.changed-implementation", + "Citizens implementation changed, disabling plugin."), + FAILED_LOAD_SAVES("citizens.saves.load-failed", "Unable to load saves, disabling..."); private String defaultTranslation; - private String key; Messages(String key, String defaultTranslation) { this.key = key; this.defaultTranslation = defaultTranslation; } + public String getKey() { return key; } private static ResourceBundle defaultBundle; - public static ResourceBundle getDefaultResourceBundle() { + public static ResourceBundle getDefaultResourceBundle(File resourceDirectory, String fileName) { if (defaultBundle == null) { - File dir = new File(CitizensAPI.getDataFolder(), "i18n"); - dir.mkdirs(); + resourceDirectory.mkdirs(); - File bundleFile = new File(dir, Translator.PREFIX + "_en.properties"); + File bundleFile = new File(resourceDirectory, fileName); if (!bundleFile.exists()) - populateDefaults(bundleFile); + try { + bundleFile.createNewFile(); + } catch (IOException e) { + e.printStackTrace(); + } + populateDefaults(bundleFile); FileInputStream stream = null; try { stream = new FileInputStream(bundleFile); @@ -68,8 +73,17 @@ public enum Messages { private static void populateDefaults(File bundleFile) { Properties properties = new Properties(); + FileInputStream in = null; + try { + in = new FileInputStream(bundleFile); + properties.load(in); + } catch (IOException e) { + } finally { + Closeables.closeQuietly(in); + } for (Messages message : values()) { - properties.put(message.key, message.defaultTranslation); + if (!properties.containsKey(message.key)) + properties.put(message.key, message.defaultTranslation); } OutputStream stream = null; try { diff --git a/src/main/java/net/citizensnpcs/util/Messaging.java b/src/main/java/net/citizensnpcs/util/Messaging.java index 202a41dc3..da6dff524 100644 --- a/src/main/java/net/citizensnpcs/util/Messaging.java +++ b/src/main/java/net/citizensnpcs/util/Messaging.java @@ -46,6 +46,14 @@ public class Messaging { log(getFormatted(msg)); } + public static void logTr(Messages key) { + log(Level.INFO, Translator.tr(key)); + } + + public static void logTr(Messages key, Object... msg) { + log(Level.INFO, Translator.tr(key, msg)); + } + public static void send(CommandSender sender, Object... msg) { sendMessageTo(sender, SPACE.join(msg)); } @@ -67,11 +75,11 @@ public class Messaging { sender.sendMessage(msg); } - public static void sendTr(CommandSender sender, String key) { + public static void sendTr(CommandSender sender, Messages key) { sendMessageTo(sender, Translator.tr(key)); } - public static void sendTr(CommandSender sender, String key, Object... msg) { + public static void sendTr(CommandSender sender, Messages key, Object... msg) { sendMessageTo(sender, Translator.tr(key, msg)); } @@ -97,4 +105,8 @@ public class Messaging { public static void severeF(Object... messages) { log(Level.SEVERE, getFormatted(messages)); } + + public static void severeTr(Messages key) { + log(Level.SEVERE, Translator.tr(key)); + } } \ No newline at end of file diff --git a/src/main/java/net/citizensnpcs/util/Translator.java b/src/main/java/net/citizensnpcs/util/Translator.java index 8a8e942df..5c66ff433 100644 --- a/src/main/java/net/citizensnpcs/util/Translator.java +++ b/src/main/java/net/citizensnpcs/util/Translator.java @@ -17,15 +17,16 @@ import com.google.common.collect.Maps; public class Translator { private ResourceBundle bundle; private final Map messageFormatCache = Maps.newHashMap(); + private final File resourceFile; - public Translator(File resourceFile, Locale locale) { + private Translator(File resourceFile, Locale locale) { + this.resourceFile = resourceFile; try { bundle = ResourceBundle.getBundle(PREFIX, locale, new FileClassLoader(Translator.class.getClassLoader(), resourceFile)); } catch (MissingResourceException e) { bundle = getDefaultBundle(); } - instance = this; } public String format(String key, Object... msg) { @@ -35,7 +36,7 @@ public class Translator { } private ResourceBundle getDefaultBundle() { - return Messages.getDefaultResourceBundle(); + return Messages.getDefaultResourceBundle(resourceFile, PREFIX + "_en.properties"); } private MessageFormat getFormatter(String unreplaced) { @@ -91,7 +92,19 @@ public class Translator { } private static Translator instance; + public static final String PREFIX = "messages"; + public static void setInstance(File resourceFile, Locale locale) { + instance = new Translator(resourceFile, locale); + } + + public static String tr(Messages key) { + return tr(key.getKey()); + } + + public static String tr(Messages key, Object... msg) { + return tr(key.getKey(), msg); + } public static String tr(String key, Object... msg) { return msg.length == 0 ? instance.translate(key) : instance.format(key, msg);