Класс ResourceBundle

Прямые известные подклассы:
ListResourceBundle, PropertyResourceBundle
public abstract class ResourceBundle
extends Object

Пакеты ресурсов содержат объекты, специфичные для локали. Когда вашей программе нужен ресурс, специфичный для локали, например String, программа может загрузить его из пакета ресурсов, подходящего для текущей локали пользователя. Таким образом, вы можете писать код программы, который в значительной степени независим от локали пользователя, изолируя большую часть, если не все, локализованной информации в пакетах ресурсов.

Это позволяет вам писать программы, которые могут:

  • быть легко локализованы или переведены на разные языки
  • обрабатывать несколько локалей одновременно
  • быть легко изменены в будущем, чтобы поддерживать ещё больше локалей

Пакеты ресурсов принадлежат семействам, члены которых имеют общее базовое имя, но имена также имеют дополнительные компоненты, идентифицирующие их локали. Например, базовое имя семейства пакетов ресурсов может быть "MyResources". Семейство должно иметь пакет ресурсов по умолчанию, который просто имеет то же имя, что и его семейство - "MyResources" - и будет использоваться в качестве пакета последней инстанции, если конкретная локаль не поддерживается. Затем семейство может предоставлять столько локально-специфичных членов, сколько необходимо, например, немецкий с именем "MyResources_de".

Каждый пакет ресурсов в семействе содержит те же самые элементы, но элементы были переведены для локали, представленной этим пакетом ресурсов. Например, как "MyResources", так и "MyResources_de" могут иметь String, который используется на кнопке для отмены операций. В "MyResources" этот String может содержать "Cancel", а в "MyResources_de" - "Abbrechen".

Если для разных стран существуют разные ресурсы, вы можете создать специализации: например, "MyResources_de_CH" содержит объекты для немецкого языка (de) в Швейцарии (CH). Если вы хотите изменить только некоторые из ресурсов в специализации, вы можете это сделать.

Когда вашей программе нужен объект, специфичный для локали, она загружает класс ResourceBundle с помощью метода getBundle:

ResourceBundle myResources =
     ResourceBundle.getBundle("MyResources", currentLocale);

Пакеты ресурсов содержат пары "ключ/значение". Ключи однозначно идентифицируют объект, специфичный для локали, в пакете. Вот пример пакета ListResourceBundle, содержащего две пары "ключ/значение":

public class MyResources extends ListResourceBundle {
    protected Object[][] getContents() {
        return new Object[][] {
            // LOCALIZE THE SECOND STRING OF EACH ARRAY (e.g., "OK")
            {"OkKey", "OK"},
            {"CancelKey", "Cancel"},
            // END OF MATERIAL TO LOCALIZE
       };
    }
}
Ключи всегда являются String. В этом примере ключами являются "OkKey" и "CancelKey". В приведенном выше примере значения также являются String - "OK" и "Cancel" - но они могут быть и другими. Значения могут быть любым типом объекта.

Вы получаете объект из пакета ресурсов, используя соответствующий метод-получатель. Поскольку "OkKey" и "CancelKey" являются строками, вы используете getString для их извлечения:

button1 = new Button(myResources.getString("OkKey"));
button2 = new Button(myResources.getString("CancelKey"));
Все методы-получатели требуют ключ в качестве аргумента и возвращают объект, если он найден. Если объект не найден, метод-получатель выбрасывает MissingResourceException.

Помимо getString, ResourceBundle также предоставляет метод для получения массивов строк, getStringArray, а также универсальный getObject метод для любого другого типа объекта. При использовании getObject, вам придется привести результат к соответствующему типу. Например:

int[] myIntegers = (int[]) myResources.getObject("intList");

Java-платформа предоставляет два подкласса ResourceBundle, ListResourceBundle и PropertyResourceBundle, которые предоставляют довольно простой способ создания ресурсов. Как вы кратко видели в предыдущем примере, ListResourceBundle управляет своими ресурсами как списком пар "ключ/значение". PropertyResourceBundle использует файл свойств для управления своими ресурсами.

Если ListResourceBundle или PropertyResourceBundle не подходят для ваших нужд, вы можете написать свой собственный подкласс ResourceBundle. Ваши подклассы должны переопределить два метода: handleGetObject и getKeys().

Реализация подкласса ResourceBundle должна быть потокобезопасной, если она одновременно используется несколькими потоками. Стандартные реализации неабстрактных методов в этом классе и методы в прямых известных конкретных подклассах ListResourceBundle и PropertyResourceBundle являются потокобезопасными.

Пакеты ресурсов и именованные модули

Пакеты ресурсов могут быть развернуты в модулях следующим образом:

Пакеты ресурсов вместе с приложением

Пакеты ресурсов могут быть развернуты вместе с приложением в одном модуле. В этом случае пакеты ресурсов загружаются кодом в модуле путем вызова метода getBundle(String) или getBundle(String, Locale).

Пакеты ресурсов как поставщики услуг

