java.util.spi.LocaleServiceProvider. Java SE 6 users can create a subclass of these abstract class to supply their own locale support for text break, collation, date/number formatting or providing translations for currency, locale and time zone names.ICU4J Locale Service Provider is designed to work as installed extensions in a JRE. Once the component is configured properly, Java application running on the JRE automatically picks the ICU4J's internationalization service implementation when a requested locale is not available in the JRE.
ICU4J has been providing more comprehensive locale coverage than standard JREs. However, Java programmers have to use ICU4J's own internationalization service APIs (com.ibm.icu.*) to utilize the rich locale support. Sometimes, the migration is not an option for various reasons. For example, your code may depend on existing Java libraries utilizing JDK internationalization service APIs, but you have no access to the source code. In this case, it is not possible to modify the libraries to use ICU4J APIs.
ICU4J Locale Service Provider is a component consists of classes implementing the Java SE 6 locale sensitive service provider interfaces. Available service providers are -
Java Extension Mechanism. An implementation of a locale sensitive service provider is installed as an optional package to extend the functionality of the Java core platform. To install an optional package, its JAR files must be placed in the Java extension directory. The standard location is <java-home>/lib/ext. You can alternatively use the system property java.ext.dirs to specify one or more locations where optional packages are installed. For example, if the JRE root directry is JAVA_HOME and you put ICU4J Locale Service Provider files in ICU_SPI_DIR, the ICU4J Locale Service Provider is enabled by the following command.
java -Djava.ext.dirs=%JAVA_HOME%\lib\ext;%ICU_SPI_DIR% <your_java_app> [Microsoft Windows]
java -Djava.ext.dirs=$JAVA_HOME/lib/ext:$ICU_SPI_DIR <your_java_app> [Linux, Solaris and other unix like platforms]
The ICU4J's implementations of Java SE 6 locale sensitive service provider interfaces and configuration files are packaged in a single JAR file (icu4j-localespi-<version>.jar). But the actual implementation of the service classes and data are in the ICU4J core JAR file (icu4j-<version>.jar). So you need to put the localespi JAR file along with the core JAR file in the Java extension directory.
Once the ICU4J Locale Service Provider is installed properly, factory methods in JDK internationalization classes look for the implementation provided by ICU4J when a requested locale is not supported by the JDK service class. For example, locale af_ZA (Afrikaans - South Africa) is not supported by JDK DateFormat in Oracle Java SE 6. The following code snippet returns an instance of DateFormat from ICU4J Locale Service Provider and prints out the current date localized for af_ZA.
DateFormat df = DateFormat.getDateInstance(DateFormat.LONG, new Locale("af", "ZA"));
2008 Junie 19 [With ICU4J Locale Service Provider enabled]
June 19, 2008 [Without ICU4J Locale Service Provider]
Note: Disabling DateFormatSymbolsProvider/DecimalFormatSymbolsProvider won't affect the localized symbols actually used by DateFormatProvider/NumberFormatProvider by the current implementation. These services are implemented independently.