模块  java.base
软件包  java.util.spi

Class LocaleServiceProvider

  • 已知直接子类:
    BreakIteratorProviderCalendarDataProviderCalendarNameProviderCollatorProviderCurrencyNameProviderDateFormatProviderDateFormatSymbolsProviderDecimalFormatSymbolsProviderLocaleNameProviderNumberFormatProviderTimeZoneNameProvider

    public abstract class LocaleServiceProvider
    extends Object

    这是所有区域设置敏感的服务提供程序接口(SPI)的超类。

    区域设置敏感服务提供程序接口是与java.textjava.util程序包中的区域设置敏感类对应的接口。 这些接口支持构建区域设置敏感对象以及检索这些包的本地化名称。 java.textjava.util包中用于名称检索的区域设置敏感工厂方法和方法使用提供程序接口的实现来提供对Java运行时环境本身支持的语言环境集之外的语言环境的支持。

    区域敏感服务提供程序实现的打包

    可以通过将这些区域设置敏感服务添加到应用程序的类路径来实现这些服务的实现。 提供程序使用完全限定的提供程序接口类名作为文件名,使用资源目录META-INF / services中的提供程序配置文件来标识自身。 该文件应包含一个完全限定的具体提供程序类名列表,每行一个。 换行符('\ n'),回车符('\ r')或回车符后面的任何一行都会终止一行。 每个名称周围的空格和制表符以及空行都将被忽略。 评论字符是'#'('#'); 在每一行上,忽略第一个注释字符后面的所有字符。 该文件必须以UTF-8编码。

    如果特定的具体提供程序类在多个配置文件中命名,或者在同一配置文件中多次命名,则将忽略重复项。 命名特定提供程序的配置文件不必与提供程序本身位于同一jar文件或其他分发单元中。 必须可以从最初查询的同一个类加载器访问提供程序以找到配置文件; 这不一定是加载文件的类加载器。

    例如, DateFormatProvider类的实现应采用包含该文件的jar文件的形式:

      META-INF/services/java.text.spi.DateFormatProvider 
    并且文件java.text.spi.DateFormatProvider应该有一行,例如:
      com.foo.DateFormatProviderImpl 
    这是实现DateFormatProvider的类的完全限定类名。

    调用Locale敏感服务

    java.textjava.util程序包中用于名称检索的区域设置敏感工厂方法和方法在需要时调用服务提供程序方法以支持所请求的区域设置。 这些方法首先检查Java运行时环境本身是否支持所请求的语言环境,并在可用时使用其支持。 否则,他们会调用已安装的提供程序的isSupportedLocale方法,以找到支持所请求区域设置的相应接口。 如果找到此类提供程序,则调用其他方法以获取请求的对象或名称。 检查是否支持区域设置时,默认情况下会忽略locale's extensions (如果还应检查区域设置的扩展,则必须覆盖isSupportedLocale方法。)如果Java运行时环境本身和安装的提供程序都不支持所请求的区域设置,则这些方法将通过候选区域设置列表并重复每个区域的可用性检查。找到一个匹配。 用于创建候选语言环境列表的算法与默认情况下ResourceBundle使用的算法相同(有关详细信息,请参阅getCandidateLocales )。 即使从候选列表中解析了语言环境,也会使用原始请求的语言环境(包括Locale扩展名)调用返回请求的对象或名称的方法。 Java运行时环境必须支持所有区域设置敏感服务的根区域设置,以确保此进程终止。

    对于某些名称请求,允许名称提供者(但不是其他对象的提供者)返回null,即使对于他们声称支持的语言环境,也可以将它们包含在getAvailableLocales的返回值中。 同样,Java运行时环境本身可能没有它支持的所有语言环境的所有名称。 这是因为请求名称的对象集可能很大并且随时间变化,因此完全覆盖它们并不总是可行的。 如果Java运行时环境或提供程序返回null而不是名称,则查找将如上所述继续进行,就好像不支持语言环境一样。

    可以使用“java.locale.providers”系统属性配置区域设置敏感服务的搜索顺序。 此系统属性声明用户查找由逗号分隔的区域设置敏感服务的首选顺序。 它仅在Java运行时启动时读取,因此稍后对System.setProperty()的调用不会影响顺序。

    Java Runtime Environment提供以下四种语言环境提供程序:

    • “CLDR”:基于Unicode Consortium的CLDR Project提供商
    • “COMPAT”:表示与JDK8之前的JDK版本兼容的区域设置敏感服务(与JDK8的“JRE”相同)。
    • “SPI”:表示实现此LocaleServiceProvider类的子类的区域设置敏感服务。
    • “HOST”:反映用户在底层操作系统中的自定义设置的提供程序。 此提供程序可能不可用,具体取决于Java Runtime Environment实现。
    • “JRE”:代表“COMPAT”的同义词。 此名称已弃用,将在JDK的未来版本中删除。

    例如,如果在属性中指定了以下内容:

      java.locale.providers=SPI,CLDR,COMPAT 
    首先查找SPI提供程序中的区域设置敏感服务。 如果所需的区域设置敏感服务不可用,则运行时将按此顺序查找CLDR,COMPAT。

    查找首选语言环境提供程序的默认顺序是“CLDR,COMPAT”,因此指定“CLDR,COMPAT”与默认行为相同。 需要实现区域设置敏感服务的应用程序必须显式指定“SPI”,以便Java运行时从类路径加载它们。

    从以下版本开始:
    1.6
    • 方法详细信息

      • getAvailableLocales

        public abstract Locale[] getAvailableLocales()
        返回此语言环境服务提供程序可为其提供本地化对象或名称的所有语言环境的数组。 此信息用于组成依赖于语言环境的服务的getAvailableLocales()值,例如DateFormat.getAvailableLocales()

        此方法返回的数组不应包含两个或多个Locale对象,这些对象的扩展名不同。

        结果
        此区域设置服务提供程序可为其提供本地化对象或名称的所有语言环境的数组。
      • isSupportedLocale

        public boolean isSupportedLocale​(Locale locale)
        如果此语言环境服务提供程序支持给定的locale则返回true 给定的locale可以包含extensions ,其应该被考虑用于支持确定。

        如果给定的locale等于Locale返回的任何可用Locale ,忽略给定的locale和可用语言环境中的任何扩展,则默认实现返回true 具体的语言环境服务提供程序实现应该覆盖此方法,如果这些实现是Locale extension-aware。 例如, DecimalFormatSymbolsProvider实现将需要检查给定locale扩展,以查看是否指定了任何编号系统并且可以支持。 但是, CollatorProvider实现可能不受任何特定编号系统的影响,在这种情况下,应忽略编号系统的扩展。

        参数
        locale - 待测试的 Locale
        结果
        true如果此提供商支持给定的locale ; 否则为false
        异常
        NullPointerException - 如果给定的 localenull
        从以下版本开始:
        1.8
        另请参见:
        Locale.hasExtensions()Locale.stripExtensions()