След: Интернационализация
Урок: Изоляция Специфичных для локали Данных
Настройка Загрузки Пакета Ресурса
Домашняя страница > Интернационализация > Изоляция Специфичных для локали Данных

Настройка Загрузки Пакета Ресурса

Ранее в этом уроке Вы изучили, как создать и получить доступ к объектам ResourceBundle class. Эти степени раздела, которые объясняет Ваше знание и, как воспользоваться преимуществом от ResourceBundle.Control Возможности class.

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

В отличие от a ResourceBundle.getBundle метод, описанный ранее, это ResourceBundle.getBundle метод определяет пакет ресурса, используя указанное базовое имя, локаль значения по умолчанию и указанное управление.

public static final ResourceBundle getBundle(
    String baseName,
    ResourceBundle.Control cont
    // ...

Указанное управление предоставляет информацию для процесса загрузки пакета ресурса.

Следующий пример программы вызывают RBControl.java иллюстрирует, как определить Ваши собственные пути поиска для китайских локалей.

1. Создайте properties Файлы.

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

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

2. Создайте a 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.

3. Вызовите 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);
}

Отметьте, что последний элемент последовательности локалей кандидата должен быть корневой локалью.

4. Вызовите test class

Вызовите test class для следующих четырех различных локалей:

public static void main(String[] args) {
    test(Locale.CHINA);
    test(new Locale("zh", "HK"));
    test(Locale.TAIWAN);
    test(Locale.CANADA);
}

5. Выполните Пример программы

Вы будете видеть вывод программы следующим образом:

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 метод вызывается, чтобы определить, должен ли пакет ресурса быть перезагружен.


Проблемы с примерами? Попытайтесь Компилировать и Выполнить Примеры: FAQ.
Жалобы? Поздравление? Предложения? Дайте нам свою обратную связь.

Предыдущая страница: Используя ListResourceBundle
Следующая страница: Форматирование



Spec-Zone.ru - all specs in one place