Пакеты ресурсов могут быть развернуты в одном или нескольких модулях поставщиков услуг, и они могут быть расположены с помощью ServiceLoader. Должен быть определен интерфейс или класс сервиса. Модуль-потребитель объявляет, что он использует службу, а модули-поставщики услуг объявляют, что они предоставляют реализации службы. Обратитесь к ResourceBundleProvider для разработки служб пакетов ресурсов и развертывания поставщиков пакетов ресурсов. Модуль, получающий пакет ресурсов, сам может быть поставщиком пакетов ресурсов; в этом случае этот модуль находит пакет ресурсов только через механизм поставщика услуг.

Поставщик пакета ресурсов может предоставлять пакеты ресурсов в любом формате, например, XML, что устраняет необходимость в ResourceBundle.Control.

Пакеты ресурсов в других модулях и пути класса

Пакеты ресурсов в именованном модуле могут быть инкапсулированы, чтобы код в других модулях не мог их найти. Пакеты ресурсов в безымянных модулях и пути класса открыты для доступа любого модуля. Пакет ресурсов следует правилам инкапсуляции ресурсов, как указано в Module.getResourceAsStream(String).

Методы-фабрики getBundle без параметра Control находят и загружают пакеты ресурсов из поставщиков услуг. Поиск может быть продолжен, как если бы вы вызывали Module.getResourceAsStream(String) для поиска именованного ресурса в заданном модуле и вызывали ClassLoader.getResourceAsStream(String); обратитесь к спецификации метода getBundle для получения подробностей. Ищутся только неинкапсулированные пакеты ресурсов формата "java.class" или "java.properties".

Если модуль-потребитель является поставщиком пакета ресурсов, он не обращается к поиску по пути класса.

Пакеты ресурсов в автоматических модулях

Общий формат пакетов ресурсов - файл .properties. Обычно пакеты ресурсов .properties упакованы в файл JAR. Файл JAR только с пакетом ресурсов может быть легко развернут как автоматический модуль. Например, если файл JAR содержит запись "p/q/Foo_ja.properties" и нет записи .class, при разрешении и определении как автоматического модуля, пакет для этого модуля не выводится. Это позволяет пакетам ресурсов в формате .properties, упакованным в один или несколько файлов JAR, которые могут содержать записи в одной и той же директории и успешно разрешаться как автоматические модули.

ResourceBundle.Control

Класс ResourceBundle.Control предоставляет информацию, необходимую для выполнения процесса загрузки пакета методами-фабриками getBundle, которые принимают экземпляр ResourceBundle.Control. Вы можете реализовать свой собственный подкласс, чтобы включить нестандартные форматы пакетов ресурсов, изменить стратегию поиска или определить параметры кэширования. Обратитесь к описаниям класса и метода-фабрики getBundle для получения подробностей.

ResourceBundle.Control предназначен для приложения, развернутого в безымянном модуле, например, для поддержки пакетов ресурсов в нестандартных форматах или упаковки локализованных ресурсов в нетрадиционной конвенции. ResourceBundleProvider является заменой ResourceBundle.Control при переходе к модулям. UnsupportedOperationException будет выброшено, когда будет вызван метод-фабрика, принимающий параметр ResourceBundle.Control.

Для методов-фабрик getBundle, которые не принимают экземпляр ResourceBundle.Control, их поведение по умолчанию по загрузке пакетов ресурсов может быть изменено с помощью реализаций пользовательских ResourceBundleControlProvider. Если какой-либо из поставщиков предоставляет ResourceBundle.Control для данного базового имени, этот ResourceBundle.Control будет использоваться вместо стандартного ResourceBundle.Control. Если имеется более одного поставщика услуг для поддержки одного и того же базового имени, первый, возвращённый из ServiceLoader, будет использован. Реализация пользовательского ResourceBundle.Control игнорируется именованными модулями.

Управление кэшем

Экземпляры пакетов ресурсов, созданные методами-фабриками getBundle, кэшируются по умолчанию, и методы-фабрики возвращают один и тот же экземпляр пакета ресурсов несколько раз, если он был кэширован. Клиенты getBundle могут очистить кэш, управлять жизненным циклом кэшированных экземпляров пакетов ресурсов с использованием значений времени жизни или указать, чтобы пакеты ресурсов не кэшировались. Обратитесь к описаниям метода-фабрики getBundle метода-фабрики, clearCache, ResourceBundle.Control.getTimeToLive и ResourceBundle.Control.needsReload для получения подробностей.

Пример

Следующий пример демонстрирует очень простой подкласс ResourceBundle, MyResources, который управляет двумя ресурсами (для большего количества ресурсов, вероятно, следует использовать Map). Обратите внимание, что вам не нужно предоставлять значение, если "родительский" ResourceBundle обрабатывает тот же ключ с тем же значением (как в случае с okKey ниже).
// default (English language, United States)
public class MyResources extends ResourceBundle {
    public Object handleGetObject(String key) {
        if (key.equals("okKey")) return "Ok";
        if (key.equals("cancelKey")) return "Cancel";
        return null;
    }

    public Enumeration<String> getKeys() {
        return Collections.enumeration(keySet());
    }

    // Overrides handleKeySet() so that the getKeys() implementation
    // can rely on the keySet() value.
    protected Set<String> handleKeySet() {
        return new HashSet<String>(Arrays.asList("okKey", "cancelKey"));
    }
}

