TF-EssentialsX/Essentials/src/com/earth2me/essentials/I18n.java

219 lines
5 KiB
Java
Raw Normal View History

2011-11-18 14:03:14 +00:00
package com.earth2me.essentials;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.text.MessageFormat;
2011-11-18 17:42:26 +00:00
import java.util.*;
2011-11-18 14:03:14 +00:00
import java.util.logging.Level;
2011-11-21 02:05:18 +00:00
import java.util.logging.Logger;
import java.util.regex.Pattern;
2013-10-11 02:44:41 +00:00
import net.ess3.api.IEssentials;
2014-05-05 13:48:25 +00:00
import org.bukkit.Bukkit;
2011-11-18 14:03:14 +00:00
2013-07-13 16:52:08 +00:00
public class I18n implements net.ess3.api.II18n
2011-11-18 14:03:14 +00:00
{
private static I18n instance;
private static final String MESSAGES = "messages";
private final transient Locale defaultLocale = Locale.getDefault();
private transient Locale currentLocale = defaultLocale;
private transient ResourceBundle customBundle;
private transient ResourceBundle localeBundle;
private final transient ResourceBundle defaultBundle;
2014-05-05 13:48:25 +00:00
private transient Map<String, MessageFormat> messageFormatCache = new HashMap<String, MessageFormat>();
private final transient IEssentials ess;
2014-02-04 16:11:43 +00:00
private static final Pattern NODOUBLEMARK = Pattern.compile("''");
2014-05-05 13:48:25 +00:00
private static final ResourceBundle NULL_BUNDLE = new ResourceBundle()
{
public Enumeration<String> getKeys()
{
return null;
}
protected Object handleGetObject(String key)
{
return null;
}
};
2011-11-18 14:03:14 +00:00
public I18n(final IEssentials ess)
{
this.ess = ess;
defaultBundle = ResourceBundle.getBundle(MESSAGES, Locale.ENGLISH);
2014-05-06 06:00:57 +00:00
localeBundle = defaultBundle;
customBundle = NULL_BUNDLE;
}
public void onEnable()
2011-11-18 14:03:14 +00:00
{
instance = this;
}
public void onDisable()
{
instance = null;
}
@Override
2011-11-18 14:03:14 +00:00
public Locale getCurrentLocale()
{
return currentLocale;
}
private String translate(final String string)
2011-11-18 14:03:14 +00:00
{
try
{
try
{
return customBundle.getString(string);
2011-11-18 14:03:14 +00:00
}
catch (MissingResourceException ex)
{
return localeBundle.getString(string);
2011-11-18 14:03:14 +00:00
}
}
catch (MissingResourceException ex)
{
2013-12-07 20:03:05 +00:00
Logger.getLogger("Essentials").log(Level.WARNING, String.format("Missing translation key \"%s\" in translation file %s", ex.getKey(), localeBundle.getLocale().toString()), ex);
2011-11-18 14:03:14 +00:00
return defaultBundle.getString(string);
}
}
public static String tl(final String string, final Object... objects)
2011-11-18 14:03:14 +00:00
{
if (instance == null)
{
2011-11-29 16:16:45 +00:00
return "";
}
2011-11-18 14:03:14 +00:00
if (objects.length == 0)
{
return NODOUBLEMARK.matcher(instance.translate(string)).replaceAll("'");
2011-11-18 14:03:14 +00:00
}
else
{
return instance.format(string, objects);
}
}
public String format(final String string, final Object... objects)
{
String format = translate(string);
2011-11-18 14:03:14 +00:00
MessageFormat messageFormat = messageFormatCache.get(format);
if (messageFormat == null)
{
try
{
messageFormat = new MessageFormat(format);
}
catch (IllegalArgumentException e)
{
ess.getLogger().log(Level.SEVERE, "Invalid Translation key for '" + string + "': " + e.getMessage());
format = format.replaceAll("\\{(\\D*?)\\}", "\\[$1\\]");
messageFormat = new MessageFormat(format);
}
2011-11-18 14:03:14 +00:00
messageFormatCache.put(format, messageFormat);
}
return messageFormat.format(objects);
}
public void updateLocale(final String loc)
2011-11-18 14:03:14 +00:00
{
if (loc != null && !loc.isEmpty())
2011-11-18 14:03:14 +00:00
{
final String[] parts = loc.split("[_\\.]");
if (parts.length == 1)
{
currentLocale = new Locale(parts[0]);
}
if (parts.length == 2)
{
currentLocale = new Locale(parts[0], parts[1]);
}
if (parts.length == 3)
{
currentLocale = new Locale(parts[0], parts[1], parts[2]);
}
2011-11-18 14:03:14 +00:00
}
2012-03-23 11:10:46 +00:00
ResourceBundle.clearCache();
2014-05-05 13:48:25 +00:00
messageFormatCache = new HashMap<String, MessageFormat>();
2013-12-07 20:03:05 +00:00
Logger.getLogger("Essentials").log(Level.INFO, String.format("Using locale %s", currentLocale.toString()));
2014-05-05 13:48:25 +00:00
try
{
localeBundle = ResourceBundle.getBundle(MESSAGES, currentLocale);
}
catch (MissingResourceException ex)
{
localeBundle = NULL_BUNDLE;
}
try
{
customBundle = ResourceBundle.getBundle(MESSAGES, currentLocale, new FileResClassLoader(I18n.class.getClassLoader(), ess));
}
catch (MissingResourceException ex)
{
customBundle = NULL_BUNDLE;
}
2011-11-18 14:03:14 +00:00
}
public static String capitalCase(final String input)
{
return input == null || input.length() == 0
2011-11-18 14:03:14 +00:00
? input
: input.toUpperCase(Locale.ENGLISH).charAt(0)
+ input.toLowerCase(Locale.ENGLISH).substring(1);
}
private static class FileResClassLoader extends ClassLoader
{
private final transient File dataFolder;
2012-09-24 02:10:54 +00:00
FileResClassLoader(final ClassLoader classLoader, final IEssentials ess)
2011-11-18 14:03:14 +00:00
{
super(classLoader);
this.dataFolder = ess.getDataFolder();
}
@Override
public URL getResource(final String string)
{
final File file = new File(dataFolder, string);
if (file.exists())
{
try
{
return file.toURI().toURL();
}
catch (MalformedURLException ex)
{
}
}
2014-05-05 13:48:25 +00:00
return null;
2011-11-18 14:03:14 +00:00
}
@Override
public InputStream getResourceAsStream(final String string)
{
final File file = new File(dataFolder, string);
if (file.exists())
{
try
{
return new FileInputStream(file);
}
catch (FileNotFoundException ex)
{
}
}
2014-05-05 13:48:25 +00:00
return null;
2011-11-18 14:03:14 +00:00
}
}
}