637.md 4.1 KB
Newer Older
W
init  
wizardforcel 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
# 课程:国际化服务提供商

> 原文: [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`包中:

W
wizardforcel 已提交
23 24
`java.util.spi`

W
init  
wizardforcel 已提交
25 26 27 28 29

*   [`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)

W
wizardforcel 已提交
30
`java.text.spi`
W
init  
wizardforcel 已提交
31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55

*   [`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`类,而无需对应用程序的源代码进行任何其他更改。