// German language
public class MyResources_de extends MyResources {
    public Object handleGetObject(String key) {
        // don't need okKey, since parent level handles it.
        if (key.equals("cancelKey")) return "Abbrechen";
        return null;
    }

    protected Set<String> handleKeySet() {
        return new HashSet<String>(Arrays.asList("cancelKey"));
    }
}
Вы не ограничены использованием одной группы ResourceBundle. Например, вы можете иметь набор пакетов для сообщений об исключениях, ExceptionResources (ExceptionResources_fr, ExceptionResources_de, ...), и один для виджетов, WidgetResource (WidgetResources_fr, WidgetResources_de, ...); разбивая ресурсы как вам угодно.
Since:
1.1
See Also:
ListResourceBundle, PropertyResourceBundle, MissingResourceException, ResourceBundleProvider

Вложенные классы

Модификатор и тип Класс Описание
static class  ResourceBundle.Control

ResourceBundle.Control определяет набор методов обратного вызова, которые вызываются методом-фабрикой ResourceBundle.getBundle во время процесса загрузки пакета.

Краткое описание полей

Модификатор и тип Поле Описание
protected ResourceBundle parent

Родительский пакет этого пакета.

Краткое описание конструкторов

Конструктор Описание
ResourceBundle()

Единственный конструктор.

Краткое описание методов

Модификатор и тип Метод Описание
static void clearCache()

Удаляет все пакеты ресурсов из кэша, загруженные модулем вызывающего.

static void clearCache​(ClassLoader loader)

Удаляет все пакеты ресурсов из кэша, загруженные данным загрузчиком классов.

boolean containsKey​(String key)

Определяет, содержит ли данный key этот ResourceBundle или его родительские пакеты.

String getBaseBundleName()

Возвращает базовое имя этого пакета, если известно, или null, если неизвестно.

static ResourceBundle getBundle​(String baseName)

Получает пакет ресурсов с указанным базовым именем, локалью по умолчанию и модулем вызывающего.

static ResourceBundle getBundle​(String baseName, Module module)

Получает пакет ресурсов с указанным базовым именем и локалью по умолчанию от имени указанного модуля.

static ResourceBundle getBundle​(String baseName, Locale locale)

Получает пакет ресурсов с указанным базовым именем и локалью, а также модулем вызывающего.

static ResourceBundle getBundle​(String baseName, Locale locale, ClassLoader loader)

Получает пакет ресурсов с указанным базовым именем, локалью и загрузчиком классов.

static ResourceBundle getBundle​(String baseName, Locale targetLocale, ClassLoader loader, ResourceBundle.Control control)

Возвращает пакет ресурсов с указанным базовым именем, целевой локалью, загрузчиком классов и контролем.

static ResourceBundle getBundle​(String baseName, Locale targetLocale, Module module)

Получает пакет ресурсов с указанным базовым именем и локалью от имени указанного модуля.

static ResourceBundle getBundle​(String baseName, Locale targetLocale, ResourceBundle.Control control)

Возвращает пакет ресурсов с указанным базовым именем, целевой локалью, контролем и загрузчиком классов вызывающего.

static ResourceBundle getBundle​(String baseName, ResourceBundle.Control control)

Возвращает пакет ресурсов с указанным базовым именем, локалью по умолчанию и указанным контролем.

abstract Enumeration<String> getKeys()

Возвращает перечисление ключей.

Locale getLocale()

Возвращает локаль этого пакета ресурсов.

Object getObject​(String key)

Получает объект для данного ключа из этого пакета ресурсов или одного из его родительских пакетов.

String getString​(String key)

Получает строку для данного ключа из этого пакета ресурсов или одного из его родительских пакетов.

String[] getStringArray​(String key)

Получает массив строк для данного ключа из этого пакета ресурсов или одного из его родительских пакетов.

protected abstract Object handleGetObject​(String key)

Получает объект для данного ключа из этого пакета ресурсов.

protected Set<String> handleKeySet()

Возвращает перечисление ключей, содержащихся только в этом пакете.

Set<String> keySet()

Возвращает перечисление всех ключей, содержащихся в этом пакете и его родительских пакетах.

protected void setParent​(ResourceBundle parent)

Устанавливает родительский пакет этого пакета.

Методы, объявленные в классе java.lang.Object

clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait

Подробное описание полей

parent

protected ResourceBundle parent

Родительский пакет этого пакета. Родительский пакет ищется методом getObject, если этот пакет не содержит определенного ресурса.

Подробное описание конструкторов

ResourceBundle

public ResourceBundle()

Единственный конструктор. (Для вызова конструкторами подклассов, обычно неявный.)

Методы

getBaseBundleName

public String getBaseBundleName()

Возвращает базовое имя этого набора ресурсов, если оно известно, или null в противном случае. Если оно не null, то это значение параметра baseName, переданного методу ResourceBundle.getBundle(...) при загрузке набора ресурсов.

Возвращает:
Базовое имя набора ресурсов, предоставленное и ожидаемое методами ResourceBundle.getBundle(...).
С тех пор:
1.8
См. также:
getBundle(java.lang.String, java.util.Locale, java.lang.ClassLoader)

getString

public final String getString(String key)

