# 课程：国际化服务提供商

> 原文： [https://docs.oracle.com/javase/tutorial/i18n/serviceproviders/index.html](https://docs.oracle.com/javase/tutorial/i18n/serviceproviders/index.html)

国际化服务提供商支持依赖于语言环境的数据和服务的插件。由于可以插入与语言环境相关的数据和服务，因此第三方能够在`java.text`和`java.util`包中提供大多数区域设置敏感类的实现。

服务是一组编程接口和类，可以访问特定应用程序的功能或特性。服务提供者接口（SPI）是服务定义的公共接口和抽象类的集合。服务提供商实现 SPI。服务提供程序使您可以创建可扩展的应用程序，您可以在不修改其原始代码库的情况下进行扩展。您可以使用新的插件或模块增强其功能。有关服务提供者和可扩展应用程序的更多信息，请参阅[创建可扩展应用程序](../../ext/basics/spi.html)。

您可以使用服务提供程序进行国际化，以提供以下区域设置敏感类的自定义实现：

*   [`BreakIterator`](https://docs.oracle.com/javase/8/docs/api/java/text/BreakIterator.html) 对象
*   [`Collator`](https://docs.oracle.com/javase/8/docs/api/java/text/Collator.html) 对象
*   [`Locale`](https://docs.oracle.com/javase/8/docs/api/java/util/Locale.html) 类的语言代码，国家/地区代码和变体名称
*   时区名称
*   货币符号
*   [`DateFormat`](https://docs.oracle.com/javase/8/docs/api/java/text/DateFormat.html) 对象
*   [`DateFormatSymbols`](https://docs.oracle.com/javase/8/docs/api/java/text/DateFormatSymbols.html) 对象
*   [`NumberFormat`](https://docs.oracle.com/javase/8/docs/api/java/text/NumberFormat.html) 对象
*   [`DecimalFormatSymbols`](https://docs.oracle.com/javase/8/docs/api/java/text/DecimalFormatSymbols.html) 对象

相应的 SPI 包含在`java.text.spi`和`java.util.spi`包中：

| `java.util.spi` | `java.text.spi` |
| 

*   [`CurrencyNameProvider`](https://docs.oracle.com/javase/8/docs/api/java/util/spi/CurrencyNameProvider.html)
*   [`LocaleServiceProvider`](https://docs.oracle.com/javase/8/docs/api/java/util/spi/LocaleServiceProvider.html)
*   [`TimeZoneNameProvider`](https://docs.oracle.com/javase/8/docs/api/java/util/spi/TimeZoneNameProvider.html)

 | 

*   [`BreakIteratorProvider`](https://docs.oracle.com/javase/8/docs/api/java/text/spi/BreakIteratorProvider.html)
*   [`CollatorProvider`](https://docs.oracle.com/javase/8/docs/api/java/text/spi/CollatorProvider.html)
*   [`DateFormatProvider`](https://docs.oracle.com/javase/8/docs/api/java/text/spi/DateFormatProvider.html)
*   [`DateFormatSymbolsProvider`](https://docs.oracle.com/javase/8/docs/api/java/text/spi/DateFormatSymbolsProvider.html)
*   [`DecimalFormatSymbolsProvider`](https://docs.oracle.com/javase/8/docs/api/java/text/spi/DecimalFormatSymbolsProvider.html)
*   [`NumberFormatProvider`](https://docs.oracle.com/javase/8/docs/api/java/text/spi/NumberFormatProvider.html)

 |

例如，如果要为新语言环境提供`NumberFormat`对象，请实现`java.text.spi.NumberFormatProvider`类并实现以下方法：

*   `getCurrencyInstance(Locale locale)`
*   `getIntegerInstance(Locale locale)`
*   `getNumberInstance(Locale locale)`
*   `getPercentInstance(Locale locale)`

```
Locale loc = new Locale("da", "DK");
NumberFormat nf = NumberFormatProvider.getNumberInstance(loc);

```

这些方法首先检查 Java 运行时环境是否支持所请求的语言环境;如果是这样，方法使用该支持。否则，这些方法会调用已安装提供程序的`getAvailableLocales`方法以获取适当的接口，以查找支持所请求区域设置的提供程序。

有关如何使用服务提供程序进行国际化的深入示例，请参阅[将自定义资源包安装为扩展](../../i18n/serviceproviders/resourcebundlecontrolprovider.html)。本节介绍如何实现 [`ResourceBundleControlProvider`](https://docs.oracle.com/javase/8/docs/api/java/util/spi/ResourceBundleControlProvider.html) 接口，使您可以使用任何自定义`ResourceBundle.Control`类，而无需对应用程序的源代码进行任何其他更改。