Пакеты ресурсов содержат объекты, специфичные для определенного языкового окружения. Когда ваша программа требует ресурса, специфичного для определенного языкового окружения (например, строк), ваша программа может загрузить его из пакета ресурсов, подходящего для текущего языкового окружения пользователя. Таким образом, вы можете писать программный код, который в большинстве своем независим от языкового окружения пользователя, изолируя большую часть, если не все, специфичной информации о языковом окружении в пакетах ресурсов.
Это позволяет вам писать программы, которые могут:
легко локализоваться или переводиться на различные языки
одновременно обрабатывать несколько языковых окружений
легко модифицироваться позже для поддержки еще большего количества языковых окруженийПакеты ресурсов принадлежат семействам, члены которых имеют общее базовое имя, но также имеют дополнительные компоненты, которые идентифицируют их языковые окружения. Например, базовое имя семейства пакетов ресурсов может быть "MyResources". Семейство должно иметь базовый пакет ресурсов, который просто имеет то же имя, что и его семейство — "MyResources" — и будет использоваться как пакет последней надежды, если конкретное языковое окружение не поддерживается. Затем семейство может предоставить столько специфичных для языкового окружения членов, сколько необходимо, например, немецкий член с именем "MyResources_de". Каждый ресурсный пакет в семействе содержит одни и те же элементы, но эти элементы переведены на язык, представленный этим ресурсным пакетом. Например, как "MyResources", так и "MyResources_de" могут содержать строку, используемую на кнопке для отмены операций. В "MyResources" строка может содержать "Cancel", а в "MyResources_de" — "Abbrechen". Каждый пакет ресурсов в домашней среде содержит одни и те же элементы, но эти элементы переведены на язык, соответствующий языковой среде пакета. Например, пакеты "MyResources" и "MyResources_de" могут содержать строку для отмены действия. В "MyResources" строка может содержать "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[][] {
// ЛОКАЛИЗИРУЙТЕ ВТОРОЕ СТРОКОВОЕ ЗНАЧЕНИЕ КАЖДОГО МАССИВА (например, "OK")
{"OkKey", "OK"},
{"CancelKey", "Cancel"},
// КОНЕЦ МАТЕРИАЛА ДЛЯ ЛОКАЛИЗАЦИИ
};
}
}
Ключи всегда являются строками. В этом примере ключи — "OkKey" и "CancelKey". В приведенном выше примере значения также являются строками — "OK" и "Cancel" — но они не обязательно должны быть строками. Значения могут быть объектами любого типа.Вы получаете объект из пакета ресурсов с помощью соответствующего метода получения. Поскольку "OkKey" и "CancelKey" являются строками, вы можете использовать getString для их получения:
Используйте соответствующий метод getter для получения объекта из ресурсного пакета. Поскольку "OkKey" и "CancelKey" являются строками, вы можете использовать getString для их получения:```java button1 = new Button(myResources.getString("ОК")); button2 = new Button(myResources.getString("Отмена"));
Методы getter требуют ключа в качестве аргумента и возвращают объект, если он найден. Если объект не найден, метод getter выбрасывает исключение MissingResourceException.
Кроме getString, класс ResourceBundle также предоставляет метод для получения строковых массивов getStringArray, а также универсальный метод getObject для любого другого типа объекта. При использовании getObject вам нужно будет привести результат к соответствующему типу. Например:
```java
int[] myIntegers = (int[]) myResources.getObject("intList");
Java-платформа предоставляет два подкласса ResourceBundle: ListResourceBundle и PropertyResourceBundle, которые предоставляют простой способ создания ресурсов. Как вы видели кратко в одном из предыдущих примеров, ListResourceBundle управляет своими ресурсами как списком пар ключ/значение. PropertyResourceBundle использует файл свойств для управления своими ресурсами.
Если ListResourceBundle или PropertyResourceBundle не подходят для ваших нужд, вы можете написать свой собственный подкласс ResourceBundle. Ваши подклассы должны переопределить два метода: handleGetObject и getKeys().Реализация подкласса ResourceBundle
должна быть потокобезопасной, если она используется одновременно несколькими потоками. По умолчанию реализации непустых методов этого класса и методов в прямых известных конкретных подклассах ListResourceBundle
и PropertyResourceBundle
являются потокобезопасными. Если ListResourceBundle
или PropertyResourceBundle
не подходят для ваших нужд, вы можете написать собственный подкласс ResourceBundle
. Ваш подкласс должен переопределить два метода: handleGetObject
и getKeys()
.Реализация подкласса ResourceBundle
должна быть потокобезопасной, если она используется несколькими потоками одновременно. По умолчанию методы непосредственно известных конкретных подклассов ListResourceBundle
и PropertyResourceBundle
, а также непосредственно реализованные методы в подклассе являются потокобезопасными.
Класс ResourceBundle.Control
Класс ResourceBundle.Control
предоставляет информацию, необходимую для выполнения процесса загрузки пакета с помощью фабричных методов getBundle
, которые принимают экземпляр ResourceBundle.Control
. Вы можете реализовать свой собственный подкласс для включения неподдерживаемых форматов ресурсных пакетов, изменения стратегии поиска или определения параметров кэширования. Подробнее см. описания класса и фабричного метода getBundle
.Для фабричных методов getBundle, которые не принимают экземпляр ResourceBundle.Control, их поведение загрузки ресурсного пакета по умолчанию можно изменить с помощью установленных реализаций ResourceBundleControlProvider. Установленные поставщики обнаруживаются при загрузке класса ResourceBundle. Если любой из поставщиков предоставляет ResourceBundle.Control для данного базового имени, этот ResourceBundle.Control будет использоваться вместо ResourceBundle.Control по умолчанию. Если установлено более одного поставщика для поддержки одного и того же базового имени, будет использован первый поставщик, возвращенный из ServiceLoader.Управление кэшем
Инстансы ресурсных пакетов, созданные методами фабрики getBundle, кэшируются по умолчанию, и методы фабрики возвращают тот же инстанс ресурсного пакета несколько раз, если он был кэширован. Клиенты getBundle могут очищать кэш, управлять жизненным циклом кэшированных инстансов ресурсных пакетов с помощью значений времени жизни, или указывать, чтобы инстансы ресурсных пакетов не кэшировались. См. описания метода фабрики getBundle, метода clearCache, метода ResourceBundle.Control.getTimeToLive и метода ResourceBundle.Control.needsReload для подробностей.Пример Вот очень простой пример подкласса ResourceBundle, MyResources, который управляет двумя ресурсами (для большего количества ресурсов вы, вероятно, использовали бы Map). Обратите внимание, что вам не нужно указывать значение, если "родительский" ResourceBundle обрабатывает тот же ключ с тем же значением (как для okKey ниже).
// по умолчанию (английский язык, США)
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());
}
}
// Переопределяет handleKeySet() так, чтобы реализация getKeys() // могла полагаться на значение keySet(). protected Set handleKeySet() { return new HashSet(Arrays.asList("okKey", "cancelKey")); }
// Немецкий язык public class MyResources_de extends MyResources { public Object handleGetObject(String key) { // не требуется okKey, так как родительский уровень его обрабатывает. if (key.equals("cancelKey")) return "Отмена"; return null; } protected Set handleKeySet() { return new HashSet(Arrays.asList("cancelKey")); } }
Since:
JDK1.1
See Also:
ListResourceBundle, PropertyResourceBundle, MissingResourceException
< 1.8 >
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )