diff options
author | snowleo <schneeleo@gmail.com> | 2011-11-18 15:03:14 +0100 |
---|---|---|
committer | snowleo <schneeleo@gmail.com> | 2011-11-18 15:04:22 +0100 |
commit | 9987568ae8a7b72a7ff6e784cf1404a73490b449 (patch) | |
tree | e8ff8234266aa564fe1cdd258fae2ae5ecbbfd93 | |
parent | a05f730e76747061ef4bbfb515fa2f70407ec138 (diff) | |
download | Essentials-9987568ae8a7b72a7ff6e784cf1404a73490b449.tar Essentials-9987568ae8a7b72a7ff6e784cf1404a73490b449.tar.gz Essentials-9987568ae8a7b72a7ff6e784cf1404a73490b449.tar.lz Essentials-9987568ae8a7b72a7ff6e784cf1404a73490b449.tar.xz Essentials-9987568ae8a7b72a7ff6e784cf1404a73490b449.zip |
New I18n code, not used yet
-rw-r--r-- | Essentials/nbproject/pmd.settings | 1 | ||||
-rw-r--r-- | Essentials/src/com/earth2me/essentials/I18n.java | 166 |
2 files changed, 167 insertions, 0 deletions
diff --git a/Essentials/nbproject/pmd.settings b/Essentials/nbproject/pmd.settings index 824aa3ac9..29baf7ea1 100644 --- a/Essentials/nbproject/pmd.settings +++ b/Essentials/nbproject/pmd.settings @@ -1,2 +1,3 @@ DoNotUseThreads +LongVariable SignatureDeclareThrowsException diff --git a/Essentials/src/com/earth2me/essentials/I18n.java b/Essentials/src/com/earth2me/essentials/I18n.java new file mode 100644 index 000000000..5f1dd7ec3 --- /dev/null +++ b/Essentials/src/com/earth2me/essentials/I18n.java @@ -0,0 +1,166 @@ +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; +import java.util.HashMap; +import java.util.Locale; +import java.util.Map; +import java.util.MissingResourceException; +import java.util.ResourceBundle; +import java.util.logging.Level; +import org.bukkit.Bukkit; + + +public class I18n +{ + 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 = ResourceBundle.getBundle(MESSAGES, defaultLocale); + private transient ResourceBundle localeBundle = ResourceBundle.getBundle(MESSAGES, defaultLocale); + private final transient ResourceBundle defaultBundle = ResourceBundle.getBundle(MESSAGES, Locale.ENGLISH); + private final transient Map<String, MessageFormat> messageFormatCache = new HashMap<String, MessageFormat>(); + + public I18n() + { + instance = this; + } + + public Locale getCurrentLocale() + { + return currentLocale; + } + + public String translate(final String string) + { + try + { + try + { + return customBundle.getString(string); + } + catch (MissingResourceException ex) + { + return localeBundle.getString(string); + } + } + catch (MissingResourceException ex) + { + Bukkit.getLogger().log(Level.WARNING, String.format("Missing translation key \"%s\" in translation file %s", ex.getKey(), localeBundle.getLocale().toString()), ex); + return defaultBundle.getString(string); + } + } + + public static String _(final String string, final Object... objects) + { + if (objects.length == 0) + { + return instance.translate(string); + } + else + { + return instance.format(string, objects); + } + } + + public String format(final String string, final Object... objects) + { + final String format = translate(string); + MessageFormat messageFormat = messageFormatCache.get(format); + if (messageFormat == null) + { + messageFormat = new MessageFormat(format); + messageFormatCache.put(format, messageFormat); + } + return messageFormat.format(objects); + } + + public void updateLocale(final String loc, final IEssentials ess) + { + if (loc == null || loc.isEmpty()) + { + return; + } + 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]); + } + Bukkit.getLogger().log(Level.INFO, String.format("Using locale %s", currentLocale.toString())); + customBundle = ResourceBundle.getBundle(MESSAGES, currentLocale, new FileResClassLoader(I18n.class.getClassLoader(), ess)); + localeBundle = ResourceBundle.getBundle(MESSAGES, currentLocale); + } + + public static String lowerCase(final String input) + { + return input == null ? null : input.toLowerCase(Locale.ENGLISH); + } + + public static String capitalCase(final String input) + { + return input == null || input.length() == 0 + ? input + : input.toUpperCase(Locale.ENGLISH).charAt(0) + + input.toLowerCase(Locale.ENGLISH).substring(1); + } + + + private static class FileResClassLoader extends ClassLoader + { + private final transient File dataFolder; + + public FileResClassLoader(final ClassLoader classLoader, final IEssentials ess) + { + 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) + { + } + } + return super.getResource(string); + } + + @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) + { + } + } + return super.getResourceAsStream(string); + } + } +} |