Module  java.base
软件包  java.util.spi

Class LocaleServiceProvider

  • 已知直接子类:
    BreakIteratorProviderCalendarDataProviderCalendarNameProviderCollatorProviderCurrencyNameProviderDateFormatProviderDateFormatSymbolsProviderDecimalFormatSymbolsProviderLocaleNameProviderNumberFormatProviderTimeZoneNameProvider


    public abstract class LocaleServiceProvider
    extends Object

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

    区域设置敏感的服务提供者接口是对应于java.textjava.util包中的区域设置敏感类的java.text 这些接口使得能够构建区域设置敏感对象并检索这些包的本地化名称。 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的类的完全合格的类名。

    调用区域敏感服务

    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运行时环境提供以下四个区域设置提供程序:

    • “CLDR”:基于Unicode Consortium的CLDR Project提供商
    • “COMPAT”:表示与JDK8之前的JDK版本(与JDK8的“JRE”相同)兼容的区域设置敏感服务。
    • “SPI”:表示实现LocaleServiceProvider类的子类的区域敏感服务。
    • “HOST”:反映用户在底层操作系统中的自定义设置的提供者。 根据Java运行时环境的实现,此提供程序可能不可用。
    • “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扩展感知,则具体的区域设置服务提供者实现应该覆盖此方法。 例如, DecimalFormatSymbolsProvider实现将需要检查给定的locale扩展,以查看是否指定了任何编号系统并可以被支持。 但是, CollatorProvider实现可能不受任何特定编号系统的影响,在这种情况下,编号系统的扩展应该被忽略。

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