Цикл статей «Учебник Java 8».
Следующая статья — «».
Предыдущая статья — «Java 8 консоль».
Локализация частично уже рассматривалась в статьях «Java 8 дата и время» и «Java 8 форматирование и парсинг».
В этой статье будет рассмотрена локализация ресурсов приложения: строк, картинок, аудио-файлов и т. д.
Для разделения ресурсов, специфичных для каждого языка, страны или региона, используется класс java.util.ResourceBundle или один из его потомков java.util.ListResourceBundle, java.util.PropertyResourceBundle.
Концептуально каждый java.util.ResourceBundle — это набор подклассов, которые используют одно и то же базовое имя. Например, пусть ButtonLabel — базовое имя. Символы, которые следуют за базовым именем указывают код языка, код страны и вариант Locale. Например, ButtonLabel_en_GB указывает на английский язык (en) и Великобританию (GB).
1 2 3 4 |
ButtonLabel ButtonLabel_de ButtonLabel_en_GB ButtonLabel_fr_CA_UNIX |
Чтобы выбрать подходящий ResourceBundle, вызовите метод ResourceBundle.getBundle. Следующий пример выбирает ButtonLabel ResourceBundle для Locale с французским языком, страной Канада и платформой UNIX:
1 2 3 |
Locale currentLocale = new Locale("fr", "CA", "UNIX"); ResourceBundle introLabels = ResourceBundle.getBundle( "ButtonLabel", currentLocale); |
Если класса ResourceBundle, подходящего для указанной Locale нет, то getBundle пытается найти наиболее близкое совпадение. Например, если ищется ButtonLabel_fr_CA_UNIX, а Locale по умолчанию en_US, то getBundle ищет классы в следующем порядке:
1 2 3 4 5 6 |
ButtonLabel_fr_CA_UNIX ButtonLabel_fr_CA ButtonLabel_fr ButtonLabel_en_US ButtonLabel_en ButtonLabel |
Заметьте, что метод getBundle ищет классы, основанные на Locale по умолчанию перед поиском базового класса. Если getBundle не может найти совпадения в этом списке классов, то он бросает исключение java.util.MissingResourceException. Всегда создавайте базовый класс, чтобы избежать подобного исключения.
Абстрактный класс java.util.ResourceBundle имеет два дочерних класса: java.util.PropertyResourceBundle и java.util.ListResourceBundle.
Класс PropertyResourceBundle использует файлы настроек (properties) для хранения текста. Эти файлы не являются частью кода Java и они могут содержать только объекты String.
Класс ListResourceBundle использует список локализованных ресурсов, хранящихся в классах Java.
Класс java.util.ResourceBundle очень гибкий. Если вы сначала использовали PropertyResourceBundle, чтобы хранить локализованные строки в файлах properties, а позже решили использовать ListResourceBundle, то это не отразится на коде. Например, следующий getBundle получает ResourceBundle для Locale независимо от способа хранения этого ResourceBundle.
1 2 |
ResourceBundle introLabels = ResourceBundle.getBundle( "ButtonLabel", currentLocale); |
Метод getBundle сначала ищет класс с указанным базовым именем, а затем, если его не находит, ищет файл properties.
Класс ResourceBundle содержит массив пар ключ-значение. Вы указываете ключ, который должен быть String, когда вам нужно достать значение из ResourceBundle. Пример:
1 2 3 4 5 6 7 8 9 10 |
class ButtonLabel_en extends ListResourceBundle { // English version public Object[][] getContents() { return contents; } static final Object[][] contents = { {"OkKey", "OK"}, {"CancelKey", "Cancel"}, }; } |
Получение значения:
1 |
String okLabel = ButtonLabel.getString("OkKey"); |
Цикл статей «Учебник Java 8».
Следующая статья — «».
Предыдущая статья — «Java 8 консоль».
У вас хорошие уроки, продолжайте в том же духе, пожалуйста!
Недавно начал читать.