import java.util.MissingResourceException;
import java.util.Properties;
import java.util.StringTokenizer;
+import java.util.logging.Level;
+import java.util.logging.Logger;
import javax.swing.KeyStroke;
import net.pterodactylus.util.io.Closer;
+import net.pterodactylus.util.logging.Logging;
/**
* Class that handles i18n.
*
* @author David ‘Bombe’ Roden <bombe@freenetproject.org>
- * @version $Id$
*/
public class I18n {
+ /** Logger. */
+ private static final Logger logger = Logging.getLogger(I18n.class.getName());
+
+ /** List of I18nables that are notified when the language changes. */
+ private static final List<I18nable> i18nables = new ArrayList<I18nable>();
+
/** The current locale. */
private static Locale currentLocale;
} catch (IOException e) {
/* something is fucked. */
}
- setLocale(Locale.getDefault());
+ setLocale(Locale.getDefault(), false);
}
- /** List of I18nables that are notified when the language changes. */
- private static final List<I18nable> i18nables = new ArrayList<I18nable>();
-
/**
* Returns the translated value for a key. The translated values may contain
* placeholders that are replaced with the given parameters.
String value = null;
value = currentLanguage.getProperty(key);
if (value == null) {
- return key;
+ logger.log(Level.WARNING, "please fix “" + key + "”!", new Throwable());
+ /* TODO - replace with value when done! */
+ return null;
}
if ((parameters != null) && (parameters.length > 0)) {
return MessageFormat.format(value, parameters);
* @return The keycode
*/
public static int getKey(String key) {
- String value = get(key);
- if (value.startsWith("VK_")) {
+ String value = currentLanguage.getProperty(key);
+ if ((value != null) && value.startsWith("VK_")) {
try {
Field field = KeyEvent.class.getField(value);
return field.getInt(null);
/* ignore. */
}
}
- return value.toUpperCase().charAt(0);
+ System.err.println("please fix “" + key + "”!");
+ return KeyEvent.VK_UNDEFINED;
}
/**
* created from the translated value
*/
public static KeyStroke getKeyStroke(String key) {
- String value = get(key);
+ String value = currentLanguage.getProperty(key);
if (value == null) {
return null;
}
modifierMask |= InputEvent.SHIFT_DOWN_MASK;
} else {
if (keyToken.startsWith("VK_")) {
+ if (keyToken.equals("VK_UNDEFINED")) {
+ return null;
+ }
try {
Field field = KeyEvent.class.getField(keyToken);
return KeyStroke.getKeyStroke(field.getInt(null), modifierMask);
* The new locale to use
*/
public static void setLocale(Locale newLocale) {
+ setLocale(newLocale, true);
+ }
+
+ /**
+ * Sets the current locale.
+ *
+ * @param newLocale
+ * The new locale to use
+ * @param notify
+ * <code>true</code> to notify registered {@link I18nable}s
+ * after the language was changed
+ */
+ private static void setLocale(Locale newLocale, boolean notify) {
currentLocale = newLocale;
InputStream inputStream = null;
try {
currentLanguage = new Properties(defaultLanguage);
- inputStream = I18n.class.getResourceAsStream("jSite_" + currentLocale.toString() + ".properties");
+ if (newLocale == Locale.ENGLISH) {
+ if (notify) {
+ notifyI18nables();
+ }
+ return;
+ }
+ inputStream = I18n.class.getResourceAsStream("jSite_" + newLocale.getLanguage() + ".properties");
if (inputStream != null) {
currentLanguage.load(inputStream);
- notifyI18nables();
+ if (notify) {
+ notifyI18nables();
+ }
}
} catch (MissingResourceException mre1) {
currentLocale = Locale.ENGLISH;
}
/**
+ * Returns the current locale.
+ *
+ * @return The current locale
+ */
+ public static Locale getLocale() {
+ return currentLocale;
+ }
+
+ /**
+ * Finds all available locales.
+ *
+ * @return All available locales
+ */
+ public static List<Locale> findAvailableLanguages() {
+ List<Locale> availableLanguages = new ArrayList<Locale>();
+ availableLanguages.add(Locale.ENGLISH);
+ availableLanguages.add(Locale.GERMAN);
+ return availableLanguages;
+ }
+
+ /**
* Registers the given I18nable to be updated when the language is changed.
*
* @param i18nable