String
for example, your program can
load it from the resource bundle that is appropriate for the current user's
locale. In this way, you can write program code that is largely independent
of the user's locale isolating most, if not all, of the locale-specific
information in resource bundles.
This allows you to write programs that can:
Resource bundles belong to families whose members share a common base name, but whose names also have additional components that identify their locales. For example, the base name of a family of resource bundles might be "MyResources". The family should have a default resource bundle which simply has the same name as its family - "MyResources" - and will be used as the bundle of last resort if a specific locale is not supported. The family can then provide as many locale-specific members as needed, for example a German one named "MyResources_de".
Each resource bundle in a family contains the same items, but the items have
been translated for the locale represented by that resource bundle.
For example, both "MyResources" and "MyResources_de" may have a
String
that's used on a button for canceling operations.
In "MyResources" the String
may contain "Cancel" and in
"MyResources_de" it may contain "Abbrechen".
If there are different resources for different countries, you can make specializations: for example, "MyResources_de_CH" contains objects for the German language (de) in Switzerland (CH). If you want to only modify some of the resources in the specialization, you can do so.
When your program needs a locale-specific object, it loads
the ResourceBundle
class using the
getBundle
method:
ResourceBundle myResources = ResourceBundle.getBundle("MyResources", currentLocale);
Resource bundles contain key/value pairs. The keys uniquely
identify a locale-specific object in the bundle. Here's an
example of a ListResourceBundle
that contains
two key/value pairs:
public class MyResources extends ListResourceBundle { protected Object[][] getContents() { return new Object[][] { // LOCALIZE THE SECOND STRING OF EACH ARRAY (e.g., "OK") {"OkKey", "OK"}, {"CancelKey", "Cancel"}, // END OF MATERIAL TO LOCALIZE }; } }
String
s.
In this example, the keys are "OkKey" and "CancelKey".
In the above example, the values
are also String
s--"OK" and "Cancel"--but
they don't have to be. The values can be any type of object.
You retrieve an object from resource bundle using the appropriate
getter method. Because "OkKey" and "CancelKey"
are both strings, you would use getString
to retrieve them:
button1 = new Button(myResources.getString("OkKey")); button2 = new Button(myResources.getString("CancelKey"));
MissingResourceException
.
Besides getString
, ResourceBundle
also provides
a method for getting string arrays, getStringArray
,
as well as a generic getObject
method for any other
type of object. When using getObject
, you'll
have to cast the result to the appropriate type. For example:
int[] myIntegers = (int[]) myResources.getObject("intList");
The Java Platform provides two subclasses of ResourceBundle
,
ListResourceBundle
and PropertyResourceBundle
,
that provide a fairly simple way to create resources.
As you saw briefly in a previous example, ListResourceBundle
manages its resource as a list of key/value pairs.
PropertyResourceBundle
uses a properties file to manage
its resources.
If ListResourceBundle
or PropertyResourceBundle
do not suit your needs, you can write your own ResourceBundle
subclass. Your subclasses must override two methods: handleGetObject
and getKeys()
.
The implementation of a ResourceBundle
subclass must be thread-safe
if it's simultaneously used by multiple threads. The default implementations
of the non-abstract methods in this class, and the methods in the direct
known concrete subclasses ListResourceBundle
and
PropertyResourceBundle
are thread-safe.
getBundle(String)
or getBundle(String, Locale)
method.
ServiceLoader
.
A service interface or class must be
defined. The caller module declares that it uses the service, the service
provider modules declare that they provide implementations of the service.
Refer to ResourceBundleProvider
for developing resource bundle
services and deploying resource bundle providers.
The module obtaining the resource bundle can be a resource bundle
provider itself; in which case this module only locates the resource bundle
via service provider mechanism.
A resource bundle provider can
provide resource bundles in any format such XML which replaces the need
of ResourceBundle.
.
Module#getResourceAsStream(String)
.
The getBundle
factory methods with no Control
parameter
locate and load resource bundles from
service providers.
It may continue the search as if calling Module#getResourceAsStream(String)
to find the named resource from a given module and calling
ClassLoader#getResourceAsStream(String)
; refer to
the specification of the getBundle
method for details.
Only non-encapsulated resource bundles of "java.class
"
or "java.properties
" format are searched.
If the caller module is a resource bundle provider, it does not fall back to the class loader search.
In cases where the getBundle
factory method is called from a context
where there is no caller frame on the stack (e.g. when called directly from
a JNI attached thread), the caller module is default to the unnamed module for the
system class loader.
.properties
resource bundles
are packaged in a JAR file. Resource bundle only JAR file can be readily
deployed as an automatic module. For example, if the JAR file contains the
entry "p/q/Foo_ja.properties
" and no .class
entry,
when resolved and defined as an automatic module, no package is derived
for this module. This allows resource bundles in .properties
format packaged in one or more JAR files that may contain entries
in the same directory and can be resolved successfully as
automatic modules.
ResourceBundle.Control
class provides information necessary
to perform the bundle loading process by the getBundle
factory methods that take a ResourceBundle.Control
instance. You can implement your own subclass in order to enable
non-standard resource bundle formats, change the search strategy, or
define caching parameters. Refer to the descriptions of the class and the
getBundle
factory method for details.
ResourceBundle.
is designed for an application deployed
in an unnamed module, for example to support resource bundles in
non-standard formats or package localized resources in a non-traditional
convention. ResourceBundleProvider
is the replacement for
ResourceBundle.Control
when migrating to modules.
UnsupportedOperationException
will be thrown when a factory
method that takes the ResourceBundle.Control
parameter is called.
For the getBundle
factory
methods that take no Control
instance, their default behavior of resource bundle loading
can be modified with custom ResourceBundleControlProvider
implementations.
If any of the
providers provides a Control
for the given base name, that Control
will be used instead of the default Control
. If there is
more than one service provider for supporting the same base name,
the first one returned from ServiceLoader
will be used.
A custom Control
implementation is ignored by named modules.
getBundle
factory
methods are cached by default, and the factory methods return the same
resource bundle instance multiple times if it has been
cached. getBundle
clients may clear the cache, manage the
lifetime of cached resource bundle instances using time-to-live values,
or specify not to cache resource bundle instances. Refer to the
descriptions of the getBundle
factory method, clearCache
, ResourceBundle.Control.getTimeToLive
, and ResourceBundle.Control.needsReload
for details.
ResourceBundle
subclass, MyResources
, that manages two resources (for a larger number of
resources you would probably use a Map
).
Notice that you don't need to supply a value if
a "parent-level" ResourceBundle
handles the same
key with the same value (as for the okKey below).
// default (English language, United States) public class MyResources extends ResourceBundle { public Object handleGetObject(String key) { if (key.equals("okKey")) { return "Ok"; } if (key.equals("cancelKey")) { return "Cancel"; } return null; } public Enumeration<String> getKeys() { return Collections.enumeration(keySet()); } // Overrides handleKeySet() so that the getKeys() implementation // can rely on the keySet() value. protected Set<String> handleKeySet() { return new HashSet<String>(Arrays.asList("okKey", "cancelKey")); } } // German language public class MyResources_de extends MyResources { public Object handleGetObject(String key) { // don't need okKey, since parent level handles it. if (key.equals("cancelKey")) { return "Abbrechen"; } return null; } protected Set<String> handleKeySet() { return new HashSet<String>(Arrays.asList("cancelKey")); } }
ResourceBundle
s. For example, you could have a set of bundles for
exception messages, ExceptionResources
(ExceptionResources_fr
, ExceptionResources_de
, ...),
and one for widgets, WidgetResource
(WidgetResources_fr
,
WidgetResources_de
, ...); breaking up the resources however you like.
ListResourceBundle
, PropertyResourceBundle
, MissingResourceException
, ResourceBundleProvider
Modifier and Type | Class and Description |
---|---|
private static class | ResourceBundle.
References to bundles are soft references so that they can be garbage collected when they have no hard references. |
private static class | ResourceBundle.
Key used for cached resource bundles. |
private static interface | ResourceBundle.
The common interface to get a CacheKey in LoaderReference and BundleReference. |
public static class | ResourceBundle.
|
private static class | ResourceBundle.
References to a CacheKey element as a WeakReference so that it can be garbage collected when nobody else is using it. |
private static class | |
private static class | |
private static class | |
private static class |
Modifier and Type | Field and Description |
---|---|
private volatile ResourceBundle. | cacheKey
The back link to the cache key. |
private static final ConcurrentMap | cacheList
The cache is a map from cache keys (with bundle base name, locale, and class loader) to either a resource bundle or NONEXISTENT_BUNDLE wrapped by a BundleReference. |
private volatile boolean | expired
The flag indicating this bundle has expired in the cache. |
private static final int | INITIAL_CACHE_SIZE
initial size of the bundle cache |
private volatile Set | keySet
A Set of the keys contained only in this ResourceBundle. |
private Locale | locale
The locale for this bundle. |
private String | name
The base bundle name for this bundle. |
private static final ResourceBundle | NONEXISTENT_BUNDLE
constant indicating that no resource bundle exists |
protected ResourceBundle | parent
The parent bundle of this bundle. |
private static final ReferenceQueue | referenceQueue
Queue for reference objects referring to class loaders or bundles. |
private static final boolean | |
private static final String |
Access | Constructor and Description |
---|---|
public |
Modifier and Type | Method and Description |
---|---|
private static boolean | |
private static void | |
public static final void | clearCache()
Removes all resource bundles from the cache that have been loaded by the caller's module. |
public static final void | clearCache(ClassLoader
the class loader loader)Removes all resource bundles from the cache that have been loaded by the given class loader. |
public boolean | Returns: true if the given key is
contained in this ResourceBundle or its
parent bundles; false otherwise.the resource key)key Determines whether the given |
private static ResourceBundle | findBundle(Module callerModule, Module module, ResourceBundle.
|
private static ResourceBundle | Returns: the cached bundle, or null if the bundle is not found in the cache or its parent has expired.bundle.expire is true
upon return if the bundle in the cache has expired.the key to look up the cache cacheKey,the Control to be used for the expiration control controlFinds a bundle in the cache. |
public String | Returns: The base name of the resource bundle, as provided to and expected by theResourceBundle.getBundle(...) methods.Returns the base name of this bundle, if known, or |
public static final ResourceBundle | |
public static final ResourceBundle | Returns: a resource bundle for the given base name and the default localethe base name of the resource bundle, a fully qualified class
name baseName, ResourceBundle.the control which gives information for the resource bundle
loading process controlReturns a resource bundle using the specified base name, the default locale and the specified control. |
public static final ResourceBundle | Returns: a resource bundle for the given base name and localethe base name of the resource bundle, a fully qualified class name baseName, Locale the locale for which a resource bundle is desired locale)Gets a resource bundle using the specified base name and locale, and the caller module. |
public static ResourceBundle | Returns: a resource bundle for the given base name and the default localethe base name of the resource bundle,
a fully qualified class name baseName, Module the module for which the resource bundle is searched module)Gets a resource bundle using the specified base name and the default locale on behalf of the specified module. |
public static ResourceBundle | Returns: a resource bundle for the given base name and locale in the modulethe base name of the resource bundle,
a fully qualified class name baseName, Locale the locale for which a resource bundle is desired targetLocale, Module the module for which the resource bundle is searched module)Gets a resource bundle using the specified base name and locale on behalf of the specified module. |
public static final ResourceBundle | Returns: a resource bundle for the given base name and aLocale in locales the base name of the resource bundle, a fully qualified
class name baseName, Locale the locale for which a resource bundle is desired targetLocale, ResourceBundle.the control which gives information for the resource
bundle loading process controlReturns a resource bundle using the specified base name, target locale and control, and the caller's class loader. |
public static ResourceBundle | Returns: a resource bundle for the given base name and localethe base name of the resource bundle, a fully qualified class name baseName, Locale the locale for which a resource bundle is desired locale, ClassLoader the class loader from which to load the resource bundle loader)Gets a resource bundle using the specified base name, locale, and class loader. |
public static ResourceBundle | Returns: a resource bundle for the given base name and localethe base name of the resource bundle, a fully qualified
class name baseName, Locale the locale for which a resource bundle is desired targetLocale, ClassLoader the class loader from which to load the resource bundle loader, ResourceBundle.the control which gives information for the resource
bundle loading process controlReturns a resource bundle using the specified base name, target locale, class loader and control. |
private static ResourceBundle | getBundleFromModule(Class<?> caller, Module module, String baseName, Locale locale, ResourceBundle.
|
private static ResourceBundle | |
private static ResourceBundle | getBundleImpl(String baseName, Locale locale, Class<?> caller, ClassLoader loader, ResourceBundle.
This method will find resource bundles using the legacy mechanism if the caller is unnamed module or the given class loader is not the class loader of the caller module getting the resource bundle, i.e. find the class that is visible to the class loader and properties from unnamed module. |
private static ResourceBundle | getBundleImpl(Module callerModule, Module module, String baseName, Locale locale, ResourceBundle.
|
private static Module | |
private static ResourceBundle. | |
private static ResourceBundle. | |
public abstract Enumeration | Returns: anEnumeration of the keys contained in
this ResourceBundle and its parent bundles.Returns an enumeration of the keys. |
private static ClassLoader | |
private static ClassLoader | |
public Locale | |
public final Object | |
private static Class | getResourceBundleProviderType(String baseName, ClassLoader loader)
Returns the service type of the given baseName that is visible to the given class loader |
private static ServiceLoader | getServiceLoader(Module module, String baseName)
Returns a ServiceLoader that will find providers that are bound to a given named module. |
public final String | |
public final String[] | Returns: the string array for the given keythe key for the desired string array key)Gets a string array for the given key from this resource bundle or one of its parents. |
protected abstract Object | Returns: the object for the given key, or nullthe key for the desired object key)Gets an object for the given key from this resource bundle. |
protected Set | Returns: aSet of the keys contained only in this
ResourceBundle Returns a |
private static boolean | hasValidParentChain(ResourceBundle bundle)
Determines whether any of resource bundles in the parent chain, including the leaf, have expired. |
private static boolean | |
public Set | Returns: aSet of all keys contained in this
ResourceBundle and its parent bundles.Returns a |
private static ResourceBundle | loadBundle(ResourceBundle.
|
private static ResourceBundle | loadBundle(ResourceBundle.
|
private static ResourceBundle | loadBundleFromProviders(String baseName, Locale locale, ServiceLoader<ResourceBundleProvider> providers, ResourceBundle.
Loads ResourceBundle from service providers. |
private static ResourceBundle | Returns: the ResourceBundle for the cacheKey; if someone has put the bundle before this call, the one found in the cache is returned.the key for the resource bundle cacheKey,the resource bundle to be put in the cache bundle, ResourceBundle.Put a new bundle in the cache. |
private static void | |
protected void | |
private static void | throwMissingResourceException(String baseName, Locale locale, Throwable cause)
Throw a MissingResourceException with proper message |
private static void | |
private static <T extends Throwable> void |