package in.partake.resource;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.PropertyResourceBundle;
import java.util.ResourceBundle;
import java.util.ResourceBundle.Control;
public class I18n {
private static I18n instance = new I18n();
private ResourceBundle jaBundle;
private ResourceBundle enBundle;
private ResourceBundle defaultBundle;
private Map<Locale, ResourceBundle> bundles;
public static I18n get() {
return instance;
}
// TODO: なんらかの手法で Locale を取得する必要がある
public static String t(String key) {
return get().getBundle().getString(key);
}
private I18n() {
this.bundles = new HashMap<Locale, ResourceBundle>();
// resources_ja.properties & resources.properties will be read.
this.jaBundle = ResourceBundle.getBundle("i18n.resource", Locale.JAPANESE, new UTF8Control());
bundles.put(Locale.JAPANESE, jaBundle);
// resources_en.properties & resources.properties will be read.
this.enBundle = ResourceBundle.getBundle("i18n.resource", Locale.ENGLISH, new UTF8Control());
bundles.put(Locale.ENGLISH, enBundle);
this.defaultBundle = this.jaBundle;
}
// なんらかの手法で Locale を取得する必要がある
public ResourceBundle getBundle() {
return defaultBundle;
}
public ResourceBundle getBundle(Locale locale) {
if (bundles.containsKey(locale)) {
return bundles.get(locale);
}
return defaultBundle;
}
}
class UTF8Control extends Control {
@Override
public ResourceBundle newBundle(String baseName, Locale locale, String format, ClassLoader loader, boolean reload) throws IllegalAccessException, InstantiationException, IOException {
String bundleName = toBundleName(baseName, locale);
String resourceName = toResourceName(bundleName, "properties");
InputStream stream = getInputStream(loader, reload, resourceName);
if (stream == null) { return null; }
try {
return new PropertyResourceBundle(new InputStreamReader(stream, "UTF-8"));
} finally {
stream.close();
}
}
private InputStream getInputStream(ClassLoader loader, boolean reload, String resourceName) throws IOException {
if (!reload) { return loader.getResourceAsStream(resourceName); }
URL url = loader.getResource(resourceName);
if (url == null) { return null; }
URLConnection connection = url.openConnection();
if (connection == null) { return null; }
connection.setUseCaches(false);
return connection.getInputStream();
}
}