public class MyResourceBundleMessageSource extends ResourceBundleMessageSource
{
public static final String BUNDLE_KEY_DELIMITER = "$";
public static final String MESSAGE_DELIMITER = "#~#";
private boolean isInitialized = false;
@Override
protected ResourceBundle doGetBundle(final String bundlename, final Locale targetLocale)
{
return ResourceBundle.getBundle(bundlename, targetLocale, new ResourceBundle.Control()
{
@Override
public ResourceBundle newBundle(final String baseName,
final Locale locale,
final String format,
final ClassLoader loader,
final boolean reload) throws IOException
{
return new MyResourceBundle(baseName, locale.getLanguage());
}
});
}
@Override
protected String resolveCodeWithoutArguments(final String code, final Locale locale)
{
if (!isInitialized)
{
setBasenames(TexteUtil.getAllLanguageFiles());
isInitialized = true;
}
String result = null;
ResourceBundle bundle = null;
String basename = "";
String key = code;
if (code.contains(MESSAGE_DELIMITER))
{
String[] codes = code.split(MESSAGE_DELIMITER);
result = "";
for (int i = 0; i < codes.length; i++)
{
result += " " + resolveCodeWithoutArguments(codes[i], locale);
}
}
else
{
if (code.contains(BUNDLE_KEY_DELIMITER))
{
basename = code.substring(0, code.indexOf(BUNDLE_KEY_DELIMITER));
key = code.substring(code.indexOf(BUNDLE_KEY_DELIMITER) + 1);
bundle = getResourceBundle(basename, locale);
}
if (bundle != null)
{
try
{
result = bundle.getString(key);
}
catch (MissingResourceException ex)
{
// Assume key not found
// -> do NOT throw the exception to allow for checking parent message source.
result = null;
}
}
if ((bundle == null) || (result == null))
{
result = super.resolveCodeWithoutArguments(key, locale);
}
}
return result;
}
@Override
protected MessageFormat resolveCode(final String code, final Locale locale)
{
if (!isInitialized)
{
setBasenames(TexteUtil.getAllLanguageFiles());
isInitialized = true;
}
MessageFormat result = null;
ResourceBundle bundle = null;
String basename = "";
String key = code;
if (code.contains(MESSAGE_DELIMITER))
{
String[] codes = code.split(MESSAGE_DELIMITER);
result = new MessageFormat("");
for (int i = 0; i < codes.length; i++)
{
result = new MessageFormat(result.toPattern() + " " + resolveCode(codes[i], locale).toPattern());
}
}
else
{
if (code.contains(BUNDLE_KEY_DELIMITER))
{
basename = code.substring(0, code.indexOf(BUNDLE_KEY_DELIMITER));
key = code.substring(code.indexOf(BUNDLE_KEY_DELIMITER) + 1);
bundle = getResourceBundle(basename, locale);
}
if (bundle != null)
{
result = getMessageFormat(bundle, key, locale);
}
if ((bundle == null) || (result == null))
{
result = super.resolveCode(key, locale);
}
}
return result;
}
private static class MyResourceBundle extends ResourceBundle
{
private final Properties props;
MyResourceBundle(final String baseName, final String locale) throws IOException
{
props = TexteUtil.getLanguageSupport(locale, baseName);
}
@Override
protected Object handleGetObject(final String key)
{
return props.getProperty(key);
}
@Override
public Enumeration<String> getKeys()
{
Vector<String> keys = new Vector<String>();
Enumeration<Object> keysEnum = props.keys();
while (keysEnum.hasMoreElements())
{
keys.add(keysEnum.nextElement().toString());
}
return keys.elements();
}
}
}