Найти тему
Сам себе джавист

ResourceBundle в Java. Часть первая

Класс java.util.ResourceBundle используется для хранения текстов и компонентов, зависящих от локали. Например, текстовые метки, используемые внутри вашего приложения, могут потребоваться изменить в зависимости от языка пользователя, который в данный момент использует ваше приложение. Таким образом, считается, что текстовые метки зависят от языкового стандарта пользователя. Кстати, языковой стандарт пользователя представлен классом Locale. В этой статье более подробно рассматривается класс ResourceBundle и его подклассы.

Иерархия классов ResourceBundle

Класс ResourceBundle имеет два подкласса, называемых PropertyResourceBundle и ListResourceBundle. Вот диаграмма, иллюстрирующая иерархию классов:

ResourceBundle, PropertiesResourceBundle, ListResourceBundle.
ResourceBundle, PropertiesResourceBundle, ListResourceBundle.

Класс PropertyResourceBundle хранит локализованные тексты в стандартных файлах свойств Java.

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

Создание экземпляра ResourceBundle

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

Locale locale = new Locale("en", "US");

ResourceBundle labels = ResourceBundle.getBundle("i18n.MyBundle", locale);

System.out.println(labels.getString("label1"));

Сначала вам нужен экземпляр Locale. Затем вы передаете этот экземпляр Locale методу ResourceBundle.getBundle() вместе с именем загружаемого пакета ресурсов. Наконец, вы можете получить доступ к локализованным значениям в ResourceBundle с помощью его различных методов getString() и GetObject() и т.д.

На самом деле вы никогда не создаете экземпляр ResourceBundle, а экземпляр одного из двух его подклассов. Оба они создаются с использованием описанного выше фабричного метода. Сначала класс ResourceBundle будет искать ListResourceBundle, а затем PropertyResourceBundle. Это делается путем сопоставления имени запрошенного пакета ресурсов (первый параметр в методе getBundle()) с именами классов ListResourceBundle, а если ничего не найдено, с пакетом ресурсов файла свойств.

Как ListResourceBundle, так и PropertyResourceBundle более подробно рассматриваются в следующих разделах.

Файлы свойств как ResourceBundle

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

Locale locale = new Locale("en", "US");

ResourceBundle labels = ResourceBundle.getBundle("i18n.MyBundle", locale);

System.out.println(labels.getString("label1"));

Чтобы этот пример работал, вы должны поместить стандартный файл свойств Java с именем MyBundle.properties в пакет Java с именем i18n. Убедитесь, что этот файл свойств доступен в вашем пути к классу при выполнении приведенного выше кода, что означает, что файл свойств должен быть расположен среди классов вашего приложения и в пакете i18n.

Имя пакета ресурсов похоже на имя класса. Таким образом, i18n.MyBundle означает файл свойств с именем MyBundle.properties в пакете (каталоге) i18n.

Вот пример того, как может выглядеть содержимое файла свойств:

label1 = Label 1 is done!
label2 = Label 2 is through!

Как и в случае со стандартными файлами свойств Java, это список пар ключей и значений. Ключ находится в левой части = , а значение - в правой части. Значение - это то, что вы должны локализовать, а не ключ.

Разные языки в разных файлах свойств

Чтобы предоставить строки на разных языках, создайте файл свойств для каждого языка и дополните их символом подчеркивания (_), а затем кодом языка. Например:

MyBundle.properties
MyBundle_da.properties
MyBundle_de.properties
MyBundle_fr.properties

Все эти файлы должны находиться в одном пакете (каталоге).

Файл без языкового суффикса (например, MyBundle.properties) является файлом свойств по умолчанию. В случае, если файл свойств недоступен для языка (локали), переданного методу ResourceBundle.getBundle(), и в системе не установлена локаль по умолчанию (например, на немецком компьютере по умолчанию будет установлена немецкая локаль), этот файл считывается и возвращается как ResourceBundle.

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

label1 = Label 1 er klar!
label2 = Label 2 er igennem!

Классы как ResourceBundle

Вы также можете использовать набор классов для хранения ваших ресурсов. Используя классы, вы можете использовать больше, чем просто строковые значения.

Как и в случае с файлами свойств, вы создаете набор классов с базовым именем пакета и языковыми суффиксами. Например:

i18n.MyClassBundle
i18n.MyClassBundle_da
i18n.MyClassBundle_en
i18n.MyClassBundle_de

Вот пример реализации файла класса пакета по умолчанию:

package i18n;

import java.util.ListResourceBundle;

public class MyClassBundle extends ListResourceBundle {

@Override
protected Object[][] getContents() {
return contents;
}

private Object[][] contents = {
{ "price" , new Double(10.00) },
{ "currency", "EUR" },
};
}

А вот реализация пакета ресурсов для датского языка:

public class MyClassBundle_da extends ListResourceBundle {

@Override
protected Object[][] getContents() {
return contents;
}

private Object[][] contents = {
{ "price" , new Double(75.00) },
{ "currency", "DKK" },
};

}

Обратите внимание на массив содержимого. Он состоит из 2-мерного массива ключей и значений. Таким образом, цена и валюта являются ключами, а значения справа от них являются локализованными значениями. Эти два примера содержат цену в двух разных валютах.

Вы получаете экземпляр ListResourceBundle таким же образом, как вы получаете экземпляр PropertyResourceBundle. Вот два примера, которые получают экземпляр как ResourceBundle по умолчанию, так и ResourceBundle для датского языка:

Locale locale = new Locale("de", "DE"); //no bundle for German -> default
ResourceBundle bundle = ResourceBundle.getBundle("i18n.MyClassBundle", locale);

System.out.println("price : " + bundle.getObject("price"));
System.out.println("currency: " + bundle.getObject("currency"));

locale = new Locale("da", "DK");
bundle = ResourceBundle.getBundle("i18n.MyClassBundle", locale);

System.out.println("price : " + bundle.getObject("price"));
System.out.println("currency: " + bundle.getObject("currency"));

Выходные данные, напечатанные из этого кода, будут следующими:

price : 10.0
currency: EUR
price : 75.0
currency: DKK

Цена, полученная из ResourceBundle по умолчанию, указана в евро, а цена, полученная из датского ResourceBundle, указана в датских кронах.

Получение значений из ResourceBundle

Как только вы получили экземпляр ResourceBundle, вы можете получить из него локализованные значения, используя один из методов:

getObject(String key);
getString(String key);
getStringArray(String key);

Вы также можете получить набор всех ключей, содержащихся в ResourceBundle, используя метод keySet(), например:

Set<String> keys = bundle.keySet();

Дополнительные методы ResourceBundle

Класс ResourceBundle имеет еще несколько методов (например, getLocale()). Ознакомьтесь с JavaDoc для получения дополнительной информации об этих методах.

#перевод #java

С подпиской рекламы не будет

Подключите Дзен Про за 159 ₽ в месяц