Класс ResourceBundle
- java.lang.Object
-
- java.util.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 |
|
Краткое описание полей
| Модификатор и тип | Поле | Описание |
|---|---|---|
protected ResourceBundle | parent | Родительский пакет этого пакета. |
Краткое описание конструкторов
| Конструктор | Описание |
|---|---|
ResourceBundle() | Единственный конструктор. |
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
static void | clearCache() | Удаляет все пакеты ресурсов из кэша, загруженные модулем вызывающего. |
static void | clearCache(ClassLoader loader) | Удаляет все пакеты ресурсов из кэша, загруженные данным загрузчиком классов. |
boolean | containsKey(String key) | Определяет, содержит ли данный |
String | getBaseBundleName() | Возвращает базовое имя этого пакета, если известно, или |
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 выполняется в следующих шагах.
- Этот метод фабрики ищет набор ресурсов в кэше для указанного
baseName,targetLocaleиloader. Если запрашиваемый экземпляр набора ресурсов найден в кэше и срок действия экземпляра и всех его родительских экземпляров не истек, экземпляр возвращается вызывающему коду. В противном случае, этот метод фабрики продолжает процесс загрузки, описанный ниже. - Вызывается метод
control.getFormatsдля получения форматов набора ресурсов для создания имен набора или ресурса. Строки"java.class"и"java.properties"обозначают классово-ориентированные и основанные на свойствах наборы ресурсов соответственно. Другие строки, начинающиеся с"java."зарезервированы для будущих расширений и не должны использоваться для определяемых приложением форматов. Другие строки обозначают определяемые приложением форматы. - Вызывается метод
control.getCandidateLocalesс целевым языком для получения списка кандидатныхLocale, для которых ищутся наборы ресурсов. - Вызывается метод
control.newBundleдля создания экземпляраResourceBundleдля базового имени набора, кандидатного языка и формата. (См. примечание о поиске в кэше ниже.) Этот шаг повторяется для всех комбинаций кандидатных языков и форматов, пока методnewBundleне вернёт экземплярResourceBundleили итерация не исчерпает все комбинации. Например, если кандидатные языки –Locale("de", "DE"),Locale("de")иLocale(""), а форматы –"java.class"и"java.properties", последовательность комбинаций язык-формат, которые будут использоваться для вызоваcontrol.newBundle, выглядит так:Индекс Localeformat1 Locale("de", "DE")java.class2 Locale("de", "DE")java.properties3 Locale("de")java.class4 Locale("de")java.properties5 Locale("")java.class6 Locale("")java.properties - Если на предыдущем шаге набор ресурсов не был найден, переходите к шагу 6. Если найден набор, являющийся базовым набором (набор для
Locale("")), и список кандидатных языков содержал толькоLocale(""), возвратите набор вызывающему коду. Если набор является базовым, но список кандидатных языков содержал языки, отличные от Locale(""), задержите набор и переходите к шагу 6. Если найден набор, не являющийся базовым, переходите к шагу 7. - Вызывается метод
control.getFallbackLocaleдля получения языка по умолчанию (альтернативы текущему целевому языку), чтобы попытаться найти набор ресурсов. Если метод возвращает не нулевой язык, он становится следующим целевым языком, и процесс загрузки начинается заново с шага 3. В противном случае, если базовый набор был найден и задержан на предыдущем шаге 5, он возвращается вызывающему коду. В противном случае выбрасывается исключение MissingResourceException. - В этот момент мы нашли набор ресурсов, который не является базовым. Если этот набор установил родительский набор во время своего создания, он возвращается вызывающему коду. В противном случае его цепь предков создается на основе списка кандидатных языков, из которого он был найден. Наконец, набор возвращается вызывающему коду.
Во время процесса загрузки набора ресурсов выше, этот метод фабрики проверяет кэш перед вызовом метода 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