forked from I2P_Developers/i2p.i2p
79 lines
2.6 KiB
Java
79 lines
2.6 KiB
Java
|
package net.i2p.router.web;
|
||
|
|
||
|
import java.util.Locale;
|
||
|
import java.util.Map;
|
||
|
import java.util.MissingResourceException;
|
||
|
import java.util.ResourceBundle;
|
||
|
import java.util.Set;
|
||
|
import java.util.concurrent.ConcurrentHashMap;
|
||
|
|
||
|
import net.i2p.I2PAppContext;
|
||
|
import net.i2p.util.ConcurrentHashSet;
|
||
|
|
||
|
/**
|
||
|
* Translate strings efficiently.
|
||
|
* We don't include an English or default ResourceBundle, we simply check
|
||
|
* for "en" and return the original string.
|
||
|
* Support real-time language changing with the routerconsole.lang property.
|
||
|
*
|
||
|
* @author zzz, from a base generated by eclipse.
|
||
|
*/
|
||
|
public class Messages {
|
||
|
public static final String PROP_LANG = "routerconsole.lang";
|
||
|
private static final String BUNDLE_NAME = "net.i2p.router.web.messages";
|
||
|
private static final String _localeLang = Locale.getDefault().getLanguage();
|
||
|
private static final Map<String, ResourceBundle> _bundles = new ConcurrentHashMap(2);
|
||
|
private static final Set<String> _missing = new ConcurrentHashSet(2);
|
||
|
|
||
|
/** current locale **/
|
||
|
public static String getString(String key) {
|
||
|
if (_localeLang.equals("en"))
|
||
|
return key;
|
||
|
ResourceBundle bundle = findBundle(_localeLang);
|
||
|
if (bundle == null)
|
||
|
return key;
|
||
|
try {
|
||
|
return bundle.getString(key);
|
||
|
} catch (MissingResourceException e) {
|
||
|
return key;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/** lang in routerconsole.lang property, else current locale */
|
||
|
public static String getString(String key, I2PAppContext ctx) {
|
||
|
String lang = getLanguage(ctx);
|
||
|
if (lang.equals("en"))
|
||
|
return key;
|
||
|
ResourceBundle bundle = findBundle(lang);
|
||
|
if (bundle == null)
|
||
|
return key;
|
||
|
try {
|
||
|
return bundle.getString(key);
|
||
|
} catch (MissingResourceException e) {
|
||
|
return key;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private static String getLanguage(I2PAppContext ctx) {
|
||
|
String lang = ctx.getProperty(PROP_LANG);
|
||
|
if (lang == null || lang.length() <= 0)
|
||
|
lang = _localeLang;
|
||
|
return lang;
|
||
|
}
|
||
|
|
||
|
/** cache both found and not found for speed */
|
||
|
private static ResourceBundle findBundle(String lang) {
|
||
|
ResourceBundle rv = _bundles.get(lang);
|
||
|
if (rv == null && !_missing.contains(lang)) {
|
||
|
try {
|
||
|
// Would it be faster to specify a class loader?
|
||
|
// No matter we only do this once per lang.
|
||
|
rv = ResourceBundle.getBundle(BUNDLE_NAME, new Locale(lang));
|
||
|
} catch (MissingResourceException e) {
|
||
|
_missing.add(lang);
|
||
|
}
|
||
|
}
|
||
|
return rv;
|
||
|
}
|
||
|
}
|