| --- | 
 | layout: default | 
 | title: ICU4J Locale Service Provider | 
 | nav_order: 7 | 
 | parent: ICU | 
 | --- | 
 | <!-- | 
 | © 2020 and later: Unicode, Inc. and others. | 
 | License & terms of use: http://www.unicode.org/copyright.html | 
 | --> | 
 |  | 
 | # ICU4J Locale Service Provider | 
 | {: .no_toc } | 
 |  | 
 | ## Contents | 
 | {: .no_toc .text-delta } | 
 |  | 
 | 1. TOC | 
 | {:toc} | 
 |  | 
 | --- | 
 |  | 
 | ## Overview | 
 |  | 
 | Java SE 6 introduced a new feature which allows Java user code to extend locale | 
 | support in Java runtime environment. JREs shipped by Oracle or IBM come with | 
 | decent locale coverage, but some users may want more locale support. Java SE 6 | 
 | includes abstract classes extending | 
 | [`java.util.spi.LocaleServiceProvider`](http://download.oracle.com/javase/6/docs/api/java/util/spi/LocaleServiceProvider.html). | 
 | 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 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: | 
 |  | 
 | *   [`BreakIteratorProvider`](http://download.oracle.com/javase/6/docs/api/java/text/spi/BreakIteratorProvider.html) | 
 | *   [`CollatorProvider`](http://download.oracle.com/javase/6/docs/api/java/text/spi/CollatorProvider.html) | 
 | *   [`DateFormatProvider`](http://download.oracle.com/javase/6/docs/api/java/text/spi/DateFormatProvider.html) | 
 | *   [`DateFormatSymbolsProvider`](http://download.oracle.com/javase/6/docs/api/java/text/spi/DateFormatSymbolsProvider.html) | 
 | *   [`DecimalFormatSymbolsProvider`](http://download.oracle.com/javase/6/docs/api/java/text/spi/DecimalFormatSymbolsProvider.html) | 
 | *   [`NumberFormatProvider`](http://download.oracle.com/javase/6/docs/api/java/text/spi/NumberFormatProvider.html) | 
 | *   [`CurrencyNameProvider`](http://download.oracle.com/javase/6/docs/api/java/util/spi/CurrencyNameProvider.html) | 
 | *   [`LocaleNameProvider`](http://download.oracle.com/javase/6/docs/api/java/util/spi/LocaleNameProvider.html) | 
 | *   [`TimeZoneNameProvider`](http://download.oracle.com/javase/6/docs/api/java/util/spi/TimeZoneNameProvider.html) | 
 |  | 
 | 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. | 
 |  | 
 | ## Using ICU4J Locale Service Provider | 
 |  | 
 | Java SE 6 locale sensitive service providers are using the [Java Extension | 
 | Mechanism](http://download.oracle.com/javase/6/docs/technotes/guides/extensions/index.html). | 
 | 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 directory 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")); | 
 |     System.out.println(df.format(new Date())); | 
 |  | 
 | Sample output: | 
 |  | 
 | *   `2008 Junie 19` \[With ICU4J Locale Service Provider enabled\] | 
 | *   `June 19, 2008` \[Without ICU4J Locale Service Provider\] | 
 |  | 
 | ## Optional Configuration | 
 |  | 
 | ### Enabling or disabling individual service | 
 |  | 
 | By default, all Java 6 SE locale sensitive service providers are enabled in the | 
 | ICU4J Locale Service Provider JAR file. If you want to disable specific | 
 | providers supported by ICU4J, you can remove the corresponding provider | 
 | configuration files from *META-INF/services* in the localespi JAR file. For | 
 | example, if you do not want to use ICU's time zone name service at all, you can | 
 | remove the file: *META-INF/services/java.util.spi.TimeZoneNameProvider* from the | 
 | JAR file. | 
 |  | 
 | **Note:** Disabling `DateFormatSymbolsProvider/DecimalFormatSymbolsProvider` won't | 
 | affect the localized symbols actually used by `DateFormatProvider/NumberFormatProvider` | 
 | by the current implementation. These services are implemented independently. | 
 |  | 
 | ### Configuring the behavior of ICU4J Locale Service Provider | 
 |  | 
 | *com/ibm/icu/impl/javaspi/ICULocaleServiceProviderConfig.properties* in the | 
 | localespi JAR file is used for configuring the behavior of the ICU4J Locale | 
 | Service Provider implementation. There are some configuration properties | 
 | available. See the table below for each configuration in detail. | 
 |  | 
 | |**Property**|**Value**|**Default**|**Description**| | 
 | |:---|:---:|:---:|:---| | 
 | |`com.ibm.icu.impl.javaspi.ICULocaleServiceProvider.enableIcuVariants`|`"true"` or `"false"`|`"true"`|Whether if Locales with ICU's variant suffix will be included in `getAvailableLocales`. The current Java SE 6 locale sensitive service does not allow user provided provider implementations to override locales supported by JRE itself. When this property is `"true"` (default), ICU4J Locale Service Provider includes Locales with the suffix (`com.ibm.icu.impl.javaspi.ICULocaleServiceProvider.icuVariantSuffix`) in the variant field. For example, the ICU4J provider includes locales fr_FR and fr_FR_ICU4J in the available locale list. So JDK API user can still access the internationalization service object created by the ICU4J provider by the special locale fr_FR_ICU4J| | 
 | |`com.ibm.icu.impl.javaspi.ICULocaleServiceProvider.icuVariantSuffix`|*Any String*|`"ICU4J"` (49 or later) `"ICU"` (before 49)|Suffix string used in Locale's variant field to specify the ICU implementation.| | 
 | |`com.ibm.icu.impl.javaspi.ICULocaleServiceProvider.enableIso3Languages`|`"true"` or `"false"`|`"true"`|Whether if 3-letter language locales are included in `getAvailableLocales`. Use of 3-letter language codes in `java.util.Locale` is not supported by the API reference document. However, the implementation does not check the length of language code, so there is no practical problem with it.| | 
 | |`com.ibm.icu.impl.javaspi.ICULocaleServiceProvider.useDecimalFormat`|`"true"` or `"false"`|`"false"`|Whether if `java.text.DecimalFormat` subclass is used for `NumberFormat#getXXXInstance`. `DecimalFormat#format(Object,StringBuffer,FieldPosition)` is declared as final, so ICU cannot override the implementation. As a result, some number types such as `BigInteger`/`BigDecimal` are not handled by the ICU implementation. If a client expects `NumberFormat#getXXXInstance` returns a `DecimalFormat` (for example, need to manipulate decimal format patterns), he/she can set true to this setting. However, in this case, `BigInteger`/`BigDecimal` support is not done by ICU's implementation.| |