У нас было много строк, которые содержали одну и ту же подстроку, из предложений о проверке журнала или о том, как связаться с поддержкой, с типами брендинга, содержащими название компании или продукта. Повторение вызывало несколько проблем для себя (в первую очередь опечатки или ошибки копирования/вставки), но также вызывает проблемы в том, что он увеличивает количество текста, который должен перевести наш переводчик.
В решении, которое я придумал, было что-то вроде этого:
public class ExpandingResourceBundleControl extends ResourceBundle.Control {
public static final ResourceBundle.Control EXPANDING =
new ExpandingResourceBundleControl();
private ExpandingResourceBundleControl() { }
@Override
public ResourceBundle newBundle(String baseName, Locale locale, String format,
ClassLoader loader, boolean reload)
throws IllegalAccessException, InstantiationException, IOException {
ResourceBundle inner = super.newBundle(baseName, locale, format, loader, reload);
return inner == null ? null : new ExpandingResourceBundle(inner, loader);
}
}
ExpandingResourceBundle
делегирует реальный пакет ресурсов, но выполняет преобразование {{this.kind.of.thing}} для поиска ключа в ресурсах.
Каждый раз, когда вы хотите получить один из них, вы должны пойти:
ResourceBundle.getBundle("com/acme/app/Bundle", EXPANDING);
И это прекрасно работает - на некоторое время.
Что в конечном итоге происходит, так это то, что какой-то новый код (в нашем случае с автогенерированным кодом, который выплюнул из Matisse) ищет тот же комплект ресурсов без указания настраиваемого элемента управления. Это кажется невоспроизводимым, если вы пишете простой unit test, который вызывает его, а затем без него, но это происходит, когда приложение выполняется для реального. Каким-то образом кеш внутри ResourceBundle
извлекает хорошее значение и заменяет его сломанным. Я еще не понял, почему и файлы Sun jar были скомпилированы без отладочной информации, поэтому отладка это тяжелая работа.
Мои вопросы:
-
Есть ли какой-то способ глобально установить по умолчанию ResourceBundle.Control, о котором я, возможно, и не подозревал? Это решило бы все довольно элегантно.
-
Есть ли какой-либо другой способ элегантно управлять этим видом, возможно, без вмешательства в классы ResourceBundle?