Возвращает строку для данного ключа из этого набора ресурсов или из одного из его родительских наборов. Вызов этого метода эквивалентен вызову

(String) getObject(key).
.

Параметры:
key - ключ искомой строки
Возвращает:
строку для данного ключа
Исключение:
NullPointerException - если key является null
MissingResourceException - если для данного ключа не найдено объекта
ClassCastException - если объект, найденный для данного ключа, не является строкой

getStringArray

public final String[] getStringArray(String key)

Возвращает массив строк для данного ключа из этого набора ресурсов или из одного из его родительских наборов. Вызов этого метода эквивалентен вызову

(String[]) getObject(key).
.

Параметры:
key - ключ искомого массива строк
Возвращает:
массив строк для данного ключа
Исключение:
NullPointerException - если key является null
MissingResourceException - если для данного ключа не найдено объекта
ClassCastException - если объект, найденный для данного ключа, не является массивом строк

getObject

public final Object getObject(String key)

Возвращает объект для данного ключа из этого набора ресурсов или из одного из его родительских наборов. Сначала метод пытается получить объект из этого набора ресурсов, используя handleGetObject. Если это не удается, и родительский набор ресурсов не null, он вызывает метод getObject родительского набора. Если это также не удается, выбрасывается MissingResourceException.

Параметры:
key - ключ искомого объекта
Возвращает:
объект для данного ключа
Исключение:
NullPointerException - если key является null
MissingResourceException - если для данного ключа не найдено объекта

getLocale

public Locale getLocale()

Возвращает локаль этого набора ресурсов. Этот метод может быть использован после вызова getBundle(), чтобы определить, действительно ли возвращенный набор ресурсов соответствует запрошенной локали или является резервным вариантом.

Возвращает:
локаль этого набора ресурсов

setParent

protected void setParent(ResourceBundle parent)

Устанавливает родительский набор ресурсов этого набора. Родительский набор ресурсов ищется методом getObject, когда в этом наборе нет определенного ресурса.

Параметры:
parent - родительский набор ресурсов этого набора.

getBundle

public static final ResourceBundle getBundle(String baseName)

Получает набор ресурсов с заданным базовым именем, локалью по умолчанию и модулем вызывающего кода. Вызов этого метода эквивалентен вызову

getBundle(baseName, Locale.getDefault(), callerModule),
.

Параметры:
baseName - базовое имя набора ресурсов, полностью квалифицированное имя класса
Возвращает:
набор ресурсов для данного базового имени и локали по умолчанию
Исключение:
NullPointerException - если baseName является null
MissingResourceException - если набор ресурсов для указанного базового имени не найден
См. также:
Стратегия поиска и загрузки наборов ресурсов, Наборы ресурсов и именованные модули

getBundle

public static final ResourceBundle getBundle(String baseName,
                                             ResourceBundle.Control control)

Возвращает набор ресурсов с заданным базовым именем, локалью по умолчанию и заданным контроллером. Вызов этого метода эквивалентен вызову

getBundle(baseName, Locale.getDefault(),
           this.getClass().getClassLoader(), control),
, за исключением того, что getClassLoader() выполняется с привилегиями безопасности ResourceBundle. См. getBundle для полного описания процесса загрузки набора ресурсов с ResourceBundle.Control.

Параметры:
baseName - базовое имя набора ресурсов, полностью квалифицированное имя класса
control - контроллер, предоставляющий информацию о процессе загрузки набора ресурсов
Возвращает:
набор ресурсов для данного базового имени и локали по умолчанию
Исключение:
NullPointerException - если baseName или control является null
MissingResourceException - если набор ресурсов для указанного базового имени не найден
IllegalArgumentException - если заданный control не выполняется должным образом (например, control.getCandidateLocales возвращает null). Обратите внимание, что валидация control выполняется по мере необходимости.
UnsupportedOperationException - если этот метод вызывается в именованном модуле
С тех пор:
1.6

getBundle

public static final ResourceBundle getBundle(String baseName,
                                             Locale locale)

Получает набор ресурсов с заданным базовым именем и локалью, а также модулем вызывающего кода. Вызов этого метода эквивалентен вызову

getBundle(baseName, locale, callerModule),
.

Параметры:
baseName - базовое имя набора ресурсов, полностью квалифицированное имя класса
locale - локаль, для которой требуется набор ресурсов
Возвращает:
набор ресурсов для данного базового имени и локали
Исключение:
NullPointerException - если baseName или locale является null
MissingResourceException - если набор ресурсов для указанного базового имени не найден
См. также:
Стратегия поиска и загрузки наборов ресурсов, Наборы ресурсов и именованные модули

getBundle

public static ResourceBundle getBundle(String baseName,
                                       Module module)

Получает набор ресурсов с заданным базовым именем и локалью по умолчанию от имени указанного модуля. Этот метод эквивалентен вызову

getBundle(baseName, Locale.getDefault(), module)
.

