В библиотеку входит набор графических компонентов - наследников компонентов Swing. Это позволяет использовать все возможности Swing. Отличием является использование вместо строковых значений текстовых полей компонентов ключей, по которым производится поиск текстовых значений в файлах ресурсов.
Для многоязычных строк применяется тип LocaledString
. Он включает в себя ключ строки, массив аргументов строки, путь к пакету с файлами ресурсов, и признак useSubPackage.
Строки размещаются в файлах ресурсов "locale.properties", где locale - язык строк, например, "ru.properties", "en.properties". Файлы представляют из себя набор текстовых пар "ключ = значение
". Значение может иметь аргументы {0}, {1} и т.д. Вместо этих символов будут подставлены значения из массива аргументов с соответствующим индексом. Например:
test.string.key = Это тестовое значение {0} строки.
Вместо {0} будет подставлено значение 0-го элемента массива аргументов, при подстановке само значение будет преобразовано в строку через toString().
По умолчанию используется кодировка UTF-8.
Пакет, в котором производится поиск ресурсов, по умолчанию имеет путь "src/main/resources/strings", может быть получен методом LocaleContext.getDefaultStringResourcePackage()
, при необходимости его можно изменить LocaleContext.setDefaultStringResourcePackage(String defaultStringResourcePackage)
. Если задано использование вложенных пакетов (useSubPackage = true
), то пакет, в котором будет производиться поиск ключа, будет определяться конкатенацией используемого пакета и части ключа до первой точки. При этом ключ не обрезается. Например:
- пакет: "src/main/resources/strings"
- ключ: "test.error.message" Пакет, в котором будет производиться поиск ключа: "src/main/resources/strings/test"
Поиск строки по ключу в файле ресурсов производится классом R
(сокращение от Resources). При первом обращении к файлу ресурсов он считывается в оперативную память и во время следующих обращений поиск осуществляется в ОЗУ, что позволяет ускорить работу приложения. Если ключ не находится в файле соответствующего языка, поиск производится в ресурсах языка по умолчанию.
В классе LocaleContext
задаются параметры: язык пользователя, язык по умолчанию, пакет расположения файлов ресурсов, кодировка файлов ресурсов. При необходимости все значения могут быть изменены. Все методы этого класса доступны из приложения, в котором используется библиотека.
Библиотека включает в себя большинство компонентов библиотеки Swing. Каждый из компонентов имеет метод changeLocale()
. Этот метод устанавливает новые значения текстовых полей, имеющихся в компоненте, а затем вызыват этот метод у внутренних компонентов. Таким образом, вызвав метод у компонента верхнего уровня, например главного окна приложения, можно изменить язык у всех внутренних компонентов, не запоминая, где и какие строки используются. Собственно перебор всех внутренних компонентов осуществляется в утилитном классе LocaleUtils
. Т.к. изменение языка при работе приложения происходит нечасто, и поиск значений строк осуществляется в ОЗУ после первого обращения к файлу ресурсов, особого замедления работы приложения не должно быть.