public interface NlsBundle
ResourceBundle
you create a custom interface extending this one in order to define the
messages
. This is done by defining methods with NlsMessage
as return type and the NLS argument values
as parameter. NlsBundleFactory.createBundle(Class)
. This is the recommended approach for defining and binding
NlsMessage
s. In order to make your NlsBundle
work even in limited environments such as GWT (google
web toolkit) clients, we had to define the following convention:Package
and a base name (e.g. my.package.NlsBundleExample
). This
namespace must not be occupied by an existing type.NlsBundle
has to be named using the base name followed by the
suffix Root
(e.g. my.package.NlsBundleExampleRoot
). This interface defines the
NlsMessage
es for the root locale
what is the reason for the suffix.*.properties
files have to be named using the base name followed by the according locale
suffix as for a regular ResourceBundle
(e.g. my/package/NlsBundleExample_de.properties
or
my/package/NlsBundleExample_zh_HK.properties
). To override the message texts for the root locale (e.g. as
customization of a NlsBundle
provided by a third-party library) you could also create a properties file
without the locale suffix (e.g. my/package/NlsBundleExample.properties
)public interface NlsBundleMynameRoot extendsFor localization you createNlsBundle
{ @NlsBundleMessage
("The value {value} has to be in the range from {min} to {max}!")NlsMessage
errorValueOutOfRange( @Named
("value") int value, @Named
("min") int min, @Named
("max") int max); }
*.properties
files (see
net.sf.mmm.util.nls.base.ResourceBundleSynchronizer
) in the same package for each supported
Locale
. In the example above e.g. NlsBundleMyname_de.properties
with this content:
errorValueOutOfRange = Der Wert {value} muss innerhalb des Wertebereichs von {min} bis {max} liegen!For a real example see
NlsBundleUtilCoreRoot
. NlsBundleKey
the key
is derived from
the name of the method. You have to ensure that the keys are unique as otherwise the localization is NOT possible.
Please strictly avoid having methods with the same name. named arguments
instead of indexed
arguments
. Unfortunately Java does not include names of parameters in abstract methods (including methods of
interfaces). Java8 introduced this feature that we might support in the future. Currently the only way to work around
this is to add an annotation to each parameter. The NlsBundleFactory
therefore supports the
Named
annotation for this purpose. As it is nasty to add these annotations manually here is a
script for automation. This is just an example - please add more types as needed.
sed -i -r 's/([(]|, )((Object|Type|int|Number|String|boolean)([.]{3})?) ([a-z][a-zA-Z0-9]*)/\1@Named("\5") \2 \5/g' NlsBundleExampleRoot.javaATTENTION:
NlsBundle
interfaces. Instead create an interface that
directly extends NlsBundle
(and nothing else). However, for purpose of abstraction feel free to add an empty
custom extension of NlsBundle
as intermediate interface for your project to decouple dependencies.NlsBundleMessage
,
NlsBundleKey
Modifier and Type | Field and Description |
---|---|
static String |
INTERFACE_NAME_SUFFIX
The suffix for the interfaces derived from
NlsBundle . |
static final String INTERFACE_NAME_SUFFIX
NlsBundle
. This suffix will not change in the future.Copyright © 2001–2016 mmm-Team. All rights reserved.