Параметры:
baseName - базовое имя набора ресурсов, полностью квалифицированное имя класса
module - модуль, для которого ищется набор ресурсов
Возвращает:
набор ресурсов для данного базового имени и локали по умолчанию
Исключение:
NullPointerException - если baseName или module является null
SecurityException - если менеджер безопасности существует и вызывающий код не является указанным модулем и не имеет RuntimePermission("getClassLoader")
MissingResourceException - если набор ресурсов для указанного базового имени не найден в указанном модуле
С тех пор:
9
См. также:
ResourceBundleProvider, Стратегия поиска и загрузки наборов ресурсов, Наборы ресурсов и именованные модули

getBundle

public static ResourceBundle getBundle(String baseName,
                                       Locale targetLocale,
                                       Module module)

Получает набор ресурсов с заданным базовым именем и локалью от имени указанного модуля.

Наборы ресурсов в именованных модулях могут быть инкапсулированы. При загрузке набора ресурсов из провайдера сервиса, модуль вызывающего кода должен иметь соответствующую uses-строку в своем модульном описании, чтобы объявить, что модуль использует ResourceBundleProvider для именованного набора ресурсов. В противном случае он загрузит наборы ресурсов, которые находятся локально в данном модуле, как если бы вызывался Module.getResourceAsStream(String), или которые видны загрузчику классов данного модуля, как если бы вызывался ClassLoader.getResourceAsStream(String). При загрузке набора ресурсов из указанного модуля он подчиняется правилам инкапсуляции, определенным в Module.getResourceAsStream.

