Some programs I work on use getMessage()
from an exception for display to end-users when problems crop up. Other programs use the message as a key into a message bundle. The question is, how do I localize the text of getMessage()
?
The authors of java.lang.Throwable
planned for this and provided getLocalizedMessage()
which is not overridden in java.lang.Exception
. However, the implementation is:
public String getLocalizedMessage() { return getMessage(); }
To make this useful I write a new abstract class, LocalizedException
, with two overriden methods and a new abstract method:
/** * {@inheritDoc} * <p/> * This implementation throws {@code UnsupportedOperationException}. Use * {@link #getLocalizedMessage()} instead. * * @return this implementation never returns * * @throws UnsupportedOperationException * @see #getLocalizedMessage() */ public String getMessage() { throw new UnsupportedOperationException( "CODING ERROR: call getLocalizedMessage() instead"); } /** * {@inheritDoc} * <p/> * This implementation delegates to {@link #translateMessage(String)} * with the original exception message text. * * @return {@inheritDoc} * * @see #translateMessage(String) */ public String getLocalizedMessage() { return translateMessage(super.getMessage()); } /** * Translates exception <var>message</var> text. * Implementations depend on the nature of the text. For example, * one implementation might require the text to be keys into a * message bundle. Another might require the text to be the message * text in the default locale. * * @return the translated exception message text */ protected abstract String translateMessage(final String message);
Using this class, write concrete implementations of translateMessage
that can figure out how to internationalize the message strings particular to your program.
No comments:
Post a Comment