Класс java.util.ResourceBundle используется для хранения текстов и компонентов, зависящих от локали. Например, текстовые метки, используемые внутри вашего приложения, могут потребоваться изменить в зависимости от языка пользователя, который в данный момент использует ваше приложение. Таким образом, считается, что текстовые метки зависят от языкового стандарта пользователя. Кстати, языковой стандарт пользователя представлен классом Locale. В этой статье более подробно рассматривается класс ResourceBundle и его подклассы.
Иерархия классов ResourceBundle
Класс ResourceBundle имеет два подкласса, называемых PropertyResourceBundle и 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