|
Spec-Zone .ru
спецификации, руководства, описания, API
|
Ранее в этом уроке Вы изучили, как создать и получить доступ к объектам ResourceBundle class. Эти степени раздела, которые объясняет Ваше знание и, как воспользоваться преимуществом от ResourceBundle.Control Возможности class.
ResourceBundle.Control создавался, чтобы определить, как определить местоположение и инстанцировать пакетов ресурса. Это определяет ряд методов обратного вызова, которые вызываются методы фабрики во время процесса загрузки пакета.
В отличие от a метод, описанный ранее, это ResourceBundle.getBundle метод определяет пакет ресурса, используя указанное базовое имя, локаль значения по умолчанию и указанное управление.
public static final ResourceBundle getBundle(
String baseName,
ResourceBundle.Control cont
// ...
Указанное управление предоставляет информацию для процесса загрузки пакета ресурса.
Следующий пример программы вызывают
properties Файлы.Как это было описано прежде, чем можно будет загрузить свои ресурсы или из классов или из properties файлы. Эти файлы содержат описания для следующих локалей:
RBControl.properties – Глобальная переменная
RBControl_zh.properties – Язык только: Упрощенный китайский
RBControl_zh_cn.properties – Область только: Китай
RBControl_zh_hk.properties – Область только: Гонконг
RBControl_zh_tw.properties – ТайваньВ этом примере приложение создает новую локаль для Гонконгской области.
ResourceBundle экземпляр.Как в примере в предыдущем разделе, это приложение создает a ResourceBundle экземпляр, вызывая getBundle метод:
private static void test(Locale locale) {
ResourceBundle rb = ResourceBundle.getBundle(
"RBControl",
locale,
new ResourceBundle.Control() {
// ...
}
);
getBundle метод ищет properties файлы с префиксом RBControl. Однако, этот метод содержит a Control параметр, который управляет процессом поиска локалей Chineese.
getCandidateLocales метод getCandidateLocales метод возвращает список Locales объекты как локали кандидата для базового имени и локаль.
new ResourceBundle.Control() {
@Override
public List<Locale> getCandidateLocales(
String baseName,
Locale locale) {
// ...
}
}
Реализация по умолчанию возвращает список Locale объекты следующим образом: Локаль (язык, страна).
Однако, этот метод является overriden, чтобы реализовать следующее определенное поведение:
if (baseName == null)
throw new NullPointerException();
if (locale.equals(new Locale("zh", "HK"))) {
return Arrays.asList(
locale,
Locale.TAIWAN,
// no Locale.CHINESE here
Locale.ROOT);
} else if (locale.equals(Locale.TAIWAN)) {
return Arrays.asList(
locale,
// no Locale.CHINESE here
Locale.ROOT);
}
Отметьте, что последний элемент последовательности локалей кандидата должен быть корневой локалью.
test classВызовите test class для следующих четырех различных локалей:
public static void main(String[] args) {
test(Locale.CHINA);
test(new Locale("zh", "HK"));
test(Locale.TAIWAN);
test(Locale.CANADA);
}
Вы будете видеть вывод программы следующим образом:
locale: zh_CN
region: China
language: Simplified Chinese
locale: zh_HK
region: Hong Kong
language: Traditional Chinese
locale: zh_TW
region: Taiwan
language: Traditional Chinese
locale: en_CA
region: global
language: English
Отметьте, что недавно создаваемый был присвоен Гонконгская область, потому что она была определена в соответствующем properties файл. Традиционный китайский был присвоен как язык для Тайваньской локали.
Два других интересных метода ResourceBundle.Control class не использовался в RBControl пример, но они имели право быть упомянутыми. getTimeToLive метод используется, чтобы определить, сколько времени пакет ресурса может существовать в кэше. Если ограничение по времени для пакета ресурса в кэше истекло, needsReload метод вызывается, чтобы определить, должен ли пакет ресурса быть перезагружен.