Если заданный module является безымянным модулем, этот метод эквивалентен вызову getBundle(baseName, targetLocale, module.getClassLoader() для загрузки наборов ресурсов, которые видны загрузчику классов данного безымянного модуля. Пользовательские реализации ResourceBundleControlProvider, если они присутствуют, будут вызваны только если указанный модуль является безымянным.

Параметры:
baseName - базовое имя набора ресурсов, полностью квалифицированное имя класса
targetLocale - локаль, для которой требуется набор ресурсов
module - модуль, для которого ищется набор ресурсов
Возвращает:
набор ресурсов для данного базового имени и локали в модуле
Исключение:
NullPointerException - если baseName, targetLocale, или module является null
SecurityException - если менеджер безопасности существует и вызывающий код не является указанным модулем и не имеет RuntimePermission("getClassLoader")
MissingResourceException - если набор ресурсов для указанного базового имени и локали не найден в указанном module
С тех пор:
9
См. также:
Стратегия поиска и загрузки наборов ресурсов, Наборы ресурсов и именованные модули

getBundle

public static final ResourceBundle getBundle(String baseName,
                                             Locale targetLocale,
                                             ResourceBundle.Control control)

Возвращает набор ресурсов, используя указанное базовое имя, целевой язык и контроль, а также загрузчик классов вызывающего метода. Вызов этого метода эквивалентен вызову

getBundle(baseName, targetLocale, this.getClass().getClassLoader(),
           control),
, за исключением того, что getClassLoader() выполняется с правами доступа безопасности ResourceBundle. См. getBundle для полного описания процесса загрузки набора ресурсов с ResourceBundle.Control.

Параметры:
baseName - базовое имя набора ресурсов, полное имя класса
targetLocale - язык, для которого требуется набор ресурсов
control - контроль, предоставляющий информацию для процесса загрузки набора ресурсов
Возвращает:
набор ресурсов для данного базового имени и Locale в locales
Исключения:
NullPointerException - если baseName, locales или control является null
MissingResourceException - если набор ресурсов для указанного базового имени в любом из locales не найден.
IllegalArgumentException - если указанный control не работает должным образом (например, control.getCandidateLocales возвращает null). Обратите внимание, что валидация control выполняется по мере необходимости.
UnsupportedOperationException - если этот метод вызывается в именованном модуле
С:
1.6

getBundle

public static ResourceBundle getBundle(String baseName,
                                       Locale locale,
                                       ClassLoader loader)

Получает набор ресурсов, используя указанное базовое имя, язык и загрузчик классов.

Если этот метод вызывается из именованного модуля, и указанный загрузчик является загрузчиком классов вызывающего модуля, это эквивалентно вызову:

getBundle(baseName, targetLocale, callerModule)
в противном случае, это эквивалентно вызову:
getBundle(baseName, targetLocale, loader, control)
где control является экземпляром по умолчанию ResourceBundle.Control, если экземпляр Control не предоставляется SPI ResourceBundleControlProvider. Обратитесь к описанию изменения поведения по умолчанию. Ниже приведено описание поведения по умолчанию.

Стратегия поиска и загрузки набора ресурсов

getBundle использует базовое имя, указанный язык и язык по умолчанию (полученный из Locale.getDefault) для генерации последовательности имен кандидатов на набор ресурсов. Если язык, сценарий, страна и вариант указанного языка пусты, то базовое имя является единственным именем кандидата на набор ресурсов. В противном случае список кандидатов на язык генерируется из значений атрибутов указанного языка (язык, сценарий, страна и вариант) и добавляется к базовому имени. Как правило, это будет выглядеть следующим образом:

baseName + "_" + language + "_" + script + "_" + country + "_" + variant
     baseName + "_" + language + "_" + script + "_" + country
     baseName + "_" + language + "_" + script
     baseName + "_" + language + "_" + country + "_" + variant
     baseName + "_" + language + "_" + country
     baseName + "_" + language

Имена кандидатов, где последний компонент — пустая строка, опускаются вместе с символом подчеркивания. Например, если страна — пустая строка, то второе и пятое имена кандидатов выше были бы опущены. Также, если сценарий — пустая строка, имена кандидатов, содержащие сценарий, опускаются. Например, язык с языком "de" и вариантом "JAVA" сгенерирует имена кандидатов с базовым именем "MyResource" ниже.

MyResource_de__JAVA
     MyResource_de
В случае, если вариант содержит одну или несколько подчеркиваний ('_'), последовательность имен наборов ресурсов, сгенерированных путем обрезки последнего подчеркивания и части, следующей за ним, вставляется после имени кандидата на набор ресурсов с исходным вариантом. Например, для языка с языком "en", сценарием "Latn, страной "US" и вариантом "WINDOWS_VISTA" и базовым именем набора ресурсов "MyResource", генерируется следующий список имен кандидатов на набор ресурсов:
MyResource_en_Latn_US_WINDOWS_VISTA
 MyResource_en_Latn_US_WINDOWS
 MyResource_en_Latn_US
 MyResource_en_Latn
 MyResource_en_US_WINDOWS_VISTA
 MyResource_en_US_WINDOWS
 MyResource_en_US
 MyResource_en
Note: For some Locales, the list of candidate bundle names contains extra names, or the order of bundle names is slightly modified. See the description of the default implementation of getCandidateLocales for details.

getBundle затем перебирает имена кандидатов на набор ресурсов, чтобы найти первое, для которого можно создать фактический набор ресурсов. Используется метод getFormats контроллеров по умолчанию, который генерирует два имени набора ресурсов для каждого сгенерированного имени, первое — имя класса, а второе — имя файла свойств. Для каждого имени кандидата на набор ресурсов пытается создать набор ресурсов:

  • Сначала пытается загрузить класс, используя сгенерированное имя класса. Если такой класс может быть найден и загружен с помощью указанного загрузчика классов, совместим по присваиванию с ResourceBundle, доступен из ResourceBundle и может быть инициализирован, getBundle создает новый экземпляр этого класса и использует его в качестве результата набора ресурсов.
  • В противном случае, getBundle пытается найти файл ресурсов свойств, используя сгенерированное имя файла свойств. Генерирует имя пути из имени кандидата на набор ресурсов, заменяя все символы "." на "/" и добавляя строку ".properties". Пытается найти "ресурс" с этим именем, используя ClassLoader.getResource. (Обратите внимание, что "ресурс" в смысле getResource не имеет ничего общего с содержимым набора ресурсов, он просто контейнер данных, например, файл.) Если "ресурс" найден, пытается создать новый экземпляр PropertyResourceBundle из его содержимого. При успехе этот экземпляр становится результатом набора ресурсов.

Это продолжается до тех пор, пока не будет создан результат набора ресурсов или список имен кандидатов на набор ресурсов не будет исчерпан. Если соответствующий набор ресурсов не найден, вызывается метод getFallbackLocale контроллера по умолчанию, который возвращает текущий язык по умолчанию. Создается новая последовательность имен кандидатов на язык, используя этот язык, и поиск повторяется, как описано выше.

Если результат набора ресурсов по-прежнему не найден, ищется само базовое имя. Если это также не удается, выбрасывается MissingResourceException.

После того как был найден результат набора ресурсов, создается его цепочка предков. Если у набора ресурсов уже есть родитель (возможно, потому, что он был возвращен из кеша), цепочка завершается.

В противном случае, getBundle проверяет оставшуюся часть списка кандидатов на язык, используемого во время прохода, который сгенерировал набор ресурсов. (Как и прежде, имена кандидатов, где последний компонент — пустая строка, опускаются.) Когда достигается конец списка кандидатов, пытается использовать простое имя набора ресурсов. С каждым из имен кандидатов на набор ресурсов пытается создать набор ресурсов (сначала ища класс, а затем файл свойств, как описано выше).

Всякий раз, когда это удается, вызывается метод setParent ранее созданного набора ресурсов с новым набором ресурсов. Это продолжается до тех пор, пока список имен не будет исчерпан или у текущего набора ресурсов уже есть родитель, отличный от null.

После завершения цепочки предков, набор ресурсов возвращается.

Примечание: getBundle кэширует созданные наборы ресурсов и может возвращать один и тот же экземпляр набора ресурсов несколько раз.

Примечание: Аргумент baseName должен быть полным именем класса. Однако для совместимости со старыми версиями Java SE Runtime Environments не проверяют это, поэтому возможно доступ к PropertyResourceBundle путем указания имени пути (используя "/") вместо полного имени класса (используя ".").

Пример:

Предоставлены следующие файлы класса и свойств:

  • MyResources.class
  • MyResources.properties
  • MyResources_fr.properties
  • MyResources_fr_CH.class
  • MyResources_fr_CH.properties
  • MyResources_en.properties
  • MyResources_es_ES.class
Содержимое всех файлов является допустимым (то есть, публичные не абстрактные подклассы ResourceBundle для файлов ".class", синтаксически корректные файлы ".properties"). Язык по умолчанию — Locale("en", "GB").

Вызов getBundle со следующими параметрами языка приведет к созданию наборов ресурсов следующим образом:

Язык Набор ресурсов
Locale("fr", "CH") MyResources_fr_CH.class, родитель MyResources_fr.properties, родитель MyResources.class
Locale("fr", "FR") MyResources_fr.properties, родитель MyResources.class
Locale("de", "DE") MyResources_en.properties, родитель MyResources.class
Locale("en", "US") MyResources_en.properties, родитель MyResources.class
Locale("es", "ES") MyResources_es_ES.class, родитель MyResources.class

Файл MyResources_fr_CH.properties никогда не используется, потому что он скрывается MyResources_fr_CH.class. Аналогично, MyResources.properties также скрывается MyResources.class.

Примечание API:
Если вызывающий модуль является именованным модулем, и предоставленный loader является загрузчиком классов вызывающего модуля, этот метод эквивалентен getBundle(baseName, locale); в противном случае, он может не найти наборы ресурсов из именованных модулей. Используйте getBundle(String, Locale, Module) для загрузки наборов ресурсов от имени определенного модуля.
Параметры:
baseName - базовое имя набора ресурсов, полное имя класса
locale - язык, для которого требуется набор ресурсов
loader - загрузчик классов, из которого загрузить набор ресурсов
Возвращает:
набор ресурсов для данного базового имени и языка
Исключения:
NullPointerException - если baseName, locale, или loader является null
MissingResourceException - если набор ресурсов для указанного базового имени не найден
С:
1.2
См. также:
Наборы ресурсов и именованные модули

getBundle

public static ResourceBundle getBundle(String baseName,
                                       Locale targetLocale,
                                       ClassLoader loader,
                                       ResourceBundle.Control control)

Возвращает набор ресурсов с указанным базовым именем, целевым языком, загрузчиком классов и контроллером. В отличие от методов фабрики getBundle без аргумента control, заданный control определяет способ поиска и создания наборов ресурсов. По концепции, процесс загрузки набора ресурсов с заданным control выполняется в следующих шагах.

  1. Этот метод фабрики ищет набор ресурсов в кэше для указанного baseName, targetLocale и loader. Если запрашиваемый экземпляр набора ресурсов найден в кэше и срок действия экземпляра и всех его родительских экземпляров не истек, экземпляр возвращается вызывающему коду. В противном случае, этот метод фабрики продолжает процесс загрузки, описанный ниже.
  2. Вызывается метод control.getFormats для получения форматов набора ресурсов для создания имен набора или ресурса. Строки "java.class" и "java.properties" обозначают классово-ориентированные и основанные на свойствах наборы ресурсов соответственно. Другие строки, начинающиеся с "java." зарезервированы для будущих расширений и не должны использоваться для определяемых приложением форматов. Другие строки обозначают определяемые приложением форматы.
  3. Вызывается метод control.getCandidateLocales с целевым языком для получения списка кандидатных Locale, для которых ищутся наборы ресурсов.
  4. Вызывается метод control.newBundle для создания экземпляра ResourceBundle для базового имени набора, кандидатного языка и формата. (См. примечание о поиске в кэше ниже.) Этот шаг повторяется для всех комбинаций кандидатных языков и форматов, пока метод newBundle не вернёт экземпляр ResourceBundle или итерация не исчерпает все комбинации. Например, если кандидатные языки – Locale("de", "DE"), Locale("de") и Locale(""), а форматы – "java.class" и "java.properties", последовательность комбинаций язык-формат, которые будут использоваться для вызова control.newBundle, выглядит так:
    Индекс Locale format
    1 Locale("de", "DE") java.class
    2 Locale("de", "DE") java.properties
    3 Locale("de") java.class
    4 Locale("de") java.properties
    5 Locale("") java.class
    6 Locale("") java.properties
  5. Если на предыдущем шаге набор ресурсов не был найден, переходите к шагу 6. Если найден набор, являющийся базовым набором (набор для Locale("")), и список кандидатных языков содержал только Locale(""), возвратите набор вызывающему коду. Если набор является базовым, но список кандидатных языков содержал языки, отличные от Locale(""), задержите набор и переходите к шагу 6. Если найден набор, не являющийся базовым, переходите к шагу 7.
  6. Вызывается метод control.getFallbackLocale для получения языка по умолчанию (альтернативы текущему целевому языку), чтобы попытаться найти набор ресурсов. Если метод возвращает не нулевой язык, он становится следующим целевым языком, и процесс загрузки начинается заново с шага 3. В противном случае, если базовый набор был найден и задержан на предыдущем шаге 5, он возвращается вызывающему коду. В противном случае выбрасывается исключение MissingResourceException.
  7. В этот момент мы нашли набор ресурсов, который не является базовым. Если этот набор установил родительский набор во время своего создания, он возвращается вызывающему коду. В противном случае его цепь предков создается на основе списка кандидатных языков, из которого он был найден. Наконец, набор возвращается вызывающему коду.

Во время процесса загрузки набора ресурсов выше, этот метод фабрики проверяет кэш перед вызовом метода control.newBundle. Если срок действия набора ресурсов, найденного в кэше, истек, метод фабрики вызывает метод control.needsReload для определения необходимости перезагрузки набора ресурсов. Если перезагрузка необходима, метод фабрики вызывает control.newBundle для перезагрузки набора ресурсов. Если control.newBundle возвращает null, метод фабрики помещает пустой набор ресурсов в кэш в качестве метки отсутствующих наборов ресурсов, чтобы избежать накладных расходов на поиск для последующих запросов. Такие пустые наборы ресурсов находятся под тем же управлением истечения срока действия, что и control.

Все загруженные наборы ресурсов кэшируются по умолчанию. Подробности см. в control.getTimeToLive.

Следующий пример иллюстрирует процесс загрузки набора ресурсов с реализацией ResourceBundle.Control по умолчанию.

Условия:

  • Базовое имя набора: foo.bar.Messages
  • Запрашиваемый Locale: Locale.ITALY
  • Значение по умолчанию Locale: Locale.FRENCH
  • Доступные наборы ресурсов: foo/bar/Messages_fr.properties и foo/bar/Messages.properties

Сначала getBundle пытается загрузить набор ресурсов в следующей последовательности.

  • класс foo.bar.Messages_it_IT
  • файл foo/bar/Messages_it_IT.properties
  • класс foo.bar.Messages_it
  • файл foo/bar/Messages_it.properties
  • класс foo.bar.Messages
  • файл foo/bar/Messages.properties

На этом этапе getBundle находит foo/bar/Messages.properties, который задерживается, поскольку это базовый набор. getBundle вызывает control.getFallbackLocale("foo.bar.Messages", Locale.ITALY), которая возвращает Locale.FRENCH. Затем getBundle пытается загрузить набор в следующей последовательности.

  • класс foo.bar.Messages_fr
  • файл foo/bar/Messages_fr.properties
  • класс foo.bar.Messages
  • файл foo/bar/Messages.properties

getBundle находит foo/bar/Messages_fr.properties и создаёт экземпляр ResourceBundle. Затем getBundle устанавливает цепочку предков из списка кандидатных языков. В списке найден только foo/bar/Messages.properties, и getBundle создаёт экземпляр ResourceBundle, который становится родителем экземпляра для foo/bar/Messages_fr.properties.

Параметры:
baseName - базовое имя набора ресурсов, полное имя класса
targetLocale - язык, для которого требуется набор ресурсов
loader - загрузчик классов для загрузки набора ресурсов
control - контроллер, предоставляющий информацию для процесса загрузки набора ресурсов
Возвращает:
набор ресурсов для заданного базового имени и языка
Исключения:
NullPointerException - если baseName, targetLocale, loader, или control является null
MissingResourceException - если набор ресурсов для заданного базового имени не найден
IllegalArgumentException - если заданный control работает некорректно (например, control.getCandidateLocales возвращает null). Обратите внимание, что валидация control выполняется по мере необходимости.
UnsupportedOperationException - если этот метод вызывается в именованном модуле
С:
1.6

clearCache

public static final void clearCache()

Удаляет все наборы ресурсов из кэша, загруженные модулем вызывающего кода.

С:
1.6
См. также:
ResourceBundle.Control.getTimeToLive(String,Locale)

clearCache

public static final void clearCache(ClassLoader loader)

Удаляет все наборы ресурсов из кэша, загруженные данным загрузчиком классов.

Параметры:
loader - загрузчик классов
Исключения:
NullPointerException - если loader равно null
С:
1.6
См. также:
ResourceBundle.Control.getTimeToLive(String,Locale)

handleGetObject

protected abstract Object handleGetObject(String key)

Получает объект для данного ключа из этого набора ресурсов. Возвращает null, если этот набор ресурсов не содержит объекта для данного ключа.

Параметры:
key - ключ искомого объекта
Возвращает:
объект для данного ключа или null
Исключения:
NullPointerException - если key является null

getKeys

public abstract Enumeration<String> getKeys()

Возвращает перечисление ключей.

Возвращает:
перечисление ключей, содержащихся в этом наборе ресурсов и его родительских наборах.

containsKey

public boolean containsKey(String key)

Определяет, содержится ли данный key в этом наборе ресурсов или его родительских наборах.

Параметры:
key - ресурсный key
Возвращает:
true если данный key содержится в этом наборе ресурсов или его родительских наборах; false в противном случае.
Исключения:
NullPointerException - если key является null
С:
1.6

keySet

public Set<String> keySet()

Возвращает набор всех ключей, содержащихся в этом наборе ресурсов и его родительских наборах.

Возвращает:
a Set всех ключей, содержащихся в этом ResourceBundle и его родительских пакетах.
С:
1.6

handleKeySet

protected Set<String> handleKeySet()

Возвращает a Set ключей, содержащихся только в этом ResourceBundle.

Реализация по умолчанию возвращает a Set ключей, возвращаемых методом getKeys, за исключением тех, для которых метод handleGetObject возвращает null. После создания Set, значение сохраняется в этом ResourceBundle для предотвращения создания тех же Set при последующих вызовах. Подклассы могут переопределить этот метод для более быстрого обработки.

Возвращает:
a Set ключей, содержащихся только в этом ResourceBundle
С:
1.6

© 1993, 2020, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/ResourceBundle.html

Spec-Zone .ru
спецификации, руководства, описания, API